diff --git a/.changeset/chilly-ears-fly.md b/.changeset/chilly-ears-fly.md deleted file mode 100644 index 250946ab..00000000 --- a/.changeset/chilly-ears-fly.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@shipfox/react-ui": minor ---- - -Add Slider component diff --git a/.changeset/chilly-tires-run.md b/.changeset/chilly-tires-run.md deleted file mode 100644 index 68092bbe..00000000 --- a/.changeset/chilly-tires-run.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@shipfox/shipql-parser": patch ---- - -Use shorthand `-` for negating expressions in ShipQL diff --git a/.changeset/full-toys-wash.md b/.changeset/full-toys-wash.md deleted file mode 100644 index bb64f458..00000000 --- a/.changeset/full-toys-wash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@shipfox/swc": patch ---- - -Ensure parser.js is exported diff --git a/.changeset/humble-wombats-look.md b/.changeset/humble-wombats-look.md deleted file mode 100644 index 5e2fbb4b..00000000 --- a/.changeset/humble-wombats-look.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@shipfox/shipql-parser": patch ---- - -Add ShipQL parser package diff --git a/.changeset/tender-games-remain.md b/.changeset/tender-games-remain.md deleted file mode 100644 index 06722754..00000000 --- a/.changeset/tender-games-remain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@shipfox/shipql-parser": patch ---- - -Include source strings in AST nodes diff --git a/.github/actions/ci/dist/index.js b/.github/actions/ci/dist/index.js index bcc85c1b..c17677ff 100644 --- a/.github/actions/ci/dist/index.js +++ b/.github/actions/ci/dist/index.js @@ -2,33 +2,48 @@ var _a; import require$$0 from "os"; import require$$0$1 from "crypto"; import require$$1 from "fs"; -import require$$1$5 from "path"; +import require$$1$8 from "path"; import require$$2$1 from "http"; import require$$3$1 from "https"; -import require$$0$4 from "net"; +import require$$0$a from "net"; import require$$1$1 from "tls"; import require$$4$1 from "events"; -import require$$0$3 from "assert"; +import require$$0$9 from "assert"; import require$$0$2 from "util"; -import require$$0$5 from "stream"; -import require$$7 from "buffer"; -import require$$8 from "querystring"; -import require$$14 from "stream/web"; -import require$$0$7 from "node:stream"; +import require$$0$5 from "node:assert"; +import require$$0$7 from "node:net"; +import require$$2$2 from "node:http"; +import require$$0$6 from "node:stream"; +import require$$0$3 from "node:buffer"; import require$$1$2 from "node:util"; -import require$$0$6 from "node:events"; -import require$$0$8 from "worker_threads"; -import require$$2$2 from "perf_hooks"; -import require$$5 from "util/types"; -import require$$4$2 from "async_hooks"; -import require$$1$3 from "console"; -import require$$1$4 from "url"; -import require$$3$2 from "zlib"; -import require$$6 from "string_decoder"; -import require$$0$9 from "diagnostics_channel"; +import require$$7 from "node:querystring"; +import require$$0$4 from "node:events"; +import require$$0$8 from "node:diagnostics_channel"; +import require$$5 from "node:tls"; +import require$$1$4 from "node:zlib"; +import require$$5$1 from "node:perf_hooks"; +import require$$8 from "node:util/types"; +import require$$1$3 from "node:worker_threads"; +import require$$1$5 from "node:url"; +import require$$5$2 from "node:async_hooks"; +import require$$1$6 from "node:console"; +import require$$1$7 from "node:dns"; +import require$$5$3 from "string_decoder"; import require$$2$3 from "child_process"; -import require$$6$1 from "timers"; +import require$$6 from "timers"; import { readFileSync } from "node:fs"; +import require$$0$b from "stream"; +import require$$7$1 from "buffer"; +import require$$8$1 from "querystring"; +import require$$14 from "stream/web"; +import require$$0$c from "worker_threads"; +import require$$2$4 from "perf_hooks"; +import require$$5$4 from "util/types"; +import require$$4$2 from "async_hooks"; +import require$$1$9 from "console"; +import require$$1$a from "url"; +import require$$3$2 from "zlib"; +import require$$0$d from "diagnostics_channel"; import { execSync } from "node:child_process"; var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {}; function getDefaultExportFromCjs(x) { @@ -65,13 +80,14 @@ function getAugmentedNamespace(n) { } var core$1 = {}; var command = {}; -var utils$3 = {}; -var hasRequiredUtils$3; -function requireUtils$3() { - if (hasRequiredUtils$3) return utils$3; - hasRequiredUtils$3 = 1; - Object.defineProperty(utils$3, "__esModule", { value: true }); - utils$3.toCommandProperties = utils$3.toCommandValue = void 0; +var utils$4 = {}; +var hasRequiredUtils$4; +function requireUtils$4() { + if (hasRequiredUtils$4) return utils$4; + hasRequiredUtils$4 = 1; + Object.defineProperty(utils$4, "__esModule", { value: true }); + utils$4.toCommandValue = toCommandValue; + utils$4.toCommandProperties = toCommandProperties; function toCommandValue(input) { if (input === null || input === void 0) { return ""; @@ -80,7 +96,6 @@ function requireUtils$3() { } return JSON.stringify(input); } - utils$3.toCommandValue = toCommandValue; function toCommandProperties(annotationProperties) { if (!Object.keys(annotationProperties).length) { return {}; @@ -94,8 +109,7 @@ function requireUtils$3() { endColumn: annotationProperties.endColumn }; } - utils$3.toCommandProperties = toCommandProperties; - return utils$3; + return utils$4; } var hasRequiredCommand; function requireCommand() { @@ -119,28 +133,37 @@ function requireCommand() { }) : function(o, v) { o["default"] = v; }); - var __importStar = command && command.__importStar || function(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) { - for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; + var __importStar = command && command.__importStar || /* @__PURE__ */ (function() { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function(o2) { + var ar = []; + for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + } + __setModuleDefault(result, mod); + return result; + }; + })(); Object.defineProperty(command, "__esModule", { value: true }); - command.issue = command.issueCommand = void 0; + command.issueCommand = issueCommand; + command.issue = issue; const os = __importStar(require$$0); - const utils_1 = requireUtils$3(); + const utils_1 = requireUtils$4(); function issueCommand(command2, properties, message) { const cmd = new Command(command2, properties, message); process.stdout.write(cmd.toString() + os.EOL); } - command.issueCommand = issueCommand; function issue(name, message = "") { issueCommand(name, {}, message); } - command.issue = issue; const CMD_STRING = "::"; class Command { constructor(command2, properties, message) { @@ -205,21 +228,32 @@ function requireFileCommand() { }) : function(o, v) { o["default"] = v; }); - var __importStar = fileCommand && fileCommand.__importStar || function(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) { - for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; + var __importStar = fileCommand && fileCommand.__importStar || /* @__PURE__ */ (function() { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function(o2) { + var ar = []; + for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + } + __setModuleDefault(result, mod); + return result; + }; + })(); Object.defineProperty(fileCommand, "__esModule", { value: true }); - fileCommand.prepareKeyValueMessage = fileCommand.issueFileCommand = void 0; + fileCommand.issueFileCommand = issueFileCommand; + fileCommand.prepareKeyValueMessage = prepareKeyValueMessage; const crypto = __importStar(require$$0$1); const fs = __importStar(require$$1); const os = __importStar(require$$0); - const utils_1 = requireUtils$3(); + const utils_1 = requireUtils$4(); function issueFileCommand(command2, message) { const filePath = process.env[`GITHUB_${command2}`]; if (!filePath) { @@ -232,7 +266,6 @@ function requireFileCommand() { encoding: "utf8" }); } - fileCommand.issueFileCommand = issueFileCommand; function prepareKeyValueMessage(key, value) { const delimiter = `ghadelimiter_${crypto.randomUUID()}`; const convertedValue = (0, utils_1.toCommandValue)(value); @@ -244,7 +277,6 @@ function requireFileCommand() { } return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`; } - fileCommand.prepareKeyValueMessage = prepareKeyValueMessage; return fileCommand; } var oidcUtils = {}; @@ -255,7 +287,8 @@ function requireProxy() { if (hasRequiredProxy) return proxy; hasRequiredProxy = 1; Object.defineProperty(proxy, "__esModule", { value: true }); - proxy.checkBypass = proxy.getProxyUrl = void 0; + proxy.getProxyUrl = getProxyUrl; + proxy.checkBypass = checkBypass; function getProxyUrl(reqUrl) { const usingSsl = reqUrl.protocol === "https:"; if (checkBypass(reqUrl)) { @@ -279,7 +312,6 @@ function requireProxy() { return void 0; } } - proxy.getProxyUrl = getProxyUrl; function checkBypass(reqUrl) { if (!reqUrl.hostname) { return false; @@ -311,7 +343,6 @@ function requireProxy() { } return false; } - proxy.checkBypass = checkBypass; function isLoopbackAddress(host) { const hostLower = host.toLowerCase(); return hostLower === "localhost" || hostLower.startsWith("127.") || hostLower.startsWith("[::1]") || hostLower.startsWith("[0:0:0:0:0:0:0:1]"); @@ -567,13 +598,13 @@ function requireTunnel() { tunnel = requireTunnel$1(); return tunnel; } -var undici = {}; -var symbols$4; -var hasRequiredSymbols$4; -function requireSymbols$4() { - if (hasRequiredSymbols$4) return symbols$4; - hasRequiredSymbols$4 = 1; - symbols$4 = { +var undici$1 = {}; +var symbols$9; +var hasRequiredSymbols$9; +function requireSymbols$9() { + if (hasRequiredSymbols$9) return symbols$9; + hasRequiredSymbols$9 = 1; + symbols$9 = { kClose: /* @__PURE__ */ Symbol("close"), kDestroy: /* @__PURE__ */ Symbol("destroy"), kDispatch: /* @__PURE__ */ Symbol("dispatch"), @@ -583,7 +614,6 @@ function requireSymbols$4() { kQueue: /* @__PURE__ */ Symbol("queue"), kConnect: /* @__PURE__ */ Symbol("connect"), kConnecting: /* @__PURE__ */ Symbol("connecting"), - kHeadersList: /* @__PURE__ */ Symbol("headers list"), kKeepAliveDefaultTimeout: /* @__PURE__ */ Symbol("default keep alive timeout"), kKeepAliveMaxTimeout: /* @__PURE__ */ Symbol("max keep alive timeout"), kKeepAliveTimeoutThreshold: /* @__PURE__ */ Symbol("keep alive timeout threshold"), @@ -596,6 +626,7 @@ function requireSymbols$4() { kHost: /* @__PURE__ */ Symbol("host"), kNoRef: /* @__PURE__ */ Symbol("no ref"), kBodyUsed: /* @__PURE__ */ Symbol("used"), + kBody: /* @__PURE__ */ Symbol("abstracted request body"), kRunning: /* @__PURE__ */ Symbol("running"), kBlocking: /* @__PURE__ */ Symbol("blocking"), kPending: /* @__PURE__ */ Symbol("pending"), @@ -608,6 +639,8 @@ function requireSymbols$4() { kNeedDrain: /* @__PURE__ */ Symbol("need drain"), kReset: /* @__PURE__ */ Symbol("reset"), kDestroyed: /* @__PURE__ */ Symbol.for("nodejs.stream.destroyed"), + kResume: /* @__PURE__ */ Symbol("resume"), + kOnError: /* @__PURE__ */ Symbol("on error"), kMaxHeadersSize: /* @__PURE__ */ Symbol("max headers size"), kRunningIdx: /* @__PURE__ */ Symbol("running index"), kPendingIdx: /* @__PURE__ */ Symbol("pending index"), @@ -629,67 +662,90 @@ function requireSymbols$4() { kMaxResponseSize: /* @__PURE__ */ Symbol("max response size"), kHTTP2Session: /* @__PURE__ */ Symbol("http2Session"), kHTTP2SessionState: /* @__PURE__ */ Symbol("http2Session state"), - kHTTP2BuildRequest: /* @__PURE__ */ Symbol("http2 build request"), - kHTTP1BuildRequest: /* @__PURE__ */ Symbol("http1 build request"), - kHTTP2CopyHeaders: /* @__PURE__ */ Symbol("http2 copy headers"), - kHTTPConnVersion: /* @__PURE__ */ Symbol("http connection version"), kRetryHandlerDefaultRetry: /* @__PURE__ */ Symbol("retry agent default retry"), - kConstruct: /* @__PURE__ */ Symbol("constructable") + kConstruct: /* @__PURE__ */ Symbol("constructable"), + kListeners: /* @__PURE__ */ Symbol("listeners"), + kHTTPContext: /* @__PURE__ */ Symbol("http context"), + kMaxConcurrentStreams: /* @__PURE__ */ Symbol("max concurrent streams"), + kNoProxyAgent: /* @__PURE__ */ Symbol("no proxy agent"), + kHttpProxyAgent: /* @__PURE__ */ Symbol("http proxy agent"), + kHttpsProxyAgent: /* @__PURE__ */ Symbol("https proxy agent") }; - return symbols$4; + return symbols$9; } -var errors; -var hasRequiredErrors; -function requireErrors() { - if (hasRequiredErrors) return errors; - hasRequiredErrors = 1; +var errors$1; +var hasRequiredErrors$1; +function requireErrors$1() { + if (hasRequiredErrors$1) return errors$1; + hasRequiredErrors$1 = 1; + const kUndiciError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR"); class UndiciError extends Error { constructor(message) { super(message); this.name = "UndiciError"; this.code = "UND_ERR"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kUndiciError] === true; + } + [kUndiciError] = true; } + const kConnectTimeoutError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_CONNECT_TIMEOUT"); class ConnectTimeoutError extends UndiciError { constructor(message) { super(message); - Error.captureStackTrace(this, ConnectTimeoutError); this.name = "ConnectTimeoutError"; this.message = message || "Connect Timeout Error"; this.code = "UND_ERR_CONNECT_TIMEOUT"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kConnectTimeoutError] === true; + } + [kConnectTimeoutError] = true; } + const kHeadersTimeoutError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_HEADERS_TIMEOUT"); class HeadersTimeoutError extends UndiciError { constructor(message) { super(message); - Error.captureStackTrace(this, HeadersTimeoutError); this.name = "HeadersTimeoutError"; this.message = message || "Headers Timeout Error"; this.code = "UND_ERR_HEADERS_TIMEOUT"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kHeadersTimeoutError] === true; + } + [kHeadersTimeoutError] = true; } + const kHeadersOverflowError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_HEADERS_OVERFLOW"); class HeadersOverflowError extends UndiciError { constructor(message) { super(message); - Error.captureStackTrace(this, HeadersOverflowError); this.name = "HeadersOverflowError"; this.message = message || "Headers Overflow Error"; this.code = "UND_ERR_HEADERS_OVERFLOW"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kHeadersOverflowError] === true; + } + [kHeadersOverflowError] = true; } + const kBodyTimeoutError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_BODY_TIMEOUT"); class BodyTimeoutError extends UndiciError { constructor(message) { super(message); - Error.captureStackTrace(this, BodyTimeoutError); this.name = "BodyTimeoutError"; this.message = message || "Body Timeout Error"; this.code = "UND_ERR_BODY_TIMEOUT"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kBodyTimeoutError] === true; + } + [kBodyTimeoutError] = true; } + const kResponseStatusCodeError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_RESPONSE_STATUS_CODE"); class ResponseStatusCodeError extends UndiciError { constructor(message, statusCode, headers2, body2) { super(message); - Error.captureStackTrace(this, ResponseStatusCodeError); this.name = "ResponseStatusCodeError"; this.message = message || "Response Status Code Error"; this.code = "UND_ERR_RESPONSE_STATUS_CODE"; @@ -698,129 +754,198 @@ function requireErrors() { this.statusCode = statusCode; this.headers = headers2; } + static [Symbol.hasInstance](instance) { + return instance && instance[kResponseStatusCodeError] === true; + } + [kResponseStatusCodeError] = true; } + const kInvalidArgumentError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_INVALID_ARG"); class InvalidArgumentError extends UndiciError { constructor(message) { super(message); - Error.captureStackTrace(this, InvalidArgumentError); this.name = "InvalidArgumentError"; this.message = message || "Invalid Argument Error"; this.code = "UND_ERR_INVALID_ARG"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kInvalidArgumentError] === true; + } + [kInvalidArgumentError] = true; } + const kInvalidReturnValueError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_INVALID_RETURN_VALUE"); class InvalidReturnValueError extends UndiciError { constructor(message) { super(message); - Error.captureStackTrace(this, InvalidReturnValueError); this.name = "InvalidReturnValueError"; this.message = message || "Invalid Return Value Error"; this.code = "UND_ERR_INVALID_RETURN_VALUE"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kInvalidReturnValueError] === true; + } + [kInvalidReturnValueError] = true; } - class RequestAbortedError extends UndiciError { + const kAbortError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_ABORT"); + class AbortError extends UndiciError { + constructor(message) { + super(message); + this.name = "AbortError"; + this.message = message || "The operation was aborted"; + this.code = "UND_ERR_ABORT"; + } + static [Symbol.hasInstance](instance) { + return instance && instance[kAbortError] === true; + } + [kAbortError] = true; + } + const kRequestAbortedError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_ABORTED"); + class RequestAbortedError extends AbortError { constructor(message) { super(message); - Error.captureStackTrace(this, RequestAbortedError); this.name = "AbortError"; this.message = message || "Request aborted"; this.code = "UND_ERR_ABORTED"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kRequestAbortedError] === true; + } + [kRequestAbortedError] = true; } + const kInformationalError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_INFO"); class InformationalError extends UndiciError { constructor(message) { super(message); - Error.captureStackTrace(this, InformationalError); this.name = "InformationalError"; this.message = message || "Request information"; this.code = "UND_ERR_INFO"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kInformationalError] === true; + } + [kInformationalError] = true; } + const kRequestContentLengthMismatchError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_REQ_CONTENT_LENGTH_MISMATCH"); class RequestContentLengthMismatchError extends UndiciError { constructor(message) { super(message); - Error.captureStackTrace(this, RequestContentLengthMismatchError); this.name = "RequestContentLengthMismatchError"; this.message = message || "Request body length does not match content-length header"; this.code = "UND_ERR_REQ_CONTENT_LENGTH_MISMATCH"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kRequestContentLengthMismatchError] === true; + } + [kRequestContentLengthMismatchError] = true; } + const kResponseContentLengthMismatchError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_RES_CONTENT_LENGTH_MISMATCH"); class ResponseContentLengthMismatchError extends UndiciError { constructor(message) { super(message); - Error.captureStackTrace(this, ResponseContentLengthMismatchError); this.name = "ResponseContentLengthMismatchError"; this.message = message || "Response body length does not match content-length header"; this.code = "UND_ERR_RES_CONTENT_LENGTH_MISMATCH"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kResponseContentLengthMismatchError] === true; + } + [kResponseContentLengthMismatchError] = true; } + const kClientDestroyedError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_DESTROYED"); class ClientDestroyedError extends UndiciError { constructor(message) { super(message); - Error.captureStackTrace(this, ClientDestroyedError); this.name = "ClientDestroyedError"; this.message = message || "The client is destroyed"; this.code = "UND_ERR_DESTROYED"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kClientDestroyedError] === true; + } + [kClientDestroyedError] = true; } + const kClientClosedError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_CLOSED"); class ClientClosedError extends UndiciError { constructor(message) { super(message); - Error.captureStackTrace(this, ClientClosedError); this.name = "ClientClosedError"; this.message = message || "The client is closed"; this.code = "UND_ERR_CLOSED"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kClientClosedError] === true; + } + [kClientClosedError] = true; } + const kSocketError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_SOCKET"); class SocketError extends UndiciError { constructor(message, socket) { super(message); - Error.captureStackTrace(this, SocketError); this.name = "SocketError"; this.message = message || "Socket error"; this.code = "UND_ERR_SOCKET"; this.socket = socket; } + static [Symbol.hasInstance](instance) { + return instance && instance[kSocketError] === true; + } + [kSocketError] = true; } + const kNotSupportedError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_NOT_SUPPORTED"); class NotSupportedError extends UndiciError { constructor(message) { super(message); - Error.captureStackTrace(this, NotSupportedError); this.name = "NotSupportedError"; this.message = message || "Not supported error"; this.code = "UND_ERR_NOT_SUPPORTED"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kNotSupportedError] === true; + } + [kNotSupportedError] = true; } + const kBalancedPoolMissingUpstreamError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_BPL_MISSING_UPSTREAM"); class BalancedPoolMissingUpstreamError extends UndiciError { constructor(message) { super(message); - Error.captureStackTrace(this, NotSupportedError); this.name = "MissingUpstreamError"; this.message = message || "No upstream has been added to the BalancedPool"; this.code = "UND_ERR_BPL_MISSING_UPSTREAM"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kBalancedPoolMissingUpstreamError] === true; + } + [kBalancedPoolMissingUpstreamError] = true; } + const kHTTPParserError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_HTTP_PARSER"); class HTTPParserError extends Error { constructor(message, code, data) { super(message); - Error.captureStackTrace(this, HTTPParserError); this.name = "HTTPParserError"; this.code = code ? `HPE_${code}` : void 0; this.data = data ? data.toString() : void 0; } + static [Symbol.hasInstance](instance) { + return instance && instance[kHTTPParserError] === true; + } + [kHTTPParserError] = true; } + const kResponseExceededMaxSizeError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_RES_EXCEEDED_MAX_SIZE"); class ResponseExceededMaxSizeError extends UndiciError { constructor(message) { super(message); - Error.captureStackTrace(this, ResponseExceededMaxSizeError); this.name = "ResponseExceededMaxSizeError"; this.message = message || "Response content exceeded max size"; this.code = "UND_ERR_RES_EXCEEDED_MAX_SIZE"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kResponseExceededMaxSizeError] === true; + } + [kResponseExceededMaxSizeError] = true; } + const kRequestRetryError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_REQ_RETRY"); class RequestRetryError extends UndiciError { constructor(message, code, { headers: headers2, data }) { super(message); - Error.captureStackTrace(this, RequestRetryError); this.name = "RequestRetryError"; this.message = message || "Request retry error"; this.code = "UND_ERR_REQ_RETRY"; @@ -828,8 +953,43 @@ function requireErrors() { this.data = data; this.headers = headers2; } + static [Symbol.hasInstance](instance) { + return instance && instance[kRequestRetryError] === true; + } + [kRequestRetryError] = true; } - errors = { + const kResponseError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_RESPONSE"); + class ResponseError extends UndiciError { + constructor(message, code, { headers: headers2, data }) { + super(message); + this.name = "ResponseError"; + this.message = message || "Response error"; + this.code = "UND_ERR_RESPONSE"; + this.statusCode = code; + this.data = data; + this.headers = headers2; + } + static [Symbol.hasInstance](instance) { + return instance && instance[kResponseError] === true; + } + [kResponseError] = true; + } + const kSecureProxyConnectionError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_PRX_TLS"); + class SecureProxyConnectionError extends UndiciError { + constructor(cause, message, options) { + super(message, { cause, ...options ?? {} }); + this.name = "SecureProxyConnectionError"; + this.message = message || "Secure Proxy Connection failed"; + this.code = "UND_ERR_PRX_TLS"; + this.cause = cause; + } + static [Symbol.hasInstance](instance) { + return instance && instance[kSecureProxyConnectionError] === true; + } + [kSecureProxyConnectionError] = true; + } + errors$1 = { + AbortError, HTTPParserError, UndiciError, HeadersTimeoutError, @@ -849,15 +1009,17 @@ function requireErrors() { ResponseContentLengthMismatchError, BalancedPoolMissingUpstreamError, ResponseExceededMaxSizeError, - RequestRetryError + RequestRetryError, + ResponseError, + SecureProxyConnectionError }; - return errors; + return errors$1; } -var constants$4; -var hasRequiredConstants$4; -function requireConstants$4() { - if (hasRequiredConstants$4) return constants$4; - hasRequiredConstants$4 = 1; +var constants$9; +var hasRequiredConstants$9; +function requireConstants$9() { + if (hasRequiredConstants$9) return constants$9; + hasRequiredConstants$9 = 1; const headerNameLowerCasedRecord = {}; const wellknownHeaderNames = [ "Accept", @@ -962,35 +1124,219 @@ function requireConstants$4() { headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] = lowerCasedKey; } Object.setPrototypeOf(headerNameLowerCasedRecord, null); - constants$4 = { + constants$9 = { wellknownHeaderNames, headerNameLowerCasedRecord }; - return constants$4; + return constants$9; } -var util$6; -var hasRequiredUtil$6; -function requireUtil$6() { - if (hasRequiredUtil$6) return util$6; - hasRequiredUtil$6 = 1; - const assert = require$$0$3; - const { kDestroyed, kBodyUsed } = requireSymbols$4(); - const { IncomingMessage } = require$$2$1; - const stream = require$$0$5; - const net = require$$0$4; - const { InvalidArgumentError } = requireErrors(); - const { Blob: Blob2 } = require$$7; - const nodeUtil = require$$0$2; - const { stringify } = require$$8; - const { headerNameLowerCasedRecord } = requireConstants$4(); +var tree_1; +var hasRequiredTree; +function requireTree() { + if (hasRequiredTree) return tree_1; + hasRequiredTree = 1; + const { + wellknownHeaderNames, + headerNameLowerCasedRecord + } = requireConstants$9(); + class TstNode { + /** @type {any} */ + value = null; + /** @type {null | TstNode} */ + left = null; + /** @type {null | TstNode} */ + middle = null; + /** @type {null | TstNode} */ + right = null; + /** @type {number} */ + code; + /** + * @param {string} key + * @param {any} value + * @param {number} index + */ + constructor(key, value, index) { + if (index === void 0 || index >= key.length) { + throw new TypeError("Unreachable"); + } + const code = this.code = key.charCodeAt(index); + if (code > 127) { + throw new TypeError("key must be ascii string"); + } + if (key.length !== ++index) { + this.middle = new TstNode(key, value, index); + } else { + this.value = value; + } + } + /** + * @param {string} key + * @param {any} value + */ + add(key, value) { + const length = key.length; + if (length === 0) { + throw new TypeError("Unreachable"); + } + let index = 0; + let node = this; + while (true) { + const code = key.charCodeAt(index); + if (code > 127) { + throw new TypeError("key must be ascii string"); + } + if (node.code === code) { + if (length === ++index) { + node.value = value; + break; + } else if (node.middle !== null) { + node = node.middle; + } else { + node.middle = new TstNode(key, value, index); + break; + } + } else if (node.code < code) { + if (node.left !== null) { + node = node.left; + } else { + node.left = new TstNode(key, value, index); + break; + } + } else if (node.right !== null) { + node = node.right; + } else { + node.right = new TstNode(key, value, index); + break; + } + } + } + /** + * @param {Uint8Array} key + * @return {TstNode | null} + */ + search(key) { + const keylength = key.length; + let index = 0; + let node = this; + while (node !== null && index < keylength) { + let code = key[index]; + if (code <= 90 && code >= 65) { + code |= 32; + } + while (node !== null) { + if (code === node.code) { + if (keylength === ++index) { + return node; + } + node = node.middle; + break; + } + node = node.code < code ? node.left : node.right; + } + } + return null; + } + } + class TernarySearchTree { + /** @type {TstNode | null} */ + node = null; + /** + * @param {string} key + * @param {any} value + * */ + insert(key, value) { + if (this.node === null) { + this.node = new TstNode(key, value, 0); + } else { + this.node.add(key, value); + } + } + /** + * @param {Uint8Array} key + * @return {any} + */ + lookup(key) { + return this.node?.search(key)?.value ?? null; + } + } + const tree = new TernarySearchTree(); + for (let i = 0; i < wellknownHeaderNames.length; ++i) { + const key = headerNameLowerCasedRecord[wellknownHeaderNames[i]]; + tree.insert(key, key); + } + tree_1 = { + TernarySearchTree, + tree + }; + return tree_1; +} +var util$e; +var hasRequiredUtil$e; +function requireUtil$e() { + if (hasRequiredUtil$e) return util$e; + hasRequiredUtil$e = 1; + const assert = require$$0$5; + const { kDestroyed, kBodyUsed, kListeners, kBody } = requireSymbols$9(); + const { IncomingMessage } = require$$2$2; + const stream = require$$0$6; + const net = require$$0$7; + const { Blob: Blob2 } = require$$0$3; + const nodeUtil = require$$1$2; + const { stringify } = require$$7; + const { EventEmitter: EE } = require$$0$4; + const { InvalidArgumentError } = requireErrors$1(); + const { headerNameLowerCasedRecord } = requireConstants$9(); + const { tree } = requireTree(); const [nodeMajor, nodeMinor] = process.versions.node.split(".").map((v) => Number(v)); + class BodyAsyncIterable { + constructor(body2) { + this[kBody] = body2; + this[kBodyUsed] = false; + } + async *[Symbol.asyncIterator]() { + assert(!this[kBodyUsed], "disturbed"); + this[kBodyUsed] = true; + yield* this[kBody]; + } + } + function wrapRequestBody(body2) { + if (isStream(body2)) { + if (bodyLength(body2) === 0) { + body2.on("data", function() { + assert(false); + }); + } + if (typeof body2.readableDidRead !== "boolean") { + body2[kBodyUsed] = false; + EE.prototype.on.call(body2, "data", function() { + this[kBodyUsed] = true; + }); + } + return body2; + } else if (body2 && typeof body2.pipeTo === "function") { + return new BodyAsyncIterable(body2); + } else if (body2 && typeof body2 !== "string" && !ArrayBuffer.isView(body2) && isIterable(body2)) { + return new BodyAsyncIterable(body2); + } else { + return body2; + } + } function nop() { } function isStream(obj) { return obj && typeof obj === "object" && typeof obj.pipe === "function" && typeof obj.on === "function"; } function isBlobLike(object) { - return Blob2 && object instanceof Blob2 || object && typeof object === "object" && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && /^(Blob|File)$/.test(object[Symbol.toStringTag]); + if (object === null) { + return false; + } else if (object instanceof Blob2) { + return true; + } else if (typeof object !== "object") { + return false; + } else { + const sTag = object[Symbol.toStringTag]; + return (sTag === "Blob" || sTag === "File") && ("stream" in object && typeof object.stream === "function" || "arrayBuffer" in object && typeof object.arrayBuffer === "function"); + } } function buildURL(url, queryParams) { if (url.includes("?") || url.includes("#")) { @@ -1002,10 +1348,17 @@ function requireUtil$6() { } return url; } + function isValidPort(port) { + const value = parseInt(port, 10); + return value === Number(port) && value >= 0 && value <= 65535; + } + function isHttpOrHttpsPrefixed(value) { + return value != null && value[0] === "h" && value[1] === "t" && value[2] === "t" && value[3] === "p" && (value[4] === ":" || value[4] === "s" && value[5] === ":"); + } function parseURL(url) { if (typeof url === "string") { url = new URL(url); - if (!/^https?:/.test(url.origin || url.protocol)) { + if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); } return url; @@ -1013,11 +1366,8 @@ function requireUtil$6() { if (!url || typeof url !== "object") { throw new InvalidArgumentError("Invalid URL: The URL argument must be a non-null object."); } - if (!/^https?:/.test(url.origin || url.protocol)) { - throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); - } if (!(url instanceof URL)) { - if (url.port != null && url.port !== "" && !Number.isFinite(parseInt(url.port))) { + if (url.port != null && url.port !== "" && isValidPort(url.port) === false) { throw new InvalidArgumentError("Invalid URL: port must be a valid integer or a string representation of an integer."); } if (url.path != null && typeof url.path !== "string") { @@ -1032,16 +1382,22 @@ function requireUtil$6() { if (url.origin != null && typeof url.origin !== "string") { throw new InvalidArgumentError("Invalid URL origin: the origin must be a string or null/undefined."); } + if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { + throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); + } const port = url.port != null ? url.port : url.protocol === "https:" ? 443 : 80; - let origin = url.origin != null ? url.origin : `${url.protocol}//${url.hostname}:${port}`; + let origin = url.origin != null ? url.origin : `${url.protocol || ""}//${url.hostname || ""}:${port}`; let path = url.path != null ? url.path : `${url.pathname || ""}${url.search || ""}`; - if (origin.endsWith("/")) { - origin = origin.substring(0, origin.length - 1); + if (origin[origin.length - 1] === "/") { + origin = origin.slice(0, origin.length - 1); } - if (path && !path.startsWith("/")) { + if (path && path[0] !== "/") { path = `/${path}`; } - url = new URL(origin + path); + return new URL(`${origin}${path}`); + } + if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { + throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); } return url; } @@ -1066,7 +1422,7 @@ function requireUtil$6() { if (!host) { return null; } - assert.strictEqual(typeof host, "string"); + assert(typeof host === "string"); const servername = getHostname(host); if (net.isIP(servername)) { return ""; @@ -1095,12 +1451,8 @@ function requireUtil$6() { } return null; } - function isDestroyed(stream2) { - return !stream2 || !!(stream2.destroyed || stream2[kDestroyed]); - } - function isReadableAborted(stream2) { - const state = stream2 && stream2._readableState; - return isDestroyed(stream2) && state && !state.endEmitted; + function isDestroyed(body2) { + return body2 && !!(body2.destroyed || body2[kDestroyed] || stream.isDestroyed?.(body2)); } function destroy(stream2, err) { if (stream2 == null || !isStream(stream2) || isDestroyed(stream2)) { @@ -1112,9 +1464,9 @@ function requireUtil$6() { } stream2.destroy(err); } else if (err) { - process.nextTick((stream3, err2) => { - stream3.emit("error", err2); - }, stream2, err); + queueMicrotask(() => { + stream2.emit("error", err); + }); } if (stream2.destroyed !== true) { stream2[kDestroyed] = true; @@ -1126,25 +1478,29 @@ function requireUtil$6() { return m ? parseInt(m[1], 10) * 1e3 : null; } function headerNameToString(value) { - return headerNameLowerCasedRecord[value] || value.toLowerCase(); + return typeof value === "string" ? headerNameLowerCasedRecord[value] ?? value.toLowerCase() : tree.lookup(value) ?? value.toString("latin1").toLowerCase(); } - function parseHeaders(headers2, obj = {}) { - if (!Array.isArray(headers2)) return headers2; + function bufferToLowerCasedHeaderName(value) { + return tree.lookup(value) ?? value.toString("latin1").toLowerCase(); + } + function parseHeaders(headers2, obj) { + if (obj === void 0) obj = {}; for (let i = 0; i < headers2.length; i += 2) { - const key = headers2[i].toString().toLowerCase(); + const key = headerNameToString(headers2[i]); let val = obj[key]; - if (!val) { - if (Array.isArray(headers2[i + 1])) { - obj[key] = headers2[i + 1].map((x) => x.toString("utf8")); - } else { - obj[key] = headers2[i + 1].toString("utf8"); - } - } else { - if (!Array.isArray(val)) { + if (val) { + if (typeof val === "string") { val = [val]; obj[key] = val; } val.push(headers2[i + 1].toString("utf8")); + } else { + const headersValue = headers2[i + 1]; + if (typeof headersValue === "string") { + obj[key] = headersValue; + } else { + obj[key] = Array.isArray(headersValue) ? headersValue.map((x) => x.toString("utf8")) : headersValue.toString("utf8"); + } } } if ("content-length" in obj && "content-disposition" in obj) { @@ -1153,20 +1509,26 @@ function requireUtil$6() { return obj; } function parseRawHeaders(headers2) { - const ret = []; + const len = headers2.length; + const ret = new Array(len); let hasContentLength = false; let contentDispositionIdx = -1; + let key; + let val; + let kLen = 0; for (let n = 0; n < headers2.length; n += 2) { - const key = headers2[n + 0].toString(); - const val = headers2[n + 1].toString("utf8"); - if (key.length === 14 && (key === "content-length" || key.toLowerCase() === "content-length")) { - ret.push(key, val); + key = headers2[n]; + val = headers2[n + 1]; + typeof key !== "string" && (key = key.toString()); + typeof val !== "string" && (val = val.toString("utf8")); + kLen = key.length; + if (kLen === 14 && key[7] === "-" && (key === "content-length" || key.toLowerCase() === "content-length")) { hasContentLength = true; - } else if (key.length === 19 && (key === "content-disposition" || key.toLowerCase() === "content-disposition")) { - contentDispositionIdx = ret.push(key, val) - 1; - } else { - ret.push(key, val); + } else if (kLen === 19 && key[7] === "-" && (key === "content-disposition" || key.toLowerCase() === "content-disposition")) { + contentDispositionIdx = n + 1; } + ret[n] = key; + ret[n + 1] = val; } if (hasContentLength && contentDispositionIdx !== -1) { ret[contentDispositionIdx] = Buffer.from(ret[contentDispositionIdx]).toString("latin1"); @@ -1206,17 +1568,13 @@ function requireUtil$6() { } } function isDisturbed(body2) { - return !!(body2 && (stream.isDisturbed ? stream.isDisturbed(body2) || body2[kBodyUsed] : body2[kBodyUsed] || body2.readableDidRead || body2._readableState && body2._readableState.dataEmitted || isReadableAborted(body2))); + return !!(body2 && (stream.isDisturbed(body2) || body2[kBodyUsed])); } function isErrored(body2) { - return !!(body2 && (stream.isErrored ? stream.isErrored(body2) : /state: 'errored'/.test( - nodeUtil.inspect(body2) - ))); + return !!(body2 && stream.isErrored(body2)); } function isReadable(body2) { - return !!(body2 && (stream.isReadable ? stream.isReadable(body2) : /state: 'readable'/.test( - nodeUtil.inspect(body2) - ))); + return !!(body2 && stream.isReadable(body2)); } function getSocketInfo(socket) { return { @@ -1230,19 +1588,7 @@ function requireUtil$6() { bytesRead: socket.bytesRead }; } - async function* convertIterableToBuffer(iterable) { - for await (const chunk of iterable) { - yield Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk); - } - } - let ReadableStream; function ReadableStreamFrom(iterable) { - if (!ReadableStream) { - ReadableStream = require$$14.ReadableStream; - } - if (ReadableStream.from) { - return ReadableStream.from(convertIterableToBuffer(iterable)); - } let iterator2; return new ReadableStream( { @@ -1254,37 +1600,26 @@ function requireUtil$6() { if (done) { queueMicrotask(() => { controller.close(); + controller.byobRequest?.respond(0); }); } else { const buf = Buffer.isBuffer(value) ? value : Buffer.from(value); - controller.enqueue(new Uint8Array(buf)); + if (buf.byteLength) { + controller.enqueue(new Uint8Array(buf)); + } } return controller.desiredSize > 0; }, async cancel(reason) { await iterator2.return(); - } - }, - 0 + }, + type: "bytes" + } ); } function isFormDataLike(object) { return object && typeof object === "object" && typeof object.append === "function" && typeof object.delete === "function" && typeof object.get === "function" && typeof object.getAll === "function" && typeof object.has === "function" && typeof object.set === "function" && object[Symbol.toStringTag] === "FormData"; } - function throwIfAborted(signal) { - if (!signal) { - return; - } - if (typeof signal.throwIfAborted === "function") { - signal.throwIfAborted(); - } else { - if (signal.aborted) { - const err = new Error("The operation was aborted"); - err.name = "AbortError"; - throw err; - } - } - } function addAbortListener(signal, listener) { if ("addEventListener" in signal) { signal.addEventListener("abort", listener, { once: true }); @@ -1293,14 +1628,52 @@ function requireUtil$6() { signal.addListener("abort", listener); return () => signal.removeListener("abort", listener); } - const hasToWellFormed = !!String.prototype.toWellFormed; + const hasToWellFormed = typeof String.prototype.toWellFormed === "function"; + const hasIsWellFormed = typeof String.prototype.isWellFormed === "function"; function toUSVString(val) { - if (hasToWellFormed) { - return `${val}`.toWellFormed(); - } else if (nodeUtil.toUSVString) { - return nodeUtil.toUSVString(val); + return hasToWellFormed ? `${val}`.toWellFormed() : nodeUtil.toUSVString(val); + } + function isUSVString(val) { + return hasIsWellFormed ? `${val}`.isWellFormed() : toUSVString(val) === `${val}`; + } + function isTokenCharCode(c) { + switch (c) { + case 34: + case 40: + case 41: + case 44: + case 47: + case 58: + case 59: + case 60: + case 61: + case 62: + case 63: + case 64: + case 91: + case 92: + case 93: + case 123: + case 125: + return false; + default: + return c >= 33 && c <= 126; } - return `${val}`; + } + function isValidHTTPToken(characters) { + if (characters.length === 0) { + return false; + } + for (let i = 0; i < characters.length; ++i) { + if (!isTokenCharCode(characters.charCodeAt(i))) { + return false; + } + } + return true; + } + const headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/; + function isValidHeaderValue(characters) { + return !headerCharRegex.test(characters); } function parseRangeHeader(range) { if (range == null || range === "") return { start: 0, end: null, size: null }; @@ -1311,16 +1684,57 @@ function requireUtil$6() { size: m[3] ? parseInt(m[3]) : null } : null; } + function addListener(obj, name, listener) { + const listeners = obj[kListeners] ??= []; + listeners.push([name, listener]); + obj.on(name, listener); + return obj; + } + function removeAllListeners(obj) { + for (const [name, listener] of obj[kListeners] ?? []) { + obj.removeListener(name, listener); + } + obj[kListeners] = null; + } + function errorRequest(client2, request2, err) { + try { + request2.onError(err); + assert(request2.aborted); + } catch (err2) { + client2.emit("error", err2); + } + } const kEnumerableProperty = /* @__PURE__ */ Object.create(null); kEnumerableProperty.enumerable = true; - util$6 = { + const normalizedMethodRecordsBase = { + delete: "DELETE", + DELETE: "DELETE", + get: "GET", + GET: "GET", + head: "HEAD", + HEAD: "HEAD", + options: "OPTIONS", + OPTIONS: "OPTIONS", + post: "POST", + POST: "POST", + put: "PUT", + PUT: "PUT" + }; + const normalizedMethodRecords = { + ...normalizedMethodRecordsBase, + patch: "patch", + PATCH: "PATCH" + }; + Object.setPrototypeOf(normalizedMethodRecordsBase, null); + Object.setPrototypeOf(normalizedMethodRecords, null); + util$e = { kEnumerableProperty, nop, isDisturbed, isErrored, isReadable, toUSVString, - isReadableAborted, + isUSVString, isBlobLike, parseOrigin, parseURL, @@ -1330,6 +1744,10 @@ function requireUtil$6() { isAsyncIterable, isDestroyed, headerNameToString, + bufferToLowerCasedHeaderName, + addListener, + removeAllListeners, + errorRequest, parseRawHeaders, parseHeaders, parseKeepAliveTimeout, @@ -1342,3334 +1760,1779 @@ function requireUtil$6() { getSocketInfo, isFormDataLike, buildURL, - throwIfAborted, addAbortListener, + isValidHTTPToken, + isValidHeaderValue, + isTokenCharCode, parseRangeHeader, + normalizedMethodRecordsBase, + normalizedMethodRecords, + isValidPort, + isHttpOrHttpsPrefixed, nodeMajor, nodeMinor, - nodeHasAutoSelectFamily: nodeMajor > 18 || nodeMajor === 18 && nodeMinor >= 13, - safeHTTPMethods: ["GET", "HEAD", "OPTIONS", "TRACE"] + safeHTTPMethods: ["GET", "HEAD", "OPTIONS", "TRACE"], + wrapRequestBody }; - return util$6; + return util$e; } -var timers; -var hasRequiredTimers; -function requireTimers() { - if (hasRequiredTimers) return timers; - hasRequiredTimers = 1; - let fastNow = Date.now(); - let fastNowTimeout; - const fastTimers = []; - function onTimeout() { - fastNow = Date.now(); - let len = fastTimers.length; - let idx = 0; - while (idx < len) { - const timer = fastTimers[idx]; - if (timer.state === 0) { - timer.state = fastNow + timer.delay; - } else if (timer.state > 0 && fastNow >= timer.state) { - timer.state = -1; - timer.callback(timer.opaque); - } - if (timer.state === -1) { - timer.state = -2; - if (idx !== len - 1) { - fastTimers[idx] = fastTimers.pop(); - } else { - fastTimers.pop(); - } - len -= 1; - } else { - idx += 1; - } - } - if (fastTimers.length > 0) { - refreshTimeout(); - } - } - function refreshTimeout() { - if (fastNowTimeout && fastNowTimeout.refresh) { - fastNowTimeout.refresh(); - } else { - clearTimeout(fastNowTimeout); - fastNowTimeout = setTimeout(onTimeout, 1e3); - if (fastNowTimeout.unref) { - fastNowTimeout.unref(); - } - } - } - class Timeout { - constructor(callback, delay, opaque) { - this.callback = callback; - this.delay = delay; - this.opaque = opaque; - this.state = -2; - this.refresh(); - } - refresh() { - if (this.state === -2) { - fastTimers.push(this); - if (!fastNowTimeout || fastTimers.length === 1) { - refreshTimeout(); - } - } - this.state = 0; - } - clear() { - this.state = -1; +var diagnostics; +var hasRequiredDiagnostics; +function requireDiagnostics() { + if (hasRequiredDiagnostics) return diagnostics; + hasRequiredDiagnostics = 1; + const diagnosticsChannel = require$$0$8; + const util2 = require$$1$2; + const undiciDebugLog = util2.debuglog("undici"); + const fetchDebuglog = util2.debuglog("fetch"); + const websocketDebuglog = util2.debuglog("websocket"); + let isClientSet = false; + const channels = { + // Client + beforeConnect: diagnosticsChannel.channel("undici:client:beforeConnect"), + connected: diagnosticsChannel.channel("undici:client:connected"), + connectError: diagnosticsChannel.channel("undici:client:connectError"), + sendHeaders: diagnosticsChannel.channel("undici:client:sendHeaders"), + // Request + create: diagnosticsChannel.channel("undici:request:create"), + bodySent: diagnosticsChannel.channel("undici:request:bodySent"), + headers: diagnosticsChannel.channel("undici:request:headers"), + trailers: diagnosticsChannel.channel("undici:request:trailers"), + error: diagnosticsChannel.channel("undici:request:error"), + // WebSocket + open: diagnosticsChannel.channel("undici:websocket:open"), + close: diagnosticsChannel.channel("undici:websocket:close"), + socketError: diagnosticsChannel.channel("undici:websocket:socket_error"), + ping: diagnosticsChannel.channel("undici:websocket:ping"), + pong: diagnosticsChannel.channel("undici:websocket:pong") + }; + if (undiciDebugLog.enabled || fetchDebuglog.enabled) { + const debuglog = fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog; + diagnosticsChannel.channel("undici:client:beforeConnect").subscribe((evt) => { + const { + connectParams: { version, protocol, port, host } + } = evt; + debuglog( + "connecting to %s using %s%s", + `${host}${port ? `:${port}` : ""}`, + protocol, + version + ); + }); + diagnosticsChannel.channel("undici:client:connected").subscribe((evt) => { + const { + connectParams: { version, protocol, port, host } + } = evt; + debuglog( + "connected to %s using %s%s", + `${host}${port ? `:${port}` : ""}`, + protocol, + version + ); + }); + diagnosticsChannel.channel("undici:client:connectError").subscribe((evt) => { + const { + connectParams: { version, protocol, port, host }, + error + } = evt; + debuglog( + "connection to %s using %s%s errored - %s", + `${host}${port ? `:${port}` : ""}`, + protocol, + version, + error.message + ); + }); + diagnosticsChannel.channel("undici:client:sendHeaders").subscribe((evt) => { + const { + request: { method, path, origin } + } = evt; + debuglog("sending request to %s %s/%s", method, origin, path); + }); + diagnosticsChannel.channel("undici:request:headers").subscribe((evt) => { + const { + request: { method, path, origin }, + response: { statusCode } + } = evt; + debuglog( + "received response to %s %s/%s - HTTP %d", + method, + origin, + path, + statusCode + ); + }); + diagnosticsChannel.channel("undici:request:trailers").subscribe((evt) => { + const { + request: { method, path, origin } + } = evt; + debuglog("trailers received from %s %s/%s", method, origin, path); + }); + diagnosticsChannel.channel("undici:request:error").subscribe((evt) => { + const { + request: { method, path, origin }, + error + } = evt; + debuglog( + "request to %s %s/%s errored - %s", + method, + origin, + path, + error.message + ); + }); + isClientSet = true; + } + if (websocketDebuglog.enabled) { + if (!isClientSet) { + const debuglog = undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog; + diagnosticsChannel.channel("undici:client:beforeConnect").subscribe((evt) => { + const { + connectParams: { version, protocol, port, host } + } = evt; + debuglog( + "connecting to %s%s using %s%s", + host, + port ? `:${port}` : "", + protocol, + version + ); + }); + diagnosticsChannel.channel("undici:client:connected").subscribe((evt) => { + const { + connectParams: { version, protocol, port, host } + } = evt; + debuglog( + "connected to %s%s using %s%s", + host, + port ? `:${port}` : "", + protocol, + version + ); + }); + diagnosticsChannel.channel("undici:client:connectError").subscribe((evt) => { + const { + connectParams: { version, protocol, port, host }, + error + } = evt; + debuglog( + "connection to %s%s using %s%s errored - %s", + host, + port ? `:${port}` : "", + protocol, + version, + error.message + ); + }); + diagnosticsChannel.channel("undici:client:sendHeaders").subscribe((evt) => { + const { + request: { method, path, origin } + } = evt; + debuglog("sending request to %s %s/%s", method, origin, path); + }); } + diagnosticsChannel.channel("undici:websocket:open").subscribe((evt) => { + const { + address: { address, port } + } = evt; + websocketDebuglog("connection opened %s%s", address, port ? `:${port}` : ""); + }); + diagnosticsChannel.channel("undici:websocket:close").subscribe((evt) => { + const { websocket: websocket2, code, reason } = evt; + websocketDebuglog( + "closed connection to %s - %s %s", + websocket2.url, + code, + reason + ); + }); + diagnosticsChannel.channel("undici:websocket:socket_error").subscribe((err) => { + websocketDebuglog("connection errored - %s", err.message); + }); + diagnosticsChannel.channel("undici:websocket:ping").subscribe((evt) => { + websocketDebuglog("ping received"); + }); + diagnosticsChannel.channel("undici:websocket:pong").subscribe((evt) => { + websocketDebuglog("pong received"); + }); } - timers = { - setTimeout(callback, delay, opaque) { - return delay < 1e3 ? setTimeout(callback, delay, opaque) : new Timeout(callback, delay, opaque); - }, - clearTimeout(timeout) { - if (timeout instanceof Timeout) { - timeout.clear(); - } else { - clearTimeout(timeout); - } - } + diagnostics = { + channels }; - return timers; + return diagnostics; } -var main = { exports: {} }; -var sbmh; -var hasRequiredSbmh; -function requireSbmh() { - if (hasRequiredSbmh) return sbmh; - hasRequiredSbmh = 1; - const EventEmitter = require$$0$6.EventEmitter; - const inherits = require$$1$2.inherits; - function SBMH(needle) { - if (typeof needle === "string") { - needle = Buffer.from(needle); - } - if (!Buffer.isBuffer(needle)) { - throw new TypeError("The needle has to be a String or a Buffer."); - } - const needleLength = needle.length; - if (needleLength === 0) { - throw new Error("The needle cannot be an empty String/Buffer."); - } - if (needleLength > 256) { - throw new Error("The needle cannot have a length bigger than 256."); - } - this.maxMatches = Infinity; - this.matches = 0; - this._occ = new Array(256).fill(needleLength); - this._lookbehind_size = 0; - this._needle = needle; - this._bufpos = 0; - this._lookbehind = Buffer.alloc(needleLength); - for (var i = 0; i < needleLength - 1; ++i) { - this._occ[needle[i]] = needleLength - 1 - i; - } - } - inherits(SBMH, EventEmitter); - SBMH.prototype.reset = function() { - this._lookbehind_size = 0; - this.matches = 0; - this._bufpos = 0; - }; - SBMH.prototype.push = function(chunk, pos) { - if (!Buffer.isBuffer(chunk)) { - chunk = Buffer.from(chunk, "binary"); - } - const chlen = chunk.length; - this._bufpos = pos || 0; - let r; - while (r !== chlen && this.matches < this.maxMatches) { - r = this._sbmh_feed(chunk); - } - return r; - }; - SBMH.prototype._sbmh_feed = function(data) { - const len = data.length; - const needle = this._needle; - const needleLength = needle.length; - const lastNeedleChar = needle[needleLength - 1]; - let pos = -this._lookbehind_size; - let ch; - if (pos < 0) { - while (pos < 0 && pos <= len - needleLength) { - ch = this._sbmh_lookup_char(data, pos + needleLength - 1); - if (ch === lastNeedleChar && this._sbmh_memcmp(data, pos, needleLength - 1)) { - this._lookbehind_size = 0; - ++this.matches; - this.emit("info", true); - return this._bufpos = pos + needleLength; - } - pos += this._occ[ch]; +var request$4; +var hasRequiredRequest$3; +function requireRequest$3() { + if (hasRequiredRequest$3) return request$4; + hasRequiredRequest$3 = 1; + const { + InvalidArgumentError, + NotSupportedError + } = requireErrors$1(); + const assert = require$$0$5; + const { + isValidHTTPToken, + isValidHeaderValue, + isStream, + destroy, + isBuffer, + isFormDataLike, + isIterable, + isBlobLike, + buildURL, + validateHandler, + getServerName, + normalizedMethodRecords + } = requireUtil$e(); + const { channels } = requireDiagnostics(); + const { headerNameLowerCasedRecord } = requireConstants$9(); + const invalidPathRegex = /[^\u0021-\u00ff]/; + const kHandler = /* @__PURE__ */ Symbol("handler"); + class Request { + constructor(origin, { + path, + method, + body: body2, + headers: headers2, + query, + idempotent, + blocking, + upgrade, + headersTimeout, + bodyTimeout, + reset, + throwOnError, + expectContinue, + servername + }, handler2) { + if (typeof path !== "string") { + throw new InvalidArgumentError("path must be a string"); + } else if (path[0] !== "/" && !(path.startsWith("http://") || path.startsWith("https://")) && method !== "CONNECT") { + throw new InvalidArgumentError("path must be an absolute URL or start with a slash"); + } else if (invalidPathRegex.test(path)) { + throw new InvalidArgumentError("invalid request path"); } - if (pos < 0) { - while (pos < 0 && !this._sbmh_memcmp(data, pos, len - pos)) { - ++pos; - } + if (typeof method !== "string") { + throw new InvalidArgumentError("method must be a string"); + } else if (normalizedMethodRecords[method] === void 0 && !isValidHTTPToken(method)) { + throw new InvalidArgumentError("invalid request method"); } - if (pos >= 0) { - this.emit("info", false, this._lookbehind, 0, this._lookbehind_size); - this._lookbehind_size = 0; + if (upgrade && typeof upgrade !== "string") { + throw new InvalidArgumentError("upgrade must be a string"); + } + if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) { + throw new InvalidArgumentError("invalid headersTimeout"); + } + if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) { + throw new InvalidArgumentError("invalid bodyTimeout"); + } + if (reset != null && typeof reset !== "boolean") { + throw new InvalidArgumentError("invalid reset"); + } + if (expectContinue != null && typeof expectContinue !== "boolean") { + throw new InvalidArgumentError("invalid expectContinue"); + } + this.headersTimeout = headersTimeout; + this.bodyTimeout = bodyTimeout; + this.throwOnError = throwOnError === true; + this.method = method; + this.abort = null; + if (body2 == null) { + this.body = null; + } else if (isStream(body2)) { + this.body = body2; + const rState = this.body._readableState; + if (!rState || !rState.autoDestroy) { + this.endHandler = function autoDestroy() { + destroy(this); + }; + this.body.on("end", this.endHandler); + } + this.errorHandler = (err) => { + if (this.abort) { + this.abort(err); + } else { + this.error = err; + } + }; + this.body.on("error", this.errorHandler); + } else if (isBuffer(body2)) { + this.body = body2.byteLength ? body2 : null; + } else if (ArrayBuffer.isView(body2)) { + this.body = body2.buffer.byteLength ? Buffer.from(body2.buffer, body2.byteOffset, body2.byteLength) : null; + } else if (body2 instanceof ArrayBuffer) { + this.body = body2.byteLength ? Buffer.from(body2) : null; + } else if (typeof body2 === "string") { + this.body = body2.length ? Buffer.from(body2) : null; + } else if (isFormDataLike(body2) || isIterable(body2) || isBlobLike(body2)) { + this.body = body2; } else { - const bytesToCutOff = this._lookbehind_size + pos; - if (bytesToCutOff > 0) { - this.emit("info", false, this._lookbehind, 0, bytesToCutOff); + throw new InvalidArgumentError("body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable"); + } + this.completed = false; + this.aborted = false; + this.upgrade = upgrade || null; + this.path = query ? buildURL(path, query) : path; + this.origin = origin; + this.idempotent = idempotent == null ? method === "HEAD" || method === "GET" : idempotent; + this.blocking = blocking == null ? false : blocking; + this.reset = reset == null ? null : reset; + this.host = null; + this.contentLength = null; + this.contentType = null; + this.headers = []; + this.expectContinue = expectContinue != null ? expectContinue : false; + if (Array.isArray(headers2)) { + if (headers2.length % 2 !== 0) { + throw new InvalidArgumentError("headers array must be even"); } - this._lookbehind.copy( - this._lookbehind, - 0, - bytesToCutOff, - this._lookbehind_size - bytesToCutOff - ); - this._lookbehind_size -= bytesToCutOff; - data.copy(this._lookbehind, this._lookbehind_size); - this._lookbehind_size += len; - this._bufpos = len; - return len; + for (let i = 0; i < headers2.length; i += 2) { + processHeader(this, headers2[i], headers2[i + 1]); + } + } else if (headers2 && typeof headers2 === "object") { + if (headers2[Symbol.iterator]) { + for (const header of headers2) { + if (!Array.isArray(header) || header.length !== 2) { + throw new InvalidArgumentError("headers must be in key-value pair format"); + } + processHeader(this, header[0], header[1]); + } + } else { + const keys = Object.keys(headers2); + for (let i = 0; i < keys.length; ++i) { + processHeader(this, keys[i], headers2[keys[i]]); + } + } + } else if (headers2 != null) { + throw new InvalidArgumentError("headers must be an object or an array"); + } + validateHandler(handler2, method, upgrade); + this.servername = servername || getServerName(this.host); + this[kHandler] = handler2; + if (channels.create.hasSubscribers) { + channels.create.publish({ request: this }); } } - pos += (pos >= 0) * this._bufpos; - if (data.indexOf(needle, pos) !== -1) { - pos = data.indexOf(needle, pos); - ++this.matches; - if (pos > 0) { - this.emit("info", true, data, this._bufpos, pos); - } else { - this.emit("info", true); + onBodySent(chunk) { + if (this[kHandler].onBodySent) { + try { + return this[kHandler].onBodySent(chunk); + } catch (err) { + this.abort(err); + } } - return this._bufpos = pos + needleLength; - } else { - pos = len - needleLength; } - while (pos < len && (data[pos] !== needle[0] || Buffer.compare( - data.subarray(pos, pos + len - pos), - needle.subarray(0, len - pos) - ) !== 0)) { - ++pos; + onRequestSent() { + if (channels.bodySent.hasSubscribers) { + channels.bodySent.publish({ request: this }); + } + if (this[kHandler].onRequestSent) { + try { + return this[kHandler].onRequestSent(); + } catch (err) { + this.abort(err); + } + } } - if (pos < len) { - data.copy(this._lookbehind, 0, pos, pos + (len - pos)); - this._lookbehind_size = len - pos; + onConnect(abort) { + assert(!this.aborted); + assert(!this.completed); + if (this.error) { + abort(this.error); + } else { + this.abort = abort; + return this[kHandler].onConnect(abort); + } } - if (pos > 0) { - this.emit("info", false, data, this._bufpos, pos < len ? pos : len); + onResponseStarted() { + return this[kHandler].onResponseStarted?.(); } - this._bufpos = len; - return len; - }; - SBMH.prototype._sbmh_lookup_char = function(data, pos) { - return pos < 0 ? this._lookbehind[this._lookbehind_size + pos] : data[pos]; - }; - SBMH.prototype._sbmh_memcmp = function(data, pos, len) { - for (var i = 0; i < len; ++i) { - if (this._sbmh_lookup_char(data, pos + i) !== this._needle[i]) { + onHeaders(statusCode, headers2, resume, statusText) { + assert(!this.aborted); + assert(!this.completed); + if (channels.headers.hasSubscribers) { + channels.headers.publish({ request: this, response: { statusCode, headers: headers2, statusText } }); + } + try { + return this[kHandler].onHeaders(statusCode, headers2, resume, statusText); + } catch (err) { + this.abort(err); + } + } + onData(chunk) { + assert(!this.aborted); + assert(!this.completed); + try { + return this[kHandler].onData(chunk); + } catch (err) { + this.abort(err); return false; } } - return true; - }; - sbmh = SBMH; - return sbmh; -} -var PartStream_1; -var hasRequiredPartStream; -function requirePartStream() { - if (hasRequiredPartStream) return PartStream_1; - hasRequiredPartStream = 1; - const inherits = require$$1$2.inherits; - const ReadableStream = require$$0$7.Readable; - function PartStream(opts) { - ReadableStream.call(this, opts); - } - inherits(PartStream, ReadableStream); - PartStream.prototype._read = function(n) { - }; - PartStream_1 = PartStream; - return PartStream_1; -} -var getLimit; -var hasRequiredGetLimit; -function requireGetLimit() { - if (hasRequiredGetLimit) return getLimit; - hasRequiredGetLimit = 1; - getLimit = function getLimit2(limits, name, defaultLimit) { - if (!limits || limits[name] === void 0 || limits[name] === null) { - return defaultLimit; + onUpgrade(statusCode, headers2, socket) { + assert(!this.aborted); + assert(!this.completed); + return this[kHandler].onUpgrade(statusCode, headers2, socket); } - if (typeof limits[name] !== "number" || isNaN(limits[name])) { - throw new TypeError("Limit " + name + " is not a valid number"); + onComplete(trailers) { + this.onFinally(); + assert(!this.aborted); + this.completed = true; + if (channels.trailers.hasSubscribers) { + channels.trailers.publish({ request: this, trailers }); + } + try { + return this[kHandler].onComplete(trailers); + } catch (err) { + this.onError(err); + } } - return limits[name]; - }; - return getLimit; -} -var HeaderParser_1; -var hasRequiredHeaderParser; -function requireHeaderParser() { - if (hasRequiredHeaderParser) return HeaderParser_1; - hasRequiredHeaderParser = 1; - const EventEmitter = require$$0$6.EventEmitter; - const inherits = require$$1$2.inherits; - const getLimit2 = requireGetLimit(); - const StreamSearch = requireSbmh(); - const B_DCRLF = Buffer.from("\r\n\r\n"); - const RE_CRLF = /\r\n/g; - const RE_HDR = /^([^:]+):[ \t]?([\x00-\xFF]+)?$/; - function HeaderParser(cfg) { - EventEmitter.call(this); - cfg = cfg || {}; - const self2 = this; - this.nread = 0; - this.maxed = false; - this.npairs = 0; - this.maxHeaderPairs = getLimit2(cfg, "maxHeaderPairs", 2e3); - this.maxHeaderSize = getLimit2(cfg, "maxHeaderSize", 80 * 1024); - this.buffer = ""; - this.header = {}; - this.finished = false; - this.ss = new StreamSearch(B_DCRLF); - this.ss.on("info", function(isMatch, data, start, end) { - if (data && !self2.maxed) { - if (self2.nread + end - start >= self2.maxHeaderSize) { - end = self2.maxHeaderSize - self2.nread + start; - self2.nread = self2.maxHeaderSize; - self2.maxed = true; - } else { - self2.nread += end - start; - } - self2.buffer += data.toString("binary", start, end); + onError(error) { + this.onFinally(); + if (channels.error.hasSubscribers) { + channels.error.publish({ request: this, error }); } - if (isMatch) { - self2._finish(); + if (this.aborted) { + return; } - }); - } - inherits(HeaderParser, EventEmitter); - HeaderParser.prototype.push = function(data) { - const r = this.ss.push(data); - if (this.finished) { - return r; + this.aborted = true; + return this[kHandler].onError(error); } - }; - HeaderParser.prototype.reset = function() { - this.finished = false; - this.buffer = ""; - this.header = {}; - this.ss.reset(); - }; - HeaderParser.prototype._finish = function() { - if (this.buffer) { - this._parseHeader(); + onFinally() { + if (this.errorHandler) { + this.body.off("error", this.errorHandler); + this.errorHandler = null; + } + if (this.endHandler) { + this.body.off("end", this.endHandler); + this.endHandler = null; + } } - this.ss.matches = this.ss.maxMatches; - const header = this.header; - this.header = {}; - this.buffer = ""; - this.finished = true; - this.nread = this.npairs = 0; - this.maxed = false; - this.emit("header", header); - }; - HeaderParser.prototype._parseHeader = function() { - if (this.npairs === this.maxHeaderPairs) { + addHeader(key, value) { + processHeader(this, key, value); + return this; + } + } + function processHeader(request2, key, val) { + if (val && (typeof val === "object" && !Array.isArray(val))) { + throw new InvalidArgumentError(`invalid ${key} header`); + } else if (val === void 0) { return; } - const lines = this.buffer.split(RE_CRLF); - const len = lines.length; - let m, h; - for (var i = 0; i < len; ++i) { - if (lines[i].length === 0) { - continue; + let headerName = headerNameLowerCasedRecord[key]; + if (headerName === void 0) { + headerName = key.toLowerCase(); + if (headerNameLowerCasedRecord[headerName] === void 0 && !isValidHTTPToken(headerName)) { + throw new InvalidArgumentError("invalid header key"); } - if (lines[i][0] === " " || lines[i][0] === " ") { - if (h) { - this.header[h][this.header[h].length - 1] += lines[i]; - continue; + } + if (Array.isArray(val)) { + const arr = []; + for (let i = 0; i < val.length; i++) { + if (typeof val[i] === "string") { + if (!isValidHeaderValue(val[i])) { + throw new InvalidArgumentError(`invalid ${key} header`); + } + arr.push(val[i]); + } else if (val[i] === null) { + arr.push(""); + } else if (typeof val[i] === "object") { + throw new InvalidArgumentError(`invalid ${key} header`); + } else { + arr.push(`${val[i]}`); } } - const posColon = lines[i].indexOf(":"); - if (posColon === -1 || posColon === 0) { - return; + val = arr; + } else if (typeof val === "string") { + if (!isValidHeaderValue(val)) { + throw new InvalidArgumentError(`invalid ${key} header`); } - m = RE_HDR.exec(lines[i]); - h = m[1].toLowerCase(); - this.header[h] = this.header[h] || []; - this.header[h].push(m[2] || ""); - if (++this.npairs === this.maxHeaderPairs) { - break; + } else if (val === null) { + val = ""; + } else { + val = `${val}`; + } + if (request2.host === null && headerName === "host") { + if (typeof val !== "string") { + throw new InvalidArgumentError("invalid host header"); + } + request2.host = val; + } else if (request2.contentLength === null && headerName === "content-length") { + request2.contentLength = parseInt(val, 10); + if (!Number.isFinite(request2.contentLength)) { + throw new InvalidArgumentError("invalid content-length header"); + } + } else if (request2.contentType === null && headerName === "content-type") { + request2.contentType = val; + request2.headers.push(key, val); + } else if (headerName === "transfer-encoding" || headerName === "keep-alive" || headerName === "upgrade") { + throw new InvalidArgumentError(`invalid ${headerName} header`); + } else if (headerName === "connection") { + const value = typeof val === "string" ? val.toLowerCase() : null; + if (value !== "close" && value !== "keep-alive") { + throw new InvalidArgumentError("invalid connection header"); + } + if (value === "close") { + request2.reset = true; } + } else if (headerName === "expect") { + throw new NotSupportedError("expect header not supported"); + } else { + request2.headers.push(key, val); } - }; - HeaderParser_1 = HeaderParser; - return HeaderParser_1; + } + request$4 = Request; + return request$4; } -var Dicer_1; -var hasRequiredDicer; -function requireDicer() { - if (hasRequiredDicer) return Dicer_1; - hasRequiredDicer = 1; - const WritableStream = require$$0$7.Writable; - const inherits = require$$1$2.inherits; - const StreamSearch = requireSbmh(); - const PartStream = requirePartStream(); - const HeaderParser = requireHeaderParser(); - const DASH = 45; - const B_ONEDASH = Buffer.from("-"); - const B_CRLF = Buffer.from("\r\n"); - const EMPTY_FN = function() { - }; - function Dicer(cfg) { - if (!(this instanceof Dicer)) { - return new Dicer(cfg); +var dispatcher$1; +var hasRequiredDispatcher$1; +function requireDispatcher$1() { + if (hasRequiredDispatcher$1) return dispatcher$1; + hasRequiredDispatcher$1 = 1; + const EventEmitter = require$$0$4; + class Dispatcher extends EventEmitter { + dispatch() { + throw new Error("not implemented"); } - WritableStream.call(this, cfg); - if (!cfg || !cfg.headerFirst && typeof cfg.boundary !== "string") { - throw new TypeError("Boundary required"); + close() { + throw new Error("not implemented"); } - if (typeof cfg.boundary === "string") { - this.setBoundary(cfg.boundary); - } else { - this._bparser = void 0; + destroy() { + throw new Error("not implemented"); } - this._headerFirst = cfg.headerFirst; - this._dashes = 0; - this._parts = 0; - this._finished = false; - this._realFinish = false; - this._isPreamble = true; - this._justMatched = false; - this._firstWrite = true; - this._inHeader = true; - this._part = void 0; - this._cb = void 0; - this._ignoreData = false; - this._partOpts = { highWaterMark: cfg.partHwm }; - this._pause = false; - const self2 = this; - this._hparser = new HeaderParser(cfg); - this._hparser.on("header", function(header) { - self2._inHeader = false; - self2._part.emit("header", header); - }); - } - inherits(Dicer, WritableStream); - Dicer.prototype.emit = function(ev) { - if (ev === "finish" && !this._realFinish) { - if (!this._finished) { - const self2 = this; - process.nextTick(function() { - self2.emit("error", new Error("Unexpected end of multipart data")); - if (self2._part && !self2._ignoreData) { - const type = self2._isPreamble ? "Preamble" : "Part"; - self2._part.emit("error", new Error(type + " terminated early due to unexpected end of multipart data")); - self2._part.push(null); - process.nextTick(function() { - self2._realFinish = true; - self2.emit("finish"); - self2._realFinish = false; - }); - return; - } - self2._realFinish = true; - self2.emit("finish"); - self2._realFinish = false; - }); + compose(...args) { + const interceptors = Array.isArray(args[0]) ? args[0] : args; + let dispatch = this.dispatch.bind(this); + for (const interceptor of interceptors) { + if (interceptor == null) { + continue; + } + if (typeof interceptor !== "function") { + throw new TypeError(`invalid interceptor, expected function received ${typeof interceptor}`); + } + dispatch = interceptor(dispatch); + if (dispatch == null || typeof dispatch !== "function" || dispatch.length !== 2) { + throw new TypeError("invalid interceptor"); + } } - } else { - WritableStream.prototype.emit.apply(this, arguments); + return new ComposedDispatcher(this, dispatch); } - }; - Dicer.prototype._write = function(data, encoding2, cb) { - if (!this._hparser && !this._bparser) { - return cb(); + } + class ComposedDispatcher extends Dispatcher { + #dispatcher = null; + #dispatch = null; + constructor(dispatcher2, dispatch) { + super(); + this.#dispatcher = dispatcher2; + this.#dispatch = dispatch; } - if (this._headerFirst && this._isPreamble) { - if (!this._part) { - this._part = new PartStream(this._partOpts); - if (this.listenerCount("preamble") !== 0) { - this.emit("preamble", this._part); - } else { - this._ignore(); - } - } - const r = this._hparser.push(data); - if (!this._inHeader && r !== void 0 && r < data.length) { - data = data.slice(r); - } else { - return cb(); - } + dispatch(...args) { + this.#dispatch(...args); } - if (this._firstWrite) { - this._bparser.push(B_CRLF); - this._firstWrite = false; + close(...args) { + return this.#dispatcher.close(...args); } - this._bparser.push(data); - if (this._pause) { - this._cb = cb; - } else { - cb(); + destroy(...args) { + return this.#dispatcher.destroy(...args); } - }; - Dicer.prototype.reset = function() { - this._part = void 0; - this._bparser = void 0; - this._hparser = void 0; - }; - Dicer.prototype.setBoundary = function(boundary) { - const self2 = this; - this._bparser = new StreamSearch("\r\n--" + boundary); - this._bparser.on("info", function(isMatch, data, start, end) { - self2._oninfo(isMatch, data, start, end); - }); - }; - Dicer.prototype._ignore = function() { - if (this._part && !this._ignoreData) { - this._ignoreData = true; - this._part.on("error", EMPTY_FN); - this._part.resume(); + } + dispatcher$1 = Dispatcher; + return dispatcher$1; +} +var dispatcherBase$1; +var hasRequiredDispatcherBase$1; +function requireDispatcherBase$1() { + if (hasRequiredDispatcherBase$1) return dispatcherBase$1; + hasRequiredDispatcherBase$1 = 1; + const Dispatcher = requireDispatcher$1(); + const { + ClientDestroyedError, + ClientClosedError, + InvalidArgumentError + } = requireErrors$1(); + const { kDestroy, kClose, kClosed, kDestroyed, kDispatch, kInterceptors } = requireSymbols$9(); + const kOnDestroyed = /* @__PURE__ */ Symbol("onDestroyed"); + const kOnClosed = /* @__PURE__ */ Symbol("onClosed"); + const kInterceptedDispatch = /* @__PURE__ */ Symbol("Intercepted Dispatch"); + class DispatcherBase extends Dispatcher { + constructor() { + super(); + this[kDestroyed] = false; + this[kOnDestroyed] = null; + this[kClosed] = false; + this[kOnClosed] = []; } - }; - Dicer.prototype._oninfo = function(isMatch, data, start, end) { - let buf; - const self2 = this; - let i = 0; - let r; - let shouldWriteMore = true; - if (!this._part && this._justMatched && data) { - while (this._dashes < 2 && start + i < end) { - if (data[start + i] === DASH) { - ++i; - ++this._dashes; - } else { - if (this._dashes) { - buf = B_ONEDASH; + get destroyed() { + return this[kDestroyed]; + } + get closed() { + return this[kClosed]; + } + get interceptors() { + return this[kInterceptors]; + } + set interceptors(newInterceptors) { + if (newInterceptors) { + for (let i = newInterceptors.length - 1; i >= 0; i--) { + const interceptor = this[kInterceptors][i]; + if (typeof interceptor !== "function") { + throw new InvalidArgumentError("interceptor must be an function"); } - this._dashes = 0; - break; } } - if (this._dashes === 2) { - if (start + i < end && this.listenerCount("trailer") !== 0) { - this.emit("trailer", data.slice(start + i, end)); + this[kInterceptors] = newInterceptors; + } + close(callback) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + this.close((err, data) => { + return err ? reject(err) : resolve(data); + }); + }); + } + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + if (this[kDestroyed]) { + queueMicrotask(() => callback(new ClientDestroyedError(), null)); + return; + } + if (this[kClosed]) { + if (this[kOnClosed]) { + this[kOnClosed].push(callback); + } else { + queueMicrotask(() => callback(null, null)); } - this.reset(); - this._finished = true; - if (self2._parts === 0) { - self2._realFinish = true; - self2.emit("finish"); - self2._realFinish = false; + return; + } + this[kClosed] = true; + this[kOnClosed].push(callback); + const onClosed = () => { + const callbacks = this[kOnClosed]; + this[kOnClosed] = null; + for (let i = 0; i < callbacks.length; i++) { + callbacks[i](null, null); } + }; + this[kClose]().then(() => this.destroy()).then(() => { + queueMicrotask(onClosed); + }); + } + destroy(err, callback) { + if (typeof err === "function") { + callback = err; + err = null; } - if (this._dashes) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + this.destroy(err, (err2, data) => { + return err2 ? ( + /* istanbul ignore next: should never error */ + reject(err2) + ) : resolve(data); + }); + }); + } + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + if (this[kDestroyed]) { + if (this[kOnDestroyed]) { + this[kOnDestroyed].push(callback); + } else { + queueMicrotask(() => callback(null, null)); + } return; } - } - if (this._justMatched) { - this._justMatched = false; - } - if (!this._part) { - this._part = new PartStream(this._partOpts); - this._part._read = function(n) { - self2._unpause(); + if (!err) { + err = new ClientDestroyedError(); + } + this[kDestroyed] = true; + this[kOnDestroyed] = this[kOnDestroyed] || []; + this[kOnDestroyed].push(callback); + const onDestroyed = () => { + const callbacks = this[kOnDestroyed]; + this[kOnDestroyed] = null; + for (let i = 0; i < callbacks.length; i++) { + callbacks[i](null, null); + } }; - if (this._isPreamble && this.listenerCount("preamble") !== 0) { - this.emit("preamble", this._part); - } else if (this._isPreamble !== true && this.listenerCount("part") !== 0) { - this.emit("part", this._part); - } else { - this._ignore(); + this[kDestroy](err).then(() => { + queueMicrotask(onDestroyed); + }); + } + [kInterceptedDispatch](opts, handler2) { + if (!this[kInterceptors] || this[kInterceptors].length === 0) { + this[kInterceptedDispatch] = this[kDispatch]; + return this[kDispatch](opts, handler2); } - if (!this._isPreamble) { - this._inHeader = true; + let dispatch = this[kDispatch].bind(this); + for (let i = this[kInterceptors].length - 1; i >= 0; i--) { + dispatch = this[kInterceptors][i](dispatch); } + this[kInterceptedDispatch] = dispatch; + return dispatch(opts, handler2); } - if (data && start < end && !this._ignoreData) { - if (this._isPreamble || !this._inHeader) { - if (buf) { - shouldWriteMore = this._part.push(buf); + dispatch(opts, handler2) { + if (!handler2 || typeof handler2 !== "object") { + throw new InvalidArgumentError("handler must be an object"); + } + try { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("opts must be an object."); } - shouldWriteMore = this._part.push(data.slice(start, end)); - if (!shouldWriteMore) { - this._pause = true; + if (this[kDestroyed] || this[kOnDestroyed]) { + throw new ClientDestroyedError(); } - } else if (!this._isPreamble && this._inHeader) { - if (buf) { - this._hparser.push(buf); + if (this[kClosed]) { + throw new ClientClosedError(); } - r = this._hparser.push(data.slice(start, end)); - if (!this._inHeader && r !== void 0 && r < end) { - this._oninfo(false, data, start + r, end); + return this[kInterceptedDispatch](opts, handler2); + } catch (err) { + if (typeof handler2.onError !== "function") { + throw new InvalidArgumentError("invalid onError method"); } + handler2.onError(err); + return false; } } - if (isMatch) { - this._hparser.reset(); - if (this._isPreamble) { - this._isPreamble = false; - } else { - if (start !== end) { - ++this._parts; - this._part.on("end", function() { - if (--self2._parts === 0) { - if (self2._finished) { - self2._realFinish = true; - self2.emit("finish"); - self2._realFinish = false; - } else { - self2._unpause(); - } - } - }); + } + dispatcherBase$1 = DispatcherBase; + return dispatcherBase$1; +} +var timers$1; +var hasRequiredTimers$1; +function requireTimers$1() { + if (hasRequiredTimers$1) return timers$1; + hasRequiredTimers$1 = 1; + let fastNow = 0; + const RESOLUTION_MS = 1e3; + const TICK_MS = (RESOLUTION_MS >> 1) - 1; + let fastNowTimeout; + const kFastTimer = /* @__PURE__ */ Symbol("kFastTimer"); + const fastTimers = []; + const NOT_IN_LIST = -2; + const TO_BE_CLEARED = -1; + const PENDING = 0; + const ACTIVE = 1; + function onTick() { + fastNow += TICK_MS; + let idx = 0; + let len = fastTimers.length; + while (idx < len) { + const timer = fastTimers[idx]; + if (timer._state === PENDING) { + timer._idleStart = fastNow - TICK_MS; + timer._state = ACTIVE; + } else if (timer._state === ACTIVE && fastNow >= timer._idleStart + timer._idleTimeout) { + timer._state = TO_BE_CLEARED; + timer._idleStart = -1; + timer._onTimeout(timer._timerArg); + } + if (timer._state === TO_BE_CLEARED) { + timer._state = NOT_IN_LIST; + if (--len !== 0) { + fastTimers[idx] = fastTimers[len]; } + } else { + ++idx; } - this._part.push(null); - this._part = void 0; - this._ignoreData = false; - this._justMatched = true; - this._dashes = 0; - } - }; - Dicer.prototype._unpause = function() { - if (!this._pause) { - return; } - this._pause = false; - if (this._cb) { - const cb = this._cb; - this._cb = void 0; - cb(); + fastTimers.length = len; + if (fastTimers.length !== 0) { + refreshTimeout(); } - }; - Dicer_1 = Dicer; - return Dicer_1; -} -var decodeText_1; -var hasRequiredDecodeText; -function requireDecodeText() { - if (hasRequiredDecodeText) return decodeText_1; - hasRequiredDecodeText = 1; - const utf8Decoder = new TextDecoder("utf-8"); - const textDecoders = /* @__PURE__ */ new Map([ - ["utf-8", utf8Decoder], - ["utf8", utf8Decoder] - ]); - function getDecoder(charset) { - let lc; - while (true) { - switch (charset) { - case "utf-8": - case "utf8": - return decoders.utf8; - case "latin1": - case "ascii": - // TODO: Make these a separate, strict decoder? - case "us-ascii": - case "iso-8859-1": - case "iso8859-1": - case "iso88591": - case "iso_8859-1": - case "windows-1252": - case "iso_8859-1:1987": - case "cp1252": - case "x-cp1252": - return decoders.latin1; - case "utf16le": - case "utf-16le": - case "ucs2": - case "ucs-2": - return decoders.utf16le; - case "base64": - return decoders.base64; - default: - if (lc === void 0) { - lc = true; - charset = charset.toLowerCase(); - continue; - } - return decoders.other.bind(charset); + } + function refreshTimeout() { + if (fastNowTimeout) { + fastNowTimeout.refresh(); + } else { + clearTimeout(fastNowTimeout); + fastNowTimeout = setTimeout(onTick, TICK_MS); + if (fastNowTimeout.unref) { + fastNowTimeout.unref(); } } } - const decoders = { - utf8: (data, sourceEncoding) => { - if (data.length === 0) { - return ""; + class FastTimer { + [kFastTimer] = true; + /** + * The state of the timer, which can be one of the following: + * - NOT_IN_LIST (-2) + * - TO_BE_CLEARED (-1) + * - PENDING (0) + * - ACTIVE (1) + * + * @type {-2|-1|0|1} + * @private + */ + _state = NOT_IN_LIST; + /** + * The number of milliseconds to wait before calling the callback. + * + * @type {number} + * @private + */ + _idleTimeout = -1; + /** + * The time in milliseconds when the timer was started. This value is used to + * calculate when the timer should expire. + * + * @type {number} + * @default -1 + * @private + */ + _idleStart = -1; + /** + * The function to be executed when the timer expires. + * @type {Function} + * @private + */ + _onTimeout; + /** + * The argument to be passed to the callback when the timer expires. + * + * @type {*} + * @private + */ + _timerArg; + /** + * @constructor + * @param {Function} callback A function to be executed after the timer + * expires. + * @param {number} delay The time, in milliseconds that the timer should wait + * before the specified function or code is executed. + * @param {*} arg + */ + constructor(callback, delay, arg) { + this._onTimeout = callback; + this._idleTimeout = delay; + this._timerArg = arg; + this.refresh(); + } + /** + * Sets the timer's start time to the current time, and reschedules the timer + * to call its callback at the previously specified duration adjusted to the + * current time. + * Using this on a timer that has already called its callback will reactivate + * the timer. + * + * @returns {void} + */ + refresh() { + if (this._state === NOT_IN_LIST) { + fastTimers.push(this); } - if (typeof data === "string") { - data = Buffer.from(data, sourceEncoding); + if (!fastNowTimeout || fastTimers.length === 1) { + refreshTimeout(); } - return data.utf8Slice(0, data.length); + this._state = PENDING; + } + /** + * The `clear` method cancels the timer, preventing it from executing. + * + * @returns {void} + * @private + */ + clear() { + this._state = TO_BE_CLEARED; + this._idleStart = -1; + } + } + timers$1 = { + /** + * The setTimeout() method sets a timer which executes a function once the + * timer expires. + * @param {Function} callback A function to be executed after the timer + * expires. + * @param {number} delay The time, in milliseconds that the timer should + * wait before the specified function or code is executed. + * @param {*} [arg] An optional argument to be passed to the callback function + * when the timer expires. + * @returns {NodeJS.Timeout|FastTimer} + */ + setTimeout(callback, delay, arg) { + return delay <= RESOLUTION_MS ? setTimeout(callback, delay, arg) : new FastTimer(callback, delay, arg); }, - latin1: (data, sourceEncoding) => { - if (data.length === 0) { - return ""; - } - if (typeof data === "string") { - return data; + /** + * The clearTimeout method cancels an instantiated Timer previously created + * by calling setTimeout. + * + * @param {NodeJS.Timeout|FastTimer} timeout + */ + clearTimeout(timeout) { + if (timeout[kFastTimer]) { + timeout.clear(); + } else { + clearTimeout(timeout); } - return data.latin1Slice(0, data.length); }, - utf16le: (data, sourceEncoding) => { - if (data.length === 0) { - return ""; - } - if (typeof data === "string") { - data = Buffer.from(data, sourceEncoding); - } - return data.ucs2Slice(0, data.length); + /** + * The setFastTimeout() method sets a fastTimer which executes a function once + * the timer expires. + * @param {Function} callback A function to be executed after the timer + * expires. + * @param {number} delay The time, in milliseconds that the timer should + * wait before the specified function or code is executed. + * @param {*} [arg] An optional argument to be passed to the callback function + * when the timer expires. + * @returns {FastTimer} + */ + setFastTimeout(callback, delay, arg) { + return new FastTimer(callback, delay, arg); }, - base64: (data, sourceEncoding) => { - if (data.length === 0) { - return ""; + /** + * The clearTimeout method cancels an instantiated FastTimer previously + * created by calling setFastTimeout. + * + * @param {FastTimer} timeout + */ + clearFastTimeout(timeout) { + timeout.clear(); + }, + /** + * The now method returns the value of the internal fast timer clock. + * + * @returns {number} + */ + now() { + return fastNow; + }, + /** + * Trigger the onTick function to process the fastTimers array. + * Exported for testing purposes only. + * Marking as deprecated to discourage any use outside of testing. + * @deprecated + * @param {number} [delay=0] The delay in milliseconds to add to the now value. + */ + tick(delay = 0) { + fastNow += delay - RESOLUTION_MS + 1; + onTick(); + onTick(); + }, + /** + * Reset FastTimers. + * Exported for testing purposes only. + * Marking as deprecated to discourage any use outside of testing. + * @deprecated + */ + reset() { + fastNow = 0; + fastTimers.length = 0; + clearTimeout(fastNowTimeout); + fastNowTimeout = null; + }, + /** + * Exporting for testing purposes only. + * Marking as deprecated to discourage any use outside of testing. + * @deprecated + */ + kFastTimer + }; + return timers$1; +} +var connect$1; +var hasRequiredConnect$1; +function requireConnect$1() { + if (hasRequiredConnect$1) return connect$1; + hasRequiredConnect$1 = 1; + const net = require$$0$7; + const assert = require$$0$5; + const util2 = requireUtil$e(); + const { InvalidArgumentError, ConnectTimeoutError } = requireErrors$1(); + const timers2 = requireTimers$1(); + function noop2() { + } + let tls; + let SessionCache; + if (commonjsGlobal.FinalizationRegistry && !(process.env.NODE_V8_COVERAGE || process.env.UNDICI_NO_FG)) { + SessionCache = class WeakSessionCache { + constructor(maxCachedSessions) { + this._maxCachedSessions = maxCachedSessions; + this._sessionCache = /* @__PURE__ */ new Map(); + this._sessionRegistry = new commonjsGlobal.FinalizationRegistry((key) => { + if (this._sessionCache.size < this._maxCachedSessions) { + return; + } + const ref = this._sessionCache.get(key); + if (ref !== void 0 && ref.deref() === void 0) { + this._sessionCache.delete(key); + } + }); } - if (typeof data === "string") { - data = Buffer.from(data, sourceEncoding); + get(sessionKey) { + const ref = this._sessionCache.get(sessionKey); + return ref ? ref.deref() : null; } - return data.base64Slice(0, data.length); - }, - other: (data, sourceEncoding) => { - if (data.length === 0) { - return ""; + set(sessionKey, session) { + if (this._maxCachedSessions === 0) { + return; + } + this._sessionCache.set(sessionKey, new WeakRef(session)); + this._sessionRegistry.register(session, sessionKey); } - if (typeof data === "string") { - data = Buffer.from(data, sourceEncoding); + }; + } else { + SessionCache = class SimpleSessionCache { + constructor(maxCachedSessions) { + this._maxCachedSessions = maxCachedSessions; + this._sessionCache = /* @__PURE__ */ new Map(); } - if (textDecoders.has(this.toString())) { - try { - return textDecoders.get(this).decode(data); - } catch { + get(sessionKey) { + return this._sessionCache.get(sessionKey); + } + set(sessionKey, session) { + if (this._maxCachedSessions === 0) { + return; + } + if (this._sessionCache.size >= this._maxCachedSessions) { + const { value: oldestKey } = this._sessionCache.keys().next(); + this._sessionCache.delete(oldestKey); } + this._sessionCache.set(sessionKey, session); } - return typeof data === "string" ? data : data.toString(); - } - }; - function decodeText(text, sourceEncoding, destEncoding) { - if (text) { - return getDecoder(destEncoding)(text, sourceEncoding); - } - return text; + }; } - decodeText_1 = decodeText; - return decodeText_1; + function buildConnector({ allowH2, maxCachedSessions, socketPath, timeout, session: customSession, ...opts }) { + if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) { + throw new InvalidArgumentError("maxCachedSessions must be a positive integer or zero"); + } + const options = { path: socketPath, ...opts }; + const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions); + timeout = timeout == null ? 1e4 : timeout; + allowH2 = allowH2 != null ? allowH2 : false; + return function connect2({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) { + let socket; + if (protocol === "https:") { + if (!tls) { + tls = require$$5; + } + servername = servername || options.servername || util2.getServerName(host) || null; + const sessionKey = servername || hostname; + assert(sessionKey); + const session = customSession || sessionCache.get(sessionKey) || null; + port = port || 443; + socket = tls.connect({ + highWaterMark: 16384, + // TLS in node can't have bigger HWM anyway... + ...options, + servername, + session, + localAddress, + // TODO(HTTP/2): Add support for h2c + ALPNProtocols: allowH2 ? ["http/1.1", "h2"] : ["http/1.1"], + socket: httpSocket, + // upgrade socket connection + port, + host: hostname + }); + socket.on("session", function(session2) { + sessionCache.set(sessionKey, session2); + }); + } else { + assert(!httpSocket, "httpSocket can only be sent on TLS update"); + port = port || 80; + socket = net.connect({ + highWaterMark: 64 * 1024, + // Same as nodejs fs streams. + ...options, + localAddress, + port, + host: hostname + }); + } + if (options.keepAlive == null || options.keepAlive) { + const keepAliveInitialDelay = options.keepAliveInitialDelay === void 0 ? 6e4 : options.keepAliveInitialDelay; + socket.setKeepAlive(true, keepAliveInitialDelay); + } + const clearConnectTimeout = setupConnectTimeout(new WeakRef(socket), { timeout, hostname, port }); + socket.setNoDelay(true).once(protocol === "https:" ? "secureConnect" : "connect", function() { + queueMicrotask(clearConnectTimeout); + if (callback) { + const cb = callback; + callback = null; + cb(null, this); + } + }).on("error", function(err) { + queueMicrotask(clearConnectTimeout); + if (callback) { + const cb = callback; + callback = null; + cb(err); + } + }); + return socket; + }; + } + const setupConnectTimeout = process.platform === "win32" ? (socketWeakRef, opts) => { + if (!opts.timeout) { + return noop2; + } + let s1 = null; + let s2 = null; + const fastTimer = timers2.setFastTimeout(() => { + s1 = setImmediate(() => { + s2 = setImmediate(() => onConnectTimeout(socketWeakRef.deref(), opts)); + }); + }, opts.timeout); + return () => { + timers2.clearFastTimeout(fastTimer); + clearImmediate(s1); + clearImmediate(s2); + }; + } : (socketWeakRef, opts) => { + if (!opts.timeout) { + return noop2; + } + let s1 = null; + const fastTimer = timers2.setFastTimeout(() => { + s1 = setImmediate(() => { + onConnectTimeout(socketWeakRef.deref(), opts); + }); + }, opts.timeout); + return () => { + timers2.clearFastTimeout(fastTimer); + clearImmediate(s1); + }; + }; + function onConnectTimeout(socket, opts) { + if (socket == null) { + return; + } + let message = "Connect Timeout Error"; + if (Array.isArray(socket.autoSelectFamilyAttemptedAddresses)) { + message += ` (attempted addresses: ${socket.autoSelectFamilyAttemptedAddresses.join(", ")},`; + } else { + message += ` (attempted address: ${opts.hostname}:${opts.port},`; + } + message += ` timeout: ${opts.timeout}ms)`; + util2.destroy(socket, new ConnectTimeoutError(message)); + } + connect$1 = buildConnector; + return connect$1; } -var parseParams_1; -var hasRequiredParseParams; -function requireParseParams() { - if (hasRequiredParseParams) return parseParams_1; - hasRequiredParseParams = 1; - const decodeText = requireDecodeText(); - const RE_ENCODED = /%[a-fA-F0-9][a-fA-F0-9]/g; - const EncodedLookup = { - "%00": "\0", - "%01": "", - "%02": "", - "%03": "", - "%04": "", - "%05": "", - "%06": "", - "%07": "\x07", - "%08": "\b", - "%09": " ", - "%0a": "\n", - "%0A": "\n", - "%0b": "\v", - "%0B": "\v", - "%0c": "\f", - "%0C": "\f", - "%0d": "\r", - "%0D": "\r", - "%0e": "", - "%0E": "", - "%0f": "", - "%0F": "", - "%10": "", - "%11": "", - "%12": "", - "%13": "", - "%14": "", - "%15": "", - "%16": "", - "%17": "", - "%18": "", - "%19": "", - "%1a": "", - "%1A": "", - "%1b": "\x1B", - "%1B": "\x1B", - "%1c": "", - "%1C": "", - "%1d": "", - "%1D": "", - "%1e": "", - "%1E": "", - "%1f": "", - "%1F": "", - "%20": " ", - "%21": "!", - "%22": '"', - "%23": "#", - "%24": "$", - "%25": "%", - "%26": "&", - "%27": "'", - "%28": "(", - "%29": ")", - "%2a": "*", - "%2A": "*", - "%2b": "+", - "%2B": "+", - "%2c": ",", - "%2C": ",", - "%2d": "-", - "%2D": "-", - "%2e": ".", - "%2E": ".", - "%2f": "/", - "%2F": "/", - "%30": "0", - "%31": "1", - "%32": "2", - "%33": "3", - "%34": "4", - "%35": "5", - "%36": "6", - "%37": "7", - "%38": "8", - "%39": "9", - "%3a": ":", - "%3A": ":", - "%3b": ";", - "%3B": ";", - "%3c": "<", - "%3C": "<", - "%3d": "=", - "%3D": "=", - "%3e": ">", - "%3E": ">", - "%3f": "?", - "%3F": "?", - "%40": "@", - "%41": "A", - "%42": "B", - "%43": "C", - "%44": "D", - "%45": "E", - "%46": "F", - "%47": "G", - "%48": "H", - "%49": "I", - "%4a": "J", - "%4A": "J", - "%4b": "K", - "%4B": "K", - "%4c": "L", - "%4C": "L", - "%4d": "M", - "%4D": "M", - "%4e": "N", - "%4E": "N", - "%4f": "O", - "%4F": "O", - "%50": "P", - "%51": "Q", - "%52": "R", - "%53": "S", - "%54": "T", - "%55": "U", - "%56": "V", - "%57": "W", - "%58": "X", - "%59": "Y", - "%5a": "Z", - "%5A": "Z", - "%5b": "[", - "%5B": "[", - "%5c": "\\", - "%5C": "\\", - "%5d": "]", - "%5D": "]", - "%5e": "^", - "%5E": "^", - "%5f": "_", - "%5F": "_", - "%60": "`", - "%61": "a", - "%62": "b", - "%63": "c", - "%64": "d", - "%65": "e", - "%66": "f", - "%67": "g", - "%68": "h", - "%69": "i", - "%6a": "j", - "%6A": "j", - "%6b": "k", - "%6B": "k", - "%6c": "l", - "%6C": "l", - "%6d": "m", - "%6D": "m", - "%6e": "n", - "%6E": "n", - "%6f": "o", - "%6F": "o", - "%70": "p", - "%71": "q", - "%72": "r", - "%73": "s", - "%74": "t", - "%75": "u", - "%76": "v", - "%77": "w", - "%78": "x", - "%79": "y", - "%7a": "z", - "%7A": "z", - "%7b": "{", - "%7B": "{", - "%7c": "|", - "%7C": "|", - "%7d": "}", - "%7D": "}", - "%7e": "~", - "%7E": "~", - "%7f": "", - "%7F": "", - "%80": "€", - "%81": "", - "%82": "‚", - "%83": "ƒ", - "%84": "„", - "%85": "…", - "%86": "†", - "%87": "‡", - "%88": "ˆ", - "%89": "‰", - "%8a": "Š", - "%8A": "Š", - "%8b": "‹", - "%8B": "‹", - "%8c": "Œ", - "%8C": "Œ", - "%8d": "", - "%8D": "", - "%8e": "Ž", - "%8E": "Ž", - "%8f": "", - "%8F": "", - "%90": "", - "%91": "‘", - "%92": "’", - "%93": "“", - "%94": "”", - "%95": "•", - "%96": "–", - "%97": "—", - "%98": "˜", - "%99": "™", - "%9a": "š", - "%9A": "š", - "%9b": "›", - "%9B": "›", - "%9c": "œ", - "%9C": "œ", - "%9d": "", - "%9D": "", - "%9e": "ž", - "%9E": "ž", - "%9f": "Ÿ", - "%9F": "Ÿ", - "%a0": " ", - "%A0": " ", - "%a1": "¡", - "%A1": "¡", - "%a2": "¢", - "%A2": "¢", - "%a3": "£", - "%A3": "£", - "%a4": "¤", - "%A4": "¤", - "%a5": "¥", - "%A5": "¥", - "%a6": "¦", - "%A6": "¦", - "%a7": "§", - "%A7": "§", - "%a8": "¨", - "%A8": "¨", - "%a9": "©", - "%A9": "©", - "%aa": "ª", - "%Aa": "ª", - "%aA": "ª", - "%AA": "ª", - "%ab": "«", - "%Ab": "«", - "%aB": "«", - "%AB": "«", - "%ac": "¬", - "%Ac": "¬", - "%aC": "¬", - "%AC": "¬", - "%ad": "­", - "%Ad": "­", - "%aD": "­", - "%AD": "­", - "%ae": "®", - "%Ae": "®", - "%aE": "®", - "%AE": "®", - "%af": "¯", - "%Af": "¯", - "%aF": "¯", - "%AF": "¯", - "%b0": "°", - "%B0": "°", - "%b1": "±", - "%B1": "±", - "%b2": "²", - "%B2": "²", - "%b3": "³", - "%B3": "³", - "%b4": "´", - "%B4": "´", - "%b5": "µ", - "%B5": "µ", - "%b6": "¶", - "%B6": "¶", - "%b7": "·", - "%B7": "·", - "%b8": "¸", - "%B8": "¸", - "%b9": "¹", - "%B9": "¹", - "%ba": "º", - "%Ba": "º", - "%bA": "º", - "%BA": "º", - "%bb": "»", - "%Bb": "»", - "%bB": "»", - "%BB": "»", - "%bc": "¼", - "%Bc": "¼", - "%bC": "¼", - "%BC": "¼", - "%bd": "½", - "%Bd": "½", - "%bD": "½", - "%BD": "½", - "%be": "¾", - "%Be": "¾", - "%bE": "¾", - "%BE": "¾", - "%bf": "¿", - "%Bf": "¿", - "%bF": "¿", - "%BF": "¿", - "%c0": "À", - "%C0": "À", - "%c1": "Á", - "%C1": "Á", - "%c2": "Â", - "%C2": "Â", - "%c3": "Ã", - "%C3": "Ã", - "%c4": "Ä", - "%C4": "Ä", - "%c5": "Å", - "%C5": "Å", - "%c6": "Æ", - "%C6": "Æ", - "%c7": "Ç", - "%C7": "Ç", - "%c8": "È", - "%C8": "È", - "%c9": "É", - "%C9": "É", - "%ca": "Ê", - "%Ca": "Ê", - "%cA": "Ê", - "%CA": "Ê", - "%cb": "Ë", - "%Cb": "Ë", - "%cB": "Ë", - "%CB": "Ë", - "%cc": "Ì", - "%Cc": "Ì", - "%cC": "Ì", - "%CC": "Ì", - "%cd": "Í", - "%Cd": "Í", - "%cD": "Í", - "%CD": "Í", - "%ce": "Î", - "%Ce": "Î", - "%cE": "Î", - "%CE": "Î", - "%cf": "Ï", - "%Cf": "Ï", - "%cF": "Ï", - "%CF": "Ï", - "%d0": "Ð", - "%D0": "Ð", - "%d1": "Ñ", - "%D1": "Ñ", - "%d2": "Ò", - "%D2": "Ò", - "%d3": "Ó", - "%D3": "Ó", - "%d4": "Ô", - "%D4": "Ô", - "%d5": "Õ", - "%D5": "Õ", - "%d6": "Ö", - "%D6": "Ö", - "%d7": "×", - "%D7": "×", - "%d8": "Ø", - "%D8": "Ø", - "%d9": "Ù", - "%D9": "Ù", - "%da": "Ú", - "%Da": "Ú", - "%dA": "Ú", - "%DA": "Ú", - "%db": "Û", - "%Db": "Û", - "%dB": "Û", - "%DB": "Û", - "%dc": "Ü", - "%Dc": "Ü", - "%dC": "Ü", - "%DC": "Ü", - "%dd": "Ý", - "%Dd": "Ý", - "%dD": "Ý", - "%DD": "Ý", - "%de": "Þ", - "%De": "Þ", - "%dE": "Þ", - "%DE": "Þ", - "%df": "ß", - "%Df": "ß", - "%dF": "ß", - "%DF": "ß", - "%e0": "à", - "%E0": "à", - "%e1": "á", - "%E1": "á", - "%e2": "â", - "%E2": "â", - "%e3": "ã", - "%E3": "ã", - "%e4": "ä", - "%E4": "ä", - "%e5": "å", - "%E5": "å", - "%e6": "æ", - "%E6": "æ", - "%e7": "ç", - "%E7": "ç", - "%e8": "è", - "%E8": "è", - "%e9": "é", - "%E9": "é", - "%ea": "ê", - "%Ea": "ê", - "%eA": "ê", - "%EA": "ê", - "%eb": "ë", - "%Eb": "ë", - "%eB": "ë", - "%EB": "ë", - "%ec": "ì", - "%Ec": "ì", - "%eC": "ì", - "%EC": "ì", - "%ed": "í", - "%Ed": "í", - "%eD": "í", - "%ED": "í", - "%ee": "î", - "%Ee": "î", - "%eE": "î", - "%EE": "î", - "%ef": "ï", - "%Ef": "ï", - "%eF": "ï", - "%EF": "ï", - "%f0": "ð", - "%F0": "ð", - "%f1": "ñ", - "%F1": "ñ", - "%f2": "ò", - "%F2": "ò", - "%f3": "ó", - "%F3": "ó", - "%f4": "ô", - "%F4": "ô", - "%f5": "õ", - "%F5": "õ", - "%f6": "ö", - "%F6": "ö", - "%f7": "÷", - "%F7": "÷", - "%f8": "ø", - "%F8": "ø", - "%f9": "ù", - "%F9": "ù", - "%fa": "ú", - "%Fa": "ú", - "%fA": "ú", - "%FA": "ú", - "%fb": "û", - "%Fb": "û", - "%fB": "û", - "%FB": "û", - "%fc": "ü", - "%Fc": "ü", - "%fC": "ü", - "%FC": "ü", - "%fd": "ý", - "%Fd": "ý", - "%fD": "ý", - "%FD": "ý", - "%fe": "þ", - "%Fe": "þ", - "%fE": "þ", - "%FE": "þ", - "%ff": "ÿ", - "%Ff": "ÿ", - "%fF": "ÿ", - "%FF": "ÿ" - }; - function encodedReplacer(match) { - return EncodedLookup[match]; - } - const STATE_KEY = 0; - const STATE_VALUE = 1; - const STATE_CHARSET = 2; - const STATE_LANG = 3; - function parseParams(str) { - const res = []; - let state = STATE_KEY; - let charset = ""; - let inquote = false; - let escaping = false; - let p = 0; - let tmp = ""; - const len = str.length; - for (var i = 0; i < len; ++i) { - const char = str[i]; - if (char === "\\" && inquote) { - if (escaping) { - escaping = false; - } else { - escaping = true; - continue; - } - } else if (char === '"') { - if (!escaping) { - if (inquote) { - inquote = false; - state = STATE_KEY; - } else { - inquote = true; - } - continue; - } else { - escaping = false; - } - } else { - if (escaping && inquote) { - tmp += "\\"; - } - escaping = false; - if ((state === STATE_CHARSET || state === STATE_LANG) && char === "'") { - if (state === STATE_CHARSET) { - state = STATE_LANG; - charset = tmp.substring(1); - } else { - state = STATE_VALUE; - } - tmp = ""; - continue; - } else if (state === STATE_KEY && (char === "*" || char === "=") && res.length) { - state = char === "*" ? STATE_CHARSET : STATE_VALUE; - res[p] = [tmp, void 0]; - tmp = ""; - continue; - } else if (!inquote && char === ";") { - state = STATE_KEY; - if (charset) { - if (tmp.length) { - tmp = decodeText( - tmp.replace(RE_ENCODED, encodedReplacer), - "binary", - charset - ); - } - charset = ""; - } else if (tmp.length) { - tmp = decodeText(tmp, "binary", "utf8"); - } - if (res[p] === void 0) { - res[p] = tmp; - } else { - res[p][1] = tmp; - } - tmp = ""; - ++p; - continue; - } else if (!inquote && (char === " " || char === " ")) { - continue; - } - } - tmp += char; - } - if (charset && tmp.length) { - tmp = decodeText( - tmp.replace(RE_ENCODED, encodedReplacer), - "binary", - charset - ); - } else if (tmp) { - tmp = decodeText(tmp, "binary", "utf8"); - } - if (res[p] === void 0) { - if (tmp) { - res[p] = tmp; - } - } else { - res[p][1] = tmp; - } - return res; - } - parseParams_1 = parseParams; - return parseParams_1; -} -var basename; -var hasRequiredBasename; -function requireBasename() { - if (hasRequiredBasename) return basename; - hasRequiredBasename = 1; - basename = function basename2(path) { - if (typeof path !== "string") { - return ""; - } - for (var i = path.length - 1; i >= 0; --i) { - switch (path.charCodeAt(i)) { - case 47: - // '/' - case 92: - path = path.slice(i + 1); - return path === ".." || path === "." ? "" : path; - } - } - return path === ".." || path === "." ? "" : path; - }; - return basename; -} -var multipart; -var hasRequiredMultipart; -function requireMultipart() { - if (hasRequiredMultipart) return multipart; - hasRequiredMultipart = 1; - const { Readable } = require$$0$7; - const { inherits } = require$$1$2; - const Dicer = requireDicer(); - const parseParams = requireParseParams(); - const decodeText = requireDecodeText(); - const basename2 = requireBasename(); - const getLimit2 = requireGetLimit(); - const RE_BOUNDARY = /^boundary$/i; - const RE_FIELD = /^form-data$/i; - const RE_CHARSET = /^charset$/i; - const RE_FILENAME = /^filename$/i; - const RE_NAME = /^name$/i; - Multipart.detect = /^multipart\/form-data/i; - function Multipart(boy, cfg) { - let i; - let len; - const self2 = this; - let boundary; - const limits = cfg.limits; - const isPartAFile = cfg.isPartAFile || ((fieldName, contentType, fileName) => contentType === "application/octet-stream" || fileName !== void 0); - const parsedConType = cfg.parsedConType || []; - const defCharset = cfg.defCharset || "utf8"; - const preservePath = cfg.preservePath; - const fileOpts = { highWaterMark: cfg.fileHwm }; - for (i = 0, len = parsedConType.length; i < len; ++i) { - if (Array.isArray(parsedConType[i]) && RE_BOUNDARY.test(parsedConType[i][0])) { - boundary = parsedConType[i][1]; - break; - } - } - function checkFinished() { - if (nends === 0 && finished && !boy._done) { - finished = false; - self2.end(); - } - } - if (typeof boundary !== "string") { - throw new Error("Multipart: Boundary not found"); - } - const fieldSizeLimit = getLimit2(limits, "fieldSize", 1 * 1024 * 1024); - const fileSizeLimit = getLimit2(limits, "fileSize", Infinity); - const filesLimit = getLimit2(limits, "files", Infinity); - const fieldsLimit = getLimit2(limits, "fields", Infinity); - const partsLimit = getLimit2(limits, "parts", Infinity); - const headerPairsLimit = getLimit2(limits, "headerPairs", 2e3); - const headerSizeLimit = getLimit2(limits, "headerSize", 80 * 1024); - let nfiles = 0; - let nfields = 0; - let nends = 0; - let curFile; - let curField; - let finished = false; - this._needDrain = false; - this._pause = false; - this._cb = void 0; - this._nparts = 0; - this._boy = boy; - const parserCfg = { - boundary, - maxHeaderPairs: headerPairsLimit, - maxHeaderSize: headerSizeLimit, - partHwm: fileOpts.highWaterMark, - highWaterMark: cfg.highWaterMark - }; - this.parser = new Dicer(parserCfg); - this.parser.on("drain", function() { - self2._needDrain = false; - if (self2._cb && !self2._pause) { - const cb = self2._cb; - self2._cb = void 0; - cb(); - } - }).on("part", function onPart(part) { - if (++self2._nparts > partsLimit) { - self2.parser.removeListener("part", onPart); - self2.parser.on("part", skipPart); - boy.hitPartsLimit = true; - boy.emit("partsLimit"); - return skipPart(part); - } - if (curField) { - const field = curField; - field.emit("end"); - field.removeAllListeners("end"); - } - part.on("header", function(header) { - let contype; - let fieldname; - let parsed; - let charset; - let encoding2; - let filename; - let nsize = 0; - if (header["content-type"]) { - parsed = parseParams(header["content-type"][0]); - if (parsed[0]) { - contype = parsed[0].toLowerCase(); - for (i = 0, len = parsed.length; i < len; ++i) { - if (RE_CHARSET.test(parsed[i][0])) { - charset = parsed[i][1].toLowerCase(); - break; - } - } - } - } - if (contype === void 0) { - contype = "text/plain"; - } - if (charset === void 0) { - charset = defCharset; - } - if (header["content-disposition"]) { - parsed = parseParams(header["content-disposition"][0]); - if (!RE_FIELD.test(parsed[0])) { - return skipPart(part); - } - for (i = 0, len = parsed.length; i < len; ++i) { - if (RE_NAME.test(parsed[i][0])) { - fieldname = parsed[i][1]; - } else if (RE_FILENAME.test(parsed[i][0])) { - filename = parsed[i][1]; - if (!preservePath) { - filename = basename2(filename); - } - } - } - } else { - return skipPart(part); - } - if (header["content-transfer-encoding"]) { - encoding2 = header["content-transfer-encoding"][0].toLowerCase(); - } else { - encoding2 = "7bit"; - } - let onData, onEnd; - if (isPartAFile(fieldname, contype, filename)) { - if (nfiles === filesLimit) { - if (!boy.hitFilesLimit) { - boy.hitFilesLimit = true; - boy.emit("filesLimit"); - } - return skipPart(part); - } - ++nfiles; - if (boy.listenerCount("file") === 0) { - self2.parser._ignore(); - return; - } - ++nends; - const file2 = new FileStream(fileOpts); - curFile = file2; - file2.on("end", function() { - --nends; - self2._pause = false; - checkFinished(); - if (self2._cb && !self2._needDrain) { - const cb = self2._cb; - self2._cb = void 0; - cb(); - } - }); - file2._read = function(n) { - if (!self2._pause) { - return; - } - self2._pause = false; - if (self2._cb && !self2._needDrain) { - const cb = self2._cb; - self2._cb = void 0; - cb(); - } - }; - boy.emit("file", fieldname, file2, filename, encoding2, contype); - onData = function(data) { - if ((nsize += data.length) > fileSizeLimit) { - const extralen = fileSizeLimit - nsize + data.length; - if (extralen > 0) { - file2.push(data.slice(0, extralen)); - } - file2.truncated = true; - file2.bytesRead = fileSizeLimit; - part.removeAllListeners("data"); - file2.emit("limit"); - return; - } else if (!file2.push(data)) { - self2._pause = true; - } - file2.bytesRead = nsize; - }; - onEnd = function() { - curFile = void 0; - file2.push(null); - }; - } else { - if (nfields === fieldsLimit) { - if (!boy.hitFieldsLimit) { - boy.hitFieldsLimit = true; - boy.emit("fieldsLimit"); - } - return skipPart(part); - } - ++nfields; - ++nends; - let buffer = ""; - let truncated = false; - curField = part; - onData = function(data) { - if ((nsize += data.length) > fieldSizeLimit) { - const extralen = fieldSizeLimit - (nsize - data.length); - buffer += data.toString("binary", 0, extralen); - truncated = true; - part.removeAllListeners("data"); - } else { - buffer += data.toString("binary"); - } - }; - onEnd = function() { - curField = void 0; - if (buffer.length) { - buffer = decodeText(buffer, "binary", charset); - } - boy.emit("field", fieldname, buffer, false, truncated, encoding2, contype); - --nends; - checkFinished(); - }; - } - part._readableState.sync = false; - part.on("data", onData); - part.on("end", onEnd); - }).on("error", function(err) { - if (curFile) { - curFile.emit("error", err); - } - }); - }).on("error", function(err) { - boy.emit("error", err); - }).on("finish", function() { - finished = true; - checkFinished(); - }); - } - Multipart.prototype.write = function(chunk, cb) { - const r = this.parser.write(chunk); - if (r && !this._pause) { - cb(); - } else { - this._needDrain = !r; - this._cb = cb; - } - }; - Multipart.prototype.end = function() { - const self2 = this; - if (self2.parser.writable) { - self2.parser.end(); - } else if (!self2._boy._done) { - process.nextTick(function() { - self2._boy._done = true; - self2._boy.emit("finish"); - }); - } - }; - function skipPart(part) { - part.resume(); - } - function FileStream(opts) { - Readable.call(this, opts); - this.bytesRead = 0; - this.truncated = false; - } - inherits(FileStream, Readable); - FileStream.prototype._read = function(n) { - }; - multipart = Multipart; - return multipart; -} -var Decoder_1; -var hasRequiredDecoder; -function requireDecoder() { - if (hasRequiredDecoder) return Decoder_1; - hasRequiredDecoder = 1; - const RE_PLUS = /\+/g; - const HEX = [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ]; - function Decoder() { - this.buffer = void 0; - } - Decoder.prototype.write = function(str) { - str = str.replace(RE_PLUS, " "); - let res = ""; - let i = 0; - let p = 0; - const len = str.length; - for (; i < len; ++i) { - if (this.buffer !== void 0) { - if (!HEX[str.charCodeAt(i)]) { - res += "%" + this.buffer; - this.buffer = void 0; - --i; - } else { - this.buffer += str[i]; - ++p; - if (this.buffer.length === 2) { - res += String.fromCharCode(parseInt(this.buffer, 16)); - this.buffer = void 0; - } - } - } else if (str[i] === "%") { - if (i > p) { - res += str.substring(p, i); - p = i; - } - this.buffer = ""; - ++p; - } - } - if (p < len && this.buffer === void 0) { - res += str.substring(p); - } - return res; - }; - Decoder.prototype.reset = function() { - this.buffer = void 0; - }; - Decoder_1 = Decoder; - return Decoder_1; -} -var urlencoded; -var hasRequiredUrlencoded; -function requireUrlencoded() { - if (hasRequiredUrlencoded) return urlencoded; - hasRequiredUrlencoded = 1; - const Decoder = requireDecoder(); - const decodeText = requireDecodeText(); - const getLimit2 = requireGetLimit(); - const RE_CHARSET = /^charset$/i; - UrlEncoded.detect = /^application\/x-www-form-urlencoded/i; - function UrlEncoded(boy, cfg) { - const limits = cfg.limits; - const parsedConType = cfg.parsedConType; - this.boy = boy; - this.fieldSizeLimit = getLimit2(limits, "fieldSize", 1 * 1024 * 1024); - this.fieldNameSizeLimit = getLimit2(limits, "fieldNameSize", 100); - this.fieldsLimit = getLimit2(limits, "fields", Infinity); - let charset; - for (var i = 0, len = parsedConType.length; i < len; ++i) { - if (Array.isArray(parsedConType[i]) && RE_CHARSET.test(parsedConType[i][0])) { - charset = parsedConType[i][1].toLowerCase(); - break; - } - } - if (charset === void 0) { - charset = cfg.defCharset || "utf8"; - } - this.decoder = new Decoder(); - this.charset = charset; - this._fields = 0; - this._state = "key"; - this._checkingBytes = true; - this._bytesKey = 0; - this._bytesVal = 0; - this._key = ""; - this._val = ""; - this._keyTrunc = false; - this._valTrunc = false; - this._hitLimit = false; - } - UrlEncoded.prototype.write = function(data, cb) { - if (this._fields === this.fieldsLimit) { - if (!this.boy.hitFieldsLimit) { - this.boy.hitFieldsLimit = true; - this.boy.emit("fieldsLimit"); - } - return cb(); - } - let idxeq; - let idxamp; - let i; - let p = 0; - const len = data.length; - while (p < len) { - if (this._state === "key") { - idxeq = idxamp = void 0; - for (i = p; i < len; ++i) { - if (!this._checkingBytes) { - ++p; - } - if (data[i] === 61) { - idxeq = i; - break; - } else if (data[i] === 38) { - idxamp = i; - break; - } - if (this._checkingBytes && this._bytesKey === this.fieldNameSizeLimit) { - this._hitLimit = true; - break; - } else if (this._checkingBytes) { - ++this._bytesKey; - } - } - if (idxeq !== void 0) { - if (idxeq > p) { - this._key += this.decoder.write(data.toString("binary", p, idxeq)); - } - this._state = "val"; - this._hitLimit = false; - this._checkingBytes = true; - this._val = ""; - this._bytesVal = 0; - this._valTrunc = false; - this.decoder.reset(); - p = idxeq + 1; - } else if (idxamp !== void 0) { - ++this._fields; - let key; - const keyTrunc = this._keyTrunc; - if (idxamp > p) { - key = this._key += this.decoder.write(data.toString("binary", p, idxamp)); - } else { - key = this._key; - } - this._hitLimit = false; - this._checkingBytes = true; - this._key = ""; - this._bytesKey = 0; - this._keyTrunc = false; - this.decoder.reset(); - if (key.length) { - this.boy.emit( - "field", - decodeText(key, "binary", this.charset), - "", - keyTrunc, - false - ); - } - p = idxamp + 1; - if (this._fields === this.fieldsLimit) { - return cb(); - } - } else if (this._hitLimit) { - if (i > p) { - this._key += this.decoder.write(data.toString("binary", p, i)); - } - p = i; - if ((this._bytesKey = this._key.length) === this.fieldNameSizeLimit) { - this._checkingBytes = false; - this._keyTrunc = true; - } - } else { - if (p < len) { - this._key += this.decoder.write(data.toString("binary", p)); - } - p = len; - } - } else { - idxamp = void 0; - for (i = p; i < len; ++i) { - if (!this._checkingBytes) { - ++p; - } - if (data[i] === 38) { - idxamp = i; - break; - } - if (this._checkingBytes && this._bytesVal === this.fieldSizeLimit) { - this._hitLimit = true; - break; - } else if (this._checkingBytes) { - ++this._bytesVal; - } - } - if (idxamp !== void 0) { - ++this._fields; - if (idxamp > p) { - this._val += this.decoder.write(data.toString("binary", p, idxamp)); - } - this.boy.emit( - "field", - decodeText(this._key, "binary", this.charset), - decodeText(this._val, "binary", this.charset), - this._keyTrunc, - this._valTrunc - ); - this._state = "key"; - this._hitLimit = false; - this._checkingBytes = true; - this._key = ""; - this._bytesKey = 0; - this._keyTrunc = false; - this.decoder.reset(); - p = idxamp + 1; - if (this._fields === this.fieldsLimit) { - return cb(); - } - } else if (this._hitLimit) { - if (i > p) { - this._val += this.decoder.write(data.toString("binary", p, i)); - } - p = i; - if (this._val === "" && this.fieldSizeLimit === 0 || (this._bytesVal = this._val.length) === this.fieldSizeLimit) { - this._checkingBytes = false; - this._valTrunc = true; - } - } else { - if (p < len) { - this._val += this.decoder.write(data.toString("binary", p)); - } - p = len; - } - } - } - cb(); - }; - UrlEncoded.prototype.end = function() { - if (this.boy._done) { - return; - } - if (this._state === "key" && this._key.length > 0) { - this.boy.emit( - "field", - decodeText(this._key, "binary", this.charset), - "", - this._keyTrunc, - false - ); - } else if (this._state === "val") { - this.boy.emit( - "field", - decodeText(this._key, "binary", this.charset), - decodeText(this._val, "binary", this.charset), - this._keyTrunc, - this._valTrunc - ); - } - this.boy._done = true; - this.boy.emit("finish"); - }; - urlencoded = UrlEncoded; - return urlencoded; -} -var hasRequiredMain; -function requireMain() { - if (hasRequiredMain) return main.exports; - hasRequiredMain = 1; - const WritableStream = require$$0$7.Writable; - const { inherits } = require$$1$2; - const Dicer = requireDicer(); - const MultipartParser = requireMultipart(); - const UrlencodedParser = requireUrlencoded(); - const parseParams = requireParseParams(); - function Busboy(opts) { - if (!(this instanceof Busboy)) { - return new Busboy(opts); - } - if (typeof opts !== "object") { - throw new TypeError("Busboy expected an options-Object."); - } - if (typeof opts.headers !== "object") { - throw new TypeError("Busboy expected an options-Object with headers-attribute."); - } - if (typeof opts.headers["content-type"] !== "string") { - throw new TypeError("Missing Content-Type-header."); - } - const { - headers: headers2, - ...streamOptions - } = opts; - this.opts = { - autoDestroy: false, - ...streamOptions - }; - WritableStream.call(this, this.opts); - this._done = false; - this._parser = this.getParserByHeaders(headers2); - this._finished = false; - } - inherits(Busboy, WritableStream); - Busboy.prototype.emit = function(ev) { - if (ev === "finish") { - if (!this._done) { - this._parser?.end(); - return; - } else if (this._finished) { - return; - } - this._finished = true; - } - WritableStream.prototype.emit.apply(this, arguments); - }; - Busboy.prototype.getParserByHeaders = function(headers2) { - const parsed = parseParams(headers2["content-type"]); - const cfg = { - defCharset: this.opts.defCharset, - fileHwm: this.opts.fileHwm, - headers: headers2, - highWaterMark: this.opts.highWaterMark, - isPartAFile: this.opts.isPartAFile, - limits: this.opts.limits, - parsedConType: parsed, - preservePath: this.opts.preservePath - }; - if (MultipartParser.detect.test(parsed[0])) { - return new MultipartParser(this, cfg); - } - if (UrlencodedParser.detect.test(parsed[0])) { - return new UrlencodedParser(this, cfg); - } - throw new Error("Unsupported Content-Type."); - }; - Busboy.prototype._write = function(chunk, encoding2, cb) { - this._parser.write(chunk, cb); - }; - main.exports = Busboy; - main.exports.default = Busboy; - main.exports.Busboy = Busboy; - main.exports.Dicer = Dicer; - return main.exports; -} -var constants$3; -var hasRequiredConstants$3; -function requireConstants$3() { - if (hasRequiredConstants$3) return constants$3; - hasRequiredConstants$3 = 1; - const { MessageChannel, receiveMessageOnPort } = require$$0$8; - const corsSafeListedMethods = ["GET", "HEAD", "POST"]; - const corsSafeListedMethodsSet = new Set(corsSafeListedMethods); - const nullBodyStatus = [101, 204, 205, 304]; - const redirectStatus = [301, 302, 303, 307, 308]; - const redirectStatusSet = new Set(redirectStatus); - const badPorts = [ - "1", - "7", - "9", - "11", - "13", - "15", - "17", - "19", - "20", - "21", - "22", - "23", - "25", - "37", - "42", - "43", - "53", - "69", - "77", - "79", - "87", - "95", - "101", - "102", - "103", - "104", - "109", - "110", - "111", - "113", - "115", - "117", - "119", - "123", - "135", - "137", - "139", - "143", - "161", - "179", - "389", - "427", - "465", - "512", - "513", - "514", - "515", - "526", - "530", - "531", - "532", - "540", - "548", - "554", - "556", - "563", - "587", - "601", - "636", - "989", - "990", - "993", - "995", - "1719", - "1720", - "1723", - "2049", - "3659", - "4045", - "5060", - "5061", - "6000", - "6566", - "6665", - "6666", - "6667", - "6668", - "6669", - "6697", - "10080" - ]; - const badPortsSet = new Set(badPorts); - const referrerPolicy = [ - "", - "no-referrer", - "no-referrer-when-downgrade", - "same-origin", - "origin", - "strict-origin", - "origin-when-cross-origin", - "strict-origin-when-cross-origin", - "unsafe-url" - ]; - const referrerPolicySet = new Set(referrerPolicy); - const requestRedirect = ["follow", "manual", "error"]; - const safeMethods = ["GET", "HEAD", "OPTIONS", "TRACE"]; - const safeMethodsSet = new Set(safeMethods); - const requestMode = ["navigate", "same-origin", "no-cors", "cors"]; - const requestCredentials = ["omit", "same-origin", "include"]; - const requestCache = [ - "default", - "no-store", - "reload", - "no-cache", - "force-cache", - "only-if-cached" - ]; - const requestBodyHeader = [ - "content-encoding", - "content-language", - "content-location", - "content-type", - // See https://github.com/nodejs/undici/issues/2021 - // 'Content-Length' is a forbidden header name, which is typically - // removed in the Headers implementation. However, undici doesn't - // filter out headers, so we add it here. - "content-length" - ]; - const requestDuplex = [ - "half" - ]; - const forbiddenMethods = ["CONNECT", "TRACE", "TRACK"]; - const forbiddenMethodsSet = new Set(forbiddenMethods); - const subresource = [ - "audio", - "audioworklet", - "font", - "image", - "manifest", - "paintworklet", - "script", - "style", - "track", - "video", - "xslt", - "" - ]; - const subresourceSet = new Set(subresource); - const DOMException2 = globalThis.DOMException ?? (() => { - try { - atob("~"); - } catch (err) { - return Object.getPrototypeOf(err).constructor; - } - })(); - let channel; - const structuredClone = globalThis.structuredClone ?? // https://github.com/nodejs/node/blob/b27ae24dcc4251bad726d9d84baf678d1f707fed/lib/internal/structured_clone.js - // structuredClone was added in v17.0.0, but fetch supports v16.8 - function structuredClone2(value, options = void 0) { - if (arguments.length === 0) { - throw new TypeError("missing argument"); - } - if (!channel) { - channel = new MessageChannel(); - } - channel.port1.unref(); - channel.port2.unref(); - channel.port1.postMessage(value, options?.transfer); - return receiveMessageOnPort(channel.port2).message; - }; - constants$3 = { - DOMException: DOMException2, - structuredClone, - subresource, - forbiddenMethods, - requestBodyHeader, - referrerPolicy, - requestRedirect, - requestMode, - requestCredentials, - requestCache, - redirectStatus, - corsSafeListedMethods, - nullBodyStatus, - safeMethods, - badPorts, - requestDuplex, - subresourceSet, - badPortsSet, - redirectStatusSet, - corsSafeListedMethodsSet, - safeMethodsSet, - forbiddenMethodsSet, - referrerPolicySet - }; - return constants$3; -} -var global$2; -var hasRequiredGlobal$1; -function requireGlobal$1() { - if (hasRequiredGlobal$1) return global$2; - hasRequiredGlobal$1 = 1; - const globalOrigin = /* @__PURE__ */ Symbol.for("undici.globalOrigin.1"); - function getGlobalOrigin() { - return globalThis[globalOrigin]; - } - function setGlobalOrigin(newOrigin) { - if (newOrigin === void 0) { - Object.defineProperty(globalThis, globalOrigin, { - value: void 0, - writable: true, - enumerable: false, - configurable: false - }); - return; - } - const parsedURL = new URL(newOrigin); - if (parsedURL.protocol !== "http:" && parsedURL.protocol !== "https:") { - throw new TypeError(`Only http & https urls are allowed, received ${parsedURL.protocol}`); - } - Object.defineProperty(globalThis, globalOrigin, { - value: parsedURL, - writable: true, - enumerable: false, - configurable: false - }); - } - global$2 = { - getGlobalOrigin, - setGlobalOrigin - }; - return global$2; -} -var util$5; -var hasRequiredUtil$5; -function requireUtil$5() { - if (hasRequiredUtil$5) return util$5; - hasRequiredUtil$5 = 1; - const { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = requireConstants$3(); - const { getGlobalOrigin } = requireGlobal$1(); - const { performance: performance2 } = require$$2$2; - const { isBlobLike, toUSVString, ReadableStreamFrom } = requireUtil$6(); - const assert = require$$0$3; - const { isUint8Array } = require$$5; - let supportedHashes = []; - let crypto; - try { - crypto = require("crypto"); - const possibleRelevantHashes = ["sha256", "sha384", "sha512"]; - supportedHashes = crypto.getHashes().filter((hash) => possibleRelevantHashes.includes(hash)); - } catch { - } - function responseURL(response2) { - const urlList = response2.urlList; - const length = urlList.length; - return length === 0 ? null : urlList[length - 1].toString(); - } - function responseLocationURL(response2, requestFragment) { - if (!redirectStatusSet.has(response2.status)) { - return null; - } - let location = response2.headersList.get("location"); - if (location !== null && isValidHeaderValue(location)) { - location = new URL(location, responseURL(response2)); - } - if (location && !location.hash) { - location.hash = requestFragment; - } - return location; - } - function requestCurrentURL(request2) { - return request2.urlList[request2.urlList.length - 1]; - } - function requestBadPort(request2) { - const url = requestCurrentURL(request2); - if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) { - return "blocked"; - } - return "allowed"; - } - function isErrorLike(object) { - return object instanceof Error || (object?.constructor?.name === "Error" || object?.constructor?.name === "DOMException"); - } - function isValidReasonPhrase(statusText) { - for (let i = 0; i < statusText.length; ++i) { - const c = statusText.charCodeAt(i); - if (!(c === 9 || // HTAB - c >= 32 && c <= 126 || // SP / VCHAR - c >= 128 && c <= 255)) { - return false; - } - } - return true; - } - function isTokenCharCode(c) { - switch (c) { - case 34: - case 40: - case 41: - case 44: - case 47: - case 58: - case 59: - case 60: - case 61: - case 62: - case 63: - case 64: - case 91: - case 92: - case 93: - case 123: - case 125: - return false; - default: - return c >= 33 && c <= 126; - } - } - function isValidHTTPToken(characters) { - if (characters.length === 0) { - return false; - } - for (let i = 0; i < characters.length; ++i) { - if (!isTokenCharCode(characters.charCodeAt(i))) { - return false; - } - } - return true; - } - function isValidHeaderName(potentialValue) { - return isValidHTTPToken(potentialValue); - } - function isValidHeaderValue(potentialValue) { - if (potentialValue.startsWith(" ") || potentialValue.startsWith(" ") || potentialValue.endsWith(" ") || potentialValue.endsWith(" ")) { - return false; - } - if (potentialValue.includes("\0") || potentialValue.includes("\r") || potentialValue.includes("\n")) { - return false; - } - return true; - } - function setRequestReferrerPolicyOnRedirect(request2, actualResponse) { - const { headersList } = actualResponse; - const policyHeader = (headersList.get("referrer-policy") ?? "").split(","); - let policy = ""; - if (policyHeader.length > 0) { - for (let i = policyHeader.length; i !== 0; i--) { - const token = policyHeader[i - 1].trim(); - if (referrerPolicyTokens.has(token)) { - policy = token; - break; - } - } - } - if (policy !== "") { - request2.referrerPolicy = policy; - } - } - function crossOriginResourcePolicyCheck() { - return "allowed"; - } - function corsCheck() { - return "success"; - } - function TAOCheck() { - return "success"; - } - function appendFetchMetadata(httpRequest) { - let header = null; - header = httpRequest.mode; - httpRequest.headersList.set("sec-fetch-mode", header); - } - function appendRequestOriginHeader(request2) { - let serializedOrigin = request2.origin; - if (request2.responseTainting === "cors" || request2.mode === "websocket") { - if (serializedOrigin) { - request2.headersList.append("origin", serializedOrigin); - } - } else if (request2.method !== "GET" && request2.method !== "HEAD") { - switch (request2.referrerPolicy) { - case "no-referrer": - serializedOrigin = null; - break; - case "no-referrer-when-downgrade": - case "strict-origin": - case "strict-origin-when-cross-origin": - if (request2.origin && urlHasHttpsScheme(request2.origin) && !urlHasHttpsScheme(requestCurrentURL(request2))) { - serializedOrigin = null; - } - break; - case "same-origin": - if (!sameOrigin(request2, requestCurrentURL(request2))) { - serializedOrigin = null; - } - break; - } - if (serializedOrigin) { - request2.headersList.append("origin", serializedOrigin); - } - } - } - function coarsenedSharedCurrentTime(crossOriginIsolatedCapability) { - return performance2.now(); - } - function createOpaqueTimingInfo(timingInfo) { - return { - startTime: timingInfo.startTime ?? 0, - redirectStartTime: 0, - redirectEndTime: 0, - postRedirectStartTime: timingInfo.startTime ?? 0, - finalServiceWorkerStartTime: 0, - finalNetworkResponseStartTime: 0, - finalNetworkRequestStartTime: 0, - endTime: 0, - encodedBodySize: 0, - decodedBodySize: 0, - finalConnectionTimingInfo: null - }; - } - function makePolicyContainer() { - return { - referrerPolicy: "strict-origin-when-cross-origin" - }; - } - function clonePolicyContainer(policyContainer) { - return { - referrerPolicy: policyContainer.referrerPolicy - }; - } - function determineRequestsReferrer(request2) { - const policy = request2.referrerPolicy; - assert(policy); - let referrerSource = null; - if (request2.referrer === "client") { - const globalOrigin = getGlobalOrigin(); - if (!globalOrigin || globalOrigin.origin === "null") { - return "no-referrer"; - } - referrerSource = new URL(globalOrigin); - } else if (request2.referrer instanceof URL) { - referrerSource = request2.referrer; - } - let referrerURL = stripURLForReferrer(referrerSource); - const referrerOrigin = stripURLForReferrer(referrerSource, true); - if (referrerURL.toString().length > 4096) { - referrerURL = referrerOrigin; - } - const areSameOrigin = sameOrigin(request2, referrerURL); - const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(request2.url); - switch (policy) { - case "origin": - return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true); - case "unsafe-url": - return referrerURL; - case "same-origin": - return areSameOrigin ? referrerOrigin : "no-referrer"; - case "origin-when-cross-origin": - return areSameOrigin ? referrerURL : referrerOrigin; - case "strict-origin-when-cross-origin": { - const currentURL = requestCurrentURL(request2); - if (sameOrigin(referrerURL, currentURL)) { - return referrerURL; - } - if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { - return "no-referrer"; - } - return referrerOrigin; - } - case "strict-origin": - // eslint-disable-line - /** - * 1. If referrerURL is a potentially trustworthy URL and - * request’s current URL is not a potentially trustworthy URL, - * then return no referrer. - * 2. Return referrerOrigin - */ - case "no-referrer-when-downgrade": - // eslint-disable-line - /** - * 1. If referrerURL is a potentially trustworthy URL and - * request’s current URL is not a potentially trustworthy URL, - * then return no referrer. - * 2. Return referrerOrigin - */ - default: - return isNonPotentiallyTrustWorthy ? "no-referrer" : referrerOrigin; - } - } - function stripURLForReferrer(url, originOnly) { - assert(url instanceof URL); - if (url.protocol === "file:" || url.protocol === "about:" || url.protocol === "blank:") { - return "no-referrer"; - } - url.username = ""; - url.password = ""; - url.hash = ""; - if (originOnly) { - url.pathname = ""; - url.search = ""; - } - return url; - } - function isURLPotentiallyTrustworthy(url) { - if (!(url instanceof URL)) { - return false; - } - if (url.href === "about:blank" || url.href === "about:srcdoc") { - return true; - } - if (url.protocol === "data:") return true; - if (url.protocol === "file:") return true; - return isOriginPotentiallyTrustworthy(url.origin); - function isOriginPotentiallyTrustworthy(origin) { - if (origin == null || origin === "null") return false; - const originAsURL = new URL(origin); - if (originAsURL.protocol === "https:" || originAsURL.protocol === "wss:") { - return true; - } - if (/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(originAsURL.hostname) || (originAsURL.hostname === "localhost" || originAsURL.hostname.includes("localhost.")) || originAsURL.hostname.endsWith(".localhost")) { - return true; - } - return false; - } - } - function bytesMatch(bytes, metadataList) { - if (crypto === void 0) { - return true; - } - const parsedMetadata = parseMetadata(metadataList); - if (parsedMetadata === "no metadata") { - return true; - } - if (parsedMetadata.length === 0) { - return true; - } - const strongest = getStrongestMetadata(parsedMetadata); - const metadata = filterMetadataListByAlgorithm(parsedMetadata, strongest); - for (const item of metadata) { - const algorithm = item.algo; - const expectedValue = item.hash; - let actualValue = crypto.createHash(algorithm).update(bytes).digest("base64"); - if (actualValue[actualValue.length - 1] === "=") { - if (actualValue[actualValue.length - 2] === "=") { - actualValue = actualValue.slice(0, -2); - } else { - actualValue = actualValue.slice(0, -1); - } - } - if (compareBase64Mixed(actualValue, expectedValue)) { - return true; - } - } - return false; - } - const parseHashWithOptions = /(?sha256|sha384|sha512)-((?[A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i; - function parseMetadata(metadata) { - const result = []; - let empty = true; - for (const token of metadata.split(" ")) { - empty = false; - const parsedToken = parseHashWithOptions.exec(token); - if (parsedToken === null || parsedToken.groups === void 0 || parsedToken.groups.algo === void 0) { - continue; - } - const algorithm = parsedToken.groups.algo.toLowerCase(); - if (supportedHashes.includes(algorithm)) { - result.push(parsedToken.groups); - } - } - if (empty === true) { - return "no metadata"; - } - return result; - } - function getStrongestMetadata(metadataList) { - let algorithm = metadataList[0].algo; - if (algorithm[3] === "5") { - return algorithm; - } - for (let i = 1; i < metadataList.length; ++i) { - const metadata = metadataList[i]; - if (metadata.algo[3] === "5") { - algorithm = "sha512"; - break; - } else if (algorithm[3] === "3") { - continue; - } else if (metadata.algo[3] === "3") { - algorithm = "sha384"; - } - } - return algorithm; - } - function filterMetadataListByAlgorithm(metadataList, algorithm) { - if (metadataList.length === 1) { - return metadataList; - } - let pos = 0; - for (let i = 0; i < metadataList.length; ++i) { - if (metadataList[i].algo === algorithm) { - metadataList[pos++] = metadataList[i]; - } - } - metadataList.length = pos; - return metadataList; - } - function compareBase64Mixed(actualValue, expectedValue) { - if (actualValue.length !== expectedValue.length) { - return false; - } - for (let i = 0; i < actualValue.length; ++i) { - if (actualValue[i] !== expectedValue[i]) { - if (actualValue[i] === "+" && expectedValue[i] === "-" || actualValue[i] === "/" && expectedValue[i] === "_") { - continue; - } - return false; - } - } - return true; - } - function tryUpgradeRequestToAPotentiallyTrustworthyURL(request2) { - } - function sameOrigin(A, B) { - if (A.origin === B.origin && A.origin === "null") { - return true; - } - if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) { - return true; - } - return false; - } - function createDeferredPromise() { - let res; - let rej; - const promise = new Promise((resolve, reject) => { - res = resolve; - rej = reject; - }); - return { promise, resolve: res, reject: rej }; - } - function isAborted(fetchParams) { - return fetchParams.controller.state === "aborted"; - } - function isCancelled(fetchParams) { - return fetchParams.controller.state === "aborted" || fetchParams.controller.state === "terminated"; - } - const normalizeMethodRecord = { - delete: "DELETE", - DELETE: "DELETE", - get: "GET", - GET: "GET", - head: "HEAD", - HEAD: "HEAD", - options: "OPTIONS", - OPTIONS: "OPTIONS", - post: "POST", - POST: "POST", - put: "PUT", - PUT: "PUT" - }; - Object.setPrototypeOf(normalizeMethodRecord, null); - function normalizeMethod(method) { - return normalizeMethodRecord[method.toLowerCase()] ?? method; - } - function serializeJavascriptValueToJSONString(value) { - const result = JSON.stringify(value); - if (result === void 0) { - throw new TypeError("Value is not JSON serializable"); - } - assert(typeof result === "string"); - return result; - } - const esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); - function makeIterator(iterator2, name, kind) { - const object = { - index: 0, - kind, - target: iterator2 - }; - const i = { - next() { - if (Object.getPrototypeOf(this) !== i) { - throw new TypeError( - `'next' called on an object that does not implement interface ${name} Iterator.` - ); - } - const { index, kind: kind2, target } = object; - const values = target(); - const len = values.length; - if (index >= len) { - return { value: void 0, done: true }; - } - const pair = values[index]; - object.index = index + 1; - return iteratorResult(pair, kind2); - }, - // The class string of an iterator prototype object for a given interface is the - // result of concatenating the identifier of the interface and the string " Iterator". - [Symbol.toStringTag]: `${name} Iterator` - }; - Object.setPrototypeOf(i, esIteratorPrototype); - return Object.setPrototypeOf({}, i); - } - function iteratorResult(pair, kind) { - let result; - switch (kind) { - case "key": { - result = pair[0]; - break; - } - case "value": { - result = pair[1]; - break; - } - case "key+value": { - result = pair; - break; - } - } - return { value: result, done: false }; - } - async function fullyReadBody(body2, processBody, processBodyError) { - const successSteps = processBody; - const errorSteps = processBodyError; - let reader; - try { - reader = body2.stream.getReader(); - } catch (e) { - errorSteps(e); - return; - } - try { - const result = await readAllBytes(reader); - successSteps(result); - } catch (e) { - errorSteps(e); - } - } - let ReadableStream = globalThis.ReadableStream; - function isReadableStreamLike(stream) { - if (!ReadableStream) { - ReadableStream = require$$14.ReadableStream; - } - return stream instanceof ReadableStream || stream[Symbol.toStringTag] === "ReadableStream" && typeof stream.tee === "function"; - } - const MAXIMUM_ARGUMENT_LENGTH = 65535; - function isomorphicDecode(input) { - if (input.length < MAXIMUM_ARGUMENT_LENGTH) { - return String.fromCharCode(...input); - } - return input.reduce((previous, current) => previous + String.fromCharCode(current), ""); - } - function readableStreamClose(controller) { - try { - controller.close(); - } catch (err) { - if (!err.message.includes("Controller is already closed")) { - throw err; - } - } - } - function isomorphicEncode(input) { - for (let i = 0; i < input.length; i++) { - assert(input.charCodeAt(i) <= 255); - } - return input; - } - async function readAllBytes(reader) { - const bytes = []; - let byteLength = 0; - while (true) { - const { done, value: chunk } = await reader.read(); - if (done) { - return Buffer.concat(bytes, byteLength); - } - if (!isUint8Array(chunk)) { - throw new TypeError("Received non-Uint8Array chunk"); - } - bytes.push(chunk); - byteLength += chunk.length; - } - } - function urlIsLocal(url) { - assert("protocol" in url); - const protocol = url.protocol; - return protocol === "about:" || protocol === "blob:" || protocol === "data:"; - } - function urlHasHttpsScheme(url) { - if (typeof url === "string") { - return url.startsWith("https:"); - } - return url.protocol === "https:"; - } - function urlIsHttpHttpsScheme(url) { - assert("protocol" in url); - const protocol = url.protocol; - return protocol === "http:" || protocol === "https:"; - } - const hasOwn = Object.hasOwn || ((dict, key) => Object.prototype.hasOwnProperty.call(dict, key)); - util$5 = { - isAborted, - isCancelled, - createDeferredPromise, - ReadableStreamFrom, - toUSVString, - tryUpgradeRequestToAPotentiallyTrustworthyURL, - coarsenedSharedCurrentTime, - determineRequestsReferrer, - makePolicyContainer, - clonePolicyContainer, - appendFetchMetadata, - appendRequestOriginHeader, - TAOCheck, - corsCheck, - crossOriginResourcePolicyCheck, - createOpaqueTimingInfo, - setRequestReferrerPolicyOnRedirect, - isValidHTTPToken, - requestBadPort, - requestCurrentURL, - responseURL, - responseLocationURL, - isBlobLike, - isURLPotentiallyTrustworthy, - isValidReasonPhrase, - sameOrigin, - normalizeMethod, - serializeJavascriptValueToJSONString, - makeIterator, - isValidHeaderName, - isValidHeaderValue, - hasOwn, - isErrorLike, - fullyReadBody, - bytesMatch, - isReadableStreamLike, - readableStreamClose, - isomorphicEncode, - isomorphicDecode, - urlIsLocal, - urlHasHttpsScheme, - urlIsHttpHttpsScheme, - readAllBytes, - normalizeMethodRecord, - parseMetadata - }; - return util$5; -} -var symbols$3; -var hasRequiredSymbols$3; -function requireSymbols$3() { - if (hasRequiredSymbols$3) return symbols$3; - hasRequiredSymbols$3 = 1; - symbols$3 = { - kUrl: /* @__PURE__ */ Symbol("url"), - kHeaders: /* @__PURE__ */ Symbol("headers"), - kSignal: /* @__PURE__ */ Symbol("signal"), - kState: /* @__PURE__ */ Symbol("state"), - kGuard: /* @__PURE__ */ Symbol("guard"), - kRealm: /* @__PURE__ */ Symbol("realm") - }; - return symbols$3; -} -var webidl_1; -var hasRequiredWebidl; -function requireWebidl() { - if (hasRequiredWebidl) return webidl_1; - hasRequiredWebidl = 1; - const { types } = require$$0$2; - const { hasOwn, toUSVString } = requireUtil$5(); - const webidl = {}; - webidl.converters = {}; - webidl.util = {}; - webidl.errors = {}; - webidl.errors.exception = function(message) { - return new TypeError(`${message.header}: ${message.message}`); - }; - webidl.errors.conversionFailed = function(context2) { - const plural = context2.types.length === 1 ? "" : " one of"; - const message = `${context2.argument} could not be converted to${plural}: ${context2.types.join(", ")}.`; - return webidl.errors.exception({ - header: context2.prefix, - message - }); - }; - webidl.errors.invalidArgument = function(context2) { - return webidl.errors.exception({ - header: context2.prefix, - message: `"${context2.value}" is an invalid ${context2.type}.` - }); - }; - webidl.brandCheck = function(V, I, opts = void 0) { - if (opts?.strict !== false && !(V instanceof I)) { - throw new TypeError("Illegal invocation"); - } else { - return V?.[Symbol.toStringTag] === I.prototype[Symbol.toStringTag]; - } - }; - webidl.argumentLengthCheck = function({ length }, min, ctx) { - if (length < min) { - throw webidl.errors.exception({ - message: `${min} argument${min !== 1 ? "s" : ""} required, but${length ? " only" : ""} ${length} found.`, - ...ctx - }); - } - }; - webidl.illegalConstructor = function() { - throw webidl.errors.exception({ - header: "TypeError", - message: "Illegal constructor" - }); - }; - webidl.util.Type = function(V) { - switch (typeof V) { - case "undefined": - return "Undefined"; - case "boolean": - return "Boolean"; - case "string": - return "String"; - case "symbol": - return "Symbol"; - case "number": - return "Number"; - case "bigint": - return "BigInt"; - case "function": - case "object": { - if (V === null) { - return "Null"; - } - return "Object"; - } - } - }; - webidl.util.ConvertToInt = function(V, bitLength, signedness, opts = {}) { - let upperBound; - let lowerBound; - if (bitLength === 64) { - upperBound = Math.pow(2, 53) - 1; - if (signedness === "unsigned") { - lowerBound = 0; - } else { - lowerBound = Math.pow(-2, 53) + 1; - } - } else if (signedness === "unsigned") { - lowerBound = 0; - upperBound = Math.pow(2, bitLength) - 1; - } else { - lowerBound = Math.pow(-2, bitLength) - 1; - upperBound = Math.pow(2, bitLength - 1) - 1; - } - let x = Number(V); - if (x === 0) { - x = 0; - } - if (opts.enforceRange === true) { - if (Number.isNaN(x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { - throw webidl.errors.exception({ - header: "Integer conversion", - message: `Could not convert ${V} to an integer.` - }); - } - x = webidl.util.IntegerPart(x); - if (x < lowerBound || x > upperBound) { - throw webidl.errors.exception({ - header: "Integer conversion", - message: `Value must be between ${lowerBound}-${upperBound}, got ${x}.` - }); - } - return x; - } - if (!Number.isNaN(x) && opts.clamp === true) { - x = Math.min(Math.max(x, lowerBound), upperBound); - if (Math.floor(x) % 2 === 0) { - x = Math.floor(x); - } else { - x = Math.ceil(x); - } - return x; - } - if (Number.isNaN(x) || x === 0 && Object.is(0, x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { - return 0; - } - x = webidl.util.IntegerPart(x); - x = x % Math.pow(2, bitLength); - if (signedness === "signed" && x >= Math.pow(2, bitLength) - 1) { - return x - Math.pow(2, bitLength); - } - return x; - }; - webidl.util.IntegerPart = function(n) { - const r = Math.floor(Math.abs(n)); - if (n < 0) { - return -1 * r; - } - return r; - }; - webidl.sequenceConverter = function(converter) { - return (V) => { - if (webidl.util.Type(V) !== "Object") { - throw webidl.errors.exception({ - header: "Sequence", - message: `Value of type ${webidl.util.Type(V)} is not an Object.` - }); - } - const method = V?.[Symbol.iterator]?.(); - const seq = []; - if (method === void 0 || typeof method.next !== "function") { - throw webidl.errors.exception({ - header: "Sequence", - message: "Object is not an iterator." - }); - } - while (true) { - const { done, value } = method.next(); - if (done) { - break; - } - seq.push(converter(value)); - } - return seq; - }; - }; - webidl.recordConverter = function(keyConverter, valueConverter) { - return (O) => { - if (webidl.util.Type(O) !== "Object") { - throw webidl.errors.exception({ - header: "Record", - message: `Value of type ${webidl.util.Type(O)} is not an Object.` - }); - } - const result = {}; - if (!types.isProxy(O)) { - const keys2 = Object.keys(O); - for (const key of keys2) { - const typedKey = keyConverter(key); - const typedValue = valueConverter(O[key]); - result[typedKey] = typedValue; - } - return result; - } - const keys = Reflect.ownKeys(O); - for (const key of keys) { - const desc = Reflect.getOwnPropertyDescriptor(O, key); - if (desc?.enumerable) { - const typedKey = keyConverter(key); - const typedValue = valueConverter(O[key]); - result[typedKey] = typedValue; - } - } - return result; - }; - }; - webidl.interfaceConverter = function(i) { - return (V, opts = {}) => { - if (opts.strict !== false && !(V instanceof i)) { - throw webidl.errors.exception({ - header: i.name, - message: `Expected ${V} to be an instance of ${i.name}.` - }); - } - return V; - }; - }; - webidl.dictionaryConverter = function(converters) { - return (dictionary) => { - const type = webidl.util.Type(dictionary); - const dict = {}; - if (type === "Null" || type === "Undefined") { - return dict; - } else if (type !== "Object") { - throw webidl.errors.exception({ - header: "Dictionary", - message: `Expected ${dictionary} to be one of: Null, Undefined, Object.` - }); +var constants$8 = {}; +var utils$3 = {}; +var hasRequiredUtils$3; +function requireUtils$3() { + if (hasRequiredUtils$3) return utils$3; + hasRequiredUtils$3 = 1; + Object.defineProperty(utils$3, "__esModule", { value: true }); + utils$3.enumToMap = void 0; + function enumToMap(obj) { + const res = {}; + Object.keys(obj).forEach((key) => { + const value = obj[key]; + if (typeof value === "number") { + res[key] = value; } - for (const options of converters) { - const { key, defaultValue, required, converter } = options; - if (required === true) { - if (!hasOwn(dictionary, key)) { - throw webidl.errors.exception({ - header: "Dictionary", - message: `Missing required key "${key}".` - }); - } - } - let value = dictionary[key]; - const hasDefault = hasOwn(options, "defaultValue"); - if (hasDefault && value !== null) { - value = value ?? defaultValue; - } - if (required || hasDefault || value !== void 0) { - value = converter(value); - if (options.allowedValues && !options.allowedValues.includes(value)) { - throw webidl.errors.exception({ - header: "Dictionary", - message: `${value} is not an accepted type. Expected one of ${options.allowedValues.join(", ")}.` - }); - } - dict[key] = value; - } + }); + return res; + } + utils$3.enumToMap = enumToMap; + return utils$3; +} +var hasRequiredConstants$8; +function requireConstants$8() { + if (hasRequiredConstants$8) return constants$8; + hasRequiredConstants$8 = 1; + (function(exports$1) { + Object.defineProperty(exports$1, "__esModule", { value: true }); + exports$1.SPECIAL_HEADERS = exports$1.HEADER_STATE = exports$1.MINOR = exports$1.MAJOR = exports$1.CONNECTION_TOKEN_CHARS = exports$1.HEADER_CHARS = exports$1.TOKEN = exports$1.STRICT_TOKEN = exports$1.HEX = exports$1.URL_CHAR = exports$1.STRICT_URL_CHAR = exports$1.USERINFO_CHARS = exports$1.MARK = exports$1.ALPHANUM = exports$1.NUM = exports$1.HEX_MAP = exports$1.NUM_MAP = exports$1.ALPHA = exports$1.FINISH = exports$1.H_METHOD_MAP = exports$1.METHOD_MAP = exports$1.METHODS_RTSP = exports$1.METHODS_ICE = exports$1.METHODS_HTTP = exports$1.METHODS = exports$1.LENIENT_FLAGS = exports$1.FLAGS = exports$1.TYPE = exports$1.ERROR = void 0; + const utils_1 = requireUtils$3(); + (function(ERROR) { + ERROR[ERROR["OK"] = 0] = "OK"; + ERROR[ERROR["INTERNAL"] = 1] = "INTERNAL"; + ERROR[ERROR["STRICT"] = 2] = "STRICT"; + ERROR[ERROR["LF_EXPECTED"] = 3] = "LF_EXPECTED"; + ERROR[ERROR["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH"; + ERROR[ERROR["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION"; + ERROR[ERROR["INVALID_METHOD"] = 6] = "INVALID_METHOD"; + ERROR[ERROR["INVALID_URL"] = 7] = "INVALID_URL"; + ERROR[ERROR["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT"; + ERROR[ERROR["INVALID_VERSION"] = 9] = "INVALID_VERSION"; + ERROR[ERROR["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN"; + ERROR[ERROR["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH"; + ERROR[ERROR["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE"; + ERROR[ERROR["INVALID_STATUS"] = 13] = "INVALID_STATUS"; + ERROR[ERROR["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE"; + ERROR[ERROR["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING"; + ERROR[ERROR["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN"; + ERROR[ERROR["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE"; + ERROR[ERROR["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE"; + ERROR[ERROR["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER"; + ERROR[ERROR["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE"; + ERROR[ERROR["PAUSED"] = 21] = "PAUSED"; + ERROR[ERROR["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE"; + ERROR[ERROR["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE"; + ERROR[ERROR["USER"] = 24] = "USER"; + })(exports$1.ERROR || (exports$1.ERROR = {})); + (function(TYPE) { + TYPE[TYPE["BOTH"] = 0] = "BOTH"; + TYPE[TYPE["REQUEST"] = 1] = "REQUEST"; + TYPE[TYPE["RESPONSE"] = 2] = "RESPONSE"; + })(exports$1.TYPE || (exports$1.TYPE = {})); + (function(FLAGS) { + FLAGS[FLAGS["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE"; + FLAGS[FLAGS["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE"; + FLAGS[FLAGS["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE"; + FLAGS[FLAGS["CHUNKED"] = 8] = "CHUNKED"; + FLAGS[FLAGS["UPGRADE"] = 16] = "UPGRADE"; + FLAGS[FLAGS["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH"; + FLAGS[FLAGS["SKIPBODY"] = 64] = "SKIPBODY"; + FLAGS[FLAGS["TRAILING"] = 128] = "TRAILING"; + FLAGS[FLAGS["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING"; + })(exports$1.FLAGS || (exports$1.FLAGS = {})); + (function(LENIENT_FLAGS) { + LENIENT_FLAGS[LENIENT_FLAGS["HEADERS"] = 1] = "HEADERS"; + LENIENT_FLAGS[LENIENT_FLAGS["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH"; + LENIENT_FLAGS[LENIENT_FLAGS["KEEP_ALIVE"] = 4] = "KEEP_ALIVE"; + })(exports$1.LENIENT_FLAGS || (exports$1.LENIENT_FLAGS = {})); + var METHODS; + (function(METHODS2) { + METHODS2[METHODS2["DELETE"] = 0] = "DELETE"; + METHODS2[METHODS2["GET"] = 1] = "GET"; + METHODS2[METHODS2["HEAD"] = 2] = "HEAD"; + METHODS2[METHODS2["POST"] = 3] = "POST"; + METHODS2[METHODS2["PUT"] = 4] = "PUT"; + METHODS2[METHODS2["CONNECT"] = 5] = "CONNECT"; + METHODS2[METHODS2["OPTIONS"] = 6] = "OPTIONS"; + METHODS2[METHODS2["TRACE"] = 7] = "TRACE"; + METHODS2[METHODS2["COPY"] = 8] = "COPY"; + METHODS2[METHODS2["LOCK"] = 9] = "LOCK"; + METHODS2[METHODS2["MKCOL"] = 10] = "MKCOL"; + METHODS2[METHODS2["MOVE"] = 11] = "MOVE"; + METHODS2[METHODS2["PROPFIND"] = 12] = "PROPFIND"; + METHODS2[METHODS2["PROPPATCH"] = 13] = "PROPPATCH"; + METHODS2[METHODS2["SEARCH"] = 14] = "SEARCH"; + METHODS2[METHODS2["UNLOCK"] = 15] = "UNLOCK"; + METHODS2[METHODS2["BIND"] = 16] = "BIND"; + METHODS2[METHODS2["REBIND"] = 17] = "REBIND"; + METHODS2[METHODS2["UNBIND"] = 18] = "UNBIND"; + METHODS2[METHODS2["ACL"] = 19] = "ACL"; + METHODS2[METHODS2["REPORT"] = 20] = "REPORT"; + METHODS2[METHODS2["MKACTIVITY"] = 21] = "MKACTIVITY"; + METHODS2[METHODS2["CHECKOUT"] = 22] = "CHECKOUT"; + METHODS2[METHODS2["MERGE"] = 23] = "MERGE"; + METHODS2[METHODS2["M-SEARCH"] = 24] = "M-SEARCH"; + METHODS2[METHODS2["NOTIFY"] = 25] = "NOTIFY"; + METHODS2[METHODS2["SUBSCRIBE"] = 26] = "SUBSCRIBE"; + METHODS2[METHODS2["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE"; + METHODS2[METHODS2["PATCH"] = 28] = "PATCH"; + METHODS2[METHODS2["PURGE"] = 29] = "PURGE"; + METHODS2[METHODS2["MKCALENDAR"] = 30] = "MKCALENDAR"; + METHODS2[METHODS2["LINK"] = 31] = "LINK"; + METHODS2[METHODS2["UNLINK"] = 32] = "UNLINK"; + METHODS2[METHODS2["SOURCE"] = 33] = "SOURCE"; + METHODS2[METHODS2["PRI"] = 34] = "PRI"; + METHODS2[METHODS2["DESCRIBE"] = 35] = "DESCRIBE"; + METHODS2[METHODS2["ANNOUNCE"] = 36] = "ANNOUNCE"; + METHODS2[METHODS2["SETUP"] = 37] = "SETUP"; + METHODS2[METHODS2["PLAY"] = 38] = "PLAY"; + METHODS2[METHODS2["PAUSE"] = 39] = "PAUSE"; + METHODS2[METHODS2["TEARDOWN"] = 40] = "TEARDOWN"; + METHODS2[METHODS2["GET_PARAMETER"] = 41] = "GET_PARAMETER"; + METHODS2[METHODS2["SET_PARAMETER"] = 42] = "SET_PARAMETER"; + METHODS2[METHODS2["REDIRECT"] = 43] = "REDIRECT"; + METHODS2[METHODS2["RECORD"] = 44] = "RECORD"; + METHODS2[METHODS2["FLUSH"] = 45] = "FLUSH"; + })(METHODS = exports$1.METHODS || (exports$1.METHODS = {})); + exports$1.METHODS_HTTP = [ + METHODS.DELETE, + METHODS.GET, + METHODS.HEAD, + METHODS.POST, + METHODS.PUT, + METHODS.CONNECT, + METHODS.OPTIONS, + METHODS.TRACE, + METHODS.COPY, + METHODS.LOCK, + METHODS.MKCOL, + METHODS.MOVE, + METHODS.PROPFIND, + METHODS.PROPPATCH, + METHODS.SEARCH, + METHODS.UNLOCK, + METHODS.BIND, + METHODS.REBIND, + METHODS.UNBIND, + METHODS.ACL, + METHODS.REPORT, + METHODS.MKACTIVITY, + METHODS.CHECKOUT, + METHODS.MERGE, + METHODS["M-SEARCH"], + METHODS.NOTIFY, + METHODS.SUBSCRIBE, + METHODS.UNSUBSCRIBE, + METHODS.PATCH, + METHODS.PURGE, + METHODS.MKCALENDAR, + METHODS.LINK, + METHODS.UNLINK, + METHODS.PRI, + // TODO(indutny): should we allow it with HTTP? + METHODS.SOURCE + ]; + exports$1.METHODS_ICE = [ + METHODS.SOURCE + ]; + exports$1.METHODS_RTSP = [ + METHODS.OPTIONS, + METHODS.DESCRIBE, + METHODS.ANNOUNCE, + METHODS.SETUP, + METHODS.PLAY, + METHODS.PAUSE, + METHODS.TEARDOWN, + METHODS.GET_PARAMETER, + METHODS.SET_PARAMETER, + METHODS.REDIRECT, + METHODS.RECORD, + METHODS.FLUSH, + // For AirPlay + METHODS.GET, + METHODS.POST + ]; + exports$1.METHOD_MAP = utils_1.enumToMap(METHODS); + exports$1.H_METHOD_MAP = {}; + Object.keys(exports$1.METHOD_MAP).forEach((key) => { + if (/^H/.test(key)) { + exports$1.H_METHOD_MAP[key] = exports$1.METHOD_MAP[key]; } - return dict; + }); + (function(FINISH) { + FINISH[FINISH["SAFE"] = 0] = "SAFE"; + FINISH[FINISH["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB"; + FINISH[FINISH["UNSAFE"] = 2] = "UNSAFE"; + })(exports$1.FINISH || (exports$1.FINISH = {})); + exports$1.ALPHA = []; + for (let i = "A".charCodeAt(0); i <= "Z".charCodeAt(0); i++) { + exports$1.ALPHA.push(String.fromCharCode(i)); + exports$1.ALPHA.push(String.fromCharCode(i + 32)); + } + exports$1.NUM_MAP = { + 0: 0, + 1: 1, + 2: 2, + 3: 3, + 4: 4, + 5: 5, + 6: 6, + 7: 7, + 8: 8, + 9: 9 }; - }; - webidl.nullableConverter = function(converter) { - return (V) => { - if (V === null) { - return V; - } - return converter(V); + exports$1.HEX_MAP = { + 0: 0, + 1: 1, + 2: 2, + 3: 3, + 4: 4, + 5: 5, + 6: 6, + 7: 7, + 8: 8, + 9: 9, + A: 10, + B: 11, + C: 12, + D: 13, + E: 14, + F: 15, + a: 10, + b: 11, + c: 12, + d: 13, + e: 14, + f: 15 }; - }; - webidl.converters.DOMString = function(V, opts = {}) { - if (V === null && opts.legacyNullToEmptyString) { - return ""; - } - if (typeof V === "symbol") { - throw new TypeError("Could not convert argument of type symbol to string."); + exports$1.NUM = [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" + ]; + exports$1.ALPHANUM = exports$1.ALPHA.concat(exports$1.NUM); + exports$1.MARK = ["-", "_", ".", "!", "~", "*", "'", "(", ")"]; + exports$1.USERINFO_CHARS = exports$1.ALPHANUM.concat(exports$1.MARK).concat(["%", ";", ":", "&", "=", "+", "$", ","]); + exports$1.STRICT_URL_CHAR = [ + "!", + '"', + "$", + "%", + "&", + "'", + "(", + ")", + "*", + "+", + ",", + "-", + ".", + "/", + ":", + ";", + "<", + "=", + ">", + "@", + "[", + "\\", + "]", + "^", + "_", + "`", + "{", + "|", + "}", + "~" + ].concat(exports$1.ALPHANUM); + exports$1.URL_CHAR = exports$1.STRICT_URL_CHAR.concat([" ", "\f"]); + for (let i = 128; i <= 255; i++) { + exports$1.URL_CHAR.push(i); } - return String(V); - }; - webidl.converters.ByteString = function(V) { - const x = webidl.converters.DOMString(V); - for (let index = 0; index < x.length; index++) { - if (x.charCodeAt(index) > 255) { - throw new TypeError( - `Cannot convert argument to a ByteString because the character at index ${index} has a value of ${x.charCodeAt(index)} which is greater than 255.` - ); + exports$1.HEX = exports$1.NUM.concat(["a", "b", "c", "d", "e", "f", "A", "B", "C", "D", "E", "F"]); + exports$1.STRICT_TOKEN = [ + "!", + "#", + "$", + "%", + "&", + "'", + "*", + "+", + "-", + ".", + "^", + "_", + "`", + "|", + "~" + ].concat(exports$1.ALPHANUM); + exports$1.TOKEN = exports$1.STRICT_TOKEN.concat([" "]); + exports$1.HEADER_CHARS = [" "]; + for (let i = 32; i <= 255; i++) { + if (i !== 127) { + exports$1.HEADER_CHARS.push(i); } } - return x; - }; - webidl.converters.USVString = toUSVString; - webidl.converters.boolean = function(V) { - const x = Boolean(V); - return x; - }; - webidl.converters.any = function(V) { - return V; - }; - webidl.converters["long long"] = function(V) { - const x = webidl.util.ConvertToInt(V, 64, "signed"); - return x; - }; - webidl.converters["unsigned long long"] = function(V) { - const x = webidl.util.ConvertToInt(V, 64, "unsigned"); - return x; - }; - webidl.converters["unsigned long"] = function(V) { - const x = webidl.util.ConvertToInt(V, 32, "unsigned"); - return x; - }; - webidl.converters["unsigned short"] = function(V, opts) { - const x = webidl.util.ConvertToInt(V, 16, "unsigned", opts); - return x; - }; - webidl.converters.ArrayBuffer = function(V, opts = {}) { - if (webidl.util.Type(V) !== "Object" || !types.isAnyArrayBuffer(V)) { - throw webidl.errors.conversionFailed({ - prefix: `${V}`, - argument: `${V}`, - types: ["ArrayBuffer"] - }); - } - if (opts.allowShared === false && types.isSharedArrayBuffer(V)) { - throw webidl.errors.exception({ - header: "ArrayBuffer", - message: "SharedArrayBuffer is not allowed." - }); - } - return V; - }; - webidl.converters.TypedArray = function(V, T, opts = {}) { - if (webidl.util.Type(V) !== "Object" || !types.isTypedArray(V) || V.constructor.name !== T.name) { - throw webidl.errors.conversionFailed({ - prefix: `${T.name}`, - argument: `${V}`, - types: [T.name] - }); - } - if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { - throw webidl.errors.exception({ - header: "ArrayBuffer", - message: "SharedArrayBuffer is not allowed." - }); - } - return V; - }; - webidl.converters.DataView = function(V, opts = {}) { - if (webidl.util.Type(V) !== "Object" || !types.isDataView(V)) { - throw webidl.errors.exception({ - header: "DataView", - message: "Object is not a DataView." - }); - } - if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { - throw webidl.errors.exception({ - header: "ArrayBuffer", - message: "SharedArrayBuffer is not allowed." - }); - } - return V; + exports$1.CONNECTION_TOKEN_CHARS = exports$1.HEADER_CHARS.filter((c) => c !== 44); + exports$1.MAJOR = exports$1.NUM_MAP; + exports$1.MINOR = exports$1.MAJOR; + var HEADER_STATE; + (function(HEADER_STATE2) { + HEADER_STATE2[HEADER_STATE2["GENERAL"] = 0] = "GENERAL"; + HEADER_STATE2[HEADER_STATE2["CONNECTION"] = 1] = "CONNECTION"; + HEADER_STATE2[HEADER_STATE2["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH"; + HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING"; + HEADER_STATE2[HEADER_STATE2["UPGRADE"] = 4] = "UPGRADE"; + HEADER_STATE2[HEADER_STATE2["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE"; + HEADER_STATE2[HEADER_STATE2["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE"; + HEADER_STATE2[HEADER_STATE2["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE"; + HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING_CHUNKED"] = 8] = "TRANSFER_ENCODING_CHUNKED"; + })(HEADER_STATE = exports$1.HEADER_STATE || (exports$1.HEADER_STATE = {})); + exports$1.SPECIAL_HEADERS = { + "connection": HEADER_STATE.CONNECTION, + "content-length": HEADER_STATE.CONTENT_LENGTH, + "proxy-connection": HEADER_STATE.CONNECTION, + "transfer-encoding": HEADER_STATE.TRANSFER_ENCODING, + "upgrade": HEADER_STATE.UPGRADE + }; + })(constants$8); + return constants$8; +} +var llhttpWasm$1; +var hasRequiredLlhttpWasm$1; +function requireLlhttpWasm$1() { + if (hasRequiredLlhttpWasm$1) return llhttpWasm$1; + hasRequiredLlhttpWasm$1 = 1; + const { Buffer: Buffer2 } = require$$0$3; + llhttpWasm$1 = Buffer2.from("AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAy0sBQYAAAIAAAAAAAACAQIAAgICAAADAAAAAAMDAwMBAQEBAQEBAQEAAAIAAAAEBQFwARISBQMBAAIGCAF/AUGA1AQLB9EFIgZtZW1vcnkCAAtfaW5pdGlhbGl6ZQAIGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAtsbGh0dHBfaW5pdAAJGGxsaHR0cF9zaG91bGRfa2VlcF9hbGl2ZQAvDGxsaHR0cF9hbGxvYwALBm1hbGxvYwAxC2xsaHR0cF9mcmVlAAwEZnJlZQAMD2xsaHR0cF9nZXRfdHlwZQANFWxsaHR0cF9nZXRfaHR0cF9tYWpvcgAOFWxsaHR0cF9nZXRfaHR0cF9taW5vcgAPEWxsaHR0cF9nZXRfbWV0aG9kABAWbGxodHRwX2dldF9zdGF0dXNfY29kZQAREmxsaHR0cF9nZXRfdXBncmFkZQASDGxsaHR0cF9yZXNldAATDmxsaHR0cF9leGVjdXRlABQUbGxodHRwX3NldHRpbmdzX2luaXQAFQ1sbGh0dHBfZmluaXNoABYMbGxodHRwX3BhdXNlABcNbGxodHRwX3Jlc3VtZQAYG2xsaHR0cF9yZXN1bWVfYWZ0ZXJfdXBncmFkZQAZEGxsaHR0cF9nZXRfZXJybm8AGhdsbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbgAbF2xsaHR0cF9zZXRfZXJyb3JfcmVhc29uABwUbGxodHRwX2dldF9lcnJvcl9wb3MAHRFsbGh0dHBfZXJybm9fbmFtZQAeEmxsaHR0cF9tZXRob2RfbmFtZQAfEmxsaHR0cF9zdGF0dXNfbmFtZQAgGmxsaHR0cF9zZXRfbGVu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PgtBhwEMPQtBiAEMPAtBiQEMOwtBigEMOgtBiwEMOQtBjAEMOAtBjQEMNwtBjgEMNgtBjwEMNQtBkAEMNAtBkQEMMwtBkgEMMgtBkwEMMQtBlAEMMAtBlQEMLwtBlgEMLgtBlwEMLQtBmAEMLAtBmQEMKwtBmgEMKgtBmwEMKQtBnAEMKAtBnQEMJwtBngEMJgtBnwEMJQtBoAEMJAtBoQEMIwtBogEMIgtBowEMIQtBpAEMIAtBpQEMHwtBpgEMHgtBpwEMHQtBqAEMHAtBqQEMGwtBqgEMGgtBqwEMGQtBrAEMGAtBrQEMFwtBrgEMFgtBAQwVC0GvAQwUC0GwAQwTC0GxAQwSC0GzAQwRC0GyAQwQC0G0AQwPC0G1AQwOC0G2AQwNC0G3AQwMC0G4AQwLC0G5AQwKC0G6AQwJC0G7AQwIC0HGAQwHC0G8AQwGC0G9AQwFC0G+AQwEC0G/AQwDC0HAAQwCC0HCAQwBC0HBAQshAwNAAkACQAJAAkACQAJAAkACQAJAIAICfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAgJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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iQEhAwykAgtBASABLQAAQd8ARw1nGiABQQFqIQEMXgtBigEhAyABIARGDaICIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgNAIAEtAAAgAEGMzwBqLQAARw1kIABBAUYN+gEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMogILQYsBIQMgASAERg2hAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGOzwBqLQAARw1kIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyiAgsgAkEANgIAIAZBAWohAUECDGULQYwBIQMgASAERg2gAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHwzwBqLQAARw1jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyhAgsgAkEANgIAIAZBAWohAUEfDGQLQY0BIQMgASAERg2fAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHyzwBqLQAARw1iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAygAgsgAkEANgIAIAZBAWohAUEJDGMLIAEgBEYEQEGOASEDDJ8CCwJAAkAgAS0AAEHJAGsOBwBiYmJiYgFiCyABQQFqIQFB+AAhAwyGAgsgAUEBaiEBQfkAIQMMhQILQY8BIQMgASAERg2dAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGRzwBqLQAARw1gIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyeAgsgAkEANgIAIAZBAWohAUEYDGELQZABIQMgASAERg2cAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGXzwBqLQAARw1fIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAydAgsgAkEANgIAIAZBAWohAUEXDGALQZEBIQMgASAERg2bAiACKAIAIgAgBCABa2ohBSABIABrQQZqIQYCQANAIAEtAAAgAEGazwBqLQAARw1eIABBBkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAycAgsgAkEANgIAIAZBAWohAUEV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JSIARQ0RIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMtAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0gIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMswELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0iIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMsgELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0OIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMsQELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0dIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMsAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0fIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMrwELIABBP0cNASABQQFqCyEBQQUhAwyUAQtBACEDIAJBADYCHCACIAE2AhQgAkH9EjYCECACQQc2AgwMrAELIAJBADYCHCACIAE2AhQgAkHcCDYCECACQQc2AgxBACEDDKsBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNByACQeUANgIcIAIgATYCFCACIAA2AgxBACEDDKoBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNFiACQdMANgIcIAIgATYCFCACIAA2AgxBACEDDKkBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNGCACQdIANgIcIAIgATYCFCACIAA2AgxBACEDDKgBCyACQQA2AhwgAiABNgIUIAJBxgo2AhAgAkEHNgIMQQAhAwynAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQMgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwymAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRIgAkHTADYCHCACIAE2AhQgAiAANgIMQQAhAwylAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRQgAkHSADYCHCACIAE2AhQgAiAANgIMQQAhAwykAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQAgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwyjAQtB1QAhAwyJAQsgAEEVRwRAIAJBADYCHCACIAE2AhQgAkG5DTYCECACQRo2AgxB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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB5ABrDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0HhJw8LQaQhDwtByywPC0H+MQ8LQcAkDwtBqyQPC0GNKA8LQeImDwtBgDAPC0G5Lw8LQdckDwtB7x8PC0HhHw8LQfofDwtB8iAPC0GoLw8LQa4yDwtBiDAPC0HsJw8LQYIiDwtBjh0PC0HQLg8LQcojDwtBxTIPC0HfHA8LQdIcDwtBxCAPC0HXIA8LQaIfDwtB7S4PC0GrMA8LQdQlDwtBzC4PC0H6Lg8LQfwrDwtB0jAPC0HxHQ8LQbsgDwtB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CABB3AgLii1JbnZhbGlkIGNoYXIgaW4gdXJsIHF1ZXJ5AFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fYm9keQBDb250ZW50LUxlbmd0aCBvdmVyZmxvdwBDaHVuayBzaXplIG92ZXJmbG93AFJlc3BvbnNlIG92ZXJmbG93AEludmFsaWQgbWV0aG9kIGZvciBIVFRQL3gueCByZXF1ZXN0AEludmFsaWQgbWV0aG9kIGZvciBSVFNQL3gueCByZXF1ZXN0AEV4cGVjdGVkIFNPVVJDRSBtZXRob2QgZm9yIElDRS94LnggcmVxdWVzdABJbnZhbGlkIGNoYXIgaW4gdXJsIGZyYWdtZW50IHN0YXJ0AEV4cGVjdGVkIGRvdABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3N0YXR1cwBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zAFVzZXIgY2FsbGJhY2sgZXJyb3IAYG9uX3Jlc2V0YCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfaGVhZGVyYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9iZWdpbmAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3N0YXR1c19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3ZlcnNpb25fY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl91cmxfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXRob2RfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfZmllbGRfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fbmFtZWAgY2FsbGJhY2sgZXJyb3IAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzZXJ2ZXIASW52YWxpZCBoZWFkZXIgdmFsdWUgY2hhcgBJbnZhbGlkIGhlYWRlciBmaWVsZCBjaGFyAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdmVyc2lvbgBJbnZhbGlkIG1pbm9yIHZlcnNpb24ASW52YWxpZCBtYWpvciB2ZXJzaW9uAEV4cGVjdGVkIHNwYWNlIGFmdGVyIHZlcnNpb24ARXhwZWN0ZWQgQ1JMRiBhZnRlciB2ZXJzaW9uAEludmFsaWQgSFRUUCB2ZXJzaW9uAEludmFsaWQgaGVhZGVyIHRva2VuAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdXJsAEludmFsaWQgY2hhcmFjdGVycyBpbiB1cmwAVW5leHBlY3RlZCBzdGFydCBjaGFyIGluIHVybABEb3VibGUgQCBpbiB1cmwARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgARHVwbGljYXRlIENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhciBpbiB1cmwgcGF0aABDb250ZW50LUxlbmd0aCBjYW4ndCBiZSBwcmVzZW50IHdpdGggVHJhbnNmZXItRW5jb2RpbmcASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgc2l6ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2hlYWRlcl92YWx1ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlZCB2YWx1ZQBQYXVzZWQgYnkgb25faGVhZGVyc19jb21wbGV0ZQBJbnZhbGlkIEVPRiBzdGF0ZQBvbl9yZXNldCBwYXVzZQBvbl9jaHVua19oZWFkZXIgcGF1c2UAb25fbWVzc2FnZV9iZWdpbiBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fdmFsdWUgcGF1c2UAb25fc3RhdHVzX2NvbXBsZXRlIHBhdXNlAG9uX3ZlcnNpb25fY29tcGxldGUgcGF1c2UAb25fdXJsX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXNzYWdlX2NvbXBsZXRlIHBhdXNlAG9uX21ldGhvZF9jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfZmllbGRfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUgcGF1c2UAVW5leHBlY3RlZCBzcGFjZSBhZnRlciBzdGFydCBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAFBhdXNlIG9uIENPTk5FQ1QvVXBncmFkZQBQYXVzZSBvbiBQUkkvVXBncmFkZQBFeHBlY3RlZCBIVFRQLzIgQ29ubmVjdGlvbiBQcmVmYWNlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fbWV0aG9kAEV4cGVjdGVkIHNwYWNlIGFmdGVyIG1ldGhvZABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2hlYWRlcl9maWVsZABQYXVzZWQASW52YWxpZCB3b3JkIGVuY291bnRlcmVkAEludmFsaWQgbWV0aG9kIGVuY291bnRlcmVkAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2NoZW1hAFJlcXVlc3QgaGFzIGludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYABTV0lUQ0hfUFJPWFkAVVNFX1BST1hZAE1LQUNUSVZJVFkAVU5QUk9DRVNTQUJMRV9FTlRJVFkAQ09QWQBNT1ZFRF9QRVJNQU5FTlRMWQBUT09fRUFSTFkATk9USUZZAEZBSUxFRF9ERVBFTkRFTkNZAEJBRF9HQVRFV0FZAFBMQVkAUFVUAENIRUNLT1VUAEdBVEVXQVlfVElNRU9VVABSRVFVRVNUX1RJTUVPVVQATkVUV09SS19DT05ORUNUX1RJTUVPVVQAQ09OTkVDVElPTl9USU1FT1VUAExPR0lOX1RJTUVPVVQATkVUV09SS19SRUFEX1RJTUVPVVQAUE9TVABNSVNESVJFQ1RFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX0xPQURfQkFMQU5DRURfUkVRVUVTVABCQURfUkVRVUVTVABIVFRQX1JFUVVFU1RfU0VOVF9UT19IVFRQU19QT1JUAFJFUE9SVABJTV9BX1RFQVBPVABSRVNFVF9DT05URU5UAE5PX0NPTlRFTlQAUEFSVElBTF9DT05URU5UAEhQRV9JTlZBTElEX0NPTlNUQU5UAEhQRV9DQl9SRVNFVABHRVQASFBFX1NUUklDVABDT05GTElDVABURU1QT1JBUllfUkVESVJFQ1QAUEVSTUFORU5UX1JFRElSRUNUAENPTk5FQ1QATVVMVElfU1RBVFVTAEhQRV9JTlZBTElEX1NUQVRVUwBUT09fTUFOWV9SRVFVRVNUUwBFQVJMWV9ISU5UUwBVTkFWQUlMQUJMRV9GT1JfTEVHQUxfUkVBU09OUwBPUFRJT05TAFNXSVRDSElOR19QUk9UT0NPTFMAVkFSSUFOVF9BTFNPX05FR09USUFURVMATVVMVElQTEVfQ0hPSUNFUwBJTlRFUk5BTF9TRVJWRVJfRVJST1IAV0VCX1NFUlZFUl9VTktOT1dOX0VSUk9SAFJBSUxHVU5fRVJST1IASURFTlRJVFlfUFJPVklERVJfQVVUSEVOVElDQVRJT05fRVJST1IAU1NMX0NFUlRJRklDQVRFX0VSUk9SAElOVkFMSURfWF9GT1JXQVJERURfRk9SAFNFVF9QQVJBTUVURVIAR0VUX1BBUkFNRVRFUgBIUEVfVVNFUgBTRUVfT1RIRVIASFBFX0NCX0NIVU5LX0hFQURFUgBNS0NBTEVOREFSAFNFVFVQAFdFQl9TRVJWRVJfSVNfRE9XTgBURUFSRE9XTgBIUEVfQ0xPU0VEX0NPTk5FQ1RJT04ASEVVUklTVElDX0VYUElSQVRJT04ARElTQ09OTkVDVEVEX09QRVJBVElPTgBOT05fQVVUSE9SSVRBVElWRV9JTkZPUk1BVElPTgBIUEVfSU5WQUxJRF9WRVJTSU9OAEhQRV9DQl9NRVNTQUdFX0JFR0lOAFNJVEVfSVNfRlJPWkVOAEhQRV9JTlZBTElEX0hFQURFUl9UT0tFTgBJTlZBTElEX1RPS0VOAEZPUkJJRERFTgBFTkhBTkNFX1lPVVJfQ0FMTQBIUEVfSU5WQUxJRF9VUkwAQkxPQ0tFRF9CWV9QQVJFTlRBTF9DT05UUk9MAE1LQ09MAEFDTABIUEVfSU5URVJOQUwAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRV9VTk9GRklDSUFMAEhQRV9PSwBVTkxJTksAVU5MT0NLAFBSSQBSRVRSWV9XSVRIAEhQRV9JTlZBTElEX0NPTlRFTlRfTEVOR1RIAEhQRV9VTkVYUEVDVEVEX0NPTlRFTlRfTEVOR1RIAEZMVVNIAFBST1BQQVRDSABNLVNFQVJDSABVUklfVE9PX0xPTkcAUFJPQ0VTU0lORwBNSVNDRUxMQU5FT1VTX1BFUlNJU1RFTlRfV0FSTklORwBNSVNDRUxMQU5FT1VTX1dBUk5JTkcASFBFX0lOVkFMSURfVFJBTlNGRVJfRU5DT0RJTkcARXhwZWN0ZWQgQ1JMRgBIUEVfSU5WQUxJRF9DSFVOS19TSVpFAE1PVkUAQ09OVElOVUUASFBFX0NCX1NUQVRVU19DT01QTEVURQBIUEVfQ0JfSEVBREVSU19DT01QTEVURQBIUEVfQ0JfVkVSU0lPTl9DT01QTEVURQBIUEVfQ0JfVVJMX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8AAF4TAAAmEwAAMBAAAPAXAACdEwAAFRIAADkXAADwEgAAChAAAHUSAACtEgAAghMAAE8UAAB/EAAAoBUAACMUAACJEgAAixQAAE0VAADUEQAAzxQAABAYAADJFgAA3BYAAMERAADgFwAAuxQAAHQUAAB8FQAA5RQAAAgXAAAfEAAAZRUAAKMUAAAoFQAAAhUAAJkVAAAsEAAAixkAAE8PAADUDgAAahAAAM4QAAACFwAAiQ4AAG4TAAAcEwAAZhQAAFYXAADBEwAAzRMAAGwTAABoFwAAZhcAAF8XAAAiEwAAzg8AAGkOAADYDgAAYxYAAMsTAACqDgAAKBcAACYXAADFEwAAXRYAAOgRAABnEwAAZRMAAPIWAABzEwAAHRcAAPkWAADzEQAAzw4AAM4VAAAMEgAAsxEAAKURAABhEAAAMhcAALsTAEH5NQsBAQBBkDYL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB/TcLAQEAQZE4C14CAwICAgICAAACAgACAgACAgICAgICAgICAAQAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAEH9OQsBAQBBkToLXgIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAQfA7Cw1sb3NlZWVwLWFsaXZlAEGJPAsBAQBBoDwL4AEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBiT4LAQEAQaA+C+cBAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAEGwwAALXwEBAAEBAQEBAAABAQABAQABAQEBAQEBAQEBAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAEGQwgALIWVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgBBwMIACy1yYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AQfnCAAsFAQIAAQMAQZDDAAvgAQQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAEH5xAALBQECAAEDAEGQxQAL4AEEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+cYACwQBAAABAEGRxwAL3wEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAEH6yAALBAEAAAIAQZDJAAtfAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAQfrKAAsEAQAAAQBBkMsACwEBAEGqywALQQIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEH6zAALBAEAAAEAQZDNAAsBAQBBms0ACwYCAAAAAAIAQbHNAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBB8M4AC5YBTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRU9SRElSRUNUT1JUUkNIUEFSQU1FVEVSVVJDRUJTQ1JJQkVBUkRPV05BQ0VJTkROS0NLVUJTQ1JJQkVIVFRQL0FEVFAv", "base64"); + return llhttpWasm$1; +} +var llhttp_simdWasm$1; +var hasRequiredLlhttp_simdWasm$1; +function requireLlhttp_simdWasm$1() { + if (hasRequiredLlhttp_simdWasm$1) return llhttp_simdWasm$1; + hasRequiredLlhttp_simdWasm$1 = 1; + const { Buffer: Buffer2 } = require$$0$3; + llhttp_simdWasm$1 = Buffer2.from("AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAy0sBQYAAAIAAAAAAAACAQIAAgICAAADAAAAAAMDAwMBAQEBAQEBAQEAAAIAAAAEBQFwARISBQMBAAIGCAF/AUGA1AQLB9EFIgZtZW1vcnkCAAtfaW5pdGlhbGl6ZQAIGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAtsbGh0dHBfaW5pdAAJGGxsaHR0cF9zaG91bGRfa2VlcF9hbGl2ZQAvDGxsaHR0cF9hbGxvYwALBm1hbGxvYwAxC2xsaHR0cF9mcmVlAAwEZnJlZQAMD2xsaHR0cF9nZXRfdHlwZQANFWxsaHR0cF9nZXRfaHR0cF9tYWpvcgAOFWxsaHR0cF9nZXRfaHR0cF9taW5vcgAPEWxsaHR0cF9nZXRfbWV0aG9kABAWbGxodHRwX2dldF9zdGF0dXNfY29kZQAREmxsaHR0cF9nZXRfdXBncmFkZQASDGxsaHR0cF9yZXNldAATDmxsaHR0cF9leGVjdXRlABQUbGxodHRwX3NldHRpbmdzX2luaXQAFQ1sbGh0dHBfZmluaXNoABYMbGxodHRwX3BhdXNlABcNbGxodHRwX3Jlc3VtZQAYG2xsaHR0cF9yZXN1bWVfYWZ0ZXJfdXBncmFkZQAZEGxsaHR0cF9nZXRfZXJybm8AGhdsbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbgAbF2xsaHR0cF9zZXRfZXJyb3JfcmVhc29uABwUbGxodHRwX2dldF9lcnJvcl9wb3MAHRFsbGh0dHBfZXJybm9fbmFtZQAeEmxsaHR0cF9tZXRob2RfbmFtZQAfEmxsaHR0cF9zdGF0dXNfbmFtZQAgGmxsaHR0cF9zZXRfbGVu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PgtBhwEMPQtBiAEMPAtBiQEMOwtBigEMOgtBiwEMOQtBjAEMOAtBjQEMNwtBjgEMNgtBjwEMNQtBkAEMNAtBkQEMMwtBkgEMMgtBkwEMMQtBlAEMMAtBlQEMLwtBlgEMLgtBlwEMLQtBmAEMLAtBmQEMKwtBmgEMKgtBmwEMKQtBnAEMKAtBnQEMJwtBngEMJgtBnwEMJQtBoAEMJAtBoQEMIwtBogEMIgtBowEMIQtBpAEMIAtBpQEMHwtBpgEMHgtBpwEMHQtBqAEMHAtBqQEMGwtBqgEMGgtBqwEMGQtBrAEMGAtBrQEMFwtBrgEMFgtBAQwVC0GvAQwUC0GwAQwTC0GxAQwSC0GzAQwRC0GyAQwQC0G0AQwPC0G1AQwOC0G2AQwNC0G3AQwMC0G4AQwLC0G5AQwKC0G6AQwJC0G7AQwIC0HGAQwHC0G8AQwGC0G9AQwFC0G+AQwEC0G/AQwDC0HAAQwCC0HCAQwBC0HBAQshAwNAAkACQAJAAkACQAJAAkACQAJAIAICfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAgJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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iQEhAwykAgtBASABLQAAQd8ARw1nGiABQQFqIQEMXgtBigEhAyABIARGDaICIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgNAIAEtAAAgAEGMzwBqLQAARw1kIABBAUYN+gEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMogILQYsBIQMgASAERg2hAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGOzwBqLQAARw1kIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyiAgsgAkEANgIAIAZBAWohAUECDGULQYwBIQMgASAERg2gAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHwzwBqLQAARw1jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyhAgsgAkEANgIAIAZBAWohAUEfDGQLQY0BIQMgASAERg2fAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHyzwBqLQAARw1iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAygAgsgAkEANgIAIAZBAWohAUEJDGMLIAEgBEYEQEGOASEDDJ8CCwJAAkAgAS0AAEHJAGsOBwBiYmJiYgFiCyABQQFqIQFB+AAhAwyGAgsgAUEBaiEBQfkAIQMMhQILQY8BIQMgASAERg2dAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGRzwBqLQAARw1gIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyeAgsgAkEANgIAIAZBAWohAUEYDGELQZABIQMgASAERg2cAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGXzwBqLQAARw1fIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAydAgsgAkEANgIAIAZBAWohAUEXDGALQZEBIQMgASAERg2bAiACKAIAIgAgBCABa2ohBSABIABrQQZqIQYCQANAIAEtAAAgAEGazwBqLQAARw1eIABBBkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAycAgsgAkEANgIAIAZBAWohAUEV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JSIARQ0RIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMtAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0gIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMswELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0iIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMsgELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0OIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMsQELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0dIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMsAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0fIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMrwELIABBP0cNASABQQFqCyEBQQUhAwyUAQtBACEDIAJBADYCHCACIAE2AhQgAkH9EjYCECACQQc2AgwMrAELIAJBADYCHCACIAE2AhQgAkHcCDYCECACQQc2AgxBACEDDKsBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNByACQeUANgIcIAIgATYCFCACIAA2AgxBACEDDKoBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNFiACQdMANgIcIAIgATYCFCACIAA2AgxBACEDDKkBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNGCACQdIANgIcIAIgATYCFCACIAA2AgxBACEDDKgBCyACQQA2AhwgAiABNgIUIAJBxgo2AhAgAkEHNgIMQQAhAwynAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQMgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwymAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRIgAkHTADYCHCACIAE2AhQgAiAANgIMQQAhAwylAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRQgAkHSADYCHCACIAE2AhQgAiAANgIMQQAhAwykAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQAgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwyjAQtB1QAhAwyJAQsgAEEVRwRAIAJBADYCHCACIAE2AhQgAkG5DTYCECACQRo2AgxBACEDDKIBCyACQeQANgIcIAIgATYCFCACQeMXNgIQIAJBFTYCDEEAIQMMoQELIAJBADYCACAGQQFqIQEgAi0AKSIAQSNrQQtJDQQCQCAAQQZLDQBBASAAdEHKAHFFDQAMBQtBACEDIAJBADYCHCACIAE2AhQgAkH3CTYCECACQQg2AgwMoAELIAJBADYCACAGQQFqIQEgAi0AKUEhRg0DIAJBADYCHCACIAE2AhQgAkGbCjYCECACQQg2AgxBACEDDJ8BCyACQQA2AgALQQAhAyACQQA2AhwgAiABNgIUIAJBkDM2AhAgAkEINgIMDJ0BCyACQQA2AgAgBkEBaiEBIAItAClBI0kNACACQQA2AhwgAiABNgIUIAJB0wk2AhAgAkEINgIMQQAhAwycAQtB0QAhAwyCAQsgAS0AAEEwayIAQf8BcUEKSQRAIAIgADoAKiABQQFqIQFBzwAhAwyCAQsgAigCBCEAIAJBADYCBCACIAAgARAoIgBFDYYBIAJB3gA2AhwgAiABNgIUIAIgADYCDEEAIQMMmgELIAIoAgQhACACQQA2AgQgAiAAIAEQKCIARQ2GASACQdwANgIcIAIgATYCFCACIAA2AgxBACEDDJkBCyACKAIEIQAgAkEANgIEIAIgACAFECgiAEUEQCAFIQEMhwELIAJB2gA2AhwgAiAFNgIUIAIgADYCDAyYAQtBACEBQQEhAwsgAiADOgArIAVBAWohAwJAAkACQCACLQAtQRBxDQACQAJAAkAgAi0AKg4DAQACBAsgBkUNAwwCCyAADQEMAgsgAUUNAQsgAigCBCEAIAJBADYCBCACIAAgAxAoIgBFBEAgAyEBDAILIAJB2AA2AhwgAiADNgIUIAIgADYCDEEAIQMMmAELIAIoAgQhACACQQA2AgQgAiAAIAMQKCIARQRAIAMhAQyHAQsgAkHZADYCHCACIAM2AhQgAiAANgIMQQAhAwyXAQtBzAAhAwx9CyAAQRVHBEAgAkEANgIcIAIgATYCFCACQZQNNgIQIAJBITYCDEEAIQMMlgELIAJB1wA2AhwgAiABNgIUIAJByRc2AhAgAkEVNgIMQQAhAwyVAQtBACEDIAJBADYCHCACIAE2AhQgAkGAETYCECACQQk2AgwMlAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0AIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMkwELQckAIQMMeQsgAkEANgIcIAIgATYCFCACQcEoNgIQIAJBBzYCDCACQQA2AgBBACEDDJEBCyACKAIEIQBBACEDIAJBADYCBCACIAAgARAlIgBFDQAgAkHSADYCHCACIAE2AhQgAiAANgIMDJABC0HIACEDDHYLIAJBADYCACAFIQELIAJBgBI7ASogAUEBaiEBQQAhAAJAIAIoAjgiA0UNACADKAIwIgNFDQAgAiADEQAAIQALIAANAQtBxwAhAwxzCyAAQRVGBEAgAkHRADYCHCACIAE2AhQgAkHjFzYCECACQRU2AgxBACEDDIwBC0EAIQMgAkEANgIcIAIgATYCFCACQbkNNgIQIAJBGjYCDAyLAQtBACEDIAJBADYCHCACIAE2AhQgAkGgGTYCECACQR42AgwMigELIAEtAABBOkYEQCACKAIEIQBBACEDIAJBADYCBCACIAAgARApIgBFDQEgAkHDADYCHCACIAA2AgwgAiABQQFqNgIUDIoBC0EAIQMgAkEANgIcIAIgATYCFCACQbERNgIQIAJBCjYCDAyJAQsgAUEBaiEBQTshAwxvCyACQcMANgIcIAIgADYCDCACIAFBAWo2AhQMhwELQQAhAyACQQA2AhwgAiABNgIUIAJB8A42AhAgAkEcNgIMDIYBCyACIAIvATBBEHI7ATAMZgsCQCACLwEwIgBBCHFFDQAgAi0AKEEBRw0AIAItAC1BCHFFDQMLIAIgAEH3+wNxQYAEcjsBMAwECyABIARHBEACQANAIAEtAABBMGsiAEH/AXFBCk8EQEE1IQMMbgsgAikDICIKQpmz5syZs+bMGVYNASACIApCCn4iCjcDICAKIACtQv8BgyILQn+FVg0BIAIgCiALfDcDICAEIAFBAWoiAUcNAAtBOSEDDIUBCyACKAIEIQBBACEDIAJBADYCBCACIAAgAUEBaiIBECoiAA0MDHcLQTkhAwyDAQsgAi0AMEEgcQ0GQcUBIQMMaQtBACEDIAJBADYCBCACIAEgARAqIgBFDQQgAkE6NgIcIAIgADYCDCACIAFBAWo2AhQMgQELIAItAChBAUcNACACLQAtQQhxRQ0BC0E3IQMMZgsgAigCBCEAQQAhAyACQQA2AgQgAiAAIAEQKiIABEAgAkE7NgIcIAIgADYCDCACIAFBAWo2AhQMfwsgAUEBaiEBDG4LIAJBCDoALAwECyABQQFqIQEMbQtBACEDIAJBADYCHCACIAE2AhQgAkHkEjYCECACQQQ2AgwMewsgAigCBCEAQQAhAyACQQA2AgQgAiAAIAEQKiIARQ1sIAJBNzYCHCACIAE2AhQgAiAANgIMDHoLIAIgAi8BMEEgcjsBMAtBMCEDDF8LIAJBNjYCHCACIAE2AhQgAiAANgIMDHcLIABBLEcNASABQQFqIQBBASEBAkACQAJAAkACQCACLQAsQQVrDgQDAQIEAAsgACEBDAQLQQIhAQwBC0EEIQELIAJBAToALCACIAIvATAgAXI7ATAgACEBDAELIAIgAi8BMEEIcjsBMCAAIQELQTkhAwxcCyACQQA6ACwLQTQhAwxaCyABIARGBEBBLSEDDHMLAkACQANAAkAgAS0AAEEKaw4EAgAAAwALIAQgAUEBaiIBRw0AC0EtIQMMdAsgAigCBCEAQQAhAyACQQA2AgQgAiAAIAEQKiIARQ0CIAJBLDYCHCACIAE2AhQgAiAANgIMDHMLIAIoAgQhAEEAIQMgAkEANgIEIAIgACABECoiAEUEQCABQQFqIQEMAgsgAkEsNgIcIAIgADYCDCACIAFBAWo2AhQMcgsgAS0AAEENRgRAIAIoAgQhAEEAIQMgAkEANgIEIAIgACABECoiAEUEQCABQQFqIQEMAgsgAkEsNgIcIAIgADYCDCACIAFBAWo2AhQMcgsgAi0ALUEBcQRAQcQBIQMMWQsgAigCBCEAQQAhAyACQQA2AgQgAiAAIAEQKiIADQEMZQtBLyEDDFcLIAJBLjYCHCACIAE2AhQgAiAANgIMDG8LQQAhAyACQQA2AhwgAiABNgIUIAJB8BQ2AhAgAkEDNgIMDG4LQQEhAwJAAkACQAJAIAItACxBBWsOBAMBAgAECyACIAIvATBBCHI7ATAMAwtBAiEDDAELQQQhAwsgAkEBOgAsIAIgAi8BMCADcjsBMAtBKiEDDFMLQQAhAyACQQA2AhwgAiABNgIUIAJB4Q82AhAgAkEKNgIMDGsLQQEhAwJAAkACQAJAAkACQCACLQAsQQJrDgcFBAQDAQIABAsgAiACLwEwQQhyOwEwDAMLQQIhAwwBC0EEIQMLIAJBAToALCACIAIvATAgA3I7ATALQSshAwxSC0EAIQMgAkEANgIcIAIgATYCFCACQasSNgIQIAJBCzYCDAxqC0EAIQMgAkEANgIcIAIgATYCFCACQf0NNgIQIAJBHTYCDAxpCyABIARHBEADQCABLQAAQSBHDUggBCABQQFqIgFHDQALQSUhAwxpC0ElIQMMaAsgAi0ALUEBcQRAQcMBIQMMTwsgAigCBCEAQQAhAyACQQA2AgQgAiAAIAEQKSIABEAgAkEmNgIcIAIgADYCDCACIAFBAWo2AhQMaAsgAUEBaiEBDFwLIAFBAWohASACLwEwIgBBgAFxBEBBACEAAkAgAigCOCIDRQ0AIAMoAlQiA0UNACACIAMRAAAhAAsgAEUNBiAAQRVHDR8gAkEFNgIcIAIgATYCFCACQfkXNgIQIAJBFTYCDEEAIQMMZwsCQCAAQaAEcUGgBEcNACACLQAtQQJxDQBBACEDIAJBADYCHCACIAE2AhQgAkGWEzYCECACQQQ2AgwMZwsgAgJ/IAIvATBBFHFBFEYEQEEBIAItAChBAUYNARogAi8BMkHlAEYMAQsgAi0AKUEFRgs6AC5BACEAAkAgAigCOCIDRQ0AIAMoAiQiA0UNACACIAMRAAAhAAsCQAJAAkACQAJAIAAOFgIBAAQEBAQEBAQEBAQEBAQEBAQEBAMECyACQQE6AC4LIAIgAi8BMEHAAHI7ATALQSchAwxPCyACQSM2AhwgAiABNgIUIAJBpRY2AhAgAkEVNgIMQQAhAwxnC0EAIQMgAkEANgIcIAIgATYCFCACQdULNgIQIAJBETYCDAxmC0EAIQACQCACKAI4IgNFDQAgAygCLCIDRQ0AIAIgAxEAACEACyAADQELQQ4hAwxLCyAAQRVGBEAgAkECNgIcIAIgATYCFCACQbAYNgIQIAJBFTYCDEEAIQMMZAtBACEDIAJBADYCHCACIAE2AhQgAkGnDjYCECACQRI2AgwMYwtBACEDIAJBADYCHCACIAE2AhQgAkGqHDYCECACQQ82AgwMYgsgAigCBCEAQQAhAyACQQA2AgQgAiAAIAEgCqdqIgEQKyIARQ0AIAJBBTYCHCACIAE2AhQgAiAANgIMDGELQQ8hAwxHC0EAIQMgAkEANgIcIAIgATYCFCACQc0TNgIQIAJBDDYCDAxfC0IBIQoLIAFBAWohAQJAIAIpAyAiC0L//////////w9YBEAgAiALQgSGIAqENwMgDAELQQAhAyACQQA2AhwgAiABNgIUIAJBrQk2AhAgAkEMNgIMDF4LQSQhAwxEC0EAIQMgAkEANgIcIAIgATYCFCACQc0TNgIQIAJBDDYCDAxcCyACKAIEIQBBACEDIAJBADYCBCACIAAgARAsIgBFBEAgAUEBaiEBDFILIAJBFzYCHCACIAA2AgwgAiABQQFqNgIUDFsLIAIoAgQhAEEAIQMgAkEANgIEAkAgAiAAIAEQLCIARQRAIAFBAWohAQwBCyACQRY2AhwgAiAANgIMIAIgAUEBajYCFAxbC0EfIQMMQQtBACEDIAJBADYCHCACIAE2AhQgAkGaDzYCECACQSI2AgwMWQsgAigCBCEAQQAhAyACQQA2AgQgAiAAIAEQLSIARQRAIAFBAWohAQxQCyACQRQ2AhwgAiAANgIMIAIgAUEBajYCFAxYCyACKAIEIQBBACEDIAJBADYCBAJAIAIgACABEC0iAEUEQCABQQFqIQEMAQsgAkETNgIcIAIgADYCDCACIAFBAWo2AhQMWAtBHiEDDD4LQQAhAyACQQA2AhwgAiABNgIUIAJBxgw2AhAgAkEjNgIMDFYLIAIoAgQhAEEAIQMgAkEANgIEIAIgACABEC0iAEUEQCABQQFqIQEMTgsgAkERNgIcIAIgADYCDCACIAFBAWo2AhQMVQsgAkEQNgIcIAIgATYCFCACIAA2AgwMVAtBACEDIAJBADYCHCACIAE2AhQgAkHGDDYCECACQSM2AgwMUwtBACEDIAJBADYCHCACIAE2AhQgAkHAFTYCECACQQI2AgwMUgsgAigCBCEAQQAhAyACQQA2AgQCQCACIAAgARAtIgBFBEAgAUEBaiEBDAELIAJBDjYCHCACIAA2AgwgAiABQQFqNgIUDFILQRshAww4C0EAIQMgAkEANgIcIAIgATYCFCACQcYMNgIQIAJBIzYCDAxQCyACKAIEIQBBACEDIAJBADYCBAJAIAIgACABECwiAEUEQCABQQFqIQEMAQsgAkENNgIcIAIgADYCDCACIAFBAWo2AhQMUAtBGiEDDDYLQQAhAyACQQA2AhwgAiABNgIUIAJBmg82AhAgAkEiNgIMDE4LIAIoAgQhAEEAIQMgAkEANgIEAkAgAiAAIAEQLCIARQRAIAFBAWohAQwBCyACQQw2AhwgAiAANgIMIAIgAUEBajYCFAxOC0EZIQMMNAtBACEDIAJBADYCHCACIAE2AhQgAkGaDzYCECACQSI2AgwMTAsgAEEVRwRAQQAhAyACQQA2AhwgAiABNgIUIAJBgww2AhAgAkETNgIMDEwLIAJBCjYCHCACIAE2AhQgAkHkFjYCECACQRU2AgxBACEDDEsLIAIoAgQhAEEAIQMgAkEANgIEIAIgACABIAqnaiIBECsiAARAIAJBBzYCHCACIAE2AhQgAiAANgIMDEsLQRMhAwwxCyAAQRVHBEBBACEDIAJBADYCHCACIAE2AhQgAkHaDTYCECACQRQ2AgwMSgsgAkEeNgIcIAIgATYCFCACQfkXNgIQIAJBFTYCDEEAIQMMSQtBACEAAkAgAigCOCIDRQ0AIAMoAiwiA0UNACACIAMRAAAhAAsgAEUNQSAAQRVGBEAgAkEDNgIcIAIgATYCFCACQbAYNgIQIAJBFTYCDEEAIQMMSQtBACEDIAJBADYCHCACIAE2AhQgAkGnDjYCECACQRI2AgwMSAtBACEDIAJBADYCHCACIAE2AhQgAkHaDTYCECACQRQ2AgwMRwtBACEDIAJBADYCHCACIAE2AhQgAkGnDjYCECACQRI2AgwMRgsgAkEAOgAvIAItAC1BBHFFDT8LIAJBADoALyACQQE6ADRBACEDDCsLQQAhAyACQQA2AhwgAkHkETYCECACQQc2AgwgAiABQQFqNgIUDEMLAkADQAJAIAEtAABBCmsOBAACAgACCyAEIAFBAWoiAUcNAAtB3QEhAwxDCwJAAkAgAi0ANEEBRw0AQQAhAAJAIAIoAjgiA0UNACADKAJYIgNFDQAgAiADEQAAIQALIABFDQAgAEEVRw0BIAJB3AE2AhwgAiABNgIUIAJB1RY2AhAgAkEVNgIMQQAhAwxEC0HBASEDDCoLIAJBADYCHCACIAE2AhQgAkHpCzYCECACQR82AgxBACEDDEILAkACQCACLQAoQQFrDgIEAQALQcABIQMMKQtBuQEhAwwoCyACQQI6AC9BACEAAkAgAigCOCIDRQ0AIAMoAgAiA0UNACACIAMRAAAhAAsgAEUEQEHCASEDDCgLIABBFUcEQCACQQA2AhwgAiABNgIUIAJBpAw2AhAgAkEQNgIMQQAhAwxBCyACQdsBNgIcIAIgATYCFCACQfoWNgIQIAJBFTYCDEEAIQMMQAsgASAERgRAQdoBIQMMQAsgAS0AAEHIAEYNASACQQE6ACgLQawBIQMMJQtBvwEhAwwkCyABIARHBEAgAkEQNgIIIAIgATYCBEG+ASEDDCQLQdkBIQMMPAsgASAERgRAQdgBIQMMPAsgAS0AAEHIAEcNBCABQQFqIQFBvQEhAwwiCyABIARGBEBB1wEhAww7CwJAAkAgAS0AAEHFAGsOEAAFBQUFBQUFBQUFBQUFBQEFCyABQQFqIQFBuwEhAwwiCyABQQFqIQFBvAEhAwwhC0HWASEDIAEgBEYNOSACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGD0ABqLQAARw0DIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAw6CyACKAIEIQAgAkIANwMAIAIgACAGQQFqIgEQJyIARQRAQcYBIQMMIQsgAkHVATYCHCACIAE2AhQgAiAANgIMQQAhAww5C0HUASEDIAEgBEYNOCACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGB0ABqLQAARw0CIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAw5CyACQYEEOwEoIAIoAgQhACACQgA3AwAgAiAAIAZBAWoiARAnIgANAwwCCyACQQA2AgALQQAhAyACQQA2AhwgAiABNgIUIAJB2Bs2AhAgAkEINgIMDDYLQboBIQMMHAsgAkHTATYCHCACIAE2AhQgAiAANgIMQQAhAww0C0EAIQACQCACKAI4IgNFDQAgAygCOCIDRQ0AIAIgAxEAACEACyAARQ0AIABBFUYNASACQQA2AhwgAiABNgIUIAJBzA42AhAgAkEgNgIMQQAhAwwzC0HkACEDDBkLIAJB+AA2AhwgAiABNgIUIAJByhg2AhAgAkEVNgIMQQAhAwwxC0HSASEDIAQgASIARg0wIAQgAWsgAigCACIBaiEFIAAgAWtBBGohBgJAA0AgAC0AACABQfzPAGotAABHDQEgAUEERg0DIAFBAWohASAEIABBAWoiAEcNAAsgAiAFNgIADDELIAJBADYCHCACIAA2AhQgAkGQMzYCECACQQg2AgwgAkEANgIAQQAhAwwwCyABIARHBEAgAkEONgIIIAIgATYCBEG3ASEDDBcLQdEBIQMMLwsgAkEANgIAIAZBAWohAQtBuAEhAwwUCyABIARGBEBB0AEhAwwtCyABLQAAQTBrIgBB/wFxQQpJBEAgAiAAOgAqIAFBAWohAUG2ASEDDBQLIAIoAgQhACACQQA2AgQgAiAAIAEQKCIARQ0UIAJBzwE2AhwgAiABNgIUIAIgADYCDEEAIQMMLAsgASAERgRAQc4BIQMMLAsCQCABLQAAQS5GBEAgAUEBaiEBDAELIAIoAgQhACACQQA2AgQgAiAAIAEQKCIARQ0VIAJBzQE2AhwgAiABNgIUIAIgADYCDEEAIQMMLAtBtQEhAwwSCyAEIAEiBUYEQEHMASEDDCsLQQAhAEEBIQFBASEGQQAhAwJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAIAUtAABBMGsOCgoJAAECAwQFBggLC0ECDAYLQQMMBQtBBAwEC0EFDAMLQQYMAgtBBwwBC0EICyEDQQAhAUEAIQYMAgtBCSEDQQEhAEEAIQFBACEGDAELQQAhAUEBIQMLIAIgAzoAKyAFQQFqIQMCQAJAIAItAC1BEHENAAJAAkACQCACLQAqDgMBAAIECyAGRQ0DDAILIAANAQwCCyABRQ0BCyACKAIEIQAgAkEANgIEIAIgACADECgiAEUEQCADIQEMAwsgAkHJATYCHCACIAM2AhQgAiAANgIMQQAhAwwtCyACKAIEIQAgAkEANgIEIAIgACADECgiAEUEQCADIQEMGAsgAkHKATYCHCACIAM2AhQgAiAANgIMQQAhAwwsCyACKAIEIQAgAkEANgIEIAIgACAFECgiAEUEQCAFIQEMFgsgAkHLATYCHCACIAU2AhQgAiAANgIMDCsLQbQBIQMMEQtBACEAAkAgAigCOCIDRQ0AIAMoAjwiA0UNACACIAMRAAAhAAsCQCAABEAgAEEVRg0BIAJBADYCHCACIAE2AhQgAkGUDTYCECACQSE2AgxBACEDDCsLQbIBIQMMEQsgAkHIATYCHCACIAE2AhQgAkHJFzYCECACQRU2AgxBACEDDCkLIAJBADYCACAGQQFqIQFB9QAhAwwPCyACLQApQQVGBEBB4wAhAwwPC0HiACEDDA4LIAAhASACQQA2AgALIAJBADoALEEJIQMMDAsgAkEANgIAIAdBAWohAUHAACEDDAsLQQELOgAsIAJBADYCACAGQQFqIQELQSkhAwwIC0E4IQMMBwsCQCABIARHBEADQCABLQAAQYA+ai0AACIAQQFHBEAgAEECRw0DIAFBAWohAQwFCyAEIAFBAWoiAUcNAAtBPiEDDCELQT4hAwwgCwsgAkEAOgAsDAELQQshAwwEC0E6IQMMAwsgAUEBaiEBQS0hAwwCCyACIAE6ACwgAkEANgIAIAZBAWohAUEMIQMMAQsgAkEANgIAIAZBAWohAUEKIQMMAAsAC0EAIQMgAkEANgIcIAIgATYCFCACQc0QNgIQIAJBCTYCDAwXC0EAIQMgAkEANgIcIAIgATYCFCACQekKNgIQIAJBCTYCDAwWC0EAIQMgAkEANgIcIAIgATYCFCACQbcQNgIQIAJBCTYCDAwVC0EAIQMgAkEANgIcIAIgATYCFCACQZwRNgIQIAJBCTYCDAwUC0EAIQMgAkEANgIcIAIgATYCFCACQc0QNgIQIAJBCTYCDAwTC0EAIQMgAkEANgIcIAIgATYCFCACQekKNgIQIAJBCTYCDAwSC0EAIQMgAkEANgIcIAIgATYCFCACQbcQNgIQIAJBCTYCDAwRC0EAIQMgAkEANgIcIAIgATYCFCACQZwRNgIQIAJBCTYCDAwQC0EAIQMgAkEANgIcIAIgATYCFCACQZcVNgIQIAJBDzYCDAwPC0EAIQMgAkEANgIcIAIgATYCFCACQZcVNgIQIAJBDzYCDAwOC0EAIQMgAkEANgIcIAIgATYCFCACQcASNgIQIAJBCzYCDAwNC0EAIQMgAkEANgIcIAIgATYCFCACQZUJNgIQIAJBCzYCDAwMC0EAIQMgAkEANgIcIAIgATYCFCACQeEPNgIQIAJBCjYCDAwLC0EAIQMgAkEANgIcIAIgATYCFCACQfsPNgIQIAJBCjYCDAwKC0EAIQMgAkEANgIcIAIgATYCFCACQfEZNgIQIAJBAjYCDAwJC0EAIQMgAkEANgIcIAIgATYCFCACQcQUNgIQIAJBAjYCDAwIC0EAIQMgAkEANgIcIAIgATYCFCACQfIVNgIQIAJBAjYCDAwHCyACQQI2AhwgAiABNgIUIAJBnBo2AhAgAkEWNgIMQQAhAwwGC0EBIQMMBQtB1AAhAyABIARGDQQgCEEIaiEJIAIoAgAhBQJAAkAgASAERwRAIAVB2MIAaiEHIAQgBWogAWshACAFQX9zQQpqIgUgAWohBgNAIAEtAAAgBy0AAEcEQEECIQcMAwsgBUUEQEEAIQcgBiEBDAMLIAVBAWshBSAHQQFqIQcgBCABQQFqIgFHDQALIAAhBSAEIQELIAlBATYCACACIAU2AgAMAQsgAkEANgIAIAkgBzYCAAsgCSABNgIEIAgoAgwhACAIKAIIDgMBBAIACwALIAJBADYCHCACQbUaNgIQIAJBFzYCDCACIABBAWo2AhRBACEDDAILIAJBADYCHCACIAA2AhQgAkHKGjYCECACQQk2AgxBACEDDAELIAEgBEYEQEEiIQMMAQsgAkEJNgIIIAIgATYCBEEhIQMLIAhBEGokACADRQRAIAIoAgwhAAwBCyACIAM2AhxBACEAIAIoAgQiAUUNACACIAEgBCACKAIIEQEAIgFFDQAgAiAENgIUIAIgATYCDCABIQALIAALvgIBAn8gAEEAOgAAIABB3ABqIgFBAWtBADoAACAAQQA6AAIgAEEAOgABIAFBA2tBADoAACABQQJrQQA6AAAgAEEAOgADIAFBBGtBADoAAEEAIABrQQNxIgEgAGoiAEEANgIAQdwAIAFrQXxxIgIgAGoiAUEEa0EANgIAAkAgAkEJSQ0AIABBADYCCCAAQQA2AgQgAUEIa0EANgIAIAFBDGtBADYCACACQRlJDQAgAEEANgIYIABBADYCFCAAQQA2AhAgAEEANgIMIAFBEGtBADYCACABQRRrQQA2AgAgAUEYa0EANgIAIAFBHGtBADYCACACIABBBHFBGHIiAmsiAUEgSQ0AIAAgAmohAANAIABCADcDGCAAQgA3AxAgAEIANwMIIABCADcDACAAQSBqIQAgAUEgayIBQR9LDQALCwtWAQF/AkAgACgCDA0AAkACQAJAAkAgAC0ALw4DAQADAgsgACgCOCIBRQ0AIAEoAiwiAUUNACAAIAERAAAiAQ0DC0EADwsACyAAQcMWNgIQQQ4hAQsgAQsaACAAKAIMRQRAIABB0Rs2AhAgAEEVNgIMCwsUACAAKAIMQRVGBEAgAEEANgIMCwsUACAAKAIMQRZGBEAgAEEANgIMCwsHACAAKAIMCwcAIAAoAhALCQAgACABNgIQCwcAIAAoAhQLFwAgAEEkTwRAAAsgAEECdEGgM2ooAgALFwAgAEEuTwRAAAsgAEECdEGwNGooAgALvwkBAX9B6yghAQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB5ABrDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0HhJw8LQaQhDwtByywPC0H+MQ8LQcAkDwtBqyQPC0GNKA8LQeImDwtBgDAPC0G5Lw8LQdckDwtB7x8PC0HhHw8LQfofDwtB8iAPC0GoLw8LQa4yDwtBiDAPC0HsJw8LQYIiDwtBjh0PC0HQLg8LQcojDwtBxTIPC0HfHA8LQdIcDwtBxCAPC0HXIA8LQaIfDwtB7S4PC0GrMA8LQdQlDwtBzC4PC0H6Lg8LQfwrDwtB0jAPC0HxHQ8LQbsgDwtB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AAADAEGUCAsFBAAAAAUAQaQICwkGAAAABwAAAAgAQdwIC4otSW52YWxpZCBjaGFyIGluIHVybCBxdWVyeQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2JvZHkAQ29udGVudC1MZW5ndGggb3ZlcmZsb3cAQ2h1bmsgc2l6ZSBvdmVyZmxvdwBSZXNwb25zZSBvdmVyZmxvdwBJbnZhbGlkIG1ldGhvZCBmb3IgSFRUUC94LnggcmVxdWVzdABJbnZhbGlkIG1ldGhvZCBmb3IgUlRTUC94LnggcmVxdWVzdABFeHBlY3RlZCBTT1VSQ0UgbWV0aG9kIGZvciBJQ0UveC54IHJlcXVlc3QASW52YWxpZCBjaGFyIGluIHVybCBmcmFnbWVudCBzdGFydABFeHBlY3RlZCBkb3QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9zdGF0dXMASW52YWxpZCByZXNwb25zZSBzdGF0dXMASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucwBVc2VyIGNhbGxiYWNrIGVycm9yAGBvbl9yZXNldGAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2hlYWRlcmAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfYmVnaW5gIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwBB+TULAQEAQZA2C+ABAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQf03CwEBAEGROAteAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgBB/TkLAQEAQZE6C14CAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAEHwOwsNbG9zZWVlcC1hbGl2ZQBBiTwLAQEAQaA8C+ABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQYk+CwEBAEGgPgvnAQEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZABBsMAAC18BAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQBBkMIACyFlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AQcDCAAstcmFuc2Zlci1lbmNvZGluZ3BncmFkZQ0KDQoNClNNDQoNClRUUC9DRS9UU1AvAEH5wgALBQECAAEDAEGQwwAL4AEEAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+cQACwUBAgABAwBBkMUAC+ABBAEBBQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQfnGAAsEAQAAAQBBkccAC98BAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+sgACwQBAAACAEGQyQALXwMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAEH6ygALBAEAAAEAQZDLAAsBAQBBqssAC0ECAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBB+swACwQBAAABAEGQzQALAQEAQZrNAAsGAgAAAAACAEGxzQALOgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQfDOAAuWAU5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw==", "base64"); + return llhttp_simdWasm$1; +} +var constants$7; +var hasRequiredConstants$7; +function requireConstants$7() { + if (hasRequiredConstants$7) return constants$7; + hasRequiredConstants$7 = 1; + const corsSafeListedMethods = ( + /** @type {const} */ + ["GET", "HEAD", "POST"] + ); + const corsSafeListedMethodsSet = new Set(corsSafeListedMethods); + const nullBodyStatus = ( + /** @type {const} */ + [101, 204, 205, 304] + ); + const redirectStatus = ( + /** @type {const} */ + [301, 302, 303, 307, 308] + ); + const redirectStatusSet = new Set(redirectStatus); + const badPorts = ( + /** @type {const} */ + [ + "1", + "7", + "9", + "11", + "13", + "15", + "17", + "19", + "20", + "21", + "22", + "23", + "25", + "37", + "42", + "43", + "53", + "69", + "77", + "79", + "87", + "95", + "101", + "102", + "103", + "104", + "109", + "110", + "111", + "113", + "115", + "117", + "119", + "123", + "135", + "137", + "139", + "143", + "161", + "179", + "389", + "427", + "465", + "512", + "513", + "514", + "515", + "526", + "530", + "531", + "532", + "540", + "548", + "554", + "556", + "563", + "587", + "601", + "636", + "989", + "990", + "993", + "995", + "1719", + "1720", + "1723", + "2049", + "3659", + "4045", + "4190", + "5060", + "5061", + "6000", + "6566", + "6665", + "6666", + "6667", + "6668", + "6669", + "6679", + "6697", + "10080" + ] + ); + const badPortsSet = new Set(badPorts); + const referrerPolicy = ( + /** @type {const} */ + [ + "", + "no-referrer", + "no-referrer-when-downgrade", + "same-origin", + "origin", + "strict-origin", + "origin-when-cross-origin", + "strict-origin-when-cross-origin", + "unsafe-url" + ] + ); + const referrerPolicySet = new Set(referrerPolicy); + const requestRedirect = ( + /** @type {const} */ + ["follow", "manual", "error"] + ); + const safeMethods = ( + /** @type {const} */ + ["GET", "HEAD", "OPTIONS", "TRACE"] + ); + const safeMethodsSet = new Set(safeMethods); + const requestMode = ( + /** @type {const} */ + ["navigate", "same-origin", "no-cors", "cors"] + ); + const requestCredentials = ( + /** @type {const} */ + ["omit", "same-origin", "include"] + ); + const requestCache = ( + /** @type {const} */ + [ + "default", + "no-store", + "reload", + "no-cache", + "force-cache", + "only-if-cached" + ] + ); + const requestBodyHeader = ( + /** @type {const} */ + [ + "content-encoding", + "content-language", + "content-location", + "content-type", + // See https://github.com/nodejs/undici/issues/2021 + // 'Content-Length' is a forbidden header name, which is typically + // removed in the Headers implementation. However, undici doesn't + // filter out headers, so we add it here. + "content-length" + ] + ); + const requestDuplex = ( + /** @type {const} */ + [ + "half" + ] + ); + const forbiddenMethods = ( + /** @type {const} */ + ["CONNECT", "TRACE", "TRACK"] + ); + const forbiddenMethodsSet = new Set(forbiddenMethods); + const subresource = ( + /** @type {const} */ + [ + "audio", + "audioworklet", + "font", + "image", + "manifest", + "paintworklet", + "script", + "style", + "track", + "video", + "xslt", + "" + ] + ); + const subresourceSet = new Set(subresource); + constants$7 = { + subresource, + forbiddenMethods, + requestBodyHeader, + referrerPolicy, + requestRedirect, + requestMode, + requestCredentials, + requestCache, + redirectStatus, + corsSafeListedMethods, + nullBodyStatus, + safeMethods, + badPorts, + requestDuplex, + subresourceSet, + badPortsSet, + redirectStatusSet, + corsSafeListedMethodsSet, + safeMethodsSet, + forbiddenMethodsSet, + referrerPolicySet }; - webidl.converters.BufferSource = function(V, opts = {}) { - if (types.isAnyArrayBuffer(V)) { - return webidl.converters.ArrayBuffer(V, opts); - } - if (types.isTypedArray(V)) { - return webidl.converters.TypedArray(V, V.constructor); + return constants$7; +} +var global$4; +var hasRequiredGlobal$3; +function requireGlobal$3() { + if (hasRequiredGlobal$3) return global$4; + hasRequiredGlobal$3 = 1; + const globalOrigin = /* @__PURE__ */ Symbol.for("undici.globalOrigin.1"); + function getGlobalOrigin() { + return globalThis[globalOrigin]; + } + function setGlobalOrigin(newOrigin) { + if (newOrigin === void 0) { + Object.defineProperty(globalThis, globalOrigin, { + value: void 0, + writable: true, + enumerable: false, + configurable: false + }); + return; } - if (types.isDataView(V)) { - return webidl.converters.DataView(V, opts); + const parsedURL = new URL(newOrigin); + if (parsedURL.protocol !== "http:" && parsedURL.protocol !== "https:") { + throw new TypeError(`Only http & https urls are allowed, received ${parsedURL.protocol}`); } - throw new TypeError(`Could not convert ${V} to a BufferSource.`); - }; - webidl.converters["sequence"] = webidl.sequenceConverter( - webidl.converters.ByteString - ); - webidl.converters["sequence>"] = webidl.sequenceConverter( - webidl.converters["sequence"] - ); - webidl.converters["record"] = webidl.recordConverter( - webidl.converters.ByteString, - webidl.converters.ByteString - ); - webidl_1 = { - webidl + Object.defineProperty(globalThis, globalOrigin, { + value: parsedURL, + writable: true, + enumerable: false, + configurable: false + }); + } + global$4 = { + getGlobalOrigin, + setGlobalOrigin }; - return webidl_1; + return global$4; } -var dataURL; -var hasRequiredDataURL; -function requireDataURL() { - if (hasRequiredDataURL) return dataURL; - hasRequiredDataURL = 1; - const assert = require$$0$3; - const { atob: atob2 } = require$$7; - const { isomorphicDecode } = requireUtil$5(); +var dataUrl; +var hasRequiredDataUrl; +function requireDataUrl() { + if (hasRequiredDataUrl) return dataUrl; + hasRequiredDataUrl = 1; + const assert = require$$0$5; const encoder = new TextEncoder(); - const HTTP_TOKEN_CODEPOINTS = /^[!#$%&'*+-.^_|~A-Za-z0-9]+$/; - const HTTP_WHITESPACE_REGEX = /(\u000A|\u000D|\u0009|\u0020)/; - const HTTP_QUOTED_STRING_TOKENS = /[\u0009|\u0020-\u007E|\u0080-\u00FF]/; + const HTTP_TOKEN_CODEPOINTS = /^[!#$%&'*+\-.^_|~A-Za-z0-9]+$/; + const HTTP_WHITESPACE_REGEX = /[\u000A\u000D\u0009\u0020]/; + const ASCII_WHITESPACE_REPLACE_REGEX = /[\u0009\u000A\u000C\u000D\u0020]/g; + const HTTP_QUOTED_STRING_TOKENS = /^[\u0009\u0020-\u007E\u0080-\u00FF]+$/; function dataURLProcessor(dataURL2) { assert(dataURL2.protocol === "data:"); let input = URLSerializer(dataURL2, true); @@ -4713,7 +3576,11 @@ function requireDataURL() { } const href = url.href; const hashLength = url.hash.length; - return hashLength === 0 ? href : href.substring(0, href.length - hashLength); + const serialized = hashLength === 0 ? href : href.substring(0, href.length - hashLength); + if (!hashLength && href.endsWith("#")) { + return serialized.slice(0, -1); + } + return serialized; } function collectASequenceOfCodePoints(condition, input, position) { let result = ""; @@ -4737,22 +3604,31 @@ function requireDataURL() { const bytes = encoder.encode(input); return percentDecode(bytes); } + function isHexCharByte(byte) { + return byte >= 48 && byte <= 57 || byte >= 65 && byte <= 70 || byte >= 97 && byte <= 102; + } + function hexByteToNumber(byte) { + return ( + // 0-9 + byte >= 48 && byte <= 57 ? byte - 48 : (byte & 223) - 55 + ); + } function percentDecode(input) { - const output = []; - for (let i = 0; i < input.length; i++) { + const length = input.length; + const output = new Uint8Array(length); + let j = 0; + for (let i = 0; i < length; ++i) { const byte = input[i]; if (byte !== 37) { - output.push(byte); - } else if (byte === 37 && !/^[0-9A-Fa-f]{2}$/i.test(String.fromCharCode(input[i + 1], input[i + 2]))) { - output.push(37); + output[j++] = byte; + } else if (byte === 37 && !(isHexCharByte(input[i + 1]) && isHexCharByte(input[i + 2]))) { + output[j++] = 37; } else { - const nextTwoBytes = String.fromCharCode(input[i + 1], input[i + 2]); - const bytePoint = Number.parseInt(nextTwoBytes, 16); - output.push(bytePoint); + output[j++] = hexByteToNumber(input[i + 1]) << 4 | hexByteToNumber(input[i + 2]); i += 2; } } - return Uint8Array.from(output); + return length === j ? output : output.subarray(0, j); } function parseMIMEType(input) { input = removeHTTPWhitespace(input, true, true); @@ -4837,22 +3713,24 @@ function requireDataURL() { return mimeType; } function forgivingBase64(data) { - data = data.replace(/[\u0009\u000A\u000C\u000D\u0020]/g, ""); - if (data.length % 4 === 0) { - data = data.replace(/=?=$/, ""); + data = data.replace(ASCII_WHITESPACE_REPLACE_REGEX, ""); + let dataLength = data.length; + if (dataLength % 4 === 0) { + if (data.charCodeAt(dataLength - 1) === 61) { + --dataLength; + if (data.charCodeAt(dataLength - 1) === 61) { + --dataLength; + } + } } - if (data.length % 4 === 1) { + if (dataLength % 4 === 1) { return "failure"; } - if (/[^+/0-9A-Za-z]/.test(data)) { + if (/[^+/0-9A-Za-z]/.test(data.length === dataLength ? data : data.substring(0, dataLength))) { return "failure"; } - const binary = atob2(data); - const bytes = new Uint8Array(binary.length); - for (let byte = 0; byte < binary.length; byte++) { - bytes[byte] = binary.charCodeAt(byte); - } - return bytes; + const buffer = Buffer.from(data, "base64"); + return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength); } function collectAnHTTPQuotedString(input, position, extractValue) { const positionStart = position.position; @@ -4905,34 +3783,81 @@ function requireDataURL() { return serialization; } function isHTTPWhiteSpace(char) { - return char === "\r" || char === "\n" || char === " " || char === " "; + return char === 13 || char === 10 || char === 9 || char === 32; } function removeHTTPWhitespace(str, leading = true, trailing = true) { - let lead = 0; - let trail = str.length - 1; - if (leading) { - for (; lead < str.length && isHTTPWhiteSpace(str[lead]); lead++) ; - } - if (trailing) { - for (; trail > 0 && isHTTPWhiteSpace(str[trail]); trail--) ; - } - return str.slice(lead, trail + 1); + return removeChars(str, leading, trailing, isHTTPWhiteSpace); } function isASCIIWhitespace(char) { - return char === "\r" || char === "\n" || char === " " || char === "\f" || char === " "; + return char === 13 || char === 10 || char === 9 || char === 12 || char === 32; } function removeASCIIWhitespace(str, leading = true, trailing = true) { + return removeChars(str, leading, trailing, isASCIIWhitespace); + } + function removeChars(str, leading, trailing, predicate) { let lead = 0; let trail = str.length - 1; if (leading) { - for (; lead < str.length && isASCIIWhitespace(str[lead]); lead++) ; + while (lead < str.length && predicate(str.charCodeAt(lead))) lead++; } if (trailing) { - for (; trail > 0 && isASCIIWhitespace(str[trail]); trail--) ; + while (trail > 0 && predicate(str.charCodeAt(trail))) trail--; } - return str.slice(lead, trail + 1); + return lead === 0 && trail === str.length - 1 ? str : str.slice(lead, trail + 1); } - dataURL = { + function isomorphicDecode(input) { + const length = input.length; + if ((2 << 15) - 1 > length) { + return String.fromCharCode.apply(null, input); + } + let result = ""; + let i = 0; + let addition = (2 << 15) - 1; + while (i < length) { + if (i + addition > length) { + addition = length - i; + } + result += String.fromCharCode.apply(null, input.subarray(i, i += addition)); + } + return result; + } + function minimizeSupportedMimeType(mimeType) { + switch (mimeType.essence) { + case "application/ecmascript": + case "application/javascript": + case "application/x-ecmascript": + case "application/x-javascript": + case "text/ecmascript": + case "text/javascript": + case "text/javascript1.0": + case "text/javascript1.1": + case "text/javascript1.2": + case "text/javascript1.3": + case "text/javascript1.4": + case "text/javascript1.5": + case "text/jscript": + case "text/livescript": + case "text/x-ecmascript": + case "text/x-javascript": + return "text/javascript"; + case "application/json": + case "text/json": + return "application/json"; + case "image/svg+xml": + return "image/svg+xml"; + case "text/xml": + case "application/xml": + return "application/xml"; + } + if (mimeType.subtype.endsWith("+json")) { + return "application/json"; + } + if (mimeType.subtype.endsWith("+xml")) { + return "application/xml"; + } + return ""; + } + dataUrl = { dataURLProcessor, URLSerializer, collectASequenceOfCodePoints, @@ -4940,2848 +3865,4147 @@ function requireDataURL() { stringPercentDecode, parseMIMEType, collectAnHTTPQuotedString, - serializeAMimeType + serializeAMimeType, + removeChars, + removeHTTPWhitespace, + minimizeSupportedMimeType, + HTTP_TOKEN_CODEPOINTS, + isomorphicDecode }; - return dataURL; + return dataUrl; } -var file; -var hasRequiredFile; -function requireFile() { - if (hasRequiredFile) return file; - hasRequiredFile = 1; - const { Blob: Blob2, File: NativeFile } = require$$7; - const { types } = require$$0$2; - const { kState } = requireSymbols$3(); - const { isBlobLike } = requireUtil$5(); - const { webidl } = requireWebidl(); - const { parseMIMEType, serializeAMimeType } = requireDataURL(); - const { kEnumerableProperty } = requireUtil$6(); - const encoder = new TextEncoder(); - class File extends Blob2 { - constructor(fileBits, fileName, options = {}) { - webidl.argumentLengthCheck(arguments, 2, { header: "File constructor" }); - fileBits = webidl.converters["sequence"](fileBits); - fileName = webidl.converters.USVString(fileName); - options = webidl.converters.FilePropertyBag(options); - const n = fileName; - let t = options.type; - let d; - substep: { - if (t) { - t = parseMIMEType(t); - if (t === "failure") { - t = ""; - break substep; - } - t = serializeAMimeType(t).toLowerCase(); +var webidl_1$1; +var hasRequiredWebidl$1; +function requireWebidl$1() { + if (hasRequiredWebidl$1) return webidl_1$1; + hasRequiredWebidl$1 = 1; + const { types, inspect } = require$$1$2; + const { markAsUncloneable } = require$$1$3; + const { toUSVString } = requireUtil$e(); + const webidl = {}; + webidl.converters = {}; + webidl.util = {}; + webidl.errors = {}; + webidl.errors.exception = function(message) { + return new TypeError(`${message.header}: ${message.message}`); + }; + webidl.errors.conversionFailed = function(context2) { + const plural = context2.types.length === 1 ? "" : " one of"; + const message = `${context2.argument} could not be converted to${plural}: ${context2.types.join(", ")}.`; + return webidl.errors.exception({ + header: context2.prefix, + message + }); + }; + webidl.errors.invalidArgument = function(context2) { + return webidl.errors.exception({ + header: context2.prefix, + message: `"${context2.value}" is an invalid ${context2.type}.` + }); + }; + webidl.brandCheck = function(V, I, opts) { + if (opts?.strict !== false) { + if (!(V instanceof I)) { + const err = new TypeError("Illegal invocation"); + err.code = "ERR_INVALID_THIS"; + throw err; + } + } else { + if (V?.[Symbol.toStringTag] !== I.prototype[Symbol.toStringTag]) { + const err = new TypeError("Illegal invocation"); + err.code = "ERR_INVALID_THIS"; + throw err; + } + } + }; + webidl.argumentLengthCheck = function({ length }, min, ctx) { + if (length < min) { + throw webidl.errors.exception({ + message: `${min} argument${min !== 1 ? "s" : ""} required, but${length ? " only" : ""} ${length} found.`, + header: ctx + }); + } + }; + webidl.illegalConstructor = function() { + throw webidl.errors.exception({ + header: "TypeError", + message: "Illegal constructor" + }); + }; + webidl.util.Type = function(V) { + switch (typeof V) { + case "undefined": + return "Undefined"; + case "boolean": + return "Boolean"; + case "string": + return "String"; + case "symbol": + return "Symbol"; + case "number": + return "Number"; + case "bigint": + return "BigInt"; + case "function": + case "object": { + if (V === null) { + return "Null"; } - d = options.lastModified; + return "Object"; } - super(processBlobParts(fileBits, options), { type: t }); - this[kState] = { - name: n, - lastModified: d, - type: t - }; } - get name() { - webidl.brandCheck(this, File); - return this[kState].name; + }; + webidl.util.markAsUncloneable = markAsUncloneable || (() => { + }); + webidl.util.ConvertToInt = function(V, bitLength, signedness, opts) { + let upperBound; + let lowerBound; + if (bitLength === 64) { + upperBound = Math.pow(2, 53) - 1; + if (signedness === "unsigned") { + lowerBound = 0; + } else { + lowerBound = Math.pow(-2, 53) + 1; + } + } else if (signedness === "unsigned") { + lowerBound = 0; + upperBound = Math.pow(2, bitLength) - 1; + } else { + lowerBound = Math.pow(-2, bitLength) - 1; + upperBound = Math.pow(2, bitLength - 1) - 1; + } + let x = Number(V); + if (x === 0) { + x = 0; + } + if (opts?.enforceRange === true) { + if (Number.isNaN(x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { + throw webidl.errors.exception({ + header: "Integer conversion", + message: `Could not convert ${webidl.util.Stringify(V)} to an integer.` + }); + } + x = webidl.util.IntegerPart(x); + if (x < lowerBound || x > upperBound) { + throw webidl.errors.exception({ + header: "Integer conversion", + message: `Value must be between ${lowerBound}-${upperBound}, got ${x}.` + }); + } + return x; + } + if (!Number.isNaN(x) && opts?.clamp === true) { + x = Math.min(Math.max(x, lowerBound), upperBound); + if (Math.floor(x) % 2 === 0) { + x = Math.floor(x); + } else { + x = Math.ceil(x); + } + return x; } - get lastModified() { - webidl.brandCheck(this, File); - return this[kState].lastModified; + if (Number.isNaN(x) || x === 0 && Object.is(0, x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { + return 0; } - get type() { - webidl.brandCheck(this, File); - return this[kState].type; + x = webidl.util.IntegerPart(x); + x = x % Math.pow(2, bitLength); + if (signedness === "signed" && x >= Math.pow(2, bitLength) - 1) { + return x - Math.pow(2, bitLength); } - } - class FileLike { - constructor(blobLike, fileName, options = {}) { - const n = fileName; - const t = options.type; - const d = options.lastModified ?? Date.now(); - this[kState] = { - blobLike, - name: n, - type: t, - lastModified: d - }; + return x; + }; + webidl.util.IntegerPart = function(n) { + const r = Math.floor(Math.abs(n)); + if (n < 0) { + return -1 * r; } - stream(...args) { - webidl.brandCheck(this, FileLike); - return this[kState].blobLike.stream(...args); + return r; + }; + webidl.util.Stringify = function(V) { + const type = webidl.util.Type(V); + switch (type) { + case "Symbol": + return `Symbol(${V.description})`; + case "Object": + return inspect(V); + case "String": + return `"${V}"`; + default: + return `${V}`; } - arrayBuffer(...args) { - webidl.brandCheck(this, FileLike); - return this[kState].blobLike.arrayBuffer(...args); + }; + webidl.sequenceConverter = function(converter) { + return (V, prefix, argument, Iterable) => { + if (webidl.util.Type(V) !== "Object") { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} (${webidl.util.Stringify(V)}) is not iterable.` + }); + } + const method = typeof Iterable === "function" ? Iterable() : V?.[Symbol.iterator]?.(); + const seq = []; + let index = 0; + if (method === void 0 || typeof method.next !== "function") { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} is not iterable.` + }); + } + while (true) { + const { done, value } = method.next(); + if (done) { + break; + } + seq.push(converter(value, prefix, `${argument}[${index++}]`)); + } + return seq; + }; + }; + webidl.recordConverter = function(keyConverter, valueConverter) { + return (O, prefix, argument) => { + if (webidl.util.Type(O) !== "Object") { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} ("${webidl.util.Type(O)}") is not an Object.` + }); + } + const result = {}; + if (!types.isProxy(O)) { + const keys2 = [...Object.getOwnPropertyNames(O), ...Object.getOwnPropertySymbols(O)]; + for (const key of keys2) { + const typedKey = keyConverter(key, prefix, argument); + const typedValue = valueConverter(O[key], prefix, argument); + result[typedKey] = typedValue; + } + return result; + } + const keys = Reflect.ownKeys(O); + for (const key of keys) { + const desc = Reflect.getOwnPropertyDescriptor(O, key); + if (desc?.enumerable) { + const typedKey = keyConverter(key, prefix, argument); + const typedValue = valueConverter(O[key], prefix, argument); + result[typedKey] = typedValue; + } + } + return result; + }; + }; + webidl.interfaceConverter = function(i) { + return (V, prefix, argument, opts) => { + if (opts?.strict !== false && !(V instanceof i)) { + throw webidl.errors.exception({ + header: prefix, + message: `Expected ${argument} ("${webidl.util.Stringify(V)}") to be an instance of ${i.name}.` + }); + } + return V; + }; + }; + webidl.dictionaryConverter = function(converters) { + return (dictionary, prefix, argument) => { + const type = webidl.util.Type(dictionary); + const dict = {}; + if (type === "Null" || type === "Undefined") { + return dict; + } else if (type !== "Object") { + throw webidl.errors.exception({ + header: prefix, + message: `Expected ${dictionary} to be one of: Null, Undefined, Object.` + }); + } + for (const options of converters) { + const { key, defaultValue, required, converter } = options; + if (required === true) { + if (!Object.hasOwn(dictionary, key)) { + throw webidl.errors.exception({ + header: prefix, + message: `Missing required key "${key}".` + }); + } + } + let value = dictionary[key]; + const hasDefault = Object.hasOwn(options, "defaultValue"); + if (hasDefault && value !== null) { + value ??= defaultValue(); + } + if (required || hasDefault || value !== void 0) { + value = converter(value, prefix, `${argument}.${key}`); + if (options.allowedValues && !options.allowedValues.includes(value)) { + throw webidl.errors.exception({ + header: prefix, + message: `${value} is not an accepted type. Expected one of ${options.allowedValues.join(", ")}.` + }); + } + dict[key] = value; + } + } + return dict; + }; + }; + webidl.nullableConverter = function(converter) { + return (V, prefix, argument) => { + if (V === null) { + return V; + } + return converter(V, prefix, argument); + }; + }; + webidl.converters.DOMString = function(V, prefix, argument, opts) { + if (V === null && opts?.legacyNullToEmptyString) { + return ""; } - slice(...args) { - webidl.brandCheck(this, FileLike); - return this[kState].blobLike.slice(...args); + if (typeof V === "symbol") { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} is a symbol, which cannot be converted to a DOMString.` + }); } - text(...args) { - webidl.brandCheck(this, FileLike); - return this[kState].blobLike.text(...args); + return String(V); + }; + webidl.converters.ByteString = function(V, prefix, argument) { + const x = webidl.converters.DOMString(V, prefix, argument); + for (let index = 0; index < x.length; index++) { + if (x.charCodeAt(index) > 255) { + throw new TypeError( + `Cannot convert argument to a ByteString because the character at index ${index} has a value of ${x.charCodeAt(index)} which is greater than 255.` + ); + } } - get size() { - webidl.brandCheck(this, FileLike); - return this[kState].blobLike.size; + return x; + }; + webidl.converters.USVString = toUSVString; + webidl.converters.boolean = function(V) { + const x = Boolean(V); + return x; + }; + webidl.converters.any = function(V) { + return V; + }; + webidl.converters["long long"] = function(V, prefix, argument) { + const x = webidl.util.ConvertToInt(V, 64, "signed", void 0, prefix, argument); + return x; + }; + webidl.converters["unsigned long long"] = function(V, prefix, argument) { + const x = webidl.util.ConvertToInt(V, 64, "unsigned", void 0, prefix, argument); + return x; + }; + webidl.converters["unsigned long"] = function(V, prefix, argument) { + const x = webidl.util.ConvertToInt(V, 32, "unsigned", void 0, prefix, argument); + return x; + }; + webidl.converters["unsigned short"] = function(V, prefix, argument, opts) { + const x = webidl.util.ConvertToInt(V, 16, "unsigned", opts, prefix, argument); + return x; + }; + webidl.converters.ArrayBuffer = function(V, prefix, argument, opts) { + if (webidl.util.Type(V) !== "Object" || !types.isAnyArrayBuffer(V)) { + throw webidl.errors.conversionFailed({ + prefix, + argument: `${argument} ("${webidl.util.Stringify(V)}")`, + types: ["ArrayBuffer"] + }); } - get type() { - webidl.brandCheck(this, FileLike); - return this[kState].blobLike.type; + if (opts?.allowShared === false && types.isSharedArrayBuffer(V)) { + throw webidl.errors.exception({ + header: "ArrayBuffer", + message: "SharedArrayBuffer is not allowed." + }); } - get name() { - webidl.brandCheck(this, FileLike); - return this[kState].name; + if (V.resizable || V.growable) { + throw webidl.errors.exception({ + header: "ArrayBuffer", + message: "Received a resizable ArrayBuffer." + }); } - get lastModified() { - webidl.brandCheck(this, FileLike); - return this[kState].lastModified; + return V; + }; + webidl.converters.TypedArray = function(V, T, prefix, name, opts) { + if (webidl.util.Type(V) !== "Object" || !types.isTypedArray(V) || V.constructor.name !== T.name) { + throw webidl.errors.conversionFailed({ + prefix, + argument: `${name} ("${webidl.util.Stringify(V)}")`, + types: [T.name] + }); } - get [Symbol.toStringTag]() { - return "File"; + if (opts?.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { + throw webidl.errors.exception({ + header: "ArrayBuffer", + message: "SharedArrayBuffer is not allowed." + }); } - } - Object.defineProperties(File.prototype, { - [Symbol.toStringTag]: { - value: "File", - configurable: true - }, - name: kEnumerableProperty, - lastModified: kEnumerableProperty - }); - webidl.converters.Blob = webidl.interfaceConverter(Blob2); - webidl.converters.BlobPart = function(V, opts) { - if (webidl.util.Type(V) === "Object") { - if (isBlobLike(V)) { - return webidl.converters.Blob(V, { strict: false }); - } - if (ArrayBuffer.isView(V) || types.isAnyArrayBuffer(V)) { - return webidl.converters.BufferSource(V, opts); - } + if (V.buffer.resizable || V.buffer.growable) { + throw webidl.errors.exception({ + header: "ArrayBuffer", + message: "Received a resizable ArrayBuffer." + }); } - return webidl.converters.USVString(V, opts); + return V; }; - webidl.converters["sequence"] = webidl.sequenceConverter( - webidl.converters.BlobPart - ); - webidl.converters.FilePropertyBag = webidl.dictionaryConverter([ - { - key: "lastModified", - converter: webidl.converters["long long"], - get defaultValue() { - return Date.now(); - } - }, - { - key: "type", - converter: webidl.converters.DOMString, - defaultValue: "" - }, - { - key: "endings", - converter: (value) => { - value = webidl.converters.DOMString(value); - value = value.toLowerCase(); - if (value !== "native") { - value = "transparent"; - } - return value; - }, - defaultValue: "transparent" + webidl.converters.DataView = function(V, prefix, name, opts) { + if (webidl.util.Type(V) !== "Object" || !types.isDataView(V)) { + throw webidl.errors.exception({ + header: prefix, + message: `${name} is not a DataView.` + }); + } + if (opts?.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { + throw webidl.errors.exception({ + header: "ArrayBuffer", + message: "SharedArrayBuffer is not allowed." + }); } - ]); - function processBlobParts(parts, options) { - const bytes = []; - for (const element of parts) { - if (typeof element === "string") { - let s = element; - if (options.endings === "native") { - s = convertLineEndingsNative(s); - } - bytes.push(encoder.encode(s)); - } else if (types.isAnyArrayBuffer(element) || types.isTypedArray(element)) { - if (!element.buffer) { - bytes.push(new Uint8Array(element)); - } else { - bytes.push( - new Uint8Array(element.buffer, element.byteOffset, element.byteLength) - ); - } - } else if (isBlobLike(element)) { - bytes.push(element); - } + if (V.buffer.resizable || V.buffer.growable) { + throw webidl.errors.exception({ + header: "ArrayBuffer", + message: "Received a resizable ArrayBuffer." + }); } - return bytes; - } - function convertLineEndingsNative(s) { - let nativeLineEnding = "\n"; - if (process.platform === "win32") { - nativeLineEnding = "\r\n"; + return V; + }; + webidl.converters.BufferSource = function(V, prefix, name, opts) { + if (types.isAnyArrayBuffer(V)) { + return webidl.converters.ArrayBuffer(V, prefix, name, { ...opts, allowShared: false }); } - return s.replace(/\r?\n/g, nativeLineEnding); + if (types.isTypedArray(V)) { + return webidl.converters.TypedArray(V, V.constructor, prefix, name, { ...opts, allowShared: false }); + } + if (types.isDataView(V)) { + return webidl.converters.DataView(V, prefix, name, { ...opts, allowShared: false }); + } + throw webidl.errors.conversionFailed({ + prefix, + argument: `${name} ("${webidl.util.Stringify(V)}")`, + types: ["BufferSource"] + }); + }; + webidl.converters["sequence"] = webidl.sequenceConverter( + webidl.converters.ByteString + ); + webidl.converters["sequence>"] = webidl.sequenceConverter( + webidl.converters["sequence"] + ); + webidl.converters["record"] = webidl.recordConverter( + webidl.converters.ByteString, + webidl.converters.ByteString + ); + webidl_1$1 = { + webidl + }; + return webidl_1$1; +} +var util$d; +var hasRequiredUtil$d; +function requireUtil$d() { + if (hasRequiredUtil$d) return util$d; + hasRequiredUtil$d = 1; + const { Transform } = require$$0$6; + const zlib = require$$1$4; + const { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = requireConstants$7(); + const { getGlobalOrigin } = requireGlobal$3(); + const { collectASequenceOfCodePoints, collectAnHTTPQuotedString, removeChars, parseMIMEType } = requireDataUrl(); + const { performance: performance2 } = require$$5$1; + const { isBlobLike, ReadableStreamFrom, isValidHTTPToken, normalizedMethodRecordsBase } = requireUtil$e(); + const assert = require$$0$5; + const { isUint8Array } = require$$8; + const { webidl } = requireWebidl$1(); + let supportedHashes = []; + let crypto; + try { + crypto = require("node:crypto"); + const possibleRelevantHashes = ["sha256", "sha384", "sha512"]; + supportedHashes = crypto.getHashes().filter((hash) => possibleRelevantHashes.includes(hash)); + } catch { } - function isFileLike(object) { - return NativeFile && object instanceof NativeFile || object instanceof File || object && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && object[Symbol.toStringTag] === "File"; + function responseURL(response2) { + const urlList = response2.urlList; + const length = urlList.length; + return length === 0 ? null : urlList[length - 1].toString(); } - file = { File, FileLike, isFileLike }; - return file; -} -var formdata; -var hasRequiredFormdata; -function requireFormdata() { - if (hasRequiredFormdata) return formdata; - hasRequiredFormdata = 1; - const { isBlobLike, toUSVString, makeIterator } = requireUtil$5(); - const { kState } = requireSymbols$3(); - const { File: UndiciFile, FileLike, isFileLike } = requireFile(); - const { webidl } = requireWebidl(); - const { Blob: Blob2, File: NativeFile } = require$$7; - const File = NativeFile ?? UndiciFile; - class FormData { - constructor(form) { - if (form !== void 0) { - throw webidl.errors.conversionFailed({ - prefix: "FormData constructor", - argument: "Argument 1", - types: ["undefined"] - }); - } - this[kState] = []; + function responseLocationURL(response2, requestFragment) { + if (!redirectStatusSet.has(response2.status)) { + return null; } - append(name, value, filename = void 0) { - webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 2, { header: "FormData.append" }); - if (arguments.length === 3 && !isBlobLike(value)) { - throw new TypeError( - "Failed to execute 'append' on 'FormData': parameter 2 is not of type 'Blob'" - ); + let location = response2.headersList.get("location", true); + if (location !== null && isValidHeaderValue(location)) { + if (!isValidEncodedURL(location)) { + location = normalizeBinaryStringToUtf8(location); } - name = webidl.converters.USVString(name); - value = isBlobLike(value) ? webidl.converters.Blob(value, { strict: false }) : webidl.converters.USVString(value); - filename = arguments.length === 3 ? webidl.converters.USVString(filename) : void 0; - const entry = makeEntry(name, value, filename); - this[kState].push(entry); + location = new URL(location, responseURL(response2)); } - delete(name) { - webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.delete" }); - name = webidl.converters.USVString(name); - this[kState] = this[kState].filter((entry) => entry.name !== name); + if (location && !location.hash) { + location.hash = requestFragment; } - get(name) { - webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.get" }); - name = webidl.converters.USVString(name); - const idx = this[kState].findIndex((entry) => entry.name === name); - if (idx === -1) { - return null; + return location; + } + function isValidEncodedURL(url) { + for (let i = 0; i < url.length; ++i) { + const code = url.charCodeAt(i); + if (code > 126 || // Non-US-ASCII + DEL + code < 32) { + return false; } - return this[kState][idx].value; - } - getAll(name) { - webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.getAll" }); - name = webidl.converters.USVString(name); - return this[kState].filter((entry) => entry.name === name).map((entry) => entry.value); } - has(name) { - webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.has" }); - name = webidl.converters.USVString(name); - return this[kState].findIndex((entry) => entry.name === name) !== -1; + return true; + } + function normalizeBinaryStringToUtf8(value) { + return Buffer.from(value, "binary").toString("utf8"); + } + function requestCurrentURL(request2) { + return request2.urlList[request2.urlList.length - 1]; + } + function requestBadPort(request2) { + const url = requestCurrentURL(request2); + if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) { + return "blocked"; } - set(name, value, filename = void 0) { - webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 2, { header: "FormData.set" }); - if (arguments.length === 3 && !isBlobLike(value)) { - throw new TypeError( - "Failed to execute 'set' on 'FormData': parameter 2 is not of type 'Blob'" - ); - } - name = webidl.converters.USVString(name); - value = isBlobLike(value) ? webidl.converters.Blob(value, { strict: false }) : webidl.converters.USVString(value); - filename = arguments.length === 3 ? toUSVString(filename) : void 0; - const entry = makeEntry(name, value, filename); - const idx = this[kState].findIndex((entry2) => entry2.name === name); - if (idx !== -1) { - this[kState] = [ - ...this[kState].slice(0, idx), - entry, - ...this[kState].slice(idx + 1).filter((entry2) => entry2.name !== name) - ]; - } else { - this[kState].push(entry); + return "allowed"; + } + function isErrorLike(object) { + return object instanceof Error || (object?.constructor?.name === "Error" || object?.constructor?.name === "DOMException"); + } + function isValidReasonPhrase(statusText) { + for (let i = 0; i < statusText.length; ++i) { + const c = statusText.charCodeAt(i); + if (!(c === 9 || // HTAB + c >= 32 && c <= 126 || // SP / VCHAR + c >= 128 && c <= 255)) { + return false; } } - entries() { - webidl.brandCheck(this, FormData); - return makeIterator( - () => this[kState].map((pair) => [pair.name, pair.value]), - "FormData", - "key+value" - ); + return true; + } + const isValidHeaderName = isValidHTTPToken; + function isValidHeaderValue(potentialValue) { + return (potentialValue[0] === " " || potentialValue[0] === " " || potentialValue[potentialValue.length - 1] === " " || potentialValue[potentialValue.length - 1] === " " || potentialValue.includes("\n") || potentialValue.includes("\r") || potentialValue.includes("\0")) === false; + } + function setRequestReferrerPolicyOnRedirect(request2, actualResponse) { + const { headersList } = actualResponse; + const policyHeader = (headersList.get("referrer-policy", true) ?? "").split(","); + let policy = ""; + if (policyHeader.length > 0) { + for (let i = policyHeader.length; i !== 0; i--) { + const token = policyHeader[i - 1].trim(); + if (referrerPolicyTokens.has(token)) { + policy = token; + break; + } + } } - keys() { - webidl.brandCheck(this, FormData); - return makeIterator( - () => this[kState].map((pair) => [pair.name, pair.value]), - "FormData", - "key" - ); + if (policy !== "") { + request2.referrerPolicy = policy; } - values() { - webidl.brandCheck(this, FormData); - return makeIterator( - () => this[kState].map((pair) => [pair.name, pair.value]), - "FormData", - "value" - ); + } + function crossOriginResourcePolicyCheck() { + return "allowed"; + } + function corsCheck() { + return "success"; + } + function TAOCheck() { + return "success"; + } + function appendFetchMetadata(httpRequest) { + let header = null; + header = httpRequest.mode; + httpRequest.headersList.set("sec-fetch-mode", header, true); + } + function appendRequestOriginHeader(request2) { + let serializedOrigin = request2.origin; + if (serializedOrigin === "client" || serializedOrigin === void 0) { + return; } - /** - * @param {(value: string, key: string, self: FormData) => void} callbackFn - * @param {unknown} thisArg - */ - forEach(callbackFn, thisArg = globalThis) { - webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.forEach" }); - if (typeof callbackFn !== "function") { - throw new TypeError( - "Failed to execute 'forEach' on 'FormData': parameter 1 is not of type 'Function'." - ); - } - for (const [key, value] of this) { - callbackFn.apply(thisArg, [value, key, this]); + if (request2.responseTainting === "cors" || request2.mode === "websocket") { + request2.headersList.append("origin", serializedOrigin, true); + } else if (request2.method !== "GET" && request2.method !== "HEAD") { + switch (request2.referrerPolicy) { + case "no-referrer": + serializedOrigin = null; + break; + case "no-referrer-when-downgrade": + case "strict-origin": + case "strict-origin-when-cross-origin": + if (request2.origin && urlHasHttpsScheme(request2.origin) && !urlHasHttpsScheme(requestCurrentURL(request2))) { + serializedOrigin = null; + } + break; + case "same-origin": + if (!sameOrigin(request2, requestCurrentURL(request2))) { + serializedOrigin = null; + } + break; } + request2.headersList.append("origin", serializedOrigin, true); } } - FormData.prototype[Symbol.iterator] = FormData.prototype.entries; - Object.defineProperties(FormData.prototype, { - [Symbol.toStringTag]: { - value: "FormData", - configurable: true - } - }); - function makeEntry(name, value, filename) { - name = Buffer.from(name).toString("utf8"); - if (typeof value === "string") { - value = Buffer.from(value).toString("utf8"); - } else { - if (!isFileLike(value)) { - value = value instanceof Blob2 ? new File([value], "blob", { type: value.type }) : new FileLike(value, "blob", { type: value.type }); - } - if (filename !== void 0) { - const options = { - type: value.type, - lastModified: value.lastModified - }; - value = NativeFile && value instanceof NativeFile || value instanceof UndiciFile ? new File([value], filename, options) : new FileLike(value, filename, options); - } + function coarsenTime(timestamp, crossOriginIsolatedCapability) { + return timestamp; + } + function clampAndCoarsenConnectionTimingInfo(connectionTimingInfo, defaultStartTime, crossOriginIsolatedCapability) { + if (!connectionTimingInfo?.startTime || connectionTimingInfo.startTime < defaultStartTime) { + return { + domainLookupStartTime: defaultStartTime, + domainLookupEndTime: defaultStartTime, + connectionStartTime: defaultStartTime, + connectionEndTime: defaultStartTime, + secureConnectionStartTime: defaultStartTime, + ALPNNegotiatedProtocol: connectionTimingInfo?.ALPNNegotiatedProtocol + }; } - return { name, value }; + return { + domainLookupStartTime: coarsenTime(connectionTimingInfo.domainLookupStartTime), + domainLookupEndTime: coarsenTime(connectionTimingInfo.domainLookupEndTime), + connectionStartTime: coarsenTime(connectionTimingInfo.connectionStartTime), + connectionEndTime: coarsenTime(connectionTimingInfo.connectionEndTime), + secureConnectionStartTime: coarsenTime(connectionTimingInfo.secureConnectionStartTime), + ALPNNegotiatedProtocol: connectionTimingInfo.ALPNNegotiatedProtocol + }; } - formdata = { FormData }; - return formdata; -} -var body; -var hasRequiredBody; -function requireBody() { - if (hasRequiredBody) return body; - hasRequiredBody = 1; - const Busboy = requireMain(); - const util2 = requireUtil$6(); - const { - ReadableStreamFrom, - isBlobLike, - isReadableStreamLike, - readableStreamClose, - createDeferredPromise, - fullyReadBody - } = requireUtil$5(); - const { FormData } = requireFormdata(); - const { kState } = requireSymbols$3(); - const { webidl } = requireWebidl(); - const { DOMException: DOMException2, structuredClone } = requireConstants$3(); - const { Blob: Blob2, File: NativeFile } = require$$7; - const { kBodyUsed } = requireSymbols$4(); - const assert = require$$0$3; - const { isErrored } = requireUtil$6(); - const { isUint8Array, isArrayBuffer } = require$$5; - const { File: UndiciFile } = requireFile(); - const { parseMIMEType, serializeAMimeType } = requireDataURL(); - let random; - try { - const crypto = require("node:crypto"); - random = (max) => crypto.randomInt(0, max); - } catch { - random = (max) => Math.floor(Math.random(max)); + function coarsenedSharedCurrentTime(crossOriginIsolatedCapability) { + return coarsenTime(performance2.now()); } - let ReadableStream = globalThis.ReadableStream; - const File = NativeFile ?? UndiciFile; - const textEncoder = new TextEncoder(); - const textDecoder = new TextDecoder(); - function extractBody(object, keepalive = false) { - if (!ReadableStream) { - ReadableStream = require$$14.ReadableStream; + function createOpaqueTimingInfo(timingInfo) { + return { + startTime: timingInfo.startTime ?? 0, + redirectStartTime: 0, + redirectEndTime: 0, + postRedirectStartTime: timingInfo.startTime ?? 0, + finalServiceWorkerStartTime: 0, + finalNetworkResponseStartTime: 0, + finalNetworkRequestStartTime: 0, + endTime: 0, + encodedBodySize: 0, + decodedBodySize: 0, + finalConnectionTimingInfo: null + }; + } + function makePolicyContainer() { + return { + referrerPolicy: "strict-origin-when-cross-origin" + }; + } + function clonePolicyContainer(policyContainer) { + return { + referrerPolicy: policyContainer.referrerPolicy + }; + } + function determineRequestsReferrer(request2) { + const policy = request2.referrerPolicy; + assert(policy); + let referrerSource = null; + if (request2.referrer === "client") { + const globalOrigin = getGlobalOrigin(); + if (!globalOrigin || globalOrigin.origin === "null") { + return "no-referrer"; + } + referrerSource = new URL(globalOrigin); + } else if (request2.referrer instanceof URL) { + referrerSource = request2.referrer; } - let stream = null; - if (object instanceof ReadableStream) { - stream = object; - } else if (isBlobLike(object)) { - stream = object.stream(); - } else { - stream = new ReadableStream({ - async pull(controller) { - controller.enqueue( - typeof source === "string" ? textEncoder.encode(source) : source - ); - queueMicrotask(() => readableStreamClose(controller)); - }, - start() { - }, - type: void 0 - }); + let referrerURL = stripURLForReferrer(referrerSource); + const referrerOrigin = stripURLForReferrer(referrerSource, true); + if (referrerURL.toString().length > 4096) { + referrerURL = referrerOrigin; } - assert(isReadableStreamLike(stream)); - let action = null; - let source = null; - let length = null; - let type = null; - if (typeof object === "string") { - source = object; - type = "text/plain;charset=UTF-8"; - } else if (object instanceof URLSearchParams) { - source = object.toString(); - type = "application/x-www-form-urlencoded;charset=UTF-8"; - } else if (isArrayBuffer(object)) { - source = new Uint8Array(object.slice()); - } else if (ArrayBuffer.isView(object)) { - source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength)); - } else if (util2.isFormDataLike(object)) { - const boundary = `----formdata-undici-0${`${random(1e11)}`.padStart(11, "0")}`; - const prefix = `--${boundary}\r -Content-Disposition: form-data`; - const escape = (str) => str.replace(/\n/g, "%0A").replace(/\r/g, "%0D").replace(/"/g, "%22"); - const normalizeLinefeeds = (value) => value.replace(/\r?\n|\r/g, "\r\n"); - const blobParts = []; - const rn = new Uint8Array([13, 10]); - length = 0; - let hasUnknownSizeValue = false; - for (const [name, value] of object) { - if (typeof value === "string") { - const chunk2 = textEncoder.encode(prefix + `; name="${escape(normalizeLinefeeds(name))}"\r -\r -${normalizeLinefeeds(value)}\r -`); - blobParts.push(chunk2); - length += chunk2.byteLength; - } else { - const chunk2 = textEncoder.encode(`${prefix}; name="${escape(normalizeLinefeeds(name))}"` + (value.name ? `; filename="${escape(value.name)}"` : "") + `\r -Content-Type: ${value.type || "application/octet-stream"}\r -\r -`); - blobParts.push(chunk2, value, rn); - if (typeof value.size === "number") { - length += chunk2.byteLength + value.size + rn.byteLength; - } else { - hasUnknownSizeValue = true; - } + const areSameOrigin = sameOrigin(request2, referrerURL); + const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(request2.url); + switch (policy) { + case "origin": + return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true); + case "unsafe-url": + return referrerURL; + case "same-origin": + return areSameOrigin ? referrerOrigin : "no-referrer"; + case "origin-when-cross-origin": + return areSameOrigin ? referrerURL : referrerOrigin; + case "strict-origin-when-cross-origin": { + const currentURL = requestCurrentURL(request2); + if (sameOrigin(referrerURL, currentURL)) { + return referrerURL; } - } - const chunk = textEncoder.encode(`--${boundary}--`); - blobParts.push(chunk); - length += chunk.byteLength; - if (hasUnknownSizeValue) { - length = null; - } - source = object; - action = async function* () { - for (const part of blobParts) { - if (part.stream) { - yield* part.stream(); - } else { - yield part; - } + if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { + return "no-referrer"; } - }; - type = "multipart/form-data; boundary=" + boundary; - } else if (isBlobLike(object)) { - source = object; - length = object.size; - if (object.type) { - type = object.type; - } - } else if (typeof object[Symbol.asyncIterator] === "function") { - if (keepalive) { - throw new TypeError("keepalive"); - } - if (util2.isDisturbed(object) || object.locked) { - throw new TypeError( - "Response body object should not be disturbed or locked" - ); + return referrerOrigin; } - stream = object instanceof ReadableStream ? object : ReadableStreamFrom(object); - } - if (typeof source === "string" || util2.isBuffer(source)) { - length = Buffer.byteLength(source); - } - if (action != null) { - let iterator2; - stream = new ReadableStream({ - async start() { - iterator2 = action(object)[Symbol.asyncIterator](); - }, - async pull(controller) { - const { value, done } = await iterator2.next(); - if (done) { - queueMicrotask(() => { - controller.close(); - }); - } else { - if (!isErrored(stream)) { - controller.enqueue(new Uint8Array(value)); - } - } - return controller.desiredSize > 0; - }, - async cancel(reason) { - await iterator2.return(); - }, - type: void 0 - }); + case "strict-origin": + // eslint-disable-line + /** + * 1. If referrerURL is a potentially trustworthy URL and + * request’s current URL is not a potentially trustworthy URL, + * then return no referrer. + * 2. Return referrerOrigin + */ + case "no-referrer-when-downgrade": + // eslint-disable-line + /** + * 1. If referrerURL is a potentially trustworthy URL and + * request’s current URL is not a potentially trustworthy URL, + * then return no referrer. + * 2. Return referrerOrigin + */ + default: + return isNonPotentiallyTrustWorthy ? "no-referrer" : referrerOrigin; } - const body2 = { stream, source, length }; - return [body2, type]; } - function safelyExtractBody(object, keepalive = false) { - if (!ReadableStream) { - ReadableStream = require$$14.ReadableStream; + function stripURLForReferrer(url, originOnly) { + assert(url instanceof URL); + url = new URL(url); + if (url.protocol === "file:" || url.protocol === "about:" || url.protocol === "blank:") { + return "no-referrer"; } - if (object instanceof ReadableStream) { - assert(!util2.isDisturbed(object), "The body has already been consumed."); - assert(!object.locked, "The stream is locked."); + url.username = ""; + url.password = ""; + url.hash = ""; + if (originOnly) { + url.pathname = ""; + url.search = ""; } - return extractBody(object, keepalive); + return url; } - function cloneBody(body2) { - const [out1, out2] = body2.stream.tee(); - const out2Clone = structuredClone(out2, { transfer: [out2] }); - const [, finalClone] = out2Clone.tee(); - body2.stream = out1; - return { - stream: finalClone, - length: body2.length, - source: body2.source - }; + function isURLPotentiallyTrustworthy(url) { + if (!(url instanceof URL)) { + return false; + } + if (url.href === "about:blank" || url.href === "about:srcdoc") { + return true; + } + if (url.protocol === "data:") return true; + if (url.protocol === "file:") return true; + return isOriginPotentiallyTrustworthy(url.origin); + function isOriginPotentiallyTrustworthy(origin) { + if (origin == null || origin === "null") return false; + const originAsURL = new URL(origin); + if (originAsURL.protocol === "https:" || originAsURL.protocol === "wss:") { + return true; + } + if (/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(originAsURL.hostname) || (originAsURL.hostname === "localhost" || originAsURL.hostname.includes("localhost.")) || originAsURL.hostname.endsWith(".localhost")) { + return true; + } + return false; + } } - async function* consumeBody(body2) { - if (body2) { - if (isUint8Array(body2)) { - yield body2; - } else { - const stream = body2.stream; - if (util2.isDisturbed(stream)) { - throw new TypeError("The body has already been consumed."); - } - if (stream.locked) { - throw new TypeError("The stream is locked."); + function bytesMatch(bytes, metadataList) { + if (crypto === void 0) { + return true; + } + const parsedMetadata = parseMetadata(metadataList); + if (parsedMetadata === "no metadata") { + return true; + } + if (parsedMetadata.length === 0) { + return true; + } + const strongest = getStrongestMetadata(parsedMetadata); + const metadata = filterMetadataListByAlgorithm(parsedMetadata, strongest); + for (const item of metadata) { + const algorithm = item.algo; + const expectedValue = item.hash; + let actualValue = crypto.createHash(algorithm).update(bytes).digest("base64"); + if (actualValue[actualValue.length - 1] === "=") { + if (actualValue[actualValue.length - 2] === "=") { + actualValue = actualValue.slice(0, -2); + } else { + actualValue = actualValue.slice(0, -1); } - stream[kBodyUsed] = true; - yield* stream; + } + if (compareBase64Mixed(actualValue, expectedValue)) { + return true; } } + return false; } - function throwIfAborted(state) { - if (state.aborted) { - throw new DOMException2("The operation was aborted.", "AbortError"); + const parseHashWithOptions = /(?sha256|sha384|sha512)-((?[A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i; + function parseMetadata(metadata) { + const result = []; + let empty = true; + for (const token of metadata.split(" ")) { + empty = false; + const parsedToken = parseHashWithOptions.exec(token); + if (parsedToken === null || parsedToken.groups === void 0 || parsedToken.groups.algo === void 0) { + continue; + } + const algorithm = parsedToken.groups.algo.toLowerCase(); + if (supportedHashes.includes(algorithm)) { + result.push(parsedToken.groups); + } + } + if (empty === true) { + return "no metadata"; } + return result; } - function bodyMixinMethods(instance) { - const methods = { - blob() { - return specConsumeBody(this, (bytes) => { - let mimeType = bodyMimeType(this); - if (mimeType === "failure") { - mimeType = ""; - } else if (mimeType) { - mimeType = serializeAMimeType(mimeType); - } - return new Blob2([bytes], { type: mimeType }); - }, instance); - }, - arrayBuffer() { - return specConsumeBody(this, (bytes) => { - return new Uint8Array(bytes).buffer; - }, instance); - }, - text() { - return specConsumeBody(this, utf8DecodeBytes, instance); - }, - json() { - return specConsumeBody(this, parseJSONFromBytes, instance); - }, - async formData() { - webidl.brandCheck(this, instance); - throwIfAborted(this[kState]); - const contentType = this.headers.get("Content-Type"); - if (/multipart\/form-data/.test(contentType)) { - const headers2 = {}; - for (const [key, value] of this.headers) headers2[key.toLowerCase()] = value; - const responseFormData = new FormData(); - let busboy; - try { - busboy = new Busboy({ - headers: headers2, - preservePath: true - }); - } catch (err) { - throw new DOMException2(`${err}`, "AbortError"); - } - busboy.on("field", (name, value) => { - responseFormData.append(name, value); - }); - busboy.on("file", (name, value, filename, encoding2, mimeType) => { - const chunks = []; - if (encoding2 === "base64" || encoding2.toLowerCase() === "base64") { - let base64chunk = ""; - value.on("data", (chunk) => { - base64chunk += chunk.toString().replace(/[\r\n]/gm, ""); - const end = base64chunk.length - base64chunk.length % 4; - chunks.push(Buffer.from(base64chunk.slice(0, end), "base64")); - base64chunk = base64chunk.slice(end); - }); - value.on("end", () => { - chunks.push(Buffer.from(base64chunk, "base64")); - responseFormData.append(name, new File(chunks, filename, { type: mimeType })); - }); - } else { - value.on("data", (chunk) => { - chunks.push(chunk); - }); - value.on("end", () => { - responseFormData.append(name, new File(chunks, filename, { type: mimeType })); - }); - } - }); - const busboyResolve = new Promise((resolve, reject) => { - busboy.on("finish", resolve); - busboy.on("error", (err) => reject(new TypeError(err))); - }); - if (this.body !== null) for await (const chunk of consumeBody(this[kState].body)) busboy.write(chunk); - busboy.end(); - await busboyResolve; - return responseFormData; - } else if (/application\/x-www-form-urlencoded/.test(contentType)) { - let entries; - try { - let text = ""; - const streamingDecoder = new TextDecoder("utf-8", { ignoreBOM: true }); - for await (const chunk of consumeBody(this[kState].body)) { - if (!isUint8Array(chunk)) { - throw new TypeError("Expected Uint8Array chunk"); - } - text += streamingDecoder.decode(chunk, { stream: true }); - } - text += streamingDecoder.decode(); - entries = new URLSearchParams(text); - } catch (err) { - throw Object.assign(new TypeError(), { cause: err }); - } - const formData = new FormData(); - for (const [name, value] of entries) { - formData.append(name, value); - } - return formData; - } else { - await Promise.resolve(); - throwIfAborted(this[kState]); - throw webidl.errors.exception({ - header: `${instance.name}.formData`, - message: "Could not parse content as FormData." - }); - } + function getStrongestMetadata(metadataList) { + let algorithm = metadataList[0].algo; + if (algorithm[3] === "5") { + return algorithm; + } + for (let i = 1; i < metadataList.length; ++i) { + const metadata = metadataList[i]; + if (metadata.algo[3] === "5") { + algorithm = "sha512"; + break; + } else if (algorithm[3] === "3") { + continue; + } else if (metadata.algo[3] === "3") { + algorithm = "sha384"; } - }; - return methods; + } + return algorithm; } - function mixinBody(prototype) { - Object.assign(prototype.prototype, bodyMixinMethods(prototype)); + function filterMetadataListByAlgorithm(metadataList, algorithm) { + if (metadataList.length === 1) { + return metadataList; + } + let pos = 0; + for (let i = 0; i < metadataList.length; ++i) { + if (metadataList[i].algo === algorithm) { + metadataList[pos++] = metadataList[i]; + } + } + metadataList.length = pos; + return metadataList; } - async function specConsumeBody(object, convertBytesToJSValue, instance) { - webidl.brandCheck(object, instance); - throwIfAborted(object[kState]); - if (bodyUnusable(object[kState].body)) { - throw new TypeError("Body is unusable"); + function compareBase64Mixed(actualValue, expectedValue) { + if (actualValue.length !== expectedValue.length) { + return false; } - const promise = createDeferredPromise(); - const errorSteps = (error) => promise.reject(error); - const successSteps = (data) => { - try { - promise.resolve(convertBytesToJSValue(data)); - } catch (e) { - errorSteps(e); + for (let i = 0; i < actualValue.length; ++i) { + if (actualValue[i] !== expectedValue[i]) { + if (actualValue[i] === "+" && expectedValue[i] === "-" || actualValue[i] === "/" && expectedValue[i] === "_") { + continue; + } + return false; } - }; - if (object[kState].body == null) { - successSteps(new Uint8Array()); - return promise.promise; } - await fullyReadBody(object[kState].body, successSteps, errorSteps); - return promise.promise; + return true; } - function bodyUnusable(body2) { - return body2 != null && (body2.stream.locked || util2.isDisturbed(body2.stream)); + function tryUpgradeRequestToAPotentiallyTrustworthyURL(request2) { } - function utf8DecodeBytes(buffer) { - if (buffer.length === 0) { - return ""; + function sameOrigin(A, B) { + if (A.origin === B.origin && A.origin === "null") { + return true; } - if (buffer[0] === 239 && buffer[1] === 187 && buffer[2] === 191) { - buffer = buffer.subarray(3); + if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) { + return true; } - const output = textDecoder.decode(buffer); - return output; + return false; } - function parseJSONFromBytes(bytes) { - return JSON.parse(utf8DecodeBytes(bytes)); + function createDeferredPromise() { + let res; + let rej; + const promise = new Promise((resolve, reject) => { + res = resolve; + rej = reject; + }); + return { promise, resolve: res, reject: rej }; } - function bodyMimeType(object) { - const { headersList } = object[kState]; - const contentType = headersList.get("content-type"); - if (contentType === null) { - return "failure"; + function isAborted(fetchParams) { + return fetchParams.controller.state === "aborted"; + } + function isCancelled(fetchParams) { + return fetchParams.controller.state === "aborted" || fetchParams.controller.state === "terminated"; + } + function normalizeMethod(method) { + return normalizedMethodRecordsBase[method.toLowerCase()] ?? method; + } + function serializeJavascriptValueToJSONString(value) { + const result = JSON.stringify(value); + if (result === void 0) { + throw new TypeError("Value is not JSON serializable"); } - return parseMIMEType(contentType); + assert(typeof result === "string"); + return result; } - body = { - extractBody, - safelyExtractBody, - cloneBody, - mixinBody - }; - return body; -} -var request$2; -var hasRequiredRequest$1; -function requireRequest$1() { - if (hasRequiredRequest$1) return request$2; - hasRequiredRequest$1 = 1; - const { - InvalidArgumentError, - NotSupportedError - } = requireErrors(); - const assert = require$$0$3; - const { kHTTP2BuildRequest, kHTTP2CopyHeaders, kHTTP1BuildRequest } = requireSymbols$4(); - const util2 = requireUtil$6(); - const tokenRegExp = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/; - const headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/; - const invalidPathRegex = /[^\u0021-\u00ff]/; - const kHandler = /* @__PURE__ */ Symbol("handler"); - const channels = {}; - let extractBody; - try { - const diagnosticsChannel = require("diagnostics_channel"); - channels.create = diagnosticsChannel.channel("undici:request:create"); - channels.bodySent = diagnosticsChannel.channel("undici:request:bodySent"); - channels.headers = diagnosticsChannel.channel("undici:request:headers"); - channels.trailers = diagnosticsChannel.channel("undici:request:trailers"); - channels.error = diagnosticsChannel.channel("undici:request:error"); - } catch { - channels.create = { hasSubscribers: false }; - channels.bodySent = { hasSubscribers: false }; - channels.headers = { hasSubscribers: false }; - channels.trailers = { hasSubscribers: false }; - channels.error = { hasSubscribers: false }; + const esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); + function createIterator(name, kInternalIterator, keyIndex = 0, valueIndex = 1) { + class FastIterableIterator { + /** @type {any} */ + #target; + /** @type {'key' | 'value' | 'key+value'} */ + #kind; + /** @type {number} */ + #index; + /** + * @see https://webidl.spec.whatwg.org/#dfn-default-iterator-object + * @param {unknown} target + * @param {'key' | 'value' | 'key+value'} kind + */ + constructor(target, kind) { + this.#target = target; + this.#kind = kind; + this.#index = 0; + } + next() { + if (typeof this !== "object" || this === null || !(#target in this)) { + throw new TypeError( + `'next' called on an object that does not implement interface ${name} Iterator.` + ); + } + const index = this.#index; + const values = this.#target[kInternalIterator]; + const len = values.length; + if (index >= len) { + return { + value: void 0, + done: true + }; + } + const { [keyIndex]: key, [valueIndex]: value } = values[index]; + this.#index = index + 1; + let result; + switch (this.#kind) { + case "key": + result = key; + break; + case "value": + result = value; + break; + case "key+value": + result = [key, value]; + break; + } + return { + value: result, + done: false + }; + } + } + delete FastIterableIterator.prototype.constructor; + Object.setPrototypeOf(FastIterableIterator.prototype, esIteratorPrototype); + Object.defineProperties(FastIterableIterator.prototype, { + [Symbol.toStringTag]: { + writable: false, + enumerable: false, + configurable: true, + value: `${name} Iterator` + }, + next: { writable: true, enumerable: true, configurable: true } + }); + return function(target, kind) { + return new FastIterableIterator(target, kind); + }; } - class Request { - constructor(origin, { - path, - method, - body: body2, - headers: headers2, - query, - idempotent, - blocking, - upgrade, - headersTimeout, - bodyTimeout, - reset, - throwOnError, - expectContinue - }, handler2) { - if (typeof path !== "string") { - throw new InvalidArgumentError("path must be a string"); - } else if (path[0] !== "/" && !(path.startsWith("http://") || path.startsWith("https://")) && method !== "CONNECT") { - throw new InvalidArgumentError("path must be an absolute URL or start with a slash"); - } else if (invalidPathRegex.exec(path) !== null) { - throw new InvalidArgumentError("invalid request path"); + function iteratorMixin(name, object, kInternalIterator, keyIndex = 0, valueIndex = 1) { + const makeIterator = createIterator(name, kInternalIterator, keyIndex, valueIndex); + const properties = { + keys: { + writable: true, + enumerable: true, + configurable: true, + value: function keys() { + webidl.brandCheck(this, object); + return makeIterator(this, "key"); + } + }, + values: { + writable: true, + enumerable: true, + configurable: true, + value: function values() { + webidl.brandCheck(this, object); + return makeIterator(this, "value"); + } + }, + entries: { + writable: true, + enumerable: true, + configurable: true, + value: function entries() { + webidl.brandCheck(this, object); + return makeIterator(this, "key+value"); + } + }, + forEach: { + writable: true, + enumerable: true, + configurable: true, + value: function forEach(callbackfn, thisArg = globalThis) { + webidl.brandCheck(this, object); + webidl.argumentLengthCheck(arguments, 1, `${name}.forEach`); + if (typeof callbackfn !== "function") { + throw new TypeError( + `Failed to execute 'forEach' on '${name}': parameter 1 is not of type 'Function'.` + ); + } + for (const { 0: key, 1: value } of makeIterator(this, "key+value")) { + callbackfn.call(thisArg, value, key, this); + } + } } - if (typeof method !== "string") { - throw new InvalidArgumentError("method must be a string"); - } else if (tokenRegExp.exec(method) === null) { - throw new InvalidArgumentError("invalid request method"); + }; + return Object.defineProperties(object.prototype, { + ...properties, + [Symbol.iterator]: { + writable: true, + enumerable: false, + configurable: true, + value: properties.entries.value } - if (upgrade && typeof upgrade !== "string") { - throw new InvalidArgumentError("upgrade must be a string"); + }); + } + async function fullyReadBody(body2, processBody, processBodyError) { + const successSteps = processBody; + const errorSteps = processBodyError; + let reader; + try { + reader = body2.stream.getReader(); + } catch (e) { + errorSteps(e); + return; + } + try { + successSteps(await readAllBytes(reader)); + } catch (e) { + errorSteps(e); + } + } + function isReadableStreamLike(stream) { + return stream instanceof ReadableStream || stream[Symbol.toStringTag] === "ReadableStream" && typeof stream.tee === "function"; + } + function readableStreamClose(controller) { + try { + controller.close(); + controller.byobRequest?.respond(0); + } catch (err) { + if (!err.message.includes("Controller is already closed") && !err.message.includes("ReadableStream is already closed")) { + throw err; } - if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) { - throw new InvalidArgumentError("invalid headersTimeout"); + } + } + const invalidIsomorphicEncodeValueRegex = /[^\x00-\xFF]/; + function isomorphicEncode(input) { + assert(!invalidIsomorphicEncodeValueRegex.test(input)); + return input; + } + async function readAllBytes(reader) { + const bytes = []; + let byteLength = 0; + while (true) { + const { done, value: chunk } = await reader.read(); + if (done) { + return Buffer.concat(bytes, byteLength); } - if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) { - throw new InvalidArgumentError("invalid bodyTimeout"); + if (!isUint8Array(chunk)) { + throw new TypeError("Received non-Uint8Array chunk"); } - if (reset != null && typeof reset !== "boolean") { - throw new InvalidArgumentError("invalid reset"); + bytes.push(chunk); + byteLength += chunk.length; + } + } + function urlIsLocal(url) { + assert("protocol" in url); + const protocol = url.protocol; + return protocol === "about:" || protocol === "blob:" || protocol === "data:"; + } + function urlHasHttpsScheme(url) { + return typeof url === "string" && url[5] === ":" && url[0] === "h" && url[1] === "t" && url[2] === "t" && url[3] === "p" && url[4] === "s" || url.protocol === "https:"; + } + function urlIsHttpHttpsScheme(url) { + assert("protocol" in url); + const protocol = url.protocol; + return protocol === "http:" || protocol === "https:"; + } + function simpleRangeHeaderValue(value, allowWhitespace) { + const data = value; + if (!data.startsWith("bytes")) { + return "failure"; + } + const position = { position: 5 }; + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === " " || char === " ", + data, + position + ); + } + if (data.charCodeAt(position.position) !== 61) { + return "failure"; + } + position.position++; + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === " " || char === " ", + data, + position + ); + } + const rangeStart = collectASequenceOfCodePoints( + (char) => { + const code = char.charCodeAt(0); + return code >= 48 && code <= 57; + }, + data, + position + ); + const rangeStartValue = rangeStart.length ? Number(rangeStart) : null; + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === " " || char === " ", + data, + position + ); + } + if (data.charCodeAt(position.position) !== 45) { + return "failure"; + } + position.position++; + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === " " || char === " ", + data, + position + ); + } + const rangeEnd = collectASequenceOfCodePoints( + (char) => { + const code = char.charCodeAt(0); + return code >= 48 && code <= 57; + }, + data, + position + ); + const rangeEndValue = rangeEnd.length ? Number(rangeEnd) : null; + if (position.position < data.length) { + return "failure"; + } + if (rangeEndValue === null && rangeStartValue === null) { + return "failure"; + } + if (rangeStartValue > rangeEndValue) { + return "failure"; + } + return { rangeStartValue, rangeEndValue }; + } + function buildContentRange(rangeStart, rangeEnd, fullLength) { + let contentRange = "bytes "; + contentRange += isomorphicEncode(`${rangeStart}`); + contentRange += "-"; + contentRange += isomorphicEncode(`${rangeEnd}`); + contentRange += "/"; + contentRange += isomorphicEncode(`${fullLength}`); + return contentRange; + } + class InflateStream extends Transform { + #zlibOptions; + /** @param {zlib.ZlibOptions} [zlibOptions] */ + constructor(zlibOptions) { + super(); + this.#zlibOptions = zlibOptions; + } + _transform(chunk, encoding2, callback) { + if (!this._inflateStream) { + if (chunk.length === 0) { + callback(); + return; + } + this._inflateStream = (chunk[0] & 15) === 8 ? zlib.createInflate(this.#zlibOptions) : zlib.createInflateRaw(this.#zlibOptions); + this._inflateStream.on("data", this.push.bind(this)); + this._inflateStream.on("end", () => this.push(null)); + this._inflateStream.on("error", (err) => this.destroy(err)); } - if (expectContinue != null && typeof expectContinue !== "boolean") { - throw new InvalidArgumentError("invalid expectContinue"); + this._inflateStream.write(chunk, encoding2, callback); + } + _final(callback) { + if (this._inflateStream) { + this._inflateStream.end(); + this._inflateStream = null; } - this.headersTimeout = headersTimeout; - this.bodyTimeout = bodyTimeout; - this.throwOnError = throwOnError === true; - this.method = method; - this.abort = null; - if (body2 == null) { - this.body = null; - } else if (util2.isStream(body2)) { - this.body = body2; - const rState = this.body._readableState; - if (!rState || !rState.autoDestroy) { - this.endHandler = function autoDestroy() { - util2.destroy(this); - }; - this.body.on("end", this.endHandler); - } - this.errorHandler = (err) => { - if (this.abort) { - this.abort(err); - } else { - this.error = err; - } - }; - this.body.on("error", this.errorHandler); - } else if (util2.isBuffer(body2)) { - this.body = body2.byteLength ? body2 : null; - } else if (ArrayBuffer.isView(body2)) { - this.body = body2.buffer.byteLength ? Buffer.from(body2.buffer, body2.byteOffset, body2.byteLength) : null; - } else if (body2 instanceof ArrayBuffer) { - this.body = body2.byteLength ? Buffer.from(body2) : null; - } else if (typeof body2 === "string") { - this.body = body2.length ? Buffer.from(body2) : null; - } else if (util2.isFormDataLike(body2) || util2.isIterable(body2) || util2.isBlobLike(body2)) { - this.body = body2; - } else { - throw new InvalidArgumentError("body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable"); + callback(); + } + } + function createInflate(zlibOptions) { + return new InflateStream(zlibOptions); + } + function extractMimeType(headers2) { + let charset = null; + let essence = null; + let mimeType = null; + const values = getDecodeSplit("content-type", headers2); + if (values === null) { + return "failure"; + } + for (const value of values) { + const temporaryMimeType = parseMIMEType(value); + if (temporaryMimeType === "failure" || temporaryMimeType.essence === "*/*") { + continue; } - this.completed = false; - this.aborted = false; - this.upgrade = upgrade || null; - this.path = query ? util2.buildURL(path, query) : path; - this.origin = origin; - this.idempotent = idempotent == null ? method === "HEAD" || method === "GET" : idempotent; - this.blocking = blocking == null ? false : blocking; - this.reset = reset == null ? null : reset; - this.host = null; - this.contentLength = null; - this.contentType = null; - this.headers = ""; - this.expectContinue = expectContinue != null ? expectContinue : false; - if (Array.isArray(headers2)) { - if (headers2.length % 2 !== 0) { - throw new InvalidArgumentError("headers array must be even"); - } - for (let i = 0; i < headers2.length; i += 2) { - processHeader(this, headers2[i], headers2[i + 1]); - } - } else if (headers2 && typeof headers2 === "object") { - const keys = Object.keys(headers2); - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; - processHeader(this, key, headers2[key]); + mimeType = temporaryMimeType; + if (mimeType.essence !== essence) { + charset = null; + if (mimeType.parameters.has("charset")) { + charset = mimeType.parameters.get("charset"); } - } else if (headers2 != null) { - throw new InvalidArgumentError("headers must be an object or an array"); + essence = mimeType.essence; + } else if (!mimeType.parameters.has("charset") && charset !== null) { + mimeType.parameters.set("charset", charset); } - if (util2.isFormDataLike(this.body)) { - if (util2.nodeMajor < 16 || util2.nodeMajor === 16 && util2.nodeMinor < 8) { - throw new InvalidArgumentError("Form-Data bodies are only supported in node v16.8 and newer."); - } - if (!extractBody) { - extractBody = requireBody().extractBody; - } - const [bodyStream, contentType] = extractBody(body2); - if (this.contentType == null) { - this.contentType = contentType; - this.headers += `content-type: ${contentType}\r -`; + } + if (mimeType == null) { + return "failure"; + } + return mimeType; + } + function gettingDecodingSplitting(value) { + const input = value; + const position = { position: 0 }; + const values = []; + let temporaryValue = ""; + while (position.position < input.length) { + temporaryValue += collectASequenceOfCodePoints( + (char) => char !== '"' && char !== ",", + input, + position + ); + if (position.position < input.length) { + if (input.charCodeAt(position.position) === 34) { + temporaryValue += collectAnHTTPQuotedString( + input, + position + ); + if (position.position < input.length) { + continue; + } + } else { + assert(input.charCodeAt(position.position) === 44); + position.position++; } - this.body = bodyStream.stream; - this.contentLength = bodyStream.length; - } else if (util2.isBlobLike(body2) && this.contentType == null && body2.type) { - this.contentType = body2.type; - this.headers += `content-type: ${body2.type}\r -`; - } - util2.validateHandler(handler2, method, upgrade); - this.servername = util2.getServerName(this.host); - this[kHandler] = handler2; - if (channels.create.hasSubscribers) { - channels.create.publish({ request: this }); } + temporaryValue = removeChars(temporaryValue, true, true, (char) => char === 9 || char === 32); + values.push(temporaryValue); + temporaryValue = ""; + } + return values; + } + function getDecodeSplit(name, list) { + const value = list.get(name, true); + if (value === null) { + return null; + } + return gettingDecodingSplitting(value); + } + const textDecoder = new TextDecoder(); + function utf8DecodeBytes(buffer) { + if (buffer.length === 0) { + return ""; + } + if (buffer[0] === 239 && buffer[1] === 187 && buffer[2] === 191) { + buffer = buffer.subarray(3); + } + const output = textDecoder.decode(buffer); + return output; + } + class EnvironmentSettingsObjectBase { + get baseUrl() { + return getGlobalOrigin(); + } + get origin() { + return this.baseUrl?.origin; + } + policyContainer = makePolicyContainer(); + } + class EnvironmentSettingsObject { + settingsObject = new EnvironmentSettingsObjectBase(); + } + const environmentSettingsObject = new EnvironmentSettingsObject(); + util$d = { + isAborted, + isCancelled, + isValidEncodedURL, + createDeferredPromise, + ReadableStreamFrom, + tryUpgradeRequestToAPotentiallyTrustworthyURL, + clampAndCoarsenConnectionTimingInfo, + coarsenedSharedCurrentTime, + determineRequestsReferrer, + makePolicyContainer, + clonePolicyContainer, + appendFetchMetadata, + appendRequestOriginHeader, + TAOCheck, + corsCheck, + crossOriginResourcePolicyCheck, + createOpaqueTimingInfo, + setRequestReferrerPolicyOnRedirect, + isValidHTTPToken, + requestBadPort, + requestCurrentURL, + responseURL, + responseLocationURL, + isBlobLike, + isURLPotentiallyTrustworthy, + isValidReasonPhrase, + sameOrigin, + normalizeMethod, + serializeJavascriptValueToJSONString, + iteratorMixin, + createIterator, + isValidHeaderName, + isValidHeaderValue, + isErrorLike, + fullyReadBody, + bytesMatch, + isReadableStreamLike, + readableStreamClose, + isomorphicEncode, + urlIsLocal, + urlHasHttpsScheme, + urlIsHttpHttpsScheme, + readAllBytes, + simpleRangeHeaderValue, + buildContentRange, + parseMetadata, + createInflate, + extractMimeType, + getDecodeSplit, + utf8DecodeBytes, + environmentSettingsObject + }; + return util$d; +} +var symbols$8; +var hasRequiredSymbols$8; +function requireSymbols$8() { + if (hasRequiredSymbols$8) return symbols$8; + hasRequiredSymbols$8 = 1; + symbols$8 = { + kUrl: /* @__PURE__ */ Symbol("url"), + kHeaders: /* @__PURE__ */ Symbol("headers"), + kSignal: /* @__PURE__ */ Symbol("signal"), + kState: /* @__PURE__ */ Symbol("state"), + kDispatcher: /* @__PURE__ */ Symbol("dispatcher") + }; + return symbols$8; +} +var file$1; +var hasRequiredFile$1; +function requireFile$1() { + if (hasRequiredFile$1) return file$1; + hasRequiredFile$1 = 1; + const { Blob: Blob2, File } = require$$0$3; + const { kState } = requireSymbols$8(); + const { webidl } = requireWebidl$1(); + class FileLike { + constructor(blobLike, fileName, options = {}) { + const n = fileName; + const t = options.type; + const d = options.lastModified ?? Date.now(); + this[kState] = { + blobLike, + name: n, + type: t, + lastModified: d + }; + } + stream(...args) { + webidl.brandCheck(this, FileLike); + return this[kState].blobLike.stream(...args); + } + arrayBuffer(...args) { + webidl.brandCheck(this, FileLike); + return this[kState].blobLike.arrayBuffer(...args); + } + slice(...args) { + webidl.brandCheck(this, FileLike); + return this[kState].blobLike.slice(...args); + } + text(...args) { + webidl.brandCheck(this, FileLike); + return this[kState].blobLike.text(...args); + } + get size() { + webidl.brandCheck(this, FileLike); + return this[kState].blobLike.size; + } + get type() { + webidl.brandCheck(this, FileLike); + return this[kState].blobLike.type; } - onBodySent(chunk) { - if (this[kHandler].onBodySent) { - try { - return this[kHandler].onBodySent(chunk); - } catch (err) { - this.abort(err); - } + get name() { + webidl.brandCheck(this, FileLike); + return this[kState].name; + } + get lastModified() { + webidl.brandCheck(this, FileLike); + return this[kState].lastModified; + } + get [Symbol.toStringTag]() { + return "File"; + } + } + webidl.converters.Blob = webidl.interfaceConverter(Blob2); + function isFileLike(object) { + return object instanceof File || object && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && object[Symbol.toStringTag] === "File"; + } + file$1 = { FileLike, isFileLike }; + return file$1; +} +var formdata$1; +var hasRequiredFormdata$1; +function requireFormdata$1() { + if (hasRequiredFormdata$1) return formdata$1; + hasRequiredFormdata$1 = 1; + const { isBlobLike, iteratorMixin } = requireUtil$d(); + const { kState } = requireSymbols$8(); + const { kEnumerableProperty } = requireUtil$e(); + const { FileLike, isFileLike } = requireFile$1(); + const { webidl } = requireWebidl$1(); + const { File: NativeFile } = require$$0$3; + const nodeUtil = require$$1$2; + const File = globalThis.File ?? NativeFile; + class FormData { + constructor(form) { + webidl.util.markAsUncloneable(this); + if (form !== void 0) { + throw webidl.errors.conversionFailed({ + prefix: "FormData constructor", + argument: "Argument 1", + types: ["undefined"] + }); } + this[kState] = []; } - onRequestSent() { - if (channels.bodySent.hasSubscribers) { - channels.bodySent.publish({ request: this }); + append(name, value, filename = void 0) { + webidl.brandCheck(this, FormData); + const prefix = "FormData.append"; + webidl.argumentLengthCheck(arguments, 2, prefix); + if (arguments.length === 3 && !isBlobLike(value)) { + throw new TypeError( + "Failed to execute 'append' on 'FormData': parameter 2 is not of type 'Blob'" + ); } - if (this[kHandler].onRequestSent) { - try { - return this[kHandler].onRequestSent(); - } catch (err) { - this.abort(err); - } + name = webidl.converters.USVString(name, prefix, "name"); + value = isBlobLike(value) ? webidl.converters.Blob(value, prefix, "value", { strict: false }) : webidl.converters.USVString(value, prefix, "value"); + filename = arguments.length === 3 ? webidl.converters.USVString(filename, prefix, "filename") : void 0; + const entry = makeEntry(name, value, filename); + this[kState].push(entry); + } + delete(name) { + webidl.brandCheck(this, FormData); + const prefix = "FormData.delete"; + webidl.argumentLengthCheck(arguments, 1, prefix); + name = webidl.converters.USVString(name, prefix, "name"); + this[kState] = this[kState].filter((entry) => entry.name !== name); + } + get(name) { + webidl.brandCheck(this, FormData); + const prefix = "FormData.get"; + webidl.argumentLengthCheck(arguments, 1, prefix); + name = webidl.converters.USVString(name, prefix, "name"); + const idx = this[kState].findIndex((entry) => entry.name === name); + if (idx === -1) { + return null; } + return this[kState][idx].value; } - onConnect(abort) { - assert(!this.aborted); - assert(!this.completed); - if (this.error) { - abort(this.error); + getAll(name) { + webidl.brandCheck(this, FormData); + const prefix = "FormData.getAll"; + webidl.argumentLengthCheck(arguments, 1, prefix); + name = webidl.converters.USVString(name, prefix, "name"); + return this[kState].filter((entry) => entry.name === name).map((entry) => entry.value); + } + has(name) { + webidl.brandCheck(this, FormData); + const prefix = "FormData.has"; + webidl.argumentLengthCheck(arguments, 1, prefix); + name = webidl.converters.USVString(name, prefix, "name"); + return this[kState].findIndex((entry) => entry.name === name) !== -1; + } + set(name, value, filename = void 0) { + webidl.brandCheck(this, FormData); + const prefix = "FormData.set"; + webidl.argumentLengthCheck(arguments, 2, prefix); + if (arguments.length === 3 && !isBlobLike(value)) { + throw new TypeError( + "Failed to execute 'set' on 'FormData': parameter 2 is not of type 'Blob'" + ); + } + name = webidl.converters.USVString(name, prefix, "name"); + value = isBlobLike(value) ? webidl.converters.Blob(value, prefix, "name", { strict: false }) : webidl.converters.USVString(value, prefix, "name"); + filename = arguments.length === 3 ? webidl.converters.USVString(filename, prefix, "name") : void 0; + const entry = makeEntry(name, value, filename); + const idx = this[kState].findIndex((entry2) => entry2.name === name); + if (idx !== -1) { + this[kState] = [ + ...this[kState].slice(0, idx), + entry, + ...this[kState].slice(idx + 1).filter((entry2) => entry2.name !== name) + ]; } else { - this.abort = abort; - return this[kHandler].onConnect(abort); + this[kState].push(entry); } } - onHeaders(statusCode, headers2, resume, statusText) { - assert(!this.aborted); - assert(!this.completed); - if (channels.headers.hasSubscribers) { - channels.headers.publish({ request: this, response: { statusCode, headers: headers2, statusText } }); + [nodeUtil.inspect.custom](depth, options) { + const state = this[kState].reduce((a, b) => { + if (a[b.name]) { + if (Array.isArray(a[b.name])) { + a[b.name].push(b.value); + } else { + a[b.name] = [a[b.name], b.value]; + } + } else { + a[b.name] = b.value; + } + return a; + }, { __proto__: null }); + options.depth ??= depth; + options.colors ??= true; + const output = nodeUtil.formatWithOptions(options, state); + return `FormData ${output.slice(output.indexOf("]") + 2)}`; + } + } + iteratorMixin("FormData", FormData, kState, "name", "value"); + Object.defineProperties(FormData.prototype, { + append: kEnumerableProperty, + delete: kEnumerableProperty, + get: kEnumerableProperty, + getAll: kEnumerableProperty, + has: kEnumerableProperty, + set: kEnumerableProperty, + [Symbol.toStringTag]: { + value: "FormData", + configurable: true + } + }); + function makeEntry(name, value, filename) { + if (typeof value === "string") ; + else { + if (!isFileLike(value)) { + value = value instanceof Blob ? new File([value], "blob", { type: value.type }) : new FileLike(value, "blob", { type: value.type }); } - try { - return this[kHandler].onHeaders(statusCode, headers2, resume, statusText); - } catch (err) { - this.abort(err); + if (filename !== void 0) { + const options = { + type: value.type, + lastModified: value.lastModified + }; + value = value instanceof NativeFile ? new File([value], filename, options) : new FileLike(value, filename, options); } } - onData(chunk) { - assert(!this.aborted); - assert(!this.completed); - try { - return this[kHandler].onData(chunk); - } catch (err) { - this.abort(err); + return { name, value }; + } + formdata$1 = { FormData, makeEntry }; + return formdata$1; +} +var formdataParser; +var hasRequiredFormdataParser; +function requireFormdataParser() { + if (hasRequiredFormdataParser) return formdataParser; + hasRequiredFormdataParser = 1; + const { isUSVString, bufferToLowerCasedHeaderName } = requireUtil$e(); + const { utf8DecodeBytes } = requireUtil$d(); + const { HTTP_TOKEN_CODEPOINTS, isomorphicDecode } = requireDataUrl(); + const { isFileLike } = requireFile$1(); + const { makeEntry } = requireFormdata$1(); + const assert = require$$0$5; + const { File: NodeFile } = require$$0$3; + const File = globalThis.File ?? NodeFile; + const formDataNameBuffer = Buffer.from('form-data; name="'); + const filenameBuffer = Buffer.from("; filename"); + const dd = Buffer.from("--"); + const ddcrlf = Buffer.from("--\r\n"); + function isAsciiString(chars) { + for (let i = 0; i < chars.length; ++i) { + if ((chars.charCodeAt(i) & -128) !== 0) { return false; } } - onUpgrade(statusCode, headers2, socket) { - assert(!this.aborted); - assert(!this.completed); - return this[kHandler].onUpgrade(statusCode, headers2, socket); + return true; + } + function validateBoundary(boundary) { + const length = boundary.length; + if (length < 27 || length > 70) { + return false; } - onComplete(trailers) { - this.onFinally(); - assert(!this.aborted); - this.completed = true; - if (channels.trailers.hasSubscribers) { - channels.trailers.publish({ request: this, trailers }); - } - try { - return this[kHandler].onComplete(trailers); - } catch (err) { - this.onError(err); + for (let i = 0; i < length; ++i) { + const cp = boundary.charCodeAt(i); + if (!(cp >= 48 && cp <= 57 || cp >= 65 && cp <= 90 || cp >= 97 && cp <= 122 || cp === 39 || cp === 45 || cp === 95)) { + return false; } } - onError(error) { - this.onFinally(); - if (channels.error.hasSubscribers) { - channels.error.publish({ request: this, error }); - } - if (this.aborted) { - return; - } - this.aborted = true; - return this[kHandler].onError(error); + return true; + } + function multipartFormDataParser(input, mimeType) { + assert(mimeType !== "failure" && mimeType.essence === "multipart/form-data"); + const boundaryString = mimeType.parameters.get("boundary"); + if (boundaryString === void 0) { + return "failure"; } - onFinally() { - if (this.errorHandler) { - this.body.off("error", this.errorHandler); - this.errorHandler = null; - } - if (this.endHandler) { - this.body.off("end", this.endHandler); - this.endHandler = null; - } + const boundary = Buffer.from(`--${boundaryString}`, "utf8"); + const entryList = []; + const position = { position: 0 }; + while (input[position.position] === 13 && input[position.position + 1] === 10) { + position.position += 2; } - // TODO: adjust to support H2 - addHeader(key, value) { - processHeader(this, key, value); - return this; + let trailing = input.length; + while (input[trailing - 1] === 10 && input[trailing - 2] === 13) { + trailing -= 2; } - static [kHTTP1BuildRequest](origin, opts, handler2) { - return new Request(origin, opts, handler2); + if (trailing !== input.length) { + input = input.subarray(0, trailing); } - static [kHTTP2BuildRequest](origin, opts, handler2) { - const headers2 = opts.headers; - opts = { ...opts, headers: null }; - const request2 = new Request(origin, opts, handler2); - request2.headers = {}; - if (Array.isArray(headers2)) { - if (headers2.length % 2 !== 0) { - throw new InvalidArgumentError("headers array must be even"); + while (true) { + if (input.subarray(position.position, position.position + boundary.length).equals(boundary)) { + position.position += boundary.length; + } else { + return "failure"; + } + if (position.position === input.length - 2 && bufferStartsWith(input, dd, position) || position.position === input.length - 4 && bufferStartsWith(input, ddcrlf, position)) { + return entryList; + } + if (input[position.position] !== 13 || input[position.position + 1] !== 10) { + return "failure"; + } + position.position += 2; + const result = parseMultipartFormDataHeaders(input, position); + if (result === "failure") { + return "failure"; + } + let { name, filename, contentType, encoding: encoding2 } = result; + position.position += 2; + let body2; + { + const boundaryIndex = input.indexOf(boundary.subarray(2), position.position); + if (boundaryIndex === -1) { + return "failure"; } - for (let i = 0; i < headers2.length; i += 2) { - processHeader(request2, headers2[i], headers2[i + 1], true); + body2 = input.subarray(position.position, boundaryIndex - 4); + position.position += body2.length; + if (encoding2 === "base64") { + body2 = Buffer.from(body2.toString(), "base64"); } - } else if (headers2 && typeof headers2 === "object") { - const keys = Object.keys(headers2); - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; - processHeader(request2, key, headers2[key], true); + } + if (input[position.position] !== 13 || input[position.position + 1] !== 10) { + return "failure"; + } else { + position.position += 2; + } + let value; + if (filename !== null) { + contentType ??= "text/plain"; + if (!isAsciiString(contentType)) { + contentType = ""; } - } else if (headers2 != null) { - throw new InvalidArgumentError("headers must be an object or an array"); + value = new File([body2], filename, { type: contentType }); + } else { + value = utf8DecodeBytes(Buffer.from(body2)); } - return request2; + assert(isUSVString(name)); + assert(typeof value === "string" && isUSVString(value) || isFileLike(value)); + entryList.push(makeEntry(name, value, filename)); } - static [kHTTP2CopyHeaders](raw) { - const rawHeaders = raw.split("\r\n"); - const headers2 = {}; - for (const header of rawHeaders) { - const [key, value] = header.split(": "); - if (value == null || value.length === 0) continue; - if (headers2[key]) headers2[key] += `,${value}`; - else headers2[key] = value; + } + function parseMultipartFormDataHeaders(input, position) { + let name = null; + let filename = null; + let contentType = null; + let encoding2 = null; + while (true) { + if (input[position.position] === 13 && input[position.position + 1] === 10) { + if (name === null) { + return "failure"; + } + return { name, filename, contentType, encoding: encoding2 }; + } + let headerName = collectASequenceOfBytes( + (char) => char !== 10 && char !== 13 && char !== 58, + input, + position + ); + headerName = removeChars(headerName, true, true, (char) => char === 9 || char === 32); + if (!HTTP_TOKEN_CODEPOINTS.test(headerName.toString())) { + return "failure"; + } + if (input[position.position] !== 58) { + return "failure"; + } + position.position++; + collectASequenceOfBytes( + (char) => char === 32 || char === 9, + input, + position + ); + switch (bufferToLowerCasedHeaderName(headerName)) { + case "content-disposition": { + name = filename = null; + if (!bufferStartsWith(input, formDataNameBuffer, position)) { + return "failure"; + } + position.position += 17; + name = parseMultipartFormDataName(input, position); + if (name === null) { + return "failure"; + } + if (bufferStartsWith(input, filenameBuffer, position)) { + let check = position.position + filenameBuffer.length; + if (input[check] === 42) { + position.position += 1; + check += 1; + } + if (input[check] !== 61 || input[check + 1] !== 34) { + return "failure"; + } + position.position += 12; + filename = parseMultipartFormDataName(input, position); + if (filename === null) { + return "failure"; + } + } + break; + } + case "content-type": { + let headerValue = collectASequenceOfBytes( + (char) => char !== 10 && char !== 13, + input, + position + ); + headerValue = removeChars(headerValue, false, true, (char) => char === 9 || char === 32); + contentType = isomorphicDecode(headerValue); + break; + } + case "content-transfer-encoding": { + let headerValue = collectASequenceOfBytes( + (char) => char !== 10 && char !== 13, + input, + position + ); + headerValue = removeChars(headerValue, false, true, (char) => char === 9 || char === 32); + encoding2 = isomorphicDecode(headerValue); + break; + } + default: { + collectASequenceOfBytes( + (char) => char !== 10 && char !== 13, + input, + position + ); + } + } + if (input[position.position] !== 13 && input[position.position + 1] !== 10) { + return "failure"; + } else { + position.position += 2; } - return headers2; } } - function processHeaderValue(key, val, skipAppend) { - if (val && typeof val === "object") { - throw new InvalidArgumentError(`invalid ${key} header`); + function parseMultipartFormDataName(input, position) { + assert(input[position.position - 1] === 34); + let name = collectASequenceOfBytes( + (char) => char !== 10 && char !== 13 && char !== 34, + input, + position + ); + if (input[position.position] !== 34) { + return null; + } else { + position.position++; } - val = val != null ? `${val}` : ""; - if (headerCharRegex.exec(val) !== null) { - throw new InvalidArgumentError(`invalid ${key} header`); + name = new TextDecoder().decode(name).replace(/%0A/ig, "\n").replace(/%0D/ig, "\r").replace(/%22/g, '"'); + return name; + } + function collectASequenceOfBytes(condition, input, position) { + let start = position.position; + while (start < input.length && condition(input[start])) { + ++start; } - return skipAppend ? val : `${key}: ${val}\r -`; + return input.subarray(position.position, position.position = start); } - function processHeader(request2, key, val, skipAppend = false) { - if (val && (typeof val === "object" && !Array.isArray(val))) { - throw new InvalidArgumentError(`invalid ${key} header`); - } else if (val === void 0) { - return; + function removeChars(buf, leading, trailing, predicate) { + let lead = 0; + let trail = buf.length - 1; + if (leading) { + while (lead < buf.length && predicate(buf[lead])) lead++; } - if (request2.host === null && key.length === 4 && key.toLowerCase() === "host") { - if (headerCharRegex.exec(val) !== null) { - throw new InvalidArgumentError(`invalid ${key} header`); - } - request2.host = val; - } else if (request2.contentLength === null && key.length === 14 && key.toLowerCase() === "content-length") { - request2.contentLength = parseInt(val, 10); - if (!Number.isFinite(request2.contentLength)) { - throw new InvalidArgumentError("invalid content-length header"); + { + while (trail > 0 && predicate(buf[trail])) trail--; + } + return lead === 0 && trail === buf.length - 1 ? buf : buf.subarray(lead, trail + 1); + } + function bufferStartsWith(buffer, start, position) { + if (buffer.length < start.length) { + return false; + } + for (let i = 0; i < start.length; i++) { + if (start[i] !== buffer[position.position + i]) { + return false; } - } else if (request2.contentType === null && key.length === 12 && key.toLowerCase() === "content-type") { - request2.contentType = val; - if (skipAppend) request2.headers[key] = processHeaderValue(key, val, skipAppend); - else request2.headers += processHeaderValue(key, val); - } else if (key.length === 17 && key.toLowerCase() === "transfer-encoding") { - throw new InvalidArgumentError("invalid transfer-encoding header"); - } else if (key.length === 10 && key.toLowerCase() === "connection") { - const value = typeof val === "string" ? val.toLowerCase() : null; - if (value !== "close" && value !== "keep-alive") { - throw new InvalidArgumentError("invalid connection header"); - } else if (value === "close") { - request2.reset = true; + } + return true; + } + formdataParser = { + multipartFormDataParser, + validateBoundary + }; + return formdataParser; +} +var body$1; +var hasRequiredBody$1; +function requireBody$1() { + if (hasRequiredBody$1) return body$1; + hasRequiredBody$1 = 1; + const util2 = requireUtil$e(); + const { + ReadableStreamFrom, + isBlobLike, + isReadableStreamLike, + readableStreamClose, + createDeferredPromise, + fullyReadBody, + extractMimeType, + utf8DecodeBytes + } = requireUtil$d(); + const { FormData } = requireFormdata$1(); + const { kState } = requireSymbols$8(); + const { webidl } = requireWebidl$1(); + const { Blob: Blob2 } = require$$0$3; + const assert = require$$0$5; + const { isErrored, isDisturbed } = require$$0$6; + const { isArrayBuffer } = require$$8; + const { serializeAMimeType } = requireDataUrl(); + const { multipartFormDataParser } = requireFormdataParser(); + let random; + try { + const crypto = require("node:crypto"); + random = (max) => crypto.randomInt(0, max); + } catch { + random = (max) => Math.floor(Math.random(max)); + } + const textEncoder = new TextEncoder(); + function noop2() { + } + const hasFinalizationRegistry = globalThis.FinalizationRegistry && process.version.indexOf("v18") !== 0; + let streamRegistry; + if (hasFinalizationRegistry) { + streamRegistry = new FinalizationRegistry((weakRef) => { + const stream = weakRef.deref(); + if (stream && !stream.locked && !isDisturbed(stream) && !isErrored(stream)) { + stream.cancel("Response object has been garbage collected").catch(noop2); } - } else if (key.length === 10 && key.toLowerCase() === "keep-alive") { - throw new InvalidArgumentError("invalid keep-alive header"); - } else if (key.length === 7 && key.toLowerCase() === "upgrade") { - throw new InvalidArgumentError("invalid upgrade header"); - } else if (key.length === 6 && key.toLowerCase() === "expect") { - throw new NotSupportedError("expect header not supported"); - } else if (tokenRegExp.exec(key) === null) { - throw new InvalidArgumentError("invalid header key"); + }); + } + function extractBody(object, keepalive = false) { + let stream = null; + if (object instanceof ReadableStream) { + stream = object; + } else if (isBlobLike(object)) { + stream = object.stream(); } else { - if (Array.isArray(val)) { - for (let i = 0; i < val.length; i++) { - if (skipAppend) { - if (request2.headers[key]) request2.headers[key] += `,${processHeaderValue(key, val[i], skipAppend)}`; - else request2.headers[key] = processHeaderValue(key, val[i], skipAppend); + stream = new ReadableStream({ + async pull(controller) { + const buffer = typeof source === "string" ? textEncoder.encode(source) : source; + if (buffer.byteLength) { + controller.enqueue(buffer); + } + queueMicrotask(() => readableStreamClose(controller)); + }, + start() { + }, + type: "bytes" + }); + } + assert(isReadableStreamLike(stream)); + let action = null; + let source = null; + let length = null; + let type = null; + if (typeof object === "string") { + source = object; + type = "text/plain;charset=UTF-8"; + } else if (object instanceof URLSearchParams) { + source = object.toString(); + type = "application/x-www-form-urlencoded;charset=UTF-8"; + } else if (isArrayBuffer(object)) { + source = new Uint8Array(object.slice()); + } else if (ArrayBuffer.isView(object)) { + source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength)); + } else if (util2.isFormDataLike(object)) { + const boundary = `----formdata-undici-0${`${random(1e11)}`.padStart(11, "0")}`; + const prefix = `--${boundary}\r +Content-Disposition: form-data`; + const escape = (str) => str.replace(/\n/g, "%0A").replace(/\r/g, "%0D").replace(/"/g, "%22"); + const normalizeLinefeeds = (value) => value.replace(/\r?\n|\r/g, "\r\n"); + const blobParts = []; + const rn = new Uint8Array([13, 10]); + length = 0; + let hasUnknownSizeValue = false; + for (const [name, value] of object) { + if (typeof value === "string") { + const chunk2 = textEncoder.encode(prefix + `; name="${escape(normalizeLinefeeds(name))}"\r +\r +${normalizeLinefeeds(value)}\r +`); + blobParts.push(chunk2); + length += chunk2.byteLength; + } else { + const chunk2 = textEncoder.encode(`${prefix}; name="${escape(normalizeLinefeeds(name))}"` + (value.name ? `; filename="${escape(value.name)}"` : "") + `\r +Content-Type: ${value.type || "application/octet-stream"}\r +\r +`); + blobParts.push(chunk2, value, rn); + if (typeof value.size === "number") { + length += chunk2.byteLength + value.size + rn.byteLength; } else { - request2.headers += processHeaderValue(key, val[i]); + hasUnknownSizeValue = true; } } - } else { - if (skipAppend) request2.headers[key] = processHeaderValue(key, val, skipAppend); - else request2.headers += processHeaderValue(key, val); } - } + const chunk = textEncoder.encode(`--${boundary}--\r +`); + blobParts.push(chunk); + length += chunk.byteLength; + if (hasUnknownSizeValue) { + length = null; + } + source = object; + action = async function* () { + for (const part of blobParts) { + if (part.stream) { + yield* part.stream(); + } else { + yield part; + } + } + }; + type = `multipart/form-data; boundary=${boundary}`; + } else if (isBlobLike(object)) { + source = object; + length = object.size; + if (object.type) { + type = object.type; + } + } else if (typeof object[Symbol.asyncIterator] === "function") { + if (keepalive) { + throw new TypeError("keepalive"); + } + if (util2.isDisturbed(object) || object.locked) { + throw new TypeError( + "Response body object should not be disturbed or locked" + ); + } + stream = object instanceof ReadableStream ? object : ReadableStreamFrom(object); + } + if (typeof source === "string" || util2.isBuffer(source)) { + length = Buffer.byteLength(source); + } + if (action != null) { + let iterator2; + stream = new ReadableStream({ + async start() { + iterator2 = action(object)[Symbol.asyncIterator](); + }, + async pull(controller) { + const { value, done } = await iterator2.next(); + if (done) { + queueMicrotask(() => { + controller.close(); + controller.byobRequest?.respond(0); + }); + } else { + if (!isErrored(stream)) { + const buffer = new Uint8Array(value); + if (buffer.byteLength) { + controller.enqueue(buffer); + } + } + } + return controller.desiredSize > 0; + }, + async cancel(reason) { + await iterator2.return(); + }, + type: "bytes" + }); + } + const body2 = { stream, source, length }; + return [body2, type]; + } + function safelyExtractBody(object, keepalive = false) { + if (object instanceof ReadableStream) { + assert(!util2.isDisturbed(object), "The body has already been consumed."); + assert(!object.locked, "The stream is locked."); + } + return extractBody(object, keepalive); + } + function cloneBody(instance, body2) { + const [out1, out2] = body2.stream.tee(); + body2.stream = out1; + return { + stream: out2, + length: body2.length, + source: body2.source + }; + } + function throwIfAborted(state) { + if (state.aborted) { + throw new DOMException("The operation was aborted.", "AbortError"); + } + } + function bodyMixinMethods(instance) { + const methods = { + blob() { + return consumeBody(this, (bytes) => { + let mimeType = bodyMimeType(this); + if (mimeType === null) { + mimeType = ""; + } else if (mimeType) { + mimeType = serializeAMimeType(mimeType); + } + return new Blob2([bytes], { type: mimeType }); + }, instance); + }, + arrayBuffer() { + return consumeBody(this, (bytes) => { + return new Uint8Array(bytes).buffer; + }, instance); + }, + text() { + return consumeBody(this, utf8DecodeBytes, instance); + }, + json() { + return consumeBody(this, parseJSONFromBytes, instance); + }, + formData() { + return consumeBody(this, (value) => { + const mimeType = bodyMimeType(this); + if (mimeType !== null) { + switch (mimeType.essence) { + case "multipart/form-data": { + const parsed = multipartFormDataParser(value, mimeType); + if (parsed === "failure") { + throw new TypeError("Failed to parse body as FormData."); + } + const fd = new FormData(); + fd[kState] = parsed; + return fd; + } + case "application/x-www-form-urlencoded": { + const entries = new URLSearchParams(value.toString()); + const fd = new FormData(); + for (const [name, value2] of entries) { + fd.append(name, value2); + } + return fd; + } + } + } + throw new TypeError( + 'Content-Type was not one of "multipart/form-data" or "application/x-www-form-urlencoded".' + ); + }, instance); + }, + bytes() { + return consumeBody(this, (bytes) => { + return new Uint8Array(bytes); + }, instance); + } + }; + return methods; } - request$2 = Request; - return request$2; -} -var dispatcher; -var hasRequiredDispatcher; -function requireDispatcher() { - if (hasRequiredDispatcher) return dispatcher; - hasRequiredDispatcher = 1; - const EventEmitter = require$$4$1; - class Dispatcher extends EventEmitter { - dispatch() { - throw new Error("not implemented"); + function mixinBody(prototype) { + Object.assign(prototype.prototype, bodyMixinMethods(prototype)); + } + async function consumeBody(object, convertBytesToJSValue, instance) { + webidl.brandCheck(object, instance); + if (bodyUnusable(object)) { + throw new TypeError("Body is unusable: Body has already been read"); } - close() { - throw new Error("not implemented"); + throwIfAborted(object[kState]); + const promise = createDeferredPromise(); + const errorSteps = (error) => promise.reject(error); + const successSteps = (data) => { + try { + promise.resolve(convertBytesToJSValue(data)); + } catch (e) { + errorSteps(e); + } + }; + if (object[kState].body == null) { + successSteps(Buffer.allocUnsafe(0)); + return promise.promise; } - destroy() { - throw new Error("not implemented"); + await fullyReadBody(object[kState].body, successSteps, errorSteps); + return promise.promise; + } + function bodyUnusable(object) { + const body2 = object[kState].body; + return body2 != null && (body2.stream.locked || util2.isDisturbed(body2.stream)); + } + function parseJSONFromBytes(bytes) { + return JSON.parse(utf8DecodeBytes(bytes)); + } + function bodyMimeType(requestOrResponse) { + const headers2 = requestOrResponse[kState].headersList; + const mimeType = extractMimeType(headers2); + if (mimeType === "failure") { + return null; } + return mimeType; } - dispatcher = Dispatcher; - return dispatcher; + body$1 = { + extractBody, + safelyExtractBody, + cloneBody, + mixinBody, + streamRegistry, + hasFinalizationRegistry, + bodyUnusable + }; + return body$1; } -var dispatcherBase; -var hasRequiredDispatcherBase; -function requireDispatcherBase() { - if (hasRequiredDispatcherBase) return dispatcherBase; - hasRequiredDispatcherBase = 1; - const Dispatcher = requireDispatcher(); +var clientH1; +var hasRequiredClientH1; +function requireClientH1() { + if (hasRequiredClientH1) return clientH1; + hasRequiredClientH1 = 1; + const assert = require$$0$5; + const util2 = requireUtil$e(); + const { channels } = requireDiagnostics(); + const timers2 = requireTimers$1(); const { - ClientDestroyedError, - ClientClosedError, - InvalidArgumentError - } = requireErrors(); - const { kDestroy, kClose, kDispatch, kInterceptors } = requireSymbols$4(); - const kDestroyed = /* @__PURE__ */ Symbol("destroyed"); - const kClosed = /* @__PURE__ */ Symbol("closed"); - const kOnDestroyed = /* @__PURE__ */ Symbol("onDestroyed"); - const kOnClosed = /* @__PURE__ */ Symbol("onClosed"); - const kInterceptedDispatch = /* @__PURE__ */ Symbol("Intercepted Dispatch"); - class DispatcherBase extends Dispatcher { - constructor() { - super(); - this[kDestroyed] = false; - this[kOnDestroyed] = null; - this[kClosed] = false; - this[kOnClosed] = []; - } - get destroyed() { - return this[kDestroyed]; - } - get closed() { - return this[kClosed]; - } - get interceptors() { - return this[kInterceptors]; - } - set interceptors(newInterceptors) { - if (newInterceptors) { - for (let i = newInterceptors.length - 1; i >= 0; i--) { - const interceptor = this[kInterceptors][i]; - if (typeof interceptor !== "function") { - throw new InvalidArgumentError("interceptor must be an function"); - } - } - } - this[kInterceptors] = newInterceptors; + RequestContentLengthMismatchError, + ResponseContentLengthMismatchError, + RequestAbortedError, + HeadersTimeoutError, + HeadersOverflowError, + SocketError, + InformationalError, + BodyTimeoutError, + HTTPParserError, + ResponseExceededMaxSizeError + } = requireErrors$1(); + const { + kUrl, + kReset, + kClient, + kParser, + kBlocking, + kRunning, + kPending, + kSize, + kWriting, + kQueue, + kNoRef, + kKeepAliveDefaultTimeout, + kHostHeader, + kPendingIdx, + kRunningIdx, + kError, + kPipelining, + kSocket, + kKeepAliveTimeoutValue, + kMaxHeadersSize, + kKeepAliveMaxTimeout, + kKeepAliveTimeoutThreshold, + kHeadersTimeout, + kBodyTimeout, + kStrictContentLength, + kMaxRequests, + kCounter, + kMaxResponseSize, + kOnError, + kResume, + kHTTPContext + } = requireSymbols$9(); + const constants2 = requireConstants$8(); + const EMPTY_BUF = Buffer.alloc(0); + const FastBuffer = Buffer[Symbol.species]; + const addListener = util2.addListener; + const removeAllListeners = util2.removeAllListeners; + let extractBody; + async function lazyllhttp() { + const llhttpWasmData = process.env.JEST_WORKER_ID ? requireLlhttpWasm$1() : void 0; + let mod; + try { + mod = await WebAssembly.compile(requireLlhttp_simdWasm$1()); + } catch (e) { + mod = await WebAssembly.compile(llhttpWasmData || requireLlhttpWasm$1()); } - close(callback) { - if (callback === void 0) { - return new Promise((resolve, reject) => { - this.close((err, data) => { - return err ? reject(err) : resolve(data); - }); - }); - } - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); - } - if (this[kDestroyed]) { - queueMicrotask(() => callback(new ClientDestroyedError(), null)); - return; - } - if (this[kClosed]) { - if (this[kOnClosed]) { - this[kOnClosed].push(callback); - } else { - queueMicrotask(() => callback(null, null)); - } - return; - } - this[kClosed] = true; - this[kOnClosed].push(callback); - const onClosed = () => { - const callbacks = this[kOnClosed]; - this[kOnClosed] = null; - for (let i = 0; i < callbacks.length; i++) { - callbacks[i](null, null); + return await WebAssembly.instantiate(mod, { + env: { + /* eslint-disable camelcase */ + wasm_on_url: (p, at, len) => { + return 0; + }, + wasm_on_status: (p, at, len) => { + assert(currentParser.ptr === p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; + }, + wasm_on_message_begin: (p) => { + assert(currentParser.ptr === p); + return currentParser.onMessageBegin() || 0; + }, + wasm_on_header_field: (p, at, len) => { + assert(currentParser.ptr === p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; + }, + wasm_on_header_value: (p, at, len) => { + assert(currentParser.ptr === p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; + }, + wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => { + assert(currentParser.ptr === p); + return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0; + }, + wasm_on_body: (p, at, len) => { + assert(currentParser.ptr === p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; + }, + wasm_on_message_complete: (p) => { + assert(currentParser.ptr === p); + return currentParser.onMessageComplete() || 0; } - }; - this[kClose]().then(() => this.destroy()).then(() => { - queueMicrotask(onClosed); - }); - } - destroy(err, callback) { - if (typeof err === "function") { - callback = err; - err = null; - } - if (callback === void 0) { - return new Promise((resolve, reject) => { - this.destroy(err, (err2, data) => { - return err2 ? ( - /* istanbul ignore next: should never error */ - reject(err2) - ) : resolve(data); - }); - }); - } - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); + /* eslint-enable camelcase */ } - if (this[kDestroyed]) { - if (this[kOnDestroyed]) { - this[kOnDestroyed].push(callback); - } else { - queueMicrotask(() => callback(null, null)); + }); + } + let llhttpInstance = null; + let llhttpPromise = lazyllhttp(); + llhttpPromise.catch(); + let currentParser = null; + let currentBufferRef = null; + let currentBufferSize = 0; + let currentBufferPtr = null; + const USE_NATIVE_TIMER = 0; + const USE_FAST_TIMER = 1; + const TIMEOUT_HEADERS = 2 | USE_FAST_TIMER; + const TIMEOUT_BODY = 4 | USE_FAST_TIMER; + const TIMEOUT_KEEP_ALIVE = 8 | USE_NATIVE_TIMER; + class Parser { + constructor(client2, socket, { exports: exports$1 }) { + assert(Number.isFinite(client2[kMaxHeadersSize]) && client2[kMaxHeadersSize] > 0); + this.llhttp = exports$1; + this.ptr = this.llhttp.llhttp_alloc(constants2.TYPE.RESPONSE); + this.client = client2; + this.socket = socket; + this.timeout = null; + this.timeoutValue = null; + this.timeoutType = null; + this.statusCode = null; + this.statusText = ""; + this.upgrade = false; + this.headers = []; + this.headersSize = 0; + this.headersMaxSize = client2[kMaxHeadersSize]; + this.shouldKeepAlive = false; + this.paused = false; + this.resume = this.resume.bind(this); + this.bytesRead = 0; + this.keepAlive = ""; + this.contentLength = ""; + this.connection = ""; + this.maxResponseSize = client2[kMaxResponseSize]; + } + setTimeout(delay, type) { + if (delay !== this.timeoutValue || type & USE_FAST_TIMER ^ this.timeoutType & USE_FAST_TIMER) { + if (this.timeout) { + timers2.clearTimeout(this.timeout); + this.timeout = null; + } + if (delay) { + if (type & USE_FAST_TIMER) { + this.timeout = timers2.setFastTimeout(onParserTimeout, delay, new WeakRef(this)); + } else { + this.timeout = setTimeout(onParserTimeout, delay, new WeakRef(this)); + this.timeout.unref(); + } + } + this.timeoutValue = delay; + } else if (this.timeout) { + if (this.timeout.refresh) { + this.timeout.refresh(); } - return; } - if (!err) { - err = new ClientDestroyedError(); + this.timeoutType = type; + } + resume() { + if (this.socket.destroyed || !this.paused) { + return; } - this[kDestroyed] = true; - this[kOnDestroyed] = this[kOnDestroyed] || []; - this[kOnDestroyed].push(callback); - const onDestroyed = () => { - const callbacks = this[kOnDestroyed]; - this[kOnDestroyed] = null; - for (let i = 0; i < callbacks.length; i++) { - callbacks[i](null, null); + assert(this.ptr != null); + assert(currentParser == null); + this.llhttp.llhttp_resume(this.ptr); + assert(this.timeoutType === TIMEOUT_BODY); + if (this.timeout) { + if (this.timeout.refresh) { + this.timeout.refresh(); } - }; - this[kDestroy](err).then(() => { - queueMicrotask(onDestroyed); - }); - } - [kInterceptedDispatch](opts, handler2) { - if (!this[kInterceptors] || this[kInterceptors].length === 0) { - this[kInterceptedDispatch] = this[kDispatch]; - return this[kDispatch](opts, handler2); } - let dispatch = this[kDispatch].bind(this); - for (let i = this[kInterceptors].length - 1; i >= 0; i--) { - dispatch = this[kInterceptors][i](dispatch); + this.paused = false; + this.execute(this.socket.read() || EMPTY_BUF); + this.readMore(); + } + readMore() { + while (!this.paused && this.ptr) { + const chunk = this.socket.read(); + if (chunk === null) { + break; + } + this.execute(chunk); } - this[kInterceptedDispatch] = dispatch; - return dispatch(opts, handler2); } - dispatch(opts, handler2) { - if (!handler2 || typeof handler2 !== "object") { - throw new InvalidArgumentError("handler must be an object"); + execute(data) { + assert(this.ptr != null); + assert(currentParser == null); + assert(!this.paused); + const { socket, llhttp } = this; + if (data.length > currentBufferSize) { + if (currentBufferPtr) { + llhttp.free(currentBufferPtr); + } + currentBufferSize = Math.ceil(data.length / 4096) * 4096; + currentBufferPtr = llhttp.malloc(currentBufferSize); } + new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data); try { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("opts must be an object."); - } - if (this[kDestroyed] || this[kOnDestroyed]) { - throw new ClientDestroyedError(); + let ret; + try { + currentBufferRef = data; + currentParser = this; + ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length); + } catch (err) { + throw err; + } finally { + currentParser = null; + currentBufferRef = null; } - if (this[kClosed]) { - throw new ClientClosedError(); + const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr; + if (ret === constants2.ERROR.PAUSED_UPGRADE) { + this.onUpgrade(data.slice(offset)); + } else if (ret === constants2.ERROR.PAUSED) { + this.paused = true; + socket.unshift(data.slice(offset)); + } else if (ret !== constants2.ERROR.OK) { + const ptr = llhttp.llhttp_get_error_reason(this.ptr); + let message = ""; + if (ptr) { + const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0); + message = "Response does not match the HTTP/1.1 protocol (" + Buffer.from(llhttp.memory.buffer, ptr, len).toString() + ")"; + } + throw new HTTPParserError(message, constants2.ERROR[ret], data.slice(offset)); } - return this[kInterceptedDispatch](opts, handler2); } catch (err) { - if (typeof handler2.onError !== "function") { - throw new InvalidArgumentError("invalid onError method"); - } - handler2.onError(err); - return false; + util2.destroy(socket, err); } } - } - dispatcherBase = DispatcherBase; - return dispatcherBase; -} -var connect; -var hasRequiredConnect; -function requireConnect() { - if (hasRequiredConnect) return connect; - hasRequiredConnect = 1; - const net = require$$0$4; - const assert = require$$0$3; - const util2 = requireUtil$6(); - const { InvalidArgumentError, ConnectTimeoutError } = requireErrors(); - let tls; - let SessionCache; - if (commonjsGlobal.FinalizationRegistry && !process.env.NODE_V8_COVERAGE) { - SessionCache = class WeakSessionCache { - constructor(maxCachedSessions) { - this._maxCachedSessions = maxCachedSessions; - this._sessionCache = /* @__PURE__ */ new Map(); - this._sessionRegistry = new commonjsGlobal.FinalizationRegistry((key) => { - if (this._sessionCache.size < this._maxCachedSessions) { - return; - } - const ref = this._sessionCache.get(key); - if (ref !== void 0 && ref.deref() === void 0) { - this._sessionCache.delete(key); - } - }); - } - get(sessionKey) { - const ref = this._sessionCache.get(sessionKey); - return ref ? ref.deref() : null; - } - set(sessionKey, session) { - if (this._maxCachedSessions === 0) { - return; - } - this._sessionCache.set(sessionKey, new WeakRef(session)); - this._sessionRegistry.register(session, sessionKey); - } - }; - } else { - SessionCache = class SimpleSessionCache { - constructor(maxCachedSessions) { - this._maxCachedSessions = maxCachedSessions; - this._sessionCache = /* @__PURE__ */ new Map(); + destroy() { + assert(this.ptr != null); + assert(currentParser == null); + this.llhttp.llhttp_free(this.ptr); + this.ptr = null; + this.timeout && timers2.clearTimeout(this.timeout); + this.timeout = null; + this.timeoutValue = null; + this.timeoutType = null; + this.paused = false; + } + onStatus(buf) { + this.statusText = buf.toString(); + } + onMessageBegin() { + const { socket, client: client2 } = this; + if (socket.destroyed) { + return -1; } - get(sessionKey) { - return this._sessionCache.get(sessionKey); + const request2 = client2[kQueue][client2[kRunningIdx]]; + if (!request2) { + return -1; } - set(sessionKey, session) { - if (this._maxCachedSessions === 0) { - return; - } - if (this._sessionCache.size >= this._maxCachedSessions) { - const { value: oldestKey } = this._sessionCache.keys().next(); - this._sessionCache.delete(oldestKey); - } - this._sessionCache.set(sessionKey, session); + request2.onResponseStarted(); + } + onHeaderField(buf) { + const len = this.headers.length; + if ((len & 1) === 0) { + this.headers.push(buf); + } else { + this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); } - }; - } - function buildConnector({ allowH2, maxCachedSessions, socketPath, timeout, ...opts }) { - if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) { - throw new InvalidArgumentError("maxCachedSessions must be a positive integer or zero"); + this.trackHeader(buf.length); } - const options = { path: socketPath, ...opts }; - const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions); - timeout = timeout == null ? 1e4 : timeout; - allowH2 = allowH2 != null ? allowH2 : false; - return function connect2({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) { - let socket; - if (protocol === "https:") { - if (!tls) { - tls = require$$1$1; - } - servername = servername || options.servername || util2.getServerName(host) || null; - const sessionKey = servername || hostname; - const session = sessionCache.get(sessionKey) || null; - assert(sessionKey); - socket = tls.connect({ - highWaterMark: 16384, - // TLS in node can't have bigger HWM anyway... - ...options, - servername, - session, - localAddress, - // TODO(HTTP/2): Add support for h2c - ALPNProtocols: allowH2 ? ["http/1.1", "h2"] : ["http/1.1"], - socket: httpSocket, - // upgrade socket connection - port: port || 443, - host: hostname - }); - socket.on("session", function(session2) { - sessionCache.set(sessionKey, session2); - }); + onHeaderValue(buf) { + let len = this.headers.length; + if ((len & 1) === 1) { + this.headers.push(buf); + len += 1; } else { - assert(!httpSocket, "httpSocket can only be sent on TLS update"); - socket = net.connect({ - highWaterMark: 64 * 1024, - // Same as nodejs fs streams. - ...options, - localAddress, - port: port || 80, - host: hostname - }); + this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); } - if (options.keepAlive == null || options.keepAlive) { - const keepAliveInitialDelay = options.keepAliveInitialDelay === void 0 ? 6e4 : options.keepAliveInitialDelay; - socket.setKeepAlive(true, keepAliveInitialDelay); + const key = this.headers[len - 2]; + if (key.length === 10) { + const headerName = util2.bufferToLowerCasedHeaderName(key); + if (headerName === "keep-alive") { + this.keepAlive += buf.toString(); + } else if (headerName === "connection") { + this.connection += buf.toString(); + } + } else if (key.length === 14 && util2.bufferToLowerCasedHeaderName(key) === "content-length") { + this.contentLength += buf.toString(); } - const cancelTimeout = setupTimeout(() => onConnectTimeout(socket), timeout); - socket.setNoDelay(true).once(protocol === "https:" ? "secureConnect" : "connect", function() { - cancelTimeout(); - if (callback) { - const cb = callback; - callback = null; - cb(null, this); - } - }).on("error", function(err) { - cancelTimeout(); - if (callback) { - const cb = callback; - callback = null; - cb(err); - } - }); - return socket; - }; - } - function setupTimeout(onConnectTimeout2, timeout) { - if (!timeout) { - return () => { - }; + this.trackHeader(buf.length); } - let s1 = null; - let s2 = null; - const timeoutId = setTimeout(() => { - s1 = setImmediate(() => { - if (process.platform === "win32") { - s2 = setImmediate(() => onConnectTimeout2()); - } else { - onConnectTimeout2(); - } - }); - }, timeout); - return () => { - clearTimeout(timeoutId); - clearImmediate(s1); - clearImmediate(s2); - }; - } - function onConnectTimeout(socket) { - util2.destroy(socket, new ConnectTimeoutError()); - } - connect = buildConnector; - return connect; -} -var constants$2 = {}; -var utils$2 = {}; -var hasRequiredUtils$2; -function requireUtils$2() { - if (hasRequiredUtils$2) return utils$2; - hasRequiredUtils$2 = 1; - Object.defineProperty(utils$2, "__esModule", { value: true }); - utils$2.enumToMap = void 0; - function enumToMap(obj) { - const res = {}; - Object.keys(obj).forEach((key) => { - const value = obj[key]; - if (typeof value === "number") { - res[key] = value; + trackHeader(len) { + this.headersSize += len; + if (this.headersSize >= this.headersMaxSize) { + util2.destroy(this.socket, new HeadersOverflowError()); } - }); - return res; - } - utils$2.enumToMap = enumToMap; - return utils$2; -} -var hasRequiredConstants$2; -function requireConstants$2() { - if (hasRequiredConstants$2) return constants$2; - hasRequiredConstants$2 = 1; - (function(exports$1) { - Object.defineProperty(exports$1, "__esModule", { value: true }); - exports$1.SPECIAL_HEADERS = exports$1.HEADER_STATE = exports$1.MINOR = exports$1.MAJOR = exports$1.CONNECTION_TOKEN_CHARS = exports$1.HEADER_CHARS = exports$1.TOKEN = exports$1.STRICT_TOKEN = exports$1.HEX = exports$1.URL_CHAR = exports$1.STRICT_URL_CHAR = exports$1.USERINFO_CHARS = exports$1.MARK = exports$1.ALPHANUM = exports$1.NUM = exports$1.HEX_MAP = exports$1.NUM_MAP = exports$1.ALPHA = exports$1.FINISH = exports$1.H_METHOD_MAP = exports$1.METHOD_MAP = exports$1.METHODS_RTSP = exports$1.METHODS_ICE = exports$1.METHODS_HTTP = exports$1.METHODS = exports$1.LENIENT_FLAGS = exports$1.FLAGS = exports$1.TYPE = exports$1.ERROR = void 0; - const utils_1 = requireUtils$2(); - (function(ERROR) { - ERROR[ERROR["OK"] = 0] = "OK"; - ERROR[ERROR["INTERNAL"] = 1] = "INTERNAL"; - ERROR[ERROR["STRICT"] = 2] = "STRICT"; - ERROR[ERROR["LF_EXPECTED"] = 3] = "LF_EXPECTED"; - ERROR[ERROR["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH"; - ERROR[ERROR["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION"; - ERROR[ERROR["INVALID_METHOD"] = 6] = "INVALID_METHOD"; - ERROR[ERROR["INVALID_URL"] = 7] = "INVALID_URL"; - ERROR[ERROR["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT"; - ERROR[ERROR["INVALID_VERSION"] = 9] = "INVALID_VERSION"; - ERROR[ERROR["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN"; - ERROR[ERROR["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH"; - ERROR[ERROR["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE"; - ERROR[ERROR["INVALID_STATUS"] = 13] = "INVALID_STATUS"; - ERROR[ERROR["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE"; - ERROR[ERROR["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING"; - ERROR[ERROR["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN"; - ERROR[ERROR["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE"; - ERROR[ERROR["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE"; - ERROR[ERROR["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER"; - ERROR[ERROR["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE"; - ERROR[ERROR["PAUSED"] = 21] = "PAUSED"; - ERROR[ERROR["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE"; - ERROR[ERROR["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE"; - ERROR[ERROR["USER"] = 24] = "USER"; - })(exports$1.ERROR || (exports$1.ERROR = {})); - (function(TYPE) { - TYPE[TYPE["BOTH"] = 0] = "BOTH"; - TYPE[TYPE["REQUEST"] = 1] = "REQUEST"; - TYPE[TYPE["RESPONSE"] = 2] = "RESPONSE"; - })(exports$1.TYPE || (exports$1.TYPE = {})); - (function(FLAGS) { - FLAGS[FLAGS["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE"; - FLAGS[FLAGS["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE"; - FLAGS[FLAGS["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE"; - FLAGS[FLAGS["CHUNKED"] = 8] = "CHUNKED"; - FLAGS[FLAGS["UPGRADE"] = 16] = "UPGRADE"; - FLAGS[FLAGS["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH"; - FLAGS[FLAGS["SKIPBODY"] = 64] = "SKIPBODY"; - FLAGS[FLAGS["TRAILING"] = 128] = "TRAILING"; - FLAGS[FLAGS["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING"; - })(exports$1.FLAGS || (exports$1.FLAGS = {})); - (function(LENIENT_FLAGS) { - LENIENT_FLAGS[LENIENT_FLAGS["HEADERS"] = 1] = "HEADERS"; - LENIENT_FLAGS[LENIENT_FLAGS["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH"; - LENIENT_FLAGS[LENIENT_FLAGS["KEEP_ALIVE"] = 4] = "KEEP_ALIVE"; - })(exports$1.LENIENT_FLAGS || (exports$1.LENIENT_FLAGS = {})); - var METHODS; - (function(METHODS2) { - METHODS2[METHODS2["DELETE"] = 0] = "DELETE"; - METHODS2[METHODS2["GET"] = 1] = "GET"; - METHODS2[METHODS2["HEAD"] = 2] = "HEAD"; - METHODS2[METHODS2["POST"] = 3] = "POST"; - METHODS2[METHODS2["PUT"] = 4] = "PUT"; - METHODS2[METHODS2["CONNECT"] = 5] = "CONNECT"; - METHODS2[METHODS2["OPTIONS"] = 6] = "OPTIONS"; - METHODS2[METHODS2["TRACE"] = 7] = "TRACE"; - METHODS2[METHODS2["COPY"] = 8] = "COPY"; - METHODS2[METHODS2["LOCK"] = 9] = "LOCK"; - METHODS2[METHODS2["MKCOL"] = 10] = "MKCOL"; - METHODS2[METHODS2["MOVE"] = 11] = "MOVE"; - METHODS2[METHODS2["PROPFIND"] = 12] = "PROPFIND"; - METHODS2[METHODS2["PROPPATCH"] = 13] = "PROPPATCH"; - METHODS2[METHODS2["SEARCH"] = 14] = "SEARCH"; - METHODS2[METHODS2["UNLOCK"] = 15] = "UNLOCK"; - METHODS2[METHODS2["BIND"] = 16] = "BIND"; - METHODS2[METHODS2["REBIND"] = 17] = "REBIND"; - METHODS2[METHODS2["UNBIND"] = 18] = "UNBIND"; - METHODS2[METHODS2["ACL"] = 19] = "ACL"; - METHODS2[METHODS2["REPORT"] = 20] = "REPORT"; - METHODS2[METHODS2["MKACTIVITY"] = 21] = "MKACTIVITY"; - METHODS2[METHODS2["CHECKOUT"] = 22] = "CHECKOUT"; - METHODS2[METHODS2["MERGE"] = 23] = "MERGE"; - METHODS2[METHODS2["M-SEARCH"] = 24] = "M-SEARCH"; - METHODS2[METHODS2["NOTIFY"] = 25] = "NOTIFY"; - METHODS2[METHODS2["SUBSCRIBE"] = 26] = "SUBSCRIBE"; - METHODS2[METHODS2["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE"; - METHODS2[METHODS2["PATCH"] = 28] = "PATCH"; - METHODS2[METHODS2["PURGE"] = 29] = "PURGE"; - METHODS2[METHODS2["MKCALENDAR"] = 30] = "MKCALENDAR"; - METHODS2[METHODS2["LINK"] = 31] = "LINK"; - METHODS2[METHODS2["UNLINK"] = 32] = "UNLINK"; - METHODS2[METHODS2["SOURCE"] = 33] = "SOURCE"; - METHODS2[METHODS2["PRI"] = 34] = "PRI"; - METHODS2[METHODS2["DESCRIBE"] = 35] = "DESCRIBE"; - METHODS2[METHODS2["ANNOUNCE"] = 36] = "ANNOUNCE"; - METHODS2[METHODS2["SETUP"] = 37] = "SETUP"; - METHODS2[METHODS2["PLAY"] = 38] = "PLAY"; - METHODS2[METHODS2["PAUSE"] = 39] = "PAUSE"; - METHODS2[METHODS2["TEARDOWN"] = 40] = "TEARDOWN"; - METHODS2[METHODS2["GET_PARAMETER"] = 41] = "GET_PARAMETER"; - METHODS2[METHODS2["SET_PARAMETER"] = 42] = "SET_PARAMETER"; - METHODS2[METHODS2["REDIRECT"] = 43] = "REDIRECT"; - METHODS2[METHODS2["RECORD"] = 44] = "RECORD"; - METHODS2[METHODS2["FLUSH"] = 45] = "FLUSH"; - })(METHODS = exports$1.METHODS || (exports$1.METHODS = {})); - exports$1.METHODS_HTTP = [ - METHODS.DELETE, - METHODS.GET, - METHODS.HEAD, - METHODS.POST, - METHODS.PUT, - METHODS.CONNECT, - METHODS.OPTIONS, - METHODS.TRACE, - METHODS.COPY, - METHODS.LOCK, - METHODS.MKCOL, - METHODS.MOVE, - METHODS.PROPFIND, - METHODS.PROPPATCH, - METHODS.SEARCH, - METHODS.UNLOCK, - METHODS.BIND, - METHODS.REBIND, - METHODS.UNBIND, - METHODS.ACL, - METHODS.REPORT, - METHODS.MKACTIVITY, - METHODS.CHECKOUT, - METHODS.MERGE, - METHODS["M-SEARCH"], - METHODS.NOTIFY, - METHODS.SUBSCRIBE, - METHODS.UNSUBSCRIBE, - METHODS.PATCH, - METHODS.PURGE, - METHODS.MKCALENDAR, - METHODS.LINK, - METHODS.UNLINK, - METHODS.PRI, - // TODO(indutny): should we allow it with HTTP? - METHODS.SOURCE - ]; - exports$1.METHODS_ICE = [ - METHODS.SOURCE - ]; - exports$1.METHODS_RTSP = [ - METHODS.OPTIONS, - METHODS.DESCRIBE, - METHODS.ANNOUNCE, - METHODS.SETUP, - METHODS.PLAY, - METHODS.PAUSE, - METHODS.TEARDOWN, - METHODS.GET_PARAMETER, - METHODS.SET_PARAMETER, - METHODS.REDIRECT, - METHODS.RECORD, - METHODS.FLUSH, - // For AirPlay - METHODS.GET, - METHODS.POST - ]; - exports$1.METHOD_MAP = utils_1.enumToMap(METHODS); - exports$1.H_METHOD_MAP = {}; - Object.keys(exports$1.METHOD_MAP).forEach((key) => { - if (/^H/.test(key)) { - exports$1.H_METHOD_MAP[key] = exports$1.METHOD_MAP[key]; + } + onUpgrade(head) { + const { upgrade, client: client2, socket, headers: headers2, statusCode } = this; + assert(upgrade); + assert(client2[kSocket] === socket); + assert(!socket.destroyed); + assert(!this.paused); + assert((headers2.length & 1) === 0); + const request2 = client2[kQueue][client2[kRunningIdx]]; + assert(request2); + assert(request2.upgrade || request2.method === "CONNECT"); + this.statusCode = null; + this.statusText = ""; + this.shouldKeepAlive = null; + this.headers = []; + this.headersSize = 0; + socket.unshift(head); + socket[kParser].destroy(); + socket[kParser] = null; + socket[kClient] = null; + socket[kError] = null; + removeAllListeners(socket); + client2[kSocket] = null; + client2[kHTTPContext] = null; + client2[kQueue][client2[kRunningIdx]++] = null; + client2.emit("disconnect", client2[kUrl], [client2], new InformationalError("upgrade")); + try { + request2.onUpgrade(statusCode, headers2, socket); + } catch (err) { + util2.destroy(socket, err); } - }); - (function(FINISH) { - FINISH[FINISH["SAFE"] = 0] = "SAFE"; - FINISH[FINISH["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB"; - FINISH[FINISH["UNSAFE"] = 2] = "UNSAFE"; - })(exports$1.FINISH || (exports$1.FINISH = {})); - exports$1.ALPHA = []; - for (let i = "A".charCodeAt(0); i <= "Z".charCodeAt(0); i++) { - exports$1.ALPHA.push(String.fromCharCode(i)); - exports$1.ALPHA.push(String.fromCharCode(i + 32)); + client2[kResume](); } - exports$1.NUM_MAP = { - 0: 0, - 1: 1, - 2: 2, - 3: 3, - 4: 4, - 5: 5, - 6: 6, - 7: 7, - 8: 8, - 9: 9 - }; - exports$1.HEX_MAP = { - 0: 0, - 1: 1, - 2: 2, - 3: 3, - 4: 4, - 5: 5, - 6: 6, - 7: 7, - 8: 8, - 9: 9, - A: 10, - B: 11, - C: 12, - D: 13, - E: 14, - F: 15, - a: 10, - b: 11, - c: 12, - d: 13, - e: 14, - f: 15 - }; - exports$1.NUM = [ - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9" - ]; - exports$1.ALPHANUM = exports$1.ALPHA.concat(exports$1.NUM); - exports$1.MARK = ["-", "_", ".", "!", "~", "*", "'", "(", ")"]; - exports$1.USERINFO_CHARS = exports$1.ALPHANUM.concat(exports$1.MARK).concat(["%", ";", ":", "&", "=", "+", "$", ","]); - exports$1.STRICT_URL_CHAR = [ - "!", - '"', - "$", - "%", - "&", - "'", - "(", - ")", - "*", - "+", - ",", - "-", - ".", - "/", - ":", - ";", - "<", - "=", - ">", - "@", - "[", - "\\", - "]", - "^", - "_", - "`", - "{", - "|", - "}", - "~" - ].concat(exports$1.ALPHANUM); - exports$1.URL_CHAR = exports$1.STRICT_URL_CHAR.concat([" ", "\f"]); - for (let i = 128; i <= 255; i++) { - exports$1.URL_CHAR.push(i); + onHeadersComplete(statusCode, upgrade, shouldKeepAlive) { + const { client: client2, socket, headers: headers2, statusText } = this; + if (socket.destroyed) { + return -1; + } + const request2 = client2[kQueue][client2[kRunningIdx]]; + if (!request2) { + return -1; + } + assert(!this.upgrade); + assert(this.statusCode < 200); + if (statusCode === 100) { + util2.destroy(socket, new SocketError("bad response", util2.getSocketInfo(socket))); + return -1; + } + if (upgrade && !request2.upgrade) { + util2.destroy(socket, new SocketError("bad upgrade", util2.getSocketInfo(socket))); + return -1; + } + assert(this.timeoutType === TIMEOUT_HEADERS); + this.statusCode = statusCode; + this.shouldKeepAlive = shouldKeepAlive || // Override llhttp value which does not allow keepAlive for HEAD. + request2.method === "HEAD" && !socket[kReset] && this.connection.toLowerCase() === "keep-alive"; + if (this.statusCode >= 200) { + const bodyTimeout = request2.bodyTimeout != null ? request2.bodyTimeout : client2[kBodyTimeout]; + this.setTimeout(bodyTimeout, TIMEOUT_BODY); + } else if (this.timeout) { + if (this.timeout.refresh) { + this.timeout.refresh(); + } + } + if (request2.method === "CONNECT") { + assert(client2[kRunning] === 1); + this.upgrade = true; + return 2; + } + if (upgrade) { + assert(client2[kRunning] === 1); + this.upgrade = true; + return 2; + } + assert((this.headers.length & 1) === 0); + this.headers = []; + this.headersSize = 0; + if (this.shouldKeepAlive && client2[kPipelining]) { + const keepAliveTimeout = this.keepAlive ? util2.parseKeepAliveTimeout(this.keepAlive) : null; + if (keepAliveTimeout != null) { + const timeout = Math.min( + keepAliveTimeout - client2[kKeepAliveTimeoutThreshold], + client2[kKeepAliveMaxTimeout] + ); + if (timeout <= 0) { + socket[kReset] = true; + } else { + client2[kKeepAliveTimeoutValue] = timeout; + } + } else { + client2[kKeepAliveTimeoutValue] = client2[kKeepAliveDefaultTimeout]; + } + } else { + socket[kReset] = true; + } + const pause = request2.onHeaders(statusCode, headers2, this.resume, statusText) === false; + if (request2.aborted) { + return -1; + } + if (request2.method === "HEAD") { + return 1; + } + if (statusCode < 200) { + return 1; + } + if (socket[kBlocking]) { + socket[kBlocking] = false; + client2[kResume](); + } + return pause ? constants2.ERROR.PAUSED : 0; } - exports$1.HEX = exports$1.NUM.concat(["a", "b", "c", "d", "e", "f", "A", "B", "C", "D", "E", "F"]); - exports$1.STRICT_TOKEN = [ - "!", - "#", - "$", - "%", - "&", - "'", - "*", - "+", - "-", - ".", - "^", - "_", - "`", - "|", - "~" - ].concat(exports$1.ALPHANUM); - exports$1.TOKEN = exports$1.STRICT_TOKEN.concat([" "]); - exports$1.HEADER_CHARS = [" "]; - for (let i = 32; i <= 255; i++) { - if (i !== 127) { - exports$1.HEADER_CHARS.push(i); + onBody(buf) { + const { client: client2, socket, statusCode, maxResponseSize } = this; + if (socket.destroyed) { + return -1; + } + const request2 = client2[kQueue][client2[kRunningIdx]]; + assert(request2); + assert(this.timeoutType === TIMEOUT_BODY); + if (this.timeout) { + if (this.timeout.refresh) { + this.timeout.refresh(); + } + } + assert(statusCode >= 200); + if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) { + util2.destroy(socket, new ResponseExceededMaxSizeError()); + return -1; + } + this.bytesRead += buf.length; + if (request2.onData(buf) === false) { + return constants2.ERROR.PAUSED; + } + } + onMessageComplete() { + const { client: client2, socket, statusCode, upgrade, headers: headers2, contentLength, bytesRead, shouldKeepAlive } = this; + if (socket.destroyed && (!statusCode || shouldKeepAlive)) { + return -1; + } + if (upgrade) { + return; + } + assert(statusCode >= 100); + assert((this.headers.length & 1) === 0); + const request2 = client2[kQueue][client2[kRunningIdx]]; + assert(request2); + this.statusCode = null; + this.statusText = ""; + this.bytesRead = 0; + this.contentLength = ""; + this.keepAlive = ""; + this.connection = ""; + this.headers = []; + this.headersSize = 0; + if (statusCode < 200) { + return; + } + if (request2.method !== "HEAD" && contentLength && bytesRead !== parseInt(contentLength, 10)) { + util2.destroy(socket, new ResponseContentLengthMismatchError()); + return -1; + } + request2.onComplete(headers2); + client2[kQueue][client2[kRunningIdx]++] = null; + if (socket[kWriting]) { + assert(client2[kRunning] === 0); + util2.destroy(socket, new InformationalError("reset")); + return constants2.ERROR.PAUSED; + } else if (!shouldKeepAlive) { + util2.destroy(socket, new InformationalError("reset")); + return constants2.ERROR.PAUSED; + } else if (socket[kReset] && client2[kRunning] === 0) { + util2.destroy(socket, new InformationalError("reset")); + return constants2.ERROR.PAUSED; + } else if (client2[kPipelining] == null || client2[kPipelining] === 1) { + setImmediate(() => client2[kResume]()); + } else { + client2[kResume](); } } - exports$1.CONNECTION_TOKEN_CHARS = exports$1.HEADER_CHARS.filter((c) => c !== 44); - exports$1.MAJOR = exports$1.NUM_MAP; - exports$1.MINOR = exports$1.MAJOR; - var HEADER_STATE; - (function(HEADER_STATE2) { - HEADER_STATE2[HEADER_STATE2["GENERAL"] = 0] = "GENERAL"; - HEADER_STATE2[HEADER_STATE2["CONNECTION"] = 1] = "CONNECTION"; - HEADER_STATE2[HEADER_STATE2["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH"; - HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING"; - HEADER_STATE2[HEADER_STATE2["UPGRADE"] = 4] = "UPGRADE"; - HEADER_STATE2[HEADER_STATE2["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE"; - HEADER_STATE2[HEADER_STATE2["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE"; - HEADER_STATE2[HEADER_STATE2["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE"; - HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING_CHUNKED"] = 8] = "TRANSFER_ENCODING_CHUNKED"; - })(HEADER_STATE = exports$1.HEADER_STATE || (exports$1.HEADER_STATE = {})); - exports$1.SPECIAL_HEADERS = { - "connection": HEADER_STATE.CONNECTION, - "content-length": HEADER_STATE.CONTENT_LENGTH, - "proxy-connection": HEADER_STATE.CONNECTION, - "transfer-encoding": HEADER_STATE.TRANSFER_ENCODING, - "upgrade": HEADER_STATE.UPGRADE - }; - })(constants$2); - return constants$2; -} -var RedirectHandler_1; -var hasRequiredRedirectHandler; -function requireRedirectHandler() { - if (hasRequiredRedirectHandler) return RedirectHandler_1; - hasRequiredRedirectHandler = 1; - const util2 = requireUtil$6(); - const { kBodyUsed } = requireSymbols$4(); - const assert = require$$0$3; - const { InvalidArgumentError } = requireErrors(); - const EE = require$$4$1; - const redirectableStatusCodes = [300, 301, 302, 303, 307, 308]; - const kBody = /* @__PURE__ */ Symbol("body"); - class BodyAsyncIterable { - constructor(body2) { - this[kBody] = body2; - this[kBodyUsed] = false; - } - async *[Symbol.asyncIterator]() { - assert(!this[kBodyUsed], "disturbed"); - this[kBodyUsed] = true; - yield* this[kBody]; + } + function onParserTimeout(parser) { + const { socket, timeoutType, client: client2, paused } = parser.deref(); + if (timeoutType === TIMEOUT_HEADERS) { + if (!socket[kWriting] || socket.writableNeedDrain || client2[kRunning] > 1) { + assert(!paused, "cannot be paused while waiting for headers"); + util2.destroy(socket, new HeadersTimeoutError()); + } + } else if (timeoutType === TIMEOUT_BODY) { + if (!paused) { + util2.destroy(socket, new BodyTimeoutError()); + } + } else if (timeoutType === TIMEOUT_KEEP_ALIVE) { + assert(client2[kRunning] === 0 && client2[kKeepAliveTimeoutValue]); + util2.destroy(socket, new InformationalError("socket idle timeout")); } } - class RedirectHandler { - constructor(dispatch, maxRedirections, opts, handler2) { - if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { - throw new InvalidArgumentError("maxRedirections must be a positive number"); + async function connectH1(client2, socket) { + client2[kSocket] = socket; + if (!llhttpInstance) { + llhttpInstance = await llhttpPromise; + llhttpPromise = null; + } + socket[kNoRef] = false; + socket[kWriting] = false; + socket[kReset] = false; + socket[kBlocking] = false; + socket[kParser] = new Parser(client2, socket, llhttpInstance); + addListener(socket, "error", function(err) { + assert(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); + const parser = this[kParser]; + if (err.code === "ECONNRESET" && parser.statusCode && !parser.shouldKeepAlive) { + parser.onMessageComplete(); + return; } - util2.validateHandler(handler2, opts.method, opts.upgrade); - this.dispatch = dispatch; - this.location = null; - this.abort = null; - this.opts = { ...opts, maxRedirections: 0 }; - this.maxRedirections = maxRedirections; - this.handler = handler2; - this.history = []; - if (util2.isStream(this.opts.body)) { - if (util2.bodyLength(this.opts.body) === 0) { - this.opts.body.on("data", function() { - assert(false); - }); + this[kError] = err; + this[kClient][kOnError](err); + }); + addListener(socket, "readable", function() { + const parser = this[kParser]; + if (parser) { + parser.readMore(); + } + }); + addListener(socket, "end", function() { + const parser = this[kParser]; + if (parser.statusCode && !parser.shouldKeepAlive) { + parser.onMessageComplete(); + return; + } + util2.destroy(this, new SocketError("other side closed", util2.getSocketInfo(this))); + }); + addListener(socket, "close", function() { + const client3 = this[kClient]; + const parser = this[kParser]; + if (parser) { + if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { + parser.onMessageComplete(); + } + this[kParser].destroy(); + this[kParser] = null; + } + const err = this[kError] || new SocketError("closed", util2.getSocketInfo(this)); + client3[kSocket] = null; + client3[kHTTPContext] = null; + if (client3.destroyed) { + assert(client3[kPending] === 0); + const requests = client3[kQueue].splice(client3[kRunningIdx]); + for (let i = 0; i < requests.length; i++) { + const request2 = requests[i]; + util2.errorRequest(client3, request2, err); } - if (typeof this.opts.body.readableDidRead !== "boolean") { - this.opts.body[kBodyUsed] = false; - EE.prototype.on.call(this.opts.body, "data", function() { - this[kBodyUsed] = true; - }); + } else if (client3[kRunning] > 0 && err.code !== "UND_ERR_INFO") { + const request2 = client3[kQueue][client3[kRunningIdx]]; + client3[kQueue][client3[kRunningIdx]++] = null; + util2.errorRequest(client3, request2, err); + } + client3[kPendingIdx] = client3[kRunningIdx]; + assert(client3[kRunning] === 0); + client3.emit("disconnect", client3[kUrl], [client3], err); + client3[kResume](); + }); + let closed = false; + socket.on("close", () => { + closed = true; + }); + return { + version: "h1", + defaultPipelining: 1, + write(...args) { + return writeH1(client2, ...args); + }, + resume() { + resumeH1(client2); + }, + destroy(err, callback) { + if (closed) { + queueMicrotask(callback); + } else { + socket.destroy(err).on("close", callback); + } + }, + get destroyed() { + return socket.destroyed; + }, + busy(request2) { + if (socket[kWriting] || socket[kReset] || socket[kBlocking]) { + return true; + } + if (request2) { + if (client2[kRunning] > 0 && !request2.idempotent) { + return true; + } + if (client2[kRunning] > 0 && (request2.upgrade || request2.method === "CONNECT")) { + return true; + } + if (client2[kRunning] > 0 && util2.bodyLength(request2.body) !== 0 && (util2.isStream(request2.body) || util2.isAsyncIterable(request2.body) || util2.isFormDataLike(request2.body))) { + return true; + } + } + return false; + } + }; + } + function resumeH1(client2) { + const socket = client2[kSocket]; + if (socket && !socket.destroyed) { + if (client2[kSize] === 0) { + if (!socket[kNoRef] && socket.unref) { + socket.unref(); + socket[kNoRef] = true; + } + } else if (socket[kNoRef] && socket.ref) { + socket.ref(); + socket[kNoRef] = false; + } + if (client2[kSize] === 0) { + if (socket[kParser].timeoutType !== TIMEOUT_KEEP_ALIVE) { + socket[kParser].setTimeout(client2[kKeepAliveTimeoutValue], TIMEOUT_KEEP_ALIVE); + } + } else if (client2[kRunning] > 0 && socket[kParser].statusCode < 200) { + if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) { + const request2 = client2[kQueue][client2[kRunningIdx]]; + const headersTimeout = request2.headersTimeout != null ? request2.headersTimeout : client2[kHeadersTimeout]; + socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS); } - } else if (this.opts.body && typeof this.opts.body.pipeTo === "function") { - this.opts.body = new BodyAsyncIterable(this.opts.body); - } else if (this.opts.body && typeof this.opts.body !== "string" && !ArrayBuffer.isView(this.opts.body) && util2.isIterable(this.opts.body)) { - this.opts.body = new BodyAsyncIterable(this.opts.body); } } - onConnect(abort) { - this.abort = abort; - this.handler.onConnect(abort, { history: this.history }); + } + function shouldSendContentLength(method) { + return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT"; + } + function writeH1(client2, request2) { + const { method, path, host, upgrade, blocking, reset } = request2; + let { body: body2, headers: headers2, contentLength } = request2; + const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH" || method === "QUERY" || method === "PROPFIND" || method === "PROPPATCH"; + if (util2.isFormDataLike(body2)) { + if (!extractBody) { + extractBody = requireBody$1().extractBody; + } + const [bodyStream, contentType] = extractBody(body2); + if (request2.contentType == null) { + headers2.push("content-type", contentType); + } + body2 = bodyStream.stream; + contentLength = bodyStream.length; + } else if (util2.isBlobLike(body2) && request2.contentType == null && body2.type) { + headers2.push("content-type", body2.type); } - onUpgrade(statusCode, headers2, socket) { - this.handler.onUpgrade(statusCode, headers2, socket); + if (body2 && typeof body2.read === "function") { + body2.read(0); } - onError(error) { - this.handler.onError(error); + const bodyLength = util2.bodyLength(body2); + contentLength = bodyLength ?? contentLength; + if (contentLength === null) { + contentLength = request2.contentLength; } - onHeaders(statusCode, headers2, resume, statusText) { - this.location = this.history.length >= this.maxRedirections || util2.isDisturbed(this.opts.body) ? null : parseLocation(statusCode, headers2); - if (this.opts.origin) { - this.history.push(new URL(this.opts.path, this.opts.origin)); - } - if (!this.location) { - return this.handler.onHeaders(statusCode, headers2, resume, statusText); - } - const { origin, pathname, search } = util2.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin))); - const path = search ? `${pathname}${search}` : pathname; - this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin); - this.opts.path = path; - this.opts.origin = origin; - this.opts.maxRedirections = 0; - this.opts.query = null; - if (statusCode === 303 && this.opts.method !== "HEAD") { - this.opts.method = "GET"; - this.opts.body = null; - } + if (contentLength === 0 && !expectsPayload) { + contentLength = null; } - onData(chunk) { - if (this.location) ; - else { - return this.handler.onData(chunk); + if (shouldSendContentLength(method) && contentLength > 0 && request2.contentLength !== null && request2.contentLength !== contentLength) { + if (client2[kStrictContentLength]) { + util2.errorRequest(client2, request2, new RequestContentLengthMismatchError()); + return false; } + process.emitWarning(new RequestContentLengthMismatchError()); } - onComplete(trailers) { - if (this.location) { - this.location = null; - this.abort = null; - this.dispatch(this.opts, this); - } else { - this.handler.onComplete(trailers); + const socket = client2[kSocket]; + const abort = (err) => { + if (request2.aborted || request2.completed) { + return; } + util2.errorRequest(client2, request2, err || new RequestAbortedError()); + util2.destroy(body2); + util2.destroy(socket, new InformationalError("aborted")); + }; + try { + request2.onConnect(abort); + } catch (err) { + util2.errorRequest(client2, request2, err); } - onBodySent(chunk) { - if (this.handler.onBodySent) { - this.handler.onBodySent(chunk); - } + if (request2.aborted) { + return false; } - } - function parseLocation(statusCode, headers2) { - if (redirectableStatusCodes.indexOf(statusCode) === -1) { - return null; + if (method === "HEAD") { + socket[kReset] = true; } - for (let i = 0; i < headers2.length; i += 2) { - if (headers2[i].toString().toLowerCase() === "location") { - return headers2[i + 1]; - } + if (upgrade || method === "CONNECT") { + socket[kReset] = true; } - } - function shouldRemoveHeader(header, removeContent, unknownOrigin) { - if (header.length === 4) { - return util2.headerNameToString(header) === "host"; + if (reset != null) { + socket[kReset] = reset; } - if (removeContent && util2.headerNameToString(header).startsWith("content-")) { - return true; + if (client2[kMaxRequests] && socket[kCounter]++ >= client2[kMaxRequests]) { + socket[kReset] = true; } - if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) { - const name = util2.headerNameToString(header); - return name === "authorization" || name === "cookie" || name === "proxy-authorization"; + if (blocking) { + socket[kBlocking] = true; + } + let header = `${method} ${path} HTTP/1.1\r +`; + if (typeof host === "string") { + header += `host: ${host}\r +`; + } else { + header += client2[kHostHeader]; + } + if (upgrade) { + header += `connection: upgrade\r +upgrade: ${upgrade}\r +`; + } else if (client2[kPipelining] && !socket[kReset]) { + header += "connection: keep-alive\r\n"; + } else { + header += "connection: close\r\n"; } - return false; - } - function cleanRequestHeaders(headers2, removeContent, unknownOrigin) { - const ret = []; if (Array.isArray(headers2)) { - for (let i = 0; i < headers2.length; i += 2) { - if (!shouldRemoveHeader(headers2[i], removeContent, unknownOrigin)) { - ret.push(headers2[i], headers2[i + 1]); - } - } - } else if (headers2 && typeof headers2 === "object") { - for (const key of Object.keys(headers2)) { - if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) { - ret.push(key, headers2[key]); + for (let n = 0; n < headers2.length; n += 2) { + const key = headers2[n + 0]; + const val = headers2[n + 1]; + if (Array.isArray(val)) { + for (let i = 0; i < val.length; i++) { + header += `${key}: ${val[i]}\r +`; + } + } else { + header += `${key}: ${val}\r +`; } } + } + if (channels.sendHeaders.hasSubscribers) { + channels.sendHeaders.publish({ request: request2, headers: header, socket }); + } + if (!body2 || bodyLength === 0) { + writeBuffer(abort, null, client2, request2, socket, contentLength, header, expectsPayload); + } else if (util2.isBuffer(body2)) { + writeBuffer(abort, body2, client2, request2, socket, contentLength, header, expectsPayload); + } else if (util2.isBlobLike(body2)) { + if (typeof body2.stream === "function") { + writeIterable(abort, body2.stream(), client2, request2, socket, contentLength, header, expectsPayload); + } else { + writeBlob(abort, body2, client2, request2, socket, contentLength, header, expectsPayload); + } + } else if (util2.isStream(body2)) { + writeStream(abort, body2, client2, request2, socket, contentLength, header, expectsPayload); + } else if (util2.isIterable(body2)) { + writeIterable(abort, body2, client2, request2, socket, contentLength, header, expectsPayload); } else { - assert(headers2 == null, "headers must be an object or an array"); + assert(false); } - return ret; + return true; } - RedirectHandler_1 = RedirectHandler; - return RedirectHandler_1; -} -var redirectInterceptor; -var hasRequiredRedirectInterceptor; -function requireRedirectInterceptor() { - if (hasRequiredRedirectInterceptor) return redirectInterceptor; - hasRequiredRedirectInterceptor = 1; - const RedirectHandler = requireRedirectHandler(); - function createRedirectInterceptor({ maxRedirections: defaultMaxRedirections }) { - return (dispatch) => { - return function Intercept(opts, handler2) { - const { maxRedirections = defaultMaxRedirections } = opts; - if (!maxRedirections) { - return dispatch(opts, handler2); + function writeStream(abort, body2, client2, request2, socket, contentLength, header, expectsPayload) { + assert(contentLength !== 0 || client2[kRunning] === 0, "stream body cannot be pipelined"); + let finished = false; + const writer = new AsyncWriter({ abort, socket, request: request2, contentLength, client: client2, expectsPayload, header }); + const onData = function(chunk) { + if (finished) { + return; + } + try { + if (!writer.write(chunk) && this.pause) { + this.pause(); } - const redirectHandler = new RedirectHandler(dispatch, maxRedirections, opts, handler2); - opts = { ...opts, maxRedirections: 0 }; - return dispatch(opts, redirectHandler); - }; + } catch (err) { + util2.destroy(this, err); + } }; - } - redirectInterceptor = createRedirectInterceptor; - return redirectInterceptor; -} -var llhttpWasm; -var hasRequiredLlhttpWasm; -function requireLlhttpWasm() { - if (hasRequiredLlhttpWasm) return llhttpWasm; - hasRequiredLlhttpWasm = 1; - llhttpWasm = "AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJs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ADcDACAAQShqQgA3AwAgAEEgakIANwMAIABBEGpCADcDACAAQQhqQgA3AwAgAEHdATYCHEEAC3sBAX8CQCAAKAIMIgMNAAJAIAAoAgRFDQAgACABNgIECwJAIAAgASACEMSAgIAAIgMNACAAKAIMDwsgACADNgIcQQAhAyAAKAIEIgFFDQAgACABIAIgACgCCBGBgICAAAAiAUUNACAAIAI2AhQgACABNgIMIAEhAwsgAwvk8wEDDn8DfgR/I4CAgIAAQRBrIgMkgICAgAAgASEEIAEhBSABIQYgASEHIAEhCCABIQkgASEKIAEhCyABIQwgASENIAEhDiABIQ8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCHCIQQX9qDt0B2gEB2QECAwQFBgcICQoLDA0O2AEPENcBERLWARMUFRYXGBkaG+AB3wEcHR7VAR8gISIjJCXUASYnKCkqKyzTAdIBLS7RAdABLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVG2wFHSElKzwHOAUvNAUzMAU1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4ABgQGCAYMBhAGFAYYBhwGIAYkB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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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FCAAIBA2AgxBACEQDLIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDLEBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxRCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLABCyAAQQA2AhwgACABNgIUIABBxoqAgAA2AhAgAEEHNgIMQQAhEAyvAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAyuAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAytAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMTQsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAysAQsgAEEANgIcIAAgATYCFCAAQdyIgIAANgIQIABBBzYCDEEAIRAMqwELIBBBP0cNASABQQFqIQELQQUhEAyQAQtBACEQIABBADYCHCAAIAE2AhQgAEH9koCAADYCECAAQQc2AgwMqAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMpwELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMpgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEYLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMpQELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0gA2AhwgACAUNgIUIAAgATYCDEEAIRAMpAELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0wA2AhwgACAUNgIUIAAgATYCDEEAIRAMowELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDEMLIABB5QA2AhwgACAUNgIUIAAgATYCDEEAIRAMogELIABBADYCHCAAIBQ2AhQgAEHDj4CAADYCECAAQQc2AgxBACEQDKEBCyAAQQA2AhwgACABNgIUIABBw4+AgAA2AhAgAEEHNgIMQQAhEAygAQtBACEQIABBADYCHCAAIBQ2AhQgAEGMnICAADYCECAAQQc2AgwMnwELIABBADYCHCAAIBQ2AhQgAEGMnICAADYCECAAQQc2AgxBACEQDJ4BCyAAQQA2AhwgACAUNgIUIABB/pGAgAA2AhAgAEEHNgIMQQAhEAydAQsgAEEANgIcIAAgATYCFCAAQY6bgIAANgIQIABBBjYCDEEAIRAMnAELIBBBFUYNVyAAQQA2AhwgACABNgIUIABBzI6AgAA2AhAgAEEgNgIMQQAhEAybAQsgAEEANgIAIBBBAWohAUEkIRALIAAgEDoAKSAAKAIEIRAgAEEANgIEIAAgECABEKuAgIAAIhANVCABIQEMPgsgAEEANgIAC0EAIRAgAEEANgIcIAAgBDYCFCAAQfGbgIAANgIQIABBBjYCDAyXAQsgAUEVRg1QIABBADYCHCAAIAU2AhQgAEHwjICAADYCECAAQRs2AgxBACEQDJYBCyAAKAIEIQUgAEEANgIEIAAgBSAQEKmAgIAAIgUNASAQQQFqIQULQa0BIRAMewsgAEHBATYCHCAAIAU2AgwgACAQQQFqNgIUQQAhEAyTAQsgACgCBCEGIABBADYCBCAAIAYgEBCpgICAACIGDQEgEEEBaiEGC0GuASEQDHgLIABBwgE2AhwgACAGNgIMIAAgEEEBajYCFEEAIRAMkAELIABBADYCHCAAIAc2AhQgAEGXi4CAADYCECAAQQ02AgxBACEQDI8BCyAAQQA2AhwgACAINgIUIABB45CAgAA2AhAgAEEJNgIMQQAhEAyOAQsgAEEANgIcIAAgCDYCFCAAQZSNgIAANgIQIABBITYCDEEAIRAMjQELQQEhFkEAIRdBACEUQQEhEAsgACAQOgArIAlBAWohCAJAAkAgAC0ALUEQcQ0AAkACQAJAIAAtACoOAwEAAgQLIBZFDQMMAgsgFA0BDAILIBdFDQELIAAoAgQhECAAQQA2AgQgACAQIAgQrYCAgAAiEEUNPSAAQckBNgIcIAAgCDYCFCAAIBA2AgxBACEQDIwBCyAAKAIEIQQgAEEANgIEIAAgBCAIEK2AgIAAIgRFDXYgAEHKATYCHCAAIAg2AhQgACAENgIMQQAhEAyLAQsgACgCBCEEIABBADYCBCAAIAQgCRCtgICAACIERQ10IABBywE2AhwgACAJNgIUIAAgBDYCDEEAIRAMigELIAAoAgQhBCAAQQA2AgQgACAEIAoQrYCAgAAiBEUNciAAQc0BNgIcIAAgCjYCFCAAIAQ2AgxBACEQDIkBCwJAIAstAABBUGoiEEH/AXFBCk8NACAAIBA6ACogC0EBaiEKQbYBIRAMcAsgACgCBCEEIABBADYCBCAAIAQgCxCtgICAACIERQ1wIABBzwE2AhwgACALNgIUIAAgBDYCDEEAIRAMiAELIABBADYCHCAAIAQ2AhQgAEGQs4CAADYCECAAQQg2AgwgAEEANgIAQQAhEAyHAQsgAUEVRg0/IABBADYCHCAAIAw2AhQgAEHMjoCAADYCECAAQSA2AgxBACEQDIYBCyAAQYEEOwEoIAAoAgQhECAAQgA3AwAgACAQIAxBAWoiDBCrgICAACIQRQ04IABB0wE2AhwgACAMNgIUIAAgEDYCDEEAIRAMhQELIABBADYCAAtBACEQIABBADYCHCAAIAQ2AhQgAEHYm4CAADYCECAAQQg2AgwMgwELIAAoAgQhECAAQgA3AwAgACAQIAtBAWoiCxCrgICAACIQDQFBxgEhEAxpCyAAQQI6ACgMVQsgAEHVATYCHCAAIAs2AhQgACAQNgIMQQAhEAyAAQsgEEEVRg03IABBADYCHCAAIAQ2AhQgAEGkjICAADYCECAAQRA2AgxBACEQDH8LIAAtADRBAUcNNCAAIAQgAhC8gICAACIQRQ00IBBBFUcNNSAAQdwBNgIcIAAgBDYCFCAAQdWWgIAANgIQIABBFTYCDEEAIRAMfgtBACEQIABBADYCHCAAQa+LgIAANgIQIABBAjYCDCAAIBRBAWo2AhQMfQtBACEQDGMLQQIhEAxiC0ENIRAMYQtBDyEQDGALQSUhEAxfC0ETIRAMXgtBFSEQDF0LQRYhEAxcC0EXIRAMWwtBGCEQDFoLQRkhEAxZC0EaIRAMWAtBGyEQDFcLQRwhEAxWC0EdIRAMVQtBHyEQDFQLQSEhEAxTC0EjIRAMUgtBxgAhEAxRC0EuIRAMUAtBLyEQDE8LQTshEAxOC0E9IRAMTQtByAAhEAxMC0HJACEQDEsLQcsAIRAMSgtBzAAhEAxJC0HOACEQDEgLQdEAIRAMRwtB1QAhEAxGC0HYACEQDEULQdkAIRAMRAtB2wAhEAxDC0HkACEQDEILQeUAIRAMQQtB8QAhEAxAC0H0ACEQDD8LQY0BIRAMPgtBlwEhEAw9C0GpASEQDDwLQawBIRAMOwtBwAEhEAw6C0G5ASEQDDkLQa8BIRAMOAtBsQEhEAw3C0GyASEQDDYLQbQBIRAMNQtBtQEhEAw0C0G6ASEQDDMLQb0BIRAMMgtBvwEhEAwxC0HBASEQDDALIABBADYCHCAAIAQ2AhQgAEHpi4CAADYCECAAQR82AgxBACEQDEgLIABB2wE2AhwgACAENgIUIABB+paAgAA2AhAgAEEVNgIMQQAhEAxHCyAAQfgANgIcIAAgDDYCFCAAQcqYgIAANgIQIABBFTYCDEEAIRAMRgsgAEHRADYCHCAAIAU2AhQgAEGwl4CAADYCECAAQRU2AgxBACEQDEULIABB+QA2AhwgACABNgIUIAAgEDYCDEEAIRAMRAsgAEH4ADYCHCAAIAE2AhQgAEHKmICAADYCECAAQRU2AgxBACEQDEMLIABB5AA2AhwgACABNgIUIABB45eAgAA2AhAgAEEVNgIMQQAhEAxCCyAAQdcANgIcIAAgATYCFCAAQcmXgIAANgIQIABBFTYCDEEAIRAMQQsgAEEANgIcIAAgATYCFCAAQbmNgIAANgIQIABBGjYCDEEAIRAMQAsgAEHCADYCHCAAIAE2AhQgAEHjmICAADYCECAAQRU2AgxBACEQDD8LIABBADYCBCAAIA8gDxCxgICAACIERQ0BIABBOjYCHCAAIAQ2AgwgACAPQQFqNgIUQQAhEAw+CyAAKAIEIQQgAEEANgIEAkAgACAEIAEQsYCAgAAiBEUNACAAQTs2AhwgACAENgIMIAAgAUEBajYCFEEAIRAMPgsgAUEBaiEBDC0LIA9BAWohAQwtCyAAQQA2AhwgACAPNgIUIABB5JKAgAA2AhAgAEEENgIMQQAhEAw7CyAAQTY2AhwgACAENgIUIAAgAjYCDEEAIRAMOgsgAEEuNgIcIAAgDjYCFCAAIAQ2AgxBACEQDDkLIABB0AA2AhwgACABNgIUIABBkZiAgAA2AhAgAEEVNgIMQQAhEAw4CyANQQFqIQEMLAsgAEEVNgIcIAAgATYCFCAAQYKZgIAANgIQIABBFTYCDEEAIRAMNgsgAEEbNgIcIAAgATYCFCAAQZGXgIAANgIQIABBFTYCDEEAIRAMNQsgAEEPNgIcIAAgATYCFCAAQZGXgIAANgIQIABBFTYCDEEAIRAMNAsgAEELNgIcIAAgATYCFCAAQZGXgIAANgIQIABBFTYCDEEAIRAMMwsgAEEaNgIcIAAgATYCFCAAQYKZgIAANgIQIABBFTYCDEEAIRAMMgsgAEELNgIcIAAgATYCFCAAQYKZgIAANgIQIABBFTYCDEEAIRAMMQsgAEEKNgIcIAAgATYCFCAAQeSWgIAANgIQIABBFTYCDEEAIRAMMAsgAEEeNgIcIAAgATYCFCAAQfmXgIAANgIQIABBFTYCDEEAIRAMLwsgAEEANgIcIAAgEDYCFCAAQdqNgIAANgIQIABBFDYCDEEAIRAMLgsgAEEENgIcIAAgATYCFCAAQbCYgIAANgIQIABBFTYCDEEAIRAMLQsgAEEANgIAIAtBAWohCwtBuAEhEAwSCyAAQQA2AgAgEEEBaiEBQfUAIRAMEQsgASEBAkAgAC0AKUEFRw0AQeMAIRAMEQtB4gAhEAwQC0EAIRAgAEEANgIcIABB5JGAgAA2AhAgAEEHNgIMIAAgFEEBajYCFAwoCyAAQQA2AgAgF0EBaiEBQcAAIRAMDgtBASEBCyAAIAE6ACwgAEEANgIAIBdBAWohAQtBKCEQDAsLIAEhAQtBOCEQDAkLAkAgASIPIAJGDQADQAJAIA8tAABBgL6AgABqLQAAIgFBAUYNACABQQJHDQMgD0EBaiEBDAQLIA9BAWoiDyACRw0AC0E+IRAMIgtBPiEQDCELIABBADoALCAPIQEMAQtBCyEQDAYLQTohEAwFCyABQQFqIQFBLSEQDAQLIAAgAToALCAAQQA2AgAgFkEBaiEBQQwhEAwDCyAAQQA2AgAgF0EBaiEBQQohEAwCCyAAQQA2AgALIABBADoALCANIQFBCSEQDAALC0EAIRAgAEEANgIcIAAgCzYCFCAAQc2QgIAANgIQIABBCTYCDAwXC0EAIRAgAEEANgIcIAAgCjYCFCAAQemKgIAANgIQIABBCTYCDAwWC0EAIRAgAEEANgIcIAAgCTYCFCAAQbeQgIAANgIQIABBCTYCDAwVC0EAIRAgAEEANgIcIAAgCDYCFCAAQZyRgIAANgIQIABBCTYCDAwUC0EAIRAgAEEANgIcIAAgATYCFCAAQc2QgIAANgIQIABBCTYCDAwTC0EAIRAgAEEANgIcIAAgATYCFCAAQemKgIAANgIQIABBCTYCDAwSC0EAIRAgAEEANgIcIAAgATYCFCAAQbeQgIAANgIQIABBCTYCDAwRC0EAIRAgAEEANgIcIAAgATYCFCAAQZyRgIAANgIQIABBCTYCDAwQC0EAIRAgAEEANgIcIAAgATYCFCAAQZeVgIAANgIQIABBDzYCDAwPC0EAIRAgAEEANgIcIAAgATYCFCAAQZeVgIAANgIQIABBDzYCDAwOC0EAIRAgAEEANgIcIAAgATYCFCAAQcCSgIAANgIQIABBCzYCDAwNC0EAIRAgAEEANgIcIAAgATYCFCAAQZWJgIAANgIQIABBCzYCDAwMC0EAIRAgAEEANgIcIAAgATYCFCAAQeGPgIAANgIQIABBCjYCDAwLC0EAIRAgAEEANgIcIAAgATYCFCAAQfuPgIAANgIQIABBCjYCDAwKC0EAIRAgAEEANgIcIAAgATYCFCAAQfGZgIAANgIQIABBAjYCDAwJC0EAIRAgAEEANgIcIAAgATYCFCAAQcSUgIAANgIQIABBAjYCDAwIC0EAIRAgAEEANgIcIAAgATYCFCAAQfKVgIAANgIQIABBAjYCDAwHCyAAQQI2AhwgACABNgIUIABBnJqAgAA2AhAgAEEWNgIMQQAhEAwGC0EBIRAMBQtB1AAhECABIgQgAkYNBCADQQhqIAAgBCACQdjCgIAAQQoQxYCAgAAgAygCDCEEIAMoAggOAwEEAgALEMqAgIAAAAsgAEEANgIcIABBtZqAgAA2AhAgAEEXNgIMIAAgBEEBajYCFEEAIRAMAgsgAEEANgIcIAAgBDYCFCAAQcqagIAANgIQIABBCTYCDEEAIRAMAQsCQCABIgQgAkcNAEEiIRAMAQsgAEGJgICAADYCCCAAIAQ2AgRBISEQCyADQRBqJICAgIAAIBALrwEBAn8gASgCACEGAkACQCACIANGDQAgBCAGaiEEIAYgA2ogAmshByACIAZBf3MgBWoiBmohBQNAAkAgAi0AACAELQAARg0AQQIhBAwDCwJAIAYNAEEAIQQgBSECDAMLIAZBf2ohBiAEQQFqIQQgAkEBaiICIANHDQALIAchBiADIQILIABBATYCACABIAY2AgAgACACNgIEDwsgAUEANgIAIAAgBDYCACAAIAI2AgQLCgAgABDHgICAAAvyNgELfyOAgICAAEEQayIBJICAgIAAAkBBACgCoNCAgAANAEEAEMuAgIAAQYDUhIAAayICQdkASQ0AQQAhAwJAQQAoAuDTgIAAIgQNAEEAQn83AuzTgIAAQQBCgICEgICAwAA3AuTTgIAAQQAgAUEIakFwcUHYqtWqBXMiBDYC4NOAgABBAEEANgL004CAAEEAQQA2AsTTgIAAC0EAIAI2AszTgIAAQQBBgNSEgAA2AsjTgIAAQQBBgNSEgAA2ApjQgIAAQQAgBDYCrNCAgABBAEF/NgKo0ICAAANAIANBxNCAgABqIANBuNCAgABqIgQ2AgAgBCADQbDQgIAAaiIFNgIAIANBvNCAgABqIAU2AgAgA0HM0ICAAGogA0HA0ICAAGoiBTYCACAFIAQ2AgAgA0HU0ICAAGogA0HI0ICAAGoiBDYCACAEIAU2AgAgA0HQ0ICAAGogBDYCACADQSBqIgNBgAJHDQALQYDUhIAAQXhBgNSEgABrQQ9xQQBBgNSEgABBCGpBD3EbIgNqIgRBBGogAkFIaiIFIANrIgNBAXI2AgBBAEEAKALw04CAADYCpNCAgABBACADNgKU0ICAAEEAIAQ2AqDQgIAAQYDUhIAAIAVqQTg2AgQLAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB7AFLDQACQEEAKAKI0ICAACIGQRAgAEETakFwcSAAQQtJGyICQQN2IgR2IgNBA3FFDQACQAJAIANBAXEgBHJBAXMiBUEDdCIEQbDQgIAAaiIDIARBuNCAgABqKAIAIgQoAggiAkcNAEEAIAZBfiAFd3E2AojQgIAADAELIAMgAjYCCCACIAM2AgwLIARBCGohAyAEIAVBA3QiBUEDcjYCBCAEIAVqIgQgBCgCBEEBcjYCBAwMCyACQQAoApDQgIAAIgdNDQECQCADRQ0AAkACQCADIAR0QQIgBHQiA0EAIANrcnEiA0EAIANrcUF/aiIDIANBDHZBEHEiA3YiBEEFdkEIcSIFIANyIAQgBXYiA0ECdkEEcSIEciADIAR2IgNBAXZBAnEiBHIgAyAEdiIDQQF2QQFxIgRyIAMgBHZqIgRBA3QiA0Gw0ICAAGoiBSADQbjQgIAAaigCACIDKAIIIgBHDQBBACAGQX4gBHdxIgY2AojQgIAADAELIAUgADYCCCAAIAU2AgwLIAMgAkEDcjYCBCADIARBA3QiBGogBCACayIFNgIAIAMgAmoiACAFQQFyNgIEAkAgB0UNACAHQXhxQbDQgIAAaiECQQAoApzQgIAAIQQCQAJAIAZBASAHQQN2dCIIcQ0AQQAgBiAIcjYCiNCAgAAgAiEIDAELIAIoAgghCAsgCCAENgIMIAIgBDYCCCAEIAI2AgwgBCAINgIICyADQQhqIQNBACAANgKc0ICAAEEAIAU2ApDQgIAADAwLQQAoAozQgIAAIglFDQEgCUEAIAlrcUF/aiIDIANBDHZBEHEiA3YiBEEFdkEIcSIFIANyIAQgBXYiA0ECdkEEcSIEciADIAR2IgNBAXZBAnEiBHIgAyAEdiIDQQF2QQFxIgRyIAMgBHZqQQJ0QbjSgIAAaigCACIAKAIEQXhxIAJrIQQgACEFAkADQAJAIAUoAhAiAw0AIAVBFGooAgAiA0UNAgsgAygCBEF4cSACayIFIAQgBSAESSIFGyEEIAMgACAFGyEAIAMhBQwACwsgACgCGCEKAkAgACgCDCIIIABGDQAgACgCCCIDQQAoApjQgIAASRogCCADNgIIIAMgCDYCDAwLCwJAIABBFGoiBSgCACIDDQAgACgCECIDRQ0DIABBEGohBQsDQCAFIQsgAyIIQRRqIgUoAgAiAw0AIAhBEGohBSAIKAIQIgMNAAsgC0EANgIADAoLQX8hAiAAQb9/Sw0AIABBE2oiA0FwcSECQQAoAozQgIAAIgdFDQBBACELAkAgAkGAAkkNAEEfIQsgAkH///8HSw0AIANBCHYiAyADQYD+P2pBEHZBCHEiA3QiBCAEQYDgH2pBEHZBBHEiBHQiBSAFQYCAD2pBEHZBAnEiBXRBD3YgAyAEciAFcmsiA0EBdCACIANBFWp2QQFxckEcaiELC0EAIAJrIQQCQAJAAkACQCALQQJ0QbjSgIAAaigCACIFDQBBACEDQQAhCAwBC0EAIQMgAkEAQRkgC0EBdmsgC0EfRht0IQBBACEIA0ACQCAFKAIEQXhxIAJrIgYgBE8NACAGIQQgBSEIIAYNAEEAIQQgBSEIIAUhAwwDCyADIAVBFGooAgAiBiAGIAUgAEEddkEEcWpBEGooAgAiBUYbIAMgBhshAyAAQQF0IQAgBQ0ACwsCQCADIAhyDQBBACEIQQIgC3QiA0EAIANrciAHcSIDRQ0DIANBACADa3FBf2oiAyADQQx2QRBxIgN2IgVBBXZBCHEiACADciAFIAB2IgNBAnZBBHEiBXIgAyAFdiIDQQF2QQJxIgVyIAMgBXYiA0EBdkEBcSIFciADIAV2akECdEG40oCAAGooAgAhAwsgA0UNAQsDQCADKAIEQXhxIAJrIgYgBEkhAAJAIAMoAhAiBQ0AIANBFGooAgAhBQsgBiAEIAAbIQQgAyAIIAAbIQggBSEDIAUNAAsLIAhFDQAgBEEAKAKQ0ICAACACa08NACAIKAIYIQsCQCAIKAIMIgAgCEYNACAIKAIIIgNBACgCmNCAgABJGiAAIAM2AgggAyAANgIMDAkLAkAgCEEUaiIFKAIAIgMNACAIKAIQIgNFDQMgCEEQaiEFCwNAIAUhBiADIgBBFGoiBSgCACIDDQAgAEEQaiEFIAAoAhAiAw0ACyAGQQA2AgAMCAsCQEEAKAKQ0ICAACIDIAJJDQBBACgCnNCAgAAhBAJAAkAgAyACayIFQRBJDQAgBCACaiIAIAVBAXI2AgRBACAFNgKQ0ICAAEEAIAA2ApzQgIAAIAQgA2ogBTYCACAEIAJBA3I2AgQMAQsgBCADQQNyNgIEIAQgA2oiAyADKAIEQQFyNgIEQQBBADYCnNCAgABBAEEANgKQ0ICAAAsgBEEIaiEDDAoLAkBBACgClNCAgAAiACACTQ0AQQAoAqDQgIAAIgMgAmoiBCAAIAJrIgVBAXI2AgRBACAFNgKU0ICAAEEAIAQ2AqDQgIAAIAMgAkEDcjYCBCADQQhqIQMMCgsCQAJAQQAoAuDTgIAARQ0AQQAoAujTgIAAIQQMAQtBAEJ/NwLs04CAAEEAQoCAhICAgMAANwLk04CAAEEAIAFBDGpBcHFB2KrVqgVzNgLg04CAAEEAQQA2AvTTgIAAQQBBADYCxNOAgABBgIAEIQQLQQAhAwJAIAQgAkHHAGoiB2oiBkEAIARrIgtxIgggAksNAEEAQTA2AvjTgIAADAoLAkBBACgCwNOAgAAiA0UNAAJAQQAoArjTgIAAIgQgCGoiBSAETQ0AIAUgA00NAQtBACEDQQBBMDYC+NOAgAAMCgtBAC0AxNOAgABBBHENBAJAAkACQEEAKAKg0ICAACIERQ0AQcjTgIAAIQMDQAJAIAMoAgAiBSAESw0AIAUgAygCBGogBEsNAwsgAygCCCIDDQALC0EAEMuAgIAAIgBBf0YNBSAIIQYCQEEAKALk04CAACIDQX9qIgQgAHFFDQAgCCAAayAEIABqQQAgA2txaiEGCyAGIAJNDQUgBkH+////B0sNBQJAQQAoAsDTgIAAIgNFDQBBACgCuNOAgAAiBCAGaiIFIARNDQYgBSADSw0GCyAGEMuAgIAAIgMgAEcNAQwHCyAGIABrIAtxIgZB/v///wdLDQQgBhDLgICAACIAIAMoAgAgAygCBGpGDQMgACEDCwJAIANBf0YNACACQcgAaiAGTQ0AAkAgByAGa0EAKALo04CAACIEakEAIARrcSIEQf7///8HTQ0AIAMhAAwHCwJAIAQQy4CAgABBf0YNACAEIAZqIQYgAyEADAcLQQAgBmsQy4CAgAAaDAQLIAMhACADQX9HDQUMAwtBACEIDAcLQQAhAAwFCyAAQX9HDQILQQBBACgCxNOAgABBBHI2AsTTgIAACyAIQf7///8HSw0BIAgQy4CAgAAhAEEAEMuAgIAAIQMgAEF/Rg0BIANBf0YNASAAIANPDQEgAyAAayIGIAJBOGpNDQELQQBBACgCuNOAgAAgBmoiAzYCuNOAgAACQCADQQAoArzTgIAATQ0AQQAgAzYCvNOAgAALAkACQAJAAkBBACgCoNCAgAAiBEUNAEHI04CAACEDA0AgACADKAIAIgUgAygCBCIIakYNAiADKAIIIgMNAAwDCwsCQAJAQQAoApjQgIAAIgNFDQAgACADTw0BC0EAIAA2ApjQgIAAC0EAIQNBACAGNgLM04CAAEEAIAA2AsjTgIAAQQBBfzYCqNCAgABBAEEAKALg04CAADYCrNCAgABBAEEANgLU04CAAANAIANBxNCAgABqIANBuNCAgABqIgQ2AgAgBCADQbDQgIAAaiIFNgIAIANBvNCAgABqIAU2AgAgA0HM0ICAAGogA0HA0ICAAGoiBTYCACAFIAQ2AgAgA0HU0ICAAGogA0HI0ICAAGoiBDYCACAEIAU2AgAgA0HQ0ICAAGogBDYCACADQSBqIgNBgAJHDQALIABBeCAAa0EPcUEAIABBCGpBD3EbIgNqIgQgBkFIaiIFIANrIgNBAXI2AgRBAEEAKALw04CAADYCpNCAgABBACADNgKU0ICAAEEAIAQ2AqDQgIAAIAAgBWpBODYCBAwCCyADLQAMQQhxDQAgBCAFSQ0AIAQgAE8NACAEQXggBGtBD3FBACAEQQhqQQ9xGyIFaiIAQQAoApTQgIAAIAZqIgsgBWsiBUEBcjYCBCADIAggBmo2AgRBAEEAKALw04CAADYCpNCAgABBACAFNgKU0ICAAEEAIAA2AqDQgIAAIAQgC2pBODYCBAwBCwJAIABBACgCmNCAgAAiCE8NAEEAIAA2ApjQgIAAIAAhCAsgACAGaiEFQcjTgIAAIQMCQAJAAkACQAJAAkACQANAIAMoAgAgBUYNASADKAIIIgMNAAwCCwsgAy0ADEEIcUUNAQtByNOAgAAhAwNAAkAgAygCACIFIARLDQAgBSADKAIEaiIFIARLDQMLIAMoAgghAwwACwsgAyAANgIAIAMgAygCBCAGajYCBCAAQXggAGtBD3FBACAAQQhqQQ9xG2oiCyACQQNyNgIEIAVBeCAFa0EPcUEAIAVBCGpBD3EbaiIGIAsgAmoiAmshAwJAIAYgBEcNAEEAIAI2AqDQgIAAQQBBACgClNCAgAAgA2oiAzYClNCAgAAgAiADQQFyNgIEDAMLAkAgBkEAKAKc0ICAAEcNAEEAIAI2ApzQgIAAQQBBACgCkNCAgAAgA2oiAzYCkNCAgAAgAiADQQFyNgIEIAIgA2ogAzYCAAwDCwJAIAYoAgQiBEEDcUEBRw0AIARBeHEhBwJAAkAgBEH/AUsNACAGKAIIIgUgBEEDdiIIQQN0QbDQgIAAaiIARhoCQCAGKAIMIgQgBUcNAEEAQQAoAojQgIAAQX4gCHdxNgKI0ICAAAwCCyAEIABGGiAEIAU2AgggBSAENgIMDAELIAYoAhghCQJAAkAgBigCDCIAIAZGDQAgBigCCCIEIAhJGiAAIAQ2AgggBCAANgIMDAELAkAgBkEUaiIEKAIAIgUNACAGQRBqIgQoAgAiBQ0AQQAhAAwBCwNAIAQhCCAFIgBBFGoiBCgCACIFDQAgAEEQaiEEIAAoAhAiBQ0ACyAIQQA2AgALIAlFDQACQAJAIAYgBigCHCIFQQJ0QbjSgIAAaiIEKAIARw0AIAQgADYCACAADQFBAEEAKAKM0ICAAEF+IAV3cTYCjNCAgAAMAgsgCUEQQRQgCSgCECAGRhtqIAA2AgAgAEUNAQsgACAJNgIYAkAgBigCECIERQ0AIAAgBDYCECAEIAA2AhgLIAYoAhQiBEUNACAAQRRqIAQ2AgAgBCAANgIYCyAHIANqIQMgBiAHaiIGKAIEIQQLIAYgBEF+cTYCBCACIANqIAM2AgAgAiADQQFyNgIEAkAgA0H/AUsNACADQXhxQbDQgIAAaiEEAkACQEEAKAKI0ICAACIFQQEgA0EDdnQiA3ENAEEAIAUgA3I2AojQgIAAIAQhAwwBCyAEKAIIIQMLIAMgAjYCDCAEIAI2AgggAiAENgIMIAIgAzYCCAwDC0EfIQQCQCADQf///wdLDQAgA0EIdiIEIARBgP4/akEQdkEIcSIEdCIFIAVBgOAfakEQdkEEcSIFdCIAIABBgIAPakEQdkECcSIAdEEPdiAEIAVyIAByayIEQQF0IAMgBEEVanZBAXFyQRxqIQQLIAIgBDYCHCACQgA3AhAgBEECdEG40oCAAGohBQJAQQAoAozQgIAAIgBBASAEdCIIcQ0AIAUgAjYCAEEAIAAgCHI2AozQgIAAIAIgBTYCGCACIAI2AgggAiACNgIMDAMLIANBAEEZIARBAXZrIARBH0YbdCEEIAUoAgAhAANAIAAiBSgCBEF4cSADRg0CIARBHXYhACAEQQF0IQQgBSAAQQRxakEQaiIIKAIAIgANAAsgCCACNgIAIAIgBTYCGCACIAI2AgwgAiACNgIIDAILIABBeCAAa0EPcUEAIABBCGpBD3EbIgNqIgsgBkFIaiIIIANrIgNBAXI2AgQgACAIakE4NgIEIAQgBUE3IAVrQQ9xQQAgBUFJakEPcRtqQUFqIgggCCAEQRBqSRsiCEEjNgIEQQBBACgC8NOAgAA2AqTQgIAAQQAgAzYClNCAgABBACALNgKg0ICAACAIQRBqQQApAtDTgIAANwIAIAhBACkCyNOAgAA3AghBACAIQQhqNgLQ04CAAEEAIAY2AszTgIAAQQAgADYCyNOAgABBAEEANgLU04CAACAIQSRqIQMDQCADQQc2AgAgA0EEaiIDIAVJDQALIAggBEYNAyAIIAgoAgRBfnE2AgQgCCAIIARrIgA2AgAgBCAAQQFyNgIEAkAgAEH/AUsNACAAQXhxQbDQgIAAaiEDAkACQEEAKAKI0ICAACIFQQEgAEEDdnQiAHENAEEAIAUgAHI2AojQgIAAIAMhBQwBCyADKAIIIQULIAUgBDYCDCADIAQ2AgggBCADNgIMIAQgBTYCCAwEC0EfIQMCQCAAQf///wdLDQAgAEEIdiIDIANBgP4/akEQdkEIcSIDdCIFIAVBgOAfakEQdkEEcSIFdCIIIAhBgIAPakEQdkECcSIIdEEPdiADIAVyIAhyayIDQQF0IAAgA0EVanZBAXFyQRxqIQMLIAQgAzYCHCAEQgA3AhAgA0ECdEG40oCAAGohBQJAQQAoAozQgIAAIghBASADdCIGcQ0AIAUgBDYCAEEAIAggBnI2AozQgIAAIAQgBTYCGCAEIAQ2AgggBCAENgIMDAQLIABBAEEZIANBAXZrIANBH0YbdCEDIAUoAgAhCANAIAgiBSgCBEF4cSAARg0DIANBHXYhCCADQQF0IQMgBSAIQQRxakEQaiIGKAIAIggNAAsgBiAENgIAIAQgBTYCGCAEIAQ2AgwgBCAENgIIDAMLIAUoAggiAyACNgIMIAUgAjYCCCACQQA2AhggAiAFNgIMIAIgAzYCCAsgC0EIaiEDDAULIAUoAggiAyAENgIMIAUgBDYCCCAEQQA2AhggBCAFNgIMIAQgAzYCCAtBACgClNCAgAAiAyACTQ0AQQAoAqDQgIAAIgQgAmoiBSADIAJrIgNBAXI2AgRBACADNgKU0ICAAEEAIAU2AqDQgIAAIAQgAkEDcjYCBCAEQQhqIQMMAwtBACEDQQBBMDYC+NOAgAAMAgsCQCALRQ0AAkACQCAIIAgoAhwiBUECdEG40oCAAGoiAygCAEcNACADIAA2AgAgAA0BQQAgB0F+IAV3cSIHNgKM0ICAAAwCCyALQRBBFCALKAIQIAhGG2ogADYCACAARQ0BCyAAIAs2AhgCQCAIKAIQIgNFDQAgACADNgIQIAMgADYCGAsgCEEUaigCACIDRQ0AIABBFGogAzYCACADIAA2AhgLAkACQCAEQQ9LDQAgCCAEIAJqIgNBA3I2AgQgCCADaiIDIAMoAgRBAXI2AgQMAQsgCCACaiIAIARBAXI2AgQgCCACQQNyNgIEIAAgBGogBDYCAAJAIARB/wFLDQAgBEF4cUGw0ICAAGohAwJAAkBBACgCiNCAgAAiBUEBIARBA3Z0IgRxDQBBACAFIARyNgKI0ICAACADIQQMAQsgAygCCCEECyAEIAA2AgwgAyAANgIIIAAgAzYCDCAAIAQ2AggMAQtBHyEDAkAgBEH///8HSw0AIARBCHYiAyADQYD+P2pBEHZBCHEiA3QiBSAFQYDgH2pBEHZBBHEiBXQiAiACQYCAD2pBEHZBAnEiAnRBD3YgAyAFciACcmsiA0EBdCAEIANBFWp2QQFxckEcaiEDCyAAIAM2AhwgAEIANwIQIANBAnRBuNKAgABqIQUCQCAHQQEgA3QiAnENACAFIAA2AgBBACAHIAJyNgKM0ICAACAAIAU2AhggACAANgIIIAAgADYCDAwBCyAEQQBBGSADQQF2ayADQR9GG3QhAyAFKAIAIQICQANAIAIiBSgCBEF4cSAERg0BIANBHXYhAiADQQF0IQMgBSACQQRxakEQaiIGKAIAIgINAAsgBiAANgIAIAAgBTYCGCAAIAA2AgwgACAANgIIDAELIAUoAggiAyAANgIMIAUgADYCCCAAQQA2AhggACAFNgIMIAAgAzYCCAsgCEEIaiEDDAELAkAgCkUNAAJAAkAgACAAKAIcIgVBAnRBuNKAgABqIgMoAgBHDQAgAyAINgIAIAgNAUEAIAlBfiAFd3E2AozQgIAADAILIApBEEEUIAooAhAgAEYbaiAINgIAIAhFDQELIAggCjYCGAJAIAAoAhAiA0UNACAIIAM2AhAgAyAINgIYCyAAQRRqKAIAIgNFDQAgCEEUaiADNgIAIAMgCDYCGAsCQAJAIARBD0sNACAAIAQgAmoiA0EDcjYCBCAAIANqIgMgAygCBEEBcjYCBAwBCyAAIAJqIgUgBEEBcjYCBCAAIAJBA3I2AgQgBSAEaiAENgIAAkAgB0UNACAHQXhxQbDQgIAAaiECQQAoApzQgIAAIQMCQAJAQQEgB0EDdnQiCCAGcQ0AQQAgCCAGcjYCiNCAgAAgAiEIDAELIAIoAgghCAsgCCADNgIMIAIgAzYCCCADIAI2AgwgAyAINgIIC0EAIAU2ApzQgIAAQQAgBDYCkNCAgAALIABBCGohAwsgAUEQaiSAgICAACADCwoAIAAQyYCAgAAL4g0BB38CQCAARQ0AIABBeGoiASAAQXxqKAIAIgJBeHEiAGohAwJAIAJBAXENACACQQNxRQ0BIAEgASgCACICayIBQQAoApjQgIAAIgRJDQEgAiAAaiEAAkAgAUEAKAKc0ICAAEYNAAJAIAJB/wFLDQAgASgCCCIEIAJBA3YiBUEDdEGw0ICAAGoiBkYaAkAgASgCDCICIARHDQBBAEEAKAKI0ICAAEF+IAV3cTYCiNCAgAAMAwsgAiAGRhogAiAENgIIIAQgAjYCDAwCCyABKAIYIQcCQAJAIAEoAgwiBiABRg0AIAEoAggiAiAESRogBiACNgIIIAIgBjYCDAwBCwJAIAFBFGoiAigCACIEDQAgAUEQaiICKAIAIgQNAEEAIQYMAQsDQCACIQUgBCIGQRRqIgIoAgAiBA0AIAZBEGohAiAGKAIQIgQNAAsgBUEANgIACyAHRQ0BAkACQCABIAEoAhwiBEECdEG40oCAAGoiAigCAEcNACACIAY2AgAgBg0BQQBBACgCjNCAgABBfiAEd3E2AozQgIAADAMLIAdBEEEUIAcoAhAgAUYbaiAGNgIAIAZFDQILIAYgBzYCGAJAIAEoAhAiAkUNACAGIAI2AhAgAiAGNgIYCyABKAIUIgJFDQEgBkEUaiACNgIAIAIgBjYCGAwBCyADKAIEIgJBA3FBA0cNACADIAJBfnE2AgRBACAANgKQ0ICAACABIABqIAA2AgAgASAAQQFyNgIEDwsgASADTw0AIAMoAgQiAkEBcUUNAAJAAkAgAkECcQ0AAkAgA0EAKAKg0ICAAEcNAEEAIAE2AqDQgIAAQQBBACgClNCAgAAgAGoiADYClNCAgAAgASAAQQFyNgIEIAFBACgCnNCAgABHDQNBAEEANgKQ0ICAAEEAQQA2ApzQgIAADwsCQCADQQAoApzQgIAARw0AQQAgATYCnNCAgABBAEEAKAKQ0ICAACAAaiIANgKQ0ICAACABIABBAXI2AgQgASAAaiAANgIADwsgAkF4cSAAaiEAAkACQCACQf8BSw0AIAMoAggiBCACQQN2IgVBA3RBsNCAgABqIgZGGgJAIAMoAgwiAiAERw0AQQBBACgCiNCAgABBfiAFd3E2AojQgIAADAILIAIgBkYaIAIgBDYCCCAEIAI2AgwMAQsgAygCGCEHAkACQCADKAIMIgYgA0YNACADKAIIIgJBACgCmNCAgABJGiAGIAI2AgggAiAGNgIMDAELAkAgA0EUaiICKAIAIgQNACADQRBqIgIoAgAiBA0AQQAhBgwBCwNAIAIhBSAEIgZBFGoiAigCACIEDQAgBkEQaiECIAYoAhAiBA0ACyAFQQA2AgALIAdFDQACQAJAIAMgAygCHCIEQQJ0QbjSgIAAaiICKAIARw0AIAIgBjYCACAGDQFBAEEAKAKM0ICAAEF+IAR3cTYCjNCAgAAMAgsgB0EQQRQgBygCECADRhtqIAY2AgAgBkUNAQsgBiAHNgIYAkAgAygCECICRQ0AIAYgAjYCECACIAY2AhgLIAMoAhQiAkUNACAGQRRqIAI2AgAgAiAGNgIYCyABIABqIAA2AgAgASAAQQFyNgIEIAFBACgCnNCAgABHDQFBACAANgKQ0ICAAA8LIAMgAkF+cTYCBCABIABqIAA2AgAgASAAQQFyNgIECwJAIABB/wFLDQAgAEF4cUGw0ICAAGohAgJAAkBBACgCiNCAgAAiBEEBIABBA3Z0IgBxDQBBACAEIAByNgKI0ICAACACIQAMAQsgAigCCCEACyAAIAE2AgwgAiABNgIIIAEgAjYCDCABIAA2AggPC0EfIQICQCAAQf///wdLDQAgAEEIdiICIAJBgP4/akEQdkEIcSICdCIEIARBgOAfakEQdkEEcSIEdCIGIAZBgIAPakEQdkECcSIGdEEPdiACIARyIAZyayICQQF0IAAgAkEVanZBAXFyQRxqIQILIAEgAjYCHCABQgA3AhAgAkECdEG40oCAAGohBAJAAkBBACgCjNCAgAAiBkEBIAJ0IgNxDQAgBCABNgIAQQAgBiADcjYCjNCAgAAgASAENgIYIAEgATYCCCABIAE2AgwMAQsgAEEAQRkgAkEBdmsgAkEfRht0IQIgBCgCACEGAkADQCAGIgQoAgRBeHEgAEYNASACQR12IQYgAkEBdCECIAQgBkEEcWpBEGoiAygCACIGDQALIAMgATYCACABIAQ2AhggASABNgIMIAEgATYCCAwBCyAEKAIIIgAgATYCDCAEIAE2AgggAUEANgIYIAEgBDYCDCABIAA2AggLQQBBACgCqNCAgABBf2oiAUF/IAEbNgKo0ICAAAsLBAAAAAtOAAJAIAANAD8AQRB0DwsCQCAAQf//A3ENACAAQX9MDQACQCAAQRB2QAAiAEF/Rw0AQQBBMDYC+NOAgABBfw8LIABBEHQPCxDKgICAAAAL8gICA38BfgJAIAJFDQAgACABOgAAIAIgAGoiA0F/aiABOgAAIAJBA0kNACAAIAE6AAIgACABOgABIANBfWogAToAACADQX5qIAE6AAAgAkEHSQ0AIAAgAToAAyADQXxqIAE6AAAgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIFayICQSBJDQAgAa1CgYCAgBB+IQYgAyAFaiEBA0AgASAGNwMYIAEgBjcDECABIAY3AwggASAGNwMAIAFBIGohASACQWBqIgJBH0sNAAsLIAALC45IAQBBgAgLhkgBAAAAAgAAAAMAAAAAAAAAAAAAAAQAAAAFAAAAAAAAAAAAAAAGAAAABwAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEludmFsaWQgY2hhciBpbiB1cmwgcXVlcnkAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9ib2R5AENvbnRlbnQtTGVuZ3RoIG92ZXJmbG93AENodW5rIHNpemUgb3ZlcmZsb3cAUmVzcG9uc2Ugb3ZlcmZsb3cASW52YWxpZCBtZXRob2QgZm9yIEhUVFAveC54IHJlcXVlc3QASW52YWxpZCBtZXRob2QgZm9yIFJUU1AveC54IHJlcXVlc3QARXhwZWN0ZWQgU09VUkNFIG1ldGhvZCBmb3IgSUNFL3gueCByZXF1ZXN0AEludmFsaWQgY2hhciBpbiB1cmwgZnJhZ21lbnQgc3RhcnQARXhwZWN0ZWQgZG90AFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fc3RhdHVzAEludmFsaWQgcmVzcG9uc2Ugc3RhdHVzAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMAVXNlciBjYWxsYmFjayBlcnJvcgBgb25fcmVzZXRgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19oZWFkZXJgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21ldGhvZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lYCBjYWxsYmFjayBlcnJvcgBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNlcnZlcgBJbnZhbGlkIGhlYWRlciB2YWx1ZSBjaGFyAEludmFsaWQgaGVhZGVyIGZpZWxkIGNoYXIAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl92ZXJzaW9uAEludmFsaWQgbWlub3IgdmVyc2lvbgBJbnZhbGlkIG1ham9yIHZlcnNpb24ARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgdmVyc2lvbgBFeHBlY3RlZCBDUkxGIGFmdGVyIHZlcnNpb24ASW52YWxpZCBIVFRQIHZlcnNpb24ASW52YWxpZCBoZWFkZXIgdG9rZW4AU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl91cmwASW52YWxpZCBjaGFyYWN0ZXJzIGluIHVybABVbmV4cGVjdGVkIHN0YXJ0IGNoYXIgaW4gdXJsAERvdWJsZSBAIGluIHVybABFbXB0eSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXJhY3RlciBpbiBDb250ZW50LUxlbmd0aABEdXBsaWNhdGUgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyIGluIHVybCBwYXRoAENvbnRlbnQtTGVuZ3RoIGNhbid0IGJlIHByZXNlbnQgd2l0aCBUcmFuc2Zlci1FbmNvZGluZwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBzaXplAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX3ZhbHVlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgdmFsdWUATWlzc2luZyBleHBlY3RlZCBMRiBhZnRlciBoZWFkZXIgdmFsdWUASW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fbmFtZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIG5hbWUAUGF1c2Ugb24gQ09OTkVDVC9VcGdyYWRlAFBhdXNlIG9uIFBSSS9VcGdyYWRlAEV4cGVjdGVkIEhUVFAvMiBDb25uZWN0aW9uIFByZWZhY2UAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9tZXRob2QARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgbWV0aG9kAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX2ZpZWxkAFBhdXNlZABJbnZhbGlkIHdvcmQgZW5jb3VudGVyZWQASW52YWxpZCBtZXRob2QgZW5jb3VudGVyZWQAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzY2hlbWEAUmVxdWVzdCBoYXMgaW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX0NIVU5LX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX05BTUVfQ09NUExFVEUASFBFX0NCX01FU1NBR0VfQ09NUExFVEUASFBFX0NCX01FVEhPRF9DT01QTEVURQBIUEVfQ0JfSEVBREVSX0ZJRUxEX0NPTVBMRVRFAERFTEVURQBIUEVfSU5WQUxJRF9FT0ZfU1RBVEUASU5WQUxJRF9TU0xfQ0VSVElGSUNBVEUAUEFVU0UATk9fUkVTUE9OU0UAVU5TVVBQT1JURURfTUVESUFfVFlQRQBHT05FAE5PVF9BQ0NFUFRBQkxFAFNFUlZJQ0VfVU5BVkFJTEFCTEUAUkFOR0VfTk9UX1NBVElTRklBQkxFAE9SSUdJTl9JU19VTlJFQUNIQUJMRQBSRVNQT05TRV9JU19TVEFMRQBQVVJHRQBNRVJHRQBSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFAFJFUVVFU1RfSEVBREVSX1RPT19MQVJHRQBQQVlMT0FEX1RPT19MQVJHRQBJTlNVRkZJQ0lFTlRfU1RPUkFHRQBIUEVfUEFVU0VEX1VQR1JBREUASFBFX1BBVVNFRF9IMl9VUEdSQURFAFNPVVJDRQBBTk5PVU5DRQBUUkFDRQBIUEVfVU5FWFBFQ1RFRF9TUEFDRQBERVNDUklCRQBVTlNVQlNDUklCRQBSRUNPUkQASFBFX0lOVkFMSURfTUVUSE9EAE5PVF9GT1VORABQUk9QRklORABVTkJJTkQAUkVCSU5EAFVOQVVUSE9SSVpFRABNRVRIT0RfTk9UX0FMTE9XRUQASFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQAQUxSRUFEWV9SRVBPUlRFRABBQ0NFUFRFRABOT1RfSU1QTEVNRU5URUQATE9PUF9ERVRFQ1RFRABIUEVfQ1JfRVhQRUNURUQASFBFX0xGX0VYUEVDVEVEAENSRUFURUQASU1fVVNFRABIUEVfUEFVU0VEAFRJTUVPVVRfT0NDVVJFRABQQVlNRU5UX1JFUVVJUkVEAFBSRUNPTkRJVElPTl9SRVFVSVJFRABQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRABORVRXT1JLX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAExFTkdUSF9SRVFVSVJFRABTU0xfQ0VSVElGSUNBVEVfUkVRVUlSRUQAVVBHUkFERV9SRVFVSVJFRABQQUdFX0VYUElSRUQAUFJFQ09ORElUSU9OX0ZBSUxFRABFWFBFQ1RBVElPTl9GQUlMRUQAUkVWQUxJREFUSU9OX0ZBSUxFRABTU0xfSEFORFNIQUtFX0ZBSUxFRABMT0NLRUQAVFJBTlNGT1JNQVRJT05fQVBQTElFRABOT1RfTU9ESUZJRUQATk9UX0VYVEVOREVEAEJBTkRXSURUSF9MSU1JVF9FWENFRURFRABTSVRFX0lTX09WRVJMT0FERUQASEVBRABFeHBlY3RlZCBIVFRQLwAAXhMAACYTAAAwEAAA8BcAAJ0TAAAVEgAAORcAAPASAAAKEAAAdRIAAK0SAACCEwAATxQAAH8QAACgFQAAIxQAAIkSAACLFAAATRUAANQRAADPFAAAEBgAAMkWAADcFgAAwREAAOAXAAC7FAAAdBQAAHwVAADlFAAACBcAAB8QAABlFQAAoxQAACgVAAACFQAAmRUAACwQAACLGQAATw8AANQOAABqEAAAzhAAAAIXAACJDgAAbhMAABwTAABmFAAAVhcAAMETAADNEwAAbBMAAGgXAABmFwAAXxcAACITAADODwAAaQ4AANgOAABjFgAAyxMAAKoOAAAoFwAAJhcAAMUTAABdFgAA6BEAAGcTAABlEwAA8hYAAHMTAAAdFwAA+RYAAPMRAADPDgAAzhUAAAwSAACzEQAApREAAGEQAAAyFwAAuxMAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIDAgICAgIAAAICAAICAAICAgICAgICAgIABAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbG9zZWVlcC1hbGl2ZQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEAAAEBAAEBAAEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AAAAAAAAAAAAAAAAAAAByYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AAAAAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQIAAQMAAAAAAAAAAAAAAAAAAAAAAAAEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQAAAgAAAAAAAAAAAAAAAAAAAAAAAAMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAIAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOT1VOQ0VFQ0tPVVRORUNURVRFQ1JJQkVMVVNIRVRFQURTRUFSQ0hSR0VDVElWSVRZTEVOREFSVkVPVElGWVBUSU9OU0NIU0VBWVNUQVRDSEdFT1JESVJFQ1RPUlRSQ0hQQVJBTUVURVJVUkNFQlNDUklCRUFSRE9XTkFDRUlORE5LQ0tVQlNDUklCRUhUVFAvQURUUC8="; - return llhttpWasm; -} -var llhttp_simdWasm; -var hasRequiredLlhttp_simdWasm; -function requireLlhttp_simdWasm() { - if (hasRequiredLlhttp_simdWasm) return llhttp_simdWasm; - hasRequiredLlhttp_simdWasm = 1; - llhttp_simdWasm = "AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJs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IAH9CwMAIABBMGogAf0LAwAgAEEgaiAB/QsDACAAQd0BNgIcQQALewEBfwJAIAAoAgwiAw0AAkAgACgCBEUNACAAIAE2AgQLAkAgACABIAIQxICAgAAiAw0AIAAoAgwPCyAAIAM2AhxBACEDIAAoAgQiAUUNACAAIAEgAiAAKAIIEYGAgIAAACIBRQ0AIAAgAjYCFCAAIAE2AgwgASEDCyADC+TzAQMOfwN+BH8jgICAgABBEGsiAySAgICAACABIQQgASEFIAEhBiABIQcgASEIIAEhCSABIQogASELIAEhDCABIQ0gASEOIAEhDwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIcIhBBf2oO3QHaAQHZAQIDBAUGBwgJCgsMDQ7YAQ8Q1wEREtYBExQVFhcYGRob4AHfARwdHtUBHyAhIiMkJdQBJicoKSorLNMB0gEtLtEB0AEvMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUbbAUdISUrPAc4BS80BTMwBTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEB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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAOxwEAAQID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YWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsb3NlZWVwLWFsaXZlAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgAAAAAAAAAAAAAAAAAAAHJhbnNmZXItZW5jb2RpbmdwZ3JhZGUNCg0KDQpTTQ0KDQpUVFAvQ0UvVFNQLwAAAAAAAAAAAAAAAAECAAEDAAAAAAAAAAAAAAAAAAAAAAAABAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAABAAACAAAAAAAAAAAAAAAAAAAAAAAAAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAgAAAAACAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw=="; - return llhttp_simdWasm; -} -var client; -var hasRequiredClient; -function requireClient() { - if (hasRequiredClient) return client; - hasRequiredClient = 1; - const assert = require$$0$3; - const net = require$$0$4; - const http = require$$2$1; - const { pipeline } = require$$0$5; - const util2 = requireUtil$6(); - const timers2 = requireTimers(); - const Request = requireRequest$1(); - const DispatcherBase = requireDispatcherBase(); - const { - RequestContentLengthMismatchError, - ResponseContentLengthMismatchError, - InvalidArgumentError, - RequestAbortedError, - HeadersTimeoutError, - HeadersOverflowError, - SocketError, - InformationalError, - BodyTimeoutError, - HTTPParserError, - ResponseExceededMaxSizeError, - ClientDestroyedError - } = requireErrors(); - const buildConnector = requireConnect(); - const { - kUrl, - kReset, - kServerName, - kClient, - kBusy, - kParser, - kConnect, - kBlocking, - kResuming, - kRunning, - kPending, - kSize, - kWriting, - kQueue, - kConnected, - kConnecting, - kNeedDrain, - kNoRef, - kKeepAliveDefaultTimeout, - kHostHeader, - kPendingIdx, - kRunningIdx, - kError, - kPipelining, - kSocket, - kKeepAliveTimeoutValue, - kMaxHeadersSize, - kKeepAliveMaxTimeout, - kKeepAliveTimeoutThreshold, - kHeadersTimeout, - kBodyTimeout, - kStrictContentLength, - kConnector, - kMaxRedirections, - kMaxRequests, - kCounter, - kClose, - kDestroy, - kDispatch, - kInterceptors, - kLocalAddress, - kMaxResponseSize, - kHTTPConnVersion, - // HTTP2 - kHost, - kHTTP2Session, - kHTTP2SessionState, - kHTTP2BuildRequest, - kHTTP2CopyHeaders, - kHTTP1BuildRequest - } = requireSymbols$4(); - let http2; - try { - http2 = require("http2"); - } catch { - http2 = { constants: {} }; - } - const { - constants: { - HTTP2_HEADER_AUTHORITY, - HTTP2_HEADER_METHOD, - HTTP2_HEADER_PATH, - HTTP2_HEADER_SCHEME, - HTTP2_HEADER_CONTENT_LENGTH, - HTTP2_HEADER_EXPECT, - HTTP2_HEADER_STATUS - } - } = http2; - let h2ExperimentalWarned = false; - const FastBuffer = Buffer[Symbol.species]; - const kClosedResolve = /* @__PURE__ */ Symbol("kClosedResolve"); - const channels = {}; - try { - const diagnosticsChannel = require("diagnostics_channel"); - channels.sendHeaders = diagnosticsChannel.channel("undici:client:sendHeaders"); - channels.beforeConnect = diagnosticsChannel.channel("undici:client:beforeConnect"); - channels.connectError = diagnosticsChannel.channel("undici:client:connectError"); - channels.connected = diagnosticsChannel.channel("undici:client:connected"); - } catch { - channels.sendHeaders = { hasSubscribers: false }; - channels.beforeConnect = { hasSubscribers: false }; - channels.connectError = { hasSubscribers: false }; - channels.connected = { hasSubscribers: false }; - } - class Client extends DispatcherBase { - /** - * - * @param {string|URL} url - * @param {import('../types/client').Client.Options} options - */ - constructor(url, { - interceptors, - maxHeaderSize, - headersTimeout, - socketTimeout, - requestTimeout, - connectTimeout, - bodyTimeout, - idleTimeout, - keepAlive, - keepAliveTimeout, - maxKeepAliveTimeout, - keepAliveMaxTimeout, - keepAliveTimeoutThreshold, - socketPath, - pipelining, - tls, - strictContentLength, - maxCachedSessions, - maxRedirections, - connect: connect3, - maxRequestsPerClient, - localAddress, - maxResponseSize, - autoSelectFamily, - autoSelectFamilyAttemptTimeout, - // h2 - allowH2, - maxConcurrentStreams - } = {}) { - super(); - if (keepAlive !== void 0) { - throw new InvalidArgumentError("unsupported keepAlive, use pipelining=0 instead"); + const onDrain = function() { + if (finished) { + return; } - if (socketTimeout !== void 0) { - throw new InvalidArgumentError("unsupported socketTimeout, use headersTimeout & bodyTimeout instead"); + if (body2.resume) { + body2.resume(); } - if (requestTimeout !== void 0) { - throw new InvalidArgumentError("unsupported requestTimeout, use headersTimeout & bodyTimeout instead"); + }; + const onClose = function() { + queueMicrotask(() => { + body2.removeListener("error", onFinished); + }); + if (!finished) { + const err = new RequestAbortedError(); + queueMicrotask(() => onFinished(err)); } - if (idleTimeout !== void 0) { - throw new InvalidArgumentError("unsupported idleTimeout, use keepAliveTimeout instead"); + }; + const onFinished = function(err) { + if (finished) { + return; } - if (maxKeepAliveTimeout !== void 0) { - throw new InvalidArgumentError("unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead"); + finished = true; + assert(socket.destroyed || socket[kWriting] && client2[kRunning] <= 1); + socket.off("drain", onDrain).off("error", onFinished); + body2.removeListener("data", onData).removeListener("end", onFinished).removeListener("close", onClose); + if (!err) { + try { + writer.end(); + } catch (er) { + err = er; + } + } + writer.destroy(err); + if (err && (err.code !== "UND_ERR_INFO" || err.message !== "reset")) { + util2.destroy(body2, err); + } else { + util2.destroy(body2); + } + }; + body2.on("data", onData).on("end", onFinished).on("error", onFinished).on("close", onClose); + if (body2.resume) { + body2.resume(); + } + socket.on("drain", onDrain).on("error", onFinished); + if (body2.errorEmitted ?? body2.errored) { + setImmediate(() => onFinished(body2.errored)); + } else if (body2.endEmitted ?? body2.readableEnded) { + setImmediate(() => onFinished(null)); + } + if (body2.closeEmitted ?? body2.closed) { + setImmediate(onClose); + } + } + function writeBuffer(abort, body2, client2, request2, socket, contentLength, header, expectsPayload) { + try { + if (!body2) { + if (contentLength === 0) { + socket.write(`${header}content-length: 0\r +\r +`, "latin1"); + } else { + assert(contentLength === null, "no body must not have content length"); + socket.write(`${header}\r +`, "latin1"); + } + } else if (util2.isBuffer(body2)) { + assert(contentLength === body2.byteLength, "buffer body must have content length"); + socket.cork(); + socket.write(`${header}content-length: ${contentLength}\r +\r +`, "latin1"); + socket.write(body2); + socket.uncork(); + request2.onBodySent(body2); + if (!expectsPayload && request2.reset !== false) { + socket[kReset] = true; + } } - if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) { - throw new InvalidArgumentError("invalid maxHeaderSize"); + request2.onRequestSent(); + client2[kResume](); + } catch (err) { + abort(err); + } + } + async function writeBlob(abort, body2, client2, request2, socket, contentLength, header, expectsPayload) { + assert(contentLength === body2.size, "blob body must have content length"); + try { + if (contentLength != null && contentLength !== body2.size) { + throw new RequestContentLengthMismatchError(); } - if (socketPath != null && typeof socketPath !== "string") { - throw new InvalidArgumentError("invalid socketPath"); + const buffer = Buffer.from(await body2.arrayBuffer()); + socket.cork(); + socket.write(`${header}content-length: ${contentLength}\r +\r +`, "latin1"); + socket.write(buffer); + socket.uncork(); + request2.onBodySent(buffer); + request2.onRequestSent(); + if (!expectsPayload && request2.reset !== false) { + socket[kReset] = true; } - if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) { - throw new InvalidArgumentError("invalid connectTimeout"); + client2[kResume](); + } catch (err) { + abort(err); + } + } + async function writeIterable(abort, body2, client2, request2, socket, contentLength, header, expectsPayload) { + assert(contentLength !== 0 || client2[kRunning] === 0, "iterator body cannot be pipelined"); + let callback = null; + function onDrain() { + if (callback) { + const cb = callback; + callback = null; + cb(); } - if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) { - throw new InvalidArgumentError("invalid keepAliveTimeout"); + } + const waitForDrain = () => new Promise((resolve, reject) => { + assert(callback === null); + if (socket[kError]) { + reject(socket[kError]); + } else { + callback = resolve; } - if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) { - throw new InvalidArgumentError("invalid keepAliveMaxTimeout"); + }); + socket.on("close", onDrain).on("drain", onDrain); + const writer = new AsyncWriter({ abort, socket, request: request2, contentLength, client: client2, expectsPayload, header }); + try { + for await (const chunk of body2) { + if (socket[kError]) { + throw socket[kError]; + } + if (!writer.write(chunk)) { + await waitForDrain(); + } } - if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) { - throw new InvalidArgumentError("invalid keepAliveTimeoutThreshold"); + writer.end(); + } catch (err) { + writer.destroy(err); + } finally { + socket.off("close", onDrain).off("drain", onDrain); + } + } + class AsyncWriter { + constructor({ abort, socket, request: request2, contentLength, client: client2, expectsPayload, header }) { + this.socket = socket; + this.request = request2; + this.contentLength = contentLength; + this.client = client2; + this.bytesWritten = 0; + this.expectsPayload = expectsPayload; + this.header = header; + this.abort = abort; + socket[kWriting] = true; + } + write(chunk) { + const { socket, request: request2, contentLength, client: client2, bytesWritten, expectsPayload, header } = this; + if (socket[kError]) { + throw socket[kError]; } - if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) { - throw new InvalidArgumentError("headersTimeout must be a positive integer or zero"); + if (socket.destroyed) { + return false; } - if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) { - throw new InvalidArgumentError("bodyTimeout must be a positive integer or zero"); + const len = Buffer.byteLength(chunk); + if (!len) { + return true; } - if (connect3 != null && typeof connect3 !== "function" && typeof connect3 !== "object") { - throw new InvalidArgumentError("connect must be a function or an object"); + if (contentLength !== null && bytesWritten + len > contentLength) { + if (client2[kStrictContentLength]) { + throw new RequestContentLengthMismatchError(); + } + process.emitWarning(new RequestContentLengthMismatchError()); } - if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { - throw new InvalidArgumentError("maxRedirections must be a positive number"); + socket.cork(); + if (bytesWritten === 0) { + if (!expectsPayload && request2.reset !== false) { + socket[kReset] = true; + } + if (contentLength === null) { + socket.write(`${header}transfer-encoding: chunked\r +`, "latin1"); + } else { + socket.write(`${header}content-length: ${contentLength}\r +\r +`, "latin1"); + } } - if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { - throw new InvalidArgumentError("maxRequestsPerClient must be a positive number"); + if (contentLength === null) { + socket.write(`\r +${len.toString(16)}\r +`, "latin1"); } - if (localAddress != null && (typeof localAddress !== "string" || net.isIP(localAddress) === 0)) { - throw new InvalidArgumentError("localAddress must be valid string IP address"); + this.bytesWritten += len; + const ret = socket.write(chunk); + socket.uncork(); + request2.onBodySent(chunk); + if (!ret) { + if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { + if (socket[kParser].timeout.refresh) { + socket[kParser].timeout.refresh(); + } + } } - if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) { - throw new InvalidArgumentError("maxResponseSize must be a positive number"); + return ret; + } + end() { + const { socket, contentLength, client: client2, bytesWritten, expectsPayload, header, request: request2 } = this; + request2.onRequestSent(); + socket[kWriting] = false; + if (socket[kError]) { + throw socket[kError]; } - if (autoSelectFamilyAttemptTimeout != null && (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1)) { - throw new InvalidArgumentError("autoSelectFamilyAttemptTimeout must be a positive number"); + if (socket.destroyed) { + return; } - if (allowH2 != null && typeof allowH2 !== "boolean") { - throw new InvalidArgumentError("allowH2 must be a valid boolean value"); + if (bytesWritten === 0) { + if (expectsPayload) { + socket.write(`${header}content-length: 0\r +\r +`, "latin1"); + } else { + socket.write(`${header}\r +`, "latin1"); + } + } else if (contentLength === null) { + socket.write("\r\n0\r\n\r\n", "latin1"); } - if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== "number" || maxConcurrentStreams < 1)) { - throw new InvalidArgumentError("maxConcurrentStreams must be a possitive integer, greater than 0"); + if (contentLength !== null && bytesWritten !== contentLength) { + if (client2[kStrictContentLength]) { + throw new RequestContentLengthMismatchError(); + } else { + process.emitWarning(new RequestContentLengthMismatchError()); + } } - if (typeof connect3 !== "function") { - connect3 = buildConnector({ - ...tls, - maxCachedSessions, - allowH2, - socketPath, - timeout: connectTimeout, - ...util2.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0, - ...connect3 - }); + if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { + if (socket[kParser].timeout.refresh) { + socket[kParser].timeout.refresh(); + } } - this[kInterceptors] = interceptors && interceptors.Client && Array.isArray(interceptors.Client) ? interceptors.Client : [createRedirectInterceptor({ maxRedirections })]; - this[kUrl] = util2.parseOrigin(url); - this[kConnector] = connect3; - this[kSocket] = null; - this[kPipelining] = pipelining != null ? pipelining : 1; - this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize; - this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout; - this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 6e5 : keepAliveMaxTimeout; - this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 1e3 : keepAliveTimeoutThreshold; - this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout]; - this[kServerName] = null; - this[kLocalAddress] = localAddress != null ? localAddress : null; - this[kResuming] = 0; - this[kNeedDrain] = 0; - this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ""}\r -`; - this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 3e5; - this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 3e5; - this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength; - this[kMaxRedirections] = maxRedirections; - this[kMaxRequests] = maxRequestsPerClient; - this[kClosedResolve] = null; - this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1; - this[kHTTPConnVersion] = "h1"; - this[kHTTP2Session] = null; - this[kHTTP2SessionState] = !allowH2 ? null : { - // streams: null, // Fixed queue of streams - For future support of `push` - openStreams: 0, - // Keep track of them to decide wether or not unref the session - maxConcurrentStreams: maxConcurrentStreams != null ? maxConcurrentStreams : 100 - // Max peerConcurrentStreams for a Node h2 server - }; - this[kHost] = `${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ""}`; - this[kQueue] = []; - this[kRunningIdx] = 0; - this[kPendingIdx] = 0; - } - get pipelining() { - return this[kPipelining]; - } - set pipelining(value) { - this[kPipelining] = value; - resume(this, true); - } - get [kPending]() { - return this[kQueue].length - this[kPendingIdx]; - } - get [kRunning]() { - return this[kPendingIdx] - this[kRunningIdx]; - } - get [kSize]() { - return this[kQueue].length - this[kRunningIdx]; - } - get [kConnected]() { - return !!this[kSocket] && !this[kConnecting] && !this[kSocket].destroyed; + client2[kResume](); } - get [kBusy]() { - const socket = this[kSocket]; - return socket && (socket[kReset] || socket[kWriting] || socket[kBlocking]) || this[kSize] >= (this[kPipelining] || 1) || this[kPending] > 0; + destroy(err) { + const { socket, client: client2, abort } = this; + socket[kWriting] = false; + if (err) { + assert(client2[kRunning] <= 1, "pipeline should only contain this request"); + abort(err); + } } - /* istanbul ignore: only used for test */ - [kConnect](cb) { - connect2(this); - this.once("connect", cb); + } + clientH1 = connectH1; + return clientH1; +} +var clientH2; +var hasRequiredClientH2; +function requireClientH2() { + if (hasRequiredClientH2) return clientH2; + hasRequiredClientH2 = 1; + const assert = require$$0$5; + const { pipeline } = require$$0$6; + const util2 = requireUtil$e(); + const { + RequestContentLengthMismatchError, + RequestAbortedError, + SocketError, + InformationalError + } = requireErrors$1(); + const { + kUrl, + kReset, + kClient, + kRunning, + kPending, + kQueue, + kPendingIdx, + kRunningIdx, + kError, + kSocket, + kStrictContentLength, + kOnError, + kMaxConcurrentStreams, + kHTTP2Session, + kResume, + kSize, + kHTTPContext + } = requireSymbols$9(); + const kOpenStreams = /* @__PURE__ */ Symbol("open streams"); + let extractBody; + let h2ExperimentalWarned = false; + let http2; + try { + http2 = require("node:http2"); + } catch { + http2 = { constants: {} }; + } + const { + constants: { + HTTP2_HEADER_AUTHORITY, + HTTP2_HEADER_METHOD, + HTTP2_HEADER_PATH, + HTTP2_HEADER_SCHEME, + HTTP2_HEADER_CONTENT_LENGTH, + HTTP2_HEADER_EXPECT, + HTTP2_HEADER_STATUS } - [kDispatch](opts, handler2) { - const origin = opts.origin || this[kUrl].origin; - const request2 = this[kHTTPConnVersion] === "h2" ? Request[kHTTP2BuildRequest](origin, opts, handler2) : Request[kHTTP1BuildRequest](origin, opts, handler2); - this[kQueue].push(request2); - if (this[kResuming]) ; - else if (util2.bodyLength(request2.body) == null && util2.isIterable(request2.body)) { - this[kResuming] = 1; - process.nextTick(resume, this); + } = http2; + function parseH2Headers(headers2) { + const result = []; + for (const [name, value] of Object.entries(headers2)) { + if (Array.isArray(value)) { + for (const subvalue of value) { + result.push(Buffer.from(name), Buffer.from(subvalue)); + } } else { - resume(this, true); - } - if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) { - this[kNeedDrain] = 2; + result.push(Buffer.from(name), Buffer.from(value)); } - return this[kNeedDrain] < 2; } - async [kClose]() { - return new Promise((resolve) => { - if (!this[kSize]) { - resolve(null); - } else { - this[kClosedResolve] = resolve; - } + return result; + } + async function connectH2(client2, socket) { + client2[kSocket] = socket; + if (!h2ExperimentalWarned) { + h2ExperimentalWarned = true; + process.emitWarning("H2 support is experimental, expect them to change at any time.", { + code: "UNDICI-H2" }); } - async [kDestroy](err) { - return new Promise((resolve) => { - const requests = this[kQueue].splice(this[kPendingIdx]); + const session = http2.connect(client2[kUrl], { + createConnection: () => socket, + peerMaxConcurrentStreams: client2[kMaxConcurrentStreams] + }); + session[kOpenStreams] = 0; + session[kClient] = client2; + session[kSocket] = socket; + util2.addListener(session, "error", onHttp2SessionError); + util2.addListener(session, "frameError", onHttp2FrameError); + util2.addListener(session, "end", onHttp2SessionEnd); + util2.addListener(session, "goaway", onHTTP2GoAway); + util2.addListener(session, "close", function() { + const { [kClient]: client3 } = this; + const { [kSocket]: socket2 } = client3; + const err = this[kSocket][kError] || this[kError] || new SocketError("closed", util2.getSocketInfo(socket2)); + client3[kHTTP2Session] = null; + if (client3.destroyed) { + assert(client3[kPending] === 0); + const requests = client3[kQueue].splice(client3[kRunningIdx]); for (let i = 0; i < requests.length; i++) { const request2 = requests[i]; - errorRequest(this, request2, err); - } - const callback = () => { - if (this[kClosedResolve]) { - this[kClosedResolve](); - this[kClosedResolve] = null; - } - resolve(); - }; - if (this[kHTTP2Session] != null) { - util2.destroy(this[kHTTP2Session], err); - this[kHTTP2Session] = null; - this[kHTTP2SessionState] = null; + util2.errorRequest(client3, request2, err); } - if (!this[kSocket]) { + } + }); + session.unref(); + client2[kHTTP2Session] = session; + socket[kHTTP2Session] = session; + util2.addListener(socket, "error", function(err) { + assert(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); + this[kError] = err; + this[kClient][kOnError](err); + }); + util2.addListener(socket, "end", function() { + util2.destroy(this, new SocketError("other side closed", util2.getSocketInfo(this))); + }); + util2.addListener(socket, "close", function() { + const err = this[kError] || new SocketError("closed", util2.getSocketInfo(this)); + client2[kSocket] = null; + if (this[kHTTP2Session] != null) { + this[kHTTP2Session].destroy(err); + } + client2[kPendingIdx] = client2[kRunningIdx]; + assert(client2[kRunning] === 0); + client2.emit("disconnect", client2[kUrl], [client2], err); + client2[kResume](); + }); + let closed = false; + socket.on("close", () => { + closed = true; + }); + return { + version: "h2", + defaultPipelining: Infinity, + write(...args) { + return writeH2(client2, ...args); + }, + resume() { + resumeH2(client2); + }, + destroy(err, callback) { + if (closed) { queueMicrotask(callback); } else { - util2.destroy(this[kSocket].on("close", callback), err); + socket.destroy(err).on("close", callback); } - resume(this); - }); + }, + get destroyed() { + return socket.destroyed; + }, + busy() { + return false; + } + }; + } + function resumeH2(client2) { + const socket = client2[kSocket]; + if (socket?.destroyed === false) { + if (client2[kSize] === 0 && client2[kMaxConcurrentStreams] === 0) { + socket.unref(); + client2[kHTTP2Session].unref(); + } else { + socket.ref(); + client2[kHTTP2Session].ref(); + } } } function onHttp2SessionError(err) { assert(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); this[kSocket][kError] = err; - onError(this[kClient], err); + this[kClient][kOnError](err); } function onHttp2FrameError(type, code, id) { - const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`); if (id === 0) { + const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`); this[kSocket][kError] = err; - onError(this[kClient], err); + this[kClient][kOnError](err); } } function onHttp2SessionEnd() { - util2.destroy(this, new SocketError("other side closed")); - util2.destroy(this[kSocket], new SocketError("other side closed")); + const err = new SocketError("other side closed", util2.getSocketInfo(this[kSocket])); + this.destroy(err); + util2.destroy(this[kSocket], err); } function onHTTP2GoAway(code) { + const err = this[kError] || new SocketError(`HTTP/2: "GOAWAY" frame received with code ${code}`, util2.getSocketInfo(this)); const client2 = this[kClient]; - const err = new InformationalError(`HTTP/2: "GOAWAY" frame received with code ${code}`); client2[kSocket] = null; - client2[kHTTP2Session] = null; - if (client2.destroyed) { - assert(this[kPending] === 0); - const requests = client2[kQueue].splice(client2[kRunningIdx]); - for (let i = 0; i < requests.length; i++) { - const request2 = requests[i]; - errorRequest(this, request2, err); - } - } else if (client2[kRunning] > 0) { + client2[kHTTPContext] = null; + if (this[kHTTP2Session] != null) { + this[kHTTP2Session].destroy(err); + this[kHTTP2Session] = null; + } + util2.destroy(this[kSocket], err); + if (client2[kRunningIdx] < client2[kQueue].length) { const request2 = client2[kQueue][client2[kRunningIdx]]; client2[kQueue][client2[kRunningIdx]++] = null; - errorRequest(client2, request2, err); + util2.errorRequest(client2, request2, err); + client2[kPendingIdx] = client2[kRunningIdx]; } - client2[kPendingIdx] = client2[kRunningIdx]; assert(client2[kRunning] === 0); - client2.emit( - "disconnect", - client2[kUrl], - [client2], - err - ); - resume(client2); + client2.emit("disconnect", client2[kUrl], [client2], err); + client2[kResume](); } - const constants2 = requireConstants$2(); - const createRedirectInterceptor = requireRedirectInterceptor(); - const EMPTY_BUF = Buffer.alloc(0); - async function lazyllhttp() { - const llhttpWasmData = process.env.JEST_WORKER_ID ? requireLlhttpWasm() : void 0; - let mod; + function shouldSendContentLength(method) { + return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT"; + } + function writeH2(client2, request2) { + const session = client2[kHTTP2Session]; + const { method, path, host, upgrade, expectContinue, signal, headers: reqHeaders } = request2; + let { body: body2 } = request2; + if (upgrade) { + util2.errorRequest(client2, request2, new Error("Upgrade not supported for H2")); + return false; + } + const headers2 = {}; + for (let n = 0; n < reqHeaders.length; n += 2) { + const key = reqHeaders[n + 0]; + const val = reqHeaders[n + 1]; + if (Array.isArray(val)) { + for (let i = 0; i < val.length; i++) { + if (headers2[key]) { + headers2[key] += `,${val[i]}`; + } else { + headers2[key] = val[i]; + } + } + } else { + headers2[key] = val; + } + } + let stream; + const { hostname, port } = client2[kUrl]; + headers2[HTTP2_HEADER_AUTHORITY] = host || `${hostname}${port ? `:${port}` : ""}`; + headers2[HTTP2_HEADER_METHOD] = method; + const abort = (err) => { + if (request2.aborted || request2.completed) { + return; + } + err = err || new RequestAbortedError(); + util2.errorRequest(client2, request2, err); + if (stream != null) { + util2.destroy(stream, err); + } + util2.destroy(body2, err); + client2[kQueue][client2[kRunningIdx]++] = null; + client2[kResume](); + }; try { - mod = await WebAssembly.compile(Buffer.from(requireLlhttp_simdWasm(), "base64")); - } catch (e) { - mod = await WebAssembly.compile(Buffer.from(llhttpWasmData || requireLlhttpWasm(), "base64")); + request2.onConnect(abort); + } catch (err) { + util2.errorRequest(client2, request2, err); } - return await WebAssembly.instantiate(mod, { - env: { - /* eslint-disable camelcase */ - wasm_on_url: (p, at, len) => { - return 0; - }, - wasm_on_status: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; - }, - wasm_on_message_begin: (p) => { - assert.strictEqual(currentParser.ptr, p); - return currentParser.onMessageBegin() || 0; - }, - wasm_on_header_field: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; - }, - wasm_on_header_value: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; - }, - wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => { - assert.strictEqual(currentParser.ptr, p); - return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0; - }, - wasm_on_body: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; - }, - wasm_on_message_complete: (p) => { - assert.strictEqual(currentParser.ptr, p); - return currentParser.onMessageComplete() || 0; + if (request2.aborted) { + return false; + } + if (method === "CONNECT") { + session.ref(); + stream = session.request(headers2, { endStream: false, signal }); + if (stream.id && !stream.pending) { + request2.onUpgrade(null, null, stream); + ++session[kOpenStreams]; + client2[kQueue][client2[kRunningIdx]++] = null; + } else { + stream.once("ready", () => { + request2.onUpgrade(null, null, stream); + ++session[kOpenStreams]; + client2[kQueue][client2[kRunningIdx]++] = null; + }); + } + stream.once("close", () => { + session[kOpenStreams] -= 1; + if (session[kOpenStreams] === 0) session.unref(); + }); + return true; + } + headers2[HTTP2_HEADER_PATH] = path; + headers2[HTTP2_HEADER_SCHEME] = "https"; + const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH"; + if (body2 && typeof body2.read === "function") { + body2.read(0); + } + let contentLength = util2.bodyLength(body2); + if (util2.isFormDataLike(body2)) { + extractBody ??= requireBody$1().extractBody; + const [bodyStream, contentType] = extractBody(body2); + headers2["content-type"] = contentType; + body2 = bodyStream.stream; + contentLength = bodyStream.length; + } + if (contentLength == null) { + contentLength = request2.contentLength; + } + if (contentLength === 0 || !expectsPayload) { + contentLength = null; + } + if (shouldSendContentLength(method) && contentLength > 0 && request2.contentLength != null && request2.contentLength !== contentLength) { + if (client2[kStrictContentLength]) { + util2.errorRequest(client2, request2, new RequestContentLengthMismatchError()); + return false; + } + process.emitWarning(new RequestContentLengthMismatchError()); + } + if (contentLength != null) { + assert(body2, "no body must not have content length"); + headers2[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}`; + } + session.ref(); + const shouldEndStream = method === "GET" || method === "HEAD" || body2 === null; + if (expectContinue) { + headers2[HTTP2_HEADER_EXPECT] = "100-continue"; + stream = session.request(headers2, { endStream: shouldEndStream, signal }); + stream.once("continue", writeBodyH2); + } else { + stream = session.request(headers2, { + endStream: shouldEndStream, + signal + }); + writeBodyH2(); + } + ++session[kOpenStreams]; + stream.once("response", (headers3) => { + const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers3; + request2.onResponseStarted(); + if (request2.aborted) { + const err = new RequestAbortedError(); + util2.errorRequest(client2, request2, err); + util2.destroy(stream, err); + return; + } + if (request2.onHeaders(Number(statusCode), parseH2Headers(realHeaders), stream.resume.bind(stream), "") === false) { + stream.pause(); + } + stream.on("data", (chunk) => { + if (request2.onData(chunk) === false) { + stream.pause(); } - /* eslint-enable camelcase */ + }); + }); + stream.once("end", () => { + if (stream.state?.state == null || stream.state.state < 6) { + request2.onComplete([]); + } + if (session[kOpenStreams] === 0) { + session.unref(); + } + abort(new InformationalError("HTTP/2: stream half-closed (remote)")); + client2[kQueue][client2[kRunningIdx]++] = null; + client2[kPendingIdx] = client2[kRunningIdx]; + client2[kResume](); + }); + stream.once("close", () => { + session[kOpenStreams] -= 1; + if (session[kOpenStreams] === 0) { + session.unref(); } }); + stream.once("error", function(err) { + abort(err); + }); + stream.once("frameError", (type, code) => { + abort(new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`)); + }); + return true; + function writeBodyH2() { + if (!body2 || contentLength === 0) { + writeBuffer( + abort, + stream, + null, + client2, + request2, + client2[kSocket], + contentLength, + expectsPayload + ); + } else if (util2.isBuffer(body2)) { + writeBuffer( + abort, + stream, + body2, + client2, + request2, + client2[kSocket], + contentLength, + expectsPayload + ); + } else if (util2.isBlobLike(body2)) { + if (typeof body2.stream === "function") { + writeIterable( + abort, + stream, + body2.stream(), + client2, + request2, + client2[kSocket], + contentLength, + expectsPayload + ); + } else { + writeBlob( + abort, + stream, + body2, + client2, + request2, + client2[kSocket], + contentLength, + expectsPayload + ); + } + } else if (util2.isStream(body2)) { + writeStream( + abort, + client2[kSocket], + expectsPayload, + stream, + body2, + client2, + request2, + contentLength + ); + } else if (util2.isIterable(body2)) { + writeIterable( + abort, + stream, + body2, + client2, + request2, + client2[kSocket], + contentLength, + expectsPayload + ); + } else { + assert(false); + } + } } - let llhttpInstance = null; - let llhttpPromise = lazyllhttp(); - llhttpPromise.catch(); - let currentParser = null; - let currentBufferRef = null; - let currentBufferSize = 0; - let currentBufferPtr = null; - const TIMEOUT_HEADERS = 1; - const TIMEOUT_BODY = 2; - const TIMEOUT_IDLE = 3; - class Parser { - constructor(client2, socket, { exports: exports$1 }) { - assert(Number.isFinite(client2[kMaxHeadersSize]) && client2[kMaxHeadersSize] > 0); - this.llhttp = exports$1; - this.ptr = this.llhttp.llhttp_alloc(constants2.TYPE.RESPONSE); - this.client = client2; - this.socket = socket; - this.timeout = null; - this.timeoutValue = null; - this.timeoutType = null; - this.statusCode = null; - this.statusText = ""; - this.upgrade = false; - this.headers = []; - this.headersSize = 0; - this.headersMaxSize = client2[kMaxHeadersSize]; - this.shouldKeepAlive = false; - this.paused = false; - this.resume = this.resume.bind(this); - this.bytesRead = 0; - this.keepAlive = ""; - this.contentLength = ""; - this.connection = ""; - this.maxResponseSize = client2[kMaxResponseSize]; + function writeBuffer(abort, h2stream, body2, client2, request2, socket, contentLength, expectsPayload) { + try { + if (body2 != null && util2.isBuffer(body2)) { + assert(contentLength === body2.byteLength, "buffer body must have content length"); + h2stream.cork(); + h2stream.write(body2); + h2stream.uncork(); + h2stream.end(); + request2.onBodySent(body2); + } + if (!expectsPayload) { + socket[kReset] = true; + } + request2.onRequestSent(); + client2[kResume](); + } catch (error) { + abort(error); } - setTimeout(value, type) { - this.timeoutType = type; - if (value !== this.timeoutValue) { - timers2.clearTimeout(this.timeout); - if (value) { - this.timeout = timers2.setTimeout(onParserTimeout, value, this); - if (this.timeout.unref) { - this.timeout.unref(); - } + } + function writeStream(abort, socket, expectsPayload, h2stream, body2, client2, request2, contentLength) { + assert(contentLength !== 0 || client2[kRunning] === 0, "stream body cannot be pipelined"); + const pipe = pipeline( + body2, + h2stream, + (err) => { + if (err) { + util2.destroy(pipe, err); + abort(err); } else { - this.timeout = null; - } - this.timeoutValue = value; - } else if (this.timeout) { - if (this.timeout.refresh) { - this.timeout.refresh(); + util2.removeAllListeners(pipe); + request2.onRequestSent(); + if (!expectsPayload) { + socket[kReset] = true; + } + client2[kResume](); } } + ); + util2.addListener(pipe, "data", onPipeData); + function onPipeData(chunk) { + request2.onBodySent(chunk); } - resume() { - if (this.socket.destroyed || !this.paused) { - return; + } + async function writeBlob(abort, h2stream, body2, client2, request2, socket, contentLength, expectsPayload) { + assert(contentLength === body2.size, "blob body must have content length"); + try { + if (contentLength != null && contentLength !== body2.size) { + throw new RequestContentLengthMismatchError(); } - assert(this.ptr != null); - assert(currentParser == null); - this.llhttp.llhttp_resume(this.ptr); - assert(this.timeoutType === TIMEOUT_BODY); - if (this.timeout) { - if (this.timeout.refresh) { - this.timeout.refresh(); - } + const buffer = Buffer.from(await body2.arrayBuffer()); + h2stream.cork(); + h2stream.write(buffer); + h2stream.uncork(); + h2stream.end(); + request2.onBodySent(buffer); + request2.onRequestSent(); + if (!expectsPayload) { + socket[kReset] = true; } - this.paused = false; - this.execute(this.socket.read() || EMPTY_BUF); - this.readMore(); + client2[kResume](); + } catch (err) { + abort(err); } - readMore() { - while (!this.paused && this.ptr) { - const chunk = this.socket.read(); - if (chunk === null) { - break; - } - this.execute(chunk); + } + async function writeIterable(abort, h2stream, body2, client2, request2, socket, contentLength, expectsPayload) { + assert(contentLength !== 0 || client2[kRunning] === 0, "iterator body cannot be pipelined"); + let callback = null; + function onDrain() { + if (callback) { + const cb = callback; + callback = null; + cb(); } } - execute(data) { - assert(this.ptr != null); - assert(currentParser == null); - assert(!this.paused); - const { socket, llhttp } = this; - if (data.length > currentBufferSize) { - if (currentBufferPtr) { - llhttp.free(currentBufferPtr); + const waitForDrain = () => new Promise((resolve, reject) => { + assert(callback === null); + if (socket[kError]) { + reject(socket[kError]); + } else { + callback = resolve; + } + }); + h2stream.on("close", onDrain).on("drain", onDrain); + try { + for await (const chunk of body2) { + if (socket[kError]) { + throw socket[kError]; + } + const res = h2stream.write(chunk); + request2.onBodySent(chunk); + if (!res) { + await waitForDrain(); } - currentBufferSize = Math.ceil(data.length / 4096) * 4096; - currentBufferPtr = llhttp.malloc(currentBufferSize); } - new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data); - try { - let ret; - try { - currentBufferRef = data; - currentParser = this; - ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length); - } catch (err) { - throw err; - } finally { - currentParser = null; - currentBufferRef = null; + h2stream.end(); + request2.onRequestSent(); + if (!expectsPayload) { + socket[kReset] = true; + } + client2[kResume](); + } catch (err) { + abort(err); + } finally { + h2stream.off("close", onDrain).off("drain", onDrain); + } + } + clientH2 = connectH2; + return clientH2; +} +var redirectHandler; +var hasRequiredRedirectHandler$1; +function requireRedirectHandler$1() { + if (hasRequiredRedirectHandler$1) return redirectHandler; + hasRequiredRedirectHandler$1 = 1; + const util2 = requireUtil$e(); + const { kBodyUsed } = requireSymbols$9(); + const assert = require$$0$5; + const { InvalidArgumentError } = requireErrors$1(); + const EE = require$$0$4; + const redirectableStatusCodes = [300, 301, 302, 303, 307, 308]; + const kBody = /* @__PURE__ */ Symbol("body"); + class BodyAsyncIterable { + constructor(body2) { + this[kBody] = body2; + this[kBodyUsed] = false; + } + async *[Symbol.asyncIterator]() { + assert(!this[kBodyUsed], "disturbed"); + this[kBodyUsed] = true; + yield* this[kBody]; + } + } + class RedirectHandler { + constructor(dispatch, maxRedirections, opts, handler2) { + if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { + throw new InvalidArgumentError("maxRedirections must be a positive number"); + } + util2.validateHandler(handler2, opts.method, opts.upgrade); + this.dispatch = dispatch; + this.location = null; + this.abort = null; + this.opts = { ...opts, maxRedirections: 0 }; + this.maxRedirections = maxRedirections; + this.handler = handler2; + this.history = []; + this.redirectionLimitReached = false; + if (util2.isStream(this.opts.body)) { + if (util2.bodyLength(this.opts.body) === 0) { + this.opts.body.on("data", function() { + assert(false); + }); } - const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr; - if (ret === constants2.ERROR.PAUSED_UPGRADE) { - this.onUpgrade(data.slice(offset)); - } else if (ret === constants2.ERROR.PAUSED) { - this.paused = true; - socket.unshift(data.slice(offset)); - } else if (ret !== constants2.ERROR.OK) { - const ptr = llhttp.llhttp_get_error_reason(this.ptr); - let message = ""; - if (ptr) { - const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0); - message = "Response does not match the HTTP/1.1 protocol (" + Buffer.from(llhttp.memory.buffer, ptr, len).toString() + ")"; - } - throw new HTTPParserError(message, constants2.ERROR[ret], data.slice(offset)); + if (typeof this.opts.body.readableDidRead !== "boolean") { + this.opts.body[kBodyUsed] = false; + EE.prototype.on.call(this.opts.body, "data", function() { + this[kBodyUsed] = true; + }); } - } catch (err) { - util2.destroy(socket, err); + } else if (this.opts.body && typeof this.opts.body.pipeTo === "function") { + this.opts.body = new BodyAsyncIterable(this.opts.body); + } else if (this.opts.body && typeof this.opts.body !== "string" && !ArrayBuffer.isView(this.opts.body) && util2.isIterable(this.opts.body)) { + this.opts.body = new BodyAsyncIterable(this.opts.body); } } - destroy() { - assert(this.ptr != null); - assert(currentParser == null); - this.llhttp.llhttp_free(this.ptr); - this.ptr = null; - timers2.clearTimeout(this.timeout); - this.timeout = null; - this.timeoutValue = null; - this.timeoutType = null; - this.paused = false; + onConnect(abort) { + this.abort = abort; + this.handler.onConnect(abort, { history: this.history }); } - onStatus(buf) { - this.statusText = buf.toString(); + onUpgrade(statusCode, headers2, socket) { + this.handler.onUpgrade(statusCode, headers2, socket); } - onMessageBegin() { - const { socket, client: client2 } = this; - if (socket.destroyed) { - return -1; + onError(error) { + this.handler.onError(error); + } + onHeaders(statusCode, headers2, resume, statusText) { + this.location = this.history.length >= this.maxRedirections || util2.isDisturbed(this.opts.body) ? null : parseLocation(statusCode, headers2); + if (this.opts.throwOnMaxRedirect && this.history.length >= this.maxRedirections) { + if (this.request) { + this.request.abort(new Error("max redirects")); + } + this.redirectionLimitReached = true; + this.abort(new Error("max redirects")); + return; } - const request2 = client2[kQueue][client2[kRunningIdx]]; - if (!request2) { - return -1; + if (this.opts.origin) { + this.history.push(new URL(this.opts.path, this.opts.origin)); + } + if (!this.location) { + return this.handler.onHeaders(statusCode, headers2, resume, statusText); + } + const { origin, pathname, search } = util2.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin))); + const path = search ? `${pathname}${search}` : pathname; + this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin); + this.opts.path = path; + this.opts.origin = origin; + this.opts.maxRedirections = 0; + this.opts.query = null; + if (statusCode === 303 && this.opts.method !== "HEAD") { + this.opts.method = "GET"; + this.opts.body = null; } } - onHeaderField(buf) { - const len = this.headers.length; - if ((len & 1) === 0) { - this.headers.push(buf); - } else { - this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); + onData(chunk) { + if (this.location) ; + else { + return this.handler.onData(chunk); } - this.trackHeader(buf.length); } - onHeaderValue(buf) { - let len = this.headers.length; - if ((len & 1) === 1) { - this.headers.push(buf); - len += 1; + onComplete(trailers) { + if (this.location) { + this.location = null; + this.abort = null; + this.dispatch(this.opts, this); } else { - this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); + this.handler.onComplete(trailers); } - const key = this.headers[len - 2]; - if (key.length === 10 && key.toString().toLowerCase() === "keep-alive") { - this.keepAlive += buf.toString(); - } else if (key.length === 10 && key.toString().toLowerCase() === "connection") { - this.connection += buf.toString(); - } else if (key.length === 14 && key.toString().toLowerCase() === "content-length") { - this.contentLength += buf.toString(); + } + onBodySent(chunk) { + if (this.handler.onBodySent) { + this.handler.onBodySent(chunk); } - this.trackHeader(buf.length); } - trackHeader(len) { - this.headersSize += len; - if (this.headersSize >= this.headersMaxSize) { - util2.destroy(this.socket, new HeadersOverflowError()); + } + function parseLocation(statusCode, headers2) { + if (redirectableStatusCodes.indexOf(statusCode) === -1) { + return null; + } + for (let i = 0; i < headers2.length; i += 2) { + if (headers2[i].length === 8 && util2.headerNameToString(headers2[i]) === "location") { + return headers2[i + 1]; } } - onUpgrade(head) { - const { upgrade, client: client2, socket, headers: headers2, statusCode } = this; - assert(upgrade); - const request2 = client2[kQueue][client2[kRunningIdx]]; - assert(request2); - assert(!socket.destroyed); - assert(socket === client2[kSocket]); - assert(!this.paused); - assert(request2.upgrade || request2.method === "CONNECT"); - this.statusCode = null; - this.statusText = ""; - this.shouldKeepAlive = null; - assert(this.headers.length % 2 === 0); - this.headers = []; - this.headersSize = 0; - socket.unshift(head); - socket[kParser].destroy(); - socket[kParser] = null; - socket[kClient] = null; - socket[kError] = null; - socket.removeListener("error", onSocketError).removeListener("readable", onSocketReadable).removeListener("end", onSocketEnd).removeListener("close", onSocketClose); - client2[kSocket] = null; - client2[kQueue][client2[kRunningIdx]++] = null; - client2.emit("disconnect", client2[kUrl], [client2], new InformationalError("upgrade")); - try { - request2.onUpgrade(statusCode, headers2, socket); - } catch (err) { - util2.destroy(socket, err); + } + function shouldRemoveHeader(header, removeContent, unknownOrigin) { + if (header.length === 4) { + return util2.headerNameToString(header) === "host"; + } + if (removeContent && util2.headerNameToString(header).startsWith("content-")) { + return true; + } + if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) { + const name = util2.headerNameToString(header); + return name === "authorization" || name === "cookie" || name === "proxy-authorization"; + } + return false; + } + function cleanRequestHeaders(headers2, removeContent, unknownOrigin) { + const ret = []; + if (Array.isArray(headers2)) { + for (let i = 0; i < headers2.length; i += 2) { + if (!shouldRemoveHeader(headers2[i], removeContent, unknownOrigin)) { + ret.push(headers2[i], headers2[i + 1]); + } + } + } else if (headers2 && typeof headers2 === "object") { + for (const key of Object.keys(headers2)) { + if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) { + ret.push(key, headers2[key]); + } + } + } else { + assert(headers2 == null, "headers must be an object or an array"); + } + return ret; + } + redirectHandler = RedirectHandler; + return redirectHandler; +} +var redirectInterceptor$1; +var hasRequiredRedirectInterceptor$1; +function requireRedirectInterceptor$1() { + if (hasRequiredRedirectInterceptor$1) return redirectInterceptor$1; + hasRequiredRedirectInterceptor$1 = 1; + const RedirectHandler = requireRedirectHandler$1(); + function createRedirectInterceptor({ maxRedirections: defaultMaxRedirections }) { + return (dispatch) => { + return function Intercept(opts, handler2) { + const { maxRedirections = defaultMaxRedirections } = opts; + if (!maxRedirections) { + return dispatch(opts, handler2); + } + const redirectHandler2 = new RedirectHandler(dispatch, maxRedirections, opts, handler2); + opts = { ...opts, maxRedirections: 0 }; + return dispatch(opts, redirectHandler2); + }; + }; + } + redirectInterceptor$1 = createRedirectInterceptor; + return redirectInterceptor$1; +} +var client$1; +var hasRequiredClient$1; +function requireClient$1() { + if (hasRequiredClient$1) return client$1; + hasRequiredClient$1 = 1; + const assert = require$$0$5; + const net = require$$0$7; + const http = require$$2$2; + const util2 = requireUtil$e(); + const { channels } = requireDiagnostics(); + const Request = requireRequest$3(); + const DispatcherBase = requireDispatcherBase$1(); + const { + InvalidArgumentError, + InformationalError, + ClientDestroyedError + } = requireErrors$1(); + const buildConnector = requireConnect$1(); + const { + kUrl, + kServerName, + kClient, + kBusy, + kConnect, + kResuming, + kRunning, + kPending, + kSize, + kQueue, + kConnected, + kConnecting, + kNeedDrain, + kKeepAliveDefaultTimeout, + kHostHeader, + kPendingIdx, + kRunningIdx, + kError, + kPipelining, + kKeepAliveTimeoutValue, + kMaxHeadersSize, + kKeepAliveMaxTimeout, + kKeepAliveTimeoutThreshold, + kHeadersTimeout, + kBodyTimeout, + kStrictContentLength, + kConnector, + kMaxRedirections, + kMaxRequests, + kCounter, + kClose, + kDestroy, + kDispatch, + kInterceptors, + kLocalAddress, + kMaxResponseSize, + kOnError, + kHTTPContext, + kMaxConcurrentStreams, + kResume + } = requireSymbols$9(); + const connectH1 = requireClientH1(); + const connectH2 = requireClientH2(); + let deprecatedInterceptorWarned = false; + const kClosedResolve = /* @__PURE__ */ Symbol("kClosedResolve"); + const noop2 = () => { + }; + function getPipelining(client2) { + return client2[kPipelining] ?? client2[kHTTPContext]?.defaultPipelining ?? 1; + } + class Client extends DispatcherBase { + /** + * + * @param {string|URL} url + * @param {import('../../types/client.js').Client.Options} options + */ + constructor(url, { + interceptors, + maxHeaderSize, + headersTimeout, + socketTimeout, + requestTimeout, + connectTimeout, + bodyTimeout, + idleTimeout, + keepAlive, + keepAliveTimeout, + maxKeepAliveTimeout, + keepAliveMaxTimeout, + keepAliveTimeoutThreshold, + socketPath, + pipelining, + tls, + strictContentLength, + maxCachedSessions, + maxRedirections, + connect: connect3, + maxRequestsPerClient, + localAddress, + maxResponseSize, + autoSelectFamily, + autoSelectFamilyAttemptTimeout, + // h2 + maxConcurrentStreams, + allowH2 + } = {}) { + super(); + if (keepAlive !== void 0) { + throw new InvalidArgumentError("unsupported keepAlive, use pipelining=0 instead"); + } + if (socketTimeout !== void 0) { + throw new InvalidArgumentError("unsupported socketTimeout, use headersTimeout & bodyTimeout instead"); } - resume(client2); - } - onHeadersComplete(statusCode, upgrade, shouldKeepAlive) { - const { client: client2, socket, headers: headers2, statusText } = this; - if (socket.destroyed) { - return -1; + if (requestTimeout !== void 0) { + throw new InvalidArgumentError("unsupported requestTimeout, use headersTimeout & bodyTimeout instead"); } - const request2 = client2[kQueue][client2[kRunningIdx]]; - if (!request2) { - return -1; + if (idleTimeout !== void 0) { + throw new InvalidArgumentError("unsupported idleTimeout, use keepAliveTimeout instead"); } - assert(!this.upgrade); - assert(this.statusCode < 200); - if (statusCode === 100) { - util2.destroy(socket, new SocketError("bad response", util2.getSocketInfo(socket))); - return -1; + if (maxKeepAliveTimeout !== void 0) { + throw new InvalidArgumentError("unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead"); } - if (upgrade && !request2.upgrade) { - util2.destroy(socket, new SocketError("bad upgrade", util2.getSocketInfo(socket))); - return -1; + if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) { + throw new InvalidArgumentError("invalid maxHeaderSize"); } - assert.strictEqual(this.timeoutType, TIMEOUT_HEADERS); - this.statusCode = statusCode; - this.shouldKeepAlive = shouldKeepAlive || // Override llhttp value which does not allow keepAlive for HEAD. - request2.method === "HEAD" && !socket[kReset] && this.connection.toLowerCase() === "keep-alive"; - if (this.statusCode >= 200) { - const bodyTimeout = request2.bodyTimeout != null ? request2.bodyTimeout : client2[kBodyTimeout]; - this.setTimeout(bodyTimeout, TIMEOUT_BODY); - } else if (this.timeout) { - if (this.timeout.refresh) { - this.timeout.refresh(); - } + if (socketPath != null && typeof socketPath !== "string") { + throw new InvalidArgumentError("invalid socketPath"); } - if (request2.method === "CONNECT") { - assert(client2[kRunning] === 1); - this.upgrade = true; - return 2; + if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) { + throw new InvalidArgumentError("invalid connectTimeout"); } - if (upgrade) { - assert(client2[kRunning] === 1); - this.upgrade = true; - return 2; + if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) { + throw new InvalidArgumentError("invalid keepAliveTimeout"); } - assert(this.headers.length % 2 === 0); - this.headers = []; - this.headersSize = 0; - if (this.shouldKeepAlive && client2[kPipelining]) { - const keepAliveTimeout = this.keepAlive ? util2.parseKeepAliveTimeout(this.keepAlive) : null; - if (keepAliveTimeout != null) { - const timeout = Math.min( - keepAliveTimeout - client2[kKeepAliveTimeoutThreshold], - client2[kKeepAliveMaxTimeout] - ); - if (timeout <= 0) { - socket[kReset] = true; - } else { - client2[kKeepAliveTimeoutValue] = timeout; - } - } else { - client2[kKeepAliveTimeoutValue] = client2[kKeepAliveDefaultTimeout]; - } - } else { - socket[kReset] = true; + if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) { + throw new InvalidArgumentError("invalid keepAliveMaxTimeout"); } - const pause = request2.onHeaders(statusCode, headers2, this.resume, statusText) === false; - if (request2.aborted) { - return -1; + if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) { + throw new InvalidArgumentError("invalid keepAliveTimeoutThreshold"); } - if (request2.method === "HEAD") { - return 1; + if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) { + throw new InvalidArgumentError("headersTimeout must be a positive integer or zero"); } - if (statusCode < 200) { - return 1; + if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) { + throw new InvalidArgumentError("bodyTimeout must be a positive integer or zero"); } - if (socket[kBlocking]) { - socket[kBlocking] = false; - resume(client2); + if (connect3 != null && typeof connect3 !== "function" && typeof connect3 !== "object") { + throw new InvalidArgumentError("connect must be a function or an object"); } - return pause ? constants2.ERROR.PAUSED : 0; - } - onBody(buf) { - const { client: client2, socket, statusCode, maxResponseSize } = this; - if (socket.destroyed) { - return -1; + if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { + throw new InvalidArgumentError("maxRedirections must be a positive number"); } - const request2 = client2[kQueue][client2[kRunningIdx]]; - assert(request2); - assert.strictEqual(this.timeoutType, TIMEOUT_BODY); - if (this.timeout) { - if (this.timeout.refresh) { - this.timeout.refresh(); - } + if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { + throw new InvalidArgumentError("maxRequestsPerClient must be a positive number"); } - assert(statusCode >= 200); - if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) { - util2.destroy(socket, new ResponseExceededMaxSizeError()); - return -1; + if (localAddress != null && (typeof localAddress !== "string" || net.isIP(localAddress) === 0)) { + throw new InvalidArgumentError("localAddress must be valid string IP address"); } - this.bytesRead += buf.length; - if (request2.onData(buf) === false) { - return constants2.ERROR.PAUSED; + if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) { + throw new InvalidArgumentError("maxResponseSize must be a positive number"); } - } - onMessageComplete() { - const { client: client2, socket, statusCode, upgrade, headers: headers2, contentLength, bytesRead, shouldKeepAlive } = this; - if (socket.destroyed && (!statusCode || shouldKeepAlive)) { - return -1; + if (autoSelectFamilyAttemptTimeout != null && (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1)) { + throw new InvalidArgumentError("autoSelectFamilyAttemptTimeout must be a positive number"); } - if (upgrade) { - return; + if (allowH2 != null && typeof allowH2 !== "boolean") { + throw new InvalidArgumentError("allowH2 must be a valid boolean value"); } - const request2 = client2[kQueue][client2[kRunningIdx]]; - assert(request2); - assert(statusCode >= 100); - this.statusCode = null; - this.statusText = ""; - this.bytesRead = 0; - this.contentLength = ""; - this.keepAlive = ""; - this.connection = ""; - assert(this.headers.length % 2 === 0); - this.headers = []; - this.headersSize = 0; - if (statusCode < 200) { - return; + if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== "number" || maxConcurrentStreams < 1)) { + throw new InvalidArgumentError("maxConcurrentStreams must be a positive integer, greater than 0"); } - if (request2.method !== "HEAD" && contentLength && bytesRead !== parseInt(contentLength, 10)) { - util2.destroy(socket, new ResponseContentLengthMismatchError()); - return -1; + if (typeof connect3 !== "function") { + connect3 = buildConnector({ + ...tls, + maxCachedSessions, + allowH2, + socketPath, + timeout: connectTimeout, + ...autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0, + ...connect3 + }); } - request2.onComplete(headers2); - client2[kQueue][client2[kRunningIdx]++] = null; - if (socket[kWriting]) { - assert.strictEqual(client2[kRunning], 0); - util2.destroy(socket, new InformationalError("reset")); - return constants2.ERROR.PAUSED; - } else if (!shouldKeepAlive) { - util2.destroy(socket, new InformationalError("reset")); - return constants2.ERROR.PAUSED; - } else if (socket[kReset] && client2[kRunning] === 0) { - util2.destroy(socket, new InformationalError("reset")); - return constants2.ERROR.PAUSED; - } else if (client2[kPipelining] === 1) { - setImmediate(resume, client2); + if (interceptors?.Client && Array.isArray(interceptors.Client)) { + this[kInterceptors] = interceptors.Client; + if (!deprecatedInterceptorWarned) { + deprecatedInterceptorWarned = true; + process.emitWarning("Client.Options#interceptor is deprecated. Use Dispatcher#compose instead.", { + code: "UNDICI-CLIENT-INTERCEPTOR-DEPRECATED" + }); + } } else { - resume(client2); + this[kInterceptors] = [createRedirectInterceptor({ maxRedirections })]; } + this[kUrl] = util2.parseOrigin(url); + this[kConnector] = connect3; + this[kPipelining] = pipelining != null ? pipelining : 1; + this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize; + this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout; + this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 6e5 : keepAliveMaxTimeout; + this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 2e3 : keepAliveTimeoutThreshold; + this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout]; + this[kServerName] = null; + this[kLocalAddress] = localAddress != null ? localAddress : null; + this[kResuming] = 0; + this[kNeedDrain] = 0; + this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ""}\r +`; + this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 3e5; + this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 3e5; + this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength; + this[kMaxRedirections] = maxRedirections; + this[kMaxRequests] = maxRequestsPerClient; + this[kClosedResolve] = null; + this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1; + this[kMaxConcurrentStreams] = maxConcurrentStreams != null ? maxConcurrentStreams : 100; + this[kHTTPContext] = null; + this[kQueue] = []; + this[kRunningIdx] = 0; + this[kPendingIdx] = 0; + this[kResume] = (sync) => resume(this, sync); + this[kOnError] = (err) => onError(this, err); } - } - function onParserTimeout(parser) { - const { socket, timeoutType, client: client2 } = parser; - if (timeoutType === TIMEOUT_HEADERS) { - if (!socket[kWriting] || socket.writableNeedDrain || client2[kRunning] > 1) { - assert(!parser.paused, "cannot be paused while waiting for headers"); - util2.destroy(socket, new HeadersTimeoutError()); - } - } else if (timeoutType === TIMEOUT_BODY) { - if (!parser.paused) { - util2.destroy(socket, new BodyTimeoutError()); - } - } else if (timeoutType === TIMEOUT_IDLE) { - assert(client2[kRunning] === 0 && client2[kKeepAliveTimeoutValue]); - util2.destroy(socket, new InformationalError("socket idle timeout")); + get pipelining() { + return this[kPipelining]; } - } - function onSocketReadable() { - const { [kParser]: parser } = this; - if (parser) { - parser.readMore(); + set pipelining(value) { + this[kPipelining] = value; + this[kResume](true); } - } - function onSocketError(err) { - const { [kClient]: client2, [kParser]: parser } = this; - assert(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); - if (client2[kHTTPConnVersion] !== "h2") { - if (err.code === "ECONNRESET" && parser.statusCode && !parser.shouldKeepAlive) { - parser.onMessageComplete(); - return; + get [kPending]() { + return this[kQueue].length - this[kPendingIdx]; + } + get [kRunning]() { + return this[kPendingIdx] - this[kRunningIdx]; + } + get [kSize]() { + return this[kQueue].length - this[kRunningIdx]; + } + get [kConnected]() { + return !!this[kHTTPContext] && !this[kConnecting] && !this[kHTTPContext].destroyed; + } + get [kBusy]() { + return Boolean( + this[kHTTPContext]?.busy(null) || this[kSize] >= (getPipelining(this) || 1) || this[kPending] > 0 + ); + } + /* istanbul ignore: only used for test */ + [kConnect](cb) { + connect2(this); + this.once("connect", cb); + } + [kDispatch](opts, handler2) { + const origin = opts.origin || this[kUrl].origin; + const request2 = new Request(origin, opts, handler2); + this[kQueue].push(request2); + if (this[kResuming]) ; + else if (util2.bodyLength(request2.body) == null && util2.isIterable(request2.body)) { + this[kResuming] = 1; + queueMicrotask(() => resume(this)); + } else { + this[kResume](true); } + if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) { + this[kNeedDrain] = 2; + } + return this[kNeedDrain] < 2; + } + async [kClose]() { + return new Promise((resolve) => { + if (this[kSize]) { + this[kClosedResolve] = resolve; + } else { + resolve(null); + } + }); + } + async [kDestroy](err) { + return new Promise((resolve) => { + const requests = this[kQueue].splice(this[kPendingIdx]); + for (let i = 0; i < requests.length; i++) { + const request2 = requests[i]; + util2.errorRequest(this, request2, err); + } + const callback = () => { + if (this[kClosedResolve]) { + this[kClosedResolve](); + this[kClosedResolve] = null; + } + resolve(null); + }; + if (this[kHTTPContext]) { + this[kHTTPContext].destroy(err, callback); + this[kHTTPContext] = null; + } else { + queueMicrotask(callback); + } + this[kResume](); + }); } - this[kError] = err; - onError(this[kClient], err); } + const createRedirectInterceptor = requireRedirectInterceptor$1(); function onError(client2, err) { if (client2[kRunning] === 0 && err.code !== "UND_ERR_INFO" && err.code !== "UND_ERR_SOCKET") { assert(client2[kPendingIdx] === client2[kRunningIdx]); const requests = client2[kQueue].splice(client2[kRunningIdx]); for (let i = 0; i < requests.length; i++) { const request2 = requests[i]; - errorRequest(client2, request2, err); + util2.errorRequest(client2, request2, err); } assert(client2[kSize] === 0); } } - function onSocketEnd() { - const { [kParser]: parser, [kClient]: client2 } = this; - if (client2[kHTTPConnVersion] !== "h2") { - if (parser.statusCode && !parser.shouldKeepAlive) { - parser.onMessageComplete(); - return; - } - } - util2.destroy(this, new SocketError("other side closed", util2.getSocketInfo(this))); - } - function onSocketClose() { - const { [kClient]: client2, [kParser]: parser } = this; - if (client2[kHTTPConnVersion] === "h1" && parser) { - if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { - parser.onMessageComplete(); - } - this[kParser].destroy(); - this[kParser] = null; - } - const err = this[kError] || new SocketError("closed", util2.getSocketInfo(this)); - client2[kSocket] = null; - if (client2.destroyed) { - assert(client2[kPending] === 0); - const requests = client2[kQueue].splice(client2[kRunningIdx]); - for (let i = 0; i < requests.length; i++) { - const request2 = requests[i]; - errorRequest(client2, request2, err); - } - } else if (client2[kRunning] > 0 && err.code !== "UND_ERR_INFO") { - const request2 = client2[kQueue][client2[kRunningIdx]]; - client2[kQueue][client2[kRunningIdx]++] = null; - errorRequest(client2, request2, err); - } - client2[kPendingIdx] = client2[kRunningIdx]; - assert(client2[kRunning] === 0); - client2.emit("disconnect", client2[kUrl], [client2], err); - resume(client2); - } async function connect2(client2) { assert(!client2[kConnecting]); - assert(!client2[kSocket]); + assert(!client2[kHTTPContext]); let { host, hostname, protocol, port } = client2[kUrl]; if (hostname[0] === "[") { const idx = hostname.indexOf("]"); @@ -7798,6 +8022,7 @@ function requireClient() { hostname, protocol, port, + version: client2[kHTTPContext]?.version, servername: client2[kServerName], localAddress: client2[kLocalAddress] }, @@ -7822,52 +8047,21 @@ function requireClient() { }); }); if (client2.destroyed) { - util2.destroy(socket.on("error", () => { - }), new ClientDestroyedError()); + util2.destroy(socket.on("error", noop2), new ClientDestroyedError()); return; } - client2[kConnecting] = false; assert(socket); - const isH2 = socket.alpnProtocol === "h2"; - if (isH2) { - if (!h2ExperimentalWarned) { - h2ExperimentalWarned = true; - process.emitWarning("H2 support is experimental, expect them to change at any time.", { - code: "UNDICI-H2" - }); - } - const session = http2.connect(client2[kUrl], { - createConnection: () => socket, - peerMaxConcurrentStreams: client2[kHTTP2SessionState].maxConcurrentStreams - }); - client2[kHTTPConnVersion] = "h2"; - session[kClient] = client2; - session[kSocket] = socket; - session.on("error", onHttp2SessionError); - session.on("frameError", onHttp2FrameError); - session.on("end", onHttp2SessionEnd); - session.on("goaway", onHTTP2GoAway); - session.on("close", onSocketClose); - session.unref(); - client2[kHTTP2Session] = session; - socket[kHTTP2Session] = session; - } else { - if (!llhttpInstance) { - llhttpInstance = await llhttpPromise; - llhttpPromise = null; - } - socket[kNoRef] = false; - socket[kWriting] = false; - socket[kReset] = false; - socket[kBlocking] = false; - socket[kParser] = new Parser(client2, socket, llhttpInstance); + try { + client2[kHTTPContext] = socket.alpnProtocol === "h2" ? await connectH2(client2, socket) : await connectH1(client2, socket); + } catch (err) { + socket.destroy().on("error", noop2); + throw err; } + client2[kConnecting] = false; socket[kCounter] = 0; socket[kMaxRequests] = client2[kMaxRequests]; socket[kClient] = client2; socket[kError] = null; - socket.on("error", onSocketError).on("readable", onSocketReadable).on("end", onSocketEnd).on("close", onSocketClose); - client2[kSocket] = socket; if (channels.connected.hasSubscribers) { channels.connected.publish({ connectParams: { @@ -7875,6 +8069,7 @@ function requireClient() { hostname, protocol, port, + version: client2[kHTTPContext]?.version, servername: client2[kServerName], localAddress: client2[kLocalAddress] }, @@ -7895,6 +8090,7 @@ function requireClient() { hostname, protocol, port, + version: client2[kHTTPContext]?.version, servername: client2[kServerName], localAddress: client2[kLocalAddress] }, @@ -7906,14 +8102,14 @@ function requireClient() { assert(client2[kRunning] === 0); while (client2[kPending] > 0 && client2[kQueue][client2[kPendingIdx]].servername === client2[kServerName]) { const request2 = client2[kQueue][client2[kPendingIdx]++]; - errorRequest(client2, request2, err); + util2.errorRequest(client2, request2, err); } } else { onError(client2, err); } client2.emit("connectionError", client2[kUrl], [client2], err); } - resume(client2); + client2[kResume](); } function emitDrain(client2) { client2[kNeedDrain] = 0; @@ -7943,35 +8139,15 @@ function requireClient() { client2[kClosedResolve] = null; return; } - const socket = client2[kSocket]; - if (socket && !socket.destroyed && socket.alpnProtocol !== "h2") { - if (client2[kSize] === 0) { - if (!socket[kNoRef] && socket.unref) { - socket.unref(); - socket[kNoRef] = true; - } - } else if (socket[kNoRef] && socket.ref) { - socket.ref(); - socket[kNoRef] = false; - } - if (client2[kSize] === 0) { - if (socket[kParser].timeoutType !== TIMEOUT_IDLE) { - socket[kParser].setTimeout(client2[kKeepAliveTimeoutValue], TIMEOUT_IDLE); - } - } else if (client2[kRunning] > 0 && socket[kParser].statusCode < 200) { - if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) { - const request3 = client2[kQueue][client2[kRunningIdx]]; - const headersTimeout = request3.headersTimeout != null ? request3.headersTimeout : client2[kHeadersTimeout]; - socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS); - } - } + if (client2[kHTTPContext]) { + client2[kHTTPContext].resume(); } if (client2[kBusy]) { client2[kNeedDrain] = 2; } else if (client2[kNeedDrain] === 2) { if (sync) { client2[kNeedDrain] = 1; - process.nextTick(emitDrain, client2); + queueMicrotask(() => emitDrain(client2)); } else { emitDrain(client2); } @@ -7980,7 +8156,7 @@ function requireClient() { if (client2[kPending] === 0) { return; } - if (client2[kRunning] >= (client2[kPipelining] || 1)) { + if (client2[kRunning] >= (getPipelining(client2) || 1)) { return; } const request2 = client2[kQueue][client2[kPendingIdx]]; @@ -7989,1278 +8165,1329 @@ function requireClient() { return; } client2[kServerName] = request2.servername; - if (socket && socket.servername !== request2.servername) { - util2.destroy(socket, new InformationalError("servername changed")); - return; - } + client2[kHTTPContext]?.destroy(new InformationalError("servername changed"), () => { + client2[kHTTPContext] = null; + resume(client2); + }); } if (client2[kConnecting]) { return; } - if (!socket && !client2[kHTTP2Session]) { + if (!client2[kHTTPContext]) { connect2(client2); return; } - if (socket.destroyed || socket[kWriting] || socket[kReset] || socket[kBlocking]) { - return; - } - if (client2[kRunning] > 0 && !request2.idempotent) { - return; - } - if (client2[kRunning] > 0 && (request2.upgrade || request2.method === "CONNECT")) { - return; - } - if (client2[kRunning] > 0 && util2.bodyLength(request2.body) !== 0 && (util2.isStream(request2.body) || util2.isAsyncIterable(request2.body))) { - return; - } - if (!request2.aborted && write(client2, request2)) { - client2[kPendingIdx]++; - } else { - client2[kQueue].splice(client2[kPendingIdx], 1); - } - } - } - function shouldSendContentLength(method) { - return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT"; - } - function write(client2, request2) { - if (client2[kHTTPConnVersion] === "h2") { - writeH2(client2, client2[kHTTP2Session], request2); - return; - } - const { body: body2, method, path, host, upgrade, headers: headers2, blocking, reset } = request2; - const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH"; - if (body2 && typeof body2.read === "function") { - body2.read(0); - } - const bodyLength = util2.bodyLength(body2); - let contentLength = bodyLength; - if (contentLength === null) { - contentLength = request2.contentLength; - } - if (contentLength === 0 && !expectsPayload) { - contentLength = null; - } - if (shouldSendContentLength(method) && contentLength > 0 && request2.contentLength !== null && request2.contentLength !== contentLength) { - if (client2[kStrictContentLength]) { - errorRequest(client2, request2, new RequestContentLengthMismatchError()); - return false; - } - process.emitWarning(new RequestContentLengthMismatchError()); - } - const socket = client2[kSocket]; - try { - request2.onConnect((err) => { - if (request2.aborted || request2.completed) { - return; - } - errorRequest(client2, request2, err || new RequestAbortedError()); - util2.destroy(socket, new InformationalError("aborted")); - }); - } catch (err) { - errorRequest(client2, request2, err); - } - if (request2.aborted) { - return false; - } - if (method === "HEAD") { - socket[kReset] = true; - } - if (upgrade || method === "CONNECT") { - socket[kReset] = true; - } - if (reset != null) { - socket[kReset] = reset; - } - if (client2[kMaxRequests] && socket[kCounter]++ >= client2[kMaxRequests]) { - socket[kReset] = true; - } - if (blocking) { - socket[kBlocking] = true; - } - let header = `${method} ${path} HTTP/1.1\r -`; - if (typeof host === "string") { - header += `host: ${host}\r -`; - } else { - header += client2[kHostHeader]; - } - if (upgrade) { - header += `connection: upgrade\r -upgrade: ${upgrade}\r -`; - } else if (client2[kPipelining] && !socket[kReset]) { - header += "connection: keep-alive\r\n"; - } else { - header += "connection: close\r\n"; - } - if (headers2) { - header += headers2; - } - if (channels.sendHeaders.hasSubscribers) { - channels.sendHeaders.publish({ request: request2, headers: header, socket }); - } - if (!body2 || bodyLength === 0) { - if (contentLength === 0) { - socket.write(`${header}content-length: 0\r -\r -`, "latin1"); - } else { - assert(contentLength === null, "no body must not have content length"); - socket.write(`${header}\r -`, "latin1"); - } - request2.onRequestSent(); - } else if (util2.isBuffer(body2)) { - assert(contentLength === body2.byteLength, "buffer body must have content length"); - socket.cork(); - socket.write(`${header}content-length: ${contentLength}\r -\r -`, "latin1"); - socket.write(body2); - socket.uncork(); - request2.onBodySent(body2); - request2.onRequestSent(); - if (!expectsPayload) { - socket[kReset] = true; + if (client2[kHTTPContext].destroyed) { + return; } - } else if (util2.isBlobLike(body2)) { - if (typeof body2.stream === "function") { - writeIterable({ body: body2.stream(), client: client2, request: request2, socket, contentLength, header, expectsPayload }); + if (client2[kHTTPContext].busy(request2)) { + return; + } + if (!request2.aborted && client2[kHTTPContext].write(request2)) { + client2[kPendingIdx]++; } else { - writeBlob({ body: body2, client: client2, request: request2, socket, contentLength, header, expectsPayload }); + client2[kQueue].splice(client2[kPendingIdx], 1); } - } else if (util2.isStream(body2)) { - writeStream({ body: body2, client: client2, request: request2, socket, contentLength, header, expectsPayload }); - } else if (util2.isIterable(body2)) { - writeIterable({ body: body2, client: client2, request: request2, socket, contentLength, header, expectsPayload }); - } else { - assert(false); } - return true; } - function writeH2(client2, session, request2) { - const { body: body2, method, path, host, upgrade, expectContinue, signal, headers: reqHeaders } = request2; - let headers2; - if (typeof reqHeaders === "string") headers2 = Request[kHTTP2CopyHeaders](reqHeaders.trim()); - else headers2 = reqHeaders; - if (upgrade) { - errorRequest(client2, request2, new Error("Upgrade not supported for H2")); - return false; + client$1 = Client; + return client$1; +} +var fixedQueue$1; +var hasRequiredFixedQueue$1; +function requireFixedQueue$1() { + if (hasRequiredFixedQueue$1) return fixedQueue$1; + hasRequiredFixedQueue$1 = 1; + const kSize = 2048; + const kMask = kSize - 1; + class FixedCircularBuffer { + constructor() { + this.bottom = 0; + this.top = 0; + this.list = new Array(kSize); + this.next = null; } - try { - request2.onConnect((err) => { - if (request2.aborted || request2.completed) { - return; - } - errorRequest(client2, request2, err || new RequestAbortedError()); - }); - } catch (err) { - errorRequest(client2, request2, err); + isEmpty() { + return this.top === this.bottom; } - if (request2.aborted) { - return false; + isFull() { + return (this.top + 1 & kMask) === this.bottom; } - let stream; - const h2State = client2[kHTTP2SessionState]; - headers2[HTTP2_HEADER_AUTHORITY] = host || client2[kHost]; - headers2[HTTP2_HEADER_METHOD] = method; - if (method === "CONNECT") { - session.ref(); - stream = session.request(headers2, { endStream: false, signal }); - if (stream.id && !stream.pending) { - request2.onUpgrade(null, null, stream); - ++h2State.openStreams; - } else { - stream.once("ready", () => { - request2.onUpgrade(null, null, stream); - ++h2State.openStreams; - }); - } - stream.once("close", () => { - h2State.openStreams -= 1; - if (h2State.openStreams === 0) session.unref(); - }); - return true; + push(data) { + this.list[this.top] = data; + this.top = this.top + 1 & kMask; } - headers2[HTTP2_HEADER_PATH] = path; - headers2[HTTP2_HEADER_SCHEME] = "https"; - const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH"; - if (body2 && typeof body2.read === "function") { - body2.read(0); + shift() { + const nextItem = this.list[this.bottom]; + if (nextItem === void 0) + return null; + this.list[this.bottom] = void 0; + this.bottom = this.bottom + 1 & kMask; + return nextItem; } - let contentLength = util2.bodyLength(body2); - if (contentLength == null) { - contentLength = request2.contentLength; + } + fixedQueue$1 = class FixedQueue { + constructor() { + this.head = this.tail = new FixedCircularBuffer(); } - if (contentLength === 0 || !expectsPayload) { - contentLength = null; + isEmpty() { + return this.head.isEmpty(); } - if (shouldSendContentLength(method) && contentLength > 0 && request2.contentLength != null && request2.contentLength !== contentLength) { - if (client2[kStrictContentLength]) { - errorRequest(client2, request2, new RequestContentLengthMismatchError()); - return false; + push(data) { + if (this.head.isFull()) { + this.head = this.head.next = new FixedCircularBuffer(); } - process.emitWarning(new RequestContentLengthMismatchError()); + this.head.push(data); } - if (contentLength != null) { - assert(body2, "no body must not have content length"); - headers2[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}`; + shift() { + const tail = this.tail; + const next = tail.shift(); + if (tail.isEmpty() && tail.next !== null) { + this.tail = tail.next; + } + return next; } - session.ref(); - const shouldEndStream = method === "GET" || method === "HEAD"; - if (expectContinue) { - headers2[HTTP2_HEADER_EXPECT] = "100-continue"; - stream = session.request(headers2, { endStream: shouldEndStream, signal }); - stream.once("continue", writeBodyH2); - } else { - stream = session.request(headers2, { - endStream: shouldEndStream, - signal - }); - writeBodyH2(); + }; + return fixedQueue$1; +} +var poolStats$1; +var hasRequiredPoolStats$1; +function requirePoolStats$1() { + if (hasRequiredPoolStats$1) return poolStats$1; + hasRequiredPoolStats$1 = 1; + const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = requireSymbols$9(); + const kPool = /* @__PURE__ */ Symbol("pool"); + class PoolStats { + constructor(pool2) { + this[kPool] = pool2; } - ++h2State.openStreams; - stream.once("response", (headers3) => { - const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers3; - if (request2.onHeaders(Number(statusCode), realHeaders, stream.resume.bind(stream), "") === false) { - stream.pause(); - } - }); - stream.once("end", () => { - request2.onComplete([]); - }); - stream.on("data", (chunk) => { - if (request2.onData(chunk) === false) { - stream.pause(); + get connected() { + return this[kPool][kConnected]; + } + get free() { + return this[kPool][kFree]; + } + get pending() { + return this[kPool][kPending]; + } + get queued() { + return this[kPool][kQueued]; + } + get running() { + return this[kPool][kRunning]; + } + get size() { + return this[kPool][kSize]; + } + } + poolStats$1 = PoolStats; + return poolStats$1; +} +var poolBase$1; +var hasRequiredPoolBase$1; +function requirePoolBase$1() { + if (hasRequiredPoolBase$1) return poolBase$1; + hasRequiredPoolBase$1 = 1; + const DispatcherBase = requireDispatcherBase$1(); + const FixedQueue = requireFixedQueue$1(); + const { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = requireSymbols$9(); + const PoolStats = requirePoolStats$1(); + const kClients = /* @__PURE__ */ Symbol("clients"); + const kNeedDrain = /* @__PURE__ */ Symbol("needDrain"); + const kQueue = /* @__PURE__ */ Symbol("queue"); + const kClosedResolve = /* @__PURE__ */ Symbol("closed resolve"); + const kOnDrain = /* @__PURE__ */ Symbol("onDrain"); + const kOnConnect = /* @__PURE__ */ Symbol("onConnect"); + const kOnDisconnect = /* @__PURE__ */ Symbol("onDisconnect"); + const kOnConnectionError = /* @__PURE__ */ Symbol("onConnectionError"); + const kGetDispatcher = /* @__PURE__ */ Symbol("get dispatcher"); + const kAddClient = /* @__PURE__ */ Symbol("add client"); + const kRemoveClient = /* @__PURE__ */ Symbol("remove client"); + const kStats = /* @__PURE__ */ Symbol("stats"); + class PoolBase extends DispatcherBase { + constructor() { + super(); + this[kQueue] = new FixedQueue(); + this[kClients] = []; + this[kQueued] = 0; + const pool2 = this; + this[kOnDrain] = function onDrain(origin, targets) { + const queue = pool2[kQueue]; + let needDrain = false; + while (!needDrain) { + const item = queue.shift(); + if (!item) { + break; + } + pool2[kQueued]--; + needDrain = !this.dispatch(item.opts, item.handler); + } + this[kNeedDrain] = needDrain; + if (!this[kNeedDrain] && pool2[kNeedDrain]) { + pool2[kNeedDrain] = false; + pool2.emit("drain", origin, [pool2, ...targets]); + } + if (pool2[kClosedResolve] && queue.isEmpty()) { + Promise.all(pool2[kClients].map((c) => c.close())).then(pool2[kClosedResolve]); + } + }; + this[kOnConnect] = (origin, targets) => { + pool2.emit("connect", origin, [pool2, ...targets]); + }; + this[kOnDisconnect] = (origin, targets, err) => { + pool2.emit("disconnect", origin, [pool2, ...targets], err); + }; + this[kOnConnectionError] = (origin, targets, err) => { + pool2.emit("connectionError", origin, [pool2, ...targets], err); + }; + this[kStats] = new PoolStats(this); + } + get [kBusy]() { + return this[kNeedDrain]; + } + get [kConnected]() { + return this[kClients].filter((client2) => client2[kConnected]).length; + } + get [kFree]() { + return this[kClients].filter((client2) => client2[kConnected] && !client2[kNeedDrain]).length; + } + get [kPending]() { + let ret = this[kQueued]; + for (const { [kPending]: pending } of this[kClients]) { + ret += pending; } - }); - stream.once("close", () => { - h2State.openStreams -= 1; - if (h2State.openStreams === 0) { - session.unref(); + return ret; + } + get [kRunning]() { + let ret = 0; + for (const { [kRunning]: running } of this[kClients]) { + ret += running; } - }); - stream.once("error", function(err) { - if (client2[kHTTP2Session] && !client2[kHTTP2Session].destroyed && !this.closed && !this.destroyed) { - h2State.streams -= 1; - util2.destroy(stream, err); + return ret; + } + get [kSize]() { + let ret = this[kQueued]; + for (const { [kSize]: size } of this[kClients]) { + ret += size; } - }); - stream.once("frameError", (type, code) => { - const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`); - errorRequest(client2, request2, err); - if (client2[kHTTP2Session] && !client2[kHTTP2Session].destroyed && !this.closed && !this.destroyed) { - h2State.streams -= 1; - util2.destroy(stream, err); + return ret; + } + get stats() { + return this[kStats]; + } + async [kClose]() { + if (this[kQueue].isEmpty()) { + await Promise.all(this[kClients].map((c) => c.close())); + } else { + await new Promise((resolve) => { + this[kClosedResolve] = resolve; + }); } - }); - return true; - function writeBodyH2() { - if (!body2) { - request2.onRequestSent(); - } else if (util2.isBuffer(body2)) { - assert(contentLength === body2.byteLength, "buffer body must have content length"); - stream.cork(); - stream.write(body2); - stream.uncork(); - stream.end(); - request2.onBodySent(body2); - request2.onRequestSent(); - } else if (util2.isBlobLike(body2)) { - if (typeof body2.stream === "function") { - writeIterable({ - client: client2, - request: request2, - contentLength, - h2stream: stream, - expectsPayload, - body: body2.stream(), - socket: client2[kSocket], - header: "" - }); - } else { - writeBlob({ - body: body2, - client: client2, - request: request2, - contentLength, - expectsPayload, - h2stream: stream, - header: "", - socket: client2[kSocket] - }); + } + async [kDestroy](err) { + while (true) { + const item = this[kQueue].shift(); + if (!item) { + break; } - } else if (util2.isStream(body2)) { - writeStream({ - body: body2, - client: client2, - request: request2, - contentLength, - expectsPayload, - socket: client2[kSocket], - h2stream: stream, - header: "" - }); - } else if (util2.isIterable(body2)) { - writeIterable({ - body: body2, - client: client2, - request: request2, - contentLength, - expectsPayload, - header: "", - h2stream: stream, - socket: client2[kSocket] - }); - } else { - assert(false); + item.handler.onError(err); } + await Promise.all(this[kClients].map((c) => c.destroy(err))); } - } - function writeStream({ h2stream, body: body2, client: client2, request: request2, socket, contentLength, header, expectsPayload }) { - assert(contentLength !== 0 || client2[kRunning] === 0, "stream body cannot be pipelined"); - if (client2[kHTTPConnVersion] === "h2") { - let onPipeData = function(chunk) { - request2.onBodySent(chunk); - }; - const pipe = pipeline( - body2, - h2stream, - (err) => { - if (err) { - util2.destroy(body2, err); - util2.destroy(h2stream, err); - } else { - request2.onRequestSent(); + [kDispatch](opts, handler2) { + const dispatcher2 = this[kGetDispatcher](); + if (!dispatcher2) { + this[kNeedDrain] = true; + this[kQueue].push({ opts, handler: handler2 }); + this[kQueued]++; + } else if (!dispatcher2.dispatch(opts, handler2)) { + dispatcher2[kNeedDrain] = true; + this[kNeedDrain] = !this[kGetDispatcher](); + } + return !this[kNeedDrain]; + } + [kAddClient](client2) { + client2.on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", this[kOnDisconnect]).on("connectionError", this[kOnConnectionError]); + this[kClients].push(client2); + if (this[kNeedDrain]) { + queueMicrotask(() => { + if (this[kNeedDrain]) { + this[kOnDrain](client2[kUrl], [this, client2]); } + }); + } + return this; + } + [kRemoveClient](client2) { + client2.close(() => { + const idx = this[kClients].indexOf(client2); + if (idx !== -1) { + this[kClients].splice(idx, 1); } - ); - pipe.on("data", onPipeData); - pipe.once("end", () => { - pipe.removeListener("data", onPipeData); - util2.destroy(pipe); }); - return; + this[kNeedDrain] = this[kClients].some((dispatcher2) => !dispatcher2[kNeedDrain] && dispatcher2.closed !== true && dispatcher2.destroyed !== true); } - let finished = false; - const writer = new AsyncWriter({ socket, request: request2, contentLength, client: client2, expectsPayload, header }); - const onData = function(chunk) { - if (finished) { - return; - } - try { - if (!writer.write(chunk) && this.pause) { - this.pause(); - } - } catch (err) { - util2.destroy(this, err); - } - }; - const onDrain = function() { - if (finished) { - return; + } + poolBase$1 = { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kRemoveClient, + kGetDispatcher + }; + return poolBase$1; +} +var pool$1; +var hasRequiredPool$1; +function requirePool$1() { + if (hasRequiredPool$1) return pool$1; + hasRequiredPool$1 = 1; + const { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kGetDispatcher + } = requirePoolBase$1(); + const Client = requireClient$1(); + const { + InvalidArgumentError + } = requireErrors$1(); + const util2 = requireUtil$e(); + const { kUrl, kInterceptors } = requireSymbols$9(); + const buildConnector = requireConnect$1(); + const kOptions = /* @__PURE__ */ Symbol("options"); + const kConnections = /* @__PURE__ */ Symbol("connections"); + const kFactory = /* @__PURE__ */ Symbol("factory"); + function defaultFactory(origin, opts) { + return new Client(origin, opts); + } + class Pool extends PoolBase { + constructor(origin, { + connections, + factory = defaultFactory, + connect: connect2, + connectTimeout, + tls, + maxCachedSessions, + socketPath, + autoSelectFamily, + autoSelectFamilyAttemptTimeout, + allowH2, + ...options + } = {}) { + super(); + if (connections != null && (!Number.isFinite(connections) || connections < 0)) { + throw new InvalidArgumentError("invalid connections"); } - if (body2.resume) { - body2.resume(); + if (typeof factory !== "function") { + throw new InvalidArgumentError("factory must be a function."); } - }; - const onAbort = function() { - if (finished) { - return; + if (connect2 != null && typeof connect2 !== "function" && typeof connect2 !== "object") { + throw new InvalidArgumentError("connect must be a function or an object"); } - const err = new RequestAbortedError(); - queueMicrotask(() => onFinished(err)); - }; - const onFinished = function(err) { - if (finished) { - return; + if (typeof connect2 !== "function") { + connect2 = buildConnector({ + ...tls, + maxCachedSessions, + allowH2, + socketPath, + timeout: connectTimeout, + ...autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0, + ...connect2 + }); } - finished = true; - assert(socket.destroyed || socket[kWriting] && client2[kRunning] <= 1); - socket.off("drain", onDrain).off("error", onFinished); - body2.removeListener("data", onData).removeListener("end", onFinished).removeListener("error", onFinished).removeListener("close", onAbort); - if (!err) { - try { - writer.end(); - } catch (er) { - err = er; + this[kInterceptors] = options.interceptors?.Pool && Array.isArray(options.interceptors.Pool) ? options.interceptors.Pool : []; + this[kConnections] = connections || null; + this[kUrl] = util2.parseOrigin(origin); + this[kOptions] = { ...util2.deepClone(options), connect: connect2, allowH2 }; + this[kOptions].interceptors = options.interceptors ? { ...options.interceptors } : void 0; + this[kFactory] = factory; + this.on("connectionError", (origin2, targets, error) => { + for (const target of targets) { + const idx = this[kClients].indexOf(target); + if (idx !== -1) { + this[kClients].splice(idx, 1); + } + } + }); + } + [kGetDispatcher]() { + for (const client2 of this[kClients]) { + if (!client2[kNeedDrain]) { + return client2; } } - writer.destroy(err); - if (err && (err.code !== "UND_ERR_INFO" || err.message !== "reset")) { - util2.destroy(body2, err); - } else { - util2.destroy(body2); + if (!this[kConnections] || this[kClients].length < this[kConnections]) { + const dispatcher2 = this[kFactory](this[kUrl], this[kOptions]); + this[kAddClient](dispatcher2); + return dispatcher2; } - }; - body2.on("data", onData).on("end", onFinished).on("error", onFinished).on("close", onAbort); - if (body2.resume) { - body2.resume(); } - socket.on("drain", onDrain).on("error", onFinished); } - async function writeBlob({ h2stream, body: body2, client: client2, request: request2, socket, contentLength, header, expectsPayload }) { - assert(contentLength === body2.size, "blob body must have content length"); - const isH2 = client2[kHTTPConnVersion] === "h2"; - try { - if (contentLength != null && contentLength !== body2.size) { - throw new RequestContentLengthMismatchError(); - } - const buffer = Buffer.from(await body2.arrayBuffer()); - if (isH2) { - h2stream.cork(); - h2stream.write(buffer); - h2stream.uncork(); - } else { - socket.cork(); - socket.write(`${header}content-length: ${contentLength}\r -\r -`, "latin1"); - socket.write(buffer); - socket.uncork(); - } - request2.onBodySent(buffer); - request2.onRequestSent(); - if (!expectsPayload) { - socket[kReset] = true; - } - resume(client2); - } catch (err) { - util2.destroy(isH2 ? h2stream : socket, err); + pool$1 = Pool; + return pool$1; +} +var balancedPool$1; +var hasRequiredBalancedPool$1; +function requireBalancedPool$1() { + if (hasRequiredBalancedPool$1) return balancedPool$1; + hasRequiredBalancedPool$1 = 1; + const { + BalancedPoolMissingUpstreamError, + InvalidArgumentError + } = requireErrors$1(); + const { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kRemoveClient, + kGetDispatcher + } = requirePoolBase$1(); + const Pool = requirePool$1(); + const { kUrl, kInterceptors } = requireSymbols$9(); + const { parseOrigin } = requireUtil$e(); + const kFactory = /* @__PURE__ */ Symbol("factory"); + const kOptions = /* @__PURE__ */ Symbol("options"); + const kGreatestCommonDivisor = /* @__PURE__ */ Symbol("kGreatestCommonDivisor"); + const kCurrentWeight = /* @__PURE__ */ Symbol("kCurrentWeight"); + const kIndex = /* @__PURE__ */ Symbol("kIndex"); + const kWeight = /* @__PURE__ */ Symbol("kWeight"); + const kMaxWeightPerServer = /* @__PURE__ */ Symbol("kMaxWeightPerServer"); + const kErrorPenalty = /* @__PURE__ */ Symbol("kErrorPenalty"); + function getGreatestCommonDivisor(a, b) { + if (a === 0) return b; + while (b !== 0) { + const t = b; + b = a % b; + a = t; } + return a; } - async function writeIterable({ h2stream, body: body2, client: client2, request: request2, socket, contentLength, header, expectsPayload }) { - assert(contentLength !== 0 || client2[kRunning] === 0, "iterator body cannot be pipelined"); - let callback = null; - function onDrain() { - if (callback) { - const cb = callback; - callback = null; - cb(); + function defaultFactory(origin, opts) { + return new Pool(origin, opts); + } + class BalancedPool extends PoolBase { + constructor(upstreams = [], { factory = defaultFactory, ...opts } = {}) { + super(); + this[kOptions] = opts; + this[kIndex] = -1; + this[kCurrentWeight] = 0; + this[kMaxWeightPerServer] = this[kOptions].maxWeightPerServer || 100; + this[kErrorPenalty] = this[kOptions].errorPenalty || 15; + if (!Array.isArray(upstreams)) { + upstreams = [upstreams]; } - } - const waitForDrain = () => new Promise((resolve, reject) => { - assert(callback === null); - if (socket[kError]) { - reject(socket[kError]); - } else { - callback = resolve; + if (typeof factory !== "function") { + throw new InvalidArgumentError("factory must be a function."); } - }); - if (client2[kHTTPConnVersion] === "h2") { - h2stream.on("close", onDrain).on("drain", onDrain); - try { - for await (const chunk of body2) { - if (socket[kError]) { - throw socket[kError]; - } - const res = h2stream.write(chunk); - request2.onBodySent(chunk); - if (!res) { - await waitForDrain(); - } - } - } catch (err) { - h2stream.destroy(err); - } finally { - request2.onRequestSent(); - h2stream.end(); - h2stream.off("close", onDrain).off("drain", onDrain); + this[kInterceptors] = opts.interceptors?.BalancedPool && Array.isArray(opts.interceptors.BalancedPool) ? opts.interceptors.BalancedPool : []; + this[kFactory] = factory; + for (const upstream of upstreams) { + this.addUpstream(upstream); } - return; + this._updateBalancedPoolStats(); } - socket.on("close", onDrain).on("drain", onDrain); - const writer = new AsyncWriter({ socket, request: request2, contentLength, client: client2, expectsPayload, header }); - try { - for await (const chunk of body2) { - if (socket[kError]) { - throw socket[kError]; - } - if (!writer.write(chunk)) { - await waitForDrain(); + addUpstream(upstream) { + const upstreamOrigin = parseOrigin(upstream).origin; + if (this[kClients].find((pool3) => pool3[kUrl].origin === upstreamOrigin && pool3.closed !== true && pool3.destroyed !== true)) { + return this; + } + const pool2 = this[kFactory](upstreamOrigin, Object.assign({}, this[kOptions])); + this[kAddClient](pool2); + pool2.on("connect", () => { + pool2[kWeight] = Math.min(this[kMaxWeightPerServer], pool2[kWeight] + this[kErrorPenalty]); + }); + pool2.on("connectionError", () => { + pool2[kWeight] = Math.max(1, pool2[kWeight] - this[kErrorPenalty]); + this._updateBalancedPoolStats(); + }); + pool2.on("disconnect", (...args) => { + const err = args[2]; + if (err && err.code === "UND_ERR_SOCKET") { + pool2[kWeight] = Math.max(1, pool2[kWeight] - this[kErrorPenalty]); + this._updateBalancedPoolStats(); } + }); + for (const client2 of this[kClients]) { + client2[kWeight] = this[kMaxWeightPerServer]; } - writer.end(); - } catch (err) { - writer.destroy(err); - } finally { - socket.off("close", onDrain).off("drain", onDrain); + this._updateBalancedPoolStats(); + return this; } - } - class AsyncWriter { - constructor({ socket, request: request2, contentLength, client: client2, expectsPayload, header }) { - this.socket = socket; - this.request = request2; - this.contentLength = contentLength; - this.client = client2; - this.bytesWritten = 0; - this.expectsPayload = expectsPayload; - this.header = header; - socket[kWriting] = true; + _updateBalancedPoolStats() { + let result = 0; + for (let i = 0; i < this[kClients].length; i++) { + result = getGreatestCommonDivisor(this[kClients][i][kWeight], result); + } + this[kGreatestCommonDivisor] = result; } - write(chunk) { - const { socket, request: request2, contentLength, client: client2, bytesWritten, expectsPayload, header } = this; - if (socket[kError]) { - throw socket[kError]; + removeUpstream(upstream) { + const upstreamOrigin = parseOrigin(upstream).origin; + const pool2 = this[kClients].find((pool3) => pool3[kUrl].origin === upstreamOrigin && pool3.closed !== true && pool3.destroyed !== true); + if (pool2) { + this[kRemoveClient](pool2); } - if (socket.destroyed) { - return false; + return this; + } + get upstreams() { + return this[kClients].filter((dispatcher2) => dispatcher2.closed !== true && dispatcher2.destroyed !== true).map((p) => p[kUrl].origin); + } + [kGetDispatcher]() { + if (this[kClients].length === 0) { + throw new BalancedPoolMissingUpstreamError(); } - const len = Buffer.byteLength(chunk); - if (!len) { - return true; + const dispatcher2 = this[kClients].find((dispatcher3) => !dispatcher3[kNeedDrain] && dispatcher3.closed !== true && dispatcher3.destroyed !== true); + if (!dispatcher2) { + return; } - if (contentLength !== null && bytesWritten + len > contentLength) { - if (client2[kStrictContentLength]) { - throw new RequestContentLengthMismatchError(); - } - process.emitWarning(new RequestContentLengthMismatchError()); + const allClientsBusy = this[kClients].map((pool2) => pool2[kNeedDrain]).reduce((a, b) => a && b, true); + if (allClientsBusy) { + return; } - socket.cork(); - if (bytesWritten === 0) { - if (!expectsPayload) { - socket[kReset] = true; - } - if (contentLength === null) { - socket.write(`${header}transfer-encoding: chunked\r -`, "latin1"); - } else { - socket.write(`${header}content-length: ${contentLength}\r -\r -`, "latin1"); + let counter = 0; + let maxWeightIndex = this[kClients].findIndex((pool2) => !pool2[kNeedDrain]); + while (counter++ < this[kClients].length) { + this[kIndex] = (this[kIndex] + 1) % this[kClients].length; + const pool2 = this[kClients][this[kIndex]]; + if (pool2[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool2[kNeedDrain]) { + maxWeightIndex = this[kIndex]; } - } - if (contentLength === null) { - socket.write(`\r -${len.toString(16)}\r -`, "latin1"); - } - this.bytesWritten += len; - const ret = socket.write(chunk); - socket.uncork(); - request2.onBodySent(chunk); - if (!ret) { - if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { - if (socket[kParser].timeout.refresh) { - socket[kParser].timeout.refresh(); + if (this[kIndex] === 0) { + this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor]; + if (this[kCurrentWeight] <= 0) { + this[kCurrentWeight] = this[kMaxWeightPerServer]; } } + if (pool2[kWeight] >= this[kCurrentWeight] && !pool2[kNeedDrain]) { + return pool2; + } } - return ret; + this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight]; + this[kIndex] = maxWeightIndex; + return this[kClients][maxWeightIndex]; } - end() { - const { socket, contentLength, client: client2, bytesWritten, expectsPayload, header, request: request2 } = this; - request2.onRequestSent(); - socket[kWriting] = false; - if (socket[kError]) { - throw socket[kError]; + } + balancedPool$1 = BalancedPool; + return balancedPool$1; +} +var agent$1; +var hasRequiredAgent$1; +function requireAgent$1() { + if (hasRequiredAgent$1) return agent$1; + hasRequiredAgent$1 = 1; + const { InvalidArgumentError } = requireErrors$1(); + const { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = requireSymbols$9(); + const DispatcherBase = requireDispatcherBase$1(); + const Pool = requirePool$1(); + const Client = requireClient$1(); + const util2 = requireUtil$e(); + const createRedirectInterceptor = requireRedirectInterceptor$1(); + const kOnConnect = /* @__PURE__ */ Symbol("onConnect"); + const kOnDisconnect = /* @__PURE__ */ Symbol("onDisconnect"); + const kOnConnectionError = /* @__PURE__ */ Symbol("onConnectionError"); + const kMaxRedirections = /* @__PURE__ */ Symbol("maxRedirections"); + const kOnDrain = /* @__PURE__ */ Symbol("onDrain"); + const kFactory = /* @__PURE__ */ Symbol("factory"); + const kOptions = /* @__PURE__ */ Symbol("options"); + function defaultFactory(origin, opts) { + return opts && opts.connections === 1 ? new Client(origin, opts) : new Pool(origin, opts); + } + class Agent extends DispatcherBase { + constructor({ factory = defaultFactory, maxRedirections = 0, connect: connect2, ...options } = {}) { + super(); + if (typeof factory !== "function") { + throw new InvalidArgumentError("factory must be a function."); } - if (socket.destroyed) { - return; + if (connect2 != null && typeof connect2 !== "function" && typeof connect2 !== "object") { + throw new InvalidArgumentError("connect must be a function or an object"); } - if (bytesWritten === 0) { - if (expectsPayload) { - socket.write(`${header}content-length: 0\r -\r -`, "latin1"); - } else { - socket.write(`${header}\r -`, "latin1"); - } - } else if (contentLength === null) { - socket.write("\r\n0\r\n\r\n", "latin1"); + if (!Number.isInteger(maxRedirections) || maxRedirections < 0) { + throw new InvalidArgumentError("maxRedirections must be a positive number"); } - if (contentLength !== null && bytesWritten !== contentLength) { - if (client2[kStrictContentLength]) { - throw new RequestContentLengthMismatchError(); - } else { - process.emitWarning(new RequestContentLengthMismatchError()); - } + if (connect2 && typeof connect2 !== "function") { + connect2 = { ...connect2 }; } - if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { - if (socket[kParser].timeout.refresh) { - socket[kParser].timeout.refresh(); - } + this[kInterceptors] = options.interceptors?.Agent && Array.isArray(options.interceptors.Agent) ? options.interceptors.Agent : [createRedirectInterceptor({ maxRedirections })]; + this[kOptions] = { ...util2.deepClone(options), connect: connect2 }; + this[kOptions].interceptors = options.interceptors ? { ...options.interceptors } : void 0; + this[kMaxRedirections] = maxRedirections; + this[kFactory] = factory; + this[kClients] = /* @__PURE__ */ new Map(); + this[kOnDrain] = (origin, targets) => { + this.emit("drain", origin, [this, ...targets]); + }; + this[kOnConnect] = (origin, targets) => { + this.emit("connect", origin, [this, ...targets]); + }; + this[kOnDisconnect] = (origin, targets, err) => { + this.emit("disconnect", origin, [this, ...targets], err); + }; + this[kOnConnectionError] = (origin, targets, err) => { + this.emit("connectionError", origin, [this, ...targets], err); + }; + } + get [kRunning]() { + let ret = 0; + for (const client2 of this[kClients].values()) { + ret += client2[kRunning]; } - resume(client2); + return ret; } - destroy(err) { - const { socket, client: client2 } = this; - socket[kWriting] = false; - if (err) { - assert(client2[kRunning] <= 1, "pipeline should only contain this request"); - util2.destroy(socket, err); + [kDispatch](opts, handler2) { + let key; + if (opts.origin && (typeof opts.origin === "string" || opts.origin instanceof URL)) { + key = String(opts.origin); + } else { + throw new InvalidArgumentError("opts.origin must be a non-empty string or URL."); + } + let dispatcher2 = this[kClients].get(key); + if (!dispatcher2) { + dispatcher2 = this[kFactory](opts.origin, this[kOptions]).on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", this[kOnDisconnect]).on("connectionError", this[kOnConnectionError]); + this[kClients].set(key, dispatcher2); } + return dispatcher2.dispatch(opts, handler2); } - } - function errorRequest(client2, request2, err) { - try { - request2.onError(err); - assert(request2.aborted); - } catch (err2) { - client2.emit("error", err2); + async [kClose]() { + const closePromises = []; + for (const client2 of this[kClients].values()) { + closePromises.push(client2.close()); + } + this[kClients].clear(); + await Promise.all(closePromises); + } + async [kDestroy](err) { + const destroyPromises = []; + for (const client2 of this[kClients].values()) { + destroyPromises.push(client2.destroy(err)); + } + this[kClients].clear(); + await Promise.all(destroyPromises); } } - client = Client; - return client; + agent$1 = Agent; + return agent$1; } -var fixedQueue; -var hasRequiredFixedQueue; -function requireFixedQueue() { - if (hasRequiredFixedQueue) return fixedQueue; - hasRequiredFixedQueue = 1; - const kSize = 2048; - const kMask = kSize - 1; - class FixedCircularBuffer { - constructor() { - this.bottom = 0; - this.top = 0; - this.list = new Array(kSize); - this.next = null; - } - isEmpty() { - return this.top === this.bottom; - } - isFull() { - return (this.top + 1 & kMask) === this.bottom; - } - push(data) { - this.list[this.top] = data; - this.top = this.top + 1 & kMask; - } - shift() { - const nextItem = this.list[this.bottom]; - if (nextItem === void 0) - return null; - this.list[this.bottom] = void 0; - this.bottom = this.bottom + 1 & kMask; - return nextItem; - } +var proxyAgent$1; +var hasRequiredProxyAgent$1; +function requireProxyAgent$1() { + if (hasRequiredProxyAgent$1) return proxyAgent$1; + hasRequiredProxyAgent$1 = 1; + const { kProxy, kClose, kDestroy, kDispatch, kInterceptors } = requireSymbols$9(); + const { URL: URL2 } = require$$1$5; + const Agent = requireAgent$1(); + const Pool = requirePool$1(); + const DispatcherBase = requireDispatcherBase$1(); + const { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = requireErrors$1(); + const buildConnector = requireConnect$1(); + const Client = requireClient$1(); + const kAgent = /* @__PURE__ */ Symbol("proxy agent"); + const kClient = /* @__PURE__ */ Symbol("proxy client"); + const kProxyHeaders = /* @__PURE__ */ Symbol("proxy headers"); + const kRequestTls = /* @__PURE__ */ Symbol("request tls settings"); + const kProxyTls = /* @__PURE__ */ Symbol("proxy tls settings"); + const kConnectEndpoint = /* @__PURE__ */ Symbol("connect endpoint function"); + const kTunnelProxy = /* @__PURE__ */ Symbol("tunnel proxy"); + function defaultProtocolPort(protocol) { + return protocol === "https:" ? 443 : 80; } - fixedQueue = class FixedQueue { - constructor() { - this.head = this.tail = new FixedCircularBuffer(); - } - isEmpty() { - return this.head.isEmpty(); + function defaultFactory(origin, opts) { + return new Pool(origin, opts); + } + const noop2 = () => { + }; + function defaultAgentFactory(origin, opts) { + if (opts.connections === 1) { + return new Client(origin, opts); } - push(data) { - if (this.head.isFull()) { - this.head = this.head.next = new FixedCircularBuffer(); + return new Pool(origin, opts); + } + class Http1ProxyWrapper extends DispatcherBase { + #client; + constructor(proxyUrl, { headers: headers2 = {}, connect: connect2, factory }) { + super(); + if (!proxyUrl) { + throw new InvalidArgumentError("Proxy URL is mandatory"); } - this.head.push(data); - } - shift() { - const tail = this.tail; - const next = tail.shift(); - if (tail.isEmpty() && tail.next !== null) { - this.tail = tail.next; + this[kProxyHeaders] = headers2; + if (factory) { + this.#client = factory(proxyUrl, { connect: connect2 }); + } else { + this.#client = new Client(proxyUrl, { connect: connect2 }); } - return next; - } - }; - return fixedQueue; -} -var poolStats; -var hasRequiredPoolStats; -function requirePoolStats() { - if (hasRequiredPoolStats) return poolStats; - hasRequiredPoolStats = 1; - const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = requireSymbols$4(); - const kPool = /* @__PURE__ */ Symbol("pool"); - class PoolStats { - constructor(pool2) { - this[kPool] = pool2; - } - get connected() { - return this[kPool][kConnected]; - } - get free() { - return this[kPool][kFree]; } - get pending() { - return this[kPool][kPending]; - } - get queued() { - return this[kPool][kQueued]; + [kDispatch](opts, handler2) { + const onHeaders = handler2.onHeaders; + handler2.onHeaders = function(statusCode, data, resume) { + if (statusCode === 407) { + if (typeof handler2.onError === "function") { + handler2.onError(new InvalidArgumentError("Proxy Authentication Required (407)")); + } + return; + } + if (onHeaders) onHeaders.call(this, statusCode, data, resume); + }; + const { + origin, + path = "/", + headers: headers2 = {} + } = opts; + opts.path = origin + path; + if (!("host" in headers2) && !("Host" in headers2)) { + const { host } = new URL2(origin); + headers2.host = host; + } + opts.headers = { ...this[kProxyHeaders], ...headers2 }; + return this.#client[kDispatch](opts, handler2); } - get running() { - return this[kPool][kRunning]; + async [kClose]() { + return this.#client.close(); } - get size() { - return this[kPool][kSize]; + async [kDestroy](err) { + return this.#client.destroy(err); } } - poolStats = PoolStats; - return poolStats; -} -var poolBase; -var hasRequiredPoolBase; -function requirePoolBase() { - if (hasRequiredPoolBase) return poolBase; - hasRequiredPoolBase = 1; - const DispatcherBase = requireDispatcherBase(); - const FixedQueue = requireFixedQueue(); - const { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = requireSymbols$4(); - const PoolStats = requirePoolStats(); - const kClients = /* @__PURE__ */ Symbol("clients"); - const kNeedDrain = /* @__PURE__ */ Symbol("needDrain"); - const kQueue = /* @__PURE__ */ Symbol("queue"); - const kClosedResolve = /* @__PURE__ */ Symbol("closed resolve"); - const kOnDrain = /* @__PURE__ */ Symbol("onDrain"); - const kOnConnect = /* @__PURE__ */ Symbol("onConnect"); - const kOnDisconnect = /* @__PURE__ */ Symbol("onDisconnect"); - const kOnConnectionError = /* @__PURE__ */ Symbol("onConnectionError"); - const kGetDispatcher = /* @__PURE__ */ Symbol("get dispatcher"); - const kAddClient = /* @__PURE__ */ Symbol("add client"); - const kRemoveClient = /* @__PURE__ */ Symbol("remove client"); - const kStats = /* @__PURE__ */ Symbol("stats"); - class PoolBase extends DispatcherBase { - constructor() { + class ProxyAgent extends DispatcherBase { + constructor(opts) { super(); - this[kQueue] = new FixedQueue(); - this[kClients] = []; - this[kQueued] = 0; - const pool2 = this; - this[kOnDrain] = function onDrain(origin, targets) { - const queue = pool2[kQueue]; - let needDrain = false; - while (!needDrain) { - const item = queue.shift(); - if (!item) { - break; - } - pool2[kQueued]--; - needDrain = !this.dispatch(item.opts, item.handler); - } - this[kNeedDrain] = needDrain; - if (!this[kNeedDrain] && pool2[kNeedDrain]) { - pool2[kNeedDrain] = false; - pool2.emit("drain", origin, [pool2, ...targets]); - } - if (pool2[kClosedResolve] && queue.isEmpty()) { - Promise.all(pool2[kClients].map((c) => c.close())).then(pool2[kClosedResolve]); + if (!opts || typeof opts === "object" && !(opts instanceof URL2) && !opts.uri) { + throw new InvalidArgumentError("Proxy uri is mandatory"); + } + const { clientFactory = defaultFactory } = opts; + if (typeof clientFactory !== "function") { + throw new InvalidArgumentError("Proxy opts.clientFactory must be a function."); + } + const { proxyTunnel = true } = opts; + const url = this.#getUrl(opts); + const { href, origin, port, protocol, username, password, hostname: proxyHostname } = url; + this[kProxy] = { uri: href, protocol }; + this[kInterceptors] = opts.interceptors?.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent) ? opts.interceptors.ProxyAgent : []; + this[kRequestTls] = opts.requestTls; + this[kProxyTls] = opts.proxyTls; + this[kProxyHeaders] = opts.headers || {}; + this[kTunnelProxy] = proxyTunnel; + if (opts.auth && opts.token) { + throw new InvalidArgumentError("opts.auth cannot be used in combination with opts.token"); + } else if (opts.auth) { + this[kProxyHeaders]["proxy-authorization"] = `Basic ${opts.auth}`; + } else if (opts.token) { + this[kProxyHeaders]["proxy-authorization"] = opts.token; + } else if (username && password) { + this[kProxyHeaders]["proxy-authorization"] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString("base64")}`; + } + const connect2 = buildConnector({ ...opts.proxyTls }); + this[kConnectEndpoint] = buildConnector({ ...opts.requestTls }); + const agentFactory = opts.factory || defaultAgentFactory; + const factory = (origin2, options) => { + const { protocol: protocol2 } = new URL2(origin2); + if (!this[kTunnelProxy] && protocol2 === "http:" && this[kProxy].protocol === "http:") { + return new Http1ProxyWrapper(this[kProxy].uri, { + headers: this[kProxyHeaders], + connect: connect2, + factory: agentFactory + }); } + return agentFactory(origin2, options); }; - this[kOnConnect] = (origin, targets) => { - pool2.emit("connect", origin, [pool2, ...targets]); - }; - this[kOnDisconnect] = (origin, targets, err) => { - pool2.emit("disconnect", origin, [pool2, ...targets], err); - }; - this[kOnConnectionError] = (origin, targets, err) => { - pool2.emit("connectionError", origin, [pool2, ...targets], err); - }; - this[kStats] = new PoolStats(this); + this[kClient] = clientFactory(url, { connect: connect2 }); + this[kAgent] = new Agent({ + ...opts, + factory, + connect: async (opts2, callback) => { + let requestedPath = opts2.host; + if (!opts2.port) { + requestedPath += `:${defaultProtocolPort(opts2.protocol)}`; + } + try { + const { socket, statusCode } = await this[kClient].connect({ + origin, + port, + path: requestedPath, + signal: opts2.signal, + headers: { + ...this[kProxyHeaders], + host: opts2.host + }, + servername: this[kProxyTls]?.servername || proxyHostname + }); + if (statusCode !== 200) { + socket.on("error", noop2).destroy(); + callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`)); + } + if (opts2.protocol !== "https:") { + callback(null, socket); + return; + } + let servername; + if (this[kRequestTls]) { + servername = this[kRequestTls].servername; + } else { + servername = opts2.servername; + } + this[kConnectEndpoint]({ ...opts2, servername, httpSocket: socket }, callback); + } catch (err) { + if (err.code === "ERR_TLS_CERT_ALTNAME_INVALID") { + callback(new SecureProxyConnectionError(err)); + } else { + callback(err); + } + } + } + }); } - get [kBusy]() { - return this[kNeedDrain]; + dispatch(opts, handler2) { + const headers2 = buildHeaders(opts.headers); + throwIfProxyAuthIsSent(headers2); + if (headers2 && !("host" in headers2) && !("Host" in headers2)) { + const { host } = new URL2(opts.origin); + headers2.host = host; + } + return this[kAgent].dispatch( + { + ...opts, + headers: headers2 + }, + handler2 + ); } - get [kConnected]() { - return this[kClients].filter((client2) => client2[kConnected]).length; + /** + * @param {import('../types/proxy-agent').ProxyAgent.Options | string | URL} opts + * @returns {URL} + */ + #getUrl(opts) { + if (typeof opts === "string") { + return new URL2(opts); + } else if (opts instanceof URL2) { + return opts; + } else { + return new URL2(opts.uri); + } } - get [kFree]() { - return this[kClients].filter((client2) => client2[kConnected] && !client2[kNeedDrain]).length; + async [kClose]() { + await this[kAgent].close(); + await this[kClient].close(); } - get [kPending]() { - let ret = this[kQueued]; - for (const { [kPending]: pending } of this[kClients]) { - ret += pending; - } - return ret; + async [kDestroy]() { + await this[kAgent].destroy(); + await this[kClient].destroy(); } - get [kRunning]() { - let ret = 0; - for (const { [kRunning]: running } of this[kClients]) { - ret += running; + } + function buildHeaders(headers2) { + if (Array.isArray(headers2)) { + const headersPair = {}; + for (let i = 0; i < headers2.length; i += 2) { + headersPair[headers2[i]] = headers2[i + 1]; } - return ret; + return headersPair; } - get [kSize]() { - let ret = this[kQueued]; - for (const { [kSize]: size } of this[kClients]) { - ret += size; + return headers2; + } + function throwIfProxyAuthIsSent(headers2) { + const existProxyAuth = headers2 && Object.keys(headers2).find((key) => key.toLowerCase() === "proxy-authorization"); + if (existProxyAuth) { + throw new InvalidArgumentError("Proxy-Authorization should be sent in ProxyAgent constructor"); + } + } + proxyAgent$1 = ProxyAgent; + return proxyAgent$1; +} +var envHttpProxyAgent; +var hasRequiredEnvHttpProxyAgent; +function requireEnvHttpProxyAgent() { + if (hasRequiredEnvHttpProxyAgent) return envHttpProxyAgent; + hasRequiredEnvHttpProxyAgent = 1; + const DispatcherBase = requireDispatcherBase$1(); + const { kClose, kDestroy, kClosed, kDestroyed, kDispatch, kNoProxyAgent, kHttpProxyAgent, kHttpsProxyAgent } = requireSymbols$9(); + const ProxyAgent = requireProxyAgent$1(); + const Agent = requireAgent$1(); + const DEFAULT_PORTS = { + "http:": 80, + "https:": 443 + }; + let experimentalWarned = false; + class EnvHttpProxyAgent extends DispatcherBase { + #noProxyValue = null; + #noProxyEntries = null; + #opts = null; + constructor(opts = {}) { + super(); + this.#opts = opts; + if (!experimentalWarned) { + experimentalWarned = true; + process.emitWarning("EnvHttpProxyAgent is experimental, expect them to change at any time.", { + code: "UNDICI-EHPA" + }); } - return ret; + const { httpProxy, httpsProxy, noProxy, ...agentOpts } = opts; + this[kNoProxyAgent] = new Agent(agentOpts); + const HTTP_PROXY = httpProxy ?? process.env.http_proxy ?? process.env.HTTP_PROXY; + if (HTTP_PROXY) { + this[kHttpProxyAgent] = new ProxyAgent({ ...agentOpts, uri: HTTP_PROXY }); + } else { + this[kHttpProxyAgent] = this[kNoProxyAgent]; + } + const HTTPS_PROXY = httpsProxy ?? process.env.https_proxy ?? process.env.HTTPS_PROXY; + if (HTTPS_PROXY) { + this[kHttpsProxyAgent] = new ProxyAgent({ ...agentOpts, uri: HTTPS_PROXY }); + } else { + this[kHttpsProxyAgent] = this[kHttpProxyAgent]; + } + this.#parseNoProxy(); } - get stats() { - return this[kStats]; + [kDispatch](opts, handler2) { + const url = new URL(opts.origin); + const agent2 = this.#getProxyAgentForUrl(url); + return agent2.dispatch(opts, handler2); } async [kClose]() { - if (this[kQueue].isEmpty()) { - return Promise.all(this[kClients].map((c) => c.close())); - } else { - return new Promise((resolve) => { - this[kClosedResolve] = resolve; - }); + await this[kNoProxyAgent].close(); + if (!this[kHttpProxyAgent][kClosed]) { + await this[kHttpProxyAgent].close(); + } + if (!this[kHttpsProxyAgent][kClosed]) { + await this[kHttpsProxyAgent].close(); } } async [kDestroy](err) { - while (true) { - const item = this[kQueue].shift(); - if (!item) { - break; - } - item.handler.onError(err); + await this[kNoProxyAgent].destroy(err); + if (!this[kHttpProxyAgent][kDestroyed]) { + await this[kHttpProxyAgent].destroy(err); } - return Promise.all(this[kClients].map((c) => c.destroy(err))); - } - [kDispatch](opts, handler2) { - const dispatcher2 = this[kGetDispatcher](); - if (!dispatcher2) { - this[kNeedDrain] = true; - this[kQueue].push({ opts, handler: handler2 }); - this[kQueued]++; - } else if (!dispatcher2.dispatch(opts, handler2)) { - dispatcher2[kNeedDrain] = true; - this[kNeedDrain] = !this[kGetDispatcher](); + if (!this[kHttpsProxyAgent][kDestroyed]) { + await this[kHttpsProxyAgent].destroy(err); } - return !this[kNeedDrain]; } - [kAddClient](client2) { - client2.on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", this[kOnDisconnect]).on("connectionError", this[kOnConnectionError]); - this[kClients].push(client2); - if (this[kNeedDrain]) { - process.nextTick(() => { - if (this[kNeedDrain]) { - this[kOnDrain](client2[kUrl], [this, client2]); - } - }); + #getProxyAgentForUrl(url) { + let { protocol, host: hostname, port } = url; + hostname = hostname.replace(/:\d*$/, "").toLowerCase(); + port = Number.parseInt(port, 10) || DEFAULT_PORTS[protocol] || 0; + if (!this.#shouldProxy(hostname, port)) { + return this[kNoProxyAgent]; } - return this; - } - [kRemoveClient](client2) { - client2.close(() => { - const idx = this[kClients].indexOf(client2); - if (idx !== -1) { - this[kClients].splice(idx, 1); - } - }); - this[kNeedDrain] = this[kClients].some((dispatcher2) => !dispatcher2[kNeedDrain] && dispatcher2.closed !== true && dispatcher2.destroyed !== true); - } - } - poolBase = { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kRemoveClient, - kGetDispatcher - }; - return poolBase; -} -var pool; -var hasRequiredPool; -function requirePool() { - if (hasRequiredPool) return pool; - hasRequiredPool = 1; - const { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kGetDispatcher - } = requirePoolBase(); - const Client = requireClient(); - const { - InvalidArgumentError - } = requireErrors(); - const util2 = requireUtil$6(); - const { kUrl, kInterceptors } = requireSymbols$4(); - const buildConnector = requireConnect(); - const kOptions = /* @__PURE__ */ Symbol("options"); - const kConnections = /* @__PURE__ */ Symbol("connections"); - const kFactory = /* @__PURE__ */ Symbol("factory"); - function defaultFactory(origin, opts) { - return new Client(origin, opts); - } - class Pool extends PoolBase { - constructor(origin, { - connections, - factory = defaultFactory, - connect: connect2, - connectTimeout, - tls, - maxCachedSessions, - socketPath, - autoSelectFamily, - autoSelectFamilyAttemptTimeout, - allowH2, - ...options - } = {}) { - super(); - if (connections != null && (!Number.isFinite(connections) || connections < 0)) { - throw new InvalidArgumentError("invalid connections"); + if (protocol === "https:") { + return this[kHttpsProxyAgent]; } - if (typeof factory !== "function") { - throw new InvalidArgumentError("factory must be a function."); + return this[kHttpProxyAgent]; + } + #shouldProxy(hostname, port) { + if (this.#noProxyChanged) { + this.#parseNoProxy(); } - if (connect2 != null && typeof connect2 !== "function" && typeof connect2 !== "object") { - throw new InvalidArgumentError("connect must be a function or an object"); + if (this.#noProxyEntries.length === 0) { + return true; } - if (typeof connect2 !== "function") { - connect2 = buildConnector({ - ...tls, - maxCachedSessions, - allowH2, - socketPath, - timeout: connectTimeout, - ...util2.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0, - ...connect2 - }); + if (this.#noProxyValue === "*") { + return false; } - this[kInterceptors] = options.interceptors && options.interceptors.Pool && Array.isArray(options.interceptors.Pool) ? options.interceptors.Pool : []; - this[kConnections] = connections || null; - this[kUrl] = util2.parseOrigin(origin); - this[kOptions] = { ...util2.deepClone(options), connect: connect2, allowH2 }; - this[kOptions].interceptors = options.interceptors ? { ...options.interceptors } : void 0; - this[kFactory] = factory; - this.on("connectionError", (origin2, targets, error) => { - for (const target of targets) { - const idx = this[kClients].indexOf(target); - if (idx !== -1) { - this[kClients].splice(idx, 1); + for (let i = 0; i < this.#noProxyEntries.length; i++) { + const entry = this.#noProxyEntries[i]; + if (entry.port && entry.port !== port) { + continue; + } + if (!/^[.*]/.test(entry.hostname)) { + if (hostname === entry.hostname) { + return false; + } + } else { + if (hostname.endsWith(entry.hostname.replace(/^\*/, ""))) { + return false; } } - }); + } + return true; } - [kGetDispatcher]() { - let dispatcher2 = this[kClients].find((dispatcher3) => !dispatcher3[kNeedDrain]); - if (dispatcher2) { - return dispatcher2; + #parseNoProxy() { + const noProxyValue = this.#opts.noProxy ?? this.#noProxyEnv; + const noProxySplit = noProxyValue.split(/[,\s]/); + const noProxyEntries = []; + for (let i = 0; i < noProxySplit.length; i++) { + const entry = noProxySplit[i]; + if (!entry) { + continue; + } + const parsed = entry.match(/^(.+):(\d+)$/); + noProxyEntries.push({ + hostname: (parsed ? parsed[1] : entry).toLowerCase(), + port: parsed ? Number.parseInt(parsed[2], 10) : 0 + }); } - if (!this[kConnections] || this[kClients].length < this[kConnections]) { - dispatcher2 = this[kFactory](this[kUrl], this[kOptions]); - this[kAddClient](dispatcher2); + this.#noProxyValue = noProxyValue; + this.#noProxyEntries = noProxyEntries; + } + get #noProxyChanged() { + if (this.#opts.noProxy !== void 0) { + return false; } - return dispatcher2; + return this.#noProxyValue !== this.#noProxyEnv; + } + get #noProxyEnv() { + return process.env.no_proxy ?? process.env.NO_PROXY ?? ""; } } - pool = Pool; - return pool; + envHttpProxyAgent = EnvHttpProxyAgent; + return envHttpProxyAgent; } -var balancedPool; -var hasRequiredBalancedPool; -function requireBalancedPool() { - if (hasRequiredBalancedPool) return balancedPool; - hasRequiredBalancedPool = 1; - const { - BalancedPoolMissingUpstreamError, - InvalidArgumentError - } = requireErrors(); +var retryHandler; +var hasRequiredRetryHandler$1; +function requireRetryHandler$1() { + if (hasRequiredRetryHandler$1) return retryHandler; + hasRequiredRetryHandler$1 = 1; + const assert = require$$0$5; + const { kRetryHandlerDefaultRetry } = requireSymbols$9(); + const { RequestRetryError } = requireErrors$1(); const { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kRemoveClient, - kGetDispatcher - } = requirePoolBase(); - const Pool = requirePool(); - const { kUrl, kInterceptors } = requireSymbols$4(); - const { parseOrigin } = requireUtil$6(); - const kFactory = /* @__PURE__ */ Symbol("factory"); - const kOptions = /* @__PURE__ */ Symbol("options"); - const kGreatestCommonDivisor = /* @__PURE__ */ Symbol("kGreatestCommonDivisor"); - const kCurrentWeight = /* @__PURE__ */ Symbol("kCurrentWeight"); - const kIndex = /* @__PURE__ */ Symbol("kIndex"); - const kWeight = /* @__PURE__ */ Symbol("kWeight"); - const kMaxWeightPerServer = /* @__PURE__ */ Symbol("kMaxWeightPerServer"); - const kErrorPenalty = /* @__PURE__ */ Symbol("kErrorPenalty"); - function getGreatestCommonDivisor(a, b) { - if (b === 0) return a; - return getGreatestCommonDivisor(b, a % b); - } - function defaultFactory(origin, opts) { - return new Pool(origin, opts); + isDisturbed, + parseHeaders, + parseRangeHeader, + wrapRequestBody + } = requireUtil$e(); + function calculateRetryAfterHeader(retryAfter) { + const current = Date.now(); + return new Date(retryAfter).getTime() - current; } - class BalancedPool extends PoolBase { - constructor(upstreams = [], { factory = defaultFactory, ...opts } = {}) { - super(); - this[kOptions] = opts; - this[kIndex] = -1; - this[kCurrentWeight] = 0; - this[kMaxWeightPerServer] = this[kOptions].maxWeightPerServer || 100; - this[kErrorPenalty] = this[kOptions].errorPenalty || 15; - if (!Array.isArray(upstreams)) { - upstreams = [upstreams]; - } - if (typeof factory !== "function") { - throw new InvalidArgumentError("factory must be a function."); - } - this[kInterceptors] = opts.interceptors && opts.interceptors.BalancedPool && Array.isArray(opts.interceptors.BalancedPool) ? opts.interceptors.BalancedPool : []; - this[kFactory] = factory; - for (const upstream of upstreams) { - this.addUpstream(upstream); - } - this._updateBalancedPoolStats(); - } - addUpstream(upstream) { - const upstreamOrigin = parseOrigin(upstream).origin; - if (this[kClients].find((pool3) => pool3[kUrl].origin === upstreamOrigin && pool3.closed !== true && pool3.destroyed !== true)) { - return this; - } - const pool2 = this[kFactory](upstreamOrigin, Object.assign({}, this[kOptions])); - this[kAddClient](pool2); - pool2.on("connect", () => { - pool2[kWeight] = Math.min(this[kMaxWeightPerServer], pool2[kWeight] + this[kErrorPenalty]); - }); - pool2.on("connectionError", () => { - pool2[kWeight] = Math.max(1, pool2[kWeight] - this[kErrorPenalty]); - this._updateBalancedPoolStats(); - }); - pool2.on("disconnect", (...args) => { - const err = args[2]; - if (err && err.code === "UND_ERR_SOCKET") { - pool2[kWeight] = Math.max(1, pool2[kWeight] - this[kErrorPenalty]); - this._updateBalancedPoolStats(); + class RetryHandler { + constructor(opts, handlers) { + const { retryOptions, ...dispatchOpts } = opts; + const { + // Retry scoped + retry: retryFn, + maxRetries, + maxTimeout, + minTimeout, + timeoutFactor, + // Response scoped + methods, + errorCodes, + retryAfter, + statusCodes + } = retryOptions ?? {}; + this.dispatch = handlers.dispatch; + this.handler = handlers.handler; + this.opts = { ...dispatchOpts, body: wrapRequestBody(opts.body) }; + this.abort = null; + this.aborted = false; + this.retryOpts = { + retry: retryFn ?? RetryHandler[kRetryHandlerDefaultRetry], + retryAfter: retryAfter ?? true, + maxTimeout: maxTimeout ?? 30 * 1e3, + // 30s, + minTimeout: minTimeout ?? 500, + // .5s + timeoutFactor: timeoutFactor ?? 2, + maxRetries: maxRetries ?? 5, + // What errors we should retry + methods: methods ?? ["GET", "HEAD", "OPTIONS", "PUT", "DELETE", "TRACE"], + // Indicates which errors to retry + statusCodes: statusCodes ?? [500, 502, 503, 504, 429], + // List of errors to retry + errorCodes: errorCodes ?? [ + "ECONNRESET", + "ECONNREFUSED", + "ENOTFOUND", + "ENETDOWN", + "ENETUNREACH", + "EHOSTDOWN", + "EHOSTUNREACH", + "EPIPE", + "UND_ERR_SOCKET" + ] + }; + this.retryCount = 0; + this.retryCountCheckpoint = 0; + this.start = 0; + this.end = null; + this.etag = null; + this.resume = null; + this.handler.onConnect((reason) => { + this.aborted = true; + if (this.abort) { + this.abort(reason); + } else { + this.reason = reason; } }); - for (const client2 of this[kClients]) { - client2[kWeight] = this[kMaxWeightPerServer]; + } + onRequestSent() { + if (this.handler.onRequestSent) { + this.handler.onRequestSent(); } - this._updateBalancedPoolStats(); - return this; } - _updateBalancedPoolStats() { - this[kGreatestCommonDivisor] = this[kClients].map((p) => p[kWeight]).reduce(getGreatestCommonDivisor, 0); + onUpgrade(statusCode, headers2, socket) { + if (this.handler.onUpgrade) { + this.handler.onUpgrade(statusCode, headers2, socket); + } } - removeUpstream(upstream) { - const upstreamOrigin = parseOrigin(upstream).origin; - const pool2 = this[kClients].find((pool3) => pool3[kUrl].origin === upstreamOrigin && pool3.closed !== true && pool3.destroyed !== true); - if (pool2) { - this[kRemoveClient](pool2); + onConnect(abort) { + if (this.aborted) { + abort(this.reason); + } else { + this.abort = abort; } - return this; } - get upstreams() { - return this[kClients].filter((dispatcher2) => dispatcher2.closed !== true && dispatcher2.destroyed !== true).map((p) => p[kUrl].origin); + onBodySent(chunk) { + if (this.handler.onBodySent) return this.handler.onBodySent(chunk); } - [kGetDispatcher]() { - if (this[kClients].length === 0) { - throw new BalancedPoolMissingUpstreamError(); + static [kRetryHandlerDefaultRetry](err, { state, opts }, cb) { + const { statusCode, code, headers: headers2 } = err; + const { method, retryOptions } = opts; + const { + maxRetries, + minTimeout, + maxTimeout, + timeoutFactor, + statusCodes, + errorCodes, + methods + } = retryOptions; + const { counter } = state; + if (code && code !== "UND_ERR_REQ_RETRY" && !errorCodes.includes(code)) { + cb(err); + return; } - const dispatcher2 = this[kClients].find((dispatcher3) => !dispatcher3[kNeedDrain] && dispatcher3.closed !== true && dispatcher3.destroyed !== true); - if (!dispatcher2) { + if (Array.isArray(methods) && !methods.includes(method)) { + cb(err); return; } - const allClientsBusy = this[kClients].map((pool2) => pool2[kNeedDrain]).reduce((a, b) => a && b, true); - if (allClientsBusy) { + if (statusCode != null && Array.isArray(statusCodes) && !statusCodes.includes(statusCode)) { + cb(err); return; } - let counter = 0; - let maxWeightIndex = this[kClients].findIndex((pool2) => !pool2[kNeedDrain]); - while (counter++ < this[kClients].length) { - this[kIndex] = (this[kIndex] + 1) % this[kClients].length; - const pool2 = this[kClients][this[kIndex]]; - if (pool2[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool2[kNeedDrain]) { - maxWeightIndex = this[kIndex]; + if (counter > maxRetries) { + cb(err); + return; + } + let retryAfterHeader = headers2?.["retry-after"]; + if (retryAfterHeader) { + retryAfterHeader = Number(retryAfterHeader); + retryAfterHeader = Number.isNaN(retryAfterHeader) ? calculateRetryAfterHeader(retryAfterHeader) : retryAfterHeader * 1e3; + } + const retryTimeout = retryAfterHeader > 0 ? Math.min(retryAfterHeader, maxTimeout) : Math.min(minTimeout * timeoutFactor ** (counter - 1), maxTimeout); + setTimeout(() => cb(null), retryTimeout); + } + onHeaders(statusCode, rawHeaders, resume, statusMessage) { + const headers2 = parseHeaders(rawHeaders); + this.retryCount += 1; + if (statusCode >= 300) { + if (this.retryOpts.statusCodes.includes(statusCode) === false) { + return this.handler.onHeaders( + statusCode, + rawHeaders, + resume, + statusMessage + ); + } else { + this.abort( + new RequestRetryError("Request failed", statusCode, { + headers: headers2, + data: { + count: this.retryCount + } + }) + ); + return false; + } + } + if (this.resume != null) { + this.resume = null; + if (statusCode !== 206 && (this.start > 0 || statusCode !== 200)) { + this.abort( + new RequestRetryError("server does not support the range header and the payload was partially consumed", statusCode, { + headers: headers2, + data: { count: this.retryCount } + }) + ); + return false; + } + const contentRange = parseRangeHeader(headers2["content-range"]); + if (!contentRange) { + this.abort( + new RequestRetryError("Content-Range mismatch", statusCode, { + headers: headers2, + data: { count: this.retryCount } + }) + ); + return false; + } + if (this.etag != null && this.etag !== headers2.etag) { + this.abort( + new RequestRetryError("ETag mismatch", statusCode, { + headers: headers2, + data: { count: this.retryCount } + }) + ); + return false; } - if (this[kIndex] === 0) { - this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor]; - if (this[kCurrentWeight] <= 0) { - this[kCurrentWeight] = this[kMaxWeightPerServer]; + const { start, size, end = size - 1 } = contentRange; + assert(this.start === start, "content-range mismatch"); + assert(this.end == null || this.end === end, "content-range mismatch"); + this.resume = resume; + return true; + } + if (this.end == null) { + if (statusCode === 206) { + const range = parseRangeHeader(headers2["content-range"]); + if (range == null) { + return this.handler.onHeaders( + statusCode, + rawHeaders, + resume, + statusMessage + ); } + const { start, size, end = size - 1 } = range; + assert( + start != null && Number.isFinite(start), + "content-range mismatch" + ); + assert(end != null && Number.isFinite(end), "invalid content-length"); + this.start = start; + this.end = end; } - if (pool2[kWeight] >= this[kCurrentWeight] && !pool2[kNeedDrain]) { - return pool2; + if (this.end == null) { + const contentLength = headers2["content-length"]; + this.end = contentLength != null ? Number(contentLength) - 1 : null; + } + assert(Number.isFinite(this.start)); + assert( + this.end == null || Number.isFinite(this.end), + "invalid content-length" + ); + this.resume = resume; + this.etag = headers2.etag != null ? headers2.etag : null; + if (this.etag != null && this.etag.startsWith("W/")) { + this.etag = null; } + return this.handler.onHeaders( + statusCode, + rawHeaders, + resume, + statusMessage + ); } - this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight]; - this[kIndex] = maxWeightIndex; - return this[kClients][maxWeightIndex]; - } - } - balancedPool = BalancedPool; - return balancedPool; -} -var dispatcherWeakref; -var hasRequiredDispatcherWeakref; -function requireDispatcherWeakref() { - if (hasRequiredDispatcherWeakref) return dispatcherWeakref; - hasRequiredDispatcherWeakref = 1; - const { kConnected, kSize } = requireSymbols$4(); - class CompatWeakRef { - constructor(value) { - this.value = value; - } - deref() { - return this.value[kConnected] === 0 && this.value[kSize] === 0 ? void 0 : this.value; - } - } - class CompatFinalizer { - constructor(finalizer) { - this.finalizer = finalizer; + const err = new RequestRetryError("Request failed", statusCode, { + headers: headers2, + data: { count: this.retryCount } + }); + this.abort(err); + return false; } - register(dispatcher2, key) { - if (dispatcher2.on) { - dispatcher2.on("disconnect", () => { - if (dispatcher2[kConnected] === 0 && dispatcher2[kSize] === 0) { - this.finalizer(key); - } - }); - } + onData(chunk) { + this.start += chunk.length; + return this.handler.onData(chunk); } - } - dispatcherWeakref = function() { - if (process.env.NODE_V8_COVERAGE) { - return { - WeakRef: CompatWeakRef, - FinalizationRegistry: CompatFinalizer - }; + onComplete(rawTrailers) { + this.retryCount = 0; + return this.handler.onComplete(rawTrailers); } - return { - WeakRef: commonjsGlobal.WeakRef || CompatWeakRef, - FinalizationRegistry: commonjsGlobal.FinalizationRegistry || CompatFinalizer - }; - }; - return dispatcherWeakref; -} -var agent; -var hasRequiredAgent; -function requireAgent() { - if (hasRequiredAgent) return agent; - hasRequiredAgent = 1; - const { InvalidArgumentError } = requireErrors(); - const { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = requireSymbols$4(); - const DispatcherBase = requireDispatcherBase(); - const Pool = requirePool(); - const Client = requireClient(); - const util2 = requireUtil$6(); - const createRedirectInterceptor = requireRedirectInterceptor(); - const { WeakRef: WeakRef2, FinalizationRegistry } = requireDispatcherWeakref()(); - const kOnConnect = /* @__PURE__ */ Symbol("onConnect"); - const kOnDisconnect = /* @__PURE__ */ Symbol("onDisconnect"); - const kOnConnectionError = /* @__PURE__ */ Symbol("onConnectionError"); - const kMaxRedirections = /* @__PURE__ */ Symbol("maxRedirections"); - const kOnDrain = /* @__PURE__ */ Symbol("onDrain"); - const kFactory = /* @__PURE__ */ Symbol("factory"); - const kFinalizer = /* @__PURE__ */ Symbol("finalizer"); - const kOptions = /* @__PURE__ */ Symbol("options"); - function defaultFactory(origin, opts) { - return opts && opts.connections === 1 ? new Client(origin, opts) : new Pool(origin, opts); - } - class Agent extends DispatcherBase { - constructor({ factory = defaultFactory, maxRedirections = 0, connect: connect2, ...options } = {}) { - super(); - if (typeof factory !== "function") { - throw new InvalidArgumentError("factory must be a function."); - } - if (connect2 != null && typeof connect2 !== "function" && typeof connect2 !== "object") { - throw new InvalidArgumentError("connect must be a function or an object"); - } - if (!Number.isInteger(maxRedirections) || maxRedirections < 0) { - throw new InvalidArgumentError("maxRedirections must be a positive number"); + onError(err) { + if (this.aborted || isDisturbed(this.opts.body)) { + return this.handler.onError(err); } - if (connect2 && typeof connect2 !== "function") { - connect2 = { ...connect2 }; + if (this.retryCount - this.retryCountCheckpoint > 0) { + this.retryCount = this.retryCountCheckpoint + (this.retryCount - this.retryCountCheckpoint); + } else { + this.retryCount += 1; } - this[kInterceptors] = options.interceptors && options.interceptors.Agent && Array.isArray(options.interceptors.Agent) ? options.interceptors.Agent : [createRedirectInterceptor({ maxRedirections })]; - this[kOptions] = { ...util2.deepClone(options), connect: connect2 }; - this[kOptions].interceptors = options.interceptors ? { ...options.interceptors } : void 0; - this[kMaxRedirections] = maxRedirections; - this[kFactory] = factory; - this[kClients] = /* @__PURE__ */ new Map(); - this[kFinalizer] = new FinalizationRegistry( - /* istanbul ignore next: gc is undeterministic */ - (key) => { - const ref = this[kClients].get(key); - if (ref !== void 0 && ref.deref() === void 0) { - this[kClients].delete(key); + this.retryOpts.retry( + err, + { + state: { counter: this.retryCount }, + opts: { retryOptions: this.retryOpts, ...this.opts } + }, + onRetry.bind(this) + ); + function onRetry(err2) { + if (err2 != null || this.aborted || isDisturbed(this.opts.body)) { + return this.handler.onError(err2); + } + if (this.start !== 0) { + const headers2 = { range: `bytes=${this.start}-${this.end ?? ""}` }; + if (this.etag != null) { + headers2["if-match"] = this.etag; } + this.opts = { + ...this.opts, + headers: { + ...this.opts.headers, + ...headers2 + } + }; } - ); - const agent2 = this; - this[kOnDrain] = (origin, targets) => { - agent2.emit("drain", origin, [agent2, ...targets]); - }; - this[kOnConnect] = (origin, targets) => { - agent2.emit("connect", origin, [agent2, ...targets]); - }; - this[kOnDisconnect] = (origin, targets, err) => { - agent2.emit("disconnect", origin, [agent2, ...targets], err); - }; - this[kOnConnectionError] = (origin, targets, err) => { - agent2.emit("connectionError", origin, [agent2, ...targets], err); - }; - } - get [kRunning]() { - let ret = 0; - for (const ref of this[kClients].values()) { - const client2 = ref.deref(); - if (client2) { - ret += client2[kRunning]; + try { + this.retryCountCheckpoint = this.retryCount; + this.dispatch(this.opts, this); + } catch (err3) { + this.handler.onError(err3); } } - return ret; } - [kDispatch](opts, handler2) { - let key; - if (opts.origin && (typeof opts.origin === "string" || opts.origin instanceof URL)) { - key = String(opts.origin); - } else { - throw new InvalidArgumentError("opts.origin must be a non-empty string or URL."); - } - const ref = this[kClients].get(key); - let dispatcher2 = ref ? ref.deref() : null; - if (!dispatcher2) { - dispatcher2 = this[kFactory](opts.origin, this[kOptions]).on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", this[kOnDisconnect]).on("connectionError", this[kOnConnectionError]); - this[kClients].set(key, new WeakRef2(dispatcher2)); - this[kFinalizer].register(dispatcher2, key); - } - return dispatcher2.dispatch(opts, handler2); + } + retryHandler = RetryHandler; + return retryHandler; +} +var retryAgent; +var hasRequiredRetryAgent; +function requireRetryAgent() { + if (hasRequiredRetryAgent) return retryAgent; + hasRequiredRetryAgent = 1; + const Dispatcher = requireDispatcher$1(); + const RetryHandler = requireRetryHandler$1(); + class RetryAgent extends Dispatcher { + #agent = null; + #options = null; + constructor(agent2, options = {}) { + super(options); + this.#agent = agent2; + this.#options = options; } - async [kClose]() { - const closePromises = []; - for (const ref of this[kClients].values()) { - const client2 = ref.deref(); - if (client2) { - closePromises.push(client2.close()); - } - } - await Promise.all(closePromises); + dispatch(opts, handler2) { + const retry2 = new RetryHandler({ + ...opts, + retryOptions: this.#options + }, { + dispatch: this.#agent.dispatch.bind(this.#agent), + handler: handler2 + }); + return this.#agent.dispatch(opts, retry2); } - async [kDestroy](err) { - const destroyPromises = []; - for (const ref of this[kClients].values()) { - const client2 = ref.deref(); - if (client2) { - destroyPromises.push(client2.destroy(err)); - } - } - await Promise.all(destroyPromises); + close() { + return this.#agent.close(); + } + destroy() { + return this.#agent.destroy(); } } - agent = Agent; - return agent; + retryAgent = RetryAgent; + return retryAgent; } -var api = {}; -var apiRequest = { exports: {} }; -var readable; -var hasRequiredReadable; -function requireReadable() { - if (hasRequiredReadable) return readable; - hasRequiredReadable = 1; - const assert = require$$0$3; - const { Readable } = require$$0$5; - const { RequestAbortedError, NotSupportedError, InvalidArgumentError } = requireErrors(); - const util2 = requireUtil$6(); - const { ReadableStreamFrom, toUSVString } = requireUtil$6(); - let Blob2; +var api$1 = {}; +var apiRequest$1 = { exports: {} }; +var readable$1; +var hasRequiredReadable$1; +function requireReadable$1() { + if (hasRequiredReadable$1) return readable$1; + hasRequiredReadable$1 = 1; + const assert = require$$0$5; + const { Readable } = require$$0$6; + const { RequestAbortedError, NotSupportedError, InvalidArgumentError, AbortError } = requireErrors$1(); + const util2 = requireUtil$e(); + const { ReadableStreamFrom } = requireUtil$e(); const kConsume = /* @__PURE__ */ Symbol("kConsume"); const kReading = /* @__PURE__ */ Symbol("kReading"); const kBody = /* @__PURE__ */ Symbol("kBody"); - const kAbort = /* @__PURE__ */ Symbol("abort"); + const kAbort = /* @__PURE__ */ Symbol("kAbort"); const kContentType = /* @__PURE__ */ Symbol("kContentType"); + const kContentLength = /* @__PURE__ */ Symbol("kContentLength"); const noop2 = () => { }; - readable = class BodyReadable extends Readable { + class BodyReadable extends Readable { constructor({ resume, abort, contentType = "", + contentLength, highWaterMark = 64 * 1024 // Same as nodejs fs streams. }) { @@ -9274,12 +9501,10 @@ function requireReadable() { this[kConsume] = null; this[kBody] = null; this[kContentType] = contentType; + this[kContentLength] = contentLength; this[kReading] = false; } destroy(err) { - if (this.destroyed) { - return this; - } if (!err && !this._readableState.endEmitted) { err = new RequestAbortedError(); } @@ -9288,13 +9513,14 @@ function requireReadable() { } return super.destroy(err); } - emit(ev, ...args) { - if (ev === "data") { - this._readableState.dataEmitted = true; - } else if (ev === "error") { - this._readableState.errorEmitted = true; + _destroy(err, callback) { + if (!this[kReading]) { + setImmediate(() => { + callback(err); + }); + } else { + callback(err); } - return super.emit(ev, ...args); } on(ev, ...args) { if (ev === "data" || ev === "readable") { @@ -9316,7 +9542,7 @@ function requireReadable() { return this.off(ev, ...args); } push(chunk) { - if (this[kConsume] && chunk !== null && this.readableLength === 0) { + if (this[kConsume] && chunk !== null) { consumePush(this[kConsume], chunk); return this[kReading] ? super.push(chunk) : true; } @@ -9334,6 +9560,10 @@ function requireReadable() { async blob() { return consume(this, "blob"); } + // https://fetch.spec.whatwg.org/#dom-body-bytes + async bytes() { + return consume(this, "bytes"); + } // https://fetch.spec.whatwg.org/#dom-body-arraybuffer async arrayBuffer() { return consume(this, "arrayBuffer"); @@ -9357,30 +9587,28 @@ function requireReadable() { } return this[kBody]; } - dump(opts) { - let limit = opts && Number.isFinite(opts.limit) ? opts.limit : 262144; - const signal = opts && opts.signal; - if (signal) { - try { - if (typeof signal !== "object" || !("aborted" in signal)) { - throw new InvalidArgumentError("signal must be an AbortSignal"); - } - util2.throwIfAborted(signal); - } catch (err) { - return Promise.reject(err); - } + async dump(opts) { + let limit = Number.isFinite(opts?.limit) ? opts.limit : 128 * 1024; + const signal = opts?.signal; + if (signal != null && (typeof signal !== "object" || !("aborted" in signal))) { + throw new InvalidArgumentError("signal must be an AbortSignal"); } - if (this.closed) { - return Promise.resolve(null); + signal?.throwIfAborted(); + if (this._readableState.closeEmitted) { + return null; } - return new Promise((resolve, reject) => { - const signalListenerCleanup = signal ? util2.addAbortListener(signal, () => { - this.destroy(); - }) : noop2; + return await new Promise((resolve, reject) => { + if (this[kContentLength] > limit) { + this.destroy(new AbortError()); + } + const onAbort = () => { + this.destroy(signal.reason ?? new AbortError()); + }; + signal?.addEventListener("abort", onAbort); this.on("close", function() { - signalListenerCleanup(); - if (signal && signal.aborted) { - reject(signal.reason || Object.assign(new Error("The operation was aborted"), { name: "AbortError" })); + signal?.removeEventListener("abort", onAbort); + if (signal?.aborted) { + reject(signal.reason ?? new AbortError()); } else { resolve(null); } @@ -9392,7 +9620,7 @@ function requireReadable() { }).resume(); }); } - }; + } function isLocked(self2) { return self2[kBody] && self2[kBody].locked === true || self2[kConsume]; } @@ -9400,27 +9628,39 @@ function requireReadable() { return util2.isDisturbed(self2) || isLocked(self2); } async function consume(stream, type) { - if (isUnusable(stream)) { - throw new TypeError("unusable"); - } assert(!stream[kConsume]); return new Promise((resolve, reject) => { - stream[kConsume] = { - type, - stream, - resolve, - reject, - length: 0, - body: [] - }; - stream.on("error", function(err) { - consumeFinish(this[kConsume], err); - }).on("close", function() { - if (this[kConsume].body !== null) { - consumeFinish(this[kConsume], new RequestAbortedError()); + if (isUnusable(stream)) { + const rState = stream._readableState; + if (rState.destroyed && rState.closeEmitted === false) { + stream.on("error", (err) => { + reject(err); + }).on("close", () => { + reject(new TypeError("unusable")); + }); + } else { + reject(rState.errored ?? new TypeError("unusable")); } - }); - process.nextTick(consumeStart, stream[kConsume]); + } else { + queueMicrotask(() => { + stream[kConsume] = { + type, + stream, + resolve, + reject, + length: 0, + body: [] + }; + stream.on("error", function(err) { + consumeFinish(this[kConsume], err); + }).on("close", function() { + if (this[kConsume].body !== null) { + consumeFinish(this[kConsume], new RequestAbortedError()); + } + }); + consumeStart(stream[kConsume]); + }); + } }); } function consumeStart(consume2) { @@ -9428,8 +9668,16 @@ function requireReadable() { return; } const { _readableState: state } = consume2.stream; - for (const chunk of state.buffer) { - consumePush(consume2, chunk); + if (state.bufferIndex) { + const start = state.bufferIndex; + const end = state.buffer.length; + for (let n = start; n < end; n++) { + consumePush(consume2, state.buffer[n]); + } + } else { + for (const chunk of state.buffer) { + consumePush(consume2, chunk); + } } if (state.endEmitted) { consumeEnd(this[kConsume]); @@ -9442,26 +9690,44 @@ function requireReadable() { while (consume2.stream.read() != null) { } } + function chunksDecode(chunks, length) { + if (chunks.length === 0 || length === 0) { + return ""; + } + const buffer = chunks.length === 1 ? chunks[0] : Buffer.concat(chunks, length); + const bufferLength = buffer.length; + const start = bufferLength > 2 && buffer[0] === 239 && buffer[1] === 187 && buffer[2] === 191 ? 3 : 0; + return buffer.utf8Slice(start, bufferLength); + } + function chunksConcat(chunks, length) { + if (chunks.length === 0 || length === 0) { + return new Uint8Array(0); + } + if (chunks.length === 1) { + return new Uint8Array(chunks[0]); + } + const buffer = new Uint8Array(Buffer.allocUnsafeSlow(length).buffer); + let offset = 0; + for (let i = 0; i < chunks.length; ++i) { + const chunk = chunks[i]; + buffer.set(chunk, offset); + offset += chunk.length; + } + return buffer; + } function consumeEnd(consume2) { const { type, body: body2, resolve, stream, length } = consume2; try { if (type === "text") { - resolve(toUSVString(Buffer.concat(body2))); + resolve(chunksDecode(body2, length)); } else if (type === "json") { - resolve(JSON.parse(Buffer.concat(body2))); + resolve(JSON.parse(chunksDecode(body2, length))); } else if (type === "arrayBuffer") { - const dst = new Uint8Array(length); - let pos = 0; - for (const buf of body2) { - dst.set(buf, pos); - pos += buf.byteLength; - } - resolve(dst.buffer); + resolve(chunksConcat(body2, length).buffer); } else if (type === "blob") { - if (!Blob2) { - Blob2 = require("buffer").Blob; - } - resolve(new Blob2(body2, { type: stream[kContentType] })); + resolve(new Blob(body2, { type: stream[kContentType] })); + } else if (type === "bytes") { + resolve(chunksConcat(body2, length)); } consumeFinish(consume2); } catch (err) { @@ -9488,115 +9754,81 @@ function requireReadable() { consume2.length = 0; consume2.body = null; } - return readable; + readable$1 = { Readable: BodyReadable, chunksDecode }; + return readable$1; } -var util$4; -var hasRequiredUtil$4; -function requireUtil$4() { - if (hasRequiredUtil$4) return util$4; - hasRequiredUtil$4 = 1; - const assert = require$$0$3; +var util$c; +var hasRequiredUtil$c; +function requireUtil$c() { + if (hasRequiredUtil$c) return util$c; + hasRequiredUtil$c = 1; + const assert = require$$0$5; const { ResponseStatusCodeError - } = requireErrors(); - const { toUSVString } = requireUtil$6(); + } = requireErrors$1(); + const { chunksDecode } = requireReadable$1(); + const CHUNK_LIMIT = 128 * 1024; async function getResolveErrorBodyCallback({ callback, body: body2, contentType, statusCode, statusMessage, headers: headers2 }) { assert(body2); let chunks = []; - let limit = 0; - for await (const chunk of body2) { - chunks.push(chunk); - limit += chunk.length; - if (limit > 128 * 1024) { - chunks = null; - break; + let length = 0; + try { + for await (const chunk of body2) { + chunks.push(chunk); + length += chunk.length; + if (length > CHUNK_LIMIT) { + chunks = []; + length = 0; + break; + } } + } catch { + chunks = []; + length = 0; } - if (statusCode === 204 || !contentType || !chunks) { - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers2)); + const message = `Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`; + if (statusCode === 204 || !contentType || !length) { + queueMicrotask(() => callback(new ResponseStatusCodeError(message, statusCode, headers2))); return; } + const stackTraceLimit = Error.stackTraceLimit; + Error.stackTraceLimit = 0; + let payload; try { - if (contentType.startsWith("application/json")) { - const payload = JSON.parse(toUSVString(Buffer.concat(chunks))); - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers2, payload)); - return; - } - if (contentType.startsWith("text/")) { - const payload = toUSVString(Buffer.concat(chunks)); - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers2, payload)); - return; + if (isContentTypeApplicationJson(contentType)) { + payload = JSON.parse(chunksDecode(chunks, length)); + } else if (isContentTypeText(contentType)) { + payload = chunksDecode(chunks, length); } - } catch (err) { - } - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers2)); - } - util$4 = { getResolveErrorBodyCallback }; - return util$4; -} -var abortSignal; -var hasRequiredAbortSignal; -function requireAbortSignal() { - if (hasRequiredAbortSignal) return abortSignal; - hasRequiredAbortSignal = 1; - const { addAbortListener } = requireUtil$6(); - const { RequestAbortedError } = requireErrors(); - const kListener = /* @__PURE__ */ Symbol("kListener"); - const kSignal = /* @__PURE__ */ Symbol("kSignal"); - function abort(self2) { - if (self2.abort) { - self2.abort(); - } else { - self2.onError(new RequestAbortedError()); - } - } - function addSignal(self2, signal) { - self2[kSignal] = null; - self2[kListener] = null; - if (!signal) { - return; - } - if (signal.aborted) { - abort(self2); - return; - } - self2[kSignal] = signal; - self2[kListener] = () => { - abort(self2); - }; - addAbortListener(self2[kSignal], self2[kListener]); - } - function removeSignal(self2) { - if (!self2[kSignal]) { - return; - } - if ("removeEventListener" in self2[kSignal]) { - self2[kSignal].removeEventListener("abort", self2[kListener]); - } else { - self2[kSignal].removeListener("abort", self2[kListener]); + } catch { + } finally { + Error.stackTraceLimit = stackTraceLimit; } - self2[kSignal] = null; - self2[kListener] = null; + queueMicrotask(() => callback(new ResponseStatusCodeError(message, statusCode, headers2, payload))); } - abortSignal = { - addSignal, - removeSignal + const isContentTypeApplicationJson = (contentType) => { + return contentType.length > 15 && contentType[11] === "/" && contentType[0] === "a" && contentType[1] === "p" && contentType[2] === "p" && contentType[3] === "l" && contentType[4] === "i" && contentType[5] === "c" && contentType[6] === "a" && contentType[7] === "t" && contentType[8] === "i" && contentType[9] === "o" && contentType[10] === "n" && contentType[12] === "j" && contentType[13] === "s" && contentType[14] === "o" && contentType[15] === "n"; }; - return abortSignal; + const isContentTypeText = (contentType) => { + return contentType.length > 4 && contentType[4] === "/" && contentType[0] === "t" && contentType[1] === "e" && contentType[2] === "x" && contentType[3] === "t"; + }; + util$c = { + getResolveErrorBodyCallback, + isContentTypeApplicationJson, + isContentTypeText + }; + return util$c; } -var hasRequiredApiRequest; -function requireApiRequest() { - if (hasRequiredApiRequest) return apiRequest.exports; - hasRequiredApiRequest = 1; - const Readable = requireReadable(); - const { - InvalidArgumentError, - RequestAbortedError - } = requireErrors(); - const util2 = requireUtil$6(); - const { getResolveErrorBodyCallback } = requireUtil$4(); - const { AsyncResource } = require$$4$2; - const { addSignal, removeSignal } = requireAbortSignal(); +var hasRequiredApiRequest$1; +function requireApiRequest$1() { + if (hasRequiredApiRequest$1) return apiRequest$1.exports; + hasRequiredApiRequest$1 = 1; + const assert = require$$0$5; + const { Readable } = requireReadable$1(); + const { InvalidArgumentError, RequestAbortedError } = requireErrors$1(); + const util2 = requireUtil$e(); + const { getResolveErrorBodyCallback } = requireUtil$c(); + const { AsyncResource } = require$$5$2; class RequestHandler extends AsyncResource { constructor(opts, callback) { if (!opts || typeof opts !== "object") { @@ -9626,6 +9858,7 @@ function requireApiRequest() { } throw err; } + this.method = method; this.responseHeaders = responseHeaders || null; this.opaque = opaque || null; this.callback = callback; @@ -9637,17 +9870,40 @@ function requireApiRequest() { this.onInfo = onInfo || null; this.throwOnError = throwOnError; this.highWaterMark = highWaterMark; + this.signal = signal; + this.reason = null; + this.removeAbortListener = null; if (util2.isStream(body2)) { body2.on("error", (err) => { this.onError(err); }); } - addSignal(this, signal); + if (this.signal) { + if (this.signal.aborted) { + this.reason = this.signal.reason ?? new RequestAbortedError(); + } else { + this.removeAbortListener = util2.addAbortListener(this.signal, () => { + this.reason = this.signal.reason ?? new RequestAbortedError(); + if (this.res) { + util2.destroy(this.res.on("error", util2.nop), this.reason); + } else if (this.abort) { + this.abort(this.reason); + } + if (this.removeAbortListener) { + this.res?.off("close", this.removeAbortListener); + this.removeAbortListener(); + this.removeAbortListener = null; + } + }); + } + } } onConnect(abort, context2) { - if (!this.callback) { - throw new RequestAbortedError(); + if (this.reason) { + abort(this.reason); + return; } + assert(this.callback); this.abort = abort; this.context = context2; } @@ -9662,15 +9918,25 @@ function requireApiRequest() { } const parsedHeaders = responseHeaders === "raw" ? util2.parseHeaders(rawHeaders) : headers2; const contentType = parsedHeaders["content-type"]; - const body2 = new Readable({ resume, abort, contentType, highWaterMark }); + const contentLength = parsedHeaders["content-length"]; + const res = new Readable({ + resume, + abort, + contentType, + contentLength: this.method !== "HEAD" && contentLength ? Number(contentLength) : null, + highWaterMark + }); + if (this.removeAbortListener) { + res.on("close", this.removeAbortListener); + } this.callback = null; - this.res = body2; + this.res = res; if (callback !== null) { if (this.throwOnError && statusCode >= 400) { this.runInAsyncScope( getResolveErrorBodyCallback, null, - { callback, body: body2, contentType, statusCode, statusMessage, headers: headers2 } + { callback, body: res, contentType, statusCode, statusMessage, headers: headers2 } ); } else { this.runInAsyncScope(callback, null, null, { @@ -9678,25 +9944,21 @@ function requireApiRequest() { headers: headers2, trailers: this.trailers, opaque, - body: body2, + body: res, context: context2 }); } } } onData(chunk) { - const { res } = this; - return res.push(chunk); + return this.res.push(chunk); } onComplete(trailers) { - const { res } = this; - removeSignal(this); util2.parseHeaders(trailers, this.trailers); - res.push(null); + this.res.push(null); } onError(err) { const { res, callback, body: body2, opaque } = this; - removeSignal(this); if (callback) { this.callback = null; queueMicrotask(() => { @@ -9713,6 +9975,11 @@ function requireApiRequest() { this.body = null; util2.destroy(body2, err); } + if (this.removeAbortListener) { + res?.off("close", this.removeAbortListener); + this.removeAbortListener(); + this.removeAbortListener = null; + } } } function request2(opts, callback) { @@ -9723,35 +9990,84 @@ function requireApiRequest() { }); }); } - try { - this.dispatch(opts, new RequestHandler(opts, callback)); - } catch (err) { - if (typeof callback !== "function") { - throw err; - } - const opaque = opts && opts.opaque; - queueMicrotask(() => callback(err, { opaque })); + try { + this.dispatch(opts, new RequestHandler(opts, callback)); + } catch (err) { + if (typeof callback !== "function") { + throw err; + } + const opaque = opts?.opaque; + queueMicrotask(() => callback(err, { opaque })); + } + } + apiRequest$1.exports = request2; + apiRequest$1.exports.RequestHandler = RequestHandler; + return apiRequest$1.exports; +} +var abortSignal$1; +var hasRequiredAbortSignal$1; +function requireAbortSignal$1() { + if (hasRequiredAbortSignal$1) return abortSignal$1; + hasRequiredAbortSignal$1 = 1; + const { addAbortListener } = requireUtil$e(); + const { RequestAbortedError } = requireErrors$1(); + const kListener = /* @__PURE__ */ Symbol("kListener"); + const kSignal = /* @__PURE__ */ Symbol("kSignal"); + function abort(self2) { + if (self2.abort) { + self2.abort(self2[kSignal]?.reason); + } else { + self2.reason = self2[kSignal]?.reason ?? new RequestAbortedError(); + } + removeSignal(self2); + } + function addSignal(self2, signal) { + self2.reason = null; + self2[kSignal] = null; + self2[kListener] = null; + if (!signal) { + return; + } + if (signal.aborted) { + abort(self2); + return; + } + self2[kSignal] = signal; + self2[kListener] = () => { + abort(self2); + }; + addAbortListener(self2[kSignal], self2[kListener]); + } + function removeSignal(self2) { + if (!self2[kSignal]) { + return; + } + if ("removeEventListener" in self2[kSignal]) { + self2[kSignal].removeEventListener("abort", self2[kListener]); + } else { + self2[kSignal].removeListener("abort", self2[kListener]); } + self2[kSignal] = null; + self2[kListener] = null; } - apiRequest.exports = request2; - apiRequest.exports.RequestHandler = RequestHandler; - return apiRequest.exports; + abortSignal$1 = { + addSignal, + removeSignal + }; + return abortSignal$1; } -var apiStream; -var hasRequiredApiStream; -function requireApiStream() { - if (hasRequiredApiStream) return apiStream; - hasRequiredApiStream = 1; - const { finished, PassThrough } = require$$0$5; - const { - InvalidArgumentError, - InvalidReturnValueError, - RequestAbortedError - } = requireErrors(); - const util2 = requireUtil$6(); - const { getResolveErrorBodyCallback } = requireUtil$4(); - const { AsyncResource } = require$$4$2; - const { addSignal, removeSignal } = requireAbortSignal(); +var apiStream$1; +var hasRequiredApiStream$1; +function requireApiStream$1() { + if (hasRequiredApiStream$1) return apiStream$1; + hasRequiredApiStream$1 = 1; + const assert = require$$0$5; + const { finished, PassThrough } = require$$0$6; + const { InvalidArgumentError, InvalidReturnValueError } = requireErrors$1(); + const util2 = requireUtil$e(); + const { getResolveErrorBodyCallback } = requireUtil$c(); + const { AsyncResource } = require$$5$2; + const { addSignal, removeSignal } = requireAbortSignal$1(); class StreamHandler extends AsyncResource { constructor(opts, factory, callback) { if (!opts || typeof opts !== "object") { @@ -9800,9 +10116,11 @@ function requireApiStream() { addSignal(this, signal); } onConnect(abort, context2) { - if (!this.callback) { - throw new RequestAbortedError(); + if (this.reason) { + abort(this.reason); + return; } + assert(this.callback); this.abort = abort; this.context = context2; } @@ -9855,7 +10173,7 @@ function requireApiStream() { } res.on("drain", resume); this.res = res; - const needDrain = res.writableNeedDrain !== void 0 ? res.writableNeedDrain : res._writableState && res._writableState.needDrain; + const needDrain = res.writableNeedDrain !== void 0 ? res.writableNeedDrain : res._writableState?.needDrain; return needDrain !== true; } onData(chunk) { @@ -9904,32 +10222,32 @@ function requireApiStream() { if (typeof callback !== "function") { throw err; } - const opaque = opts && opts.opaque; + const opaque = opts?.opaque; queueMicrotask(() => callback(err, { opaque })); } } - apiStream = stream; - return apiStream; + apiStream$1 = stream; + return apiStream$1; } -var apiPipeline; -var hasRequiredApiPipeline; -function requireApiPipeline() { - if (hasRequiredApiPipeline) return apiPipeline; - hasRequiredApiPipeline = 1; +var apiPipeline$1; +var hasRequiredApiPipeline$1; +function requireApiPipeline$1() { + if (hasRequiredApiPipeline$1) return apiPipeline$1; + hasRequiredApiPipeline$1 = 1; const { Readable, Duplex, PassThrough - } = require$$0$5; + } = require$$0$6; const { InvalidArgumentError, InvalidReturnValueError, RequestAbortedError - } = requireErrors(); - const util2 = requireUtil$6(); - const { AsyncResource } = require$$4$2; - const { addSignal, removeSignal } = requireAbortSignal(); - const assert = require$$0$3; + } = requireErrors$1(); + const util2 = requireUtil$e(); + const { AsyncResource } = require$$5$2; + const { addSignal, removeSignal } = requireAbortSignal$1(); + const assert = require$$0$5; const kResume = /* @__PURE__ */ Symbol("resume"); class PipelineRequest extends Readable { constructor() { @@ -9994,7 +10312,7 @@ function requireApiPipeline() { autoDestroy: true, read: () => { const { body: body2 } = this; - if (body2 && body2.resume) { + if (body2?.resume) { body2.resume(); } }, @@ -10029,10 +10347,12 @@ function requireApiPipeline() { } onConnect(abort, context2) { const { ret, res } = this; - assert(!res, "pipeline cannot be retried"); - if (ret.destroyed) { - throw new RequestAbortedError(); + if (this.reason) { + abort(this.reason); + return; } + assert(!res, "pipeline cannot be retried"); + assert(!ret.destroyed); this.abort = abort; this.context = context2; } @@ -10106,19 +10426,19 @@ function requireApiPipeline() { return new PassThrough().destroy(err); } } - apiPipeline = pipeline; - return apiPipeline; + apiPipeline$1 = pipeline; + return apiPipeline$1; } -var apiUpgrade; -var hasRequiredApiUpgrade; -function requireApiUpgrade() { - if (hasRequiredApiUpgrade) return apiUpgrade; - hasRequiredApiUpgrade = 1; - const { InvalidArgumentError, RequestAbortedError, SocketError } = requireErrors(); - const { AsyncResource } = require$$4$2; - const util2 = requireUtil$6(); - const { addSignal, removeSignal } = requireAbortSignal(); - const assert = require$$0$3; +var apiUpgrade$1; +var hasRequiredApiUpgrade$1; +function requireApiUpgrade$1() { + if (hasRequiredApiUpgrade$1) return apiUpgrade$1; + hasRequiredApiUpgrade$1 = 1; + const { InvalidArgumentError, SocketError } = requireErrors$1(); + const { AsyncResource } = require$$5$2; + const util2 = requireUtil$e(); + const { addSignal, removeSignal } = requireAbortSignal$1(); + const assert = require$$0$5; class UpgradeHandler extends AsyncResource { constructor(opts, callback) { if (!opts || typeof opts !== "object") { @@ -10140,9 +10460,11 @@ function requireApiUpgrade() { addSignal(this, signal); } onConnect(abort, context2) { - if (!this.callback) { - throw new RequestAbortedError(); + if (this.reason) { + abort(this.reason); + return; } + assert(this.callback); this.abort = abort; this.context = null; } @@ -10150,8 +10472,8 @@ function requireApiUpgrade() { throw new SocketError("bad upgrade", null); } onUpgrade(statusCode, rawHeaders, socket) { + assert(statusCode === 101); const { callback, opaque, context: context2 } = this; - assert.strictEqual(statusCode, 101); removeSignal(this); this.callback = null; const headers2 = this.responseHeaders === "raw" ? util2.parseRawHeaders(rawHeaders) : util2.parseHeaders(rawHeaders); @@ -10192,22 +10514,23 @@ function requireApiUpgrade() { if (typeof callback !== "function") { throw err; } - const opaque = opts && opts.opaque; + const opaque = opts?.opaque; queueMicrotask(() => callback(err, { opaque })); } } - apiUpgrade = upgrade; - return apiUpgrade; + apiUpgrade$1 = upgrade; + return apiUpgrade$1; } -var apiConnect; -var hasRequiredApiConnect; -function requireApiConnect() { - if (hasRequiredApiConnect) return apiConnect; - hasRequiredApiConnect = 1; - const { AsyncResource } = require$$4$2; - const { InvalidArgumentError, RequestAbortedError, SocketError } = requireErrors(); - const util2 = requireUtil$6(); - const { addSignal, removeSignal } = requireAbortSignal(); +var apiConnect$1; +var hasRequiredApiConnect$1; +function requireApiConnect$1() { + if (hasRequiredApiConnect$1) return apiConnect$1; + hasRequiredApiConnect$1 = 1; + const assert = require$$0$5; + const { AsyncResource } = require$$5$2; + const { InvalidArgumentError, SocketError } = requireErrors$1(); + const util2 = requireUtil$e(); + const { addSignal, removeSignal } = requireAbortSignal$1(); class ConnectHandler extends AsyncResource { constructor(opts, callback) { if (!opts || typeof opts !== "object") { @@ -10228,9 +10551,11 @@ function requireApiConnect() { addSignal(this, signal); } onConnect(abort, context2) { - if (!this.callback) { - throw new RequestAbortedError(); + if (this.reason) { + abort(this.reason); + return; } + assert(this.callback); this.abort = abort; this.context = context2; } @@ -10279,30 +10604,31 @@ function requireApiConnect() { if (typeof callback !== "function") { throw err; } - const opaque = opts && opts.opaque; + const opaque = opts?.opaque; queueMicrotask(() => callback(err, { opaque })); } } - apiConnect = connect2; - return apiConnect; + apiConnect$1 = connect2; + return apiConnect$1; } -var hasRequiredApi; -function requireApi() { - if (hasRequiredApi) return api; - hasRequiredApi = 1; - api.request = requireApiRequest(); - api.stream = requireApiStream(); - api.pipeline = requireApiPipeline(); - api.upgrade = requireApiUpgrade(); - api.connect = requireApiConnect(); - return api; +var hasRequiredApi$1; +function requireApi$1() { + if (hasRequiredApi$1) return api$1; + hasRequiredApi$1 = 1; + api$1.request = requireApiRequest$1(); + api$1.stream = requireApiStream$1(); + api$1.pipeline = requireApiPipeline$1(); + api$1.upgrade = requireApiUpgrade$1(); + api$1.connect = requireApiConnect$1(); + return api$1; } -var mockErrors; -var hasRequiredMockErrors; -function requireMockErrors() { - if (hasRequiredMockErrors) return mockErrors; - hasRequiredMockErrors = 1; - const { UndiciError } = requireErrors(); +var mockErrors$1; +var hasRequiredMockErrors$1; +function requireMockErrors$1() { + if (hasRequiredMockErrors$1) return mockErrors$1; + hasRequiredMockErrors$1 = 1; + const { UndiciError } = requireErrors$1(); + const kMockNotMatchedError = /* @__PURE__ */ Symbol.for("undici.error.UND_MOCK_ERR_MOCK_NOT_MATCHED"); class MockNotMatchedError extends UndiciError { constructor(message) { super(message); @@ -10311,18 +10637,22 @@ function requireMockErrors() { this.message = message || "The request does not match any registered mock dispatches"; this.code = "UND_MOCK_ERR_MOCK_NOT_MATCHED"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kMockNotMatchedError] === true; + } + [kMockNotMatchedError] = true; } - mockErrors = { + mockErrors$1 = { MockNotMatchedError }; - return mockErrors; + return mockErrors$1; } -var mockSymbols; -var hasRequiredMockSymbols; -function requireMockSymbols() { - if (hasRequiredMockSymbols) return mockSymbols; - hasRequiredMockSymbols = 1; - mockSymbols = { +var mockSymbols$1; +var hasRequiredMockSymbols$1; +function requireMockSymbols$1() { + if (hasRequiredMockSymbols$1) return mockSymbols$1; + hasRequiredMockSymbols$1 = 1; + mockSymbols$1 = { kAgent: /* @__PURE__ */ Symbol("agent"), kOptions: /* @__PURE__ */ Symbol("options"), kFactory: /* @__PURE__ */ Symbol("factory"), @@ -10343,28 +10673,28 @@ function requireMockSymbols() { kGetNetConnect: /* @__PURE__ */ Symbol("get net connect"), kConnected: /* @__PURE__ */ Symbol("connected") }; - return mockSymbols; + return mockSymbols$1; } -var mockUtils; -var hasRequiredMockUtils; -function requireMockUtils() { - if (hasRequiredMockUtils) return mockUtils; - hasRequiredMockUtils = 1; - const { MockNotMatchedError } = requireMockErrors(); +var mockUtils$1; +var hasRequiredMockUtils$1; +function requireMockUtils$1() { + if (hasRequiredMockUtils$1) return mockUtils$1; + hasRequiredMockUtils$1 = 1; + const { MockNotMatchedError } = requireMockErrors$1(); const { kDispatches, kMockAgent, kOriginalDispatch, kOrigin, kGetNetConnect - } = requireMockSymbols(); - const { buildURL, nop } = requireUtil$6(); - const { STATUS_CODES } = require$$2$1; + } = requireMockSymbols$1(); + const { buildURL } = requireUtil$e(); + const { STATUS_CODES } = require$$2$2; const { types: { isPromise } - } = require$$0$2; + } = require$$1$2; function matchValue(match, value) { if (typeof match === "string") { return match === value; @@ -10449,6 +10779,10 @@ function requireMockUtils() { function getResponseData2(data) { if (Buffer.isBuffer(data)) { return data; + } else if (data instanceof Uint8Array) { + return data; + } else if (data instanceof ArrayBuffer) { + return data; } else if (typeof data === "object") { return JSON.stringify(data); } else { @@ -10464,15 +10798,16 @@ function requireMockUtils() { } matchedMockDispatches = matchedMockDispatches.filter(({ method }) => matchValue(method, key.method)); if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}'`); + throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}' on path '${resolvedPath}'`); } matchedMockDispatches = matchedMockDispatches.filter(({ body: body2 }) => typeof body2 !== "undefined" ? matchValue(body2, key.body) : true); if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}'`); + throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}' on path '${resolvedPath}'`); } matchedMockDispatches = matchedMockDispatches.filter((mockDispatch2) => matchHeaders(mockDispatch2, key.headers)); if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for headers '${typeof key.headers === "object" ? JSON.stringify(key.headers) : key.headers}'`); + const headers2 = typeof key.headers === "object" ? JSON.stringify(key.headers) : key.headers; + throw new MockNotMatchedError(`Mock dispatch not matched for headers '${headers2}' on path '${resolvedPath}'`); } return matchedMockDispatches[0]; } @@ -10505,11 +10840,21 @@ function requireMockUtils() { }; } function generateKeyValues(data) { - return Object.entries(data).reduce((keyValuePairs, [key, value]) => [ - ...keyValuePairs, - Buffer.from(`${key}`), - Array.isArray(value) ? value.map((x) => Buffer.from(`${x}`)) : Buffer.from(`${value}`) - ], []); + const keys = Object.keys(data); + const result = []; + for (let i = 0; i < keys.length; ++i) { + const key = keys[i]; + const value = data[key]; + const name = Buffer.from(`${key}`); + if (Array.isArray(value)) { + for (let j = 0; j < value.length; ++j) { + result.push(name, Buffer.from(`${value[j]}`)); + } + } else { + result.push(name, Buffer.from(`${value}`)); + } + } + return result; } function getStatusText(statusCode) { return STATUS_CODES[statusCode] || "unknown"; @@ -10554,10 +10899,10 @@ function requireMockUtils() { const responseData = getResponseData2(body2); const responseHeaders = generateKeyValues(headers2); const responseTrailers = generateKeyValues(trailers); - handler2.abort = nop; - handler2.onHeaders(statusCode, responseHeaders, resume, getStatusText(statusCode)); - handler2.onData(Buffer.from(responseData)); - handler2.onComplete(responseTrailers); + handler2.onConnect?.((err) => handler2.onError(err), null); + handler2.onHeaders?.(statusCode, responseHeaders, resume, getStatusText(statusCode)); + handler2.onData?.(Buffer.from(responseData)); + handler2.onComplete?.(responseTrailers); deleteMockDispatch(mockDispatches, key); } function resume() { @@ -10607,7 +10952,7 @@ function requireMockUtils() { return mockOptions; } } - mockUtils = { + mockUtils$1 = { getResponseData: getResponseData2, getMockDispatch, addMockDispatch, @@ -10621,16 +10966,17 @@ function requireMockUtils() { buildMockDispatch, checkNetConnect, buildMockOptions, - getHeaderByName + getHeaderByName, + buildHeadersFromArray }; - return mockUtils; + return mockUtils$1; } -var mockInterceptor = {}; -var hasRequiredMockInterceptor; -function requireMockInterceptor() { - if (hasRequiredMockInterceptor) return mockInterceptor; - hasRequiredMockInterceptor = 1; - const { getResponseData: getResponseData2, buildKey, addMockDispatch } = requireMockUtils(); +var mockInterceptor$1 = {}; +var hasRequiredMockInterceptor$1; +function requireMockInterceptor$1() { + if (hasRequiredMockInterceptor$1) return mockInterceptor$1; + hasRequiredMockInterceptor$1 = 1; + const { getResponseData: getResponseData2, buildKey, addMockDispatch } = requireMockUtils$1(); const { kDispatches, kDispatchKey, @@ -10638,9 +10984,9 @@ function requireMockInterceptor() { kDefaultTrailers, kContentLength, kMockDispatch - } = requireMockSymbols(); - const { InvalidArgumentError } = requireErrors(); - const { buildURL } = requireUtil$6(); + } = requireMockSymbols$1(); + const { InvalidArgumentError } = requireErrors$1(); + const { buildURL } = requireUtil$e(); class MockScope { constructor(mockDispatch) { this[kMockDispatch] = mockDispatch; @@ -10701,46 +11047,47 @@ function requireMockInterceptor() { this[kDefaultTrailers] = {}; this[kContentLength] = false; } - createMockScopeDispatchData(statusCode, data, responseOptions = {}) { + createMockScopeDispatchData({ statusCode, data, responseOptions }) { const responseData = getResponseData2(data); const contentLength = this[kContentLength] ? { "content-length": responseData.length } : {}; const headers2 = { ...this[kDefaultHeaders], ...contentLength, ...responseOptions.headers }; const trailers = { ...this[kDefaultTrailers], ...responseOptions.trailers }; return { statusCode, data, headers: headers2, trailers }; } - validateReplyParameters(statusCode, data, responseOptions) { - if (typeof statusCode === "undefined") { + validateReplyParameters(replyParameters) { + if (typeof replyParameters.statusCode === "undefined") { throw new InvalidArgumentError("statusCode must be defined"); } - if (typeof data === "undefined") { - throw new InvalidArgumentError("data must be defined"); - } - if (typeof responseOptions !== "object") { + if (typeof replyParameters.responseOptions !== "object" || replyParameters.responseOptions === null) { throw new InvalidArgumentError("responseOptions must be an object"); } } /** * Mock an undici request with a defined reply. */ - reply(replyData) { - if (typeof replyData === "function") { + reply(replyOptionsCallbackOrStatusCode) { + if (typeof replyOptionsCallbackOrStatusCode === "function") { const wrappedDefaultsCallback = (opts) => { - const resolvedData = replyData(opts); - if (typeof resolvedData !== "object") { + const resolvedData = replyOptionsCallbackOrStatusCode(opts); + if (typeof resolvedData !== "object" || resolvedData === null) { throw new InvalidArgumentError("reply options callback must return an object"); } - const { statusCode: statusCode2, data: data2 = "", responseOptions: responseOptions2 = {} } = resolvedData; - this.validateReplyParameters(statusCode2, data2, responseOptions2); + const replyParameters2 = { data: "", responseOptions: {}, ...resolvedData }; + this.validateReplyParameters(replyParameters2); return { - ...this.createMockScopeDispatchData(statusCode2, data2, responseOptions2) + ...this.createMockScopeDispatchData(replyParameters2) }; }; const newMockDispatch2 = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback); return new MockScope(newMockDispatch2); } - const [statusCode, data = "", responseOptions = {}] = [...arguments]; - this.validateReplyParameters(statusCode, data, responseOptions); - const dispatchData = this.createMockScopeDispatchData(statusCode, data, responseOptions); + const replyParameters = { + statusCode: replyOptionsCallbackOrStatusCode, + data: arguments[1] === void 0 ? "" : arguments[1], + responseOptions: arguments[2] === void 0 ? {} : arguments[2] + }; + this.validateReplyParameters(replyParameters); + const dispatchData = this.createMockScopeDispatchData(replyParameters); const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], dispatchData); return new MockScope(newMockDispatch); } @@ -10782,18 +11129,18 @@ function requireMockInterceptor() { return this; } } - mockInterceptor.MockInterceptor = MockInterceptor; - mockInterceptor.MockScope = MockScope; - return mockInterceptor; + mockInterceptor$1.MockInterceptor = MockInterceptor; + mockInterceptor$1.MockScope = MockScope; + return mockInterceptor$1; } -var mockClient; -var hasRequiredMockClient; -function requireMockClient() { - if (hasRequiredMockClient) return mockClient; - hasRequiredMockClient = 1; - const { promisify } = require$$0$2; - const Client = requireClient(); - const { buildMockDispatch } = requireMockUtils(); +var mockClient$1; +var hasRequiredMockClient$1; +function requireMockClient$1() { + if (hasRequiredMockClient$1) return mockClient$1; + hasRequiredMockClient$1 = 1; + const { promisify } = require$$1$2; + const Client = requireClient$1(); + const { buildMockDispatch } = requireMockUtils$1(); const { kDispatches, kMockAgent, @@ -10802,10 +11149,10 @@ function requireMockClient() { kOrigin, kOriginalDispatch, kConnected - } = requireMockSymbols(); - const { MockInterceptor } = requireMockInterceptor(); - const Symbols = requireSymbols$4(); - const { InvalidArgumentError } = requireErrors(); + } = requireMockSymbols$1(); + const { MockInterceptor } = requireMockInterceptor$1(); + const Symbols = requireSymbols$9(); + const { InvalidArgumentError } = requireErrors$1(); class MockClient extends Client { constructor(origin, opts) { super(origin, opts); @@ -10836,17 +11183,17 @@ function requireMockClient() { this[kMockAgent][Symbols.kClients].delete(this[kOrigin]); } } - mockClient = MockClient; - return mockClient; + mockClient$1 = MockClient; + return mockClient$1; } -var mockPool; -var hasRequiredMockPool; -function requireMockPool() { - if (hasRequiredMockPool) return mockPool; - hasRequiredMockPool = 1; - const { promisify } = require$$0$2; - const Pool = requirePool(); - const { buildMockDispatch } = requireMockUtils(); +var mockPool$1; +var hasRequiredMockPool$1; +function requireMockPool$1() { + if (hasRequiredMockPool$1) return mockPool$1; + hasRequiredMockPool$1 = 1; + const { promisify } = require$$1$2; + const Pool = requirePool$1(); + const { buildMockDispatch } = requireMockUtils$1(); const { kDispatches, kMockAgent, @@ -10855,10 +11202,10 @@ function requireMockPool() { kOrigin, kOriginalDispatch, kConnected - } = requireMockSymbols(); - const { MockInterceptor } = requireMockInterceptor(); - const Symbols = requireSymbols$4(); - const { InvalidArgumentError } = requireErrors(); + } = requireMockSymbols$1(); + const { MockInterceptor } = requireMockInterceptor$1(); + const Symbols = requireSymbols$9(); + const { InvalidArgumentError } = requireErrors$1(); class MockPool extends Pool { constructor(origin, opts) { super(origin, opts); @@ -10889,14 +11236,14 @@ function requireMockPool() { this[kMockAgent][Symbols.kClients].delete(this[kOrigin]); } } - mockPool = MockPool; - return mockPool; + mockPool$1 = MockPool; + return mockPool$1; } -var pluralizer; -var hasRequiredPluralizer; -function requirePluralizer() { - if (hasRequiredPluralizer) return pluralizer; - hasRequiredPluralizer = 1; +var pluralizer$1; +var hasRequiredPluralizer$1; +function requirePluralizer$1() { + if (hasRequiredPluralizer$1) return pluralizer$1; + hasRequiredPluralizer$1 = 1; const singulars = { pronoun: "it", is: "is", @@ -10909,7 +11256,7 @@ function requirePluralizer() { was: "were", this: "these" }; - pluralizer = class Pluralizer { + pluralizer$1 = class Pluralizer { constructor(singular, plural) { this.singular = singular; this.plural = plural; @@ -10921,16 +11268,18 @@ function requirePluralizer() { return { ...keys, count, noun }; } }; - return pluralizer; + return pluralizer$1; } -var pendingInterceptorsFormatter; -var hasRequiredPendingInterceptorsFormatter; -function requirePendingInterceptorsFormatter() { - if (hasRequiredPendingInterceptorsFormatter) return pendingInterceptorsFormatter; - hasRequiredPendingInterceptorsFormatter = 1; - const { Transform } = require$$0$5; - const { Console } = require$$1$3; - pendingInterceptorsFormatter = class PendingInterceptorsFormatter { +var pendingInterceptorsFormatter$1; +var hasRequiredPendingInterceptorsFormatter$1; +function requirePendingInterceptorsFormatter$1() { + if (hasRequiredPendingInterceptorsFormatter$1) return pendingInterceptorsFormatter$1; + hasRequiredPendingInterceptorsFormatter$1 = 1; + const { Transform } = require$$0$6; + const { Console } = require$$1$6; + const PERSISTENT = process.versions.icu ? "✅" : "Y "; + const NOT_PERSISTENT = process.versions.icu ? "❌" : "N "; + pendingInterceptorsFormatter$1 = class PendingInterceptorsFormatter { constructor({ disableColors } = {}) { this.transform = new Transform({ transform(chunk, _enc, cb) { @@ -10951,7 +11300,7 @@ function requirePendingInterceptorsFormatter() { Origin: origin, Path: path, "Status code": statusCode, - Persistent: persist ? "✅" : "❌", + Persistent: persist ? PERSISTENT : NOT_PERSISTENT, Invocations: timesInvoked, Remaining: persist ? Infinity : times - timesInvoked }) @@ -10960,50 +11309,42 @@ function requirePendingInterceptorsFormatter() { return this.transform.read().toString(); } }; - return pendingInterceptorsFormatter; + return pendingInterceptorsFormatter$1; } -var mockAgent; -var hasRequiredMockAgent; -function requireMockAgent() { - if (hasRequiredMockAgent) return mockAgent; - hasRequiredMockAgent = 1; - const { kClients } = requireSymbols$4(); - const Agent = requireAgent(); +var mockAgent$1; +var hasRequiredMockAgent$1; +function requireMockAgent$1() { + if (hasRequiredMockAgent$1) return mockAgent$1; + hasRequiredMockAgent$1 = 1; + const { kClients } = requireSymbols$9(); + const Agent = requireAgent$1(); const { kAgent, - kMockAgentSet, - kMockAgentGet, - kDispatches, - kIsMockActive, - kNetConnect, - kGetNetConnect, - kOptions, - kFactory - } = requireMockSymbols(); - const MockClient = requireMockClient(); - const MockPool = requireMockPool(); - const { matchValue, buildMockOptions } = requireMockUtils(); - const { InvalidArgumentError, UndiciError } = requireErrors(); - const Dispatcher = requireDispatcher(); - const Pluralizer = requirePluralizer(); - const PendingInterceptorsFormatter = requirePendingInterceptorsFormatter(); - class FakeWeakRef { - constructor(value) { - this.value = value; - } - deref() { - return this.value; - } - } + kMockAgentSet, + kMockAgentGet, + kDispatches, + kIsMockActive, + kNetConnect, + kGetNetConnect, + kOptions, + kFactory + } = requireMockSymbols$1(); + const MockClient = requireMockClient$1(); + const MockPool = requireMockPool$1(); + const { matchValue, buildMockOptions } = requireMockUtils$1(); + const { InvalidArgumentError, UndiciError } = requireErrors$1(); + const Dispatcher = requireDispatcher$1(); + const Pluralizer = requirePluralizer$1(); + const PendingInterceptorsFormatter = requirePendingInterceptorsFormatter$1(); class MockAgent extends Dispatcher { constructor(opts) { super(opts); this[kNetConnect] = true; this[kIsMockActive] = true; - if (opts && opts.agent && typeof opts.agent.dispatch !== "function") { + if (opts?.agent && typeof opts.agent.dispatch !== "function") { throw new InvalidArgumentError("Argument opts.agent must implement Agent"); } - const agent2 = opts && opts.agent ? opts.agent : new Agent(opts); + const agent2 = opts?.agent ? opts.agent : new Agent(opts); this[kAgent] = agent2; this[kClients] = agent2[kClients]; this[kOptions] = buildMockOptions(opts); @@ -11052,24 +11393,23 @@ function requireMockAgent() { return this[kIsMockActive]; } [kMockAgentSet](origin, dispatcher2) { - this[kClients].set(origin, new FakeWeakRef(dispatcher2)); + this[kClients].set(origin, dispatcher2); } [kFactory](origin) { const mockOptions = Object.assign({ agent: this }, this[kOptions]); return this[kOptions] && this[kOptions].connections === 1 ? new MockClient(origin, mockOptions) : new MockPool(origin, mockOptions); } [kMockAgentGet](origin) { - const ref = this[kClients].get(origin); - if (ref) { - return ref.deref(); + const client2 = this[kClients].get(origin); + if (client2) { + return client2; } if (typeof origin !== "string") { const dispatcher2 = this[kFactory]("http://localhost:9999"); this[kMockAgentSet](origin, dispatcher2); return dispatcher2; } - for (const [keyMatcher, nonExplicitRef] of Array.from(this[kClients])) { - const nonExplicitDispatcher = nonExplicitRef.deref(); + for (const [keyMatcher, nonExplicitDispatcher] of Array.from(this[kClients])) { if (nonExplicitDispatcher && typeof keyMatcher !== "string" && matchValue(keyMatcher, origin)) { const dispatcher2 = this[kFactory](origin); this[kMockAgentSet](origin, dispatcher2); @@ -11083,7 +11423,7 @@ function requireMockAgent() { } pendingInterceptors() { const mockAgentClients = this[kClients]; - return Array.from(mockAgentClients.entries()).flatMap(([origin, scope]) => scope.deref()[kDispatches].map((dispatch) => ({ ...dispatch, origin }))).filter(({ pending }) => pending); + return Array.from(mockAgentClients.entries()).flatMap(([origin, scope]) => scope[kDispatches].map((dispatch) => ({ ...dispatch, origin }))).filter(({ pending }) => pending); } assertNoPendingInterceptors({ pendingInterceptorsFormatter: pendingInterceptorsFormatter2 = new PendingInterceptorsFormatter() } = {}) { const pending = this.pendingInterceptors(); @@ -11098,509 +11438,532 @@ ${pendingInterceptorsFormatter2.format(pending)} `.trim()); } } - mockAgent = MockAgent; - return mockAgent; + mockAgent$1 = MockAgent; + return mockAgent$1; } -var proxyAgent; -var hasRequiredProxyAgent; -function requireProxyAgent() { - if (hasRequiredProxyAgent) return proxyAgent; - hasRequiredProxyAgent = 1; - const { kProxy, kClose, kDestroy, kInterceptors } = requireSymbols$4(); - const { URL: URL2 } = require$$1$4; - const Agent = requireAgent(); - const Pool = requirePool(); - const DispatcherBase = requireDispatcherBase(); - const { InvalidArgumentError, RequestAbortedError } = requireErrors(); - const buildConnector = requireConnect(); - const kAgent = /* @__PURE__ */ Symbol("proxy agent"); - const kClient = /* @__PURE__ */ Symbol("proxy client"); - const kProxyHeaders = /* @__PURE__ */ Symbol("proxy headers"); - const kRequestTls = /* @__PURE__ */ Symbol("request tls settings"); - const kProxyTls = /* @__PURE__ */ Symbol("proxy tls settings"); - const kConnectEndpoint = /* @__PURE__ */ Symbol("connect endpoint function"); - function defaultProtocolPort(protocol) { - return protocol === "https:" ? 443 : 80; - } - function buildProxyOptions(opts) { - if (typeof opts === "string") { - opts = { uri: opts }; - } - if (!opts || !opts.uri) { - throw new InvalidArgumentError("Proxy opts.uri is mandatory"); - } - return { - uri: opts.uri, - protocol: opts.protocol || "https" - }; - } - function defaultFactory(origin, opts) { - return new Pool(origin, opts); - } - class ProxyAgent extends DispatcherBase { - constructor(opts) { - super(opts); - this[kProxy] = buildProxyOptions(opts); - this[kAgent] = new Agent(opts); - this[kInterceptors] = opts.interceptors && opts.interceptors.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent) ? opts.interceptors.ProxyAgent : []; - if (typeof opts === "string") { - opts = { uri: opts }; - } - if (!opts || !opts.uri) { - throw new InvalidArgumentError("Proxy opts.uri is mandatory"); - } - const { clientFactory = defaultFactory } = opts; - if (typeof clientFactory !== "function") { - throw new InvalidArgumentError("Proxy opts.clientFactory must be a function."); - } - this[kRequestTls] = opts.requestTls; - this[kProxyTls] = opts.proxyTls; - this[kProxyHeaders] = opts.headers || {}; - const resolvedUrl = new URL2(opts.uri); - const { origin, port, host, username, password } = resolvedUrl; - if (opts.auth && opts.token) { - throw new InvalidArgumentError("opts.auth cannot be used in combination with opts.token"); - } else if (opts.auth) { - this[kProxyHeaders]["proxy-authorization"] = `Basic ${opts.auth}`; - } else if (opts.token) { - this[kProxyHeaders]["proxy-authorization"] = opts.token; - } else if (username && password) { - this[kProxyHeaders]["proxy-authorization"] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString("base64")}`; - } - const connect2 = buildConnector({ ...opts.proxyTls }); - this[kConnectEndpoint] = buildConnector({ ...opts.requestTls }); - this[kClient] = clientFactory(resolvedUrl, { connect: connect2 }); - this[kAgent] = new Agent({ - ...opts, - connect: async (opts2, callback) => { - let requestedHost = opts2.host; - if (!opts2.port) { - requestedHost += `:${defaultProtocolPort(opts2.protocol)}`; - } - try { - const { socket, statusCode } = await this[kClient].connect({ - origin, - port, - path: requestedHost, - signal: opts2.signal, - headers: { - ...this[kProxyHeaders], - host - } - }); - if (statusCode !== 200) { - socket.on("error", () => { - }).destroy(); - callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`)); - } - if (opts2.protocol !== "https:") { - callback(null, socket); - return; - } - let servername; - if (this[kRequestTls]) { - servername = this[kRequestTls].servername; - } else { - servername = opts2.servername; - } - this[kConnectEndpoint]({ ...opts2, servername, httpSocket: socket }, callback); - } catch (err) { - callback(err); - } - } - }); - } - dispatch(opts, handler2) { - const { host } = new URL2(opts.origin); - const headers2 = buildHeaders(opts.headers); - throwIfProxyAuthIsSent(headers2); - return this[kAgent].dispatch( - { - ...opts, - headers: { - ...headers2, - host - } - }, - handler2 - ); - } - async [kClose]() { - await this[kAgent].close(); - await this[kClient].close(); - } - async [kDestroy]() { - await this[kAgent].destroy(); - await this[kClient].destroy(); - } - } - function buildHeaders(headers2) { - if (Array.isArray(headers2)) { - const headersPair = {}; - for (let i = 0; i < headers2.length; i += 2) { - headersPair[headers2[i]] = headers2[i + 1]; - } - return headersPair; - } - return headers2; +var global$3; +var hasRequiredGlobal$2; +function requireGlobal$2() { + if (hasRequiredGlobal$2) return global$3; + hasRequiredGlobal$2 = 1; + const globalDispatcher = /* @__PURE__ */ Symbol.for("undici.globalDispatcher.1"); + const { InvalidArgumentError } = requireErrors$1(); + const Agent = requireAgent$1(); + if (getGlobalDispatcher() === void 0) { + setGlobalDispatcher(new Agent()); } - function throwIfProxyAuthIsSent(headers2) { - const existProxyAuth = headers2 && Object.keys(headers2).find((key) => key.toLowerCase() === "proxy-authorization"); - if (existProxyAuth) { - throw new InvalidArgumentError("Proxy-Authorization should be sent in ProxyAgent constructor"); + function setGlobalDispatcher(agent2) { + if (!agent2 || typeof agent2.dispatch !== "function") { + throw new InvalidArgumentError("Argument agent must implement Agent"); } + Object.defineProperty(globalThis, globalDispatcher, { + value: agent2, + writable: true, + enumerable: false, + configurable: false + }); } - proxyAgent = ProxyAgent; - return proxyAgent; -} -var RetryHandler_1; -var hasRequiredRetryHandler; -function requireRetryHandler() { - if (hasRequiredRetryHandler) return RetryHandler_1; - hasRequiredRetryHandler = 1; - const assert = require$$0$3; - const { kRetryHandlerDefaultRetry } = requireSymbols$4(); - const { RequestRetryError } = requireErrors(); - const { isDisturbed, parseHeaders, parseRangeHeader } = requireUtil$6(); - function calculateRetryAfterHeader(retryAfter) { - const current = Date.now(); - const diff = new Date(retryAfter).getTime() - current; - return diff; + function getGlobalDispatcher() { + return globalThis[globalDispatcher]; } - class RetryHandler { - constructor(opts, handlers) { - const { retryOptions, ...dispatchOpts } = opts; - const { - // Retry scoped - retry: retryFn, - maxRetries, - maxTimeout, - minTimeout, - timeoutFactor, - // Response scoped - methods, - errorCodes, - retryAfter, - statusCodes - } = retryOptions ?? {}; - this.dispatch = handlers.dispatch; - this.handler = handlers.handler; - this.opts = dispatchOpts; - this.abort = null; - this.aborted = false; - this.retryOpts = { - retry: retryFn ?? RetryHandler[kRetryHandlerDefaultRetry], - retryAfter: retryAfter ?? true, - maxTimeout: maxTimeout ?? 30 * 1e3, - // 30s, - timeout: minTimeout ?? 500, - // .5s - timeoutFactor: timeoutFactor ?? 2, - maxRetries: maxRetries ?? 5, - // What errors we should retry - methods: methods ?? ["GET", "HEAD", "OPTIONS", "PUT", "DELETE", "TRACE"], - // Indicates which errors to retry - statusCodes: statusCodes ?? [500, 502, 503, 504, 429], - // List of errors to retry - errorCodes: errorCodes ?? [ - "ECONNRESET", - "ECONNREFUSED", - "ENOTFOUND", - "ENETDOWN", - "ENETUNREACH", - "EHOSTDOWN", - "EHOSTUNREACH", - "EPIPE" - ] - }; - this.retryCount = 0; - this.start = 0; - this.end = null; - this.etag = null; - this.resume = null; - this.handler.onConnect((reason) => { - this.aborted = true; - if (this.abort) { - this.abort(reason); - } else { - this.reason = reason; - } - }); - } - onRequestSent() { - if (this.handler.onRequestSent) { - this.handler.onRequestSent(); + global$3 = { + setGlobalDispatcher, + getGlobalDispatcher + }; + return global$3; +} +var decoratorHandler; +var hasRequiredDecoratorHandler$1; +function requireDecoratorHandler$1() { + if (hasRequiredDecoratorHandler$1) return decoratorHandler; + hasRequiredDecoratorHandler$1 = 1; + decoratorHandler = class DecoratorHandler { + #handler; + constructor(handler2) { + if (typeof handler2 !== "object" || handler2 === null) { + throw new TypeError("handler must be an object"); } + this.#handler = handler2; } - onUpgrade(statusCode, headers2, socket) { - if (this.handler.onUpgrade) { - this.handler.onUpgrade(statusCode, headers2, socket); - } + onConnect(...args) { + return this.#handler.onConnect?.(...args); + } + onError(...args) { + return this.#handler.onError?.(...args); + } + onUpgrade(...args) { + return this.#handler.onUpgrade?.(...args); + } + onResponseStarted(...args) { + return this.#handler.onResponseStarted?.(...args); + } + onHeaders(...args) { + return this.#handler.onHeaders?.(...args); + } + onData(...args) { + return this.#handler.onData?.(...args); + } + onComplete(...args) { + return this.#handler.onComplete?.(...args); + } + onBodySent(...args) { + return this.#handler.onBodySent?.(...args); + } + }; + return decoratorHandler; +} +var redirect; +var hasRequiredRedirect; +function requireRedirect() { + if (hasRequiredRedirect) return redirect; + hasRequiredRedirect = 1; + const RedirectHandler = requireRedirectHandler$1(); + redirect = (opts) => { + const globalMaxRedirections = opts?.maxRedirections; + return (dispatch) => { + return function redirectInterceptor2(opts2, handler2) { + const { maxRedirections = globalMaxRedirections, ...baseOpts } = opts2; + if (!maxRedirections) { + return dispatch(opts2, handler2); + } + const redirectHandler2 = new RedirectHandler( + dispatch, + maxRedirections, + opts2, + handler2 + ); + return dispatch(baseOpts, redirectHandler2); + }; + }; + }; + return redirect; +} +var retry; +var hasRequiredRetry; +function requireRetry() { + if (hasRequiredRetry) return retry; + hasRequiredRetry = 1; + const RetryHandler = requireRetryHandler$1(); + retry = (globalOpts) => { + return (dispatch) => { + return function retryInterceptor(opts, handler2) { + return dispatch( + opts, + new RetryHandler( + { ...opts, retryOptions: { ...globalOpts, ...opts.retryOptions } }, + { + handler: handler2, + dispatch + } + ) + ); + }; + }; + }; + return retry; +} +var dump; +var hasRequiredDump; +function requireDump() { + if (hasRequiredDump) return dump; + hasRequiredDump = 1; + const util2 = requireUtil$e(); + const { InvalidArgumentError, RequestAbortedError } = requireErrors$1(); + const DecoratorHandler = requireDecoratorHandler$1(); + class DumpHandler extends DecoratorHandler { + #maxSize = 1024 * 1024; + #abort = null; + #dumped = false; + #aborted = false; + #size = 0; + #reason = null; + #handler = null; + constructor({ maxSize }, handler2) { + super(handler2); + if (maxSize != null && (!Number.isFinite(maxSize) || maxSize < 1)) { + throw new InvalidArgumentError("maxSize must be a number greater than 0"); + } + this.#maxSize = maxSize ?? this.#maxSize; + this.#handler = handler2; } onConnect(abort) { - if (this.aborted) { - abort(this.reason); - } else { - this.abort = abort; - } + this.#abort = abort; + this.#handler.onConnect(this.#customAbort.bind(this)); } - onBodySent(chunk) { - if (this.handler.onBodySent) return this.handler.onBodySent(chunk); + #customAbort(reason) { + this.#aborted = true; + this.#reason = reason; } - static [kRetryHandlerDefaultRetry](err, { state, opts }, cb) { - const { statusCode, code, headers: headers2 } = err; - const { method, retryOptions } = opts; - const { - maxRetries, - timeout, - maxTimeout, - timeoutFactor, - statusCodes, - errorCodes, - methods - } = retryOptions; - let { counter, currentTimeout } = state; - currentTimeout = currentTimeout != null && currentTimeout > 0 ? currentTimeout : timeout; - if (code && code !== "UND_ERR_REQ_RETRY" && code !== "UND_ERR_SOCKET" && !errorCodes.includes(code)) { - cb(err); - return; + // TODO: will require adjustment after new hooks are out + onHeaders(statusCode, rawHeaders, resume, statusMessage) { + const headers2 = util2.parseHeaders(rawHeaders); + const contentLength = headers2["content-length"]; + if (contentLength != null && contentLength > this.#maxSize) { + throw new RequestAbortedError( + `Response size (${contentLength}) larger than maxSize (${this.#maxSize})` + ); } - if (Array.isArray(methods) && !methods.includes(method)) { - cb(err); - return; + if (this.#aborted) { + return true; } - if (statusCode != null && Array.isArray(statusCodes) && !statusCodes.includes(statusCode)) { - cb(err); + return this.#handler.onHeaders( + statusCode, + rawHeaders, + resume, + statusMessage + ); + } + onError(err) { + if (this.#dumped) { return; } - if (counter > maxRetries) { - cb(err); + err = this.#reason ?? err; + this.#handler.onError(err); + } + onData(chunk) { + this.#size = this.#size + chunk.length; + if (this.#size >= this.#maxSize) { + this.#dumped = true; + if (this.#aborted) { + this.#handler.onError(this.#reason); + } else { + this.#handler.onComplete([]); + } + } + return true; + } + onComplete(trailers) { + if (this.#dumped) { return; } - let retryAfterHeader = headers2 != null && headers2["retry-after"]; - if (retryAfterHeader) { - retryAfterHeader = Number(retryAfterHeader); - retryAfterHeader = isNaN(retryAfterHeader) ? calculateRetryAfterHeader(retryAfterHeader) : retryAfterHeader * 1e3; + if (this.#aborted) { + this.#handler.onError(this.reason); + return; } - const retryTimeout = retryAfterHeader > 0 ? Math.min(retryAfterHeader, maxTimeout) : Math.min(currentTimeout * timeoutFactor ** counter, maxTimeout); - state.currentTimeout = retryTimeout; - setTimeout(() => cb(null), retryTimeout); + this.#handler.onComplete(trailers); } - onHeaders(statusCode, rawHeaders, resume, statusMessage) { - const headers2 = parseHeaders(rawHeaders); - this.retryCount += 1; - if (statusCode >= 300) { - this.abort( - new RequestRetryError("Request failed", statusCode, { - headers: headers2, - count: this.retryCount - }) + } + function createDumpInterceptor({ maxSize: defaultMaxSize } = { + maxSize: 1024 * 1024 + }) { + return (dispatch) => { + return function Intercept(opts, handler2) { + const { dumpMaxSize = defaultMaxSize } = opts; + const dumpHandler = new DumpHandler( + { maxSize: dumpMaxSize }, + handler2 ); - return false; - } - if (this.resume != null) { - this.resume = null; - if (statusCode !== 206) { - return true; - } - const contentRange = parseRangeHeader(headers2["content-range"]); - if (!contentRange) { - this.abort( - new RequestRetryError("Content-Range mismatch", statusCode, { - headers: headers2, - count: this.retryCount - }) - ); - return false; - } - if (this.etag != null && this.etag !== headers2.etag) { - this.abort( - new RequestRetryError("ETag mismatch", statusCode, { - headers: headers2, - count: this.retryCount - }) - ); - return false; - } - const { start, size, end = size } = contentRange; - assert(this.start === start, "content-range mismatch"); - assert(this.end == null || this.end === end, "content-range mismatch"); - this.resume = resume; - return true; + return dispatch(opts, dumpHandler); + }; + }; + } + dump = createDumpInterceptor; + return dump; +} +var dns; +var hasRequiredDns; +function requireDns() { + if (hasRequiredDns) return dns; + hasRequiredDns = 1; + const { isIP } = require$$0$7; + const { lookup } = require$$1$7; + const DecoratorHandler = requireDecoratorHandler$1(); + const { InvalidArgumentError, InformationalError } = requireErrors$1(); + const maxInt = Math.pow(2, 31) - 1; + class DNSInstance { + #maxTTL = 0; + #maxItems = 0; + #records = /* @__PURE__ */ new Map(); + dualStack = true; + affinity = null; + lookup = null; + pick = null; + constructor(opts) { + this.#maxTTL = opts.maxTTL; + this.#maxItems = opts.maxItems; + this.dualStack = opts.dualStack; + this.affinity = opts.affinity; + this.lookup = opts.lookup ?? this.#defaultLookup; + this.pick = opts.pick ?? this.#defaultPick; + } + get full() { + return this.#records.size === this.#maxItems; + } + runLookup(origin, opts, cb) { + const ips = this.#records.get(origin.hostname); + if (ips == null && this.full) { + cb(null, origin.origin); + return; } - if (this.end == null) { - if (statusCode === 206) { - const range = parseRangeHeader(headers2["content-range"]); - if (range == null) { - return this.handler.onHeaders( - statusCode, - rawHeaders, - resume, - statusMessage - ); + const newOpts = { + affinity: this.affinity, + dualStack: this.dualStack, + lookup: this.lookup, + pick: this.pick, + ...opts.dns, + maxTTL: this.#maxTTL, + maxItems: this.#maxItems + }; + if (ips == null) { + this.lookup(origin, newOpts, (err, addresses) => { + if (err || addresses == null || addresses.length === 0) { + cb(err ?? new InformationalError("No DNS entries found")); + return; } - const { start, size, end = size } = range; - assert( - start != null && Number.isFinite(start) && this.start !== start, - "content-range mismatch" + this.setRecords(origin, addresses); + const records = this.#records.get(origin.hostname); + const ip = this.pick( + origin, + records, + newOpts.affinity ); - assert(Number.isFinite(start)); - assert( - end != null && Number.isFinite(end) && this.end !== end, - "invalid content-length" + let port; + if (typeof ip.port === "number") { + port = `:${ip.port}`; + } else if (origin.port !== "") { + port = `:${origin.port}`; + } else { + port = ""; + } + cb( + null, + `${origin.protocol}//${ip.family === 6 ? `[${ip.address}]` : ip.address}${port}` ); - this.start = start; - this.end = end; + }); + } else { + const ip = this.pick( + origin, + ips, + newOpts.affinity + ); + if (ip == null) { + this.#records.delete(origin.hostname); + this.runLookup(origin, opts, cb); + return; } - if (this.end == null) { - const contentLength = headers2["content-length"]; - this.end = contentLength != null ? Number(contentLength) : null; + let port; + if (typeof ip.port === "number") { + port = `:${ip.port}`; + } else if (origin.port !== "") { + port = `:${origin.port}`; + } else { + port = ""; } - assert(Number.isFinite(this.start)); - assert( - this.end == null || Number.isFinite(this.end), - "invalid content-length" - ); - this.resume = resume; - this.etag = headers2.etag != null ? headers2.etag : null; - return this.handler.onHeaders( - statusCode, - rawHeaders, - resume, - statusMessage + cb( + null, + `${origin.protocol}//${ip.family === 6 ? `[${ip.address}]` : ip.address}${port}` ); } - const err = new RequestRetryError("Request failed", statusCode, { - headers: headers2, - count: this.retryCount - }); - this.abort(err); - return false; - } - onData(chunk) { - this.start += chunk.length; - return this.handler.onData(chunk); - } - onComplete(rawTrailers) { - this.retryCount = 0; - return this.handler.onComplete(rawTrailers); } - onError(err) { - if (this.aborted || isDisturbed(this.opts.body)) { - return this.handler.onError(err); - } - this.retryOpts.retry( - err, + #defaultLookup(origin, opts, cb) { + lookup( + origin.hostname, { - state: { counter: this.retryCount++, currentTimeout: this.retryAfter }, - opts: { retryOptions: this.retryOpts, ...this.opts } + all: true, + family: this.dualStack === false ? this.affinity : 0, + order: "ipv4first" }, - onRetry.bind(this) - ); - function onRetry(err2) { - if (err2 != null || this.aborted || isDisturbed(this.opts.body)) { - return this.handler.onError(err2); - } - if (this.start !== 0) { - this.opts = { - ...this.opts, - headers: { - ...this.opts.headers, - range: `bytes=${this.start}-${this.end ?? ""}` - } - }; - } - try { - this.dispatch(this.opts, this); - } catch (err3) { - this.handler.onError(err3); + (err, addresses) => { + if (err) { + return cb(err); + } + const results = /* @__PURE__ */ new Map(); + for (const addr of addresses) { + results.set(`${addr.address}:${addr.family}`, addr); + } + cb(null, results.values()); } - } - } - } - RetryHandler_1 = RetryHandler; - return RetryHandler_1; -} -var global$1; -var hasRequiredGlobal; -function requireGlobal() { - if (hasRequiredGlobal) return global$1; - hasRequiredGlobal = 1; - const globalDispatcher = /* @__PURE__ */ Symbol.for("undici.globalDispatcher.1"); - const { InvalidArgumentError } = requireErrors(); - const Agent = requireAgent(); - if (getGlobalDispatcher() === void 0) { - setGlobalDispatcher(new Agent()); - } - function setGlobalDispatcher(agent2) { - if (!agent2 || typeof agent2.dispatch !== "function") { - throw new InvalidArgumentError("Argument agent must implement Agent"); + ); + } + #defaultPick(origin, hostnameRecords, affinity) { + let ip = null; + const { records, offset } = hostnameRecords; + let family; + if (this.dualStack) { + if (affinity == null) { + if (offset == null || offset === maxInt) { + hostnameRecords.offset = 0; + affinity = 4; + } else { + hostnameRecords.offset++; + affinity = (hostnameRecords.offset & 1) === 1 ? 6 : 4; + } + } + if (records[affinity] != null && records[affinity].ips.length > 0) { + family = records[affinity]; + } else { + family = records[affinity === 4 ? 6 : 4]; + } + } else { + family = records[affinity]; + } + if (family == null || family.ips.length === 0) { + return ip; + } + if (family.offset == null || family.offset === maxInt) { + family.offset = 0; + } else { + family.offset++; + } + const position = family.offset % family.ips.length; + ip = family.ips[position] ?? null; + if (ip == null) { + return ip; + } + if (Date.now() - ip.timestamp > ip.ttl) { + family.ips.splice(position, 1); + return this.pick(origin, hostnameRecords, affinity); + } + return ip; + } + setRecords(origin, addresses) { + const timestamp = Date.now(); + const records = { records: { 4: null, 6: null } }; + for (const record of addresses) { + record.timestamp = timestamp; + if (typeof record.ttl === "number") { + record.ttl = Math.min(record.ttl, this.#maxTTL); + } else { + record.ttl = this.#maxTTL; + } + const familyRecords = records.records[record.family] ?? { ips: [] }; + familyRecords.ips.push(record); + records.records[record.family] = familyRecords; + } + this.#records.set(origin.hostname, records); + } + getHandler(meta, opts) { + return new DNSDispatchHandler(this, meta, opts); } - Object.defineProperty(globalThis, globalDispatcher, { - value: agent2, - writable: true, - enumerable: false, - configurable: false - }); - } - function getGlobalDispatcher() { - return globalThis[globalDispatcher]; } - global$1 = { - setGlobalDispatcher, - getGlobalDispatcher - }; - return global$1; -} -var DecoratorHandler_1; -var hasRequiredDecoratorHandler; -function requireDecoratorHandler() { - if (hasRequiredDecoratorHandler) return DecoratorHandler_1; - hasRequiredDecoratorHandler = 1; - DecoratorHandler_1 = class DecoratorHandler { - constructor(handler2) { - this.handler = handler2; + class DNSDispatchHandler extends DecoratorHandler { + #state = null; + #opts = null; + #dispatch = null; + #handler = null; + #origin = null; + constructor(state, { origin, handler: handler2, dispatch }, opts) { + super(handler2); + this.#origin = origin; + this.#handler = handler2; + this.#opts = { ...opts }; + this.#state = state; + this.#dispatch = dispatch; } - onConnect(...args) { - return this.handler.onConnect(...args); + onError(err) { + switch (err.code) { + case "ETIMEDOUT": + case "ECONNREFUSED": { + if (this.#state.dualStack) { + this.#state.runLookup(this.#origin, this.#opts, (err2, newOrigin) => { + if (err2) { + return this.#handler.onError(err2); + } + const dispatchOpts = { + ...this.#opts, + origin: newOrigin + }; + this.#dispatch(dispatchOpts, this); + }); + return; + } + this.#handler.onError(err); + return; + } + case "ENOTFOUND": + this.#state.deleteRecord(this.#origin); + // eslint-disable-next-line no-fallthrough + default: + this.#handler.onError(err); + break; + } } - onError(...args) { - return this.handler.onError(...args); + } + dns = (interceptorOpts) => { + if (interceptorOpts?.maxTTL != null && (typeof interceptorOpts?.maxTTL !== "number" || interceptorOpts?.maxTTL < 0)) { + throw new InvalidArgumentError("Invalid maxTTL. Must be a positive number"); } - onUpgrade(...args) { - return this.handler.onUpgrade(...args); + if (interceptorOpts?.maxItems != null && (typeof interceptorOpts?.maxItems !== "number" || interceptorOpts?.maxItems < 1)) { + throw new InvalidArgumentError( + "Invalid maxItems. Must be a positive number and greater than zero" + ); } - onHeaders(...args) { - return this.handler.onHeaders(...args); + if (interceptorOpts?.affinity != null && interceptorOpts?.affinity !== 4 && interceptorOpts?.affinity !== 6) { + throw new InvalidArgumentError("Invalid affinity. Must be either 4 or 6"); } - onData(...args) { - return this.handler.onData(...args); + if (interceptorOpts?.dualStack != null && typeof interceptorOpts?.dualStack !== "boolean") { + throw new InvalidArgumentError("Invalid dualStack. Must be a boolean"); } - onComplete(...args) { - return this.handler.onComplete(...args); + if (interceptorOpts?.lookup != null && typeof interceptorOpts?.lookup !== "function") { + throw new InvalidArgumentError("Invalid lookup. Must be a function"); } - onBodySent(...args) { - return this.handler.onBodySent(...args); + if (interceptorOpts?.pick != null && typeof interceptorOpts?.pick !== "function") { + throw new InvalidArgumentError("Invalid pick. Must be a function"); } + const dualStack = interceptorOpts?.dualStack ?? true; + let affinity; + if (dualStack) { + affinity = interceptorOpts?.affinity ?? null; + } else { + affinity = interceptorOpts?.affinity ?? 4; + } + const opts = { + maxTTL: interceptorOpts?.maxTTL ?? 1e4, + // Expressed in ms + lookup: interceptorOpts?.lookup ?? null, + pick: interceptorOpts?.pick ?? null, + dualStack, + affinity, + maxItems: interceptorOpts?.maxItems ?? Infinity + }; + const instance = new DNSInstance(opts); + return (dispatch) => { + return function dnsInterceptor(origDispatchOpts, handler2) { + const origin = origDispatchOpts.origin.constructor === URL ? origDispatchOpts.origin : new URL(origDispatchOpts.origin); + if (isIP(origin.hostname) !== 0) { + return dispatch(origDispatchOpts, handler2); + } + instance.runLookup(origin, origDispatchOpts, (err, newOrigin) => { + if (err) { + return handler2.onError(err); + } + let dispatchOpts = null; + dispatchOpts = { + ...origDispatchOpts, + servername: origin.hostname, + // For SNI on TLS + origin: newOrigin, + headers: { + host: origin.hostname, + ...origDispatchOpts.headers + } + }; + dispatch( + dispatchOpts, + instance.getHandler({ origin, dispatch, handler: handler2 }, origDispatchOpts) + ); + }); + return true; + }; + }; }; - return DecoratorHandler_1; + return dns; } -var headers; -var hasRequiredHeaders; -function requireHeaders() { - if (hasRequiredHeaders) return headers; - hasRequiredHeaders = 1; - const { kHeadersList, kConstruct } = requireSymbols$4(); - const { kGuard } = requireSymbols$3(); - const { kEnumerableProperty } = requireUtil$6(); +var headers$1; +var hasRequiredHeaders$1; +function requireHeaders$1() { + if (hasRequiredHeaders$1) return headers$1; + hasRequiredHeaders$1 = 1; + const { kConstruct } = requireSymbols$9(); + const { kEnumerableProperty } = requireUtil$e(); const { - makeIterator, + iteratorMixin, isValidHeaderName, isValidHeaderValue - } = requireUtil$5(); - const util2 = require$$0$2; - const { webidl } = requireWebidl(); - const assert = require$$0$3; + } = requireUtil$d(); + const { webidl } = requireWebidl$1(); + const assert = require$$0$5; + const util2 = require$$1$2; const kHeadersMap = /* @__PURE__ */ Symbol("headers map"); const kHeadersSortedMap = /* @__PURE__ */ Symbol("headers map sorted"); function isHTTPWhiteSpaceCharCode(code) { @@ -11653,10 +12016,13 @@ function requireHeaders() { type: "header value" }); } - if (headers2[kGuard] === "immutable") { + if (getHeadersGuard(headers2) === "immutable") { throw new TypeError("immutable"); - } else if (headers2[kGuard] === "request-no-cors") ; - return headers2[kHeadersList].append(name, value); + } + return getHeadersList(headers2).append(name, value, false); + } + function compareHeaderName(a, b) { + return a[0] < b[0] ? -1 : 1; } class HeadersList { /** @type {[string, string][]|null} */ @@ -11671,20 +12037,28 @@ function requireHeaders() { this[kHeadersSortedMap] = null; } } - // https://fetch.spec.whatwg.org/#header-list-contains - contains(name) { - name = name.toLowerCase(); - return this[kHeadersMap].has(name); + /** + * @see https://fetch.spec.whatwg.org/#header-list-contains + * @param {string} name + * @param {boolean} isLowerCase + */ + contains(name, isLowerCase) { + return this[kHeadersMap].has(isLowerCase ? name : name.toLowerCase()); } clear() { this[kHeadersMap].clear(); this[kHeadersSortedMap] = null; this.cookies = null; } - // https://fetch.spec.whatwg.org/#concept-header-list-append - append(name, value) { + /** + * @see https://fetch.spec.whatwg.org/#concept-header-list-append + * @param {string} name + * @param {string} value + * @param {boolean} isLowerCase + */ + append(name, value, isLowerCase) { this[kHeadersSortedMap] = null; - const lowercaseName = name.toLowerCase(); + const lowercaseName = isLowerCase ? name : name.toLowerCase(); const exists = this[kHeadersMap].get(lowercaseName); if (exists) { const delimiter = lowercaseName === "cookie" ? "; " : ", "; @@ -11696,73 +12070,155 @@ function requireHeaders() { this[kHeadersMap].set(lowercaseName, { name, value }); } if (lowercaseName === "set-cookie") { - this.cookies ??= []; - this.cookies.push(value); + (this.cookies ??= []).push(value); } } - // https://fetch.spec.whatwg.org/#concept-header-list-set - set(name, value) { + /** + * @see https://fetch.spec.whatwg.org/#concept-header-list-set + * @param {string} name + * @param {string} value + * @param {boolean} isLowerCase + */ + set(name, value, isLowerCase) { this[kHeadersSortedMap] = null; - const lowercaseName = name.toLowerCase(); + const lowercaseName = isLowerCase ? name : name.toLowerCase(); if (lowercaseName === "set-cookie") { this.cookies = [value]; } this[kHeadersMap].set(lowercaseName, { name, value }); } - // https://fetch.spec.whatwg.org/#concept-header-list-delete - delete(name) { + /** + * @see https://fetch.spec.whatwg.org/#concept-header-list-delete + * @param {string} name + * @param {boolean} isLowerCase + */ + delete(name, isLowerCase) { this[kHeadersSortedMap] = null; - name = name.toLowerCase(); + if (!isLowerCase) name = name.toLowerCase(); if (name === "set-cookie") { this.cookies = null; } this[kHeadersMap].delete(name); } - // https://fetch.spec.whatwg.org/#concept-header-list-get - get(name) { - const value = this[kHeadersMap].get(name.toLowerCase()); - return value === void 0 ? null : value.value; + /** + * @see https://fetch.spec.whatwg.org/#concept-header-list-get + * @param {string} name + * @param {boolean} isLowerCase + * @returns {string | null} + */ + get(name, isLowerCase) { + return this[kHeadersMap].get(isLowerCase ? name : name.toLowerCase())?.value ?? null; } *[Symbol.iterator]() { - for (const [name, { value }] of this[kHeadersMap]) { + for (const { 0: name, 1: { value } } of this[kHeadersMap]) { yield [name, value]; } } get entries() { const headers2 = {}; - if (this[kHeadersMap].size) { + if (this[kHeadersMap].size !== 0) { for (const { name, value } of this[kHeadersMap].values()) { headers2[name] = value; } } return headers2; } + rawValues() { + return this[kHeadersMap].values(); + } + get entriesList() { + const headers2 = []; + if (this[kHeadersMap].size !== 0) { + for (const { 0: lowerName, 1: { name, value } } of this[kHeadersMap]) { + if (lowerName === "set-cookie") { + for (const cookie of this.cookies) { + headers2.push([name, cookie]); + } + } else { + headers2.push([name, value]); + } + } + } + return headers2; + } + // https://fetch.spec.whatwg.org/#convert-header-names-to-a-sorted-lowercase-set + toSortedArray() { + const size = this[kHeadersMap].size; + const array = new Array(size); + if (size <= 32) { + if (size === 0) { + return array; + } + const iterator2 = this[kHeadersMap][Symbol.iterator](); + const firstValue = iterator2.next().value; + array[0] = [firstValue[0], firstValue[1].value]; + assert(firstValue[1].value !== null); + for (let i = 1, j = 0, right = 0, left = 0, pivot = 0, x, value; i < size; ++i) { + value = iterator2.next().value; + x = array[i] = [value[0], value[1].value]; + assert(x[1] !== null); + left = 0; + right = i; + while (left < right) { + pivot = left + (right - left >> 1); + if (array[pivot][0] <= x[0]) { + left = pivot + 1; + } else { + right = pivot; + } + } + if (i !== pivot) { + j = i; + while (j > left) { + array[j] = array[--j]; + } + array[left] = x; + } + } + if (!iterator2.next().done) { + throw new TypeError("Unreachable"); + } + return array; + } else { + let i = 0; + for (const { 0: name, 1: { value } } of this[kHeadersMap]) { + array[i++] = [name, value]; + assert(value !== null); + } + return array.sort(compareHeaderName); + } + } } class Headers { + #guard; + #headersList; constructor(init = void 0) { + webidl.util.markAsUncloneable(this); if (init === kConstruct) { return; } - this[kHeadersList] = new HeadersList(); - this[kGuard] = "none"; + this.#headersList = new HeadersList(); + this.#guard = "none"; if (init !== void 0) { - init = webidl.converters.HeadersInit(init); + init = webidl.converters.HeadersInit(init, "Headers contructor", "init"); fill(this, init); } } // https://fetch.spec.whatwg.org/#dom-headers-append append(name, value) { webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 2, { header: "Headers.append" }); - name = webidl.converters.ByteString(name); - value = webidl.converters.ByteString(value); + webidl.argumentLengthCheck(arguments, 2, "Headers.append"); + const prefix = "Headers.append"; + name = webidl.converters.ByteString(name, prefix, "name"); + value = webidl.converters.ByteString(value, prefix, "value"); return appendHeader(this, name, value); } // https://fetch.spec.whatwg.org/#dom-headers-delete delete(name) { webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 1, { header: "Headers.delete" }); - name = webidl.converters.ByteString(name); + webidl.argumentLengthCheck(arguments, 1, "Headers.delete"); + const prefix = "Headers.delete"; + name = webidl.converters.ByteString(name, prefix, "name"); if (!isValidHeaderName(name)) { throw webidl.errors.invalidArgument({ prefix: "Headers.delete", @@ -11770,168 +12226,125 @@ function requireHeaders() { type: "header name" }); } - if (this[kGuard] === "immutable") { + if (this.#guard === "immutable") { throw new TypeError("immutable"); - } else if (this[kGuard] === "request-no-cors") ; - if (!this[kHeadersList].contains(name)) { + } + if (!this.#headersList.contains(name, false)) { return; } - this[kHeadersList].delete(name); + this.#headersList.delete(name, false); } // https://fetch.spec.whatwg.org/#dom-headers-get get(name) { webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 1, { header: "Headers.get" }); - name = webidl.converters.ByteString(name); + webidl.argumentLengthCheck(arguments, 1, "Headers.get"); + const prefix = "Headers.get"; + name = webidl.converters.ByteString(name, prefix, "name"); if (!isValidHeaderName(name)) { throw webidl.errors.invalidArgument({ - prefix: "Headers.get", + prefix, value: name, type: "header name" }); } - return this[kHeadersList].get(name); + return this.#headersList.get(name, false); } // https://fetch.spec.whatwg.org/#dom-headers-has has(name) { webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 1, { header: "Headers.has" }); - name = webidl.converters.ByteString(name); + webidl.argumentLengthCheck(arguments, 1, "Headers.has"); + const prefix = "Headers.has"; + name = webidl.converters.ByteString(name, prefix, "name"); if (!isValidHeaderName(name)) { throw webidl.errors.invalidArgument({ - prefix: "Headers.has", + prefix, value: name, type: "header name" }); } - return this[kHeadersList].contains(name); + return this.#headersList.contains(name, false); } // https://fetch.spec.whatwg.org/#dom-headers-set set(name, value) { webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 2, { header: "Headers.set" }); - name = webidl.converters.ByteString(name); - value = webidl.converters.ByteString(value); + webidl.argumentLengthCheck(arguments, 2, "Headers.set"); + const prefix = "Headers.set"; + name = webidl.converters.ByteString(name, prefix, "name"); + value = webidl.converters.ByteString(value, prefix, "value"); value = headerValueNormalize(value); if (!isValidHeaderName(name)) { throw webidl.errors.invalidArgument({ - prefix: "Headers.set", + prefix, value: name, type: "header name" }); } else if (!isValidHeaderValue(value)) { - throw webidl.errors.invalidArgument({ - prefix: "Headers.set", - value, - type: "header value" - }); - } - if (this[kGuard] === "immutable") { - throw new TypeError("immutable"); - } else if (this[kGuard] === "request-no-cors") ; - this[kHeadersList].set(name, value); - } - // https://fetch.spec.whatwg.org/#dom-headers-getsetcookie - getSetCookie() { - webidl.brandCheck(this, Headers); - const list = this[kHeadersList].cookies; - if (list) { - return [...list]; - } - return []; - } - // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine - get [kHeadersSortedMap]() { - if (this[kHeadersList][kHeadersSortedMap]) { - return this[kHeadersList][kHeadersSortedMap]; - } - const headers2 = []; - const names = [...this[kHeadersList]].sort((a, b) => a[0] < b[0] ? -1 : 1); - const cookies2 = this[kHeadersList].cookies; - for (let i = 0; i < names.length; ++i) { - const [name, value] = names[i]; - if (name === "set-cookie") { - for (let j = 0; j < cookies2.length; ++j) { - headers2.push([name, cookies2[j]]); - } - } else { - assert(value !== null); - headers2.push([name, value]); - } - } - this[kHeadersList][kHeadersSortedMap] = headers2; - return headers2; - } - keys() { - webidl.brandCheck(this, Headers); - if (this[kGuard] === "immutable") { - const value = this[kHeadersSortedMap]; - return makeIterator( - () => value, - "Headers", - "key" - ); - } - return makeIterator( - () => [...this[kHeadersSortedMap].values()], - "Headers", - "key" - ); - } - values() { - webidl.brandCheck(this, Headers); - if (this[kGuard] === "immutable") { - const value = this[kHeadersSortedMap]; - return makeIterator( - () => value, - "Headers", - "value" - ); - } - return makeIterator( - () => [...this[kHeadersSortedMap].values()], - "Headers", - "value" - ); - } - entries() { - webidl.brandCheck(this, Headers); - if (this[kGuard] === "immutable") { - const value = this[kHeadersSortedMap]; - return makeIterator( - () => value, - "Headers", - "key+value" - ); + throw webidl.errors.invalidArgument({ + prefix, + value, + type: "header value" + }); } - return makeIterator( - () => [...this[kHeadersSortedMap].values()], - "Headers", - "key+value" - ); + if (this.#guard === "immutable") { + throw new TypeError("immutable"); + } + this.#headersList.set(name, value, false); } - /** - * @param {(value: string, key: string, self: Headers) => void} callbackFn - * @param {unknown} thisArg - */ - forEach(callbackFn, thisArg = globalThis) { + // https://fetch.spec.whatwg.org/#dom-headers-getsetcookie + getSetCookie() { webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 1, { header: "Headers.forEach" }); - if (typeof callbackFn !== "function") { - throw new TypeError( - "Failed to execute 'forEach' on 'Headers': parameter 1 is not of type 'Function'." - ); + const list = this.#headersList.cookies; + if (list) { + return [...list]; } - for (const [key, value] of this) { - callbackFn.apply(thisArg, [value, key, this]); + return []; + } + // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine + get [kHeadersSortedMap]() { + if (this.#headersList[kHeadersSortedMap]) { + return this.#headersList[kHeadersSortedMap]; + } + const headers2 = []; + const names = this.#headersList.toSortedArray(); + const cookies2 = this.#headersList.cookies; + if (cookies2 === null || cookies2.length === 1) { + return this.#headersList[kHeadersSortedMap] = names; + } + for (let i = 0; i < names.length; ++i) { + const { 0: name, 1: value } = names[i]; + if (name === "set-cookie") { + for (let j = 0; j < cookies2.length; ++j) { + headers2.push([name, cookies2[j]]); + } + } else { + headers2.push([name, value]); + } } + return this.#headersList[kHeadersSortedMap] = headers2; } - [/* @__PURE__ */ Symbol.for("nodejs.util.inspect.custom")]() { - webidl.brandCheck(this, Headers); - return this[kHeadersList]; + [util2.inspect.custom](depth, options) { + options.depth ??= depth; + return `Headers ${util2.formatWithOptions(options, this.#headersList.entries)}`; + } + static getHeadersGuard(o) { + return o.#guard; + } + static setHeadersGuard(o, guard) { + o.#guard = guard; + } + static getHeadersList(o) { + return o.#headersList; + } + static setHeadersList(o, list) { + o.#headersList = list; } } - Headers.prototype[Symbol.iterator] = Headers.prototype.entries; + const { getHeadersGuard, setHeadersGuard, getHeadersList, setHeadersList } = Headers; + Reflect.deleteProperty(Headers, "getHeadersGuard"); + Reflect.deleteProperty(Headers, "setHeadersGuard"); + Reflect.deleteProperty(Headers, "getHeadersList"); + Reflect.deleteProperty(Headers, "setHeadersList"); + iteratorMixin("Headers", Headers, kHeadersSortedMap, 0, 1); Object.defineProperties(Headers.prototype, { append: kEnumerableProperty, delete: kEnumerableProperty, @@ -11939,11 +12352,6 @@ function requireHeaders() { has: kEnumerableProperty, set: kEnumerableProperty, getSetCookie: kEnumerableProperty, - keys: kEnumerableProperty, - values: kEnumerableProperty, - entries: kEnumerableProperty, - forEach: kEnumerableProperty, - [Symbol.iterator]: { enumerable: false }, [Symbol.toStringTag]: { value: "Headers", configurable: true @@ -11952,12 +12360,19 @@ function requireHeaders() { enumerable: false } }); - webidl.converters.HeadersInit = function(V) { + webidl.converters.HeadersInit = function(V, prefix, argument) { if (webidl.util.Type(V) === "Object") { - if (V[Symbol.iterator]) { - return webidl.converters["sequence>"](V); + const iterator2 = Reflect.get(V, Symbol.iterator); + if (!util2.types.isProxy(V) && iterator2 === Headers.prototype.entries) { + try { + return getHeadersList(V).entriesList; + } catch { + } } - return webidl.converters["record"](V); + if (typeof iterator2 === "function") { + return webidl.converters["sequence>"](V, prefix, argument, iterator2.bind(V)); + } + return webidl.converters["record"](V, prefix, argument); } throw webidl.errors.conversionFailed({ prefix: "Headers constructor", @@ -11965,21 +12380,28 @@ function requireHeaders() { types: ["sequence>", "record"] }); }; - headers = { + headers$1 = { fill, + // for test. + compareHeaderName, Headers, - HeadersList + HeadersList, + getHeadersGuard, + setHeadersGuard, + setHeadersList, + getHeadersList }; - return headers; + return headers$1; } -var response; -var hasRequiredResponse; -function requireResponse() { - if (hasRequiredResponse) return response; - hasRequiredResponse = 1; - const { Headers, HeadersList, fill } = requireHeaders(); - const { extractBody, cloneBody, mixinBody } = requireBody(); - const util2 = requireUtil$6(); +var response$1; +var hasRequiredResponse$1; +function requireResponse$1() { + if (hasRequiredResponse$1) return response$1; + hasRequiredResponse$1 = 1; + const { Headers, HeadersList, fill, getHeadersGuard, setHeadersGuard, setHeadersList } = requireHeaders$1(); + const { extractBody, cloneBody, mixinBody, hasFinalizationRegistry, streamRegistry, bodyUnusable } = requireBody$1(); + const util2 = requireUtil$e(); + const nodeUtil = require$$1$2; const { kEnumerableProperty } = util2; const { isValidReasonPhrase, @@ -11988,38 +12410,30 @@ function requireResponse() { isBlobLike, serializeJavascriptValueToJSONString, isErrorLike, - isomorphicEncode - } = requireUtil$5(); + isomorphicEncode, + environmentSettingsObject: relevantRealm + } = requireUtil$d(); const { redirectStatusSet, - nullBodyStatus, - DOMException: DOMException2 - } = requireConstants$3(); - const { kState, kHeaders, kGuard, kRealm } = requireSymbols$3(); - const { webidl } = requireWebidl(); - const { FormData } = requireFormdata(); - const { getGlobalOrigin } = requireGlobal$1(); - const { URLSerializer } = requireDataURL(); - const { kHeadersList, kConstruct } = requireSymbols$4(); - const assert = require$$0$3; - const { types } = require$$0$2; - const ReadableStream = globalThis.ReadableStream || require$$14.ReadableStream; + nullBodyStatus + } = requireConstants$7(); + const { kState, kHeaders } = requireSymbols$8(); + const { webidl } = requireWebidl$1(); + const { FormData } = requireFormdata$1(); + const { URLSerializer } = requireDataUrl(); + const { kConstruct } = requireSymbols$9(); + const assert = require$$0$5; + const { types } = require$$1$2; const textEncoder = new TextEncoder("utf-8"); class Response { // Creates network error Response. static error() { - const relevantRealm = { settingsObject: {} }; - const responseObject = new Response(); - responseObject[kState] = makeNetworkError(); - responseObject[kRealm] = relevantRealm; - responseObject[kHeaders][kHeadersList] = responseObject[kState].headersList; - responseObject[kHeaders][kGuard] = "immutable"; - responseObject[kHeaders][kRealm] = relevantRealm; + const responseObject = fromInnerResponse(makeNetworkError(), "immutable"); return responseObject; } // https://fetch.spec.whatwg.org/#dom-response-json static json(data, init = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: "Response.json" }); + webidl.argumentLengthCheck(arguments, 1, "Response.json"); if (init !== null) { init = webidl.converters.ResponseInit(init); } @@ -12027,52 +12441,44 @@ function requireResponse() { serializeJavascriptValueToJSONString(data) ); const body2 = extractBody(bytes); - const relevantRealm = { settingsObject: {} }; - const responseObject = new Response(); - responseObject[kRealm] = relevantRealm; - responseObject[kHeaders][kGuard] = "response"; - responseObject[kHeaders][kRealm] = relevantRealm; + const responseObject = fromInnerResponse(makeResponse({}), "response"); initializeResponse(responseObject, init, { body: body2[0], type: "application/json" }); return responseObject; } // Creates a redirect Response that redirects to url with status status. static redirect(url, status = 302) { - const relevantRealm = { settingsObject: {} }; - webidl.argumentLengthCheck(arguments, 1, { header: "Response.redirect" }); + webidl.argumentLengthCheck(arguments, 1, "Response.redirect"); url = webidl.converters.USVString(url); status = webidl.converters["unsigned short"](status); let parsedURL; try { - parsedURL = new URL(url, getGlobalOrigin()); + parsedURL = new URL(url, relevantRealm.settingsObject.baseUrl); } catch (err) { - throw Object.assign(new TypeError("Failed to parse URL from " + url), { - cause: err - }); + throw new TypeError(`Failed to parse URL from ${url}`, { cause: err }); } if (!redirectStatusSet.has(status)) { - throw new RangeError("Invalid status code " + status); + throw new RangeError(`Invalid status code ${status}`); } - const responseObject = new Response(); - responseObject[kRealm] = relevantRealm; - responseObject[kHeaders][kGuard] = "immutable"; - responseObject[kHeaders][kRealm] = relevantRealm; + const responseObject = fromInnerResponse(makeResponse({}), "immutable"); responseObject[kState].status = status; const value = isomorphicEncode(URLSerializer(parsedURL)); - responseObject[kState].headersList.append("location", value); + responseObject[kState].headersList.append("location", value, true); return responseObject; } // https://fetch.spec.whatwg.org/#dom-response constructor(body2 = null, init = {}) { + webidl.util.markAsUncloneable(this); + if (body2 === kConstruct) { + return; + } if (body2 !== null) { body2 = webidl.converters.BodyInit(body2); } init = webidl.converters.ResponseInit(init); - this[kRealm] = { settingsObject: {} }; this[kState] = makeResponse({}); this[kHeaders] = new Headers(kConstruct); - this[kHeaders][kGuard] = "response"; - this[kHeaders][kHeadersList] = this[kState].headersList; - this[kHeaders][kRealm] = this[kRealm]; + setHeadersGuard(this[kHeaders], "response"); + setHeadersList(this[kHeaders], this[kState].headersList); let bodyWithType = null; if (body2 != null) { const [extractedBody, type] = extractBody(body2); @@ -12131,20 +12537,35 @@ function requireResponse() { // Returns a clone of response. clone() { webidl.brandCheck(this, Response); - if (this.bodyUsed || this.body && this.body.locked) { + if (bodyUnusable(this)) { throw webidl.errors.exception({ header: "Response.clone", message: "Body has already been consumed." }); } const clonedResponse = cloneResponse(this[kState]); - const clonedResponseObject = new Response(); - clonedResponseObject[kState] = clonedResponse; - clonedResponseObject[kRealm] = this[kRealm]; - clonedResponseObject[kHeaders][kHeadersList] = clonedResponse.headersList; - clonedResponseObject[kHeaders][kGuard] = this[kHeaders][kGuard]; - clonedResponseObject[kHeaders][kRealm] = this[kHeaders][kRealm]; - return clonedResponseObject; + if (hasFinalizationRegistry && this[kState].body?.stream) { + streamRegistry.register(this, new WeakRef(this[kState].body.stream)); + } + return fromInnerResponse(clonedResponse, getHeadersGuard(this[kHeaders])); + } + [nodeUtil.inspect.custom](depth, options) { + if (options.depth === null) { + options.depth = 2; + } + options.colors ??= true; + const properties = { + status: this.status, + statusText: this.statusText, + headers: this.headers, + body: this.body, + bodyUsed: this.bodyUsed, + ok: this.ok, + redirected: this.redirected, + type: this.type, + url: this.url + }; + return `Response ${nodeUtil.formatWithOptions(options, properties)}`; } } mixinBody(Response); @@ -12178,7 +12599,7 @@ function requireResponse() { } const newResponse = makeResponse({ ...response2, body: null }); if (response2.body != null) { - newResponse.body = cloneBody(response2.body); + newResponse.body = cloneBody(newResponse, response2.body); } return newResponse; } @@ -12194,8 +12615,8 @@ function requireResponse() { cacheState: "", statusText: "", ...init, - headersList: init.headersList ? new HeadersList(init.headersList) : new HeadersList(), - urlList: init.urlList ? [...init.urlList] : [] + headersList: init?.headersList ? new HeadersList(init?.headersList) : new HeadersList(), + urlList: init?.urlList ? [...init.urlList] : [] }; } function makeNetworkError(reason) { @@ -12207,6 +12628,13 @@ function requireResponse() { aborted: reason && reason.name === "AbortError" }); } + function isNetworkError(response2) { + return ( + // A network error is a response whose type is "error", + response2.type === "error" && // status is 0 + response2.status === 0 + ); + } function makeFilteredResponse(response2, state) { state = { internalResponse: response2, @@ -12256,7 +12684,7 @@ function requireResponse() { } function makeAppropriateNetworkError(fetchParams, err = null) { assert(isCancelled(fetchParams)); - return isAborted(fetchParams) ? makeNetworkError(Object.assign(new DOMException2("The operation was aborted.", "AbortError"), { cause: err })) : makeNetworkError(Object.assign(new DOMException2("Request was cancelled."), { cause: err })); + return isAborted(fetchParams) ? makeNetworkError(Object.assign(new DOMException("The operation was aborted.", "AbortError"), { cause: err })) : makeNetworkError(Object.assign(new DOMException("Request was cancelled."), { cause: err })); } function initializeResponse(response2, init, body2) { if (init.status !== null && (init.status < 200 || init.status > 599)) { @@ -12280,15 +12708,26 @@ function requireResponse() { if (nullBodyStatus.includes(response2.status)) { throw webidl.errors.exception({ header: "Response constructor", - message: "Invalid response status code " + response2.status + message: `Invalid response status code ${response2.status}` }); } response2[kState].body = body2.body; - if (body2.type != null && !response2[kState].headersList.contains("Content-Type")) { - response2[kState].headersList.append("content-type", body2.type); + if (body2.type != null && !response2[kState].headersList.contains("content-type", true)) { + response2[kState].headersList.append("content-type", body2.type, true); } } } + function fromInnerResponse(innerResponse, guard) { + const response2 = new Response(kConstruct); + response2[kState] = innerResponse; + response2[kHeaders] = new Headers(kConstruct); + setHeadersList(response2[kHeaders], innerResponse.headersList); + setHeadersGuard(response2[kHeaders], guard); + if (hasFinalizationRegistry && innerResponse.body?.stream) { + streamRegistry.register(response2, new WeakRef(innerResponse.body.stream)); + } + return response2; + } webidl.converters.ReadableStream = webidl.interfaceConverter( ReadableStream ); @@ -12298,75 +12737,118 @@ function requireResponse() { webidl.converters.URLSearchParams = webidl.interfaceConverter( URLSearchParams ); - webidl.converters.XMLHttpRequestBodyInit = function(V) { + webidl.converters.XMLHttpRequestBodyInit = function(V, prefix, name) { if (typeof V === "string") { - return webidl.converters.USVString(V); + return webidl.converters.USVString(V, prefix, name); } if (isBlobLike(V)) { - return webidl.converters.Blob(V, { strict: false }); + return webidl.converters.Blob(V, prefix, name, { strict: false }); } - if (types.isArrayBuffer(V) || types.isTypedArray(V) || types.isDataView(V)) { - return webidl.converters.BufferSource(V); + if (ArrayBuffer.isView(V) || types.isArrayBuffer(V)) { + return webidl.converters.BufferSource(V, prefix, name); } if (util2.isFormDataLike(V)) { - return webidl.converters.FormData(V, { strict: false }); + return webidl.converters.FormData(V, prefix, name, { strict: false }); } if (V instanceof URLSearchParams) { - return webidl.converters.URLSearchParams(V); + return webidl.converters.URLSearchParams(V, prefix, name); } - return webidl.converters.DOMString(V); + return webidl.converters.DOMString(V, prefix, name); }; - webidl.converters.BodyInit = function(V) { + webidl.converters.BodyInit = function(V, prefix, argument) { if (V instanceof ReadableStream) { - return webidl.converters.ReadableStream(V); + return webidl.converters.ReadableStream(V, prefix, argument); } if (V?.[Symbol.asyncIterator]) { return V; } - return webidl.converters.XMLHttpRequestBodyInit(V); + return webidl.converters.XMLHttpRequestBodyInit(V, prefix, argument); }; webidl.converters.ResponseInit = webidl.dictionaryConverter([ { key: "status", converter: webidl.converters["unsigned short"], - defaultValue: 200 + defaultValue: () => 200 }, { key: "statusText", converter: webidl.converters.ByteString, - defaultValue: "" + defaultValue: () => "" }, { key: "headers", converter: webidl.converters.HeadersInit } ]); - response = { + response$1 = { + isNetworkError, makeNetworkError, makeResponse, makeAppropriateNetworkError, filterResponse, Response, - cloneResponse + cloneResponse, + fromInnerResponse }; - return response; + return response$1; } -var request$1; -var hasRequiredRequest; -function requireRequest() { - if (hasRequiredRequest) return request$1; - hasRequiredRequest = 1; - const { extractBody, mixinBody, cloneBody } = requireBody(); - const { Headers, fill: fillHeaders, HeadersList } = requireHeaders(); - const { FinalizationRegistry } = requireDispatcherWeakref()(); - const util2 = requireUtil$6(); +var dispatcherWeakref$1; +var hasRequiredDispatcherWeakref$1; +function requireDispatcherWeakref$1() { + if (hasRequiredDispatcherWeakref$1) return dispatcherWeakref$1; + hasRequiredDispatcherWeakref$1 = 1; + const { kConnected, kSize } = requireSymbols$9(); + class CompatWeakRef { + constructor(value) { + this.value = value; + } + deref() { + return this.value[kConnected] === 0 && this.value[kSize] === 0 ? void 0 : this.value; + } + } + class CompatFinalizer { + constructor(finalizer) { + this.finalizer = finalizer; + } + register(dispatcher2, key) { + if (dispatcher2.on) { + dispatcher2.on("disconnect", () => { + if (dispatcher2[kConnected] === 0 && dispatcher2[kSize] === 0) { + this.finalizer(key); + } + }); + } + } + unregister(key) { + } + } + dispatcherWeakref$1 = function() { + if (process.env.NODE_V8_COVERAGE && process.version.startsWith("v18")) { + process._rawDebug("Using compatibility WeakRef and FinalizationRegistry"); + return { + WeakRef: CompatWeakRef, + FinalizationRegistry: CompatFinalizer + }; + } + return { WeakRef, FinalizationRegistry }; + }; + return dispatcherWeakref$1; +} +var request$3; +var hasRequiredRequest$2; +function requireRequest$2() { + if (hasRequiredRequest$2) return request$3; + hasRequiredRequest$2 = 1; + const { extractBody, mixinBody, cloneBody, bodyUnusable } = requireBody$1(); + const { Headers, fill: fillHeaders, HeadersList, setHeadersGuard, getHeadersGuard, setHeadersList, getHeadersList } = requireHeaders$1(); + const { FinalizationRegistry: FinalizationRegistry2 } = requireDispatcherWeakref$1()(); + const util2 = requireUtil$e(); + const nodeUtil = require$$1$2; const { isValidHTTPToken, sameOrigin, - normalizeMethod, - makePolicyContainer, - normalizeMethodRecord - } = requireUtil$5(); + environmentSettingsObject + } = requireUtil$d(); const { forbiddenMethodsSet, corsSafeListedMethodsSet, @@ -12376,43 +12858,61 @@ function requireRequest() { requestCredentials, requestCache, requestDuplex - } = requireConstants$3(); - const { kEnumerableProperty } = util2; - const { kHeaders, kSignal, kState, kGuard, kRealm } = requireSymbols$3(); - const { webidl } = requireWebidl(); - const { getGlobalOrigin } = requireGlobal$1(); - const { URLSerializer } = requireDataURL(); - const { kHeadersList, kConstruct } = requireSymbols$4(); - const assert = require$$0$3; - const { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = require$$4$1; - let TransformStream = globalThis.TransformStream; + } = requireConstants$7(); + const { kEnumerableProperty, normalizedMethodRecordsBase, normalizedMethodRecords } = util2; + const { kHeaders, kSignal, kState, kDispatcher } = requireSymbols$8(); + const { webidl } = requireWebidl$1(); + const { URLSerializer } = requireDataUrl(); + const { kConstruct } = requireSymbols$9(); + const assert = require$$0$5; + const { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = require$$0$4; const kAbortController = /* @__PURE__ */ Symbol("abortController"); - const requestFinalizer = new FinalizationRegistry(({ signal, abort }) => { + const requestFinalizer = new FinalizationRegistry2(({ signal, abort }) => { signal.removeEventListener("abort", abort); }); + const dependentControllerMap = /* @__PURE__ */ new WeakMap(); + function buildAbort(acRef) { + return abort; + function abort() { + const ac = acRef.deref(); + if (ac !== void 0) { + requestFinalizer.unregister(abort); + this.removeEventListener("abort", abort); + ac.abort(this.reason); + const controllerList = dependentControllerMap.get(ac.signal); + if (controllerList !== void 0) { + if (controllerList.size !== 0) { + for (const ref of controllerList) { + const ctrl = ref.deref(); + if (ctrl !== void 0) { + ctrl.abort(this.reason); + } + } + controllerList.clear(); + } + dependentControllerMap.delete(ac.signal); + } + } + } + } + let patchMethodWarning = false; class Request { // https://fetch.spec.whatwg.org/#dom-request constructor(input, init = {}) { + webidl.util.markAsUncloneable(this); if (input === kConstruct) { return; } - webidl.argumentLengthCheck(arguments, 1, { header: "Request constructor" }); - input = webidl.converters.RequestInfo(input); - init = webidl.converters.RequestInit(init); - this[kRealm] = { - settingsObject: { - baseUrl: getGlobalOrigin(), - get origin() { - return this.baseUrl?.origin; - }, - policyContainer: makePolicyContainer() - } - }; + const prefix = "Request constructor"; + webidl.argumentLengthCheck(arguments, 1, prefix); + input = webidl.converters.RequestInfo(input, prefix, "input"); + init = webidl.converters.RequestInit(init, prefix, "init"); let request2 = null; let fallbackMode = null; - const baseUrl = this[kRealm].settingsObject.baseUrl; + const baseUrl = environmentSettingsObject.settingsObject.baseUrl; let signal = null; if (typeof input === "string") { + this[kDispatcher] = init.dispatcher; let parsedURL; try { parsedURL = new URL(input, baseUrl); @@ -12427,11 +12927,12 @@ function requireRequest() { request2 = makeRequest({ urlList: [parsedURL] }); fallbackMode = "cors"; } else { + this[kDispatcher] = init.dispatcher || input[kDispatcher]; assert(input instanceof Request); request2 = input[kState]; signal = input[kSignal]; } - const origin = this[kRealm].settingsObject.origin; + const origin = environmentSettingsObject.settingsObject.origin; let window2 = "client"; if (request2.window?.constructor?.name === "EnvironmentSettingsObject" && sameOrigin(request2.window, origin)) { window2 = request2.window; @@ -12453,7 +12954,7 @@ function requireRequest() { // unsafe-request flag Set. unsafeRequest: request2.unsafeRequest, // client This’s relevant settings object. - client: this[kRealm].settingsObject, + client: environmentSettingsObject.settingsObject, // window window. window: window2, // priority request’s priority. @@ -12509,7 +13010,7 @@ function requireRequest() { } catch (err) { throw new TypeError(`Referrer "${referrer}" is not a valid URL.`, { cause: err }); } - if (parsedReferrer.protocol === "about:" && parsedReferrer.hostname === "client" || origin && !sameOrigin(parsedReferrer, this[kRealm].settingsObject.baseUrl)) { + if (parsedReferrer.protocol === "about:" && parsedReferrer.hostname === "client" || origin && !sameOrigin(parsedReferrer, environmentSettingsObject.settingsObject.baseUrl)) { request2.referrer = "client"; } else { request2.referrer = parsedReferrer; @@ -12556,14 +13057,26 @@ function requireRequest() { } if (init.method !== void 0) { let method = init.method; - if (!isValidHTTPToken(method)) { - throw new TypeError(`'${method}' is not a valid HTTP method.`); + const mayBeNormalized = normalizedMethodRecords[method]; + if (mayBeNormalized !== void 0) { + request2.method = mayBeNormalized; + } else { + if (!isValidHTTPToken(method)) { + throw new TypeError(`'${method}' is not a valid HTTP method.`); + } + const upperCase = method.toUpperCase(); + if (forbiddenMethodsSet.has(upperCase)) { + throw new TypeError(`'${method}' HTTP method is unsupported.`); + } + method = normalizedMethodRecordsBase[upperCase] ?? method; + request2.method = method; } - if (forbiddenMethodsSet.has(method.toUpperCase())) { - throw new TypeError(`'${method}' HTTP method is unsupported.`); + if (!patchMethodWarning && request2.method === "patch") { + process.emitWarning("Using `patch` is highly likely to result in a `405 Method Not Allowed`. `PATCH` is much more likely to succeed.", { + code: "UNDICI-FETCH-patch" + }); + patchMethodWarning = true; } - method = normalizeMethodRecord[method] ?? normalizeMethod(method); - request2.method = method; } if (init.signal !== void 0) { signal = init.signal; @@ -12571,7 +13084,6 @@ function requireRequest() { this[kState] = request2; const ac = new AbortController(); this[kSignal] = ac.signal; - this[kSignal][kRealm] = this[kRealm]; if (signal != null) { if (!signal || typeof signal.aborted !== "boolean" || typeof signal.addEventListener !== "function") { throw new TypeError( @@ -12583,43 +13095,37 @@ function requireRequest() { } else { this[kAbortController] = ac; const acRef = new WeakRef(ac); - const abort = function() { - const ac2 = acRef.deref(); - if (ac2 !== void 0) { - ac2.abort(this.reason); - } - }; + const abort = buildAbort(acRef); try { if (typeof getMaxListeners === "function" && getMaxListeners(signal) === defaultMaxListeners) { - setMaxListeners(100, signal); + setMaxListeners(1500, signal); } else if (getEventListeners(signal, "abort").length >= defaultMaxListeners) { - setMaxListeners(100, signal); + setMaxListeners(1500, signal); } } catch { } util2.addAbortListener(signal, abort); - requestFinalizer.register(ac, { signal, abort }); + requestFinalizer.register(ac, { signal, abort }, abort); } } this[kHeaders] = new Headers(kConstruct); - this[kHeaders][kHeadersList] = request2.headersList; - this[kHeaders][kGuard] = "request"; - this[kHeaders][kRealm] = this[kRealm]; + setHeadersList(this[kHeaders], request2.headersList); + setHeadersGuard(this[kHeaders], "request"); if (mode === "no-cors") { if (!corsSafeListedMethodsSet.has(request2.method)) { throw new TypeError( `'${request2.method} is unsupported in no-cors mode.` ); } - this[kHeaders][kGuard] = "request-no-cors"; + setHeadersGuard(this[kHeaders], "request-no-cors"); } if (initHasKey) { - const headersList = this[kHeaders][kHeadersList]; + const headersList = getHeadersList(this[kHeaders]); const headers2 = init.headers !== void 0 ? init.headers : new HeadersList(headersList); headersList.clear(); - if (headers2 instanceof HeadersList) { - for (const [key, val] of headers2) { - headersList.append(key, val); + if (headers2 instanceof HeadersList) { + for (const { name, value } of headers2.rawValues()) { + headersList.append(name, value, false); } headersList.cookies = headers2.cookies; } else { @@ -12637,7 +13143,7 @@ function requireRequest() { request2.keepalive ); initBody = extractedBody; - if (contentType && !this[kHeaders][kHeadersList].contains("content-type")) { + if (contentType && !getHeadersList(this[kHeaders]).contains("content-type", true)) { this[kHeaders].append("content-type", contentType); } } @@ -12655,14 +13161,11 @@ function requireRequest() { } let finalBody = inputOrInitBody; if (initBody == null && inputBody != null) { - if (util2.isDisturbed(inputBody.stream) || inputBody.stream.locked) { + if (bodyUnusable(input)) { throw new TypeError( "Cannot construct a Request with a Request object that has already been used." ); } - if (!TransformStream) { - TransformStream = require$$14.TransformStream; - } const identityTransform = new TransformStream(); inputBody.stream.pipeThrough(identityTransform); finalBody = { @@ -12766,7 +13269,7 @@ function requireRequest() { return this[kState].reloadNavigation; } // Returns a boolean indicating whether or not request is for a history - // navigation (a.k.a. back-foward navigation). + // navigation (a.k.a. back-forward navigation). get isHistoryNavigation() { webidl.brandCheck(this, Request); return this[kState].historyNavigation; @@ -12793,83 +13296,112 @@ function requireRequest() { // Returns a clone of request. clone() { webidl.brandCheck(this, Request); - if (this.bodyUsed || this.body?.locked) { + if (bodyUnusable(this)) { throw new TypeError("unusable"); } const clonedRequest = cloneRequest(this[kState]); - const clonedRequestObject = new Request(kConstruct); - clonedRequestObject[kState] = clonedRequest; - clonedRequestObject[kRealm] = this[kRealm]; - clonedRequestObject[kHeaders] = new Headers(kConstruct); - clonedRequestObject[kHeaders][kHeadersList] = clonedRequest.headersList; - clonedRequestObject[kHeaders][kGuard] = this[kHeaders][kGuard]; - clonedRequestObject[kHeaders][kRealm] = this[kHeaders][kRealm]; const ac = new AbortController(); if (this.signal.aborted) { ac.abort(this.signal.reason); } else { + let list = dependentControllerMap.get(this.signal); + if (list === void 0) { + list = /* @__PURE__ */ new Set(); + dependentControllerMap.set(this.signal, list); + } + const acRef = new WeakRef(ac); + list.add(acRef); util2.addAbortListener( - this.signal, - () => { - ac.abort(this.signal.reason); - } + ac.signal, + buildAbort(acRef) ); } - clonedRequestObject[kSignal] = ac.signal; - return clonedRequestObject; + return fromInnerRequest(clonedRequest, ac.signal, getHeadersGuard(this[kHeaders])); + } + [nodeUtil.inspect.custom](depth, options) { + if (options.depth === null) { + options.depth = 2; + } + options.colors ??= true; + const properties = { + method: this.method, + url: this.url, + headers: this.headers, + destination: this.destination, + referrer: this.referrer, + referrerPolicy: this.referrerPolicy, + mode: this.mode, + credentials: this.credentials, + cache: this.cache, + redirect: this.redirect, + integrity: this.integrity, + keepalive: this.keepalive, + isReloadNavigation: this.isReloadNavigation, + isHistoryNavigation: this.isHistoryNavigation, + signal: this.signal + }; + return `Request ${nodeUtil.formatWithOptions(options, properties)}`; } } mixinBody(Request); function makeRequest(init) { - const request2 = { - method: "GET", - localURLsOnly: false, - unsafeRequest: false, - body: null, - client: null, - reservedClient: null, - replacesClientId: "", - window: "client", - keepalive: false, - serviceWorkers: "all", - initiator: "", - destination: "", - priority: null, - origin: "client", - policyContainer: "client", - referrer: "client", - referrerPolicy: "", - mode: "no-cors", - useCORSPreflightFlag: false, - credentials: "same-origin", - useCredentials: false, - cache: "default", - redirect: "follow", - integrity: "", - cryptoGraphicsNonceMetadata: "", - parserMetadata: "", - reloadNavigation: false, - historyNavigation: false, - userActivation: false, - taintedOrigin: false, - redirectCount: 0, - responseTainting: "basic", - preventNoCacheCacheControlHeaderModification: false, - done: false, - timingAllowFailed: false, - ...init, + return { + method: init.method ?? "GET", + localURLsOnly: init.localURLsOnly ?? false, + unsafeRequest: init.unsafeRequest ?? false, + body: init.body ?? null, + client: init.client ?? null, + reservedClient: init.reservedClient ?? null, + replacesClientId: init.replacesClientId ?? "", + window: init.window ?? "client", + keepalive: init.keepalive ?? false, + serviceWorkers: init.serviceWorkers ?? "all", + initiator: init.initiator ?? "", + destination: init.destination ?? "", + priority: init.priority ?? null, + origin: init.origin ?? "client", + policyContainer: init.policyContainer ?? "client", + referrer: init.referrer ?? "client", + referrerPolicy: init.referrerPolicy ?? "", + mode: init.mode ?? "no-cors", + useCORSPreflightFlag: init.useCORSPreflightFlag ?? false, + credentials: init.credentials ?? "same-origin", + useCredentials: init.useCredentials ?? false, + cache: init.cache ?? "default", + redirect: init.redirect ?? "follow", + integrity: init.integrity ?? "", + cryptoGraphicsNonceMetadata: init.cryptoGraphicsNonceMetadata ?? "", + parserMetadata: init.parserMetadata ?? "", + reloadNavigation: init.reloadNavigation ?? false, + historyNavigation: init.historyNavigation ?? false, + userActivation: init.userActivation ?? false, + taintedOrigin: init.taintedOrigin ?? false, + redirectCount: init.redirectCount ?? 0, + responseTainting: init.responseTainting ?? "basic", + preventNoCacheCacheControlHeaderModification: init.preventNoCacheCacheControlHeaderModification ?? false, + done: init.done ?? false, + timingAllowFailed: init.timingAllowFailed ?? false, + urlList: init.urlList, + url: init.urlList[0], headersList: init.headersList ? new HeadersList(init.headersList) : new HeadersList() }; - request2.url = request2.urlList[0]; - return request2; } function cloneRequest(request2) { const newRequest = makeRequest({ ...request2, body: null }); if (request2.body != null) { - newRequest.body = cloneBody(request2.body); + newRequest.body = cloneBody(newRequest, request2.body); } return newRequest; } + function fromInnerRequest(innerRequest, signal, guard) { + const request2 = new Request(kConstruct); + request2[kState] = innerRequest; + request2[kSignal] = signal; + request2[kHeaders] = new Headers(kConstruct); + setHeadersList(request2[kHeaders], innerRequest.headersList); + setHeadersGuard(request2[kHeaders], guard); + return request2; + } Object.defineProperties(Request.prototype, { method: kEnumerableProperty, url: kEnumerableProperty, @@ -12899,14 +13431,14 @@ function requireRequest() { webidl.converters.Request = webidl.interfaceConverter( Request ); - webidl.converters.RequestInfo = function(V) { + webidl.converters.RequestInfo = function(V, prefix, argument) { if (typeof V === "string") { - return webidl.converters.USVString(V); + return webidl.converters.USVString(V, prefix, argument); } if (V instanceof Request) { - return webidl.converters.Request(V); + return webidl.converters.Request(V, prefix, argument); } - return webidl.converters.USVString(V); + return webidl.converters.USVString(V, prefix, argument); }; webidl.converters.AbortSignal = webidl.interfaceConverter( AbortSignal @@ -12973,6 +13505,8 @@ function requireRequest() { converter: webidl.nullableConverter( (signal) => webidl.converters.AbortSignal( signal, + "RequestInit", + "signal", { strict: false } ) ) @@ -12985,26 +13519,31 @@ function requireRequest() { key: "duplex", converter: webidl.converters.DOMString, allowedValues: requestDuplex + }, + { + key: "dispatcher", + // undici specific option + converter: webidl.converters.any } ]); - request$1 = { Request, makeRequest }; - return request$1; + request$3 = { Request, makeRequest, fromInnerRequest, cloneRequest }; + return request$3; } -var fetch_1; -var hasRequiredFetch; -function requireFetch() { - if (hasRequiredFetch) return fetch_1; - hasRequiredFetch = 1; +var fetch_1$1; +var hasRequiredFetch$1; +function requireFetch$1() { + if (hasRequiredFetch$1) return fetch_1$1; + hasRequiredFetch$1 = 1; const { - Response, makeNetworkError, makeAppropriateNetworkError, filterResponse, - makeResponse - } = requireResponse(); - const { Headers } = requireHeaders(); - const { Request, makeRequest } = requireRequest(); - const zlib = require$$3$2; + makeResponse, + fromInnerResponse + } = requireResponse$1(); + const { HeadersList } = requireHeaders$1(); + const { Request, cloneRequest } = requireRequest$2(); + const zlib = require$$1$4; const { bytesMatch, makePolicyContainer, @@ -13033,31 +13572,33 @@ function requireFetch() { isomorphicEncode, urlIsLocal, urlIsHttpHttpsScheme, - urlHasHttpsScheme - } = requireUtil$5(); - const { kState, kHeaders, kGuard, kRealm } = requireSymbols$3(); - const assert = require$$0$3; - const { safelyExtractBody } = requireBody(); + urlHasHttpsScheme, + clampAndCoarsenConnectionTimingInfo, + simpleRangeHeaderValue, + buildContentRange, + createInflate, + extractMimeType + } = requireUtil$d(); + const { kState, kDispatcher } = requireSymbols$8(); + const assert = require$$0$5; + const { safelyExtractBody, extractBody } = requireBody$1(); const { redirectStatusSet, nullBodyStatus, safeMethodsSet, requestBodyHeader, - subresourceSet, - DOMException: DOMException2 - } = requireConstants$3(); - const { kHeadersList } = requireSymbols$4(); - const EE = require$$4$1; - const { Readable, pipeline } = require$$0$5; - const { addAbortListener, isErrored, isReadable, nodeMajor, nodeMinor } = requireUtil$6(); - const { dataURLProcessor, serializeAMimeType } = requireDataURL(); - const { TransformStream } = require$$14; - const { getGlobalDispatcher } = requireGlobal(); - const { webidl } = requireWebidl(); - const { STATUS_CODES } = require$$2$1; + subresourceSet + } = requireConstants$7(); + const EE = require$$0$4; + const { Readable, pipeline, finished } = require$$0$6; + const { addAbortListener, isErrored, isReadable, bufferToLowerCasedHeaderName } = requireUtil$e(); + const { dataURLProcessor, serializeAMimeType, minimizeSupportedMimeType } = requireDataUrl(); + const { getGlobalDispatcher } = requireGlobal$2(); + const { webidl } = requireWebidl$1(); + const { STATUS_CODES } = require$$2$2; const GET_OR_HEAD = ["GET", "HEAD"]; + const defaultUserAgent = typeof __UNDICI_IS_NODE__ !== "undefined" || typeof esbuildDetection !== "undefined" ? "node" : "undici"; let resolveObjectURL; - let ReadableStream = globalThis.ReadableStream; class Fetch extends EE { constructor(dispatcher2) { super(); @@ -13065,7 +13606,6 @@ function requireFetch() { this.connection = null; this.dump = false; this.state = "ongoing"; - this.setMaxListeners(21); } terminate(reason) { if (this.state !== "ongoing") { @@ -13082,16 +13622,19 @@ function requireFetch() { } this.state = "aborted"; if (!error) { - error = new DOMException2("The operation was aborted.", "AbortError"); + error = new DOMException("The operation was aborted.", "AbortError"); } this.serializedAbortReason = error; this.connection?.destroy(error); this.emit("terminated", error); } } - function fetch(input, init = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: "globalThis.fetch" }); - const p = createDeferredPromise(); + function handleFetchDone(response2) { + finalizeAndReportTiming(response2, "fetch"); + } + function fetch(input, init = void 0) { + webidl.argumentLengthCheck(arguments, 1, "globalThis.fetch"); + let p = createDeferredPromise(); let requestObject; try { requestObject = new Request(input, init); @@ -13109,7 +13652,6 @@ function requireFetch() { request2.serviceWorkers = "none"; } let responseObject = null; - const relevantRealm = null; let locallyAborted = false; let controller = null; addAbortListener( @@ -13118,37 +13660,31 @@ function requireFetch() { locallyAborted = true; assert(controller != null); controller.abort(requestObject.signal.reason); - abortFetch(p, request2, responseObject, requestObject.signal.reason); + const realResponse = responseObject?.deref(); + abortFetch(p, request2, realResponse, requestObject.signal.reason); } ); - const handleFetchDone = (response2) => finalizeAndReportTiming(response2, "fetch"); const processResponse = (response2) => { if (locallyAborted) { - return Promise.resolve(); + return; } if (response2.aborted) { abortFetch(p, request2, responseObject, controller.serializedAbortReason); - return Promise.resolve(); + return; } if (response2.type === "error") { - p.reject( - Object.assign(new TypeError("fetch failed"), { cause: response2.error }) - ); - return Promise.resolve(); + p.reject(new TypeError("fetch failed", { cause: response2.error })); + return; } - responseObject = new Response(); - responseObject[kState] = response2; - responseObject[kRealm] = relevantRealm; - responseObject[kHeaders][kHeadersList] = response2.headersList; - responseObject[kHeaders][kGuard] = "immutable"; - responseObject[kHeaders][kRealm] = relevantRealm; - p.resolve(responseObject); + responseObject = new WeakRef(fromInnerResponse(response2, "immutable")); + p.resolve(responseObject.deref()); + p = null; }; controller = fetching({ request: request2, processResponseEndOfBody: handleFetchDone, processResponse, - dispatcher: init.dispatcher ?? getGlobalDispatcher() + dispatcher: requestObject[kDispatcher] // undici }); return p.promise; @@ -13179,22 +13715,17 @@ function requireFetch() { response2.timingInfo = timingInfo; markResourceTiming( timingInfo, - originalURL, + originalURL.href, initiatorType, globalThis, cacheState ); } - function markResourceTiming(timingInfo, originalURL, initiatorType, globalThis2, cacheState) { - if (nodeMajor > 18 || nodeMajor === 18 && nodeMinor >= 2) { - performance.markResourceTiming(timingInfo, originalURL.href, initiatorType, globalThis2, cacheState); - } - } + const markResourceTiming = performance.markResourceTiming; function abortFetch(p, request2, responseObject, error) { - if (!error) { - error = new DOMException2("The operation was aborted.", "AbortError"); + if (p) { + p.reject(error); } - p.reject(error); if (request2.body != null && isReadable(request2.body?.stream)) { request2.body.stream.cancel(error).catch((err) => { if (err.code === "ERR_INVALID_STATE") { @@ -13224,18 +13755,19 @@ function requireFetch() { processResponseEndOfBody, processResponseConsumeBody, useParallelQueue = false, - dispatcher: dispatcher2 + dispatcher: dispatcher2 = getGlobalDispatcher() // undici }) { + assert(dispatcher2); let taskDestination = null; let crossOriginIsolatedCapability = false; if (request2.client != null) { taskDestination = request2.client.globalObject; crossOriginIsolatedCapability = request2.client.crossOriginIsolatedCapability; } - const currenTime = coarsenedSharedCurrentTime(crossOriginIsolatedCapability); + const currentTime = coarsenedSharedCurrentTime(crossOriginIsolatedCapability); const timingInfo = createOpaqueTimingInfo({ - startTime: currenTime + startTime: currentTime }); const fetchParams = { controller: new Fetch(dispatcher2), @@ -13254,7 +13786,7 @@ function requireFetch() { request2.window = request2.client?.globalObject?.constructor?.name === "Window" ? request2.client : "no-window"; } if (request2.origin === "client") { - request2.origin = request2.client?.origin; + request2.origin = request2.client.origin; } if (request2.policyContainer === "client") { if (request2.client != null) { @@ -13265,12 +13797,12 @@ function requireFetch() { request2.policyContainer = makePolicyContainer(); } } - if (!request2.headersList.contains("accept")) { + if (!request2.headersList.contains("accept", true)) { const value = "*/*"; - request2.headersList.append("accept", value); + request2.headersList.append("accept", value, true); } - if (!request2.headersList.contains("accept-language")) { - request2.headersList.append("accept-language", "*"); + if (!request2.headersList.contains("accept-language", true)) { + request2.headersList.append("accept-language", "*", true); } if (request2.priority === null) ; if (subresourceSet.has(request2.destination)) ; @@ -13349,7 +13881,7 @@ function requireFetch() { if (!request2.timingAllowFailed) { response2.timingAllowPassed = true; } - if (response2.type === "opaque" && internalResponse.status === 206 && internalResponse.rangeRequested && !request2.headers.contains("range")) { + if (response2.type === "opaque" && internalResponse.status === 206 && internalResponse.rangeRequested && !request2.headers.contains("range", true)) { response2 = internalResponse = makeNetworkError(); } if (response2.status !== 0 && (request2.method === "HEAD" || request2.method === "CONNECT" || nullBodyStatus.includes(internalResponse.status))) { @@ -13387,28 +13919,56 @@ function requireFetch() { } case "blob:": { if (!resolveObjectURL) { - resolveObjectURL = require$$7.resolveObjectURL; + resolveObjectURL = require$$0$3.resolveObjectURL; } const blobURLEntry = requestCurrentURL(request2); if (blobURLEntry.search.length !== 0) { return Promise.resolve(makeNetworkError("NetworkError when attempting to fetch resource.")); } - const blobURLEntryObject = resolveObjectURL(blobURLEntry.toString()); - if (request2.method !== "GET" || !isBlobLike(blobURLEntryObject)) { + const blob = resolveObjectURL(blobURLEntry.toString()); + if (request2.method !== "GET" || !isBlobLike(blob)) { return Promise.resolve(makeNetworkError("invalid method")); } - const bodyWithType = safelyExtractBody(blobURLEntryObject); - const body2 = bodyWithType[0]; - const length = isomorphicEncode(`${body2.length}`); - const type = bodyWithType[1] ?? ""; - const response2 = makeResponse({ - statusText: "OK", - headersList: [ - ["content-length", { name: "Content-Length", value: length }], - ["content-type", { name: "Content-Type", value: type }] - ] - }); - response2.body = body2; + const response2 = makeResponse(); + const fullLength = blob.size; + const serializedFullLength = isomorphicEncode(`${fullLength}`); + const type = blob.type; + if (!request2.headersList.contains("range", true)) { + const bodyWithType = extractBody(blob); + response2.statusText = "OK"; + response2.body = bodyWithType[0]; + response2.headersList.set("content-length", serializedFullLength, true); + response2.headersList.set("content-type", type, true); + } else { + response2.rangeRequested = true; + const rangeHeader = request2.headersList.get("range", true); + const rangeValue = simpleRangeHeaderValue(rangeHeader, true); + if (rangeValue === "failure") { + return Promise.resolve(makeNetworkError("failed to fetch the data URL")); + } + let { rangeStartValue: rangeStart, rangeEndValue: rangeEnd } = rangeValue; + if (rangeStart === null) { + rangeStart = fullLength - rangeEnd; + rangeEnd = rangeStart + rangeEnd - 1; + } else { + if (rangeStart >= fullLength) { + return Promise.resolve(makeNetworkError("Range start is greater than the blob's size.")); + } + if (rangeEnd === null || rangeEnd >= fullLength) { + rangeEnd = fullLength - 1; + } + } + const slicedBlob = blob.slice(rangeStart, rangeEnd, type); + const slicedBodyWithType = extractBody(slicedBlob); + response2.body = slicedBodyWithType[0]; + const serializedSlicedLength = isomorphicEncode(`${slicedBlob.size}`); + const contentRange = buildContentRange(rangeStart, rangeEnd, fullLength); + response2.status = 206; + response2.statusText = "Partial Content"; + response2.headersList.set("content-length", serializedSlicedLength, true); + response2.headersList.set("content-type", type, true); + response2.headersList.set("content-range", contentRange, true); + } return Promise.resolve(response2); } case "data:": { @@ -13445,52 +14005,59 @@ function requireFetch() { } } function fetchFinale(fetchParams, response2) { - if (response2.type === "error") { - response2.urlList = [fetchParams.request.urlList[0]]; - response2.timingInfo = createOpaqueTimingInfo({ - startTime: fetchParams.timingInfo.startTime - }); - } + let timingInfo = fetchParams.timingInfo; const processResponseEndOfBody = () => { - fetchParams.request.done = true; - if (fetchParams.processResponseEndOfBody != null) { - queueMicrotask(() => fetchParams.processResponseEndOfBody(response2)); + const unsafeEndTime = Date.now(); + if (fetchParams.request.destination === "document") { + fetchParams.controller.fullTimingInfo = timingInfo; } + fetchParams.controller.reportTimingSteps = () => { + if (fetchParams.request.url.protocol !== "https:") { + return; + } + timingInfo.endTime = unsafeEndTime; + let cacheState = response2.cacheState; + const bodyInfo = response2.bodyInfo; + if (!response2.timingAllowPassed) { + timingInfo = createOpaqueTimingInfo(timingInfo); + cacheState = ""; + } + let responseStatus = 0; + if (fetchParams.request.mode !== "navigator" || !response2.hasCrossOriginRedirects) { + responseStatus = response2.status; + const mimeType = extractMimeType(response2.headersList); + if (mimeType !== "failure") { + bodyInfo.contentType = minimizeSupportedMimeType(mimeType); + } + } + if (fetchParams.request.initiatorType != null) { + markResourceTiming(timingInfo, fetchParams.request.url.href, fetchParams.request.initiatorType, globalThis, cacheState, bodyInfo, responseStatus); + } + }; + const processResponseEndOfBodyTask = () => { + fetchParams.request.done = true; + if (fetchParams.processResponseEndOfBody != null) { + queueMicrotask(() => fetchParams.processResponseEndOfBody(response2)); + } + if (fetchParams.request.initiatorType != null) { + fetchParams.controller.reportTimingSteps(); + } + }; + queueMicrotask(() => processResponseEndOfBodyTask()); }; if (fetchParams.processResponse != null) { - queueMicrotask(() => fetchParams.processResponse(response2)); + queueMicrotask(() => { + fetchParams.processResponse(response2); + fetchParams.processResponse = null; + }); } - if (response2.body == null) { + const internalResponse = response2.type === "error" ? response2 : response2.internalResponse ?? response2; + if (internalResponse.body == null) { processResponseEndOfBody(); } else { - const identityTransformAlgorithm = (chunk, controller) => { - controller.enqueue(chunk); - }; - const transformStream = new TransformStream({ - start() { - }, - transform: identityTransformAlgorithm, - flush: processResponseEndOfBody - }, { - size() { - return 1; - } - }, { - size() { - return 1; - } + finished(internalResponse.body.stream, () => { + processResponseEndOfBody(); }); - response2.body = { stream: response2.body.stream.pipeThrough(transformStream) }; - } - if (fetchParams.processResponseConsumeBody != null) { - const processBody = (nullOrBytes) => fetchParams.processResponseConsumeBody(response2, nullOrBytes); - const processBodyError = (failure) => fetchParams.processResponseConsumeBody(response2, failure); - if (response2.body == null) { - queueMicrotask(() => processBody(null)); - } else { - return fullyReadBody(response2.body, processBody, processBodyError); - } - return Promise.resolve(); } } async function httpFetch(fetchParams) { @@ -13521,7 +14088,7 @@ function requireFetch() { } if (redirectStatusSet.has(actualResponse.status)) { if (request2.redirect !== "manual") { - fetchParams.controller.connection.destroy(); + fetchParams.controller.connection.destroy(void 0, false); } if (request2.redirect === "error") { response2 = makeNetworkError("unexpected redirect"); @@ -13577,10 +14144,10 @@ function requireFetch() { } } if (!sameOrigin(requestCurrentURL(request2), locationURL)) { - request2.headersList.delete("authorization"); + request2.headersList.delete("authorization", true); request2.headersList.delete("proxy-authorization", true); - request2.headersList.delete("cookie"); - request2.headersList.delete("host"); + request2.headersList.delete("cookie", true); + request2.headersList.delete("host", true); } if (request2.body != null) { assert(request2.body.source != null); @@ -13604,7 +14171,7 @@ function requireFetch() { httpFetchParams = fetchParams; httpRequest = request2; } else { - httpRequest = makeRequest(request2); + httpRequest = cloneRequest(request2); httpFetchParams = { ...fetchParams }; httpFetchParams.request = httpRequest; } @@ -13618,48 +14185,48 @@ function requireFetch() { contentLengthHeaderValue = isomorphicEncode(`${contentLength}`); } if (contentLengthHeaderValue != null) { - httpRequest.headersList.append("content-length", contentLengthHeaderValue); + httpRequest.headersList.append("content-length", contentLengthHeaderValue, true); } if (contentLength != null && httpRequest.keepalive) ; if (httpRequest.referrer instanceof URL) { - httpRequest.headersList.append("referer", isomorphicEncode(httpRequest.referrer.href)); + httpRequest.headersList.append("referer", isomorphicEncode(httpRequest.referrer.href), true); } appendRequestOriginHeader(httpRequest); appendFetchMetadata(httpRequest); - if (!httpRequest.headersList.contains("user-agent")) { - httpRequest.headersList.append("user-agent", typeof esbuildDetection === "undefined" ? "undici" : "node"); + if (!httpRequest.headersList.contains("user-agent", true)) { + httpRequest.headersList.append("user-agent", defaultUserAgent); } - if (httpRequest.cache === "default" && (httpRequest.headersList.contains("if-modified-since") || httpRequest.headersList.contains("if-none-match") || httpRequest.headersList.contains("if-unmodified-since") || httpRequest.headersList.contains("if-match") || httpRequest.headersList.contains("if-range"))) { + if (httpRequest.cache === "default" && (httpRequest.headersList.contains("if-modified-since", true) || httpRequest.headersList.contains("if-none-match", true) || httpRequest.headersList.contains("if-unmodified-since", true) || httpRequest.headersList.contains("if-match", true) || httpRequest.headersList.contains("if-range", true))) { httpRequest.cache = "no-store"; } - if (httpRequest.cache === "no-cache" && !httpRequest.preventNoCacheCacheControlHeaderModification && !httpRequest.headersList.contains("cache-control")) { - httpRequest.headersList.append("cache-control", "max-age=0"); + if (httpRequest.cache === "no-cache" && !httpRequest.preventNoCacheCacheControlHeaderModification && !httpRequest.headersList.contains("cache-control", true)) { + httpRequest.headersList.append("cache-control", "max-age=0", true); } if (httpRequest.cache === "no-store" || httpRequest.cache === "reload") { - if (!httpRequest.headersList.contains("pragma")) { - httpRequest.headersList.append("pragma", "no-cache"); + if (!httpRequest.headersList.contains("pragma", true)) { + httpRequest.headersList.append("pragma", "no-cache", true); } - if (!httpRequest.headersList.contains("cache-control")) { - httpRequest.headersList.append("cache-control", "no-cache"); + if (!httpRequest.headersList.contains("cache-control", true)) { + httpRequest.headersList.append("cache-control", "no-cache", true); } } - if (httpRequest.headersList.contains("range")) { - httpRequest.headersList.append("accept-encoding", "identity"); + if (httpRequest.headersList.contains("range", true)) { + httpRequest.headersList.append("accept-encoding", "identity", true); } - if (!httpRequest.headersList.contains("accept-encoding")) { + if (!httpRequest.headersList.contains("accept-encoding", true)) { if (urlHasHttpsScheme(requestCurrentURL(httpRequest))) { - httpRequest.headersList.append("accept-encoding", "br, gzip, deflate"); + httpRequest.headersList.append("accept-encoding", "br, gzip, deflate", true); } else { - httpRequest.headersList.append("accept-encoding", "gzip, deflate"); + httpRequest.headersList.append("accept-encoding", "gzip, deflate", true); } } - httpRequest.headersList.delete("host"); + httpRequest.headersList.delete("host", true); { httpRequest.cache = "no-store"; } - if (httpRequest.mode !== "no-store" && httpRequest.mode !== "reload") ; + if (httpRequest.cache !== "no-store" && httpRequest.cache !== "reload") ; if (response2 == null) { - if (httpRequest.mode === "only-if-cached") { + if (httpRequest.cache === "only-if-cached") { return makeNetworkError("only if cached"); } const forwardResponse = await httpNetworkFetch( @@ -13673,7 +14240,7 @@ function requireFetch() { } } response2.urlList = [...httpRequest.urlList]; - if (httpRequest.headersList.contains("range")) { + if (httpRequest.headersList.contains("range", true)) { response2.rangeRequested = true; } response2.requestIncludesCredentials = includeCredentials; @@ -13709,10 +14276,12 @@ function requireFetch() { fetchParams.controller.connection = { abort: null, destroyed: false, - destroy(err) { + destroy(err, abort = true) { if (!this.destroyed) { this.destroyed = true; - this.abort?.(err ?? new DOMException2("The operation was aborted.", "AbortError")); + if (abort) { + this.abort?.(err ?? new DOMException("The operation was aborted.", "AbortError")); + } } } }; @@ -13779,15 +14348,14 @@ function requireFetch() { } return makeNetworkError(err); } - const pullAlgorithm = () => { - fetchParams.controller.resume(); + const pullAlgorithm = async () => { + await fetchParams.controller.resume(); }; const cancelAlgorithm = (reason) => { - fetchParams.controller.abort(reason); + if (!isCancelled(fetchParams)) { + fetchParams.controller.abort(reason); + } }; - if (!ReadableStream) { - ReadableStream = require$$14.ReadableStream; - } const stream = new ReadableStream( { async start(controller) { @@ -13798,16 +14366,12 @@ function requireFetch() { }, async cancel(reason) { await cancelAlgorithm(reason); - } - }, - { - highWaterMark: 0, - size() { - return 1; - } + }, + type: "bytes" } ); - response2.body = { stream }; + response2.body = { stream, source: null, length: null }; + fetchParams.controller.onAborted = onAborted; fetchParams.controller.on("terminated", onAborted); fetchParams.controller.resume = async () => { while (true) { @@ -13837,12 +14401,15 @@ function requireFetch() { fetchParams.controller.terminate(bytes); return; } - fetchParams.controller.controller.enqueue(new Uint8Array(bytes)); + const buffer = new Uint8Array(bytes); + if (buffer.byteLength) { + fetchParams.controller.controller.enqueue(buffer); + } if (isErrored(stream)) { fetchParams.controller.terminate(); return; } - if (!fetchParams.controller.controller.desiredSize) { + if (fetchParams.controller.controller.desiredSize <= 0) { return; } } @@ -13865,7 +14432,7 @@ function requireFetch() { fetchParams.controller.connection.destroy(); } return response2; - async function dispatch({ body: body2 }) { + function dispatch({ body: body2 }) { const url = requestCurrentURL(request2); const agent2 = fetchParams.controller.dispatcher; return new Promise((resolve, reject) => agent2.dispatch( @@ -13873,7 +14440,7 @@ function requireFetch() { path: url.pathname + url.search, origin: url.origin, method: request2.method, - body: fetchParams.controller.dispatcher.isMockActive ? request2.body && (request2.body.source || request2.body.stream) : body2, + body: agent2.isMockActive ? request2.body && (request2.body.source || request2.body.stream) : body2, headers: request2.headersList.entries, maxRedirections: 0, upgrade: request2.mode === "websocket" ? "websocket" : void 0 @@ -13883,48 +14450,41 @@ function requireFetch() { abort: null, onConnect(abort) { const { connection: connection2 } = fetchParams.controller; + timingInfo.finalConnectionTimingInfo = clampAndCoarsenConnectionTimingInfo(void 0, timingInfo.postRedirectStartTime, fetchParams.crossOriginIsolatedCapability); if (connection2.destroyed) { - abort(new DOMException2("The operation was aborted.", "AbortError")); + abort(new DOMException("The operation was aborted.", "AbortError")); } else { fetchParams.controller.on("terminated", abort); this.abort = connection2.abort = abort; } + timingInfo.finalNetworkRequestStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability); }, - onHeaders(status, headersList, resume, statusText) { + onResponseStarted() { + timingInfo.finalNetworkResponseStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability); + }, + onHeaders(status, rawHeaders, resume, statusText) { if (status < 200) { return; } - let codings = []; let location = ""; - const headers2 = new Headers(); - if (Array.isArray(headersList)) { - for (let n = 0; n < headersList.length; n += 2) { - const key = headersList[n + 0].toString("latin1"); - const val = headersList[n + 1].toString("latin1"); - if (key.toLowerCase() === "content-encoding") { - codings = val.toLowerCase().split(",").map((x) => x.trim()); - } else if (key.toLowerCase() === "location") { - location = val; - } - headers2[kHeadersList].append(key, val); - } - } else { - const keys = Object.keys(headersList); - for (const key of keys) { - const val = headersList[key]; - if (key.toLowerCase() === "content-encoding") { - codings = val.toLowerCase().split(",").map((x) => x.trim()).reverse(); - } else if (key.toLowerCase() === "location") { - location = val; - } - headers2[kHeadersList].append(key, val); - } + const headersList = new HeadersList(); + for (let i = 0; i < rawHeaders.length; i += 2) { + headersList.append(bufferToLowerCasedHeaderName(rawHeaders[i]), rawHeaders[i + 1].toString("latin1"), true); } + location = headersList.get("location", true); this.body = new Readable({ read: resume }); const decoders = []; - const willFollow = request2.redirect === "follow" && location && redirectStatusSet.has(status); + const willFollow = location && request2.redirect === "follow" && redirectStatusSet.has(status); if (request2.method !== "HEAD" && request2.method !== "CONNECT" && !nullBodyStatus.includes(status) && !willFollow) { - for (const coding of codings) { + const contentEncoding = headersList.get("content-encoding", true); + const codings = contentEncoding ? contentEncoding.toLowerCase().split(",") : []; + const maxContentEncodings = 5; + if (codings.length > maxContentEncodings) { + reject(new Error(`too many content-encodings in response: ${codings.length}, maximum allowed is ${maxContentEncodings}`)); + return true; + } + for (let i = codings.length - 1; i >= 0; --i) { + const coding = codings[i].trim(); if (coding === "x-gzip" || coding === "gzip") { decoders.push(zlib.createGunzip({ // Be less strict when decoding compressed responses, since sometimes @@ -13935,22 +14495,31 @@ function requireFetch() { finishFlush: zlib.constants.Z_SYNC_FLUSH })); } else if (coding === "deflate") { - decoders.push(zlib.createInflate()); + decoders.push(createInflate({ + flush: zlib.constants.Z_SYNC_FLUSH, + finishFlush: zlib.constants.Z_SYNC_FLUSH + })); } else if (coding === "br") { - decoders.push(zlib.createBrotliDecompress()); + decoders.push(zlib.createBrotliDecompress({ + flush: zlib.constants.BROTLI_OPERATION_FLUSH, + finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH + })); } else { decoders.length = 0; break; } } } + const onError = this.onError.bind(this); resolve({ status, statusText, - headersList: headers2[kHeadersList], - body: decoders.length ? pipeline(this.body, ...decoders, () => { - }) : this.body.on("error", () => { - }) + headersList, + body: decoders.length ? pipeline(this.body, ...decoders, (err) => { + if (err) { + this.onError(err); + } + }).on("error", onError) : this.body.on("error", onError) }); return true; }, @@ -13966,6 +14535,9 @@ function requireFetch() { if (this.abort) { fetchParams.controller.off("terminated", this.abort); } + if (fetchParams.controller.onAborted) { + fetchParams.controller.off("terminated", fetchParams.controller.onAborted); + } fetchParams.controller.ended = true; this.body.push(null); }, @@ -13977,20 +14549,18 @@ function requireFetch() { fetchParams.controller.terminate(error); reject(error); }, - onUpgrade(status, headersList, socket) { + onUpgrade(status, rawHeaders, socket) { if (status !== 101) { return; } - const headers2 = new Headers(); - for (let n = 0; n < headersList.length; n += 2) { - const key = headersList[n + 0].toString("latin1"); - const val = headersList[n + 1].toString("latin1"); - headers2[kHeadersList].append(key, val); + const headersList = new HeadersList(); + for (let i = 0; i < rawHeaders.length; i += 2) { + headersList.append(bufferToLowerCasedHeaderName(rawHeaders[i]), rawHeaders[i + 1].toString("latin1"), true); } resolve({ status, statusText: STATUS_CODES[status], - headersList: headers2[kHeadersList], + headersList, socket }); return true; @@ -13999,20 +14569,20 @@ function requireFetch() { )); } } - fetch_1 = { + fetch_1$1 = { fetch, Fetch, fetching, finalizeAndReportTiming }; - return fetch_1; + return fetch_1$1; } -var symbols$2; -var hasRequiredSymbols$2; -function requireSymbols$2() { - if (hasRequiredSymbols$2) return symbols$2; - hasRequiredSymbols$2 = 1; - symbols$2 = { +var symbols$7; +var hasRequiredSymbols$7; +function requireSymbols$7() { + if (hasRequiredSymbols$7) return symbols$7; + hasRequiredSymbols$7 = 1; + symbols$7 = { kState: /* @__PURE__ */ Symbol("FileReader state"), kResult: /* @__PURE__ */ Symbol("FileReader result"), kError: /* @__PURE__ */ Symbol("FileReader error"), @@ -14020,18 +14590,18 @@ function requireSymbols$2() { kEvents: /* @__PURE__ */ Symbol("FileReader events"), kAborted: /* @__PURE__ */ Symbol("FileReader aborted") }; - return symbols$2; + return symbols$7; } -var progressevent; -var hasRequiredProgressevent; -function requireProgressevent() { - if (hasRequiredProgressevent) return progressevent; - hasRequiredProgressevent = 1; - const { webidl } = requireWebidl(); +var progressevent$1; +var hasRequiredProgressevent$1; +function requireProgressevent$1() { + if (hasRequiredProgressevent$1) return progressevent$1; + hasRequiredProgressevent$1 = 1; + const { webidl } = requireWebidl$1(); const kState = /* @__PURE__ */ Symbol("ProgressEvent state"); class ProgressEvent extends Event { constructor(type, eventInitDict = {}) { - type = webidl.converters.DOMString(type); + type = webidl.converters.DOMString(type, "ProgressEvent constructor", "type"); eventInitDict = webidl.converters.ProgressEventInit(eventInitDict ?? {}); super(type, eventInitDict); this[kState] = { @@ -14057,44 +14627,44 @@ function requireProgressevent() { { key: "lengthComputable", converter: webidl.converters.boolean, - defaultValue: false + defaultValue: () => false }, { key: "loaded", converter: webidl.converters["unsigned long long"], - defaultValue: 0 + defaultValue: () => 0 }, { key: "total", converter: webidl.converters["unsigned long long"], - defaultValue: 0 + defaultValue: () => 0 }, { key: "bubbles", converter: webidl.converters.boolean, - defaultValue: false + defaultValue: () => false }, { key: "cancelable", converter: webidl.converters.boolean, - defaultValue: false + defaultValue: () => false }, { key: "composed", converter: webidl.converters.boolean, - defaultValue: false + defaultValue: () => false } ]); - progressevent = { + progressevent$1 = { ProgressEvent }; - return progressevent; + return progressevent$1; } -var encoding; -var hasRequiredEncoding; -function requireEncoding() { - if (hasRequiredEncoding) return encoding; - hasRequiredEncoding = 1; +var encoding$1; +var hasRequiredEncoding$1; +function requireEncoding$1() { + if (hasRequiredEncoding$1) return encoding$1; + hasRequiredEncoding$1 = 1; function getEncoding(label) { if (!label) { return "failure"; @@ -14371,5539 +14941,23396 @@ function requireEncoding() { return "failure"; } } - encoding = { - getEncoding - }; - return encoding; + encoding$1 = { + getEncoding + }; + return encoding$1; +} +var util$b; +var hasRequiredUtil$b; +function requireUtil$b() { + if (hasRequiredUtil$b) return util$b; + hasRequiredUtil$b = 1; + const { + kState, + kError, + kResult, + kAborted, + kLastProgressEventFired + } = requireSymbols$7(); + const { ProgressEvent } = requireProgressevent$1(); + const { getEncoding } = requireEncoding$1(); + const { serializeAMimeType, parseMIMEType } = requireDataUrl(); + const { types } = require$$1$2; + const { StringDecoder } = require$$5$3; + const { btoa } = require$$0$3; + const staticPropertyDescriptors = { + enumerable: true, + writable: false, + configurable: false + }; + function readOperation(fr, blob, type, encodingName) { + if (fr[kState] === "loading") { + throw new DOMException("Invalid state", "InvalidStateError"); + } + fr[kState] = "loading"; + fr[kResult] = null; + fr[kError] = null; + const stream = blob.stream(); + const reader = stream.getReader(); + const bytes = []; + let chunkPromise = reader.read(); + let isFirstChunk = true; + (async () => { + while (!fr[kAborted]) { + try { + const { done, value } = await chunkPromise; + if (isFirstChunk && !fr[kAborted]) { + queueMicrotask(() => { + fireAProgressEvent("loadstart", fr); + }); + } + isFirstChunk = false; + if (!done && types.isUint8Array(value)) { + bytes.push(value); + if ((fr[kLastProgressEventFired] === void 0 || Date.now() - fr[kLastProgressEventFired] >= 50) && !fr[kAborted]) { + fr[kLastProgressEventFired] = Date.now(); + queueMicrotask(() => { + fireAProgressEvent("progress", fr); + }); + } + chunkPromise = reader.read(); + } else if (done) { + queueMicrotask(() => { + fr[kState] = "done"; + try { + const result = packageData(bytes, type, blob.type, encodingName); + if (fr[kAborted]) { + return; + } + fr[kResult] = result; + fireAProgressEvent("load", fr); + } catch (error) { + fr[kError] = error; + fireAProgressEvent("error", fr); + } + if (fr[kState] !== "loading") { + fireAProgressEvent("loadend", fr); + } + }); + break; + } + } catch (error) { + if (fr[kAborted]) { + return; + } + queueMicrotask(() => { + fr[kState] = "done"; + fr[kError] = error; + fireAProgressEvent("error", fr); + if (fr[kState] !== "loading") { + fireAProgressEvent("loadend", fr); + } + }); + break; + } + } + })(); + } + function fireAProgressEvent(e, reader) { + const event = new ProgressEvent(e, { + bubbles: false, + cancelable: false + }); + reader.dispatchEvent(event); + } + function packageData(bytes, type, mimeType, encodingName) { + switch (type) { + case "DataURL": { + let dataURL2 = "data:"; + const parsed = parseMIMEType(mimeType || "application/octet-stream"); + if (parsed !== "failure") { + dataURL2 += serializeAMimeType(parsed); + } + dataURL2 += ";base64,"; + const decoder = new StringDecoder("latin1"); + for (const chunk of bytes) { + dataURL2 += btoa(decoder.write(chunk)); + } + dataURL2 += btoa(decoder.end()); + return dataURL2; + } + case "Text": { + let encoding2 = "failure"; + if (encodingName) { + encoding2 = getEncoding(encodingName); + } + if (encoding2 === "failure" && mimeType) { + const type2 = parseMIMEType(mimeType); + if (type2 !== "failure") { + encoding2 = getEncoding(type2.parameters.get("charset")); + } + } + if (encoding2 === "failure") { + encoding2 = "UTF-8"; + } + return decode(bytes, encoding2); + } + case "ArrayBuffer": { + const sequence = combineByteSequences(bytes); + return sequence.buffer; + } + case "BinaryString": { + let binaryString = ""; + const decoder = new StringDecoder("latin1"); + for (const chunk of bytes) { + binaryString += decoder.write(chunk); + } + binaryString += decoder.end(); + return binaryString; + } + } + } + function decode(ioQueue, encoding2) { + const bytes = combineByteSequences(ioQueue); + const BOMEncoding = BOMSniffing(bytes); + let slice = 0; + if (BOMEncoding !== null) { + encoding2 = BOMEncoding; + slice = BOMEncoding === "UTF-8" ? 3 : 2; + } + const sliced = bytes.slice(slice); + return new TextDecoder(encoding2).decode(sliced); + } + function BOMSniffing(ioQueue) { + const [a, b, c] = ioQueue; + if (a === 239 && b === 187 && c === 191) { + return "UTF-8"; + } else if (a === 254 && b === 255) { + return "UTF-16BE"; + } else if (a === 255 && b === 254) { + return "UTF-16LE"; + } + return null; + } + function combineByteSequences(sequences) { + const size = sequences.reduce((a, b) => { + return a + b.byteLength; + }, 0); + let offset = 0; + return sequences.reduce((a, b) => { + a.set(b, offset); + offset += b.byteLength; + return a; + }, new Uint8Array(size)); + } + util$b = { + staticPropertyDescriptors, + readOperation, + fireAProgressEvent + }; + return util$b; +} +var filereader$1; +var hasRequiredFilereader$1; +function requireFilereader$1() { + if (hasRequiredFilereader$1) return filereader$1; + hasRequiredFilereader$1 = 1; + const { + staticPropertyDescriptors, + readOperation, + fireAProgressEvent + } = requireUtil$b(); + const { + kState, + kError, + kResult, + kEvents, + kAborted + } = requireSymbols$7(); + const { webidl } = requireWebidl$1(); + const { kEnumerableProperty } = requireUtil$e(); + class FileReader extends EventTarget { + constructor() { + super(); + this[kState] = "empty"; + this[kResult] = null; + this[kError] = null; + this[kEvents] = { + loadend: null, + error: null, + abort: null, + load: null, + progress: null, + loadstart: null + }; + } + /** + * @see https://w3c.github.io/FileAPI/#dfn-readAsArrayBuffer + * @param {import('buffer').Blob} blob + */ + readAsArrayBuffer(blob) { + webidl.brandCheck(this, FileReader); + webidl.argumentLengthCheck(arguments, 1, "FileReader.readAsArrayBuffer"); + blob = webidl.converters.Blob(blob, { strict: false }); + readOperation(this, blob, "ArrayBuffer"); + } + /** + * @see https://w3c.github.io/FileAPI/#readAsBinaryString + * @param {import('buffer').Blob} blob + */ + readAsBinaryString(blob) { + webidl.brandCheck(this, FileReader); + webidl.argumentLengthCheck(arguments, 1, "FileReader.readAsBinaryString"); + blob = webidl.converters.Blob(blob, { strict: false }); + readOperation(this, blob, "BinaryString"); + } + /** + * @see https://w3c.github.io/FileAPI/#readAsDataText + * @param {import('buffer').Blob} blob + * @param {string?} encoding + */ + readAsText(blob, encoding2 = void 0) { + webidl.brandCheck(this, FileReader); + webidl.argumentLengthCheck(arguments, 1, "FileReader.readAsText"); + blob = webidl.converters.Blob(blob, { strict: false }); + if (encoding2 !== void 0) { + encoding2 = webidl.converters.DOMString(encoding2, "FileReader.readAsText", "encoding"); + } + readOperation(this, blob, "Text", encoding2); + } + /** + * @see https://w3c.github.io/FileAPI/#dfn-readAsDataURL + * @param {import('buffer').Blob} blob + */ + readAsDataURL(blob) { + webidl.brandCheck(this, FileReader); + webidl.argumentLengthCheck(arguments, 1, "FileReader.readAsDataURL"); + blob = webidl.converters.Blob(blob, { strict: false }); + readOperation(this, blob, "DataURL"); + } + /** + * @see https://w3c.github.io/FileAPI/#dfn-abort + */ + abort() { + if (this[kState] === "empty" || this[kState] === "done") { + this[kResult] = null; + return; + } + if (this[kState] === "loading") { + this[kState] = "done"; + this[kResult] = null; + } + this[kAborted] = true; + fireAProgressEvent("abort", this); + if (this[kState] !== "loading") { + fireAProgressEvent("loadend", this); + } + } + /** + * @see https://w3c.github.io/FileAPI/#dom-filereader-readystate + */ + get readyState() { + webidl.brandCheck(this, FileReader); + switch (this[kState]) { + case "empty": + return this.EMPTY; + case "loading": + return this.LOADING; + case "done": + return this.DONE; + } + } + /** + * @see https://w3c.github.io/FileAPI/#dom-filereader-result + */ + get result() { + webidl.brandCheck(this, FileReader); + return this[kResult]; + } + /** + * @see https://w3c.github.io/FileAPI/#dom-filereader-error + */ + get error() { + webidl.brandCheck(this, FileReader); + return this[kError]; + } + get onloadend() { + webidl.brandCheck(this, FileReader); + return this[kEvents].loadend; + } + set onloadend(fn) { + webidl.brandCheck(this, FileReader); + if (this[kEvents].loadend) { + this.removeEventListener("loadend", this[kEvents].loadend); + } + if (typeof fn === "function") { + this[kEvents].loadend = fn; + this.addEventListener("loadend", fn); + } else { + this[kEvents].loadend = null; + } + } + get onerror() { + webidl.brandCheck(this, FileReader); + return this[kEvents].error; + } + set onerror(fn) { + webidl.brandCheck(this, FileReader); + if (this[kEvents].error) { + this.removeEventListener("error", this[kEvents].error); + } + if (typeof fn === "function") { + this[kEvents].error = fn; + this.addEventListener("error", fn); + } else { + this[kEvents].error = null; + } + } + get onloadstart() { + webidl.brandCheck(this, FileReader); + return this[kEvents].loadstart; + } + set onloadstart(fn) { + webidl.brandCheck(this, FileReader); + if (this[kEvents].loadstart) { + this.removeEventListener("loadstart", this[kEvents].loadstart); + } + if (typeof fn === "function") { + this[kEvents].loadstart = fn; + this.addEventListener("loadstart", fn); + } else { + this[kEvents].loadstart = null; + } + } + get onprogress() { + webidl.brandCheck(this, FileReader); + return this[kEvents].progress; + } + set onprogress(fn) { + webidl.brandCheck(this, FileReader); + if (this[kEvents].progress) { + this.removeEventListener("progress", this[kEvents].progress); + } + if (typeof fn === "function") { + this[kEvents].progress = fn; + this.addEventListener("progress", fn); + } else { + this[kEvents].progress = null; + } + } + get onload() { + webidl.brandCheck(this, FileReader); + return this[kEvents].load; + } + set onload(fn) { + webidl.brandCheck(this, FileReader); + if (this[kEvents].load) { + this.removeEventListener("load", this[kEvents].load); + } + if (typeof fn === "function") { + this[kEvents].load = fn; + this.addEventListener("load", fn); + } else { + this[kEvents].load = null; + } + } + get onabort() { + webidl.brandCheck(this, FileReader); + return this[kEvents].abort; + } + set onabort(fn) { + webidl.brandCheck(this, FileReader); + if (this[kEvents].abort) { + this.removeEventListener("abort", this[kEvents].abort); + } + if (typeof fn === "function") { + this[kEvents].abort = fn; + this.addEventListener("abort", fn); + } else { + this[kEvents].abort = null; + } + } + } + FileReader.EMPTY = FileReader.prototype.EMPTY = 0; + FileReader.LOADING = FileReader.prototype.LOADING = 1; + FileReader.DONE = FileReader.prototype.DONE = 2; + Object.defineProperties(FileReader.prototype, { + EMPTY: staticPropertyDescriptors, + LOADING: staticPropertyDescriptors, + DONE: staticPropertyDescriptors, + readAsArrayBuffer: kEnumerableProperty, + readAsBinaryString: kEnumerableProperty, + readAsText: kEnumerableProperty, + readAsDataURL: kEnumerableProperty, + abort: kEnumerableProperty, + readyState: kEnumerableProperty, + result: kEnumerableProperty, + error: kEnumerableProperty, + onloadstart: kEnumerableProperty, + onprogress: kEnumerableProperty, + onload: kEnumerableProperty, + onabort: kEnumerableProperty, + onerror: kEnumerableProperty, + onloadend: kEnumerableProperty, + [Symbol.toStringTag]: { + value: "FileReader", + writable: false, + enumerable: false, + configurable: true + } + }); + Object.defineProperties(FileReader, { + EMPTY: staticPropertyDescriptors, + LOADING: staticPropertyDescriptors, + DONE: staticPropertyDescriptors + }); + filereader$1 = { + FileReader + }; + return filereader$1; +} +var symbols$6; +var hasRequiredSymbols$6; +function requireSymbols$6() { + if (hasRequiredSymbols$6) return symbols$6; + hasRequiredSymbols$6 = 1; + symbols$6 = { + kConstruct: requireSymbols$9().kConstruct + }; + return symbols$6; +} +var util$a; +var hasRequiredUtil$a; +function requireUtil$a() { + if (hasRequiredUtil$a) return util$a; + hasRequiredUtil$a = 1; + const assert = require$$0$5; + const { URLSerializer } = requireDataUrl(); + const { isValidHeaderName } = requireUtil$d(); + function urlEquals(A, B, excludeFragment = false) { + const serializedA = URLSerializer(A, excludeFragment); + const serializedB = URLSerializer(B, excludeFragment); + return serializedA === serializedB; + } + function getFieldValues(header) { + assert(header !== null); + const values = []; + for (let value of header.split(",")) { + value = value.trim(); + if (isValidHeaderName(value)) { + values.push(value); + } + } + return values; + } + util$a = { + urlEquals, + getFieldValues + }; + return util$a; +} +var cache$1; +var hasRequiredCache$1; +function requireCache$1() { + if (hasRequiredCache$1) return cache$1; + hasRequiredCache$1 = 1; + const { kConstruct } = requireSymbols$6(); + const { urlEquals, getFieldValues } = requireUtil$a(); + const { kEnumerableProperty, isDisturbed } = requireUtil$e(); + const { webidl } = requireWebidl$1(); + const { Response, cloneResponse, fromInnerResponse } = requireResponse$1(); + const { Request, fromInnerRequest } = requireRequest$2(); + const { kState } = requireSymbols$8(); + const { fetching } = requireFetch$1(); + const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = requireUtil$d(); + const assert = require$$0$5; + class Cache { + /** + * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-request-response-list + * @type {requestResponseList} + */ + #relevantRequestResponseList; + constructor() { + if (arguments[0] !== kConstruct) { + webidl.illegalConstructor(); + } + webidl.util.markAsUncloneable(this); + this.#relevantRequestResponseList = arguments[1]; + } + async match(request2, options = {}) { + webidl.brandCheck(this, Cache); + const prefix = "Cache.match"; + webidl.argumentLengthCheck(arguments, 1, prefix); + request2 = webidl.converters.RequestInfo(request2, prefix, "request"); + options = webidl.converters.CacheQueryOptions(options, prefix, "options"); + const p = this.#internalMatchAll(request2, options, 1); + if (p.length === 0) { + return; + } + return p[0]; + } + async matchAll(request2 = void 0, options = {}) { + webidl.brandCheck(this, Cache); + const prefix = "Cache.matchAll"; + if (request2 !== void 0) request2 = webidl.converters.RequestInfo(request2, prefix, "request"); + options = webidl.converters.CacheQueryOptions(options, prefix, "options"); + return this.#internalMatchAll(request2, options); + } + async add(request2) { + webidl.brandCheck(this, Cache); + const prefix = "Cache.add"; + webidl.argumentLengthCheck(arguments, 1, prefix); + request2 = webidl.converters.RequestInfo(request2, prefix, "request"); + const requests = [request2]; + const responseArrayPromise = this.addAll(requests); + return await responseArrayPromise; + } + async addAll(requests) { + webidl.brandCheck(this, Cache); + const prefix = "Cache.addAll"; + webidl.argumentLengthCheck(arguments, 1, prefix); + const responsePromises = []; + const requestList = []; + for (let request2 of requests) { + if (request2 === void 0) { + throw webidl.errors.conversionFailed({ + prefix, + argument: "Argument 1", + types: ["undefined is not allowed"] + }); + } + request2 = webidl.converters.RequestInfo(request2); + if (typeof request2 === "string") { + continue; + } + const r = request2[kState]; + if (!urlIsHttpHttpsScheme(r.url) || r.method !== "GET") { + throw webidl.errors.exception({ + header: prefix, + message: "Expected http/s scheme when method is not GET." + }); + } + } + const fetchControllers = []; + for (const request2 of requests) { + const r = new Request(request2)[kState]; + if (!urlIsHttpHttpsScheme(r.url)) { + throw webidl.errors.exception({ + header: prefix, + message: "Expected http/s scheme." + }); + } + r.initiator = "fetch"; + r.destination = "subresource"; + requestList.push(r); + const responsePromise = createDeferredPromise(); + fetchControllers.push(fetching({ + request: r, + processResponse(response2) { + if (response2.type === "error" || response2.status === 206 || response2.status < 200 || response2.status > 299) { + responsePromise.reject(webidl.errors.exception({ + header: "Cache.addAll", + message: "Received an invalid status code or the request failed." + })); + } else if (response2.headersList.contains("vary")) { + const fieldValues = getFieldValues(response2.headersList.get("vary")); + for (const fieldValue of fieldValues) { + if (fieldValue === "*") { + responsePromise.reject(webidl.errors.exception({ + header: "Cache.addAll", + message: "invalid vary field value" + })); + for (const controller of fetchControllers) { + controller.abort(); + } + return; + } + } + } + }, + processResponseEndOfBody(response2) { + if (response2.aborted) { + responsePromise.reject(new DOMException("aborted", "AbortError")); + return; + } + responsePromise.resolve(response2); + } + })); + responsePromises.push(responsePromise.promise); + } + const p = Promise.all(responsePromises); + const responses = await p; + const operations = []; + let index = 0; + for (const response2 of responses) { + const operation = { + type: "put", + // 7.3.2 + request: requestList[index], + // 7.3.3 + response: response2 + // 7.3.4 + }; + operations.push(operation); + index++; + } + const cacheJobPromise = createDeferredPromise(); + let errorData = null; + try { + this.#batchCacheOperations(operations); + } catch (e) { + errorData = e; + } + queueMicrotask(() => { + if (errorData === null) { + cacheJobPromise.resolve(void 0); + } else { + cacheJobPromise.reject(errorData); + } + }); + return cacheJobPromise.promise; + } + async put(request2, response2) { + webidl.brandCheck(this, Cache); + const prefix = "Cache.put"; + webidl.argumentLengthCheck(arguments, 2, prefix); + request2 = webidl.converters.RequestInfo(request2, prefix, "request"); + response2 = webidl.converters.Response(response2, prefix, "response"); + let innerRequest = null; + if (request2 instanceof Request) { + innerRequest = request2[kState]; + } else { + innerRequest = new Request(request2)[kState]; + } + if (!urlIsHttpHttpsScheme(innerRequest.url) || innerRequest.method !== "GET") { + throw webidl.errors.exception({ + header: prefix, + message: "Expected an http/s scheme when method is not GET" + }); + } + const innerResponse = response2[kState]; + if (innerResponse.status === 206) { + throw webidl.errors.exception({ + header: prefix, + message: "Got 206 status" + }); + } + if (innerResponse.headersList.contains("vary")) { + const fieldValues = getFieldValues(innerResponse.headersList.get("vary")); + for (const fieldValue of fieldValues) { + if (fieldValue === "*") { + throw webidl.errors.exception({ + header: prefix, + message: "Got * vary field value" + }); + } + } + } + if (innerResponse.body && (isDisturbed(innerResponse.body.stream) || innerResponse.body.stream.locked)) { + throw webidl.errors.exception({ + header: prefix, + message: "Response body is locked or disturbed" + }); + } + const clonedResponse = cloneResponse(innerResponse); + const bodyReadPromise = createDeferredPromise(); + if (innerResponse.body != null) { + const stream = innerResponse.body.stream; + const reader = stream.getReader(); + readAllBytes(reader).then(bodyReadPromise.resolve, bodyReadPromise.reject); + } else { + bodyReadPromise.resolve(void 0); + } + const operations = []; + const operation = { + type: "put", + // 14. + request: innerRequest, + // 15. + response: clonedResponse + // 16. + }; + operations.push(operation); + const bytes = await bodyReadPromise.promise; + if (clonedResponse.body != null) { + clonedResponse.body.source = bytes; + } + const cacheJobPromise = createDeferredPromise(); + let errorData = null; + try { + this.#batchCacheOperations(operations); + } catch (e) { + errorData = e; + } + queueMicrotask(() => { + if (errorData === null) { + cacheJobPromise.resolve(); + } else { + cacheJobPromise.reject(errorData); + } + }); + return cacheJobPromise.promise; + } + async delete(request2, options = {}) { + webidl.brandCheck(this, Cache); + const prefix = "Cache.delete"; + webidl.argumentLengthCheck(arguments, 1, prefix); + request2 = webidl.converters.RequestInfo(request2, prefix, "request"); + options = webidl.converters.CacheQueryOptions(options, prefix, "options"); + let r = null; + if (request2 instanceof Request) { + r = request2[kState]; + if (r.method !== "GET" && !options.ignoreMethod) { + return false; + } + } else { + assert(typeof request2 === "string"); + r = new Request(request2)[kState]; + } + const operations = []; + const operation = { + type: "delete", + request: r, + options + }; + operations.push(operation); + const cacheJobPromise = createDeferredPromise(); + let errorData = null; + let requestResponses; + try { + requestResponses = this.#batchCacheOperations(operations); + } catch (e) { + errorData = e; + } + queueMicrotask(() => { + if (errorData === null) { + cacheJobPromise.resolve(!!requestResponses?.length); + } else { + cacheJobPromise.reject(errorData); + } + }); + return cacheJobPromise.promise; + } + /** + * @see https://w3c.github.io/ServiceWorker/#dom-cache-keys + * @param {any} request + * @param {import('../../types/cache').CacheQueryOptions} options + * @returns {Promise} + */ + async keys(request2 = void 0, options = {}) { + webidl.brandCheck(this, Cache); + const prefix = "Cache.keys"; + if (request2 !== void 0) request2 = webidl.converters.RequestInfo(request2, prefix, "request"); + options = webidl.converters.CacheQueryOptions(options, prefix, "options"); + let r = null; + if (request2 !== void 0) { + if (request2 instanceof Request) { + r = request2[kState]; + if (r.method !== "GET" && !options.ignoreMethod) { + return []; + } + } else if (typeof request2 === "string") { + r = new Request(request2)[kState]; + } + } + const promise = createDeferredPromise(); + const requests = []; + if (request2 === void 0) { + for (const requestResponse of this.#relevantRequestResponseList) { + requests.push(requestResponse[0]); + } + } else { + const requestResponses = this.#queryCache(r, options); + for (const requestResponse of requestResponses) { + requests.push(requestResponse[0]); + } + } + queueMicrotask(() => { + const requestList = []; + for (const request3 of requests) { + const requestObject = fromInnerRequest( + request3, + new AbortController().signal, + "immutable" + ); + requestList.push(requestObject); + } + promise.resolve(Object.freeze(requestList)); + }); + return promise.promise; + } + /** + * @see https://w3c.github.io/ServiceWorker/#batch-cache-operations-algorithm + * @param {CacheBatchOperation[]} operations + * @returns {requestResponseList} + */ + #batchCacheOperations(operations) { + const cache2 = this.#relevantRequestResponseList; + const backupCache = [...cache2]; + const addedItems = []; + const resultList = []; + try { + for (const operation of operations) { + if (operation.type !== "delete" && operation.type !== "put") { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: 'operation type does not match "delete" or "put"' + }); + } + if (operation.type === "delete" && operation.response != null) { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: "delete operation should not have an associated response" + }); + } + if (this.#queryCache(operation.request, operation.options, addedItems).length) { + throw new DOMException("???", "InvalidStateError"); + } + let requestResponses; + if (operation.type === "delete") { + requestResponses = this.#queryCache(operation.request, operation.options); + if (requestResponses.length === 0) { + return []; + } + for (const requestResponse of requestResponses) { + const idx = cache2.indexOf(requestResponse); + assert(idx !== -1); + cache2.splice(idx, 1); + } + } else if (operation.type === "put") { + if (operation.response == null) { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: "put operation should have an associated response" + }); + } + const r = operation.request; + if (!urlIsHttpHttpsScheme(r.url)) { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: "expected http or https scheme" + }); + } + if (r.method !== "GET") { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: "not get method" + }); + } + if (operation.options != null) { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: "options must not be defined" + }); + } + requestResponses = this.#queryCache(operation.request); + for (const requestResponse of requestResponses) { + const idx = cache2.indexOf(requestResponse); + assert(idx !== -1); + cache2.splice(idx, 1); + } + cache2.push([operation.request, operation.response]); + addedItems.push([operation.request, operation.response]); + } + resultList.push([operation.request, operation.response]); + } + return resultList; + } catch (e) { + this.#relevantRequestResponseList.length = 0; + this.#relevantRequestResponseList = backupCache; + throw e; + } + } + /** + * @see https://w3c.github.io/ServiceWorker/#query-cache + * @param {any} requestQuery + * @param {import('../../types/cache').CacheQueryOptions} options + * @param {requestResponseList} targetStorage + * @returns {requestResponseList} + */ + #queryCache(requestQuery, options, targetStorage) { + const resultList = []; + const storage = targetStorage ?? this.#relevantRequestResponseList; + for (const requestResponse of storage) { + const [cachedRequest, cachedResponse] = requestResponse; + if (this.#requestMatchesCachedItem(requestQuery, cachedRequest, cachedResponse, options)) { + resultList.push(requestResponse); + } + } + return resultList; + } + /** + * @see https://w3c.github.io/ServiceWorker/#request-matches-cached-item-algorithm + * @param {any} requestQuery + * @param {any} request + * @param {any | null} response + * @param {import('../../types/cache').CacheQueryOptions | undefined} options + * @returns {boolean} + */ + #requestMatchesCachedItem(requestQuery, request2, response2 = null, options) { + const queryURL = new URL(requestQuery.url); + const cachedURL = new URL(request2.url); + if (options?.ignoreSearch) { + cachedURL.search = ""; + queryURL.search = ""; + } + if (!urlEquals(queryURL, cachedURL, true)) { + return false; + } + if (response2 == null || options?.ignoreVary || !response2.headersList.contains("vary")) { + return true; + } + const fieldValues = getFieldValues(response2.headersList.get("vary")); + for (const fieldValue of fieldValues) { + if (fieldValue === "*") { + return false; + } + const requestValue = request2.headersList.get(fieldValue); + const queryValue = requestQuery.headersList.get(fieldValue); + if (requestValue !== queryValue) { + return false; + } + } + return true; + } + #internalMatchAll(request2, options, maxResponses = Infinity) { + let r = null; + if (request2 !== void 0) { + if (request2 instanceof Request) { + r = request2[kState]; + if (r.method !== "GET" && !options.ignoreMethod) { + return []; + } + } else if (typeof request2 === "string") { + r = new Request(request2)[kState]; + } + } + const responses = []; + if (request2 === void 0) { + for (const requestResponse of this.#relevantRequestResponseList) { + responses.push(requestResponse[1]); + } + } else { + const requestResponses = this.#queryCache(r, options); + for (const requestResponse of requestResponses) { + responses.push(requestResponse[1]); + } + } + const responseList = []; + for (const response2 of responses) { + const responseObject = fromInnerResponse(response2, "immutable"); + responseList.push(responseObject.clone()); + if (responseList.length >= maxResponses) { + break; + } + } + return Object.freeze(responseList); + } + } + Object.defineProperties(Cache.prototype, { + [Symbol.toStringTag]: { + value: "Cache", + configurable: true + }, + match: kEnumerableProperty, + matchAll: kEnumerableProperty, + add: kEnumerableProperty, + addAll: kEnumerableProperty, + put: kEnumerableProperty, + delete: kEnumerableProperty, + keys: kEnumerableProperty + }); + const cacheQueryOptionConverters = [ + { + key: "ignoreSearch", + converter: webidl.converters.boolean, + defaultValue: () => false + }, + { + key: "ignoreMethod", + converter: webidl.converters.boolean, + defaultValue: () => false + }, + { + key: "ignoreVary", + converter: webidl.converters.boolean, + defaultValue: () => false + } + ]; + webidl.converters.CacheQueryOptions = webidl.dictionaryConverter(cacheQueryOptionConverters); + webidl.converters.MultiCacheQueryOptions = webidl.dictionaryConverter([ + ...cacheQueryOptionConverters, + { + key: "cacheName", + converter: webidl.converters.DOMString + } + ]); + webidl.converters.Response = webidl.interfaceConverter(Response); + webidl.converters["sequence"] = webidl.sequenceConverter( + webidl.converters.RequestInfo + ); + cache$1 = { + Cache + }; + return cache$1; +} +var cachestorage$1; +var hasRequiredCachestorage$1; +function requireCachestorage$1() { + if (hasRequiredCachestorage$1) return cachestorage$1; + hasRequiredCachestorage$1 = 1; + const { kConstruct } = requireSymbols$6(); + const { Cache } = requireCache$1(); + const { webidl } = requireWebidl$1(); + const { kEnumerableProperty } = requireUtil$e(); + class CacheStorage { + /** + * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-name-to-cache-map + * @type {Map} + */ + async has(cacheName) { + webidl.brandCheck(this, CacheStorage); + const prefix = "CacheStorage.has"; + webidl.argumentLengthCheck(arguments, 1, prefix); + cacheName = webidl.converters.DOMString(cacheName, prefix, "cacheName"); + return this.#caches.has(cacheName); + } + /** + * @see https://w3c.github.io/ServiceWorker/#dom-cachestorage-open + * @param {string} cacheName + * @returns {Promise} + */ + async open(cacheName) { + webidl.brandCheck(this, CacheStorage); + const prefix = "CacheStorage.open"; + webidl.argumentLengthCheck(arguments, 1, prefix); + cacheName = webidl.converters.DOMString(cacheName, prefix, "cacheName"); + if (this.#caches.has(cacheName)) { + const cache3 = this.#caches.get(cacheName); + return new Cache(kConstruct, cache3); + } + const cache2 = []; + this.#caches.set(cacheName, cache2); + return new Cache(kConstruct, cache2); + } + /** + * @see https://w3c.github.io/ServiceWorker/#cache-storage-delete + * @param {string} cacheName + * @returns {Promise} + */ + async delete(cacheName) { + webidl.brandCheck(this, CacheStorage); + const prefix = "CacheStorage.delete"; + webidl.argumentLengthCheck(arguments, 1, prefix); + cacheName = webidl.converters.DOMString(cacheName, prefix, "cacheName"); + return this.#caches.delete(cacheName); + } + /** + * @see https://w3c.github.io/ServiceWorker/#cache-storage-keys + * @returns {Promise} + */ + async keys() { + webidl.brandCheck(this, CacheStorage); + const keys = this.#caches.keys(); + return [...keys]; + } + } + Object.defineProperties(CacheStorage.prototype, { + [Symbol.toStringTag]: { + value: "CacheStorage", + configurable: true + }, + match: kEnumerableProperty, + has: kEnumerableProperty, + open: kEnumerableProperty, + delete: kEnumerableProperty, + keys: kEnumerableProperty + }); + cachestorage$1 = { + CacheStorage + }; + return cachestorage$1; +} +var constants$6; +var hasRequiredConstants$6; +function requireConstants$6() { + if (hasRequiredConstants$6) return constants$6; + hasRequiredConstants$6 = 1; + const maxAttributeValueSize = 1024; + const maxNameValuePairSize = 4096; + constants$6 = { + maxAttributeValueSize, + maxNameValuePairSize + }; + return constants$6; +} +var util$9; +var hasRequiredUtil$9; +function requireUtil$9() { + if (hasRequiredUtil$9) return util$9; + hasRequiredUtil$9 = 1; + function isCTLExcludingHtab(value) { + for (let i = 0; i < value.length; ++i) { + const code = value.charCodeAt(i); + if (code >= 0 && code <= 8 || code >= 10 && code <= 31 || code === 127) { + return true; + } + } + return false; + } + function validateCookieName(name) { + for (let i = 0; i < name.length; ++i) { + const code = name.charCodeAt(i); + if (code < 33 || // exclude CTLs (0-31), SP and HT + code > 126 || // exclude non-ascii and DEL + code === 34 || // " + code === 40 || // ( + code === 41 || // ) + code === 60 || // < + code === 62 || // > + code === 64 || // @ + code === 44 || // , + code === 59 || // ; + code === 58 || // : + code === 92 || // \ + code === 47 || // / + code === 91 || // [ + code === 93 || // ] + code === 63 || // ? + code === 61 || // = + code === 123 || // { + code === 125) { + throw new Error("Invalid cookie name"); + } + } + } + function validateCookieValue(value) { + let len = value.length; + let i = 0; + if (value[0] === '"') { + if (len === 1 || value[len - 1] !== '"') { + throw new Error("Invalid cookie value"); + } + --len; + ++i; + } + while (i < len) { + const code = value.charCodeAt(i++); + if (code < 33 || // exclude CTLs (0-31) + code > 126 || // non-ascii and DEL (127) + code === 34 || // " + code === 44 || // , + code === 59 || // ; + code === 92) { + throw new Error("Invalid cookie value"); + } + } + } + function validateCookiePath(path) { + for (let i = 0; i < path.length; ++i) { + const code = path.charCodeAt(i); + if (code < 32 || // exclude CTLs (0-31) + code === 127 || // DEL + code === 59) { + throw new Error("Invalid cookie path"); + } + } + } + function validateCookieDomain(domain) { + if (domain.startsWith("-") || domain.endsWith(".") || domain.endsWith("-")) { + throw new Error("Invalid cookie domain"); + } + } + const IMFDays = [ + "Sun", + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat" + ]; + const IMFMonths = [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" + ]; + const IMFPaddedNumbers = Array(61).fill(0).map((_, i) => i.toString().padStart(2, "0")); + function toIMFDate(date) { + if (typeof date === "number") { + date = new Date(date); + } + return `${IMFDays[date.getUTCDay()]}, ${IMFPaddedNumbers[date.getUTCDate()]} ${IMFMonths[date.getUTCMonth()]} ${date.getUTCFullYear()} ${IMFPaddedNumbers[date.getUTCHours()]}:${IMFPaddedNumbers[date.getUTCMinutes()]}:${IMFPaddedNumbers[date.getUTCSeconds()]} GMT`; + } + function validateCookieMaxAge(maxAge) { + if (maxAge < 0) { + throw new Error("Invalid cookie max-age"); + } + } + function stringify(cookie) { + if (cookie.name.length === 0) { + return null; + } + validateCookieName(cookie.name); + validateCookieValue(cookie.value); + const out = [`${cookie.name}=${cookie.value}`]; + if (cookie.name.startsWith("__Secure-")) { + cookie.secure = true; + } + if (cookie.name.startsWith("__Host-")) { + cookie.secure = true; + cookie.domain = null; + cookie.path = "/"; + } + if (cookie.secure) { + out.push("Secure"); + } + if (cookie.httpOnly) { + out.push("HttpOnly"); + } + if (typeof cookie.maxAge === "number") { + validateCookieMaxAge(cookie.maxAge); + out.push(`Max-Age=${cookie.maxAge}`); + } + if (cookie.domain) { + validateCookieDomain(cookie.domain); + out.push(`Domain=${cookie.domain}`); + } + if (cookie.path) { + validateCookiePath(cookie.path); + out.push(`Path=${cookie.path}`); + } + if (cookie.expires && cookie.expires.toString() !== "Invalid Date") { + out.push(`Expires=${toIMFDate(cookie.expires)}`); + } + if (cookie.sameSite) { + out.push(`SameSite=${cookie.sameSite}`); + } + for (const part of cookie.unparsed) { + if (!part.includes("=")) { + throw new Error("Invalid unparsed"); + } + const [key, ...value] = part.split("="); + out.push(`${key.trim()}=${value.join("=")}`); + } + return out.join("; "); + } + util$9 = { + isCTLExcludingHtab, + validateCookieName, + validateCookiePath, + validateCookieValue, + toIMFDate, + stringify + }; + return util$9; +} +var parse$2; +var hasRequiredParse$1; +function requireParse$1() { + if (hasRequiredParse$1) return parse$2; + hasRequiredParse$1 = 1; + const { maxNameValuePairSize, maxAttributeValueSize } = requireConstants$6(); + const { isCTLExcludingHtab } = requireUtil$9(); + const { collectASequenceOfCodePointsFast } = requireDataUrl(); + const assert = require$$0$5; + function parseSetCookie(header) { + if (isCTLExcludingHtab(header)) { + return null; + } + let nameValuePair = ""; + let unparsedAttributes = ""; + let name = ""; + let value = ""; + if (header.includes(";")) { + const position = { position: 0 }; + nameValuePair = collectASequenceOfCodePointsFast(";", header, position); + unparsedAttributes = header.slice(position.position); + } else { + nameValuePair = header; + } + if (!nameValuePair.includes("=")) { + value = nameValuePair; + } else { + const position = { position: 0 }; + name = collectASequenceOfCodePointsFast( + "=", + nameValuePair, + position + ); + value = nameValuePair.slice(position.position + 1); + } + name = name.trim(); + value = value.trim(); + if (name.length + value.length > maxNameValuePairSize) { + return null; + } + return { + name, + value, + ...parseUnparsedAttributes(unparsedAttributes) + }; + } + function parseUnparsedAttributes(unparsedAttributes, cookieAttributeList = {}) { + if (unparsedAttributes.length === 0) { + return cookieAttributeList; + } + assert(unparsedAttributes[0] === ";"); + unparsedAttributes = unparsedAttributes.slice(1); + let cookieAv = ""; + if (unparsedAttributes.includes(";")) { + cookieAv = collectASequenceOfCodePointsFast( + ";", + unparsedAttributes, + { position: 0 } + ); + unparsedAttributes = unparsedAttributes.slice(cookieAv.length); + } else { + cookieAv = unparsedAttributes; + unparsedAttributes = ""; + } + let attributeName = ""; + let attributeValue = ""; + if (cookieAv.includes("=")) { + const position = { position: 0 }; + attributeName = collectASequenceOfCodePointsFast( + "=", + cookieAv, + position + ); + attributeValue = cookieAv.slice(position.position + 1); + } else { + attributeName = cookieAv; + } + attributeName = attributeName.trim(); + attributeValue = attributeValue.trim(); + if (attributeValue.length > maxAttributeValueSize) { + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); + } + const attributeNameLowercase = attributeName.toLowerCase(); + if (attributeNameLowercase === "expires") { + const expiryTime = new Date(attributeValue); + cookieAttributeList.expires = expiryTime; + } else if (attributeNameLowercase === "max-age") { + const charCode = attributeValue.charCodeAt(0); + if ((charCode < 48 || charCode > 57) && attributeValue[0] !== "-") { + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); + } + if (!/^\d+$/.test(attributeValue)) { + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); + } + const deltaSeconds = Number(attributeValue); + cookieAttributeList.maxAge = deltaSeconds; + } else if (attributeNameLowercase === "domain") { + let cookieDomain = attributeValue; + if (cookieDomain[0] === ".") { + cookieDomain = cookieDomain.slice(1); + } + cookieDomain = cookieDomain.toLowerCase(); + cookieAttributeList.domain = cookieDomain; + } else if (attributeNameLowercase === "path") { + let cookiePath = ""; + if (attributeValue.length === 0 || attributeValue[0] !== "/") { + cookiePath = "/"; + } else { + cookiePath = attributeValue; + } + cookieAttributeList.path = cookiePath; + } else if (attributeNameLowercase === "secure") { + cookieAttributeList.secure = true; + } else if (attributeNameLowercase === "httponly") { + cookieAttributeList.httpOnly = true; + } else if (attributeNameLowercase === "samesite") { + let enforcement = "Default"; + const attributeValueLowercase = attributeValue.toLowerCase(); + if (attributeValueLowercase.includes("none")) { + enforcement = "None"; + } + if (attributeValueLowercase.includes("strict")) { + enforcement = "Strict"; + } + if (attributeValueLowercase.includes("lax")) { + enforcement = "Lax"; + } + cookieAttributeList.sameSite = enforcement; + } else { + cookieAttributeList.unparsed ??= []; + cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`); + } + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); + } + parse$2 = { + parseSetCookie, + parseUnparsedAttributes + }; + return parse$2; +} +var cookies$1; +var hasRequiredCookies$1; +function requireCookies$1() { + if (hasRequiredCookies$1) return cookies$1; + hasRequiredCookies$1 = 1; + const { parseSetCookie } = requireParse$1(); + const { stringify } = requireUtil$9(); + const { webidl } = requireWebidl$1(); + const { Headers } = requireHeaders$1(); + function getCookies(headers2) { + webidl.argumentLengthCheck(arguments, 1, "getCookies"); + webidl.brandCheck(headers2, Headers, { strict: false }); + const cookie = headers2.get("cookie"); + const out = {}; + if (!cookie) { + return out; + } + for (const piece of cookie.split(";")) { + const [name, ...value] = piece.split("="); + out[name.trim()] = value.join("="); + } + return out; + } + function deleteCookie(headers2, name, attributes) { + webidl.brandCheck(headers2, Headers, { strict: false }); + const prefix = "deleteCookie"; + webidl.argumentLengthCheck(arguments, 2, prefix); + name = webidl.converters.DOMString(name, prefix, "name"); + attributes = webidl.converters.DeleteCookieAttributes(attributes); + setCookie(headers2, { + name, + value: "", + expires: /* @__PURE__ */ new Date(0), + ...attributes + }); + } + function getSetCookies(headers2) { + webidl.argumentLengthCheck(arguments, 1, "getSetCookies"); + webidl.brandCheck(headers2, Headers, { strict: false }); + const cookies2 = headers2.getSetCookie(); + if (!cookies2) { + return []; + } + return cookies2.map((pair) => parseSetCookie(pair)); + } + function setCookie(headers2, cookie) { + webidl.argumentLengthCheck(arguments, 2, "setCookie"); + webidl.brandCheck(headers2, Headers, { strict: false }); + cookie = webidl.converters.Cookie(cookie); + const str = stringify(cookie); + if (str) { + headers2.append("Set-Cookie", str); + } + } + webidl.converters.DeleteCookieAttributes = webidl.dictionaryConverter([ + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: "path", + defaultValue: () => null + }, + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: "domain", + defaultValue: () => null + } + ]); + webidl.converters.Cookie = webidl.dictionaryConverter([ + { + converter: webidl.converters.DOMString, + key: "name" + }, + { + converter: webidl.converters.DOMString, + key: "value" + }, + { + converter: webidl.nullableConverter((value) => { + if (typeof value === "number") { + return webidl.converters["unsigned long long"](value); + } + return new Date(value); + }), + key: "expires", + defaultValue: () => null + }, + { + converter: webidl.nullableConverter(webidl.converters["long long"]), + key: "maxAge", + defaultValue: () => null + }, + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: "domain", + defaultValue: () => null + }, + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: "path", + defaultValue: () => null + }, + { + converter: webidl.nullableConverter(webidl.converters.boolean), + key: "secure", + defaultValue: () => null + }, + { + converter: webidl.nullableConverter(webidl.converters.boolean), + key: "httpOnly", + defaultValue: () => null + }, + { + converter: webidl.converters.USVString, + key: "sameSite", + allowedValues: ["Strict", "Lax", "None"] + }, + { + converter: webidl.sequenceConverter(webidl.converters.DOMString), + key: "unparsed", + defaultValue: () => new Array(0) + } + ]); + cookies$1 = { + getCookies, + deleteCookie, + getSetCookies, + setCookie + }; + return cookies$1; +} +var events$1; +var hasRequiredEvents$1; +function requireEvents$1() { + if (hasRequiredEvents$1) return events$1; + hasRequiredEvents$1 = 1; + const { webidl } = requireWebidl$1(); + const { kEnumerableProperty } = requireUtil$e(); + const { kConstruct } = requireSymbols$9(); + const { MessagePort } = require$$1$3; + class MessageEvent extends Event { + #eventInit; + constructor(type, eventInitDict = {}) { + if (type === kConstruct) { + super(arguments[1], arguments[2]); + webidl.util.markAsUncloneable(this); + return; + } + const prefix = "MessageEvent constructor"; + webidl.argumentLengthCheck(arguments, 1, prefix); + type = webidl.converters.DOMString(type, prefix, "type"); + eventInitDict = webidl.converters.MessageEventInit(eventInitDict, prefix, "eventInitDict"); + super(type, eventInitDict); + this.#eventInit = eventInitDict; + webidl.util.markAsUncloneable(this); + } + get data() { + webidl.brandCheck(this, MessageEvent); + return this.#eventInit.data; + } + get origin() { + webidl.brandCheck(this, MessageEvent); + return this.#eventInit.origin; + } + get lastEventId() { + webidl.brandCheck(this, MessageEvent); + return this.#eventInit.lastEventId; + } + get source() { + webidl.brandCheck(this, MessageEvent); + return this.#eventInit.source; + } + get ports() { + webidl.brandCheck(this, MessageEvent); + if (!Object.isFrozen(this.#eventInit.ports)) { + Object.freeze(this.#eventInit.ports); + } + return this.#eventInit.ports; + } + initMessageEvent(type, bubbles = false, cancelable = false, data = null, origin = "", lastEventId = "", source = null, ports = []) { + webidl.brandCheck(this, MessageEvent); + webidl.argumentLengthCheck(arguments, 1, "MessageEvent.initMessageEvent"); + return new MessageEvent(type, { + bubbles, + cancelable, + data, + origin, + lastEventId, + source, + ports + }); + } + static createFastMessageEvent(type, init) { + const messageEvent = new MessageEvent(kConstruct, type, init); + messageEvent.#eventInit = init; + messageEvent.#eventInit.data ??= null; + messageEvent.#eventInit.origin ??= ""; + messageEvent.#eventInit.lastEventId ??= ""; + messageEvent.#eventInit.source ??= null; + messageEvent.#eventInit.ports ??= []; + return messageEvent; + } + } + const { createFastMessageEvent } = MessageEvent; + delete MessageEvent.createFastMessageEvent; + class CloseEvent extends Event { + #eventInit; + constructor(type, eventInitDict = {}) { + const prefix = "CloseEvent constructor"; + webidl.argumentLengthCheck(arguments, 1, prefix); + type = webidl.converters.DOMString(type, prefix, "type"); + eventInitDict = webidl.converters.CloseEventInit(eventInitDict); + super(type, eventInitDict); + this.#eventInit = eventInitDict; + webidl.util.markAsUncloneable(this); + } + get wasClean() { + webidl.brandCheck(this, CloseEvent); + return this.#eventInit.wasClean; + } + get code() { + webidl.brandCheck(this, CloseEvent); + return this.#eventInit.code; + } + get reason() { + webidl.brandCheck(this, CloseEvent); + return this.#eventInit.reason; + } + } + class ErrorEvent extends Event { + #eventInit; + constructor(type, eventInitDict) { + const prefix = "ErrorEvent constructor"; + webidl.argumentLengthCheck(arguments, 1, prefix); + super(type, eventInitDict); + webidl.util.markAsUncloneable(this); + type = webidl.converters.DOMString(type, prefix, "type"); + eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {}); + this.#eventInit = eventInitDict; + } + get message() { + webidl.brandCheck(this, ErrorEvent); + return this.#eventInit.message; + } + get filename() { + webidl.brandCheck(this, ErrorEvent); + return this.#eventInit.filename; + } + get lineno() { + webidl.brandCheck(this, ErrorEvent); + return this.#eventInit.lineno; + } + get colno() { + webidl.brandCheck(this, ErrorEvent); + return this.#eventInit.colno; + } + get error() { + webidl.brandCheck(this, ErrorEvent); + return this.#eventInit.error; + } + } + Object.defineProperties(MessageEvent.prototype, { + [Symbol.toStringTag]: { + value: "MessageEvent", + configurable: true + }, + data: kEnumerableProperty, + origin: kEnumerableProperty, + lastEventId: kEnumerableProperty, + source: kEnumerableProperty, + ports: kEnumerableProperty, + initMessageEvent: kEnumerableProperty + }); + Object.defineProperties(CloseEvent.prototype, { + [Symbol.toStringTag]: { + value: "CloseEvent", + configurable: true + }, + reason: kEnumerableProperty, + code: kEnumerableProperty, + wasClean: kEnumerableProperty + }); + Object.defineProperties(ErrorEvent.prototype, { + [Symbol.toStringTag]: { + value: "ErrorEvent", + configurable: true + }, + message: kEnumerableProperty, + filename: kEnumerableProperty, + lineno: kEnumerableProperty, + colno: kEnumerableProperty, + error: kEnumerableProperty + }); + webidl.converters.MessagePort = webidl.interfaceConverter(MessagePort); + webidl.converters["sequence"] = webidl.sequenceConverter( + webidl.converters.MessagePort + ); + const eventInit = [ + { + key: "bubbles", + converter: webidl.converters.boolean, + defaultValue: () => false + }, + { + key: "cancelable", + converter: webidl.converters.boolean, + defaultValue: () => false + }, + { + key: "composed", + converter: webidl.converters.boolean, + defaultValue: () => false + } + ]; + webidl.converters.MessageEventInit = webidl.dictionaryConverter([ + ...eventInit, + { + key: "data", + converter: webidl.converters.any, + defaultValue: () => null + }, + { + key: "origin", + converter: webidl.converters.USVString, + defaultValue: () => "" + }, + { + key: "lastEventId", + converter: webidl.converters.DOMString, + defaultValue: () => "" + }, + { + key: "source", + // Node doesn't implement WindowProxy or ServiceWorker, so the only + // valid value for source is a MessagePort. + converter: webidl.nullableConverter(webidl.converters.MessagePort), + defaultValue: () => null + }, + { + key: "ports", + converter: webidl.converters["sequence"], + defaultValue: () => new Array(0) + } + ]); + webidl.converters.CloseEventInit = webidl.dictionaryConverter([ + ...eventInit, + { + key: "wasClean", + converter: webidl.converters.boolean, + defaultValue: () => false + }, + { + key: "code", + converter: webidl.converters["unsigned short"], + defaultValue: () => 0 + }, + { + key: "reason", + converter: webidl.converters.USVString, + defaultValue: () => "" + } + ]); + webidl.converters.ErrorEventInit = webidl.dictionaryConverter([ + ...eventInit, + { + key: "message", + converter: webidl.converters.DOMString, + defaultValue: () => "" + }, + { + key: "filename", + converter: webidl.converters.USVString, + defaultValue: () => "" + }, + { + key: "lineno", + converter: webidl.converters["unsigned long"], + defaultValue: () => 0 + }, + { + key: "colno", + converter: webidl.converters["unsigned long"], + defaultValue: () => 0 + }, + { + key: "error", + converter: webidl.converters.any + } + ]); + events$1 = { + MessageEvent, + CloseEvent, + ErrorEvent, + createFastMessageEvent + }; + return events$1; +} +var constants$5; +var hasRequiredConstants$5; +function requireConstants$5() { + if (hasRequiredConstants$5) return constants$5; + hasRequiredConstants$5 = 1; + const uid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; + const staticPropertyDescriptors = { + enumerable: true, + writable: false, + configurable: false + }; + const states = { + CONNECTING: 0, + OPEN: 1, + CLOSING: 2, + CLOSED: 3 + }; + const sentCloseFrameState = { + NOT_SENT: 0, + PROCESSING: 1, + SENT: 2 + }; + const opcodes = { + CONTINUATION: 0, + TEXT: 1, + BINARY: 2, + CLOSE: 8, + PING: 9, + PONG: 10 + }; + const maxUnsigned16Bit = 2 ** 16 - 1; + const parserStates = { + INFO: 0, + PAYLOADLENGTH_16: 2, + PAYLOADLENGTH_64: 3, + READ_DATA: 4 + }; + const emptyBuffer = Buffer.allocUnsafe(0); + const sendHints = { + string: 1, + typedArray: 2, + arrayBuffer: 3, + blob: 4 + }; + constants$5 = { + uid, + sentCloseFrameState, + staticPropertyDescriptors, + states, + opcodes, + maxUnsigned16Bit, + parserStates, + emptyBuffer, + sendHints + }; + return constants$5; +} +var symbols$5; +var hasRequiredSymbols$5; +function requireSymbols$5() { + if (hasRequiredSymbols$5) return symbols$5; + hasRequiredSymbols$5 = 1; + symbols$5 = { + kWebSocketURL: /* @__PURE__ */ Symbol("url"), + kReadyState: /* @__PURE__ */ Symbol("ready state"), + kController: /* @__PURE__ */ Symbol("controller"), + kResponse: /* @__PURE__ */ Symbol("response"), + kBinaryType: /* @__PURE__ */ Symbol("binary type"), + kSentClose: /* @__PURE__ */ Symbol("sent close"), + kReceivedClose: /* @__PURE__ */ Symbol("received close"), + kByteParser: /* @__PURE__ */ Symbol("byte parser") + }; + return symbols$5; +} +var util$8; +var hasRequiredUtil$8; +function requireUtil$8() { + if (hasRequiredUtil$8) return util$8; + hasRequiredUtil$8 = 1; + const { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = requireSymbols$5(); + const { states, opcodes } = requireConstants$5(); + const { ErrorEvent, createFastMessageEvent } = requireEvents$1(); + const { isUtf8 } = require$$0$3; + const { collectASequenceOfCodePointsFast, removeHTTPWhitespace } = requireDataUrl(); + function isConnecting(ws) { + return ws[kReadyState] === states.CONNECTING; + } + function isEstablished(ws) { + return ws[kReadyState] === states.OPEN; + } + function isClosing(ws) { + return ws[kReadyState] === states.CLOSING; + } + function isClosed(ws) { + return ws[kReadyState] === states.CLOSED; + } + function fireEvent(e, target, eventFactory = (type, init) => new Event(type, init), eventInitDict = {}) { + const event = eventFactory(e, eventInitDict); + target.dispatchEvent(event); + } + function websocketMessageReceived(ws, type, data) { + if (ws[kReadyState] !== states.OPEN) { + return; + } + let dataForEvent; + if (type === opcodes.TEXT) { + try { + dataForEvent = utf8Decode(data); + } catch { + failWebsocketConnection(ws, "Received invalid UTF-8 in text frame."); + return; + } + } else if (type === opcodes.BINARY) { + if (ws[kBinaryType] === "blob") { + dataForEvent = new Blob([data]); + } else { + dataForEvent = toArrayBuffer(data); + } + } + fireEvent("message", ws, createFastMessageEvent, { + origin: ws[kWebSocketURL].origin, + data: dataForEvent + }); + } + function toArrayBuffer(buffer) { + if (buffer.byteLength === buffer.buffer.byteLength) { + return buffer.buffer; + } + return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength); + } + function isValidSubprotocol(protocol) { + if (protocol.length === 0) { + return false; + } + for (let i = 0; i < protocol.length; ++i) { + const code = protocol.charCodeAt(i); + if (code < 33 || // CTL, contains SP (0x20) and HT (0x09) + code > 126 || code === 34 || // " + code === 40 || // ( + code === 41 || // ) + code === 44 || // , + code === 47 || // / + code === 58 || // : + code === 59 || // ; + code === 60 || // < + code === 61 || // = + code === 62 || // > + code === 63 || // ? + code === 64 || // @ + code === 91 || // [ + code === 92 || // \ + code === 93 || // ] + code === 123 || // { + code === 125) { + return false; + } + } + return true; + } + function isValidStatusCode(code) { + if (code >= 1e3 && code < 1015) { + return code !== 1004 && // reserved + code !== 1005 && // "MUST NOT be set as a status code" + code !== 1006; + } + return code >= 3e3 && code <= 4999; + } + function failWebsocketConnection(ws, reason) { + const { [kController]: controller, [kResponse]: response2 } = ws; + controller.abort(); + if (response2?.socket && !response2.socket.destroyed) { + response2.socket.destroy(); + } + if (reason) { + fireEvent("error", ws, (type, init) => new ErrorEvent(type, init), { + error: new Error(reason), + message: reason + }); + } + } + function isControlFrame(opcode) { + return opcode === opcodes.CLOSE || opcode === opcodes.PING || opcode === opcodes.PONG; + } + function isContinuationFrame(opcode) { + return opcode === opcodes.CONTINUATION; + } + function isTextBinaryFrame(opcode) { + return opcode === opcodes.TEXT || opcode === opcodes.BINARY; + } + function isValidOpcode(opcode) { + return isTextBinaryFrame(opcode) || isContinuationFrame(opcode) || isControlFrame(opcode); + } + function parseExtensions(extensions) { + const position = { position: 0 }; + const extensionList = /* @__PURE__ */ new Map(); + while (position.position < extensions.length) { + const pair = collectASequenceOfCodePointsFast(";", extensions, position); + const [name, value = ""] = pair.split("="); + extensionList.set( + removeHTTPWhitespace(name, true, false), + removeHTTPWhitespace(value, false, true) + ); + position.position++; + } + return extensionList; + } + function isValidClientWindowBits(value) { + for (let i = 0; i < value.length; i++) { + const byte = value.charCodeAt(i); + if (byte < 48 || byte > 57) { + return false; + } + } + return true; + } + const hasIntl = typeof process.versions.icu === "string"; + const fatalDecoder = hasIntl ? new TextDecoder("utf-8", { fatal: true }) : void 0; + const utf8Decode = hasIntl ? fatalDecoder.decode.bind(fatalDecoder) : function(buffer) { + if (isUtf8(buffer)) { + return buffer.toString("utf-8"); + } + throw new TypeError("Invalid utf-8 received."); + }; + util$8 = { + isConnecting, + isEstablished, + isClosing, + isClosed, + fireEvent, + isValidSubprotocol, + isValidStatusCode, + failWebsocketConnection, + websocketMessageReceived, + utf8Decode, + isControlFrame, + isContinuationFrame, + isTextBinaryFrame, + isValidOpcode, + parseExtensions, + isValidClientWindowBits + }; + return util$8; +} +var frame$1; +var hasRequiredFrame$1; +function requireFrame$1() { + if (hasRequiredFrame$1) return frame$1; + hasRequiredFrame$1 = 1; + const { maxUnsigned16Bit } = requireConstants$5(); + const BUFFER_SIZE = 16386; + let crypto; + let buffer = null; + let bufIdx = BUFFER_SIZE; + try { + crypto = require("node:crypto"); + } catch { + crypto = { + // not full compatibility, but minimum. + randomFillSync: function randomFillSync(buffer2, _offset, _size) { + for (let i = 0; i < buffer2.length; ++i) { + buffer2[i] = Math.random() * 255 | 0; + } + return buffer2; + } + }; + } + function generateMask() { + if (bufIdx === BUFFER_SIZE) { + bufIdx = 0; + crypto.randomFillSync(buffer ??= Buffer.allocUnsafe(BUFFER_SIZE), 0, BUFFER_SIZE); + } + return [buffer[bufIdx++], buffer[bufIdx++], buffer[bufIdx++], buffer[bufIdx++]]; + } + class WebsocketFrameSend { + /** + * @param {Buffer|undefined} data + */ + constructor(data) { + this.frameData = data; + } + createFrame(opcode) { + const frameData = this.frameData; + const maskKey = generateMask(); + const bodyLength = frameData?.byteLength ?? 0; + let payloadLength = bodyLength; + let offset = 6; + if (bodyLength > maxUnsigned16Bit) { + offset += 8; + payloadLength = 127; + } else if (bodyLength > 125) { + offset += 2; + payloadLength = 126; + } + const buffer2 = Buffer.allocUnsafe(bodyLength + offset); + buffer2[0] = buffer2[1] = 0; + buffer2[0] |= 128; + buffer2[0] = (buffer2[0] & 240) + opcode; + buffer2[offset - 4] = maskKey[0]; + buffer2[offset - 3] = maskKey[1]; + buffer2[offset - 2] = maskKey[2]; + buffer2[offset - 1] = maskKey[3]; + buffer2[1] = payloadLength; + if (payloadLength === 126) { + buffer2.writeUInt16BE(bodyLength, 2); + } else if (payloadLength === 127) { + buffer2[2] = buffer2[3] = 0; + buffer2.writeUIntBE(bodyLength, 4, 6); + } + buffer2[1] |= 128; + for (let i = 0; i < bodyLength; ++i) { + buffer2[offset + i] = frameData[i] ^ maskKey[i & 3]; + } + return buffer2; + } + } + frame$1 = { + WebsocketFrameSend + }; + return frame$1; +} +var connection$1; +var hasRequiredConnection$1; +function requireConnection$1() { + if (hasRequiredConnection$1) return connection$1; + hasRequiredConnection$1 = 1; + const { uid, states, sentCloseFrameState, emptyBuffer, opcodes } = requireConstants$5(); + const { + kReadyState, + kSentClose, + kByteParser, + kReceivedClose, + kResponse + } = requireSymbols$5(); + const { fireEvent, failWebsocketConnection, isClosing, isClosed, isEstablished, parseExtensions } = requireUtil$8(); + const { channels } = requireDiagnostics(); + const { CloseEvent } = requireEvents$1(); + const { makeRequest } = requireRequest$2(); + const { fetching } = requireFetch$1(); + const { Headers, getHeadersList } = requireHeaders$1(); + const { getDecodeSplit } = requireUtil$d(); + const { WebsocketFrameSend } = requireFrame$1(); + let crypto; + try { + crypto = require("node:crypto"); + } catch { + } + function establishWebSocketConnection(url, protocols, client2, ws, onEstablish, options) { + const requestURL = url; + requestURL.protocol = url.protocol === "ws:" ? "http:" : "https:"; + const request2 = makeRequest({ + urlList: [requestURL], + client: client2, + serviceWorkers: "none", + referrer: "no-referrer", + mode: "websocket", + credentials: "include", + cache: "no-store", + redirect: "error" + }); + if (options.headers) { + const headersList = getHeadersList(new Headers(options.headers)); + request2.headersList = headersList; + } + const keyValue = crypto.randomBytes(16).toString("base64"); + request2.headersList.append("sec-websocket-key", keyValue); + request2.headersList.append("sec-websocket-version", "13"); + for (const protocol of protocols) { + request2.headersList.append("sec-websocket-protocol", protocol); + } + const permessageDeflate2 = "permessage-deflate; client_max_window_bits"; + request2.headersList.append("sec-websocket-extensions", permessageDeflate2); + const controller = fetching({ + request: request2, + useParallelQueue: true, + dispatcher: options.dispatcher, + processResponse(response2) { + if (response2.type === "error" || response2.status !== 101) { + failWebsocketConnection(ws, "Received network error or non-101 status code."); + return; + } + if (protocols.length !== 0 && !response2.headersList.get("Sec-WebSocket-Protocol")) { + failWebsocketConnection(ws, "Server did not respond with sent protocols."); + return; + } + if (response2.headersList.get("Upgrade")?.toLowerCase() !== "websocket") { + failWebsocketConnection(ws, 'Server did not set Upgrade header to "websocket".'); + return; + } + if (response2.headersList.get("Connection")?.toLowerCase() !== "upgrade") { + failWebsocketConnection(ws, 'Server did not set Connection header to "upgrade".'); + return; + } + const secWSAccept = response2.headersList.get("Sec-WebSocket-Accept"); + const digest = crypto.createHash("sha1").update(keyValue + uid).digest("base64"); + if (secWSAccept !== digest) { + failWebsocketConnection(ws, "Incorrect hash received in Sec-WebSocket-Accept header."); + return; + } + const secExtension = response2.headersList.get("Sec-WebSocket-Extensions"); + let extensions; + if (secExtension !== null) { + extensions = parseExtensions(secExtension); + if (!extensions.has("permessage-deflate")) { + failWebsocketConnection(ws, "Sec-WebSocket-Extensions header does not match."); + return; + } + } + const secProtocol = response2.headersList.get("Sec-WebSocket-Protocol"); + if (secProtocol !== null) { + const requestProtocols = getDecodeSplit("sec-websocket-protocol", request2.headersList); + if (!requestProtocols.includes(secProtocol)) { + failWebsocketConnection(ws, "Protocol was not set in the opening handshake."); + return; + } + } + response2.socket.on("data", onSocketData); + response2.socket.on("close", onSocketClose); + response2.socket.on("error", onSocketError); + if (channels.open.hasSubscribers) { + channels.open.publish({ + address: response2.socket.address(), + protocol: secProtocol, + extensions: secExtension + }); + } + onEstablish(response2, extensions); + } + }); + return controller; + } + function closeWebSocketConnection(ws, code, reason, reasonByteLength) { + if (isClosing(ws) || isClosed(ws)) ; + else if (!isEstablished(ws)) { + failWebsocketConnection(ws, "Connection was closed before it was established."); + ws[kReadyState] = states.CLOSING; + } else if (ws[kSentClose] === sentCloseFrameState.NOT_SENT) { + ws[kSentClose] = sentCloseFrameState.PROCESSING; + const frame2 = new WebsocketFrameSend(); + if (code !== void 0 && reason === void 0) { + frame2.frameData = Buffer.allocUnsafe(2); + frame2.frameData.writeUInt16BE(code, 0); + } else if (code !== void 0 && reason !== void 0) { + frame2.frameData = Buffer.allocUnsafe(2 + reasonByteLength); + frame2.frameData.writeUInt16BE(code, 0); + frame2.frameData.write(reason, 2, "utf-8"); + } else { + frame2.frameData = emptyBuffer; + } + const socket = ws[kResponse].socket; + socket.write(frame2.createFrame(opcodes.CLOSE)); + ws[kSentClose] = sentCloseFrameState.SENT; + ws[kReadyState] = states.CLOSING; + } else { + ws[kReadyState] = states.CLOSING; + } + } + function onSocketData(chunk) { + if (!this.ws[kByteParser].write(chunk)) { + this.pause(); + } + } + function onSocketClose() { + const { ws } = this; + const { [kResponse]: response2 } = ws; + response2.socket.off("data", onSocketData); + response2.socket.off("close", onSocketClose); + response2.socket.off("error", onSocketError); + const wasClean = ws[kSentClose] === sentCloseFrameState.SENT && ws[kReceivedClose]; + let code = 1005; + let reason = ""; + const result = ws[kByteParser].closingInfo; + if (result && !result.error) { + code = result.code ?? 1005; + reason = result.reason; + } else if (!ws[kReceivedClose]) { + code = 1006; + } + ws[kReadyState] = states.CLOSED; + fireEvent("close", ws, (type, init) => new CloseEvent(type, init), { + wasClean, + code, + reason + }); + if (channels.close.hasSubscribers) { + channels.close.publish({ + websocket: ws, + code, + reason + }); + } + } + function onSocketError(error) { + const { ws } = this; + ws[kReadyState] = states.CLOSING; + if (channels.socketError.hasSubscribers) { + channels.socketError.publish(error); + } + this.destroy(); + } + connection$1 = { + establishWebSocketConnection, + closeWebSocketConnection + }; + return connection$1; +} +var permessageDeflate; +var hasRequiredPermessageDeflate; +function requirePermessageDeflate() { + if (hasRequiredPermessageDeflate) return permessageDeflate; + hasRequiredPermessageDeflate = 1; + const { createInflateRaw, Z_DEFAULT_WINDOWBITS } = require$$1$4; + const { isValidClientWindowBits } = requireUtil$8(); + const tail = Buffer.from([0, 0, 255, 255]); + const kBuffer = /* @__PURE__ */ Symbol("kBuffer"); + const kLength = /* @__PURE__ */ Symbol("kLength"); + class PerMessageDeflate { + /** @type {import('node:zlib').InflateRaw} */ + #inflate; + #options = {}; + constructor(extensions) { + this.#options.serverNoContextTakeover = extensions.has("server_no_context_takeover"); + this.#options.serverMaxWindowBits = extensions.get("server_max_window_bits"); + } + decompress(chunk, fin, callback) { + if (!this.#inflate) { + let windowBits = Z_DEFAULT_WINDOWBITS; + if (this.#options.serverMaxWindowBits) { + if (!isValidClientWindowBits(this.#options.serverMaxWindowBits)) { + callback(new Error("Invalid server_max_window_bits")); + return; + } + windowBits = Number.parseInt(this.#options.serverMaxWindowBits); + } + this.#inflate = createInflateRaw({ windowBits }); + this.#inflate[kBuffer] = []; + this.#inflate[kLength] = 0; + this.#inflate.on("data", (data) => { + this.#inflate[kBuffer].push(data); + this.#inflate[kLength] += data.length; + }); + this.#inflate.on("error", (err) => { + this.#inflate = null; + callback(err); + }); + } + this.#inflate.write(chunk); + if (fin) { + this.#inflate.write(tail); + } + this.#inflate.flush(() => { + const full = Buffer.concat(this.#inflate[kBuffer], this.#inflate[kLength]); + this.#inflate[kBuffer].length = 0; + this.#inflate[kLength] = 0; + callback(null, full); + }); + } + } + permessageDeflate = { PerMessageDeflate }; + return permessageDeflate; +} +var receiver$1; +var hasRequiredReceiver$1; +function requireReceiver$1() { + if (hasRequiredReceiver$1) return receiver$1; + hasRequiredReceiver$1 = 1; + const { Writable } = require$$0$6; + const assert = require$$0$5; + const { parserStates, opcodes, states, emptyBuffer, sentCloseFrameState } = requireConstants$5(); + const { kReadyState, kSentClose, kResponse, kReceivedClose } = requireSymbols$5(); + const { channels } = requireDiagnostics(); + const { + isValidStatusCode, + isValidOpcode, + failWebsocketConnection, + websocketMessageReceived, + utf8Decode, + isControlFrame, + isTextBinaryFrame, + isContinuationFrame + } = requireUtil$8(); + const { WebsocketFrameSend } = requireFrame$1(); + const { closeWebSocketConnection } = requireConnection$1(); + const { PerMessageDeflate } = requirePermessageDeflate(); + class ByteParser extends Writable { + #buffers = []; + #byteOffset = 0; + #loop = false; + #state = parserStates.INFO; + #info = {}; + #fragments = []; + /** @type {Map} */ + #extensions; + constructor(ws, extensions) { + super(); + this.ws = ws; + this.#extensions = extensions == null ? /* @__PURE__ */ new Map() : extensions; + if (this.#extensions.has("permessage-deflate")) { + this.#extensions.set("permessage-deflate", new PerMessageDeflate(extensions)); + } + } + /** + * @param {Buffer} chunk + * @param {() => void} callback + */ + _write(chunk, _, callback) { + this.#buffers.push(chunk); + this.#byteOffset += chunk.length; + this.#loop = true; + this.run(callback); + } + /** + * Runs whenever a new chunk is received. + * Callback is called whenever there are no more chunks buffering, + * or not enough bytes are buffered to parse. + */ + run(callback) { + while (this.#loop) { + if (this.#state === parserStates.INFO) { + if (this.#byteOffset < 2) { + return callback(); + } + const buffer = this.consume(2); + const fin = (buffer[0] & 128) !== 0; + const opcode = buffer[0] & 15; + const masked = (buffer[1] & 128) === 128; + const fragmented = !fin && opcode !== opcodes.CONTINUATION; + const payloadLength = buffer[1] & 127; + const rsv1 = buffer[0] & 64; + const rsv2 = buffer[0] & 32; + const rsv3 = buffer[0] & 16; + if (!isValidOpcode(opcode)) { + failWebsocketConnection(this.ws, "Invalid opcode received"); + return callback(); + } + if (masked) { + failWebsocketConnection(this.ws, "Frame cannot be masked"); + return callback(); + } + if (rsv1 !== 0 && !this.#extensions.has("permessage-deflate")) { + failWebsocketConnection(this.ws, "Expected RSV1 to be clear."); + return; + } + if (rsv2 !== 0 || rsv3 !== 0) { + failWebsocketConnection(this.ws, "RSV1, RSV2, RSV3 must be clear"); + return; + } + if (fragmented && !isTextBinaryFrame(opcode)) { + failWebsocketConnection(this.ws, "Invalid frame type was fragmented."); + return; + } + if (isTextBinaryFrame(opcode) && this.#fragments.length > 0) { + failWebsocketConnection(this.ws, "Expected continuation frame"); + return; + } + if (this.#info.fragmented && fragmented) { + failWebsocketConnection(this.ws, "Fragmented frame exceeded 125 bytes."); + return; + } + if ((payloadLength > 125 || fragmented) && isControlFrame(opcode)) { + failWebsocketConnection(this.ws, "Control frame either too large or fragmented"); + return; + } + if (isContinuationFrame(opcode) && this.#fragments.length === 0 && !this.#info.compressed) { + failWebsocketConnection(this.ws, "Unexpected continuation frame"); + return; + } + if (payloadLength <= 125) { + this.#info.payloadLength = payloadLength; + this.#state = parserStates.READ_DATA; + } else if (payloadLength === 126) { + this.#state = parserStates.PAYLOADLENGTH_16; + } else if (payloadLength === 127) { + this.#state = parserStates.PAYLOADLENGTH_64; + } + if (isTextBinaryFrame(opcode)) { + this.#info.binaryType = opcode; + this.#info.compressed = rsv1 !== 0; + } + this.#info.opcode = opcode; + this.#info.masked = masked; + this.#info.fin = fin; + this.#info.fragmented = fragmented; + } else if (this.#state === parserStates.PAYLOADLENGTH_16) { + if (this.#byteOffset < 2) { + return callback(); + } + const buffer = this.consume(2); + this.#info.payloadLength = buffer.readUInt16BE(0); + this.#state = parserStates.READ_DATA; + } else if (this.#state === parserStates.PAYLOADLENGTH_64) { + if (this.#byteOffset < 8) { + return callback(); + } + const buffer = this.consume(8); + const upper = buffer.readUInt32BE(0); + if (upper > 2 ** 31 - 1) { + failWebsocketConnection(this.ws, "Received payload length > 2^31 bytes."); + return; + } + const lower = buffer.readUInt32BE(4); + this.#info.payloadLength = (upper << 8) + lower; + this.#state = parserStates.READ_DATA; + } else if (this.#state === parserStates.READ_DATA) { + if (this.#byteOffset < this.#info.payloadLength) { + return callback(); + } + const body2 = this.consume(this.#info.payloadLength); + if (isControlFrame(this.#info.opcode)) { + this.#loop = this.parseControlFrame(body2); + this.#state = parserStates.INFO; + } else { + if (!this.#info.compressed) { + this.#fragments.push(body2); + if (!this.#info.fragmented && this.#info.fin) { + const fullMessage = Buffer.concat(this.#fragments); + websocketMessageReceived(this.ws, this.#info.binaryType, fullMessage); + this.#fragments.length = 0; + } + this.#state = parserStates.INFO; + } else { + this.#extensions.get("permessage-deflate").decompress(body2, this.#info.fin, (error, data) => { + if (error) { + closeWebSocketConnection(this.ws, 1007, error.message, error.message.length); + return; + } + this.#fragments.push(data); + if (!this.#info.fin) { + this.#state = parserStates.INFO; + this.#loop = true; + this.run(callback); + return; + } + websocketMessageReceived(this.ws, this.#info.binaryType, Buffer.concat(this.#fragments)); + this.#loop = true; + this.#state = parserStates.INFO; + this.#fragments.length = 0; + this.run(callback); + }); + this.#loop = false; + break; + } + } + } + } + } + /** + * Take n bytes from the buffered Buffers + * @param {number} n + * @returns {Buffer} + */ + consume(n) { + if (n > this.#byteOffset) { + throw new Error("Called consume() before buffers satiated."); + } else if (n === 0) { + return emptyBuffer; + } + if (this.#buffers[0].length === n) { + this.#byteOffset -= this.#buffers[0].length; + return this.#buffers.shift(); + } + const buffer = Buffer.allocUnsafe(n); + let offset = 0; + while (offset !== n) { + const next = this.#buffers[0]; + const { length } = next; + if (length + offset === n) { + buffer.set(this.#buffers.shift(), offset); + break; + } else if (length + offset > n) { + buffer.set(next.subarray(0, n - offset), offset); + this.#buffers[0] = next.subarray(n - offset); + break; + } else { + buffer.set(this.#buffers.shift(), offset); + offset += next.length; + } + } + this.#byteOffset -= n; + return buffer; + } + parseCloseBody(data) { + assert(data.length !== 1); + let code; + if (data.length >= 2) { + code = data.readUInt16BE(0); + } + if (code !== void 0 && !isValidStatusCode(code)) { + return { code: 1002, reason: "Invalid status code", error: true }; + } + let reason = data.subarray(2); + if (reason[0] === 239 && reason[1] === 187 && reason[2] === 191) { + reason = reason.subarray(3); + } + try { + reason = utf8Decode(reason); + } catch { + return { code: 1007, reason: "Invalid UTF-8", error: true }; + } + return { code, reason, error: false }; + } + /** + * Parses control frames. + * @param {Buffer} body + */ + parseControlFrame(body2) { + const { opcode, payloadLength } = this.#info; + if (opcode === opcodes.CLOSE) { + if (payloadLength === 1) { + failWebsocketConnection(this.ws, "Received close frame with a 1-byte body."); + return false; + } + this.#info.closeInfo = this.parseCloseBody(body2); + if (this.#info.closeInfo.error) { + const { code, reason } = this.#info.closeInfo; + closeWebSocketConnection(this.ws, code, reason, reason.length); + failWebsocketConnection(this.ws, reason); + return false; + } + if (this.ws[kSentClose] !== sentCloseFrameState.SENT) { + let body3 = emptyBuffer; + if (this.#info.closeInfo.code) { + body3 = Buffer.allocUnsafe(2); + body3.writeUInt16BE(this.#info.closeInfo.code, 0); + } + const closeFrame = new WebsocketFrameSend(body3); + this.ws[kResponse].socket.write( + closeFrame.createFrame(opcodes.CLOSE), + (err) => { + if (!err) { + this.ws[kSentClose] = sentCloseFrameState.SENT; + } + } + ); + } + this.ws[kReadyState] = states.CLOSING; + this.ws[kReceivedClose] = true; + return false; + } else if (opcode === opcodes.PING) { + if (!this.ws[kReceivedClose]) { + const frame2 = new WebsocketFrameSend(body2); + this.ws[kResponse].socket.write(frame2.createFrame(opcodes.PONG)); + if (channels.ping.hasSubscribers) { + channels.ping.publish({ + payload: body2 + }); + } + } + } else if (opcode === opcodes.PONG) { + if (channels.pong.hasSubscribers) { + channels.pong.publish({ + payload: body2 + }); + } + } + return true; + } + get closingInfo() { + return this.#info.closeInfo; + } + } + receiver$1 = { + ByteParser + }; + return receiver$1; +} +var sender; +var hasRequiredSender; +function requireSender() { + if (hasRequiredSender) return sender; + hasRequiredSender = 1; + const { WebsocketFrameSend } = requireFrame$1(); + const { opcodes, sendHints } = requireConstants$5(); + const FixedQueue = requireFixedQueue$1(); + const FastBuffer = Buffer[Symbol.species]; + class SendQueue { + /** + * @type {FixedQueue} + */ + #queue = new FixedQueue(); + /** + * @type {boolean} + */ + #running = false; + /** @type {import('node:net').Socket} */ + #socket; + constructor(socket) { + this.#socket = socket; + } + add(item, cb, hint) { + if (hint !== sendHints.blob) { + const frame2 = createFrame(item, hint); + if (!this.#running) { + this.#socket.write(frame2, cb); + } else { + const node2 = { + promise: null, + callback: cb, + frame: frame2 + }; + this.#queue.push(node2); + } + return; + } + const node = { + promise: item.arrayBuffer().then((ab) => { + node.promise = null; + node.frame = createFrame(ab, hint); + }), + callback: cb, + frame: null + }; + this.#queue.push(node); + if (!this.#running) { + this.#run(); + } + } + async #run() { + this.#running = true; + const queue = this.#queue; + while (!queue.isEmpty()) { + const node = queue.shift(); + if (node.promise !== null) { + await node.promise; + } + this.#socket.write(node.frame, node.callback); + node.callback = node.frame = null; + } + this.#running = false; + } + } + function createFrame(data, hint) { + return new WebsocketFrameSend(toBuffer(data, hint)).createFrame(hint === sendHints.string ? opcodes.TEXT : opcodes.BINARY); + } + function toBuffer(data, hint) { + switch (hint) { + case sendHints.string: + return Buffer.from(data); + case sendHints.arrayBuffer: + case sendHints.blob: + return new FastBuffer(data); + case sendHints.typedArray: + return new FastBuffer(data.buffer, data.byteOffset, data.byteLength); + } + } + sender = { SendQueue }; + return sender; +} +var websocket$1; +var hasRequiredWebsocket$1; +function requireWebsocket$1() { + if (hasRequiredWebsocket$1) return websocket$1; + hasRequiredWebsocket$1 = 1; + const { webidl } = requireWebidl$1(); + const { URLSerializer } = requireDataUrl(); + const { environmentSettingsObject } = requireUtil$d(); + const { staticPropertyDescriptors, states, sentCloseFrameState, sendHints } = requireConstants$5(); + const { + kWebSocketURL, + kReadyState, + kController, + kBinaryType, + kResponse, + kSentClose, + kByteParser + } = requireSymbols$5(); + const { + isConnecting, + isEstablished, + isClosing, + isValidSubprotocol, + fireEvent + } = requireUtil$8(); + const { establishWebSocketConnection, closeWebSocketConnection } = requireConnection$1(); + const { ByteParser } = requireReceiver$1(); + const { kEnumerableProperty, isBlobLike } = requireUtil$e(); + const { getGlobalDispatcher } = requireGlobal$2(); + const { types } = require$$1$2; + const { ErrorEvent, CloseEvent } = requireEvents$1(); + const { SendQueue } = requireSender(); + class WebSocket extends EventTarget { + #events = { + open: null, + error: null, + close: null, + message: null + }; + #bufferedAmount = 0; + #protocol = ""; + #extensions = ""; + /** @type {SendQueue} */ + #sendQueue; + /** + * @param {string} url + * @param {string|string[]} protocols + */ + constructor(url, protocols = []) { + super(); + webidl.util.markAsUncloneable(this); + const prefix = "WebSocket constructor"; + webidl.argumentLengthCheck(arguments, 1, prefix); + const options = webidl.converters["DOMString or sequence or WebSocketInit"](protocols, prefix, "options"); + url = webidl.converters.USVString(url, prefix, "url"); + protocols = options.protocols; + const baseURL = environmentSettingsObject.settingsObject.baseUrl; + let urlRecord; + try { + urlRecord = new URL(url, baseURL); + } catch (e) { + throw new DOMException(e, "SyntaxError"); + } + if (urlRecord.protocol === "http:") { + urlRecord.protocol = "ws:"; + } else if (urlRecord.protocol === "https:") { + urlRecord.protocol = "wss:"; + } + if (urlRecord.protocol !== "ws:" && urlRecord.protocol !== "wss:") { + throw new DOMException( + `Expected a ws: or wss: protocol, got ${urlRecord.protocol}`, + "SyntaxError" + ); + } + if (urlRecord.hash || urlRecord.href.endsWith("#")) { + throw new DOMException("Got fragment", "SyntaxError"); + } + if (typeof protocols === "string") { + protocols = [protocols]; + } + if (protocols.length !== new Set(protocols.map((p) => p.toLowerCase())).size) { + throw new DOMException("Invalid Sec-WebSocket-Protocol value", "SyntaxError"); + } + if (protocols.length > 0 && !protocols.every((p) => isValidSubprotocol(p))) { + throw new DOMException("Invalid Sec-WebSocket-Protocol value", "SyntaxError"); + } + this[kWebSocketURL] = new URL(urlRecord.href); + const client2 = environmentSettingsObject.settingsObject; + this[kController] = establishWebSocketConnection( + urlRecord, + protocols, + client2, + this, + (response2, extensions) => this.#onConnectionEstablished(response2, extensions), + options + ); + this[kReadyState] = WebSocket.CONNECTING; + this[kSentClose] = sentCloseFrameState.NOT_SENT; + this[kBinaryType] = "blob"; + } + /** + * @see https://websockets.spec.whatwg.org/#dom-websocket-close + * @param {number|undefined} code + * @param {string|undefined} reason + */ + close(code = void 0, reason = void 0) { + webidl.brandCheck(this, WebSocket); + const prefix = "WebSocket.close"; + if (code !== void 0) { + code = webidl.converters["unsigned short"](code, prefix, "code", { clamp: true }); + } + if (reason !== void 0) { + reason = webidl.converters.USVString(reason, prefix, "reason"); + } + if (code !== void 0) { + if (code !== 1e3 && (code < 3e3 || code > 4999)) { + throw new DOMException("invalid code", "InvalidAccessError"); + } + } + let reasonByteLength = 0; + if (reason !== void 0) { + reasonByteLength = Buffer.byteLength(reason); + if (reasonByteLength > 123) { + throw new DOMException( + `Reason must be less than 123 bytes; received ${reasonByteLength}`, + "SyntaxError" + ); + } + } + closeWebSocketConnection(this, code, reason, reasonByteLength); + } + /** + * @see https://websockets.spec.whatwg.org/#dom-websocket-send + * @param {NodeJS.TypedArray|ArrayBuffer|Blob|string} data + */ + send(data) { + webidl.brandCheck(this, WebSocket); + const prefix = "WebSocket.send"; + webidl.argumentLengthCheck(arguments, 1, prefix); + data = webidl.converters.WebSocketSendData(data, prefix, "data"); + if (isConnecting(this)) { + throw new DOMException("Sent before connected.", "InvalidStateError"); + } + if (!isEstablished(this) || isClosing(this)) { + return; + } + if (typeof data === "string") { + const length = Buffer.byteLength(data); + this.#bufferedAmount += length; + this.#sendQueue.add(data, () => { + this.#bufferedAmount -= length; + }, sendHints.string); + } else if (types.isArrayBuffer(data)) { + this.#bufferedAmount += data.byteLength; + this.#sendQueue.add(data, () => { + this.#bufferedAmount -= data.byteLength; + }, sendHints.arrayBuffer); + } else if (ArrayBuffer.isView(data)) { + this.#bufferedAmount += data.byteLength; + this.#sendQueue.add(data, () => { + this.#bufferedAmount -= data.byteLength; + }, sendHints.typedArray); + } else if (isBlobLike(data)) { + this.#bufferedAmount += data.size; + this.#sendQueue.add(data, () => { + this.#bufferedAmount -= data.size; + }, sendHints.blob); + } + } + get readyState() { + webidl.brandCheck(this, WebSocket); + return this[kReadyState]; + } + get bufferedAmount() { + webidl.brandCheck(this, WebSocket); + return this.#bufferedAmount; + } + get url() { + webidl.brandCheck(this, WebSocket); + return URLSerializer(this[kWebSocketURL]); + } + get extensions() { + webidl.brandCheck(this, WebSocket); + return this.#extensions; + } + get protocol() { + webidl.brandCheck(this, WebSocket); + return this.#protocol; + } + get onopen() { + webidl.brandCheck(this, WebSocket); + return this.#events.open; + } + set onopen(fn) { + webidl.brandCheck(this, WebSocket); + if (this.#events.open) { + this.removeEventListener("open", this.#events.open); + } + if (typeof fn === "function") { + this.#events.open = fn; + this.addEventListener("open", fn); + } else { + this.#events.open = null; + } + } + get onerror() { + webidl.brandCheck(this, WebSocket); + return this.#events.error; + } + set onerror(fn) { + webidl.brandCheck(this, WebSocket); + if (this.#events.error) { + this.removeEventListener("error", this.#events.error); + } + if (typeof fn === "function") { + this.#events.error = fn; + this.addEventListener("error", fn); + } else { + this.#events.error = null; + } + } + get onclose() { + webidl.brandCheck(this, WebSocket); + return this.#events.close; + } + set onclose(fn) { + webidl.brandCheck(this, WebSocket); + if (this.#events.close) { + this.removeEventListener("close", this.#events.close); + } + if (typeof fn === "function") { + this.#events.close = fn; + this.addEventListener("close", fn); + } else { + this.#events.close = null; + } + } + get onmessage() { + webidl.brandCheck(this, WebSocket); + return this.#events.message; + } + set onmessage(fn) { + webidl.brandCheck(this, WebSocket); + if (this.#events.message) { + this.removeEventListener("message", this.#events.message); + } + if (typeof fn === "function") { + this.#events.message = fn; + this.addEventListener("message", fn); + } else { + this.#events.message = null; + } + } + get binaryType() { + webidl.brandCheck(this, WebSocket); + return this[kBinaryType]; + } + set binaryType(type) { + webidl.brandCheck(this, WebSocket); + if (type !== "blob" && type !== "arraybuffer") { + this[kBinaryType] = "blob"; + } else { + this[kBinaryType] = type; + } + } + /** + * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol + */ + #onConnectionEstablished(response2, parsedExtensions) { + this[kResponse] = response2; + const parser = new ByteParser(this, parsedExtensions); + parser.on("drain", onParserDrain); + parser.on("error", onParserError.bind(this)); + response2.socket.ws = this; + this[kByteParser] = parser; + this.#sendQueue = new SendQueue(response2.socket); + this[kReadyState] = states.OPEN; + const extensions = response2.headersList.get("sec-websocket-extensions"); + if (extensions !== null) { + this.#extensions = extensions; + } + const protocol = response2.headersList.get("sec-websocket-protocol"); + if (protocol !== null) { + this.#protocol = protocol; + } + fireEvent("open", this); + } + } + WebSocket.CONNECTING = WebSocket.prototype.CONNECTING = states.CONNECTING; + WebSocket.OPEN = WebSocket.prototype.OPEN = states.OPEN; + WebSocket.CLOSING = WebSocket.prototype.CLOSING = states.CLOSING; + WebSocket.CLOSED = WebSocket.prototype.CLOSED = states.CLOSED; + Object.defineProperties(WebSocket.prototype, { + CONNECTING: staticPropertyDescriptors, + OPEN: staticPropertyDescriptors, + CLOSING: staticPropertyDescriptors, + CLOSED: staticPropertyDescriptors, + url: kEnumerableProperty, + readyState: kEnumerableProperty, + bufferedAmount: kEnumerableProperty, + onopen: kEnumerableProperty, + onerror: kEnumerableProperty, + onclose: kEnumerableProperty, + close: kEnumerableProperty, + onmessage: kEnumerableProperty, + binaryType: kEnumerableProperty, + send: kEnumerableProperty, + extensions: kEnumerableProperty, + protocol: kEnumerableProperty, + [Symbol.toStringTag]: { + value: "WebSocket", + writable: false, + enumerable: false, + configurable: true + } + }); + Object.defineProperties(WebSocket, { + CONNECTING: staticPropertyDescriptors, + OPEN: staticPropertyDescriptors, + CLOSING: staticPropertyDescriptors, + CLOSED: staticPropertyDescriptors + }); + webidl.converters["sequence"] = webidl.sequenceConverter( + webidl.converters.DOMString + ); + webidl.converters["DOMString or sequence"] = function(V, prefix, argument) { + if (webidl.util.Type(V) === "Object" && Symbol.iterator in V) { + return webidl.converters["sequence"](V); + } + return webidl.converters.DOMString(V, prefix, argument); + }; + webidl.converters.WebSocketInit = webidl.dictionaryConverter([ + { + key: "protocols", + converter: webidl.converters["DOMString or sequence"], + defaultValue: () => new Array(0) + }, + { + key: "dispatcher", + converter: webidl.converters.any, + defaultValue: () => getGlobalDispatcher() + }, + { + key: "headers", + converter: webidl.nullableConverter(webidl.converters.HeadersInit) + } + ]); + webidl.converters["DOMString or sequence or WebSocketInit"] = function(V) { + if (webidl.util.Type(V) === "Object" && !(Symbol.iterator in V)) { + return webidl.converters.WebSocketInit(V); + } + return { protocols: webidl.converters["DOMString or sequence"](V) }; + }; + webidl.converters.WebSocketSendData = function(V) { + if (webidl.util.Type(V) === "Object") { + if (isBlobLike(V)) { + return webidl.converters.Blob(V, { strict: false }); + } + if (ArrayBuffer.isView(V) || types.isArrayBuffer(V)) { + return webidl.converters.BufferSource(V); + } + } + return webidl.converters.USVString(V); + }; + function onParserDrain() { + this.ws[kResponse].socket.resume(); + } + function onParserError(err) { + let message; + let code; + if (err instanceof CloseEvent) { + message = err.reason; + code = err.code; + } else { + message = err.message; + } + fireEvent("error", this, () => new ErrorEvent("error", { error: err, message })); + closeWebSocketConnection(this, code); + } + websocket$1 = { + WebSocket + }; + return websocket$1; +} +var util$7; +var hasRequiredUtil$7; +function requireUtil$7() { + if (hasRequiredUtil$7) return util$7; + hasRequiredUtil$7 = 1; + function isValidLastEventId(value) { + return value.indexOf("\0") === -1; + } + function isASCIINumber(value) { + if (value.length === 0) return false; + for (let i = 0; i < value.length; i++) { + if (value.charCodeAt(i) < 48 || value.charCodeAt(i) > 57) return false; + } + return true; + } + function delay(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms).unref(); + }); + } + util$7 = { + isValidLastEventId, + isASCIINumber, + delay + }; + return util$7; +} +var eventsourceStream; +var hasRequiredEventsourceStream; +function requireEventsourceStream() { + if (hasRequiredEventsourceStream) return eventsourceStream; + hasRequiredEventsourceStream = 1; + const { Transform } = require$$0$6; + const { isASCIINumber, isValidLastEventId } = requireUtil$7(); + const BOM = [239, 187, 191]; + const LF = 10; + const CR = 13; + const COLON = 58; + const SPACE = 32; + class EventSourceStream extends Transform { + /** + * @type {eventSourceSettings} + */ + state = null; + /** + * Leading byte-order-mark check. + * @type {boolean} + */ + checkBOM = true; + /** + * @type {boolean} + */ + crlfCheck = false; + /** + * @type {boolean} + */ + eventEndCheck = false; + /** + * @type {Buffer} + */ + buffer = null; + pos = 0; + event = { + data: void 0, + event: void 0, + id: void 0, + retry: void 0 + }; + /** + * @param {object} options + * @param {eventSourceSettings} options.eventSourceSettings + * @param {Function} [options.push] + */ + constructor(options = {}) { + options.readableObjectMode = true; + super(options); + this.state = options.eventSourceSettings || {}; + if (options.push) { + this.push = options.push; + } + } + /** + * @param {Buffer} chunk + * @param {string} _encoding + * @param {Function} callback + * @returns {void} + */ + _transform(chunk, _encoding, callback) { + if (chunk.length === 0) { + callback(); + return; + } + if (this.buffer) { + this.buffer = Buffer.concat([this.buffer, chunk]); + } else { + this.buffer = chunk; + } + if (this.checkBOM) { + switch (this.buffer.length) { + case 1: + if (this.buffer[0] === BOM[0]) { + callback(); + return; + } + this.checkBOM = false; + callback(); + return; + case 2: + if (this.buffer[0] === BOM[0] && this.buffer[1] === BOM[1]) { + callback(); + return; + } + this.checkBOM = false; + break; + case 3: + if (this.buffer[0] === BOM[0] && this.buffer[1] === BOM[1] && this.buffer[2] === BOM[2]) { + this.buffer = Buffer.alloc(0); + this.checkBOM = false; + callback(); + return; + } + this.checkBOM = false; + break; + default: + if (this.buffer[0] === BOM[0] && this.buffer[1] === BOM[1] && this.buffer[2] === BOM[2]) { + this.buffer = this.buffer.subarray(3); + } + this.checkBOM = false; + break; + } + } + while (this.pos < this.buffer.length) { + if (this.eventEndCheck) { + if (this.crlfCheck) { + if (this.buffer[this.pos] === LF) { + this.buffer = this.buffer.subarray(this.pos + 1); + this.pos = 0; + this.crlfCheck = false; + continue; + } + this.crlfCheck = false; + } + if (this.buffer[this.pos] === LF || this.buffer[this.pos] === CR) { + if (this.buffer[this.pos] === CR) { + this.crlfCheck = true; + } + this.buffer = this.buffer.subarray(this.pos + 1); + this.pos = 0; + if (this.event.data !== void 0 || this.event.event || this.event.id || this.event.retry) { + this.processEvent(this.event); + } + this.clearEvent(); + continue; + } + this.eventEndCheck = false; + continue; + } + if (this.buffer[this.pos] === LF || this.buffer[this.pos] === CR) { + if (this.buffer[this.pos] === CR) { + this.crlfCheck = true; + } + this.parseLine(this.buffer.subarray(0, this.pos), this.event); + this.buffer = this.buffer.subarray(this.pos + 1); + this.pos = 0; + this.eventEndCheck = true; + continue; + } + this.pos++; + } + callback(); + } + /** + * @param {Buffer} line + * @param {EventStreamEvent} event + */ + parseLine(line, event) { + if (line.length === 0) { + return; + } + const colonPosition = line.indexOf(COLON); + if (colonPosition === 0) { + return; + } + let field = ""; + let value = ""; + if (colonPosition !== -1) { + field = line.subarray(0, colonPosition).toString("utf8"); + let valueStart = colonPosition + 1; + if (line[valueStart] === SPACE) { + ++valueStart; + } + value = line.subarray(valueStart).toString("utf8"); + } else { + field = line.toString("utf8"); + value = ""; + } + switch (field) { + case "data": + if (event[field] === void 0) { + event[field] = value; + } else { + event[field] += ` +${value}`; + } + break; + case "retry": + if (isASCIINumber(value)) { + event[field] = value; + } + break; + case "id": + if (isValidLastEventId(value)) { + event[field] = value; + } + break; + case "event": + if (value.length > 0) { + event[field] = value; + } + break; + } + } + /** + * @param {EventSourceStreamEvent} event + */ + processEvent(event) { + if (event.retry && isASCIINumber(event.retry)) { + this.state.reconnectionTime = parseInt(event.retry, 10); + } + if (event.id && isValidLastEventId(event.id)) { + this.state.lastEventId = event.id; + } + if (event.data !== void 0) { + this.push({ + type: event.event || "message", + options: { + data: event.data, + lastEventId: this.state.lastEventId, + origin: this.state.origin + } + }); + } + } + clearEvent() { + this.event = { + data: void 0, + event: void 0, + id: void 0, + retry: void 0 + }; + } + } + eventsourceStream = { + EventSourceStream + }; + return eventsourceStream; +} +var eventsource; +var hasRequiredEventsource; +function requireEventsource() { + if (hasRequiredEventsource) return eventsource; + hasRequiredEventsource = 1; + const { pipeline } = require$$0$6; + const { fetching } = requireFetch$1(); + const { makeRequest } = requireRequest$2(); + const { webidl } = requireWebidl$1(); + const { EventSourceStream } = requireEventsourceStream(); + const { parseMIMEType } = requireDataUrl(); + const { createFastMessageEvent } = requireEvents$1(); + const { isNetworkError } = requireResponse$1(); + const { delay } = requireUtil$7(); + const { kEnumerableProperty } = requireUtil$e(); + const { environmentSettingsObject } = requireUtil$d(); + let experimentalWarned = false; + const defaultReconnectionTime = 3e3; + const CONNECTING = 0; + const OPEN = 1; + const CLOSED = 2; + const ANONYMOUS = "anonymous"; + const USE_CREDENTIALS = "use-credentials"; + class EventSource extends EventTarget { + #events = { + open: null, + error: null, + message: null + }; + #url = null; + #withCredentials = false; + #readyState = CONNECTING; + #request = null; + #controller = null; + #dispatcher; + /** + * @type {import('./eventsource-stream').eventSourceSettings} + */ + #state; + /** + * Creates a new EventSource object. + * @param {string} url + * @param {EventSourceInit} [eventSourceInitDict] + * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#the-eventsource-interface + */ + constructor(url, eventSourceInitDict = {}) { + super(); + webidl.util.markAsUncloneable(this); + const prefix = "EventSource constructor"; + webidl.argumentLengthCheck(arguments, 1, prefix); + if (!experimentalWarned) { + experimentalWarned = true; + process.emitWarning("EventSource is experimental, expect them to change at any time.", { + code: "UNDICI-ES" + }); + } + url = webidl.converters.USVString(url, prefix, "url"); + eventSourceInitDict = webidl.converters.EventSourceInitDict(eventSourceInitDict, prefix, "eventSourceInitDict"); + this.#dispatcher = eventSourceInitDict.dispatcher; + this.#state = { + lastEventId: "", + reconnectionTime: defaultReconnectionTime + }; + const settings = environmentSettingsObject; + let urlRecord; + try { + urlRecord = new URL(url, settings.settingsObject.baseUrl); + this.#state.origin = urlRecord.origin; + } catch (e) { + throw new DOMException(e, "SyntaxError"); + } + this.#url = urlRecord.href; + let corsAttributeState = ANONYMOUS; + if (eventSourceInitDict.withCredentials) { + corsAttributeState = USE_CREDENTIALS; + this.#withCredentials = true; + } + const initRequest = { + redirect: "follow", + keepalive: true, + // @see https://html.spec.whatwg.org/multipage/urls-and-fetching.html#cors-settings-attributes + mode: "cors", + credentials: corsAttributeState === "anonymous" ? "same-origin" : "omit", + referrer: "no-referrer" + }; + initRequest.client = environmentSettingsObject.settingsObject; + initRequest.headersList = [["accept", { name: "accept", value: "text/event-stream" }]]; + initRequest.cache = "no-store"; + initRequest.initiator = "other"; + initRequest.urlList = [new URL(this.#url)]; + this.#request = makeRequest(initRequest); + this.#connect(); + } + /** + * Returns the state of this EventSource object's connection. It can have the + * values described below. + * @returns {0|1|2} + * @readonly + */ + get readyState() { + return this.#readyState; + } + /** + * Returns the URL providing the event stream. + * @readonly + * @returns {string} + */ + get url() { + return this.#url; + } + /** + * Returns a boolean indicating whether the EventSource object was + * instantiated with CORS credentials set (true), or not (false, the default). + */ + get withCredentials() { + return this.#withCredentials; + } + #connect() { + if (this.#readyState === CLOSED) return; + this.#readyState = CONNECTING; + const fetchParams = { + request: this.#request, + dispatcher: this.#dispatcher + }; + const processEventSourceEndOfBody = (response2) => { + if (isNetworkError(response2)) { + this.dispatchEvent(new Event("error")); + this.close(); + } + this.#reconnect(); + }; + fetchParams.processResponseEndOfBody = processEventSourceEndOfBody; + fetchParams.processResponse = (response2) => { + if (isNetworkError(response2)) { + if (response2.aborted) { + this.close(); + this.dispatchEvent(new Event("error")); + return; + } else { + this.#reconnect(); + return; + } + } + const contentType = response2.headersList.get("content-type", true); + const mimeType = contentType !== null ? parseMIMEType(contentType) : "failure"; + const contentTypeValid = mimeType !== "failure" && mimeType.essence === "text/event-stream"; + if (response2.status !== 200 || contentTypeValid === false) { + this.close(); + this.dispatchEvent(new Event("error")); + return; + } + this.#readyState = OPEN; + this.dispatchEvent(new Event("open")); + this.#state.origin = response2.urlList[response2.urlList.length - 1].origin; + const eventSourceStream = new EventSourceStream({ + eventSourceSettings: this.#state, + push: (event) => { + this.dispatchEvent(createFastMessageEvent( + event.type, + event.options + )); + } + }); + pipeline( + response2.body.stream, + eventSourceStream, + (error) => { + if (error?.aborted === false) { + this.close(); + this.dispatchEvent(new Event("error")); + } + } + ); + }; + this.#controller = fetching(fetchParams); + } + /** + * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#sse-processing-model + * @returns {Promise} + */ + async #reconnect() { + if (this.#readyState === CLOSED) return; + this.#readyState = CONNECTING; + this.dispatchEvent(new Event("error")); + await delay(this.#state.reconnectionTime); + if (this.#readyState !== CONNECTING) return; + if (this.#state.lastEventId.length) { + this.#request.headersList.set("last-event-id", this.#state.lastEventId, true); + } + this.#connect(); + } + /** + * Closes the connection, if any, and sets the readyState attribute to + * CLOSED. + */ + close() { + webidl.brandCheck(this, EventSource); + if (this.#readyState === CLOSED) return; + this.#readyState = CLOSED; + this.#controller.abort(); + this.#request = null; + } + get onopen() { + return this.#events.open; + } + set onopen(fn) { + if (this.#events.open) { + this.removeEventListener("open", this.#events.open); + } + if (typeof fn === "function") { + this.#events.open = fn; + this.addEventListener("open", fn); + } else { + this.#events.open = null; + } + } + get onmessage() { + return this.#events.message; + } + set onmessage(fn) { + if (this.#events.message) { + this.removeEventListener("message", this.#events.message); + } + if (typeof fn === "function") { + this.#events.message = fn; + this.addEventListener("message", fn); + } else { + this.#events.message = null; + } + } + get onerror() { + return this.#events.error; + } + set onerror(fn) { + if (this.#events.error) { + this.removeEventListener("error", this.#events.error); + } + if (typeof fn === "function") { + this.#events.error = fn; + this.addEventListener("error", fn); + } else { + this.#events.error = null; + } + } + } + const constantsPropertyDescriptors = { + CONNECTING: { + __proto__: null, + configurable: false, + enumerable: true, + value: CONNECTING, + writable: false + }, + OPEN: { + __proto__: null, + configurable: false, + enumerable: true, + value: OPEN, + writable: false + }, + CLOSED: { + __proto__: null, + configurable: false, + enumerable: true, + value: CLOSED, + writable: false + } + }; + Object.defineProperties(EventSource, constantsPropertyDescriptors); + Object.defineProperties(EventSource.prototype, constantsPropertyDescriptors); + Object.defineProperties(EventSource.prototype, { + close: kEnumerableProperty, + onerror: kEnumerableProperty, + onmessage: kEnumerableProperty, + onopen: kEnumerableProperty, + readyState: kEnumerableProperty, + url: kEnumerableProperty, + withCredentials: kEnumerableProperty + }); + webidl.converters.EventSourceInitDict = webidl.dictionaryConverter([ + { + key: "withCredentials", + converter: webidl.converters.boolean, + defaultValue: () => false + }, + { + key: "dispatcher", + // undici only + converter: webidl.converters.any + } + ]); + eventsource = { + EventSource, + defaultReconnectionTime + }; + return eventsource; +} +var hasRequiredUndici$1; +function requireUndici$1() { + if (hasRequiredUndici$1) return undici$1; + hasRequiredUndici$1 = 1; + const Client = requireClient$1(); + const Dispatcher = requireDispatcher$1(); + const Pool = requirePool$1(); + const BalancedPool = requireBalancedPool$1(); + const Agent = requireAgent$1(); + const ProxyAgent = requireProxyAgent$1(); + const EnvHttpProxyAgent = requireEnvHttpProxyAgent(); + const RetryAgent = requireRetryAgent(); + const errors2 = requireErrors$1(); + const util2 = requireUtil$e(); + const { InvalidArgumentError } = errors2; + const api2 = requireApi$1(); + const buildConnector = requireConnect$1(); + const MockClient = requireMockClient$1(); + const MockAgent = requireMockAgent$1(); + const MockPool = requireMockPool$1(); + const mockErrors2 = requireMockErrors$1(); + const RetryHandler = requireRetryHandler$1(); + const { getGlobalDispatcher, setGlobalDispatcher } = requireGlobal$2(); + const DecoratorHandler = requireDecoratorHandler$1(); + const RedirectHandler = requireRedirectHandler$1(); + const createRedirectInterceptor = requireRedirectInterceptor$1(); + Object.assign(Dispatcher.prototype, api2); + undici$1.Dispatcher = Dispatcher; + undici$1.Client = Client; + undici$1.Pool = Pool; + undici$1.BalancedPool = BalancedPool; + undici$1.Agent = Agent; + undici$1.ProxyAgent = ProxyAgent; + undici$1.EnvHttpProxyAgent = EnvHttpProxyAgent; + undici$1.RetryAgent = RetryAgent; + undici$1.RetryHandler = RetryHandler; + undici$1.DecoratorHandler = DecoratorHandler; + undici$1.RedirectHandler = RedirectHandler; + undici$1.createRedirectInterceptor = createRedirectInterceptor; + undici$1.interceptors = { + redirect: requireRedirect(), + retry: requireRetry(), + dump: requireDump(), + dns: requireDns() + }; + undici$1.buildConnector = buildConnector; + undici$1.errors = errors2; + undici$1.util = { + parseHeaders: util2.parseHeaders, + headerNameToString: util2.headerNameToString + }; + function makeDispatcher(fn) { + return (url, opts, handler2) => { + if (typeof opts === "function") { + handler2 = opts; + opts = null; + } + if (!url || typeof url !== "string" && typeof url !== "object" && !(url instanceof URL)) { + throw new InvalidArgumentError("invalid url"); + } + if (opts != null && typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + if (opts && opts.path != null) { + if (typeof opts.path !== "string") { + throw new InvalidArgumentError("invalid opts.path"); + } + let path = opts.path; + if (!opts.path.startsWith("/")) { + path = `/${path}`; + } + url = new URL(util2.parseOrigin(url).origin + path); + } else { + if (!opts) { + opts = typeof url === "object" ? url : {}; + } + url = util2.parseURL(url); + } + const { agent: agent2, dispatcher: dispatcher2 = getGlobalDispatcher() } = opts; + if (agent2) { + throw new InvalidArgumentError("unsupported opts.agent. Did you mean opts.client?"); + } + return fn.call(dispatcher2, { + ...opts, + origin: url.origin, + path: url.search ? `${url.pathname}${url.search}` : url.pathname, + method: opts.method || (opts.body ? "PUT" : "GET") + }, handler2); + }; + } + undici$1.setGlobalDispatcher = setGlobalDispatcher; + undici$1.getGlobalDispatcher = getGlobalDispatcher; + const fetchImpl = requireFetch$1().fetch; + undici$1.fetch = async function fetch(init, options = void 0) { + try { + return await fetchImpl(init, options); + } catch (err) { + if (err && typeof err === "object") { + Error.captureStackTrace(err); + } + throw err; + } + }; + undici$1.Headers = requireHeaders$1().Headers; + undici$1.Response = requireResponse$1().Response; + undici$1.Request = requireRequest$2().Request; + undici$1.FormData = requireFormdata$1().FormData; + undici$1.File = globalThis.File ?? require$$0$3.File; + undici$1.FileReader = requireFilereader$1().FileReader; + const { setGlobalOrigin, getGlobalOrigin } = requireGlobal$3(); + undici$1.setGlobalOrigin = setGlobalOrigin; + undici$1.getGlobalOrigin = getGlobalOrigin; + const { CacheStorage } = requireCachestorage$1(); + const { kConstruct } = requireSymbols$6(); + undici$1.caches = new CacheStorage(kConstruct); + const { deleteCookie, getCookies, getSetCookies, setCookie } = requireCookies$1(); + undici$1.deleteCookie = deleteCookie; + undici$1.getCookies = getCookies; + undici$1.getSetCookies = getSetCookies; + undici$1.setCookie = setCookie; + const { parseMIMEType, serializeAMimeType } = requireDataUrl(); + undici$1.parseMIMEType = parseMIMEType; + undici$1.serializeAMimeType = serializeAMimeType; + const { CloseEvent, ErrorEvent, MessageEvent } = requireEvents$1(); + undici$1.WebSocket = requireWebsocket$1().WebSocket; + undici$1.CloseEvent = CloseEvent; + undici$1.ErrorEvent = ErrorEvent; + undici$1.MessageEvent = MessageEvent; + undici$1.request = makeDispatcher(api2.request); + undici$1.stream = makeDispatcher(api2.stream); + undici$1.pipeline = makeDispatcher(api2.pipeline); + undici$1.connect = makeDispatcher(api2.connect); + undici$1.upgrade = makeDispatcher(api2.upgrade); + undici$1.MockClient = MockClient; + undici$1.MockPool = MockPool; + undici$1.MockAgent = MockAgent; + undici$1.mockErrors = mockErrors2; + const { EventSource } = requireEventsource(); + undici$1.EventSource = EventSource; + return undici$1; +} +var hasRequiredLib; +function requireLib() { + if (hasRequiredLib) return lib; + hasRequiredLib = 1; + var __createBinding = lib && lib.__createBinding || (Object.create ? (function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + }) : (function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + })); + var __setModuleDefault = lib && lib.__setModuleDefault || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + }) : function(o, v) { + o["default"] = v; + }); + var __importStar = lib && lib.__importStar || /* @__PURE__ */ (function() { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function(o2) { + var ar = []; + for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + } + __setModuleDefault(result, mod); + return result; + }; + })(); + var __awaiter = lib && lib.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(lib, "__esModule", { value: true }); + lib.HttpClient = lib.HttpClientResponse = lib.HttpClientError = lib.MediaTypes = lib.Headers = lib.HttpCodes = void 0; + lib.getProxyUrl = getProxyUrl; + lib.isHttps = isHttps; + const http = __importStar(require$$2$1); + const https = __importStar(require$$3$1); + const pm = __importStar(requireProxy()); + const tunnel2 = __importStar(requireTunnel()); + const undici_1 = requireUndici$1(); + var HttpCodes; + (function(HttpCodes2) { + HttpCodes2[HttpCodes2["OK"] = 200] = "OK"; + HttpCodes2[HttpCodes2["MultipleChoices"] = 300] = "MultipleChoices"; + HttpCodes2[HttpCodes2["MovedPermanently"] = 301] = "MovedPermanently"; + HttpCodes2[HttpCodes2["ResourceMoved"] = 302] = "ResourceMoved"; + HttpCodes2[HttpCodes2["SeeOther"] = 303] = "SeeOther"; + HttpCodes2[HttpCodes2["NotModified"] = 304] = "NotModified"; + HttpCodes2[HttpCodes2["UseProxy"] = 305] = "UseProxy"; + HttpCodes2[HttpCodes2["SwitchProxy"] = 306] = "SwitchProxy"; + HttpCodes2[HttpCodes2["TemporaryRedirect"] = 307] = "TemporaryRedirect"; + HttpCodes2[HttpCodes2["PermanentRedirect"] = 308] = "PermanentRedirect"; + HttpCodes2[HttpCodes2["BadRequest"] = 400] = "BadRequest"; + HttpCodes2[HttpCodes2["Unauthorized"] = 401] = "Unauthorized"; + HttpCodes2[HttpCodes2["PaymentRequired"] = 402] = "PaymentRequired"; + HttpCodes2[HttpCodes2["Forbidden"] = 403] = "Forbidden"; + HttpCodes2[HttpCodes2["NotFound"] = 404] = "NotFound"; + HttpCodes2[HttpCodes2["MethodNotAllowed"] = 405] = "MethodNotAllowed"; + HttpCodes2[HttpCodes2["NotAcceptable"] = 406] = "NotAcceptable"; + HttpCodes2[HttpCodes2["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; + HttpCodes2[HttpCodes2["RequestTimeout"] = 408] = "RequestTimeout"; + HttpCodes2[HttpCodes2["Conflict"] = 409] = "Conflict"; + HttpCodes2[HttpCodes2["Gone"] = 410] = "Gone"; + HttpCodes2[HttpCodes2["TooManyRequests"] = 429] = "TooManyRequests"; + HttpCodes2[HttpCodes2["InternalServerError"] = 500] = "InternalServerError"; + HttpCodes2[HttpCodes2["NotImplemented"] = 501] = "NotImplemented"; + HttpCodes2[HttpCodes2["BadGateway"] = 502] = "BadGateway"; + HttpCodes2[HttpCodes2["ServiceUnavailable"] = 503] = "ServiceUnavailable"; + HttpCodes2[HttpCodes2["GatewayTimeout"] = 504] = "GatewayTimeout"; + })(HttpCodes || (lib.HttpCodes = HttpCodes = {})); + var Headers; + (function(Headers2) { + Headers2["Accept"] = "accept"; + Headers2["ContentType"] = "content-type"; + })(Headers || (lib.Headers = Headers = {})); + var MediaTypes; + (function(MediaTypes2) { + MediaTypes2["ApplicationJson"] = "application/json"; + })(MediaTypes || (lib.MediaTypes = MediaTypes = {})); + function getProxyUrl(serverUrl) { + const proxyUrl = pm.getProxyUrl(new URL(serverUrl)); + return proxyUrl ? proxyUrl.href : ""; + } + const HttpRedirectCodes = [ + HttpCodes.MovedPermanently, + HttpCodes.ResourceMoved, + HttpCodes.SeeOther, + HttpCodes.TemporaryRedirect, + HttpCodes.PermanentRedirect + ]; + const HttpResponseRetryCodes = [ + HttpCodes.BadGateway, + HttpCodes.ServiceUnavailable, + HttpCodes.GatewayTimeout + ]; + const RetryableHttpVerbs = ["OPTIONS", "GET", "DELETE", "HEAD"]; + const ExponentialBackoffCeiling = 10; + const ExponentialBackoffTimeSlice = 5; + class HttpClientError extends Error { + constructor(message, statusCode) { + super(message); + this.name = "HttpClientError"; + this.statusCode = statusCode; + Object.setPrototypeOf(this, HttpClientError.prototype); + } + } + lib.HttpClientError = HttpClientError; + class HttpClientResponse { + constructor(message) { + this.message = message; + } + readBody() { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { + let output = Buffer.alloc(0); + this.message.on("data", (chunk) => { + output = Buffer.concat([output, chunk]); + }); + this.message.on("end", () => { + resolve(output.toString()); + }); + })); + }); + } + readBodyBuffer() { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { + const chunks = []; + this.message.on("data", (chunk) => { + chunks.push(chunk); + }); + this.message.on("end", () => { + resolve(Buffer.concat(chunks)); + }); + })); + }); + } + } + lib.HttpClientResponse = HttpClientResponse; + function isHttps(requestUrl) { + const parsedUrl = new URL(requestUrl); + return parsedUrl.protocol === "https:"; + } + class HttpClient { + constructor(userAgent2, handlers, requestOptions) { + this._ignoreSslError = false; + this._allowRedirects = true; + this._allowRedirectDowngrade = false; + this._maxRedirects = 50; + this._allowRetries = false; + this._maxRetries = 1; + this._keepAlive = false; + this._disposed = false; + this.userAgent = this._getUserAgentWithOrchestrationId(userAgent2); + this.handlers = handlers || []; + this.requestOptions = requestOptions; + if (requestOptions) { + if (requestOptions.ignoreSslError != null) { + this._ignoreSslError = requestOptions.ignoreSslError; + } + this._socketTimeout = requestOptions.socketTimeout; + if (requestOptions.allowRedirects != null) { + this._allowRedirects = requestOptions.allowRedirects; + } + if (requestOptions.allowRedirectDowngrade != null) { + this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; + } + if (requestOptions.maxRedirects != null) { + this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); + } + if (requestOptions.keepAlive != null) { + this._keepAlive = requestOptions.keepAlive; + } + if (requestOptions.allowRetries != null) { + this._allowRetries = requestOptions.allowRetries; + } + if (requestOptions.maxRetries != null) { + this._maxRetries = requestOptions.maxRetries; + } + } + } + options(requestUrl, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request("OPTIONS", requestUrl, null, additionalHeaders || {}); + }); + } + get(requestUrl, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request("GET", requestUrl, null, additionalHeaders || {}); + }); + } + del(requestUrl, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request("DELETE", requestUrl, null, additionalHeaders || {}); + }); + } + post(requestUrl, data, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request("POST", requestUrl, data, additionalHeaders || {}); + }); + } + patch(requestUrl, data, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request("PATCH", requestUrl, data, additionalHeaders || {}); + }); + } + put(requestUrl, data, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request("PUT", requestUrl, data, additionalHeaders || {}); + }); + } + head(requestUrl, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request("HEAD", requestUrl, null, additionalHeaders || {}); + }); + } + sendStream(verb, requestUrl, stream, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request(verb, requestUrl, stream, additionalHeaders); + }); + } + /** + * Gets a typed object from an endpoint + * Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise + */ + getJson(requestUrl_1) { + return __awaiter(this, arguments, void 0, function* (requestUrl, additionalHeaders = {}) { + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + const res = yield this.get(requestUrl, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + postJson(requestUrl_1, obj_1) { + return __awaiter(this, arguments, void 0, function* (requestUrl, obj, additionalHeaders = {}) { + const data = JSON.stringify(obj, null, 2); + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultContentTypeHeader(additionalHeaders, MediaTypes.ApplicationJson); + const res = yield this.post(requestUrl, data, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + putJson(requestUrl_1, obj_1) { + return __awaiter(this, arguments, void 0, function* (requestUrl, obj, additionalHeaders = {}) { + const data = JSON.stringify(obj, null, 2); + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultContentTypeHeader(additionalHeaders, MediaTypes.ApplicationJson); + const res = yield this.put(requestUrl, data, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + patchJson(requestUrl_1, obj_1) { + return __awaiter(this, arguments, void 0, function* (requestUrl, obj, additionalHeaders = {}) { + const data = JSON.stringify(obj, null, 2); + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultContentTypeHeader(additionalHeaders, MediaTypes.ApplicationJson); + const res = yield this.patch(requestUrl, data, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + /** + * Makes a raw http request. + * All other methods such as get, post, patch, and request ultimately call this. + * Prefer get, del, post and patch + */ + request(verb, requestUrl, data, headers2) { + return __awaiter(this, void 0, void 0, function* () { + if (this._disposed) { + throw new Error("Client has already been disposed."); + } + const parsedUrl = new URL(requestUrl); + let info = this._prepareRequest(verb, parsedUrl, headers2); + const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb) ? this._maxRetries + 1 : 1; + let numTries = 0; + let response2; + do { + response2 = yield this.requestRaw(info, data); + if (response2 && response2.message && response2.message.statusCode === HttpCodes.Unauthorized) { + let authenticationHandler; + for (const handler2 of this.handlers) { + if (handler2.canHandleAuthentication(response2)) { + authenticationHandler = handler2; + break; + } + } + if (authenticationHandler) { + return authenticationHandler.handleAuthentication(this, info, data); + } else { + return response2; + } + } + let redirectsRemaining = this._maxRedirects; + while (response2.message.statusCode && HttpRedirectCodes.includes(response2.message.statusCode) && this._allowRedirects && redirectsRemaining > 0) { + const redirectUrl = response2.message.headers["location"]; + if (!redirectUrl) { + break; + } + const parsedRedirectUrl = new URL(redirectUrl); + if (parsedUrl.protocol === "https:" && parsedUrl.protocol !== parsedRedirectUrl.protocol && !this._allowRedirectDowngrade) { + 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."); + } + yield response2.readBody(); + if (parsedRedirectUrl.hostname !== parsedUrl.hostname) { + for (const header in headers2) { + if (header.toLowerCase() === "authorization") { + delete headers2[header]; + } + } + } + info = this._prepareRequest(verb, parsedRedirectUrl, headers2); + response2 = yield this.requestRaw(info, data); + redirectsRemaining--; + } + if (!response2.message.statusCode || !HttpResponseRetryCodes.includes(response2.message.statusCode)) { + return response2; + } + numTries += 1; + if (numTries < maxTries) { + yield response2.readBody(); + yield this._performExponentialBackoff(numTries); + } + } while (numTries < maxTries); + return response2; + }); + } + /** + * Needs to be called if keepAlive is set to true in request options. + */ + dispose() { + if (this._agent) { + this._agent.destroy(); + } + this._disposed = true; + } + /** + * Raw request. + * @param info + * @param data + */ + requestRaw(info, data) { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve, reject) => { + function callbackForResult(err, res) { + if (err) { + reject(err); + } else if (!res) { + reject(new Error("Unknown error")); + } else { + resolve(res); + } + } + this.requestRawWithCallback(info, data, callbackForResult); + }); + }); + } + /** + * Raw request with callback. + * @param info + * @param data + * @param onResult + */ + requestRawWithCallback(info, data, onResult) { + if (typeof data === "string") { + if (!info.options.headers) { + info.options.headers = {}; + } + info.options.headers["Content-Length"] = Buffer.byteLength(data, "utf8"); + } + let callbackCalled = false; + function handleResult(err, res) { + if (!callbackCalled) { + callbackCalled = true; + onResult(err, res); + } + } + const req = info.httpModule.request(info.options, (msg) => { + const res = new HttpClientResponse(msg); + handleResult(void 0, res); + }); + let socket; + req.on("socket", (sock) => { + socket = sock; + }); + req.setTimeout(this._socketTimeout || 3 * 6e4, () => { + if (socket) { + socket.end(); + } + handleResult(new Error(`Request timeout: ${info.options.path}`)); + }); + req.on("error", function(err) { + handleResult(err); + }); + if (data && typeof data === "string") { + req.write(data, "utf8"); + } + if (data && typeof data !== "string") { + data.on("close", function() { + req.end(); + }); + data.pipe(req); + } else { + req.end(); + } + } + /** + * Gets an http agent. This function is useful when you need an http agent that handles + * routing through a proxy server - depending upon the url and proxy environment variables. + * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com + */ + getAgent(serverUrl) { + const parsedUrl = new URL(serverUrl); + return this._getAgent(parsedUrl); + } + getAgentDispatcher(serverUrl) { + const parsedUrl = new URL(serverUrl); + const proxyUrl = pm.getProxyUrl(parsedUrl); + const useProxy = proxyUrl && proxyUrl.hostname; + if (!useProxy) { + return; + } + return this._getProxyAgentDispatcher(parsedUrl, proxyUrl); + } + _prepareRequest(method, requestUrl, headers2) { + const info = {}; + info.parsedUrl = requestUrl; + const usingSsl = info.parsedUrl.protocol === "https:"; + info.httpModule = usingSsl ? https : http; + const defaultPort = usingSsl ? 443 : 80; + info.options = {}; + info.options.host = info.parsedUrl.hostname; + info.options.port = info.parsedUrl.port ? parseInt(info.parsedUrl.port) : defaultPort; + info.options.path = (info.parsedUrl.pathname || "") + (info.parsedUrl.search || ""); + info.options.method = method; + info.options.headers = this._mergeHeaders(headers2); + if (this.userAgent != null) { + info.options.headers["user-agent"] = this.userAgent; + } + info.options.agent = this._getAgent(info.parsedUrl); + if (this.handlers) { + for (const handler2 of this.handlers) { + handler2.prepareRequest(info.options); + } + } + return info; + } + _mergeHeaders(headers2) { + if (this.requestOptions && this.requestOptions.headers) { + return Object.assign({}, lowercaseKeys2(this.requestOptions.headers), lowercaseKeys2(headers2 || {})); + } + return lowercaseKeys2(headers2 || {}); + } + /** + * Gets an existing header value or returns a default. + * Handles converting number header values to strings since HTTP headers must be strings. + * Note: This returns string | string[] since some headers can have multiple values. + * For headers that must always be a single string (like Content-Type), use the + * specialized _getExistingOrDefaultContentTypeHeader method instead. + */ + _getExistingOrDefaultHeader(additionalHeaders, header, _default) { + let clientHeader; + if (this.requestOptions && this.requestOptions.headers) { + const headerValue = lowercaseKeys2(this.requestOptions.headers)[header]; + if (headerValue) { + clientHeader = typeof headerValue === "number" ? headerValue.toString() : headerValue; + } + } + const additionalValue = additionalHeaders[header]; + if (additionalValue !== void 0) { + return typeof additionalValue === "number" ? additionalValue.toString() : additionalValue; + } + if (clientHeader !== void 0) { + return clientHeader; + } + return _default; + } + /** + * Specialized version of _getExistingOrDefaultHeader for Content-Type header. + * Always returns a single string (not an array) since Content-Type should be a single value. + * Converts arrays to comma-separated strings and numbers to strings to ensure type safety. + * This was split from _getExistingOrDefaultHeader to provide stricter typing for callers + * that assign the result to places expecting a string (e.g., additionalHeaders[Headers.ContentType]). + */ + _getExistingOrDefaultContentTypeHeader(additionalHeaders, _default) { + let clientHeader; + if (this.requestOptions && this.requestOptions.headers) { + const headerValue = lowercaseKeys2(this.requestOptions.headers)[Headers.ContentType]; + if (headerValue) { + if (typeof headerValue === "number") { + clientHeader = String(headerValue); + } else if (Array.isArray(headerValue)) { + clientHeader = headerValue.join(", "); + } else { + clientHeader = headerValue; + } + } + } + const additionalValue = additionalHeaders[Headers.ContentType]; + if (additionalValue !== void 0) { + if (typeof additionalValue === "number") { + return String(additionalValue); + } else if (Array.isArray(additionalValue)) { + return additionalValue.join(", "); + } else { + return additionalValue; + } + } + if (clientHeader !== void 0) { + return clientHeader; + } + return _default; + } + _getAgent(parsedUrl) { + let agent2; + const proxyUrl = pm.getProxyUrl(parsedUrl); + const useProxy = proxyUrl && proxyUrl.hostname; + if (this._keepAlive && useProxy) { + agent2 = this._proxyAgent; + } + if (!useProxy) { + agent2 = this._agent; + } + if (agent2) { + return agent2; + } + const usingSsl = parsedUrl.protocol === "https:"; + let maxSockets = 100; + if (this.requestOptions) { + maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets; + } + if (proxyUrl && proxyUrl.hostname) { + const agentOptions = { + maxSockets, + keepAlive: this._keepAlive, + proxy: Object.assign(Object.assign({}, (proxyUrl.username || proxyUrl.password) && { + proxyAuth: `${proxyUrl.username}:${proxyUrl.password}` + }), { host: proxyUrl.hostname, port: proxyUrl.port }) + }; + let tunnelAgent; + const overHttps = proxyUrl.protocol === "https:"; + if (usingSsl) { + tunnelAgent = overHttps ? tunnel2.httpsOverHttps : tunnel2.httpsOverHttp; + } else { + tunnelAgent = overHttps ? tunnel2.httpOverHttps : tunnel2.httpOverHttp; + } + agent2 = tunnelAgent(agentOptions); + this._proxyAgent = agent2; + } + if (!agent2) { + const options = { keepAlive: this._keepAlive, maxSockets }; + agent2 = usingSsl ? new https.Agent(options) : new http.Agent(options); + this._agent = agent2; + } + if (usingSsl && this._ignoreSslError) { + agent2.options = Object.assign(agent2.options || {}, { + rejectUnauthorized: false + }); + } + return agent2; + } + _getProxyAgentDispatcher(parsedUrl, proxyUrl) { + let proxyAgent2; + if (this._keepAlive) { + proxyAgent2 = this._proxyAgentDispatcher; + } + if (proxyAgent2) { + return proxyAgent2; + } + const usingSsl = parsedUrl.protocol === "https:"; + proxyAgent2 = new undici_1.ProxyAgent(Object.assign({ uri: proxyUrl.href, pipelining: !this._keepAlive ? 0 : 1 }, (proxyUrl.username || proxyUrl.password) && { + token: `Basic ${Buffer.from(`${proxyUrl.username}:${proxyUrl.password}`).toString("base64")}` + })); + this._proxyAgentDispatcher = proxyAgent2; + if (usingSsl && this._ignoreSslError) { + proxyAgent2.options = Object.assign(proxyAgent2.options.requestTls || {}, { + rejectUnauthorized: false + }); + } + return proxyAgent2; + } + _getUserAgentWithOrchestrationId(userAgent2) { + const baseUserAgent = userAgent2 || "actions/http-client"; + const orchId = process.env["ACTIONS_ORCHESTRATION_ID"]; + if (orchId) { + const sanitizedId = orchId.replace(/[^a-z0-9_.-]/gi, "_"); + return `${baseUserAgent} actions_orchestration_id/${sanitizedId}`; + } + return baseUserAgent; + } + _performExponentialBackoff(retryNumber) { + return __awaiter(this, void 0, void 0, function* () { + retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); + const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); + return new Promise((resolve) => setTimeout(() => resolve(), ms)); + }); + } + _processResponse(res, options) { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { + const statusCode = res.message.statusCode || 0; + const response2 = { + statusCode, + result: null, + headers: {} + }; + if (statusCode === HttpCodes.NotFound) { + resolve(response2); + } + function dateTimeDeserializer(key, value) { + if (typeof value === "string") { + const a = new Date(value); + if (!isNaN(a.valueOf())) { + return a; + } + } + return value; + } + let obj; + let contents; + try { + contents = yield res.readBody(); + if (contents && contents.length > 0) { + if (options && options.deserializeDates) { + obj = JSON.parse(contents, dateTimeDeserializer); + } else { + obj = JSON.parse(contents); + } + response2.result = obj; + } + response2.headers = res.message.headers; + } catch (err) { + } + if (statusCode > 299) { + let msg; + if (obj && obj.message) { + msg = obj.message; + } else if (contents && contents.length > 0) { + msg = contents; + } else { + msg = `Failed request: (${statusCode})`; + } + const err = new HttpClientError(msg, statusCode); + err.result = response2.result; + reject(err); + } else { + resolve(response2); + } + })); + }); + } + } + lib.HttpClient = HttpClient; + const lowercaseKeys2 = (obj) => Object.keys(obj).reduce((c, k) => (c[k.toLowerCase()] = obj[k], c), {}); + return lib; +} +var auth$1 = {}; +var hasRequiredAuth; +function requireAuth() { + if (hasRequiredAuth) return auth$1; + hasRequiredAuth = 1; + var __awaiter = auth$1 && auth$1.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(auth$1, "__esModule", { value: true }); + auth$1.PersonalAccessTokenCredentialHandler = auth$1.BearerCredentialHandler = auth$1.BasicCredentialHandler = void 0; + class BasicCredentialHandler { + constructor(username, password) { + this.username = username; + this.password = password; + } + prepareRequest(options) { + if (!options.headers) { + throw Error("The request has no headers"); + } + options.headers["Authorization"] = `Basic ${Buffer.from(`${this.username}:${this.password}`).toString("base64")}`; + } + // This handler cannot handle 401 + canHandleAuthentication() { + return false; + } + handleAuthentication() { + return __awaiter(this, void 0, void 0, function* () { + throw new Error("not implemented"); + }); + } + } + auth$1.BasicCredentialHandler = BasicCredentialHandler; + class BearerCredentialHandler { + constructor(token) { + this.token = token; + } + // currently implements pre-authorization + // TODO: support preAuth = false where it hooks on 401 + prepareRequest(options) { + if (!options.headers) { + throw Error("The request has no headers"); + } + options.headers["Authorization"] = `Bearer ${this.token}`; + } + // This handler cannot handle 401 + canHandleAuthentication() { + return false; + } + handleAuthentication() { + return __awaiter(this, void 0, void 0, function* () { + throw new Error("not implemented"); + }); + } + } + auth$1.BearerCredentialHandler = BearerCredentialHandler; + class PersonalAccessTokenCredentialHandler { + constructor(token) { + this.token = token; + } + // currently implements pre-authorization + // TODO: support preAuth = false where it hooks on 401 + prepareRequest(options) { + if (!options.headers) { + throw Error("The request has no headers"); + } + options.headers["Authorization"] = `Basic ${Buffer.from(`PAT:${this.token}`).toString("base64")}`; + } + // This handler cannot handle 401 + canHandleAuthentication() { + return false; + } + handleAuthentication() { + return __awaiter(this, void 0, void 0, function* () { + throw new Error("not implemented"); + }); + } + } + auth$1.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler; + return auth$1; +} +var hasRequiredOidcUtils; +function requireOidcUtils() { + if (hasRequiredOidcUtils) return oidcUtils; + hasRequiredOidcUtils = 1; + var __awaiter = oidcUtils && oidcUtils.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(oidcUtils, "__esModule", { value: true }); + oidcUtils.OidcClient = void 0; + const http_client_1 = requireLib(); + const auth_1 = requireAuth(); + const core_1 = requireCore(); + class OidcClient { + static createHttpClient(allowRetry = true, maxRetry = 10) { + const requestOptions = { + allowRetries: allowRetry, + maxRetries: maxRetry + }; + return new http_client_1.HttpClient("actions/oidc-client", [new auth_1.BearerCredentialHandler(OidcClient.getRequestToken())], requestOptions); + } + static getRequestToken() { + const token = process.env["ACTIONS_ID_TOKEN_REQUEST_TOKEN"]; + if (!token) { + throw new Error("Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable"); + } + return token; + } + static getIDTokenUrl() { + const runtimeUrl = process.env["ACTIONS_ID_TOKEN_REQUEST_URL"]; + if (!runtimeUrl) { + throw new Error("Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable"); + } + return runtimeUrl; + } + static getCall(id_token_url) { + return __awaiter(this, void 0, void 0, function* () { + var _a2; + const httpclient = OidcClient.createHttpClient(); + const res = yield httpclient.getJson(id_token_url).catch((error) => { + throw new Error(`Failed to get ID Token. + + Error Code : ${error.statusCode} + + Error Message: ${error.message}`); + }); + const id_token = (_a2 = res.result) === null || _a2 === void 0 ? void 0 : _a2.value; + if (!id_token) { + throw new Error("Response json body do not have ID Token field"); + } + return id_token; + }); + } + static getIDToken(audience) { + return __awaiter(this, void 0, void 0, function* () { + try { + let id_token_url = OidcClient.getIDTokenUrl(); + if (audience) { + const encodedAudience = encodeURIComponent(audience); + id_token_url = `${id_token_url}&audience=${encodedAudience}`; + } + (0, core_1.debug)(`ID token url is ${id_token_url}`); + const id_token = yield OidcClient.getCall(id_token_url); + (0, core_1.setSecret)(id_token); + return id_token; + } catch (error) { + throw new Error(`Error message: ${error.message}`); + } + }); + } + } + oidcUtils.OidcClient = OidcClient; + return oidcUtils; +} +var summary = {}; +var hasRequiredSummary; +function requireSummary() { + if (hasRequiredSummary) return summary; + hasRequiredSummary = 1; + (function(exports$1) { + var __awaiter = summary && summary.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports$1, "__esModule", { value: true }); + exports$1.summary = exports$1.markdownSummary = exports$1.SUMMARY_DOCS_URL = exports$1.SUMMARY_ENV_VAR = void 0; + const os_1 = require$$0; + const fs_1 = require$$1; + const { access, appendFile, writeFile } = fs_1.promises; + exports$1.SUMMARY_ENV_VAR = "GITHUB_STEP_SUMMARY"; + exports$1.SUMMARY_DOCS_URL = "https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary"; + class Summary { + constructor() { + this._buffer = ""; + } + /** + * Finds the summary file path from the environment, rejects if env var is not found or file does not exist + * Also checks r/w permissions. + * + * @returns step summary file path + */ + filePath() { + return __awaiter(this, void 0, void 0, function* () { + if (this._filePath) { + return this._filePath; + } + const pathFromEnv = process.env[exports$1.SUMMARY_ENV_VAR]; + if (!pathFromEnv) { + throw new Error(`Unable to find environment variable for $${exports$1.SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`); + } + try { + yield access(pathFromEnv, fs_1.constants.R_OK | fs_1.constants.W_OK); + } catch (_a2) { + throw new Error(`Unable to access summary file: '${pathFromEnv}'. Check if the file has correct read/write permissions.`); + } + this._filePath = pathFromEnv; + return this._filePath; + }); + } + /** + * Wraps content in an HTML tag, adding any HTML attributes + * + * @param {string} tag HTML tag to wrap + * @param {string | null} content content within the tag + * @param {[attribute: string]: string} attrs key-value list of HTML attributes to add + * + * @returns {string} content wrapped in HTML element + */ + wrap(tag, content, attrs = {}) { + const htmlAttrs = Object.entries(attrs).map(([key, value]) => ` ${key}="${value}"`).join(""); + if (!content) { + return `<${tag}${htmlAttrs}>`; + } + return `<${tag}${htmlAttrs}>${content}`; + } + /** + * Writes text in the buffer to the summary buffer file and empties buffer. Will append by default. + * + * @param {SummaryWriteOptions} [options] (optional) options for write operation + * + * @returns {Promise} summary instance + */ + write(options) { + return __awaiter(this, void 0, void 0, function* () { + const overwrite = !!(options === null || options === void 0 ? void 0 : options.overwrite); + const filePath = yield this.filePath(); + const writeFunc = overwrite ? writeFile : appendFile; + yield writeFunc(filePath, this._buffer, { encoding: "utf8" }); + return this.emptyBuffer(); + }); + } + /** + * Clears the summary buffer and wipes the summary file + * + * @returns {Summary} summary instance + */ + clear() { + return __awaiter(this, void 0, void 0, function* () { + return this.emptyBuffer().write({ overwrite: true }); + }); + } + /** + * Returns the current summary buffer as a string + * + * @returns {string} string of summary buffer + */ + stringify() { + return this._buffer; + } + /** + * If the summary buffer is empty + * + * @returns {boolen} true if the buffer is empty + */ + isEmptyBuffer() { + return this._buffer.length === 0; + } + /** + * Resets the summary buffer without writing to summary file + * + * @returns {Summary} summary instance + */ + emptyBuffer() { + this._buffer = ""; + return this; + } + /** + * Adds raw text to the summary buffer + * + * @param {string} text content to add + * @param {boolean} [addEOL=false] (optional) append an EOL to the raw text (default: false) + * + * @returns {Summary} summary instance + */ + addRaw(text, addEOL = false) { + this._buffer += text; + return addEOL ? this.addEOL() : this; + } + /** + * Adds the operating system-specific end-of-line marker to the buffer + * + * @returns {Summary} summary instance + */ + addEOL() { + return this.addRaw(os_1.EOL); + } + /** + * Adds an HTML codeblock to the summary buffer + * + * @param {string} code content to render within fenced code block + * @param {string} lang (optional) language to syntax highlight code + * + * @returns {Summary} summary instance + */ + addCodeBlock(code, lang) { + const attrs = Object.assign({}, lang && { lang }); + const element = this.wrap("pre", this.wrap("code", code), attrs); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML list to the summary buffer + * + * @param {string[]} items list of items to render + * @param {boolean} [ordered=false] (optional) if the rendered list should be ordered or not (default: false) + * + * @returns {Summary} summary instance + */ + addList(items, ordered = false) { + const tag = ordered ? "ol" : "ul"; + const listItems = items.map((item) => this.wrap("li", item)).join(""); + const element = this.wrap(tag, listItems); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML table to the summary buffer + * + * @param {SummaryTableCell[]} rows table rows + * + * @returns {Summary} summary instance + */ + addTable(rows) { + const tableBody = rows.map((row) => { + const cells = row.map((cell) => { + if (typeof cell === "string") { + return this.wrap("td", cell); + } + const { header, data, colspan, rowspan } = cell; + const tag = header ? "th" : "td"; + const attrs = Object.assign(Object.assign({}, colspan && { colspan }), rowspan && { rowspan }); + return this.wrap(tag, data, attrs); + }).join(""); + return this.wrap("tr", cells); + }).join(""); + const element = this.wrap("table", tableBody); + return this.addRaw(element).addEOL(); + } + /** + * Adds a collapsable HTML details element to the summary buffer + * + * @param {string} label text for the closed state + * @param {string} content collapsable content + * + * @returns {Summary} summary instance + */ + addDetails(label, content) { + const element = this.wrap("details", this.wrap("summary", label) + content); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML image tag to the summary buffer + * + * @param {string} src path to the image you to embed + * @param {string} alt text description of the image + * @param {SummaryImageOptions} options (optional) addition image attributes + * + * @returns {Summary} summary instance + */ + addImage(src, alt, options) { + const { width, height } = options || {}; + const attrs = Object.assign(Object.assign({}, width && { width }), height && { height }); + const element = this.wrap("img", null, Object.assign({ src, alt }, attrs)); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML section heading element + * + * @param {string} text heading text + * @param {number | string} [level=1] (optional) the heading level, default: 1 + * + * @returns {Summary} summary instance + */ + addHeading(text, level) { + const tag = `h${level}`; + const allowedTag = ["h1", "h2", "h3", "h4", "h5", "h6"].includes(tag) ? tag : "h1"; + const element = this.wrap(allowedTag, text); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML thematic break (
) to the summary buffer + * + * @returns {Summary} summary instance + */ + addSeparator() { + const element = this.wrap("hr", null); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML line break (
) to the summary buffer + * + * @returns {Summary} summary instance + */ + addBreak() { + const element = this.wrap("br", null); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML blockquote to the summary buffer + * + * @param {string} text quote text + * @param {string} cite (optional) citation url + * + * @returns {Summary} summary instance + */ + addQuote(text, cite) { + const attrs = Object.assign({}, cite && { cite }); + const element = this.wrap("blockquote", text, attrs); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML anchor tag to the summary buffer + * + * @param {string} text link text/content + * @param {string} href hyperlink + * + * @returns {Summary} summary instance + */ + addLink(text, href) { + const element = this.wrap("a", text, { href }); + return this.addRaw(element).addEOL(); + } + } + const _summary = new Summary(); + exports$1.markdownSummary = _summary; + exports$1.summary = _summary; + })(summary); + return summary; +} +var pathUtils = {}; +var hasRequiredPathUtils; +function requirePathUtils() { + if (hasRequiredPathUtils) return pathUtils; + hasRequiredPathUtils = 1; + var __createBinding = pathUtils && pathUtils.__createBinding || (Object.create ? (function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + }) : (function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + })); + var __setModuleDefault = pathUtils && pathUtils.__setModuleDefault || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + }) : function(o, v) { + o["default"] = v; + }); + var __importStar = pathUtils && pathUtils.__importStar || /* @__PURE__ */ (function() { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function(o2) { + var ar = []; + for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + } + __setModuleDefault(result, mod); + return result; + }; + })(); + Object.defineProperty(pathUtils, "__esModule", { value: true }); + pathUtils.toPosixPath = toPosixPath; + pathUtils.toWin32Path = toWin32Path; + pathUtils.toPlatformPath = toPlatformPath; + const path = __importStar(require$$1$8); + function toPosixPath(pth) { + return pth.replace(/[\\]/g, "/"); + } + function toWin32Path(pth) { + return pth.replace(/[/]/g, "\\"); + } + function toPlatformPath(pth) { + return pth.replace(/[/\\]/g, path.sep); + } + return pathUtils; +} +var platform = {}; +var exec = {}; +var toolrunner = {}; +var io = {}; +var ioUtil = {}; +var hasRequiredIoUtil; +function requireIoUtil() { + if (hasRequiredIoUtil) return ioUtil; + hasRequiredIoUtil = 1; + (function(exports$1) { + var __createBinding = ioUtil && ioUtil.__createBinding || (Object.create ? (function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + }) : (function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + })); + var __setModuleDefault = ioUtil && ioUtil.__setModuleDefault || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + }) : function(o, v) { + o["default"] = v; + }); + var __importStar = ioUtil && ioUtil.__importStar || /* @__PURE__ */ (function() { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function(o2) { + var ar = []; + for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + } + __setModuleDefault(result, mod); + return result; + }; + })(); + var __awaiter = ioUtil && ioUtil.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + var _a2; + Object.defineProperty(exports$1, "__esModule", { value: true }); + exports$1.READONLY = exports$1.UV_FS_O_EXLOCK = exports$1.IS_WINDOWS = exports$1.unlink = exports$1.symlink = exports$1.stat = exports$1.rmdir = exports$1.rm = exports$1.rename = exports$1.readdir = exports$1.open = exports$1.mkdir = exports$1.lstat = exports$1.copyFile = exports$1.chmod = void 0; + exports$1.readlink = readlink; + exports$1.exists = exists; + exports$1.isDirectory = isDirectory; + exports$1.isRooted = isRooted; + exports$1.tryGetExecutablePath = tryGetExecutablePath; + exports$1.getCmdPath = getCmdPath; + const fs = __importStar(require$$1); + const path = __importStar(require$$1$8); + _a2 = fs.promises, exports$1.chmod = _a2.chmod, exports$1.copyFile = _a2.copyFile, exports$1.lstat = _a2.lstat, exports$1.mkdir = _a2.mkdir, exports$1.open = _a2.open, exports$1.readdir = _a2.readdir, exports$1.rename = _a2.rename, exports$1.rm = _a2.rm, exports$1.rmdir = _a2.rmdir, exports$1.stat = _a2.stat, exports$1.symlink = _a2.symlink, exports$1.unlink = _a2.unlink; + exports$1.IS_WINDOWS = process.platform === "win32"; + function readlink(fsPath) { + return __awaiter(this, void 0, void 0, function* () { + const result = yield fs.promises.readlink(fsPath); + if (exports$1.IS_WINDOWS && !result.endsWith("\\")) { + return `${result}\\`; + } + return result; + }); + } + exports$1.UV_FS_O_EXLOCK = 268435456; + exports$1.READONLY = fs.constants.O_RDONLY; + function exists(fsPath) { + return __awaiter(this, void 0, void 0, function* () { + try { + yield (0, exports$1.stat)(fsPath); + } catch (err) { + if (err.code === "ENOENT") { + return false; + } + throw err; + } + return true; + }); + } + function isDirectory(fsPath_1) { + return __awaiter(this, arguments, void 0, function* (fsPath, useStat = false) { + const stats = useStat ? yield (0, exports$1.stat)(fsPath) : yield (0, exports$1.lstat)(fsPath); + return stats.isDirectory(); + }); + } + function isRooted(p) { + p = normalizeSeparators(p); + if (!p) { + throw new Error('isRooted() parameter "p" cannot be empty'); + } + if (exports$1.IS_WINDOWS) { + return p.startsWith("\\") || /^[A-Z]:/i.test(p); + } + return p.startsWith("/"); + } + function tryGetExecutablePath(filePath, extensions) { + return __awaiter(this, void 0, void 0, function* () { + let stats = void 0; + try { + stats = yield (0, exports$1.stat)(filePath); + } catch (err) { + if (err.code !== "ENOENT") { + console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); + } + } + if (stats && stats.isFile()) { + if (exports$1.IS_WINDOWS) { + const upperExt = path.extname(filePath).toUpperCase(); + if (extensions.some((validExt) => validExt.toUpperCase() === upperExt)) { + return filePath; + } + } else { + if (isUnixExecutable(stats)) { + return filePath; + } + } + } + const originalFilePath = filePath; + for (const extension of extensions) { + filePath = originalFilePath + extension; + stats = void 0; + try { + stats = yield (0, exports$1.stat)(filePath); + } catch (err) { + if (err.code !== "ENOENT") { + console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); + } + } + if (stats && stats.isFile()) { + if (exports$1.IS_WINDOWS) { + try { + const directory = path.dirname(filePath); + const upperName = path.basename(filePath).toUpperCase(); + for (const actualName of yield (0, exports$1.readdir)(directory)) { + if (upperName === actualName.toUpperCase()) { + filePath = path.join(directory, actualName); + break; + } + } + } catch (err) { + console.log(`Unexpected error attempting to determine the actual case of the file '${filePath}': ${err}`); + } + return filePath; + } else { + if (isUnixExecutable(stats)) { + return filePath; + } + } + } + } + return ""; + }); + } + function normalizeSeparators(p) { + p = p || ""; + if (exports$1.IS_WINDOWS) { + p = p.replace(/\//g, "\\"); + return p.replace(/\\\\+/g, "\\"); + } + return p.replace(/\/\/+/g, "/"); + } + function isUnixExecutable(stats) { + return (stats.mode & 1) > 0 || (stats.mode & 8) > 0 && process.getgid !== void 0 && stats.gid === process.getgid() || (stats.mode & 64) > 0 && process.getuid !== void 0 && stats.uid === process.getuid(); + } + function getCmdPath() { + var _a3; + return (_a3 = process.env["COMSPEC"]) !== null && _a3 !== void 0 ? _a3 : `cmd.exe`; + } + })(ioUtil); + return ioUtil; +} +var hasRequiredIo; +function requireIo() { + if (hasRequiredIo) return io; + hasRequiredIo = 1; + var __createBinding = io && io.__createBinding || (Object.create ? (function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + }) : (function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + })); + var __setModuleDefault = io && io.__setModuleDefault || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + }) : function(o, v) { + o["default"] = v; + }); + var __importStar = io && io.__importStar || /* @__PURE__ */ (function() { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function(o2) { + var ar = []; + for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + } + __setModuleDefault(result, mod); + return result; + }; + })(); + var __awaiter = io && io.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(io, "__esModule", { value: true }); + io.cp = cp; + io.mv = mv; + io.rmRF = rmRF; + io.mkdirP = mkdirP; + io.which = which; + io.findInPath = findInPath; + const assert_1 = require$$0$9; + const path = __importStar(require$$1$8); + const ioUtil2 = __importStar(requireIoUtil()); + function cp(source_1, dest_1) { + return __awaiter(this, arguments, void 0, function* (source, dest, options = {}) { + const { force, recursive, copySourceDirectory } = readCopyOptions(options); + const destStat = (yield ioUtil2.exists(dest)) ? yield ioUtil2.stat(dest) : null; + if (destStat && destStat.isFile() && !force) { + return; + } + const newDest = destStat && destStat.isDirectory() && copySourceDirectory ? path.join(dest, path.basename(source)) : dest; + if (!(yield ioUtil2.exists(source))) { + throw new Error(`no such file or directory: ${source}`); + } + const sourceStat = yield ioUtil2.stat(source); + if (sourceStat.isDirectory()) { + if (!recursive) { + throw new Error(`Failed to copy. ${source} is a directory, but tried to copy without recursive flag.`); + } else { + yield cpDirRecursive(source, newDest, 0, force); + } + } else { + if (path.relative(source, newDest) === "") { + throw new Error(`'${newDest}' and '${source}' are the same file`); + } + yield copyFile(source, newDest, force); + } + }); + } + function mv(source_1, dest_1) { + return __awaiter(this, arguments, void 0, function* (source, dest, options = {}) { + if (yield ioUtil2.exists(dest)) { + let destExists = true; + if (yield ioUtil2.isDirectory(dest)) { + dest = path.join(dest, path.basename(source)); + destExists = yield ioUtil2.exists(dest); + } + if (destExists) { + if (options.force == null || options.force) { + yield rmRF(dest); + } else { + throw new Error("Destination already exists"); + } + } + } + yield mkdirP(path.dirname(dest)); + yield ioUtil2.rename(source, dest); + }); + } + function rmRF(inputPath) { + return __awaiter(this, void 0, void 0, function* () { + if (ioUtil2.IS_WINDOWS) { + if (/[*"<>|]/.test(inputPath)) { + throw new Error('File path must not contain `*`, `"`, `<`, `>` or `|` on Windows'); + } + } + try { + yield ioUtil2.rm(inputPath, { + force: true, + maxRetries: 3, + recursive: true, + retryDelay: 300 + }); + } catch (err) { + throw new Error(`File was unable to be removed ${err}`); + } + }); + } + function mkdirP(fsPath) { + return __awaiter(this, void 0, void 0, function* () { + (0, assert_1.ok)(fsPath, "a path argument must be provided"); + yield ioUtil2.mkdir(fsPath, { recursive: true }); + }); + } + function which(tool, check) { + return __awaiter(this, void 0, void 0, function* () { + if (!tool) { + throw new Error("parameter 'tool' is required"); + } + if (check) { + const result = yield which(tool, false); + if (!result) { + if (ioUtil2.IS_WINDOWS) { + throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.`); + } else { + throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.`); + } + } + return result; + } + const matches = yield findInPath(tool); + if (matches && matches.length > 0) { + return matches[0]; + } + return ""; + }); + } + function findInPath(tool) { + return __awaiter(this, void 0, void 0, function* () { + if (!tool) { + throw new Error("parameter 'tool' is required"); + } + const extensions = []; + if (ioUtil2.IS_WINDOWS && process.env["PATHEXT"]) { + for (const extension of process.env["PATHEXT"].split(path.delimiter)) { + if (extension) { + extensions.push(extension); + } + } + } + if (ioUtil2.isRooted(tool)) { + const filePath = yield ioUtil2.tryGetExecutablePath(tool, extensions); + if (filePath) { + return [filePath]; + } + return []; + } + if (tool.includes(path.sep)) { + return []; + } + const directories = []; + if (process.env.PATH) { + for (const p of process.env.PATH.split(path.delimiter)) { + if (p) { + directories.push(p); + } + } + } + const matches = []; + for (const directory of directories) { + const filePath = yield ioUtil2.tryGetExecutablePath(path.join(directory, tool), extensions); + if (filePath) { + matches.push(filePath); + } + } + return matches; + }); + } + function readCopyOptions(options) { + const force = options.force == null ? true : options.force; + const recursive = Boolean(options.recursive); + const copySourceDirectory = options.copySourceDirectory == null ? true : Boolean(options.copySourceDirectory); + return { force, recursive, copySourceDirectory }; + } + function cpDirRecursive(sourceDir, destDir, currentDepth, force) { + return __awaiter(this, void 0, void 0, function* () { + if (currentDepth >= 255) + return; + currentDepth++; + yield mkdirP(destDir); + const files = yield ioUtil2.readdir(sourceDir); + for (const fileName of files) { + const srcFile = `${sourceDir}/${fileName}`; + const destFile = `${destDir}/${fileName}`; + const srcFileStat = yield ioUtil2.lstat(srcFile); + if (srcFileStat.isDirectory()) { + yield cpDirRecursive(srcFile, destFile, currentDepth, force); + } else { + yield copyFile(srcFile, destFile, force); + } + } + yield ioUtil2.chmod(destDir, (yield ioUtil2.stat(sourceDir)).mode); + }); + } + function copyFile(srcFile, destFile, force) { + return __awaiter(this, void 0, void 0, function* () { + if ((yield ioUtil2.lstat(srcFile)).isSymbolicLink()) { + try { + yield ioUtil2.lstat(destFile); + yield ioUtil2.unlink(destFile); + } catch (e) { + if (e.code === "EPERM") { + yield ioUtil2.chmod(destFile, "0666"); + yield ioUtil2.unlink(destFile); + } + } + const symlinkFull = yield ioUtil2.readlink(srcFile); + yield ioUtil2.symlink(symlinkFull, destFile, ioUtil2.IS_WINDOWS ? "junction" : null); + } else if (!(yield ioUtil2.exists(destFile)) || force) { + yield ioUtil2.copyFile(srcFile, destFile); + } + }); + } + return io; +} +var hasRequiredToolrunner; +function requireToolrunner() { + if (hasRequiredToolrunner) return toolrunner; + hasRequiredToolrunner = 1; + var __createBinding = toolrunner && toolrunner.__createBinding || (Object.create ? (function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + }) : (function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + })); + var __setModuleDefault = toolrunner && toolrunner.__setModuleDefault || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + }) : function(o, v) { + o["default"] = v; + }); + var __importStar = toolrunner && toolrunner.__importStar || /* @__PURE__ */ (function() { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function(o2) { + var ar = []; + for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + } + __setModuleDefault(result, mod); + return result; + }; + })(); + var __awaiter = toolrunner && toolrunner.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(toolrunner, "__esModule", { value: true }); + toolrunner.ToolRunner = void 0; + toolrunner.argStringToArray = argStringToArray; + const os = __importStar(require$$0); + const events2 = __importStar(require$$4$1); + const child = __importStar(require$$2$3); + const path = __importStar(require$$1$8); + const io2 = __importStar(requireIo()); + const ioUtil2 = __importStar(requireIoUtil()); + const timers_1 = require$$6; + const IS_WINDOWS = process.platform === "win32"; + class ToolRunner extends events2.EventEmitter { + constructor(toolPath, args, options) { + super(); + if (!toolPath) { + throw new Error("Parameter 'toolPath' cannot be null or empty."); + } + this.toolPath = toolPath; + this.args = args || []; + this.options = options || {}; + } + _debug(message) { + if (this.options.listeners && this.options.listeners.debug) { + this.options.listeners.debug(message); + } + } + _getCommandString(options, noPrefix) { + const toolPath = this._getSpawnFileName(); + const args = this._getSpawnArgs(options); + let cmd = noPrefix ? "" : "[command]"; + if (IS_WINDOWS) { + if (this._isCmdFile()) { + cmd += toolPath; + for (const a of args) { + cmd += ` ${a}`; + } + } else if (options.windowsVerbatimArguments) { + cmd += `"${toolPath}"`; + for (const a of args) { + cmd += ` ${a}`; + } + } else { + cmd += this._windowsQuoteCmdArg(toolPath); + for (const a of args) { + cmd += ` ${this._windowsQuoteCmdArg(a)}`; + } + } + } else { + cmd += toolPath; + for (const a of args) { + cmd += ` ${a}`; + } + } + return cmd; + } + _processLineBuffer(data, strBuffer, onLine) { + try { + let s = strBuffer + data.toString(); + let n = s.indexOf(os.EOL); + while (n > -1) { + const line = s.substring(0, n); + onLine(line); + s = s.substring(n + os.EOL.length); + n = s.indexOf(os.EOL); + } + return s; + } catch (err) { + this._debug(`error processing line. Failed with error ${err}`); + return ""; + } + } + _getSpawnFileName() { + if (IS_WINDOWS) { + if (this._isCmdFile()) { + return process.env["COMSPEC"] || "cmd.exe"; + } + } + return this.toolPath; + } + _getSpawnArgs(options) { + if (IS_WINDOWS) { + if (this._isCmdFile()) { + let argline = `/D /S /C "${this._windowsQuoteCmdArg(this.toolPath)}`; + for (const a of this.args) { + argline += " "; + argline += options.windowsVerbatimArguments ? a : this._windowsQuoteCmdArg(a); + } + argline += '"'; + return [argline]; + } + } + return this.args; + } + _endsWith(str, end) { + return str.endsWith(end); + } + _isCmdFile() { + const upperToolPath = this.toolPath.toUpperCase(); + return this._endsWith(upperToolPath, ".CMD") || this._endsWith(upperToolPath, ".BAT"); + } + _windowsQuoteCmdArg(arg) { + if (!this._isCmdFile()) { + return this._uvQuoteCmdArg(arg); + } + if (!arg) { + return '""'; + } + const cmdSpecialChars = [ + " ", + " ", + "&", + "(", + ")", + "[", + "]", + "{", + "}", + "^", + "=", + ";", + "!", + "'", + "+", + ",", + "`", + "~", + "|", + "<", + ">", + '"' + ]; + let needsQuotes = false; + for (const char of arg) { + if (cmdSpecialChars.some((x) => x === char)) { + needsQuotes = true; + break; + } + } + if (!needsQuotes) { + return arg; + } + let reverse = '"'; + let quoteHit = true; + for (let i = arg.length; i > 0; i--) { + reverse += arg[i - 1]; + if (quoteHit && arg[i - 1] === "\\") { + reverse += "\\"; + } else if (arg[i - 1] === '"') { + quoteHit = true; + reverse += '"'; + } else { + quoteHit = false; + } + } + reverse += '"'; + return reverse.split("").reverse().join(""); + } + _uvQuoteCmdArg(arg) { + if (!arg) { + return '""'; + } + if (!arg.includes(" ") && !arg.includes(" ") && !arg.includes('"')) { + return arg; + } + if (!arg.includes('"') && !arg.includes("\\")) { + return `"${arg}"`; + } + let reverse = '"'; + let quoteHit = true; + for (let i = arg.length; i > 0; i--) { + reverse += arg[i - 1]; + if (quoteHit && arg[i - 1] === "\\") { + reverse += "\\"; + } else if (arg[i - 1] === '"') { + quoteHit = true; + reverse += "\\"; + } else { + quoteHit = false; + } + } + reverse += '"'; + return reverse.split("").reverse().join(""); + } + _cloneExecOptions(options) { + options = options || {}; + const result = { + cwd: options.cwd || process.cwd(), + env: options.env || process.env, + silent: options.silent || false, + windowsVerbatimArguments: options.windowsVerbatimArguments || false, + failOnStdErr: options.failOnStdErr || false, + ignoreReturnCode: options.ignoreReturnCode || false, + delay: options.delay || 1e4 + }; + result.outStream = options.outStream || process.stdout; + result.errStream = options.errStream || process.stderr; + return result; + } + _getSpawnOptions(options, toolPath) { + options = options || {}; + const result = {}; + result.cwd = options.cwd; + result.env = options.env; + result["windowsVerbatimArguments"] = options.windowsVerbatimArguments || this._isCmdFile(); + if (options.windowsVerbatimArguments) { + result.argv0 = `"${toolPath}"`; + } + return result; + } + /** + * Exec a tool. + * Output will be streamed to the live console. + * Returns promise with return code + * + * @param tool path to tool to exec + * @param options optional exec options. See ExecOptions + * @returns number + */ + exec() { + return __awaiter(this, void 0, void 0, function* () { + if (!ioUtil2.isRooted(this.toolPath) && (this.toolPath.includes("/") || IS_WINDOWS && this.toolPath.includes("\\"))) { + this.toolPath = path.resolve(process.cwd(), this.options.cwd || process.cwd(), this.toolPath); + } + this.toolPath = yield io2.which(this.toolPath, true); + return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { + this._debug(`exec tool: ${this.toolPath}`); + this._debug("arguments:"); + for (const arg of this.args) { + this._debug(` ${arg}`); + } + const optionsNonNull = this._cloneExecOptions(this.options); + if (!optionsNonNull.silent && optionsNonNull.outStream) { + optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os.EOL); + } + const state = new ExecState(optionsNonNull, this.toolPath); + state.on("debug", (message) => { + this._debug(message); + }); + if (this.options.cwd && !(yield ioUtil2.exists(this.options.cwd))) { + return reject(new Error(`The cwd: ${this.options.cwd} does not exist!`)); + } + const fileName = this._getSpawnFileName(); + const cp = child.spawn(fileName, this._getSpawnArgs(optionsNonNull), this._getSpawnOptions(this.options, fileName)); + let stdbuffer = ""; + if (cp.stdout) { + cp.stdout.on("data", (data) => { + if (this.options.listeners && this.options.listeners.stdout) { + this.options.listeners.stdout(data); + } + if (!optionsNonNull.silent && optionsNonNull.outStream) { + optionsNonNull.outStream.write(data); + } + stdbuffer = this._processLineBuffer(data, stdbuffer, (line) => { + if (this.options.listeners && this.options.listeners.stdline) { + this.options.listeners.stdline(line); + } + }); + }); + } + let errbuffer = ""; + if (cp.stderr) { + cp.stderr.on("data", (data) => { + state.processStderr = true; + if (this.options.listeners && this.options.listeners.stderr) { + this.options.listeners.stderr(data); + } + if (!optionsNonNull.silent && optionsNonNull.errStream && optionsNonNull.outStream) { + const s = optionsNonNull.failOnStdErr ? optionsNonNull.errStream : optionsNonNull.outStream; + s.write(data); + } + errbuffer = this._processLineBuffer(data, errbuffer, (line) => { + if (this.options.listeners && this.options.listeners.errline) { + this.options.listeners.errline(line); + } + }); + }); + } + cp.on("error", (err) => { + state.processError = err.message; + state.processExited = true; + state.processClosed = true; + state.CheckComplete(); + }); + cp.on("exit", (code) => { + state.processExitCode = code; + state.processExited = true; + this._debug(`Exit code ${code} received from tool '${this.toolPath}'`); + state.CheckComplete(); + }); + cp.on("close", (code) => { + state.processExitCode = code; + state.processExited = true; + state.processClosed = true; + this._debug(`STDIO streams have closed for tool '${this.toolPath}'`); + state.CheckComplete(); + }); + state.on("done", (error, exitCode) => { + if (stdbuffer.length > 0) { + this.emit("stdline", stdbuffer); + } + if (errbuffer.length > 0) { + this.emit("errline", errbuffer); + } + cp.removeAllListeners(); + if (error) { + reject(error); + } else { + resolve(exitCode); + } + }); + if (this.options.input) { + if (!cp.stdin) { + throw new Error("child process missing stdin"); + } + cp.stdin.end(this.options.input); + } + })); + }); + } + } + toolrunner.ToolRunner = ToolRunner; + function argStringToArray(argString) { + const args = []; + let inQuotes = false; + let escaped = false; + let arg = ""; + function append(c) { + if (escaped && c !== '"') { + arg += "\\"; + } + arg += c; + escaped = false; + } + for (let i = 0; i < argString.length; i++) { + const c = argString.charAt(i); + if (c === '"') { + if (!escaped) { + inQuotes = !inQuotes; + } else { + append(c); + } + continue; + } + if (c === "\\" && escaped) { + append(c); + continue; + } + if (c === "\\" && inQuotes) { + escaped = true; + continue; + } + if (c === " " && !inQuotes) { + if (arg.length > 0) { + args.push(arg); + arg = ""; + } + continue; + } + append(c); + } + if (arg.length > 0) { + args.push(arg.trim()); + } + return args; + } + class ExecState extends events2.EventEmitter { + constructor(options, toolPath) { + super(); + this.processClosed = false; + this.processError = ""; + this.processExitCode = 0; + this.processExited = false; + this.processStderr = false; + this.delay = 1e4; + this.done = false; + this.timeout = null; + if (!toolPath) { + throw new Error("toolPath must not be empty"); + } + this.options = options; + this.toolPath = toolPath; + if (options.delay) { + this.delay = options.delay; + } + } + CheckComplete() { + if (this.done) { + return; + } + if (this.processClosed) { + this._setResult(); + } else if (this.processExited) { + this.timeout = (0, timers_1.setTimeout)(ExecState.HandleTimeout, this.delay, this); + } + } + _debug(message) { + this.emit("debug", message); + } + _setResult() { + let error; + if (this.processExited) { + if (this.processError) { + error = new Error(`There was an error when attempting to execute the process '${this.toolPath}'. This may indicate the process failed to start. Error: ${this.processError}`); + } else if (this.processExitCode !== 0 && !this.options.ignoreReturnCode) { + error = new Error(`The process '${this.toolPath}' failed with exit code ${this.processExitCode}`); + } else if (this.processStderr && this.options.failOnStdErr) { + error = new Error(`The process '${this.toolPath}' failed because one or more lines were written to the STDERR stream`); + } + } + if (this.timeout) { + clearTimeout(this.timeout); + this.timeout = null; + } + this.done = true; + this.emit("done", error, this.processExitCode); + } + static HandleTimeout(state) { + if (state.done) { + return; + } + if (!state.processClosed && state.processExited) { + const message = `The STDIO streams did not close within ${state.delay / 1e3} seconds of the exit event from process '${state.toolPath}'. This may indicate a child process inherited the STDIO streams and has not yet exited.`; + state._debug(message); + } + state._setResult(); + } + } + return toolrunner; +} +var hasRequiredExec; +function requireExec() { + if (hasRequiredExec) return exec; + hasRequiredExec = 1; + var __createBinding = exec && exec.__createBinding || (Object.create ? (function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + }) : (function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + })); + var __setModuleDefault = exec && exec.__setModuleDefault || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + }) : function(o, v) { + o["default"] = v; + }); + var __importStar = exec && exec.__importStar || /* @__PURE__ */ (function() { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function(o2) { + var ar = []; + for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + } + __setModuleDefault(result, mod); + return result; + }; + })(); + var __awaiter = exec && exec.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exec, "__esModule", { value: true }); + exec.exec = exec$1; + exec.getExecOutput = getExecOutput; + const string_decoder_1 = require$$5$3; + const tr = __importStar(requireToolrunner()); + function exec$1(commandLine, args, options) { + return __awaiter(this, void 0, void 0, function* () { + const commandArgs = tr.argStringToArray(commandLine); + if (commandArgs.length === 0) { + throw new Error(`Parameter 'commandLine' cannot be null or empty.`); + } + const toolPath = commandArgs[0]; + args = commandArgs.slice(1).concat(args || []); + const runner = new tr.ToolRunner(toolPath, args, options); + return runner.exec(); + }); + } + function getExecOutput(commandLine, args, options) { + return __awaiter(this, void 0, void 0, function* () { + var _a2, _b; + let stdout = ""; + let stderr = ""; + const stdoutDecoder = new string_decoder_1.StringDecoder("utf8"); + const stderrDecoder = new string_decoder_1.StringDecoder("utf8"); + const originalStdoutListener = (_a2 = options === null || options === void 0 ? void 0 : options.listeners) === null || _a2 === void 0 ? void 0 : _a2.stdout; + const originalStdErrListener = (_b = options === null || options === void 0 ? void 0 : options.listeners) === null || _b === void 0 ? void 0 : _b.stderr; + const stdErrListener = (data) => { + stderr += stderrDecoder.write(data); + if (originalStdErrListener) { + originalStdErrListener(data); + } + }; + const stdOutListener = (data) => { + stdout += stdoutDecoder.write(data); + if (originalStdoutListener) { + originalStdoutListener(data); + } + }; + const listeners = Object.assign(Object.assign({}, options === null || options === void 0 ? void 0 : options.listeners), { stdout: stdOutListener, stderr: stdErrListener }); + const exitCode = yield exec$1(commandLine, args, Object.assign(Object.assign({}, options), { listeners })); + stdout += stdoutDecoder.end(); + stderr += stderrDecoder.end(); + return { + exitCode, + stdout, + stderr + }; + }); + } + return exec; +} +var hasRequiredPlatform; +function requirePlatform() { + if (hasRequiredPlatform) return platform; + hasRequiredPlatform = 1; + (function(exports$1) { + var __createBinding = platform && platform.__createBinding || (Object.create ? (function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + }) : (function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + })); + var __setModuleDefault = platform && platform.__setModuleDefault || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + }) : function(o, v) { + o["default"] = v; + }); + var __importStar = platform && platform.__importStar || /* @__PURE__ */ (function() { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function(o2) { + var ar = []; + for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + } + __setModuleDefault(result, mod); + return result; + }; + })(); + var __awaiter = platform && platform.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + var __importDefault = platform && platform.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports$1, "__esModule", { value: true }); + exports$1.isLinux = exports$1.isMacOS = exports$1.isWindows = exports$1.arch = exports$1.platform = void 0; + exports$1.getDetails = getDetails; + const os_1 = __importDefault(require$$0); + const exec2 = __importStar(requireExec()); + const getWindowsInfo = () => __awaiter(void 0, void 0, void 0, function* () { + const { stdout: version } = yield exec2.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Version"', void 0, { + silent: true + }); + const { stdout: name } = yield exec2.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Caption"', void 0, { + silent: true + }); + return { + name: name.trim(), + version: version.trim() + }; + }); + const getMacOsInfo = () => __awaiter(void 0, void 0, void 0, function* () { + var _a2, _b, _c, _d; + const { stdout } = yield exec2.getExecOutput("sw_vers", void 0, { + silent: true + }); + const version = (_b = (_a2 = stdout.match(/ProductVersion:\s*(.+)/)) === null || _a2 === void 0 ? void 0 : _a2[1]) !== null && _b !== void 0 ? _b : ""; + const name = (_d = (_c = stdout.match(/ProductName:\s*(.+)/)) === null || _c === void 0 ? void 0 : _c[1]) !== null && _d !== void 0 ? _d : ""; + return { + name, + version + }; + }); + const getLinuxInfo = () => __awaiter(void 0, void 0, void 0, function* () { + const { stdout } = yield exec2.getExecOutput("lsb_release", ["-i", "-r", "-s"], { + silent: true + }); + const [name, version] = stdout.trim().split("\n"); + return { + name, + version + }; + }); + exports$1.platform = os_1.default.platform(); + exports$1.arch = os_1.default.arch(); + exports$1.isWindows = exports$1.platform === "win32"; + exports$1.isMacOS = exports$1.platform === "darwin"; + exports$1.isLinux = exports$1.platform === "linux"; + function getDetails() { + return __awaiter(this, void 0, void 0, function* () { + return Object.assign(Object.assign({}, yield exports$1.isWindows ? getWindowsInfo() : exports$1.isMacOS ? getMacOsInfo() : getLinuxInfo()), { + platform: exports$1.platform, + arch: exports$1.arch, + isWindows: exports$1.isWindows, + isMacOS: exports$1.isMacOS, + isLinux: exports$1.isLinux + }); + }); + } + })(platform); + return platform; +} +var hasRequiredCore; +function requireCore() { + if (hasRequiredCore) return core$1; + hasRequiredCore = 1; + (function(exports$1) { + var __createBinding = core$1 && core$1.__createBinding || (Object.create ? (function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + }) : (function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + })); + var __setModuleDefault = core$1 && core$1.__setModuleDefault || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + }) : function(o, v) { + o["default"] = v; + }); + var __importStar = core$1 && core$1.__importStar || /* @__PURE__ */ (function() { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function(o2) { + var ar = []; + for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + } + __setModuleDefault(result, mod); + return result; + }; + })(); + var __awaiter = core$1 && core$1.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports$1, "__esModule", { value: true }); + exports$1.platform = exports$1.toPlatformPath = exports$1.toWin32Path = exports$1.toPosixPath = exports$1.markdownSummary = exports$1.summary = exports$1.ExitCode = void 0; + exports$1.exportVariable = exportVariable; + exports$1.setSecret = setSecret; + exports$1.addPath = addPath; + exports$1.getInput = getInput; + exports$1.getMultilineInput = getMultilineInput; + exports$1.getBooleanInput = getBooleanInput; + exports$1.setOutput = setOutput; + exports$1.setCommandEcho = setCommandEcho; + exports$1.setFailed = setFailed; + exports$1.isDebug = isDebug; + exports$1.debug = debug; + exports$1.error = error; + exports$1.warning = warning; + exports$1.notice = notice; + exports$1.info = info; + exports$1.startGroup = startGroup; + exports$1.endGroup = endGroup; + exports$1.group = group; + exports$1.saveState = saveState; + exports$1.getState = getState; + exports$1.getIDToken = getIDToken; + const command_1 = requireCommand(); + const file_command_1 = requireFileCommand(); + const utils_1 = requireUtils$4(); + const os = __importStar(require$$0); + const path = __importStar(require$$1$8); + const oidc_utils_1 = requireOidcUtils(); + var ExitCode; + (function(ExitCode2) { + ExitCode2[ExitCode2["Success"] = 0] = "Success"; + ExitCode2[ExitCode2["Failure"] = 1] = "Failure"; + })(ExitCode || (exports$1.ExitCode = ExitCode = {})); + function exportVariable(name, val) { + const convertedVal = (0, utils_1.toCommandValue)(val); + process.env[name] = convertedVal; + const filePath = process.env["GITHUB_ENV"] || ""; + if (filePath) { + return (0, file_command_1.issueFileCommand)("ENV", (0, file_command_1.prepareKeyValueMessage)(name, val)); + } + (0, command_1.issueCommand)("set-env", { name }, convertedVal); + } + function setSecret(secret) { + (0, command_1.issueCommand)("add-mask", {}, secret); + } + function addPath(inputPath) { + const filePath = process.env["GITHUB_PATH"] || ""; + if (filePath) { + (0, file_command_1.issueFileCommand)("PATH", inputPath); + } else { + (0, command_1.issueCommand)("add-path", {}, inputPath); + } + process.env["PATH"] = `${inputPath}${path.delimiter}${process.env["PATH"]}`; + } + function getInput(name, options) { + const val = process.env[`INPUT_${name.replace(/ /g, "_").toUpperCase()}`] || ""; + if (options && options.required && !val) { + throw new Error(`Input required and not supplied: ${name}`); + } + if (options && options.trimWhitespace === false) { + return val; + } + return val.trim(); + } + function getMultilineInput(name, options) { + const inputs = getInput(name, options).split("\n").filter((x) => x !== ""); + if (options && options.trimWhitespace === false) { + return inputs; + } + return inputs.map((input) => input.trim()); + } + function getBooleanInput(name, options) { + const trueValue = ["true", "True", "TRUE"]; + const falseValue = ["false", "False", "FALSE"]; + const val = getInput(name, options); + if (trueValue.includes(val)) + return true; + if (falseValue.includes(val)) + return false; + throw new TypeError(`Input does not meet YAML 1.2 "Core Schema" specification: ${name} +Support boolean input list: \`true | True | TRUE | false | False | FALSE\``); + } + function setOutput(name, value) { + const filePath = process.env["GITHUB_OUTPUT"] || ""; + if (filePath) { + return (0, file_command_1.issueFileCommand)("OUTPUT", (0, file_command_1.prepareKeyValueMessage)(name, value)); + } + process.stdout.write(os.EOL); + (0, command_1.issueCommand)("set-output", { name }, (0, utils_1.toCommandValue)(value)); + } + function setCommandEcho(enabled) { + (0, command_1.issue)("echo", enabled ? "on" : "off"); + } + function setFailed(message) { + process.exitCode = ExitCode.Failure; + error(message); + } + function isDebug() { + return process.env["RUNNER_DEBUG"] === "1"; + } + function debug(message) { + (0, command_1.issueCommand)("debug", {}, message); + } + function error(message, properties = {}) { + (0, command_1.issueCommand)("error", (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message); + } + function warning(message, properties = {}) { + (0, command_1.issueCommand)("warning", (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message); + } + function notice(message, properties = {}) { + (0, command_1.issueCommand)("notice", (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message); + } + function info(message) { + process.stdout.write(message + os.EOL); + } + function startGroup(name) { + (0, command_1.issue)("group", name); + } + function endGroup() { + (0, command_1.issue)("endgroup"); + } + function group(name, fn) { + return __awaiter(this, void 0, void 0, function* () { + startGroup(name); + let result; + try { + result = yield fn(); + } finally { + endGroup(); + } + return result; + }); + } + function saveState(name, value) { + const filePath = process.env["GITHUB_STATE"] || ""; + if (filePath) { + return (0, file_command_1.issueFileCommand)("STATE", (0, file_command_1.prepareKeyValueMessage)(name, value)); + } + (0, command_1.issueCommand)("save-state", { name }, (0, utils_1.toCommandValue)(value)); + } + function getState(name) { + return process.env[`STATE_${name}`] || ""; + } + function getIDToken(aud) { + return __awaiter(this, void 0, void 0, function* () { + return yield oidc_utils_1.OidcClient.getIDToken(aud); + }); + } + var summary_1 = requireSummary(); + Object.defineProperty(exports$1, "summary", { enumerable: true, get: function() { + return summary_1.summary; + } }); + var summary_2 = requireSummary(); + Object.defineProperty(exports$1, "markdownSummary", { enumerable: true, get: function() { + return summary_2.markdownSummary; + } }); + var path_utils_1 = requirePathUtils(); + Object.defineProperty(exports$1, "toPosixPath", { enumerable: true, get: function() { + return path_utils_1.toPosixPath; + } }); + Object.defineProperty(exports$1, "toWin32Path", { enumerable: true, get: function() { + return path_utils_1.toWin32Path; + } }); + Object.defineProperty(exports$1, "toPlatformPath", { enumerable: true, get: function() { + return path_utils_1.toPlatformPath; + } }); + exports$1.platform = __importStar(requirePlatform()); + })(core$1); + return core$1; +} +var coreExports = requireCore(); +const core = /* @__PURE__ */ getDefaultExportFromCjs(coreExports); +var github$1 = {}; +var context = {}; +var hasRequiredContext; +function requireContext() { + if (hasRequiredContext) return context; + hasRequiredContext = 1; + Object.defineProperty(context, "__esModule", { value: true }); + context.Context = void 0; + const fs_1 = require$$1; + const os_1 = require$$0; + class Context { + /** + * Hydrate the context from the environment + */ + constructor() { + var _a2, _b, _c; + this.payload = {}; + if (process.env.GITHUB_EVENT_PATH) { + if ((0, fs_1.existsSync)(process.env.GITHUB_EVENT_PATH)) { + this.payload = JSON.parse((0, fs_1.readFileSync)(process.env.GITHUB_EVENT_PATH, { encoding: "utf8" })); + } else { + const path = process.env.GITHUB_EVENT_PATH; + process.stdout.write(`GITHUB_EVENT_PATH ${path} does not exist${os_1.EOL}`); + } + } + this.eventName = process.env.GITHUB_EVENT_NAME; + this.sha = process.env.GITHUB_SHA; + this.ref = process.env.GITHUB_REF; + this.workflow = process.env.GITHUB_WORKFLOW; + this.action = process.env.GITHUB_ACTION; + this.actor = process.env.GITHUB_ACTOR; + this.job = process.env.GITHUB_JOB; + this.runAttempt = parseInt(process.env.GITHUB_RUN_ATTEMPT, 10); + this.runNumber = parseInt(process.env.GITHUB_RUN_NUMBER, 10); + this.runId = parseInt(process.env.GITHUB_RUN_ID, 10); + this.apiUrl = (_a2 = process.env.GITHUB_API_URL) !== null && _a2 !== void 0 ? _a2 : `https://api.github.com`; + this.serverUrl = (_b = process.env.GITHUB_SERVER_URL) !== null && _b !== void 0 ? _b : `https://github.com`; + this.graphqlUrl = (_c = process.env.GITHUB_GRAPHQL_URL) !== null && _c !== void 0 ? _c : `https://api.github.com/graphql`; + } + get issue() { + const payload = this.payload; + return Object.assign(Object.assign({}, this.repo), { number: (payload.issue || payload.pull_request || payload).number }); + } + get repo() { + if (process.env.GITHUB_REPOSITORY) { + const [owner, repo] = process.env.GITHUB_REPOSITORY.split("/"); + return { owner, repo }; + } + if (this.payload.repository) { + return { + owner: this.payload.repository.owner.login, + repo: this.payload.repository.name + }; + } + throw new Error("context.repo requires a GITHUB_REPOSITORY environment variable like 'owner/repo'"); + } + } + context.Context = Context; + return context; +} +var utils$2 = {}; +var utils$1 = {}; +var undici = {}; +var symbols$4; +var hasRequiredSymbols$4; +function requireSymbols$4() { + if (hasRequiredSymbols$4) return symbols$4; + hasRequiredSymbols$4 = 1; + symbols$4 = { + kClose: /* @__PURE__ */ Symbol("close"), + kDestroy: /* @__PURE__ */ Symbol("destroy"), + kDispatch: /* @__PURE__ */ Symbol("dispatch"), + kUrl: /* @__PURE__ */ Symbol("url"), + kWriting: /* @__PURE__ */ Symbol("writing"), + kResuming: /* @__PURE__ */ Symbol("resuming"), + kQueue: /* @__PURE__ */ Symbol("queue"), + kConnect: /* @__PURE__ */ Symbol("connect"), + kConnecting: /* @__PURE__ */ Symbol("connecting"), + kHeadersList: /* @__PURE__ */ Symbol("headers list"), + kKeepAliveDefaultTimeout: /* @__PURE__ */ Symbol("default keep alive timeout"), + kKeepAliveMaxTimeout: /* @__PURE__ */ Symbol("max keep alive timeout"), + kKeepAliveTimeoutThreshold: /* @__PURE__ */ Symbol("keep alive timeout threshold"), + kKeepAliveTimeoutValue: /* @__PURE__ */ Symbol("keep alive timeout"), + kKeepAlive: /* @__PURE__ */ Symbol("keep alive"), + kHeadersTimeout: /* @__PURE__ */ Symbol("headers timeout"), + kBodyTimeout: /* @__PURE__ */ Symbol("body timeout"), + kServerName: /* @__PURE__ */ Symbol("server name"), + kLocalAddress: /* @__PURE__ */ Symbol("local address"), + kHost: /* @__PURE__ */ Symbol("host"), + kNoRef: /* @__PURE__ */ Symbol("no ref"), + kBodyUsed: /* @__PURE__ */ Symbol("used"), + kRunning: /* @__PURE__ */ Symbol("running"), + kBlocking: /* @__PURE__ */ Symbol("blocking"), + kPending: /* @__PURE__ */ Symbol("pending"), + kSize: /* @__PURE__ */ Symbol("size"), + kBusy: /* @__PURE__ */ Symbol("busy"), + kQueued: /* @__PURE__ */ Symbol("queued"), + kFree: /* @__PURE__ */ Symbol("free"), + kConnected: /* @__PURE__ */ Symbol("connected"), + kClosed: /* @__PURE__ */ Symbol("closed"), + kNeedDrain: /* @__PURE__ */ Symbol("need drain"), + kReset: /* @__PURE__ */ Symbol("reset"), + kDestroyed: /* @__PURE__ */ Symbol.for("nodejs.stream.destroyed"), + kMaxHeadersSize: /* @__PURE__ */ Symbol("max headers size"), + kRunningIdx: /* @__PURE__ */ Symbol("running index"), + kPendingIdx: /* @__PURE__ */ Symbol("pending index"), + kError: /* @__PURE__ */ Symbol("error"), + kClients: /* @__PURE__ */ Symbol("clients"), + kClient: /* @__PURE__ */ Symbol("client"), + kParser: /* @__PURE__ */ Symbol("parser"), + kOnDestroyed: /* @__PURE__ */ Symbol("destroy callbacks"), + kPipelining: /* @__PURE__ */ Symbol("pipelining"), + kSocket: /* @__PURE__ */ Symbol("socket"), + kHostHeader: /* @__PURE__ */ Symbol("host header"), + kConnector: /* @__PURE__ */ Symbol("connector"), + kStrictContentLength: /* @__PURE__ */ Symbol("strict content length"), + kMaxRedirections: /* @__PURE__ */ Symbol("maxRedirections"), + kMaxRequests: /* @__PURE__ */ Symbol("maxRequestsPerClient"), + kProxy: /* @__PURE__ */ Symbol("proxy agent options"), + kCounter: /* @__PURE__ */ Symbol("socket request counter"), + kInterceptors: /* @__PURE__ */ Symbol("dispatch interceptors"), + kMaxResponseSize: /* @__PURE__ */ Symbol("max response size"), + kHTTP2Session: /* @__PURE__ */ Symbol("http2Session"), + kHTTP2SessionState: /* @__PURE__ */ Symbol("http2Session state"), + kHTTP2BuildRequest: /* @__PURE__ */ Symbol("http2 build request"), + kHTTP1BuildRequest: /* @__PURE__ */ Symbol("http1 build request"), + kHTTP2CopyHeaders: /* @__PURE__ */ Symbol("http2 copy headers"), + kHTTPConnVersion: /* @__PURE__ */ Symbol("http connection version"), + kRetryHandlerDefaultRetry: /* @__PURE__ */ Symbol("retry agent default retry"), + kConstruct: /* @__PURE__ */ Symbol("constructable") + }; + return symbols$4; +} +var errors; +var hasRequiredErrors; +function requireErrors() { + if (hasRequiredErrors) return errors; + hasRequiredErrors = 1; + class UndiciError extends Error { + constructor(message) { + super(message); + this.name = "UndiciError"; + this.code = "UND_ERR"; + } + } + class ConnectTimeoutError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, ConnectTimeoutError); + this.name = "ConnectTimeoutError"; + this.message = message || "Connect Timeout Error"; + this.code = "UND_ERR_CONNECT_TIMEOUT"; + } + } + class HeadersTimeoutError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, HeadersTimeoutError); + this.name = "HeadersTimeoutError"; + this.message = message || "Headers Timeout Error"; + this.code = "UND_ERR_HEADERS_TIMEOUT"; + } + } + class HeadersOverflowError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, HeadersOverflowError); + this.name = "HeadersOverflowError"; + this.message = message || "Headers Overflow Error"; + this.code = "UND_ERR_HEADERS_OVERFLOW"; + } + } + class BodyTimeoutError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, BodyTimeoutError); + this.name = "BodyTimeoutError"; + this.message = message || "Body Timeout Error"; + this.code = "UND_ERR_BODY_TIMEOUT"; + } + } + class ResponseStatusCodeError extends UndiciError { + constructor(message, statusCode, headers2, body2) { + super(message); + Error.captureStackTrace(this, ResponseStatusCodeError); + this.name = "ResponseStatusCodeError"; + this.message = message || "Response Status Code Error"; + this.code = "UND_ERR_RESPONSE_STATUS_CODE"; + this.body = body2; + this.status = statusCode; + this.statusCode = statusCode; + this.headers = headers2; + } + } + class InvalidArgumentError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, InvalidArgumentError); + this.name = "InvalidArgumentError"; + this.message = message || "Invalid Argument Error"; + this.code = "UND_ERR_INVALID_ARG"; + } + } + class InvalidReturnValueError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, InvalidReturnValueError); + this.name = "InvalidReturnValueError"; + this.message = message || "Invalid Return Value Error"; + this.code = "UND_ERR_INVALID_RETURN_VALUE"; + } + } + class RequestAbortedError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, RequestAbortedError); + this.name = "AbortError"; + this.message = message || "Request aborted"; + this.code = "UND_ERR_ABORTED"; + } + } + class InformationalError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, InformationalError); + this.name = "InformationalError"; + this.message = message || "Request information"; + this.code = "UND_ERR_INFO"; + } + } + class RequestContentLengthMismatchError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, RequestContentLengthMismatchError); + this.name = "RequestContentLengthMismatchError"; + this.message = message || "Request body length does not match content-length header"; + this.code = "UND_ERR_REQ_CONTENT_LENGTH_MISMATCH"; + } + } + class ResponseContentLengthMismatchError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, ResponseContentLengthMismatchError); + this.name = "ResponseContentLengthMismatchError"; + this.message = message || "Response body length does not match content-length header"; + this.code = "UND_ERR_RES_CONTENT_LENGTH_MISMATCH"; + } + } + class ClientDestroyedError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, ClientDestroyedError); + this.name = "ClientDestroyedError"; + this.message = message || "The client is destroyed"; + this.code = "UND_ERR_DESTROYED"; + } + } + class ClientClosedError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, ClientClosedError); + this.name = "ClientClosedError"; + this.message = message || "The client is closed"; + this.code = "UND_ERR_CLOSED"; + } + } + class SocketError extends UndiciError { + constructor(message, socket) { + super(message); + Error.captureStackTrace(this, SocketError); + this.name = "SocketError"; + this.message = message || "Socket error"; + this.code = "UND_ERR_SOCKET"; + this.socket = socket; + } + } + class NotSupportedError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, NotSupportedError); + this.name = "NotSupportedError"; + this.message = message || "Not supported error"; + this.code = "UND_ERR_NOT_SUPPORTED"; + } + } + class BalancedPoolMissingUpstreamError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, NotSupportedError); + this.name = "MissingUpstreamError"; + this.message = message || "No upstream has been added to the BalancedPool"; + this.code = "UND_ERR_BPL_MISSING_UPSTREAM"; + } + } + class HTTPParserError extends Error { + constructor(message, code, data) { + super(message); + Error.captureStackTrace(this, HTTPParserError); + this.name = "HTTPParserError"; + this.code = code ? `HPE_${code}` : void 0; + this.data = data ? data.toString() : void 0; + } + } + class ResponseExceededMaxSizeError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, ResponseExceededMaxSizeError); + this.name = "ResponseExceededMaxSizeError"; + this.message = message || "Response content exceeded max size"; + this.code = "UND_ERR_RES_EXCEEDED_MAX_SIZE"; + } + } + class RequestRetryError extends UndiciError { + constructor(message, code, { headers: headers2, data }) { + super(message); + Error.captureStackTrace(this, RequestRetryError); + this.name = "RequestRetryError"; + this.message = message || "Request retry error"; + this.code = "UND_ERR_REQ_RETRY"; + this.statusCode = code; + this.data = data; + this.headers = headers2; + } + } + errors = { + HTTPParserError, + UndiciError, + HeadersTimeoutError, + HeadersOverflowError, + BodyTimeoutError, + RequestContentLengthMismatchError, + ConnectTimeoutError, + ResponseStatusCodeError, + InvalidArgumentError, + InvalidReturnValueError, + RequestAbortedError, + ClientDestroyedError, + ClientClosedError, + InformationalError, + SocketError, + NotSupportedError, + ResponseContentLengthMismatchError, + BalancedPoolMissingUpstreamError, + ResponseExceededMaxSizeError, + RequestRetryError + }; + return errors; +} +var constants$4; +var hasRequiredConstants$4; +function requireConstants$4() { + if (hasRequiredConstants$4) return constants$4; + hasRequiredConstants$4 = 1; + const headerNameLowerCasedRecord = {}; + const wellknownHeaderNames = [ + "Accept", + "Accept-Encoding", + "Accept-Language", + "Accept-Ranges", + "Access-Control-Allow-Credentials", + "Access-Control-Allow-Headers", + "Access-Control-Allow-Methods", + "Access-Control-Allow-Origin", + "Access-Control-Expose-Headers", + "Access-Control-Max-Age", + "Access-Control-Request-Headers", + "Access-Control-Request-Method", + "Age", + "Allow", + "Alt-Svc", + "Alt-Used", + "Authorization", + "Cache-Control", + "Clear-Site-Data", + "Connection", + "Content-Disposition", + "Content-Encoding", + "Content-Language", + "Content-Length", + "Content-Location", + "Content-Range", + "Content-Security-Policy", + "Content-Security-Policy-Report-Only", + "Content-Type", + "Cookie", + "Cross-Origin-Embedder-Policy", + "Cross-Origin-Opener-Policy", + "Cross-Origin-Resource-Policy", + "Date", + "Device-Memory", + "Downlink", + "ECT", + "ETag", + "Expect", + "Expect-CT", + "Expires", + "Forwarded", + "From", + "Host", + "If-Match", + "If-Modified-Since", + "If-None-Match", + "If-Range", + "If-Unmodified-Since", + "Keep-Alive", + "Last-Modified", + "Link", + "Location", + "Max-Forwards", + "Origin", + "Permissions-Policy", + "Pragma", + "Proxy-Authenticate", + "Proxy-Authorization", + "RTT", + "Range", + "Referer", + "Referrer-Policy", + "Refresh", + "Retry-After", + "Sec-WebSocket-Accept", + "Sec-WebSocket-Extensions", + "Sec-WebSocket-Key", + "Sec-WebSocket-Protocol", + "Sec-WebSocket-Version", + "Server", + "Server-Timing", + "Service-Worker-Allowed", + "Service-Worker-Navigation-Preload", + "Set-Cookie", + "SourceMap", + "Strict-Transport-Security", + "Supports-Loading-Mode", + "TE", + "Timing-Allow-Origin", + "Trailer", + "Transfer-Encoding", + "Upgrade", + "Upgrade-Insecure-Requests", + "User-Agent", + "Vary", + "Via", + "WWW-Authenticate", + "X-Content-Type-Options", + "X-DNS-Prefetch-Control", + "X-Frame-Options", + "X-Permitted-Cross-Domain-Policies", + "X-Powered-By", + "X-Requested-With", + "X-XSS-Protection" + ]; + for (let i = 0; i < wellknownHeaderNames.length; ++i) { + const key = wellknownHeaderNames[i]; + const lowerCasedKey = key.toLowerCase(); + headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] = lowerCasedKey; + } + Object.setPrototypeOf(headerNameLowerCasedRecord, null); + constants$4 = { + wellknownHeaderNames, + headerNameLowerCasedRecord + }; + return constants$4; +} +var util$6; +var hasRequiredUtil$6; +function requireUtil$6() { + if (hasRequiredUtil$6) return util$6; + hasRequiredUtil$6 = 1; + const assert = require$$0$9; + const { kDestroyed, kBodyUsed } = requireSymbols$4(); + const { IncomingMessage } = require$$2$1; + const stream = require$$0$b; + const net = require$$0$a; + const { InvalidArgumentError } = requireErrors(); + const { Blob: Blob2 } = require$$7$1; + const nodeUtil = require$$0$2; + const { stringify } = require$$8$1; + const { headerNameLowerCasedRecord } = requireConstants$4(); + const [nodeMajor, nodeMinor] = process.versions.node.split(".").map((v) => Number(v)); + function nop() { + } + function isStream(obj) { + return obj && typeof obj === "object" && typeof obj.pipe === "function" && typeof obj.on === "function"; + } + function isBlobLike(object) { + return Blob2 && object instanceof Blob2 || object && typeof object === "object" && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && /^(Blob|File)$/.test(object[Symbol.toStringTag]); + } + function buildURL(url, queryParams) { + if (url.includes("?") || url.includes("#")) { + throw new Error('Query params cannot be passed when url already contains "?" or "#".'); + } + const stringified = stringify(queryParams); + if (stringified) { + url += "?" + stringified; + } + return url; + } + function parseURL(url) { + if (typeof url === "string") { + url = new URL(url); + if (!/^https?:/.test(url.origin || url.protocol)) { + throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); + } + return url; + } + if (!url || typeof url !== "object") { + throw new InvalidArgumentError("Invalid URL: The URL argument must be a non-null object."); + } + if (!/^https?:/.test(url.origin || url.protocol)) { + throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); + } + if (!(url instanceof URL)) { + if (url.port != null && url.port !== "" && !Number.isFinite(parseInt(url.port))) { + throw new InvalidArgumentError("Invalid URL: port must be a valid integer or a string representation of an integer."); + } + if (url.path != null && typeof url.path !== "string") { + throw new InvalidArgumentError("Invalid URL path: the path must be a string or null/undefined."); + } + if (url.pathname != null && typeof url.pathname !== "string") { + throw new InvalidArgumentError("Invalid URL pathname: the pathname must be a string or null/undefined."); + } + if (url.hostname != null && typeof url.hostname !== "string") { + throw new InvalidArgumentError("Invalid URL hostname: the hostname must be a string or null/undefined."); + } + if (url.origin != null && typeof url.origin !== "string") { + throw new InvalidArgumentError("Invalid URL origin: the origin must be a string or null/undefined."); + } + const port = url.port != null ? url.port : url.protocol === "https:" ? 443 : 80; + let origin = url.origin != null ? url.origin : `${url.protocol}//${url.hostname}:${port}`; + let path = url.path != null ? url.path : `${url.pathname || ""}${url.search || ""}`; + if (origin.endsWith("/")) { + origin = origin.substring(0, origin.length - 1); + } + if (path && !path.startsWith("/")) { + path = `/${path}`; + } + url = new URL(origin + path); + } + return url; + } + function parseOrigin(url) { + url = parseURL(url); + if (url.pathname !== "/" || url.search || url.hash) { + throw new InvalidArgumentError("invalid url"); + } + return url; + } + function getHostname(host) { + if (host[0] === "[") { + const idx2 = host.indexOf("]"); + assert(idx2 !== -1); + return host.substring(1, idx2); + } + const idx = host.indexOf(":"); + if (idx === -1) return host; + return host.substring(0, idx); + } + function getServerName(host) { + if (!host) { + return null; + } + assert.strictEqual(typeof host, "string"); + const servername = getHostname(host); + if (net.isIP(servername)) { + return ""; + } + return servername; + } + function deepClone(obj) { + return JSON.parse(JSON.stringify(obj)); + } + function isAsyncIterable(obj) { + return !!(obj != null && typeof obj[Symbol.asyncIterator] === "function"); + } + function isIterable(obj) { + return !!(obj != null && (typeof obj[Symbol.iterator] === "function" || typeof obj[Symbol.asyncIterator] === "function")); + } + function bodyLength(body2) { + if (body2 == null) { + return 0; + } else if (isStream(body2)) { + const state = body2._readableState; + return state && state.objectMode === false && state.ended === true && Number.isFinite(state.length) ? state.length : null; + } else if (isBlobLike(body2)) { + return body2.size != null ? body2.size : null; + } else if (isBuffer(body2)) { + return body2.byteLength; + } + return null; + } + function isDestroyed(stream2) { + return !stream2 || !!(stream2.destroyed || stream2[kDestroyed]); + } + function isReadableAborted(stream2) { + const state = stream2 && stream2._readableState; + return isDestroyed(stream2) && state && !state.endEmitted; + } + function destroy(stream2, err) { + if (stream2 == null || !isStream(stream2) || isDestroyed(stream2)) { + return; + } + if (typeof stream2.destroy === "function") { + if (Object.getPrototypeOf(stream2).constructor === IncomingMessage) { + stream2.socket = null; + } + stream2.destroy(err); + } else if (err) { + process.nextTick((stream3, err2) => { + stream3.emit("error", err2); + }, stream2, err); + } + if (stream2.destroyed !== true) { + stream2[kDestroyed] = true; + } + } + const KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/; + function parseKeepAliveTimeout(val) { + const m = val.toString().match(KEEPALIVE_TIMEOUT_EXPR); + return m ? parseInt(m[1], 10) * 1e3 : null; + } + function headerNameToString(value) { + return headerNameLowerCasedRecord[value] || value.toLowerCase(); + } + function parseHeaders(headers2, obj = {}) { + if (!Array.isArray(headers2)) return headers2; + for (let i = 0; i < headers2.length; i += 2) { + const key = headers2[i].toString().toLowerCase(); + let val = obj[key]; + if (!val) { + if (Array.isArray(headers2[i + 1])) { + obj[key] = headers2[i + 1].map((x) => x.toString("utf8")); + } else { + obj[key] = headers2[i + 1].toString("utf8"); + } + } else { + if (!Array.isArray(val)) { + val = [val]; + obj[key] = val; + } + val.push(headers2[i + 1].toString("utf8")); + } + } + if ("content-length" in obj && "content-disposition" in obj) { + obj["content-disposition"] = Buffer.from(obj["content-disposition"]).toString("latin1"); + } + return obj; + } + function parseRawHeaders(headers2) { + const ret = []; + let hasContentLength = false; + let contentDispositionIdx = -1; + for (let n = 0; n < headers2.length; n += 2) { + const key = headers2[n + 0].toString(); + const val = headers2[n + 1].toString("utf8"); + if (key.length === 14 && (key === "content-length" || key.toLowerCase() === "content-length")) { + ret.push(key, val); + hasContentLength = true; + } else if (key.length === 19 && (key === "content-disposition" || key.toLowerCase() === "content-disposition")) { + contentDispositionIdx = ret.push(key, val) - 1; + } else { + ret.push(key, val); + } + } + if (hasContentLength && contentDispositionIdx !== -1) { + ret[contentDispositionIdx] = Buffer.from(ret[contentDispositionIdx]).toString("latin1"); + } + return ret; + } + function isBuffer(buffer) { + return buffer instanceof Uint8Array || Buffer.isBuffer(buffer); + } + function validateHandler(handler2, method, upgrade) { + if (!handler2 || typeof handler2 !== "object") { + throw new InvalidArgumentError("handler must be an object"); + } + if (typeof handler2.onConnect !== "function") { + throw new InvalidArgumentError("invalid onConnect method"); + } + if (typeof handler2.onError !== "function") { + throw new InvalidArgumentError("invalid onError method"); + } + if (typeof handler2.onBodySent !== "function" && handler2.onBodySent !== void 0) { + throw new InvalidArgumentError("invalid onBodySent method"); + } + if (upgrade || method === "CONNECT") { + if (typeof handler2.onUpgrade !== "function") { + throw new InvalidArgumentError("invalid onUpgrade method"); + } + } else { + if (typeof handler2.onHeaders !== "function") { + throw new InvalidArgumentError("invalid onHeaders method"); + } + if (typeof handler2.onData !== "function") { + throw new InvalidArgumentError("invalid onData method"); + } + if (typeof handler2.onComplete !== "function") { + throw new InvalidArgumentError("invalid onComplete method"); + } + } + } + function isDisturbed(body2) { + return !!(body2 && (stream.isDisturbed ? stream.isDisturbed(body2) || body2[kBodyUsed] : body2[kBodyUsed] || body2.readableDidRead || body2._readableState && body2._readableState.dataEmitted || isReadableAborted(body2))); + } + function isErrored(body2) { + return !!(body2 && (stream.isErrored ? stream.isErrored(body2) : /state: 'errored'/.test( + nodeUtil.inspect(body2) + ))); + } + function isReadable(body2) { + return !!(body2 && (stream.isReadable ? stream.isReadable(body2) : /state: 'readable'/.test( + nodeUtil.inspect(body2) + ))); + } + function getSocketInfo(socket) { + return { + localAddress: socket.localAddress, + localPort: socket.localPort, + remoteAddress: socket.remoteAddress, + remotePort: socket.remotePort, + remoteFamily: socket.remoteFamily, + timeout: socket.timeout, + bytesWritten: socket.bytesWritten, + bytesRead: socket.bytesRead + }; + } + async function* convertIterableToBuffer(iterable) { + for await (const chunk of iterable) { + yield Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk); + } + } + let ReadableStream2; + function ReadableStreamFrom(iterable) { + if (!ReadableStream2) { + ReadableStream2 = require$$14.ReadableStream; + } + if (ReadableStream2.from) { + return ReadableStream2.from(convertIterableToBuffer(iterable)); + } + let iterator2; + return new ReadableStream2( + { + async start() { + iterator2 = iterable[Symbol.asyncIterator](); + }, + async pull(controller) { + const { done, value } = await iterator2.next(); + if (done) { + queueMicrotask(() => { + controller.close(); + }); + } else { + const buf = Buffer.isBuffer(value) ? value : Buffer.from(value); + controller.enqueue(new Uint8Array(buf)); + } + return controller.desiredSize > 0; + }, + async cancel(reason) { + await iterator2.return(); + } + }, + 0 + ); + } + function isFormDataLike(object) { + return object && typeof object === "object" && typeof object.append === "function" && typeof object.delete === "function" && typeof object.get === "function" && typeof object.getAll === "function" && typeof object.has === "function" && typeof object.set === "function" && object[Symbol.toStringTag] === "FormData"; + } + function throwIfAborted(signal) { + if (!signal) { + return; + } + if (typeof signal.throwIfAborted === "function") { + signal.throwIfAborted(); + } else { + if (signal.aborted) { + const err = new Error("The operation was aborted"); + err.name = "AbortError"; + throw err; + } + } + } + function addAbortListener(signal, listener) { + if ("addEventListener" in signal) { + signal.addEventListener("abort", listener, { once: true }); + return () => signal.removeEventListener("abort", listener); + } + signal.addListener("abort", listener); + return () => signal.removeListener("abort", listener); + } + const hasToWellFormed = !!String.prototype.toWellFormed; + function toUSVString(val) { + if (hasToWellFormed) { + return `${val}`.toWellFormed(); + } else if (nodeUtil.toUSVString) { + return nodeUtil.toUSVString(val); + } + return `${val}`; + } + function parseRangeHeader(range) { + if (range == null || range === "") return { start: 0, end: null, size: null }; + const m = range ? range.match(/^bytes (\d+)-(\d+)\/(\d+)?$/) : null; + return m ? { + start: parseInt(m[1]), + end: m[2] ? parseInt(m[2]) : null, + size: m[3] ? parseInt(m[3]) : null + } : null; + } + const kEnumerableProperty = /* @__PURE__ */ Object.create(null); + kEnumerableProperty.enumerable = true; + util$6 = { + kEnumerableProperty, + nop, + isDisturbed, + isErrored, + isReadable, + toUSVString, + isReadableAborted, + isBlobLike, + parseOrigin, + parseURL, + getServerName, + isStream, + isIterable, + isAsyncIterable, + isDestroyed, + headerNameToString, + parseRawHeaders, + parseHeaders, + parseKeepAliveTimeout, + destroy, + bodyLength, + deepClone, + ReadableStreamFrom, + isBuffer, + validateHandler, + getSocketInfo, + isFormDataLike, + buildURL, + throwIfAborted, + addAbortListener, + parseRangeHeader, + nodeMajor, + nodeMinor, + nodeHasAutoSelectFamily: nodeMajor > 18 || nodeMajor === 18 && nodeMinor >= 13, + safeHTTPMethods: ["GET", "HEAD", "OPTIONS", "TRACE"] + }; + return util$6; +} +var timers; +var hasRequiredTimers; +function requireTimers() { + if (hasRequiredTimers) return timers; + hasRequiredTimers = 1; + let fastNow = Date.now(); + let fastNowTimeout; + const fastTimers = []; + function onTimeout() { + fastNow = Date.now(); + let len = fastTimers.length; + let idx = 0; + while (idx < len) { + const timer = fastTimers[idx]; + if (timer.state === 0) { + timer.state = fastNow + timer.delay; + } else if (timer.state > 0 && fastNow >= timer.state) { + timer.state = -1; + timer.callback(timer.opaque); + } + if (timer.state === -1) { + timer.state = -2; + if (idx !== len - 1) { + fastTimers[idx] = fastTimers.pop(); + } else { + fastTimers.pop(); + } + len -= 1; + } else { + idx += 1; + } + } + if (fastTimers.length > 0) { + refreshTimeout(); + } + } + function refreshTimeout() { + if (fastNowTimeout && fastNowTimeout.refresh) { + fastNowTimeout.refresh(); + } else { + clearTimeout(fastNowTimeout); + fastNowTimeout = setTimeout(onTimeout, 1e3); + if (fastNowTimeout.unref) { + fastNowTimeout.unref(); + } + } + } + class Timeout { + constructor(callback, delay, opaque) { + this.callback = callback; + this.delay = delay; + this.opaque = opaque; + this.state = -2; + this.refresh(); + } + refresh() { + if (this.state === -2) { + fastTimers.push(this); + if (!fastNowTimeout || fastTimers.length === 1) { + refreshTimeout(); + } + } + this.state = 0; + } + clear() { + this.state = -1; + } + } + timers = { + setTimeout(callback, delay, opaque) { + return delay < 1e3 ? setTimeout(callback, delay, opaque) : new Timeout(callback, delay, opaque); + }, + clearTimeout(timeout) { + if (timeout instanceof Timeout) { + timeout.clear(); + } else { + clearTimeout(timeout); + } + } + }; + return timers; +} +var main = { exports: {} }; +var sbmh; +var hasRequiredSbmh; +function requireSbmh() { + if (hasRequiredSbmh) return sbmh; + hasRequiredSbmh = 1; + const EventEmitter = require$$0$4.EventEmitter; + const inherits = require$$1$2.inherits; + function SBMH(needle) { + if (typeof needle === "string") { + needle = Buffer.from(needle); + } + if (!Buffer.isBuffer(needle)) { + throw new TypeError("The needle has to be a String or a Buffer."); + } + const needleLength = needle.length; + if (needleLength === 0) { + throw new Error("The needle cannot be an empty String/Buffer."); + } + if (needleLength > 256) { + throw new Error("The needle cannot have a length bigger than 256."); + } + this.maxMatches = Infinity; + this.matches = 0; + this._occ = new Array(256).fill(needleLength); + this._lookbehind_size = 0; + this._needle = needle; + this._bufpos = 0; + this._lookbehind = Buffer.alloc(needleLength); + for (var i = 0; i < needleLength - 1; ++i) { + this._occ[needle[i]] = needleLength - 1 - i; + } + } + inherits(SBMH, EventEmitter); + SBMH.prototype.reset = function() { + this._lookbehind_size = 0; + this.matches = 0; + this._bufpos = 0; + }; + SBMH.prototype.push = function(chunk, pos) { + if (!Buffer.isBuffer(chunk)) { + chunk = Buffer.from(chunk, "binary"); + } + const chlen = chunk.length; + this._bufpos = pos || 0; + let r; + while (r !== chlen && this.matches < this.maxMatches) { + r = this._sbmh_feed(chunk); + } + return r; + }; + SBMH.prototype._sbmh_feed = function(data) { + const len = data.length; + const needle = this._needle; + const needleLength = needle.length; + const lastNeedleChar = needle[needleLength - 1]; + let pos = -this._lookbehind_size; + let ch; + if (pos < 0) { + while (pos < 0 && pos <= len - needleLength) { + ch = this._sbmh_lookup_char(data, pos + needleLength - 1); + if (ch === lastNeedleChar && this._sbmh_memcmp(data, pos, needleLength - 1)) { + this._lookbehind_size = 0; + ++this.matches; + this.emit("info", true); + return this._bufpos = pos + needleLength; + } + pos += this._occ[ch]; + } + if (pos < 0) { + while (pos < 0 && !this._sbmh_memcmp(data, pos, len - pos)) { + ++pos; + } + } + if (pos >= 0) { + this.emit("info", false, this._lookbehind, 0, this._lookbehind_size); + this._lookbehind_size = 0; + } else { + const bytesToCutOff = this._lookbehind_size + pos; + if (bytesToCutOff > 0) { + this.emit("info", false, this._lookbehind, 0, bytesToCutOff); + } + this._lookbehind.copy( + this._lookbehind, + 0, + bytesToCutOff, + this._lookbehind_size - bytesToCutOff + ); + this._lookbehind_size -= bytesToCutOff; + data.copy(this._lookbehind, this._lookbehind_size); + this._lookbehind_size += len; + this._bufpos = len; + return len; + } + } + pos += (pos >= 0) * this._bufpos; + if (data.indexOf(needle, pos) !== -1) { + pos = data.indexOf(needle, pos); + ++this.matches; + if (pos > 0) { + this.emit("info", true, data, this._bufpos, pos); + } else { + this.emit("info", true); + } + return this._bufpos = pos + needleLength; + } else { + pos = len - needleLength; + } + while (pos < len && (data[pos] !== needle[0] || Buffer.compare( + data.subarray(pos, pos + len - pos), + needle.subarray(0, len - pos) + ) !== 0)) { + ++pos; + } + if (pos < len) { + data.copy(this._lookbehind, 0, pos, pos + (len - pos)); + this._lookbehind_size = len - pos; + } + if (pos > 0) { + this.emit("info", false, data, this._bufpos, pos < len ? pos : len); + } + this._bufpos = len; + return len; + }; + SBMH.prototype._sbmh_lookup_char = function(data, pos) { + return pos < 0 ? this._lookbehind[this._lookbehind_size + pos] : data[pos]; + }; + SBMH.prototype._sbmh_memcmp = function(data, pos, len) { + for (var i = 0; i < len; ++i) { + if (this._sbmh_lookup_char(data, pos + i) !== this._needle[i]) { + return false; + } + } + return true; + }; + sbmh = SBMH; + return sbmh; +} +var PartStream_1; +var hasRequiredPartStream; +function requirePartStream() { + if (hasRequiredPartStream) return PartStream_1; + hasRequiredPartStream = 1; + const inherits = require$$1$2.inherits; + const ReadableStream2 = require$$0$6.Readable; + function PartStream(opts) { + ReadableStream2.call(this, opts); + } + inherits(PartStream, ReadableStream2); + PartStream.prototype._read = function(n) { + }; + PartStream_1 = PartStream; + return PartStream_1; +} +var getLimit; +var hasRequiredGetLimit; +function requireGetLimit() { + if (hasRequiredGetLimit) return getLimit; + hasRequiredGetLimit = 1; + getLimit = function getLimit2(limits, name, defaultLimit) { + if (!limits || limits[name] === void 0 || limits[name] === null) { + return defaultLimit; + } + if (typeof limits[name] !== "number" || isNaN(limits[name])) { + throw new TypeError("Limit " + name + " is not a valid number"); + } + return limits[name]; + }; + return getLimit; +} +var HeaderParser_1; +var hasRequiredHeaderParser; +function requireHeaderParser() { + if (hasRequiredHeaderParser) return HeaderParser_1; + hasRequiredHeaderParser = 1; + const EventEmitter = require$$0$4.EventEmitter; + const inherits = require$$1$2.inherits; + const getLimit2 = requireGetLimit(); + const StreamSearch = requireSbmh(); + const B_DCRLF = Buffer.from("\r\n\r\n"); + const RE_CRLF = /\r\n/g; + const RE_HDR = /^([^:]+):[ \t]?([\x00-\xFF]+)?$/; + function HeaderParser(cfg) { + EventEmitter.call(this); + cfg = cfg || {}; + const self2 = this; + this.nread = 0; + this.maxed = false; + this.npairs = 0; + this.maxHeaderPairs = getLimit2(cfg, "maxHeaderPairs", 2e3); + this.maxHeaderSize = getLimit2(cfg, "maxHeaderSize", 80 * 1024); + this.buffer = ""; + this.header = {}; + this.finished = false; + this.ss = new StreamSearch(B_DCRLF); + this.ss.on("info", function(isMatch, data, start, end) { + if (data && !self2.maxed) { + if (self2.nread + end - start >= self2.maxHeaderSize) { + end = self2.maxHeaderSize - self2.nread + start; + self2.nread = self2.maxHeaderSize; + self2.maxed = true; + } else { + self2.nread += end - start; + } + self2.buffer += data.toString("binary", start, end); + } + if (isMatch) { + self2._finish(); + } + }); + } + inherits(HeaderParser, EventEmitter); + HeaderParser.prototype.push = function(data) { + const r = this.ss.push(data); + if (this.finished) { + return r; + } + }; + HeaderParser.prototype.reset = function() { + this.finished = false; + this.buffer = ""; + this.header = {}; + this.ss.reset(); + }; + HeaderParser.prototype._finish = function() { + if (this.buffer) { + this._parseHeader(); + } + this.ss.matches = this.ss.maxMatches; + const header = this.header; + this.header = {}; + this.buffer = ""; + this.finished = true; + this.nread = this.npairs = 0; + this.maxed = false; + this.emit("header", header); + }; + HeaderParser.prototype._parseHeader = function() { + if (this.npairs === this.maxHeaderPairs) { + return; + } + const lines = this.buffer.split(RE_CRLF); + const len = lines.length; + let m, h; + for (var i = 0; i < len; ++i) { + if (lines[i].length === 0) { + continue; + } + if (lines[i][0] === " " || lines[i][0] === " ") { + if (h) { + this.header[h][this.header[h].length - 1] += lines[i]; + continue; + } + } + const posColon = lines[i].indexOf(":"); + if (posColon === -1 || posColon === 0) { + return; + } + m = RE_HDR.exec(lines[i]); + h = m[1].toLowerCase(); + this.header[h] = this.header[h] || []; + this.header[h].push(m[2] || ""); + if (++this.npairs === this.maxHeaderPairs) { + break; + } + } + }; + HeaderParser_1 = HeaderParser; + return HeaderParser_1; +} +var Dicer_1; +var hasRequiredDicer; +function requireDicer() { + if (hasRequiredDicer) return Dicer_1; + hasRequiredDicer = 1; + const WritableStream = require$$0$6.Writable; + const inherits = require$$1$2.inherits; + const StreamSearch = requireSbmh(); + const PartStream = requirePartStream(); + const HeaderParser = requireHeaderParser(); + const DASH = 45; + const B_ONEDASH = Buffer.from("-"); + const B_CRLF = Buffer.from("\r\n"); + const EMPTY_FN = function() { + }; + function Dicer(cfg) { + if (!(this instanceof Dicer)) { + return new Dicer(cfg); + } + WritableStream.call(this, cfg); + if (!cfg || !cfg.headerFirst && typeof cfg.boundary !== "string") { + throw new TypeError("Boundary required"); + } + if (typeof cfg.boundary === "string") { + this.setBoundary(cfg.boundary); + } else { + this._bparser = void 0; + } + this._headerFirst = cfg.headerFirst; + this._dashes = 0; + this._parts = 0; + this._finished = false; + this._realFinish = false; + this._isPreamble = true; + this._justMatched = false; + this._firstWrite = true; + this._inHeader = true; + this._part = void 0; + this._cb = void 0; + this._ignoreData = false; + this._partOpts = { highWaterMark: cfg.partHwm }; + this._pause = false; + const self2 = this; + this._hparser = new HeaderParser(cfg); + this._hparser.on("header", function(header) { + self2._inHeader = false; + self2._part.emit("header", header); + }); + } + inherits(Dicer, WritableStream); + Dicer.prototype.emit = function(ev) { + if (ev === "finish" && !this._realFinish) { + if (!this._finished) { + const self2 = this; + process.nextTick(function() { + self2.emit("error", new Error("Unexpected end of multipart data")); + if (self2._part && !self2._ignoreData) { + const type = self2._isPreamble ? "Preamble" : "Part"; + self2._part.emit("error", new Error(type + " terminated early due to unexpected end of multipart data")); + self2._part.push(null); + process.nextTick(function() { + self2._realFinish = true; + self2.emit("finish"); + self2._realFinish = false; + }); + return; + } + self2._realFinish = true; + self2.emit("finish"); + self2._realFinish = false; + }); + } + } else { + WritableStream.prototype.emit.apply(this, arguments); + } + }; + Dicer.prototype._write = function(data, encoding2, cb) { + if (!this._hparser && !this._bparser) { + return cb(); + } + if (this._headerFirst && this._isPreamble) { + if (!this._part) { + this._part = new PartStream(this._partOpts); + if (this.listenerCount("preamble") !== 0) { + this.emit("preamble", this._part); + } else { + this._ignore(); + } + } + const r = this._hparser.push(data); + if (!this._inHeader && r !== void 0 && r < data.length) { + data = data.slice(r); + } else { + return cb(); + } + } + if (this._firstWrite) { + this._bparser.push(B_CRLF); + this._firstWrite = false; + } + this._bparser.push(data); + if (this._pause) { + this._cb = cb; + } else { + cb(); + } + }; + Dicer.prototype.reset = function() { + this._part = void 0; + this._bparser = void 0; + this._hparser = void 0; + }; + Dicer.prototype.setBoundary = function(boundary) { + const self2 = this; + this._bparser = new StreamSearch("\r\n--" + boundary); + this._bparser.on("info", function(isMatch, data, start, end) { + self2._oninfo(isMatch, data, start, end); + }); + }; + Dicer.prototype._ignore = function() { + if (this._part && !this._ignoreData) { + this._ignoreData = true; + this._part.on("error", EMPTY_FN); + this._part.resume(); + } + }; + Dicer.prototype._oninfo = function(isMatch, data, start, end) { + let buf; + const self2 = this; + let i = 0; + let r; + let shouldWriteMore = true; + if (!this._part && this._justMatched && data) { + while (this._dashes < 2 && start + i < end) { + if (data[start + i] === DASH) { + ++i; + ++this._dashes; + } else { + if (this._dashes) { + buf = B_ONEDASH; + } + this._dashes = 0; + break; + } + } + if (this._dashes === 2) { + if (start + i < end && this.listenerCount("trailer") !== 0) { + this.emit("trailer", data.slice(start + i, end)); + } + this.reset(); + this._finished = true; + if (self2._parts === 0) { + self2._realFinish = true; + self2.emit("finish"); + self2._realFinish = false; + } + } + if (this._dashes) { + return; + } + } + if (this._justMatched) { + this._justMatched = false; + } + if (!this._part) { + this._part = new PartStream(this._partOpts); + this._part._read = function(n) { + self2._unpause(); + }; + if (this._isPreamble && this.listenerCount("preamble") !== 0) { + this.emit("preamble", this._part); + } else if (this._isPreamble !== true && this.listenerCount("part") !== 0) { + this.emit("part", this._part); + } else { + this._ignore(); + } + if (!this._isPreamble) { + this._inHeader = true; + } + } + if (data && start < end && !this._ignoreData) { + if (this._isPreamble || !this._inHeader) { + if (buf) { + shouldWriteMore = this._part.push(buf); + } + shouldWriteMore = this._part.push(data.slice(start, end)); + if (!shouldWriteMore) { + this._pause = true; + } + } else if (!this._isPreamble && this._inHeader) { + if (buf) { + this._hparser.push(buf); + } + r = this._hparser.push(data.slice(start, end)); + if (!this._inHeader && r !== void 0 && r < end) { + this._oninfo(false, data, start + r, end); + } + } + } + if (isMatch) { + this._hparser.reset(); + if (this._isPreamble) { + this._isPreamble = false; + } else { + if (start !== end) { + ++this._parts; + this._part.on("end", function() { + if (--self2._parts === 0) { + if (self2._finished) { + self2._realFinish = true; + self2.emit("finish"); + self2._realFinish = false; + } else { + self2._unpause(); + } + } + }); + } + } + this._part.push(null); + this._part = void 0; + this._ignoreData = false; + this._justMatched = true; + this._dashes = 0; + } + }; + Dicer.prototype._unpause = function() { + if (!this._pause) { + return; + } + this._pause = false; + if (this._cb) { + const cb = this._cb; + this._cb = void 0; + cb(); + } + }; + Dicer_1 = Dicer; + return Dicer_1; +} +var decodeText_1; +var hasRequiredDecodeText; +function requireDecodeText() { + if (hasRequiredDecodeText) return decodeText_1; + hasRequiredDecodeText = 1; + const utf8Decoder = new TextDecoder("utf-8"); + const textDecoders = /* @__PURE__ */ new Map([ + ["utf-8", utf8Decoder], + ["utf8", utf8Decoder] + ]); + function getDecoder(charset) { + let lc; + while (true) { + switch (charset) { + case "utf-8": + case "utf8": + return decoders.utf8; + case "latin1": + case "ascii": + // TODO: Make these a separate, strict decoder? + case "us-ascii": + case "iso-8859-1": + case "iso8859-1": + case "iso88591": + case "iso_8859-1": + case "windows-1252": + case "iso_8859-1:1987": + case "cp1252": + case "x-cp1252": + return decoders.latin1; + case "utf16le": + case "utf-16le": + case "ucs2": + case "ucs-2": + return decoders.utf16le; + case "base64": + return decoders.base64; + default: + if (lc === void 0) { + lc = true; + charset = charset.toLowerCase(); + continue; + } + return decoders.other.bind(charset); + } + } + } + const decoders = { + utf8: (data, sourceEncoding) => { + if (data.length === 0) { + return ""; + } + if (typeof data === "string") { + data = Buffer.from(data, sourceEncoding); + } + return data.utf8Slice(0, data.length); + }, + latin1: (data, sourceEncoding) => { + if (data.length === 0) { + return ""; + } + if (typeof data === "string") { + return data; + } + return data.latin1Slice(0, data.length); + }, + utf16le: (data, sourceEncoding) => { + if (data.length === 0) { + return ""; + } + if (typeof data === "string") { + data = Buffer.from(data, sourceEncoding); + } + return data.ucs2Slice(0, data.length); + }, + base64: (data, sourceEncoding) => { + if (data.length === 0) { + return ""; + } + if (typeof data === "string") { + data = Buffer.from(data, sourceEncoding); + } + return data.base64Slice(0, data.length); + }, + other: (data, sourceEncoding) => { + if (data.length === 0) { + return ""; + } + if (typeof data === "string") { + data = Buffer.from(data, sourceEncoding); + } + if (textDecoders.has(this.toString())) { + try { + return textDecoders.get(this).decode(data); + } catch { + } + } + return typeof data === "string" ? data : data.toString(); + } + }; + function decodeText(text, sourceEncoding, destEncoding) { + if (text) { + return getDecoder(destEncoding)(text, sourceEncoding); + } + return text; + } + decodeText_1 = decodeText; + return decodeText_1; +} +var parseParams_1; +var hasRequiredParseParams; +function requireParseParams() { + if (hasRequiredParseParams) return parseParams_1; + hasRequiredParseParams = 1; + const decodeText = requireDecodeText(); + const RE_ENCODED = /%[a-fA-F0-9][a-fA-F0-9]/g; + const EncodedLookup = { + "%00": "\0", + "%01": "", + "%02": "", + "%03": "", + "%04": "", + "%05": "", + "%06": "", + "%07": "\x07", + "%08": "\b", + "%09": " ", + "%0a": "\n", + "%0A": "\n", + "%0b": "\v", + "%0B": "\v", + "%0c": "\f", + "%0C": "\f", + "%0d": "\r", + "%0D": "\r", + "%0e": "", + "%0E": "", + "%0f": "", + "%0F": "", + "%10": "", + "%11": "", + "%12": "", + "%13": "", + "%14": "", + "%15": "", + "%16": "", + "%17": "", + "%18": "", + "%19": "", + "%1a": "", + "%1A": "", + "%1b": "\x1B", + "%1B": "\x1B", + "%1c": "", + "%1C": "", + "%1d": "", + "%1D": "", + "%1e": "", + "%1E": "", + "%1f": "", + "%1F": "", + "%20": " ", + "%21": "!", + "%22": '"', + "%23": "#", + "%24": "$", + "%25": "%", + "%26": "&", + "%27": "'", + "%28": "(", + "%29": ")", + "%2a": "*", + "%2A": "*", + "%2b": "+", + "%2B": "+", + "%2c": ",", + "%2C": ",", + "%2d": "-", + "%2D": "-", + "%2e": ".", + "%2E": ".", + "%2f": "/", + "%2F": "/", + "%30": "0", + "%31": "1", + "%32": "2", + "%33": "3", + "%34": "4", + "%35": "5", + "%36": "6", + "%37": "7", + "%38": "8", + "%39": "9", + "%3a": ":", + "%3A": ":", + "%3b": ";", + "%3B": ";", + "%3c": "<", + "%3C": "<", + "%3d": "=", + "%3D": "=", + "%3e": ">", + "%3E": ">", + "%3f": "?", + "%3F": "?", + "%40": "@", + "%41": "A", + "%42": "B", + "%43": "C", + "%44": "D", + "%45": "E", + "%46": "F", + "%47": "G", + "%48": "H", + "%49": "I", + "%4a": "J", + "%4A": "J", + "%4b": "K", + "%4B": "K", + "%4c": "L", + "%4C": "L", + "%4d": "M", + "%4D": "M", + "%4e": "N", + "%4E": "N", + "%4f": "O", + "%4F": "O", + "%50": "P", + "%51": "Q", + "%52": "R", + "%53": "S", + "%54": "T", + "%55": "U", + "%56": "V", + "%57": "W", + "%58": "X", + "%59": "Y", + "%5a": "Z", + "%5A": "Z", + "%5b": "[", + "%5B": "[", + "%5c": "\\", + "%5C": "\\", + "%5d": "]", + "%5D": "]", + "%5e": "^", + "%5E": "^", + "%5f": "_", + "%5F": "_", + "%60": "`", + "%61": "a", + "%62": "b", + "%63": "c", + "%64": "d", + "%65": "e", + "%66": "f", + "%67": "g", + "%68": "h", + "%69": "i", + "%6a": "j", + "%6A": "j", + "%6b": "k", + "%6B": "k", + "%6c": "l", + "%6C": "l", + "%6d": "m", + "%6D": "m", + "%6e": "n", + "%6E": "n", + "%6f": "o", + "%6F": "o", + "%70": "p", + "%71": "q", + "%72": "r", + "%73": "s", + "%74": "t", + "%75": "u", + "%76": "v", + "%77": "w", + "%78": "x", + "%79": "y", + "%7a": "z", + "%7A": "z", + "%7b": "{", + "%7B": "{", + "%7c": "|", + "%7C": "|", + "%7d": "}", + "%7D": "}", + "%7e": "~", + "%7E": "~", + "%7f": "", + "%7F": "", + "%80": "€", + "%81": "", + "%82": "‚", + "%83": "ƒ", + "%84": "„", + "%85": "…", + "%86": "†", + "%87": "‡", + "%88": "ˆ", + "%89": "‰", + "%8a": "Š", + "%8A": "Š", + "%8b": "‹", + "%8B": "‹", + "%8c": "Œ", + "%8C": "Œ", + "%8d": "", + "%8D": "", + "%8e": "Ž", + "%8E": "Ž", + "%8f": "", + "%8F": "", + "%90": "", + "%91": "‘", + "%92": "’", + "%93": "“", + "%94": "”", + "%95": "•", + "%96": "–", + "%97": "—", + "%98": "˜", + "%99": "™", + "%9a": "š", + "%9A": "š", + "%9b": "›", + "%9B": "›", + "%9c": "œ", + "%9C": "œ", + "%9d": "", + "%9D": "", + "%9e": "ž", + "%9E": "ž", + "%9f": "Ÿ", + "%9F": "Ÿ", + "%a0": " ", + "%A0": " ", + "%a1": "¡", + "%A1": "¡", + "%a2": "¢", + "%A2": "¢", + "%a3": "£", + "%A3": "£", + "%a4": "¤", + "%A4": "¤", + "%a5": "¥", + "%A5": "¥", + "%a6": "¦", + "%A6": "¦", + "%a7": "§", + "%A7": "§", + "%a8": "¨", + "%A8": "¨", + "%a9": "©", + "%A9": "©", + "%aa": "ª", + "%Aa": "ª", + "%aA": "ª", + "%AA": "ª", + "%ab": "«", + "%Ab": "«", + "%aB": "«", + "%AB": "«", + "%ac": "¬", + "%Ac": "¬", + "%aC": "¬", + "%AC": "¬", + "%ad": "­", + "%Ad": "­", + "%aD": "­", + "%AD": "­", + "%ae": "®", + "%Ae": "®", + "%aE": "®", + "%AE": "®", + "%af": "¯", + "%Af": "¯", + "%aF": "¯", + "%AF": "¯", + "%b0": "°", + "%B0": "°", + "%b1": "±", + "%B1": "±", + "%b2": "²", + "%B2": "²", + "%b3": "³", + "%B3": "³", + "%b4": "´", + "%B4": "´", + "%b5": "µ", + "%B5": "µ", + "%b6": "¶", + "%B6": "¶", + "%b7": "·", + "%B7": "·", + "%b8": "¸", + "%B8": "¸", + "%b9": "¹", + "%B9": "¹", + "%ba": "º", + "%Ba": "º", + "%bA": "º", + "%BA": "º", + "%bb": "»", + "%Bb": "»", + "%bB": "»", + "%BB": "»", + "%bc": "¼", + "%Bc": "¼", + "%bC": "¼", + "%BC": "¼", + "%bd": "½", + "%Bd": "½", + "%bD": "½", + "%BD": "½", + "%be": "¾", + "%Be": "¾", + "%bE": "¾", + "%BE": "¾", + "%bf": "¿", + "%Bf": "¿", + "%bF": "¿", + "%BF": "¿", + "%c0": "À", + "%C0": "À", + "%c1": "Á", + "%C1": "Á", + "%c2": "Â", + "%C2": "Â", + "%c3": "Ã", + "%C3": "Ã", + "%c4": "Ä", + "%C4": "Ä", + "%c5": "Å", + "%C5": "Å", + "%c6": "Æ", + "%C6": "Æ", + "%c7": "Ç", + "%C7": "Ç", + "%c8": "È", + "%C8": "È", + "%c9": "É", + "%C9": "É", + "%ca": "Ê", + "%Ca": "Ê", + "%cA": "Ê", + "%CA": "Ê", + "%cb": "Ë", + "%Cb": "Ë", + "%cB": "Ë", + "%CB": "Ë", + "%cc": "Ì", + "%Cc": "Ì", + "%cC": "Ì", + "%CC": "Ì", + "%cd": "Í", + "%Cd": "Í", + "%cD": "Í", + "%CD": "Í", + "%ce": "Î", + "%Ce": "Î", + "%cE": "Î", + "%CE": "Î", + "%cf": "Ï", + "%Cf": "Ï", + "%cF": "Ï", + "%CF": "Ï", + "%d0": "Ð", + "%D0": "Ð", + "%d1": "Ñ", + "%D1": "Ñ", + "%d2": "Ò", + "%D2": "Ò", + "%d3": "Ó", + "%D3": "Ó", + "%d4": "Ô", + "%D4": "Ô", + "%d5": "Õ", + "%D5": "Õ", + "%d6": "Ö", + "%D6": "Ö", + "%d7": "×", + "%D7": "×", + "%d8": "Ø", + "%D8": "Ø", + "%d9": "Ù", + "%D9": "Ù", + "%da": "Ú", + "%Da": "Ú", + "%dA": "Ú", + "%DA": "Ú", + "%db": "Û", + "%Db": "Û", + "%dB": "Û", + "%DB": "Û", + "%dc": "Ü", + "%Dc": "Ü", + "%dC": "Ü", + "%DC": "Ü", + "%dd": "Ý", + "%Dd": "Ý", + "%dD": "Ý", + "%DD": "Ý", + "%de": "Þ", + "%De": "Þ", + "%dE": "Þ", + "%DE": "Þ", + "%df": "ß", + "%Df": "ß", + "%dF": "ß", + "%DF": "ß", + "%e0": "à", + "%E0": "à", + "%e1": "á", + "%E1": "á", + "%e2": "â", + "%E2": "â", + "%e3": "ã", + "%E3": "ã", + "%e4": "ä", + "%E4": "ä", + "%e5": "å", + "%E5": "å", + "%e6": "æ", + "%E6": "æ", + "%e7": "ç", + "%E7": "ç", + "%e8": "è", + "%E8": "è", + "%e9": "é", + "%E9": "é", + "%ea": "ê", + "%Ea": "ê", + "%eA": "ê", + "%EA": "ê", + "%eb": "ë", + "%Eb": "ë", + "%eB": "ë", + "%EB": "ë", + "%ec": "ì", + "%Ec": "ì", + "%eC": "ì", + "%EC": "ì", + "%ed": "í", + "%Ed": "í", + "%eD": "í", + "%ED": "í", + "%ee": "î", + "%Ee": "î", + "%eE": "î", + "%EE": "î", + "%ef": "ï", + "%Ef": "ï", + "%eF": "ï", + "%EF": "ï", + "%f0": "ð", + "%F0": "ð", + "%f1": "ñ", + "%F1": "ñ", + "%f2": "ò", + "%F2": "ò", + "%f3": "ó", + "%F3": "ó", + "%f4": "ô", + "%F4": "ô", + "%f5": "õ", + "%F5": "õ", + "%f6": "ö", + "%F6": "ö", + "%f7": "÷", + "%F7": "÷", + "%f8": "ø", + "%F8": "ø", + "%f9": "ù", + "%F9": "ù", + "%fa": "ú", + "%Fa": "ú", + "%fA": "ú", + "%FA": "ú", + "%fb": "û", + "%Fb": "û", + "%fB": "û", + "%FB": "û", + "%fc": "ü", + "%Fc": "ü", + "%fC": "ü", + "%FC": "ü", + "%fd": "ý", + "%Fd": "ý", + "%fD": "ý", + "%FD": "ý", + "%fe": "þ", + "%Fe": "þ", + "%fE": "þ", + "%FE": "þ", + "%ff": "ÿ", + "%Ff": "ÿ", + "%fF": "ÿ", + "%FF": "ÿ" + }; + function encodedReplacer(match) { + return EncodedLookup[match]; + } + const STATE_KEY = 0; + const STATE_VALUE = 1; + const STATE_CHARSET = 2; + const STATE_LANG = 3; + function parseParams(str) { + const res = []; + let state = STATE_KEY; + let charset = ""; + let inquote = false; + let escaping = false; + let p = 0; + let tmp = ""; + const len = str.length; + for (var i = 0; i < len; ++i) { + const char = str[i]; + if (char === "\\" && inquote) { + if (escaping) { + escaping = false; + } else { + escaping = true; + continue; + } + } else if (char === '"') { + if (!escaping) { + if (inquote) { + inquote = false; + state = STATE_KEY; + } else { + inquote = true; + } + continue; + } else { + escaping = false; + } + } else { + if (escaping && inquote) { + tmp += "\\"; + } + escaping = false; + if ((state === STATE_CHARSET || state === STATE_LANG) && char === "'") { + if (state === STATE_CHARSET) { + state = STATE_LANG; + charset = tmp.substring(1); + } else { + state = STATE_VALUE; + } + tmp = ""; + continue; + } else if (state === STATE_KEY && (char === "*" || char === "=") && res.length) { + state = char === "*" ? STATE_CHARSET : STATE_VALUE; + res[p] = [tmp, void 0]; + tmp = ""; + continue; + } else if (!inquote && char === ";") { + state = STATE_KEY; + if (charset) { + if (tmp.length) { + tmp = decodeText( + tmp.replace(RE_ENCODED, encodedReplacer), + "binary", + charset + ); + } + charset = ""; + } else if (tmp.length) { + tmp = decodeText(tmp, "binary", "utf8"); + } + if (res[p] === void 0) { + res[p] = tmp; + } else { + res[p][1] = tmp; + } + tmp = ""; + ++p; + continue; + } else if (!inquote && (char === " " || char === " ")) { + continue; + } + } + tmp += char; + } + if (charset && tmp.length) { + tmp = decodeText( + tmp.replace(RE_ENCODED, encodedReplacer), + "binary", + charset + ); + } else if (tmp) { + tmp = decodeText(tmp, "binary", "utf8"); + } + if (res[p] === void 0) { + if (tmp) { + res[p] = tmp; + } + } else { + res[p][1] = tmp; + } + return res; + } + parseParams_1 = parseParams; + return parseParams_1; +} +var basename; +var hasRequiredBasename; +function requireBasename() { + if (hasRequiredBasename) return basename; + hasRequiredBasename = 1; + basename = function basename2(path) { + if (typeof path !== "string") { + return ""; + } + for (var i = path.length - 1; i >= 0; --i) { + switch (path.charCodeAt(i)) { + case 47: + // '/' + case 92: + path = path.slice(i + 1); + return path === ".." || path === "." ? "" : path; + } + } + return path === ".." || path === "." ? "" : path; + }; + return basename; +} +var multipart; +var hasRequiredMultipart; +function requireMultipart() { + if (hasRequiredMultipart) return multipart; + hasRequiredMultipart = 1; + const { Readable } = require$$0$6; + const { inherits } = require$$1$2; + const Dicer = requireDicer(); + const parseParams = requireParseParams(); + const decodeText = requireDecodeText(); + const basename2 = requireBasename(); + const getLimit2 = requireGetLimit(); + const RE_BOUNDARY = /^boundary$/i; + const RE_FIELD = /^form-data$/i; + const RE_CHARSET = /^charset$/i; + const RE_FILENAME = /^filename$/i; + const RE_NAME = /^name$/i; + Multipart.detect = /^multipart\/form-data/i; + function Multipart(boy, cfg) { + let i; + let len; + const self2 = this; + let boundary; + const limits = cfg.limits; + const isPartAFile = cfg.isPartAFile || ((fieldName, contentType, fileName) => contentType === "application/octet-stream" || fileName !== void 0); + const parsedConType = cfg.parsedConType || []; + const defCharset = cfg.defCharset || "utf8"; + const preservePath = cfg.preservePath; + const fileOpts = { highWaterMark: cfg.fileHwm }; + for (i = 0, len = parsedConType.length; i < len; ++i) { + if (Array.isArray(parsedConType[i]) && RE_BOUNDARY.test(parsedConType[i][0])) { + boundary = parsedConType[i][1]; + break; + } + } + function checkFinished() { + if (nends === 0 && finished && !boy._done) { + finished = false; + self2.end(); + } + } + if (typeof boundary !== "string") { + throw new Error("Multipart: Boundary not found"); + } + const fieldSizeLimit = getLimit2(limits, "fieldSize", 1 * 1024 * 1024); + const fileSizeLimit = getLimit2(limits, "fileSize", Infinity); + const filesLimit = getLimit2(limits, "files", Infinity); + const fieldsLimit = getLimit2(limits, "fields", Infinity); + const partsLimit = getLimit2(limits, "parts", Infinity); + const headerPairsLimit = getLimit2(limits, "headerPairs", 2e3); + const headerSizeLimit = getLimit2(limits, "headerSize", 80 * 1024); + let nfiles = 0; + let nfields = 0; + let nends = 0; + let curFile; + let curField; + let finished = false; + this._needDrain = false; + this._pause = false; + this._cb = void 0; + this._nparts = 0; + this._boy = boy; + const parserCfg = { + boundary, + maxHeaderPairs: headerPairsLimit, + maxHeaderSize: headerSizeLimit, + partHwm: fileOpts.highWaterMark, + highWaterMark: cfg.highWaterMark + }; + this.parser = new Dicer(parserCfg); + this.parser.on("drain", function() { + self2._needDrain = false; + if (self2._cb && !self2._pause) { + const cb = self2._cb; + self2._cb = void 0; + cb(); + } + }).on("part", function onPart(part) { + if (++self2._nparts > partsLimit) { + self2.parser.removeListener("part", onPart); + self2.parser.on("part", skipPart); + boy.hitPartsLimit = true; + boy.emit("partsLimit"); + return skipPart(part); + } + if (curField) { + const field = curField; + field.emit("end"); + field.removeAllListeners("end"); + } + part.on("header", function(header) { + let contype; + let fieldname; + let parsed; + let charset; + let encoding2; + let filename; + let nsize = 0; + if (header["content-type"]) { + parsed = parseParams(header["content-type"][0]); + if (parsed[0]) { + contype = parsed[0].toLowerCase(); + for (i = 0, len = parsed.length; i < len; ++i) { + if (RE_CHARSET.test(parsed[i][0])) { + charset = parsed[i][1].toLowerCase(); + break; + } + } + } + } + if (contype === void 0) { + contype = "text/plain"; + } + if (charset === void 0) { + charset = defCharset; + } + if (header["content-disposition"]) { + parsed = parseParams(header["content-disposition"][0]); + if (!RE_FIELD.test(parsed[0])) { + return skipPart(part); + } + for (i = 0, len = parsed.length; i < len; ++i) { + if (RE_NAME.test(parsed[i][0])) { + fieldname = parsed[i][1]; + } else if (RE_FILENAME.test(parsed[i][0])) { + filename = parsed[i][1]; + if (!preservePath) { + filename = basename2(filename); + } + } + } + } else { + return skipPart(part); + } + if (header["content-transfer-encoding"]) { + encoding2 = header["content-transfer-encoding"][0].toLowerCase(); + } else { + encoding2 = "7bit"; + } + let onData, onEnd; + if (isPartAFile(fieldname, contype, filename)) { + if (nfiles === filesLimit) { + if (!boy.hitFilesLimit) { + boy.hitFilesLimit = true; + boy.emit("filesLimit"); + } + return skipPart(part); + } + ++nfiles; + if (boy.listenerCount("file") === 0) { + self2.parser._ignore(); + return; + } + ++nends; + const file2 = new FileStream(fileOpts); + curFile = file2; + file2.on("end", function() { + --nends; + self2._pause = false; + checkFinished(); + if (self2._cb && !self2._needDrain) { + const cb = self2._cb; + self2._cb = void 0; + cb(); + } + }); + file2._read = function(n) { + if (!self2._pause) { + return; + } + self2._pause = false; + if (self2._cb && !self2._needDrain) { + const cb = self2._cb; + self2._cb = void 0; + cb(); + } + }; + boy.emit("file", fieldname, file2, filename, encoding2, contype); + onData = function(data) { + if ((nsize += data.length) > fileSizeLimit) { + const extralen = fileSizeLimit - nsize + data.length; + if (extralen > 0) { + file2.push(data.slice(0, extralen)); + } + file2.truncated = true; + file2.bytesRead = fileSizeLimit; + part.removeAllListeners("data"); + file2.emit("limit"); + return; + } else if (!file2.push(data)) { + self2._pause = true; + } + file2.bytesRead = nsize; + }; + onEnd = function() { + curFile = void 0; + file2.push(null); + }; + } else { + if (nfields === fieldsLimit) { + if (!boy.hitFieldsLimit) { + boy.hitFieldsLimit = true; + boy.emit("fieldsLimit"); + } + return skipPart(part); + } + ++nfields; + ++nends; + let buffer = ""; + let truncated = false; + curField = part; + onData = function(data) { + if ((nsize += data.length) > fieldSizeLimit) { + const extralen = fieldSizeLimit - (nsize - data.length); + buffer += data.toString("binary", 0, extralen); + truncated = true; + part.removeAllListeners("data"); + } else { + buffer += data.toString("binary"); + } + }; + onEnd = function() { + curField = void 0; + if (buffer.length) { + buffer = decodeText(buffer, "binary", charset); + } + boy.emit("field", fieldname, buffer, false, truncated, encoding2, contype); + --nends; + checkFinished(); + }; + } + part._readableState.sync = false; + part.on("data", onData); + part.on("end", onEnd); + }).on("error", function(err) { + if (curFile) { + curFile.emit("error", err); + } + }); + }).on("error", function(err) { + boy.emit("error", err); + }).on("finish", function() { + finished = true; + checkFinished(); + }); + } + Multipart.prototype.write = function(chunk, cb) { + const r = this.parser.write(chunk); + if (r && !this._pause) { + cb(); + } else { + this._needDrain = !r; + this._cb = cb; + } + }; + Multipart.prototype.end = function() { + const self2 = this; + if (self2.parser.writable) { + self2.parser.end(); + } else if (!self2._boy._done) { + process.nextTick(function() { + self2._boy._done = true; + self2._boy.emit("finish"); + }); + } + }; + function skipPart(part) { + part.resume(); + } + function FileStream(opts) { + Readable.call(this, opts); + this.bytesRead = 0; + this.truncated = false; + } + inherits(FileStream, Readable); + FileStream.prototype._read = function(n) { + }; + multipart = Multipart; + return multipart; +} +var Decoder_1; +var hasRequiredDecoder; +function requireDecoder() { + if (hasRequiredDecoder) return Decoder_1; + hasRequiredDecoder = 1; + const RE_PLUS = /\+/g; + const HEX = [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ]; + function Decoder() { + this.buffer = void 0; + } + Decoder.prototype.write = function(str) { + str = str.replace(RE_PLUS, " "); + let res = ""; + let i = 0; + let p = 0; + const len = str.length; + for (; i < len; ++i) { + if (this.buffer !== void 0) { + if (!HEX[str.charCodeAt(i)]) { + res += "%" + this.buffer; + this.buffer = void 0; + --i; + } else { + this.buffer += str[i]; + ++p; + if (this.buffer.length === 2) { + res += String.fromCharCode(parseInt(this.buffer, 16)); + this.buffer = void 0; + } + } + } else if (str[i] === "%") { + if (i > p) { + res += str.substring(p, i); + p = i; + } + this.buffer = ""; + ++p; + } + } + if (p < len && this.buffer === void 0) { + res += str.substring(p); + } + return res; + }; + Decoder.prototype.reset = function() { + this.buffer = void 0; + }; + Decoder_1 = Decoder; + return Decoder_1; +} +var urlencoded; +var hasRequiredUrlencoded; +function requireUrlencoded() { + if (hasRequiredUrlencoded) return urlencoded; + hasRequiredUrlencoded = 1; + const Decoder = requireDecoder(); + const decodeText = requireDecodeText(); + const getLimit2 = requireGetLimit(); + const RE_CHARSET = /^charset$/i; + UrlEncoded.detect = /^application\/x-www-form-urlencoded/i; + function UrlEncoded(boy, cfg) { + const limits = cfg.limits; + const parsedConType = cfg.parsedConType; + this.boy = boy; + this.fieldSizeLimit = getLimit2(limits, "fieldSize", 1 * 1024 * 1024); + this.fieldNameSizeLimit = getLimit2(limits, "fieldNameSize", 100); + this.fieldsLimit = getLimit2(limits, "fields", Infinity); + let charset; + for (var i = 0, len = parsedConType.length; i < len; ++i) { + if (Array.isArray(parsedConType[i]) && RE_CHARSET.test(parsedConType[i][0])) { + charset = parsedConType[i][1].toLowerCase(); + break; + } + } + if (charset === void 0) { + charset = cfg.defCharset || "utf8"; + } + this.decoder = new Decoder(); + this.charset = charset; + this._fields = 0; + this._state = "key"; + this._checkingBytes = true; + this._bytesKey = 0; + this._bytesVal = 0; + this._key = ""; + this._val = ""; + this._keyTrunc = false; + this._valTrunc = false; + this._hitLimit = false; + } + UrlEncoded.prototype.write = function(data, cb) { + if (this._fields === this.fieldsLimit) { + if (!this.boy.hitFieldsLimit) { + this.boy.hitFieldsLimit = true; + this.boy.emit("fieldsLimit"); + } + return cb(); + } + let idxeq; + let idxamp; + let i; + let p = 0; + const len = data.length; + while (p < len) { + if (this._state === "key") { + idxeq = idxamp = void 0; + for (i = p; i < len; ++i) { + if (!this._checkingBytes) { + ++p; + } + if (data[i] === 61) { + idxeq = i; + break; + } else if (data[i] === 38) { + idxamp = i; + break; + } + if (this._checkingBytes && this._bytesKey === this.fieldNameSizeLimit) { + this._hitLimit = true; + break; + } else if (this._checkingBytes) { + ++this._bytesKey; + } + } + if (idxeq !== void 0) { + if (idxeq > p) { + this._key += this.decoder.write(data.toString("binary", p, idxeq)); + } + this._state = "val"; + this._hitLimit = false; + this._checkingBytes = true; + this._val = ""; + this._bytesVal = 0; + this._valTrunc = false; + this.decoder.reset(); + p = idxeq + 1; + } else if (idxamp !== void 0) { + ++this._fields; + let key; + const keyTrunc = this._keyTrunc; + if (idxamp > p) { + key = this._key += this.decoder.write(data.toString("binary", p, idxamp)); + } else { + key = this._key; + } + this._hitLimit = false; + this._checkingBytes = true; + this._key = ""; + this._bytesKey = 0; + this._keyTrunc = false; + this.decoder.reset(); + if (key.length) { + this.boy.emit( + "field", + decodeText(key, "binary", this.charset), + "", + keyTrunc, + false + ); + } + p = idxamp + 1; + if (this._fields === this.fieldsLimit) { + return cb(); + } + } else if (this._hitLimit) { + if (i > p) { + this._key += this.decoder.write(data.toString("binary", p, i)); + } + p = i; + if ((this._bytesKey = this._key.length) === this.fieldNameSizeLimit) { + this._checkingBytes = false; + this._keyTrunc = true; + } + } else { + if (p < len) { + this._key += this.decoder.write(data.toString("binary", p)); + } + p = len; + } + } else { + idxamp = void 0; + for (i = p; i < len; ++i) { + if (!this._checkingBytes) { + ++p; + } + if (data[i] === 38) { + idxamp = i; + break; + } + if (this._checkingBytes && this._bytesVal === this.fieldSizeLimit) { + this._hitLimit = true; + break; + } else if (this._checkingBytes) { + ++this._bytesVal; + } + } + if (idxamp !== void 0) { + ++this._fields; + if (idxamp > p) { + this._val += this.decoder.write(data.toString("binary", p, idxamp)); + } + this.boy.emit( + "field", + decodeText(this._key, "binary", this.charset), + decodeText(this._val, "binary", this.charset), + this._keyTrunc, + this._valTrunc + ); + this._state = "key"; + this._hitLimit = false; + this._checkingBytes = true; + this._key = ""; + this._bytesKey = 0; + this._keyTrunc = false; + this.decoder.reset(); + p = idxamp + 1; + if (this._fields === this.fieldsLimit) { + return cb(); + } + } else if (this._hitLimit) { + if (i > p) { + this._val += this.decoder.write(data.toString("binary", p, i)); + } + p = i; + if (this._val === "" && this.fieldSizeLimit === 0 || (this._bytesVal = this._val.length) === this.fieldSizeLimit) { + this._checkingBytes = false; + this._valTrunc = true; + } + } else { + if (p < len) { + this._val += this.decoder.write(data.toString("binary", p)); + } + p = len; + } + } + } + cb(); + }; + UrlEncoded.prototype.end = function() { + if (this.boy._done) { + return; + } + if (this._state === "key" && this._key.length > 0) { + this.boy.emit( + "field", + decodeText(this._key, "binary", this.charset), + "", + this._keyTrunc, + false + ); + } else if (this._state === "val") { + this.boy.emit( + "field", + decodeText(this._key, "binary", this.charset), + decodeText(this._val, "binary", this.charset), + this._keyTrunc, + this._valTrunc + ); + } + this.boy._done = true; + this.boy.emit("finish"); + }; + urlencoded = UrlEncoded; + return urlencoded; +} +var hasRequiredMain; +function requireMain() { + if (hasRequiredMain) return main.exports; + hasRequiredMain = 1; + const WritableStream = require$$0$6.Writable; + const { inherits } = require$$1$2; + const Dicer = requireDicer(); + const MultipartParser = requireMultipart(); + const UrlencodedParser = requireUrlencoded(); + const parseParams = requireParseParams(); + function Busboy(opts) { + if (!(this instanceof Busboy)) { + return new Busboy(opts); + } + if (typeof opts !== "object") { + throw new TypeError("Busboy expected an options-Object."); + } + if (typeof opts.headers !== "object") { + throw new TypeError("Busboy expected an options-Object with headers-attribute."); + } + if (typeof opts.headers["content-type"] !== "string") { + throw new TypeError("Missing Content-Type-header."); + } + const { + headers: headers2, + ...streamOptions + } = opts; + this.opts = { + autoDestroy: false, + ...streamOptions + }; + WritableStream.call(this, this.opts); + this._done = false; + this._parser = this.getParserByHeaders(headers2); + this._finished = false; + } + inherits(Busboy, WritableStream); + Busboy.prototype.emit = function(ev) { + if (ev === "finish") { + if (!this._done) { + this._parser?.end(); + return; + } else if (this._finished) { + return; + } + this._finished = true; + } + WritableStream.prototype.emit.apply(this, arguments); + }; + Busboy.prototype.getParserByHeaders = function(headers2) { + const parsed = parseParams(headers2["content-type"]); + const cfg = { + defCharset: this.opts.defCharset, + fileHwm: this.opts.fileHwm, + headers: headers2, + highWaterMark: this.opts.highWaterMark, + isPartAFile: this.opts.isPartAFile, + limits: this.opts.limits, + parsedConType: parsed, + preservePath: this.opts.preservePath + }; + if (MultipartParser.detect.test(parsed[0])) { + return new MultipartParser(this, cfg); + } + if (UrlencodedParser.detect.test(parsed[0])) { + return new UrlencodedParser(this, cfg); + } + throw new Error("Unsupported Content-Type."); + }; + Busboy.prototype._write = function(chunk, encoding2, cb) { + this._parser.write(chunk, cb); + }; + main.exports = Busboy; + main.exports.default = Busboy; + main.exports.Busboy = Busboy; + main.exports.Dicer = Dicer; + return main.exports; +} +var constants$3; +var hasRequiredConstants$3; +function requireConstants$3() { + if (hasRequiredConstants$3) return constants$3; + hasRequiredConstants$3 = 1; + const { MessageChannel, receiveMessageOnPort } = require$$0$c; + const corsSafeListedMethods = ["GET", "HEAD", "POST"]; + const corsSafeListedMethodsSet = new Set(corsSafeListedMethods); + const nullBodyStatus = [101, 204, 205, 304]; + const redirectStatus = [301, 302, 303, 307, 308]; + const redirectStatusSet = new Set(redirectStatus); + const badPorts = [ + "1", + "7", + "9", + "11", + "13", + "15", + "17", + "19", + "20", + "21", + "22", + "23", + "25", + "37", + "42", + "43", + "53", + "69", + "77", + "79", + "87", + "95", + "101", + "102", + "103", + "104", + "109", + "110", + "111", + "113", + "115", + "117", + "119", + "123", + "135", + "137", + "139", + "143", + "161", + "179", + "389", + "427", + "465", + "512", + "513", + "514", + "515", + "526", + "530", + "531", + "532", + "540", + "548", + "554", + "556", + "563", + "587", + "601", + "636", + "989", + "990", + "993", + "995", + "1719", + "1720", + "1723", + "2049", + "3659", + "4045", + "5060", + "5061", + "6000", + "6566", + "6665", + "6666", + "6667", + "6668", + "6669", + "6697", + "10080" + ]; + const badPortsSet = new Set(badPorts); + const referrerPolicy = [ + "", + "no-referrer", + "no-referrer-when-downgrade", + "same-origin", + "origin", + "strict-origin", + "origin-when-cross-origin", + "strict-origin-when-cross-origin", + "unsafe-url" + ]; + const referrerPolicySet = new Set(referrerPolicy); + const requestRedirect = ["follow", "manual", "error"]; + const safeMethods = ["GET", "HEAD", "OPTIONS", "TRACE"]; + const safeMethodsSet = new Set(safeMethods); + const requestMode = ["navigate", "same-origin", "no-cors", "cors"]; + const requestCredentials = ["omit", "same-origin", "include"]; + const requestCache = [ + "default", + "no-store", + "reload", + "no-cache", + "force-cache", + "only-if-cached" + ]; + const requestBodyHeader = [ + "content-encoding", + "content-language", + "content-location", + "content-type", + // See https://github.com/nodejs/undici/issues/2021 + // 'Content-Length' is a forbidden header name, which is typically + // removed in the Headers implementation. However, undici doesn't + // filter out headers, so we add it here. + "content-length" + ]; + const requestDuplex = [ + "half" + ]; + const forbiddenMethods = ["CONNECT", "TRACE", "TRACK"]; + const forbiddenMethodsSet = new Set(forbiddenMethods); + const subresource = [ + "audio", + "audioworklet", + "font", + "image", + "manifest", + "paintworklet", + "script", + "style", + "track", + "video", + "xslt", + "" + ]; + const subresourceSet = new Set(subresource); + const DOMException2 = globalThis.DOMException ?? (() => { + try { + atob("~"); + } catch (err) { + return Object.getPrototypeOf(err).constructor; + } + })(); + let channel; + const structuredClone = globalThis.structuredClone ?? // https://github.com/nodejs/node/blob/b27ae24dcc4251bad726d9d84baf678d1f707fed/lib/internal/structured_clone.js + // structuredClone was added in v17.0.0, but fetch supports v16.8 + function structuredClone2(value, options = void 0) { + if (arguments.length === 0) { + throw new TypeError("missing argument"); + } + if (!channel) { + channel = new MessageChannel(); + } + channel.port1.unref(); + channel.port2.unref(); + channel.port1.postMessage(value, options?.transfer); + return receiveMessageOnPort(channel.port2).message; + }; + constants$3 = { + DOMException: DOMException2, + structuredClone, + subresource, + forbiddenMethods, + requestBodyHeader, + referrerPolicy, + requestRedirect, + requestMode, + requestCredentials, + requestCache, + redirectStatus, + corsSafeListedMethods, + nullBodyStatus, + safeMethods, + badPorts, + requestDuplex, + subresourceSet, + badPortsSet, + redirectStatusSet, + corsSafeListedMethodsSet, + safeMethodsSet, + forbiddenMethodsSet, + referrerPolicySet + }; + return constants$3; +} +var global$2; +var hasRequiredGlobal$1; +function requireGlobal$1() { + if (hasRequiredGlobal$1) return global$2; + hasRequiredGlobal$1 = 1; + const globalOrigin = /* @__PURE__ */ Symbol.for("undici.globalOrigin.1"); + function getGlobalOrigin() { + return globalThis[globalOrigin]; + } + function setGlobalOrigin(newOrigin) { + if (newOrigin === void 0) { + Object.defineProperty(globalThis, globalOrigin, { + value: void 0, + writable: true, + enumerable: false, + configurable: false + }); + return; + } + const parsedURL = new URL(newOrigin); + if (parsedURL.protocol !== "http:" && parsedURL.protocol !== "https:") { + throw new TypeError(`Only http & https urls are allowed, received ${parsedURL.protocol}`); + } + Object.defineProperty(globalThis, globalOrigin, { + value: parsedURL, + writable: true, + enumerable: false, + configurable: false + }); + } + global$2 = { + getGlobalOrigin, + setGlobalOrigin + }; + return global$2; +} +var util$5; +var hasRequiredUtil$5; +function requireUtil$5() { + if (hasRequiredUtil$5) return util$5; + hasRequiredUtil$5 = 1; + const { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = requireConstants$3(); + const { getGlobalOrigin } = requireGlobal$1(); + const { performance: performance2 } = require$$2$4; + const { isBlobLike, toUSVString, ReadableStreamFrom } = requireUtil$6(); + const assert = require$$0$9; + const { isUint8Array } = require$$5$4; + let supportedHashes = []; + let crypto; + try { + crypto = require("crypto"); + const possibleRelevantHashes = ["sha256", "sha384", "sha512"]; + supportedHashes = crypto.getHashes().filter((hash) => possibleRelevantHashes.includes(hash)); + } catch { + } + function responseURL(response2) { + const urlList = response2.urlList; + const length = urlList.length; + return length === 0 ? null : urlList[length - 1].toString(); + } + function responseLocationURL(response2, requestFragment) { + if (!redirectStatusSet.has(response2.status)) { + return null; + } + let location = response2.headersList.get("location"); + if (location !== null && isValidHeaderValue(location)) { + location = new URL(location, responseURL(response2)); + } + if (location && !location.hash) { + location.hash = requestFragment; + } + return location; + } + function requestCurrentURL(request2) { + return request2.urlList[request2.urlList.length - 1]; + } + function requestBadPort(request2) { + const url = requestCurrentURL(request2); + if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) { + return "blocked"; + } + return "allowed"; + } + function isErrorLike(object) { + return object instanceof Error || (object?.constructor?.name === "Error" || object?.constructor?.name === "DOMException"); + } + function isValidReasonPhrase(statusText) { + for (let i = 0; i < statusText.length; ++i) { + const c = statusText.charCodeAt(i); + if (!(c === 9 || // HTAB + c >= 32 && c <= 126 || // SP / VCHAR + c >= 128 && c <= 255)) { + return false; + } + } + return true; + } + function isTokenCharCode(c) { + switch (c) { + case 34: + case 40: + case 41: + case 44: + case 47: + case 58: + case 59: + case 60: + case 61: + case 62: + case 63: + case 64: + case 91: + case 92: + case 93: + case 123: + case 125: + return false; + default: + return c >= 33 && c <= 126; + } + } + function isValidHTTPToken(characters) { + if (characters.length === 0) { + return false; + } + for (let i = 0; i < characters.length; ++i) { + if (!isTokenCharCode(characters.charCodeAt(i))) { + return false; + } + } + return true; + } + function isValidHeaderName(potentialValue) { + return isValidHTTPToken(potentialValue); + } + function isValidHeaderValue(potentialValue) { + if (potentialValue.startsWith(" ") || potentialValue.startsWith(" ") || potentialValue.endsWith(" ") || potentialValue.endsWith(" ")) { + return false; + } + if (potentialValue.includes("\0") || potentialValue.includes("\r") || potentialValue.includes("\n")) { + return false; + } + return true; + } + function setRequestReferrerPolicyOnRedirect(request2, actualResponse) { + const { headersList } = actualResponse; + const policyHeader = (headersList.get("referrer-policy") ?? "").split(","); + let policy = ""; + if (policyHeader.length > 0) { + for (let i = policyHeader.length; i !== 0; i--) { + const token = policyHeader[i - 1].trim(); + if (referrerPolicyTokens.has(token)) { + policy = token; + break; + } + } + } + if (policy !== "") { + request2.referrerPolicy = policy; + } + } + function crossOriginResourcePolicyCheck() { + return "allowed"; + } + function corsCheck() { + return "success"; + } + function TAOCheck() { + return "success"; + } + function appendFetchMetadata(httpRequest) { + let header = null; + header = httpRequest.mode; + httpRequest.headersList.set("sec-fetch-mode", header); + } + function appendRequestOriginHeader(request2) { + let serializedOrigin = request2.origin; + if (request2.responseTainting === "cors" || request2.mode === "websocket") { + if (serializedOrigin) { + request2.headersList.append("origin", serializedOrigin); + } + } else if (request2.method !== "GET" && request2.method !== "HEAD") { + switch (request2.referrerPolicy) { + case "no-referrer": + serializedOrigin = null; + break; + case "no-referrer-when-downgrade": + case "strict-origin": + case "strict-origin-when-cross-origin": + if (request2.origin && urlHasHttpsScheme(request2.origin) && !urlHasHttpsScheme(requestCurrentURL(request2))) { + serializedOrigin = null; + } + break; + case "same-origin": + if (!sameOrigin(request2, requestCurrentURL(request2))) { + serializedOrigin = null; + } + break; + } + if (serializedOrigin) { + request2.headersList.append("origin", serializedOrigin); + } + } + } + function coarsenedSharedCurrentTime(crossOriginIsolatedCapability) { + return performance2.now(); + } + function createOpaqueTimingInfo(timingInfo) { + return { + startTime: timingInfo.startTime ?? 0, + redirectStartTime: 0, + redirectEndTime: 0, + postRedirectStartTime: timingInfo.startTime ?? 0, + finalServiceWorkerStartTime: 0, + finalNetworkResponseStartTime: 0, + finalNetworkRequestStartTime: 0, + endTime: 0, + encodedBodySize: 0, + decodedBodySize: 0, + finalConnectionTimingInfo: null + }; + } + function makePolicyContainer() { + return { + referrerPolicy: "strict-origin-when-cross-origin" + }; + } + function clonePolicyContainer(policyContainer) { + return { + referrerPolicy: policyContainer.referrerPolicy + }; + } + function determineRequestsReferrer(request2) { + const policy = request2.referrerPolicy; + assert(policy); + let referrerSource = null; + if (request2.referrer === "client") { + const globalOrigin = getGlobalOrigin(); + if (!globalOrigin || globalOrigin.origin === "null") { + return "no-referrer"; + } + referrerSource = new URL(globalOrigin); + } else if (request2.referrer instanceof URL) { + referrerSource = request2.referrer; + } + let referrerURL = stripURLForReferrer(referrerSource); + const referrerOrigin = stripURLForReferrer(referrerSource, true); + if (referrerURL.toString().length > 4096) { + referrerURL = referrerOrigin; + } + const areSameOrigin = sameOrigin(request2, referrerURL); + const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(request2.url); + switch (policy) { + case "origin": + return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true); + case "unsafe-url": + return referrerURL; + case "same-origin": + return areSameOrigin ? referrerOrigin : "no-referrer"; + case "origin-when-cross-origin": + return areSameOrigin ? referrerURL : referrerOrigin; + case "strict-origin-when-cross-origin": { + const currentURL = requestCurrentURL(request2); + if (sameOrigin(referrerURL, currentURL)) { + return referrerURL; + } + if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { + return "no-referrer"; + } + return referrerOrigin; + } + case "strict-origin": + // eslint-disable-line + /** + * 1. If referrerURL is a potentially trustworthy URL and + * request’s current URL is not a potentially trustworthy URL, + * then return no referrer. + * 2. Return referrerOrigin + */ + case "no-referrer-when-downgrade": + // eslint-disable-line + /** + * 1. If referrerURL is a potentially trustworthy URL and + * request’s current URL is not a potentially trustworthy URL, + * then return no referrer. + * 2. Return referrerOrigin + */ + default: + return isNonPotentiallyTrustWorthy ? "no-referrer" : referrerOrigin; + } + } + function stripURLForReferrer(url, originOnly) { + assert(url instanceof URL); + if (url.protocol === "file:" || url.protocol === "about:" || url.protocol === "blank:") { + return "no-referrer"; + } + url.username = ""; + url.password = ""; + url.hash = ""; + if (originOnly) { + url.pathname = ""; + url.search = ""; + } + return url; + } + function isURLPotentiallyTrustworthy(url) { + if (!(url instanceof URL)) { + return false; + } + if (url.href === "about:blank" || url.href === "about:srcdoc") { + return true; + } + if (url.protocol === "data:") return true; + if (url.protocol === "file:") return true; + return isOriginPotentiallyTrustworthy(url.origin); + function isOriginPotentiallyTrustworthy(origin) { + if (origin == null || origin === "null") return false; + const originAsURL = new URL(origin); + if (originAsURL.protocol === "https:" || originAsURL.protocol === "wss:") { + return true; + } + if (/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(originAsURL.hostname) || (originAsURL.hostname === "localhost" || originAsURL.hostname.includes("localhost.")) || originAsURL.hostname.endsWith(".localhost")) { + return true; + } + return false; + } + } + function bytesMatch(bytes, metadataList) { + if (crypto === void 0) { + return true; + } + const parsedMetadata = parseMetadata(metadataList); + if (parsedMetadata === "no metadata") { + return true; + } + if (parsedMetadata.length === 0) { + return true; + } + const strongest = getStrongestMetadata(parsedMetadata); + const metadata = filterMetadataListByAlgorithm(parsedMetadata, strongest); + for (const item of metadata) { + const algorithm = item.algo; + const expectedValue = item.hash; + let actualValue = crypto.createHash(algorithm).update(bytes).digest("base64"); + if (actualValue[actualValue.length - 1] === "=") { + if (actualValue[actualValue.length - 2] === "=") { + actualValue = actualValue.slice(0, -2); + } else { + actualValue = actualValue.slice(0, -1); + } + } + if (compareBase64Mixed(actualValue, expectedValue)) { + return true; + } + } + return false; + } + const parseHashWithOptions = /(?sha256|sha384|sha512)-((?[A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i; + function parseMetadata(metadata) { + const result = []; + let empty = true; + for (const token of metadata.split(" ")) { + empty = false; + const parsedToken = parseHashWithOptions.exec(token); + if (parsedToken === null || parsedToken.groups === void 0 || parsedToken.groups.algo === void 0) { + continue; + } + const algorithm = parsedToken.groups.algo.toLowerCase(); + if (supportedHashes.includes(algorithm)) { + result.push(parsedToken.groups); + } + } + if (empty === true) { + return "no metadata"; + } + return result; + } + function getStrongestMetadata(metadataList) { + let algorithm = metadataList[0].algo; + if (algorithm[3] === "5") { + return algorithm; + } + for (let i = 1; i < metadataList.length; ++i) { + const metadata = metadataList[i]; + if (metadata.algo[3] === "5") { + algorithm = "sha512"; + break; + } else if (algorithm[3] === "3") { + continue; + } else if (metadata.algo[3] === "3") { + algorithm = "sha384"; + } + } + return algorithm; + } + function filterMetadataListByAlgorithm(metadataList, algorithm) { + if (metadataList.length === 1) { + return metadataList; + } + let pos = 0; + for (let i = 0; i < metadataList.length; ++i) { + if (metadataList[i].algo === algorithm) { + metadataList[pos++] = metadataList[i]; + } + } + metadataList.length = pos; + return metadataList; + } + function compareBase64Mixed(actualValue, expectedValue) { + if (actualValue.length !== expectedValue.length) { + return false; + } + for (let i = 0; i < actualValue.length; ++i) { + if (actualValue[i] !== expectedValue[i]) { + if (actualValue[i] === "+" && expectedValue[i] === "-" || actualValue[i] === "/" && expectedValue[i] === "_") { + continue; + } + return false; + } + } + return true; + } + function tryUpgradeRequestToAPotentiallyTrustworthyURL(request2) { + } + function sameOrigin(A, B) { + if (A.origin === B.origin && A.origin === "null") { + return true; + } + if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) { + return true; + } + return false; + } + function createDeferredPromise() { + let res; + let rej; + const promise = new Promise((resolve, reject) => { + res = resolve; + rej = reject; + }); + return { promise, resolve: res, reject: rej }; + } + function isAborted(fetchParams) { + return fetchParams.controller.state === "aborted"; + } + function isCancelled(fetchParams) { + return fetchParams.controller.state === "aborted" || fetchParams.controller.state === "terminated"; + } + const normalizeMethodRecord = { + delete: "DELETE", + DELETE: "DELETE", + get: "GET", + GET: "GET", + head: "HEAD", + HEAD: "HEAD", + options: "OPTIONS", + OPTIONS: "OPTIONS", + post: "POST", + POST: "POST", + put: "PUT", + PUT: "PUT" + }; + Object.setPrototypeOf(normalizeMethodRecord, null); + function normalizeMethod(method) { + return normalizeMethodRecord[method.toLowerCase()] ?? method; + } + function serializeJavascriptValueToJSONString(value) { + const result = JSON.stringify(value); + if (result === void 0) { + throw new TypeError("Value is not JSON serializable"); + } + assert(typeof result === "string"); + return result; + } + const esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); + function makeIterator(iterator2, name, kind) { + const object = { + index: 0, + kind, + target: iterator2 + }; + const i = { + next() { + if (Object.getPrototypeOf(this) !== i) { + throw new TypeError( + `'next' called on an object that does not implement interface ${name} Iterator.` + ); + } + const { index, kind: kind2, target } = object; + const values = target(); + const len = values.length; + if (index >= len) { + return { value: void 0, done: true }; + } + const pair = values[index]; + object.index = index + 1; + return iteratorResult(pair, kind2); + }, + // The class string of an iterator prototype object for a given interface is the + // result of concatenating the identifier of the interface and the string " Iterator". + [Symbol.toStringTag]: `${name} Iterator` + }; + Object.setPrototypeOf(i, esIteratorPrototype); + return Object.setPrototypeOf({}, i); + } + function iteratorResult(pair, kind) { + let result; + switch (kind) { + case "key": { + result = pair[0]; + break; + } + case "value": { + result = pair[1]; + break; + } + case "key+value": { + result = pair; + break; + } + } + return { value: result, done: false }; + } + async function fullyReadBody(body2, processBody, processBodyError) { + const successSteps = processBody; + const errorSteps = processBodyError; + let reader; + try { + reader = body2.stream.getReader(); + } catch (e) { + errorSteps(e); + return; + } + try { + const result = await readAllBytes(reader); + successSteps(result); + } catch (e) { + errorSteps(e); + } + } + let ReadableStream2 = globalThis.ReadableStream; + function isReadableStreamLike(stream) { + if (!ReadableStream2) { + ReadableStream2 = require$$14.ReadableStream; + } + return stream instanceof ReadableStream2 || stream[Symbol.toStringTag] === "ReadableStream" && typeof stream.tee === "function"; + } + const MAXIMUM_ARGUMENT_LENGTH = 65535; + function isomorphicDecode(input) { + if (input.length < MAXIMUM_ARGUMENT_LENGTH) { + return String.fromCharCode(...input); + } + return input.reduce((previous, current) => previous + String.fromCharCode(current), ""); + } + function readableStreamClose(controller) { + try { + controller.close(); + } catch (err) { + if (!err.message.includes("Controller is already closed")) { + throw err; + } + } + } + function isomorphicEncode(input) { + for (let i = 0; i < input.length; i++) { + assert(input.charCodeAt(i) <= 255); + } + return input; + } + async function readAllBytes(reader) { + const bytes = []; + let byteLength = 0; + while (true) { + const { done, value: chunk } = await reader.read(); + if (done) { + return Buffer.concat(bytes, byteLength); + } + if (!isUint8Array(chunk)) { + throw new TypeError("Received non-Uint8Array chunk"); + } + bytes.push(chunk); + byteLength += chunk.length; + } + } + function urlIsLocal(url) { + assert("protocol" in url); + const protocol = url.protocol; + return protocol === "about:" || protocol === "blob:" || protocol === "data:"; + } + function urlHasHttpsScheme(url) { + if (typeof url === "string") { + return url.startsWith("https:"); + } + return url.protocol === "https:"; + } + function urlIsHttpHttpsScheme(url) { + assert("protocol" in url); + const protocol = url.protocol; + return protocol === "http:" || protocol === "https:"; + } + const hasOwn = Object.hasOwn || ((dict, key) => Object.prototype.hasOwnProperty.call(dict, key)); + util$5 = { + isAborted, + isCancelled, + createDeferredPromise, + ReadableStreamFrom, + toUSVString, + tryUpgradeRequestToAPotentiallyTrustworthyURL, + coarsenedSharedCurrentTime, + determineRequestsReferrer, + makePolicyContainer, + clonePolicyContainer, + appendFetchMetadata, + appendRequestOriginHeader, + TAOCheck, + corsCheck, + crossOriginResourcePolicyCheck, + createOpaqueTimingInfo, + setRequestReferrerPolicyOnRedirect, + isValidHTTPToken, + requestBadPort, + requestCurrentURL, + responseURL, + responseLocationURL, + isBlobLike, + isURLPotentiallyTrustworthy, + isValidReasonPhrase, + sameOrigin, + normalizeMethod, + serializeJavascriptValueToJSONString, + makeIterator, + isValidHeaderName, + isValidHeaderValue, + hasOwn, + isErrorLike, + fullyReadBody, + bytesMatch, + isReadableStreamLike, + readableStreamClose, + isomorphicEncode, + isomorphicDecode, + urlIsLocal, + urlHasHttpsScheme, + urlIsHttpHttpsScheme, + readAllBytes, + normalizeMethodRecord, + parseMetadata + }; + return util$5; +} +var symbols$3; +var hasRequiredSymbols$3; +function requireSymbols$3() { + if (hasRequiredSymbols$3) return symbols$3; + hasRequiredSymbols$3 = 1; + symbols$3 = { + kUrl: /* @__PURE__ */ Symbol("url"), + kHeaders: /* @__PURE__ */ Symbol("headers"), + kSignal: /* @__PURE__ */ Symbol("signal"), + kState: /* @__PURE__ */ Symbol("state"), + kGuard: /* @__PURE__ */ Symbol("guard"), + kRealm: /* @__PURE__ */ Symbol("realm") + }; + return symbols$3; +} +var webidl_1; +var hasRequiredWebidl; +function requireWebidl() { + if (hasRequiredWebidl) return webidl_1; + hasRequiredWebidl = 1; + const { types } = require$$0$2; + const { hasOwn, toUSVString } = requireUtil$5(); + const webidl = {}; + webidl.converters = {}; + webidl.util = {}; + webidl.errors = {}; + webidl.errors.exception = function(message) { + return new TypeError(`${message.header}: ${message.message}`); + }; + webidl.errors.conversionFailed = function(context2) { + const plural = context2.types.length === 1 ? "" : " one of"; + const message = `${context2.argument} could not be converted to${plural}: ${context2.types.join(", ")}.`; + return webidl.errors.exception({ + header: context2.prefix, + message + }); + }; + webidl.errors.invalidArgument = function(context2) { + return webidl.errors.exception({ + header: context2.prefix, + message: `"${context2.value}" is an invalid ${context2.type}.` + }); + }; + webidl.brandCheck = function(V, I, opts = void 0) { + if (opts?.strict !== false && !(V instanceof I)) { + throw new TypeError("Illegal invocation"); + } else { + return V?.[Symbol.toStringTag] === I.prototype[Symbol.toStringTag]; + } + }; + webidl.argumentLengthCheck = function({ length }, min, ctx) { + if (length < min) { + throw webidl.errors.exception({ + message: `${min} argument${min !== 1 ? "s" : ""} required, but${length ? " only" : ""} ${length} found.`, + ...ctx + }); + } + }; + webidl.illegalConstructor = function() { + throw webidl.errors.exception({ + header: "TypeError", + message: "Illegal constructor" + }); + }; + webidl.util.Type = function(V) { + switch (typeof V) { + case "undefined": + return "Undefined"; + case "boolean": + return "Boolean"; + case "string": + return "String"; + case "symbol": + return "Symbol"; + case "number": + return "Number"; + case "bigint": + return "BigInt"; + case "function": + case "object": { + if (V === null) { + return "Null"; + } + return "Object"; + } + } + }; + webidl.util.ConvertToInt = function(V, bitLength, signedness, opts = {}) { + let upperBound; + let lowerBound; + if (bitLength === 64) { + upperBound = Math.pow(2, 53) - 1; + if (signedness === "unsigned") { + lowerBound = 0; + } else { + lowerBound = Math.pow(-2, 53) + 1; + } + } else if (signedness === "unsigned") { + lowerBound = 0; + upperBound = Math.pow(2, bitLength) - 1; + } else { + lowerBound = Math.pow(-2, bitLength) - 1; + upperBound = Math.pow(2, bitLength - 1) - 1; + } + let x = Number(V); + if (x === 0) { + x = 0; + } + if (opts.enforceRange === true) { + if (Number.isNaN(x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { + throw webidl.errors.exception({ + header: "Integer conversion", + message: `Could not convert ${V} to an integer.` + }); + } + x = webidl.util.IntegerPart(x); + if (x < lowerBound || x > upperBound) { + throw webidl.errors.exception({ + header: "Integer conversion", + message: `Value must be between ${lowerBound}-${upperBound}, got ${x}.` + }); + } + return x; + } + if (!Number.isNaN(x) && opts.clamp === true) { + x = Math.min(Math.max(x, lowerBound), upperBound); + if (Math.floor(x) % 2 === 0) { + x = Math.floor(x); + } else { + x = Math.ceil(x); + } + return x; + } + if (Number.isNaN(x) || x === 0 && Object.is(0, x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { + return 0; + } + x = webidl.util.IntegerPart(x); + x = x % Math.pow(2, bitLength); + if (signedness === "signed" && x >= Math.pow(2, bitLength) - 1) { + return x - Math.pow(2, bitLength); + } + return x; + }; + webidl.util.IntegerPart = function(n) { + const r = Math.floor(Math.abs(n)); + if (n < 0) { + return -1 * r; + } + return r; + }; + webidl.sequenceConverter = function(converter) { + return (V) => { + if (webidl.util.Type(V) !== "Object") { + throw webidl.errors.exception({ + header: "Sequence", + message: `Value of type ${webidl.util.Type(V)} is not an Object.` + }); + } + const method = V?.[Symbol.iterator]?.(); + const seq = []; + if (method === void 0 || typeof method.next !== "function") { + throw webidl.errors.exception({ + header: "Sequence", + message: "Object is not an iterator." + }); + } + while (true) { + const { done, value } = method.next(); + if (done) { + break; + } + seq.push(converter(value)); + } + return seq; + }; + }; + webidl.recordConverter = function(keyConverter, valueConverter) { + return (O) => { + if (webidl.util.Type(O) !== "Object") { + throw webidl.errors.exception({ + header: "Record", + message: `Value of type ${webidl.util.Type(O)} is not an Object.` + }); + } + const result = {}; + if (!types.isProxy(O)) { + const keys2 = Object.keys(O); + for (const key of keys2) { + const typedKey = keyConverter(key); + const typedValue = valueConverter(O[key]); + result[typedKey] = typedValue; + } + return result; + } + const keys = Reflect.ownKeys(O); + for (const key of keys) { + const desc = Reflect.getOwnPropertyDescriptor(O, key); + if (desc?.enumerable) { + const typedKey = keyConverter(key); + const typedValue = valueConverter(O[key]); + result[typedKey] = typedValue; + } + } + return result; + }; + }; + webidl.interfaceConverter = function(i) { + return (V, opts = {}) => { + if (opts.strict !== false && !(V instanceof i)) { + throw webidl.errors.exception({ + header: i.name, + message: `Expected ${V} to be an instance of ${i.name}.` + }); + } + return V; + }; + }; + webidl.dictionaryConverter = function(converters) { + return (dictionary) => { + const type = webidl.util.Type(dictionary); + const dict = {}; + if (type === "Null" || type === "Undefined") { + return dict; + } else if (type !== "Object") { + throw webidl.errors.exception({ + header: "Dictionary", + message: `Expected ${dictionary} to be one of: Null, Undefined, Object.` + }); + } + for (const options of converters) { + const { key, defaultValue, required, converter } = options; + if (required === true) { + if (!hasOwn(dictionary, key)) { + throw webidl.errors.exception({ + header: "Dictionary", + message: `Missing required key "${key}".` + }); + } + } + let value = dictionary[key]; + const hasDefault = hasOwn(options, "defaultValue"); + if (hasDefault && value !== null) { + value = value ?? defaultValue; + } + if (required || hasDefault || value !== void 0) { + value = converter(value); + if (options.allowedValues && !options.allowedValues.includes(value)) { + throw webidl.errors.exception({ + header: "Dictionary", + message: `${value} is not an accepted type. Expected one of ${options.allowedValues.join(", ")}.` + }); + } + dict[key] = value; + } + } + return dict; + }; + }; + webidl.nullableConverter = function(converter) { + return (V) => { + if (V === null) { + return V; + } + return converter(V); + }; + }; + webidl.converters.DOMString = function(V, opts = {}) { + if (V === null && opts.legacyNullToEmptyString) { + return ""; + } + if (typeof V === "symbol") { + throw new TypeError("Could not convert argument of type symbol to string."); + } + return String(V); + }; + webidl.converters.ByteString = function(V) { + const x = webidl.converters.DOMString(V); + for (let index = 0; index < x.length; index++) { + if (x.charCodeAt(index) > 255) { + throw new TypeError( + `Cannot convert argument to a ByteString because the character at index ${index} has a value of ${x.charCodeAt(index)} which is greater than 255.` + ); + } + } + return x; + }; + webidl.converters.USVString = toUSVString; + webidl.converters.boolean = function(V) { + const x = Boolean(V); + return x; + }; + webidl.converters.any = function(V) { + return V; + }; + webidl.converters["long long"] = function(V) { + const x = webidl.util.ConvertToInt(V, 64, "signed"); + return x; + }; + webidl.converters["unsigned long long"] = function(V) { + const x = webidl.util.ConvertToInt(V, 64, "unsigned"); + return x; + }; + webidl.converters["unsigned long"] = function(V) { + const x = webidl.util.ConvertToInt(V, 32, "unsigned"); + return x; + }; + webidl.converters["unsigned short"] = function(V, opts) { + const x = webidl.util.ConvertToInt(V, 16, "unsigned", opts); + return x; + }; + webidl.converters.ArrayBuffer = function(V, opts = {}) { + if (webidl.util.Type(V) !== "Object" || !types.isAnyArrayBuffer(V)) { + throw webidl.errors.conversionFailed({ + prefix: `${V}`, + argument: `${V}`, + types: ["ArrayBuffer"] + }); + } + if (opts.allowShared === false && types.isSharedArrayBuffer(V)) { + throw webidl.errors.exception({ + header: "ArrayBuffer", + message: "SharedArrayBuffer is not allowed." + }); + } + return V; + }; + webidl.converters.TypedArray = function(V, T, opts = {}) { + if (webidl.util.Type(V) !== "Object" || !types.isTypedArray(V) || V.constructor.name !== T.name) { + throw webidl.errors.conversionFailed({ + prefix: `${T.name}`, + argument: `${V}`, + types: [T.name] + }); + } + if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { + throw webidl.errors.exception({ + header: "ArrayBuffer", + message: "SharedArrayBuffer is not allowed." + }); + } + return V; + }; + webidl.converters.DataView = function(V, opts = {}) { + if (webidl.util.Type(V) !== "Object" || !types.isDataView(V)) { + throw webidl.errors.exception({ + header: "DataView", + message: "Object is not a DataView." + }); + } + if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { + throw webidl.errors.exception({ + header: "ArrayBuffer", + message: "SharedArrayBuffer is not allowed." + }); + } + return V; + }; + webidl.converters.BufferSource = function(V, opts = {}) { + if (types.isAnyArrayBuffer(V)) { + return webidl.converters.ArrayBuffer(V, opts); + } + if (types.isTypedArray(V)) { + return webidl.converters.TypedArray(V, V.constructor); + } + if (types.isDataView(V)) { + return webidl.converters.DataView(V, opts); + } + throw new TypeError(`Could not convert ${V} to a BufferSource.`); + }; + webidl.converters["sequence"] = webidl.sequenceConverter( + webidl.converters.ByteString + ); + webidl.converters["sequence>"] = webidl.sequenceConverter( + webidl.converters["sequence"] + ); + webidl.converters["record"] = webidl.recordConverter( + webidl.converters.ByteString, + webidl.converters.ByteString + ); + webidl_1 = { + webidl + }; + return webidl_1; +} +var dataURL; +var hasRequiredDataURL; +function requireDataURL() { + if (hasRequiredDataURL) return dataURL; + hasRequiredDataURL = 1; + const assert = require$$0$9; + const { atob: atob2 } = require$$7$1; + const { isomorphicDecode } = requireUtil$5(); + const encoder = new TextEncoder(); + const HTTP_TOKEN_CODEPOINTS = /^[!#$%&'*+-.^_|~A-Za-z0-9]+$/; + const HTTP_WHITESPACE_REGEX = /(\u000A|\u000D|\u0009|\u0020)/; + const HTTP_QUOTED_STRING_TOKENS = /[\u0009|\u0020-\u007E|\u0080-\u00FF]/; + function dataURLProcessor(dataURL2) { + assert(dataURL2.protocol === "data:"); + let input = URLSerializer(dataURL2, true); + input = input.slice(5); + const position = { position: 0 }; + let mimeType = collectASequenceOfCodePointsFast( + ",", + input, + position + ); + const mimeTypeLength = mimeType.length; + mimeType = removeASCIIWhitespace(mimeType, true, true); + if (position.position >= input.length) { + return "failure"; + } + position.position++; + const encodedBody = input.slice(mimeTypeLength + 1); + let body2 = stringPercentDecode(encodedBody); + if (/;(\u0020){0,}base64$/i.test(mimeType)) { + const stringBody = isomorphicDecode(body2); + body2 = forgivingBase64(stringBody); + if (body2 === "failure") { + return "failure"; + } + mimeType = mimeType.slice(0, -6); + mimeType = mimeType.replace(/(\u0020)+$/, ""); + mimeType = mimeType.slice(0, -1); + } + if (mimeType.startsWith(";")) { + mimeType = "text/plain" + mimeType; + } + let mimeTypeRecord = parseMIMEType(mimeType); + if (mimeTypeRecord === "failure") { + mimeTypeRecord = parseMIMEType("text/plain;charset=US-ASCII"); + } + return { mimeType: mimeTypeRecord, body: body2 }; + } + function URLSerializer(url, excludeFragment = false) { + if (!excludeFragment) { + return url.href; + } + const href = url.href; + const hashLength = url.hash.length; + return hashLength === 0 ? href : href.substring(0, href.length - hashLength); + } + function collectASequenceOfCodePoints(condition, input, position) { + let result = ""; + while (position.position < input.length && condition(input[position.position])) { + result += input[position.position]; + position.position++; + } + return result; + } + function collectASequenceOfCodePointsFast(char, input, position) { + const idx = input.indexOf(char, position.position); + const start = position.position; + if (idx === -1) { + position.position = input.length; + return input.slice(start); + } + position.position = idx; + return input.slice(start, position.position); + } + function stringPercentDecode(input) { + const bytes = encoder.encode(input); + return percentDecode(bytes); + } + function percentDecode(input) { + const output = []; + for (let i = 0; i < input.length; i++) { + const byte = input[i]; + if (byte !== 37) { + output.push(byte); + } else if (byte === 37 && !/^[0-9A-Fa-f]{2}$/i.test(String.fromCharCode(input[i + 1], input[i + 2]))) { + output.push(37); + } else { + const nextTwoBytes = String.fromCharCode(input[i + 1], input[i + 2]); + const bytePoint = Number.parseInt(nextTwoBytes, 16); + output.push(bytePoint); + i += 2; + } + } + return Uint8Array.from(output); + } + function parseMIMEType(input) { + input = removeHTTPWhitespace(input, true, true); + const position = { position: 0 }; + const type = collectASequenceOfCodePointsFast( + "/", + input, + position + ); + if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) { + return "failure"; + } + if (position.position > input.length) { + return "failure"; + } + position.position++; + let subtype = collectASequenceOfCodePointsFast( + ";", + input, + position + ); + subtype = removeHTTPWhitespace(subtype, false, true); + if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) { + return "failure"; + } + const typeLowercase = type.toLowerCase(); + const subtypeLowercase = subtype.toLowerCase(); + const mimeType = { + type: typeLowercase, + subtype: subtypeLowercase, + /** @type {Map} */ + parameters: /* @__PURE__ */ new Map(), + // https://mimesniff.spec.whatwg.org/#mime-type-essence + essence: `${typeLowercase}/${subtypeLowercase}` + }; + while (position.position < input.length) { + position.position++; + collectASequenceOfCodePoints( + // https://fetch.spec.whatwg.org/#http-whitespace + (char) => HTTP_WHITESPACE_REGEX.test(char), + input, + position + ); + let parameterName = collectASequenceOfCodePoints( + (char) => char !== ";" && char !== "=", + input, + position + ); + parameterName = parameterName.toLowerCase(); + if (position.position < input.length) { + if (input[position.position] === ";") { + continue; + } + position.position++; + } + if (position.position > input.length) { + break; + } + let parameterValue = null; + if (input[position.position] === '"') { + parameterValue = collectAnHTTPQuotedString(input, position, true); + collectASequenceOfCodePointsFast( + ";", + input, + position + ); + } else { + parameterValue = collectASequenceOfCodePointsFast( + ";", + input, + position + ); + parameterValue = removeHTTPWhitespace(parameterValue, false, true); + if (parameterValue.length === 0) { + continue; + } + } + if (parameterName.length !== 0 && HTTP_TOKEN_CODEPOINTS.test(parameterName) && (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) && !mimeType.parameters.has(parameterName)) { + mimeType.parameters.set(parameterName, parameterValue); + } + } + return mimeType; + } + function forgivingBase64(data) { + data = data.replace(/[\u0009\u000A\u000C\u000D\u0020]/g, ""); + if (data.length % 4 === 0) { + data = data.replace(/=?=$/, ""); + } + if (data.length % 4 === 1) { + return "failure"; + } + if (/[^+/0-9A-Za-z]/.test(data)) { + return "failure"; + } + const binary = atob2(data); + const bytes = new Uint8Array(binary.length); + for (let byte = 0; byte < binary.length; byte++) { + bytes[byte] = binary.charCodeAt(byte); + } + return bytes; + } + function collectAnHTTPQuotedString(input, position, extractValue) { + const positionStart = position.position; + let value = ""; + assert(input[position.position] === '"'); + position.position++; + while (true) { + value += collectASequenceOfCodePoints( + (char) => char !== '"' && char !== "\\", + input, + position + ); + if (position.position >= input.length) { + break; + } + const quoteOrBackslash = input[position.position]; + position.position++; + if (quoteOrBackslash === "\\") { + if (position.position >= input.length) { + value += "\\"; + break; + } + value += input[position.position]; + position.position++; + } else { + assert(quoteOrBackslash === '"'); + break; + } + } + if (extractValue) { + return value; + } + return input.slice(positionStart, position.position); + } + function serializeAMimeType(mimeType) { + assert(mimeType !== "failure"); + const { parameters, essence } = mimeType; + let serialization = essence; + for (let [name, value] of parameters.entries()) { + serialization += ";"; + serialization += name; + serialization += "="; + if (!HTTP_TOKEN_CODEPOINTS.test(value)) { + value = value.replace(/(\\|")/g, "\\$1"); + value = '"' + value; + value += '"'; + } + serialization += value; + } + return serialization; + } + function isHTTPWhiteSpace(char) { + return char === "\r" || char === "\n" || char === " " || char === " "; + } + function removeHTTPWhitespace(str, leading = true, trailing = true) { + let lead = 0; + let trail = str.length - 1; + if (leading) { + for (; lead < str.length && isHTTPWhiteSpace(str[lead]); lead++) ; + } + if (trailing) { + for (; trail > 0 && isHTTPWhiteSpace(str[trail]); trail--) ; + } + return str.slice(lead, trail + 1); + } + function isASCIIWhitespace(char) { + return char === "\r" || char === "\n" || char === " " || char === "\f" || char === " "; + } + function removeASCIIWhitespace(str, leading = true, trailing = true) { + let lead = 0; + let trail = str.length - 1; + if (leading) { + for (; lead < str.length && isASCIIWhitespace(str[lead]); lead++) ; + } + if (trailing) { + for (; trail > 0 && isASCIIWhitespace(str[trail]); trail--) ; + } + return str.slice(lead, trail + 1); + } + dataURL = { + dataURLProcessor, + URLSerializer, + collectASequenceOfCodePoints, + collectASequenceOfCodePointsFast, + stringPercentDecode, + parseMIMEType, + collectAnHTTPQuotedString, + serializeAMimeType + }; + return dataURL; +} +var file; +var hasRequiredFile; +function requireFile() { + if (hasRequiredFile) return file; + hasRequiredFile = 1; + const { Blob: Blob2, File: NativeFile } = require$$7$1; + const { types } = require$$0$2; + const { kState } = requireSymbols$3(); + const { isBlobLike } = requireUtil$5(); + const { webidl } = requireWebidl(); + const { parseMIMEType, serializeAMimeType } = requireDataURL(); + const { kEnumerableProperty } = requireUtil$6(); + const encoder = new TextEncoder(); + class File extends Blob2 { + constructor(fileBits, fileName, options = {}) { + webidl.argumentLengthCheck(arguments, 2, { header: "File constructor" }); + fileBits = webidl.converters["sequence"](fileBits); + fileName = webidl.converters.USVString(fileName); + options = webidl.converters.FilePropertyBag(options); + const n = fileName; + let t = options.type; + let d; + substep: { + if (t) { + t = parseMIMEType(t); + if (t === "failure") { + t = ""; + break substep; + } + t = serializeAMimeType(t).toLowerCase(); + } + d = options.lastModified; + } + super(processBlobParts(fileBits, options), { type: t }); + this[kState] = { + name: n, + lastModified: d, + type: t + }; + } + get name() { + webidl.brandCheck(this, File); + return this[kState].name; + } + get lastModified() { + webidl.brandCheck(this, File); + return this[kState].lastModified; + } + get type() { + webidl.brandCheck(this, File); + return this[kState].type; + } + } + class FileLike { + constructor(blobLike, fileName, options = {}) { + const n = fileName; + const t = options.type; + const d = options.lastModified ?? Date.now(); + this[kState] = { + blobLike, + name: n, + type: t, + lastModified: d + }; + } + stream(...args) { + webidl.brandCheck(this, FileLike); + return this[kState].blobLike.stream(...args); + } + arrayBuffer(...args) { + webidl.brandCheck(this, FileLike); + return this[kState].blobLike.arrayBuffer(...args); + } + slice(...args) { + webidl.brandCheck(this, FileLike); + return this[kState].blobLike.slice(...args); + } + text(...args) { + webidl.brandCheck(this, FileLike); + return this[kState].blobLike.text(...args); + } + get size() { + webidl.brandCheck(this, FileLike); + return this[kState].blobLike.size; + } + get type() { + webidl.brandCheck(this, FileLike); + return this[kState].blobLike.type; + } + get name() { + webidl.brandCheck(this, FileLike); + return this[kState].name; + } + get lastModified() { + webidl.brandCheck(this, FileLike); + return this[kState].lastModified; + } + get [Symbol.toStringTag]() { + return "File"; + } + } + Object.defineProperties(File.prototype, { + [Symbol.toStringTag]: { + value: "File", + configurable: true + }, + name: kEnumerableProperty, + lastModified: kEnumerableProperty + }); + webidl.converters.Blob = webidl.interfaceConverter(Blob2); + webidl.converters.BlobPart = function(V, opts) { + if (webidl.util.Type(V) === "Object") { + if (isBlobLike(V)) { + return webidl.converters.Blob(V, { strict: false }); + } + if (ArrayBuffer.isView(V) || types.isAnyArrayBuffer(V)) { + return webidl.converters.BufferSource(V, opts); + } + } + return webidl.converters.USVString(V, opts); + }; + webidl.converters["sequence"] = webidl.sequenceConverter( + webidl.converters.BlobPart + ); + webidl.converters.FilePropertyBag = webidl.dictionaryConverter([ + { + key: "lastModified", + converter: webidl.converters["long long"], + get defaultValue() { + return Date.now(); + } + }, + { + key: "type", + converter: webidl.converters.DOMString, + defaultValue: "" + }, + { + key: "endings", + converter: (value) => { + value = webidl.converters.DOMString(value); + value = value.toLowerCase(); + if (value !== "native") { + value = "transparent"; + } + return value; + }, + defaultValue: "transparent" + } + ]); + function processBlobParts(parts, options) { + const bytes = []; + for (const element of parts) { + if (typeof element === "string") { + let s = element; + if (options.endings === "native") { + s = convertLineEndingsNative(s); + } + bytes.push(encoder.encode(s)); + } else if (types.isAnyArrayBuffer(element) || types.isTypedArray(element)) { + if (!element.buffer) { + bytes.push(new Uint8Array(element)); + } else { + bytes.push( + new Uint8Array(element.buffer, element.byteOffset, element.byteLength) + ); + } + } else if (isBlobLike(element)) { + bytes.push(element); + } + } + return bytes; + } + function convertLineEndingsNative(s) { + let nativeLineEnding = "\n"; + if (process.platform === "win32") { + nativeLineEnding = "\r\n"; + } + return s.replace(/\r?\n/g, nativeLineEnding); + } + function isFileLike(object) { + return NativeFile && object instanceof NativeFile || object instanceof File || object && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && object[Symbol.toStringTag] === "File"; + } + file = { File, FileLike, isFileLike }; + return file; +} +var formdata; +var hasRequiredFormdata; +function requireFormdata() { + if (hasRequiredFormdata) return formdata; + hasRequiredFormdata = 1; + const { isBlobLike, toUSVString, makeIterator } = requireUtil$5(); + const { kState } = requireSymbols$3(); + const { File: UndiciFile, FileLike, isFileLike } = requireFile(); + const { webidl } = requireWebidl(); + const { Blob: Blob2, File: NativeFile } = require$$7$1; + const File = NativeFile ?? UndiciFile; + class FormData { + constructor(form) { + if (form !== void 0) { + throw webidl.errors.conversionFailed({ + prefix: "FormData constructor", + argument: "Argument 1", + types: ["undefined"] + }); + } + this[kState] = []; + } + append(name, value, filename = void 0) { + webidl.brandCheck(this, FormData); + webidl.argumentLengthCheck(arguments, 2, { header: "FormData.append" }); + if (arguments.length === 3 && !isBlobLike(value)) { + throw new TypeError( + "Failed to execute 'append' on 'FormData': parameter 2 is not of type 'Blob'" + ); + } + name = webidl.converters.USVString(name); + value = isBlobLike(value) ? webidl.converters.Blob(value, { strict: false }) : webidl.converters.USVString(value); + filename = arguments.length === 3 ? webidl.converters.USVString(filename) : void 0; + const entry = makeEntry(name, value, filename); + this[kState].push(entry); + } + delete(name) { + webidl.brandCheck(this, FormData); + webidl.argumentLengthCheck(arguments, 1, { header: "FormData.delete" }); + name = webidl.converters.USVString(name); + this[kState] = this[kState].filter((entry) => entry.name !== name); + } + get(name) { + webidl.brandCheck(this, FormData); + webidl.argumentLengthCheck(arguments, 1, { header: "FormData.get" }); + name = webidl.converters.USVString(name); + const idx = this[kState].findIndex((entry) => entry.name === name); + if (idx === -1) { + return null; + } + return this[kState][idx].value; + } + getAll(name) { + webidl.brandCheck(this, FormData); + webidl.argumentLengthCheck(arguments, 1, { header: "FormData.getAll" }); + name = webidl.converters.USVString(name); + return this[kState].filter((entry) => entry.name === name).map((entry) => entry.value); + } + has(name) { + webidl.brandCheck(this, FormData); + webidl.argumentLengthCheck(arguments, 1, { header: "FormData.has" }); + name = webidl.converters.USVString(name); + return this[kState].findIndex((entry) => entry.name === name) !== -1; + } + set(name, value, filename = void 0) { + webidl.brandCheck(this, FormData); + webidl.argumentLengthCheck(arguments, 2, { header: "FormData.set" }); + if (arguments.length === 3 && !isBlobLike(value)) { + throw new TypeError( + "Failed to execute 'set' on 'FormData': parameter 2 is not of type 'Blob'" + ); + } + name = webidl.converters.USVString(name); + value = isBlobLike(value) ? webidl.converters.Blob(value, { strict: false }) : webidl.converters.USVString(value); + filename = arguments.length === 3 ? toUSVString(filename) : void 0; + const entry = makeEntry(name, value, filename); + const idx = this[kState].findIndex((entry2) => entry2.name === name); + if (idx !== -1) { + this[kState] = [ + ...this[kState].slice(0, idx), + entry, + ...this[kState].slice(idx + 1).filter((entry2) => entry2.name !== name) + ]; + } else { + this[kState].push(entry); + } + } + entries() { + webidl.brandCheck(this, FormData); + return makeIterator( + () => this[kState].map((pair) => [pair.name, pair.value]), + "FormData", + "key+value" + ); + } + keys() { + webidl.brandCheck(this, FormData); + return makeIterator( + () => this[kState].map((pair) => [pair.name, pair.value]), + "FormData", + "key" + ); + } + values() { + webidl.brandCheck(this, FormData); + return makeIterator( + () => this[kState].map((pair) => [pair.name, pair.value]), + "FormData", + "value" + ); + } + /** + * @param {(value: string, key: string, self: FormData) => void} callbackFn + * @param {unknown} thisArg + */ + forEach(callbackFn, thisArg = globalThis) { + webidl.brandCheck(this, FormData); + webidl.argumentLengthCheck(arguments, 1, { header: "FormData.forEach" }); + if (typeof callbackFn !== "function") { + throw new TypeError( + "Failed to execute 'forEach' on 'FormData': parameter 1 is not of type 'Function'." + ); + } + for (const [key, value] of this) { + callbackFn.apply(thisArg, [value, key, this]); + } + } + } + FormData.prototype[Symbol.iterator] = FormData.prototype.entries; + Object.defineProperties(FormData.prototype, { + [Symbol.toStringTag]: { + value: "FormData", + configurable: true + } + }); + function makeEntry(name, value, filename) { + name = Buffer.from(name).toString("utf8"); + if (typeof value === "string") { + value = Buffer.from(value).toString("utf8"); + } else { + if (!isFileLike(value)) { + value = value instanceof Blob2 ? new File([value], "blob", { type: value.type }) : new FileLike(value, "blob", { type: value.type }); + } + if (filename !== void 0) { + const options = { + type: value.type, + lastModified: value.lastModified + }; + value = NativeFile && value instanceof NativeFile || value instanceof UndiciFile ? new File([value], filename, options) : new FileLike(value, filename, options); + } + } + return { name, value }; + } + formdata = { FormData }; + return formdata; +} +var body; +var hasRequiredBody; +function requireBody() { + if (hasRequiredBody) return body; + hasRequiredBody = 1; + const Busboy = requireMain(); + const util2 = requireUtil$6(); + const { + ReadableStreamFrom, + isBlobLike, + isReadableStreamLike, + readableStreamClose, + createDeferredPromise, + fullyReadBody + } = requireUtil$5(); + const { FormData } = requireFormdata(); + const { kState } = requireSymbols$3(); + const { webidl } = requireWebidl(); + const { DOMException: DOMException2, structuredClone } = requireConstants$3(); + const { Blob: Blob2, File: NativeFile } = require$$7$1; + const { kBodyUsed } = requireSymbols$4(); + const assert = require$$0$9; + const { isErrored } = requireUtil$6(); + const { isUint8Array, isArrayBuffer } = require$$5$4; + const { File: UndiciFile } = requireFile(); + const { parseMIMEType, serializeAMimeType } = requireDataURL(); + let random; + try { + const crypto = require("node:crypto"); + random = (max) => crypto.randomInt(0, max); + } catch { + random = (max) => Math.floor(Math.random(max)); + } + let ReadableStream2 = globalThis.ReadableStream; + const File = NativeFile ?? UndiciFile; + const textEncoder = new TextEncoder(); + const textDecoder = new TextDecoder(); + function extractBody(object, keepalive = false) { + if (!ReadableStream2) { + ReadableStream2 = require$$14.ReadableStream; + } + let stream = null; + if (object instanceof ReadableStream2) { + stream = object; + } else if (isBlobLike(object)) { + stream = object.stream(); + } else { + stream = new ReadableStream2({ + async pull(controller) { + controller.enqueue( + typeof source === "string" ? textEncoder.encode(source) : source + ); + queueMicrotask(() => readableStreamClose(controller)); + }, + start() { + }, + type: void 0 + }); + } + assert(isReadableStreamLike(stream)); + let action = null; + let source = null; + let length = null; + let type = null; + if (typeof object === "string") { + source = object; + type = "text/plain;charset=UTF-8"; + } else if (object instanceof URLSearchParams) { + source = object.toString(); + type = "application/x-www-form-urlencoded;charset=UTF-8"; + } else if (isArrayBuffer(object)) { + source = new Uint8Array(object.slice()); + } else if (ArrayBuffer.isView(object)) { + source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength)); + } else if (util2.isFormDataLike(object)) { + const boundary = `----formdata-undici-0${`${random(1e11)}`.padStart(11, "0")}`; + const prefix = `--${boundary}\r +Content-Disposition: form-data`; + const escape = (str) => str.replace(/\n/g, "%0A").replace(/\r/g, "%0D").replace(/"/g, "%22"); + const normalizeLinefeeds = (value) => value.replace(/\r?\n|\r/g, "\r\n"); + const blobParts = []; + const rn = new Uint8Array([13, 10]); + length = 0; + let hasUnknownSizeValue = false; + for (const [name, value] of object) { + if (typeof value === "string") { + const chunk2 = textEncoder.encode(prefix + `; name="${escape(normalizeLinefeeds(name))}"\r +\r +${normalizeLinefeeds(value)}\r +`); + blobParts.push(chunk2); + length += chunk2.byteLength; + } else { + const chunk2 = textEncoder.encode(`${prefix}; name="${escape(normalizeLinefeeds(name))}"` + (value.name ? `; filename="${escape(value.name)}"` : "") + `\r +Content-Type: ${value.type || "application/octet-stream"}\r +\r +`); + blobParts.push(chunk2, value, rn); + if (typeof value.size === "number") { + length += chunk2.byteLength + value.size + rn.byteLength; + } else { + hasUnknownSizeValue = true; + } + } + } + const chunk = textEncoder.encode(`--${boundary}--`); + blobParts.push(chunk); + length += chunk.byteLength; + if (hasUnknownSizeValue) { + length = null; + } + source = object; + action = async function* () { + for (const part of blobParts) { + if (part.stream) { + yield* part.stream(); + } else { + yield part; + } + } + }; + type = "multipart/form-data; boundary=" + boundary; + } else if (isBlobLike(object)) { + source = object; + length = object.size; + if (object.type) { + type = object.type; + } + } else if (typeof object[Symbol.asyncIterator] === "function") { + if (keepalive) { + throw new TypeError("keepalive"); + } + if (util2.isDisturbed(object) || object.locked) { + throw new TypeError( + "Response body object should not be disturbed or locked" + ); + } + stream = object instanceof ReadableStream2 ? object : ReadableStreamFrom(object); + } + if (typeof source === "string" || util2.isBuffer(source)) { + length = Buffer.byteLength(source); + } + if (action != null) { + let iterator2; + stream = new ReadableStream2({ + async start() { + iterator2 = action(object)[Symbol.asyncIterator](); + }, + async pull(controller) { + const { value, done } = await iterator2.next(); + if (done) { + queueMicrotask(() => { + controller.close(); + }); + } else { + if (!isErrored(stream)) { + controller.enqueue(new Uint8Array(value)); + } + } + return controller.desiredSize > 0; + }, + async cancel(reason) { + await iterator2.return(); + }, + type: void 0 + }); + } + const body2 = { stream, source, length }; + return [body2, type]; + } + function safelyExtractBody(object, keepalive = false) { + if (!ReadableStream2) { + ReadableStream2 = require$$14.ReadableStream; + } + if (object instanceof ReadableStream2) { + assert(!util2.isDisturbed(object), "The body has already been consumed."); + assert(!object.locked, "The stream is locked."); + } + return extractBody(object, keepalive); + } + function cloneBody(body2) { + const [out1, out2] = body2.stream.tee(); + const out2Clone = structuredClone(out2, { transfer: [out2] }); + const [, finalClone] = out2Clone.tee(); + body2.stream = out1; + return { + stream: finalClone, + length: body2.length, + source: body2.source + }; + } + async function* consumeBody(body2) { + if (body2) { + if (isUint8Array(body2)) { + yield body2; + } else { + const stream = body2.stream; + if (util2.isDisturbed(stream)) { + throw new TypeError("The body has already been consumed."); + } + if (stream.locked) { + throw new TypeError("The stream is locked."); + } + stream[kBodyUsed] = true; + yield* stream; + } + } + } + function throwIfAborted(state) { + if (state.aborted) { + throw new DOMException2("The operation was aborted.", "AbortError"); + } + } + function bodyMixinMethods(instance) { + const methods = { + blob() { + return specConsumeBody(this, (bytes) => { + let mimeType = bodyMimeType(this); + if (mimeType === "failure") { + mimeType = ""; + } else if (mimeType) { + mimeType = serializeAMimeType(mimeType); + } + return new Blob2([bytes], { type: mimeType }); + }, instance); + }, + arrayBuffer() { + return specConsumeBody(this, (bytes) => { + return new Uint8Array(bytes).buffer; + }, instance); + }, + text() { + return specConsumeBody(this, utf8DecodeBytes, instance); + }, + json() { + return specConsumeBody(this, parseJSONFromBytes, instance); + }, + async formData() { + webidl.brandCheck(this, instance); + throwIfAborted(this[kState]); + const contentType = this.headers.get("Content-Type"); + if (/multipart\/form-data/.test(contentType)) { + const headers2 = {}; + for (const [key, value] of this.headers) headers2[key.toLowerCase()] = value; + const responseFormData = new FormData(); + let busboy; + try { + busboy = new Busboy({ + headers: headers2, + preservePath: true + }); + } catch (err) { + throw new DOMException2(`${err}`, "AbortError"); + } + busboy.on("field", (name, value) => { + responseFormData.append(name, value); + }); + busboy.on("file", (name, value, filename, encoding2, mimeType) => { + const chunks = []; + if (encoding2 === "base64" || encoding2.toLowerCase() === "base64") { + let base64chunk = ""; + value.on("data", (chunk) => { + base64chunk += chunk.toString().replace(/[\r\n]/gm, ""); + const end = base64chunk.length - base64chunk.length % 4; + chunks.push(Buffer.from(base64chunk.slice(0, end), "base64")); + base64chunk = base64chunk.slice(end); + }); + value.on("end", () => { + chunks.push(Buffer.from(base64chunk, "base64")); + responseFormData.append(name, new File(chunks, filename, { type: mimeType })); + }); + } else { + value.on("data", (chunk) => { + chunks.push(chunk); + }); + value.on("end", () => { + responseFormData.append(name, new File(chunks, filename, { type: mimeType })); + }); + } + }); + const busboyResolve = new Promise((resolve, reject) => { + busboy.on("finish", resolve); + busboy.on("error", (err) => reject(new TypeError(err))); + }); + if (this.body !== null) for await (const chunk of consumeBody(this[kState].body)) busboy.write(chunk); + busboy.end(); + await busboyResolve; + return responseFormData; + } else if (/application\/x-www-form-urlencoded/.test(contentType)) { + let entries; + try { + let text = ""; + const streamingDecoder = new TextDecoder("utf-8", { ignoreBOM: true }); + for await (const chunk of consumeBody(this[kState].body)) { + if (!isUint8Array(chunk)) { + throw new TypeError("Expected Uint8Array chunk"); + } + text += streamingDecoder.decode(chunk, { stream: true }); + } + text += streamingDecoder.decode(); + entries = new URLSearchParams(text); + } catch (err) { + throw Object.assign(new TypeError(), { cause: err }); + } + const formData = new FormData(); + for (const [name, value] of entries) { + formData.append(name, value); + } + return formData; + } else { + await Promise.resolve(); + throwIfAborted(this[kState]); + throw webidl.errors.exception({ + header: `${instance.name}.formData`, + message: "Could not parse content as FormData." + }); + } + } + }; + return methods; + } + function mixinBody(prototype) { + Object.assign(prototype.prototype, bodyMixinMethods(prototype)); + } + async function specConsumeBody(object, convertBytesToJSValue, instance) { + webidl.brandCheck(object, instance); + throwIfAborted(object[kState]); + if (bodyUnusable(object[kState].body)) { + throw new TypeError("Body is unusable"); + } + const promise = createDeferredPromise(); + const errorSteps = (error) => promise.reject(error); + const successSteps = (data) => { + try { + promise.resolve(convertBytesToJSValue(data)); + } catch (e) { + errorSteps(e); + } + }; + if (object[kState].body == null) { + successSteps(new Uint8Array()); + return promise.promise; + } + await fullyReadBody(object[kState].body, successSteps, errorSteps); + return promise.promise; + } + function bodyUnusable(body2) { + return body2 != null && (body2.stream.locked || util2.isDisturbed(body2.stream)); + } + function utf8DecodeBytes(buffer) { + if (buffer.length === 0) { + return ""; + } + if (buffer[0] === 239 && buffer[1] === 187 && buffer[2] === 191) { + buffer = buffer.subarray(3); + } + const output = textDecoder.decode(buffer); + return output; + } + function parseJSONFromBytes(bytes) { + return JSON.parse(utf8DecodeBytes(bytes)); + } + function bodyMimeType(object) { + const { headersList } = object[kState]; + const contentType = headersList.get("content-type"); + if (contentType === null) { + return "failure"; + } + return parseMIMEType(contentType); + } + body = { + extractBody, + safelyExtractBody, + cloneBody, + mixinBody + }; + return body; +} +var request$2; +var hasRequiredRequest$1; +function requireRequest$1() { + if (hasRequiredRequest$1) return request$2; + hasRequiredRequest$1 = 1; + const { + InvalidArgumentError, + NotSupportedError + } = requireErrors(); + const assert = require$$0$9; + const { kHTTP2BuildRequest, kHTTP2CopyHeaders, kHTTP1BuildRequest } = requireSymbols$4(); + const util2 = requireUtil$6(); + const tokenRegExp = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/; + const headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/; + const invalidPathRegex = /[^\u0021-\u00ff]/; + const kHandler = /* @__PURE__ */ Symbol("handler"); + const channels = {}; + let extractBody; + try { + const diagnosticsChannel = require("diagnostics_channel"); + channels.create = diagnosticsChannel.channel("undici:request:create"); + channels.bodySent = diagnosticsChannel.channel("undici:request:bodySent"); + channels.headers = diagnosticsChannel.channel("undici:request:headers"); + channels.trailers = diagnosticsChannel.channel("undici:request:trailers"); + channels.error = diagnosticsChannel.channel("undici:request:error"); + } catch { + channels.create = { hasSubscribers: false }; + channels.bodySent = { hasSubscribers: false }; + channels.headers = { hasSubscribers: false }; + channels.trailers = { hasSubscribers: false }; + channels.error = { hasSubscribers: false }; + } + class Request { + constructor(origin, { + path, + method, + body: body2, + headers: headers2, + query, + idempotent, + blocking, + upgrade, + headersTimeout, + bodyTimeout, + reset, + throwOnError, + expectContinue + }, handler2) { + if (typeof path !== "string") { + throw new InvalidArgumentError("path must be a string"); + } else if (path[0] !== "/" && !(path.startsWith("http://") || path.startsWith("https://")) && method !== "CONNECT") { + throw new InvalidArgumentError("path must be an absolute URL or start with a slash"); + } else if (invalidPathRegex.exec(path) !== null) { + throw new InvalidArgumentError("invalid request path"); + } + if (typeof method !== "string") { + throw new InvalidArgumentError("method must be a string"); + } else if (tokenRegExp.exec(method) === null) { + throw new InvalidArgumentError("invalid request method"); + } + if (upgrade && typeof upgrade !== "string") { + throw new InvalidArgumentError("upgrade must be a string"); + } + if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) { + throw new InvalidArgumentError("invalid headersTimeout"); + } + if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) { + throw new InvalidArgumentError("invalid bodyTimeout"); + } + if (reset != null && typeof reset !== "boolean") { + throw new InvalidArgumentError("invalid reset"); + } + if (expectContinue != null && typeof expectContinue !== "boolean") { + throw new InvalidArgumentError("invalid expectContinue"); + } + this.headersTimeout = headersTimeout; + this.bodyTimeout = bodyTimeout; + this.throwOnError = throwOnError === true; + this.method = method; + this.abort = null; + if (body2 == null) { + this.body = null; + } else if (util2.isStream(body2)) { + this.body = body2; + const rState = this.body._readableState; + if (!rState || !rState.autoDestroy) { + this.endHandler = function autoDestroy() { + util2.destroy(this); + }; + this.body.on("end", this.endHandler); + } + this.errorHandler = (err) => { + if (this.abort) { + this.abort(err); + } else { + this.error = err; + } + }; + this.body.on("error", this.errorHandler); + } else if (util2.isBuffer(body2)) { + this.body = body2.byteLength ? body2 : null; + } else if (ArrayBuffer.isView(body2)) { + this.body = body2.buffer.byteLength ? Buffer.from(body2.buffer, body2.byteOffset, body2.byteLength) : null; + } else if (body2 instanceof ArrayBuffer) { + this.body = body2.byteLength ? Buffer.from(body2) : null; + } else if (typeof body2 === "string") { + this.body = body2.length ? Buffer.from(body2) : null; + } else if (util2.isFormDataLike(body2) || util2.isIterable(body2) || util2.isBlobLike(body2)) { + this.body = body2; + } else { + throw new InvalidArgumentError("body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable"); + } + this.completed = false; + this.aborted = false; + this.upgrade = upgrade || null; + this.path = query ? util2.buildURL(path, query) : path; + this.origin = origin; + this.idempotent = idempotent == null ? method === "HEAD" || method === "GET" : idempotent; + this.blocking = blocking == null ? false : blocking; + this.reset = reset == null ? null : reset; + this.host = null; + this.contentLength = null; + this.contentType = null; + this.headers = ""; + this.expectContinue = expectContinue != null ? expectContinue : false; + if (Array.isArray(headers2)) { + if (headers2.length % 2 !== 0) { + throw new InvalidArgumentError("headers array must be even"); + } + for (let i = 0; i < headers2.length; i += 2) { + processHeader(this, headers2[i], headers2[i + 1]); + } + } else if (headers2 && typeof headers2 === "object") { + const keys = Object.keys(headers2); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + processHeader(this, key, headers2[key]); + } + } else if (headers2 != null) { + throw new InvalidArgumentError("headers must be an object or an array"); + } + if (util2.isFormDataLike(this.body)) { + if (util2.nodeMajor < 16 || util2.nodeMajor === 16 && util2.nodeMinor < 8) { + throw new InvalidArgumentError("Form-Data bodies are only supported in node v16.8 and newer."); + } + if (!extractBody) { + extractBody = requireBody().extractBody; + } + const [bodyStream, contentType] = extractBody(body2); + if (this.contentType == null) { + this.contentType = contentType; + this.headers += `content-type: ${contentType}\r +`; + } + this.body = bodyStream.stream; + this.contentLength = bodyStream.length; + } else if (util2.isBlobLike(body2) && this.contentType == null && body2.type) { + this.contentType = body2.type; + this.headers += `content-type: ${body2.type}\r +`; + } + util2.validateHandler(handler2, method, upgrade); + this.servername = util2.getServerName(this.host); + this[kHandler] = handler2; + if (channels.create.hasSubscribers) { + channels.create.publish({ request: this }); + } + } + onBodySent(chunk) { + if (this[kHandler].onBodySent) { + try { + return this[kHandler].onBodySent(chunk); + } catch (err) { + this.abort(err); + } + } + } + onRequestSent() { + if (channels.bodySent.hasSubscribers) { + channels.bodySent.publish({ request: this }); + } + if (this[kHandler].onRequestSent) { + try { + return this[kHandler].onRequestSent(); + } catch (err) { + this.abort(err); + } + } + } + onConnect(abort) { + assert(!this.aborted); + assert(!this.completed); + if (this.error) { + abort(this.error); + } else { + this.abort = abort; + return this[kHandler].onConnect(abort); + } + } + onHeaders(statusCode, headers2, resume, statusText) { + assert(!this.aborted); + assert(!this.completed); + if (channels.headers.hasSubscribers) { + channels.headers.publish({ request: this, response: { statusCode, headers: headers2, statusText } }); + } + try { + return this[kHandler].onHeaders(statusCode, headers2, resume, statusText); + } catch (err) { + this.abort(err); + } + } + onData(chunk) { + assert(!this.aborted); + assert(!this.completed); + try { + return this[kHandler].onData(chunk); + } catch (err) { + this.abort(err); + return false; + } + } + onUpgrade(statusCode, headers2, socket) { + assert(!this.aborted); + assert(!this.completed); + return this[kHandler].onUpgrade(statusCode, headers2, socket); + } + onComplete(trailers) { + this.onFinally(); + assert(!this.aborted); + this.completed = true; + if (channels.trailers.hasSubscribers) { + channels.trailers.publish({ request: this, trailers }); + } + try { + return this[kHandler].onComplete(trailers); + } catch (err) { + this.onError(err); + } + } + onError(error) { + this.onFinally(); + if (channels.error.hasSubscribers) { + channels.error.publish({ request: this, error }); + } + if (this.aborted) { + return; + } + this.aborted = true; + return this[kHandler].onError(error); + } + onFinally() { + if (this.errorHandler) { + this.body.off("error", this.errorHandler); + this.errorHandler = null; + } + if (this.endHandler) { + this.body.off("end", this.endHandler); + this.endHandler = null; + } + } + // TODO: adjust to support H2 + addHeader(key, value) { + processHeader(this, key, value); + return this; + } + static [kHTTP1BuildRequest](origin, opts, handler2) { + return new Request(origin, opts, handler2); + } + static [kHTTP2BuildRequest](origin, opts, handler2) { + const headers2 = opts.headers; + opts = { ...opts, headers: null }; + const request2 = new Request(origin, opts, handler2); + request2.headers = {}; + if (Array.isArray(headers2)) { + if (headers2.length % 2 !== 0) { + throw new InvalidArgumentError("headers array must be even"); + } + for (let i = 0; i < headers2.length; i += 2) { + processHeader(request2, headers2[i], headers2[i + 1], true); + } + } else if (headers2 && typeof headers2 === "object") { + const keys = Object.keys(headers2); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + processHeader(request2, key, headers2[key], true); + } + } else if (headers2 != null) { + throw new InvalidArgumentError("headers must be an object or an array"); + } + return request2; + } + static [kHTTP2CopyHeaders](raw) { + const rawHeaders = raw.split("\r\n"); + const headers2 = {}; + for (const header of rawHeaders) { + const [key, value] = header.split(": "); + if (value == null || value.length === 0) continue; + if (headers2[key]) headers2[key] += `,${value}`; + else headers2[key] = value; + } + return headers2; + } + } + function processHeaderValue(key, val, skipAppend) { + if (val && typeof val === "object") { + throw new InvalidArgumentError(`invalid ${key} header`); + } + val = val != null ? `${val}` : ""; + if (headerCharRegex.exec(val) !== null) { + throw new InvalidArgumentError(`invalid ${key} header`); + } + return skipAppend ? val : `${key}: ${val}\r +`; + } + function processHeader(request2, key, val, skipAppend = false) { + if (val && (typeof val === "object" && !Array.isArray(val))) { + throw new InvalidArgumentError(`invalid ${key} header`); + } else if (val === void 0) { + return; + } + if (request2.host === null && key.length === 4 && key.toLowerCase() === "host") { + if (headerCharRegex.exec(val) !== null) { + throw new InvalidArgumentError(`invalid ${key} header`); + } + request2.host = val; + } else if (request2.contentLength === null && key.length === 14 && key.toLowerCase() === "content-length") { + request2.contentLength = parseInt(val, 10); + if (!Number.isFinite(request2.contentLength)) { + throw new InvalidArgumentError("invalid content-length header"); + } + } else if (request2.contentType === null && key.length === 12 && key.toLowerCase() === "content-type") { + request2.contentType = val; + if (skipAppend) request2.headers[key] = processHeaderValue(key, val, skipAppend); + else request2.headers += processHeaderValue(key, val); + } else if (key.length === 17 && key.toLowerCase() === "transfer-encoding") { + throw new InvalidArgumentError("invalid transfer-encoding header"); + } else if (key.length === 10 && key.toLowerCase() === "connection") { + const value = typeof val === "string" ? val.toLowerCase() : null; + if (value !== "close" && value !== "keep-alive") { + throw new InvalidArgumentError("invalid connection header"); + } else if (value === "close") { + request2.reset = true; + } + } else if (key.length === 10 && key.toLowerCase() === "keep-alive") { + throw new InvalidArgumentError("invalid keep-alive header"); + } else if (key.length === 7 && key.toLowerCase() === "upgrade") { + throw new InvalidArgumentError("invalid upgrade header"); + } else if (key.length === 6 && key.toLowerCase() === "expect") { + throw new NotSupportedError("expect header not supported"); + } else if (tokenRegExp.exec(key) === null) { + throw new InvalidArgumentError("invalid header key"); + } else { + if (Array.isArray(val)) { + for (let i = 0; i < val.length; i++) { + if (skipAppend) { + if (request2.headers[key]) request2.headers[key] += `,${processHeaderValue(key, val[i], skipAppend)}`; + else request2.headers[key] = processHeaderValue(key, val[i], skipAppend); + } else { + request2.headers += processHeaderValue(key, val[i]); + } + } + } else { + if (skipAppend) request2.headers[key] = processHeaderValue(key, val, skipAppend); + else request2.headers += processHeaderValue(key, val); + } + } + } + request$2 = Request; + return request$2; +} +var dispatcher; +var hasRequiredDispatcher; +function requireDispatcher() { + if (hasRequiredDispatcher) return dispatcher; + hasRequiredDispatcher = 1; + const EventEmitter = require$$4$1; + class Dispatcher extends EventEmitter { + dispatch() { + throw new Error("not implemented"); + } + close() { + throw new Error("not implemented"); + } + destroy() { + throw new Error("not implemented"); + } + } + dispatcher = Dispatcher; + return dispatcher; +} +var dispatcherBase; +var hasRequiredDispatcherBase; +function requireDispatcherBase() { + if (hasRequiredDispatcherBase) return dispatcherBase; + hasRequiredDispatcherBase = 1; + const Dispatcher = requireDispatcher(); + const { + ClientDestroyedError, + ClientClosedError, + InvalidArgumentError + } = requireErrors(); + const { kDestroy, kClose, kDispatch, kInterceptors } = requireSymbols$4(); + const kDestroyed = /* @__PURE__ */ Symbol("destroyed"); + const kClosed = /* @__PURE__ */ Symbol("closed"); + const kOnDestroyed = /* @__PURE__ */ Symbol("onDestroyed"); + const kOnClosed = /* @__PURE__ */ Symbol("onClosed"); + const kInterceptedDispatch = /* @__PURE__ */ Symbol("Intercepted Dispatch"); + class DispatcherBase extends Dispatcher { + constructor() { + super(); + this[kDestroyed] = false; + this[kOnDestroyed] = null; + this[kClosed] = false; + this[kOnClosed] = []; + } + get destroyed() { + return this[kDestroyed]; + } + get closed() { + return this[kClosed]; + } + get interceptors() { + return this[kInterceptors]; + } + set interceptors(newInterceptors) { + if (newInterceptors) { + for (let i = newInterceptors.length - 1; i >= 0; i--) { + const interceptor = this[kInterceptors][i]; + if (typeof interceptor !== "function") { + throw new InvalidArgumentError("interceptor must be an function"); + } + } + } + this[kInterceptors] = newInterceptors; + } + close(callback) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + this.close((err, data) => { + return err ? reject(err) : resolve(data); + }); + }); + } + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + if (this[kDestroyed]) { + queueMicrotask(() => callback(new ClientDestroyedError(), null)); + return; + } + if (this[kClosed]) { + if (this[kOnClosed]) { + this[kOnClosed].push(callback); + } else { + queueMicrotask(() => callback(null, null)); + } + return; + } + this[kClosed] = true; + this[kOnClosed].push(callback); + const onClosed = () => { + const callbacks = this[kOnClosed]; + this[kOnClosed] = null; + for (let i = 0; i < callbacks.length; i++) { + callbacks[i](null, null); + } + }; + this[kClose]().then(() => this.destroy()).then(() => { + queueMicrotask(onClosed); + }); + } + destroy(err, callback) { + if (typeof err === "function") { + callback = err; + err = null; + } + if (callback === void 0) { + return new Promise((resolve, reject) => { + this.destroy(err, (err2, data) => { + return err2 ? ( + /* istanbul ignore next: should never error */ + reject(err2) + ) : resolve(data); + }); + }); + } + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + if (this[kDestroyed]) { + if (this[kOnDestroyed]) { + this[kOnDestroyed].push(callback); + } else { + queueMicrotask(() => callback(null, null)); + } + return; + } + if (!err) { + err = new ClientDestroyedError(); + } + this[kDestroyed] = true; + this[kOnDestroyed] = this[kOnDestroyed] || []; + this[kOnDestroyed].push(callback); + const onDestroyed = () => { + const callbacks = this[kOnDestroyed]; + this[kOnDestroyed] = null; + for (let i = 0; i < callbacks.length; i++) { + callbacks[i](null, null); + } + }; + this[kDestroy](err).then(() => { + queueMicrotask(onDestroyed); + }); + } + [kInterceptedDispatch](opts, handler2) { + if (!this[kInterceptors] || this[kInterceptors].length === 0) { + this[kInterceptedDispatch] = this[kDispatch]; + return this[kDispatch](opts, handler2); + } + let dispatch = this[kDispatch].bind(this); + for (let i = this[kInterceptors].length - 1; i >= 0; i--) { + dispatch = this[kInterceptors][i](dispatch); + } + this[kInterceptedDispatch] = dispatch; + return dispatch(opts, handler2); + } + dispatch(opts, handler2) { + if (!handler2 || typeof handler2 !== "object") { + throw new InvalidArgumentError("handler must be an object"); + } + try { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("opts must be an object."); + } + if (this[kDestroyed] || this[kOnDestroyed]) { + throw new ClientDestroyedError(); + } + if (this[kClosed]) { + throw new ClientClosedError(); + } + return this[kInterceptedDispatch](opts, handler2); + } catch (err) { + if (typeof handler2.onError !== "function") { + throw new InvalidArgumentError("invalid onError method"); + } + handler2.onError(err); + return false; + } + } + } + dispatcherBase = DispatcherBase; + return dispatcherBase; +} +var connect; +var hasRequiredConnect; +function requireConnect() { + if (hasRequiredConnect) return connect; + hasRequiredConnect = 1; + const net = require$$0$a; + const assert = require$$0$9; + const util2 = requireUtil$6(); + const { InvalidArgumentError, ConnectTimeoutError } = requireErrors(); + let tls; + let SessionCache; + if (commonjsGlobal.FinalizationRegistry && !process.env.NODE_V8_COVERAGE) { + SessionCache = class WeakSessionCache { + constructor(maxCachedSessions) { + this._maxCachedSessions = maxCachedSessions; + this._sessionCache = /* @__PURE__ */ new Map(); + this._sessionRegistry = new commonjsGlobal.FinalizationRegistry((key) => { + if (this._sessionCache.size < this._maxCachedSessions) { + return; + } + const ref = this._sessionCache.get(key); + if (ref !== void 0 && ref.deref() === void 0) { + this._sessionCache.delete(key); + } + }); + } + get(sessionKey) { + const ref = this._sessionCache.get(sessionKey); + return ref ? ref.deref() : null; + } + set(sessionKey, session) { + if (this._maxCachedSessions === 0) { + return; + } + this._sessionCache.set(sessionKey, new WeakRef(session)); + this._sessionRegistry.register(session, sessionKey); + } + }; + } else { + SessionCache = class SimpleSessionCache { + constructor(maxCachedSessions) { + this._maxCachedSessions = maxCachedSessions; + this._sessionCache = /* @__PURE__ */ new Map(); + } + get(sessionKey) { + return this._sessionCache.get(sessionKey); + } + set(sessionKey, session) { + if (this._maxCachedSessions === 0) { + return; + } + if (this._sessionCache.size >= this._maxCachedSessions) { + const { value: oldestKey } = this._sessionCache.keys().next(); + this._sessionCache.delete(oldestKey); + } + this._sessionCache.set(sessionKey, session); + } + }; + } + function buildConnector({ allowH2, maxCachedSessions, socketPath, timeout, ...opts }) { + if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) { + throw new InvalidArgumentError("maxCachedSessions must be a positive integer or zero"); + } + const options = { path: socketPath, ...opts }; + const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions); + timeout = timeout == null ? 1e4 : timeout; + allowH2 = allowH2 != null ? allowH2 : false; + return function connect2({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) { + let socket; + if (protocol === "https:") { + if (!tls) { + tls = require$$1$1; + } + servername = servername || options.servername || util2.getServerName(host) || null; + const sessionKey = servername || hostname; + const session = sessionCache.get(sessionKey) || null; + assert(sessionKey); + socket = tls.connect({ + highWaterMark: 16384, + // TLS in node can't have bigger HWM anyway... + ...options, + servername, + session, + localAddress, + // TODO(HTTP/2): Add support for h2c + ALPNProtocols: allowH2 ? ["http/1.1", "h2"] : ["http/1.1"], + socket: httpSocket, + // upgrade socket connection + port: port || 443, + host: hostname + }); + socket.on("session", function(session2) { + sessionCache.set(sessionKey, session2); + }); + } else { + assert(!httpSocket, "httpSocket can only be sent on TLS update"); + socket = net.connect({ + highWaterMark: 64 * 1024, + // Same as nodejs fs streams. + ...options, + localAddress, + port: port || 80, + host: hostname + }); + } + if (options.keepAlive == null || options.keepAlive) { + const keepAliveInitialDelay = options.keepAliveInitialDelay === void 0 ? 6e4 : options.keepAliveInitialDelay; + socket.setKeepAlive(true, keepAliveInitialDelay); + } + const cancelTimeout = setupTimeout(() => onConnectTimeout(socket), timeout); + socket.setNoDelay(true).once(protocol === "https:" ? "secureConnect" : "connect", function() { + cancelTimeout(); + if (callback) { + const cb = callback; + callback = null; + cb(null, this); + } + }).on("error", function(err) { + cancelTimeout(); + if (callback) { + const cb = callback; + callback = null; + cb(err); + } + }); + return socket; + }; + } + function setupTimeout(onConnectTimeout2, timeout) { + if (!timeout) { + return () => { + }; + } + let s1 = null; + let s2 = null; + const timeoutId = setTimeout(() => { + s1 = setImmediate(() => { + if (process.platform === "win32") { + s2 = setImmediate(() => onConnectTimeout2()); + } else { + onConnectTimeout2(); + } + }); + }, timeout); + return () => { + clearTimeout(timeoutId); + clearImmediate(s1); + clearImmediate(s2); + }; + } + function onConnectTimeout(socket) { + util2.destroy(socket, new ConnectTimeoutError()); + } + connect = buildConnector; + return connect; +} +var constants$2 = {}; +var utils = {}; +var hasRequiredUtils$2; +function requireUtils$2() { + if (hasRequiredUtils$2) return utils; + hasRequiredUtils$2 = 1; + Object.defineProperty(utils, "__esModule", { value: true }); + utils.enumToMap = void 0; + function enumToMap(obj) { + const res = {}; + Object.keys(obj).forEach((key) => { + const value = obj[key]; + if (typeof value === "number") { + res[key] = value; + } + }); + return res; + } + utils.enumToMap = enumToMap; + return utils; +} +var hasRequiredConstants$2; +function requireConstants$2() { + if (hasRequiredConstants$2) return constants$2; + hasRequiredConstants$2 = 1; + (function(exports$1) { + Object.defineProperty(exports$1, "__esModule", { value: true }); + exports$1.SPECIAL_HEADERS = exports$1.HEADER_STATE = exports$1.MINOR = exports$1.MAJOR = exports$1.CONNECTION_TOKEN_CHARS = exports$1.HEADER_CHARS = exports$1.TOKEN = exports$1.STRICT_TOKEN = exports$1.HEX = exports$1.URL_CHAR = exports$1.STRICT_URL_CHAR = exports$1.USERINFO_CHARS = exports$1.MARK = exports$1.ALPHANUM = exports$1.NUM = exports$1.HEX_MAP = exports$1.NUM_MAP = exports$1.ALPHA = exports$1.FINISH = exports$1.H_METHOD_MAP = exports$1.METHOD_MAP = exports$1.METHODS_RTSP = exports$1.METHODS_ICE = exports$1.METHODS_HTTP = exports$1.METHODS = exports$1.LENIENT_FLAGS = exports$1.FLAGS = exports$1.TYPE = exports$1.ERROR = void 0; + const utils_1 = requireUtils$2(); + (function(ERROR) { + ERROR[ERROR["OK"] = 0] = "OK"; + ERROR[ERROR["INTERNAL"] = 1] = "INTERNAL"; + ERROR[ERROR["STRICT"] = 2] = "STRICT"; + ERROR[ERROR["LF_EXPECTED"] = 3] = "LF_EXPECTED"; + ERROR[ERROR["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH"; + ERROR[ERROR["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION"; + ERROR[ERROR["INVALID_METHOD"] = 6] = "INVALID_METHOD"; + ERROR[ERROR["INVALID_URL"] = 7] = "INVALID_URL"; + ERROR[ERROR["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT"; + ERROR[ERROR["INVALID_VERSION"] = 9] = "INVALID_VERSION"; + ERROR[ERROR["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN"; + ERROR[ERROR["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH"; + ERROR[ERROR["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE"; + ERROR[ERROR["INVALID_STATUS"] = 13] = "INVALID_STATUS"; + ERROR[ERROR["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE"; + ERROR[ERROR["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING"; + ERROR[ERROR["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN"; + ERROR[ERROR["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE"; + ERROR[ERROR["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE"; + ERROR[ERROR["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER"; + ERROR[ERROR["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE"; + ERROR[ERROR["PAUSED"] = 21] = "PAUSED"; + ERROR[ERROR["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE"; + ERROR[ERROR["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE"; + ERROR[ERROR["USER"] = 24] = "USER"; + })(exports$1.ERROR || (exports$1.ERROR = {})); + (function(TYPE) { + TYPE[TYPE["BOTH"] = 0] = "BOTH"; + TYPE[TYPE["REQUEST"] = 1] = "REQUEST"; + TYPE[TYPE["RESPONSE"] = 2] = "RESPONSE"; + })(exports$1.TYPE || (exports$1.TYPE = {})); + (function(FLAGS) { + FLAGS[FLAGS["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE"; + FLAGS[FLAGS["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE"; + FLAGS[FLAGS["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE"; + FLAGS[FLAGS["CHUNKED"] = 8] = "CHUNKED"; + FLAGS[FLAGS["UPGRADE"] = 16] = "UPGRADE"; + FLAGS[FLAGS["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH"; + FLAGS[FLAGS["SKIPBODY"] = 64] = "SKIPBODY"; + FLAGS[FLAGS["TRAILING"] = 128] = "TRAILING"; + FLAGS[FLAGS["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING"; + })(exports$1.FLAGS || (exports$1.FLAGS = {})); + (function(LENIENT_FLAGS) { + LENIENT_FLAGS[LENIENT_FLAGS["HEADERS"] = 1] = "HEADERS"; + LENIENT_FLAGS[LENIENT_FLAGS["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH"; + LENIENT_FLAGS[LENIENT_FLAGS["KEEP_ALIVE"] = 4] = "KEEP_ALIVE"; + })(exports$1.LENIENT_FLAGS || (exports$1.LENIENT_FLAGS = {})); + var METHODS; + (function(METHODS2) { + METHODS2[METHODS2["DELETE"] = 0] = "DELETE"; + METHODS2[METHODS2["GET"] = 1] = "GET"; + METHODS2[METHODS2["HEAD"] = 2] = "HEAD"; + METHODS2[METHODS2["POST"] = 3] = "POST"; + METHODS2[METHODS2["PUT"] = 4] = "PUT"; + METHODS2[METHODS2["CONNECT"] = 5] = "CONNECT"; + METHODS2[METHODS2["OPTIONS"] = 6] = "OPTIONS"; + METHODS2[METHODS2["TRACE"] = 7] = "TRACE"; + METHODS2[METHODS2["COPY"] = 8] = "COPY"; + METHODS2[METHODS2["LOCK"] = 9] = "LOCK"; + METHODS2[METHODS2["MKCOL"] = 10] = "MKCOL"; + METHODS2[METHODS2["MOVE"] = 11] = "MOVE"; + METHODS2[METHODS2["PROPFIND"] = 12] = "PROPFIND"; + METHODS2[METHODS2["PROPPATCH"] = 13] = "PROPPATCH"; + METHODS2[METHODS2["SEARCH"] = 14] = "SEARCH"; + METHODS2[METHODS2["UNLOCK"] = 15] = "UNLOCK"; + METHODS2[METHODS2["BIND"] = 16] = "BIND"; + METHODS2[METHODS2["REBIND"] = 17] = "REBIND"; + METHODS2[METHODS2["UNBIND"] = 18] = "UNBIND"; + METHODS2[METHODS2["ACL"] = 19] = "ACL"; + METHODS2[METHODS2["REPORT"] = 20] = "REPORT"; + METHODS2[METHODS2["MKACTIVITY"] = 21] = "MKACTIVITY"; + METHODS2[METHODS2["CHECKOUT"] = 22] = "CHECKOUT"; + METHODS2[METHODS2["MERGE"] = 23] = "MERGE"; + METHODS2[METHODS2["M-SEARCH"] = 24] = "M-SEARCH"; + METHODS2[METHODS2["NOTIFY"] = 25] = "NOTIFY"; + METHODS2[METHODS2["SUBSCRIBE"] = 26] = "SUBSCRIBE"; + METHODS2[METHODS2["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE"; + METHODS2[METHODS2["PATCH"] = 28] = "PATCH"; + METHODS2[METHODS2["PURGE"] = 29] = "PURGE"; + METHODS2[METHODS2["MKCALENDAR"] = 30] = "MKCALENDAR"; + METHODS2[METHODS2["LINK"] = 31] = "LINK"; + METHODS2[METHODS2["UNLINK"] = 32] = "UNLINK"; + METHODS2[METHODS2["SOURCE"] = 33] = "SOURCE"; + METHODS2[METHODS2["PRI"] = 34] = "PRI"; + METHODS2[METHODS2["DESCRIBE"] = 35] = "DESCRIBE"; + METHODS2[METHODS2["ANNOUNCE"] = 36] = "ANNOUNCE"; + METHODS2[METHODS2["SETUP"] = 37] = "SETUP"; + METHODS2[METHODS2["PLAY"] = 38] = "PLAY"; + METHODS2[METHODS2["PAUSE"] = 39] = "PAUSE"; + METHODS2[METHODS2["TEARDOWN"] = 40] = "TEARDOWN"; + METHODS2[METHODS2["GET_PARAMETER"] = 41] = "GET_PARAMETER"; + METHODS2[METHODS2["SET_PARAMETER"] = 42] = "SET_PARAMETER"; + METHODS2[METHODS2["REDIRECT"] = 43] = "REDIRECT"; + METHODS2[METHODS2["RECORD"] = 44] = "RECORD"; + METHODS2[METHODS2["FLUSH"] = 45] = "FLUSH"; + })(METHODS = exports$1.METHODS || (exports$1.METHODS = {})); + exports$1.METHODS_HTTP = [ + METHODS.DELETE, + METHODS.GET, + METHODS.HEAD, + METHODS.POST, + METHODS.PUT, + METHODS.CONNECT, + METHODS.OPTIONS, + METHODS.TRACE, + METHODS.COPY, + METHODS.LOCK, + METHODS.MKCOL, + METHODS.MOVE, + METHODS.PROPFIND, + METHODS.PROPPATCH, + METHODS.SEARCH, + METHODS.UNLOCK, + METHODS.BIND, + METHODS.REBIND, + METHODS.UNBIND, + METHODS.ACL, + METHODS.REPORT, + METHODS.MKACTIVITY, + METHODS.CHECKOUT, + METHODS.MERGE, + METHODS["M-SEARCH"], + METHODS.NOTIFY, + METHODS.SUBSCRIBE, + METHODS.UNSUBSCRIBE, + METHODS.PATCH, + METHODS.PURGE, + METHODS.MKCALENDAR, + METHODS.LINK, + METHODS.UNLINK, + METHODS.PRI, + // TODO(indutny): should we allow it with HTTP? + METHODS.SOURCE + ]; + exports$1.METHODS_ICE = [ + METHODS.SOURCE + ]; + exports$1.METHODS_RTSP = [ + METHODS.OPTIONS, + METHODS.DESCRIBE, + METHODS.ANNOUNCE, + METHODS.SETUP, + METHODS.PLAY, + METHODS.PAUSE, + METHODS.TEARDOWN, + METHODS.GET_PARAMETER, + METHODS.SET_PARAMETER, + METHODS.REDIRECT, + METHODS.RECORD, + METHODS.FLUSH, + // For AirPlay + METHODS.GET, + METHODS.POST + ]; + exports$1.METHOD_MAP = utils_1.enumToMap(METHODS); + exports$1.H_METHOD_MAP = {}; + Object.keys(exports$1.METHOD_MAP).forEach((key) => { + if (/^H/.test(key)) { + exports$1.H_METHOD_MAP[key] = exports$1.METHOD_MAP[key]; + } + }); + (function(FINISH) { + FINISH[FINISH["SAFE"] = 0] = "SAFE"; + FINISH[FINISH["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB"; + FINISH[FINISH["UNSAFE"] = 2] = "UNSAFE"; + })(exports$1.FINISH || (exports$1.FINISH = {})); + exports$1.ALPHA = []; + for (let i = "A".charCodeAt(0); i <= "Z".charCodeAt(0); i++) { + exports$1.ALPHA.push(String.fromCharCode(i)); + exports$1.ALPHA.push(String.fromCharCode(i + 32)); + } + exports$1.NUM_MAP = { + 0: 0, + 1: 1, + 2: 2, + 3: 3, + 4: 4, + 5: 5, + 6: 6, + 7: 7, + 8: 8, + 9: 9 + }; + exports$1.HEX_MAP = { + 0: 0, + 1: 1, + 2: 2, + 3: 3, + 4: 4, + 5: 5, + 6: 6, + 7: 7, + 8: 8, + 9: 9, + A: 10, + B: 11, + C: 12, + D: 13, + E: 14, + F: 15, + a: 10, + b: 11, + c: 12, + d: 13, + e: 14, + f: 15 + }; + exports$1.NUM = [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" + ]; + exports$1.ALPHANUM = exports$1.ALPHA.concat(exports$1.NUM); + exports$1.MARK = ["-", "_", ".", "!", "~", "*", "'", "(", ")"]; + exports$1.USERINFO_CHARS = exports$1.ALPHANUM.concat(exports$1.MARK).concat(["%", ";", ":", "&", "=", "+", "$", ","]); + exports$1.STRICT_URL_CHAR = [ + "!", + '"', + "$", + "%", + "&", + "'", + "(", + ")", + "*", + "+", + ",", + "-", + ".", + "/", + ":", + ";", + "<", + "=", + ">", + "@", + "[", + "\\", + "]", + "^", + "_", + "`", + "{", + "|", + "}", + "~" + ].concat(exports$1.ALPHANUM); + exports$1.URL_CHAR = exports$1.STRICT_URL_CHAR.concat([" ", "\f"]); + for (let i = 128; i <= 255; i++) { + exports$1.URL_CHAR.push(i); + } + exports$1.HEX = exports$1.NUM.concat(["a", "b", "c", "d", "e", "f", "A", "B", "C", "D", "E", "F"]); + exports$1.STRICT_TOKEN = [ + "!", + "#", + "$", + "%", + "&", + "'", + "*", + "+", + "-", + ".", + "^", + "_", + "`", + "|", + "~" + ].concat(exports$1.ALPHANUM); + exports$1.TOKEN = exports$1.STRICT_TOKEN.concat([" "]); + exports$1.HEADER_CHARS = [" "]; + for (let i = 32; i <= 255; i++) { + if (i !== 127) { + exports$1.HEADER_CHARS.push(i); + } + } + exports$1.CONNECTION_TOKEN_CHARS = exports$1.HEADER_CHARS.filter((c) => c !== 44); + exports$1.MAJOR = exports$1.NUM_MAP; + exports$1.MINOR = exports$1.MAJOR; + var HEADER_STATE; + (function(HEADER_STATE2) { + HEADER_STATE2[HEADER_STATE2["GENERAL"] = 0] = "GENERAL"; + HEADER_STATE2[HEADER_STATE2["CONNECTION"] = 1] = "CONNECTION"; + HEADER_STATE2[HEADER_STATE2["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH"; + HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING"; + HEADER_STATE2[HEADER_STATE2["UPGRADE"] = 4] = "UPGRADE"; + HEADER_STATE2[HEADER_STATE2["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE"; + HEADER_STATE2[HEADER_STATE2["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE"; + HEADER_STATE2[HEADER_STATE2["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE"; + HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING_CHUNKED"] = 8] = "TRANSFER_ENCODING_CHUNKED"; + })(HEADER_STATE = exports$1.HEADER_STATE || (exports$1.HEADER_STATE = {})); + exports$1.SPECIAL_HEADERS = { + "connection": HEADER_STATE.CONNECTION, + "content-length": HEADER_STATE.CONTENT_LENGTH, + "proxy-connection": HEADER_STATE.CONNECTION, + "transfer-encoding": HEADER_STATE.TRANSFER_ENCODING, + "upgrade": HEADER_STATE.UPGRADE + }; + })(constants$2); + return constants$2; +} +var RedirectHandler_1; +var hasRequiredRedirectHandler; +function requireRedirectHandler() { + if (hasRequiredRedirectHandler) return RedirectHandler_1; + hasRequiredRedirectHandler = 1; + const util2 = requireUtil$6(); + const { kBodyUsed } = requireSymbols$4(); + const assert = require$$0$9; + const { InvalidArgumentError } = requireErrors(); + const EE = require$$4$1; + const redirectableStatusCodes = [300, 301, 302, 303, 307, 308]; + const kBody = /* @__PURE__ */ Symbol("body"); + class BodyAsyncIterable { + constructor(body2) { + this[kBody] = body2; + this[kBodyUsed] = false; + } + async *[Symbol.asyncIterator]() { + assert(!this[kBodyUsed], "disturbed"); + this[kBodyUsed] = true; + yield* this[kBody]; + } + } + class RedirectHandler { + constructor(dispatch, maxRedirections, opts, handler2) { + if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { + throw new InvalidArgumentError("maxRedirections must be a positive number"); + } + util2.validateHandler(handler2, opts.method, opts.upgrade); + this.dispatch = dispatch; + this.location = null; + this.abort = null; + this.opts = { ...opts, maxRedirections: 0 }; + this.maxRedirections = maxRedirections; + this.handler = handler2; + this.history = []; + if (util2.isStream(this.opts.body)) { + if (util2.bodyLength(this.opts.body) === 0) { + this.opts.body.on("data", function() { + assert(false); + }); + } + if (typeof this.opts.body.readableDidRead !== "boolean") { + this.opts.body[kBodyUsed] = false; + EE.prototype.on.call(this.opts.body, "data", function() { + this[kBodyUsed] = true; + }); + } + } else if (this.opts.body && typeof this.opts.body.pipeTo === "function") { + this.opts.body = new BodyAsyncIterable(this.opts.body); + } else if (this.opts.body && typeof this.opts.body !== "string" && !ArrayBuffer.isView(this.opts.body) && util2.isIterable(this.opts.body)) { + this.opts.body = new BodyAsyncIterable(this.opts.body); + } + } + onConnect(abort) { + this.abort = abort; + this.handler.onConnect(abort, { history: this.history }); + } + onUpgrade(statusCode, headers2, socket) { + this.handler.onUpgrade(statusCode, headers2, socket); + } + onError(error) { + this.handler.onError(error); + } + onHeaders(statusCode, headers2, resume, statusText) { + this.location = this.history.length >= this.maxRedirections || util2.isDisturbed(this.opts.body) ? null : parseLocation(statusCode, headers2); + if (this.opts.origin) { + this.history.push(new URL(this.opts.path, this.opts.origin)); + } + if (!this.location) { + return this.handler.onHeaders(statusCode, headers2, resume, statusText); + } + const { origin, pathname, search } = util2.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin))); + const path = search ? `${pathname}${search}` : pathname; + this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin); + this.opts.path = path; + this.opts.origin = origin; + this.opts.maxRedirections = 0; + this.opts.query = null; + if (statusCode === 303 && this.opts.method !== "HEAD") { + this.opts.method = "GET"; + this.opts.body = null; + } + } + onData(chunk) { + if (this.location) ; + else { + return this.handler.onData(chunk); + } + } + onComplete(trailers) { + if (this.location) { + this.location = null; + this.abort = null; + this.dispatch(this.opts, this); + } else { + this.handler.onComplete(trailers); + } + } + onBodySent(chunk) { + if (this.handler.onBodySent) { + this.handler.onBodySent(chunk); + } + } + } + function parseLocation(statusCode, headers2) { + if (redirectableStatusCodes.indexOf(statusCode) === -1) { + return null; + } + for (let i = 0; i < headers2.length; i += 2) { + if (headers2[i].toString().toLowerCase() === "location") { + return headers2[i + 1]; + } + } + } + function shouldRemoveHeader(header, removeContent, unknownOrigin) { + if (header.length === 4) { + return util2.headerNameToString(header) === "host"; + } + if (removeContent && util2.headerNameToString(header).startsWith("content-")) { + return true; + } + if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) { + const name = util2.headerNameToString(header); + return name === "authorization" || name === "cookie" || name === "proxy-authorization"; + } + return false; + } + function cleanRequestHeaders(headers2, removeContent, unknownOrigin) { + const ret = []; + if (Array.isArray(headers2)) { + for (let i = 0; i < headers2.length; i += 2) { + if (!shouldRemoveHeader(headers2[i], removeContent, unknownOrigin)) { + ret.push(headers2[i], headers2[i + 1]); + } + } + } else if (headers2 && typeof headers2 === "object") { + for (const key of Object.keys(headers2)) { + if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) { + ret.push(key, headers2[key]); + } + } + } else { + assert(headers2 == null, "headers must be an object or an array"); + } + return ret; + } + RedirectHandler_1 = RedirectHandler; + return RedirectHandler_1; +} +var redirectInterceptor; +var hasRequiredRedirectInterceptor; +function requireRedirectInterceptor() { + if (hasRequiredRedirectInterceptor) return redirectInterceptor; + hasRequiredRedirectInterceptor = 1; + const RedirectHandler = requireRedirectHandler(); + function createRedirectInterceptor({ maxRedirections: defaultMaxRedirections }) { + return (dispatch) => { + return function Intercept(opts, handler2) { + const { maxRedirections = defaultMaxRedirections } = opts; + if (!maxRedirections) { + return dispatch(opts, handler2); + } + const redirectHandler2 = new RedirectHandler(dispatch, maxRedirections, opts, handler2); + opts = { ...opts, maxRedirections: 0 }; + return dispatch(opts, redirectHandler2); + }; + }; + } + redirectInterceptor = createRedirectInterceptor; + return redirectInterceptor; +} +var llhttpWasm; +var hasRequiredLlhttpWasm; +function requireLlhttpWasm() { + if (hasRequiredLlhttpWasm) return llhttpWasm; + hasRequiredLlhttpWasm = 1; + llhttpWasm = "AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJs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ADcDACAAQShqQgA3AwAgAEEgakIANwMAIABBEGpCADcDACAAQQhqQgA3AwAgAEHdATYCHEEAC3sBAX8CQCAAKAIMIgMNAAJAIAAoAgRFDQAgACABNgIECwJAIAAgASACEMSAgIAAIgMNACAAKAIMDwsgACADNgIcQQAhAyAAKAIEIgFFDQAgACABIAIgACgCCBGBgICAAAAiAUUNACAAIAI2AhQgACABNgIMIAEhAwsgAwvk8wEDDn8DfgR/I4CAgIAAQRBrIgMkgICAgAAgASEEIAEhBSABIQYgASEHIAEhCCABIQkgASEKIAEhCyABIQwgASENIAEhDiABIQ8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCHCIQQX9qDt0B2gEB2QECAwQFBgcICQoLDA0O2AEPENcBERLWARMUFRYXGBkaG+AB3wEcHR7VAR8gISIjJCXUASYnKCkqKyzTAdIBLS7RAdABLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVG2wFHSElKzwHOAUvNAUzMAU1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4ABgQGCAYMBhAGFAYYBhwGIAYkB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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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FCAAIBA2AgxBACEQDLIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDLEBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxRCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLABCyAAQQA2AhwgACABNgIUIABBxoqAgAA2AhAgAEEHNgIMQQAhEAyvAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAyuAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAytAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMTQsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAysAQsgAEEANgIcIAAgATYCFCAAQdyIgIAANgIQIABBBzYCDEEAIRAMqwELIBBBP0cNASABQQFqIQELQQUhEAyQAQtBACEQIABBADYCHCAAIAE2AhQgAEH9koCAADYCECAAQQc2AgwMqAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMpwELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMpgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEYLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMpQELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0gA2AhwgACAUNgIUIAAgATYCDEEAIRAMpAELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0wA2AhwgACAUNgIUIAAgATYCDEEAIRAMowELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDEMLIABB5QA2AhwgACAU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YWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21ldGhvZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lYCBjYWxsYmFjayBlcnJvcgBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNlcnZlcgBJbnZhbGlkIGhlYWRlciB2YWx1ZSBjaGFyAEludmFsaWQgaGVhZGVyIGZpZWxkIGNoYXIAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl92ZXJzaW9uAEludmFsaWQgbWlub3IgdmVyc2lvbgBJbnZhbGlkIG1ham9yIHZlcnNpb24ARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgdmVyc2lvbgBFeHBlY3RlZCBDUkxGIGFmdGVyIHZlcnNpb24ASW52YWxpZCBIVFRQIHZlcnNpb24ASW52YWxpZCBoZWFkZXIgdG9rZW4AU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl91cmwASW52YWxpZCBjaGFyYWN0ZXJzIGluIHVybABVbmV4cGVjdGVkIHN0YXJ0IGNoYXIgaW4gdXJsAERvdWJsZSBAIGluIHVybABFbXB0eSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXJhY3RlciBpbiBDb250ZW50LUxlbmd0aABEdXBsaWNhdGUgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyIGluIHVybCBwYXRoAENvbnRlbnQtTGVuZ3RoIGNhbid0IGJlIHByZXNlbnQgd2l0aCBUcmFuc2Zlci1FbmNvZGluZwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBzaXplAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX3ZhbHVlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgdmFsdWUATWlzc2luZyBleHBlY3RlZCBMRiBhZnRlciBoZWFkZXIgdmFsdWUASW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fbmFtZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIG5hbWUAUGF1c2Ugb24gQ09OTkVDVC9VcGdyYWRlAFBhdXNlIG9uIFBSSS9VcGdyYWRlAEV4cGVjdGVkIEhUVFAvMiBDb25uZWN0aW9uIFByZWZhY2UAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9tZXRob2QARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgbWV0aG9kAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX2ZpZWxkAFBhdXNlZABJbnZhbGlkIHdvcmQgZW5jb3VudGVyZWQASW52YWxpZCBtZXRob2QgZW5jb3VudGVyZWQAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzY2hlbWEAUmVxdWVzdCBoYXMgaW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX0NIVU5LX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX05BTUVfQ09NUExFVEUASFBFX0NCX01FU1NBR0VfQ09NUExFVEUASFBFX0NCX01FVEhPRF9DT01QTEVURQBIUEVfQ0JfSEVBREVSX0ZJRUxEX0NPTVBMRVRFAERFTEVURQBIUEVfSU5WQUxJRF9FT0ZfU1RBVEUASU5WQUxJRF9TU0xfQ0VSVElGSUNBVEUAUEFVU0UATk9fUkVTUE9OU0UAVU5TVVBQT1JURURfTUVESUFfVFlQRQBHT05FAE5PVF9BQ0NFUFRBQkxFAFNFUlZJQ0VfVU5BVkFJTEFCTEUAUkFOR0VfTk9UX1NBVElTRklBQkxFAE9SSUdJTl9JU19VTlJFQUNIQUJMRQBSRVNQT05TRV9JU19TVEFMRQBQVVJHRQBNRVJHRQBSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFAFJFUVVFU1RfSEVBREVSX1RPT19MQVJHRQBQQVlMT0FEX1RPT19MQVJHRQBJTlNVRkZJQ0lFTlRfU1RPUkFHRQBIUEVfUEFVU0VEX1VQR1JBREUASFBFX1BBVVNFRF9IMl9VUEdSQURFAFNPVVJDRQBBTk5PVU5DRQBUUkFDRQBIUEVfVU5FWFBFQ1RFRF9TUEFDRQBERVNDUklCRQBVTlNVQlNDUklCRQBSRUNPUkQASFBFX0lOVkFMSURfTUVUSE9EAE5PVF9GT1VORABQUk9QRklORABVTkJJTkQAUkVCSU5EAFVOQVVUSE9SSVpFRABNRVRIT0RfTk9UX0FMTE9XRUQASFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQAQUxSRUFEWV9SRVBPUlRFRABBQ0NFUFRFRABOT1RfSU1QTEVNRU5URUQATE9PUF9ERVRFQ1RFRABIUEVfQ1JfRVhQRUNURUQASFBFX0xGX0VYUEVDVEVEAENSRUFURUQASU1fVVNFRABIUEVfUEFVU0VEAFRJTUVPVVRfT0NDVVJFRABQQVlNRU5UX1JFUVVJUkVEAFBSRUNPTkRJVElPTl9SRVFVSVJFRABQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRABORVRXT1JLX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAExFTkdUSF9SRVFVSVJFRABTU0xfQ0VSVElGSUNBVEVfUkVRVUlSRUQAVVBHUkFERV9SRVFVSVJFRABQQUdFX0VYUElSRUQAUFJFQ09ORElUSU9OX0ZBSUxFRABFWFBFQ1RBVElPTl9GQUlMRUQAUkVWQUxJREFUSU9OX0ZBSUxFRABTU0xfSEFORFNIQUtFX0ZBSUxFRABMT0NLRUQAVFJBTlNGT1JNQVRJT05fQVBQTElFRABOT1RfTU9ESUZJRUQATk9UX0VYVEVOREVEAEJBTkRXSURUSF9MSU1JVF9FWENFRURFRABTSVRFX0lTX09WRVJMT0FERUQASEVBRABFeHBlY3RlZCBIVFRQLwAAXhMAACYTAAAwEAAA8BcAAJ0TAAAVEgAAORcAAPASAAAKEAAAdRIAAK0SAACCEwAATxQAAH8QAACgFQAAIxQAAIkSAACLFAAATRUAANQRAADPFAAAEBgAAMkWAADcFgAAwREAAOAXAAC7FAAAdBQAAHwVAADlFAAACBcAAB8QAABlFQAAoxQAACgVAAACFQAAmRUAACwQAACLGQAATw8AANQOAABqEAAAzhAAAAIXAACJDgAAbhMAABwTAABmFAAAVhcAAMETAADNEwAAbBMAAGgXAABmFwAAXxcAACITAADODwAAaQ4AANgOAABjFgAAyxMAAKoOAAAoFwAAJhcAAMUTAABdFgAA6BEAAGcTAABlEwAA8hYAAHMTAAAdFwAA+RYAAPMRAADPDgAAzhUAAAwSAACzEQAApREAAGEQAAAyFwAAuxMAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIDAgICAgIAAAICAAICAAICAgICAgICAgIABAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbG9zZWVlcC1hbGl2ZQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEAAAEBAAEBAAEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AAAAAAAAAAAAAAAAAAAByYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AAAAAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQIAAQMAAAAAAAAAAAAAAAAAAAAAAAAEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQAAAgAAAAAAAAAAAAAAAAAAAAAAAAMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAIAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOT1VOQ0VFQ0tPVVRORUNURVRFQ1JJQkVMVVNIRVRFQURTRUFSQ0hSR0VDVElWSVRZTEVOREFSVkVPVElGWVBUSU9OU0NIU0VBWVNUQVRDSEdFT1JESVJFQ1RPUlRSQ0hQQVJBTUVURVJVUkNFQlNDUklCRUFSRE9XTkFDRUlORE5LQ0tVQlNDUklCRUhUVFAvQURUUC8="; + return llhttpWasm; +} +var llhttp_simdWasm; +var hasRequiredLlhttp_simdWasm; +function requireLlhttp_simdWasm() { + if (hasRequiredLlhttp_simdWasm) return llhttp_simdWasm; + hasRequiredLlhttp_simdWasm = 1; + llhttp_simdWasm = "AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJs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IAH9CwMAIABBMGogAf0LAwAgAEEgaiAB/QsDACAAQd0BNgIcQQALewEBfwJAIAAoAgwiAw0AAkAgACgCBEUNACAAIAE2AgQLAkAgACABIAIQxICAgAAiAw0AIAAoAgwPCyAAIAM2AhxBACEDIAAoAgQiAUUNACAAIAEgAiAAKAIIEYGAgIAAACIBRQ0AIAAgAjYCFCAAIAE2AgwgASEDCyADC+TzAQMOfwN+BH8jgICAgABBEGsiAySAgICAACABIQQgASEFIAEhBiABIQcgASEIIAEhCSABIQogASELIAEhDCABIQ0gASEOIAEhDwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIcIhBBf2oO3QHaAQHZAQIDBAUGBwgJCgsMDQ7YAQ8Q1wEREtYBExQVFhcYGRob4AHfARwdHtUBHyAhIiMkJdQBJicoKSorLNMB0gEtLtEB0AEvMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUbbAUdISUrPAc4BS80BTMwBTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEBkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGfAaABoQGiAaMBpAGlAaYBpwGoAakBqgGrAawBrQGuAa8BsAGxAbIBswG0AbUBtgG3AcsBygG4AckBuQHIAboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBANwBC0EAIRAMxgELQQ4hEAzFAQtBDSEQDMQBC0EPIRAMwwELQRAhEAzCAQtBEyEQDMEBC0EUIRAMwAELQRUhEAy/AQtBFiEQDL4BC0EXIRAMvQELQRghEAy8AQtBGSEQDLsBC0EaIRAMugELQRshEAy5AQtBHCEQDLgBC0EIIRAMtwELQR0hEAy2AQtBICEQDLUBC0EfIRAMtAELQQchEAyzAQtBISEQDLIBC0EiIRAMsQELQR4hEAywAQtBIyEQDK8BC0ESIRAMrgELQREhEAytAQtBJCEQDKwBC0ElIRAMqwELQSYhEAyqAQtBJyEQDKkBC0HDASEQDKgBC0EpIRAMpwELQSshEAymAQtBLCEQDKUBC0EtIRAMpAELQS4hEAyjAQtBLyEQDKIBC0HEASEQDKEBC0EwIRAMoAELQTQhEAyfAQtBDCEQDJ4BC0ExIRAMnQELQTIhEAycAQtBMyEQDJsBC0E5IRAMmgELQTUhEAyZAQtBxQEhEAyYAQtBCyEQDJcBC0E6IRAMlgELQTYhEAyVAQtBCiEQDJQBC0E3IRAMkwELQTghEAySAQtBPCEQDJEBC0E7IRAMkAELQT0hEAyPAQtBCSEQDI4BC0EoIRAMjQELQT4hEAyMAQtBPyEQDIsBC0HAACEQDIoBC0HBACEQDIkBC0HCACEQDIgBC0HDACEQDIcBC0HEACEQDIYBC0HFACEQDIUBC0HGACEQDIQBC0EqIRAMgwELQccAIRAMggELQcgAIRAMgQELQckAIRAMgAELQcoAIRAMfwtBywAhEAx+C0HNACEQDH0LQcwAIRAMfAtBzgAhEAx7C0HPACEQDHoLQdAAIRAMeQtB0QAhEAx4C0HSACEQDHcLQdMAIRAMdgtB1AAhEAx1C0HWACEQDHQLQdUAIRAMcwtBBiEQDHILQdcAIRAMcQtBBSEQDHALQdgAIRAMbwtBBCEQDG4LQdkAIRAMbQtB2gAhEAxsC0HbACEQDGsLQdwAIRAMagtBAyEQDGkLQd0AIRAMaAtB3gAhEAxnC0HfACEQDGYLQeEAIRAMZQtB4AAhEAxkC0HiACEQDGMLQeMAIRAMYgtBAiEQDGELQeQAIRAMYAtB5QAhEAxfC0HmACEQDF4LQecAIRAMXQtB6AAhEAxcC0HpACEQDFsLQeoAIRAMWgtB6wAhEAxZC0HsACEQDFgLQe0AIRAMVwtB7gAhEAxWC0HvACEQDFULQfAAIRAMVAtB8QAhEAxTC0HyACEQDFILQfMAIRAMUQtB9AAhEAxQC0H1ACEQDE8LQfYAIRAMTgtB9wAhEAxNC0H4ACEQDEwLQfkAIRAMSwtB+gAhEAxKC0H7ACEQDEkLQfwAIRAMSAtB/QAhEAxHC0H+ACEQDEYLQf8AIRAMRQtBgAEhEAxEC0GBASEQDEMLQYIBIRAMQgtBgwEhEAxBC0GEASEQDEALQYUBIRAMPwtBhgEhEAw+C0GHASEQDD0LQYgBIRAMPAtBiQEhEAw7C0GKASEQDDoLQYsBIRAMOQtBjAEhEAw4C0GNASEQDDcLQY4BIRAMNgtBjwEhEAw1C0GQASEQDDQLQZEBIRAMMwtBkgEhEAwyC0GTASEQDDELQZQBIRAMMAtBlQEhEAwvC0GWASEQDC4LQZcBIRAMLQtBmAEhEAwsC0GZASEQDCsLQZoBIRAMKgtBmwEhEAwpC0GcASEQDCgLQZ0BIRAMJwtBngEhEAwmC0GfASEQDCULQaABIRAMJAtBoQEhEAwjC0GiASEQDCILQaMBIRAMIQtBpAEhEAwgC0GlASEQDB8LQaYBIRAMHgtBpwEhEAwdC0GoASEQDBwLQakBIRAMGwtBqgEhEAwaC0GrASEQDBkLQawBIRAMGAtBrQEhEAwXC0GuASEQDBYLQQEhEAwVC0GvASEQDBQLQbABIRAMEwtBsQEhEAwSC0GzASEQDBELQbIBIRAMEAtBtAEhEAwPC0G1ASEQDA4LQbYBIRAMDQtBtwEhEAwMC0G4ASEQDAsLQbkBIRAMCgtBugEhEAwJC0G7ASEQDAgLQcYBIRAMBwtBvAEhEAwGC0G9ASEQDAULQb4BIRAMBAtBvwEhEAwDC0HAASEQDAILQcIBIRAMAQtBwQEhEAsDQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAOxwEAAQID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YWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsb3NlZWVwLWFsaXZlAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgAAAAAAAAAAAAAAAAAAAHJhbnNmZXItZW5jb2RpbmdwZ3JhZGUNCg0KDQpTTQ0KDQpUVFAvQ0UvVFNQLwAAAAAAAAAAAAAAAAECAAEDAAAAAAAAAAAAAAAAAAAAAAAABAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAABAAACAAAAAAAAAAAAAAAAAAAAAAAAAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAgAAAAACAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw=="; + return llhttp_simdWasm; +} +var client; +var hasRequiredClient; +function requireClient() { + if (hasRequiredClient) return client; + hasRequiredClient = 1; + const assert = require$$0$9; + const net = require$$0$a; + const http = require$$2$1; + const { pipeline } = require$$0$b; + const util2 = requireUtil$6(); + const timers2 = requireTimers(); + const Request = requireRequest$1(); + const DispatcherBase = requireDispatcherBase(); + const { + RequestContentLengthMismatchError, + ResponseContentLengthMismatchError, + InvalidArgumentError, + RequestAbortedError, + HeadersTimeoutError, + HeadersOverflowError, + SocketError, + InformationalError, + BodyTimeoutError, + HTTPParserError, + ResponseExceededMaxSizeError, + ClientDestroyedError + } = requireErrors(); + const buildConnector = requireConnect(); + const { + kUrl, + kReset, + kServerName, + kClient, + kBusy, + kParser, + kConnect, + kBlocking, + kResuming, + kRunning, + kPending, + kSize, + kWriting, + kQueue, + kConnected, + kConnecting, + kNeedDrain, + kNoRef, + kKeepAliveDefaultTimeout, + kHostHeader, + kPendingIdx, + kRunningIdx, + kError, + kPipelining, + kSocket, + kKeepAliveTimeoutValue, + kMaxHeadersSize, + kKeepAliveMaxTimeout, + kKeepAliveTimeoutThreshold, + kHeadersTimeout, + kBodyTimeout, + kStrictContentLength, + kConnector, + kMaxRedirections, + kMaxRequests, + kCounter, + kClose, + kDestroy, + kDispatch, + kInterceptors, + kLocalAddress, + kMaxResponseSize, + kHTTPConnVersion, + // HTTP2 + kHost, + kHTTP2Session, + kHTTP2SessionState, + kHTTP2BuildRequest, + kHTTP2CopyHeaders, + kHTTP1BuildRequest + } = requireSymbols$4(); + let http2; + try { + http2 = require("http2"); + } catch { + http2 = { constants: {} }; + } + const { + constants: { + HTTP2_HEADER_AUTHORITY, + HTTP2_HEADER_METHOD, + HTTP2_HEADER_PATH, + HTTP2_HEADER_SCHEME, + HTTP2_HEADER_CONTENT_LENGTH, + HTTP2_HEADER_EXPECT, + HTTP2_HEADER_STATUS + } + } = http2; + let h2ExperimentalWarned = false; + const FastBuffer = Buffer[Symbol.species]; + const kClosedResolve = /* @__PURE__ */ Symbol("kClosedResolve"); + const channels = {}; + try { + const diagnosticsChannel = require("diagnostics_channel"); + channels.sendHeaders = diagnosticsChannel.channel("undici:client:sendHeaders"); + channels.beforeConnect = diagnosticsChannel.channel("undici:client:beforeConnect"); + channels.connectError = diagnosticsChannel.channel("undici:client:connectError"); + channels.connected = diagnosticsChannel.channel("undici:client:connected"); + } catch { + channels.sendHeaders = { hasSubscribers: false }; + channels.beforeConnect = { hasSubscribers: false }; + channels.connectError = { hasSubscribers: false }; + channels.connected = { hasSubscribers: false }; + } + class Client extends DispatcherBase { + /** + * + * @param {string|URL} url + * @param {import('../types/client').Client.Options} options + */ + constructor(url, { + interceptors, + maxHeaderSize, + headersTimeout, + socketTimeout, + requestTimeout, + connectTimeout, + bodyTimeout, + idleTimeout, + keepAlive, + keepAliveTimeout, + maxKeepAliveTimeout, + keepAliveMaxTimeout, + keepAliveTimeoutThreshold, + socketPath, + pipelining, + tls, + strictContentLength, + maxCachedSessions, + maxRedirections, + connect: connect3, + maxRequestsPerClient, + localAddress, + maxResponseSize, + autoSelectFamily, + autoSelectFamilyAttemptTimeout, + // h2 + allowH2, + maxConcurrentStreams + } = {}) { + super(); + if (keepAlive !== void 0) { + throw new InvalidArgumentError("unsupported keepAlive, use pipelining=0 instead"); + } + if (socketTimeout !== void 0) { + throw new InvalidArgumentError("unsupported socketTimeout, use headersTimeout & bodyTimeout instead"); + } + if (requestTimeout !== void 0) { + throw new InvalidArgumentError("unsupported requestTimeout, use headersTimeout & bodyTimeout instead"); + } + if (idleTimeout !== void 0) { + throw new InvalidArgumentError("unsupported idleTimeout, use keepAliveTimeout instead"); + } + if (maxKeepAliveTimeout !== void 0) { + throw new InvalidArgumentError("unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead"); + } + if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) { + throw new InvalidArgumentError("invalid maxHeaderSize"); + } + if (socketPath != null && typeof socketPath !== "string") { + throw new InvalidArgumentError("invalid socketPath"); + } + if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) { + throw new InvalidArgumentError("invalid connectTimeout"); + } + if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) { + throw new InvalidArgumentError("invalid keepAliveTimeout"); + } + if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) { + throw new InvalidArgumentError("invalid keepAliveMaxTimeout"); + } + if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) { + throw new InvalidArgumentError("invalid keepAliveTimeoutThreshold"); + } + if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) { + throw new InvalidArgumentError("headersTimeout must be a positive integer or zero"); + } + if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) { + throw new InvalidArgumentError("bodyTimeout must be a positive integer or zero"); + } + if (connect3 != null && typeof connect3 !== "function" && typeof connect3 !== "object") { + throw new InvalidArgumentError("connect must be a function or an object"); + } + if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { + throw new InvalidArgumentError("maxRedirections must be a positive number"); + } + if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { + throw new InvalidArgumentError("maxRequestsPerClient must be a positive number"); + } + if (localAddress != null && (typeof localAddress !== "string" || net.isIP(localAddress) === 0)) { + throw new InvalidArgumentError("localAddress must be valid string IP address"); + } + if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) { + throw new InvalidArgumentError("maxResponseSize must be a positive number"); + } + if (autoSelectFamilyAttemptTimeout != null && (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1)) { + throw new InvalidArgumentError("autoSelectFamilyAttemptTimeout must be a positive number"); + } + if (allowH2 != null && typeof allowH2 !== "boolean") { + throw new InvalidArgumentError("allowH2 must be a valid boolean value"); + } + if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== "number" || maxConcurrentStreams < 1)) { + throw new InvalidArgumentError("maxConcurrentStreams must be a possitive integer, greater than 0"); + } + if (typeof connect3 !== "function") { + connect3 = buildConnector({ + ...tls, + maxCachedSessions, + allowH2, + socketPath, + timeout: connectTimeout, + ...util2.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0, + ...connect3 + }); + } + this[kInterceptors] = interceptors && interceptors.Client && Array.isArray(interceptors.Client) ? interceptors.Client : [createRedirectInterceptor({ maxRedirections })]; + this[kUrl] = util2.parseOrigin(url); + this[kConnector] = connect3; + this[kSocket] = null; + this[kPipelining] = pipelining != null ? pipelining : 1; + this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize; + this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout; + this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 6e5 : keepAliveMaxTimeout; + this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 1e3 : keepAliveTimeoutThreshold; + this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout]; + this[kServerName] = null; + this[kLocalAddress] = localAddress != null ? localAddress : null; + this[kResuming] = 0; + this[kNeedDrain] = 0; + this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ""}\r +`; + this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 3e5; + this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 3e5; + this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength; + this[kMaxRedirections] = maxRedirections; + this[kMaxRequests] = maxRequestsPerClient; + this[kClosedResolve] = null; + this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1; + this[kHTTPConnVersion] = "h1"; + this[kHTTP2Session] = null; + this[kHTTP2SessionState] = !allowH2 ? null : { + // streams: null, // Fixed queue of streams - For future support of `push` + openStreams: 0, + // Keep track of them to decide wether or not unref the session + maxConcurrentStreams: maxConcurrentStreams != null ? maxConcurrentStreams : 100 + // Max peerConcurrentStreams for a Node h2 server + }; + this[kHost] = `${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ""}`; + this[kQueue] = []; + this[kRunningIdx] = 0; + this[kPendingIdx] = 0; + } + get pipelining() { + return this[kPipelining]; + } + set pipelining(value) { + this[kPipelining] = value; + resume(this, true); + } + get [kPending]() { + return this[kQueue].length - this[kPendingIdx]; + } + get [kRunning]() { + return this[kPendingIdx] - this[kRunningIdx]; + } + get [kSize]() { + return this[kQueue].length - this[kRunningIdx]; + } + get [kConnected]() { + return !!this[kSocket] && !this[kConnecting] && !this[kSocket].destroyed; + } + get [kBusy]() { + const socket = this[kSocket]; + return socket && (socket[kReset] || socket[kWriting] || socket[kBlocking]) || this[kSize] >= (this[kPipelining] || 1) || this[kPending] > 0; + } + /* istanbul ignore: only used for test */ + [kConnect](cb) { + connect2(this); + this.once("connect", cb); + } + [kDispatch](opts, handler2) { + const origin = opts.origin || this[kUrl].origin; + const request2 = this[kHTTPConnVersion] === "h2" ? Request[kHTTP2BuildRequest](origin, opts, handler2) : Request[kHTTP1BuildRequest](origin, opts, handler2); + this[kQueue].push(request2); + if (this[kResuming]) ; + else if (util2.bodyLength(request2.body) == null && util2.isIterable(request2.body)) { + this[kResuming] = 1; + process.nextTick(resume, this); + } else { + resume(this, true); + } + if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) { + this[kNeedDrain] = 2; + } + return this[kNeedDrain] < 2; + } + async [kClose]() { + return new Promise((resolve) => { + if (!this[kSize]) { + resolve(null); + } else { + this[kClosedResolve] = resolve; + } + }); + } + async [kDestroy](err) { + return new Promise((resolve) => { + const requests = this[kQueue].splice(this[kPendingIdx]); + for (let i = 0; i < requests.length; i++) { + const request2 = requests[i]; + errorRequest(this, request2, err); + } + const callback = () => { + if (this[kClosedResolve]) { + this[kClosedResolve](); + this[kClosedResolve] = null; + } + resolve(); + }; + if (this[kHTTP2Session] != null) { + util2.destroy(this[kHTTP2Session], err); + this[kHTTP2Session] = null; + this[kHTTP2SessionState] = null; + } + if (!this[kSocket]) { + queueMicrotask(callback); + } else { + util2.destroy(this[kSocket].on("close", callback), err); + } + resume(this); + }); + } + } + function onHttp2SessionError(err) { + assert(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); + this[kSocket][kError] = err; + onError(this[kClient], err); + } + function onHttp2FrameError(type, code, id) { + const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`); + if (id === 0) { + this[kSocket][kError] = err; + onError(this[kClient], err); + } + } + function onHttp2SessionEnd() { + util2.destroy(this, new SocketError("other side closed")); + util2.destroy(this[kSocket], new SocketError("other side closed")); + } + function onHTTP2GoAway(code) { + const client2 = this[kClient]; + const err = new InformationalError(`HTTP/2: "GOAWAY" frame received with code ${code}`); + client2[kSocket] = null; + client2[kHTTP2Session] = null; + if (client2.destroyed) { + assert(this[kPending] === 0); + const requests = client2[kQueue].splice(client2[kRunningIdx]); + for (let i = 0; i < requests.length; i++) { + const request2 = requests[i]; + errorRequest(this, request2, err); + } + } else if (client2[kRunning] > 0) { + const request2 = client2[kQueue][client2[kRunningIdx]]; + client2[kQueue][client2[kRunningIdx]++] = null; + errorRequest(client2, request2, err); + } + client2[kPendingIdx] = client2[kRunningIdx]; + assert(client2[kRunning] === 0); + client2.emit( + "disconnect", + client2[kUrl], + [client2], + err + ); + resume(client2); + } + const constants2 = requireConstants$2(); + const createRedirectInterceptor = requireRedirectInterceptor(); + const EMPTY_BUF = Buffer.alloc(0); + async function lazyllhttp() { + const llhttpWasmData = process.env.JEST_WORKER_ID ? requireLlhttpWasm() : void 0; + let mod; + try { + mod = await WebAssembly.compile(Buffer.from(requireLlhttp_simdWasm(), "base64")); + } catch (e) { + mod = await WebAssembly.compile(Buffer.from(llhttpWasmData || requireLlhttpWasm(), "base64")); + } + return await WebAssembly.instantiate(mod, { + env: { + /* eslint-disable camelcase */ + wasm_on_url: (p, at, len) => { + return 0; + }, + wasm_on_status: (p, at, len) => { + assert.strictEqual(currentParser.ptr, p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; + }, + wasm_on_message_begin: (p) => { + assert.strictEqual(currentParser.ptr, p); + return currentParser.onMessageBegin() || 0; + }, + wasm_on_header_field: (p, at, len) => { + assert.strictEqual(currentParser.ptr, p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; + }, + wasm_on_header_value: (p, at, len) => { + assert.strictEqual(currentParser.ptr, p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; + }, + wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => { + assert.strictEqual(currentParser.ptr, p); + return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0; + }, + wasm_on_body: (p, at, len) => { + assert.strictEqual(currentParser.ptr, p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; + }, + wasm_on_message_complete: (p) => { + assert.strictEqual(currentParser.ptr, p); + return currentParser.onMessageComplete() || 0; + } + /* eslint-enable camelcase */ + } + }); + } + let llhttpInstance = null; + let llhttpPromise = lazyllhttp(); + llhttpPromise.catch(); + let currentParser = null; + let currentBufferRef = null; + let currentBufferSize = 0; + let currentBufferPtr = null; + const TIMEOUT_HEADERS = 1; + const TIMEOUT_BODY = 2; + const TIMEOUT_IDLE = 3; + class Parser { + constructor(client2, socket, { exports: exports$1 }) { + assert(Number.isFinite(client2[kMaxHeadersSize]) && client2[kMaxHeadersSize] > 0); + this.llhttp = exports$1; + this.ptr = this.llhttp.llhttp_alloc(constants2.TYPE.RESPONSE); + this.client = client2; + this.socket = socket; + this.timeout = null; + this.timeoutValue = null; + this.timeoutType = null; + this.statusCode = null; + this.statusText = ""; + this.upgrade = false; + this.headers = []; + this.headersSize = 0; + this.headersMaxSize = client2[kMaxHeadersSize]; + this.shouldKeepAlive = false; + this.paused = false; + this.resume = this.resume.bind(this); + this.bytesRead = 0; + this.keepAlive = ""; + this.contentLength = ""; + this.connection = ""; + this.maxResponseSize = client2[kMaxResponseSize]; + } + setTimeout(value, type) { + this.timeoutType = type; + if (value !== this.timeoutValue) { + timers2.clearTimeout(this.timeout); + if (value) { + this.timeout = timers2.setTimeout(onParserTimeout, value, this); + if (this.timeout.unref) { + this.timeout.unref(); + } + } else { + this.timeout = null; + } + this.timeoutValue = value; + } else if (this.timeout) { + if (this.timeout.refresh) { + this.timeout.refresh(); + } + } + } + resume() { + if (this.socket.destroyed || !this.paused) { + return; + } + assert(this.ptr != null); + assert(currentParser == null); + this.llhttp.llhttp_resume(this.ptr); + assert(this.timeoutType === TIMEOUT_BODY); + if (this.timeout) { + if (this.timeout.refresh) { + this.timeout.refresh(); + } + } + this.paused = false; + this.execute(this.socket.read() || EMPTY_BUF); + this.readMore(); + } + readMore() { + while (!this.paused && this.ptr) { + const chunk = this.socket.read(); + if (chunk === null) { + break; + } + this.execute(chunk); + } + } + execute(data) { + assert(this.ptr != null); + assert(currentParser == null); + assert(!this.paused); + const { socket, llhttp } = this; + if (data.length > currentBufferSize) { + if (currentBufferPtr) { + llhttp.free(currentBufferPtr); + } + currentBufferSize = Math.ceil(data.length / 4096) * 4096; + currentBufferPtr = llhttp.malloc(currentBufferSize); + } + new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data); + try { + let ret; + try { + currentBufferRef = data; + currentParser = this; + ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length); + } catch (err) { + throw err; + } finally { + currentParser = null; + currentBufferRef = null; + } + const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr; + if (ret === constants2.ERROR.PAUSED_UPGRADE) { + this.onUpgrade(data.slice(offset)); + } else if (ret === constants2.ERROR.PAUSED) { + this.paused = true; + socket.unshift(data.slice(offset)); + } else if (ret !== constants2.ERROR.OK) { + const ptr = llhttp.llhttp_get_error_reason(this.ptr); + let message = ""; + if (ptr) { + const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0); + message = "Response does not match the HTTP/1.1 protocol (" + Buffer.from(llhttp.memory.buffer, ptr, len).toString() + ")"; + } + throw new HTTPParserError(message, constants2.ERROR[ret], data.slice(offset)); + } + } catch (err) { + util2.destroy(socket, err); + } + } + destroy() { + assert(this.ptr != null); + assert(currentParser == null); + this.llhttp.llhttp_free(this.ptr); + this.ptr = null; + timers2.clearTimeout(this.timeout); + this.timeout = null; + this.timeoutValue = null; + this.timeoutType = null; + this.paused = false; + } + onStatus(buf) { + this.statusText = buf.toString(); + } + onMessageBegin() { + const { socket, client: client2 } = this; + if (socket.destroyed) { + return -1; + } + const request2 = client2[kQueue][client2[kRunningIdx]]; + if (!request2) { + return -1; + } + } + onHeaderField(buf) { + const len = this.headers.length; + if ((len & 1) === 0) { + this.headers.push(buf); + } else { + this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); + } + this.trackHeader(buf.length); + } + onHeaderValue(buf) { + let len = this.headers.length; + if ((len & 1) === 1) { + this.headers.push(buf); + len += 1; + } else { + this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); + } + const key = this.headers[len - 2]; + if (key.length === 10 && key.toString().toLowerCase() === "keep-alive") { + this.keepAlive += buf.toString(); + } else if (key.length === 10 && key.toString().toLowerCase() === "connection") { + this.connection += buf.toString(); + } else if (key.length === 14 && key.toString().toLowerCase() === "content-length") { + this.contentLength += buf.toString(); + } + this.trackHeader(buf.length); + } + trackHeader(len) { + this.headersSize += len; + if (this.headersSize >= this.headersMaxSize) { + util2.destroy(this.socket, new HeadersOverflowError()); + } + } + onUpgrade(head) { + const { upgrade, client: client2, socket, headers: headers2, statusCode } = this; + assert(upgrade); + const request2 = client2[kQueue][client2[kRunningIdx]]; + assert(request2); + assert(!socket.destroyed); + assert(socket === client2[kSocket]); + assert(!this.paused); + assert(request2.upgrade || request2.method === "CONNECT"); + this.statusCode = null; + this.statusText = ""; + this.shouldKeepAlive = null; + assert(this.headers.length % 2 === 0); + this.headers = []; + this.headersSize = 0; + socket.unshift(head); + socket[kParser].destroy(); + socket[kParser] = null; + socket[kClient] = null; + socket[kError] = null; + socket.removeListener("error", onSocketError).removeListener("readable", onSocketReadable).removeListener("end", onSocketEnd).removeListener("close", onSocketClose); + client2[kSocket] = null; + client2[kQueue][client2[kRunningIdx]++] = null; + client2.emit("disconnect", client2[kUrl], [client2], new InformationalError("upgrade")); + try { + request2.onUpgrade(statusCode, headers2, socket); + } catch (err) { + util2.destroy(socket, err); + } + resume(client2); + } + onHeadersComplete(statusCode, upgrade, shouldKeepAlive) { + const { client: client2, socket, headers: headers2, statusText } = this; + if (socket.destroyed) { + return -1; + } + const request2 = client2[kQueue][client2[kRunningIdx]]; + if (!request2) { + return -1; + } + assert(!this.upgrade); + assert(this.statusCode < 200); + if (statusCode === 100) { + util2.destroy(socket, new SocketError("bad response", util2.getSocketInfo(socket))); + return -1; + } + if (upgrade && !request2.upgrade) { + util2.destroy(socket, new SocketError("bad upgrade", util2.getSocketInfo(socket))); + return -1; + } + assert.strictEqual(this.timeoutType, TIMEOUT_HEADERS); + this.statusCode = statusCode; + this.shouldKeepAlive = shouldKeepAlive || // Override llhttp value which does not allow keepAlive for HEAD. + request2.method === "HEAD" && !socket[kReset] && this.connection.toLowerCase() === "keep-alive"; + if (this.statusCode >= 200) { + const bodyTimeout = request2.bodyTimeout != null ? request2.bodyTimeout : client2[kBodyTimeout]; + this.setTimeout(bodyTimeout, TIMEOUT_BODY); + } else if (this.timeout) { + if (this.timeout.refresh) { + this.timeout.refresh(); + } + } + if (request2.method === "CONNECT") { + assert(client2[kRunning] === 1); + this.upgrade = true; + return 2; + } + if (upgrade) { + assert(client2[kRunning] === 1); + this.upgrade = true; + return 2; + } + assert(this.headers.length % 2 === 0); + this.headers = []; + this.headersSize = 0; + if (this.shouldKeepAlive && client2[kPipelining]) { + const keepAliveTimeout = this.keepAlive ? util2.parseKeepAliveTimeout(this.keepAlive) : null; + if (keepAliveTimeout != null) { + const timeout = Math.min( + keepAliveTimeout - client2[kKeepAliveTimeoutThreshold], + client2[kKeepAliveMaxTimeout] + ); + if (timeout <= 0) { + socket[kReset] = true; + } else { + client2[kKeepAliveTimeoutValue] = timeout; + } + } else { + client2[kKeepAliveTimeoutValue] = client2[kKeepAliveDefaultTimeout]; + } + } else { + socket[kReset] = true; + } + const pause = request2.onHeaders(statusCode, headers2, this.resume, statusText) === false; + if (request2.aborted) { + return -1; + } + if (request2.method === "HEAD") { + return 1; + } + if (statusCode < 200) { + return 1; + } + if (socket[kBlocking]) { + socket[kBlocking] = false; + resume(client2); + } + return pause ? constants2.ERROR.PAUSED : 0; + } + onBody(buf) { + const { client: client2, socket, statusCode, maxResponseSize } = this; + if (socket.destroyed) { + return -1; + } + const request2 = client2[kQueue][client2[kRunningIdx]]; + assert(request2); + assert.strictEqual(this.timeoutType, TIMEOUT_BODY); + if (this.timeout) { + if (this.timeout.refresh) { + this.timeout.refresh(); + } + } + assert(statusCode >= 200); + if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) { + util2.destroy(socket, new ResponseExceededMaxSizeError()); + return -1; + } + this.bytesRead += buf.length; + if (request2.onData(buf) === false) { + return constants2.ERROR.PAUSED; + } + } + onMessageComplete() { + const { client: client2, socket, statusCode, upgrade, headers: headers2, contentLength, bytesRead, shouldKeepAlive } = this; + if (socket.destroyed && (!statusCode || shouldKeepAlive)) { + return -1; + } + if (upgrade) { + return; + } + const request2 = client2[kQueue][client2[kRunningIdx]]; + assert(request2); + assert(statusCode >= 100); + this.statusCode = null; + this.statusText = ""; + this.bytesRead = 0; + this.contentLength = ""; + this.keepAlive = ""; + this.connection = ""; + assert(this.headers.length % 2 === 0); + this.headers = []; + this.headersSize = 0; + if (statusCode < 200) { + return; + } + if (request2.method !== "HEAD" && contentLength && bytesRead !== parseInt(contentLength, 10)) { + util2.destroy(socket, new ResponseContentLengthMismatchError()); + return -1; + } + request2.onComplete(headers2); + client2[kQueue][client2[kRunningIdx]++] = null; + if (socket[kWriting]) { + assert.strictEqual(client2[kRunning], 0); + util2.destroy(socket, new InformationalError("reset")); + return constants2.ERROR.PAUSED; + } else if (!shouldKeepAlive) { + util2.destroy(socket, new InformationalError("reset")); + return constants2.ERROR.PAUSED; + } else if (socket[kReset] && client2[kRunning] === 0) { + util2.destroy(socket, new InformationalError("reset")); + return constants2.ERROR.PAUSED; + } else if (client2[kPipelining] === 1) { + setImmediate(resume, client2); + } else { + resume(client2); + } + } + } + function onParserTimeout(parser) { + const { socket, timeoutType, client: client2 } = parser; + if (timeoutType === TIMEOUT_HEADERS) { + if (!socket[kWriting] || socket.writableNeedDrain || client2[kRunning] > 1) { + assert(!parser.paused, "cannot be paused while waiting for headers"); + util2.destroy(socket, new HeadersTimeoutError()); + } + } else if (timeoutType === TIMEOUT_BODY) { + if (!parser.paused) { + util2.destroy(socket, new BodyTimeoutError()); + } + } else if (timeoutType === TIMEOUT_IDLE) { + assert(client2[kRunning] === 0 && client2[kKeepAliveTimeoutValue]); + util2.destroy(socket, new InformationalError("socket idle timeout")); + } + } + function onSocketReadable() { + const { [kParser]: parser } = this; + if (parser) { + parser.readMore(); + } + } + function onSocketError(err) { + const { [kClient]: client2, [kParser]: parser } = this; + assert(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); + if (client2[kHTTPConnVersion] !== "h2") { + if (err.code === "ECONNRESET" && parser.statusCode && !parser.shouldKeepAlive) { + parser.onMessageComplete(); + return; + } + } + this[kError] = err; + onError(this[kClient], err); + } + function onError(client2, err) { + if (client2[kRunning] === 0 && err.code !== "UND_ERR_INFO" && err.code !== "UND_ERR_SOCKET") { + assert(client2[kPendingIdx] === client2[kRunningIdx]); + const requests = client2[kQueue].splice(client2[kRunningIdx]); + for (let i = 0; i < requests.length; i++) { + const request2 = requests[i]; + errorRequest(client2, request2, err); + } + assert(client2[kSize] === 0); + } + } + function onSocketEnd() { + const { [kParser]: parser, [kClient]: client2 } = this; + if (client2[kHTTPConnVersion] !== "h2") { + if (parser.statusCode && !parser.shouldKeepAlive) { + parser.onMessageComplete(); + return; + } + } + util2.destroy(this, new SocketError("other side closed", util2.getSocketInfo(this))); + } + function onSocketClose() { + const { [kClient]: client2, [kParser]: parser } = this; + if (client2[kHTTPConnVersion] === "h1" && parser) { + if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { + parser.onMessageComplete(); + } + this[kParser].destroy(); + this[kParser] = null; + } + const err = this[kError] || new SocketError("closed", util2.getSocketInfo(this)); + client2[kSocket] = null; + if (client2.destroyed) { + assert(client2[kPending] === 0); + const requests = client2[kQueue].splice(client2[kRunningIdx]); + for (let i = 0; i < requests.length; i++) { + const request2 = requests[i]; + errorRequest(client2, request2, err); + } + } else if (client2[kRunning] > 0 && err.code !== "UND_ERR_INFO") { + const request2 = client2[kQueue][client2[kRunningIdx]]; + client2[kQueue][client2[kRunningIdx]++] = null; + errorRequest(client2, request2, err); + } + client2[kPendingIdx] = client2[kRunningIdx]; + assert(client2[kRunning] === 0); + client2.emit("disconnect", client2[kUrl], [client2], err); + resume(client2); + } + async function connect2(client2) { + assert(!client2[kConnecting]); + assert(!client2[kSocket]); + let { host, hostname, protocol, port } = client2[kUrl]; + if (hostname[0] === "[") { + const idx = hostname.indexOf("]"); + assert(idx !== -1); + const ip = hostname.substring(1, idx); + assert(net.isIP(ip)); + hostname = ip; + } + client2[kConnecting] = true; + if (channels.beforeConnect.hasSubscribers) { + channels.beforeConnect.publish({ + connectParams: { + host, + hostname, + protocol, + port, + servername: client2[kServerName], + localAddress: client2[kLocalAddress] + }, + connector: client2[kConnector] + }); + } + try { + const socket = await new Promise((resolve, reject) => { + client2[kConnector]({ + host, + hostname, + protocol, + port, + servername: client2[kServerName], + localAddress: client2[kLocalAddress] + }, (err, socket2) => { + if (err) { + reject(err); + } else { + resolve(socket2); + } + }); + }); + if (client2.destroyed) { + util2.destroy(socket.on("error", () => { + }), new ClientDestroyedError()); + return; + } + client2[kConnecting] = false; + assert(socket); + const isH2 = socket.alpnProtocol === "h2"; + if (isH2) { + if (!h2ExperimentalWarned) { + h2ExperimentalWarned = true; + process.emitWarning("H2 support is experimental, expect them to change at any time.", { + code: "UNDICI-H2" + }); + } + const session = http2.connect(client2[kUrl], { + createConnection: () => socket, + peerMaxConcurrentStreams: client2[kHTTP2SessionState].maxConcurrentStreams + }); + client2[kHTTPConnVersion] = "h2"; + session[kClient] = client2; + session[kSocket] = socket; + session.on("error", onHttp2SessionError); + session.on("frameError", onHttp2FrameError); + session.on("end", onHttp2SessionEnd); + session.on("goaway", onHTTP2GoAway); + session.on("close", onSocketClose); + session.unref(); + client2[kHTTP2Session] = session; + socket[kHTTP2Session] = session; + } else { + if (!llhttpInstance) { + llhttpInstance = await llhttpPromise; + llhttpPromise = null; + } + socket[kNoRef] = false; + socket[kWriting] = false; + socket[kReset] = false; + socket[kBlocking] = false; + socket[kParser] = new Parser(client2, socket, llhttpInstance); + } + socket[kCounter] = 0; + socket[kMaxRequests] = client2[kMaxRequests]; + socket[kClient] = client2; + socket[kError] = null; + socket.on("error", onSocketError).on("readable", onSocketReadable).on("end", onSocketEnd).on("close", onSocketClose); + client2[kSocket] = socket; + if (channels.connected.hasSubscribers) { + channels.connected.publish({ + connectParams: { + host, + hostname, + protocol, + port, + servername: client2[kServerName], + localAddress: client2[kLocalAddress] + }, + connector: client2[kConnector], + socket + }); + } + client2.emit("connect", client2[kUrl], [client2]); + } catch (err) { + if (client2.destroyed) { + return; + } + client2[kConnecting] = false; + if (channels.connectError.hasSubscribers) { + channels.connectError.publish({ + connectParams: { + host, + hostname, + protocol, + port, + servername: client2[kServerName], + localAddress: client2[kLocalAddress] + }, + connector: client2[kConnector], + error: err + }); + } + if (err.code === "ERR_TLS_CERT_ALTNAME_INVALID") { + assert(client2[kRunning] === 0); + while (client2[kPending] > 0 && client2[kQueue][client2[kPendingIdx]].servername === client2[kServerName]) { + const request2 = client2[kQueue][client2[kPendingIdx]++]; + errorRequest(client2, request2, err); + } + } else { + onError(client2, err); + } + client2.emit("connectionError", client2[kUrl], [client2], err); + } + resume(client2); + } + function emitDrain(client2) { + client2[kNeedDrain] = 0; + client2.emit("drain", client2[kUrl], [client2]); + } + function resume(client2, sync) { + if (client2[kResuming] === 2) { + return; + } + client2[kResuming] = 2; + _resume(client2, sync); + client2[kResuming] = 0; + if (client2[kRunningIdx] > 256) { + client2[kQueue].splice(0, client2[kRunningIdx]); + client2[kPendingIdx] -= client2[kRunningIdx]; + client2[kRunningIdx] = 0; + } + } + function _resume(client2, sync) { + while (true) { + if (client2.destroyed) { + assert(client2[kPending] === 0); + return; + } + if (client2[kClosedResolve] && !client2[kSize]) { + client2[kClosedResolve](); + client2[kClosedResolve] = null; + return; + } + const socket = client2[kSocket]; + if (socket && !socket.destroyed && socket.alpnProtocol !== "h2") { + if (client2[kSize] === 0) { + if (!socket[kNoRef] && socket.unref) { + socket.unref(); + socket[kNoRef] = true; + } + } else if (socket[kNoRef] && socket.ref) { + socket.ref(); + socket[kNoRef] = false; + } + if (client2[kSize] === 0) { + if (socket[kParser].timeoutType !== TIMEOUT_IDLE) { + socket[kParser].setTimeout(client2[kKeepAliveTimeoutValue], TIMEOUT_IDLE); + } + } else if (client2[kRunning] > 0 && socket[kParser].statusCode < 200) { + if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) { + const request3 = client2[kQueue][client2[kRunningIdx]]; + const headersTimeout = request3.headersTimeout != null ? request3.headersTimeout : client2[kHeadersTimeout]; + socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS); + } + } + } + if (client2[kBusy]) { + client2[kNeedDrain] = 2; + } else if (client2[kNeedDrain] === 2) { + if (sync) { + client2[kNeedDrain] = 1; + process.nextTick(emitDrain, client2); + } else { + emitDrain(client2); + } + continue; + } + if (client2[kPending] === 0) { + return; + } + if (client2[kRunning] >= (client2[kPipelining] || 1)) { + return; + } + const request2 = client2[kQueue][client2[kPendingIdx]]; + if (client2[kUrl].protocol === "https:" && client2[kServerName] !== request2.servername) { + if (client2[kRunning] > 0) { + return; + } + client2[kServerName] = request2.servername; + if (socket && socket.servername !== request2.servername) { + util2.destroy(socket, new InformationalError("servername changed")); + return; + } + } + if (client2[kConnecting]) { + return; + } + if (!socket && !client2[kHTTP2Session]) { + connect2(client2); + return; + } + if (socket.destroyed || socket[kWriting] || socket[kReset] || socket[kBlocking]) { + return; + } + if (client2[kRunning] > 0 && !request2.idempotent) { + return; + } + if (client2[kRunning] > 0 && (request2.upgrade || request2.method === "CONNECT")) { + return; + } + if (client2[kRunning] > 0 && util2.bodyLength(request2.body) !== 0 && (util2.isStream(request2.body) || util2.isAsyncIterable(request2.body))) { + return; + } + if (!request2.aborted && write(client2, request2)) { + client2[kPendingIdx]++; + } else { + client2[kQueue].splice(client2[kPendingIdx], 1); + } + } + } + function shouldSendContentLength(method) { + return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT"; + } + function write(client2, request2) { + if (client2[kHTTPConnVersion] === "h2") { + writeH2(client2, client2[kHTTP2Session], request2); + return; + } + const { body: body2, method, path, host, upgrade, headers: headers2, blocking, reset } = request2; + const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH"; + if (body2 && typeof body2.read === "function") { + body2.read(0); + } + const bodyLength = util2.bodyLength(body2); + let contentLength = bodyLength; + if (contentLength === null) { + contentLength = request2.contentLength; + } + if (contentLength === 0 && !expectsPayload) { + contentLength = null; + } + if (shouldSendContentLength(method) && contentLength > 0 && request2.contentLength !== null && request2.contentLength !== contentLength) { + if (client2[kStrictContentLength]) { + errorRequest(client2, request2, new RequestContentLengthMismatchError()); + return false; + } + process.emitWarning(new RequestContentLengthMismatchError()); + } + const socket = client2[kSocket]; + try { + request2.onConnect((err) => { + if (request2.aborted || request2.completed) { + return; + } + errorRequest(client2, request2, err || new RequestAbortedError()); + util2.destroy(socket, new InformationalError("aborted")); + }); + } catch (err) { + errorRequest(client2, request2, err); + } + if (request2.aborted) { + return false; + } + if (method === "HEAD") { + socket[kReset] = true; + } + if (upgrade || method === "CONNECT") { + socket[kReset] = true; + } + if (reset != null) { + socket[kReset] = reset; + } + if (client2[kMaxRequests] && socket[kCounter]++ >= client2[kMaxRequests]) { + socket[kReset] = true; + } + if (blocking) { + socket[kBlocking] = true; + } + let header = `${method} ${path} HTTP/1.1\r +`; + if (typeof host === "string") { + header += `host: ${host}\r +`; + } else { + header += client2[kHostHeader]; + } + if (upgrade) { + header += `connection: upgrade\r +upgrade: ${upgrade}\r +`; + } else if (client2[kPipelining] && !socket[kReset]) { + header += "connection: keep-alive\r\n"; + } else { + header += "connection: close\r\n"; + } + if (headers2) { + header += headers2; + } + if (channels.sendHeaders.hasSubscribers) { + channels.sendHeaders.publish({ request: request2, headers: header, socket }); + } + if (!body2 || bodyLength === 0) { + if (contentLength === 0) { + socket.write(`${header}content-length: 0\r +\r +`, "latin1"); + } else { + assert(contentLength === null, "no body must not have content length"); + socket.write(`${header}\r +`, "latin1"); + } + request2.onRequestSent(); + } else if (util2.isBuffer(body2)) { + assert(contentLength === body2.byteLength, "buffer body must have content length"); + socket.cork(); + socket.write(`${header}content-length: ${contentLength}\r +\r +`, "latin1"); + socket.write(body2); + socket.uncork(); + request2.onBodySent(body2); + request2.onRequestSent(); + if (!expectsPayload) { + socket[kReset] = true; + } + } else if (util2.isBlobLike(body2)) { + if (typeof body2.stream === "function") { + writeIterable({ body: body2.stream(), client: client2, request: request2, socket, contentLength, header, expectsPayload }); + } else { + writeBlob({ body: body2, client: client2, request: request2, socket, contentLength, header, expectsPayload }); + } + } else if (util2.isStream(body2)) { + writeStream({ body: body2, client: client2, request: request2, socket, contentLength, header, expectsPayload }); + } else if (util2.isIterable(body2)) { + writeIterable({ body: body2, client: client2, request: request2, socket, contentLength, header, expectsPayload }); + } else { + assert(false); + } + return true; + } + function writeH2(client2, session, request2) { + const { body: body2, method, path, host, upgrade, expectContinue, signal, headers: reqHeaders } = request2; + let headers2; + if (typeof reqHeaders === "string") headers2 = Request[kHTTP2CopyHeaders](reqHeaders.trim()); + else headers2 = reqHeaders; + if (upgrade) { + errorRequest(client2, request2, new Error("Upgrade not supported for H2")); + return false; + } + try { + request2.onConnect((err) => { + if (request2.aborted || request2.completed) { + return; + } + errorRequest(client2, request2, err || new RequestAbortedError()); + }); + } catch (err) { + errorRequest(client2, request2, err); + } + if (request2.aborted) { + return false; + } + let stream; + const h2State = client2[kHTTP2SessionState]; + headers2[HTTP2_HEADER_AUTHORITY] = host || client2[kHost]; + headers2[HTTP2_HEADER_METHOD] = method; + if (method === "CONNECT") { + session.ref(); + stream = session.request(headers2, { endStream: false, signal }); + if (stream.id && !stream.pending) { + request2.onUpgrade(null, null, stream); + ++h2State.openStreams; + } else { + stream.once("ready", () => { + request2.onUpgrade(null, null, stream); + ++h2State.openStreams; + }); + } + stream.once("close", () => { + h2State.openStreams -= 1; + if (h2State.openStreams === 0) session.unref(); + }); + return true; + } + headers2[HTTP2_HEADER_PATH] = path; + headers2[HTTP2_HEADER_SCHEME] = "https"; + const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH"; + if (body2 && typeof body2.read === "function") { + body2.read(0); + } + let contentLength = util2.bodyLength(body2); + if (contentLength == null) { + contentLength = request2.contentLength; + } + if (contentLength === 0 || !expectsPayload) { + contentLength = null; + } + if (shouldSendContentLength(method) && contentLength > 0 && request2.contentLength != null && request2.contentLength !== contentLength) { + if (client2[kStrictContentLength]) { + errorRequest(client2, request2, new RequestContentLengthMismatchError()); + return false; + } + process.emitWarning(new RequestContentLengthMismatchError()); + } + if (contentLength != null) { + assert(body2, "no body must not have content length"); + headers2[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}`; + } + session.ref(); + const shouldEndStream = method === "GET" || method === "HEAD"; + if (expectContinue) { + headers2[HTTP2_HEADER_EXPECT] = "100-continue"; + stream = session.request(headers2, { endStream: shouldEndStream, signal }); + stream.once("continue", writeBodyH2); + } else { + stream = session.request(headers2, { + endStream: shouldEndStream, + signal + }); + writeBodyH2(); + } + ++h2State.openStreams; + stream.once("response", (headers3) => { + const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers3; + if (request2.onHeaders(Number(statusCode), realHeaders, stream.resume.bind(stream), "") === false) { + stream.pause(); + } + }); + stream.once("end", () => { + request2.onComplete([]); + }); + stream.on("data", (chunk) => { + if (request2.onData(chunk) === false) { + stream.pause(); + } + }); + stream.once("close", () => { + h2State.openStreams -= 1; + if (h2State.openStreams === 0) { + session.unref(); + } + }); + stream.once("error", function(err) { + if (client2[kHTTP2Session] && !client2[kHTTP2Session].destroyed && !this.closed && !this.destroyed) { + h2State.streams -= 1; + util2.destroy(stream, err); + } + }); + stream.once("frameError", (type, code) => { + const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`); + errorRequest(client2, request2, err); + if (client2[kHTTP2Session] && !client2[kHTTP2Session].destroyed && !this.closed && !this.destroyed) { + h2State.streams -= 1; + util2.destroy(stream, err); + } + }); + return true; + function writeBodyH2() { + if (!body2) { + request2.onRequestSent(); + } else if (util2.isBuffer(body2)) { + assert(contentLength === body2.byteLength, "buffer body must have content length"); + stream.cork(); + stream.write(body2); + stream.uncork(); + stream.end(); + request2.onBodySent(body2); + request2.onRequestSent(); + } else if (util2.isBlobLike(body2)) { + if (typeof body2.stream === "function") { + writeIterable({ + client: client2, + request: request2, + contentLength, + h2stream: stream, + expectsPayload, + body: body2.stream(), + socket: client2[kSocket], + header: "" + }); + } else { + writeBlob({ + body: body2, + client: client2, + request: request2, + contentLength, + expectsPayload, + h2stream: stream, + header: "", + socket: client2[kSocket] + }); + } + } else if (util2.isStream(body2)) { + writeStream({ + body: body2, + client: client2, + request: request2, + contentLength, + expectsPayload, + socket: client2[kSocket], + h2stream: stream, + header: "" + }); + } else if (util2.isIterable(body2)) { + writeIterable({ + body: body2, + client: client2, + request: request2, + contentLength, + expectsPayload, + header: "", + h2stream: stream, + socket: client2[kSocket] + }); + } else { + assert(false); + } + } + } + function writeStream({ h2stream, body: body2, client: client2, request: request2, socket, contentLength, header, expectsPayload }) { + assert(contentLength !== 0 || client2[kRunning] === 0, "stream body cannot be pipelined"); + if (client2[kHTTPConnVersion] === "h2") { + let onPipeData = function(chunk) { + request2.onBodySent(chunk); + }; + const pipe = pipeline( + body2, + h2stream, + (err) => { + if (err) { + util2.destroy(body2, err); + util2.destroy(h2stream, err); + } else { + request2.onRequestSent(); + } + } + ); + pipe.on("data", onPipeData); + pipe.once("end", () => { + pipe.removeListener("data", onPipeData); + util2.destroy(pipe); + }); + return; + } + let finished = false; + const writer = new AsyncWriter({ socket, request: request2, contentLength, client: client2, expectsPayload, header }); + const onData = function(chunk) { + if (finished) { + return; + } + try { + if (!writer.write(chunk) && this.pause) { + this.pause(); + } + } catch (err) { + util2.destroy(this, err); + } + }; + const onDrain = function() { + if (finished) { + return; + } + if (body2.resume) { + body2.resume(); + } + }; + const onAbort = function() { + if (finished) { + return; + } + const err = new RequestAbortedError(); + queueMicrotask(() => onFinished(err)); + }; + const onFinished = function(err) { + if (finished) { + return; + } + finished = true; + assert(socket.destroyed || socket[kWriting] && client2[kRunning] <= 1); + socket.off("drain", onDrain).off("error", onFinished); + body2.removeListener("data", onData).removeListener("end", onFinished).removeListener("error", onFinished).removeListener("close", onAbort); + if (!err) { + try { + writer.end(); + } catch (er) { + err = er; + } + } + writer.destroy(err); + if (err && (err.code !== "UND_ERR_INFO" || err.message !== "reset")) { + util2.destroy(body2, err); + } else { + util2.destroy(body2); + } + }; + body2.on("data", onData).on("end", onFinished).on("error", onFinished).on("close", onAbort); + if (body2.resume) { + body2.resume(); + } + socket.on("drain", onDrain).on("error", onFinished); + } + async function writeBlob({ h2stream, body: body2, client: client2, request: request2, socket, contentLength, header, expectsPayload }) { + assert(contentLength === body2.size, "blob body must have content length"); + const isH2 = client2[kHTTPConnVersion] === "h2"; + try { + if (contentLength != null && contentLength !== body2.size) { + throw new RequestContentLengthMismatchError(); + } + const buffer = Buffer.from(await body2.arrayBuffer()); + if (isH2) { + h2stream.cork(); + h2stream.write(buffer); + h2stream.uncork(); + } else { + socket.cork(); + socket.write(`${header}content-length: ${contentLength}\r +\r +`, "latin1"); + socket.write(buffer); + socket.uncork(); + } + request2.onBodySent(buffer); + request2.onRequestSent(); + if (!expectsPayload) { + socket[kReset] = true; + } + resume(client2); + } catch (err) { + util2.destroy(isH2 ? h2stream : socket, err); + } + } + async function writeIterable({ h2stream, body: body2, client: client2, request: request2, socket, contentLength, header, expectsPayload }) { + assert(contentLength !== 0 || client2[kRunning] === 0, "iterator body cannot be pipelined"); + let callback = null; + function onDrain() { + if (callback) { + const cb = callback; + callback = null; + cb(); + } + } + const waitForDrain = () => new Promise((resolve, reject) => { + assert(callback === null); + if (socket[kError]) { + reject(socket[kError]); + } else { + callback = resolve; + } + }); + if (client2[kHTTPConnVersion] === "h2") { + h2stream.on("close", onDrain).on("drain", onDrain); + try { + for await (const chunk of body2) { + if (socket[kError]) { + throw socket[kError]; + } + const res = h2stream.write(chunk); + request2.onBodySent(chunk); + if (!res) { + await waitForDrain(); + } + } + } catch (err) { + h2stream.destroy(err); + } finally { + request2.onRequestSent(); + h2stream.end(); + h2stream.off("close", onDrain).off("drain", onDrain); + } + return; + } + socket.on("close", onDrain).on("drain", onDrain); + const writer = new AsyncWriter({ socket, request: request2, contentLength, client: client2, expectsPayload, header }); + try { + for await (const chunk of body2) { + if (socket[kError]) { + throw socket[kError]; + } + if (!writer.write(chunk)) { + await waitForDrain(); + } + } + writer.end(); + } catch (err) { + writer.destroy(err); + } finally { + socket.off("close", onDrain).off("drain", onDrain); + } + } + class AsyncWriter { + constructor({ socket, request: request2, contentLength, client: client2, expectsPayload, header }) { + this.socket = socket; + this.request = request2; + this.contentLength = contentLength; + this.client = client2; + this.bytesWritten = 0; + this.expectsPayload = expectsPayload; + this.header = header; + socket[kWriting] = true; + } + write(chunk) { + const { socket, request: request2, contentLength, client: client2, bytesWritten, expectsPayload, header } = this; + if (socket[kError]) { + throw socket[kError]; + } + if (socket.destroyed) { + return false; + } + const len = Buffer.byteLength(chunk); + if (!len) { + return true; + } + if (contentLength !== null && bytesWritten + len > contentLength) { + if (client2[kStrictContentLength]) { + throw new RequestContentLengthMismatchError(); + } + process.emitWarning(new RequestContentLengthMismatchError()); + } + socket.cork(); + if (bytesWritten === 0) { + if (!expectsPayload) { + socket[kReset] = true; + } + if (contentLength === null) { + socket.write(`${header}transfer-encoding: chunked\r +`, "latin1"); + } else { + socket.write(`${header}content-length: ${contentLength}\r +\r +`, "latin1"); + } + } + if (contentLength === null) { + socket.write(`\r +${len.toString(16)}\r +`, "latin1"); + } + this.bytesWritten += len; + const ret = socket.write(chunk); + socket.uncork(); + request2.onBodySent(chunk); + if (!ret) { + if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { + if (socket[kParser].timeout.refresh) { + socket[kParser].timeout.refresh(); + } + } + } + return ret; + } + end() { + const { socket, contentLength, client: client2, bytesWritten, expectsPayload, header, request: request2 } = this; + request2.onRequestSent(); + socket[kWriting] = false; + if (socket[kError]) { + throw socket[kError]; + } + if (socket.destroyed) { + return; + } + if (bytesWritten === 0) { + if (expectsPayload) { + socket.write(`${header}content-length: 0\r +\r +`, "latin1"); + } else { + socket.write(`${header}\r +`, "latin1"); + } + } else if (contentLength === null) { + socket.write("\r\n0\r\n\r\n", "latin1"); + } + if (contentLength !== null && bytesWritten !== contentLength) { + if (client2[kStrictContentLength]) { + throw new RequestContentLengthMismatchError(); + } else { + process.emitWarning(new RequestContentLengthMismatchError()); + } + } + if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { + if (socket[kParser].timeout.refresh) { + socket[kParser].timeout.refresh(); + } + } + resume(client2); + } + destroy(err) { + const { socket, client: client2 } = this; + socket[kWriting] = false; + if (err) { + assert(client2[kRunning] <= 1, "pipeline should only contain this request"); + util2.destroy(socket, err); + } + } + } + function errorRequest(client2, request2, err) { + try { + request2.onError(err); + assert(request2.aborted); + } catch (err2) { + client2.emit("error", err2); + } + } + client = Client; + return client; +} +var fixedQueue; +var hasRequiredFixedQueue; +function requireFixedQueue() { + if (hasRequiredFixedQueue) return fixedQueue; + hasRequiredFixedQueue = 1; + const kSize = 2048; + const kMask = kSize - 1; + class FixedCircularBuffer { + constructor() { + this.bottom = 0; + this.top = 0; + this.list = new Array(kSize); + this.next = null; + } + isEmpty() { + return this.top === this.bottom; + } + isFull() { + return (this.top + 1 & kMask) === this.bottom; + } + push(data) { + this.list[this.top] = data; + this.top = this.top + 1 & kMask; + } + shift() { + const nextItem = this.list[this.bottom]; + if (nextItem === void 0) + return null; + this.list[this.bottom] = void 0; + this.bottom = this.bottom + 1 & kMask; + return nextItem; + } + } + fixedQueue = class FixedQueue { + constructor() { + this.head = this.tail = new FixedCircularBuffer(); + } + isEmpty() { + return this.head.isEmpty(); + } + push(data) { + if (this.head.isFull()) { + this.head = this.head.next = new FixedCircularBuffer(); + } + this.head.push(data); + } + shift() { + const tail = this.tail; + const next = tail.shift(); + if (tail.isEmpty() && tail.next !== null) { + this.tail = tail.next; + } + return next; + } + }; + return fixedQueue; +} +var poolStats; +var hasRequiredPoolStats; +function requirePoolStats() { + if (hasRequiredPoolStats) return poolStats; + hasRequiredPoolStats = 1; + const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = requireSymbols$4(); + const kPool = /* @__PURE__ */ Symbol("pool"); + class PoolStats { + constructor(pool2) { + this[kPool] = pool2; + } + get connected() { + return this[kPool][kConnected]; + } + get free() { + return this[kPool][kFree]; + } + get pending() { + return this[kPool][kPending]; + } + get queued() { + return this[kPool][kQueued]; + } + get running() { + return this[kPool][kRunning]; + } + get size() { + return this[kPool][kSize]; + } + } + poolStats = PoolStats; + return poolStats; +} +var poolBase; +var hasRequiredPoolBase; +function requirePoolBase() { + if (hasRequiredPoolBase) return poolBase; + hasRequiredPoolBase = 1; + const DispatcherBase = requireDispatcherBase(); + const FixedQueue = requireFixedQueue(); + const { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = requireSymbols$4(); + const PoolStats = requirePoolStats(); + const kClients = /* @__PURE__ */ Symbol("clients"); + const kNeedDrain = /* @__PURE__ */ Symbol("needDrain"); + const kQueue = /* @__PURE__ */ Symbol("queue"); + const kClosedResolve = /* @__PURE__ */ Symbol("closed resolve"); + const kOnDrain = /* @__PURE__ */ Symbol("onDrain"); + const kOnConnect = /* @__PURE__ */ Symbol("onConnect"); + const kOnDisconnect = /* @__PURE__ */ Symbol("onDisconnect"); + const kOnConnectionError = /* @__PURE__ */ Symbol("onConnectionError"); + const kGetDispatcher = /* @__PURE__ */ Symbol("get dispatcher"); + const kAddClient = /* @__PURE__ */ Symbol("add client"); + const kRemoveClient = /* @__PURE__ */ Symbol("remove client"); + const kStats = /* @__PURE__ */ Symbol("stats"); + class PoolBase extends DispatcherBase { + constructor() { + super(); + this[kQueue] = new FixedQueue(); + this[kClients] = []; + this[kQueued] = 0; + const pool2 = this; + this[kOnDrain] = function onDrain(origin, targets) { + const queue = pool2[kQueue]; + let needDrain = false; + while (!needDrain) { + const item = queue.shift(); + if (!item) { + break; + } + pool2[kQueued]--; + needDrain = !this.dispatch(item.opts, item.handler); + } + this[kNeedDrain] = needDrain; + if (!this[kNeedDrain] && pool2[kNeedDrain]) { + pool2[kNeedDrain] = false; + pool2.emit("drain", origin, [pool2, ...targets]); + } + if (pool2[kClosedResolve] && queue.isEmpty()) { + Promise.all(pool2[kClients].map((c) => c.close())).then(pool2[kClosedResolve]); + } + }; + this[kOnConnect] = (origin, targets) => { + pool2.emit("connect", origin, [pool2, ...targets]); + }; + this[kOnDisconnect] = (origin, targets, err) => { + pool2.emit("disconnect", origin, [pool2, ...targets], err); + }; + this[kOnConnectionError] = (origin, targets, err) => { + pool2.emit("connectionError", origin, [pool2, ...targets], err); + }; + this[kStats] = new PoolStats(this); + } + get [kBusy]() { + return this[kNeedDrain]; + } + get [kConnected]() { + return this[kClients].filter((client2) => client2[kConnected]).length; + } + get [kFree]() { + return this[kClients].filter((client2) => client2[kConnected] && !client2[kNeedDrain]).length; + } + get [kPending]() { + let ret = this[kQueued]; + for (const { [kPending]: pending } of this[kClients]) { + ret += pending; + } + return ret; + } + get [kRunning]() { + let ret = 0; + for (const { [kRunning]: running } of this[kClients]) { + ret += running; + } + return ret; + } + get [kSize]() { + let ret = this[kQueued]; + for (const { [kSize]: size } of this[kClients]) { + ret += size; + } + return ret; + } + get stats() { + return this[kStats]; + } + async [kClose]() { + if (this[kQueue].isEmpty()) { + return Promise.all(this[kClients].map((c) => c.close())); + } else { + return new Promise((resolve) => { + this[kClosedResolve] = resolve; + }); + } + } + async [kDestroy](err) { + while (true) { + const item = this[kQueue].shift(); + if (!item) { + break; + } + item.handler.onError(err); + } + return Promise.all(this[kClients].map((c) => c.destroy(err))); + } + [kDispatch](opts, handler2) { + const dispatcher2 = this[kGetDispatcher](); + if (!dispatcher2) { + this[kNeedDrain] = true; + this[kQueue].push({ opts, handler: handler2 }); + this[kQueued]++; + } else if (!dispatcher2.dispatch(opts, handler2)) { + dispatcher2[kNeedDrain] = true; + this[kNeedDrain] = !this[kGetDispatcher](); + } + return !this[kNeedDrain]; + } + [kAddClient](client2) { + client2.on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", this[kOnDisconnect]).on("connectionError", this[kOnConnectionError]); + this[kClients].push(client2); + if (this[kNeedDrain]) { + process.nextTick(() => { + if (this[kNeedDrain]) { + this[kOnDrain](client2[kUrl], [this, client2]); + } + }); + } + return this; + } + [kRemoveClient](client2) { + client2.close(() => { + const idx = this[kClients].indexOf(client2); + if (idx !== -1) { + this[kClients].splice(idx, 1); + } + }); + this[kNeedDrain] = this[kClients].some((dispatcher2) => !dispatcher2[kNeedDrain] && dispatcher2.closed !== true && dispatcher2.destroyed !== true); + } + } + poolBase = { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kRemoveClient, + kGetDispatcher + }; + return poolBase; +} +var pool; +var hasRequiredPool; +function requirePool() { + if (hasRequiredPool) return pool; + hasRequiredPool = 1; + const { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kGetDispatcher + } = requirePoolBase(); + const Client = requireClient(); + const { + InvalidArgumentError + } = requireErrors(); + const util2 = requireUtil$6(); + const { kUrl, kInterceptors } = requireSymbols$4(); + const buildConnector = requireConnect(); + const kOptions = /* @__PURE__ */ Symbol("options"); + const kConnections = /* @__PURE__ */ Symbol("connections"); + const kFactory = /* @__PURE__ */ Symbol("factory"); + function defaultFactory(origin, opts) { + return new Client(origin, opts); + } + class Pool extends PoolBase { + constructor(origin, { + connections, + factory = defaultFactory, + connect: connect2, + connectTimeout, + tls, + maxCachedSessions, + socketPath, + autoSelectFamily, + autoSelectFamilyAttemptTimeout, + allowH2, + ...options + } = {}) { + super(); + if (connections != null && (!Number.isFinite(connections) || connections < 0)) { + throw new InvalidArgumentError("invalid connections"); + } + if (typeof factory !== "function") { + throw new InvalidArgumentError("factory must be a function."); + } + if (connect2 != null && typeof connect2 !== "function" && typeof connect2 !== "object") { + throw new InvalidArgumentError("connect must be a function or an object"); + } + if (typeof connect2 !== "function") { + connect2 = buildConnector({ + ...tls, + maxCachedSessions, + allowH2, + socketPath, + timeout: connectTimeout, + ...util2.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0, + ...connect2 + }); + } + this[kInterceptors] = options.interceptors && options.interceptors.Pool && Array.isArray(options.interceptors.Pool) ? options.interceptors.Pool : []; + this[kConnections] = connections || null; + this[kUrl] = util2.parseOrigin(origin); + this[kOptions] = { ...util2.deepClone(options), connect: connect2, allowH2 }; + this[kOptions].interceptors = options.interceptors ? { ...options.interceptors } : void 0; + this[kFactory] = factory; + this.on("connectionError", (origin2, targets, error) => { + for (const target of targets) { + const idx = this[kClients].indexOf(target); + if (idx !== -1) { + this[kClients].splice(idx, 1); + } + } + }); + } + [kGetDispatcher]() { + let dispatcher2 = this[kClients].find((dispatcher3) => !dispatcher3[kNeedDrain]); + if (dispatcher2) { + return dispatcher2; + } + if (!this[kConnections] || this[kClients].length < this[kConnections]) { + dispatcher2 = this[kFactory](this[kUrl], this[kOptions]); + this[kAddClient](dispatcher2); + } + return dispatcher2; + } + } + pool = Pool; + return pool; +} +var balancedPool; +var hasRequiredBalancedPool; +function requireBalancedPool() { + if (hasRequiredBalancedPool) return balancedPool; + hasRequiredBalancedPool = 1; + const { + BalancedPoolMissingUpstreamError, + InvalidArgumentError + } = requireErrors(); + const { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kRemoveClient, + kGetDispatcher + } = requirePoolBase(); + const Pool = requirePool(); + const { kUrl, kInterceptors } = requireSymbols$4(); + const { parseOrigin } = requireUtil$6(); + const kFactory = /* @__PURE__ */ Symbol("factory"); + const kOptions = /* @__PURE__ */ Symbol("options"); + const kGreatestCommonDivisor = /* @__PURE__ */ Symbol("kGreatestCommonDivisor"); + const kCurrentWeight = /* @__PURE__ */ Symbol("kCurrentWeight"); + const kIndex = /* @__PURE__ */ Symbol("kIndex"); + const kWeight = /* @__PURE__ */ Symbol("kWeight"); + const kMaxWeightPerServer = /* @__PURE__ */ Symbol("kMaxWeightPerServer"); + const kErrorPenalty = /* @__PURE__ */ Symbol("kErrorPenalty"); + function getGreatestCommonDivisor(a, b) { + if (b === 0) return a; + return getGreatestCommonDivisor(b, a % b); + } + function defaultFactory(origin, opts) { + return new Pool(origin, opts); + } + class BalancedPool extends PoolBase { + constructor(upstreams = [], { factory = defaultFactory, ...opts } = {}) { + super(); + this[kOptions] = opts; + this[kIndex] = -1; + this[kCurrentWeight] = 0; + this[kMaxWeightPerServer] = this[kOptions].maxWeightPerServer || 100; + this[kErrorPenalty] = this[kOptions].errorPenalty || 15; + if (!Array.isArray(upstreams)) { + upstreams = [upstreams]; + } + if (typeof factory !== "function") { + throw new InvalidArgumentError("factory must be a function."); + } + this[kInterceptors] = opts.interceptors && opts.interceptors.BalancedPool && Array.isArray(opts.interceptors.BalancedPool) ? opts.interceptors.BalancedPool : []; + this[kFactory] = factory; + for (const upstream of upstreams) { + this.addUpstream(upstream); + } + this._updateBalancedPoolStats(); + } + addUpstream(upstream) { + const upstreamOrigin = parseOrigin(upstream).origin; + if (this[kClients].find((pool3) => pool3[kUrl].origin === upstreamOrigin && pool3.closed !== true && pool3.destroyed !== true)) { + return this; + } + const pool2 = this[kFactory](upstreamOrigin, Object.assign({}, this[kOptions])); + this[kAddClient](pool2); + pool2.on("connect", () => { + pool2[kWeight] = Math.min(this[kMaxWeightPerServer], pool2[kWeight] + this[kErrorPenalty]); + }); + pool2.on("connectionError", () => { + pool2[kWeight] = Math.max(1, pool2[kWeight] - this[kErrorPenalty]); + this._updateBalancedPoolStats(); + }); + pool2.on("disconnect", (...args) => { + const err = args[2]; + if (err && err.code === "UND_ERR_SOCKET") { + pool2[kWeight] = Math.max(1, pool2[kWeight] - this[kErrorPenalty]); + this._updateBalancedPoolStats(); + } + }); + for (const client2 of this[kClients]) { + client2[kWeight] = this[kMaxWeightPerServer]; + } + this._updateBalancedPoolStats(); + return this; + } + _updateBalancedPoolStats() { + this[kGreatestCommonDivisor] = this[kClients].map((p) => p[kWeight]).reduce(getGreatestCommonDivisor, 0); + } + removeUpstream(upstream) { + const upstreamOrigin = parseOrigin(upstream).origin; + const pool2 = this[kClients].find((pool3) => pool3[kUrl].origin === upstreamOrigin && pool3.closed !== true && pool3.destroyed !== true); + if (pool2) { + this[kRemoveClient](pool2); + } + return this; + } + get upstreams() { + return this[kClients].filter((dispatcher2) => dispatcher2.closed !== true && dispatcher2.destroyed !== true).map((p) => p[kUrl].origin); + } + [kGetDispatcher]() { + if (this[kClients].length === 0) { + throw new BalancedPoolMissingUpstreamError(); + } + const dispatcher2 = this[kClients].find((dispatcher3) => !dispatcher3[kNeedDrain] && dispatcher3.closed !== true && dispatcher3.destroyed !== true); + if (!dispatcher2) { + return; + } + const allClientsBusy = this[kClients].map((pool2) => pool2[kNeedDrain]).reduce((a, b) => a && b, true); + if (allClientsBusy) { + return; + } + let counter = 0; + let maxWeightIndex = this[kClients].findIndex((pool2) => !pool2[kNeedDrain]); + while (counter++ < this[kClients].length) { + this[kIndex] = (this[kIndex] + 1) % this[kClients].length; + const pool2 = this[kClients][this[kIndex]]; + if (pool2[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool2[kNeedDrain]) { + maxWeightIndex = this[kIndex]; + } + if (this[kIndex] === 0) { + this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor]; + if (this[kCurrentWeight] <= 0) { + this[kCurrentWeight] = this[kMaxWeightPerServer]; + } + } + if (pool2[kWeight] >= this[kCurrentWeight] && !pool2[kNeedDrain]) { + return pool2; + } + } + this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight]; + this[kIndex] = maxWeightIndex; + return this[kClients][maxWeightIndex]; + } + } + balancedPool = BalancedPool; + return balancedPool; +} +var dispatcherWeakref; +var hasRequiredDispatcherWeakref; +function requireDispatcherWeakref() { + if (hasRequiredDispatcherWeakref) return dispatcherWeakref; + hasRequiredDispatcherWeakref = 1; + const { kConnected, kSize } = requireSymbols$4(); + class CompatWeakRef { + constructor(value) { + this.value = value; + } + deref() { + return this.value[kConnected] === 0 && this.value[kSize] === 0 ? void 0 : this.value; + } + } + class CompatFinalizer { + constructor(finalizer) { + this.finalizer = finalizer; + } + register(dispatcher2, key) { + if (dispatcher2.on) { + dispatcher2.on("disconnect", () => { + if (dispatcher2[kConnected] === 0 && dispatcher2[kSize] === 0) { + this.finalizer(key); + } + }); + } + } + } + dispatcherWeakref = function() { + if (process.env.NODE_V8_COVERAGE) { + return { + WeakRef: CompatWeakRef, + FinalizationRegistry: CompatFinalizer + }; + } + return { + WeakRef: commonjsGlobal.WeakRef || CompatWeakRef, + FinalizationRegistry: commonjsGlobal.FinalizationRegistry || CompatFinalizer + }; + }; + return dispatcherWeakref; +} +var agent; +var hasRequiredAgent; +function requireAgent() { + if (hasRequiredAgent) return agent; + hasRequiredAgent = 1; + const { InvalidArgumentError } = requireErrors(); + const { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = requireSymbols$4(); + const DispatcherBase = requireDispatcherBase(); + const Pool = requirePool(); + const Client = requireClient(); + const util2 = requireUtil$6(); + const createRedirectInterceptor = requireRedirectInterceptor(); + const { WeakRef: WeakRef2, FinalizationRegistry: FinalizationRegistry2 } = requireDispatcherWeakref()(); + const kOnConnect = /* @__PURE__ */ Symbol("onConnect"); + const kOnDisconnect = /* @__PURE__ */ Symbol("onDisconnect"); + const kOnConnectionError = /* @__PURE__ */ Symbol("onConnectionError"); + const kMaxRedirections = /* @__PURE__ */ Symbol("maxRedirections"); + const kOnDrain = /* @__PURE__ */ Symbol("onDrain"); + const kFactory = /* @__PURE__ */ Symbol("factory"); + const kFinalizer = /* @__PURE__ */ Symbol("finalizer"); + const kOptions = /* @__PURE__ */ Symbol("options"); + function defaultFactory(origin, opts) { + return opts && opts.connections === 1 ? new Client(origin, opts) : new Pool(origin, opts); + } + class Agent extends DispatcherBase { + constructor({ factory = defaultFactory, maxRedirections = 0, connect: connect2, ...options } = {}) { + super(); + if (typeof factory !== "function") { + throw new InvalidArgumentError("factory must be a function."); + } + if (connect2 != null && typeof connect2 !== "function" && typeof connect2 !== "object") { + throw new InvalidArgumentError("connect must be a function or an object"); + } + if (!Number.isInteger(maxRedirections) || maxRedirections < 0) { + throw new InvalidArgumentError("maxRedirections must be a positive number"); + } + if (connect2 && typeof connect2 !== "function") { + connect2 = { ...connect2 }; + } + this[kInterceptors] = options.interceptors && options.interceptors.Agent && Array.isArray(options.interceptors.Agent) ? options.interceptors.Agent : [createRedirectInterceptor({ maxRedirections })]; + this[kOptions] = { ...util2.deepClone(options), connect: connect2 }; + this[kOptions].interceptors = options.interceptors ? { ...options.interceptors } : void 0; + this[kMaxRedirections] = maxRedirections; + this[kFactory] = factory; + this[kClients] = /* @__PURE__ */ new Map(); + this[kFinalizer] = new FinalizationRegistry2( + /* istanbul ignore next: gc is undeterministic */ + (key) => { + const ref = this[kClients].get(key); + if (ref !== void 0 && ref.deref() === void 0) { + this[kClients].delete(key); + } + } + ); + const agent2 = this; + this[kOnDrain] = (origin, targets) => { + agent2.emit("drain", origin, [agent2, ...targets]); + }; + this[kOnConnect] = (origin, targets) => { + agent2.emit("connect", origin, [agent2, ...targets]); + }; + this[kOnDisconnect] = (origin, targets, err) => { + agent2.emit("disconnect", origin, [agent2, ...targets], err); + }; + this[kOnConnectionError] = (origin, targets, err) => { + agent2.emit("connectionError", origin, [agent2, ...targets], err); + }; + } + get [kRunning]() { + let ret = 0; + for (const ref of this[kClients].values()) { + const client2 = ref.deref(); + if (client2) { + ret += client2[kRunning]; + } + } + return ret; + } + [kDispatch](opts, handler2) { + let key; + if (opts.origin && (typeof opts.origin === "string" || opts.origin instanceof URL)) { + key = String(opts.origin); + } else { + throw new InvalidArgumentError("opts.origin must be a non-empty string or URL."); + } + const ref = this[kClients].get(key); + let dispatcher2 = ref ? ref.deref() : null; + if (!dispatcher2) { + dispatcher2 = this[kFactory](opts.origin, this[kOptions]).on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", this[kOnDisconnect]).on("connectionError", this[kOnConnectionError]); + this[kClients].set(key, new WeakRef2(dispatcher2)); + this[kFinalizer].register(dispatcher2, key); + } + return dispatcher2.dispatch(opts, handler2); + } + async [kClose]() { + const closePromises = []; + for (const ref of this[kClients].values()) { + const client2 = ref.deref(); + if (client2) { + closePromises.push(client2.close()); + } + } + await Promise.all(closePromises); + } + async [kDestroy](err) { + const destroyPromises = []; + for (const ref of this[kClients].values()) { + const client2 = ref.deref(); + if (client2) { + destroyPromises.push(client2.destroy(err)); + } + } + await Promise.all(destroyPromises); + } + } + agent = Agent; + return agent; +} +var api = {}; +var apiRequest = { exports: {} }; +var readable; +var hasRequiredReadable; +function requireReadable() { + if (hasRequiredReadable) return readable; + hasRequiredReadable = 1; + const assert = require$$0$9; + const { Readable } = require$$0$b; + const { RequestAbortedError, NotSupportedError, InvalidArgumentError } = requireErrors(); + const util2 = requireUtil$6(); + const { ReadableStreamFrom, toUSVString } = requireUtil$6(); + let Blob2; + const kConsume = /* @__PURE__ */ Symbol("kConsume"); + const kReading = /* @__PURE__ */ Symbol("kReading"); + const kBody = /* @__PURE__ */ Symbol("kBody"); + const kAbort = /* @__PURE__ */ Symbol("abort"); + const kContentType = /* @__PURE__ */ Symbol("kContentType"); + const noop2 = () => { + }; + readable = class BodyReadable extends Readable { + constructor({ + resume, + abort, + contentType = "", + highWaterMark = 64 * 1024 + // Same as nodejs fs streams. + }) { + super({ + autoDestroy: true, + read: resume, + highWaterMark + }); + this._readableState.dataEmitted = false; + this[kAbort] = abort; + this[kConsume] = null; + this[kBody] = null; + this[kContentType] = contentType; + this[kReading] = false; + } + destroy(err) { + if (this.destroyed) { + return this; + } + if (!err && !this._readableState.endEmitted) { + err = new RequestAbortedError(); + } + if (err) { + this[kAbort](); + } + return super.destroy(err); + } + emit(ev, ...args) { + if (ev === "data") { + this._readableState.dataEmitted = true; + } else if (ev === "error") { + this._readableState.errorEmitted = true; + } + return super.emit(ev, ...args); + } + on(ev, ...args) { + if (ev === "data" || ev === "readable") { + this[kReading] = true; + } + return super.on(ev, ...args); + } + addListener(ev, ...args) { + return this.on(ev, ...args); + } + off(ev, ...args) { + const ret = super.off(ev, ...args); + if (ev === "data" || ev === "readable") { + this[kReading] = this.listenerCount("data") > 0 || this.listenerCount("readable") > 0; + } + return ret; + } + removeListener(ev, ...args) { + return this.off(ev, ...args); + } + push(chunk) { + if (this[kConsume] && chunk !== null && this.readableLength === 0) { + consumePush(this[kConsume], chunk); + return this[kReading] ? super.push(chunk) : true; + } + return super.push(chunk); + } + // https://fetch.spec.whatwg.org/#dom-body-text + async text() { + return consume(this, "text"); + } + // https://fetch.spec.whatwg.org/#dom-body-json + async json() { + return consume(this, "json"); + } + // https://fetch.spec.whatwg.org/#dom-body-blob + async blob() { + return consume(this, "blob"); + } + // https://fetch.spec.whatwg.org/#dom-body-arraybuffer + async arrayBuffer() { + return consume(this, "arrayBuffer"); + } + // https://fetch.spec.whatwg.org/#dom-body-formdata + async formData() { + throw new NotSupportedError(); + } + // https://fetch.spec.whatwg.org/#dom-body-bodyused + get bodyUsed() { + return util2.isDisturbed(this); + } + // https://fetch.spec.whatwg.org/#dom-body-body + get body() { + if (!this[kBody]) { + this[kBody] = ReadableStreamFrom(this); + if (this[kConsume]) { + this[kBody].getReader(); + assert(this[kBody].locked); + } + } + return this[kBody]; + } + dump(opts) { + let limit = opts && Number.isFinite(opts.limit) ? opts.limit : 262144; + const signal = opts && opts.signal; + if (signal) { + try { + if (typeof signal !== "object" || !("aborted" in signal)) { + throw new InvalidArgumentError("signal must be an AbortSignal"); + } + util2.throwIfAborted(signal); + } catch (err) { + return Promise.reject(err); + } + } + if (this.closed) { + return Promise.resolve(null); + } + return new Promise((resolve, reject) => { + const signalListenerCleanup = signal ? util2.addAbortListener(signal, () => { + this.destroy(); + }) : noop2; + this.on("close", function() { + signalListenerCleanup(); + if (signal && signal.aborted) { + reject(signal.reason || Object.assign(new Error("The operation was aborted"), { name: "AbortError" })); + } else { + resolve(null); + } + }).on("error", noop2).on("data", function(chunk) { + limit -= chunk.length; + if (limit <= 0) { + this.destroy(); + } + }).resume(); + }); + } + }; + function isLocked(self2) { + return self2[kBody] && self2[kBody].locked === true || self2[kConsume]; + } + function isUnusable(self2) { + return util2.isDisturbed(self2) || isLocked(self2); + } + async function consume(stream, type) { + if (isUnusable(stream)) { + throw new TypeError("unusable"); + } + assert(!stream[kConsume]); + return new Promise((resolve, reject) => { + stream[kConsume] = { + type, + stream, + resolve, + reject, + length: 0, + body: [] + }; + stream.on("error", function(err) { + consumeFinish(this[kConsume], err); + }).on("close", function() { + if (this[kConsume].body !== null) { + consumeFinish(this[kConsume], new RequestAbortedError()); + } + }); + process.nextTick(consumeStart, stream[kConsume]); + }); + } + function consumeStart(consume2) { + if (consume2.body === null) { + return; + } + const { _readableState: state } = consume2.stream; + for (const chunk of state.buffer) { + consumePush(consume2, chunk); + } + if (state.endEmitted) { + consumeEnd(this[kConsume]); + } else { + consume2.stream.on("end", function() { + consumeEnd(this[kConsume]); + }); + } + consume2.stream.resume(); + while (consume2.stream.read() != null) { + } + } + function consumeEnd(consume2) { + const { type, body: body2, resolve, stream, length } = consume2; + try { + if (type === "text") { + resolve(toUSVString(Buffer.concat(body2))); + } else if (type === "json") { + resolve(JSON.parse(Buffer.concat(body2))); + } else if (type === "arrayBuffer") { + const dst = new Uint8Array(length); + let pos = 0; + for (const buf of body2) { + dst.set(buf, pos); + pos += buf.byteLength; + } + resolve(dst.buffer); + } else if (type === "blob") { + if (!Blob2) { + Blob2 = require("buffer").Blob; + } + resolve(new Blob2(body2, { type: stream[kContentType] })); + } + consumeFinish(consume2); + } catch (err) { + stream.destroy(err); + } + } + function consumePush(consume2, chunk) { + consume2.length += chunk.length; + consume2.body.push(chunk); + } + function consumeFinish(consume2, err) { + if (consume2.body === null) { + return; + } + if (err) { + consume2.reject(err); + } else { + consume2.resolve(); + } + consume2.type = null; + consume2.stream = null; + consume2.resolve = null; + consume2.reject = null; + consume2.length = 0; + consume2.body = null; + } + return readable; +} +var util$4; +var hasRequiredUtil$4; +function requireUtil$4() { + if (hasRequiredUtil$4) return util$4; + hasRequiredUtil$4 = 1; + const assert = require$$0$9; + const { + ResponseStatusCodeError + } = requireErrors(); + const { toUSVString } = requireUtil$6(); + async function getResolveErrorBodyCallback({ callback, body: body2, contentType, statusCode, statusMessage, headers: headers2 }) { + assert(body2); + let chunks = []; + let limit = 0; + for await (const chunk of body2) { + chunks.push(chunk); + limit += chunk.length; + if (limit > 128 * 1024) { + chunks = null; + break; + } + } + if (statusCode === 204 || !contentType || !chunks) { + process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers2)); + return; + } + try { + if (contentType.startsWith("application/json")) { + const payload = JSON.parse(toUSVString(Buffer.concat(chunks))); + process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers2, payload)); + return; + } + if (contentType.startsWith("text/")) { + const payload = toUSVString(Buffer.concat(chunks)); + process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers2, payload)); + return; + } + } catch (err) { + } + process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers2)); + } + util$4 = { getResolveErrorBodyCallback }; + return util$4; +} +var abortSignal; +var hasRequiredAbortSignal; +function requireAbortSignal() { + if (hasRequiredAbortSignal) return abortSignal; + hasRequiredAbortSignal = 1; + const { addAbortListener } = requireUtil$6(); + const { RequestAbortedError } = requireErrors(); + const kListener = /* @__PURE__ */ Symbol("kListener"); + const kSignal = /* @__PURE__ */ Symbol("kSignal"); + function abort(self2) { + if (self2.abort) { + self2.abort(); + } else { + self2.onError(new RequestAbortedError()); + } + } + function addSignal(self2, signal) { + self2[kSignal] = null; + self2[kListener] = null; + if (!signal) { + return; + } + if (signal.aborted) { + abort(self2); + return; + } + self2[kSignal] = signal; + self2[kListener] = () => { + abort(self2); + }; + addAbortListener(self2[kSignal], self2[kListener]); + } + function removeSignal(self2) { + if (!self2[kSignal]) { + return; + } + if ("removeEventListener" in self2[kSignal]) { + self2[kSignal].removeEventListener("abort", self2[kListener]); + } else { + self2[kSignal].removeListener("abort", self2[kListener]); + } + self2[kSignal] = null; + self2[kListener] = null; + } + abortSignal = { + addSignal, + removeSignal + }; + return abortSignal; +} +var hasRequiredApiRequest; +function requireApiRequest() { + if (hasRequiredApiRequest) return apiRequest.exports; + hasRequiredApiRequest = 1; + const Readable = requireReadable(); + const { + InvalidArgumentError, + RequestAbortedError + } = requireErrors(); + const util2 = requireUtil$6(); + const { getResolveErrorBodyCallback } = requireUtil$4(); + const { AsyncResource } = require$$4$2; + const { addSignal, removeSignal } = requireAbortSignal(); + class RequestHandler extends AsyncResource { + constructor(opts, callback) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + const { signal, method, opaque, body: body2, onInfo, responseHeaders, throwOnError, highWaterMark } = opts; + try { + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + if (highWaterMark && (typeof highWaterMark !== "number" || highWaterMark < 0)) { + throw new InvalidArgumentError("invalid highWaterMark"); + } + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); + } + if (method === "CONNECT") { + throw new InvalidArgumentError("invalid method"); + } + if (onInfo && typeof onInfo !== "function") { + throw new InvalidArgumentError("invalid onInfo callback"); + } + super("UNDICI_REQUEST"); + } catch (err) { + if (util2.isStream(body2)) { + util2.destroy(body2.on("error", util2.nop), err); + } + throw err; + } + this.responseHeaders = responseHeaders || null; + this.opaque = opaque || null; + this.callback = callback; + this.res = null; + this.abort = null; + this.body = body2; + this.trailers = {}; + this.context = null; + this.onInfo = onInfo || null; + this.throwOnError = throwOnError; + this.highWaterMark = highWaterMark; + if (util2.isStream(body2)) { + body2.on("error", (err) => { + this.onError(err); + }); + } + addSignal(this, signal); + } + onConnect(abort, context2) { + if (!this.callback) { + throw new RequestAbortedError(); + } + this.abort = abort; + this.context = context2; + } + onHeaders(statusCode, rawHeaders, resume, statusMessage) { + const { callback, opaque, abort, context: context2, responseHeaders, highWaterMark } = this; + const headers2 = responseHeaders === "raw" ? util2.parseRawHeaders(rawHeaders) : util2.parseHeaders(rawHeaders); + if (statusCode < 200) { + if (this.onInfo) { + this.onInfo({ statusCode, headers: headers2 }); + } + return; + } + const parsedHeaders = responseHeaders === "raw" ? util2.parseHeaders(rawHeaders) : headers2; + const contentType = parsedHeaders["content-type"]; + const body2 = new Readable({ resume, abort, contentType, highWaterMark }); + this.callback = null; + this.res = body2; + if (callback !== null) { + if (this.throwOnError && statusCode >= 400) { + this.runInAsyncScope( + getResolveErrorBodyCallback, + null, + { callback, body: body2, contentType, statusCode, statusMessage, headers: headers2 } + ); + } else { + this.runInAsyncScope(callback, null, null, { + statusCode, + headers: headers2, + trailers: this.trailers, + opaque, + body: body2, + context: context2 + }); + } + } + } + onData(chunk) { + const { res } = this; + return res.push(chunk); + } + onComplete(trailers) { + const { res } = this; + removeSignal(this); + util2.parseHeaders(trailers, this.trailers); + res.push(null); + } + onError(err) { + const { res, callback, body: body2, opaque } = this; + removeSignal(this); + if (callback) { + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); + } + if (res) { + this.res = null; + queueMicrotask(() => { + util2.destroy(res, err); + }); + } + if (body2) { + this.body = null; + util2.destroy(body2, err); + } + } + } + function request2(opts, callback) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + request2.call(this, opts, (err, data) => { + return err ? reject(err) : resolve(data); + }); + }); + } + try { + this.dispatch(opts, new RequestHandler(opts, callback)); + } catch (err) { + if (typeof callback !== "function") { + throw err; + } + const opaque = opts && opts.opaque; + queueMicrotask(() => callback(err, { opaque })); + } + } + apiRequest.exports = request2; + apiRequest.exports.RequestHandler = RequestHandler; + return apiRequest.exports; +} +var apiStream; +var hasRequiredApiStream; +function requireApiStream() { + if (hasRequiredApiStream) return apiStream; + hasRequiredApiStream = 1; + const { finished, PassThrough } = require$$0$b; + const { + InvalidArgumentError, + InvalidReturnValueError, + RequestAbortedError + } = requireErrors(); + const util2 = requireUtil$6(); + const { getResolveErrorBodyCallback } = requireUtil$4(); + const { AsyncResource } = require$$4$2; + const { addSignal, removeSignal } = requireAbortSignal(); + class StreamHandler extends AsyncResource { + constructor(opts, factory, callback) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + const { signal, method, opaque, body: body2, onInfo, responseHeaders, throwOnError } = opts; + try { + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + if (typeof factory !== "function") { + throw new InvalidArgumentError("invalid factory"); + } + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); + } + if (method === "CONNECT") { + throw new InvalidArgumentError("invalid method"); + } + if (onInfo && typeof onInfo !== "function") { + throw new InvalidArgumentError("invalid onInfo callback"); + } + super("UNDICI_STREAM"); + } catch (err) { + if (util2.isStream(body2)) { + util2.destroy(body2.on("error", util2.nop), err); + } + throw err; + } + this.responseHeaders = responseHeaders || null; + this.opaque = opaque || null; + this.factory = factory; + this.callback = callback; + this.res = null; + this.abort = null; + this.context = null; + this.trailers = null; + this.body = body2; + this.onInfo = onInfo || null; + this.throwOnError = throwOnError || false; + if (util2.isStream(body2)) { + body2.on("error", (err) => { + this.onError(err); + }); + } + addSignal(this, signal); + } + onConnect(abort, context2) { + if (!this.callback) { + throw new RequestAbortedError(); + } + this.abort = abort; + this.context = context2; + } + onHeaders(statusCode, rawHeaders, resume, statusMessage) { + const { factory, opaque, context: context2, callback, responseHeaders } = this; + const headers2 = responseHeaders === "raw" ? util2.parseRawHeaders(rawHeaders) : util2.parseHeaders(rawHeaders); + if (statusCode < 200) { + if (this.onInfo) { + this.onInfo({ statusCode, headers: headers2 }); + } + return; + } + this.factory = null; + let res; + if (this.throwOnError && statusCode >= 400) { + const parsedHeaders = responseHeaders === "raw" ? util2.parseHeaders(rawHeaders) : headers2; + const contentType = parsedHeaders["content-type"]; + res = new PassThrough(); + this.callback = null; + this.runInAsyncScope( + getResolveErrorBodyCallback, + null, + { callback, body: res, contentType, statusCode, statusMessage, headers: headers2 } + ); + } else { + if (factory === null) { + return; + } + res = this.runInAsyncScope(factory, null, { + statusCode, + headers: headers2, + opaque, + context: context2 + }); + if (!res || typeof res.write !== "function" || typeof res.end !== "function" || typeof res.on !== "function") { + throw new InvalidReturnValueError("expected Writable"); + } + finished(res, { readable: false }, (err) => { + const { callback: callback2, res: res2, opaque: opaque2, trailers, abort } = this; + this.res = null; + if (err || !res2.readable) { + util2.destroy(res2, err); + } + this.callback = null; + this.runInAsyncScope(callback2, null, err || null, { opaque: opaque2, trailers }); + if (err) { + abort(); + } + }); + } + res.on("drain", resume); + this.res = res; + const needDrain = res.writableNeedDrain !== void 0 ? res.writableNeedDrain : res._writableState && res._writableState.needDrain; + return needDrain !== true; + } + onData(chunk) { + const { res } = this; + return res ? res.write(chunk) : true; + } + onComplete(trailers) { + const { res } = this; + removeSignal(this); + if (!res) { + return; + } + this.trailers = util2.parseHeaders(trailers); + res.end(); + } + onError(err) { + const { res, callback, opaque, body: body2 } = this; + removeSignal(this); + this.factory = null; + if (res) { + this.res = null; + util2.destroy(res, err); + } else if (callback) { + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); + } + if (body2) { + this.body = null; + util2.destroy(body2, err); + } + } + } + function stream(opts, factory, callback) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + stream.call(this, opts, factory, (err, data) => { + return err ? reject(err) : resolve(data); + }); + }); + } + try { + this.dispatch(opts, new StreamHandler(opts, factory, callback)); + } catch (err) { + if (typeof callback !== "function") { + throw err; + } + const opaque = opts && opts.opaque; + queueMicrotask(() => callback(err, { opaque })); + } + } + apiStream = stream; + return apiStream; +} +var apiPipeline; +var hasRequiredApiPipeline; +function requireApiPipeline() { + if (hasRequiredApiPipeline) return apiPipeline; + hasRequiredApiPipeline = 1; + const { + Readable, + Duplex, + PassThrough + } = require$$0$b; + const { + InvalidArgumentError, + InvalidReturnValueError, + RequestAbortedError + } = requireErrors(); + const util2 = requireUtil$6(); + const { AsyncResource } = require$$4$2; + const { addSignal, removeSignal } = requireAbortSignal(); + const assert = require$$0$9; + const kResume = /* @__PURE__ */ Symbol("resume"); + class PipelineRequest extends Readable { + constructor() { + super({ autoDestroy: true }); + this[kResume] = null; + } + _read() { + const { [kResume]: resume } = this; + if (resume) { + this[kResume] = null; + resume(); + } + } + _destroy(err, callback) { + this._read(); + callback(err); + } + } + class PipelineResponse extends Readable { + constructor(resume) { + super({ autoDestroy: true }); + this[kResume] = resume; + } + _read() { + this[kResume](); + } + _destroy(err, callback) { + if (!err && !this._readableState.endEmitted) { + err = new RequestAbortedError(); + } + callback(err); + } + } + class PipelineHandler extends AsyncResource { + constructor(opts, handler2) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + if (typeof handler2 !== "function") { + throw new InvalidArgumentError("invalid handler"); + } + const { signal, method, opaque, onInfo, responseHeaders } = opts; + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); + } + if (method === "CONNECT") { + throw new InvalidArgumentError("invalid method"); + } + if (onInfo && typeof onInfo !== "function") { + throw new InvalidArgumentError("invalid onInfo callback"); + } + super("UNDICI_PIPELINE"); + this.opaque = opaque || null; + this.responseHeaders = responseHeaders || null; + this.handler = handler2; + this.abort = null; + this.context = null; + this.onInfo = onInfo || null; + this.req = new PipelineRequest().on("error", util2.nop); + this.ret = new Duplex({ + readableObjectMode: opts.objectMode, + autoDestroy: true, + read: () => { + const { body: body2 } = this; + if (body2 && body2.resume) { + body2.resume(); + } + }, + write: (chunk, encoding2, callback) => { + const { req } = this; + if (req.push(chunk, encoding2) || req._readableState.destroyed) { + callback(); + } else { + req[kResume] = callback; + } + }, + destroy: (err, callback) => { + const { body: body2, req, res, ret, abort } = this; + if (!err && !ret._readableState.endEmitted) { + err = new RequestAbortedError(); + } + if (abort && err) { + abort(); + } + util2.destroy(body2, err); + util2.destroy(req, err); + util2.destroy(res, err); + removeSignal(this); + callback(err); + } + }).on("prefinish", () => { + const { req } = this; + req.push(null); + }); + this.res = null; + addSignal(this, signal); + } + onConnect(abort, context2) { + const { ret, res } = this; + assert(!res, "pipeline cannot be retried"); + if (ret.destroyed) { + throw new RequestAbortedError(); + } + this.abort = abort; + this.context = context2; + } + onHeaders(statusCode, rawHeaders, resume) { + const { opaque, handler: handler2, context: context2 } = this; + if (statusCode < 200) { + if (this.onInfo) { + const headers2 = this.responseHeaders === "raw" ? util2.parseRawHeaders(rawHeaders) : util2.parseHeaders(rawHeaders); + this.onInfo({ statusCode, headers: headers2 }); + } + return; + } + this.res = new PipelineResponse(resume); + let body2; + try { + this.handler = null; + const headers2 = this.responseHeaders === "raw" ? util2.parseRawHeaders(rawHeaders) : util2.parseHeaders(rawHeaders); + body2 = this.runInAsyncScope(handler2, null, { + statusCode, + headers: headers2, + opaque, + body: this.res, + context: context2 + }); + } catch (err) { + this.res.on("error", util2.nop); + throw err; + } + if (!body2 || typeof body2.on !== "function") { + throw new InvalidReturnValueError("expected Readable"); + } + body2.on("data", (chunk) => { + const { ret, body: body3 } = this; + if (!ret.push(chunk) && body3.pause) { + body3.pause(); + } + }).on("error", (err) => { + const { ret } = this; + util2.destroy(ret, err); + }).on("end", () => { + const { ret } = this; + ret.push(null); + }).on("close", () => { + const { ret } = this; + if (!ret._readableState.ended) { + util2.destroy(ret, new RequestAbortedError()); + } + }); + this.body = body2; + } + onData(chunk) { + const { res } = this; + return res.push(chunk); + } + onComplete(trailers) { + const { res } = this; + res.push(null); + } + onError(err) { + const { ret } = this; + this.handler = null; + util2.destroy(ret, err); + } + } + function pipeline(opts, handler2) { + try { + const pipelineHandler = new PipelineHandler(opts, handler2); + this.dispatch({ ...opts, body: pipelineHandler.req }, pipelineHandler); + return pipelineHandler.ret; + } catch (err) { + return new PassThrough().destroy(err); + } + } + apiPipeline = pipeline; + return apiPipeline; +} +var apiUpgrade; +var hasRequiredApiUpgrade; +function requireApiUpgrade() { + if (hasRequiredApiUpgrade) return apiUpgrade; + hasRequiredApiUpgrade = 1; + const { InvalidArgumentError, RequestAbortedError, SocketError } = requireErrors(); + const { AsyncResource } = require$$4$2; + const util2 = requireUtil$6(); + const { addSignal, removeSignal } = requireAbortSignal(); + const assert = require$$0$9; + class UpgradeHandler extends AsyncResource { + constructor(opts, callback) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + const { signal, opaque, responseHeaders } = opts; + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); + } + super("UNDICI_UPGRADE"); + this.responseHeaders = responseHeaders || null; + this.opaque = opaque || null; + this.callback = callback; + this.abort = null; + this.context = null; + addSignal(this, signal); + } + onConnect(abort, context2) { + if (!this.callback) { + throw new RequestAbortedError(); + } + this.abort = abort; + this.context = null; + } + onHeaders() { + throw new SocketError("bad upgrade", null); + } + onUpgrade(statusCode, rawHeaders, socket) { + const { callback, opaque, context: context2 } = this; + assert.strictEqual(statusCode, 101); + removeSignal(this); + this.callback = null; + const headers2 = this.responseHeaders === "raw" ? util2.parseRawHeaders(rawHeaders) : util2.parseHeaders(rawHeaders); + this.runInAsyncScope(callback, null, null, { + headers: headers2, + socket, + opaque, + context: context2 + }); + } + onError(err) { + const { callback, opaque } = this; + removeSignal(this); + if (callback) { + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); + } + } + } + function upgrade(opts, callback) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + upgrade.call(this, opts, (err, data) => { + return err ? reject(err) : resolve(data); + }); + }); + } + try { + const upgradeHandler = new UpgradeHandler(opts, callback); + this.dispatch({ + ...opts, + method: opts.method || "GET", + upgrade: opts.protocol || "Websocket" + }, upgradeHandler); + } catch (err) { + if (typeof callback !== "function") { + throw err; + } + const opaque = opts && opts.opaque; + queueMicrotask(() => callback(err, { opaque })); + } + } + apiUpgrade = upgrade; + return apiUpgrade; +} +var apiConnect; +var hasRequiredApiConnect; +function requireApiConnect() { + if (hasRequiredApiConnect) return apiConnect; + hasRequiredApiConnect = 1; + const { AsyncResource } = require$$4$2; + const { InvalidArgumentError, RequestAbortedError, SocketError } = requireErrors(); + const util2 = requireUtil$6(); + const { addSignal, removeSignal } = requireAbortSignal(); + class ConnectHandler extends AsyncResource { + constructor(opts, callback) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + const { signal, opaque, responseHeaders } = opts; + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); + } + super("UNDICI_CONNECT"); + this.opaque = opaque || null; + this.responseHeaders = responseHeaders || null; + this.callback = callback; + this.abort = null; + addSignal(this, signal); + } + onConnect(abort, context2) { + if (!this.callback) { + throw new RequestAbortedError(); + } + this.abort = abort; + this.context = context2; + } + onHeaders() { + throw new SocketError("bad connect", null); + } + onUpgrade(statusCode, rawHeaders, socket) { + const { callback, opaque, context: context2 } = this; + removeSignal(this); + this.callback = null; + let headers2 = rawHeaders; + if (headers2 != null) { + headers2 = this.responseHeaders === "raw" ? util2.parseRawHeaders(rawHeaders) : util2.parseHeaders(rawHeaders); + } + this.runInAsyncScope(callback, null, null, { + statusCode, + headers: headers2, + socket, + opaque, + context: context2 + }); + } + onError(err) { + const { callback, opaque } = this; + removeSignal(this); + if (callback) { + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); + } + } + } + function connect2(opts, callback) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + connect2.call(this, opts, (err, data) => { + return err ? reject(err) : resolve(data); + }); + }); + } + try { + const connectHandler = new ConnectHandler(opts, callback); + this.dispatch({ ...opts, method: "CONNECT" }, connectHandler); + } catch (err) { + if (typeof callback !== "function") { + throw err; + } + const opaque = opts && opts.opaque; + queueMicrotask(() => callback(err, { opaque })); + } + } + apiConnect = connect2; + return apiConnect; +} +var hasRequiredApi; +function requireApi() { + if (hasRequiredApi) return api; + hasRequiredApi = 1; + api.request = requireApiRequest(); + api.stream = requireApiStream(); + api.pipeline = requireApiPipeline(); + api.upgrade = requireApiUpgrade(); + api.connect = requireApiConnect(); + return api; +} +var mockErrors; +var hasRequiredMockErrors; +function requireMockErrors() { + if (hasRequiredMockErrors) return mockErrors; + hasRequiredMockErrors = 1; + const { UndiciError } = requireErrors(); + class MockNotMatchedError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, MockNotMatchedError); + this.name = "MockNotMatchedError"; + this.message = message || "The request does not match any registered mock dispatches"; + this.code = "UND_MOCK_ERR_MOCK_NOT_MATCHED"; + } + } + mockErrors = { + MockNotMatchedError + }; + return mockErrors; +} +var mockSymbols; +var hasRequiredMockSymbols; +function requireMockSymbols() { + if (hasRequiredMockSymbols) return mockSymbols; + hasRequiredMockSymbols = 1; + mockSymbols = { + kAgent: /* @__PURE__ */ Symbol("agent"), + kOptions: /* @__PURE__ */ Symbol("options"), + kFactory: /* @__PURE__ */ Symbol("factory"), + kDispatches: /* @__PURE__ */ Symbol("dispatches"), + kDispatchKey: /* @__PURE__ */ Symbol("dispatch key"), + kDefaultHeaders: /* @__PURE__ */ Symbol("default headers"), + kDefaultTrailers: /* @__PURE__ */ Symbol("default trailers"), + kContentLength: /* @__PURE__ */ Symbol("content length"), + kMockAgent: /* @__PURE__ */ Symbol("mock agent"), + kMockAgentSet: /* @__PURE__ */ Symbol("mock agent set"), + kMockAgentGet: /* @__PURE__ */ Symbol("mock agent get"), + kMockDispatch: /* @__PURE__ */ Symbol("mock dispatch"), + kClose: /* @__PURE__ */ Symbol("close"), + kOriginalClose: /* @__PURE__ */ Symbol("original agent close"), + kOrigin: /* @__PURE__ */ Symbol("origin"), + kIsMockActive: /* @__PURE__ */ Symbol("is mock active"), + kNetConnect: /* @__PURE__ */ Symbol("net connect"), + kGetNetConnect: /* @__PURE__ */ Symbol("get net connect"), + kConnected: /* @__PURE__ */ Symbol("connected") + }; + return mockSymbols; +} +var mockUtils; +var hasRequiredMockUtils; +function requireMockUtils() { + if (hasRequiredMockUtils) return mockUtils; + hasRequiredMockUtils = 1; + const { MockNotMatchedError } = requireMockErrors(); + const { + kDispatches, + kMockAgent, + kOriginalDispatch, + kOrigin, + kGetNetConnect + } = requireMockSymbols(); + const { buildURL, nop } = requireUtil$6(); + const { STATUS_CODES } = require$$2$1; + const { + types: { + isPromise + } + } = require$$0$2; + function matchValue(match, value) { + if (typeof match === "string") { + return match === value; + } + if (match instanceof RegExp) { + return match.test(value); + } + if (typeof match === "function") { + return match(value) === true; + } + return false; + } + function lowerCaseEntries(headers2) { + return Object.fromEntries( + Object.entries(headers2).map(([headerName, headerValue]) => { + return [headerName.toLocaleLowerCase(), headerValue]; + }) + ); + } + function getHeaderByName(headers2, key) { + if (Array.isArray(headers2)) { + for (let i = 0; i < headers2.length; i += 2) { + if (headers2[i].toLocaleLowerCase() === key.toLocaleLowerCase()) { + return headers2[i + 1]; + } + } + return void 0; + } else if (typeof headers2.get === "function") { + return headers2.get(key); + } else { + return lowerCaseEntries(headers2)[key.toLocaleLowerCase()]; + } + } + function buildHeadersFromArray(headers2) { + const clone = headers2.slice(); + const entries = []; + for (let index = 0; index < clone.length; index += 2) { + entries.push([clone[index], clone[index + 1]]); + } + return Object.fromEntries(entries); + } + function matchHeaders(mockDispatch2, headers2) { + if (typeof mockDispatch2.headers === "function") { + if (Array.isArray(headers2)) { + headers2 = buildHeadersFromArray(headers2); + } + return mockDispatch2.headers(headers2 ? lowerCaseEntries(headers2) : {}); + } + if (typeof mockDispatch2.headers === "undefined") { + return true; + } + if (typeof headers2 !== "object" || typeof mockDispatch2.headers !== "object") { + return false; + } + for (const [matchHeaderName, matchHeaderValue] of Object.entries(mockDispatch2.headers)) { + const headerValue = getHeaderByName(headers2, matchHeaderName); + if (!matchValue(matchHeaderValue, headerValue)) { + return false; + } + } + return true; + } + function safeUrl(path) { + if (typeof path !== "string") { + return path; + } + const pathSegments = path.split("?"); + if (pathSegments.length !== 2) { + return path; + } + const qp = new URLSearchParams(pathSegments.pop()); + qp.sort(); + return [...pathSegments, qp.toString()].join("?"); + } + function matchKey(mockDispatch2, { path, method, body: body2, headers: headers2 }) { + const pathMatch = matchValue(mockDispatch2.path, path); + const methodMatch = matchValue(mockDispatch2.method, method); + const bodyMatch = typeof mockDispatch2.body !== "undefined" ? matchValue(mockDispatch2.body, body2) : true; + const headersMatch = matchHeaders(mockDispatch2, headers2); + return pathMatch && methodMatch && bodyMatch && headersMatch; + } + function getResponseData2(data) { + if (Buffer.isBuffer(data)) { + return data; + } else if (typeof data === "object") { + return JSON.stringify(data); + } else { + return data.toString(); + } + } + function getMockDispatch(mockDispatches, key) { + const basePath = key.query ? buildURL(key.path, key.query) : key.path; + const resolvedPath = typeof basePath === "string" ? safeUrl(basePath) : basePath; + let matchedMockDispatches = mockDispatches.filter(({ consumed }) => !consumed).filter(({ path }) => matchValue(safeUrl(path), resolvedPath)); + if (matchedMockDispatches.length === 0) { + throw new MockNotMatchedError(`Mock dispatch not matched for path '${resolvedPath}'`); + } + matchedMockDispatches = matchedMockDispatches.filter(({ method }) => matchValue(method, key.method)); + if (matchedMockDispatches.length === 0) { + throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}'`); + } + matchedMockDispatches = matchedMockDispatches.filter(({ body: body2 }) => typeof body2 !== "undefined" ? matchValue(body2, key.body) : true); + if (matchedMockDispatches.length === 0) { + throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}'`); + } + matchedMockDispatches = matchedMockDispatches.filter((mockDispatch2) => matchHeaders(mockDispatch2, key.headers)); + if (matchedMockDispatches.length === 0) { + throw new MockNotMatchedError(`Mock dispatch not matched for headers '${typeof key.headers === "object" ? JSON.stringify(key.headers) : key.headers}'`); + } + return matchedMockDispatches[0]; + } + function addMockDispatch(mockDispatches, key, data) { + const baseData = { timesInvoked: 0, times: 1, persist: false, consumed: false }; + const replyData = typeof data === "function" ? { callback: data } : { ...data }; + const newMockDispatch = { ...baseData, ...key, pending: true, data: { error: null, ...replyData } }; + mockDispatches.push(newMockDispatch); + return newMockDispatch; + } + function deleteMockDispatch(mockDispatches, key) { + const index = mockDispatches.findIndex((dispatch) => { + if (!dispatch.consumed) { + return false; + } + return matchKey(dispatch, key); + }); + if (index !== -1) { + mockDispatches.splice(index, 1); + } + } + function buildKey(opts) { + const { path, method, body: body2, headers: headers2, query } = opts; + return { + path, + method, + body: body2, + headers: headers2, + query + }; + } + function generateKeyValues(data) { + return Object.entries(data).reduce((keyValuePairs, [key, value]) => [ + ...keyValuePairs, + Buffer.from(`${key}`), + Array.isArray(value) ? value.map((x) => Buffer.from(`${x}`)) : Buffer.from(`${value}`) + ], []); + } + function getStatusText(statusCode) { + return STATUS_CODES[statusCode] || "unknown"; + } + async function getResponse(body2) { + const buffers = []; + for await (const data of body2) { + buffers.push(data); + } + return Buffer.concat(buffers).toString("utf8"); + } + function mockDispatch(opts, handler2) { + const key = buildKey(opts); + const mockDispatch2 = getMockDispatch(this[kDispatches], key); + mockDispatch2.timesInvoked++; + if (mockDispatch2.data.callback) { + mockDispatch2.data = { ...mockDispatch2.data, ...mockDispatch2.data.callback(opts) }; + } + const { data: { statusCode, data, headers: headers2, trailers, error }, delay, persist } = mockDispatch2; + const { timesInvoked, times } = mockDispatch2; + mockDispatch2.consumed = !persist && timesInvoked >= times; + mockDispatch2.pending = timesInvoked < times; + if (error !== null) { + deleteMockDispatch(this[kDispatches], key); + handler2.onError(error); + return true; + } + if (typeof delay === "number" && delay > 0) { + setTimeout(() => { + handleReply(this[kDispatches]); + }, delay); + } else { + handleReply(this[kDispatches]); + } + function handleReply(mockDispatches, _data = data) { + const optsHeaders = Array.isArray(opts.headers) ? buildHeadersFromArray(opts.headers) : opts.headers; + const body2 = typeof _data === "function" ? _data({ ...opts, headers: optsHeaders }) : _data; + if (isPromise(body2)) { + body2.then((newData) => handleReply(mockDispatches, newData)); + return; + } + const responseData = getResponseData2(body2); + const responseHeaders = generateKeyValues(headers2); + const responseTrailers = generateKeyValues(trailers); + handler2.abort = nop; + handler2.onHeaders(statusCode, responseHeaders, resume, getStatusText(statusCode)); + handler2.onData(Buffer.from(responseData)); + handler2.onComplete(responseTrailers); + deleteMockDispatch(mockDispatches, key); + } + function resume() { + } + return true; + } + function buildMockDispatch() { + const agent2 = this[kMockAgent]; + const origin = this[kOrigin]; + const originalDispatch = this[kOriginalDispatch]; + return function dispatch(opts, handler2) { + if (agent2.isMockActive) { + try { + mockDispatch.call(this, opts, handler2); + } catch (error) { + if (error instanceof MockNotMatchedError) { + const netConnect = agent2[kGetNetConnect](); + if (netConnect === false) { + throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)`); + } + if (checkNetConnect(netConnect, origin)) { + originalDispatch.call(this, opts, handler2); + } else { + throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)`); + } + } else { + throw error; + } + } + } else { + originalDispatch.call(this, opts, handler2); + } + }; + } + function checkNetConnect(netConnect, origin) { + const url = new URL(origin); + if (netConnect === true) { + return true; + } else if (Array.isArray(netConnect) && netConnect.some((matcher) => matchValue(matcher, url.host))) { + return true; + } + return false; + } + function buildMockOptions(opts) { + if (opts) { + const { agent: agent2, ...mockOptions } = opts; + return mockOptions; + } + } + mockUtils = { + getResponseData: getResponseData2, + getMockDispatch, + addMockDispatch, + deleteMockDispatch, + buildKey, + generateKeyValues, + matchValue, + getResponse, + getStatusText, + mockDispatch, + buildMockDispatch, + checkNetConnect, + buildMockOptions, + getHeaderByName + }; + return mockUtils; +} +var mockInterceptor = {}; +var hasRequiredMockInterceptor; +function requireMockInterceptor() { + if (hasRequiredMockInterceptor) return mockInterceptor; + hasRequiredMockInterceptor = 1; + const { getResponseData: getResponseData2, buildKey, addMockDispatch } = requireMockUtils(); + const { + kDispatches, + kDispatchKey, + kDefaultHeaders, + kDefaultTrailers, + kContentLength, + kMockDispatch + } = requireMockSymbols(); + const { InvalidArgumentError } = requireErrors(); + const { buildURL } = requireUtil$6(); + class MockScope { + constructor(mockDispatch) { + this[kMockDispatch] = mockDispatch; + } + /** + * Delay a reply by a set amount in ms. + */ + delay(waitInMs) { + if (typeof waitInMs !== "number" || !Number.isInteger(waitInMs) || waitInMs <= 0) { + throw new InvalidArgumentError("waitInMs must be a valid integer > 0"); + } + this[kMockDispatch].delay = waitInMs; + return this; + } + /** + * For a defined reply, never mark as consumed. + */ + persist() { + this[kMockDispatch].persist = true; + return this; + } + /** + * Allow one to define a reply for a set amount of matching requests. + */ + times(repeatTimes) { + if (typeof repeatTimes !== "number" || !Number.isInteger(repeatTimes) || repeatTimes <= 0) { + throw new InvalidArgumentError("repeatTimes must be a valid integer > 0"); + } + this[kMockDispatch].times = repeatTimes; + return this; + } + } + class MockInterceptor { + constructor(opts, mockDispatches) { + if (typeof opts !== "object") { + throw new InvalidArgumentError("opts must be an object"); + } + if (typeof opts.path === "undefined") { + throw new InvalidArgumentError("opts.path must be defined"); + } + if (typeof opts.method === "undefined") { + opts.method = "GET"; + } + if (typeof opts.path === "string") { + if (opts.query) { + opts.path = buildURL(opts.path, opts.query); + } else { + const parsedURL = new URL(opts.path, "data://"); + opts.path = parsedURL.pathname + parsedURL.search; + } + } + if (typeof opts.method === "string") { + opts.method = opts.method.toUpperCase(); + } + this[kDispatchKey] = buildKey(opts); + this[kDispatches] = mockDispatches; + this[kDefaultHeaders] = {}; + this[kDefaultTrailers] = {}; + this[kContentLength] = false; + } + createMockScopeDispatchData(statusCode, data, responseOptions = {}) { + const responseData = getResponseData2(data); + const contentLength = this[kContentLength] ? { "content-length": responseData.length } : {}; + const headers2 = { ...this[kDefaultHeaders], ...contentLength, ...responseOptions.headers }; + const trailers = { ...this[kDefaultTrailers], ...responseOptions.trailers }; + return { statusCode, data, headers: headers2, trailers }; + } + validateReplyParameters(statusCode, data, responseOptions) { + if (typeof statusCode === "undefined") { + throw new InvalidArgumentError("statusCode must be defined"); + } + if (typeof data === "undefined") { + throw new InvalidArgumentError("data must be defined"); + } + if (typeof responseOptions !== "object") { + throw new InvalidArgumentError("responseOptions must be an object"); + } + } + /** + * Mock an undici request with a defined reply. + */ + reply(replyData) { + if (typeof replyData === "function") { + const wrappedDefaultsCallback = (opts) => { + const resolvedData = replyData(opts); + if (typeof resolvedData !== "object") { + throw new InvalidArgumentError("reply options callback must return an object"); + } + const { statusCode: statusCode2, data: data2 = "", responseOptions: responseOptions2 = {} } = resolvedData; + this.validateReplyParameters(statusCode2, data2, responseOptions2); + return { + ...this.createMockScopeDispatchData(statusCode2, data2, responseOptions2) + }; + }; + const newMockDispatch2 = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback); + return new MockScope(newMockDispatch2); + } + const [statusCode, data = "", responseOptions = {}] = [...arguments]; + this.validateReplyParameters(statusCode, data, responseOptions); + const dispatchData = this.createMockScopeDispatchData(statusCode, data, responseOptions); + const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], dispatchData); + return new MockScope(newMockDispatch); + } + /** + * Mock an undici request with a defined error. + */ + replyWithError(error) { + if (typeof error === "undefined") { + throw new InvalidArgumentError("error must be defined"); + } + const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], { error }); + return new MockScope(newMockDispatch); + } + /** + * Set default reply headers on the interceptor for subsequent replies + */ + defaultReplyHeaders(headers2) { + if (typeof headers2 === "undefined") { + throw new InvalidArgumentError("headers must be defined"); + } + this[kDefaultHeaders] = headers2; + return this; + } + /** + * Set default reply trailers on the interceptor for subsequent replies + */ + defaultReplyTrailers(trailers) { + if (typeof trailers === "undefined") { + throw new InvalidArgumentError("trailers must be defined"); + } + this[kDefaultTrailers] = trailers; + return this; + } + /** + * Set reply content length header for replies on the interceptor + */ + replyContentLength() { + this[kContentLength] = true; + return this; + } + } + mockInterceptor.MockInterceptor = MockInterceptor; + mockInterceptor.MockScope = MockScope; + return mockInterceptor; +} +var mockClient; +var hasRequiredMockClient; +function requireMockClient() { + if (hasRequiredMockClient) return mockClient; + hasRequiredMockClient = 1; + const { promisify } = require$$0$2; + const Client = requireClient(); + const { buildMockDispatch } = requireMockUtils(); + const { + kDispatches, + kMockAgent, + kClose, + kOriginalClose, + kOrigin, + kOriginalDispatch, + kConnected + } = requireMockSymbols(); + const { MockInterceptor } = requireMockInterceptor(); + const Symbols = requireSymbols$4(); + const { InvalidArgumentError } = requireErrors(); + class MockClient extends Client { + constructor(origin, opts) { + super(origin, opts); + if (!opts || !opts.agent || typeof opts.agent.dispatch !== "function") { + throw new InvalidArgumentError("Argument opts.agent must implement Agent"); + } + this[kMockAgent] = opts.agent; + this[kOrigin] = origin; + this[kDispatches] = []; + this[kConnected] = 1; + this[kOriginalDispatch] = this.dispatch; + this[kOriginalClose] = this.close.bind(this); + this.dispatch = buildMockDispatch.call(this); + this.close = this[kClose]; + } + get [Symbols.kConnected]() { + return this[kConnected]; + } + /** + * Sets up the base interceptor for mocking replies from undici. + */ + intercept(opts) { + return new MockInterceptor(opts, this[kDispatches]); + } + async [kClose]() { + await promisify(this[kOriginalClose])(); + this[kConnected] = 0; + this[kMockAgent][Symbols.kClients].delete(this[kOrigin]); + } + } + mockClient = MockClient; + return mockClient; +} +var mockPool; +var hasRequiredMockPool; +function requireMockPool() { + if (hasRequiredMockPool) return mockPool; + hasRequiredMockPool = 1; + const { promisify } = require$$0$2; + const Pool = requirePool(); + const { buildMockDispatch } = requireMockUtils(); + const { + kDispatches, + kMockAgent, + kClose, + kOriginalClose, + kOrigin, + kOriginalDispatch, + kConnected + } = requireMockSymbols(); + const { MockInterceptor } = requireMockInterceptor(); + const Symbols = requireSymbols$4(); + const { InvalidArgumentError } = requireErrors(); + class MockPool extends Pool { + constructor(origin, opts) { + super(origin, opts); + if (!opts || !opts.agent || typeof opts.agent.dispatch !== "function") { + throw new InvalidArgumentError("Argument opts.agent must implement Agent"); + } + this[kMockAgent] = opts.agent; + this[kOrigin] = origin; + this[kDispatches] = []; + this[kConnected] = 1; + this[kOriginalDispatch] = this.dispatch; + this[kOriginalClose] = this.close.bind(this); + this.dispatch = buildMockDispatch.call(this); + this.close = this[kClose]; + } + get [Symbols.kConnected]() { + return this[kConnected]; + } + /** + * Sets up the base interceptor for mocking replies from undici. + */ + intercept(opts) { + return new MockInterceptor(opts, this[kDispatches]); + } + async [kClose]() { + await promisify(this[kOriginalClose])(); + this[kConnected] = 0; + this[kMockAgent][Symbols.kClients].delete(this[kOrigin]); + } + } + mockPool = MockPool; + return mockPool; +} +var pluralizer; +var hasRequiredPluralizer; +function requirePluralizer() { + if (hasRequiredPluralizer) return pluralizer; + hasRequiredPluralizer = 1; + const singulars = { + pronoun: "it", + is: "is", + was: "was", + this: "this" + }; + const plurals = { + pronoun: "they", + is: "are", + was: "were", + this: "these" + }; + pluralizer = class Pluralizer { + constructor(singular, plural) { + this.singular = singular; + this.plural = plural; + } + pluralize(count) { + const one = count === 1; + const keys = one ? singulars : plurals; + const noun = one ? this.singular : this.plural; + return { ...keys, count, noun }; + } + }; + return pluralizer; +} +var pendingInterceptorsFormatter; +var hasRequiredPendingInterceptorsFormatter; +function requirePendingInterceptorsFormatter() { + if (hasRequiredPendingInterceptorsFormatter) return pendingInterceptorsFormatter; + hasRequiredPendingInterceptorsFormatter = 1; + const { Transform } = require$$0$b; + const { Console } = require$$1$9; + pendingInterceptorsFormatter = class PendingInterceptorsFormatter { + constructor({ disableColors } = {}) { + this.transform = new Transform({ + transform(chunk, _enc, cb) { + cb(null, chunk); + } + }); + this.logger = new Console({ + stdout: this.transform, + inspectOptions: { + colors: !disableColors && !process.env.CI + } + }); + } + format(pendingInterceptors) { + const withPrettyHeaders = pendingInterceptors.map( + ({ method, path, data: { statusCode }, persist, times, timesInvoked, origin }) => ({ + Method: method, + Origin: origin, + Path: path, + "Status code": statusCode, + Persistent: persist ? "✅" : "❌", + Invocations: timesInvoked, + Remaining: persist ? Infinity : times - timesInvoked + }) + ); + this.logger.table(withPrettyHeaders); + return this.transform.read().toString(); + } + }; + return pendingInterceptorsFormatter; +} +var mockAgent; +var hasRequiredMockAgent; +function requireMockAgent() { + if (hasRequiredMockAgent) return mockAgent; + hasRequiredMockAgent = 1; + const { kClients } = requireSymbols$4(); + const Agent = requireAgent(); + const { + kAgent, + kMockAgentSet, + kMockAgentGet, + kDispatches, + kIsMockActive, + kNetConnect, + kGetNetConnect, + kOptions, + kFactory + } = requireMockSymbols(); + const MockClient = requireMockClient(); + const MockPool = requireMockPool(); + const { matchValue, buildMockOptions } = requireMockUtils(); + const { InvalidArgumentError, UndiciError } = requireErrors(); + const Dispatcher = requireDispatcher(); + const Pluralizer = requirePluralizer(); + const PendingInterceptorsFormatter = requirePendingInterceptorsFormatter(); + class FakeWeakRef { + constructor(value) { + this.value = value; + } + deref() { + return this.value; + } + } + class MockAgent extends Dispatcher { + constructor(opts) { + super(opts); + this[kNetConnect] = true; + this[kIsMockActive] = true; + if (opts && opts.agent && typeof opts.agent.dispatch !== "function") { + throw new InvalidArgumentError("Argument opts.agent must implement Agent"); + } + const agent2 = opts && opts.agent ? opts.agent : new Agent(opts); + this[kAgent] = agent2; + this[kClients] = agent2[kClients]; + this[kOptions] = buildMockOptions(opts); + } + get(origin) { + let dispatcher2 = this[kMockAgentGet](origin); + if (!dispatcher2) { + dispatcher2 = this[kFactory](origin); + this[kMockAgentSet](origin, dispatcher2); + } + return dispatcher2; + } + dispatch(opts, handler2) { + this.get(opts.origin); + return this[kAgent].dispatch(opts, handler2); + } + async close() { + await this[kAgent].close(); + this[kClients].clear(); + } + deactivate() { + this[kIsMockActive] = false; + } + activate() { + this[kIsMockActive] = true; + } + enableNetConnect(matcher) { + if (typeof matcher === "string" || typeof matcher === "function" || matcher instanceof RegExp) { + if (Array.isArray(this[kNetConnect])) { + this[kNetConnect].push(matcher); + } else { + this[kNetConnect] = [matcher]; + } + } else if (typeof matcher === "undefined") { + this[kNetConnect] = true; + } else { + throw new InvalidArgumentError("Unsupported matcher. Must be one of String|Function|RegExp."); + } + } + disableNetConnect() { + this[kNetConnect] = false; + } + // This is required to bypass issues caused by using global symbols - see: + // https://github.com/nodejs/undici/issues/1447 + get isMockActive() { + return this[kIsMockActive]; + } + [kMockAgentSet](origin, dispatcher2) { + this[kClients].set(origin, new FakeWeakRef(dispatcher2)); + } + [kFactory](origin) { + const mockOptions = Object.assign({ agent: this }, this[kOptions]); + return this[kOptions] && this[kOptions].connections === 1 ? new MockClient(origin, mockOptions) : new MockPool(origin, mockOptions); + } + [kMockAgentGet](origin) { + const ref = this[kClients].get(origin); + if (ref) { + return ref.deref(); + } + if (typeof origin !== "string") { + const dispatcher2 = this[kFactory]("http://localhost:9999"); + this[kMockAgentSet](origin, dispatcher2); + return dispatcher2; + } + for (const [keyMatcher, nonExplicitRef] of Array.from(this[kClients])) { + const nonExplicitDispatcher = nonExplicitRef.deref(); + if (nonExplicitDispatcher && typeof keyMatcher !== "string" && matchValue(keyMatcher, origin)) { + const dispatcher2 = this[kFactory](origin); + this[kMockAgentSet](origin, dispatcher2); + dispatcher2[kDispatches] = nonExplicitDispatcher[kDispatches]; + return dispatcher2; + } + } + } + [kGetNetConnect]() { + return this[kNetConnect]; + } + pendingInterceptors() { + const mockAgentClients = this[kClients]; + return Array.from(mockAgentClients.entries()).flatMap(([origin, scope]) => scope.deref()[kDispatches].map((dispatch) => ({ ...dispatch, origin }))).filter(({ pending }) => pending); + } + assertNoPendingInterceptors({ pendingInterceptorsFormatter: pendingInterceptorsFormatter2 = new PendingInterceptorsFormatter() } = {}) { + const pending = this.pendingInterceptors(); + if (pending.length === 0) { + return; + } + const pluralizer2 = new Pluralizer("interceptor", "interceptors").pluralize(pending.length); + throw new UndiciError(` +${pluralizer2.count} ${pluralizer2.noun} ${pluralizer2.is} pending: + +${pendingInterceptorsFormatter2.format(pending)} +`.trim()); + } + } + mockAgent = MockAgent; + return mockAgent; } -var util$3; -var hasRequiredUtil$3; -function requireUtil$3() { - if (hasRequiredUtil$3) return util$3; - hasRequiredUtil$3 = 1; - const { - kState, - kError, - kResult, - kAborted, - kLastProgressEventFired - } = requireSymbols$2(); - const { ProgressEvent } = requireProgressevent(); - const { getEncoding } = requireEncoding(); - const { DOMException: DOMException2 } = requireConstants$3(); - const { serializeAMimeType, parseMIMEType } = requireDataURL(); - const { types } = require$$0$2; - const { StringDecoder } = require$$6; - const { btoa } = require$$7; - const staticPropertyDescriptors = { - enumerable: true, - writable: false, - configurable: false - }; - function readOperation(fr, blob, type, encodingName) { - if (fr[kState] === "loading") { - throw new DOMException2("Invalid state", "InvalidStateError"); +var proxyAgent; +var hasRequiredProxyAgent; +function requireProxyAgent() { + if (hasRequiredProxyAgent) return proxyAgent; + hasRequiredProxyAgent = 1; + const { kProxy, kClose, kDestroy, kInterceptors } = requireSymbols$4(); + const { URL: URL2 } = require$$1$a; + const Agent = requireAgent(); + const Pool = requirePool(); + const DispatcherBase = requireDispatcherBase(); + const { InvalidArgumentError, RequestAbortedError } = requireErrors(); + const buildConnector = requireConnect(); + const kAgent = /* @__PURE__ */ Symbol("proxy agent"); + const kClient = /* @__PURE__ */ Symbol("proxy client"); + const kProxyHeaders = /* @__PURE__ */ Symbol("proxy headers"); + const kRequestTls = /* @__PURE__ */ Symbol("request tls settings"); + const kProxyTls = /* @__PURE__ */ Symbol("proxy tls settings"); + const kConnectEndpoint = /* @__PURE__ */ Symbol("connect endpoint function"); + function defaultProtocolPort(protocol) { + return protocol === "https:" ? 443 : 80; + } + function buildProxyOptions(opts) { + if (typeof opts === "string") { + opts = { uri: opts }; } - fr[kState] = "loading"; - fr[kResult] = null; - fr[kError] = null; - const stream = blob.stream(); - const reader = stream.getReader(); - const bytes = []; - let chunkPromise = reader.read(); - let isFirstChunk = true; - (async () => { - while (!fr[kAborted]) { - try { - const { done, value } = await chunkPromise; - if (isFirstChunk && !fr[kAborted]) { - queueMicrotask(() => { - fireAProgressEvent("loadstart", fr); - }); + if (!opts || !opts.uri) { + throw new InvalidArgumentError("Proxy opts.uri is mandatory"); + } + return { + uri: opts.uri, + protocol: opts.protocol || "https" + }; + } + function defaultFactory(origin, opts) { + return new Pool(origin, opts); + } + class ProxyAgent extends DispatcherBase { + constructor(opts) { + super(opts); + this[kProxy] = buildProxyOptions(opts); + this[kAgent] = new Agent(opts); + this[kInterceptors] = opts.interceptors && opts.interceptors.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent) ? opts.interceptors.ProxyAgent : []; + if (typeof opts === "string") { + opts = { uri: opts }; + } + if (!opts || !opts.uri) { + throw new InvalidArgumentError("Proxy opts.uri is mandatory"); + } + const { clientFactory = defaultFactory } = opts; + if (typeof clientFactory !== "function") { + throw new InvalidArgumentError("Proxy opts.clientFactory must be a function."); + } + this[kRequestTls] = opts.requestTls; + this[kProxyTls] = opts.proxyTls; + this[kProxyHeaders] = opts.headers || {}; + const resolvedUrl = new URL2(opts.uri); + const { origin, port, host, username, password } = resolvedUrl; + if (opts.auth && opts.token) { + throw new InvalidArgumentError("opts.auth cannot be used in combination with opts.token"); + } else if (opts.auth) { + this[kProxyHeaders]["proxy-authorization"] = `Basic ${opts.auth}`; + } else if (opts.token) { + this[kProxyHeaders]["proxy-authorization"] = opts.token; + } else if (username && password) { + this[kProxyHeaders]["proxy-authorization"] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString("base64")}`; + } + const connect2 = buildConnector({ ...opts.proxyTls }); + this[kConnectEndpoint] = buildConnector({ ...opts.requestTls }); + this[kClient] = clientFactory(resolvedUrl, { connect: connect2 }); + this[kAgent] = new Agent({ + ...opts, + connect: async (opts2, callback) => { + let requestedHost = opts2.host; + if (!opts2.port) { + requestedHost += `:${defaultProtocolPort(opts2.protocol)}`; } - isFirstChunk = false; - if (!done && types.isUint8Array(value)) { - bytes.push(value); - if ((fr[kLastProgressEventFired] === void 0 || Date.now() - fr[kLastProgressEventFired] >= 50) && !fr[kAborted]) { - fr[kLastProgressEventFired] = Date.now(); - queueMicrotask(() => { - fireAProgressEvent("progress", fr); - }); - } - chunkPromise = reader.read(); - } else if (done) { - queueMicrotask(() => { - fr[kState] = "done"; - try { - const result = packageData(bytes, type, blob.type, encodingName); - if (fr[kAborted]) { - return; - } - fr[kResult] = result; - fireAProgressEvent("load", fr); - } catch (error) { - fr[kError] = error; - fireAProgressEvent("error", fr); - } - if (fr[kState] !== "loading") { - fireAProgressEvent("loadend", fr); + try { + const { socket, statusCode } = await this[kClient].connect({ + origin, + port, + path: requestedHost, + signal: opts2.signal, + headers: { + ...this[kProxyHeaders], + host } }); - break; - } - } catch (error) { - if (fr[kAborted]) { - return; - } - queueMicrotask(() => { - fr[kState] = "done"; - fr[kError] = error; - fireAProgressEvent("error", fr); - if (fr[kState] !== "loading") { - fireAProgressEvent("loadend", fr); + if (statusCode !== 200) { + socket.on("error", () => { + }).destroy(); + callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`)); } - }); - break; - } - } - })(); - } - function fireAProgressEvent(e, reader) { - const event = new ProgressEvent(e, { - bubbles: false, - cancelable: false - }); - reader.dispatchEvent(event); - } - function packageData(bytes, type, mimeType, encodingName) { - switch (type) { - case "DataURL": { - let dataURL2 = "data:"; - const parsed = parseMIMEType(mimeType || "application/octet-stream"); - if (parsed !== "failure") { - dataURL2 += serializeAMimeType(parsed); - } - dataURL2 += ";base64,"; - const decoder = new StringDecoder("latin1"); - for (const chunk of bytes) { - dataURL2 += btoa(decoder.write(chunk)); - } - dataURL2 += btoa(decoder.end()); - return dataURL2; - } - case "Text": { - let encoding2 = "failure"; - if (encodingName) { - encoding2 = getEncoding(encodingName); - } - if (encoding2 === "failure" && mimeType) { - const type2 = parseMIMEType(mimeType); - if (type2 !== "failure") { - encoding2 = getEncoding(type2.parameters.get("charset")); + if (opts2.protocol !== "https:") { + callback(null, socket); + return; + } + let servername; + if (this[kRequestTls]) { + servername = this[kRequestTls].servername; + } else { + servername = opts2.servername; + } + this[kConnectEndpoint]({ ...opts2, servername, httpSocket: socket }, callback); + } catch (err) { + callback(err); } } - if (encoding2 === "failure") { - encoding2 = "UTF-8"; - } - return decode(bytes, encoding2); - } - case "ArrayBuffer": { - const sequence = combineByteSequences(bytes); - return sequence.buffer; - } - case "BinaryString": { - let binaryString = ""; - const decoder = new StringDecoder("latin1"); - for (const chunk of bytes) { - binaryString += decoder.write(chunk); - } - binaryString += decoder.end(); - return binaryString; - } + }); } - } - function decode(ioQueue, encoding2) { - const bytes = combineByteSequences(ioQueue); - const BOMEncoding = BOMSniffing(bytes); - let slice = 0; - if (BOMEncoding !== null) { - encoding2 = BOMEncoding; - slice = BOMEncoding === "UTF-8" ? 3 : 2; + dispatch(opts, handler2) { + const { host } = new URL2(opts.origin); + const headers2 = buildHeaders(opts.headers); + throwIfProxyAuthIsSent(headers2); + return this[kAgent].dispatch( + { + ...opts, + headers: { + ...headers2, + host + } + }, + handler2 + ); + } + async [kClose]() { + await this[kAgent].close(); + await this[kClient].close(); + } + async [kDestroy]() { + await this[kAgent].destroy(); + await this[kClient].destroy(); } - const sliced = bytes.slice(slice); - return new TextDecoder(encoding2).decode(sliced); } - function BOMSniffing(ioQueue) { - const [a, b, c] = ioQueue; - if (a === 239 && b === 187 && c === 191) { - return "UTF-8"; - } else if (a === 254 && b === 255) { - return "UTF-16BE"; - } else if (a === 255 && b === 254) { - return "UTF-16LE"; + function buildHeaders(headers2) { + if (Array.isArray(headers2)) { + const headersPair = {}; + for (let i = 0; i < headers2.length; i += 2) { + headersPair[headers2[i]] = headers2[i + 1]; + } + return headersPair; } - return null; + return headers2; } - function combineByteSequences(sequences) { - const size = sequences.reduce((a, b) => { - return a + b.byteLength; - }, 0); - let offset = 0; - return sequences.reduce((a, b) => { - a.set(b, offset); - offset += b.byteLength; - return a; - }, new Uint8Array(size)); + function throwIfProxyAuthIsSent(headers2) { + const existProxyAuth = headers2 && Object.keys(headers2).find((key) => key.toLowerCase() === "proxy-authorization"); + if (existProxyAuth) { + throw new InvalidArgumentError("Proxy-Authorization should be sent in ProxyAgent constructor"); + } } - util$3 = { - staticPropertyDescriptors, - readOperation, - fireAProgressEvent - }; - return util$3; + proxyAgent = ProxyAgent; + return proxyAgent; } -var filereader; -var hasRequiredFilereader; -function requireFilereader() { - if (hasRequiredFilereader) return filereader; - hasRequiredFilereader = 1; - const { - staticPropertyDescriptors, - readOperation, - fireAProgressEvent - } = requireUtil$3(); - const { - kState, - kError, - kResult, - kEvents, - kAborted - } = requireSymbols$2(); - const { webidl } = requireWebidl(); - const { kEnumerableProperty } = requireUtil$6(); - class FileReader extends EventTarget { - constructor() { - super(); - this[kState] = "empty"; - this[kResult] = null; - this[kError] = null; - this[kEvents] = { - loadend: null, - error: null, - abort: null, - load: null, - progress: null, - loadstart: null +var RetryHandler_1; +var hasRequiredRetryHandler; +function requireRetryHandler() { + if (hasRequiredRetryHandler) return RetryHandler_1; + hasRequiredRetryHandler = 1; + const assert = require$$0$9; + const { kRetryHandlerDefaultRetry } = requireSymbols$4(); + const { RequestRetryError } = requireErrors(); + const { isDisturbed, parseHeaders, parseRangeHeader } = requireUtil$6(); + function calculateRetryAfterHeader(retryAfter) { + const current = Date.now(); + const diff = new Date(retryAfter).getTime() - current; + return diff; + } + class RetryHandler { + constructor(opts, handlers) { + const { retryOptions, ...dispatchOpts } = opts; + const { + // Retry scoped + retry: retryFn, + maxRetries, + maxTimeout, + minTimeout, + timeoutFactor, + // Response scoped + methods, + errorCodes, + retryAfter, + statusCodes + } = retryOptions ?? {}; + this.dispatch = handlers.dispatch; + this.handler = handlers.handler; + this.opts = dispatchOpts; + this.abort = null; + this.aborted = false; + this.retryOpts = { + retry: retryFn ?? RetryHandler[kRetryHandlerDefaultRetry], + retryAfter: retryAfter ?? true, + maxTimeout: maxTimeout ?? 30 * 1e3, + // 30s, + timeout: minTimeout ?? 500, + // .5s + timeoutFactor: timeoutFactor ?? 2, + maxRetries: maxRetries ?? 5, + // What errors we should retry + methods: methods ?? ["GET", "HEAD", "OPTIONS", "PUT", "DELETE", "TRACE"], + // Indicates which errors to retry + statusCodes: statusCodes ?? [500, 502, 503, 504, 429], + // List of errors to retry + errorCodes: errorCodes ?? [ + "ECONNRESET", + "ECONNREFUSED", + "ENOTFOUND", + "ENETDOWN", + "ENETUNREACH", + "EHOSTDOWN", + "EHOSTUNREACH", + "EPIPE" + ] }; + this.retryCount = 0; + this.start = 0; + this.end = null; + this.etag = null; + this.resume = null; + this.handler.onConnect((reason) => { + this.aborted = true; + if (this.abort) { + this.abort(reason); + } else { + this.reason = reason; + } + }); } - /** - * @see https://w3c.github.io/FileAPI/#dfn-readAsArrayBuffer - * @param {import('buffer').Blob} blob - */ - readAsArrayBuffer(blob) { - webidl.brandCheck(this, FileReader); - webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsArrayBuffer" }); - blob = webidl.converters.Blob(blob, { strict: false }); - readOperation(this, blob, "ArrayBuffer"); + onRequestSent() { + if (this.handler.onRequestSent) { + this.handler.onRequestSent(); + } } - /** - * @see https://w3c.github.io/FileAPI/#readAsBinaryString - * @param {import('buffer').Blob} blob - */ - readAsBinaryString(blob) { - webidl.brandCheck(this, FileReader); - webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsBinaryString" }); - blob = webidl.converters.Blob(blob, { strict: false }); - readOperation(this, blob, "BinaryString"); + onUpgrade(statusCode, headers2, socket) { + if (this.handler.onUpgrade) { + this.handler.onUpgrade(statusCode, headers2, socket); + } } - /** - * @see https://w3c.github.io/FileAPI/#readAsDataText - * @param {import('buffer').Blob} blob - * @param {string?} encoding - */ - readAsText(blob, encoding2 = void 0) { - webidl.brandCheck(this, FileReader); - webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsText" }); - blob = webidl.converters.Blob(blob, { strict: false }); - if (encoding2 !== void 0) { - encoding2 = webidl.converters.DOMString(encoding2); + onConnect(abort) { + if (this.aborted) { + abort(this.reason); + } else { + this.abort = abort; } - readOperation(this, blob, "Text", encoding2); } - /** - * @see https://w3c.github.io/FileAPI/#dfn-readAsDataURL - * @param {import('buffer').Blob} blob - */ - readAsDataURL(blob) { - webidl.brandCheck(this, FileReader); - webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsDataURL" }); - blob = webidl.converters.Blob(blob, { strict: false }); - readOperation(this, blob, "DataURL"); + onBodySent(chunk) { + if (this.handler.onBodySent) return this.handler.onBodySent(chunk); } - /** - * @see https://w3c.github.io/FileAPI/#dfn-abort - */ - abort() { - if (this[kState] === "empty" || this[kState] === "done") { - this[kResult] = null; + static [kRetryHandlerDefaultRetry](err, { state, opts }, cb) { + const { statusCode, code, headers: headers2 } = err; + const { method, retryOptions } = opts; + const { + maxRetries, + timeout, + maxTimeout, + timeoutFactor, + statusCodes, + errorCodes, + methods + } = retryOptions; + let { counter, currentTimeout } = state; + currentTimeout = currentTimeout != null && currentTimeout > 0 ? currentTimeout : timeout; + if (code && code !== "UND_ERR_REQ_RETRY" && code !== "UND_ERR_SOCKET" && !errorCodes.includes(code)) { + cb(err); return; } - if (this[kState] === "loading") { - this[kState] = "done"; - this[kResult] = null; - } - this[kAborted] = true; - fireAProgressEvent("abort", this); - if (this[kState] !== "loading") { - fireAProgressEvent("loadend", this); + if (Array.isArray(methods) && !methods.includes(method)) { + cb(err); + return; } - } - /** - * @see https://w3c.github.io/FileAPI/#dom-filereader-readystate - */ - get readyState() { - webidl.brandCheck(this, FileReader); - switch (this[kState]) { - case "empty": - return this.EMPTY; - case "loading": - return this.LOADING; - case "done": - return this.DONE; + if (statusCode != null && Array.isArray(statusCodes) && !statusCodes.includes(statusCode)) { + cb(err); + return; } - } - /** - * @see https://w3c.github.io/FileAPI/#dom-filereader-result - */ - get result() { - webidl.brandCheck(this, FileReader); - return this[kResult]; - } - /** - * @see https://w3c.github.io/FileAPI/#dom-filereader-error - */ - get error() { - webidl.brandCheck(this, FileReader); - return this[kError]; - } - get onloadend() { - webidl.brandCheck(this, FileReader); - return this[kEvents].loadend; - } - set onloadend(fn) { - webidl.brandCheck(this, FileReader); - if (this[kEvents].loadend) { - this.removeEventListener("loadend", this[kEvents].loadend); + if (counter > maxRetries) { + cb(err); + return; } - if (typeof fn === "function") { - this[kEvents].loadend = fn; - this.addEventListener("loadend", fn); - } else { - this[kEvents].loadend = null; + let retryAfterHeader = headers2 != null && headers2["retry-after"]; + if (retryAfterHeader) { + retryAfterHeader = Number(retryAfterHeader); + retryAfterHeader = isNaN(retryAfterHeader) ? calculateRetryAfterHeader(retryAfterHeader) : retryAfterHeader * 1e3; } + const retryTimeout = retryAfterHeader > 0 ? Math.min(retryAfterHeader, maxTimeout) : Math.min(currentTimeout * timeoutFactor ** counter, maxTimeout); + state.currentTimeout = retryTimeout; + setTimeout(() => cb(null), retryTimeout); } - get onerror() { - webidl.brandCheck(this, FileReader); - return this[kEvents].error; - } - set onerror(fn) { - webidl.brandCheck(this, FileReader); - if (this[kEvents].error) { - this.removeEventListener("error", this[kEvents].error); + onHeaders(statusCode, rawHeaders, resume, statusMessage) { + const headers2 = parseHeaders(rawHeaders); + this.retryCount += 1; + if (statusCode >= 300) { + this.abort( + new RequestRetryError("Request failed", statusCode, { + headers: headers2, + count: this.retryCount + }) + ); + return false; } - if (typeof fn === "function") { - this[kEvents].error = fn; - this.addEventListener("error", fn); - } else { - this[kEvents].error = null; + if (this.resume != null) { + this.resume = null; + if (statusCode !== 206) { + return true; + } + const contentRange = parseRangeHeader(headers2["content-range"]); + if (!contentRange) { + this.abort( + new RequestRetryError("Content-Range mismatch", statusCode, { + headers: headers2, + count: this.retryCount + }) + ); + return false; + } + if (this.etag != null && this.etag !== headers2.etag) { + this.abort( + new RequestRetryError("ETag mismatch", statusCode, { + headers: headers2, + count: this.retryCount + }) + ); + return false; + } + const { start, size, end = size } = contentRange; + assert(this.start === start, "content-range mismatch"); + assert(this.end == null || this.end === end, "content-range mismatch"); + this.resume = resume; + return true; + } + if (this.end == null) { + if (statusCode === 206) { + const range = parseRangeHeader(headers2["content-range"]); + if (range == null) { + return this.handler.onHeaders( + statusCode, + rawHeaders, + resume, + statusMessage + ); + } + const { start, size, end = size } = range; + assert( + start != null && Number.isFinite(start) && this.start !== start, + "content-range mismatch" + ); + assert(Number.isFinite(start)); + assert( + end != null && Number.isFinite(end) && this.end !== end, + "invalid content-length" + ); + this.start = start; + this.end = end; + } + if (this.end == null) { + const contentLength = headers2["content-length"]; + this.end = contentLength != null ? Number(contentLength) : null; + } + assert(Number.isFinite(this.start)); + assert( + this.end == null || Number.isFinite(this.end), + "invalid content-length" + ); + this.resume = resume; + this.etag = headers2.etag != null ? headers2.etag : null; + return this.handler.onHeaders( + statusCode, + rawHeaders, + resume, + statusMessage + ); } + const err = new RequestRetryError("Request failed", statusCode, { + headers: headers2, + count: this.retryCount + }); + this.abort(err); + return false; + } + onData(chunk) { + this.start += chunk.length; + return this.handler.onData(chunk); } - get onloadstart() { - webidl.brandCheck(this, FileReader); - return this[kEvents].loadstart; + onComplete(rawTrailers) { + this.retryCount = 0; + return this.handler.onComplete(rawTrailers); } - set onloadstart(fn) { - webidl.brandCheck(this, FileReader); - if (this[kEvents].loadstart) { - this.removeEventListener("loadstart", this[kEvents].loadstart); + onError(err) { + if (this.aborted || isDisturbed(this.opts.body)) { + return this.handler.onError(err); } - if (typeof fn === "function") { - this[kEvents].loadstart = fn; - this.addEventListener("loadstart", fn); - } else { - this[kEvents].loadstart = null; + this.retryOpts.retry( + err, + { + state: { counter: this.retryCount++, currentTimeout: this.retryAfter }, + opts: { retryOptions: this.retryOpts, ...this.opts } + }, + onRetry.bind(this) + ); + function onRetry(err2) { + if (err2 != null || this.aborted || isDisturbed(this.opts.body)) { + return this.handler.onError(err2); + } + if (this.start !== 0) { + this.opts = { + ...this.opts, + headers: { + ...this.opts.headers, + range: `bytes=${this.start}-${this.end ?? ""}` + } + }; + } + try { + this.dispatch(this.opts, this); + } catch (err3) { + this.handler.onError(err3); + } } } - get onprogress() { - webidl.brandCheck(this, FileReader); - return this[kEvents].progress; + } + RetryHandler_1 = RetryHandler; + return RetryHandler_1; +} +var global$1; +var hasRequiredGlobal; +function requireGlobal() { + if (hasRequiredGlobal) return global$1; + hasRequiredGlobal = 1; + const globalDispatcher = /* @__PURE__ */ Symbol.for("undici.globalDispatcher.1"); + const { InvalidArgumentError } = requireErrors(); + const Agent = requireAgent(); + if (getGlobalDispatcher() === void 0) { + setGlobalDispatcher(new Agent()); + } + function setGlobalDispatcher(agent2) { + if (!agent2 || typeof agent2.dispatch !== "function") { + throw new InvalidArgumentError("Argument agent must implement Agent"); } - set onprogress(fn) { - webidl.brandCheck(this, FileReader); - if (this[kEvents].progress) { - this.removeEventListener("progress", this[kEvents].progress); - } - if (typeof fn === "function") { - this[kEvents].progress = fn; - this.addEventListener("progress", fn); - } else { - this[kEvents].progress = null; - } + Object.defineProperty(globalThis, globalDispatcher, { + value: agent2, + writable: true, + enumerable: false, + configurable: false + }); + } + function getGlobalDispatcher() { + return globalThis[globalDispatcher]; + } + global$1 = { + setGlobalDispatcher, + getGlobalDispatcher + }; + return global$1; +} +var DecoratorHandler_1; +var hasRequiredDecoratorHandler; +function requireDecoratorHandler() { + if (hasRequiredDecoratorHandler) return DecoratorHandler_1; + hasRequiredDecoratorHandler = 1; + DecoratorHandler_1 = class DecoratorHandler { + constructor(handler2) { + this.handler = handler2; } - get onload() { - webidl.brandCheck(this, FileReader); - return this[kEvents].load; + onConnect(...args) { + return this.handler.onConnect(...args); } - set onload(fn) { - webidl.brandCheck(this, FileReader); - if (this[kEvents].load) { - this.removeEventListener("load", this[kEvents].load); - } - if (typeof fn === "function") { - this[kEvents].load = fn; - this.addEventListener("load", fn); - } else { - this[kEvents].load = null; - } + onError(...args) { + return this.handler.onError(...args); } - get onabort() { - webidl.brandCheck(this, FileReader); - return this[kEvents].abort; + onUpgrade(...args) { + return this.handler.onUpgrade(...args); } - set onabort(fn) { - webidl.brandCheck(this, FileReader); - if (this[kEvents].abort) { - this.removeEventListener("abort", this[kEvents].abort); - } - if (typeof fn === "function") { - this[kEvents].abort = fn; - this.addEventListener("abort", fn); - } else { - this[kEvents].abort = null; - } + onHeaders(...args) { + return this.handler.onHeaders(...args); } - } - FileReader.EMPTY = FileReader.prototype.EMPTY = 0; - FileReader.LOADING = FileReader.prototype.LOADING = 1; - FileReader.DONE = FileReader.prototype.DONE = 2; - Object.defineProperties(FileReader.prototype, { - EMPTY: staticPropertyDescriptors, - LOADING: staticPropertyDescriptors, - DONE: staticPropertyDescriptors, - readAsArrayBuffer: kEnumerableProperty, - readAsBinaryString: kEnumerableProperty, - readAsText: kEnumerableProperty, - readAsDataURL: kEnumerableProperty, - abort: kEnumerableProperty, - readyState: kEnumerableProperty, - result: kEnumerableProperty, - error: kEnumerableProperty, - onloadstart: kEnumerableProperty, - onprogress: kEnumerableProperty, - onload: kEnumerableProperty, - onabort: kEnumerableProperty, - onerror: kEnumerableProperty, - onloadend: kEnumerableProperty, - [Symbol.toStringTag]: { - value: "FileReader", - writable: false, - enumerable: false, - configurable: true + onData(...args) { + return this.handler.onData(...args); + } + onComplete(...args) { + return this.handler.onComplete(...args); + } + onBodySent(...args) { + return this.handler.onBodySent(...args); } - }); - Object.defineProperties(FileReader, { - EMPTY: staticPropertyDescriptors, - LOADING: staticPropertyDescriptors, - DONE: staticPropertyDescriptors - }); - filereader = { - FileReader - }; - return filereader; -} -var symbols$1; -var hasRequiredSymbols$1; -function requireSymbols$1() { - if (hasRequiredSymbols$1) return symbols$1; - hasRequiredSymbols$1 = 1; - symbols$1 = { - kConstruct: requireSymbols$4().kConstruct }; - return symbols$1; + return DecoratorHandler_1; } -var util$2; -var hasRequiredUtil$2; -function requireUtil$2() { - if (hasRequiredUtil$2) return util$2; - hasRequiredUtil$2 = 1; - const assert = require$$0$3; - const { URLSerializer } = requireDataURL(); - const { isValidHeaderName } = requireUtil$5(); - function urlEquals(A, B, excludeFragment = false) { - const serializedA = URLSerializer(A, excludeFragment); - const serializedB = URLSerializer(B, excludeFragment); - return serializedA === serializedB; +var headers; +var hasRequiredHeaders; +function requireHeaders() { + if (hasRequiredHeaders) return headers; + hasRequiredHeaders = 1; + const { kHeadersList, kConstruct } = requireSymbols$4(); + const { kGuard } = requireSymbols$3(); + const { kEnumerableProperty } = requireUtil$6(); + const { + makeIterator, + isValidHeaderName, + isValidHeaderValue + } = requireUtil$5(); + const util2 = require$$0$2; + const { webidl } = requireWebidl(); + const assert = require$$0$9; + const kHeadersMap = /* @__PURE__ */ Symbol("headers map"); + const kHeadersSortedMap = /* @__PURE__ */ Symbol("headers map sorted"); + function isHTTPWhiteSpaceCharCode(code) { + return code === 10 || code === 13 || code === 9 || code === 32; } - function fieldValues(header) { - assert(header !== null); - const values = []; - for (let value of header.split(",")) { - value = value.trim(); - if (!value.length) { - continue; - } else if (!isValidHeaderName(value)) { - continue; + function headerValueNormalize(potentialValue) { + let i = 0; + let j = potentialValue.length; + while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(j - 1))) --j; + while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(i))) ++i; + return i === 0 && j === potentialValue.length ? potentialValue : potentialValue.substring(i, j); + } + function fill(headers2, object) { + if (Array.isArray(object)) { + for (let i = 0; i < object.length; ++i) { + const header = object[i]; + if (header.length !== 2) { + throw webidl.errors.exception({ + header: "Headers constructor", + message: `expected name/value pair to be length 2, found ${header.length}.` + }); + } + appendHeader(headers2, header[0], header[1]); + } + } else if (typeof object === "object" && object !== null) { + const keys = Object.keys(object); + for (let i = 0; i < keys.length; ++i) { + appendHeader(headers2, keys[i], object[keys[i]]); } - values.push(value); + } else { + throw webidl.errors.conversionFailed({ + prefix: "Headers constructor", + argument: "Argument 1", + types: ["sequence>", "record"] + }); } - return values; } - util$2 = { - urlEquals, - fieldValues - }; - return util$2; -} -var cache; -var hasRequiredCache; -function requireCache() { - if (hasRequiredCache) return cache; - hasRequiredCache = 1; - const { kConstruct } = requireSymbols$1(); - const { urlEquals, fieldValues: getFieldValues } = requireUtil$2(); - const { kEnumerableProperty, isDisturbed } = requireUtil$6(); - const { kHeadersList } = requireSymbols$4(); - const { webidl } = requireWebidl(); - const { Response, cloneResponse } = requireResponse(); - const { Request } = requireRequest(); - const { kState, kHeaders, kGuard, kRealm } = requireSymbols$3(); - const { fetching } = requireFetch(); - const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = requireUtil$5(); - const assert = require$$0$3; - const { getGlobalDispatcher } = requireGlobal(); - class Cache { - /** - * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-request-response-list - * @type {requestResponseList} - */ - #relevantRequestResponseList; - constructor() { - if (arguments[0] !== kConstruct) { - webidl.illegalConstructor(); - } - this.#relevantRequestResponseList = arguments[1]; + function appendHeader(headers2, name, value) { + value = headerValueNormalize(value); + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: "Headers.append", + value: name, + type: "header name" + }); + } else if (!isValidHeaderValue(value)) { + throw webidl.errors.invalidArgument({ + prefix: "Headers.append", + value, + type: "header value" + }); } - async match(request2, options = {}) { - webidl.brandCheck(this, Cache); - webidl.argumentLengthCheck(arguments, 1, { header: "Cache.match" }); - request2 = webidl.converters.RequestInfo(request2); - options = webidl.converters.CacheQueryOptions(options); - const p = await this.matchAll(request2, options); - if (p.length === 0) { - return; + if (headers2[kGuard] === "immutable") { + throw new TypeError("immutable"); + } else if (headers2[kGuard] === "request-no-cors") ; + return headers2[kHeadersList].append(name, value); + } + class HeadersList { + /** @type {[string, string][]|null} */ + cookies = null; + constructor(init) { + if (init instanceof HeadersList) { + this[kHeadersMap] = new Map(init[kHeadersMap]); + this[kHeadersSortedMap] = init[kHeadersSortedMap]; + this.cookies = init.cookies === null ? null : [...init.cookies]; + } else { + this[kHeadersMap] = new Map(init); + this[kHeadersSortedMap] = null; } - return p[0]; } - async matchAll(request2 = void 0, options = {}) { - webidl.brandCheck(this, Cache); - if (request2 !== void 0) request2 = webidl.converters.RequestInfo(request2); - options = webidl.converters.CacheQueryOptions(options); - let r = null; - if (request2 !== void 0) { - if (request2 instanceof Request) { - r = request2[kState]; - if (r.method !== "GET" && !options.ignoreMethod) { - return []; - } - } else if (typeof request2 === "string") { - r = new Request(request2)[kState]; - } - } - const responses = []; - if (request2 === void 0) { - for (const requestResponse of this.#relevantRequestResponseList) { - responses.push(requestResponse[1]); - } + // https://fetch.spec.whatwg.org/#header-list-contains + contains(name) { + name = name.toLowerCase(); + return this[kHeadersMap].has(name); + } + clear() { + this[kHeadersMap].clear(); + this[kHeadersSortedMap] = null; + this.cookies = null; + } + // https://fetch.spec.whatwg.org/#concept-header-list-append + append(name, value) { + this[kHeadersSortedMap] = null; + const lowercaseName = name.toLowerCase(); + const exists = this[kHeadersMap].get(lowercaseName); + if (exists) { + const delimiter = lowercaseName === "cookie" ? "; " : ", "; + this[kHeadersMap].set(lowercaseName, { + name: exists.name, + value: `${exists.value}${delimiter}${value}` + }); } else { - const requestResponses = this.#queryCache(r, options); - for (const requestResponse of requestResponses) { - responses.push(requestResponse[1]); - } + this[kHeadersMap].set(lowercaseName, { name, value }); } - const responseList = []; - for (const response2 of responses) { - const responseObject = new Response(response2.body?.source ?? null); - const body2 = responseObject[kState].body; - responseObject[kState] = response2; - responseObject[kState].body = body2; - responseObject[kHeaders][kHeadersList] = response2.headersList; - responseObject[kHeaders][kGuard] = "immutable"; - responseList.push(responseObject); + if (lowercaseName === "set-cookie") { + this.cookies ??= []; + this.cookies.push(value); } - return Object.freeze(responseList); - } - async add(request2) { - webidl.brandCheck(this, Cache); - webidl.argumentLengthCheck(arguments, 1, { header: "Cache.add" }); - request2 = webidl.converters.RequestInfo(request2); - const requests = [request2]; - const responseArrayPromise = this.addAll(requests); - return await responseArrayPromise; } - async addAll(requests) { - webidl.brandCheck(this, Cache); - webidl.argumentLengthCheck(arguments, 1, { header: "Cache.addAll" }); - requests = webidl.converters["sequence"](requests); - const responsePromises = []; - const requestList = []; - for (const request2 of requests) { - if (typeof request2 === "string") { - continue; - } - const r = request2[kState]; - if (!urlIsHttpHttpsScheme(r.url) || r.method !== "GET") { - throw webidl.errors.exception({ - header: "Cache.addAll", - message: "Expected http/s scheme when method is not GET." - }); - } - } - const fetchControllers = []; - for (const request2 of requests) { - const r = new Request(request2)[kState]; - if (!urlIsHttpHttpsScheme(r.url)) { - throw webidl.errors.exception({ - header: "Cache.addAll", - message: "Expected http/s scheme." - }); - } - r.initiator = "fetch"; - r.destination = "subresource"; - requestList.push(r); - const responsePromise = createDeferredPromise(); - fetchControllers.push(fetching({ - request: r, - dispatcher: getGlobalDispatcher(), - processResponse(response2) { - if (response2.type === "error" || response2.status === 206 || response2.status < 200 || response2.status > 299) { - responsePromise.reject(webidl.errors.exception({ - header: "Cache.addAll", - message: "Received an invalid status code or the request failed." - })); - } else if (response2.headersList.contains("vary")) { - const fieldValues = getFieldValues(response2.headersList.get("vary")); - for (const fieldValue of fieldValues) { - if (fieldValue === "*") { - responsePromise.reject(webidl.errors.exception({ - header: "Cache.addAll", - message: "invalid vary field value" - })); - for (const controller of fetchControllers) { - controller.abort(); - } - return; - } - } - } - }, - processResponseEndOfBody(response2) { - if (response2.aborted) { - responsePromise.reject(new DOMException("aborted", "AbortError")); - return; - } - responsePromise.resolve(response2); - } - })); - responsePromises.push(responsePromise.promise); + // https://fetch.spec.whatwg.org/#concept-header-list-set + set(name, value) { + this[kHeadersSortedMap] = null; + const lowercaseName = name.toLowerCase(); + if (lowercaseName === "set-cookie") { + this.cookies = [value]; } - const p = Promise.all(responsePromises); - const responses = await p; - const operations = []; - let index = 0; - for (const response2 of responses) { - const operation = { - type: "put", - // 7.3.2 - request: requestList[index], - // 7.3.3 - response: response2 - // 7.3.4 - }; - operations.push(operation); - index++; + this[kHeadersMap].set(lowercaseName, { name, value }); + } + // https://fetch.spec.whatwg.org/#concept-header-list-delete + delete(name) { + this[kHeadersSortedMap] = null; + name = name.toLowerCase(); + if (name === "set-cookie") { + this.cookies = null; } - const cacheJobPromise = createDeferredPromise(); - let errorData = null; - try { - this.#batchCacheOperations(operations); - } catch (e) { - errorData = e; + this[kHeadersMap].delete(name); + } + // https://fetch.spec.whatwg.org/#concept-header-list-get + get(name) { + const value = this[kHeadersMap].get(name.toLowerCase()); + return value === void 0 ? null : value.value; + } + *[Symbol.iterator]() { + for (const [name, { value }] of this[kHeadersMap]) { + yield [name, value]; } - queueMicrotask(() => { - if (errorData === null) { - cacheJobPromise.resolve(void 0); - } else { - cacheJobPromise.reject(errorData); + } + get entries() { + const headers2 = {}; + if (this[kHeadersMap].size) { + for (const { name, value } of this[kHeadersMap].values()) { + headers2[name] = value; } - }); - return cacheJobPromise.promise; + } + return headers2; } - async put(request2, response2) { - webidl.brandCheck(this, Cache); - webidl.argumentLengthCheck(arguments, 2, { header: "Cache.put" }); - request2 = webidl.converters.RequestInfo(request2); - response2 = webidl.converters.Response(response2); - let innerRequest = null; - if (request2 instanceof Request) { - innerRequest = request2[kState]; - } else { - innerRequest = new Request(request2)[kState]; + } + class Headers { + constructor(init = void 0) { + if (init === kConstruct) { + return; } - if (!urlIsHttpHttpsScheme(innerRequest.url) || innerRequest.method !== "GET") { - throw webidl.errors.exception({ - header: "Cache.put", - message: "Expected an http/s scheme when method is not GET" - }); + this[kHeadersList] = new HeadersList(); + this[kGuard] = "none"; + if (init !== void 0) { + init = webidl.converters.HeadersInit(init); + fill(this, init); } - const innerResponse = response2[kState]; - if (innerResponse.status === 206) { - throw webidl.errors.exception({ - header: "Cache.put", - message: "Got 206 status" + } + // https://fetch.spec.whatwg.org/#dom-headers-append + append(name, value) { + webidl.brandCheck(this, Headers); + webidl.argumentLengthCheck(arguments, 2, { header: "Headers.append" }); + name = webidl.converters.ByteString(name); + value = webidl.converters.ByteString(value); + return appendHeader(this, name, value); + } + // https://fetch.spec.whatwg.org/#dom-headers-delete + delete(name) { + webidl.brandCheck(this, Headers); + webidl.argumentLengthCheck(arguments, 1, { header: "Headers.delete" }); + name = webidl.converters.ByteString(name); + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: "Headers.delete", + value: name, + type: "header name" }); } - if (innerResponse.headersList.contains("vary")) { - const fieldValues = getFieldValues(innerResponse.headersList.get("vary")); - for (const fieldValue of fieldValues) { - if (fieldValue === "*") { - throw webidl.errors.exception({ - header: "Cache.put", - message: "Got * vary field value" - }); - } - } + if (this[kGuard] === "immutable") { + throw new TypeError("immutable"); + } else if (this[kGuard] === "request-no-cors") ; + if (!this[kHeadersList].contains(name)) { + return; } - if (innerResponse.body && (isDisturbed(innerResponse.body.stream) || innerResponse.body.stream.locked)) { - throw webidl.errors.exception({ - header: "Cache.put", - message: "Response body is locked or disturbed" + this[kHeadersList].delete(name); + } + // https://fetch.spec.whatwg.org/#dom-headers-get + get(name) { + webidl.brandCheck(this, Headers); + webidl.argumentLengthCheck(arguments, 1, { header: "Headers.get" }); + name = webidl.converters.ByteString(name); + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: "Headers.get", + value: name, + type: "header name" }); } - const clonedResponse = cloneResponse(innerResponse); - const bodyReadPromise = createDeferredPromise(); - if (innerResponse.body != null) { - const stream = innerResponse.body.stream; - const reader = stream.getReader(); - readAllBytes(reader).then(bodyReadPromise.resolve, bodyReadPromise.reject); - } else { - bodyReadPromise.resolve(void 0); + return this[kHeadersList].get(name); + } + // https://fetch.spec.whatwg.org/#dom-headers-has + has(name) { + webidl.brandCheck(this, Headers); + webidl.argumentLengthCheck(arguments, 1, { header: "Headers.has" }); + name = webidl.converters.ByteString(name); + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: "Headers.has", + value: name, + type: "header name" + }); } - const operations = []; - const operation = { - type: "put", - // 14. - request: innerRequest, - // 15. - response: clonedResponse - // 16. - }; - operations.push(operation); - const bytes = await bodyReadPromise.promise; - if (clonedResponse.body != null) { - clonedResponse.body.source = bytes; + return this[kHeadersList].contains(name); + } + // https://fetch.spec.whatwg.org/#dom-headers-set + set(name, value) { + webidl.brandCheck(this, Headers); + webidl.argumentLengthCheck(arguments, 2, { header: "Headers.set" }); + name = webidl.converters.ByteString(name); + value = webidl.converters.ByteString(value); + value = headerValueNormalize(value); + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: "Headers.set", + value: name, + type: "header name" + }); + } else if (!isValidHeaderValue(value)) { + throw webidl.errors.invalidArgument({ + prefix: "Headers.set", + value, + type: "header value" + }); } - const cacheJobPromise = createDeferredPromise(); - let errorData = null; - try { - this.#batchCacheOperations(operations); - } catch (e) { - errorData = e; + if (this[kGuard] === "immutable") { + throw new TypeError("immutable"); + } else if (this[kGuard] === "request-no-cors") ; + this[kHeadersList].set(name, value); + } + // https://fetch.spec.whatwg.org/#dom-headers-getsetcookie + getSetCookie() { + webidl.brandCheck(this, Headers); + const list = this[kHeadersList].cookies; + if (list) { + return [...list]; } - queueMicrotask(() => { - if (errorData === null) { - cacheJobPromise.resolve(); + return []; + } + // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine + get [kHeadersSortedMap]() { + if (this[kHeadersList][kHeadersSortedMap]) { + return this[kHeadersList][kHeadersSortedMap]; + } + const headers2 = []; + const names = [...this[kHeadersList]].sort((a, b) => a[0] < b[0] ? -1 : 1); + const cookies2 = this[kHeadersList].cookies; + for (let i = 0; i < names.length; ++i) { + const [name, value] = names[i]; + if (name === "set-cookie") { + for (let j = 0; j < cookies2.length; ++j) { + headers2.push([name, cookies2[j]]); + } } else { - cacheJobPromise.reject(errorData); + assert(value !== null); + headers2.push([name, value]); } - }); - return cacheJobPromise.promise; + } + this[kHeadersList][kHeadersSortedMap] = headers2; + return headers2; } - async delete(request2, options = {}) { - webidl.brandCheck(this, Cache); - webidl.argumentLengthCheck(arguments, 1, { header: "Cache.delete" }); - request2 = webidl.converters.RequestInfo(request2); - options = webidl.converters.CacheQueryOptions(options); - let r = null; - if (request2 instanceof Request) { - r = request2[kState]; - if (r.method !== "GET" && !options.ignoreMethod) { - return false; - } - } else { - assert(typeof request2 === "string"); - r = new Request(request2)[kState]; + keys() { + webidl.brandCheck(this, Headers); + if (this[kGuard] === "immutable") { + const value = this[kHeadersSortedMap]; + return makeIterator( + () => value, + "Headers", + "key" + ); } - const operations = []; - const operation = { - type: "delete", - request: r, - options - }; - operations.push(operation); - const cacheJobPromise = createDeferredPromise(); - let errorData = null; - let requestResponses; - try { - requestResponses = this.#batchCacheOperations(operations); - } catch (e) { - errorData = e; + return makeIterator( + () => [...this[kHeadersSortedMap].values()], + "Headers", + "key" + ); + } + values() { + webidl.brandCheck(this, Headers); + if (this[kGuard] === "immutable") { + const value = this[kHeadersSortedMap]; + return makeIterator( + () => value, + "Headers", + "value" + ); + } + return makeIterator( + () => [...this[kHeadersSortedMap].values()], + "Headers", + "value" + ); + } + entries() { + webidl.brandCheck(this, Headers); + if (this[kGuard] === "immutable") { + const value = this[kHeadersSortedMap]; + return makeIterator( + () => value, + "Headers", + "key+value" + ); } - queueMicrotask(() => { - if (errorData === null) { - cacheJobPromise.resolve(!!requestResponses?.length); - } else { - cacheJobPromise.reject(errorData); - } - }); - return cacheJobPromise.promise; + return makeIterator( + () => [...this[kHeadersSortedMap].values()], + "Headers", + "key+value" + ); } /** - * @see https://w3c.github.io/ServiceWorker/#dom-cache-keys - * @param {any} request - * @param {import('../../types/cache').CacheQueryOptions} options - * @returns {readonly Request[]} + * @param {(value: string, key: string, self: Headers) => void} callbackFn + * @param {unknown} thisArg */ - async keys(request2 = void 0, options = {}) { - webidl.brandCheck(this, Cache); - if (request2 !== void 0) request2 = webidl.converters.RequestInfo(request2); - options = webidl.converters.CacheQueryOptions(options); - let r = null; - if (request2 !== void 0) { - if (request2 instanceof Request) { - r = request2[kState]; - if (r.method !== "GET" && !options.ignoreMethod) { - return []; - } - } else if (typeof request2 === "string") { - r = new Request(request2)[kState]; - } + forEach(callbackFn, thisArg = globalThis) { + webidl.brandCheck(this, Headers); + webidl.argumentLengthCheck(arguments, 1, { header: "Headers.forEach" }); + if (typeof callbackFn !== "function") { + throw new TypeError( + "Failed to execute 'forEach' on 'Headers': parameter 1 is not of type 'Function'." + ); } - const promise = createDeferredPromise(); - const requests = []; - if (request2 === void 0) { - for (const requestResponse of this.#relevantRequestResponseList) { - requests.push(requestResponse[0]); - } - } else { - const requestResponses = this.#queryCache(r, options); - for (const requestResponse of requestResponses) { - requests.push(requestResponse[0]); - } + for (const [key, value] of this) { + callbackFn.apply(thisArg, [value, key, this]); } - queueMicrotask(() => { - const requestList = []; - for (const request3 of requests) { - const requestObject = new Request("https://a"); - requestObject[kState] = request3; - requestObject[kHeaders][kHeadersList] = request3.headersList; - requestObject[kHeaders][kGuard] = "immutable"; - requestObject[kRealm] = request3.client; - requestList.push(requestObject); - } - promise.resolve(Object.freeze(requestList)); - }); - return promise.promise; } - /** - * @see https://w3c.github.io/ServiceWorker/#batch-cache-operations-algorithm - * @param {CacheBatchOperation[]} operations - * @returns {requestResponseList} - */ - #batchCacheOperations(operations) { - const cache2 = this.#relevantRequestResponseList; - const backupCache = [...cache2]; - const addedItems = []; - const resultList = []; - try { - for (const operation of operations) { - if (operation.type !== "delete" && operation.type !== "put") { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: 'operation type does not match "delete" or "put"' - }); - } - if (operation.type === "delete" && operation.response != null) { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: "delete operation should not have an associated response" - }); - } - if (this.#queryCache(operation.request, operation.options, addedItems).length) { - throw new DOMException("???", "InvalidStateError"); - } - let requestResponses; - if (operation.type === "delete") { - requestResponses = this.#queryCache(operation.request, operation.options); - if (requestResponses.length === 0) { - return []; - } - for (const requestResponse of requestResponses) { - const idx = cache2.indexOf(requestResponse); - assert(idx !== -1); - cache2.splice(idx, 1); - } - } else if (operation.type === "put") { - if (operation.response == null) { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: "put operation should have an associated response" - }); - } - const r = operation.request; - if (!urlIsHttpHttpsScheme(r.url)) { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: "expected http or https scheme" - }); - } - if (r.method !== "GET") { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: "not get method" - }); - } - if (operation.options != null) { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: "options must not be defined" - }); - } - requestResponses = this.#queryCache(operation.request); - for (const requestResponse of requestResponses) { - const idx = cache2.indexOf(requestResponse); - assert(idx !== -1); - cache2.splice(idx, 1); - } - cache2.push([operation.request, operation.response]); - addedItems.push([operation.request, operation.response]); - } - resultList.push([operation.request, operation.response]); - } - return resultList; - } catch (e) { - this.#relevantRequestResponseList.length = 0; - this.#relevantRequestResponseList = backupCache; - throw e; + [/* @__PURE__ */ Symbol.for("nodejs.util.inspect.custom")]() { + webidl.brandCheck(this, Headers); + return this[kHeadersList]; + } + } + Headers.prototype[Symbol.iterator] = Headers.prototype.entries; + Object.defineProperties(Headers.prototype, { + append: kEnumerableProperty, + delete: kEnumerableProperty, + get: kEnumerableProperty, + has: kEnumerableProperty, + set: kEnumerableProperty, + getSetCookie: kEnumerableProperty, + keys: kEnumerableProperty, + values: kEnumerableProperty, + entries: kEnumerableProperty, + forEach: kEnumerableProperty, + [Symbol.iterator]: { enumerable: false }, + [Symbol.toStringTag]: { + value: "Headers", + configurable: true + }, + [util2.inspect.custom]: { + enumerable: false + } + }); + webidl.converters.HeadersInit = function(V) { + if (webidl.util.Type(V) === "Object") { + if (V[Symbol.iterator]) { + return webidl.converters["sequence>"](V); } + return webidl.converters["record"](V); } - /** - * @see https://w3c.github.io/ServiceWorker/#query-cache - * @param {any} requestQuery - * @param {import('../../types/cache').CacheQueryOptions} options - * @param {requestResponseList} targetStorage - * @returns {requestResponseList} - */ - #queryCache(requestQuery, options, targetStorage) { - const resultList = []; - const storage = targetStorage ?? this.#relevantRequestResponseList; - for (const requestResponse of storage) { - const [cachedRequest, cachedResponse] = requestResponse; - if (this.#requestMatchesCachedItem(requestQuery, cachedRequest, cachedResponse, options)) { - resultList.push(requestResponse); - } + throw webidl.errors.conversionFailed({ + prefix: "Headers constructor", + argument: "Argument 1", + types: ["sequence>", "record"] + }); + }; + headers = { + fill, + Headers, + HeadersList + }; + return headers; +} +var response; +var hasRequiredResponse; +function requireResponse() { + if (hasRequiredResponse) return response; + hasRequiredResponse = 1; + const { Headers, HeadersList, fill } = requireHeaders(); + const { extractBody, cloneBody, mixinBody } = requireBody(); + const util2 = requireUtil$6(); + const { kEnumerableProperty } = util2; + const { + isValidReasonPhrase, + isCancelled, + isAborted, + isBlobLike, + serializeJavascriptValueToJSONString, + isErrorLike, + isomorphicEncode + } = requireUtil$5(); + const { + redirectStatusSet, + nullBodyStatus, + DOMException: DOMException2 + } = requireConstants$3(); + const { kState, kHeaders, kGuard, kRealm } = requireSymbols$3(); + const { webidl } = requireWebidl(); + const { FormData } = requireFormdata(); + const { getGlobalOrigin } = requireGlobal$1(); + const { URLSerializer } = requireDataURL(); + const { kHeadersList, kConstruct } = requireSymbols$4(); + const assert = require$$0$9; + const { types } = require$$0$2; + const ReadableStream2 = globalThis.ReadableStream || require$$14.ReadableStream; + const textEncoder = new TextEncoder("utf-8"); + class Response { + // Creates network error Response. + static error() { + const relevantRealm = { settingsObject: {} }; + const responseObject = new Response(); + responseObject[kState] = makeNetworkError(); + responseObject[kRealm] = relevantRealm; + responseObject[kHeaders][kHeadersList] = responseObject[kState].headersList; + responseObject[kHeaders][kGuard] = "immutable"; + responseObject[kHeaders][kRealm] = relevantRealm; + return responseObject; + } + // https://fetch.spec.whatwg.org/#dom-response-json + static json(data, init = {}) { + webidl.argumentLengthCheck(arguments, 1, { header: "Response.json" }); + if (init !== null) { + init = webidl.converters.ResponseInit(init); } - return resultList; + const bytes = textEncoder.encode( + serializeJavascriptValueToJSONString(data) + ); + const body2 = extractBody(bytes); + const relevantRealm = { settingsObject: {} }; + const responseObject = new Response(); + responseObject[kRealm] = relevantRealm; + responseObject[kHeaders][kGuard] = "response"; + responseObject[kHeaders][kRealm] = relevantRealm; + initializeResponse(responseObject, init, { body: body2[0], type: "application/json" }); + return responseObject; } - /** - * @see https://w3c.github.io/ServiceWorker/#request-matches-cached-item-algorithm - * @param {any} requestQuery - * @param {any} request - * @param {any | null} response - * @param {import('../../types/cache').CacheQueryOptions | undefined} options - * @returns {boolean} - */ - #requestMatchesCachedItem(requestQuery, request2, response2 = null, options) { - const queryURL = new URL(requestQuery.url); - const cachedURL = new URL(request2.url); - if (options?.ignoreSearch) { - cachedURL.search = ""; - queryURL.search = ""; + // Creates a redirect Response that redirects to url with status status. + static redirect(url, status = 302) { + const relevantRealm = { settingsObject: {} }; + webidl.argumentLengthCheck(arguments, 1, { header: "Response.redirect" }); + url = webidl.converters.USVString(url); + status = webidl.converters["unsigned short"](status); + let parsedURL; + try { + parsedURL = new URL(url, getGlobalOrigin()); + } catch (err) { + throw Object.assign(new TypeError("Failed to parse URL from " + url), { + cause: err + }); } - if (!urlEquals(queryURL, cachedURL, true)) { - return false; + if (!redirectStatusSet.has(status)) { + throw new RangeError("Invalid status code " + status); } - if (response2 == null || options?.ignoreVary || !response2.headersList.contains("vary")) { - return true; + const responseObject = new Response(); + responseObject[kRealm] = relevantRealm; + responseObject[kHeaders][kGuard] = "immutable"; + responseObject[kHeaders][kRealm] = relevantRealm; + responseObject[kState].status = status; + const value = isomorphicEncode(URLSerializer(parsedURL)); + responseObject[kState].headersList.append("location", value); + return responseObject; + } + // https://fetch.spec.whatwg.org/#dom-response + constructor(body2 = null, init = {}) { + if (body2 !== null) { + body2 = webidl.converters.BodyInit(body2); } - const fieldValues = getFieldValues(response2.headersList.get("vary")); - for (const fieldValue of fieldValues) { - if (fieldValue === "*") { - return false; - } - const requestValue = request2.headersList.get(fieldValue); - const queryValue = requestQuery.headersList.get(fieldValue); - if (requestValue !== queryValue) { - return false; - } + init = webidl.converters.ResponseInit(init); + this[kRealm] = { settingsObject: {} }; + this[kState] = makeResponse({}); + this[kHeaders] = new Headers(kConstruct); + this[kHeaders][kGuard] = "response"; + this[kHeaders][kHeadersList] = this[kState].headersList; + this[kHeaders][kRealm] = this[kRealm]; + let bodyWithType = null; + if (body2 != null) { + const [extractedBody, type] = extractBody(body2); + bodyWithType = { body: extractedBody, type }; } - return true; - } - } - Object.defineProperties(Cache.prototype, { - [Symbol.toStringTag]: { - value: "Cache", - configurable: true - }, - match: kEnumerableProperty, - matchAll: kEnumerableProperty, - add: kEnumerableProperty, - addAll: kEnumerableProperty, - put: kEnumerableProperty, - delete: kEnumerableProperty, - keys: kEnumerableProperty - }); - const cacheQueryOptionConverters = [ - { - key: "ignoreSearch", - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: "ignoreMethod", - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: "ignoreVary", - converter: webidl.converters.boolean, - defaultValue: false + initializeResponse(this, init, bodyWithType); } - ]; - webidl.converters.CacheQueryOptions = webidl.dictionaryConverter(cacheQueryOptionConverters); - webidl.converters.MultiCacheQueryOptions = webidl.dictionaryConverter([ - ...cacheQueryOptionConverters, - { - key: "cacheName", - converter: webidl.converters.DOMString + // Returns response’s type, e.g., "cors". + get type() { + webidl.brandCheck(this, Response); + return this[kState].type; } - ]); - webidl.converters.Response = webidl.interfaceConverter(Response); - webidl.converters["sequence"] = webidl.sequenceConverter( - webidl.converters.RequestInfo - ); - cache = { - Cache - }; - return cache; -} -var cachestorage; -var hasRequiredCachestorage; -function requireCachestorage() { - if (hasRequiredCachestorage) return cachestorage; - hasRequiredCachestorage = 1; - const { kConstruct } = requireSymbols$1(); - const { Cache } = requireCache(); - const { webidl } = requireWebidl(); - const { kEnumerableProperty } = requireUtil$6(); - class CacheStorage { - /** - * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-name-to-cache-map - * @type {Map 1; } - /** - * @see https://w3c.github.io/ServiceWorker/#cache-storage-has - * @param {string} cacheName - * @returns {Promise} - */ - async has(cacheName) { - webidl.brandCheck(this, CacheStorage); - webidl.argumentLengthCheck(arguments, 1, { header: "CacheStorage.has" }); - cacheName = webidl.converters.DOMString(cacheName); - return this.#caches.has(cacheName); + // Returns response’s status. + get status() { + webidl.brandCheck(this, Response); + return this[kState].status; } - /** - * @see https://w3c.github.io/ServiceWorker/#dom-cachestorage-open - * @param {string} cacheName - * @returns {Promise} - */ - async open(cacheName) { - webidl.brandCheck(this, CacheStorage); - webidl.argumentLengthCheck(arguments, 1, { header: "CacheStorage.open" }); - cacheName = webidl.converters.DOMString(cacheName); - if (this.#caches.has(cacheName)) { - const cache3 = this.#caches.get(cacheName); - return new Cache(kConstruct, cache3); - } - const cache2 = []; - this.#caches.set(cacheName, cache2); - return new Cache(kConstruct, cache2); + // Returns whether response’s status is an ok status. + get ok() { + webidl.brandCheck(this, Response); + return this[kState].status >= 200 && this[kState].status <= 299; } - /** - * @see https://w3c.github.io/ServiceWorker/#cache-storage-delete - * @param {string} cacheName - * @returns {Promise} - */ - async delete(cacheName) { - webidl.brandCheck(this, CacheStorage); - webidl.argumentLengthCheck(arguments, 1, { header: "CacheStorage.delete" }); - cacheName = webidl.converters.DOMString(cacheName); - return this.#caches.delete(cacheName); + // Returns response’s status message. + get statusText() { + webidl.brandCheck(this, Response); + return this[kState].statusText; } - /** - * @see https://w3c.github.io/ServiceWorker/#cache-storage-keys - * @returns {string[]} - */ - async keys() { - webidl.brandCheck(this, CacheStorage); - const keys = this.#caches.keys(); - return [...keys]; + // Returns response’s headers as Headers. + get headers() { + webidl.brandCheck(this, Response); + return this[kHeaders]; + } + get body() { + webidl.brandCheck(this, Response); + return this[kState].body ? this[kState].body.stream : null; + } + get bodyUsed() { + webidl.brandCheck(this, Response); + return !!this[kState].body && util2.isDisturbed(this[kState].body.stream); + } + // Returns a clone of response. + clone() { + webidl.brandCheck(this, Response); + if (this.bodyUsed || this.body && this.body.locked) { + throw webidl.errors.exception({ + header: "Response.clone", + message: "Body has already been consumed." + }); + } + const clonedResponse = cloneResponse(this[kState]); + const clonedResponseObject = new Response(); + clonedResponseObject[kState] = clonedResponse; + clonedResponseObject[kRealm] = this[kRealm]; + clonedResponseObject[kHeaders][kHeadersList] = clonedResponse.headersList; + clonedResponseObject[kHeaders][kGuard] = this[kHeaders][kGuard]; + clonedResponseObject[kHeaders][kRealm] = this[kHeaders][kRealm]; + return clonedResponseObject; } } - Object.defineProperties(CacheStorage.prototype, { + mixinBody(Response); + Object.defineProperties(Response.prototype, { + type: kEnumerableProperty, + url: kEnumerableProperty, + status: kEnumerableProperty, + ok: kEnumerableProperty, + redirected: kEnumerableProperty, + statusText: kEnumerableProperty, + headers: kEnumerableProperty, + clone: kEnumerableProperty, + body: kEnumerableProperty, + bodyUsed: kEnumerableProperty, [Symbol.toStringTag]: { - value: "CacheStorage", + value: "Response", configurable: true - }, - match: kEnumerableProperty, - has: kEnumerableProperty, - open: kEnumerableProperty, - delete: kEnumerableProperty, - keys: kEnumerableProperty + } }); - cachestorage = { - CacheStorage - }; - return cachestorage; -} -var constants$1; -var hasRequiredConstants$1; -function requireConstants$1() { - if (hasRequiredConstants$1) return constants$1; - hasRequiredConstants$1 = 1; - const maxAttributeValueSize = 1024; - const maxNameValuePairSize = 4096; - constants$1 = { - maxAttributeValueSize, - maxNameValuePairSize - }; - return constants$1; -} -var util$1; -var hasRequiredUtil$1; -function requireUtil$1() { - if (hasRequiredUtil$1) return util$1; - hasRequiredUtil$1 = 1; - function isCTLExcludingHtab(value) { - if (value.length === 0) { - return false; + Object.defineProperties(Response, { + json: kEnumerableProperty, + redirect: kEnumerableProperty, + error: kEnumerableProperty + }); + function cloneResponse(response2) { + if (response2.internalResponse) { + return filterResponse( + cloneResponse(response2.internalResponse), + response2.type + ); } - for (const char of value) { - const code = char.charCodeAt(0); - if (code >= 0 || code <= 8 || (code >= 10 || code <= 31) || code === 127) { - return false; - } + const newResponse = makeResponse({ ...response2, body: null }); + if (response2.body != null) { + newResponse.body = cloneBody(response2.body); } + return newResponse; } - function validateCookieName(name) { - for (const char of name) { - const code = char.charCodeAt(0); - if (code <= 32 || code > 127 || char === "(" || char === ")" || char === ">" || char === "<" || char === "@" || char === "," || char === ";" || char === ":" || char === "\\" || char === '"' || char === "/" || char === "[" || char === "]" || char === "?" || char === "=" || char === "{" || char === "}") { - throw new Error("Invalid cookie name"); - } - } + function makeResponse(init) { + return { + aborted: false, + rangeRequested: false, + timingAllowPassed: false, + requestIncludesCredentials: false, + type: "default", + status: 200, + timingInfo: null, + cacheState: "", + statusText: "", + ...init, + headersList: init.headersList ? new HeadersList(init.headersList) : new HeadersList(), + urlList: init.urlList ? [...init.urlList] : [] + }; } - function validateCookieValue(value) { - for (const char of value) { - const code = char.charCodeAt(0); - if (code < 33 || // exclude CTLs (0-31) - code === 34 || code === 44 || code === 59 || code === 92 || code > 126) { - throw new Error("Invalid header value"); - } - } + function makeNetworkError(reason) { + const isError = isErrorLike(reason); + return makeResponse({ + type: "error", + status: 0, + error: isError ? reason : new Error(reason ? String(reason) : reason), + aborted: reason && reason.name === "AbortError" + }); } - function validateCookiePath(path) { - for (const char of path) { - const code = char.charCodeAt(0); - if (code < 33 || char === ";") { - throw new Error("Invalid cookie path"); + function makeFilteredResponse(response2, state) { + state = { + internalResponse: response2, + ...state + }; + return new Proxy(response2, { + get(target, p) { + return p in state ? state[p] : target[p]; + }, + set(target, p, value) { + assert(!(p in state)); + target[p] = value; + return true; } - } - } - function validateCookieDomain(domain) { - if (domain.startsWith("-") || domain.endsWith(".") || domain.endsWith("-")) { - throw new Error("Invalid cookie domain"); - } + }); } - function toIMFDate(date) { - if (typeof date === "number") { - date = new Date(date); + function filterResponse(response2, type) { + if (type === "basic") { + return makeFilteredResponse(response2, { + type: "basic", + headersList: response2.headersList + }); + } else if (type === "cors") { + return makeFilteredResponse(response2, { + type: "cors", + headersList: response2.headersList + }); + } else if (type === "opaque") { + return makeFilteredResponse(response2, { + type: "opaque", + urlList: Object.freeze([]), + status: 0, + statusText: "", + body: null + }); + } else if (type === "opaqueredirect") { + return makeFilteredResponse(response2, { + type: "opaqueredirect", + status: 0, + statusText: "", + headersList: [], + body: null + }); + } else { + assert(false); } - const days = [ - "Sun", - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat" - ]; - const months = [ - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec" - ]; - const dayName = days[date.getUTCDay()]; - const day = date.getUTCDate().toString().padStart(2, "0"); - const month = months[date.getUTCMonth()]; - const year = date.getUTCFullYear(); - const hour = date.getUTCHours().toString().padStart(2, "0"); - const minute = date.getUTCMinutes().toString().padStart(2, "0"); - const second = date.getUTCSeconds().toString().padStart(2, "0"); - return `${dayName}, ${day} ${month} ${year} ${hour}:${minute}:${second} GMT`; } - function validateCookieMaxAge(maxAge) { - if (maxAge < 0) { - throw new Error("Invalid cookie max-age"); - } + function makeAppropriateNetworkError(fetchParams, err = null) { + assert(isCancelled(fetchParams)); + return isAborted(fetchParams) ? makeNetworkError(Object.assign(new DOMException2("The operation was aborted.", "AbortError"), { cause: err })) : makeNetworkError(Object.assign(new DOMException2("Request was cancelled."), { cause: err })); } - function stringify(cookie) { - if (cookie.name.length === 0) { - return null; - } - validateCookieName(cookie.name); - validateCookieValue(cookie.value); - const out = [`${cookie.name}=${cookie.value}`]; - if (cookie.name.startsWith("__Secure-")) { - cookie.secure = true; - } - if (cookie.name.startsWith("__Host-")) { - cookie.secure = true; - cookie.domain = null; - cookie.path = "/"; - } - if (cookie.secure) { - out.push("Secure"); - } - if (cookie.httpOnly) { - out.push("HttpOnly"); - } - if (typeof cookie.maxAge === "number") { - validateCookieMaxAge(cookie.maxAge); - out.push(`Max-Age=${cookie.maxAge}`); + function initializeResponse(response2, init, body2) { + if (init.status !== null && (init.status < 200 || init.status > 599)) { + throw new RangeError('init["status"] must be in the range of 200 to 599, inclusive.'); } - if (cookie.domain) { - validateCookieDomain(cookie.domain); - out.push(`Domain=${cookie.domain}`); + if ("statusText" in init && init.statusText != null) { + if (!isValidReasonPhrase(String(init.statusText))) { + throw new TypeError("Invalid statusText"); + } } - if (cookie.path) { - validateCookiePath(cookie.path); - out.push(`Path=${cookie.path}`); + if ("status" in init && init.status != null) { + response2[kState].status = init.status; } - if (cookie.expires && cookie.expires.toString() !== "Invalid Date") { - out.push(`Expires=${toIMFDate(cookie.expires)}`); + if ("statusText" in init && init.statusText != null) { + response2[kState].statusText = init.statusText; } - if (cookie.sameSite) { - out.push(`SameSite=${cookie.sameSite}`); + if ("headers" in init && init.headers != null) { + fill(response2[kHeaders], init.headers); } - for (const part of cookie.unparsed) { - if (!part.includes("=")) { - throw new Error("Invalid unparsed"); + if (body2) { + if (nullBodyStatus.includes(response2.status)) { + throw webidl.errors.exception({ + header: "Response constructor", + message: "Invalid response status code " + response2.status + }); + } + response2[kState].body = body2.body; + if (body2.type != null && !response2[kState].headersList.contains("Content-Type")) { + response2[kState].headersList.append("content-type", body2.type); } - const [key, ...value] = part.split("="); - out.push(`${key.trim()}=${value.join("=")}`); } - return out.join("; "); } - util$1 = { - isCTLExcludingHtab, - validateCookieName, - validateCookiePath, - validateCookieValue, - toIMFDate, - stringify - }; - return util$1; -} -var parse$1; -var hasRequiredParse; -function requireParse() { - if (hasRequiredParse) return parse$1; - hasRequiredParse = 1; - const { maxNameValuePairSize, maxAttributeValueSize } = requireConstants$1(); - const { isCTLExcludingHtab } = requireUtil$1(); - const { collectASequenceOfCodePointsFast } = requireDataURL(); - const assert = require$$0$3; - function parseSetCookie(header) { - if (isCTLExcludingHtab(header)) { - return null; + webidl.converters.ReadableStream = webidl.interfaceConverter( + ReadableStream2 + ); + webidl.converters.FormData = webidl.interfaceConverter( + FormData + ); + webidl.converters.URLSearchParams = webidl.interfaceConverter( + URLSearchParams + ); + webidl.converters.XMLHttpRequestBodyInit = function(V) { + if (typeof V === "string") { + return webidl.converters.USVString(V); } - let nameValuePair = ""; - let unparsedAttributes = ""; - let name = ""; - let value = ""; - if (header.includes(";")) { - const position = { position: 0 }; - nameValuePair = collectASequenceOfCodePointsFast(";", header, position); - unparsedAttributes = header.slice(position.position); - } else { - nameValuePair = header; + if (isBlobLike(V)) { + return webidl.converters.Blob(V, { strict: false }); } - if (!nameValuePair.includes("=")) { - value = nameValuePair; - } else { - const position = { position: 0 }; - name = collectASequenceOfCodePointsFast( - "=", - nameValuePair, - position - ); - value = nameValuePair.slice(position.position + 1); + if (types.isArrayBuffer(V) || types.isTypedArray(V) || types.isDataView(V)) { + return webidl.converters.BufferSource(V); } - name = name.trim(); - value = value.trim(); - if (name.length + value.length > maxNameValuePairSize) { - return null; + if (util2.isFormDataLike(V)) { + return webidl.converters.FormData(V, { strict: false }); } - return { - name, - value, - ...parseUnparsedAttributes(unparsedAttributes) - }; - } - function parseUnparsedAttributes(unparsedAttributes, cookieAttributeList = {}) { - if (unparsedAttributes.length === 0) { - return cookieAttributeList; + if (V instanceof URLSearchParams) { + return webidl.converters.URLSearchParams(V); } - assert(unparsedAttributes[0] === ";"); - unparsedAttributes = unparsedAttributes.slice(1); - let cookieAv = ""; - if (unparsedAttributes.includes(";")) { - cookieAv = collectASequenceOfCodePointsFast( - ";", - unparsedAttributes, - { position: 0 } - ); - unparsedAttributes = unparsedAttributes.slice(cookieAv.length); - } else { - cookieAv = unparsedAttributes; - unparsedAttributes = ""; + return webidl.converters.DOMString(V); + }; + webidl.converters.BodyInit = function(V) { + if (V instanceof ReadableStream2) { + return webidl.converters.ReadableStream(V); } - let attributeName = ""; - let attributeValue = ""; - if (cookieAv.includes("=")) { - const position = { position: 0 }; - attributeName = collectASequenceOfCodePointsFast( - "=", - cookieAv, - position - ); - attributeValue = cookieAv.slice(position.position + 1); - } else { - attributeName = cookieAv; + if (V?.[Symbol.asyncIterator]) { + return V; } - attributeName = attributeName.trim(); - attributeValue = attributeValue.trim(); - if (attributeValue.length > maxAttributeValueSize) { - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); + return webidl.converters.XMLHttpRequestBodyInit(V); + }; + webidl.converters.ResponseInit = webidl.dictionaryConverter([ + { + key: "status", + converter: webidl.converters["unsigned short"], + defaultValue: 200 + }, + { + key: "statusText", + converter: webidl.converters.ByteString, + defaultValue: "" + }, + { + key: "headers", + converter: webidl.converters.HeadersInit } - const attributeNameLowercase = attributeName.toLowerCase(); - if (attributeNameLowercase === "expires") { - const expiryTime = new Date(attributeValue); - cookieAttributeList.expires = expiryTime; - } else if (attributeNameLowercase === "max-age") { - const charCode = attributeValue.charCodeAt(0); - if ((charCode < 48 || charCode > 57) && attributeValue[0] !== "-") { - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); + ]); + response = { + makeNetworkError, + makeResponse, + makeAppropriateNetworkError, + filterResponse, + Response, + cloneResponse + }; + return response; +} +var request$1; +var hasRequiredRequest; +function requireRequest() { + if (hasRequiredRequest) return request$1; + hasRequiredRequest = 1; + const { extractBody, mixinBody, cloneBody } = requireBody(); + const { Headers, fill: fillHeaders, HeadersList } = requireHeaders(); + const { FinalizationRegistry: FinalizationRegistry2 } = requireDispatcherWeakref()(); + const util2 = requireUtil$6(); + const { + isValidHTTPToken, + sameOrigin, + normalizeMethod, + makePolicyContainer, + normalizeMethodRecord + } = requireUtil$5(); + const { + forbiddenMethodsSet, + corsSafeListedMethodsSet, + referrerPolicy, + requestRedirect, + requestMode, + requestCredentials, + requestCache, + requestDuplex + } = requireConstants$3(); + const { kEnumerableProperty } = util2; + const { kHeaders, kSignal, kState, kGuard, kRealm } = requireSymbols$3(); + const { webidl } = requireWebidl(); + const { getGlobalOrigin } = requireGlobal$1(); + const { URLSerializer } = requireDataURL(); + const { kHeadersList, kConstruct } = requireSymbols$4(); + const assert = require$$0$9; + const { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = require$$4$1; + let TransformStream2 = globalThis.TransformStream; + const kAbortController = /* @__PURE__ */ Symbol("abortController"); + const requestFinalizer = new FinalizationRegistry2(({ signal, abort }) => { + signal.removeEventListener("abort", abort); + }); + class Request { + // https://fetch.spec.whatwg.org/#dom-request + constructor(input, init = {}) { + if (input === kConstruct) { + return; + } + webidl.argumentLengthCheck(arguments, 1, { header: "Request constructor" }); + input = webidl.converters.RequestInfo(input); + init = webidl.converters.RequestInit(init); + this[kRealm] = { + settingsObject: { + baseUrl: getGlobalOrigin(), + get origin() { + return this.baseUrl?.origin; + }, + policyContainer: makePolicyContainer() + } + }; + let request2 = null; + let fallbackMode = null; + const baseUrl = this[kRealm].settingsObject.baseUrl; + let signal = null; + if (typeof input === "string") { + let parsedURL; + try { + parsedURL = new URL(input, baseUrl); + } catch (err) { + throw new TypeError("Failed to parse URL from " + input, { cause: err }); + } + if (parsedURL.username || parsedURL.password) { + throw new TypeError( + "Request cannot be constructed from a URL that includes credentials: " + input + ); + } + request2 = makeRequest({ urlList: [parsedURL] }); + fallbackMode = "cors"; + } else { + assert(input instanceof Request); + request2 = input[kState]; + signal = input[kSignal]; + } + const origin = this[kRealm].settingsObject.origin; + let window2 = "client"; + if (request2.window?.constructor?.name === "EnvironmentSettingsObject" && sameOrigin(request2.window, origin)) { + window2 = request2.window; + } + if (init.window != null) { + throw new TypeError(`'window' option '${window2}' must be null`); + } + if ("window" in init) { + window2 = "no-window"; + } + request2 = makeRequest({ + // URL request’s URL. + // undici implementation note: this is set as the first item in request's urlList in makeRequest + // method request’s method. + method: request2.method, + // header list A copy of request’s header list. + // undici implementation note: headersList is cloned in makeRequest + headersList: request2.headersList, + // unsafe-request flag Set. + unsafeRequest: request2.unsafeRequest, + // client This’s relevant settings object. + client: this[kRealm].settingsObject, + // window window. + window: window2, + // priority request’s priority. + priority: request2.priority, + // origin request’s origin. The propagation of the origin is only significant for navigation requests + // being handled by a service worker. In this scenario a request can have an origin that is different + // from the current client. + origin: request2.origin, + // referrer request’s referrer. + referrer: request2.referrer, + // referrer policy request’s referrer policy. + referrerPolicy: request2.referrerPolicy, + // mode request’s mode. + mode: request2.mode, + // credentials mode request’s credentials mode. + credentials: request2.credentials, + // cache mode request’s cache mode. + cache: request2.cache, + // redirect mode request’s redirect mode. + redirect: request2.redirect, + // integrity metadata request’s integrity metadata. + integrity: request2.integrity, + // keepalive request’s keepalive. + keepalive: request2.keepalive, + // reload-navigation flag request’s reload-navigation flag. + reloadNavigation: request2.reloadNavigation, + // history-navigation flag request’s history-navigation flag. + historyNavigation: request2.historyNavigation, + // URL list A clone of request’s URL list. + urlList: [...request2.urlList] + }); + const initHasKey = Object.keys(init).length !== 0; + if (initHasKey) { + if (request2.mode === "navigate") { + request2.mode = "same-origin"; + } + request2.reloadNavigation = false; + request2.historyNavigation = false; + request2.origin = "client"; + request2.referrer = "client"; + request2.referrerPolicy = ""; + request2.url = request2.urlList[request2.urlList.length - 1]; + request2.urlList = [request2.url]; } - if (!/^\d+$/.test(attributeValue)) { - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); + if (init.referrer !== void 0) { + const referrer = init.referrer; + if (referrer === "") { + request2.referrer = "no-referrer"; + } else { + let parsedReferrer; + try { + parsedReferrer = new URL(referrer, baseUrl); + } catch (err) { + throw new TypeError(`Referrer "${referrer}" is not a valid URL.`, { cause: err }); + } + if (parsedReferrer.protocol === "about:" && parsedReferrer.hostname === "client" || origin && !sameOrigin(parsedReferrer, this[kRealm].settingsObject.baseUrl)) { + request2.referrer = "client"; + } else { + request2.referrer = parsedReferrer; + } + } } - const deltaSeconds = Number(attributeValue); - cookieAttributeList.maxAge = deltaSeconds; - } else if (attributeNameLowercase === "domain") { - let cookieDomain = attributeValue; - if (cookieDomain[0] === ".") { - cookieDomain = cookieDomain.slice(1); + if (init.referrerPolicy !== void 0) { + request2.referrerPolicy = init.referrerPolicy; } - cookieDomain = cookieDomain.toLowerCase(); - cookieAttributeList.domain = cookieDomain; - } else if (attributeNameLowercase === "path") { - let cookiePath = ""; - if (attributeValue.length === 0 || attributeValue[0] !== "/") { - cookiePath = "/"; + let mode; + if (init.mode !== void 0) { + mode = init.mode; } else { - cookiePath = attributeValue; + mode = fallbackMode; } - cookieAttributeList.path = cookiePath; - } else if (attributeNameLowercase === "secure") { - cookieAttributeList.secure = true; - } else if (attributeNameLowercase === "httponly") { - cookieAttributeList.httpOnly = true; - } else if (attributeNameLowercase === "samesite") { - let enforcement = "Default"; - const attributeValueLowercase = attributeValue.toLowerCase(); - if (attributeValueLowercase.includes("none")) { - enforcement = "None"; + if (mode === "navigate") { + throw webidl.errors.exception({ + header: "Request constructor", + message: "invalid request mode navigate." + }); } - if (attributeValueLowercase.includes("strict")) { - enforcement = "Strict"; + if (mode != null) { + request2.mode = mode; } - if (attributeValueLowercase.includes("lax")) { - enforcement = "Lax"; + if (init.credentials !== void 0) { + request2.credentials = init.credentials; } - cookieAttributeList.sameSite = enforcement; - } else { - cookieAttributeList.unparsed ??= []; - cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`); - } - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); - } - parse$1 = { - parseSetCookie, - parseUnparsedAttributes - }; - return parse$1; -} -var cookies; -var hasRequiredCookies; -function requireCookies() { - if (hasRequiredCookies) return cookies; - hasRequiredCookies = 1; - const { parseSetCookie } = requireParse(); - const { stringify } = requireUtil$1(); - const { webidl } = requireWebidl(); - const { Headers } = requireHeaders(); - function getCookies(headers2) { - webidl.argumentLengthCheck(arguments, 1, { header: "getCookies" }); - webidl.brandCheck(headers2, Headers, { strict: false }); - const cookie = headers2.get("cookie"); - const out = {}; - if (!cookie) { - return out; - } - for (const piece of cookie.split(";")) { - const [name, ...value] = piece.split("="); - out[name.trim()] = value.join("="); - } - return out; - } - function deleteCookie(headers2, name, attributes) { - webidl.argumentLengthCheck(arguments, 2, { header: "deleteCookie" }); - webidl.brandCheck(headers2, Headers, { strict: false }); - name = webidl.converters.DOMString(name); - attributes = webidl.converters.DeleteCookieAttributes(attributes); - setCookie(headers2, { - name, - value: "", - expires: /* @__PURE__ */ new Date(0), - ...attributes - }); - } - function getSetCookies(headers2) { - webidl.argumentLengthCheck(arguments, 1, { header: "getSetCookies" }); - webidl.brandCheck(headers2, Headers, { strict: false }); - const cookies2 = headers2.getSetCookie(); - if (!cookies2) { - return []; + if (init.cache !== void 0) { + request2.cache = init.cache; + } + if (request2.cache === "only-if-cached" && request2.mode !== "same-origin") { + throw new TypeError( + "'only-if-cached' can be set only with 'same-origin' mode" + ); + } + if (init.redirect !== void 0) { + request2.redirect = init.redirect; + } + if (init.integrity != null) { + request2.integrity = String(init.integrity); + } + if (init.keepalive !== void 0) { + request2.keepalive = Boolean(init.keepalive); + } + if (init.method !== void 0) { + let method = init.method; + if (!isValidHTTPToken(method)) { + throw new TypeError(`'${method}' is not a valid HTTP method.`); + } + if (forbiddenMethodsSet.has(method.toUpperCase())) { + throw new TypeError(`'${method}' HTTP method is unsupported.`); + } + method = normalizeMethodRecord[method] ?? normalizeMethod(method); + request2.method = method; + } + if (init.signal !== void 0) { + signal = init.signal; + } + this[kState] = request2; + const ac = new AbortController(); + this[kSignal] = ac.signal; + this[kSignal][kRealm] = this[kRealm]; + if (signal != null) { + if (!signal || typeof signal.aborted !== "boolean" || typeof signal.addEventListener !== "function") { + throw new TypeError( + "Failed to construct 'Request': member signal is not of type AbortSignal." + ); + } + if (signal.aborted) { + ac.abort(signal.reason); + } else { + this[kAbortController] = ac; + const acRef = new WeakRef(ac); + const abort = function() { + const ac2 = acRef.deref(); + if (ac2 !== void 0) { + ac2.abort(this.reason); + } + }; + try { + if (typeof getMaxListeners === "function" && getMaxListeners(signal) === defaultMaxListeners) { + setMaxListeners(100, signal); + } else if (getEventListeners(signal, "abort").length >= defaultMaxListeners) { + setMaxListeners(100, signal); + } + } catch { + } + util2.addAbortListener(signal, abort); + requestFinalizer.register(ac, { signal, abort }); + } + } + this[kHeaders] = new Headers(kConstruct); + this[kHeaders][kHeadersList] = request2.headersList; + this[kHeaders][kGuard] = "request"; + this[kHeaders][kRealm] = this[kRealm]; + if (mode === "no-cors") { + if (!corsSafeListedMethodsSet.has(request2.method)) { + throw new TypeError( + `'${request2.method} is unsupported in no-cors mode.` + ); + } + this[kHeaders][kGuard] = "request-no-cors"; + } + if (initHasKey) { + const headersList = this[kHeaders][kHeadersList]; + const headers2 = init.headers !== void 0 ? init.headers : new HeadersList(headersList); + headersList.clear(); + if (headers2 instanceof HeadersList) { + for (const [key, val] of headers2) { + headersList.append(key, val); + } + headersList.cookies = headers2.cookies; + } else { + fillHeaders(this[kHeaders], headers2); + } + } + const inputBody = input instanceof Request ? input[kState].body : null; + if ((init.body != null || inputBody != null) && (request2.method === "GET" || request2.method === "HEAD")) { + throw new TypeError("Request with GET/HEAD method cannot have body."); + } + let initBody = null; + if (init.body != null) { + const [extractedBody, contentType] = extractBody( + init.body, + request2.keepalive + ); + initBody = extractedBody; + if (contentType && !this[kHeaders][kHeadersList].contains("content-type")) { + this[kHeaders].append("content-type", contentType); + } + } + const inputOrInitBody = initBody ?? inputBody; + if (inputOrInitBody != null && inputOrInitBody.source == null) { + if (initBody != null && init.duplex == null) { + throw new TypeError("RequestInit: duplex option is required when sending a body."); + } + if (request2.mode !== "same-origin" && request2.mode !== "cors") { + throw new TypeError( + 'If request is made from ReadableStream, mode should be "same-origin" or "cors"' + ); + } + request2.useCORSPreflightFlag = true; + } + let finalBody = inputOrInitBody; + if (initBody == null && inputBody != null) { + if (util2.isDisturbed(inputBody.stream) || inputBody.stream.locked) { + throw new TypeError( + "Cannot construct a Request with a Request object that has already been used." + ); + } + if (!TransformStream2) { + TransformStream2 = require$$14.TransformStream; + } + const identityTransform = new TransformStream2(); + inputBody.stream.pipeThrough(identityTransform); + finalBody = { + source: inputBody.source, + length: inputBody.length, + stream: identityTransform.readable + }; + } + this[kState].body = finalBody; } - return cookies2.map((pair) => parseSetCookie(pair)); - } - function setCookie(headers2, cookie) { - webidl.argumentLengthCheck(arguments, 2, { header: "setCookie" }); - webidl.brandCheck(headers2, Headers, { strict: false }); - cookie = webidl.converters.Cookie(cookie); - const str = stringify(cookie); - if (str) { - headers2.append("Set-Cookie", stringify(cookie)); + // Returns request’s HTTP method, which is "GET" by default. + get method() { + webidl.brandCheck(this, Request); + return this[kState].method; } - } - webidl.converters.DeleteCookieAttributes = webidl.dictionaryConverter([ - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: "path", - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: "domain", - defaultValue: null + // Returns the URL of request as a string. + get url() { + webidl.brandCheck(this, Request); + return URLSerializer(this[kState].url); } - ]); - webidl.converters.Cookie = webidl.dictionaryConverter([ - { - converter: webidl.converters.DOMString, - key: "name" - }, - { - converter: webidl.converters.DOMString, - key: "value" - }, - { - converter: webidl.nullableConverter((value) => { - if (typeof value === "number") { - return webidl.converters["unsigned long long"](value); - } - return new Date(value); - }), - key: "expires", - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters["long long"]), - key: "maxAge", - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: "domain", - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: "path", - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.boolean), - key: "secure", - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.boolean), - key: "httpOnly", - defaultValue: null - }, - { - converter: webidl.converters.USVString, - key: "sameSite", - allowedValues: ["Strict", "Lax", "None"] - }, - { - converter: webidl.sequenceConverter(webidl.converters.DOMString), - key: "unparsed", - defaultValue: [] + // Returns a Headers object consisting of the headers associated with request. + // Note that headers added in the network layer by the user agent will not + // be accounted for in this object, e.g., the "Host" header. + get headers() { + webidl.brandCheck(this, Request); + return this[kHeaders]; } - ]); - cookies = { - getCookies, - deleteCookie, - getSetCookies, - setCookie - }; - return cookies; -} -var constants; -var hasRequiredConstants; -function requireConstants() { - if (hasRequiredConstants) return constants; - hasRequiredConstants = 1; - const uid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; - const staticPropertyDescriptors = { - enumerable: true, - writable: false, - configurable: false - }; - const states = { - CONNECTING: 0, - OPEN: 1, - CLOSING: 2, - CLOSED: 3 - }; - const opcodes = { - CONTINUATION: 0, - TEXT: 1, - BINARY: 2, - CLOSE: 8, - PING: 9, - PONG: 10 - }; - const maxUnsigned16Bit = 2 ** 16 - 1; - const parserStates = { - INFO: 0, - PAYLOADLENGTH_16: 2, - PAYLOADLENGTH_64: 3, - READ_DATA: 4 - }; - const emptyBuffer = Buffer.allocUnsafe(0); - constants = { - uid, - staticPropertyDescriptors, - states, - opcodes, - maxUnsigned16Bit, - parserStates, - emptyBuffer - }; - return constants; -} -var symbols; -var hasRequiredSymbols; -function requireSymbols() { - if (hasRequiredSymbols) return symbols; - hasRequiredSymbols = 1; - symbols = { - kWebSocketURL: /* @__PURE__ */ Symbol("url"), - kReadyState: /* @__PURE__ */ Symbol("ready state"), - kController: /* @__PURE__ */ Symbol("controller"), - kResponse: /* @__PURE__ */ Symbol("response"), - kBinaryType: /* @__PURE__ */ Symbol("binary type"), - kSentClose: /* @__PURE__ */ Symbol("sent close"), - kReceivedClose: /* @__PURE__ */ Symbol("received close"), - kByteParser: /* @__PURE__ */ Symbol("byte parser") - }; - return symbols; -} -var events; -var hasRequiredEvents; -function requireEvents() { - if (hasRequiredEvents) return events; - hasRequiredEvents = 1; - const { webidl } = requireWebidl(); - const { kEnumerableProperty } = requireUtil$6(); - const { MessagePort } = require$$0$8; - class MessageEvent extends Event { - #eventInit; - constructor(type, eventInitDict = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: "MessageEvent constructor" }); - type = webidl.converters.DOMString(type); - eventInitDict = webidl.converters.MessageEventInit(eventInitDict); - super(type, eventInitDict); - this.#eventInit = eventInitDict; + // Returns the kind of resource requested by request, e.g., "document" + // or "script". + get destination() { + webidl.brandCheck(this, Request); + return this[kState].destination; } - get data() { - webidl.brandCheck(this, MessageEvent); - return this.#eventInit.data; + // Returns the referrer of request. Its value can be a same-origin URL if + // explicitly set in init, the empty string to indicate no referrer, and + // "about:client" when defaulting to the global’s default. This is used + // during fetching to determine the value of the `Referer` header of the + // request being made. + get referrer() { + webidl.brandCheck(this, Request); + if (this[kState].referrer === "no-referrer") { + return ""; + } + if (this[kState].referrer === "client") { + return "about:client"; + } + return this[kState].referrer.toString(); } - get origin() { - webidl.brandCheck(this, MessageEvent); - return this.#eventInit.origin; + // Returns the referrer policy associated with request. + // This is used during fetching to compute the value of the request’s + // referrer. + get referrerPolicy() { + webidl.brandCheck(this, Request); + return this[kState].referrerPolicy; } - get lastEventId() { - webidl.brandCheck(this, MessageEvent); - return this.#eventInit.lastEventId; + // Returns the mode associated with request, which is a string indicating + // whether the request will use CORS, or will be restricted to same-origin + // URLs. + get mode() { + webidl.brandCheck(this, Request); + return this[kState].mode; } - get source() { - webidl.brandCheck(this, MessageEvent); - return this.#eventInit.source; + // Returns the credentials mode associated with request, + // which is a string indicating whether credentials will be sent with the + // request always, never, or only when sent to a same-origin URL. + get credentials() { + return this[kState].credentials; } - get ports() { - webidl.brandCheck(this, MessageEvent); - if (!Object.isFrozen(this.#eventInit.ports)) { - Object.freeze(this.#eventInit.ports); - } - return this.#eventInit.ports; + // Returns the cache mode associated with request, + // which is a string indicating how the request will + // interact with the browser’s cache when fetching. + get cache() { + webidl.brandCheck(this, Request); + return this[kState].cache; } - initMessageEvent(type, bubbles = false, cancelable = false, data = null, origin = "", lastEventId = "", source = null, ports = []) { - webidl.brandCheck(this, MessageEvent); - webidl.argumentLengthCheck(arguments, 1, { header: "MessageEvent.initMessageEvent" }); - return new MessageEvent(type, { - bubbles, - cancelable, - data, - origin, - lastEventId, - source, - ports - }); + // Returns the redirect mode associated with request, + // which is a string indicating how redirects for the + // request will be handled during fetching. A request + // will follow redirects by default. + get redirect() { + webidl.brandCheck(this, Request); + return this[kState].redirect; } - } - class CloseEvent extends Event { - #eventInit; - constructor(type, eventInitDict = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: "CloseEvent constructor" }); - type = webidl.converters.DOMString(type); - eventInitDict = webidl.converters.CloseEventInit(eventInitDict); - super(type, eventInitDict); - this.#eventInit = eventInitDict; + // Returns request’s subresource integrity metadata, which is a + // cryptographic hash of the resource being fetched. Its value + // consists of multiple hashes separated by whitespace. [SRI] + get integrity() { + webidl.brandCheck(this, Request); + return this[kState].integrity; } - get wasClean() { - webidl.brandCheck(this, CloseEvent); - return this.#eventInit.wasClean; + // Returns a boolean indicating whether or not request can outlive the + // global in which it was created. + get keepalive() { + webidl.brandCheck(this, Request); + return this[kState].keepalive; } - get code() { - webidl.brandCheck(this, CloseEvent); - return this.#eventInit.code; + // Returns a boolean indicating whether or not request is for a reload + // navigation. + get isReloadNavigation() { + webidl.brandCheck(this, Request); + return this[kState].reloadNavigation; } - get reason() { - webidl.brandCheck(this, CloseEvent); - return this.#eventInit.reason; + // Returns a boolean indicating whether or not request is for a history + // navigation (a.k.a. back-foward navigation). + get isHistoryNavigation() { + webidl.brandCheck(this, Request); + return this[kState].historyNavigation; } - } - class ErrorEvent extends Event { - #eventInit; - constructor(type, eventInitDict) { - webidl.argumentLengthCheck(arguments, 1, { header: "ErrorEvent constructor" }); - super(type, eventInitDict); - type = webidl.converters.DOMString(type); - eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {}); - this.#eventInit = eventInitDict; + // Returns the signal associated with request, which is an AbortSignal + // object indicating whether or not request has been aborted, and its + // abort event handler. + get signal() { + webidl.brandCheck(this, Request); + return this[kSignal]; } - get message() { - webidl.brandCheck(this, ErrorEvent); - return this.#eventInit.message; + get body() { + webidl.brandCheck(this, Request); + return this[kState].body ? this[kState].body.stream : null; } - get filename() { - webidl.brandCheck(this, ErrorEvent); - return this.#eventInit.filename; + get bodyUsed() { + webidl.brandCheck(this, Request); + return !!this[kState].body && util2.isDisturbed(this[kState].body.stream); } - get lineno() { - webidl.brandCheck(this, ErrorEvent); - return this.#eventInit.lineno; + get duplex() { + webidl.brandCheck(this, Request); + return "half"; } - get colno() { - webidl.brandCheck(this, ErrorEvent); - return this.#eventInit.colno; + // Returns a clone of request. + clone() { + webidl.brandCheck(this, Request); + if (this.bodyUsed || this.body?.locked) { + throw new TypeError("unusable"); + } + const clonedRequest = cloneRequest(this[kState]); + const clonedRequestObject = new Request(kConstruct); + clonedRequestObject[kState] = clonedRequest; + clonedRequestObject[kRealm] = this[kRealm]; + clonedRequestObject[kHeaders] = new Headers(kConstruct); + clonedRequestObject[kHeaders][kHeadersList] = clonedRequest.headersList; + clonedRequestObject[kHeaders][kGuard] = this[kHeaders][kGuard]; + clonedRequestObject[kHeaders][kRealm] = this[kHeaders][kRealm]; + const ac = new AbortController(); + if (this.signal.aborted) { + ac.abort(this.signal.reason); + } else { + util2.addAbortListener( + this.signal, + () => { + ac.abort(this.signal.reason); + } + ); + } + clonedRequestObject[kSignal] = ac.signal; + return clonedRequestObject; } - get error() { - webidl.brandCheck(this, ErrorEvent); - return this.#eventInit.error; + } + mixinBody(Request); + function makeRequest(init) { + const request2 = { + method: "GET", + localURLsOnly: false, + unsafeRequest: false, + body: null, + client: null, + reservedClient: null, + replacesClientId: "", + window: "client", + keepalive: false, + serviceWorkers: "all", + initiator: "", + destination: "", + priority: null, + origin: "client", + policyContainer: "client", + referrer: "client", + referrerPolicy: "", + mode: "no-cors", + useCORSPreflightFlag: false, + credentials: "same-origin", + useCredentials: false, + cache: "default", + redirect: "follow", + integrity: "", + cryptoGraphicsNonceMetadata: "", + parserMetadata: "", + reloadNavigation: false, + historyNavigation: false, + userActivation: false, + taintedOrigin: false, + redirectCount: 0, + responseTainting: "basic", + preventNoCacheCacheControlHeaderModification: false, + done: false, + timingAllowFailed: false, + ...init, + headersList: init.headersList ? new HeadersList(init.headersList) : new HeadersList() + }; + request2.url = request2.urlList[0]; + return request2; + } + function cloneRequest(request2) { + const newRequest = makeRequest({ ...request2, body: null }); + if (request2.body != null) { + newRequest.body = cloneBody(request2.body); } + return newRequest; } - Object.defineProperties(MessageEvent.prototype, { - [Symbol.toStringTag]: { - value: "MessageEvent", - configurable: true - }, - data: kEnumerableProperty, - origin: kEnumerableProperty, - lastEventId: kEnumerableProperty, - source: kEnumerableProperty, - ports: kEnumerableProperty, - initMessageEvent: kEnumerableProperty - }); - Object.defineProperties(CloseEvent.prototype, { - [Symbol.toStringTag]: { - value: "CloseEvent", - configurable: true - }, - reason: kEnumerableProperty, - code: kEnumerableProperty, - wasClean: kEnumerableProperty - }); - Object.defineProperties(ErrorEvent.prototype, { + Object.defineProperties(Request.prototype, { + method: kEnumerableProperty, + url: kEnumerableProperty, + headers: kEnumerableProperty, + redirect: kEnumerableProperty, + clone: kEnumerableProperty, + signal: kEnumerableProperty, + duplex: kEnumerableProperty, + destination: kEnumerableProperty, + body: kEnumerableProperty, + bodyUsed: kEnumerableProperty, + isHistoryNavigation: kEnumerableProperty, + isReloadNavigation: kEnumerableProperty, + keepalive: kEnumerableProperty, + integrity: kEnumerableProperty, + cache: kEnumerableProperty, + credentials: kEnumerableProperty, + attribute: kEnumerableProperty, + referrerPolicy: kEnumerableProperty, + referrer: kEnumerableProperty, + mode: kEnumerableProperty, [Symbol.toStringTag]: { - value: "ErrorEvent", + value: "Request", configurable: true - }, - message: kEnumerableProperty, - filename: kEnumerableProperty, - lineno: kEnumerableProperty, - colno: kEnumerableProperty, - error: kEnumerableProperty + } }); - webidl.converters.MessagePort = webidl.interfaceConverter(MessagePort); - webidl.converters["sequence"] = webidl.sequenceConverter( - webidl.converters.MessagePort + webidl.converters.Request = webidl.interfaceConverter( + Request + ); + webidl.converters.RequestInfo = function(V) { + if (typeof V === "string") { + return webidl.converters.USVString(V); + } + if (V instanceof Request) { + return webidl.converters.Request(V); + } + return webidl.converters.USVString(V); + }; + webidl.converters.AbortSignal = webidl.interfaceConverter( + AbortSignal ); - const eventInit = [ + webidl.converters.RequestInit = webidl.dictionaryConverter([ { - key: "bubbles", - converter: webidl.converters.boolean, - defaultValue: false + key: "method", + converter: webidl.converters.ByteString }, { - key: "cancelable", - converter: webidl.converters.boolean, - defaultValue: false + key: "headers", + converter: webidl.converters.HeadersInit }, { - key: "composed", - converter: webidl.converters.boolean, - defaultValue: false - } - ]; - webidl.converters.MessageEventInit = webidl.dictionaryConverter([ - ...eventInit, - { - key: "data", - converter: webidl.converters.any, - defaultValue: null + key: "body", + converter: webidl.nullableConverter( + webidl.converters.BodyInit + ) }, { - key: "origin", - converter: webidl.converters.USVString, - defaultValue: "" + key: "referrer", + converter: webidl.converters.USVString }, { - key: "lastEventId", + key: "referrerPolicy", converter: webidl.converters.DOMString, - defaultValue: "" + // https://w3c.github.io/webappsec-referrer-policy/#referrer-policy + allowedValues: referrerPolicy }, { - key: "source", - // Node doesn't implement WindowProxy or ServiceWorker, so the only - // valid value for source is a MessagePort. - converter: webidl.nullableConverter(webidl.converters.MessagePort), - defaultValue: null + key: "mode", + converter: webidl.converters.DOMString, + // https://fetch.spec.whatwg.org/#concept-request-mode + allowedValues: requestMode }, { - key: "ports", - converter: webidl.converters["sequence"], - get defaultValue() { - return []; - } - } - ]); - webidl.converters.CloseEventInit = webidl.dictionaryConverter([ - ...eventInit, - { - key: "wasClean", - converter: webidl.converters.boolean, - defaultValue: false + key: "credentials", + converter: webidl.converters.DOMString, + // https://fetch.spec.whatwg.org/#requestcredentials + allowedValues: requestCredentials }, { - key: "code", - converter: webidl.converters["unsigned short"], - defaultValue: 0 + key: "cache", + converter: webidl.converters.DOMString, + // https://fetch.spec.whatwg.org/#requestcache + allowedValues: requestCache }, { - key: "reason", - converter: webidl.converters.USVString, - defaultValue: "" - } - ]); - webidl.converters.ErrorEventInit = webidl.dictionaryConverter([ - ...eventInit, - { - key: "message", + key: "redirect", converter: webidl.converters.DOMString, - defaultValue: "" + // https://fetch.spec.whatwg.org/#requestredirect + allowedValues: requestRedirect }, { - key: "filename", - converter: webidl.converters.USVString, - defaultValue: "" + key: "integrity", + converter: webidl.converters.DOMString }, { - key: "lineno", - converter: webidl.converters["unsigned long"], - defaultValue: 0 + key: "keepalive", + converter: webidl.converters.boolean }, { - key: "colno", - converter: webidl.converters["unsigned long"], - defaultValue: 0 + key: "signal", + converter: webidl.nullableConverter( + (signal) => webidl.converters.AbortSignal( + signal, + { strict: false } + ) + ) }, { - key: "error", + key: "window", converter: webidl.converters.any + }, + { + key: "duplex", + converter: webidl.converters.DOMString, + allowedValues: requestDuplex } ]); - events = { - MessageEvent, - CloseEvent, - ErrorEvent - }; - return events; -} -var util; -var hasRequiredUtil; -function requireUtil() { - if (hasRequiredUtil) return util; - hasRequiredUtil = 1; - const { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = requireSymbols(); - const { states, opcodes } = requireConstants(); - const { MessageEvent, ErrorEvent } = requireEvents(); - function isEstablished(ws) { - return ws[kReadyState] === states.OPEN; - } - function isClosing(ws) { - return ws[kReadyState] === states.CLOSING; - } - function isClosed(ws) { - return ws[kReadyState] === states.CLOSED; - } - function fireEvent(e, target, eventConstructor = Event, eventInitDict) { - const event = new eventConstructor(e, eventInitDict); - target.dispatchEvent(event); - } - function websocketMessageReceived(ws, type, data) { - if (ws[kReadyState] !== states.OPEN) { - return; - } - let dataForEvent; - if (type === opcodes.TEXT) { - try { - dataForEvent = new TextDecoder("utf-8", { fatal: true }).decode(data); - } catch { - failWebsocketConnection(ws, "Received invalid UTF-8 in text frame."); - return; - } - } else if (type === opcodes.BINARY) { - if (ws[kBinaryType] === "blob") { - dataForEvent = new Blob([data]); - } else { - dataForEvent = new Uint8Array(data).buffer; - } - } - fireEvent("message", ws, MessageEvent, { - origin: ws[kWebSocketURL].origin, - data: dataForEvent - }); - } - function isValidSubprotocol(protocol) { - if (protocol.length === 0) { - return false; - } - for (const char of protocol) { - const code = char.charCodeAt(0); - if (code < 33 || code > 126 || char === "(" || char === ")" || char === "<" || char === ">" || char === "@" || char === "," || char === ";" || char === ":" || char === "\\" || char === '"' || char === "/" || char === "[" || char === "]" || char === "?" || char === "=" || char === "{" || char === "}" || code === 32 || // SP - code === 9) { - return false; - } - } - return true; - } - function isValidStatusCode(code) { - if (code >= 1e3 && code < 1015) { - return code !== 1004 && // reserved - code !== 1005 && // "MUST NOT be set as a status code" - code !== 1006; - } - return code >= 3e3 && code <= 4999; - } - function failWebsocketConnection(ws, reason) { - const { [kController]: controller, [kResponse]: response2 } = ws; - controller.abort(); - if (response2?.socket && !response2.socket.destroyed) { - response2.socket.destroy(); - } - if (reason) { - fireEvent("error", ws, ErrorEvent, { - error: new Error(reason) - }); - } - } - util = { - isEstablished, - isClosing, - isClosed, - fireEvent, - isValidSubprotocol, - isValidStatusCode, - failWebsocketConnection, - websocketMessageReceived - }; - return util; + request$1 = { Request, makeRequest }; + return request$1; } -var connection; -var hasRequiredConnection; -function requireConnection() { - if (hasRequiredConnection) return connection; - hasRequiredConnection = 1; - const diagnosticsChannel = require$$0$9; - const { uid, states } = requireConstants(); +var fetch_1; +var hasRequiredFetch; +function requireFetch() { + if (hasRequiredFetch) return fetch_1; + hasRequiredFetch = 1; + const { + Response, + makeNetworkError, + makeAppropriateNetworkError, + filterResponse, + makeResponse + } = requireResponse(); + const { Headers } = requireHeaders(); + const { Request, makeRequest } = requireRequest(); + const zlib = require$$3$2; + const { + bytesMatch, + makePolicyContainer, + clonePolicyContainer, + requestBadPort, + TAOCheck, + appendRequestOriginHeader, + responseLocationURL, + requestCurrentURL, + setRequestReferrerPolicyOnRedirect, + tryUpgradeRequestToAPotentiallyTrustworthyURL, + createOpaqueTimingInfo, + appendFetchMetadata, + corsCheck, + crossOriginResourcePolicyCheck, + determineRequestsReferrer, + coarsenedSharedCurrentTime, + createDeferredPromise, + isBlobLike, + sameOrigin, + isCancelled, + isAborted, + isErrorLike, + fullyReadBody, + readableStreamClose, + isomorphicEncode, + urlIsLocal, + urlIsHttpHttpsScheme, + urlHasHttpsScheme + } = requireUtil$5(); + const { kState, kHeaders, kGuard, kRealm } = requireSymbols$3(); + const assert = require$$0$9; + const { safelyExtractBody } = requireBody(); const { - kReadyState, - kSentClose, - kByteParser, - kReceivedClose - } = requireSymbols(); - const { fireEvent, failWebsocketConnection } = requireUtil(); - const { CloseEvent } = requireEvents(); - const { makeRequest } = requireRequest(); - const { fetching } = requireFetch(); - const { Headers } = requireHeaders(); - const { getGlobalDispatcher } = requireGlobal(); + redirectStatusSet, + nullBodyStatus, + safeMethodsSet, + requestBodyHeader, + subresourceSet, + DOMException: DOMException2 + } = requireConstants$3(); const { kHeadersList } = requireSymbols$4(); - const channels = {}; - channels.open = diagnosticsChannel.channel("undici:websocket:open"); - channels.close = diagnosticsChannel.channel("undici:websocket:close"); - channels.socketError = diagnosticsChannel.channel("undici:websocket:socket_error"); - let crypto; - try { - crypto = require("crypto"); - } catch { - } - function establishWebSocketConnection(url, protocols, ws, onEstablish, options) { - const requestURL = url; - requestURL.protocol = url.protocol === "ws:" ? "http:" : "https:"; - const request2 = makeRequest({ - urlList: [requestURL], - serviceWorkers: "none", - referrer: "no-referrer", - mode: "websocket", - credentials: "include", - cache: "no-store", - redirect: "error" - }); - if (options.headers) { - const headersList = new Headers(options.headers)[kHeadersList]; - request2.headersList = headersList; + const EE = require$$4$1; + const { Readable, pipeline } = require$$0$b; + const { addAbortListener, isErrored, isReadable, nodeMajor, nodeMinor } = requireUtil$6(); + const { dataURLProcessor, serializeAMimeType } = requireDataURL(); + const { TransformStream: TransformStream2 } = require$$14; + const { getGlobalDispatcher } = requireGlobal(); + const { webidl } = requireWebidl(); + const { STATUS_CODES } = require$$2$1; + const GET_OR_HEAD = ["GET", "HEAD"]; + let resolveObjectURL; + let ReadableStream2 = globalThis.ReadableStream; + class Fetch extends EE { + constructor(dispatcher2) { + super(); + this.dispatcher = dispatcher2; + this.connection = null; + this.dump = false; + this.state = "ongoing"; + this.setMaxListeners(21); } - const keyValue = crypto.randomBytes(16).toString("base64"); - request2.headersList.append("sec-websocket-key", keyValue); - request2.headersList.append("sec-websocket-version", "13"); - for (const protocol of protocols) { - request2.headersList.append("sec-websocket-protocol", protocol); + terminate(reason) { + if (this.state !== "ongoing") { + return; + } + this.state = "terminated"; + this.connection?.destroy(reason); + this.emit("terminated", reason); } - const permessageDeflate = ""; - const controller = fetching({ - request: request2, - useParallelQueue: true, - dispatcher: options.dispatcher ?? getGlobalDispatcher(), - processResponse(response2) { - if (response2.type === "error" || response2.status !== 101) { - failWebsocketConnection(ws, "Received network error or non-101 status code."); - return; - } - if (protocols.length !== 0 && !response2.headersList.get("Sec-WebSocket-Protocol")) { - failWebsocketConnection(ws, "Server did not respond with sent protocols."); - return; - } - if (response2.headersList.get("Upgrade")?.toLowerCase() !== "websocket") { - failWebsocketConnection(ws, 'Server did not set Upgrade header to "websocket".'); - return; - } - if (response2.headersList.get("Connection")?.toLowerCase() !== "upgrade") { - failWebsocketConnection(ws, 'Server did not set Connection header to "upgrade".'); - return; - } - const secWSAccept = response2.headersList.get("Sec-WebSocket-Accept"); - const digest = crypto.createHash("sha1").update(keyValue + uid).digest("base64"); - if (secWSAccept !== digest) { - failWebsocketConnection(ws, "Incorrect hash received in Sec-WebSocket-Accept header."); - return; - } - const secExtension = response2.headersList.get("Sec-WebSocket-Extensions"); - if (secExtension !== null && secExtension !== permessageDeflate) { - failWebsocketConnection(ws, "Received different permessage-deflate than the one set."); - return; - } - const secProtocol = response2.headersList.get("Sec-WebSocket-Protocol"); - if (secProtocol !== null && secProtocol !== request2.headersList.get("Sec-WebSocket-Protocol")) { - failWebsocketConnection(ws, "Protocol was not set in the opening handshake."); - return; - } - response2.socket.on("data", onSocketData); - response2.socket.on("close", onSocketClose); - response2.socket.on("error", onSocketError); - if (channels.open.hasSubscribers) { - channels.open.publish({ - address: response2.socket.address(), - protocol: secProtocol, - extensions: secExtension - }); - } - onEstablish(response2); + // https://fetch.spec.whatwg.org/#fetch-controller-abort + abort(error) { + if (this.state !== "ongoing") { + return; } - }); - return controller; - } - function onSocketData(chunk) { - if (!this.ws[kByteParser].write(chunk)) { - this.pause(); + this.state = "aborted"; + if (!error) { + error = new DOMException2("The operation was aborted.", "AbortError"); + } + this.serializedAbortReason = error; + this.connection?.destroy(error); + this.emit("terminated", error); } } - function onSocketClose() { - const { ws } = this; - const wasClean = ws[kSentClose] && ws[kReceivedClose]; - let code = 1005; - let reason = ""; - const result = ws[kByteParser].closingInfo; - if (result) { - code = result.code ?? 1005; - reason = result.reason; - } else if (!ws[kSentClose]) { - code = 1006; - } - ws[kReadyState] = states.CLOSED; - fireEvent("close", ws, CloseEvent, { - wasClean, - code, - reason - }); - if (channels.close.hasSubscribers) { - channels.close.publish({ - websocket: ws, - code, - reason - }); + function fetch(input, init = {}) { + webidl.argumentLengthCheck(arguments, 1, { header: "globalThis.fetch" }); + const p = createDeferredPromise(); + let requestObject; + try { + requestObject = new Request(input, init); + } catch (e) { + p.reject(e); + return p.promise; } - } - function onSocketError(error) { - const { ws } = this; - ws[kReadyState] = states.CLOSING; - if (channels.socketError.hasSubscribers) { - channels.socketError.publish(error); + const request2 = requestObject[kState]; + if (requestObject.signal.aborted) { + abortFetch(p, request2, null, requestObject.signal.reason); + return p.promise; } - this.destroy(); - } - connection = { - establishWebSocketConnection - }; - return connection; -} -var frame; -var hasRequiredFrame; -function requireFrame() { - if (hasRequiredFrame) return frame; - hasRequiredFrame = 1; - const { maxUnsigned16Bit } = requireConstants(); - let crypto; - try { - crypto = require("crypto"); - } catch { - } - class WebsocketFrameSend { - /** - * @param {Buffer|undefined} data - */ - constructor(data) { - this.frameData = data; - this.maskKey = crypto.randomBytes(4); + const globalObject = request2.client.globalObject; + if (globalObject?.constructor?.name === "ServiceWorkerGlobalScope") { + request2.serviceWorkers = "none"; } - createFrame(opcode) { - const bodyLength = this.frameData?.byteLength ?? 0; - let payloadLength = bodyLength; - let offset = 6; - if (bodyLength > maxUnsigned16Bit) { - offset += 8; - payloadLength = 127; - } else if (bodyLength > 125) { - offset += 2; - payloadLength = 126; + let responseObject = null; + const relevantRealm = null; + let locallyAborted = false; + let controller = null; + addAbortListener( + requestObject.signal, + () => { + locallyAborted = true; + assert(controller != null); + controller.abort(requestObject.signal.reason); + abortFetch(p, request2, responseObject, requestObject.signal.reason); } - const buffer = Buffer.allocUnsafe(bodyLength + offset); - buffer[0] = buffer[1] = 0; - buffer[0] |= 128; - buffer[0] = (buffer[0] & 240) + opcode; - buffer[offset - 4] = this.maskKey[0]; - buffer[offset - 3] = this.maskKey[1]; - buffer[offset - 2] = this.maskKey[2]; - buffer[offset - 1] = this.maskKey[3]; - buffer[1] = payloadLength; - if (payloadLength === 126) { - buffer.writeUInt16BE(bodyLength, 2); - } else if (payloadLength === 127) { - buffer[2] = buffer[3] = 0; - buffer.writeUIntBE(bodyLength, 4, 6); + ); + const handleFetchDone = (response2) => finalizeAndReportTiming(response2, "fetch"); + const processResponse = (response2) => { + if (locallyAborted) { + return Promise.resolve(); } - buffer[1] |= 128; - for (let i = 0; i < bodyLength; i++) { - buffer[offset + i] = this.frameData[i] ^ this.maskKey[i % 4]; + if (response2.aborted) { + abortFetch(p, request2, responseObject, controller.serializedAbortReason); + return Promise.resolve(); } - return buffer; - } + if (response2.type === "error") { + p.reject( + Object.assign(new TypeError("fetch failed"), { cause: response2.error }) + ); + return Promise.resolve(); + } + responseObject = new Response(); + responseObject[kState] = response2; + responseObject[kRealm] = relevantRealm; + responseObject[kHeaders][kHeadersList] = response2.headersList; + responseObject[kHeaders][kGuard] = "immutable"; + responseObject[kHeaders][kRealm] = relevantRealm; + p.resolve(responseObject); + }; + controller = fetching({ + request: request2, + processResponseEndOfBody: handleFetchDone, + processResponse, + dispatcher: init.dispatcher ?? getGlobalDispatcher() + // undici + }); + return p.promise; } - frame = { - WebsocketFrameSend - }; - return frame; -} -var receiver; -var hasRequiredReceiver; -function requireReceiver() { - if (hasRequiredReceiver) return receiver; - hasRequiredReceiver = 1; - const { Writable } = require$$0$5; - const diagnosticsChannel = require$$0$9; - const { parserStates, opcodes, states, emptyBuffer } = requireConstants(); - const { kReadyState, kSentClose, kResponse, kReceivedClose } = requireSymbols(); - const { isValidStatusCode, failWebsocketConnection, websocketMessageReceived } = requireUtil(); - const { WebsocketFrameSend } = requireFrame(); - const channels = {}; - channels.ping = diagnosticsChannel.channel("undici:websocket:ping"); - channels.pong = diagnosticsChannel.channel("undici:websocket:pong"); - class ByteParser extends Writable { - #buffers = []; - #byteOffset = 0; - #state = parserStates.INFO; - #info = {}; - #fragments = []; - constructor(ws) { - super(); - this.ws = ws; + function finalizeAndReportTiming(response2, initiatorType = "other") { + if (response2.type === "error" && response2.aborted) { + return; } - /** - * @param {Buffer} chunk - * @param {() => void} callback - */ - _write(chunk, _, callback) { - this.#buffers.push(chunk); - this.#byteOffset += chunk.length; - this.run(callback); + if (!response2.urlList?.length) { + return; } - /** - * Runs whenever a new chunk is received. - * Callback is called whenever there are no more chunks buffering, - * or not enough bytes are buffered to parse. - */ - run(callback) { - while (true) { - if (this.#state === parserStates.INFO) { - if (this.#byteOffset < 2) { - return callback(); - } - const buffer = this.consume(2); - this.#info.fin = (buffer[0] & 128) !== 0; - this.#info.opcode = buffer[0] & 15; - this.#info.originalOpcode ??= this.#info.opcode; - this.#info.fragmented = !this.#info.fin && this.#info.opcode !== opcodes.CONTINUATION; - if (this.#info.fragmented && this.#info.opcode !== opcodes.BINARY && this.#info.opcode !== opcodes.TEXT) { - failWebsocketConnection(this.ws, "Invalid frame type was fragmented."); - return; - } - const payloadLength = buffer[1] & 127; - if (payloadLength <= 125) { - this.#info.payloadLength = payloadLength; - this.#state = parserStates.READ_DATA; - } else if (payloadLength === 126) { - this.#state = parserStates.PAYLOADLENGTH_16; - } else if (payloadLength === 127) { - this.#state = parserStates.PAYLOADLENGTH_64; - } - if (this.#info.fragmented && payloadLength > 125) { - failWebsocketConnection(this.ws, "Fragmented frame exceeded 125 bytes."); - return; - } else if ((this.#info.opcode === opcodes.PING || this.#info.opcode === opcodes.PONG || this.#info.opcode === opcodes.CLOSE) && payloadLength > 125) { - failWebsocketConnection(this.ws, "Payload length for control frame exceeded 125 bytes."); - return; - } else if (this.#info.opcode === opcodes.CLOSE) { - if (payloadLength === 1) { - failWebsocketConnection(this.ws, "Received close frame with a 1-byte body."); - return; - } - const body2 = this.consume(payloadLength); - this.#info.closeInfo = this.parseCloseBody(false, body2); - if (!this.ws[kSentClose]) { - const body3 = Buffer.allocUnsafe(2); - body3.writeUInt16BE(this.#info.closeInfo.code, 0); - const closeFrame = new WebsocketFrameSend(body3); - this.ws[kResponse].socket.write( - closeFrame.createFrame(opcodes.CLOSE), - (err) => { - if (!err) { - this.ws[kSentClose] = true; - } - } - ); - } - this.ws[kReadyState] = states.CLOSING; - this.ws[kReceivedClose] = true; - this.end(); - return; - } else if (this.#info.opcode === opcodes.PING) { - const body2 = this.consume(payloadLength); - if (!this.ws[kReceivedClose]) { - const frame2 = new WebsocketFrameSend(body2); - this.ws[kResponse].socket.write(frame2.createFrame(opcodes.PONG)); - if (channels.ping.hasSubscribers) { - channels.ping.publish({ - payload: body2 - }); - } - } - this.#state = parserStates.INFO; - if (this.#byteOffset > 0) { - continue; - } else { - callback(); - return; - } - } else if (this.#info.opcode === opcodes.PONG) { - const body2 = this.consume(payloadLength); - if (channels.pong.hasSubscribers) { - channels.pong.publish({ - payload: body2 - }); - } - if (this.#byteOffset > 0) { - continue; - } else { - callback(); - return; - } - } - } else if (this.#state === parserStates.PAYLOADLENGTH_16) { - if (this.#byteOffset < 2) { - return callback(); - } - const buffer = this.consume(2); - this.#info.payloadLength = buffer.readUInt16BE(0); - this.#state = parserStates.READ_DATA; - } else if (this.#state === parserStates.PAYLOADLENGTH_64) { - if (this.#byteOffset < 8) { - return callback(); - } - const buffer = this.consume(8); - const upper = buffer.readUInt32BE(0); - if (upper > 2 ** 31 - 1) { - failWebsocketConnection(this.ws, "Received payload length > 2^31 bytes."); - return; - } - const lower = buffer.readUInt32BE(4); - this.#info.payloadLength = (upper << 8) + lower; - this.#state = parserStates.READ_DATA; - } else if (this.#state === parserStates.READ_DATA) { - if (this.#byteOffset < this.#info.payloadLength) { - return callback(); - } else if (this.#byteOffset >= this.#info.payloadLength) { - const body2 = this.consume(this.#info.payloadLength); - this.#fragments.push(body2); - if (!this.#info.fragmented || this.#info.fin && this.#info.opcode === opcodes.CONTINUATION) { - const fullMessage = Buffer.concat(this.#fragments); - websocketMessageReceived(this.ws, this.#info.originalOpcode, fullMessage); - this.#info = {}; - this.#fragments.length = 0; - } - this.#state = parserStates.INFO; - } - } - if (this.#byteOffset > 0) { - continue; - } else { - callback(); - break; - } - } + const originalURL = response2.urlList[0]; + let timingInfo = response2.timingInfo; + let cacheState = response2.cacheState; + if (!urlIsHttpHttpsScheme(originalURL)) { + return; } - /** - * Take n bytes from the buffered Buffers - * @param {number} n - * @returns {Buffer|null} - */ - consume(n) { - if (n > this.#byteOffset) { - return null; - } else if (n === 0) { - return emptyBuffer; - } - if (this.#buffers[0].length === n) { - this.#byteOffset -= this.#buffers[0].length; - return this.#buffers.shift(); - } - const buffer = Buffer.allocUnsafe(n); - let offset = 0; - while (offset !== n) { - const next = this.#buffers[0]; - const { length } = next; - if (length + offset === n) { - buffer.set(this.#buffers.shift(), offset); - break; - } else if (length + offset > n) { - buffer.set(next.subarray(0, n - offset), offset); - this.#buffers[0] = next.subarray(n - offset); - break; - } else { - buffer.set(this.#buffers.shift(), offset); - offset += next.length; + if (timingInfo === null) { + return; + } + if (!response2.timingAllowPassed) { + timingInfo = createOpaqueTimingInfo({ + startTime: timingInfo.startTime + }); + cacheState = ""; + } + timingInfo.endTime = coarsenedSharedCurrentTime(); + response2.timingInfo = timingInfo; + markResourceTiming( + timingInfo, + originalURL, + initiatorType, + globalThis, + cacheState + ); + } + function markResourceTiming(timingInfo, originalURL, initiatorType, globalThis2, cacheState) { + if (nodeMajor > 18 || nodeMajor === 18 && nodeMinor >= 2) { + performance.markResourceTiming(timingInfo, originalURL.href, initiatorType, globalThis2, cacheState); + } + } + function abortFetch(p, request2, responseObject, error) { + if (!error) { + error = new DOMException2("The operation was aborted.", "AbortError"); + } + p.reject(error); + if (request2.body != null && isReadable(request2.body?.stream)) { + request2.body.stream.cancel(error).catch((err) => { + if (err.code === "ERR_INVALID_STATE") { + return; } - } - this.#byteOffset -= n; - return buffer; + throw err; + }); } - parseCloseBody(onlyCode, data) { - let code; - if (data.length >= 2) { - code = data.readUInt16BE(0); - } - if (onlyCode) { - if (!isValidStatusCode(code)) { - return null; + if (responseObject == null) { + return; + } + const response2 = responseObject[kState]; + if (response2.body != null && isReadable(response2.body?.stream)) { + response2.body.stream.cancel(error).catch((err) => { + if (err.code === "ERR_INVALID_STATE") { + return; } - return { code }; - } - let reason = data.subarray(2); - if (reason[0] === 239 && reason[1] === 187 && reason[2] === 191) { - reason = reason.subarray(3); - } - if (code !== void 0 && !isValidStatusCode(code)) { - return null; - } - try { - reason = new TextDecoder("utf-8", { fatal: true }).decode(reason); - } catch { - return null; + throw err; + }); + } + } + function fetching({ + request: request2, + processRequestBodyChunkLength, + processRequestEndOfBody, + processResponse, + processResponseEndOfBody, + processResponseConsumeBody, + useParallelQueue = false, + dispatcher: dispatcher2 + // undici + }) { + let taskDestination = null; + let crossOriginIsolatedCapability = false; + if (request2.client != null) { + taskDestination = request2.client.globalObject; + crossOriginIsolatedCapability = request2.client.crossOriginIsolatedCapability; + } + const currenTime = coarsenedSharedCurrentTime(crossOriginIsolatedCapability); + const timingInfo = createOpaqueTimingInfo({ + startTime: currenTime + }); + const fetchParams = { + controller: new Fetch(dispatcher2), + request: request2, + timingInfo, + processRequestBodyChunkLength, + processRequestEndOfBody, + processResponse, + processResponseConsumeBody, + processResponseEndOfBody, + taskDestination, + crossOriginIsolatedCapability + }; + assert(!request2.body || request2.body.stream); + if (request2.window === "client") { + request2.window = request2.client?.globalObject?.constructor?.name === "Window" ? request2.client : "no-window"; + } + if (request2.origin === "client") { + request2.origin = request2.client?.origin; + } + if (request2.policyContainer === "client") { + if (request2.client != null) { + request2.policyContainer = clonePolicyContainer( + request2.client.policyContainer + ); + } else { + request2.policyContainer = makePolicyContainer(); } - return { code, reason }; } - get closingInfo() { - return this.#info.closeInfo; + if (!request2.headersList.contains("accept")) { + const value = "*/*"; + request2.headersList.append("accept", value); + } + if (!request2.headersList.contains("accept-language")) { + request2.headersList.append("accept-language", "*"); } + if (request2.priority === null) ; + if (subresourceSet.has(request2.destination)) ; + mainFetch(fetchParams).catch((err) => { + fetchParams.controller.terminate(err); + }); + return fetchParams.controller; } - receiver = { - ByteParser - }; - return receiver; -} -var websocket; -var hasRequiredWebsocket; -function requireWebsocket() { - if (hasRequiredWebsocket) return websocket; - hasRequiredWebsocket = 1; - const { webidl } = requireWebidl(); - const { DOMException: DOMException2 } = requireConstants$3(); - const { URLSerializer } = requireDataURL(); - const { getGlobalOrigin } = requireGlobal$1(); - const { staticPropertyDescriptors, states, opcodes, emptyBuffer } = requireConstants(); - const { - kWebSocketURL, - kReadyState, - kController, - kBinaryType, - kResponse, - kSentClose, - kByteParser - } = requireSymbols(); - const { isEstablished, isClosing, isValidSubprotocol, failWebsocketConnection, fireEvent } = requireUtil(); - const { establishWebSocketConnection } = requireConnection(); - const { WebsocketFrameSend } = requireFrame(); - const { ByteParser } = requireReceiver(); - const { kEnumerableProperty, isBlobLike } = requireUtil$6(); - const { getGlobalDispatcher } = requireGlobal(); - const { types } = require$$0$2; - let experimentalWarned = false; - class WebSocket extends EventTarget { - #events = { - open: null, - error: null, - close: null, - message: null - }; - #bufferedAmount = 0; - #protocol = ""; - #extensions = ""; - /** - * @param {string} url - * @param {string|string[]} protocols - */ - constructor(url, protocols = []) { - super(); - webidl.argumentLengthCheck(arguments, 1, { header: "WebSocket constructor" }); - if (!experimentalWarned) { - experimentalWarned = true; - process.emitWarning("WebSockets are experimental, expect them to change at any time.", { - code: "UNDICI-WS" - }); + async function mainFetch(fetchParams, recursive = false) { + const request2 = fetchParams.request; + let response2 = null; + if (request2.localURLsOnly && !urlIsLocal(requestCurrentURL(request2))) { + response2 = makeNetworkError("local URLs only"); + } + tryUpgradeRequestToAPotentiallyTrustworthyURL(request2); + if (requestBadPort(request2) === "blocked") { + response2 = makeNetworkError("bad port"); + } + if (request2.referrerPolicy === "") { + request2.referrerPolicy = request2.policyContainer.referrerPolicy; + } + if (request2.referrer !== "no-referrer") { + request2.referrer = determineRequestsReferrer(request2); + } + if (response2 === null) { + response2 = await (async () => { + const currentURL = requestCurrentURL(request2); + if ( + // - request’s current URL’s origin is same origin with request’s origin, + // and request’s response tainting is "basic" + sameOrigin(currentURL, request2.url) && request2.responseTainting === "basic" || // request’s current URL’s scheme is "data" + currentURL.protocol === "data:" || // - request’s mode is "navigate" or "websocket" + (request2.mode === "navigate" || request2.mode === "websocket") + ) { + request2.responseTainting = "basic"; + return await schemeFetch(fetchParams); + } + if (request2.mode === "same-origin") { + return makeNetworkError('request mode cannot be "same-origin"'); + } + if (request2.mode === "no-cors") { + if (request2.redirect !== "follow") { + return makeNetworkError( + 'redirect mode cannot be "follow" for "no-cors" request' + ); + } + request2.responseTainting = "opaque"; + return await schemeFetch(fetchParams); + } + if (!urlIsHttpHttpsScheme(requestCurrentURL(request2))) { + return makeNetworkError("URL scheme must be a HTTP(S) scheme"); + } + request2.responseTainting = "cors"; + return await httpFetch(fetchParams); + })(); + } + if (recursive) { + return response2; + } + if (response2.status !== 0 && !response2.internalResponse) { + if (request2.responseTainting === "cors") ; + if (request2.responseTainting === "basic") { + response2 = filterResponse(response2, "basic"); + } else if (request2.responseTainting === "cors") { + response2 = filterResponse(response2, "cors"); + } else if (request2.responseTainting === "opaque") { + response2 = filterResponse(response2, "opaque"); + } else { + assert(false); } - const options = webidl.converters["DOMString or sequence or WebSocketInit"](protocols); - url = webidl.converters.USVString(url); - protocols = options.protocols; - const baseURL = getGlobalOrigin(); - let urlRecord; - try { - urlRecord = new URL(url, baseURL); - } catch (e) { - throw new DOMException2(e, "SyntaxError"); + } + let internalResponse = response2.status === 0 ? response2 : response2.internalResponse; + if (internalResponse.urlList.length === 0) { + internalResponse.urlList.push(...request2.urlList); + } + if (!request2.timingAllowFailed) { + response2.timingAllowPassed = true; + } + if (response2.type === "opaque" && internalResponse.status === 206 && internalResponse.rangeRequested && !request2.headers.contains("range")) { + response2 = internalResponse = makeNetworkError(); + } + if (response2.status !== 0 && (request2.method === "HEAD" || request2.method === "CONNECT" || nullBodyStatus.includes(internalResponse.status))) { + internalResponse.body = null; + fetchParams.controller.dump = true; + } + if (request2.integrity) { + const processBodyError = (reason) => fetchFinale(fetchParams, makeNetworkError(reason)); + if (request2.responseTainting === "opaque" || response2.body == null) { + processBodyError(response2.error); + return; } - if (urlRecord.protocol === "http:") { - urlRecord.protocol = "ws:"; - } else if (urlRecord.protocol === "https:") { - urlRecord.protocol = "wss:"; + const processBody = (bytes) => { + if (!bytesMatch(bytes, request2.integrity)) { + processBodyError("integrity mismatch"); + return; + } + response2.body = safelyExtractBody(bytes)[0]; + fetchFinale(fetchParams, response2); + }; + await fullyReadBody(response2.body, processBody, processBodyError); + } else { + fetchFinale(fetchParams, response2); + } + } + function schemeFetch(fetchParams) { + if (isCancelled(fetchParams) && fetchParams.request.redirectCount === 0) { + return Promise.resolve(makeAppropriateNetworkError(fetchParams)); + } + const { request: request2 } = fetchParams; + const { protocol: scheme } = requestCurrentURL(request2); + switch (scheme) { + case "about:": { + return Promise.resolve(makeNetworkError("about scheme is not supported")); } - if (urlRecord.protocol !== "ws:" && urlRecord.protocol !== "wss:") { - throw new DOMException2( - `Expected a ws: or wss: protocol, got ${urlRecord.protocol}`, - "SyntaxError" - ); + case "blob:": { + if (!resolveObjectURL) { + resolveObjectURL = require$$7$1.resolveObjectURL; + } + const blobURLEntry = requestCurrentURL(request2); + if (blobURLEntry.search.length !== 0) { + return Promise.resolve(makeNetworkError("NetworkError when attempting to fetch resource.")); + } + const blobURLEntryObject = resolveObjectURL(blobURLEntry.toString()); + if (request2.method !== "GET" || !isBlobLike(blobURLEntryObject)) { + return Promise.resolve(makeNetworkError("invalid method")); + } + const bodyWithType = safelyExtractBody(blobURLEntryObject); + const body2 = bodyWithType[0]; + const length = isomorphicEncode(`${body2.length}`); + const type = bodyWithType[1] ?? ""; + const response2 = makeResponse({ + statusText: "OK", + headersList: [ + ["content-length", { name: "Content-Length", value: length }], + ["content-type", { name: "Content-Type", value: type }] + ] + }); + response2.body = body2; + return Promise.resolve(response2); } - if (urlRecord.hash || urlRecord.href.endsWith("#")) { - throw new DOMException2("Got fragment", "SyntaxError"); + case "data:": { + const currentURL = requestCurrentURL(request2); + const dataURLStruct = dataURLProcessor(currentURL); + if (dataURLStruct === "failure") { + return Promise.resolve(makeNetworkError("failed to fetch the data URL")); + } + const mimeType = serializeAMimeType(dataURLStruct.mimeType); + return Promise.resolve(makeResponse({ + statusText: "OK", + headersList: [ + ["content-type", { name: "Content-Type", value: mimeType }] + ], + body: safelyExtractBody(dataURLStruct.body)[0] + })); } - if (typeof protocols === "string") { - protocols = [protocols]; + case "file:": { + return Promise.resolve(makeNetworkError("not implemented... yet...")); } - if (protocols.length !== new Set(protocols.map((p) => p.toLowerCase())).size) { - throw new DOMException2("Invalid Sec-WebSocket-Protocol value", "SyntaxError"); + case "http:": + case "https:": { + return httpFetch(fetchParams).catch((err) => makeNetworkError(err)); } - if (protocols.length > 0 && !protocols.every((p) => isValidSubprotocol(p))) { - throw new DOMException2("Invalid Sec-WebSocket-Protocol value", "SyntaxError"); + default: { + return Promise.resolve(makeNetworkError("unknown scheme")); } - this[kWebSocketURL] = new URL(urlRecord.href); - this[kController] = establishWebSocketConnection( - urlRecord, - protocols, - this, - (response2) => this.#onConnectionEstablished(response2), - options - ); - this[kReadyState] = WebSocket.CONNECTING; - this[kBinaryType] = "blob"; } - /** - * @see https://websockets.spec.whatwg.org/#dom-websocket-close - * @param {number|undefined} code - * @param {string|undefined} reason - */ - close(code = void 0, reason = void 0) { - webidl.brandCheck(this, WebSocket); - if (code !== void 0) { - code = webidl.converters["unsigned short"](code, { clamp: true }); - } - if (reason !== void 0) { - reason = webidl.converters.USVString(reason); - } - if (code !== void 0) { - if (code !== 1e3 && (code < 3e3 || code > 4999)) { - throw new DOMException2("invalid code", "InvalidAccessError"); - } + } + function finalizeResponse(fetchParams, response2) { + fetchParams.request.done = true; + if (fetchParams.processResponseDone != null) { + queueMicrotask(() => fetchParams.processResponseDone(response2)); + } + } + function fetchFinale(fetchParams, response2) { + if (response2.type === "error") { + response2.urlList = [fetchParams.request.urlList[0]]; + response2.timingInfo = createOpaqueTimingInfo({ + startTime: fetchParams.timingInfo.startTime + }); + } + const processResponseEndOfBody = () => { + fetchParams.request.done = true; + if (fetchParams.processResponseEndOfBody != null) { + queueMicrotask(() => fetchParams.processResponseEndOfBody(response2)); } - let reasonByteLength = 0; - if (reason !== void 0) { - reasonByteLength = Buffer.byteLength(reason); - if (reasonByteLength > 123) { - throw new DOMException2( - `Reason must be less than 123 bytes; received ${reasonByteLength}`, - "SyntaxError" - ); + }; + if (fetchParams.processResponse != null) { + queueMicrotask(() => fetchParams.processResponse(response2)); + } + if (response2.body == null) { + processResponseEndOfBody(); + } else { + const identityTransformAlgorithm = (chunk, controller) => { + controller.enqueue(chunk); + }; + const transformStream = new TransformStream2({ + start() { + }, + transform: identityTransformAlgorithm, + flush: processResponseEndOfBody + }, { + size() { + return 1; } - } - if (this[kReadyState] === WebSocket.CLOSING || this[kReadyState] === WebSocket.CLOSED) ; - else if (!isEstablished(this)) { - failWebsocketConnection(this, "Connection was closed before it was established."); - this[kReadyState] = WebSocket.CLOSING; - } else if (!isClosing(this)) { - const frame2 = new WebsocketFrameSend(); - if (code !== void 0 && reason === void 0) { - frame2.frameData = Buffer.allocUnsafe(2); - frame2.frameData.writeUInt16BE(code, 0); - } else if (code !== void 0 && reason !== void 0) { - frame2.frameData = Buffer.allocUnsafe(2 + reasonByteLength); - frame2.frameData.writeUInt16BE(code, 0); - frame2.frameData.write(reason, 2, "utf-8"); - } else { - frame2.frameData = emptyBuffer; + }, { + size() { + return 1; } - const socket = this[kResponse].socket; - socket.write(frame2.createFrame(opcodes.CLOSE), (err) => { - if (!err) { - this[kSentClose] = true; - } - }); - this[kReadyState] = states.CLOSING; + }); + response2.body = { stream: response2.body.stream.pipeThrough(transformStream) }; + } + if (fetchParams.processResponseConsumeBody != null) { + const processBody = (nullOrBytes) => fetchParams.processResponseConsumeBody(response2, nullOrBytes); + const processBodyError = (failure) => fetchParams.processResponseConsumeBody(response2, failure); + if (response2.body == null) { + queueMicrotask(() => processBody(null)); } else { - this[kReadyState] = WebSocket.CLOSING; + return fullyReadBody(response2.body, processBody, processBodyError); } + return Promise.resolve(); } - /** - * @see https://websockets.spec.whatwg.org/#dom-websocket-send - * @param {NodeJS.TypedArray|ArrayBuffer|Blob|string} data - */ - send(data) { - webidl.brandCheck(this, WebSocket); - webidl.argumentLengthCheck(arguments, 1, { header: "WebSocket.send" }); - data = webidl.converters.WebSocketSendData(data); - if (this[kReadyState] === WebSocket.CONNECTING) { - throw new DOMException2("Sent before connected.", "InvalidStateError"); + } + async function httpFetch(fetchParams) { + const request2 = fetchParams.request; + let response2 = null; + let actualResponse = null; + const timingInfo = fetchParams.timingInfo; + if (request2.serviceWorkers === "all") ; + if (response2 === null) { + if (request2.redirect === "follow") { + request2.serviceWorkers = "none"; } - if (!isEstablished(this) || isClosing(this)) { - return; + actualResponse = response2 = await httpNetworkOrCacheFetch(fetchParams); + if (request2.responseTainting === "cors" && corsCheck(request2, response2) === "failure") { + return makeNetworkError("cors failure"); } - const socket = this[kResponse].socket; - if (typeof data === "string") { - const value = Buffer.from(data); - const frame2 = new WebsocketFrameSend(value); - const buffer = frame2.createFrame(opcodes.TEXT); - this.#bufferedAmount += value.byteLength; - socket.write(buffer, () => { - this.#bufferedAmount -= value.byteLength; - }); - } else if (types.isArrayBuffer(data)) { - const value = Buffer.from(data); - const frame2 = new WebsocketFrameSend(value); - const buffer = frame2.createFrame(opcodes.BINARY); - this.#bufferedAmount += value.byteLength; - socket.write(buffer, () => { - this.#bufferedAmount -= value.byteLength; - }); - } else if (ArrayBuffer.isView(data)) { - const ab = Buffer.from(data, data.byteOffset, data.byteLength); - const frame2 = new WebsocketFrameSend(ab); - const buffer = frame2.createFrame(opcodes.BINARY); - this.#bufferedAmount += ab.byteLength; - socket.write(buffer, () => { - this.#bufferedAmount -= ab.byteLength; - }); - } else if (isBlobLike(data)) { - const frame2 = new WebsocketFrameSend(); - data.arrayBuffer().then((ab) => { - const value = Buffer.from(ab); - frame2.frameData = value; - const buffer = frame2.createFrame(opcodes.BINARY); - this.#bufferedAmount += value.byteLength; - socket.write(buffer, () => { - this.#bufferedAmount -= value.byteLength; - }); - }); + if (TAOCheck(request2, response2) === "failure") { + request2.timingAllowFailed = true; } } - get readyState() { - webidl.brandCheck(this, WebSocket); - return this[kReadyState]; + if ((request2.responseTainting === "opaque" || response2.type === "opaque") && crossOriginResourcePolicyCheck( + request2.origin, + request2.client, + request2.destination, + actualResponse + ) === "blocked") { + return makeNetworkError("blocked"); } - get bufferedAmount() { - webidl.brandCheck(this, WebSocket); - return this.#bufferedAmount; + if (redirectStatusSet.has(actualResponse.status)) { + if (request2.redirect !== "manual") { + fetchParams.controller.connection.destroy(); + } + if (request2.redirect === "error") { + response2 = makeNetworkError("unexpected redirect"); + } else if (request2.redirect === "manual") { + response2 = actualResponse; + } else if (request2.redirect === "follow") { + response2 = await httpRedirectFetch(fetchParams, response2); + } else { + assert(false); + } } - get url() { - webidl.brandCheck(this, WebSocket); - return URLSerializer(this[kWebSocketURL]); + response2.timingInfo = timingInfo; + return response2; + } + function httpRedirectFetch(fetchParams, response2) { + const request2 = fetchParams.request; + const actualResponse = response2.internalResponse ? response2.internalResponse : response2; + let locationURL; + try { + locationURL = responseLocationURL( + actualResponse, + requestCurrentURL(request2).hash + ); + if (locationURL == null) { + return response2; + } + } catch (err) { + return Promise.resolve(makeNetworkError(err)); } - get extensions() { - webidl.brandCheck(this, WebSocket); - return this.#extensions; + if (!urlIsHttpHttpsScheme(locationURL)) { + return Promise.resolve(makeNetworkError("URL scheme must be a HTTP(S) scheme")); } - get protocol() { - webidl.brandCheck(this, WebSocket); - return this.#protocol; + if (request2.redirectCount === 20) { + return Promise.resolve(makeNetworkError("redirect count exceeded")); } - get onopen() { - webidl.brandCheck(this, WebSocket); - return this.#events.open; + request2.redirectCount += 1; + if (request2.mode === "cors" && (locationURL.username || locationURL.password) && !sameOrigin(request2, locationURL)) { + return Promise.resolve(makeNetworkError('cross origin not allowed for request mode "cors"')); } - set onopen(fn) { - webidl.brandCheck(this, WebSocket); - if (this.#events.open) { - this.removeEventListener("open", this.#events.open); - } - if (typeof fn === "function") { - this.#events.open = fn; - this.addEventListener("open", fn); - } else { - this.#events.open = null; - } + if (request2.responseTainting === "cors" && (locationURL.username || locationURL.password)) { + return Promise.resolve(makeNetworkError( + 'URL cannot contain credentials for request mode "cors"' + )); } - get onerror() { - webidl.brandCheck(this, WebSocket); - return this.#events.error; + if (actualResponse.status !== 303 && request2.body != null && request2.body.source == null) { + return Promise.resolve(makeNetworkError()); } - set onerror(fn) { - webidl.brandCheck(this, WebSocket); - if (this.#events.error) { - this.removeEventListener("error", this.#events.error); - } - if (typeof fn === "function") { - this.#events.error = fn; - this.addEventListener("error", fn); - } else { - this.#events.error = null; + if ([301, 302].includes(actualResponse.status) && request2.method === "POST" || actualResponse.status === 303 && !GET_OR_HEAD.includes(request2.method)) { + request2.method = "GET"; + request2.body = null; + for (const headerName of requestBodyHeader) { + request2.headersList.delete(headerName); } } - get onclose() { - webidl.brandCheck(this, WebSocket); - return this.#events.close; + if (!sameOrigin(requestCurrentURL(request2), locationURL)) { + request2.headersList.delete("authorization"); + request2.headersList.delete("proxy-authorization", true); + request2.headersList.delete("cookie"); + request2.headersList.delete("host"); } - set onclose(fn) { - webidl.brandCheck(this, WebSocket); - if (this.#events.close) { - this.removeEventListener("close", this.#events.close); - } - if (typeof fn === "function") { - this.#events.close = fn; - this.addEventListener("close", fn); - } else { - this.#events.close = null; - } + if (request2.body != null) { + assert(request2.body.source != null); + request2.body = safelyExtractBody(request2.body.source)[0]; } - get onmessage() { - webidl.brandCheck(this, WebSocket); - return this.#events.message; + const timingInfo = fetchParams.timingInfo; + timingInfo.redirectEndTime = timingInfo.postRedirectStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability); + if (timingInfo.redirectStartTime === 0) { + timingInfo.redirectStartTime = timingInfo.startTime; } - set onmessage(fn) { - webidl.brandCheck(this, WebSocket); - if (this.#events.message) { - this.removeEventListener("message", this.#events.message); - } - if (typeof fn === "function") { - this.#events.message = fn; - this.addEventListener("message", fn); - } else { - this.#events.message = null; - } + request2.urlList.push(locationURL); + setRequestReferrerPolicyOnRedirect(request2, actualResponse); + return mainFetch(fetchParams, true); + } + async function httpNetworkOrCacheFetch(fetchParams, isAuthenticationFetch = false, isNewConnectionFetch = false) { + const request2 = fetchParams.request; + let httpFetchParams = null; + let httpRequest = null; + let response2 = null; + if (request2.window === "no-window" && request2.redirect === "error") { + httpFetchParams = fetchParams; + httpRequest = request2; + } else { + httpRequest = makeRequest(request2); + httpFetchParams = { ...fetchParams }; + httpFetchParams.request = httpRequest; } - get binaryType() { - webidl.brandCheck(this, WebSocket); - return this[kBinaryType]; + const includeCredentials = request2.credentials === "include" || request2.credentials === "same-origin" && request2.responseTainting === "basic"; + const contentLength = httpRequest.body ? httpRequest.body.length : null; + let contentLengthHeaderValue = null; + if (httpRequest.body == null && ["POST", "PUT"].includes(httpRequest.method)) { + contentLengthHeaderValue = "0"; } - set binaryType(type) { - webidl.brandCheck(this, WebSocket); - if (type !== "blob" && type !== "arraybuffer") { - this[kBinaryType] = "blob"; - } else { - this[kBinaryType] = type; - } + if (contentLength != null) { + contentLengthHeaderValue = isomorphicEncode(`${contentLength}`); } - /** - * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol - */ - #onConnectionEstablished(response2) { - this[kResponse] = response2; - const parser = new ByteParser(this); - parser.on("drain", function onParserDrain() { - this.ws[kResponse].socket.resume(); - }); - response2.socket.ws = this; - this[kByteParser] = parser; - this[kReadyState] = states.OPEN; - const extensions = response2.headersList.get("sec-websocket-extensions"); - if (extensions !== null) { - this.#extensions = extensions; - } - const protocol = response2.headersList.get("sec-websocket-protocol"); - if (protocol !== null) { - this.#protocol = protocol; - } - fireEvent("open", this); + if (contentLengthHeaderValue != null) { + httpRequest.headersList.append("content-length", contentLengthHeaderValue); } - } - WebSocket.CONNECTING = WebSocket.prototype.CONNECTING = states.CONNECTING; - WebSocket.OPEN = WebSocket.prototype.OPEN = states.OPEN; - WebSocket.CLOSING = WebSocket.prototype.CLOSING = states.CLOSING; - WebSocket.CLOSED = WebSocket.prototype.CLOSED = states.CLOSED; - Object.defineProperties(WebSocket.prototype, { - CONNECTING: staticPropertyDescriptors, - OPEN: staticPropertyDescriptors, - CLOSING: staticPropertyDescriptors, - CLOSED: staticPropertyDescriptors, - url: kEnumerableProperty, - readyState: kEnumerableProperty, - bufferedAmount: kEnumerableProperty, - onopen: kEnumerableProperty, - onerror: kEnumerableProperty, - onclose: kEnumerableProperty, - close: kEnumerableProperty, - onmessage: kEnumerableProperty, - binaryType: kEnumerableProperty, - send: kEnumerableProperty, - extensions: kEnumerableProperty, - protocol: kEnumerableProperty, - [Symbol.toStringTag]: { - value: "WebSocket", - writable: false, - enumerable: false, - configurable: true + if (contentLength != null && httpRequest.keepalive) ; + if (httpRequest.referrer instanceof URL) { + httpRequest.headersList.append("referer", isomorphicEncode(httpRequest.referrer.href)); } - }); - Object.defineProperties(WebSocket, { - CONNECTING: staticPropertyDescriptors, - OPEN: staticPropertyDescriptors, - CLOSING: staticPropertyDescriptors, - CLOSED: staticPropertyDescriptors - }); - webidl.converters["sequence"] = webidl.sequenceConverter( - webidl.converters.DOMString - ); - webidl.converters["DOMString or sequence"] = function(V) { - if (webidl.util.Type(V) === "Object" && Symbol.iterator in V) { - return webidl.converters["sequence"](V); + appendRequestOriginHeader(httpRequest); + appendFetchMetadata(httpRequest); + if (!httpRequest.headersList.contains("user-agent")) { + httpRequest.headersList.append("user-agent", typeof esbuildDetection === "undefined" ? "undici" : "node"); + } + if (httpRequest.cache === "default" && (httpRequest.headersList.contains("if-modified-since") || httpRequest.headersList.contains("if-none-match") || httpRequest.headersList.contains("if-unmodified-since") || httpRequest.headersList.contains("if-match") || httpRequest.headersList.contains("if-range"))) { + httpRequest.cache = "no-store"; + } + if (httpRequest.cache === "no-cache" && !httpRequest.preventNoCacheCacheControlHeaderModification && !httpRequest.headersList.contains("cache-control")) { + httpRequest.headersList.append("cache-control", "max-age=0"); + } + if (httpRequest.cache === "no-store" || httpRequest.cache === "reload") { + if (!httpRequest.headersList.contains("pragma")) { + httpRequest.headersList.append("pragma", "no-cache"); + } + if (!httpRequest.headersList.contains("cache-control")) { + httpRequest.headersList.append("cache-control", "no-cache"); + } } - return webidl.converters.DOMString(V); - }; - webidl.converters.WebSocketInit = webidl.dictionaryConverter([ - { - key: "protocols", - converter: webidl.converters["DOMString or sequence"], - get defaultValue() { - return []; + if (httpRequest.headersList.contains("range")) { + httpRequest.headersList.append("accept-encoding", "identity"); + } + if (!httpRequest.headersList.contains("accept-encoding")) { + if (urlHasHttpsScheme(requestCurrentURL(httpRequest))) { + httpRequest.headersList.append("accept-encoding", "br, gzip, deflate"); + } else { + httpRequest.headersList.append("accept-encoding", "gzip, deflate"); } - }, + } + httpRequest.headersList.delete("host"); { - key: "dispatcher", - converter: (V) => V, - get defaultValue() { - return getGlobalDispatcher(); + httpRequest.cache = "no-store"; + } + if (httpRequest.mode !== "no-store" && httpRequest.mode !== "reload") ; + if (response2 == null) { + if (httpRequest.mode === "only-if-cached") { + return makeNetworkError("only if cached"); + } + const forwardResponse = await httpNetworkFetch( + httpFetchParams, + includeCredentials, + isNewConnectionFetch + ); + if (!safeMethodsSet.has(httpRequest.method) && forwardResponse.status >= 200 && forwardResponse.status <= 399) ; + if (response2 == null) { + response2 = forwardResponse; } - }, - { - key: "headers", - converter: webidl.nullableConverter(webidl.converters.HeadersInit) } - ]); - webidl.converters["DOMString or sequence or WebSocketInit"] = function(V) { - if (webidl.util.Type(V) === "Object" && !(Symbol.iterator in V)) { - return webidl.converters.WebSocketInit(V); + response2.urlList = [...httpRequest.urlList]; + if (httpRequest.headersList.contains("range")) { + response2.rangeRequested = true; } - return { protocols: webidl.converters["DOMString or sequence"](V) }; - }; - webidl.converters.WebSocketSendData = function(V) { - if (webidl.util.Type(V) === "Object") { - if (isBlobLike(V)) { - return webidl.converters.Blob(V, { strict: false }); + response2.requestIncludesCredentials = includeCredentials; + if (response2.status === 407) { + if (request2.window === "no-window") { + return makeNetworkError(); } - if (ArrayBuffer.isView(V) || types.isAnyArrayBuffer(V)) { - return webidl.converters.BufferSource(V); + if (isCancelled(fetchParams)) { + return makeAppropriateNetworkError(fetchParams); + } + return makeNetworkError("proxy authentication required"); + } + if ( + // response’s status is 421 + response2.status === 421 && // isNewConnectionFetch is false + !isNewConnectionFetch && // request’s body is null, or request’s body is non-null and request’s body’s source is non-null + (request2.body == null || request2.body.source != null) + ) { + if (isCancelled(fetchParams)) { + return makeAppropriateNetworkError(fetchParams); } + fetchParams.controller.connection.destroy(); + response2 = await httpNetworkOrCacheFetch( + fetchParams, + isAuthenticationFetch, + true + ); } - return webidl.converters.USVString(V); - }; - websocket = { - WebSocket - }; - return websocket; -} -var hasRequiredUndici; -function requireUndici() { - if (hasRequiredUndici) return undici; - hasRequiredUndici = 1; - const Client = requireClient(); - const Dispatcher = requireDispatcher(); - const errors2 = requireErrors(); - const Pool = requirePool(); - const BalancedPool = requireBalancedPool(); - const Agent = requireAgent(); - const util2 = requireUtil$6(); - const { InvalidArgumentError } = errors2; - const api2 = requireApi(); - const buildConnector = requireConnect(); - const MockClient = requireMockClient(); - const MockAgent = requireMockAgent(); - const MockPool = requireMockPool(); - const mockErrors2 = requireMockErrors(); - const ProxyAgent = requireProxyAgent(); - const RetryHandler = requireRetryHandler(); - const { getGlobalDispatcher, setGlobalDispatcher } = requireGlobal(); - const DecoratorHandler = requireDecoratorHandler(); - const RedirectHandler = requireRedirectHandler(); - const createRedirectInterceptor = requireRedirectInterceptor(); - let hasCrypto; - try { - require("crypto"); - hasCrypto = true; - } catch { - hasCrypto = false; + return response2; } - Object.assign(Dispatcher.prototype, api2); - undici.Dispatcher = Dispatcher; - undici.Client = Client; - undici.Pool = Pool; - undici.BalancedPool = BalancedPool; - undici.Agent = Agent; - undici.ProxyAgent = ProxyAgent; - undici.RetryHandler = RetryHandler; - undici.DecoratorHandler = DecoratorHandler; - undici.RedirectHandler = RedirectHandler; - undici.createRedirectInterceptor = createRedirectInterceptor; - undici.buildConnector = buildConnector; - undici.errors = errors2; - function makeDispatcher(fn) { - return (url, opts, handler2) => { - if (typeof opts === "function") { - handler2 = opts; - opts = null; + async function httpNetworkFetch(fetchParams, includeCredentials = false, forceNewConnection = false) { + assert(!fetchParams.controller.connection || fetchParams.controller.connection.destroyed); + fetchParams.controller.connection = { + abort: null, + destroyed: false, + destroy(err) { + if (!this.destroyed) { + this.destroyed = true; + this.abort?.(err ?? new DOMException2("The operation was aborted.", "AbortError")); + } } - if (!url || typeof url !== "string" && typeof url !== "object" && !(url instanceof URL)) { - throw new InvalidArgumentError("invalid url"); + }; + const request2 = fetchParams.request; + let response2 = null; + const timingInfo = fetchParams.timingInfo; + { + request2.cache = "no-store"; + } + if (request2.mode === "websocket") ; + let requestBody = null; + if (request2.body == null && fetchParams.processRequestEndOfBody) { + queueMicrotask(() => fetchParams.processRequestEndOfBody()); + } else if (request2.body != null) { + const processBodyChunk = async function* (bytes) { + if (isCancelled(fetchParams)) { + return; + } + yield bytes; + fetchParams.processRequestBodyChunkLength?.(bytes.byteLength); + }; + const processEndOfBody = () => { + if (isCancelled(fetchParams)) { + return; + } + if (fetchParams.processRequestEndOfBody) { + fetchParams.processRequestEndOfBody(); + } + }; + const processBodyError = (e) => { + if (isCancelled(fetchParams)) { + return; + } + if (e.name === "AbortError") { + fetchParams.controller.abort(); + } else { + fetchParams.controller.terminate(e); + } + }; + requestBody = (async function* () { + try { + for await (const bytes of request2.body.stream) { + yield* processBodyChunk(bytes); + } + processEndOfBody(); + } catch (err) { + processBodyError(err); + } + })(); + } + try { + const { body: body2, status, statusText, headersList, socket } = await dispatch({ body: requestBody }); + if (socket) { + response2 = makeResponse({ status, statusText, headersList, socket }); + } else { + const iterator2 = body2[Symbol.asyncIterator](); + fetchParams.controller.next = () => iterator2.next(); + response2 = makeResponse({ status, statusText, headersList }); } - if (opts != null && typeof opts !== "object") { - throw new InvalidArgumentError("invalid opts"); + } catch (err) { + if (err.name === "AbortError") { + fetchParams.controller.connection.destroy(); + return makeAppropriateNetworkError(fetchParams, err); } - if (opts && opts.path != null) { - if (typeof opts.path !== "string") { - throw new InvalidArgumentError("invalid opts.path"); + return makeNetworkError(err); + } + const pullAlgorithm = () => { + fetchParams.controller.resume(); + }; + const cancelAlgorithm = (reason) => { + fetchParams.controller.abort(reason); + }; + if (!ReadableStream2) { + ReadableStream2 = require$$14.ReadableStream; + } + const stream = new ReadableStream2( + { + async start(controller) { + fetchParams.controller.controller = controller; + }, + async pull(controller) { + await pullAlgorithm(); + }, + async cancel(reason) { + await cancelAlgorithm(reason); + } + }, + { + highWaterMark: 0, + size() { + return 1; + } + } + ); + response2.body = { stream }; + fetchParams.controller.on("terminated", onAborted); + fetchParams.controller.resume = async () => { + while (true) { + let bytes; + let isFailure; + try { + const { done, value } = await fetchParams.controller.next(); + if (isAborted(fetchParams)) { + break; + } + bytes = done ? void 0 : value; + } catch (err) { + if (fetchParams.controller.ended && !timingInfo.encodedBodySize) { + bytes = void 0; + } else { + bytes = err; + isFailure = true; + } } - let path = opts.path; - if (!opts.path.startsWith("/")) { - path = `/${path}`; + if (bytes === void 0) { + readableStreamClose(fetchParams.controller.controller); + finalizeResponse(fetchParams, response2); + return; } - url = new URL(util2.parseOrigin(url).origin + path); - } else { - if (!opts) { - opts = typeof url === "object" ? url : {}; + timingInfo.decodedBodySize += bytes?.byteLength ?? 0; + if (isFailure) { + fetchParams.controller.terminate(bytes); + return; + } + fetchParams.controller.controller.enqueue(new Uint8Array(bytes)); + if (isErrored(stream)) { + fetchParams.controller.terminate(); + return; + } + if (!fetchParams.controller.controller.desiredSize) { + return; } - url = util2.parseURL(url); - } - const { agent: agent2, dispatcher: dispatcher2 = getGlobalDispatcher() } = opts; - if (agent2) { - throw new InvalidArgumentError("unsupported opts.agent. Did you mean opts.client?"); } - return fn.call(dispatcher2, { - ...opts, - origin: url.origin, - path: url.search ? `${url.pathname}${url.search}` : url.pathname, - method: opts.method || (opts.body ? "PUT" : "GET") - }, handler2); }; - } - undici.setGlobalDispatcher = setGlobalDispatcher; - undici.getGlobalDispatcher = getGlobalDispatcher; - if (util2.nodeMajor > 16 || util2.nodeMajor === 16 && util2.nodeMinor >= 8) { - let fetchImpl = null; - undici.fetch = async function fetch(resource) { - if (!fetchImpl) { - fetchImpl = requireFetch().fetch; - } - try { - return await fetchImpl(...arguments); - } catch (err) { - if (typeof err === "object") { - Error.captureStackTrace(err, this); + function onAborted(reason) { + if (isAborted(fetchParams)) { + response2.aborted = true; + if (isReadable(stream)) { + fetchParams.controller.controller.error( + fetchParams.controller.serializedAbortReason + ); + } + } else { + if (isReadable(stream)) { + fetchParams.controller.controller.error(new TypeError("terminated", { + cause: isErrorLike(reason) ? reason : void 0 + })); } - throw err; } - }; - undici.Headers = requireHeaders().Headers; - undici.Response = requireResponse().Response; - undici.Request = requireRequest().Request; - undici.FormData = requireFormdata().FormData; - undici.File = requireFile().File; - undici.FileReader = requireFilereader().FileReader; - const { setGlobalOrigin, getGlobalOrigin } = requireGlobal$1(); - undici.setGlobalOrigin = setGlobalOrigin; - undici.getGlobalOrigin = getGlobalOrigin; - const { CacheStorage } = requireCachestorage(); - const { kConstruct } = requireSymbols$1(); - undici.caches = new CacheStorage(kConstruct); - } - if (util2.nodeMajor >= 16) { - const { deleteCookie, getCookies, getSetCookies, setCookie } = requireCookies(); - undici.deleteCookie = deleteCookie; - undici.getCookies = getCookies; - undici.getSetCookies = getSetCookies; - undici.setCookie = setCookie; - const { parseMIMEType, serializeAMimeType } = requireDataURL(); - undici.parseMIMEType = parseMIMEType; - undici.serializeAMimeType = serializeAMimeType; + fetchParams.controller.connection.destroy(); + } + return response2; + async function dispatch({ body: body2 }) { + const url = requestCurrentURL(request2); + const agent2 = fetchParams.controller.dispatcher; + return new Promise((resolve, reject) => agent2.dispatch( + { + path: url.pathname + url.search, + origin: url.origin, + method: request2.method, + body: fetchParams.controller.dispatcher.isMockActive ? request2.body && (request2.body.source || request2.body.stream) : body2, + headers: request2.headersList.entries, + maxRedirections: 0, + upgrade: request2.mode === "websocket" ? "websocket" : void 0 + }, + { + body: null, + abort: null, + onConnect(abort) { + const { connection: connection2 } = fetchParams.controller; + if (connection2.destroyed) { + abort(new DOMException2("The operation was aborted.", "AbortError")); + } else { + fetchParams.controller.on("terminated", abort); + this.abort = connection2.abort = abort; + } + }, + onHeaders(status, headersList, resume, statusText) { + if (status < 200) { + return; + } + let codings = []; + let location = ""; + const headers2 = new Headers(); + if (Array.isArray(headersList)) { + for (let n = 0; n < headersList.length; n += 2) { + const key = headersList[n + 0].toString("latin1"); + const val = headersList[n + 1].toString("latin1"); + if (key.toLowerCase() === "content-encoding") { + codings = val.toLowerCase().split(",").map((x) => x.trim()); + } else if (key.toLowerCase() === "location") { + location = val; + } + headers2[kHeadersList].append(key, val); + } + } else { + const keys = Object.keys(headersList); + for (const key of keys) { + const val = headersList[key]; + if (key.toLowerCase() === "content-encoding") { + codings = val.toLowerCase().split(",").map((x) => x.trim()).reverse(); + } else if (key.toLowerCase() === "location") { + location = val; + } + headers2[kHeadersList].append(key, val); + } + } + this.body = new Readable({ read: resume }); + const decoders = []; + const willFollow = request2.redirect === "follow" && location && redirectStatusSet.has(status); + if (request2.method !== "HEAD" && request2.method !== "CONNECT" && !nullBodyStatus.includes(status) && !willFollow) { + for (const coding of codings) { + if (coding === "x-gzip" || coding === "gzip") { + decoders.push(zlib.createGunzip({ + // Be less strict when decoding compressed responses, since sometimes + // servers send slightly invalid responses that are still accepted + // by common browsers. + // Always using Z_SYNC_FLUSH is what cURL does. + flush: zlib.constants.Z_SYNC_FLUSH, + finishFlush: zlib.constants.Z_SYNC_FLUSH + })); + } else if (coding === "deflate") { + decoders.push(zlib.createInflate()); + } else if (coding === "br") { + decoders.push(zlib.createBrotliDecompress()); + } else { + decoders.length = 0; + break; + } + } + } + resolve({ + status, + statusText, + headersList: headers2[kHeadersList], + body: decoders.length ? pipeline(this.body, ...decoders, () => { + }) : this.body.on("error", () => { + }) + }); + return true; + }, + onData(chunk) { + if (fetchParams.controller.dump) { + return; + } + const bytes = chunk; + timingInfo.encodedBodySize += bytes.byteLength; + return this.body.push(bytes); + }, + onComplete() { + if (this.abort) { + fetchParams.controller.off("terminated", this.abort); + } + fetchParams.controller.ended = true; + this.body.push(null); + }, + onError(error) { + if (this.abort) { + fetchParams.controller.off("terminated", this.abort); + } + this.body?.destroy(error); + fetchParams.controller.terminate(error); + reject(error); + }, + onUpgrade(status, headersList, socket) { + if (status !== 101) { + return; + } + const headers2 = new Headers(); + for (let n = 0; n < headersList.length; n += 2) { + const key = headersList[n + 0].toString("latin1"); + const val = headersList[n + 1].toString("latin1"); + headers2[kHeadersList].append(key, val); + } + resolve({ + status, + statusText: STATUS_CODES[status], + headersList: headers2[kHeadersList], + socket + }); + return true; + } + } + )); + } } - if (util2.nodeMajor >= 18 && hasCrypto) { - const { WebSocket } = requireWebsocket(); - undici.WebSocket = WebSocket; + fetch_1 = { + fetch, + Fetch, + fetching, + finalizeAndReportTiming + }; + return fetch_1; +} +var symbols$2; +var hasRequiredSymbols$2; +function requireSymbols$2() { + if (hasRequiredSymbols$2) return symbols$2; + hasRequiredSymbols$2 = 1; + symbols$2 = { + kState: /* @__PURE__ */ Symbol("FileReader state"), + kResult: /* @__PURE__ */ Symbol("FileReader result"), + kError: /* @__PURE__ */ Symbol("FileReader error"), + kLastProgressEventFired: /* @__PURE__ */ Symbol("FileReader last progress event fired timestamp"), + kEvents: /* @__PURE__ */ Symbol("FileReader events"), + kAborted: /* @__PURE__ */ Symbol("FileReader aborted") + }; + return symbols$2; +} +var progressevent; +var hasRequiredProgressevent; +function requireProgressevent() { + if (hasRequiredProgressevent) return progressevent; + hasRequiredProgressevent = 1; + const { webidl } = requireWebidl(); + const kState = /* @__PURE__ */ Symbol("ProgressEvent state"); + class ProgressEvent extends Event { + constructor(type, eventInitDict = {}) { + type = webidl.converters.DOMString(type); + eventInitDict = webidl.converters.ProgressEventInit(eventInitDict ?? {}); + super(type, eventInitDict); + this[kState] = { + lengthComputable: eventInitDict.lengthComputable, + loaded: eventInitDict.loaded, + total: eventInitDict.total + }; + } + get lengthComputable() { + webidl.brandCheck(this, ProgressEvent); + return this[kState].lengthComputable; + } + get loaded() { + webidl.brandCheck(this, ProgressEvent); + return this[kState].loaded; + } + get total() { + webidl.brandCheck(this, ProgressEvent); + return this[kState].total; + } } - undici.request = makeDispatcher(api2.request); - undici.stream = makeDispatcher(api2.stream); - undici.pipeline = makeDispatcher(api2.pipeline); - undici.connect = makeDispatcher(api2.connect); - undici.upgrade = makeDispatcher(api2.upgrade); - undici.MockClient = MockClient; - undici.MockPool = MockPool; - undici.MockAgent = MockAgent; - undici.mockErrors = mockErrors2; - return undici; + webidl.converters.ProgressEventInit = webidl.dictionaryConverter([ + { + key: "lengthComputable", + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: "loaded", + converter: webidl.converters["unsigned long long"], + defaultValue: 0 + }, + { + key: "total", + converter: webidl.converters["unsigned long long"], + defaultValue: 0 + }, + { + key: "bubbles", + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: "cancelable", + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: "composed", + converter: webidl.converters.boolean, + defaultValue: false + } + ]); + progressevent = { + ProgressEvent + }; + return progressevent; } -var hasRequiredLib; -function requireLib() { - if (hasRequiredLib) return lib; - hasRequiredLib = 1; - var __createBinding = lib && lib.__createBinding || (Object.create ? (function(o, m, k, k2) { - if (k2 === void 0) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { - return m[k]; - } }; +var encoding; +var hasRequiredEncoding; +function requireEncoding() { + if (hasRequiredEncoding) return encoding; + hasRequiredEncoding = 1; + function getEncoding(label) { + if (!label) { + return "failure"; } - Object.defineProperty(o, k2, desc); - }) : (function(o, m, k, k2) { - if (k2 === void 0) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = lib && lib.__setModuleDefault || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = lib && lib.__importStar || function(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) { - for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + switch (label.trim().toLowerCase()) { + case "unicode-1-1-utf-8": + case "unicode11utf8": + case "unicode20utf8": + case "utf-8": + case "utf8": + case "x-unicode20utf8": + return "UTF-8"; + case "866": + case "cp866": + case "csibm866": + case "ibm866": + return "IBM866"; + case "csisolatin2": + case "iso-8859-2": + case "iso-ir-101": + case "iso8859-2": + case "iso88592": + case "iso_8859-2": + case "iso_8859-2:1987": + case "l2": + case "latin2": + return "ISO-8859-2"; + case "csisolatin3": + case "iso-8859-3": + case "iso-ir-109": + case "iso8859-3": + case "iso88593": + case "iso_8859-3": + case "iso_8859-3:1988": + case "l3": + case "latin3": + return "ISO-8859-3"; + case "csisolatin4": + case "iso-8859-4": + case "iso-ir-110": + case "iso8859-4": + case "iso88594": + case "iso_8859-4": + case "iso_8859-4:1988": + case "l4": + case "latin4": + return "ISO-8859-4"; + case "csisolatincyrillic": + case "cyrillic": + case "iso-8859-5": + case "iso-ir-144": + case "iso8859-5": + case "iso88595": + case "iso_8859-5": + case "iso_8859-5:1988": + return "ISO-8859-5"; + case "arabic": + case "asmo-708": + case "csiso88596e": + case "csiso88596i": + case "csisolatinarabic": + case "ecma-114": + case "iso-8859-6": + case "iso-8859-6-e": + case "iso-8859-6-i": + case "iso-ir-127": + case "iso8859-6": + case "iso88596": + case "iso_8859-6": + case "iso_8859-6:1987": + return "ISO-8859-6"; + case "csisolatingreek": + case "ecma-118": + case "elot_928": + case "greek": + case "greek8": + case "iso-8859-7": + case "iso-ir-126": + case "iso8859-7": + case "iso88597": + case "iso_8859-7": + case "iso_8859-7:1987": + case "sun_eu_greek": + return "ISO-8859-7"; + case "csiso88598e": + case "csisolatinhebrew": + case "hebrew": + case "iso-8859-8": + case "iso-8859-8-e": + case "iso-ir-138": + case "iso8859-8": + case "iso88598": + case "iso_8859-8": + case "iso_8859-8:1988": + case "visual": + return "ISO-8859-8"; + case "csiso88598i": + case "iso-8859-8-i": + case "logical": + return "ISO-8859-8-I"; + case "csisolatin6": + case "iso-8859-10": + case "iso-ir-157": + case "iso8859-10": + case "iso885910": + case "l6": + case "latin6": + return "ISO-8859-10"; + case "iso-8859-13": + case "iso8859-13": + case "iso885913": + return "ISO-8859-13"; + case "iso-8859-14": + case "iso8859-14": + case "iso885914": + return "ISO-8859-14"; + case "csisolatin9": + case "iso-8859-15": + case "iso8859-15": + case "iso885915": + case "iso_8859-15": + case "l9": + return "ISO-8859-15"; + case "iso-8859-16": + return "ISO-8859-16"; + case "cskoi8r": + case "koi": + case "koi8": + case "koi8-r": + case "koi8_r": + return "KOI8-R"; + case "koi8-ru": + case "koi8-u": + return "KOI8-U"; + case "csmacintosh": + case "mac": + case "macintosh": + case "x-mac-roman": + return "macintosh"; + case "iso-8859-11": + case "iso8859-11": + case "iso885911": + case "tis-620": + case "windows-874": + return "windows-874"; + case "cp1250": + case "windows-1250": + case "x-cp1250": + return "windows-1250"; + case "cp1251": + case "windows-1251": + case "x-cp1251": + return "windows-1251"; + case "ansi_x3.4-1968": + case "ascii": + case "cp1252": + case "cp819": + case "csisolatin1": + case "ibm819": + case "iso-8859-1": + case "iso-ir-100": + case "iso8859-1": + case "iso88591": + case "iso_8859-1": + case "iso_8859-1:1987": + case "l1": + case "latin1": + case "us-ascii": + case "windows-1252": + case "x-cp1252": + return "windows-1252"; + case "cp1253": + case "windows-1253": + case "x-cp1253": + return "windows-1253"; + case "cp1254": + case "csisolatin5": + case "iso-8859-9": + case "iso-ir-148": + case "iso8859-9": + case "iso88599": + case "iso_8859-9": + case "iso_8859-9:1989": + case "l5": + case "latin5": + case "windows-1254": + case "x-cp1254": + return "windows-1254"; + case "cp1255": + case "windows-1255": + case "x-cp1255": + return "windows-1255"; + case "cp1256": + case "windows-1256": + case "x-cp1256": + return "windows-1256"; + case "cp1257": + case "windows-1257": + case "x-cp1257": + return "windows-1257"; + case "cp1258": + case "windows-1258": + case "x-cp1258": + return "windows-1258"; + case "x-mac-cyrillic": + case "x-mac-ukrainian": + return "x-mac-cyrillic"; + case "chinese": + case "csgb2312": + case "csiso58gb231280": + case "gb2312": + case "gb_2312": + case "gb_2312-80": + case "gbk": + case "iso-ir-58": + case "x-gbk": + return "GBK"; + case "gb18030": + return "gb18030"; + case "big5": + case "big5-hkscs": + case "cn-big5": + case "csbig5": + case "x-x-big5": + return "Big5"; + case "cseucpkdfmtjapanese": + case "euc-jp": + case "x-euc-jp": + return "EUC-JP"; + case "csiso2022jp": + case "iso-2022-jp": + return "ISO-2022-JP"; + case "csshiftjis": + case "ms932": + case "ms_kanji": + case "shift-jis": + case "shift_jis": + case "sjis": + case "windows-31j": + case "x-sjis": + return "Shift_JIS"; + case "cseuckr": + case "csksc56011987": + case "euc-kr": + case "iso-ir-149": + case "korean": + case "ks_c_5601-1987": + case "ks_c_5601-1989": + case "ksc5601": + case "ksc_5601": + case "windows-949": + return "EUC-KR"; + case "csiso2022kr": + case "hz-gb-2312": + case "iso-2022-cn": + case "iso-2022-cn-ext": + case "iso-2022-kr": + case "replacement": + return "replacement"; + case "unicodefffe": + case "utf-16be": + return "UTF-16BE"; + case "csunicode": + case "iso-10646-ucs-2": + case "ucs-2": + case "unicode": + case "unicodefeff": + case "utf-16": + case "utf-16le": + return "UTF-16LE"; + case "x-user-defined": + return "x-user-defined"; + default: + return "failure"; } - __setModuleDefault(result, mod); - return result; + } + encoding = { + getEncoding }; - var __awaiter = lib && lib.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); + return encoding; +} +var util$3; +var hasRequiredUtil$3; +function requireUtil$3() { + if (hasRequiredUtil$3) return util$3; + hasRequiredUtil$3 = 1; + const { + kState, + kError, + kResult, + kAborted, + kLastProgressEventFired + } = requireSymbols$2(); + const { ProgressEvent } = requireProgressevent(); + const { getEncoding } = requireEncoding(); + const { DOMException: DOMException2 } = requireConstants$3(); + const { serializeAMimeType, parseMIMEType } = requireDataURL(); + const { types } = require$$0$2; + const { StringDecoder } = require$$5$3; + const { btoa } = require$$7$1; + const staticPropertyDescriptors = { + enumerable: true, + writable: false, + configurable: false }; - Object.defineProperty(lib, "__esModule", { value: true }); - lib.HttpClient = lib.isHttps = lib.HttpClientResponse = lib.HttpClientError = lib.getProxyUrl = lib.MediaTypes = lib.Headers = lib.HttpCodes = void 0; - const http = __importStar(require$$2$1); - const https = __importStar(require$$3$1); - const pm = __importStar(requireProxy()); - const tunnel2 = __importStar(requireTunnel()); - const undici_1 = requireUndici(); - var HttpCodes; - (function(HttpCodes2) { - HttpCodes2[HttpCodes2["OK"] = 200] = "OK"; - HttpCodes2[HttpCodes2["MultipleChoices"] = 300] = "MultipleChoices"; - HttpCodes2[HttpCodes2["MovedPermanently"] = 301] = "MovedPermanently"; - HttpCodes2[HttpCodes2["ResourceMoved"] = 302] = "ResourceMoved"; - HttpCodes2[HttpCodes2["SeeOther"] = 303] = "SeeOther"; - HttpCodes2[HttpCodes2["NotModified"] = 304] = "NotModified"; - HttpCodes2[HttpCodes2["UseProxy"] = 305] = "UseProxy"; - HttpCodes2[HttpCodes2["SwitchProxy"] = 306] = "SwitchProxy"; - HttpCodes2[HttpCodes2["TemporaryRedirect"] = 307] = "TemporaryRedirect"; - HttpCodes2[HttpCodes2["PermanentRedirect"] = 308] = "PermanentRedirect"; - HttpCodes2[HttpCodes2["BadRequest"] = 400] = "BadRequest"; - HttpCodes2[HttpCodes2["Unauthorized"] = 401] = "Unauthorized"; - HttpCodes2[HttpCodes2["PaymentRequired"] = 402] = "PaymentRequired"; - HttpCodes2[HttpCodes2["Forbidden"] = 403] = "Forbidden"; - HttpCodes2[HttpCodes2["NotFound"] = 404] = "NotFound"; - HttpCodes2[HttpCodes2["MethodNotAllowed"] = 405] = "MethodNotAllowed"; - HttpCodes2[HttpCodes2["NotAcceptable"] = 406] = "NotAcceptable"; - HttpCodes2[HttpCodes2["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; - HttpCodes2[HttpCodes2["RequestTimeout"] = 408] = "RequestTimeout"; - HttpCodes2[HttpCodes2["Conflict"] = 409] = "Conflict"; - HttpCodes2[HttpCodes2["Gone"] = 410] = "Gone"; - HttpCodes2[HttpCodes2["TooManyRequests"] = 429] = "TooManyRequests"; - HttpCodes2[HttpCodes2["InternalServerError"] = 500] = "InternalServerError"; - HttpCodes2[HttpCodes2["NotImplemented"] = 501] = "NotImplemented"; - HttpCodes2[HttpCodes2["BadGateway"] = 502] = "BadGateway"; - HttpCodes2[HttpCodes2["ServiceUnavailable"] = 503] = "ServiceUnavailable"; - HttpCodes2[HttpCodes2["GatewayTimeout"] = 504] = "GatewayTimeout"; - })(HttpCodes || (lib.HttpCodes = HttpCodes = {})); - var Headers; - (function(Headers2) { - Headers2["Accept"] = "accept"; - Headers2["ContentType"] = "content-type"; - })(Headers || (lib.Headers = Headers = {})); - var MediaTypes; - (function(MediaTypes2) { - MediaTypes2["ApplicationJson"] = "application/json"; - })(MediaTypes || (lib.MediaTypes = MediaTypes = {})); - function getProxyUrl(serverUrl) { - const proxyUrl = pm.getProxyUrl(new URL(serverUrl)); - return proxyUrl ? proxyUrl.href : ""; - } - lib.getProxyUrl = getProxyUrl; - const HttpRedirectCodes = [ - HttpCodes.MovedPermanently, - HttpCodes.ResourceMoved, - HttpCodes.SeeOther, - HttpCodes.TemporaryRedirect, - HttpCodes.PermanentRedirect - ]; - const HttpResponseRetryCodes = [ - HttpCodes.BadGateway, - HttpCodes.ServiceUnavailable, - HttpCodes.GatewayTimeout - ]; - const RetryableHttpVerbs = ["OPTIONS", "GET", "DELETE", "HEAD"]; - const ExponentialBackoffCeiling = 10; - const ExponentialBackoffTimeSlice = 5; - class HttpClientError extends Error { - constructor(message, statusCode) { - super(message); - this.name = "HttpClientError"; - this.statusCode = statusCode; - Object.setPrototypeOf(this, HttpClientError.prototype); - } - } - lib.HttpClientError = HttpClientError; - class HttpClientResponse { - constructor(message) { - this.message = message; - } - readBody() { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { - let output = Buffer.alloc(0); - this.message.on("data", (chunk) => { - output = Buffer.concat([output, chunk]); - }); - this.message.on("end", () => { - resolve(output.toString()); - }); - })); - }); + function readOperation(fr, blob, type, encodingName) { + if (fr[kState] === "loading") { + throw new DOMException2("Invalid state", "InvalidStateError"); } - readBodyBuffer() { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { - const chunks = []; - this.message.on("data", (chunk) => { - chunks.push(chunk); - }); - this.message.on("end", () => { - resolve(Buffer.concat(chunks)); + fr[kState] = "loading"; + fr[kResult] = null; + fr[kError] = null; + const stream = blob.stream(); + const reader = stream.getReader(); + const bytes = []; + let chunkPromise = reader.read(); + let isFirstChunk = true; + (async () => { + while (!fr[kAborted]) { + try { + const { done, value } = await chunkPromise; + if (isFirstChunk && !fr[kAborted]) { + queueMicrotask(() => { + fireAProgressEvent("loadstart", fr); + }); + } + isFirstChunk = false; + if (!done && types.isUint8Array(value)) { + bytes.push(value); + if ((fr[kLastProgressEventFired] === void 0 || Date.now() - fr[kLastProgressEventFired] >= 50) && !fr[kAborted]) { + fr[kLastProgressEventFired] = Date.now(); + queueMicrotask(() => { + fireAProgressEvent("progress", fr); + }); + } + chunkPromise = reader.read(); + } else if (done) { + queueMicrotask(() => { + fr[kState] = "done"; + try { + const result = packageData(bytes, type, blob.type, encodingName); + if (fr[kAborted]) { + return; + } + fr[kResult] = result; + fireAProgressEvent("load", fr); + } catch (error) { + fr[kError] = error; + fireAProgressEvent("error", fr); + } + if (fr[kState] !== "loading") { + fireAProgressEvent("loadend", fr); + } + }); + break; + } + } catch (error) { + if (fr[kAborted]) { + return; + } + queueMicrotask(() => { + fr[kState] = "done"; + fr[kError] = error; + fireAProgressEvent("error", fr); + if (fr[kState] !== "loading") { + fireAProgressEvent("loadend", fr); + } }); - })); - }); - } + break; + } + } + })(); } - lib.HttpClientResponse = HttpClientResponse; - function isHttps(requestUrl) { - const parsedUrl = new URL(requestUrl); - return parsedUrl.protocol === "https:"; + function fireAProgressEvent(e, reader) { + const event = new ProgressEvent(e, { + bubbles: false, + cancelable: false + }); + reader.dispatchEvent(event); } - lib.isHttps = isHttps; - class HttpClient { - constructor(userAgent2, handlers, requestOptions) { - this._ignoreSslError = false; - this._allowRedirects = true; - this._allowRedirectDowngrade = false; - this._maxRedirects = 50; - this._allowRetries = false; - this._maxRetries = 1; - this._keepAlive = false; - this._disposed = false; - this.userAgent = userAgent2; - this.handlers = handlers || []; - this.requestOptions = requestOptions; - if (requestOptions) { - if (requestOptions.ignoreSslError != null) { - this._ignoreSslError = requestOptions.ignoreSslError; - } - this._socketTimeout = requestOptions.socketTimeout; - if (requestOptions.allowRedirects != null) { - this._allowRedirects = requestOptions.allowRedirects; + function packageData(bytes, type, mimeType, encodingName) { + switch (type) { + case "DataURL": { + let dataURL2 = "data:"; + const parsed = parseMIMEType(mimeType || "application/octet-stream"); + if (parsed !== "failure") { + dataURL2 += serializeAMimeType(parsed); } - if (requestOptions.allowRedirectDowngrade != null) { - this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; + dataURL2 += ";base64,"; + const decoder = new StringDecoder("latin1"); + for (const chunk of bytes) { + dataURL2 += btoa(decoder.write(chunk)); } - if (requestOptions.maxRedirects != null) { - this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); + dataURL2 += btoa(decoder.end()); + return dataURL2; + } + case "Text": { + let encoding2 = "failure"; + if (encodingName) { + encoding2 = getEncoding(encodingName); } - if (requestOptions.keepAlive != null) { - this._keepAlive = requestOptions.keepAlive; + if (encoding2 === "failure" && mimeType) { + const type2 = parseMIMEType(mimeType); + if (type2 !== "failure") { + encoding2 = getEncoding(type2.parameters.get("charset")); + } } - if (requestOptions.allowRetries != null) { - this._allowRetries = requestOptions.allowRetries; + if (encoding2 === "failure") { + encoding2 = "UTF-8"; } - if (requestOptions.maxRetries != null) { - this._maxRetries = requestOptions.maxRetries; + return decode(bytes, encoding2); + } + case "ArrayBuffer": { + const sequence = combineByteSequences(bytes); + return sequence.buffer; + } + case "BinaryString": { + let binaryString = ""; + const decoder = new StringDecoder("latin1"); + for (const chunk of bytes) { + binaryString += decoder.write(chunk); } + binaryString += decoder.end(); + return binaryString; } } - options(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request("OPTIONS", requestUrl, null, additionalHeaders || {}); - }); - } - get(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request("GET", requestUrl, null, additionalHeaders || {}); - }); - } - del(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request("DELETE", requestUrl, null, additionalHeaders || {}); - }); - } - post(requestUrl, data, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request("POST", requestUrl, data, additionalHeaders || {}); - }); - } - patch(requestUrl, data, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request("PATCH", requestUrl, data, additionalHeaders || {}); - }); - } - put(requestUrl, data, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request("PUT", requestUrl, data, additionalHeaders || {}); - }); + } + function decode(ioQueue, encoding2) { + const bytes = combineByteSequences(ioQueue); + const BOMEncoding = BOMSniffing(bytes); + let slice = 0; + if (BOMEncoding !== null) { + encoding2 = BOMEncoding; + slice = BOMEncoding === "UTF-8" ? 3 : 2; } - head(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request("HEAD", requestUrl, null, additionalHeaders || {}); - }); + const sliced = bytes.slice(slice); + return new TextDecoder(encoding2).decode(sliced); + } + function BOMSniffing(ioQueue) { + const [a, b, c] = ioQueue; + if (a === 239 && b === 187 && c === 191) { + return "UTF-8"; + } else if (a === 254 && b === 255) { + return "UTF-16BE"; + } else if (a === 255 && b === 254) { + return "UTF-16LE"; } - sendStream(verb, requestUrl, stream, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request(verb, requestUrl, stream, additionalHeaders); - }); + return null; + } + function combineByteSequences(sequences) { + const size = sequences.reduce((a, b) => { + return a + b.byteLength; + }, 0); + let offset = 0; + return sequences.reduce((a, b) => { + a.set(b, offset); + offset += b.byteLength; + return a; + }, new Uint8Array(size)); + } + util$3 = { + staticPropertyDescriptors, + readOperation, + fireAProgressEvent + }; + return util$3; +} +var filereader; +var hasRequiredFilereader; +function requireFilereader() { + if (hasRequiredFilereader) return filereader; + hasRequiredFilereader = 1; + const { + staticPropertyDescriptors, + readOperation, + fireAProgressEvent + } = requireUtil$3(); + const { + kState, + kError, + kResult, + kEvents, + kAborted + } = requireSymbols$2(); + const { webidl } = requireWebidl(); + const { kEnumerableProperty } = requireUtil$6(); + class FileReader extends EventTarget { + constructor() { + super(); + this[kState] = "empty"; + this[kResult] = null; + this[kError] = null; + this[kEvents] = { + loadend: null, + error: null, + abort: null, + load: null, + progress: null, + loadstart: null + }; } /** - * Gets a typed object from an endpoint - * Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise + * @see https://w3c.github.io/FileAPI/#dfn-readAsArrayBuffer + * @param {import('buffer').Blob} blob */ - getJson(requestUrl, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - const res = yield this.get(requestUrl, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - postJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.post(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - putJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.put(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - patchJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.patch(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); + readAsArrayBuffer(blob) { + webidl.brandCheck(this, FileReader); + webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsArrayBuffer" }); + blob = webidl.converters.Blob(blob, { strict: false }); + readOperation(this, blob, "ArrayBuffer"); } /** - * Makes a raw http request. - * All other methods such as get, post, patch, and request ultimately call this. - * Prefer get, del, post and patch + * @see https://w3c.github.io/FileAPI/#readAsBinaryString + * @param {import('buffer').Blob} blob */ - request(verb, requestUrl, data, headers2) { - return __awaiter(this, void 0, void 0, function* () { - if (this._disposed) { - throw new Error("Client has already been disposed."); - } - const parsedUrl = new URL(requestUrl); - let info = this._prepareRequest(verb, parsedUrl, headers2); - const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb) ? this._maxRetries + 1 : 1; - let numTries = 0; - let response2; - do { - response2 = yield this.requestRaw(info, data); - if (response2 && response2.message && response2.message.statusCode === HttpCodes.Unauthorized) { - let authenticationHandler; - for (const handler2 of this.handlers) { - if (handler2.canHandleAuthentication(response2)) { - authenticationHandler = handler2; - break; - } - } - if (authenticationHandler) { - return authenticationHandler.handleAuthentication(this, info, data); - } else { - return response2; - } - } - let redirectsRemaining = this._maxRedirects; - while (response2.message.statusCode && HttpRedirectCodes.includes(response2.message.statusCode) && this._allowRedirects && redirectsRemaining > 0) { - const redirectUrl = response2.message.headers["location"]; - if (!redirectUrl) { - break; - } - const parsedRedirectUrl = new URL(redirectUrl); - if (parsedUrl.protocol === "https:" && parsedUrl.protocol !== parsedRedirectUrl.protocol && !this._allowRedirectDowngrade) { - 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."); - } - yield response2.readBody(); - if (parsedRedirectUrl.hostname !== parsedUrl.hostname) { - for (const header in headers2) { - if (header.toLowerCase() === "authorization") { - delete headers2[header]; - } - } - } - info = this._prepareRequest(verb, parsedRedirectUrl, headers2); - response2 = yield this.requestRaw(info, data); - redirectsRemaining--; - } - if (!response2.message.statusCode || !HttpResponseRetryCodes.includes(response2.message.statusCode)) { - return response2; - } - numTries += 1; - if (numTries < maxTries) { - yield response2.readBody(); - yield this._performExponentialBackoff(numTries); - } - } while (numTries < maxTries); - return response2; - }); + readAsBinaryString(blob) { + webidl.brandCheck(this, FileReader); + webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsBinaryString" }); + blob = webidl.converters.Blob(blob, { strict: false }); + readOperation(this, blob, "BinaryString"); } /** - * Needs to be called if keepAlive is set to true in request options. + * @see https://w3c.github.io/FileAPI/#readAsDataText + * @param {import('buffer').Blob} blob + * @param {string?} encoding */ - dispose() { - if (this._agent) { - this._agent.destroy(); + readAsText(blob, encoding2 = void 0) { + webidl.brandCheck(this, FileReader); + webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsText" }); + blob = webidl.converters.Blob(blob, { strict: false }); + if (encoding2 !== void 0) { + encoding2 = webidl.converters.DOMString(encoding2); } - this._disposed = true; + readOperation(this, blob, "Text", encoding2); } /** - * Raw request. - * @param info - * @param data + * @see https://w3c.github.io/FileAPI/#dfn-readAsDataURL + * @param {import('buffer').Blob} blob */ - requestRaw(info, data) { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve, reject) => { - function callbackForResult(err, res) { - if (err) { - reject(err); - } else if (!res) { - reject(new Error("Unknown error")); - } else { - resolve(res); - } - } - this.requestRawWithCallback(info, data, callbackForResult); - }); - }); + readAsDataURL(blob) { + webidl.brandCheck(this, FileReader); + webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsDataURL" }); + blob = webidl.converters.Blob(blob, { strict: false }); + readOperation(this, blob, "DataURL"); } /** - * Raw request with callback. - * @param info - * @param data - * @param onResult + * @see https://w3c.github.io/FileAPI/#dfn-abort */ - requestRawWithCallback(info, data, onResult) { - if (typeof data === "string") { - if (!info.options.headers) { - info.options.headers = {}; - } - info.options.headers["Content-Length"] = Buffer.byteLength(data, "utf8"); + abort() { + if (this[kState] === "empty" || this[kState] === "done") { + this[kResult] = null; + return; } - let callbackCalled = false; - function handleResult(err, res) { - if (!callbackCalled) { - callbackCalled = true; - onResult(err, res); - } + if (this[kState] === "loading") { + this[kState] = "done"; + this[kResult] = null; } - const req = info.httpModule.request(info.options, (msg) => { - const res = new HttpClientResponse(msg); - handleResult(void 0, res); - }); - let socket; - req.on("socket", (sock) => { - socket = sock; - }); - req.setTimeout(this._socketTimeout || 3 * 6e4, () => { - if (socket) { - socket.end(); - } - handleResult(new Error(`Request timeout: ${info.options.path}`)); - }); - req.on("error", function(err) { - handleResult(err); - }); - if (data && typeof data === "string") { - req.write(data, "utf8"); + this[kAborted] = true; + fireAProgressEvent("abort", this); + if (this[kState] !== "loading") { + fireAProgressEvent("loadend", this); } - if (data && typeof data !== "string") { - data.on("close", function() { - req.end(); - }); - data.pipe(req); - } else { - req.end(); + } + /** + * @see https://w3c.github.io/FileAPI/#dom-filereader-readystate + */ + get readyState() { + webidl.brandCheck(this, FileReader); + switch (this[kState]) { + case "empty": + return this.EMPTY; + case "loading": + return this.LOADING; + case "done": + return this.DONE; } } /** - * Gets an http agent. This function is useful when you need an http agent that handles - * routing through a proxy server - depending upon the url and proxy environment variables. - * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com + * @see https://w3c.github.io/FileAPI/#dom-filereader-result */ - getAgent(serverUrl) { - const parsedUrl = new URL(serverUrl); - return this._getAgent(parsedUrl); + get result() { + webidl.brandCheck(this, FileReader); + return this[kResult]; } - getAgentDispatcher(serverUrl) { - const parsedUrl = new URL(serverUrl); - const proxyUrl = pm.getProxyUrl(parsedUrl); - const useProxy = proxyUrl && proxyUrl.hostname; - if (!useProxy) { - return; + /** + * @see https://w3c.github.io/FileAPI/#dom-filereader-error + */ + get error() { + webidl.brandCheck(this, FileReader); + return this[kError]; + } + get onloadend() { + webidl.brandCheck(this, FileReader); + return this[kEvents].loadend; + } + set onloadend(fn) { + webidl.brandCheck(this, FileReader); + if (this[kEvents].loadend) { + this.removeEventListener("loadend", this[kEvents].loadend); + } + if (typeof fn === "function") { + this[kEvents].loadend = fn; + this.addEventListener("loadend", fn); + } else { + this[kEvents].loadend = null; } - return this._getProxyAgentDispatcher(parsedUrl, proxyUrl); } - _prepareRequest(method, requestUrl, headers2) { - const info = {}; - info.parsedUrl = requestUrl; - const usingSsl = info.parsedUrl.protocol === "https:"; - info.httpModule = usingSsl ? https : http; - const defaultPort = usingSsl ? 443 : 80; - info.options = {}; - info.options.host = info.parsedUrl.hostname; - info.options.port = info.parsedUrl.port ? parseInt(info.parsedUrl.port) : defaultPort; - info.options.path = (info.parsedUrl.pathname || "") + (info.parsedUrl.search || ""); - info.options.method = method; - info.options.headers = this._mergeHeaders(headers2); - if (this.userAgent != null) { - info.options.headers["user-agent"] = this.userAgent; + get onerror() { + webidl.brandCheck(this, FileReader); + return this[kEvents].error; + } + set onerror(fn) { + webidl.brandCheck(this, FileReader); + if (this[kEvents].error) { + this.removeEventListener("error", this[kEvents].error); } - info.options.agent = this._getAgent(info.parsedUrl); - if (this.handlers) { - for (const handler2 of this.handlers) { - handler2.prepareRequest(info.options); - } + if (typeof fn === "function") { + this[kEvents].error = fn; + this.addEventListener("error", fn); + } else { + this[kEvents].error = null; } - return info; } - _mergeHeaders(headers2) { - if (this.requestOptions && this.requestOptions.headers) { - return Object.assign({}, lowercaseKeys2(this.requestOptions.headers), lowercaseKeys2(headers2 || {})); - } - return lowercaseKeys2(headers2 || {}); + get onloadstart() { + webidl.brandCheck(this, FileReader); + return this[kEvents].loadstart; } - _getExistingOrDefaultHeader(additionalHeaders, header, _default) { - let clientHeader; - if (this.requestOptions && this.requestOptions.headers) { - clientHeader = lowercaseKeys2(this.requestOptions.headers)[header]; + set onloadstart(fn) { + webidl.brandCheck(this, FileReader); + if (this[kEvents].loadstart) { + this.removeEventListener("loadstart", this[kEvents].loadstart); + } + if (typeof fn === "function") { + this[kEvents].loadstart = fn; + this.addEventListener("loadstart", fn); + } else { + this[kEvents].loadstart = null; } - return additionalHeaders[header] || clientHeader || _default; } - _getAgent(parsedUrl) { - let agent2; - const proxyUrl = pm.getProxyUrl(parsedUrl); - const useProxy = proxyUrl && proxyUrl.hostname; - if (this._keepAlive && useProxy) { - agent2 = this._proxyAgent; + get onprogress() { + webidl.brandCheck(this, FileReader); + return this[kEvents].progress; + } + set onprogress(fn) { + webidl.brandCheck(this, FileReader); + if (this[kEvents].progress) { + this.removeEventListener("progress", this[kEvents].progress); } - if (!useProxy) { - agent2 = this._agent; + if (typeof fn === "function") { + this[kEvents].progress = fn; + this.addEventListener("progress", fn); + } else { + this[kEvents].progress = null; } - if (agent2) { - return agent2; + } + get onload() { + webidl.brandCheck(this, FileReader); + return this[kEvents].load; + } + set onload(fn) { + webidl.brandCheck(this, FileReader); + if (this[kEvents].load) { + this.removeEventListener("load", this[kEvents].load); } - const usingSsl = parsedUrl.protocol === "https:"; - let maxSockets = 100; - if (this.requestOptions) { - maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets; + if (typeof fn === "function") { + this[kEvents].load = fn; + this.addEventListener("load", fn); + } else { + this[kEvents].load = null; } - if (proxyUrl && proxyUrl.hostname) { - const agentOptions = { - maxSockets, - keepAlive: this._keepAlive, - proxy: Object.assign(Object.assign({}, (proxyUrl.username || proxyUrl.password) && { - proxyAuth: `${proxyUrl.username}:${proxyUrl.password}` - }), { host: proxyUrl.hostname, port: proxyUrl.port }) - }; - let tunnelAgent; - const overHttps = proxyUrl.protocol === "https:"; - if (usingSsl) { - tunnelAgent = overHttps ? tunnel2.httpsOverHttps : tunnel2.httpsOverHttp; - } else { - tunnelAgent = overHttps ? tunnel2.httpOverHttps : tunnel2.httpOverHttp; - } - agent2 = tunnelAgent(agentOptions); - this._proxyAgent = agent2; + } + get onabort() { + webidl.brandCheck(this, FileReader); + return this[kEvents].abort; + } + set onabort(fn) { + webidl.brandCheck(this, FileReader); + if (this[kEvents].abort) { + this.removeEventListener("abort", this[kEvents].abort); } - if (!agent2) { - const options = { keepAlive: this._keepAlive, maxSockets }; - agent2 = usingSsl ? new https.Agent(options) : new http.Agent(options); - this._agent = agent2; + if (typeof fn === "function") { + this[kEvents].abort = fn; + this.addEventListener("abort", fn); + } else { + this[kEvents].abort = null; } - if (usingSsl && this._ignoreSslError) { - agent2.options = Object.assign(agent2.options || {}, { - rejectUnauthorized: false - }); + } + } + FileReader.EMPTY = FileReader.prototype.EMPTY = 0; + FileReader.LOADING = FileReader.prototype.LOADING = 1; + FileReader.DONE = FileReader.prototype.DONE = 2; + Object.defineProperties(FileReader.prototype, { + EMPTY: staticPropertyDescriptors, + LOADING: staticPropertyDescriptors, + DONE: staticPropertyDescriptors, + readAsArrayBuffer: kEnumerableProperty, + readAsBinaryString: kEnumerableProperty, + readAsText: kEnumerableProperty, + readAsDataURL: kEnumerableProperty, + abort: kEnumerableProperty, + readyState: kEnumerableProperty, + result: kEnumerableProperty, + error: kEnumerableProperty, + onloadstart: kEnumerableProperty, + onprogress: kEnumerableProperty, + onload: kEnumerableProperty, + onabort: kEnumerableProperty, + onerror: kEnumerableProperty, + onloadend: kEnumerableProperty, + [Symbol.toStringTag]: { + value: "FileReader", + writable: false, + enumerable: false, + configurable: true + } + }); + Object.defineProperties(FileReader, { + EMPTY: staticPropertyDescriptors, + LOADING: staticPropertyDescriptors, + DONE: staticPropertyDescriptors + }); + filereader = { + FileReader + }; + return filereader; +} +var symbols$1; +var hasRequiredSymbols$1; +function requireSymbols$1() { + if (hasRequiredSymbols$1) return symbols$1; + hasRequiredSymbols$1 = 1; + symbols$1 = { + kConstruct: requireSymbols$4().kConstruct + }; + return symbols$1; +} +var util$2; +var hasRequiredUtil$2; +function requireUtil$2() { + if (hasRequiredUtil$2) return util$2; + hasRequiredUtil$2 = 1; + const assert = require$$0$9; + const { URLSerializer } = requireDataURL(); + const { isValidHeaderName } = requireUtil$5(); + function urlEquals(A, B, excludeFragment = false) { + const serializedA = URLSerializer(A, excludeFragment); + const serializedB = URLSerializer(B, excludeFragment); + return serializedA === serializedB; + } + function fieldValues(header) { + assert(header !== null); + const values = []; + for (let value of header.split(",")) { + value = value.trim(); + if (!value.length) { + continue; + } else if (!isValidHeaderName(value)) { + continue; } - return agent2; + values.push(value); } - _getProxyAgentDispatcher(parsedUrl, proxyUrl) { - let proxyAgent2; - if (this._keepAlive) { - proxyAgent2 = this._proxyAgentDispatcher; + return values; + } + util$2 = { + urlEquals, + fieldValues + }; + return util$2; +} +var cache; +var hasRequiredCache; +function requireCache() { + if (hasRequiredCache) return cache; + hasRequiredCache = 1; + const { kConstruct } = requireSymbols$1(); + const { urlEquals, fieldValues: getFieldValues } = requireUtil$2(); + const { kEnumerableProperty, isDisturbed } = requireUtil$6(); + const { kHeadersList } = requireSymbols$4(); + const { webidl } = requireWebidl(); + const { Response, cloneResponse } = requireResponse(); + const { Request } = requireRequest(); + const { kState, kHeaders, kGuard, kRealm } = requireSymbols$3(); + const { fetching } = requireFetch(); + const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = requireUtil$5(); + const assert = require$$0$9; + const { getGlobalDispatcher } = requireGlobal(); + class Cache { + /** + * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-request-response-list + * @type {requestResponseList} + */ + #relevantRequestResponseList; + constructor() { + if (arguments[0] !== kConstruct) { + webidl.illegalConstructor(); + } + this.#relevantRequestResponseList = arguments[1]; + } + async match(request2, options = {}) { + webidl.brandCheck(this, Cache); + webidl.argumentLengthCheck(arguments, 1, { header: "Cache.match" }); + request2 = webidl.converters.RequestInfo(request2); + options = webidl.converters.CacheQueryOptions(options); + const p = await this.matchAll(request2, options); + if (p.length === 0) { + return; } - if (proxyAgent2) { - return proxyAgent2; + return p[0]; + } + async matchAll(request2 = void 0, options = {}) { + webidl.brandCheck(this, Cache); + if (request2 !== void 0) request2 = webidl.converters.RequestInfo(request2); + options = webidl.converters.CacheQueryOptions(options); + let r = null; + if (request2 !== void 0) { + if (request2 instanceof Request) { + r = request2[kState]; + if (r.method !== "GET" && !options.ignoreMethod) { + return []; + } + } else if (typeof request2 === "string") { + r = new Request(request2)[kState]; + } } - const usingSsl = parsedUrl.protocol === "https:"; - proxyAgent2 = new undici_1.ProxyAgent(Object.assign({ uri: proxyUrl.href, pipelining: !this._keepAlive ? 0 : 1 }, (proxyUrl.username || proxyUrl.password) && { - token: `Basic ${Buffer.from(`${proxyUrl.username}:${proxyUrl.password}`).toString("base64")}` - })); - this._proxyAgentDispatcher = proxyAgent2; - if (usingSsl && this._ignoreSslError) { - proxyAgent2.options = Object.assign(proxyAgent2.options.requestTls || {}, { - rejectUnauthorized: false - }); + const responses = []; + if (request2 === void 0) { + for (const requestResponse of this.#relevantRequestResponseList) { + responses.push(requestResponse[1]); + } + } else { + const requestResponses = this.#queryCache(r, options); + for (const requestResponse of requestResponses) { + responses.push(requestResponse[1]); + } } - return proxyAgent2; + const responseList = []; + for (const response2 of responses) { + const responseObject = new Response(response2.body?.source ?? null); + const body2 = responseObject[kState].body; + responseObject[kState] = response2; + responseObject[kState].body = body2; + responseObject[kHeaders][kHeadersList] = response2.headersList; + responseObject[kHeaders][kGuard] = "immutable"; + responseList.push(responseObject); + } + return Object.freeze(responseList); } - _performExponentialBackoff(retryNumber) { - return __awaiter(this, void 0, void 0, function* () { - retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); - const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); - return new Promise((resolve) => setTimeout(() => resolve(), ms)); - }); + async add(request2) { + webidl.brandCheck(this, Cache); + webidl.argumentLengthCheck(arguments, 1, { header: "Cache.add" }); + request2 = webidl.converters.RequestInfo(request2); + const requests = [request2]; + const responseArrayPromise = this.addAll(requests); + return await responseArrayPromise; } - _processResponse(res, options) { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { - const statusCode = res.message.statusCode || 0; - const response2 = { - statusCode, - result: null, - headers: {} - }; - if (statusCode === HttpCodes.NotFound) { - resolve(response2); - } - function dateTimeDeserializer(key, value) { - if (typeof value === "string") { - const a = new Date(value); - if (!isNaN(a.valueOf())) { - return a; - } - } - return value; - } - let obj; - let contents; - try { - contents = yield res.readBody(); - if (contents && contents.length > 0) { - if (options && options.deserializeDates) { - obj = JSON.parse(contents, dateTimeDeserializer); - } else { - obj = JSON.parse(contents); + async addAll(requests) { + webidl.brandCheck(this, Cache); + webidl.argumentLengthCheck(arguments, 1, { header: "Cache.addAll" }); + requests = webidl.converters["sequence"](requests); + const responsePromises = []; + const requestList = []; + for (const request2 of requests) { + if (typeof request2 === "string") { + continue; + } + const r = request2[kState]; + if (!urlIsHttpHttpsScheme(r.url) || r.method !== "GET") { + throw webidl.errors.exception({ + header: "Cache.addAll", + message: "Expected http/s scheme when method is not GET." + }); + } + } + const fetchControllers = []; + for (const request2 of requests) { + const r = new Request(request2)[kState]; + if (!urlIsHttpHttpsScheme(r.url)) { + throw webidl.errors.exception({ + header: "Cache.addAll", + message: "Expected http/s scheme." + }); + } + r.initiator = "fetch"; + r.destination = "subresource"; + requestList.push(r); + const responsePromise = createDeferredPromise(); + fetchControllers.push(fetching({ + request: r, + dispatcher: getGlobalDispatcher(), + processResponse(response2) { + if (response2.type === "error" || response2.status === 206 || response2.status < 200 || response2.status > 299) { + responsePromise.reject(webidl.errors.exception({ + header: "Cache.addAll", + message: "Received an invalid status code or the request failed." + })); + } else if (response2.headersList.contains("vary")) { + const fieldValues = getFieldValues(response2.headersList.get("vary")); + for (const fieldValue of fieldValues) { + if (fieldValue === "*") { + responsePromise.reject(webidl.errors.exception({ + header: "Cache.addAll", + message: "invalid vary field value" + })); + for (const controller of fetchControllers) { + controller.abort(); + } + return; + } } - response2.result = obj; } - response2.headers = res.message.headers; - } catch (err) { - } - if (statusCode > 299) { - let msg; - if (obj && obj.message) { - msg = obj.message; - } else if (contents && contents.length > 0) { - msg = contents; - } else { - msg = `Failed request: (${statusCode})`; + }, + processResponseEndOfBody(response2) { + if (response2.aborted) { + responsePromise.reject(new DOMException("aborted", "AbortError")); + return; } - const err = new HttpClientError(msg, statusCode); - err.result = response2.result; - reject(err); - } else { - resolve(response2); + responsePromise.resolve(response2); } })); - }); - } - } - lib.HttpClient = HttpClient; - const lowercaseKeys2 = (obj) => Object.keys(obj).reduce((c, k) => (c[k.toLowerCase()] = obj[k], c), {}); - return lib; -} -var auth$1 = {}; -var hasRequiredAuth; -function requireAuth() { - if (hasRequiredAuth) return auth$1; - hasRequiredAuth = 1; - var __awaiter = auth$1 && auth$1.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + responsePromises.push(responsePromise.promise); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(auth$1, "__esModule", { value: true }); - auth$1.PersonalAccessTokenCredentialHandler = auth$1.BearerCredentialHandler = auth$1.BasicCredentialHandler = void 0; - class BasicCredentialHandler { - constructor(username, password) { - this.username = username; - this.password = password; - } - prepareRequest(options) { - if (!options.headers) { - throw Error("The request has no headers"); + const p = Promise.all(responsePromises); + const responses = await p; + const operations = []; + let index = 0; + for (const response2 of responses) { + const operation = { + type: "put", + // 7.3.2 + request: requestList[index], + // 7.3.3 + response: response2 + // 7.3.4 + }; + operations.push(operation); + index++; } - options.headers["Authorization"] = `Basic ${Buffer.from(`${this.username}:${this.password}`).toString("base64")}`; - } - // This handler cannot handle 401 - canHandleAuthentication() { - return false; - } - handleAuthentication() { - return __awaiter(this, void 0, void 0, function* () { - throw new Error("not implemented"); - }); - } - } - auth$1.BasicCredentialHandler = BasicCredentialHandler; - class BearerCredentialHandler { - constructor(token) { - this.token = token; - } - // currently implements pre-authorization - // TODO: support preAuth = false where it hooks on 401 - prepareRequest(options) { - if (!options.headers) { - throw Error("The request has no headers"); + const cacheJobPromise = createDeferredPromise(); + let errorData = null; + try { + this.#batchCacheOperations(operations); + } catch (e) { + errorData = e; } - options.headers["Authorization"] = `Bearer ${this.token}`; - } - // This handler cannot handle 401 - canHandleAuthentication() { - return false; - } - handleAuthentication() { - return __awaiter(this, void 0, void 0, function* () { - throw new Error("not implemented"); + queueMicrotask(() => { + if (errorData === null) { + cacheJobPromise.resolve(void 0); + } else { + cacheJobPromise.reject(errorData); + } }); + return cacheJobPromise.promise; } - } - auth$1.BearerCredentialHandler = BearerCredentialHandler; - class PersonalAccessTokenCredentialHandler { - constructor(token) { - this.token = token; - } - // currently implements pre-authorization - // TODO: support preAuth = false where it hooks on 401 - prepareRequest(options) { - if (!options.headers) { - throw Error("The request has no headers"); + async put(request2, response2) { + webidl.brandCheck(this, Cache); + webidl.argumentLengthCheck(arguments, 2, { header: "Cache.put" }); + request2 = webidl.converters.RequestInfo(request2); + response2 = webidl.converters.Response(response2); + let innerRequest = null; + if (request2 instanceof Request) { + innerRequest = request2[kState]; + } else { + innerRequest = new Request(request2)[kState]; } - options.headers["Authorization"] = `Basic ${Buffer.from(`PAT:${this.token}`).toString("base64")}`; - } - // This handler cannot handle 401 - canHandleAuthentication() { - return false; - } - handleAuthentication() { - return __awaiter(this, void 0, void 0, function* () { - throw new Error("not implemented"); - }); - } - } - auth$1.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler; - return auth$1; -} -var hasRequiredOidcUtils; -function requireOidcUtils() { - if (hasRequiredOidcUtils) return oidcUtils; - hasRequiredOidcUtils = 1; - var __awaiter = oidcUtils && oidcUtils.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } + if (!urlIsHttpHttpsScheme(innerRequest.url) || innerRequest.method !== "GET") { + throw webidl.errors.exception({ + header: "Cache.put", + message: "Expected an http/s scheme when method is not GET" + }); } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); + const innerResponse = response2[kState]; + if (innerResponse.status === 206) { + throw webidl.errors.exception({ + header: "Cache.put", + message: "Got 206 status" + }); + } + if (innerResponse.headersList.contains("vary")) { + const fieldValues = getFieldValues(innerResponse.headersList.get("vary")); + for (const fieldValue of fieldValues) { + if (fieldValue === "*") { + throw webidl.errors.exception({ + header: "Cache.put", + message: "Got * vary field value" + }); + } } } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + if (innerResponse.body && (isDisturbed(innerResponse.body.stream) || innerResponse.body.stream.locked)) { + throw webidl.errors.exception({ + header: "Cache.put", + message: "Response body is locked or disturbed" + }); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(oidcUtils, "__esModule", { value: true }); - oidcUtils.OidcClient = void 0; - const http_client_1 = requireLib(); - const auth_1 = requireAuth(); - const core_1 = requireCore(); - class OidcClient { - static createHttpClient(allowRetry = true, maxRetry = 10) { - const requestOptions = { - allowRetries: allowRetry, - maxRetries: maxRetry + const clonedResponse = cloneResponse(innerResponse); + const bodyReadPromise = createDeferredPromise(); + if (innerResponse.body != null) { + const stream = innerResponse.body.stream; + const reader = stream.getReader(); + readAllBytes(reader).then(bodyReadPromise.resolve, bodyReadPromise.reject); + } else { + bodyReadPromise.resolve(void 0); + } + const operations = []; + const operation = { + type: "put", + // 14. + request: innerRequest, + // 15. + response: clonedResponse + // 16. }; - return new http_client_1.HttpClient("actions/oidc-client", [new auth_1.BearerCredentialHandler(OidcClient.getRequestToken())], requestOptions); - } - static getRequestToken() { - const token = process.env["ACTIONS_ID_TOKEN_REQUEST_TOKEN"]; - if (!token) { - throw new Error("Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable"); + operations.push(operation); + const bytes = await bodyReadPromise.promise; + if (clonedResponse.body != null) { + clonedResponse.body.source = bytes; } - return token; - } - static getIDTokenUrl() { - const runtimeUrl = process.env["ACTIONS_ID_TOKEN_REQUEST_URL"]; - if (!runtimeUrl) { - throw new Error("Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable"); + const cacheJobPromise = createDeferredPromise(); + let errorData = null; + try { + this.#batchCacheOperations(operations); + } catch (e) { + errorData = e; } - return runtimeUrl; - } - static getCall(id_token_url) { - var _a2; - return __awaiter(this, void 0, void 0, function* () { - const httpclient = OidcClient.createHttpClient(); - const res = yield httpclient.getJson(id_token_url).catch((error) => { - throw new Error(`Failed to get ID Token. - - Error Code : ${error.statusCode} - - Error Message: ${error.message}`); - }); - const id_token = (_a2 = res.result) === null || _a2 === void 0 ? void 0 : _a2.value; - if (!id_token) { - throw new Error("Response json body do not have ID Token field"); + queueMicrotask(() => { + if (errorData === null) { + cacheJobPromise.resolve(); + } else { + cacheJobPromise.reject(errorData); } - return id_token; }); + return cacheJobPromise.promise; } - static getIDToken(audience) { - return __awaiter(this, void 0, void 0, function* () { - try { - let id_token_url = OidcClient.getIDTokenUrl(); - if (audience) { - const encodedAudience = encodeURIComponent(audience); - id_token_url = `${id_token_url}&audience=${encodedAudience}`; - } - (0, core_1.debug)(`ID token url is ${id_token_url}`); - const id_token = yield OidcClient.getCall(id_token_url); - (0, core_1.setSecret)(id_token); - return id_token; - } catch (error) { - throw new Error(`Error message: ${error.message}`); + async delete(request2, options = {}) { + webidl.brandCheck(this, Cache); + webidl.argumentLengthCheck(arguments, 1, { header: "Cache.delete" }); + request2 = webidl.converters.RequestInfo(request2); + options = webidl.converters.CacheQueryOptions(options); + let r = null; + if (request2 instanceof Request) { + r = request2[kState]; + if (r.method !== "GET" && !options.ignoreMethod) { + return false; + } + } else { + assert(typeof request2 === "string"); + r = new Request(request2)[kState]; + } + const operations = []; + const operation = { + type: "delete", + request: r, + options + }; + operations.push(operation); + const cacheJobPromise = createDeferredPromise(); + let errorData = null; + let requestResponses; + try { + requestResponses = this.#batchCacheOperations(operations); + } catch (e) { + errorData = e; + } + queueMicrotask(() => { + if (errorData === null) { + cacheJobPromise.resolve(!!requestResponses?.length); + } else { + cacheJobPromise.reject(errorData); } }); + return cacheJobPromise.promise; } - } - oidcUtils.OidcClient = OidcClient; - return oidcUtils; -} -var summary = {}; -var hasRequiredSummary; -function requireSummary() { - if (hasRequiredSummary) return summary; - hasRequiredSummary = 1; - (function(exports$1) { - var __awaiter = summary && summary.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); + /** + * @see https://w3c.github.io/ServiceWorker/#dom-cache-keys + * @param {any} request + * @param {import('../../types/cache').CacheQueryOptions} options + * @returns {readonly Request[]} + */ + async keys(request2 = void 0, options = {}) { + webidl.brandCheck(this, Cache); + if (request2 !== void 0) request2 = webidl.converters.RequestInfo(request2); + options = webidl.converters.CacheQueryOptions(options); + let r = null; + if (request2 !== void 0) { + if (request2 instanceof Request) { + r = request2[kState]; + if (r.method !== "GET" && !options.ignoreMethod) { + return []; } + } else if (typeof request2 === "string") { + r = new Request(request2)[kState]; } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } + } + const promise = createDeferredPromise(); + const requests = []; + if (request2 === void 0) { + for (const requestResponse of this.#relevantRequestResponseList) { + requests.push(requestResponse[0]); } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } else { + const requestResponses = this.#queryCache(r, options); + for (const requestResponse of requestResponses) { + requests.push(requestResponse[0]); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports$1, "__esModule", { value: true }); - exports$1.summary = exports$1.markdownSummary = exports$1.SUMMARY_DOCS_URL = exports$1.SUMMARY_ENV_VAR = void 0; - const os_1 = require$$0; - const fs_1 = require$$1; - const { access, appendFile, writeFile } = fs_1.promises; - exports$1.SUMMARY_ENV_VAR = "GITHUB_STEP_SUMMARY"; - exports$1.SUMMARY_DOCS_URL = "https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary"; - class Summary { - constructor() { - this._buffer = ""; } - /** - * Finds the summary file path from the environment, rejects if env var is not found or file does not exist - * Also checks r/w permissions. - * - * @returns step summary file path - */ - filePath() { - return __awaiter(this, void 0, void 0, function* () { - if (this._filePath) { - return this._filePath; + queueMicrotask(() => { + const requestList = []; + for (const request3 of requests) { + const requestObject = new Request("https://a"); + requestObject[kState] = request3; + requestObject[kHeaders][kHeadersList] = request3.headersList; + requestObject[kHeaders][kGuard] = "immutable"; + requestObject[kRealm] = request3.client; + requestList.push(requestObject); + } + promise.resolve(Object.freeze(requestList)); + }); + return promise.promise; + } + /** + * @see https://w3c.github.io/ServiceWorker/#batch-cache-operations-algorithm + * @param {CacheBatchOperation[]} operations + * @returns {requestResponseList} + */ + #batchCacheOperations(operations) { + const cache2 = this.#relevantRequestResponseList; + const backupCache = [...cache2]; + const addedItems = []; + const resultList = []; + try { + for (const operation of operations) { + if (operation.type !== "delete" && operation.type !== "put") { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: 'operation type does not match "delete" or "put"' + }); } - const pathFromEnv = process.env[exports$1.SUMMARY_ENV_VAR]; - if (!pathFromEnv) { - throw new Error(`Unable to find environment variable for $${exports$1.SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`); + if (operation.type === "delete" && operation.response != null) { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: "delete operation should not have an associated response" + }); } - try { - yield access(pathFromEnv, fs_1.constants.R_OK | fs_1.constants.W_OK); - } catch (_a2) { - throw new Error(`Unable to access summary file: '${pathFromEnv}'. Check if the file has correct read/write permissions.`); + if (this.#queryCache(operation.request, operation.options, addedItems).length) { + throw new DOMException("???", "InvalidStateError"); } - this._filePath = pathFromEnv; - return this._filePath; - }); - } - /** - * Wraps content in an HTML tag, adding any HTML attributes - * - * @param {string} tag HTML tag to wrap - * @param {string | null} content content within the tag - * @param {[attribute: string]: string} attrs key-value list of HTML attributes to add - * - * @returns {string} content wrapped in HTML element - */ - wrap(tag, content, attrs = {}) { - const htmlAttrs = Object.entries(attrs).map(([key, value]) => ` ${key}="${value}"`).join(""); - if (!content) { - return `<${tag}${htmlAttrs}>`; + let requestResponses; + if (operation.type === "delete") { + requestResponses = this.#queryCache(operation.request, operation.options); + if (requestResponses.length === 0) { + return []; + } + for (const requestResponse of requestResponses) { + const idx = cache2.indexOf(requestResponse); + assert(idx !== -1); + cache2.splice(idx, 1); + } + } else if (operation.type === "put") { + if (operation.response == null) { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: "put operation should have an associated response" + }); + } + const r = operation.request; + if (!urlIsHttpHttpsScheme(r.url)) { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: "expected http or https scheme" + }); + } + if (r.method !== "GET") { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: "not get method" + }); + } + if (operation.options != null) { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: "options must not be defined" + }); + } + requestResponses = this.#queryCache(operation.request); + for (const requestResponse of requestResponses) { + const idx = cache2.indexOf(requestResponse); + assert(idx !== -1); + cache2.splice(idx, 1); + } + cache2.push([operation.request, operation.response]); + addedItems.push([operation.request, operation.response]); + } + resultList.push([operation.request, operation.response]); } - return `<${tag}${htmlAttrs}>${content}`; + return resultList; + } catch (e) { + this.#relevantRequestResponseList.length = 0; + this.#relevantRequestResponseList = backupCache; + throw e; } - /** - * Writes text in the buffer to the summary buffer file and empties buffer. Will append by default. - * - * @param {SummaryWriteOptions} [options] (optional) options for write operation - * - * @returns {Promise} summary instance - */ - write(options) { - return __awaiter(this, void 0, void 0, function* () { - const overwrite = !!(options === null || options === void 0 ? void 0 : options.overwrite); - const filePath = yield this.filePath(); - const writeFunc = overwrite ? writeFile : appendFile; - yield writeFunc(filePath, this._buffer, { encoding: "utf8" }); - return this.emptyBuffer(); - }); + } + /** + * @see https://w3c.github.io/ServiceWorker/#query-cache + * @param {any} requestQuery + * @param {import('../../types/cache').CacheQueryOptions} options + * @param {requestResponseList} targetStorage + * @returns {requestResponseList} + */ + #queryCache(requestQuery, options, targetStorage) { + const resultList = []; + const storage = targetStorage ?? this.#relevantRequestResponseList; + for (const requestResponse of storage) { + const [cachedRequest, cachedResponse] = requestResponse; + if (this.#requestMatchesCachedItem(requestQuery, cachedRequest, cachedResponse, options)) { + resultList.push(requestResponse); + } } - /** - * Clears the summary buffer and wipes the summary file - * - * @returns {Summary} summary instance - */ - clear() { - return __awaiter(this, void 0, void 0, function* () { - return this.emptyBuffer().write({ overwrite: true }); - }); + return resultList; + } + /** + * @see https://w3c.github.io/ServiceWorker/#request-matches-cached-item-algorithm + * @param {any} requestQuery + * @param {any} request + * @param {any | null} response + * @param {import('../../types/cache').CacheQueryOptions | undefined} options + * @returns {boolean} + */ + #requestMatchesCachedItem(requestQuery, request2, response2 = null, options) { + const queryURL = new URL(requestQuery.url); + const cachedURL = new URL(request2.url); + if (options?.ignoreSearch) { + cachedURL.search = ""; + queryURL.search = ""; } - /** - * Returns the current summary buffer as a string - * - * @returns {string} string of summary buffer - */ - stringify() { - return this._buffer; + if (!urlEquals(queryURL, cachedURL, true)) { + return false; } - /** - * If the summary buffer is empty - * - * @returns {boolen} true if the buffer is empty - */ - isEmptyBuffer() { - return this._buffer.length === 0; + if (response2 == null || options?.ignoreVary || !response2.headersList.contains("vary")) { + return true; } - /** - * Resets the summary buffer without writing to summary file - * - * @returns {Summary} summary instance - */ - emptyBuffer() { - this._buffer = ""; - return this; + const fieldValues = getFieldValues(response2.headersList.get("vary")); + for (const fieldValue of fieldValues) { + if (fieldValue === "*") { + return false; + } + const requestValue = request2.headersList.get(fieldValue); + const queryValue = requestQuery.headersList.get(fieldValue); + if (requestValue !== queryValue) { + return false; + } } - /** - * Adds raw text to the summary buffer - * - * @param {string} text content to add - * @param {boolean} [addEOL=false] (optional) append an EOL to the raw text (default: false) - * - * @returns {Summary} summary instance - */ - addRaw(text, addEOL = false) { - this._buffer += text; - return addEOL ? this.addEOL() : this; + return true; + } + } + Object.defineProperties(Cache.prototype, { + [Symbol.toStringTag]: { + value: "Cache", + configurable: true + }, + match: kEnumerableProperty, + matchAll: kEnumerableProperty, + add: kEnumerableProperty, + addAll: kEnumerableProperty, + put: kEnumerableProperty, + delete: kEnumerableProperty, + keys: kEnumerableProperty + }); + const cacheQueryOptionConverters = [ + { + key: "ignoreSearch", + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: "ignoreMethod", + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: "ignoreVary", + converter: webidl.converters.boolean, + defaultValue: false + } + ]; + webidl.converters.CacheQueryOptions = webidl.dictionaryConverter(cacheQueryOptionConverters); + webidl.converters.MultiCacheQueryOptions = webidl.dictionaryConverter([ + ...cacheQueryOptionConverters, + { + key: "cacheName", + converter: webidl.converters.DOMString + } + ]); + webidl.converters.Response = webidl.interfaceConverter(Response); + webidl.converters["sequence"] = webidl.sequenceConverter( + webidl.converters.RequestInfo + ); + cache = { + Cache + }; + return cache; +} +var cachestorage; +var hasRequiredCachestorage; +function requireCachestorage() { + if (hasRequiredCachestorage) return cachestorage; + hasRequiredCachestorage = 1; + const { kConstruct } = requireSymbols$1(); + const { Cache } = requireCache(); + const { webidl } = requireWebidl(); + const { kEnumerableProperty } = requireUtil$6(); + class CacheStorage { + /** + * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-name-to-cache-map + * @type {Map} + */ + async has(cacheName) { + webidl.brandCheck(this, CacheStorage); + webidl.argumentLengthCheck(arguments, 1, { header: "CacheStorage.has" }); + cacheName = webidl.converters.DOMString(cacheName); + return this.#caches.has(cacheName); + } + /** + * @see https://w3c.github.io/ServiceWorker/#dom-cachestorage-open + * @param {string} cacheName + * @returns {Promise} + */ + async open(cacheName) { + webidl.brandCheck(this, CacheStorage); + webidl.argumentLengthCheck(arguments, 1, { header: "CacheStorage.open" }); + cacheName = webidl.converters.DOMString(cacheName); + if (this.#caches.has(cacheName)) { + const cache3 = this.#caches.get(cacheName); + return new Cache(kConstruct, cache3); } - /** - * Adds an HTML list to the summary buffer - * - * @param {string[]} items list of items to render - * @param {boolean} [ordered=false] (optional) if the rendered list should be ordered or not (default: false) - * - * @returns {Summary} summary instance - */ - addList(items, ordered = false) { - const tag = ordered ? "ol" : "ul"; - const listItems = items.map((item) => this.wrap("li", item)).join(""); - const element = this.wrap(tag, listItems); - return this.addRaw(element).addEOL(); + const cache2 = []; + this.#caches.set(cacheName, cache2); + return new Cache(kConstruct, cache2); + } + /** + * @see https://w3c.github.io/ServiceWorker/#cache-storage-delete + * @param {string} cacheName + * @returns {Promise} + */ + async delete(cacheName) { + webidl.brandCheck(this, CacheStorage); + webidl.argumentLengthCheck(arguments, 1, { header: "CacheStorage.delete" }); + cacheName = webidl.converters.DOMString(cacheName); + return this.#caches.delete(cacheName); + } + /** + * @see https://w3c.github.io/ServiceWorker/#cache-storage-keys + * @returns {string[]} + */ + async keys() { + webidl.brandCheck(this, CacheStorage); + const keys = this.#caches.keys(); + return [...keys]; + } + } + Object.defineProperties(CacheStorage.prototype, { + [Symbol.toStringTag]: { + value: "CacheStorage", + configurable: true + }, + match: kEnumerableProperty, + has: kEnumerableProperty, + open: kEnumerableProperty, + delete: kEnumerableProperty, + keys: kEnumerableProperty + }); + cachestorage = { + CacheStorage + }; + return cachestorage; +} +var constants$1; +var hasRequiredConstants$1; +function requireConstants$1() { + if (hasRequiredConstants$1) return constants$1; + hasRequiredConstants$1 = 1; + const maxAttributeValueSize = 1024; + const maxNameValuePairSize = 4096; + constants$1 = { + maxAttributeValueSize, + maxNameValuePairSize + }; + return constants$1; +} +var util$1; +var hasRequiredUtil$1; +function requireUtil$1() { + if (hasRequiredUtil$1) return util$1; + hasRequiredUtil$1 = 1; + function isCTLExcludingHtab(value) { + if (value.length === 0) { + return false; + } + for (const char of value) { + const code = char.charCodeAt(0); + if (code >= 0 || code <= 8 || (code >= 10 || code <= 31) || code === 127) { + return false; } - /** - * Adds an HTML table to the summary buffer - * - * @param {SummaryTableCell[]} rows table rows - * - * @returns {Summary} summary instance - */ - addTable(rows) { - const tableBody = rows.map((row) => { - const cells = row.map((cell) => { - if (typeof cell === "string") { - return this.wrap("td", cell); - } - const { header, data, colspan, rowspan } = cell; - const tag = header ? "th" : "td"; - const attrs = Object.assign(Object.assign({}, colspan && { colspan }), rowspan && { rowspan }); - return this.wrap(tag, data, attrs); - }).join(""); - return this.wrap("tr", cells); - }).join(""); - const element = this.wrap("table", tableBody); - return this.addRaw(element).addEOL(); + } + } + function validateCookieName(name) { + for (const char of name) { + const code = char.charCodeAt(0); + if (code <= 32 || code > 127 || char === "(" || char === ")" || char === ">" || char === "<" || char === "@" || char === "," || char === ";" || char === ":" || char === "\\" || char === '"' || char === "/" || char === "[" || char === "]" || char === "?" || char === "=" || char === "{" || char === "}") { + throw new Error("Invalid cookie name"); } - /** - * Adds a collapsable HTML details element to the summary buffer - * - * @param {string} label text for the closed state - * @param {string} content collapsable content - * - * @returns {Summary} summary instance - */ - addDetails(label, content) { - const element = this.wrap("details", this.wrap("summary", label) + content); - return this.addRaw(element).addEOL(); + } + } + function validateCookieValue(value) { + for (const char of value) { + const code = char.charCodeAt(0); + if (code < 33 || // exclude CTLs (0-31) + code === 34 || code === 44 || code === 59 || code === 92 || code > 126) { + throw new Error("Invalid header value"); } - /** - * Adds an HTML image tag to the summary buffer - * - * @param {string} src path to the image you to embed - * @param {string} alt text description of the image - * @param {SummaryImageOptions} options (optional) addition image attributes - * - * @returns {Summary} summary instance - */ - addImage(src, alt, options) { - const { width, height } = options || {}; - const attrs = Object.assign(Object.assign({}, width && { width }), height && { height }); - const element = this.wrap("img", null, Object.assign({ src, alt }, attrs)); - return this.addRaw(element).addEOL(); + } + } + function validateCookiePath(path) { + for (const char of path) { + const code = char.charCodeAt(0); + if (code < 33 || char === ";") { + throw new Error("Invalid cookie path"); } - /** - * Adds an HTML section heading element - * - * @param {string} text heading text - * @param {number | string} [level=1] (optional) the heading level, default: 1 - * - * @returns {Summary} summary instance - */ - addHeading(text, level) { - const tag = `h${level}`; - const allowedTag = ["h1", "h2", "h3", "h4", "h5", "h6"].includes(tag) ? tag : "h1"; - const element = this.wrap(allowedTag, text); - return this.addRaw(element).addEOL(); + } + } + function validateCookieDomain(domain) { + if (domain.startsWith("-") || domain.endsWith(".") || domain.endsWith("-")) { + throw new Error("Invalid cookie domain"); + } + } + function toIMFDate(date) { + if (typeof date === "number") { + date = new Date(date); + } + const days = [ + "Sun", + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat" + ]; + const months = [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" + ]; + const dayName = days[date.getUTCDay()]; + const day = date.getUTCDate().toString().padStart(2, "0"); + const month = months[date.getUTCMonth()]; + const year = date.getUTCFullYear(); + const hour = date.getUTCHours().toString().padStart(2, "0"); + const minute = date.getUTCMinutes().toString().padStart(2, "0"); + const second = date.getUTCSeconds().toString().padStart(2, "0"); + return `${dayName}, ${day} ${month} ${year} ${hour}:${minute}:${second} GMT`; + } + function validateCookieMaxAge(maxAge) { + if (maxAge < 0) { + throw new Error("Invalid cookie max-age"); + } + } + function stringify(cookie) { + if (cookie.name.length === 0) { + return null; + } + validateCookieName(cookie.name); + validateCookieValue(cookie.value); + const out = [`${cookie.name}=${cookie.value}`]; + if (cookie.name.startsWith("__Secure-")) { + cookie.secure = true; + } + if (cookie.name.startsWith("__Host-")) { + cookie.secure = true; + cookie.domain = null; + cookie.path = "/"; + } + if (cookie.secure) { + out.push("Secure"); + } + if (cookie.httpOnly) { + out.push("HttpOnly"); + } + if (typeof cookie.maxAge === "number") { + validateCookieMaxAge(cookie.maxAge); + out.push(`Max-Age=${cookie.maxAge}`); + } + if (cookie.domain) { + validateCookieDomain(cookie.domain); + out.push(`Domain=${cookie.domain}`); + } + if (cookie.path) { + validateCookiePath(cookie.path); + out.push(`Path=${cookie.path}`); + } + if (cookie.expires && cookie.expires.toString() !== "Invalid Date") { + out.push(`Expires=${toIMFDate(cookie.expires)}`); + } + if (cookie.sameSite) { + out.push(`SameSite=${cookie.sameSite}`); + } + for (const part of cookie.unparsed) { + if (!part.includes("=")) { + throw new Error("Invalid unparsed"); + } + const [key, ...value] = part.split("="); + out.push(`${key.trim()}=${value.join("=")}`); + } + return out.join("; "); + } + util$1 = { + isCTLExcludingHtab, + validateCookieName, + validateCookiePath, + validateCookieValue, + toIMFDate, + stringify + }; + return util$1; +} +var parse$1; +var hasRequiredParse; +function requireParse() { + if (hasRequiredParse) return parse$1; + hasRequiredParse = 1; + const { maxNameValuePairSize, maxAttributeValueSize } = requireConstants$1(); + const { isCTLExcludingHtab } = requireUtil$1(); + const { collectASequenceOfCodePointsFast } = requireDataURL(); + const assert = require$$0$9; + function parseSetCookie(header) { + if (isCTLExcludingHtab(header)) { + return null; + } + let nameValuePair = ""; + let unparsedAttributes = ""; + let name = ""; + let value = ""; + if (header.includes(";")) { + const position = { position: 0 }; + nameValuePair = collectASequenceOfCodePointsFast(";", header, position); + unparsedAttributes = header.slice(position.position); + } else { + nameValuePair = header; + } + if (!nameValuePair.includes("=")) { + value = nameValuePair; + } else { + const position = { position: 0 }; + name = collectASequenceOfCodePointsFast( + "=", + nameValuePair, + position + ); + value = nameValuePair.slice(position.position + 1); + } + name = name.trim(); + value = value.trim(); + if (name.length + value.length > maxNameValuePairSize) { + return null; + } + return { + name, + value, + ...parseUnparsedAttributes(unparsedAttributes) + }; + } + function parseUnparsedAttributes(unparsedAttributes, cookieAttributeList = {}) { + if (unparsedAttributes.length === 0) { + return cookieAttributeList; + } + assert(unparsedAttributes[0] === ";"); + unparsedAttributes = unparsedAttributes.slice(1); + let cookieAv = ""; + if (unparsedAttributes.includes(";")) { + cookieAv = collectASequenceOfCodePointsFast( + ";", + unparsedAttributes, + { position: 0 } + ); + unparsedAttributes = unparsedAttributes.slice(cookieAv.length); + } else { + cookieAv = unparsedAttributes; + unparsedAttributes = ""; + } + let attributeName = ""; + let attributeValue = ""; + if (cookieAv.includes("=")) { + const position = { position: 0 }; + attributeName = collectASequenceOfCodePointsFast( + "=", + cookieAv, + position + ); + attributeValue = cookieAv.slice(position.position + 1); + } else { + attributeName = cookieAv; + } + attributeName = attributeName.trim(); + attributeValue = attributeValue.trim(); + if (attributeValue.length > maxAttributeValueSize) { + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); + } + const attributeNameLowercase = attributeName.toLowerCase(); + if (attributeNameLowercase === "expires") { + const expiryTime = new Date(attributeValue); + cookieAttributeList.expires = expiryTime; + } else if (attributeNameLowercase === "max-age") { + const charCode = attributeValue.charCodeAt(0); + if ((charCode < 48 || charCode > 57) && attributeValue[0] !== "-") { + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); + } + if (!/^\d+$/.test(attributeValue)) { + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); + } + const deltaSeconds = Number(attributeValue); + cookieAttributeList.maxAge = deltaSeconds; + } else if (attributeNameLowercase === "domain") { + let cookieDomain = attributeValue; + if (cookieDomain[0] === ".") { + cookieDomain = cookieDomain.slice(1); } - /** - * Adds an HTML thematic break (
) to the summary buffer - * - * @returns {Summary} summary instance - */ - addSeparator() { - const element = this.wrap("hr", null); - return this.addRaw(element).addEOL(); + cookieDomain = cookieDomain.toLowerCase(); + cookieAttributeList.domain = cookieDomain; + } else if (attributeNameLowercase === "path") { + let cookiePath = ""; + if (attributeValue.length === 0 || attributeValue[0] !== "/") { + cookiePath = "/"; + } else { + cookiePath = attributeValue; } - /** - * Adds an HTML line break (
) to the summary buffer - * - * @returns {Summary} summary instance - */ - addBreak() { - const element = this.wrap("br", null); - return this.addRaw(element).addEOL(); + cookieAttributeList.path = cookiePath; + } else if (attributeNameLowercase === "secure") { + cookieAttributeList.secure = true; + } else if (attributeNameLowercase === "httponly") { + cookieAttributeList.httpOnly = true; + } else if (attributeNameLowercase === "samesite") { + let enforcement = "Default"; + const attributeValueLowercase = attributeValue.toLowerCase(); + if (attributeValueLowercase.includes("none")) { + enforcement = "None"; } - /** - * Adds an HTML blockquote to the summary buffer - * - * @param {string} text quote text - * @param {string} cite (optional) citation url - * - * @returns {Summary} summary instance - */ - addQuote(text, cite) { - const attrs = Object.assign({}, cite && { cite }); - const element = this.wrap("blockquote", text, attrs); - return this.addRaw(element).addEOL(); + if (attributeValueLowercase.includes("strict")) { + enforcement = "Strict"; } - /** - * Adds an HTML anchor tag to the summary buffer - * - * @param {string} text link text/content - * @param {string} href hyperlink - * - * @returns {Summary} summary instance - */ - addLink(text, href) { - const element = this.wrap("a", text, { href }); - return this.addRaw(element).addEOL(); + if (attributeValueLowercase.includes("lax")) { + enforcement = "Lax"; } + cookieAttributeList.sameSite = enforcement; + } else { + cookieAttributeList.unparsed ??= []; + cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`); } - const _summary = new Summary(); - exports$1.markdownSummary = _summary; - exports$1.summary = _summary; - })(summary); - return summary; + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); + } + parse$1 = { + parseSetCookie, + parseUnparsedAttributes + }; + return parse$1; +} +var cookies; +var hasRequiredCookies; +function requireCookies() { + if (hasRequiredCookies) return cookies; + hasRequiredCookies = 1; + const { parseSetCookie } = requireParse(); + const { stringify } = requireUtil$1(); + const { webidl } = requireWebidl(); + const { Headers } = requireHeaders(); + function getCookies(headers2) { + webidl.argumentLengthCheck(arguments, 1, { header: "getCookies" }); + webidl.brandCheck(headers2, Headers, { strict: false }); + const cookie = headers2.get("cookie"); + const out = {}; + if (!cookie) { + return out; + } + for (const piece of cookie.split(";")) { + const [name, ...value] = piece.split("="); + out[name.trim()] = value.join("="); + } + return out; + } + function deleteCookie(headers2, name, attributes) { + webidl.argumentLengthCheck(arguments, 2, { header: "deleteCookie" }); + webidl.brandCheck(headers2, Headers, { strict: false }); + name = webidl.converters.DOMString(name); + attributes = webidl.converters.DeleteCookieAttributes(attributes); + setCookie(headers2, { + name, + value: "", + expires: /* @__PURE__ */ new Date(0), + ...attributes + }); + } + function getSetCookies(headers2) { + webidl.argumentLengthCheck(arguments, 1, { header: "getSetCookies" }); + webidl.brandCheck(headers2, Headers, { strict: false }); + const cookies2 = headers2.getSetCookie(); + if (!cookies2) { + return []; + } + return cookies2.map((pair) => parseSetCookie(pair)); + } + function setCookie(headers2, cookie) { + webidl.argumentLengthCheck(arguments, 2, { header: "setCookie" }); + webidl.brandCheck(headers2, Headers, { strict: false }); + cookie = webidl.converters.Cookie(cookie); + const str = stringify(cookie); + if (str) { + headers2.append("Set-Cookie", stringify(cookie)); + } + } + webidl.converters.DeleteCookieAttributes = webidl.dictionaryConverter([ + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: "path", + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: "domain", + defaultValue: null + } + ]); + webidl.converters.Cookie = webidl.dictionaryConverter([ + { + converter: webidl.converters.DOMString, + key: "name" + }, + { + converter: webidl.converters.DOMString, + key: "value" + }, + { + converter: webidl.nullableConverter((value) => { + if (typeof value === "number") { + return webidl.converters["unsigned long long"](value); + } + return new Date(value); + }), + key: "expires", + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters["long long"]), + key: "maxAge", + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: "domain", + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: "path", + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters.boolean), + key: "secure", + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters.boolean), + key: "httpOnly", + defaultValue: null + }, + { + converter: webidl.converters.USVString, + key: "sameSite", + allowedValues: ["Strict", "Lax", "None"] + }, + { + converter: webidl.sequenceConverter(webidl.converters.DOMString), + key: "unparsed", + defaultValue: [] + } + ]); + cookies = { + getCookies, + deleteCookie, + getSetCookies, + setCookie + }; + return cookies; +} +var constants; +var hasRequiredConstants; +function requireConstants() { + if (hasRequiredConstants) return constants; + hasRequiredConstants = 1; + const uid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; + const staticPropertyDescriptors = { + enumerable: true, + writable: false, + configurable: false + }; + const states = { + CONNECTING: 0, + OPEN: 1, + CLOSING: 2, + CLOSED: 3 + }; + const opcodes = { + CONTINUATION: 0, + TEXT: 1, + BINARY: 2, + CLOSE: 8, + PING: 9, + PONG: 10 + }; + const maxUnsigned16Bit = 2 ** 16 - 1; + const parserStates = { + INFO: 0, + PAYLOADLENGTH_16: 2, + PAYLOADLENGTH_64: 3, + READ_DATA: 4 + }; + const emptyBuffer = Buffer.allocUnsafe(0); + constants = { + uid, + staticPropertyDescriptors, + states, + opcodes, + maxUnsigned16Bit, + parserStates, + emptyBuffer + }; + return constants; +} +var symbols; +var hasRequiredSymbols; +function requireSymbols() { + if (hasRequiredSymbols) return symbols; + hasRequiredSymbols = 1; + symbols = { + kWebSocketURL: /* @__PURE__ */ Symbol("url"), + kReadyState: /* @__PURE__ */ Symbol("ready state"), + kController: /* @__PURE__ */ Symbol("controller"), + kResponse: /* @__PURE__ */ Symbol("response"), + kBinaryType: /* @__PURE__ */ Symbol("binary type"), + kSentClose: /* @__PURE__ */ Symbol("sent close"), + kReceivedClose: /* @__PURE__ */ Symbol("received close"), + kByteParser: /* @__PURE__ */ Symbol("byte parser") + }; + return symbols; } -var pathUtils = {}; -var hasRequiredPathUtils; -function requirePathUtils() { - if (hasRequiredPathUtils) return pathUtils; - hasRequiredPathUtils = 1; - var __createBinding = pathUtils && pathUtils.__createBinding || (Object.create ? (function(o, m, k, k2) { - if (k2 === void 0) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { - return m[k]; - } }; +var events; +var hasRequiredEvents; +function requireEvents() { + if (hasRequiredEvents) return events; + hasRequiredEvents = 1; + const { webidl } = requireWebidl(); + const { kEnumerableProperty } = requireUtil$6(); + const { MessagePort } = require$$0$c; + class MessageEvent extends Event { + #eventInit; + constructor(type, eventInitDict = {}) { + webidl.argumentLengthCheck(arguments, 1, { header: "MessageEvent constructor" }); + type = webidl.converters.DOMString(type); + eventInitDict = webidl.converters.MessageEventInit(eventInitDict); + super(type, eventInitDict); + this.#eventInit = eventInitDict; } - Object.defineProperty(o, k2, desc); - }) : (function(o, m, k, k2) { - if (k2 === void 0) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = pathUtils && pathUtils.__setModuleDefault || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = pathUtils && pathUtils.__importStar || function(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) { - for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + get data() { + webidl.brandCheck(this, MessageEvent); + return this.#eventInit.data; } - __setModuleDefault(result, mod); - return result; - }; - Object.defineProperty(pathUtils, "__esModule", { value: true }); - pathUtils.toPlatformPath = pathUtils.toWin32Path = pathUtils.toPosixPath = void 0; - const path = __importStar(require$$1$5); - function toPosixPath(pth) { - return pth.replace(/[\\]/g, "/"); - } - pathUtils.toPosixPath = toPosixPath; - function toWin32Path(pth) { - return pth.replace(/[/]/g, "\\"); - } - pathUtils.toWin32Path = toWin32Path; - function toPlatformPath(pth) { - return pth.replace(/[/\\]/g, path.sep); - } - pathUtils.toPlatformPath = toPlatformPath; - return pathUtils; -} -var platform = {}; -var exec = {}; -var toolrunner = {}; -var io = {}; -var ioUtil = {}; -var hasRequiredIoUtil; -function requireIoUtil() { - if (hasRequiredIoUtil) return ioUtil; - hasRequiredIoUtil = 1; - (function(exports$1) { - var __createBinding = ioUtil && ioUtil.__createBinding || (Object.create ? (function(o, m, k, k2) { - if (k2 === void 0) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { - return m[k]; - } }); - }) : (function(o, m, k, k2) { - if (k2 === void 0) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = ioUtil && ioUtil.__setModuleDefault || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = ioUtil && ioUtil.__importStar || function(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) { - for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = ioUtil && ioUtil.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - var _a2; - Object.defineProperty(exports$1, "__esModule", { value: true }); - exports$1.getCmdPath = exports$1.tryGetExecutablePath = exports$1.isRooted = exports$1.isDirectory = exports$1.exists = exports$1.READONLY = exports$1.UV_FS_O_EXLOCK = exports$1.IS_WINDOWS = exports$1.unlink = exports$1.symlink = exports$1.stat = exports$1.rmdir = exports$1.rm = exports$1.rename = exports$1.readlink = exports$1.readdir = exports$1.open = exports$1.mkdir = exports$1.lstat = exports$1.copyFile = exports$1.chmod = void 0; - const fs = __importStar(require$$1); - const path = __importStar(require$$1$5); - _a2 = fs.promises, exports$1.chmod = _a2.chmod, exports$1.copyFile = _a2.copyFile, exports$1.lstat = _a2.lstat, exports$1.mkdir = _a2.mkdir, exports$1.open = _a2.open, exports$1.readdir = _a2.readdir, exports$1.readlink = _a2.readlink, exports$1.rename = _a2.rename, exports$1.rm = _a2.rm, exports$1.rmdir = _a2.rmdir, exports$1.stat = _a2.stat, exports$1.symlink = _a2.symlink, exports$1.unlink = _a2.unlink; - exports$1.IS_WINDOWS = process.platform === "win32"; - exports$1.UV_FS_O_EXLOCK = 268435456; - exports$1.READONLY = fs.constants.O_RDONLY; - function exists(fsPath) { - return __awaiter(this, void 0, void 0, function* () { - try { - yield exports$1.stat(fsPath); - } catch (err) { - if (err.code === "ENOENT") { - return false; - } - throw err; - } - return true; - }); + get origin() { + webidl.brandCheck(this, MessageEvent); + return this.#eventInit.origin; } - exports$1.exists = exists; - function isDirectory(fsPath, useStat = false) { - return __awaiter(this, void 0, void 0, function* () { - const stats = useStat ? yield exports$1.stat(fsPath) : yield exports$1.lstat(fsPath); - return stats.isDirectory(); - }); + get lastEventId() { + webidl.brandCheck(this, MessageEvent); + return this.#eventInit.lastEventId; } - exports$1.isDirectory = isDirectory; - function isRooted(p) { - p = normalizeSeparators(p); - if (!p) { - throw new Error('isRooted() parameter "p" cannot be empty'); - } - if (exports$1.IS_WINDOWS) { - return p.startsWith("\\") || /^[A-Z]:/i.test(p); + get source() { + webidl.brandCheck(this, MessageEvent); + return this.#eventInit.source; + } + get ports() { + webidl.brandCheck(this, MessageEvent); + if (!Object.isFrozen(this.#eventInit.ports)) { + Object.freeze(this.#eventInit.ports); } - return p.startsWith("/"); + return this.#eventInit.ports; } - exports$1.isRooted = isRooted; - function tryGetExecutablePath(filePath, extensions) { - return __awaiter(this, void 0, void 0, function* () { - let stats = void 0; - try { - stats = yield exports$1.stat(filePath); - } catch (err) { - if (err.code !== "ENOENT") { - console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); - } - } - if (stats && stats.isFile()) { - if (exports$1.IS_WINDOWS) { - const upperExt = path.extname(filePath).toUpperCase(); - if (extensions.some((validExt) => validExt.toUpperCase() === upperExt)) { - return filePath; - } - } else { - if (isUnixExecutable(stats)) { - return filePath; - } - } - } - const originalFilePath = filePath; - for (const extension of extensions) { - filePath = originalFilePath + extension; - stats = void 0; - try { - stats = yield exports$1.stat(filePath); - } catch (err) { - if (err.code !== "ENOENT") { - console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); - } - } - if (stats && stats.isFile()) { - if (exports$1.IS_WINDOWS) { - try { - const directory = path.dirname(filePath); - const upperName = path.basename(filePath).toUpperCase(); - for (const actualName of yield exports$1.readdir(directory)) { - if (upperName === actualName.toUpperCase()) { - filePath = path.join(directory, actualName); - break; - } - } - } catch (err) { - console.log(`Unexpected error attempting to determine the actual case of the file '${filePath}': ${err}`); - } - return filePath; - } else { - if (isUnixExecutable(stats)) { - return filePath; - } - } - } - } - return ""; + initMessageEvent(type, bubbles = false, cancelable = false, data = null, origin = "", lastEventId = "", source = null, ports = []) { + webidl.brandCheck(this, MessageEvent); + webidl.argumentLengthCheck(arguments, 1, { header: "MessageEvent.initMessageEvent" }); + return new MessageEvent(type, { + bubbles, + cancelable, + data, + origin, + lastEventId, + source, + ports }); } - exports$1.tryGetExecutablePath = tryGetExecutablePath; - function normalizeSeparators(p) { - p = p || ""; - if (exports$1.IS_WINDOWS) { - p = p.replace(/\//g, "\\"); - return p.replace(/\\\\+/g, "\\"); - } - return p.replace(/\/\/+/g, "/"); + } + class CloseEvent extends Event { + #eventInit; + constructor(type, eventInitDict = {}) { + webidl.argumentLengthCheck(arguments, 1, { header: "CloseEvent constructor" }); + type = webidl.converters.DOMString(type); + eventInitDict = webidl.converters.CloseEventInit(eventInitDict); + super(type, eventInitDict); + this.#eventInit = eventInitDict; + } + get wasClean() { + webidl.brandCheck(this, CloseEvent); + return this.#eventInit.wasClean; + } + get code() { + webidl.brandCheck(this, CloseEvent); + return this.#eventInit.code; + } + get reason() { + webidl.brandCheck(this, CloseEvent); + return this.#eventInit.reason; + } + } + class ErrorEvent extends Event { + #eventInit; + constructor(type, eventInitDict) { + webidl.argumentLengthCheck(arguments, 1, { header: "ErrorEvent constructor" }); + super(type, eventInitDict); + type = webidl.converters.DOMString(type); + eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {}); + this.#eventInit = eventInitDict; } - function isUnixExecutable(stats) { - return (stats.mode & 1) > 0 || (stats.mode & 8) > 0 && stats.gid === process.getgid() || (stats.mode & 64) > 0 && stats.uid === process.getuid(); + get message() { + webidl.brandCheck(this, ErrorEvent); + return this.#eventInit.message; } - function getCmdPath() { - var _a3; - return (_a3 = process.env["COMSPEC"]) !== null && _a3 !== void 0 ? _a3 : `cmd.exe`; + get filename() { + webidl.brandCheck(this, ErrorEvent); + return this.#eventInit.filename; } - exports$1.getCmdPath = getCmdPath; - })(ioUtil); - return ioUtil; -} -var hasRequiredIo; -function requireIo() { - if (hasRequiredIo) return io; - hasRequiredIo = 1; - var __createBinding = io && io.__createBinding || (Object.create ? (function(o, m, k, k2) { - if (k2 === void 0) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { - return m[k]; - } }); - }) : (function(o, m, k, k2) { - if (k2 === void 0) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = io && io.__setModuleDefault || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = io && io.__importStar || function(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) { - for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + get lineno() { + webidl.brandCheck(this, ErrorEvent); + return this.#eventInit.lineno; } - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = io && io.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); + get colno() { + webidl.brandCheck(this, ErrorEvent); + return this.#eventInit.colno; } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + get error() { + webidl.brandCheck(this, ErrorEvent); + return this.#eventInit.error; + } + } + Object.defineProperties(MessageEvent.prototype, { + [Symbol.toStringTag]: { + value: "MessageEvent", + configurable: true + }, + data: kEnumerableProperty, + origin: kEnumerableProperty, + lastEventId: kEnumerableProperty, + source: kEnumerableProperty, + ports: kEnumerableProperty, + initMessageEvent: kEnumerableProperty + }); + Object.defineProperties(CloseEvent.prototype, { + [Symbol.toStringTag]: { + value: "CloseEvent", + configurable: true + }, + reason: kEnumerableProperty, + code: kEnumerableProperty, + wasClean: kEnumerableProperty + }); + Object.defineProperties(ErrorEvent.prototype, { + [Symbol.toStringTag]: { + value: "ErrorEvent", + configurable: true + }, + message: kEnumerableProperty, + filename: kEnumerableProperty, + lineno: kEnumerableProperty, + colno: kEnumerableProperty, + error: kEnumerableProperty + }); + webidl.converters.MessagePort = webidl.interfaceConverter(MessagePort); + webidl.converters["sequence"] = webidl.sequenceConverter( + webidl.converters.MessagePort + ); + const eventInit = [ + { + key: "bubbles", + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: "cancelable", + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: "composed", + converter: webidl.converters.boolean, + defaultValue: false + } + ]; + webidl.converters.MessageEventInit = webidl.dictionaryConverter([ + ...eventInit, + { + key: "data", + converter: webidl.converters.any, + defaultValue: null + }, + { + key: "origin", + converter: webidl.converters.USVString, + defaultValue: "" + }, + { + key: "lastEventId", + converter: webidl.converters.DOMString, + defaultValue: "" + }, + { + key: "source", + // Node doesn't implement WindowProxy or ServiceWorker, so the only + // valid value for source is a MessagePort. + converter: webidl.nullableConverter(webidl.converters.MessagePort), + defaultValue: null + }, + { + key: "ports", + converter: webidl.converters["sequence"], + get defaultValue() { + return []; } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); + } + ]); + webidl.converters.CloseEventInit = webidl.dictionaryConverter([ + ...eventInit, + { + key: "wasClean", + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: "code", + converter: webidl.converters["unsigned short"], + defaultValue: 0 + }, + { + key: "reason", + converter: webidl.converters.USVString, + defaultValue: "" + } + ]); + webidl.converters.ErrorEventInit = webidl.dictionaryConverter([ + ...eventInit, + { + key: "message", + converter: webidl.converters.DOMString, + defaultValue: "" + }, + { + key: "filename", + converter: webidl.converters.USVString, + defaultValue: "" + }, + { + key: "lineno", + converter: webidl.converters["unsigned long"], + defaultValue: 0 + }, + { + key: "colno", + converter: webidl.converters["unsigned long"], + defaultValue: 0 + }, + { + key: "error", + converter: webidl.converters.any + } + ]); + events = { + MessageEvent, + CloseEvent, + ErrorEvent }; - Object.defineProperty(io, "__esModule", { value: true }); - io.findInPath = io.which = io.mkdirP = io.rmRF = io.mv = io.cp = void 0; - const assert_1 = require$$0$3; - const path = __importStar(require$$1$5); - const ioUtil2 = __importStar(requireIoUtil()); - function cp(source, dest, options = {}) { - return __awaiter(this, void 0, void 0, function* () { - const { force, recursive, copySourceDirectory } = readCopyOptions(options); - const destStat = (yield ioUtil2.exists(dest)) ? yield ioUtil2.stat(dest) : null; - if (destStat && destStat.isFile() && !force) { - return; - } - const newDest = destStat && destStat.isDirectory() && copySourceDirectory ? path.join(dest, path.basename(source)) : dest; - if (!(yield ioUtil2.exists(source))) { - throw new Error(`no such file or directory: ${source}`); - } - const sourceStat = yield ioUtil2.stat(source); - if (sourceStat.isDirectory()) { - if (!recursive) { - throw new Error(`Failed to copy. ${source} is a directory, but tried to copy without recursive flag.`); - } else { - yield cpDirRecursive(source, newDest, 0, force); - } - } else { - if (path.relative(source, newDest) === "") { - throw new Error(`'${newDest}' and '${source}' are the same file`); - } - yield copyFile(source, newDest, force); - } - }); + return events; +} +var util; +var hasRequiredUtil; +function requireUtil() { + if (hasRequiredUtil) return util; + hasRequiredUtil = 1; + const { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = requireSymbols(); + const { states, opcodes } = requireConstants(); + const { MessageEvent, ErrorEvent } = requireEvents(); + function isEstablished(ws) { + return ws[kReadyState] === states.OPEN; } - io.cp = cp; - function mv(source, dest, options = {}) { - return __awaiter(this, void 0, void 0, function* () { - if (yield ioUtil2.exists(dest)) { - let destExists = true; - if (yield ioUtil2.isDirectory(dest)) { - dest = path.join(dest, path.basename(source)); - destExists = yield ioUtil2.exists(dest); - } - if (destExists) { - if (options.force == null || options.force) { - yield rmRF(dest); - } else { - throw new Error("Destination already exists"); - } - } - } - yield mkdirP(path.dirname(dest)); - yield ioUtil2.rename(source, dest); - }); + function isClosing(ws) { + return ws[kReadyState] === states.CLOSING; } - io.mv = mv; - function rmRF(inputPath) { - return __awaiter(this, void 0, void 0, function* () { - if (ioUtil2.IS_WINDOWS) { - if (/[*"<>|]/.test(inputPath)) { - throw new Error('File path must not contain `*`, `"`, `<`, `>` or `|` on Windows'); - } - } - try { - yield ioUtil2.rm(inputPath, { - force: true, - maxRetries: 3, - recursive: true, - retryDelay: 300 - }); - } catch (err) { - throw new Error(`File was unable to be removed ${err}`); - } - }); + function isClosed(ws) { + return ws[kReadyState] === states.CLOSED; } - io.rmRF = rmRF; - function mkdirP(fsPath) { - return __awaiter(this, void 0, void 0, function* () { - assert_1.ok(fsPath, "a path argument must be provided"); - yield ioUtil2.mkdir(fsPath, { recursive: true }); - }); + function fireEvent(e, target, eventConstructor = Event, eventInitDict) { + const event = new eventConstructor(e, eventInitDict); + target.dispatchEvent(event); } - io.mkdirP = mkdirP; - function which(tool, check) { - return __awaiter(this, void 0, void 0, function* () { - if (!tool) { - throw new Error("parameter 'tool' is required"); - } - if (check) { - const result = yield which(tool, false); - if (!result) { - if (ioUtil2.IS_WINDOWS) { - throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.`); - } else { - throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.`); - } - } - return result; + function websocketMessageReceived(ws, type, data) { + if (ws[kReadyState] !== states.OPEN) { + return; + } + let dataForEvent; + if (type === opcodes.TEXT) { + try { + dataForEvent = new TextDecoder("utf-8", { fatal: true }).decode(data); + } catch { + failWebsocketConnection(ws, "Received invalid UTF-8 in text frame."); + return; } - const matches = yield findInPath(tool); - if (matches && matches.length > 0) { - return matches[0]; + } else if (type === opcodes.BINARY) { + if (ws[kBinaryType] === "blob") { + dataForEvent = new Blob([data]); + } else { + dataForEvent = new Uint8Array(data).buffer; } - return ""; + } + fireEvent("message", ws, MessageEvent, { + origin: ws[kWebSocketURL].origin, + data: dataForEvent }); } - io.which = which; - function findInPath(tool) { - return __awaiter(this, void 0, void 0, function* () { - if (!tool) { - throw new Error("parameter 'tool' is required"); - } - const extensions = []; - if (ioUtil2.IS_WINDOWS && process.env["PATHEXT"]) { - for (const extension of process.env["PATHEXT"].split(path.delimiter)) { - if (extension) { - extensions.push(extension); - } - } - } - if (ioUtil2.isRooted(tool)) { - const filePath = yield ioUtil2.tryGetExecutablePath(tool, extensions); - if (filePath) { - return [filePath]; - } - return []; - } - if (tool.includes(path.sep)) { - return []; - } - const directories = []; - if (process.env.PATH) { - for (const p of process.env.PATH.split(path.delimiter)) { - if (p) { - directories.push(p); - } - } - } - const matches = []; - for (const directory of directories) { - const filePath = yield ioUtil2.tryGetExecutablePath(path.join(directory, tool), extensions); - if (filePath) { - matches.push(filePath); - } + function isValidSubprotocol(protocol) { + if (protocol.length === 0) { + return false; + } + for (const char of protocol) { + const code = char.charCodeAt(0); + if (code < 33 || code > 126 || char === "(" || char === ")" || char === "<" || char === ">" || char === "@" || char === "," || char === ";" || char === ":" || char === "\\" || char === '"' || char === "/" || char === "[" || char === "]" || char === "?" || char === "=" || char === "{" || char === "}" || code === 32 || // SP + code === 9) { + return false; } - return matches; - }); - } - io.findInPath = findInPath; - function readCopyOptions(options) { - const force = options.force == null ? true : options.force; - const recursive = Boolean(options.recursive); - const copySourceDirectory = options.copySourceDirectory == null ? true : Boolean(options.copySourceDirectory); - return { force, recursive, copySourceDirectory }; + } + return true; } - function cpDirRecursive(sourceDir, destDir, currentDepth, force) { - return __awaiter(this, void 0, void 0, function* () { - if (currentDepth >= 255) - return; - currentDepth++; - yield mkdirP(destDir); - const files = yield ioUtil2.readdir(sourceDir); - for (const fileName of files) { - const srcFile = `${sourceDir}/${fileName}`; - const destFile = `${destDir}/${fileName}`; - const srcFileStat = yield ioUtil2.lstat(srcFile); - if (srcFileStat.isDirectory()) { - yield cpDirRecursive(srcFile, destFile, currentDepth, force); - } else { - yield copyFile(srcFile, destFile, force); - } - } - yield ioUtil2.chmod(destDir, (yield ioUtil2.stat(sourceDir)).mode); - }); + function isValidStatusCode(code) { + if (code >= 1e3 && code < 1015) { + return code !== 1004 && // reserved + code !== 1005 && // "MUST NOT be set as a status code" + code !== 1006; + } + return code >= 3e3 && code <= 4999; } - function copyFile(srcFile, destFile, force) { - return __awaiter(this, void 0, void 0, function* () { - if ((yield ioUtil2.lstat(srcFile)).isSymbolicLink()) { - try { - yield ioUtil2.lstat(destFile); - yield ioUtil2.unlink(destFile); - } catch (e) { - if (e.code === "EPERM") { - yield ioUtil2.chmod(destFile, "0666"); - yield ioUtil2.unlink(destFile); - } - } - const symlinkFull = yield ioUtil2.readlink(srcFile); - yield ioUtil2.symlink(symlinkFull, destFile, ioUtil2.IS_WINDOWS ? "junction" : null); - } else if (!(yield ioUtil2.exists(destFile)) || force) { - yield ioUtil2.copyFile(srcFile, destFile); - } - }); + function failWebsocketConnection(ws, reason) { + const { [kController]: controller, [kResponse]: response2 } = ws; + controller.abort(); + if (response2?.socket && !response2.socket.destroyed) { + response2.socket.destroy(); + } + if (reason) { + fireEvent("error", ws, ErrorEvent, { + error: new Error(reason) + }); + } } - return io; + util = { + isEstablished, + isClosing, + isClosed, + fireEvent, + isValidSubprotocol, + isValidStatusCode, + failWebsocketConnection, + websocketMessageReceived + }; + return util; } -var hasRequiredToolrunner; -function requireToolrunner() { - if (hasRequiredToolrunner) return toolrunner; - hasRequiredToolrunner = 1; - var __createBinding = toolrunner && toolrunner.__createBinding || (Object.create ? (function(o, m, k, k2) { - if (k2 === void 0) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { - return m[k]; - } }); - }) : (function(o, m, k, k2) { - if (k2 === void 0) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = toolrunner && toolrunner.__setModuleDefault || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = toolrunner && toolrunner.__importStar || function(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) { - for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); +var connection; +var hasRequiredConnection; +function requireConnection() { + if (hasRequiredConnection) return connection; + hasRequiredConnection = 1; + const diagnosticsChannel = require$$0$d; + const { uid, states } = requireConstants(); + const { + kReadyState, + kSentClose, + kByteParser, + kReceivedClose + } = requireSymbols(); + const { fireEvent, failWebsocketConnection } = requireUtil(); + const { CloseEvent } = requireEvents(); + const { makeRequest } = requireRequest(); + const { fetching } = requireFetch(); + const { Headers } = requireHeaders(); + const { getGlobalDispatcher } = requireGlobal(); + const { kHeadersList } = requireSymbols$4(); + const channels = {}; + channels.open = diagnosticsChannel.channel("undici:websocket:open"); + channels.close = diagnosticsChannel.channel("undici:websocket:close"); + channels.socketError = diagnosticsChannel.channel("undici:websocket:socket_error"); + let crypto; + try { + crypto = require("crypto"); + } catch { + } + function establishWebSocketConnection(url, protocols, ws, onEstablish, options) { + const requestURL = url; + requestURL.protocol = url.protocol === "ws:" ? "http:" : "https:"; + const request2 = makeRequest({ + urlList: [requestURL], + serviceWorkers: "none", + referrer: "no-referrer", + mode: "websocket", + credentials: "include", + cache: "no-store", + redirect: "error" + }); + if (options.headers) { + const headersList = new Headers(options.headers)[kHeadersList]; + request2.headersList = headersList; } - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = toolrunner && toolrunner.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); + const keyValue = crypto.randomBytes(16).toString("base64"); + request2.headersList.append("sec-websocket-key", keyValue); + request2.headersList.append("sec-websocket-version", "13"); + for (const protocol of protocols) { + request2.headersList.append("sec-websocket-protocol", protocol); } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); + const permessageDeflate2 = ""; + const controller = fetching({ + request: request2, + useParallelQueue: true, + dispatcher: options.dispatcher ?? getGlobalDispatcher(), + processResponse(response2) { + if (response2.type === "error" || response2.status !== 101) { + failWebsocketConnection(ws, "Received network error or non-101 status code."); + return; } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); + if (protocols.length !== 0 && !response2.headersList.get("Sec-WebSocket-Protocol")) { + failWebsocketConnection(ws, "Server did not respond with sent protocols."); + return; } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(toolrunner, "__esModule", { value: true }); - toolrunner.argStringToArray = toolrunner.ToolRunner = void 0; - const os = __importStar(require$$0); - const events2 = __importStar(require$$4$1); - const child = __importStar(require$$2$3); - const path = __importStar(require$$1$5); - const io2 = __importStar(requireIo()); - const ioUtil2 = __importStar(requireIoUtil()); - const timers_1 = require$$6$1; - const IS_WINDOWS = process.platform === "win32"; - class ToolRunner extends events2.EventEmitter { - constructor(toolPath, args, options) { - super(); - if (!toolPath) { - throw new Error("Parameter 'toolPath' cannot be null or empty."); - } - this.toolPath = toolPath; - this.args = args || []; - this.options = options || {}; - } - _debug(message) { - if (this.options.listeners && this.options.listeners.debug) { - this.options.listeners.debug(message); - } - } - _getCommandString(options, noPrefix) { - const toolPath = this._getSpawnFileName(); - const args = this._getSpawnArgs(options); - let cmd = noPrefix ? "" : "[command]"; - if (IS_WINDOWS) { - if (this._isCmdFile()) { - cmd += toolPath; - for (const a of args) { - cmd += ` ${a}`; - } - } else if (options.windowsVerbatimArguments) { - cmd += `"${toolPath}"`; - for (const a of args) { - cmd += ` ${a}`; - } - } else { - cmd += this._windowsQuoteCmdArg(toolPath); - for (const a of args) { - cmd += ` ${this._windowsQuoteCmdArg(a)}`; - } + if (response2.headersList.get("Upgrade")?.toLowerCase() !== "websocket") { + failWebsocketConnection(ws, 'Server did not set Upgrade header to "websocket".'); + return; } - } else { - cmd += toolPath; - for (const a of args) { - cmd += ` ${a}`; + if (response2.headersList.get("Connection")?.toLowerCase() !== "upgrade") { + failWebsocketConnection(ws, 'Server did not set Connection header to "upgrade".'); + return; } - } - return cmd; - } - _processLineBuffer(data, strBuffer, onLine) { - try { - let s = strBuffer + data.toString(); - let n = s.indexOf(os.EOL); - while (n > -1) { - const line = s.substring(0, n); - onLine(line); - s = s.substring(n + os.EOL.length); - n = s.indexOf(os.EOL); + const secWSAccept = response2.headersList.get("Sec-WebSocket-Accept"); + const digest = crypto.createHash("sha1").update(keyValue + uid).digest("base64"); + if (secWSAccept !== digest) { + failWebsocketConnection(ws, "Incorrect hash received in Sec-WebSocket-Accept header."); + return; } - return s; - } catch (err) { - this._debug(`error processing line. Failed with error ${err}`); - return ""; - } - } - _getSpawnFileName() { - if (IS_WINDOWS) { - if (this._isCmdFile()) { - return process.env["COMSPEC"] || "cmd.exe"; + const secExtension = response2.headersList.get("Sec-WebSocket-Extensions"); + if (secExtension !== null && secExtension !== permessageDeflate2) { + failWebsocketConnection(ws, "Received different permessage-deflate than the one set."); + return; } - } - return this.toolPath; - } - _getSpawnArgs(options) { - if (IS_WINDOWS) { - if (this._isCmdFile()) { - let argline = `/D /S /C "${this._windowsQuoteCmdArg(this.toolPath)}`; - for (const a of this.args) { - argline += " "; - argline += options.windowsVerbatimArguments ? a : this._windowsQuoteCmdArg(a); - } - argline += '"'; - return [argline]; + const secProtocol = response2.headersList.get("Sec-WebSocket-Protocol"); + if (secProtocol !== null && secProtocol !== request2.headersList.get("Sec-WebSocket-Protocol")) { + failWebsocketConnection(ws, "Protocol was not set in the opening handshake."); + return; } + response2.socket.on("data", onSocketData); + response2.socket.on("close", onSocketClose); + response2.socket.on("error", onSocketError); + if (channels.open.hasSubscribers) { + channels.open.publish({ + address: response2.socket.address(), + protocol: secProtocol, + extensions: secExtension + }); + } + onEstablish(response2); } - return this.args; - } - _endsWith(str, end) { - return str.endsWith(end); + }); + return controller; + } + function onSocketData(chunk) { + if (!this.ws[kByteParser].write(chunk)) { + this.pause(); } - _isCmdFile() { - const upperToolPath = this.toolPath.toUpperCase(); - return this._endsWith(upperToolPath, ".CMD") || this._endsWith(upperToolPath, ".BAT"); + } + function onSocketClose() { + const { ws } = this; + const wasClean = ws[kSentClose] && ws[kReceivedClose]; + let code = 1005; + let reason = ""; + const result = ws[kByteParser].closingInfo; + if (result) { + code = result.code ?? 1005; + reason = result.reason; + } else if (!ws[kSentClose]) { + code = 1006; } - _windowsQuoteCmdArg(arg) { - if (!this._isCmdFile()) { - return this._uvQuoteCmdArg(arg); - } - if (!arg) { - return '""'; - } - const cmdSpecialChars = [ - " ", - " ", - "&", - "(", - ")", - "[", - "]", - "{", - "}", - "^", - "=", - ";", - "!", - "'", - "+", - ",", - "`", - "~", - "|", - "<", - ">", - '"' - ]; - let needsQuotes = false; - for (const char of arg) { - if (cmdSpecialChars.some((x) => x === char)) { - needsQuotes = true; - break; - } - } - if (!needsQuotes) { - return arg; - } - let reverse = '"'; - let quoteHit = true; - for (let i = arg.length; i > 0; i--) { - reverse += arg[i - 1]; - if (quoteHit && arg[i - 1] === "\\") { - reverse += "\\"; - } else if (arg[i - 1] === '"') { - quoteHit = true; - reverse += '"'; - } else { - quoteHit = false; - } - } - reverse += '"'; - return reverse.split("").reverse().join(""); + ws[kReadyState] = states.CLOSED; + fireEvent("close", ws, CloseEvent, { + wasClean, + code, + reason + }); + if (channels.close.hasSubscribers) { + channels.close.publish({ + websocket: ws, + code, + reason + }); } - _uvQuoteCmdArg(arg) { - if (!arg) { - return '""'; - } - if (!arg.includes(" ") && !arg.includes(" ") && !arg.includes('"')) { - return arg; + } + function onSocketError(error) { + const { ws } = this; + ws[kReadyState] = states.CLOSING; + if (channels.socketError.hasSubscribers) { + channels.socketError.publish(error); + } + this.destroy(); + } + connection = { + establishWebSocketConnection + }; + return connection; +} +var frame; +var hasRequiredFrame; +function requireFrame() { + if (hasRequiredFrame) return frame; + hasRequiredFrame = 1; + const { maxUnsigned16Bit } = requireConstants(); + let crypto; + try { + crypto = require("crypto"); + } catch { + } + class WebsocketFrameSend { + /** + * @param {Buffer|undefined} data + */ + constructor(data) { + this.frameData = data; + this.maskKey = crypto.randomBytes(4); + } + createFrame(opcode) { + const bodyLength = this.frameData?.byteLength ?? 0; + let payloadLength = bodyLength; + let offset = 6; + if (bodyLength > maxUnsigned16Bit) { + offset += 8; + payloadLength = 127; + } else if (bodyLength > 125) { + offset += 2; + payloadLength = 126; } - if (!arg.includes('"') && !arg.includes("\\")) { - return `"${arg}"`; + const buffer = Buffer.allocUnsafe(bodyLength + offset); + buffer[0] = buffer[1] = 0; + buffer[0] |= 128; + buffer[0] = (buffer[0] & 240) + opcode; + buffer[offset - 4] = this.maskKey[0]; + buffer[offset - 3] = this.maskKey[1]; + buffer[offset - 2] = this.maskKey[2]; + buffer[offset - 1] = this.maskKey[3]; + buffer[1] = payloadLength; + if (payloadLength === 126) { + buffer.writeUInt16BE(bodyLength, 2); + } else if (payloadLength === 127) { + buffer[2] = buffer[3] = 0; + buffer.writeUIntBE(bodyLength, 4, 6); } - let reverse = '"'; - let quoteHit = true; - for (let i = arg.length; i > 0; i--) { - reverse += arg[i - 1]; - if (quoteHit && arg[i - 1] === "\\") { - reverse += "\\"; - } else if (arg[i - 1] === '"') { - quoteHit = true; - reverse += "\\"; - } else { - quoteHit = false; - } + buffer[1] |= 128; + for (let i = 0; i < bodyLength; i++) { + buffer[offset + i] = this.frameData[i] ^ this.maskKey[i % 4]; } - reverse += '"'; - return reverse.split("").reverse().join(""); + return buffer; } - _cloneExecOptions(options) { - options = options || {}; - const result = { - cwd: options.cwd || process.cwd(), - env: options.env || process.env, - silent: options.silent || false, - windowsVerbatimArguments: options.windowsVerbatimArguments || false, - failOnStdErr: options.failOnStdErr || false, - ignoreReturnCode: options.ignoreReturnCode || false, - delay: options.delay || 1e4 - }; - result.outStream = options.outStream || process.stdout; - result.errStream = options.errStream || process.stderr; - return result; + } + frame = { + WebsocketFrameSend + }; + return frame; +} +var receiver; +var hasRequiredReceiver; +function requireReceiver() { + if (hasRequiredReceiver) return receiver; + hasRequiredReceiver = 1; + const { Writable } = require$$0$b; + const diagnosticsChannel = require$$0$d; + const { parserStates, opcodes, states, emptyBuffer } = requireConstants(); + const { kReadyState, kSentClose, kResponse, kReceivedClose } = requireSymbols(); + const { isValidStatusCode, failWebsocketConnection, websocketMessageReceived } = requireUtil(); + const { WebsocketFrameSend } = requireFrame(); + const channels = {}; + channels.ping = diagnosticsChannel.channel("undici:websocket:ping"); + channels.pong = diagnosticsChannel.channel("undici:websocket:pong"); + class ByteParser extends Writable { + #buffers = []; + #byteOffset = 0; + #state = parserStates.INFO; + #info = {}; + #fragments = []; + constructor(ws) { + super(); + this.ws = ws; } - _getSpawnOptions(options, toolPath) { - options = options || {}; - const result = {}; - result.cwd = options.cwd; - result.env = options.env; - result["windowsVerbatimArguments"] = options.windowsVerbatimArguments || this._isCmdFile(); - if (options.windowsVerbatimArguments) { - result.argv0 = `"${toolPath}"`; - } - return result; + /** + * @param {Buffer} chunk + * @param {() => void} callback + */ + _write(chunk, _, callback) { + this.#buffers.push(chunk); + this.#byteOffset += chunk.length; + this.run(callback); } /** - * Exec a tool. - * Output will be streamed to the live console. - * Returns promise with return code - * - * @param tool path to tool to exec - * @param options optional exec options. See ExecOptions - * @returns number + * Runs whenever a new chunk is received. + * Callback is called whenever there are no more chunks buffering, + * or not enough bytes are buffered to parse. */ - exec() { - return __awaiter(this, void 0, void 0, function* () { - if (!ioUtil2.isRooted(this.toolPath) && (this.toolPath.includes("/") || IS_WINDOWS && this.toolPath.includes("\\"))) { - this.toolPath = path.resolve(process.cwd(), this.options.cwd || process.cwd(), this.toolPath); - } - this.toolPath = yield io2.which(this.toolPath, true); - return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { - this._debug(`exec tool: ${this.toolPath}`); - this._debug("arguments:"); - for (const arg of this.args) { - this._debug(` ${arg}`); + run(callback) { + while (true) { + if (this.#state === parserStates.INFO) { + if (this.#byteOffset < 2) { + return callback(); } - const optionsNonNull = this._cloneExecOptions(this.options); - if (!optionsNonNull.silent && optionsNonNull.outStream) { - optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os.EOL); + const buffer = this.consume(2); + this.#info.fin = (buffer[0] & 128) !== 0; + this.#info.opcode = buffer[0] & 15; + this.#info.originalOpcode ??= this.#info.opcode; + this.#info.fragmented = !this.#info.fin && this.#info.opcode !== opcodes.CONTINUATION; + if (this.#info.fragmented && this.#info.opcode !== opcodes.BINARY && this.#info.opcode !== opcodes.TEXT) { + failWebsocketConnection(this.ws, "Invalid frame type was fragmented."); + return; } - const state = new ExecState(optionsNonNull, this.toolPath); - state.on("debug", (message) => { - this._debug(message); - }); - if (this.options.cwd && !(yield ioUtil2.exists(this.options.cwd))) { - return reject(new Error(`The cwd: ${this.options.cwd} does not exist!`)); + const payloadLength = buffer[1] & 127; + if (payloadLength <= 125) { + this.#info.payloadLength = payloadLength; + this.#state = parserStates.READ_DATA; + } else if (payloadLength === 126) { + this.#state = parserStates.PAYLOADLENGTH_16; + } else if (payloadLength === 127) { + this.#state = parserStates.PAYLOADLENGTH_64; } - const fileName = this._getSpawnFileName(); - const cp = child.spawn(fileName, this._getSpawnArgs(optionsNonNull), this._getSpawnOptions(this.options, fileName)); - let stdbuffer = ""; - if (cp.stdout) { - cp.stdout.on("data", (data) => { - if (this.options.listeners && this.options.listeners.stdout) { - this.options.listeners.stdout(data); - } - if (!optionsNonNull.silent && optionsNonNull.outStream) { - optionsNonNull.outStream.write(data); - } - stdbuffer = this._processLineBuffer(data, stdbuffer, (line) => { - if (this.options.listeners && this.options.listeners.stdline) { - this.options.listeners.stdline(line); + if (this.#info.fragmented && payloadLength > 125) { + failWebsocketConnection(this.ws, "Fragmented frame exceeded 125 bytes."); + return; + } else if ((this.#info.opcode === opcodes.PING || this.#info.opcode === opcodes.PONG || this.#info.opcode === opcodes.CLOSE) && payloadLength > 125) { + failWebsocketConnection(this.ws, "Payload length for control frame exceeded 125 bytes."); + return; + } else if (this.#info.opcode === opcodes.CLOSE) { + if (payloadLength === 1) { + failWebsocketConnection(this.ws, "Received close frame with a 1-byte body."); + return; + } + const body2 = this.consume(payloadLength); + this.#info.closeInfo = this.parseCloseBody(false, body2); + if (!this.ws[kSentClose]) { + const body3 = Buffer.allocUnsafe(2); + body3.writeUInt16BE(this.#info.closeInfo.code, 0); + const closeFrame = new WebsocketFrameSend(body3); + this.ws[kResponse].socket.write( + closeFrame.createFrame(opcodes.CLOSE), + (err) => { + if (!err) { + this.ws[kSentClose] = true; + } } - }); - }); - } - let errbuffer = ""; - if (cp.stderr) { - cp.stderr.on("data", (data) => { - state.processStderr = true; - if (this.options.listeners && this.options.listeners.stderr) { - this.options.listeners.stderr(data); - } - if (!optionsNonNull.silent && optionsNonNull.errStream && optionsNonNull.outStream) { - const s = optionsNonNull.failOnStdErr ? optionsNonNull.errStream : optionsNonNull.outStream; - s.write(data); + ); + } + this.ws[kReadyState] = states.CLOSING; + this.ws[kReceivedClose] = true; + this.end(); + return; + } else if (this.#info.opcode === opcodes.PING) { + const body2 = this.consume(payloadLength); + if (!this.ws[kReceivedClose]) { + const frame2 = new WebsocketFrameSend(body2); + this.ws[kResponse].socket.write(frame2.createFrame(opcodes.PONG)); + if (channels.ping.hasSubscribers) { + channels.ping.publish({ + payload: body2 + }); } - errbuffer = this._processLineBuffer(data, errbuffer, (line) => { - if (this.options.listeners && this.options.listeners.errline) { - this.options.listeners.errline(line); - } - }); - }); - } - cp.on("error", (err) => { - state.processError = err.message; - state.processExited = true; - state.processClosed = true; - state.CheckComplete(); - }); - cp.on("exit", (code) => { - state.processExitCode = code; - state.processExited = true; - this._debug(`Exit code ${code} received from tool '${this.toolPath}'`); - state.CheckComplete(); - }); - cp.on("close", (code) => { - state.processExitCode = code; - state.processExited = true; - state.processClosed = true; - this._debug(`STDIO streams have closed for tool '${this.toolPath}'`); - state.CheckComplete(); - }); - state.on("done", (error, exitCode) => { - if (stdbuffer.length > 0) { - this.emit("stdline", stdbuffer); } - if (errbuffer.length > 0) { - this.emit("errline", errbuffer); + this.#state = parserStates.INFO; + if (this.#byteOffset > 0) { + continue; + } else { + callback(); + return; } - cp.removeAllListeners(); - if (error) { - reject(error); + } else if (this.#info.opcode === opcodes.PONG) { + const body2 = this.consume(payloadLength); + if (channels.pong.hasSubscribers) { + channels.pong.publish({ + payload: body2 + }); + } + if (this.#byteOffset > 0) { + continue; } else { - resolve(exitCode); + callback(); + return; } - }); - if (this.options.input) { - if (!cp.stdin) { - throw new Error("child process missing stdin"); + } + } else if (this.#state === parserStates.PAYLOADLENGTH_16) { + if (this.#byteOffset < 2) { + return callback(); + } + const buffer = this.consume(2); + this.#info.payloadLength = buffer.readUInt16BE(0); + this.#state = parserStates.READ_DATA; + } else if (this.#state === parserStates.PAYLOADLENGTH_64) { + if (this.#byteOffset < 8) { + return callback(); + } + const buffer = this.consume(8); + const upper = buffer.readUInt32BE(0); + if (upper > 2 ** 31 - 1) { + failWebsocketConnection(this.ws, "Received payload length > 2^31 bytes."); + return; + } + const lower = buffer.readUInt32BE(4); + this.#info.payloadLength = (upper << 8) + lower; + this.#state = parserStates.READ_DATA; + } else if (this.#state === parserStates.READ_DATA) { + if (this.#byteOffset < this.#info.payloadLength) { + return callback(); + } else if (this.#byteOffset >= this.#info.payloadLength) { + const body2 = this.consume(this.#info.payloadLength); + this.#fragments.push(body2); + if (!this.#info.fragmented || this.#info.fin && this.#info.opcode === opcodes.CONTINUATION) { + const fullMessage = Buffer.concat(this.#fragments); + websocketMessageReceived(this.ws, this.#info.originalOpcode, fullMessage); + this.#info = {}; + this.#fragments.length = 0; } - cp.stdin.end(this.options.input); + this.#state = parserStates.INFO; } - })); - }); - } - } - toolrunner.ToolRunner = ToolRunner; - function argStringToArray(argString) { - const args = []; - let inQuotes = false; - let escaped = false; - let arg = ""; - function append(c) { - if (escaped && c !== '"') { - arg += "\\"; - } - arg += c; - escaped = false; - } - for (let i = 0; i < argString.length; i++) { - const c = argString.charAt(i); - if (c === '"') { - if (!escaped) { - inQuotes = !inQuotes; - } else { - append(c); - } - continue; - } - if (c === "\\" && escaped) { - append(c); - continue; - } - if (c === "\\" && inQuotes) { - escaped = true; - continue; - } - if (c === " " && !inQuotes) { - if (arg.length > 0) { - args.push(arg); - arg = ""; } - continue; - } - append(c); - } - if (arg.length > 0) { - args.push(arg.trim()); - } - return args; - } - toolrunner.argStringToArray = argStringToArray; - class ExecState extends events2.EventEmitter { - constructor(options, toolPath) { - super(); - this.processClosed = false; - this.processError = ""; - this.processExitCode = 0; - this.processExited = false; - this.processStderr = false; - this.delay = 1e4; - this.done = false; - this.timeout = null; - if (!toolPath) { - throw new Error("toolPath must not be empty"); - } - this.options = options; - this.toolPath = toolPath; - if (options.delay) { - this.delay = options.delay; - } - } - CheckComplete() { - if (this.done) { - return; - } - if (this.processClosed) { - this._setResult(); - } else if (this.processExited) { - this.timeout = timers_1.setTimeout(ExecState.HandleTimeout, this.delay, this); - } - } - _debug(message) { - this.emit("debug", message); - } - _setResult() { - let error; - if (this.processExited) { - if (this.processError) { - error = new Error(`There was an error when attempting to execute the process '${this.toolPath}'. This may indicate the process failed to start. Error: ${this.processError}`); - } else if (this.processExitCode !== 0 && !this.options.ignoreReturnCode) { - error = new Error(`The process '${this.toolPath}' failed with exit code ${this.processExitCode}`); - } else if (this.processStderr && this.options.failOnStdErr) { - error = new Error(`The process '${this.toolPath}' failed because one or more lines were written to the STDERR stream`); + if (this.#byteOffset > 0) { + continue; + } else { + callback(); + break; } } - if (this.timeout) { - clearTimeout(this.timeout); - this.timeout = null; - } - this.done = true; - this.emit("done", error, this.processExitCode); - } - static HandleTimeout(state) { - if (state.done) { - return; - } - if (!state.processClosed && state.processExited) { - const message = `The STDIO streams did not close within ${state.delay / 1e3} seconds of the exit event from process '${state.toolPath}'. This may indicate a child process inherited the STDIO streams and has not yet exited.`; - state._debug(message); - } - state._setResult(); - } - } - return toolrunner; -} -var hasRequiredExec; -function requireExec() { - if (hasRequiredExec) return exec; - hasRequiredExec = 1; - var __createBinding = exec && exec.__createBinding || (Object.create ? (function(o, m, k, k2) { - if (k2 === void 0) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { - return m[k]; - } }); - }) : (function(o, m, k, k2) { - if (k2 === void 0) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = exec && exec.__setModuleDefault || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = exec && exec.__importStar || function(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) { - for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = exec && exec.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } + /** + * Take n bytes from the buffered Buffers + * @param {number} n + * @returns {Buffer|null} + */ + consume(n) { + if (n > this.#byteOffset) { + return null; + } else if (n === 0) { + return emptyBuffer; } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } + if (this.#buffers[0].length === n) { + this.#byteOffset -= this.#buffers[0].length; + return this.#buffers.shift(); } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + const buffer = Buffer.allocUnsafe(n); + let offset = 0; + while (offset !== n) { + const next = this.#buffers[0]; + const { length } = next; + if (length + offset === n) { + buffer.set(this.#buffers.shift(), offset); + break; + } else if (length + offset > n) { + buffer.set(next.subarray(0, n - offset), offset); + this.#buffers[0] = next.subarray(n - offset); + break; + } else { + buffer.set(this.#buffers.shift(), offset); + offset += next.length; + } } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exec, "__esModule", { value: true }); - exec.getExecOutput = exec.exec = void 0; - const string_decoder_1 = require$$6; - const tr = __importStar(requireToolrunner()); - function exec$1(commandLine, args, options) { - return __awaiter(this, void 0, void 0, function* () { - const commandArgs = tr.argStringToArray(commandLine); - if (commandArgs.length === 0) { - throw new Error(`Parameter 'commandLine' cannot be null or empty.`); + this.#byteOffset -= n; + return buffer; + } + parseCloseBody(onlyCode, data) { + let code; + if (data.length >= 2) { + code = data.readUInt16BE(0); } - const toolPath = commandArgs[0]; - args = commandArgs.slice(1).concat(args || []); - const runner = new tr.ToolRunner(toolPath, args, options); - return runner.exec(); - }); - } - exec.exec = exec$1; - function getExecOutput(commandLine, args, options) { - var _a2, _b; - return __awaiter(this, void 0, void 0, function* () { - let stdout = ""; - let stderr = ""; - const stdoutDecoder = new string_decoder_1.StringDecoder("utf8"); - const stderrDecoder = new string_decoder_1.StringDecoder("utf8"); - const originalStdoutListener = (_a2 = options === null || options === void 0 ? void 0 : options.listeners) === null || _a2 === void 0 ? void 0 : _a2.stdout; - const originalStdErrListener = (_b = options === null || options === void 0 ? void 0 : options.listeners) === null || _b === void 0 ? void 0 : _b.stderr; - const stdErrListener = (data) => { - stderr += stderrDecoder.write(data); - if (originalStdErrListener) { - originalStdErrListener(data); - } - }; - const stdOutListener = (data) => { - stdout += stdoutDecoder.write(data); - if (originalStdoutListener) { - originalStdoutListener(data); + if (onlyCode) { + if (!isValidStatusCode(code)) { + return null; } - }; - const listeners = Object.assign(Object.assign({}, options === null || options === void 0 ? void 0 : options.listeners), { stdout: stdOutListener, stderr: stdErrListener }); - const exitCode = yield exec$1(commandLine, args, Object.assign(Object.assign({}, options), { listeners })); - stdout += stdoutDecoder.end(); - stderr += stderrDecoder.end(); - return { - exitCode, - stdout, - stderr - }; - }); - } - exec.getExecOutput = getExecOutput; - return exec; -} -var hasRequiredPlatform; -function requirePlatform() { - if (hasRequiredPlatform) return platform; - hasRequiredPlatform = 1; - (function(exports$1) { - var __createBinding = platform && platform.__createBinding || (Object.create ? (function(o, m, k, k2) { - if (k2 === void 0) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { - return m[k]; - } }; + return { code }; } - Object.defineProperty(o, k2, desc); - }) : (function(o, m, k, k2) { - if (k2 === void 0) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = platform && platform.__setModuleDefault || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = platform && platform.__importStar || function(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) { - for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + let reason = data.subarray(2); + if (reason[0] === 239 && reason[1] === 187 && reason[2] === 191) { + reason = reason.subarray(3); } - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = platform && platform.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); + if (code !== void 0 && !isValidStatusCode(code)) { + return null; } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - var __importDefault = platform && platform.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; + try { + reason = new TextDecoder("utf-8", { fatal: true }).decode(reason); + } catch { + return null; + } + return { code, reason }; + } + get closingInfo() { + return this.#info.closeInfo; + } + } + receiver = { + ByteParser + }; + return receiver; +} +var websocket; +var hasRequiredWebsocket; +function requireWebsocket() { + if (hasRequiredWebsocket) return websocket; + hasRequiredWebsocket = 1; + const { webidl } = requireWebidl(); + const { DOMException: DOMException2 } = requireConstants$3(); + const { URLSerializer } = requireDataURL(); + const { getGlobalOrigin } = requireGlobal$1(); + const { staticPropertyDescriptors, states, opcodes, emptyBuffer } = requireConstants(); + const { + kWebSocketURL, + kReadyState, + kController, + kBinaryType, + kResponse, + kSentClose, + kByteParser + } = requireSymbols(); + const { isEstablished, isClosing, isValidSubprotocol, failWebsocketConnection, fireEvent } = requireUtil(); + const { establishWebSocketConnection } = requireConnection(); + const { WebsocketFrameSend } = requireFrame(); + const { ByteParser } = requireReceiver(); + const { kEnumerableProperty, isBlobLike } = requireUtil$6(); + const { getGlobalDispatcher } = requireGlobal(); + const { types } = require$$0$2; + let experimentalWarned = false; + class WebSocket extends EventTarget { + #events = { + open: null, + error: null, + close: null, + message: null }; - Object.defineProperty(exports$1, "__esModule", { value: true }); - exports$1.getDetails = exports$1.isLinux = exports$1.isMacOS = exports$1.isWindows = exports$1.arch = exports$1.platform = void 0; - const os_1 = __importDefault(require$$0); - const exec2 = __importStar(requireExec()); - const getWindowsInfo = () => __awaiter(void 0, void 0, void 0, function* () { - const { stdout: version } = yield exec2.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Version"', void 0, { - silent: true - }); - const { stdout: name } = yield exec2.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Caption"', void 0, { - silent: true - }); - return { - name: name.trim(), - version: version.trim() - }; - }); - const getMacOsInfo = () => __awaiter(void 0, void 0, void 0, function* () { - var _a2, _b, _c, _d; - const { stdout } = yield exec2.getExecOutput("sw_vers", void 0, { - silent: true - }); - const version = (_b = (_a2 = stdout.match(/ProductVersion:\s*(.+)/)) === null || _a2 === void 0 ? void 0 : _a2[1]) !== null && _b !== void 0 ? _b : ""; - const name = (_d = (_c = stdout.match(/ProductName:\s*(.+)/)) === null || _c === void 0 ? void 0 : _c[1]) !== null && _d !== void 0 ? _d : ""; - return { - name, - version - }; - }); - const getLinuxInfo = () => __awaiter(void 0, void 0, void 0, function* () { - const { stdout } = yield exec2.getExecOutput("lsb_release", ["-i", "-r", "-s"], { - silent: true - }); - const [name, version] = stdout.trim().split("\n"); - return { - name, - version - }; - }); - exports$1.platform = os_1.default.platform(); - exports$1.arch = os_1.default.arch(); - exports$1.isWindows = exports$1.platform === "win32"; - exports$1.isMacOS = exports$1.platform === "darwin"; - exports$1.isLinux = exports$1.platform === "linux"; - function getDetails() { - return __awaiter(this, void 0, void 0, function* () { - return Object.assign(Object.assign({}, yield exports$1.isWindows ? getWindowsInfo() : exports$1.isMacOS ? getMacOsInfo() : getLinuxInfo()), { - platform: exports$1.platform, - arch: exports$1.arch, - isWindows: exports$1.isWindows, - isMacOS: exports$1.isMacOS, - isLinux: exports$1.isLinux + #bufferedAmount = 0; + #protocol = ""; + #extensions = ""; + /** + * @param {string} url + * @param {string|string[]} protocols + */ + constructor(url, protocols = []) { + super(); + webidl.argumentLengthCheck(arguments, 1, { header: "WebSocket constructor" }); + if (!experimentalWarned) { + experimentalWarned = true; + process.emitWarning("WebSockets are experimental, expect them to change at any time.", { + code: "UNDICI-WS" }); - }); - } - exports$1.getDetails = getDetails; - })(platform); - return platform; -} -var hasRequiredCore; -function requireCore() { - if (hasRequiredCore) return core$1; - hasRequiredCore = 1; - (function(exports$1) { - var __createBinding = core$1 && core$1.__createBinding || (Object.create ? (function(o, m, k, k2) { - if (k2 === void 0) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { - return m[k]; - } }; } - Object.defineProperty(o, k2, desc); - }) : (function(o, m, k, k2) { - if (k2 === void 0) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = core$1 && core$1.__setModuleDefault || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = core$1 && core$1.__importStar || function(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) { - for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + const options = webidl.converters["DOMString or sequence or WebSocketInit"](protocols); + url = webidl.converters.USVString(url); + protocols = options.protocols; + const baseURL = getGlobalOrigin(); + let urlRecord; + try { + urlRecord = new URL(url, baseURL); + } catch (e) { + throw new DOMException2(e, "SyntaxError"); } - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = core$1 && core$1.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); + if (urlRecord.protocol === "http:") { + urlRecord.protocol = "ws:"; + } else if (urlRecord.protocol === "https:") { + urlRecord.protocol = "wss:"; } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } + if (urlRecord.protocol !== "ws:" && urlRecord.protocol !== "wss:") { + throw new DOMException2( + `Expected a ws: or wss: protocol, got ${urlRecord.protocol}`, + "SyntaxError" + ); + } + if (urlRecord.hash || urlRecord.href.endsWith("#")) { + throw new DOMException2("Got fragment", "SyntaxError"); + } + if (typeof protocols === "string") { + protocols = [protocols]; + } + if (protocols.length !== new Set(protocols.map((p) => p.toLowerCase())).size) { + throw new DOMException2("Invalid Sec-WebSocket-Protocol value", "SyntaxError"); + } + if (protocols.length > 0 && !protocols.every((p) => isValidSubprotocol(p))) { + throw new DOMException2("Invalid Sec-WebSocket-Protocol value", "SyntaxError"); + } + this[kWebSocketURL] = new URL(urlRecord.href); + this[kController] = establishWebSocketConnection( + urlRecord, + protocols, + this, + (response2) => this.#onConnectionEstablished(response2), + options + ); + this[kReadyState] = WebSocket.CONNECTING; + this[kBinaryType] = "blob"; + } + /** + * @see https://websockets.spec.whatwg.org/#dom-websocket-close + * @param {number|undefined} code + * @param {string|undefined} reason + */ + close(code = void 0, reason = void 0) { + webidl.brandCheck(this, WebSocket); + if (code !== void 0) { + code = webidl.converters["unsigned short"](code, { clamp: true }); + } + if (reason !== void 0) { + reason = webidl.converters.USVString(reason); + } + if (code !== void 0) { + if (code !== 1e3 && (code < 3e3 || code > 4999)) { + throw new DOMException2("invalid code", "InvalidAccessError"); } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + let reasonByteLength = 0; + if (reason !== void 0) { + reasonByteLength = Buffer.byteLength(reason); + if (reasonByteLength > 123) { + throw new DOMException2( + `Reason must be less than 123 bytes; received ${reasonByteLength}`, + "SyntaxError" + ); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports$1, "__esModule", { value: true }); - exports$1.platform = exports$1.toPlatformPath = exports$1.toWin32Path = exports$1.toPosixPath = exports$1.markdownSummary = exports$1.summary = exports$1.getIDToken = exports$1.getState = exports$1.saveState = exports$1.group = exports$1.endGroup = exports$1.startGroup = exports$1.info = exports$1.notice = exports$1.warning = exports$1.error = exports$1.debug = exports$1.isDebug = exports$1.setFailed = exports$1.setCommandEcho = exports$1.setOutput = exports$1.getBooleanInput = exports$1.getMultilineInput = exports$1.getInput = exports$1.addPath = exports$1.setSecret = exports$1.exportVariable = exports$1.ExitCode = void 0; - const command_1 = requireCommand(); - const file_command_1 = requireFileCommand(); - const utils_1 = requireUtils$3(); - const os = __importStar(require$$0); - const path = __importStar(require$$1$5); - const oidc_utils_1 = requireOidcUtils(); - var ExitCode; - (function(ExitCode2) { - ExitCode2[ExitCode2["Success"] = 0] = "Success"; - ExitCode2[ExitCode2["Failure"] = 1] = "Failure"; - })(ExitCode || (exports$1.ExitCode = ExitCode = {})); - function exportVariable(name, val) { - const convertedVal = (0, utils_1.toCommandValue)(val); - process.env[name] = convertedVal; - const filePath = process.env["GITHUB_ENV"] || ""; - if (filePath) { - return (0, file_command_1.issueFileCommand)("ENV", (0, file_command_1.prepareKeyValueMessage)(name, val)); } - (0, command_1.issueCommand)("set-env", { name }, convertedVal); - } - exports$1.exportVariable = exportVariable; - function setSecret(secret) { - (0, command_1.issueCommand)("add-mask", {}, secret); - } - exports$1.setSecret = setSecret; - function addPath(inputPath) { - const filePath = process.env["GITHUB_PATH"] || ""; - if (filePath) { - (0, file_command_1.issueFileCommand)("PATH", inputPath); + if (this[kReadyState] === WebSocket.CLOSING || this[kReadyState] === WebSocket.CLOSED) ; + else if (!isEstablished(this)) { + failWebsocketConnection(this, "Connection was closed before it was established."); + this[kReadyState] = WebSocket.CLOSING; + } else if (!isClosing(this)) { + const frame2 = new WebsocketFrameSend(); + if (code !== void 0 && reason === void 0) { + frame2.frameData = Buffer.allocUnsafe(2); + frame2.frameData.writeUInt16BE(code, 0); + } else if (code !== void 0 && reason !== void 0) { + frame2.frameData = Buffer.allocUnsafe(2 + reasonByteLength); + frame2.frameData.writeUInt16BE(code, 0); + frame2.frameData.write(reason, 2, "utf-8"); + } else { + frame2.frameData = emptyBuffer; + } + const socket = this[kResponse].socket; + socket.write(frame2.createFrame(opcodes.CLOSE), (err) => { + if (!err) { + this[kSentClose] = true; + } + }); + this[kReadyState] = states.CLOSING; } else { - (0, command_1.issueCommand)("add-path", {}, inputPath); + this[kReadyState] = WebSocket.CLOSING; } - process.env["PATH"] = `${inputPath}${path.delimiter}${process.env["PATH"]}`; } - exports$1.addPath = addPath; - function getInput(name, options) { - const val = process.env[`INPUT_${name.replace(/ /g, "_").toUpperCase()}`] || ""; - if (options && options.required && !val) { - throw new Error(`Input required and not supplied: ${name}`); - } - if (options && options.trimWhitespace === false) { - return val; + /** + * @see https://websockets.spec.whatwg.org/#dom-websocket-send + * @param {NodeJS.TypedArray|ArrayBuffer|Blob|string} data + */ + send(data) { + webidl.brandCheck(this, WebSocket); + webidl.argumentLengthCheck(arguments, 1, { header: "WebSocket.send" }); + data = webidl.converters.WebSocketSendData(data); + if (this[kReadyState] === WebSocket.CONNECTING) { + throw new DOMException2("Sent before connected.", "InvalidStateError"); } - return val.trim(); - } - exports$1.getInput = getInput; - function getMultilineInput(name, options) { - const inputs = getInput(name, options).split("\n").filter((x) => x !== ""); - if (options && options.trimWhitespace === false) { - return inputs; + if (!isEstablished(this) || isClosing(this)) { + return; } - return inputs.map((input) => input.trim()); - } - exports$1.getMultilineInput = getMultilineInput; - function getBooleanInput(name, options) { - const trueValue = ["true", "True", "TRUE"]; - const falseValue = ["false", "False", "FALSE"]; - const val = getInput(name, options); - if (trueValue.includes(val)) - return true; - if (falseValue.includes(val)) - return false; - throw new TypeError(`Input does not meet YAML 1.2 "Core Schema" specification: ${name} -Support boolean input list: \`true | True | TRUE | false | False | FALSE\``); - } - exports$1.getBooleanInput = getBooleanInput; - function setOutput(name, value) { - const filePath = process.env["GITHUB_OUTPUT"] || ""; - if (filePath) { - return (0, file_command_1.issueFileCommand)("OUTPUT", (0, file_command_1.prepareKeyValueMessage)(name, value)); + const socket = this[kResponse].socket; + if (typeof data === "string") { + const value = Buffer.from(data); + const frame2 = new WebsocketFrameSend(value); + const buffer = frame2.createFrame(opcodes.TEXT); + this.#bufferedAmount += value.byteLength; + socket.write(buffer, () => { + this.#bufferedAmount -= value.byteLength; + }); + } else if (types.isArrayBuffer(data)) { + const value = Buffer.from(data); + const frame2 = new WebsocketFrameSend(value); + const buffer = frame2.createFrame(opcodes.BINARY); + this.#bufferedAmount += value.byteLength; + socket.write(buffer, () => { + this.#bufferedAmount -= value.byteLength; + }); + } else if (ArrayBuffer.isView(data)) { + const ab = Buffer.from(data, data.byteOffset, data.byteLength); + const frame2 = new WebsocketFrameSend(ab); + const buffer = frame2.createFrame(opcodes.BINARY); + this.#bufferedAmount += ab.byteLength; + socket.write(buffer, () => { + this.#bufferedAmount -= ab.byteLength; + }); + } else if (isBlobLike(data)) { + const frame2 = new WebsocketFrameSend(); + data.arrayBuffer().then((ab) => { + const value = Buffer.from(ab); + frame2.frameData = value; + const buffer = frame2.createFrame(opcodes.BINARY); + this.#bufferedAmount += value.byteLength; + socket.write(buffer, () => { + this.#bufferedAmount -= value.byteLength; + }); + }); } - process.stdout.write(os.EOL); - (0, command_1.issueCommand)("set-output", { name }, (0, utils_1.toCommandValue)(value)); } - exports$1.setOutput = setOutput; - function setCommandEcho(enabled) { - (0, command_1.issue)("echo", enabled ? "on" : "off"); + get readyState() { + webidl.brandCheck(this, WebSocket); + return this[kReadyState]; } - exports$1.setCommandEcho = setCommandEcho; - function setFailed(message) { - process.exitCode = ExitCode.Failure; - error(message); + get bufferedAmount() { + webidl.brandCheck(this, WebSocket); + return this.#bufferedAmount; } - exports$1.setFailed = setFailed; - function isDebug() { - return process.env["RUNNER_DEBUG"] === "1"; + get url() { + webidl.brandCheck(this, WebSocket); + return URLSerializer(this[kWebSocketURL]); } - exports$1.isDebug = isDebug; - function debug(message) { - (0, command_1.issueCommand)("debug", {}, message); + get extensions() { + webidl.brandCheck(this, WebSocket); + return this.#extensions; } - exports$1.debug = debug; - function error(message, properties = {}) { - (0, command_1.issueCommand)("error", (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message); + get protocol() { + webidl.brandCheck(this, WebSocket); + return this.#protocol; } - exports$1.error = error; - function warning(message, properties = {}) { - (0, command_1.issueCommand)("warning", (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message); + get onopen() { + webidl.brandCheck(this, WebSocket); + return this.#events.open; } - exports$1.warning = warning; - function notice(message, properties = {}) { - (0, command_1.issueCommand)("notice", (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message); + set onopen(fn) { + webidl.brandCheck(this, WebSocket); + if (this.#events.open) { + this.removeEventListener("open", this.#events.open); + } + if (typeof fn === "function") { + this.#events.open = fn; + this.addEventListener("open", fn); + } else { + this.#events.open = null; + } } - exports$1.notice = notice; - function info(message) { - process.stdout.write(message + os.EOL); + get onerror() { + webidl.brandCheck(this, WebSocket); + return this.#events.error; } - exports$1.info = info; - function startGroup(name) { - (0, command_1.issue)("group", name); + set onerror(fn) { + webidl.brandCheck(this, WebSocket); + if (this.#events.error) { + this.removeEventListener("error", this.#events.error); + } + if (typeof fn === "function") { + this.#events.error = fn; + this.addEventListener("error", fn); + } else { + this.#events.error = null; + } } - exports$1.startGroup = startGroup; - function endGroup() { - (0, command_1.issue)("endgroup"); + get onclose() { + webidl.brandCheck(this, WebSocket); + return this.#events.close; } - exports$1.endGroup = endGroup; - function group(name, fn) { - return __awaiter(this, void 0, void 0, function* () { - startGroup(name); - let result; - try { - result = yield fn(); - } finally { - endGroup(); - } - return result; - }); + set onclose(fn) { + webidl.brandCheck(this, WebSocket); + if (this.#events.close) { + this.removeEventListener("close", this.#events.close); + } + if (typeof fn === "function") { + this.#events.close = fn; + this.addEventListener("close", fn); + } else { + this.#events.close = null; + } } - exports$1.group = group; - function saveState(name, value) { - const filePath = process.env["GITHUB_STATE"] || ""; - if (filePath) { - return (0, file_command_1.issueFileCommand)("STATE", (0, file_command_1.prepareKeyValueMessage)(name, value)); + get onmessage() { + webidl.brandCheck(this, WebSocket); + return this.#events.message; + } + set onmessage(fn) { + webidl.brandCheck(this, WebSocket); + if (this.#events.message) { + this.removeEventListener("message", this.#events.message); + } + if (typeof fn === "function") { + this.#events.message = fn; + this.addEventListener("message", fn); + } else { + this.#events.message = null; } - (0, command_1.issueCommand)("save-state", { name }, (0, utils_1.toCommandValue)(value)); } - exports$1.saveState = saveState; - function getState(name) { - return process.env[`STATE_${name}`] || ""; + get binaryType() { + webidl.brandCheck(this, WebSocket); + return this[kBinaryType]; } - exports$1.getState = getState; - function getIDToken(aud) { - return __awaiter(this, void 0, void 0, function* () { - return yield oidc_utils_1.OidcClient.getIDToken(aud); - }); + set binaryType(type) { + webidl.brandCheck(this, WebSocket); + if (type !== "blob" && type !== "arraybuffer") { + this[kBinaryType] = "blob"; + } else { + this[kBinaryType] = type; + } } - exports$1.getIDToken = getIDToken; - var summary_1 = requireSummary(); - Object.defineProperty(exports$1, "summary", { enumerable: true, get: function() { - return summary_1.summary; - } }); - var summary_2 = requireSummary(); - Object.defineProperty(exports$1, "markdownSummary", { enumerable: true, get: function() { - return summary_2.markdownSummary; - } }); - var path_utils_1 = requirePathUtils(); - Object.defineProperty(exports$1, "toPosixPath", { enumerable: true, get: function() { - return path_utils_1.toPosixPath; - } }); - Object.defineProperty(exports$1, "toWin32Path", { enumerable: true, get: function() { - return path_utils_1.toWin32Path; - } }); - Object.defineProperty(exports$1, "toPlatformPath", { enumerable: true, get: function() { - return path_utils_1.toPlatformPath; - } }); - exports$1.platform = __importStar(requirePlatform()); - })(core$1); - return core$1; -} -var coreExports = requireCore(); -const core = /* @__PURE__ */ getDefaultExportFromCjs(coreExports); -var github$1 = {}; -var context = {}; -var hasRequiredContext; -function requireContext() { - if (hasRequiredContext) return context; - hasRequiredContext = 1; - Object.defineProperty(context, "__esModule", { value: true }); - context.Context = void 0; - const fs_1 = require$$1; - const os_1 = require$$0; - class Context { /** - * Hydrate the context from the environment + * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol */ - constructor() { - var _a2, _b, _c; - this.payload = {}; - if (process.env.GITHUB_EVENT_PATH) { - if ((0, fs_1.existsSync)(process.env.GITHUB_EVENT_PATH)) { - this.payload = JSON.parse((0, fs_1.readFileSync)(process.env.GITHUB_EVENT_PATH, { encoding: "utf8" })); - } else { - const path = process.env.GITHUB_EVENT_PATH; - process.stdout.write(`GITHUB_EVENT_PATH ${path} does not exist${os_1.EOL}`); - } + #onConnectionEstablished(response2) { + this[kResponse] = response2; + const parser = new ByteParser(this); + parser.on("drain", function onParserDrain() { + this.ws[kResponse].socket.resume(); + }); + response2.socket.ws = this; + this[kByteParser] = parser; + this[kReadyState] = states.OPEN; + const extensions = response2.headersList.get("sec-websocket-extensions"); + if (extensions !== null) { + this.#extensions = extensions; + } + const protocol = response2.headersList.get("sec-websocket-protocol"); + if (protocol !== null) { + this.#protocol = protocol; + } + fireEvent("open", this); + } + } + WebSocket.CONNECTING = WebSocket.prototype.CONNECTING = states.CONNECTING; + WebSocket.OPEN = WebSocket.prototype.OPEN = states.OPEN; + WebSocket.CLOSING = WebSocket.prototype.CLOSING = states.CLOSING; + WebSocket.CLOSED = WebSocket.prototype.CLOSED = states.CLOSED; + Object.defineProperties(WebSocket.prototype, { + CONNECTING: staticPropertyDescriptors, + OPEN: staticPropertyDescriptors, + CLOSING: staticPropertyDescriptors, + CLOSED: staticPropertyDescriptors, + url: kEnumerableProperty, + readyState: kEnumerableProperty, + bufferedAmount: kEnumerableProperty, + onopen: kEnumerableProperty, + onerror: kEnumerableProperty, + onclose: kEnumerableProperty, + close: kEnumerableProperty, + onmessage: kEnumerableProperty, + binaryType: kEnumerableProperty, + send: kEnumerableProperty, + extensions: kEnumerableProperty, + protocol: kEnumerableProperty, + [Symbol.toStringTag]: { + value: "WebSocket", + writable: false, + enumerable: false, + configurable: true + } + }); + Object.defineProperties(WebSocket, { + CONNECTING: staticPropertyDescriptors, + OPEN: staticPropertyDescriptors, + CLOSING: staticPropertyDescriptors, + CLOSED: staticPropertyDescriptors + }); + webidl.converters["sequence"] = webidl.sequenceConverter( + webidl.converters.DOMString + ); + webidl.converters["DOMString or sequence"] = function(V) { + if (webidl.util.Type(V) === "Object" && Symbol.iterator in V) { + return webidl.converters["sequence"](V); + } + return webidl.converters.DOMString(V); + }; + webidl.converters.WebSocketInit = webidl.dictionaryConverter([ + { + key: "protocols", + converter: webidl.converters["DOMString or sequence"], + get defaultValue() { + return []; } - this.eventName = process.env.GITHUB_EVENT_NAME; - this.sha = process.env.GITHUB_SHA; - this.ref = process.env.GITHUB_REF; - this.workflow = process.env.GITHUB_WORKFLOW; - this.action = process.env.GITHUB_ACTION; - this.actor = process.env.GITHUB_ACTOR; - this.job = process.env.GITHUB_JOB; - this.runAttempt = parseInt(process.env.GITHUB_RUN_ATTEMPT, 10); - this.runNumber = parseInt(process.env.GITHUB_RUN_NUMBER, 10); - this.runId = parseInt(process.env.GITHUB_RUN_ID, 10); - this.apiUrl = (_a2 = process.env.GITHUB_API_URL) !== null && _a2 !== void 0 ? _a2 : `https://api.github.com`; - this.serverUrl = (_b = process.env.GITHUB_SERVER_URL) !== null && _b !== void 0 ? _b : `https://github.com`; - this.graphqlUrl = (_c = process.env.GITHUB_GRAPHQL_URL) !== null && _c !== void 0 ? _c : `https://api.github.com/graphql`; + }, + { + key: "dispatcher", + converter: (V) => V, + get defaultValue() { + return getGlobalDispatcher(); + } + }, + { + key: "headers", + converter: webidl.nullableConverter(webidl.converters.HeadersInit) } - get issue() { - const payload = this.payload; - return Object.assign(Object.assign({}, this.repo), { number: (payload.issue || payload.pull_request || payload).number }); + ]); + webidl.converters["DOMString or sequence or WebSocketInit"] = function(V) { + if (webidl.util.Type(V) === "Object" && !(Symbol.iterator in V)) { + return webidl.converters.WebSocketInit(V); } - get repo() { - if (process.env.GITHUB_REPOSITORY) { - const [owner, repo] = process.env.GITHUB_REPOSITORY.split("/"); - return { owner, repo }; + return { protocols: webidl.converters["DOMString or sequence"](V) }; + }; + webidl.converters.WebSocketSendData = function(V) { + if (webidl.util.Type(V) === "Object") { + if (isBlobLike(V)) { + return webidl.converters.Blob(V, { strict: false }); } - if (this.payload.repository) { - return { - owner: this.payload.repository.owner.login, - repo: this.payload.repository.name - }; + if (ArrayBuffer.isView(V) || types.isAnyArrayBuffer(V)) { + return webidl.converters.BufferSource(V); } - throw new Error("context.repo requires a GITHUB_REPOSITORY environment variable like 'owner/repo'"); } + return webidl.converters.USVString(V); + }; + websocket = { + WebSocket + }; + return websocket; +} +var hasRequiredUndici; +function requireUndici() { + if (hasRequiredUndici) return undici; + hasRequiredUndici = 1; + const Client = requireClient(); + const Dispatcher = requireDispatcher(); + const errors2 = requireErrors(); + const Pool = requirePool(); + const BalancedPool = requireBalancedPool(); + const Agent = requireAgent(); + const util2 = requireUtil$6(); + const { InvalidArgumentError } = errors2; + const api2 = requireApi(); + const buildConnector = requireConnect(); + const MockClient = requireMockClient(); + const MockAgent = requireMockAgent(); + const MockPool = requireMockPool(); + const mockErrors2 = requireMockErrors(); + const ProxyAgent = requireProxyAgent(); + const RetryHandler = requireRetryHandler(); + const { getGlobalDispatcher, setGlobalDispatcher } = requireGlobal(); + const DecoratorHandler = requireDecoratorHandler(); + const RedirectHandler = requireRedirectHandler(); + const createRedirectInterceptor = requireRedirectInterceptor(); + let hasCrypto; + try { + require("crypto"); + hasCrypto = true; + } catch { + hasCrypto = false; } - context.Context = Context; - return context; + Object.assign(Dispatcher.prototype, api2); + undici.Dispatcher = Dispatcher; + undici.Client = Client; + undici.Pool = Pool; + undici.BalancedPool = BalancedPool; + undici.Agent = Agent; + undici.ProxyAgent = ProxyAgent; + undici.RetryHandler = RetryHandler; + undici.DecoratorHandler = DecoratorHandler; + undici.RedirectHandler = RedirectHandler; + undici.createRedirectInterceptor = createRedirectInterceptor; + undici.buildConnector = buildConnector; + undici.errors = errors2; + function makeDispatcher(fn) { + return (url, opts, handler2) => { + if (typeof opts === "function") { + handler2 = opts; + opts = null; + } + if (!url || typeof url !== "string" && typeof url !== "object" && !(url instanceof URL)) { + throw new InvalidArgumentError("invalid url"); + } + if (opts != null && typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + if (opts && opts.path != null) { + if (typeof opts.path !== "string") { + throw new InvalidArgumentError("invalid opts.path"); + } + let path = opts.path; + if (!opts.path.startsWith("/")) { + path = `/${path}`; + } + url = new URL(util2.parseOrigin(url).origin + path); + } else { + if (!opts) { + opts = typeof url === "object" ? url : {}; + } + url = util2.parseURL(url); + } + const { agent: agent2, dispatcher: dispatcher2 = getGlobalDispatcher() } = opts; + if (agent2) { + throw new InvalidArgumentError("unsupported opts.agent. Did you mean opts.client?"); + } + return fn.call(dispatcher2, { + ...opts, + origin: url.origin, + path: url.search ? `${url.pathname}${url.search}` : url.pathname, + method: opts.method || (opts.body ? "PUT" : "GET") + }, handler2); + }; + } + undici.setGlobalDispatcher = setGlobalDispatcher; + undici.getGlobalDispatcher = getGlobalDispatcher; + if (util2.nodeMajor > 16 || util2.nodeMajor === 16 && util2.nodeMinor >= 8) { + let fetchImpl = null; + undici.fetch = async function fetch(resource) { + if (!fetchImpl) { + fetchImpl = requireFetch().fetch; + } + try { + return await fetchImpl(...arguments); + } catch (err) { + if (typeof err === "object") { + Error.captureStackTrace(err, this); + } + throw err; + } + }; + undici.Headers = requireHeaders().Headers; + undici.Response = requireResponse().Response; + undici.Request = requireRequest().Request; + undici.FormData = requireFormdata().FormData; + undici.File = requireFile().File; + undici.FileReader = requireFilereader().FileReader; + const { setGlobalOrigin, getGlobalOrigin } = requireGlobal$1(); + undici.setGlobalOrigin = setGlobalOrigin; + undici.getGlobalOrigin = getGlobalOrigin; + const { CacheStorage } = requireCachestorage(); + const { kConstruct } = requireSymbols$1(); + undici.caches = new CacheStorage(kConstruct); + } + if (util2.nodeMajor >= 16) { + const { deleteCookie, getCookies, getSetCookies, setCookie } = requireCookies(); + undici.deleteCookie = deleteCookie; + undici.getCookies = getCookies; + undici.getSetCookies = getSetCookies; + undici.setCookie = setCookie; + const { parseMIMEType, serializeAMimeType } = requireDataURL(); + undici.parseMIMEType = parseMIMEType; + undici.serializeAMimeType = serializeAMimeType; + } + if (util2.nodeMajor >= 18 && hasCrypto) { + const { WebSocket } = requireWebsocket(); + undici.WebSocket = WebSocket; + } + undici.request = makeDispatcher(api2.request); + undici.stream = makeDispatcher(api2.stream); + undici.pipeline = makeDispatcher(api2.pipeline); + undici.connect = makeDispatcher(api2.connect); + undici.upgrade = makeDispatcher(api2.upgrade); + undici.MockClient = MockClient; + undici.MockPool = MockPool; + undici.MockAgent = MockAgent; + undici.mockErrors = mockErrors2; + return undici; } -var utils$1 = {}; -var utils = {}; var hasRequiredUtils$1; function requireUtils$1() { - if (hasRequiredUtils$1) return utils; + if (hasRequiredUtils$1) return utils$1; hasRequiredUtils$1 = 1; - var __createBinding = utils && utils.__createBinding || (Object.create ? (function(o, m, k, k2) { + var __createBinding = utils$1 && utils$1.__createBinding || (Object.create ? (function(o, m, k, k2) { if (k2 === void 0) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { @@ -19916,21 +38343,31 @@ function requireUtils$1() { if (k2 === void 0) k2 = k; o[k2] = m[k]; })); - var __setModuleDefault = utils && utils.__setModuleDefault || (Object.create ? (function(o, v) { + var __setModuleDefault = utils$1 && utils$1.__setModuleDefault || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); - var __importStar = utils && utils.__importStar || function(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) { - for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = utils && utils.__awaiter || function(thisArg, _arguments, P, generator) { + var __importStar = utils$1 && utils$1.__importStar || /* @__PURE__ */ (function() { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function(o2) { + var ar = []; + for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + } + __setModuleDefault(result, mod); + return result; + }; + })(); + var __awaiter = utils$1 && utils$1.__awaiter || function(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function(resolve) { resolve(value); @@ -19957,8 +38394,12 @@ function requireUtils$1() { step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; - Object.defineProperty(utils, "__esModule", { value: true }); - utils.getApiBaseUrl = utils.getProxyFetch = utils.getProxyAgentDispatcher = utils.getProxyAgent = utils.getAuthString = void 0; + Object.defineProperty(utils$1, "__esModule", { value: true }); + utils$1.getAuthString = getAuthString; + utils$1.getProxyAgent = getProxyAgent; + utils$1.getProxyAgentDispatcher = getProxyAgentDispatcher; + utils$1.getProxyFetch = getProxyFetch; + utils$1.getApiBaseUrl = getApiBaseUrl; const httpClient = __importStar(requireLib()); const undici_1 = requireUndici(); function getAuthString(token, options) { @@ -19969,17 +38410,14 @@ function requireUtils$1() { } return typeof options.auth === "string" ? options.auth : `token ${token}`; } - utils.getAuthString = getAuthString; function getProxyAgent(destinationUrl) { const hc = new httpClient.HttpClient(); return hc.getAgent(destinationUrl); } - utils.getProxyAgent = getProxyAgent; function getProxyAgentDispatcher(destinationUrl) { const hc = new httpClient.HttpClient(); return hc.getAgentDispatcher(destinationUrl); } - utils.getProxyAgentDispatcher = getProxyAgentDispatcher; function getProxyFetch(destinationUrl) { const httpDispatcher = getProxyAgentDispatcher(destinationUrl); const proxyFetch = (url, opts) => __awaiter(this, void 0, void 0, function* () { @@ -19987,12 +38425,10 @@ function requireUtils$1() { }); return proxyFetch; } - utils.getProxyFetch = getProxyFetch; function getApiBaseUrl() { return process.env["GITHUB_API_URL"] || "https://api.github.com"; } - utils.getApiBaseUrl = getApiBaseUrl; - return utils; + return utils$1; } function getUserAgent() { if (typeof navigator === "object" && "userAgent" in navigator) { @@ -23544,10 +41980,10 @@ const distWeb = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope const require$$4 = /* @__PURE__ */ getAugmentedNamespace(distWeb); var hasRequiredUtils; function requireUtils() { - if (hasRequiredUtils) return utils$1; + if (hasRequiredUtils) return utils$2; hasRequiredUtils = 1; (function(exports$1) { - var __createBinding = utils$1 && utils$1.__createBinding || (Object.create ? (function(o, m, k, k2) { + var __createBinding = utils$2 && utils$2.__createBinding || (Object.create ? (function(o, m, k, k2) { if (k2 === void 0) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { @@ -23560,22 +41996,33 @@ function requireUtils() { if (k2 === void 0) k2 = k; o[k2] = m[k]; })); - var __setModuleDefault = utils$1 && utils$1.__setModuleDefault || (Object.create ? (function(o, v) { + var __setModuleDefault = utils$2 && utils$2.__setModuleDefault || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); - var __importStar = utils$1 && utils$1.__importStar || function(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) { - for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; + var __importStar = utils$2 && utils$2.__importStar || /* @__PURE__ */ (function() { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function(o2) { + var ar = []; + for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + } + __setModuleDefault(result, mod); + return result; + }; + })(); Object.defineProperty(exports$1, "__esModule", { value: true }); - exports$1.getOctokitOptions = exports$1.GitHub = exports$1.defaults = exports$1.context = void 0; + exports$1.GitHub = exports$1.defaults = exports$1.context = void 0; + exports$1.getOctokitOptions = getOctokitOptions; const Context = __importStar(requireContext()); const Utils = __importStar(requireUtils$1()); const core_1 = require$$2; @@ -23599,9 +42046,8 @@ function requireUtils() { } return opts; } - exports$1.getOctokitOptions = getOctokitOptions; - })(utils$1); - return utils$1; + })(utils$2); + return utils$2; } var hasRequiredGithub; function requireGithub() { @@ -23625,17 +42071,28 @@ function requireGithub() { }) : function(o, v) { o["default"] = v; }); - var __importStar = github$1 && github$1.__importStar || function(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) { - for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; + var __importStar = github$1 && github$1.__importStar || /* @__PURE__ */ (function() { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function(o2) { + var ar = []; + for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + } + __setModuleDefault(result, mod); + return result; + }; + })(); Object.defineProperty(github$1, "__esModule", { value: true }); - github$1.getOctokit = github$1.context = void 0; + github$1.context = void 0; + github$1.getOctokit = getOctokit; const Context = __importStar(requireContext()); const utils_1 = requireUtils(); github$1.context = new Context.Context(); @@ -23643,7 +42100,6 @@ function requireGithub() { const GitHubWithPlugins = utils_1.GitHub.plugin(...additionalPlugins); return new GitHubWithPlugins((0, utils_1.getOctokitOptions)(token, options)); } - github$1.getOctokit = getOctokit; return github$1; } var githubExports = requireGithub(); @@ -23743,4 +42199,4 @@ try { const displayedError = error instanceof Error || typeof error === "string" ? error : JSON.stringify(error); core.setFailed(displayedError); } -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AYWN0aW9ucytjb3JlQDEuMTEuMS9ub2RlX21vZHVsZXMvQGFjdGlvbnMvY29yZS9saWIvdXRpbHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGFjdGlvbnMrY29yZUAxLjExLjEvbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2NvcmUvbGliL2NvbW1hbmQuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGFjdGlvbnMrY29yZUAxLjExLjEvbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2NvcmUvbGliL2ZpbGUtY29tbWFuZC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AYWN0aW9ucytodHRwLWNsaWVudEAyLjIuMy9ub2RlX21vZHVsZXMvQGFjdGlvbnMvaHR0cC1jbGllbnQvbGliL3Byb3h5LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3R1bm5lbEAwLjAuNi9ub2RlX21vZHVsZXMvdHVubmVsL2xpYi90dW5uZWwuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdHVubmVsQDAuMC42L25vZGVfbW9kdWxlcy90dW5uZWwvaW5kZXguanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jb3JlL3N5bWJvbHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jb3JlL2Vycm9ycy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2NvcmUvY29uc3RhbnRzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY29yZS91dGlsLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvdGltZXJzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmYXN0aWZ5K2J1c2JveUAyLjEuMS9ub2RlX21vZHVsZXMvQGZhc3RpZnkvYnVzYm95L2RlcHMvc3RyZWFtc2VhcmNoL3NibWguanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZhc3RpZnkrYnVzYm95QDIuMS4xL25vZGVfbW9kdWxlcy9AZmFzdGlmeS9idXNib3kvZGVwcy9kaWNlci9saWIvUGFydFN0cmVhbS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmFzdGlmeStidXNib3lAMi4xLjEvbm9kZV9tb2R1bGVzL0BmYXN0aWZ5L2J1c2JveS9saWIvdXRpbHMvZ2V0TGltaXQuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZhc3RpZnkrYnVzYm95QDIuMS4xL25vZGVfbW9kdWxlcy9AZmFzdGlmeS9idXNib3kvZGVwcy9kaWNlci9saWIvSGVhZGVyUGFyc2VyLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmYXN0aWZ5K2J1c2JveUAyLjEuMS9ub2RlX21vZHVsZXMvQGZhc3RpZnkvYnVzYm95L2RlcHMvZGljZXIvbGliL0RpY2VyLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmYXN0aWZ5K2J1c2JveUAyLjEuMS9ub2RlX21vZHVsZXMvQGZhc3RpZnkvYnVzYm95L2xpYi91dGlscy9kZWNvZGVUZXh0LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmYXN0aWZ5K2J1c2JveUAyLjEuMS9ub2RlX21vZHVsZXMvQGZhc3RpZnkvYnVzYm95L2xpYi91dGlscy9wYXJzZVBhcmFtcy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmFzdGlmeStidXNib3lAMi4xLjEvbm9kZV9tb2R1bGVzL0BmYXN0aWZ5L2J1c2JveS9saWIvdXRpbHMvYmFzZW5hbWUuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZhc3RpZnkrYnVzYm95QDIuMS4xL25vZGVfbW9kdWxlcy9AZmFzdGlmeS9idXNib3kvbGliL3R5cGVzL211bHRpcGFydC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmFzdGlmeStidXNib3lAMi4xLjEvbm9kZV9tb2R1bGVzL0BmYXN0aWZ5L2J1c2JveS9saWIvdXRpbHMvRGVjb2Rlci5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmFzdGlmeStidXNib3lAMi4xLjEvbm9kZV9tb2R1bGVzL0BmYXN0aWZ5L2J1c2JveS9saWIvdHlwZXMvdXJsZW5jb2RlZC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmFzdGlmeStidXNib3lAMi4xLjEvbm9kZV9tb2R1bGVzL0BmYXN0aWZ5L2J1c2JveS9saWIvbWFpbi5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL2NvbnN0YW50cy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL2dsb2JhbC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL3V0aWwuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9mZXRjaC9zeW1ib2xzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZmV0Y2gvd2ViaWRsLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZmV0Y2gvZGF0YVVSTC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL2ZpbGUuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9mZXRjaC9mb3JtZGF0YS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL2JvZHkuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jb3JlL3JlcXVlc3QuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9kaXNwYXRjaGVyLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZGlzcGF0Y2hlci1iYXNlLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY29yZS9jb25uZWN0LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvbGxodHRwL3V0aWxzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvbGxodHRwL2NvbnN0YW50cy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2hhbmRsZXIvUmVkaXJlY3RIYW5kbGVyLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvaW50ZXJjZXB0b3IvcmVkaXJlY3RJbnRlcmNlcHRvci5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2xsaHR0cC9sbGh0dHAtd2FzbS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2xsaHR0cC9sbGh0dHBfc2ltZC13YXNtLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY2xpZW50LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvbm9kZS9maXhlZC1xdWV1ZS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3Bvb2wtc3RhdHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9wb29sLWJhc2UuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9wb29sLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvYmFsYW5jZWQtcG9vbC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2NvbXBhdC9kaXNwYXRjaGVyLXdlYWtyZWYuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9hZ2VudC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS9yZWFkYWJsZS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS91dGlsLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvYXBpL2Fib3J0LXNpZ25hbC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS9hcGktcmVxdWVzdC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS9hcGktc3RyZWFtLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvYXBpL2FwaS1waXBlbGluZS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS9hcGktdXBncmFkZS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS9hcGktY29ubmVjdC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS9pbmRleC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL21vY2svbW9jay1lcnJvcnMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9tb2NrL21vY2stc3ltYm9scy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL21vY2svbW9jay11dGlscy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL21vY2svbW9jay1pbnRlcmNlcHRvci5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL21vY2svbW9jay1jbGllbnQuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9tb2NrL21vY2stcG9vbC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL21vY2svcGx1cmFsaXplci5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL21vY2svcGVuZGluZy1pbnRlcmNlcHRvcnMtZm9ybWF0dGVyLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvbW9jay9tb2NrLWFnZW50LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvcHJveHktYWdlbnQuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9oYW5kbGVyL1JldHJ5SGFuZGxlci5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2dsb2JhbC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2hhbmRsZXIvRGVjb3JhdG9ySGFuZGxlci5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL2hlYWRlcnMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9mZXRjaC9yZXNwb25zZS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL3JlcXVlc3QuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9mZXRjaC9pbmRleC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZpbGVhcGkvc3ltYm9scy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZpbGVhcGkvcHJvZ3Jlc3NldmVudC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZpbGVhcGkvZW5jb2RpbmcuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9maWxlYXBpL3V0aWwuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9maWxlYXBpL2ZpbGVyZWFkZXIuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jYWNoZS9zeW1ib2xzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY2FjaGUvdXRpbC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2NhY2hlL2NhY2hlLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY2FjaGUvY2FjaGVzdG9yYWdlLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY29va2llcy9jb25zdGFudHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jb29raWVzL3V0aWwuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jb29raWVzL3BhcnNlLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY29va2llcy9pbmRleC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3dlYnNvY2tldC9jb25zdGFudHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWJzb2NrZXQvc3ltYm9scy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3dlYnNvY2tldC9ldmVudHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWJzb2NrZXQvdXRpbC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3dlYnNvY2tldC9jb25uZWN0aW9uLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2Vic29ja2V0L2ZyYW1lLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2Vic29ja2V0L3JlY2VpdmVyLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2Vic29ja2V0L3dlYnNvY2tldC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvaW5kZXguanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGFjdGlvbnMraHR0cC1jbGllbnRAMi4yLjMvbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2h0dHAtY2xpZW50L2xpYi9pbmRleC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AYWN0aW9ucytodHRwLWNsaWVudEAyLjIuMy9ub2RlX21vZHVsZXMvQGFjdGlvbnMvaHR0cC1jbGllbnQvbGliL2F1dGguanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGFjdGlvbnMrY29yZUAxLjExLjEvbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2NvcmUvbGliL29pZGMtdXRpbHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGFjdGlvbnMrY29yZUAxLjExLjEvbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2NvcmUvbGliL3N1bW1hcnkuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGFjdGlvbnMrY29yZUAxLjExLjEvbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2NvcmUvbGliL3BhdGgtdXRpbHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGFjdGlvbnMraW9AMS4xLjMvbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2lvL2xpYi9pby11dGlsLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BhY3Rpb25zK2lvQDEuMS4zL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9pby9saWIvaW8uanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGFjdGlvbnMrZXhlY0AxLjEuMS9ub2RlX21vZHVsZXMvQGFjdGlvbnMvZXhlYy9saWIvdG9vbHJ1bm5lci5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AYWN0aW9ucytleGVjQDEuMS4xL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9leGVjL2xpYi9leGVjLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BhY3Rpb25zK2NvcmVAMS4xMS4xL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9jb3JlL2xpYi9wbGF0Zm9ybS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AYWN0aW9ucytjb3JlQDEuMTEuMS9ub2RlX21vZHVsZXMvQGFjdGlvbnMvY29yZS9saWIvY29yZS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AYWN0aW9ucytnaXRodWJANi4wLjEvbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2dpdGh1Yi9saWIvY29udGV4dC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AYWN0aW9ucytnaXRodWJANi4wLjEvbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2dpdGh1Yi9saWIvaW50ZXJuYWwvdXRpbHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5pdmVyc2FsLXVzZXItYWdlbnRANi4wLjEvbm9kZV9tb2R1bGVzL3VuaXZlcnNhbC11c2VyLWFnZW50L2Rpc3Qtd2ViL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2JlZm9yZS1hZnRlci1ob29rQDIuMi4zL25vZGVfbW9kdWxlcy9iZWZvcmUtYWZ0ZXItaG9vay9saWIvcmVnaXN0ZXIuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vYmVmb3JlLWFmdGVyLWhvb2tAMi4yLjMvbm9kZV9tb2R1bGVzL2JlZm9yZS1hZnRlci1ob29rL2xpYi9hZGQuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vYmVmb3JlLWFmdGVyLWhvb2tAMi4yLjMvbm9kZV9tb2R1bGVzL2JlZm9yZS1hZnRlci1ob29rL2xpYi9yZW1vdmUuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vYmVmb3JlLWFmdGVyLWhvb2tAMi4yLjMvbm9kZV9tb2R1bGVzL2JlZm9yZS1hZnRlci1ob29rL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BvY3Rva2l0K2VuZHBvaW50QDkuMC42L25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9lbmRwb2ludC9kaXN0LXNyYy92ZXJzaW9uLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BvY3Rva2l0K2VuZHBvaW50QDkuMC42L25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9lbmRwb2ludC9kaXN0LXNyYy9kZWZhdWx0cy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab2N0b2tpdCtlbmRwb2ludEA5LjAuNi9ub2RlX21vZHVsZXMvQG9jdG9raXQvZW5kcG9pbnQvZGlzdC1zcmMvdXRpbC9sb3dlcmNhc2Uta2V5cy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab2N0b2tpdCtlbmRwb2ludEA5LjAuNi9ub2RlX21vZHVsZXMvQG9jdG9raXQvZW5kcG9pbnQvZGlzdC1zcmMvdXRpbC9pcy1wbGFpbi1vYmplY3QuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQG9jdG9raXQrZW5kcG9pbnRAOS4wLjYvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2VuZHBvaW50L2Rpc3Qtc3JjL3V0aWwvbWVyZ2UtZGVlcC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab2N0b2tpdCtlbmRwb2ludEA5LjAuNi9ub2RlX21vZHVsZXMvQG9jdG9raXQvZW5kcG9pbnQvZGlzdC1zcmMvdXRpbC9yZW1vdmUtdW5kZWZpbmVkLXByb3BlcnRpZXMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQG9jdG9raXQrZW5kcG9pbnRAOS4wLjYvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2VuZHBvaW50L2Rpc3Qtc3JjL21lcmdlLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BvY3Rva2l0K2VuZHBvaW50QDkuMC42L25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9lbmRwb2ludC9kaXN0LXNyYy91dGlsL2FkZC1xdWVyeS1wYXJhbWV0ZXJzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BvY3Rva2l0K2VuZHBvaW50QDkuMC42L25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9lbmRwb2ludC9kaXN0LXNyYy91dGlsL2V4dHJhY3QtdXJsLXZhcmlhYmxlLW5hbWVzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BvY3Rva2l0K2VuZHBvaW50QDkuMC42L25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9lbmRwb2ludC9kaXN0LXNyYy91dGlsL29taXQuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQG9jdG9raXQrZW5kcG9pbnRAOS4wLjYvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2VuZHBvaW50L2Rpc3Qtc3JjL3V0aWwvdXJsLXRlbXBsYXRlLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BvY3Rva2l0K2VuZHBvaW50QDkuMC42L25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9lbmRwb2ludC9kaXN0LXNyYy9wYXJzZS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab2N0b2tpdCtlbmRwb2ludEA5LjAuNi9ub2RlX21vZHVsZXMvQG9jdG9raXQvZW5kcG9pbnQvZGlzdC1zcmMvZW5kcG9pbnQtd2l0aC1kZWZhdWx0cy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab2N0b2tpdCtlbmRwb2ludEA5LjAuNi9ub2RlX21vZHVsZXMvQG9jdG9raXQvZW5kcG9pbnQvZGlzdC1zcmMvd2l0aC1kZWZhdWx0cy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab2N0b2tpdCtlbmRwb2ludEA5LjAuNi9ub2RlX21vZHVsZXMvQG9jdG9raXQvZW5kcG9pbnQvZGlzdC1zcmMvaW5kZXguanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQG9jdG9raXQrcmVxdWVzdEA4LjQuMS9ub2RlX21vZHVsZXMvQG9jdG9raXQvcmVxdWVzdC9kaXN0LXNyYy92ZXJzaW9uLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BvY3Rva2l0K3JlcXVlc3RAOC40LjEvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3JlcXVlc3QvZGlzdC1zcmMvaXMtcGxhaW4tb2JqZWN0LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2RlcHJlY2F0aW9uQDIuMy4xL25vZGVfbW9kdWxlcy9kZXByZWNhdGlvbi9kaXN0LXdlYi9pbmRleC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS93cmFwcHlAMS4wLjIvbm9kZV9tb2R1bGVzL3dyYXBweS93cmFwcHkuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vb25jZUAxLjQuMC9ub2RlX21vZHVsZXMvb25jZS9vbmNlLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BvY3Rva2l0K3JlcXVlc3QtZXJyb3JANS4xLjEvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3JlcXVlc3QtZXJyb3IvZGlzdC1zcmMvaW5kZXguanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQG9jdG9raXQrcmVxdWVzdEA4LjQuMS9ub2RlX21vZHVsZXMvQG9jdG9raXQvcmVxdWVzdC9kaXN0LXNyYy9nZXQtYnVmZmVyLXJlc3BvbnNlLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BvY3Rva2l0K3JlcXVlc3RAOC40LjEvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3JlcXVlc3QvZGlzdC1zcmMvZmV0Y2gtd3JhcHBlci5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab2N0b2tpdCtyZXF1ZXN0QDguNC4xL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9yZXF1ZXN0L2Rpc3Qtc3JjL3dpdGgtZGVmYXVsdHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQG9jdG9raXQrcmVxdWVzdEA4LjQuMS9ub2RlX21vZHVsZXMvQG9jdG9raXQvcmVxdWVzdC9kaXN0LXNyYy9pbmRleC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab2N0b2tpdCtncmFwaHFsQDcuMS4xL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9ncmFwaHFsL2Rpc3Qtd2ViL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BvY3Rva2l0K2F1dGgtdG9rZW5ANC4wLjAvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2F1dGgtdG9rZW4vZGlzdC1zcmMvYXV0aC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab2N0b2tpdCthdXRoLXRva2VuQDQuMC4wL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9hdXRoLXRva2VuL2Rpc3Qtc3JjL3dpdGgtYXV0aG9yaXphdGlvbi1wcmVmaXguanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQG9jdG9raXQrYXV0aC10b2tlbkA0LjAuMC9ub2RlX21vZHVsZXMvQG9jdG9raXQvYXV0aC10b2tlbi9kaXN0LXNyYy9ob29rLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BvY3Rva2l0K2F1dGgtdG9rZW5ANC4wLjAvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2F1dGgtdG9rZW4vZGlzdC1zcmMvaW5kZXguanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQG9jdG9raXQrY29yZUA1LjIuMi9ub2RlX21vZHVsZXMvQG9jdG9raXQvY29yZS9kaXN0LXdlYi9pbmRleC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab2N0b2tpdCtwbHVnaW4tcmVzdC1lbmRwb2ludC1tZXRob2RzQDEwLjQuMV9Ab2N0b2tpdCtjb3JlQDUuMi4yL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9wbHVnaW4tcmVzdC1lbmRwb2ludC1tZXRob2RzL2Rpc3Qtc3JjL3ZlcnNpb24uanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQG9jdG9raXQrcGx1Z2luLXJlc3QtZW5kcG9pbnQtbWV0aG9kc0AxMC40LjFfQG9jdG9raXQrY29yZUA1LjIuMi9ub2RlX21vZHVsZXMvQG9jdG9raXQvcGx1Z2luLXJlc3QtZW5kcG9pbnQtbWV0aG9kcy9kaXN0LXNyYy9nZW5lcmF0ZWQvZW5kcG9pbnRzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BvY3Rva2l0K3BsdWdpbi1yZXN0LWVuZHBvaW50LW1ldGhvZHNAMTAuNC4xX0BvY3Rva2l0K2NvcmVANS4yLjIvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3BsdWdpbi1yZXN0LWVuZHBvaW50LW1ldGhvZHMvZGlzdC1zcmMvZW5kcG9pbnRzLXRvLW1ldGhvZHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQG9jdG9raXQrcGx1Z2luLXJlc3QtZW5kcG9pbnQtbWV0aG9kc0AxMC40LjFfQG9jdG9raXQrY29yZUA1LjIuMi9ub2RlX21vZHVsZXMvQG9jdG9raXQvcGx1Z2luLXJlc3QtZW5kcG9pbnQtbWV0aG9kcy9kaXN0LXNyYy9pbmRleC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab2N0b2tpdCtwbHVnaW4tcGFnaW5hdGUtcmVzdEA5LjIuMl9Ab2N0b2tpdCtjb3JlQDUuMi4yL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9wbHVnaW4tcGFnaW5hdGUtcmVzdC9kaXN0LXdlYi9pbmRleC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AYWN0aW9ucytnaXRodWJANi4wLjEvbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2dpdGh1Yi9saWIvdXRpbHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGFjdGlvbnMrZ2l0aHViQDYuMC4xL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9naXRodWIvbGliL2dpdGh1Yi5qcyIsIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9jb250ZXh0LnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuLy8gV2UgdXNlIGFueSBhcyBhIHZhbGlkIGlucHV0IHR5cGVcbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudG9Db21tYW5kUHJvcGVydGllcyA9IGV4cG9ydHMudG9Db21tYW5kVmFsdWUgPSB2b2lkIDA7XG4vKipcbiAqIFNhbml0aXplcyBhbiBpbnB1dCBpbnRvIGEgc3RyaW5nIHNvIGl0IGNhbiBiZSBwYXNzZWQgaW50byBpc3N1ZUNvbW1hbmQgc2FmZWx5XG4gKiBAcGFyYW0gaW5wdXQgaW5wdXQgdG8gc2FuaXRpemUgaW50byBhIHN0cmluZ1xuICovXG5mdW5jdGlvbiB0b0NvbW1hbmRWYWx1ZShpbnB1dCkge1xuICAgIGlmIChpbnB1dCA9PT0gbnVsbCB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyB8fCBpbnB1dCBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShpbnB1dCk7XG59XG5leHBvcnRzLnRvQ29tbWFuZFZhbHVlID0gdG9Db21tYW5kVmFsdWU7XG4vKipcbiAqXG4gKiBAcGFyYW0gYW5ub3RhdGlvblByb3BlcnRpZXNcbiAqIEByZXR1cm5zIFRoZSBjb21tYW5kIHByb3BlcnRpZXMgdG8gc2VuZCB3aXRoIHRoZSBhY3R1YWwgYW5ub3RhdGlvbiBjb21tYW5kXG4gKiBTZWUgSXNzdWVDb21tYW5kUHJvcGVydGllczogaHR0cHM6Ly9naXRodWIuY29tL2FjdGlvbnMvcnVubmVyL2Jsb2IvbWFpbi9zcmMvUnVubmVyLldvcmtlci9BY3Rpb25Db21tYW5kTWFuYWdlci5jcyNMNjQ2XG4gKi9cbmZ1bmN0aW9uIHRvQ29tbWFuZFByb3BlcnRpZXMoYW5ub3RhdGlvblByb3BlcnRpZXMpIHtcbiAgICBpZiAoIU9iamVjdC5rZXlzKGFubm90YXRpb25Qcm9wZXJ0aWVzKS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZTogYW5ub3RhdGlvblByb3BlcnRpZXMudGl0bGUsXG4gICAgICAgIGZpbGU6IGFubm90YXRpb25Qcm9wZXJ0aWVzLmZpbGUsXG4gICAgICAgIGxpbmU6IGFubm90YXRpb25Qcm9wZXJ0aWVzLnN0YXJ0TGluZSxcbiAgICAgICAgZW5kTGluZTogYW5ub3RhdGlvblByb3BlcnRpZXMuZW5kTGluZSxcbiAgICAgICAgY29sOiBhbm5vdGF0aW9uUHJvcGVydGllcy5zdGFydENvbHVtbixcbiAgICAgICAgZW5kQ29sdW1uOiBhbm5vdGF0aW9uUHJvcGVydGllcy5lbmRDb2x1bW5cbiAgICB9O1xufVxuZXhwb3J0cy50b0NvbW1hbmRQcm9wZXJ0aWVzID0gdG9Db21tYW5kUHJvcGVydGllcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmlzc3VlID0gZXhwb3J0cy5pc3N1ZUNvbW1hbmQgPSB2b2lkIDA7XG5jb25zdCBvcyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwib3NcIikpO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuLyoqXG4gKiBDb21tYW5kc1xuICpcbiAqIENvbW1hbmQgRm9ybWF0OlxuICogICA6Om5hbWUga2V5PXZhbHVlLGtleT12YWx1ZTo6bWVzc2FnZVxuICpcbiAqIEV4YW1wbGVzOlxuICogICA6Ondhcm5pbmc6OlRoaXMgaXMgdGhlIG1lc3NhZ2VcbiAqICAgOjpzZXQtZW52IG5hbWU9TVlfVkFSOjpzb21lIHZhbHVlXG4gKi9cbmZ1bmN0aW9uIGlzc3VlQ29tbWFuZChjb21tYW5kLCBwcm9wZXJ0aWVzLCBtZXNzYWdlKSB7XG4gICAgY29uc3QgY21kID0gbmV3IENvbW1hbmQoY29tbWFuZCwgcHJvcGVydGllcywgbWVzc2FnZSk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoY21kLnRvU3RyaW5nKCkgKyBvcy5FT0wpO1xufVxuZXhwb3J0cy5pc3N1ZUNvbW1hbmQgPSBpc3N1ZUNvbW1hbmQ7XG5mdW5jdGlvbiBpc3N1ZShuYW1lLCBtZXNzYWdlID0gJycpIHtcbiAgICBpc3N1ZUNvbW1hbmQobmFtZSwge30sIG1lc3NhZ2UpO1xufVxuZXhwb3J0cy5pc3N1ZSA9IGlzc3VlO1xuY29uc3QgQ01EX1NUUklORyA9ICc6Oic7XG5jbGFzcyBDb21tYW5kIHtcbiAgICBjb25zdHJ1Y3Rvcihjb21tYW5kLCBwcm9wZXJ0aWVzLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmICghY29tbWFuZCkge1xuICAgICAgICAgICAgY29tbWFuZCA9ICdtaXNzaW5nLmNvbW1hbmQnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7XG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBsZXQgY21kU3RyID0gQ01EX1NUUklORyArIHRoaXMuY29tbWFuZDtcbiAgICAgICAgaWYgKHRoaXMucHJvcGVydGllcyAmJiBPYmplY3Qua2V5cyh0aGlzLnByb3BlcnRpZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNtZFN0ciArPSAnICc7XG4gICAgICAgICAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMucHJvcGVydGllc1trZXldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kU3RyICs9ICcsJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNtZFN0ciArPSBgJHtrZXl9PSR7ZXNjYXBlUHJvcGVydHkodmFsKX1gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNtZFN0ciArPSBgJHtDTURfU1RSSU5HfSR7ZXNjYXBlRGF0YSh0aGlzLm1lc3NhZ2UpfWA7XG4gICAgICAgIHJldHVybiBjbWRTdHI7XG4gICAgfVxufVxuZnVuY3Rpb24gZXNjYXBlRGF0YShzKSB7XG4gICAgcmV0dXJuICgwLCB1dGlsc18xLnRvQ29tbWFuZFZhbHVlKShzKVxuICAgICAgICAucmVwbGFjZSgvJS9nLCAnJTI1JylcbiAgICAgICAgLnJlcGxhY2UoL1xcci9nLCAnJTBEJylcbiAgICAgICAgLnJlcGxhY2UoL1xcbi9nLCAnJTBBJyk7XG59XG5mdW5jdGlvbiBlc2NhcGVQcm9wZXJ0eShzKSB7XG4gICAgcmV0dXJuICgwLCB1dGlsc18xLnRvQ29tbWFuZFZhbHVlKShzKVxuICAgICAgICAucmVwbGFjZSgvJS9nLCAnJTI1JylcbiAgICAgICAgLnJlcGxhY2UoL1xcci9nLCAnJTBEJylcbiAgICAgICAgLnJlcGxhY2UoL1xcbi9nLCAnJTBBJylcbiAgICAgICAgLnJlcGxhY2UoLzovZywgJyUzQScpXG4gICAgICAgIC5yZXBsYWNlKC8sL2csICclMkMnKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbW1hbmQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBGb3IgaW50ZXJuYWwgdXNlLCBzdWJqZWN0IHRvIGNoYW5nZS5cbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wcmVwYXJlS2V5VmFsdWVNZXNzYWdlID0gZXhwb3J0cy5pc3N1ZUZpbGVDb21tYW5kID0gdm9pZCAwO1xuLy8gV2UgdXNlIGFueSBhcyBhIHZhbGlkIGlucHV0IHR5cGVcbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmNvbnN0IGNyeXB0byA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiY3J5cHRvXCIpKTtcbmNvbnN0IGZzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJmc1wiKSk7XG5jb25zdCBvcyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwib3NcIikpO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuZnVuY3Rpb24gaXNzdWVGaWxlQ29tbWFuZChjb21tYW5kLCBtZXNzYWdlKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwcm9jZXNzLmVudltgR0lUSFVCXyR7Y29tbWFuZH1gXTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGZpbmQgZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yIGZpbGUgY29tbWFuZCAke2NvbW1hbmR9YCk7XG4gICAgfVxuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGZpbGUgYXQgcGF0aDogJHtmaWxlUGF0aH1gKTtcbiAgICB9XG4gICAgZnMuYXBwZW5kRmlsZVN5bmMoZmlsZVBhdGgsIGAkeygwLCB1dGlsc18xLnRvQ29tbWFuZFZhbHVlKShtZXNzYWdlKX0ke29zLkVPTH1gLCB7XG4gICAgICAgIGVuY29kaW5nOiAndXRmOCdcbiAgICB9KTtcbn1cbmV4cG9ydHMuaXNzdWVGaWxlQ29tbWFuZCA9IGlzc3VlRmlsZUNvbW1hbmQ7XG5mdW5jdGlvbiBwcmVwYXJlS2V5VmFsdWVNZXNzYWdlKGtleSwgdmFsdWUpIHtcbiAgICBjb25zdCBkZWxpbWl0ZXIgPSBgZ2hhZGVsaW1pdGVyXyR7Y3J5cHRvLnJhbmRvbVVVSUQoKX1gO1xuICAgIGNvbnN0IGNvbnZlcnRlZFZhbHVlID0gKDAsIHV0aWxzXzEudG9Db21tYW5kVmFsdWUpKHZhbHVlKTtcbiAgICAvLyBUaGVzZSBzaG91bGQgcmVhbGlzdGljYWxseSBuZXZlciBoYXBwZW4sIGJ1dCBqdXN0IGluIGNhc2Ugc29tZW9uZSBmaW5kcyBhXG4gICAgLy8gd2F5IHRvIGV4cGxvaXQgdXVpZCBnZW5lcmF0aW9uIGxldCdzIG5vdCBhbGxvdyBrZXlzIG9yIHZhbHVlcyB0aGF0IGNvbnRhaW5cbiAgICAvLyB0aGUgZGVsaW1pdGVyLlxuICAgIGlmIChrZXkuaW5jbHVkZXMoZGVsaW1pdGVyKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgaW5wdXQ6IG5hbWUgc2hvdWxkIG5vdCBjb250YWluIHRoZSBkZWxpbWl0ZXIgXCIke2RlbGltaXRlcn1cImApO1xuICAgIH1cbiAgICBpZiAoY29udmVydGVkVmFsdWUuaW5jbHVkZXMoZGVsaW1pdGVyKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgaW5wdXQ6IHZhbHVlIHNob3VsZCBub3QgY29udGFpbiB0aGUgZGVsaW1pdGVyIFwiJHtkZWxpbWl0ZXJ9XCJgKTtcbiAgICB9XG4gICAgcmV0dXJuIGAke2tleX08PCR7ZGVsaW1pdGVyfSR7b3MuRU9MfSR7Y29udmVydGVkVmFsdWV9JHtvcy5FT0x9JHtkZWxpbWl0ZXJ9YDtcbn1cbmV4cG9ydHMucHJlcGFyZUtleVZhbHVlTWVzc2FnZSA9IHByZXBhcmVLZXlWYWx1ZU1lc3NhZ2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maWxlLWNvbW1hbmQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNoZWNrQnlwYXNzID0gZXhwb3J0cy5nZXRQcm94eVVybCA9IHZvaWQgMDtcbmZ1bmN0aW9uIGdldFByb3h5VXJsKHJlcVVybCkge1xuICAgIGNvbnN0IHVzaW5nU3NsID0gcmVxVXJsLnByb3RvY29sID09PSAnaHR0cHM6JztcbiAgICBpZiAoY2hlY2tCeXBhc3MocmVxVXJsKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBwcm94eVZhciA9ICgoKSA9PiB7XG4gICAgICAgIGlmICh1c2luZ1NzbCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52WydodHRwc19wcm94eSddIHx8IHByb2Nlc3MuZW52WydIVFRQU19QUk9YWSddO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52WydodHRwX3Byb3h5J10gfHwgcHJvY2Vzcy5lbnZbJ0hUVFBfUFJPWFknXTtcbiAgICAgICAgfVxuICAgIH0pKCk7XG4gICAgaWYgKHByb3h5VmFyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERlY29kZWRVUkwocHJveHlWYXIpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgaWYgKCFwcm94eVZhci5zdGFydHNXaXRoKCdodHRwOi8vJykgJiYgIXByb3h5VmFyLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWNvZGVkVVJMKGBodHRwOi8vJHtwcm94eVZhcn1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5leHBvcnRzLmdldFByb3h5VXJsID0gZ2V0UHJveHlVcmw7XG5mdW5jdGlvbiBjaGVja0J5cGFzcyhyZXFVcmwpIHtcbiAgICBpZiAoIXJlcVVybC5ob3N0bmFtZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHJlcUhvc3QgPSByZXFVcmwuaG9zdG5hbWU7XG4gICAgaWYgKGlzTG9vcGJhY2tBZGRyZXNzKHJlcUhvc3QpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBub1Byb3h5ID0gcHJvY2Vzcy5lbnZbJ25vX3Byb3h5J10gfHwgcHJvY2Vzcy5lbnZbJ05PX1BST1hZJ10gfHwgJyc7XG4gICAgaWYgKCFub1Byb3h5KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gRGV0ZXJtaW5lIHRoZSByZXF1ZXN0IHBvcnRcbiAgICBsZXQgcmVxUG9ydDtcbiAgICBpZiAocmVxVXJsLnBvcnQpIHtcbiAgICAgICAgcmVxUG9ydCA9IE51bWJlcihyZXFVcmwucG9ydCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJlcVVybC5wcm90b2NvbCA9PT0gJ2h0dHA6Jykge1xuICAgICAgICByZXFQb3J0ID0gODA7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJlcVVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOicpIHtcbiAgICAgICAgcmVxUG9ydCA9IDQ0MztcbiAgICB9XG4gICAgLy8gRm9ybWF0IHRoZSByZXF1ZXN0IGhvc3RuYW1lIGFuZCBob3N0bmFtZSB3aXRoIHBvcnRcbiAgICBjb25zdCB1cHBlclJlcUhvc3RzID0gW3JlcVVybC5ob3N0bmFtZS50b1VwcGVyQ2FzZSgpXTtcbiAgICBpZiAodHlwZW9mIHJlcVBvcnQgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHVwcGVyUmVxSG9zdHMucHVzaChgJHt1cHBlclJlcUhvc3RzWzBdfToke3JlcVBvcnR9YCk7XG4gICAgfVxuICAgIC8vIENvbXBhcmUgcmVxdWVzdCBob3N0IGFnYWluc3Qgbm9wcm94eVxuICAgIGZvciAoY29uc3QgdXBwZXJOb1Byb3h5SXRlbSBvZiBub1Byb3h5XG4gICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgIC5tYXAoeCA9PiB4LnRyaW0oKS50b1VwcGVyQ2FzZSgpKVxuICAgICAgICAuZmlsdGVyKHggPT4geCkpIHtcbiAgICAgICAgaWYgKHVwcGVyTm9Qcm94eUl0ZW0gPT09ICcqJyB8fFxuICAgICAgICAgICAgdXBwZXJSZXFIb3N0cy5zb21lKHggPT4geCA9PT0gdXBwZXJOb1Byb3h5SXRlbSB8fFxuICAgICAgICAgICAgICAgIHguZW5kc1dpdGgoYC4ke3VwcGVyTm9Qcm94eUl0ZW19YCkgfHxcbiAgICAgICAgICAgICAgICAodXBwZXJOb1Byb3h5SXRlbS5zdGFydHNXaXRoKCcuJykgJiZcbiAgICAgICAgICAgICAgICAgICAgeC5lbmRzV2l0aChgJHt1cHBlck5vUHJveHlJdGVtfWApKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydHMuY2hlY2tCeXBhc3MgPSBjaGVja0J5cGFzcztcbmZ1bmN0aW9uIGlzTG9vcGJhY2tBZGRyZXNzKGhvc3QpIHtcbiAgICBjb25zdCBob3N0TG93ZXIgPSBob3N0LnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIChob3N0TG93ZXIgPT09ICdsb2NhbGhvc3QnIHx8XG4gICAgICAgIGhvc3RMb3dlci5zdGFydHNXaXRoKCcxMjcuJykgfHxcbiAgICAgICAgaG9zdExvd2VyLnN0YXJ0c1dpdGgoJ1s6OjFdJykgfHxcbiAgICAgICAgaG9zdExvd2VyLnN0YXJ0c1dpdGgoJ1swOjA6MDowOjA6MDowOjFdJykpO1xufVxuY2xhc3MgRGVjb2RlZFVSTCBleHRlbmRzIFVSTCB7XG4gICAgY29uc3RydWN0b3IodXJsLCBiYXNlKSB7XG4gICAgICAgIHN1cGVyKHVybCwgYmFzZSk7XG4gICAgICAgIHRoaXMuX2RlY29kZWRVc2VybmFtZSA9IGRlY29kZVVSSUNvbXBvbmVudChzdXBlci51c2VybmFtZSk7XG4gICAgICAgIHRoaXMuX2RlY29kZWRQYXNzd29yZCA9IGRlY29kZVVSSUNvbXBvbmVudChzdXBlci5wYXNzd29yZCk7XG4gICAgfVxuICAgIGdldCB1c2VybmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlY29kZWRVc2VybmFtZTtcbiAgICB9XG4gICAgZ2V0IHBhc3N3b3JkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVjb2RlZFBhc3N3b3JkO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb3h5LmpzLm1hcCIsIid1c2Ugc3RyaWN0JztcblxudmFyIG5ldCA9IHJlcXVpcmUoJ25ldCcpO1xudmFyIHRscyA9IHJlcXVpcmUoJ3RscycpO1xudmFyIGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XG52YXIgaHR0cHMgPSByZXF1aXJlKCdodHRwcycpO1xudmFyIGV2ZW50cyA9IHJlcXVpcmUoJ2V2ZW50cycpO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cblxuZXhwb3J0cy5odHRwT3Zlckh0dHAgPSBodHRwT3Zlckh0dHA7XG5leHBvcnRzLmh0dHBzT3Zlckh0dHAgPSBodHRwc092ZXJIdHRwO1xuZXhwb3J0cy5odHRwT3Zlckh0dHBzID0gaHR0cE92ZXJIdHRwcztcbmV4cG9ydHMuaHR0cHNPdmVySHR0cHMgPSBodHRwc092ZXJIdHRwcztcblxuXG5mdW5jdGlvbiBodHRwT3Zlckh0dHAob3B0aW9ucykge1xuICB2YXIgYWdlbnQgPSBuZXcgVHVubmVsaW5nQWdlbnQob3B0aW9ucyk7XG4gIGFnZW50LnJlcXVlc3QgPSBodHRwLnJlcXVlc3Q7XG4gIHJldHVybiBhZ2VudDtcbn1cblxuZnVuY3Rpb24gaHR0cHNPdmVySHR0cChvcHRpb25zKSB7XG4gIHZhciBhZ2VudCA9IG5ldyBUdW5uZWxpbmdBZ2VudChvcHRpb25zKTtcbiAgYWdlbnQucmVxdWVzdCA9IGh0dHAucmVxdWVzdDtcbiAgYWdlbnQuY3JlYXRlU29ja2V0ID0gY3JlYXRlU2VjdXJlU29ja2V0O1xuICBhZ2VudC5kZWZhdWx0UG9ydCA9IDQ0MztcbiAgcmV0dXJuIGFnZW50O1xufVxuXG5mdW5jdGlvbiBodHRwT3Zlckh0dHBzKG9wdGlvbnMpIHtcbiAgdmFyIGFnZW50ID0gbmV3IFR1bm5lbGluZ0FnZW50KG9wdGlvbnMpO1xuICBhZ2VudC5yZXF1ZXN0ID0gaHR0cHMucmVxdWVzdDtcbiAgcmV0dXJuIGFnZW50O1xufVxuXG5mdW5jdGlvbiBodHRwc092ZXJIdHRwcyhvcHRpb25zKSB7XG4gIHZhciBhZ2VudCA9IG5ldyBUdW5uZWxpbmdBZ2VudChvcHRpb25zKTtcbiAgYWdlbnQucmVxdWVzdCA9IGh0dHBzLnJlcXVlc3Q7XG4gIGFnZW50LmNyZWF0ZVNvY2tldCA9IGNyZWF0ZVNlY3VyZVNvY2tldDtcbiAgYWdlbnQuZGVmYXVsdFBvcnQgPSA0NDM7XG4gIHJldHVybiBhZ2VudDtcbn1cblxuXG5mdW5jdGlvbiBUdW5uZWxpbmdBZ2VudChvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc2VsZi5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgc2VsZi5wcm94eU9wdGlvbnMgPSBzZWxmLm9wdGlvbnMucHJveHkgfHwge307XG4gIHNlbGYubWF4U29ja2V0cyA9IHNlbGYub3B0aW9ucy5tYXhTb2NrZXRzIHx8IGh0dHAuQWdlbnQuZGVmYXVsdE1heFNvY2tldHM7XG4gIHNlbGYucmVxdWVzdHMgPSBbXTtcbiAgc2VsZi5zb2NrZXRzID0gW107XG5cbiAgc2VsZi5vbignZnJlZScsIGZ1bmN0aW9uIG9uRnJlZShzb2NrZXQsIGhvc3QsIHBvcnQsIGxvY2FsQWRkcmVzcykge1xuICAgIHZhciBvcHRpb25zID0gdG9PcHRpb25zKGhvc3QsIHBvcnQsIGxvY2FsQWRkcmVzcyk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHNlbGYucmVxdWVzdHMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgIHZhciBwZW5kaW5nID0gc2VsZi5yZXF1ZXN0c1tpXTtcbiAgICAgIGlmIChwZW5kaW5nLmhvc3QgPT09IG9wdGlvbnMuaG9zdCAmJiBwZW5kaW5nLnBvcnQgPT09IG9wdGlvbnMucG9ydCkge1xuICAgICAgICAvLyBEZXRlY3QgdGhlIHJlcXVlc3QgdG8gY29ubmVjdCBzYW1lIG9yaWdpbiBzZXJ2ZXIsXG4gICAgICAgIC8vIHJldXNlIHRoZSBjb25uZWN0aW9uLlxuICAgICAgICBzZWxmLnJlcXVlc3RzLnNwbGljZShpLCAxKTtcbiAgICAgICAgcGVuZGluZy5yZXF1ZXN0Lm9uU29ja2V0KHNvY2tldCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICBzZWxmLnJlbW92ZVNvY2tldChzb2NrZXQpO1xuICB9KTtcbn1cbnV0aWwuaW5oZXJpdHMoVHVubmVsaW5nQWdlbnQsIGV2ZW50cy5FdmVudEVtaXR0ZXIpO1xuXG5UdW5uZWxpbmdBZ2VudC5wcm90b3R5cGUuYWRkUmVxdWVzdCA9IGZ1bmN0aW9uIGFkZFJlcXVlc3QocmVxLCBob3N0LCBwb3J0LCBsb2NhbEFkZHJlc3MpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgb3B0aW9ucyA9IG1lcmdlT3B0aW9ucyh7cmVxdWVzdDogcmVxfSwgc2VsZi5vcHRpb25zLCB0b09wdGlvbnMoaG9zdCwgcG9ydCwgbG9jYWxBZGRyZXNzKSk7XG5cbiAgaWYgKHNlbGYuc29ja2V0cy5sZW5ndGggPj0gdGhpcy5tYXhTb2NrZXRzKSB7XG4gICAgLy8gV2UgYXJlIG92ZXIgbGltaXQgc28gd2UnbGwgYWRkIGl0IHRvIHRoZSBxdWV1ZS5cbiAgICBzZWxmLnJlcXVlc3RzLnB1c2gob3B0aW9ucyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gSWYgd2UgYXJlIHVuZGVyIG1heFNvY2tldHMgY3JlYXRlIGEgbmV3IG9uZS5cbiAgc2VsZi5jcmVhdGVTb2NrZXQob3B0aW9ucywgZnVuY3Rpb24oc29ja2V0KSB7XG4gICAgc29ja2V0Lm9uKCdmcmVlJywgb25GcmVlKTtcbiAgICBzb2NrZXQub24oJ2Nsb3NlJywgb25DbG9zZU9yUmVtb3ZlKTtcbiAgICBzb2NrZXQub24oJ2FnZW50UmVtb3ZlJywgb25DbG9zZU9yUmVtb3ZlKTtcbiAgICByZXEub25Tb2NrZXQoc29ja2V0KTtcblxuICAgIGZ1bmN0aW9uIG9uRnJlZSgpIHtcbiAgICAgIHNlbGYuZW1pdCgnZnJlZScsIHNvY2tldCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25DbG9zZU9yUmVtb3ZlKGVycikge1xuICAgICAgc2VsZi5yZW1vdmVTb2NrZXQoc29ja2V0KTtcbiAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignZnJlZScsIG9uRnJlZSk7XG4gICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25DbG9zZU9yUmVtb3ZlKTtcbiAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignYWdlbnRSZW1vdmUnLCBvbkNsb3NlT3JSZW1vdmUpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5UdW5uZWxpbmdBZ2VudC5wcm90b3R5cGUuY3JlYXRlU29ja2V0ID0gZnVuY3Rpb24gY3JlYXRlU29ja2V0KG9wdGlvbnMsIGNiKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHBsYWNlaG9sZGVyID0ge307XG4gIHNlbGYuc29ja2V0cy5wdXNoKHBsYWNlaG9sZGVyKTtcblxuICB2YXIgY29ubmVjdE9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoe30sIHNlbGYucHJveHlPcHRpb25zLCB7XG4gICAgbWV0aG9kOiAnQ09OTkVDVCcsXG4gICAgcGF0aDogb3B0aW9ucy5ob3N0ICsgJzonICsgb3B0aW9ucy5wb3J0LFxuICAgIGFnZW50OiBmYWxzZSxcbiAgICBoZWFkZXJzOiB7XG4gICAgICBob3N0OiBvcHRpb25zLmhvc3QgKyAnOicgKyBvcHRpb25zLnBvcnRcbiAgICB9XG4gIH0pO1xuICBpZiAob3B0aW9ucy5sb2NhbEFkZHJlc3MpIHtcbiAgICBjb25uZWN0T3B0aW9ucy5sb2NhbEFkZHJlc3MgPSBvcHRpb25zLmxvY2FsQWRkcmVzcztcbiAgfVxuICBpZiAoY29ubmVjdE9wdGlvbnMucHJveHlBdXRoKSB7XG4gICAgY29ubmVjdE9wdGlvbnMuaGVhZGVycyA9IGNvbm5lY3RPcHRpb25zLmhlYWRlcnMgfHwge307XG4gICAgY29ubmVjdE9wdGlvbnMuaGVhZGVyc1snUHJveHktQXV0aG9yaXphdGlvbiddID0gJ0Jhc2ljICcgK1xuICAgICAgICBuZXcgQnVmZmVyKGNvbm5lY3RPcHRpb25zLnByb3h5QXV0aCkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICB9XG5cbiAgZGVidWcoJ21ha2luZyBDT05ORUNUIHJlcXVlc3QnKTtcbiAgdmFyIGNvbm5lY3RSZXEgPSBzZWxmLnJlcXVlc3QoY29ubmVjdE9wdGlvbnMpO1xuICBjb25uZWN0UmVxLnVzZUNodW5rZWRFbmNvZGluZ0J5RGVmYXVsdCA9IGZhbHNlOyAvLyBmb3IgdjAuNlxuICBjb25uZWN0UmVxLm9uY2UoJ3Jlc3BvbnNlJywgb25SZXNwb25zZSk7IC8vIGZvciB2MC42XG4gIGNvbm5lY3RSZXEub25jZSgndXBncmFkZScsIG9uVXBncmFkZSk7ICAgLy8gZm9yIHYwLjZcbiAgY29ubmVjdFJlcS5vbmNlKCdjb25uZWN0Jywgb25Db25uZWN0KTsgICAvLyBmb3IgdjAuNyBvciBsYXRlclxuICBjb25uZWN0UmVxLm9uY2UoJ2Vycm9yJywgb25FcnJvcik7XG4gIGNvbm5lY3RSZXEuZW5kKCk7XG5cbiAgZnVuY3Rpb24gb25SZXNwb25zZShyZXMpIHtcbiAgICAvLyBWZXJ5IGhhY2t5LiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBodHRwLXBhcnNlciBsZWFrcy5cbiAgICByZXMudXBncmFkZSA9IHRydWU7XG4gIH1cblxuICBmdW5jdGlvbiBvblVwZ3JhZGUocmVzLCBzb2NrZXQsIGhlYWQpIHtcbiAgICAvLyBIYWNreS5cbiAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgb25Db25uZWN0KHJlcywgc29ja2V0LCBoZWFkKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uQ29ubmVjdChyZXMsIHNvY2tldCwgaGVhZCkge1xuICAgIGNvbm5lY3RSZXEucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgc29ja2V0LnJlbW92ZUFsbExpc3RlbmVycygpO1xuXG4gICAgaWYgKHJlcy5zdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgIGRlYnVnKCd0dW5uZWxpbmcgc29ja2V0IGNvdWxkIG5vdCBiZSBlc3RhYmxpc2hlZCwgc3RhdHVzQ29kZT0lZCcsXG4gICAgICAgIHJlcy5zdGF0dXNDb2RlKTtcbiAgICAgIHNvY2tldC5kZXN0cm95KCk7XG4gICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ3R1bm5lbGluZyBzb2NrZXQgY291bGQgbm90IGJlIGVzdGFibGlzaGVkLCAnICtcbiAgICAgICAgJ3N0YXR1c0NvZGU9JyArIHJlcy5zdGF0dXNDb2RlKTtcbiAgICAgIGVycm9yLmNvZGUgPSAnRUNPTk5SRVNFVCc7XG4gICAgICBvcHRpb25zLnJlcXVlc3QuZW1pdCgnZXJyb3InLCBlcnJvcik7XG4gICAgICBzZWxmLnJlbW92ZVNvY2tldChwbGFjZWhvbGRlcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChoZWFkLmxlbmd0aCA+IDApIHtcbiAgICAgIGRlYnVnKCdnb3QgaWxsZWdhbCByZXNwb25zZSBib2R5IGZyb20gcHJveHknKTtcbiAgICAgIHNvY2tldC5kZXN0cm95KCk7XG4gICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ2dvdCBpbGxlZ2FsIHJlc3BvbnNlIGJvZHkgZnJvbSBwcm94eScpO1xuICAgICAgZXJyb3IuY29kZSA9ICdFQ09OTlJFU0VUJztcbiAgICAgIG9wdGlvbnMucmVxdWVzdC5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgICAgIHNlbGYucmVtb3ZlU29ja2V0KHBsYWNlaG9sZGVyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZGVidWcoJ3R1bm5lbGluZyBjb25uZWN0aW9uIGhhcyBlc3RhYmxpc2hlZCcpO1xuICAgIHNlbGYuc29ja2V0c1tzZWxmLnNvY2tldHMuaW5kZXhPZihwbGFjZWhvbGRlcildID0gc29ja2V0O1xuICAgIHJldHVybiBjYihzb2NrZXQpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25FcnJvcihjYXVzZSkge1xuICAgIGNvbm5lY3RSZXEucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG5cbiAgICBkZWJ1ZygndHVubmVsaW5nIHNvY2tldCBjb3VsZCBub3QgYmUgZXN0YWJsaXNoZWQsIGNhdXNlPSVzXFxuJyxcbiAgICAgICAgICBjYXVzZS5tZXNzYWdlLCBjYXVzZS5zdGFjayk7XG4gICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCd0dW5uZWxpbmcgc29ja2V0IGNvdWxkIG5vdCBiZSBlc3RhYmxpc2hlZCwgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdjYXVzZT0nICsgY2F1c2UubWVzc2FnZSk7XG4gICAgZXJyb3IuY29kZSA9ICdFQ09OTlJFU0VUJztcbiAgICBvcHRpb25zLnJlcXVlc3QuZW1pdCgnZXJyb3InLCBlcnJvcik7XG4gICAgc2VsZi5yZW1vdmVTb2NrZXQocGxhY2Vob2xkZXIpO1xuICB9XG59O1xuXG5UdW5uZWxpbmdBZ2VudC5wcm90b3R5cGUucmVtb3ZlU29ja2V0ID0gZnVuY3Rpb24gcmVtb3ZlU29ja2V0KHNvY2tldCkge1xuICB2YXIgcG9zID0gdGhpcy5zb2NrZXRzLmluZGV4T2Yoc29ja2V0KVxuICBpZiAocG9zID09PSAtMSkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLnNvY2tldHMuc3BsaWNlKHBvcywgMSk7XG5cbiAgdmFyIHBlbmRpbmcgPSB0aGlzLnJlcXVlc3RzLnNoaWZ0KCk7XG4gIGlmIChwZW5kaW5nKSB7XG4gICAgLy8gSWYgd2UgaGF2ZSBwZW5kaW5nIHJlcXVlc3RzIGFuZCBhIHNvY2tldCBnZXRzIGNsb3NlZCBhIG5ldyBvbmVcbiAgICAvLyBuZWVkcyB0byBiZSBjcmVhdGVkIHRvIHRha2Ugb3ZlciBpbiB0aGUgcG9vbCBmb3IgdGhlIG9uZSB0aGF0IGNsb3NlZC5cbiAgICB0aGlzLmNyZWF0ZVNvY2tldChwZW5kaW5nLCBmdW5jdGlvbihzb2NrZXQpIHtcbiAgICAgIHBlbmRpbmcucmVxdWVzdC5vblNvY2tldChzb2NrZXQpO1xuICAgIH0pO1xuICB9XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVTZWN1cmVTb2NrZXQob3B0aW9ucywgY2IpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBUdW5uZWxpbmdBZ2VudC5wcm90b3R5cGUuY3JlYXRlU29ja2V0LmNhbGwoc2VsZiwgb3B0aW9ucywgZnVuY3Rpb24oc29ja2V0KSB7XG4gICAgdmFyIGhvc3RIZWFkZXIgPSBvcHRpb25zLnJlcXVlc3QuZ2V0SGVhZGVyKCdob3N0Jyk7XG4gICAgdmFyIHRsc09wdGlvbnMgPSBtZXJnZU9wdGlvbnMoe30sIHNlbGYub3B0aW9ucywge1xuICAgICAgc29ja2V0OiBzb2NrZXQsXG4gICAgICBzZXJ2ZXJuYW1lOiBob3N0SGVhZGVyID8gaG9zdEhlYWRlci5yZXBsYWNlKC86LiokLywgJycpIDogb3B0aW9ucy5ob3N0XG4gICAgfSk7XG5cbiAgICAvLyAwIGlzIGR1bW15IHBvcnQgZm9yIHYwLjZcbiAgICB2YXIgc2VjdXJlU29ja2V0ID0gdGxzLmNvbm5lY3QoMCwgdGxzT3B0aW9ucyk7XG4gICAgc2VsZi5zb2NrZXRzW3NlbGYuc29ja2V0cy5pbmRleE9mKHNvY2tldCldID0gc2VjdXJlU29ja2V0O1xuICAgIGNiKHNlY3VyZVNvY2tldCk7XG4gIH0pO1xufVxuXG5cbmZ1bmN0aW9uIHRvT3B0aW9ucyhob3N0LCBwb3J0LCBsb2NhbEFkZHJlc3MpIHtcbiAgaWYgKHR5cGVvZiBob3N0ID09PSAnc3RyaW5nJykgeyAvLyBzaW5jZSB2MC4xMFxuICAgIHJldHVybiB7XG4gICAgICBob3N0OiBob3N0LFxuICAgICAgcG9ydDogcG9ydCxcbiAgICAgIGxvY2FsQWRkcmVzczogbG9jYWxBZGRyZXNzXG4gICAgfTtcbiAgfVxuICByZXR1cm4gaG9zdDsgLy8gZm9yIHYwLjExIG9yIGxhdGVyXG59XG5cbmZ1bmN0aW9uIG1lcmdlT3B0aW9ucyh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDEsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgIHZhciBvdmVycmlkZXMgPSBhcmd1bWVudHNbaV07XG4gICAgaWYgKHR5cGVvZiBvdmVycmlkZXMgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG92ZXJyaWRlcyk7XG4gICAgICBmb3IgKHZhciBqID0gMCwga2V5TGVuID0ga2V5cy5sZW5ndGg7IGogPCBrZXlMZW47ICsraikge1xuICAgICAgICB2YXIgayA9IGtleXNbal07XG4gICAgICAgIGlmIChvdmVycmlkZXNba10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRhcmdldFtrXSA9IG92ZXJyaWRlc1trXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5cbnZhciBkZWJ1ZztcbmlmIChwcm9jZXNzLmVudi5OT0RFX0RFQlVHICYmIC9cXGJ0dW5uZWxcXGIvLnRlc3QocHJvY2Vzcy5lbnYuTk9ERV9ERUJVRykpIHtcbiAgZGVidWcgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJykge1xuICAgICAgYXJnc1swXSA9ICdUVU5ORUw6ICcgKyBhcmdzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcmdzLnVuc2hpZnQoJ1RVTk5FTDonKTtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvci5hcHBseShjb25zb2xlLCBhcmdzKTtcbiAgfVxufSBlbHNlIHtcbiAgZGVidWcgPSBmdW5jdGlvbigpIHt9O1xufVxuZXhwb3J0cy5kZWJ1ZyA9IGRlYnVnOyAvLyBmb3IgdGVzdFxuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi90dW5uZWwnKTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICBrQ2xvc2U6IFN5bWJvbCgnY2xvc2UnKSxcbiAga0Rlc3Ryb3k6IFN5bWJvbCgnZGVzdHJveScpLFxuICBrRGlzcGF0Y2g6IFN5bWJvbCgnZGlzcGF0Y2gnKSxcbiAga1VybDogU3ltYm9sKCd1cmwnKSxcbiAga1dyaXRpbmc6IFN5bWJvbCgnd3JpdGluZycpLFxuICBrUmVzdW1pbmc6IFN5bWJvbCgncmVzdW1pbmcnKSxcbiAga1F1ZXVlOiBTeW1ib2woJ3F1ZXVlJyksXG4gIGtDb25uZWN0OiBTeW1ib2woJ2Nvbm5lY3QnKSxcbiAga0Nvbm5lY3Rpbmc6IFN5bWJvbCgnY29ubmVjdGluZycpLFxuICBrSGVhZGVyc0xpc3Q6IFN5bWJvbCgnaGVhZGVycyBsaXN0JyksXG4gIGtLZWVwQWxpdmVEZWZhdWx0VGltZW91dDogU3ltYm9sKCdkZWZhdWx0IGtlZXAgYWxpdmUgdGltZW91dCcpLFxuICBrS2VlcEFsaXZlTWF4VGltZW91dDogU3ltYm9sKCdtYXgga2VlcCBhbGl2ZSB0aW1lb3V0JyksXG4gIGtLZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkOiBTeW1ib2woJ2tlZXAgYWxpdmUgdGltZW91dCB0aHJlc2hvbGQnKSxcbiAga0tlZXBBbGl2ZVRpbWVvdXRWYWx1ZTogU3ltYm9sKCdrZWVwIGFsaXZlIHRpbWVvdXQnKSxcbiAga0tlZXBBbGl2ZTogU3ltYm9sKCdrZWVwIGFsaXZlJyksXG4gIGtIZWFkZXJzVGltZW91dDogU3ltYm9sKCdoZWFkZXJzIHRpbWVvdXQnKSxcbiAga0JvZHlUaW1lb3V0OiBTeW1ib2woJ2JvZHkgdGltZW91dCcpLFxuICBrU2VydmVyTmFtZTogU3ltYm9sKCdzZXJ2ZXIgbmFtZScpLFxuICBrTG9jYWxBZGRyZXNzOiBTeW1ib2woJ2xvY2FsIGFkZHJlc3MnKSxcbiAga0hvc3Q6IFN5bWJvbCgnaG9zdCcpLFxuICBrTm9SZWY6IFN5bWJvbCgnbm8gcmVmJyksXG4gIGtCb2R5VXNlZDogU3ltYm9sKCd1c2VkJyksXG4gIGtSdW5uaW5nOiBTeW1ib2woJ3J1bm5pbmcnKSxcbiAga0Jsb2NraW5nOiBTeW1ib2woJ2Jsb2NraW5nJyksXG4gIGtQZW5kaW5nOiBTeW1ib2woJ3BlbmRpbmcnKSxcbiAga1NpemU6IFN5bWJvbCgnc2l6ZScpLFxuICBrQnVzeTogU3ltYm9sKCdidXN5JyksXG4gIGtRdWV1ZWQ6IFN5bWJvbCgncXVldWVkJyksXG4gIGtGcmVlOiBTeW1ib2woJ2ZyZWUnKSxcbiAga0Nvbm5lY3RlZDogU3ltYm9sKCdjb25uZWN0ZWQnKSxcbiAga0Nsb3NlZDogU3ltYm9sKCdjbG9zZWQnKSxcbiAga05lZWREcmFpbjogU3ltYm9sKCduZWVkIGRyYWluJyksXG4gIGtSZXNldDogU3ltYm9sKCdyZXNldCcpLFxuICBrRGVzdHJveWVkOiBTeW1ib2wuZm9yKCdub2RlanMuc3RyZWFtLmRlc3Ryb3llZCcpLFxuICBrTWF4SGVhZGVyc1NpemU6IFN5bWJvbCgnbWF4IGhlYWRlcnMgc2l6ZScpLFxuICBrUnVubmluZ0lkeDogU3ltYm9sKCdydW5uaW5nIGluZGV4JyksXG4gIGtQZW5kaW5nSWR4OiBTeW1ib2woJ3BlbmRpbmcgaW5kZXgnKSxcbiAga0Vycm9yOiBTeW1ib2woJ2Vycm9yJyksXG4gIGtDbGllbnRzOiBTeW1ib2woJ2NsaWVudHMnKSxcbiAga0NsaWVudDogU3ltYm9sKCdjbGllbnQnKSxcbiAga1BhcnNlcjogU3ltYm9sKCdwYXJzZXInKSxcbiAga09uRGVzdHJveWVkOiBTeW1ib2woJ2Rlc3Ryb3kgY2FsbGJhY2tzJyksXG4gIGtQaXBlbGluaW5nOiBTeW1ib2woJ3BpcGVsaW5pbmcnKSxcbiAga1NvY2tldDogU3ltYm9sKCdzb2NrZXQnKSxcbiAga0hvc3RIZWFkZXI6IFN5bWJvbCgnaG9zdCBoZWFkZXInKSxcbiAga0Nvbm5lY3RvcjogU3ltYm9sKCdjb25uZWN0b3InKSxcbiAga1N0cmljdENvbnRlbnRMZW5ndGg6IFN5bWJvbCgnc3RyaWN0IGNvbnRlbnQgbGVuZ3RoJyksXG4gIGtNYXhSZWRpcmVjdGlvbnM6IFN5bWJvbCgnbWF4UmVkaXJlY3Rpb25zJyksXG4gIGtNYXhSZXF1ZXN0czogU3ltYm9sKCdtYXhSZXF1ZXN0c1BlckNsaWVudCcpLFxuICBrUHJveHk6IFN5bWJvbCgncHJveHkgYWdlbnQgb3B0aW9ucycpLFxuICBrQ291bnRlcjogU3ltYm9sKCdzb2NrZXQgcmVxdWVzdCBjb3VudGVyJyksXG4gIGtJbnRlcmNlcHRvcnM6IFN5bWJvbCgnZGlzcGF0Y2ggaW50ZXJjZXB0b3JzJyksXG4gIGtNYXhSZXNwb25zZVNpemU6IFN5bWJvbCgnbWF4IHJlc3BvbnNlIHNpemUnKSxcbiAga0hUVFAyU2Vzc2lvbjogU3ltYm9sKCdodHRwMlNlc3Npb24nKSxcbiAga0hUVFAyU2Vzc2lvblN0YXRlOiBTeW1ib2woJ2h0dHAyU2Vzc2lvbiBzdGF0ZScpLFxuICBrSFRUUDJCdWlsZFJlcXVlc3Q6IFN5bWJvbCgnaHR0cDIgYnVpbGQgcmVxdWVzdCcpLFxuICBrSFRUUDFCdWlsZFJlcXVlc3Q6IFN5bWJvbCgnaHR0cDEgYnVpbGQgcmVxdWVzdCcpLFxuICBrSFRUUDJDb3B5SGVhZGVyczogU3ltYm9sKCdodHRwMiBjb3B5IGhlYWRlcnMnKSxcbiAga0hUVFBDb25uVmVyc2lvbjogU3ltYm9sKCdodHRwIGNvbm5lY3Rpb24gdmVyc2lvbicpLFxuICBrUmV0cnlIYW5kbGVyRGVmYXVsdFJldHJ5OiBTeW1ib2woJ3JldHJ5IGFnZW50IGRlZmF1bHQgcmV0cnknKSxcbiAga0NvbnN0cnVjdDogU3ltYm9sKCdjb25zdHJ1Y3RhYmxlJylcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jbGFzcyBVbmRpY2lFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIHRoaXMubmFtZSA9ICdVbmRpY2lFcnJvcidcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUidcbiAgfVxufVxuXG5jbGFzcyBDb25uZWN0VGltZW91dEVycm9yIGV4dGVuZHMgVW5kaWNpRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgQ29ubmVjdFRpbWVvdXRFcnJvcilcbiAgICB0aGlzLm5hbWUgPSAnQ29ubmVjdFRpbWVvdXRFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdDb25uZWN0IFRpbWVvdXQgRXJyb3InXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfQ09OTkVDVF9USU1FT1VUJ1xuICB9XG59XG5cbmNsYXNzIEhlYWRlcnNUaW1lb3V0RXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBIZWFkZXJzVGltZW91dEVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdIZWFkZXJzVGltZW91dEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ0hlYWRlcnMgVGltZW91dCBFcnJvcidcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9IRUFERVJTX1RJTUVPVVQnXG4gIH1cbn1cblxuY2xhc3MgSGVhZGVyc092ZXJmbG93RXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBIZWFkZXJzT3ZlcmZsb3dFcnJvcilcbiAgICB0aGlzLm5hbWUgPSAnSGVhZGVyc092ZXJmbG93RXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnSGVhZGVycyBPdmVyZmxvdyBFcnJvcidcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9IRUFERVJTX09WRVJGTE9XJ1xuICB9XG59XG5cbmNsYXNzIEJvZHlUaW1lb3V0RXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBCb2R5VGltZW91dEVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdCb2R5VGltZW91dEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ0JvZHkgVGltZW91dCBFcnJvcidcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9CT0RZX1RJTUVPVVQnXG4gIH1cbn1cblxuY2xhc3MgUmVzcG9uc2VTdGF0dXNDb2RlRXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlLCBzdGF0dXNDb2RlLCBoZWFkZXJzLCBib2R5KSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBSZXNwb25zZVN0YXR1c0NvZGVFcnJvcilcbiAgICB0aGlzLm5hbWUgPSAnUmVzcG9uc2VTdGF0dXNDb2RlRXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnUmVzcG9uc2UgU3RhdHVzIENvZGUgRXJyb3InXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfUkVTUE9OU0VfU1RBVFVTX0NPREUnXG4gICAgdGhpcy5ib2R5ID0gYm9keVxuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzQ29kZVxuICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGVcbiAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzXG4gIH1cbn1cblxuY2xhc3MgSW52YWxpZEFyZ3VtZW50RXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBJbnZhbGlkQXJndW1lbnRFcnJvcilcbiAgICB0aGlzLm5hbWUgPSAnSW52YWxpZEFyZ3VtZW50RXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnSW52YWxpZCBBcmd1bWVudCBFcnJvcidcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9JTlZBTElEX0FSRydcbiAgfVxufVxuXG5jbGFzcyBJbnZhbGlkUmV0dXJuVmFsdWVFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEludmFsaWRSZXR1cm5WYWx1ZUVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdJbnZhbGlkUmV0dXJuVmFsdWVFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdJbnZhbGlkIFJldHVybiBWYWx1ZSBFcnJvcidcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9JTlZBTElEX1JFVFVSTl9WQUxVRSdcbiAgfVxufVxuXG5jbGFzcyBSZXF1ZXN0QWJvcnRlZEVycm9yIGV4dGVuZHMgVW5kaWNpRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgUmVxdWVzdEFib3J0ZWRFcnJvcilcbiAgICB0aGlzLm5hbWUgPSAnQWJvcnRFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdSZXF1ZXN0IGFib3J0ZWQnXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfQUJPUlRFRCdcbiAgfVxufVxuXG5jbGFzcyBJbmZvcm1hdGlvbmFsRXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBJbmZvcm1hdGlvbmFsRXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ0luZm9ybWF0aW9uYWxFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdSZXF1ZXN0IGluZm9ybWF0aW9uJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0lORk8nXG4gIH1cbn1cblxuY2xhc3MgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yIGV4dGVuZHMgVW5kaWNpRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnUmVxdWVzdCBib2R5IGxlbmd0aCBkb2VzIG5vdCBtYXRjaCBjb250ZW50LWxlbmd0aCBoZWFkZXInXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfUkVRX0NPTlRFTlRfTEVOR1RIX01JU01BVENIJ1xuICB9XG59XG5cbmNsYXNzIFJlc3BvbnNlQ29udGVudExlbmd0aE1pc21hdGNoRXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBSZXNwb25zZUNvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdSZXNwb25zZUNvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1Jlc3BvbnNlIGJvZHkgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGNvbnRlbnQtbGVuZ3RoIGhlYWRlcidcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9SRVNfQ09OVEVOVF9MRU5HVEhfTUlTTUFUQ0gnXG4gIH1cbn1cblxuY2xhc3MgQ2xpZW50RGVzdHJveWVkRXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBDbGllbnREZXN0cm95ZWRFcnJvcilcbiAgICB0aGlzLm5hbWUgPSAnQ2xpZW50RGVzdHJveWVkRXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnVGhlIGNsaWVudCBpcyBkZXN0cm95ZWQnXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfREVTVFJPWUVEJ1xuICB9XG59XG5cbmNsYXNzIENsaWVudENsb3NlZEVycm9yIGV4dGVuZHMgVW5kaWNpRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgQ2xpZW50Q2xvc2VkRXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ0NsaWVudENsb3NlZEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1RoZSBjbGllbnQgaXMgY2xvc2VkJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0NMT1NFRCdcbiAgfVxufVxuXG5jbGFzcyBTb2NrZXRFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UsIHNvY2tldCkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgU29ja2V0RXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ1NvY2tldEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1NvY2tldCBlcnJvcidcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9TT0NLRVQnXG4gICAgdGhpcy5zb2NrZXQgPSBzb2NrZXRcbiAgfVxufVxuXG5jbGFzcyBOb3RTdXBwb3J0ZWRFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIE5vdFN1cHBvcnRlZEVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdOb3RTdXBwb3J0ZWRFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdOb3Qgc3VwcG9ydGVkIGVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX05PVF9TVVBQT1JURUQnXG4gIH1cbn1cblxuY2xhc3MgQmFsYW5jZWRQb29sTWlzc2luZ1Vwc3RyZWFtRXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBOb3RTdXBwb3J0ZWRFcnJvcilcbiAgICB0aGlzLm5hbWUgPSAnTWlzc2luZ1Vwc3RyZWFtRXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnTm8gdXBzdHJlYW0gaGFzIGJlZW4gYWRkZWQgdG8gdGhlIEJhbGFuY2VkUG9vbCdcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9CUExfTUlTU0lOR19VUFNUUkVBTSdcbiAgfVxufVxuXG5jbGFzcyBIVFRQUGFyc2VyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlLCBjb2RlLCBkYXRhKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBIVFRQUGFyc2VyRXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ0hUVFBQYXJzZXJFcnJvcidcbiAgICB0aGlzLmNvZGUgPSBjb2RlID8gYEhQRV8ke2NvZGV9YCA6IHVuZGVmaW5lZFxuICAgIHRoaXMuZGF0YSA9IGRhdGEgPyBkYXRhLnRvU3RyaW5nKCkgOiB1bmRlZmluZWRcbiAgfVxufVxuXG5jbGFzcyBSZXNwb25zZUV4Y2VlZGVkTWF4U2l6ZUVycm9yIGV4dGVuZHMgVW5kaWNpRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgUmVzcG9uc2VFeGNlZWRlZE1heFNpemVFcnJvcilcbiAgICB0aGlzLm5hbWUgPSAnUmVzcG9uc2VFeGNlZWRlZE1heFNpemVFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdSZXNwb25zZSBjb250ZW50IGV4Y2VlZGVkIG1heCBzaXplJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX1JFU19FWENFRURFRF9NQVhfU0laRSdcbiAgfVxufVxuXG5jbGFzcyBSZXF1ZXN0UmV0cnlFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UsIGNvZGUsIHsgaGVhZGVycywgZGF0YSB9KSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBSZXF1ZXN0UmV0cnlFcnJvcilcbiAgICB0aGlzLm5hbWUgPSAnUmVxdWVzdFJldHJ5RXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnUmVxdWVzdCByZXRyeSBlcnJvcidcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9SRVFfUkVUUlknXG4gICAgdGhpcy5zdGF0dXNDb2RlID0gY29kZVxuICAgIHRoaXMuZGF0YSA9IGRhdGFcbiAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEhUVFBQYXJzZXJFcnJvcixcbiAgVW5kaWNpRXJyb3IsXG4gIEhlYWRlcnNUaW1lb3V0RXJyb3IsXG4gIEhlYWRlcnNPdmVyZmxvd0Vycm9yLFxuICBCb2R5VGltZW91dEVycm9yLFxuICBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IsXG4gIENvbm5lY3RUaW1lb3V0RXJyb3IsXG4gIFJlc3BvbnNlU3RhdHVzQ29kZUVycm9yLFxuICBJbnZhbGlkQXJndW1lbnRFcnJvcixcbiAgSW52YWxpZFJldHVyblZhbHVlRXJyb3IsXG4gIFJlcXVlc3RBYm9ydGVkRXJyb3IsXG4gIENsaWVudERlc3Ryb3llZEVycm9yLFxuICBDbGllbnRDbG9zZWRFcnJvcixcbiAgSW5mb3JtYXRpb25hbEVycm9yLFxuICBTb2NrZXRFcnJvcixcbiAgTm90U3VwcG9ydGVkRXJyb3IsXG4gIFJlc3BvbnNlQ29udGVudExlbmd0aE1pc21hdGNoRXJyb3IsXG4gIEJhbGFuY2VkUG9vbE1pc3NpbmdVcHN0cmVhbUVycm9yLFxuICBSZXNwb25zZUV4Y2VlZGVkTWF4U2l6ZUVycm9yLFxuICBSZXF1ZXN0UmV0cnlFcnJvclxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPn0gKi9cbmNvbnN0IGhlYWRlck5hbWVMb3dlckNhc2VkUmVjb3JkID0ge31cblxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRUUC9IZWFkZXJzXG5jb25zdCB3ZWxsa25vd25IZWFkZXJOYW1lcyA9IFtcbiAgJ0FjY2VwdCcsXG4gICdBY2NlcHQtRW5jb2RpbmcnLFxuICAnQWNjZXB0LUxhbmd1YWdlJyxcbiAgJ0FjY2VwdC1SYW5nZXMnLFxuICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctQ3JlZGVudGlhbHMnLFxuICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVycycsXG4gICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzJyxcbiAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbicsXG4gICdBY2Nlc3MtQ29udHJvbC1FeHBvc2UtSGVhZGVycycsXG4gICdBY2Nlc3MtQ29udHJvbC1NYXgtQWdlJyxcbiAgJ0FjY2Vzcy1Db250cm9sLVJlcXVlc3QtSGVhZGVycycsXG4gICdBY2Nlc3MtQ29udHJvbC1SZXF1ZXN0LU1ldGhvZCcsXG4gICdBZ2UnLFxuICAnQWxsb3cnLFxuICAnQWx0LVN2YycsXG4gICdBbHQtVXNlZCcsXG4gICdBdXRob3JpemF0aW9uJyxcbiAgJ0NhY2hlLUNvbnRyb2wnLFxuICAnQ2xlYXItU2l0ZS1EYXRhJyxcbiAgJ0Nvbm5lY3Rpb24nLFxuICAnQ29udGVudC1EaXNwb3NpdGlvbicsXG4gICdDb250ZW50LUVuY29kaW5nJyxcbiAgJ0NvbnRlbnQtTGFuZ3VhZ2UnLFxuICAnQ29udGVudC1MZW5ndGgnLFxuICAnQ29udGVudC1Mb2NhdGlvbicsXG4gICdDb250ZW50LVJhbmdlJyxcbiAgJ0NvbnRlbnQtU2VjdXJpdHktUG9saWN5JyxcbiAgJ0NvbnRlbnQtU2VjdXJpdHktUG9saWN5LVJlcG9ydC1Pbmx5JyxcbiAgJ0NvbnRlbnQtVHlwZScsXG4gICdDb29raWUnLFxuICAnQ3Jvc3MtT3JpZ2luLUVtYmVkZGVyLVBvbGljeScsXG4gICdDcm9zcy1PcmlnaW4tT3BlbmVyLVBvbGljeScsXG4gICdDcm9zcy1PcmlnaW4tUmVzb3VyY2UtUG9saWN5JyxcbiAgJ0RhdGUnLFxuICAnRGV2aWNlLU1lbW9yeScsXG4gICdEb3dubGluaycsXG4gICdFQ1QnLFxuICAnRVRhZycsXG4gICdFeHBlY3QnLFxuICAnRXhwZWN0LUNUJyxcbiAgJ0V4cGlyZXMnLFxuICAnRm9yd2FyZGVkJyxcbiAgJ0Zyb20nLFxuICAnSG9zdCcsXG4gICdJZi1NYXRjaCcsXG4gICdJZi1Nb2RpZmllZC1TaW5jZScsXG4gICdJZi1Ob25lLU1hdGNoJyxcbiAgJ0lmLVJhbmdlJyxcbiAgJ0lmLVVubW9kaWZpZWQtU2luY2UnLFxuICAnS2VlcC1BbGl2ZScsXG4gICdMYXN0LU1vZGlmaWVkJyxcbiAgJ0xpbmsnLFxuICAnTG9jYXRpb24nLFxuICAnTWF4LUZvcndhcmRzJyxcbiAgJ09yaWdpbicsXG4gICdQZXJtaXNzaW9ucy1Qb2xpY3knLFxuICAnUHJhZ21hJyxcbiAgJ1Byb3h5LUF1dGhlbnRpY2F0ZScsXG4gICdQcm94eS1BdXRob3JpemF0aW9uJyxcbiAgJ1JUVCcsXG4gICdSYW5nZScsXG4gICdSZWZlcmVyJyxcbiAgJ1JlZmVycmVyLVBvbGljeScsXG4gICdSZWZyZXNoJyxcbiAgJ1JldHJ5LUFmdGVyJyxcbiAgJ1NlYy1XZWJTb2NrZXQtQWNjZXB0JyxcbiAgJ1NlYy1XZWJTb2NrZXQtRXh0ZW5zaW9ucycsXG4gICdTZWMtV2ViU29ja2V0LUtleScsXG4gICdTZWMtV2ViU29ja2V0LVByb3RvY29sJyxcbiAgJ1NlYy1XZWJTb2NrZXQtVmVyc2lvbicsXG4gICdTZXJ2ZXInLFxuICAnU2VydmVyLVRpbWluZycsXG4gICdTZXJ2aWNlLVdvcmtlci1BbGxvd2VkJyxcbiAgJ1NlcnZpY2UtV29ya2VyLU5hdmlnYXRpb24tUHJlbG9hZCcsXG4gICdTZXQtQ29va2llJyxcbiAgJ1NvdXJjZU1hcCcsXG4gICdTdHJpY3QtVHJhbnNwb3J0LVNlY3VyaXR5JyxcbiAgJ1N1cHBvcnRzLUxvYWRpbmctTW9kZScsXG4gICdURScsXG4gICdUaW1pbmctQWxsb3ctT3JpZ2luJyxcbiAgJ1RyYWlsZXInLFxuICAnVHJhbnNmZXItRW5jb2RpbmcnLFxuICAnVXBncmFkZScsXG4gICdVcGdyYWRlLUluc2VjdXJlLVJlcXVlc3RzJyxcbiAgJ1VzZXItQWdlbnQnLFxuICAnVmFyeScsXG4gICdWaWEnLFxuICAnV1dXLUF1dGhlbnRpY2F0ZScsXG4gICdYLUNvbnRlbnQtVHlwZS1PcHRpb25zJyxcbiAgJ1gtRE5TLVByZWZldGNoLUNvbnRyb2wnLFxuICAnWC1GcmFtZS1PcHRpb25zJyxcbiAgJ1gtUGVybWl0dGVkLUNyb3NzLURvbWFpbi1Qb2xpY2llcycsXG4gICdYLVBvd2VyZWQtQnknLFxuICAnWC1SZXF1ZXN0ZWQtV2l0aCcsXG4gICdYLVhTUy1Qcm90ZWN0aW9uJ1xuXVxuXG5mb3IgKGxldCBpID0gMDsgaSA8IHdlbGxrbm93bkhlYWRlck5hbWVzLmxlbmd0aDsgKytpKSB7XG4gIGNvbnN0IGtleSA9IHdlbGxrbm93bkhlYWRlck5hbWVzW2ldXG4gIGNvbnN0IGxvd2VyQ2FzZWRLZXkgPSBrZXkudG9Mb3dlckNhc2UoKVxuICBoZWFkZXJOYW1lTG93ZXJDYXNlZFJlY29yZFtrZXldID0gaGVhZGVyTmFtZUxvd2VyQ2FzZWRSZWNvcmRbbG93ZXJDYXNlZEtleV0gPVxuICAgIGxvd2VyQ2FzZWRLZXlcbn1cblxuLy8gTm90ZTogb2JqZWN0IHByb3RvdHlwZXMgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGJlIHJlZmVyZW5jZWQuIGUuZy4gYE9iamVjdCNoYXNPd25Qcm9wZXJ0eWAuXG5PYmplY3Quc2V0UHJvdG90eXBlT2YoaGVhZGVyTmFtZUxvd2VyQ2FzZWRSZWNvcmQsIG51bGwpXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB3ZWxsa25vd25IZWFkZXJOYW1lcyxcbiAgaGVhZGVyTmFtZUxvd2VyQ2FzZWRSZWNvcmRcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuY29uc3QgeyBrRGVzdHJveWVkLCBrQm9keVVzZWQgfSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IEluY29taW5nTWVzc2FnZSB9ID0gcmVxdWlyZSgnaHR0cCcpXG5jb25zdCBzdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKVxuY29uc3QgbmV0ID0gcmVxdWlyZSgnbmV0JylcbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IHJlcXVpcmUoJy4vZXJyb3JzJylcbmNvbnN0IHsgQmxvYiB9ID0gcmVxdWlyZSgnYnVmZmVyJylcbmNvbnN0IG5vZGVVdGlsID0gcmVxdWlyZSgndXRpbCcpXG5jb25zdCB7IHN0cmluZ2lmeSB9ID0gcmVxdWlyZSgncXVlcnlzdHJpbmcnKVxuY29uc3QgeyBoZWFkZXJOYW1lTG93ZXJDYXNlZFJlY29yZCB9ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuXG5jb25zdCBbbm9kZU1ham9yLCBub2RlTWlub3JdID0gcHJvY2Vzcy52ZXJzaW9ucy5ub2RlLnNwbGl0KCcuJykubWFwKHYgPT4gTnVtYmVyKHYpKVxuXG5mdW5jdGlvbiBub3AgKCkge31cblxuZnVuY3Rpb24gaXNTdHJlYW0gKG9iaikge1xuICByZXR1cm4gb2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHR5cGVvZiBvYmoucGlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLm9uID09PSAnZnVuY3Rpb24nXG59XG5cbi8vIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlLWZldGNoL2ZldGNoLWJsb2IvYmxvYi84YWI1ODdkMzQwODBkZTk0MTQwYjU0ZjA3MTY4NDUxZTdkMGI2NTVlL2luZGV4LmpzI0wyMjktTDI0MSAoTUlUIExpY2Vuc2UpXG5mdW5jdGlvbiBpc0Jsb2JMaWtlIChvYmplY3QpIHtcbiAgcmV0dXJuIChCbG9iICYmIG9iamVjdCBpbnN0YW5jZW9mIEJsb2IpIHx8IChcbiAgICBvYmplY3QgJiZcbiAgICB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJlxuICAgICh0eXBlb2Ygb2JqZWN0LnN0cmVhbSA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgdHlwZW9mIG9iamVjdC5hcnJheUJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJykgJiZcbiAgICAvXihCbG9ifEZpbGUpJC8udGVzdChvYmplY3RbU3ltYm9sLnRvU3RyaW5nVGFnXSlcbiAgKVxufVxuXG5mdW5jdGlvbiBidWlsZFVSTCAodXJsLCBxdWVyeVBhcmFtcykge1xuICBpZiAodXJsLmluY2x1ZGVzKCc/JykgfHwgdXJsLmluY2x1ZGVzKCcjJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1F1ZXJ5IHBhcmFtcyBjYW5ub3QgYmUgcGFzc2VkIHdoZW4gdXJsIGFscmVhZHkgY29udGFpbnMgXCI/XCIgb3IgXCIjXCIuJylcbiAgfVxuXG4gIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5KHF1ZXJ5UGFyYW1zKVxuXG4gIGlmIChzdHJpbmdpZmllZCkge1xuICAgIHVybCArPSAnPycgKyBzdHJpbmdpZmllZFxuICB9XG5cbiAgcmV0dXJuIHVybFxufVxuXG5mdW5jdGlvbiBwYXJzZVVSTCAodXJsKSB7XG4gIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykge1xuICAgIHVybCA9IG5ldyBVUkwodXJsKVxuXG4gICAgaWYgKCEvXmh0dHBzPzovLnRlc3QodXJsLm9yaWdpbiB8fCB1cmwucHJvdG9jb2wpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMIHByb3RvY29sOiB0aGUgVVJMIG11c3Qgc3RhcnQgd2l0aCBgaHR0cDpgIG9yIGBodHRwczpgLicpXG4gICAgfVxuXG4gICAgcmV0dXJuIHVybFxuICB9XG5cbiAgaWYgKCF1cmwgfHwgdHlwZW9mIHVybCAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMOiBUaGUgVVJMIGFyZ3VtZW50IG11c3QgYmUgYSBub24tbnVsbCBvYmplY3QuJylcbiAgfVxuXG4gIGlmICghL15odHRwcz86Ly50ZXN0KHVybC5vcmlnaW4gfHwgdXJsLnByb3RvY29sKSkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignSW52YWxpZCBVUkwgcHJvdG9jb2w6IHRoZSBVUkwgbXVzdCBzdGFydCB3aXRoIGBodHRwOmAgb3IgYGh0dHBzOmAuJylcbiAgfVxuXG4gIGlmICghKHVybCBpbnN0YW5jZW9mIFVSTCkpIHtcbiAgICBpZiAodXJsLnBvcnQgIT0gbnVsbCAmJiB1cmwucG9ydCAhPT0gJycgJiYgIU51bWJlci5pc0Zpbml0ZShwYXJzZUludCh1cmwucG9ydCkpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMOiBwb3J0IG11c3QgYmUgYSB2YWxpZCBpbnRlZ2VyIG9yIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIuJylcbiAgICB9XG5cbiAgICBpZiAodXJsLnBhdGggIT0gbnVsbCAmJiB0eXBlb2YgdXJsLnBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMIHBhdGg6IHRoZSBwYXRoIG11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbC91bmRlZmluZWQuJylcbiAgICB9XG5cbiAgICBpZiAodXJsLnBhdGhuYW1lICE9IG51bGwgJiYgdHlwZW9mIHVybC5wYXRobmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignSW52YWxpZCBVUkwgcGF0aG5hbWU6IHRoZSBwYXRobmFtZSBtdXN0IGJlIGEgc3RyaW5nIG9yIG51bGwvdW5kZWZpbmVkLicpXG4gICAgfVxuXG4gICAgaWYgKHVybC5ob3N0bmFtZSAhPSBudWxsICYmIHR5cGVvZiB1cmwuaG9zdG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMIGhvc3RuYW1lOiB0aGUgaG9zdG5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciBudWxsL3VuZGVmaW5lZC4nKVxuICAgIH1cblxuICAgIGlmICh1cmwub3JpZ2luICE9IG51bGwgJiYgdHlwZW9mIHVybC5vcmlnaW4gIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMIG9yaWdpbjogdGhlIG9yaWdpbiBtdXN0IGJlIGEgc3RyaW5nIG9yIG51bGwvdW5kZWZpbmVkLicpXG4gICAgfVxuXG4gICAgY29uc3QgcG9ydCA9IHVybC5wb3J0ICE9IG51bGxcbiAgICAgID8gdXJsLnBvcnRcbiAgICAgIDogKHVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyA0NDMgOiA4MClcbiAgICBsZXQgb3JpZ2luID0gdXJsLm9yaWdpbiAhPSBudWxsXG4gICAgICA/IHVybC5vcmlnaW5cbiAgICAgIDogYCR7dXJsLnByb3RvY29sfS8vJHt1cmwuaG9zdG5hbWV9OiR7cG9ydH1gXG4gICAgbGV0IHBhdGggPSB1cmwucGF0aCAhPSBudWxsXG4gICAgICA/IHVybC5wYXRoXG4gICAgICA6IGAke3VybC5wYXRobmFtZSB8fCAnJ30ke3VybC5zZWFyY2ggfHwgJyd9YFxuXG4gICAgaWYgKG9yaWdpbi5lbmRzV2l0aCgnLycpKSB7XG4gICAgICBvcmlnaW4gPSBvcmlnaW4uc3Vic3RyaW5nKDAsIG9yaWdpbi5sZW5ndGggLSAxKVxuICAgIH1cblxuICAgIGlmIChwYXRoICYmICFwYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgcGF0aCA9IGAvJHtwYXRofWBcbiAgICB9XG4gICAgLy8gbmV3IFVSTChwYXRoLCBvcmlnaW4pIGlzIHVuc2FmZSB3aGVuIGBwYXRoYCBjb250YWlucyBhbiBhYnNvbHV0ZSBVUkxcbiAgICAvLyBGcm9tIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9VUkwvVVJMOlxuICAgIC8vIElmIGZpcnN0IHBhcmFtZXRlciBpcyBhIHJlbGF0aXZlIFVSTCwgc2Vjb25kIHBhcmFtIGlzIHJlcXVpcmVkLCBhbmQgd2lsbCBiZSB1c2VkIGFzIHRoZSBiYXNlIFVSTC5cbiAgICAvLyBJZiBmaXJzdCBwYXJhbWV0ZXIgaXMgYW4gYWJzb2x1dGUgVVJMLCBhIGdpdmVuIHNlY29uZCBwYXJhbSB3aWxsIGJlIGlnbm9yZWQuXG4gICAgdXJsID0gbmV3IFVSTChvcmlnaW4gKyBwYXRoKVxuICB9XG5cbiAgcmV0dXJuIHVybFxufVxuXG5mdW5jdGlvbiBwYXJzZU9yaWdpbiAodXJsKSB7XG4gIHVybCA9IHBhcnNlVVJMKHVybClcblxuICBpZiAodXJsLnBhdGhuYW1lICE9PSAnLycgfHwgdXJsLnNlYXJjaCB8fCB1cmwuaGFzaCkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCB1cmwnKVxuICB9XG5cbiAgcmV0dXJuIHVybFxufVxuXG5mdW5jdGlvbiBnZXRIb3N0bmFtZSAoaG9zdCkge1xuICBpZiAoaG9zdFswXSA9PT0gJ1snKSB7XG4gICAgY29uc3QgaWR4ID0gaG9zdC5pbmRleE9mKCddJylcblxuICAgIGFzc2VydChpZHggIT09IC0xKVxuICAgIHJldHVybiBob3N0LnN1YnN0cmluZygxLCBpZHgpXG4gIH1cblxuICBjb25zdCBpZHggPSBob3N0LmluZGV4T2YoJzonKVxuICBpZiAoaWR4ID09PSAtMSkgcmV0dXJuIGhvc3RcblxuICByZXR1cm4gaG9zdC5zdWJzdHJpbmcoMCwgaWR4KVxufVxuXG4vLyBJUCBhZGRyZXNzZXMgYXJlIG5vdCB2YWxpZCBzZXJ2ZXIgbmFtZXMgcGVyIFJGQzYwNjZcbi8vID4gQ3VycmVudGx5LCB0aGUgb25seSBzZXJ2ZXIgbmFtZXMgc3VwcG9ydGVkIGFyZSBETlMgaG9zdG5hbWVzXG5mdW5jdGlvbiBnZXRTZXJ2ZXJOYW1lIChob3N0KSB7XG4gIGlmICghaG9zdCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBhc3NlcnQuc3RyaWN0RXF1YWwodHlwZW9mIGhvc3QsICdzdHJpbmcnKVxuXG4gIGNvbnN0IHNlcnZlcm5hbWUgPSBnZXRIb3N0bmFtZShob3N0KVxuICBpZiAobmV0LmlzSVAoc2VydmVybmFtZSkpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIHJldHVybiBzZXJ2ZXJuYW1lXG59XG5cbmZ1bmN0aW9uIGRlZXBDbG9uZSAob2JqKSB7XG4gIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpXG59XG5cbmZ1bmN0aW9uIGlzQXN5bmNJdGVyYWJsZSAob2JqKSB7XG4gIHJldHVybiAhIShvYmogIT0gbnVsbCAmJiB0eXBlb2Ygb2JqW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJylcbn1cblxuZnVuY3Rpb24gaXNJdGVyYWJsZSAob2JqKSB7XG4gIHJldHVybiAhIShvYmogIT0gbnVsbCAmJiAodHlwZW9mIG9ialtTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBvYmpbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nKSlcbn1cblxuZnVuY3Rpb24gYm9keUxlbmd0aCAoYm9keSkge1xuICBpZiAoYm9keSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIDBcbiAgfSBlbHNlIGlmIChpc1N0cmVhbShib2R5KSkge1xuICAgIGNvbnN0IHN0YXRlID0gYm9keS5fcmVhZGFibGVTdGF0ZVxuICAgIHJldHVybiBzdGF0ZSAmJiBzdGF0ZS5vYmplY3RNb2RlID09PSBmYWxzZSAmJiBzdGF0ZS5lbmRlZCA9PT0gdHJ1ZSAmJiBOdW1iZXIuaXNGaW5pdGUoc3RhdGUubGVuZ3RoKVxuICAgICAgPyBzdGF0ZS5sZW5ndGhcbiAgICAgIDogbnVsbFxuICB9IGVsc2UgaWYgKGlzQmxvYkxpa2UoYm9keSkpIHtcbiAgICByZXR1cm4gYm9keS5zaXplICE9IG51bGwgPyBib2R5LnNpemUgOiBudWxsXG4gIH0gZWxzZSBpZiAoaXNCdWZmZXIoYm9keSkpIHtcbiAgICByZXR1cm4gYm9keS5ieXRlTGVuZ3RoXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiBpc0Rlc3Ryb3llZCAoc3RyZWFtKSB7XG4gIHJldHVybiAhc3RyZWFtIHx8ICEhKHN0cmVhbS5kZXN0cm95ZWQgfHwgc3RyZWFtW2tEZXN0cm95ZWRdKVxufVxuXG5mdW5jdGlvbiBpc1JlYWRhYmxlQWJvcnRlZCAoc3RyZWFtKSB7XG4gIGNvbnN0IHN0YXRlID0gc3RyZWFtICYmIHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICByZXR1cm4gaXNEZXN0cm95ZWQoc3RyZWFtKSAmJiBzdGF0ZSAmJiAhc3RhdGUuZW5kRW1pdHRlZFxufVxuXG5mdW5jdGlvbiBkZXN0cm95IChzdHJlYW0sIGVycikge1xuICBpZiAoc3RyZWFtID09IG51bGwgfHwgIWlzU3RyZWFtKHN0cmVhbSkgfHwgaXNEZXN0cm95ZWQoc3RyZWFtKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKHR5cGVvZiBzdHJlYW0uZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2Yoc3RyZWFtKS5jb25zdHJ1Y3RvciA9PT0gSW5jb21pbmdNZXNzYWdlKSB7XG4gICAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzM4NTA1L2ZpbGVzXG4gICAgICBzdHJlYW0uc29ja2V0ID0gbnVsbFxuICAgIH1cblxuICAgIHN0cmVhbS5kZXN0cm95KGVycilcbiAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICBwcm9jZXNzLm5leHRUaWNrKChzdHJlYW0sIGVycikgPT4ge1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgIH0sIHN0cmVhbSwgZXJyKVxuICB9XG5cbiAgaWYgKHN0cmVhbS5kZXN0cm95ZWQgIT09IHRydWUpIHtcbiAgICBzdHJlYW1ba0Rlc3Ryb3llZF0gPSB0cnVlXG4gIH1cbn1cblxuY29uc3QgS0VFUEFMSVZFX1RJTUVPVVRfRVhQUiA9IC90aW1lb3V0PShcXGQrKS9cbmZ1bmN0aW9uIHBhcnNlS2VlcEFsaXZlVGltZW91dCAodmFsKSB7XG4gIGNvbnN0IG0gPSB2YWwudG9TdHJpbmcoKS5tYXRjaChLRUVQQUxJVkVfVElNRU9VVF9FWFBSKVxuICByZXR1cm4gbSA/IHBhcnNlSW50KG1bMV0sIDEwKSAqIDEwMDAgOiBudWxsXG59XG5cbi8qKlxuICogUmV0cmlldmVzIGEgaGVhZGVyIG5hbWUgYW5kIHJldHVybnMgaXRzIGxvd2VyY2FzZSB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgQnVmZmVyfSB2YWx1ZSBIZWFkZXIgbmFtZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gaGVhZGVyTmFtZVRvU3RyaW5nICh2YWx1ZSkge1xuICByZXR1cm4gaGVhZGVyTmFtZUxvd2VyQ2FzZWRSZWNvcmRbdmFsdWVdIHx8IHZhbHVlLnRvTG93ZXJDYXNlKClcbn1cblxuZnVuY3Rpb24gcGFyc2VIZWFkZXJzIChoZWFkZXJzLCBvYmogPSB7fSkge1xuICAvLyBGb3IgSDIgc3VwcG9ydFxuICBpZiAoIUFycmF5LmlzQXJyYXkoaGVhZGVycykpIHJldHVybiBoZWFkZXJzXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgY29uc3Qga2V5ID0gaGVhZGVyc1tpXS50b1N0cmluZygpLnRvTG93ZXJDYXNlKClcbiAgICBsZXQgdmFsID0gb2JqW2tleV1cblxuICAgIGlmICghdmFsKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzW2kgKyAxXSkpIHtcbiAgICAgICAgb2JqW2tleV0gPSBoZWFkZXJzW2kgKyAxXS5tYXAoeCA9PiB4LnRvU3RyaW5nKCd1dGY4JykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmpba2V5XSA9IGhlYWRlcnNbaSArIDFdLnRvU3RyaW5nKCd1dGY4JylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgdmFsID0gW3ZhbF1cbiAgICAgICAgb2JqW2tleV0gPSB2YWxcbiAgICAgIH1cbiAgICAgIHZhbC5wdXNoKGhlYWRlcnNbaSArIDFdLnRvU3RyaW5nKCd1dGY4JykpXG4gICAgfVxuICB9XG5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzQ2NTI4XG4gIGlmICgnY29udGVudC1sZW5ndGgnIGluIG9iaiAmJiAnY29udGVudC1kaXNwb3NpdGlvbicgaW4gb2JqKSB7XG4gICAgb2JqWydjb250ZW50LWRpc3Bvc2l0aW9uJ10gPSBCdWZmZXIuZnJvbShvYmpbJ2NvbnRlbnQtZGlzcG9zaXRpb24nXSkudG9TdHJpbmcoJ2xhdGluMScpXG4gIH1cblxuICByZXR1cm4gb2JqXG59XG5cbmZ1bmN0aW9uIHBhcnNlUmF3SGVhZGVycyAoaGVhZGVycykge1xuICBjb25zdCByZXQgPSBbXVxuICBsZXQgaGFzQ29udGVudExlbmd0aCA9IGZhbHNlXG4gIGxldCBjb250ZW50RGlzcG9zaXRpb25JZHggPSAtMVxuXG4gIGZvciAobGV0IG4gPSAwOyBuIDwgaGVhZGVycy5sZW5ndGg7IG4gKz0gMikge1xuICAgIGNvbnN0IGtleSA9IGhlYWRlcnNbbiArIDBdLnRvU3RyaW5nKClcbiAgICBjb25zdCB2YWwgPSBoZWFkZXJzW24gKyAxXS50b1N0cmluZygndXRmOCcpXG5cbiAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMTQgJiYgKGtleSA9PT0gJ2NvbnRlbnQtbGVuZ3RoJyB8fCBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtbGVuZ3RoJykpIHtcbiAgICAgIHJldC5wdXNoKGtleSwgdmFsKVxuICAgICAgaGFzQ29udGVudExlbmd0aCA9IHRydWVcbiAgICB9IGVsc2UgaWYgKGtleS5sZW5ndGggPT09IDE5ICYmIChrZXkgPT09ICdjb250ZW50LWRpc3Bvc2l0aW9uJyB8fCBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtZGlzcG9zaXRpb24nKSkge1xuICAgICAgY29udGVudERpc3Bvc2l0aW9uSWR4ID0gcmV0LnB1c2goa2V5LCB2YWwpIC0gMVxuICAgIH0gZWxzZSB7XG4gICAgICByZXQucHVzaChrZXksIHZhbClcbiAgICB9XG4gIH1cblxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL3B1bGwvNDY1MjhcbiAgaWYgKGhhc0NvbnRlbnRMZW5ndGggJiYgY29udGVudERpc3Bvc2l0aW9uSWR4ICE9PSAtMSkge1xuICAgIHJldFtjb250ZW50RGlzcG9zaXRpb25JZHhdID0gQnVmZmVyLmZyb20ocmV0W2NvbnRlbnREaXNwb3NpdGlvbklkeF0pLnRvU3RyaW5nKCdsYXRpbjEnKVxuICB9XG5cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBpc0J1ZmZlciAoYnVmZmVyKSB7XG4gIC8vIFNlZSwgaHR0cHM6Ly9naXRodWIuY29tL21jb2xsaW5hL3VuZGljaS9wdWxsLzMxOVxuICByZXR1cm4gYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSB8fCBCdWZmZXIuaXNCdWZmZXIoYnVmZmVyKVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUhhbmRsZXIgKGhhbmRsZXIsIG1ldGhvZCwgdXBncmFkZSkge1xuICBpZiAoIWhhbmRsZXIgfHwgdHlwZW9mIGhhbmRsZXIgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdoYW5kbGVyIG11c3QgYmUgYW4gb2JqZWN0JylcbiAgfVxuXG4gIGlmICh0eXBlb2YgaGFuZGxlci5vbkNvbm5lY3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgb25Db25uZWN0IG1ldGhvZCcpXG4gIH1cblxuICBpZiAodHlwZW9mIGhhbmRsZXIub25FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvbkVycm9yIG1ldGhvZCcpXG4gIH1cblxuICBpZiAodHlwZW9mIGhhbmRsZXIub25Cb2R5U2VudCAhPT0gJ2Z1bmN0aW9uJyAmJiBoYW5kbGVyLm9uQm9keVNlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvbkJvZHlTZW50IG1ldGhvZCcpXG4gIH1cblxuICBpZiAodXBncmFkZSB8fCBtZXRob2QgPT09ICdDT05ORUNUJykge1xuICAgIGlmICh0eXBlb2YgaGFuZGxlci5vblVwZ3JhZGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvblVwZ3JhZGUgbWV0aG9kJylcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiBoYW5kbGVyLm9uSGVhZGVycyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9uSGVhZGVycyBtZXRob2QnKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaGFuZGxlci5vbkRhdGEgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvbkRhdGEgbWV0aG9kJylcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGhhbmRsZXIub25Db21wbGV0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9uQ29tcGxldGUgbWV0aG9kJylcbiAgICB9XG4gIH1cbn1cblxuLy8gQSBib2R5IGlzIGRpc3R1cmJlZCBpZiBpdCBoYXMgYmVlbiByZWFkIGZyb20gYW5kIGl0IGNhbm5vdFxuLy8gYmUgcmUtdXNlZCB3aXRob3V0IGxvc2luZyBzdGF0ZSBvciBkYXRhLlxuZnVuY3Rpb24gaXNEaXN0dXJiZWQgKGJvZHkpIHtcbiAgcmV0dXJuICEhKGJvZHkgJiYgKFxuICAgIHN0cmVhbS5pc0Rpc3R1cmJlZFxuICAgICAgPyBzdHJlYW0uaXNEaXN0dXJiZWQoYm9keSkgfHwgYm9keVtrQm9keVVzZWRdIC8vIFRPRE8gKGZpeCk6IFdoeSBpcyBib2R5W2tCb2R5VXNlZF0gbmVlZGVkP1xuICAgICAgOiBib2R5W2tCb2R5VXNlZF0gfHxcbiAgICAgICAgYm9keS5yZWFkYWJsZURpZFJlYWQgfHxcbiAgICAgICAgKGJvZHkuX3JlYWRhYmxlU3RhdGUgJiYgYm9keS5fcmVhZGFibGVTdGF0ZS5kYXRhRW1pdHRlZCkgfHxcbiAgICAgICAgaXNSZWFkYWJsZUFib3J0ZWQoYm9keSlcbiAgKSlcbn1cblxuZnVuY3Rpb24gaXNFcnJvcmVkIChib2R5KSB7XG4gIHJldHVybiAhIShib2R5ICYmIChcbiAgICBzdHJlYW0uaXNFcnJvcmVkXG4gICAgICA/IHN0cmVhbS5pc0Vycm9yZWQoYm9keSlcbiAgICAgIDogL3N0YXRlOiAnZXJyb3JlZCcvLnRlc3Qobm9kZVV0aWwuaW5zcGVjdChib2R5KVxuICAgICAgKSkpXG59XG5cbmZ1bmN0aW9uIGlzUmVhZGFibGUgKGJvZHkpIHtcbiAgcmV0dXJuICEhKGJvZHkgJiYgKFxuICAgIHN0cmVhbS5pc1JlYWRhYmxlXG4gICAgICA/IHN0cmVhbS5pc1JlYWRhYmxlKGJvZHkpXG4gICAgICA6IC9zdGF0ZTogJ3JlYWRhYmxlJy8udGVzdChub2RlVXRpbC5pbnNwZWN0KGJvZHkpXG4gICAgICApKSlcbn1cblxuZnVuY3Rpb24gZ2V0U29ja2V0SW5mbyAoc29ja2V0KSB7XG4gIHJldHVybiB7XG4gICAgbG9jYWxBZGRyZXNzOiBzb2NrZXQubG9jYWxBZGRyZXNzLFxuICAgIGxvY2FsUG9ydDogc29ja2V0LmxvY2FsUG9ydCxcbiAgICByZW1vdGVBZGRyZXNzOiBzb2NrZXQucmVtb3RlQWRkcmVzcyxcbiAgICByZW1vdGVQb3J0OiBzb2NrZXQucmVtb3RlUG9ydCxcbiAgICByZW1vdGVGYW1pbHk6IHNvY2tldC5yZW1vdGVGYW1pbHksXG4gICAgdGltZW91dDogc29ja2V0LnRpbWVvdXQsXG4gICAgYnl0ZXNXcml0dGVuOiBzb2NrZXQuYnl0ZXNXcml0dGVuLFxuICAgIGJ5dGVzUmVhZDogc29ja2V0LmJ5dGVzUmVhZFxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uICogY29udmVydEl0ZXJhYmxlVG9CdWZmZXIgKGl0ZXJhYmxlKSB7XG4gIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgaXRlcmFibGUpIHtcbiAgICB5aWVsZCBCdWZmZXIuaXNCdWZmZXIoY2h1bmspID8gY2h1bmsgOiBCdWZmZXIuZnJvbShjaHVuaylcbiAgfVxufVxuXG5sZXQgUmVhZGFibGVTdHJlYW1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRnJvbSAoaXRlcmFibGUpIHtcbiAgaWYgKCFSZWFkYWJsZVN0cmVhbSkge1xuICAgIFJlYWRhYmxlU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtL3dlYicpLlJlYWRhYmxlU3RyZWFtXG4gIH1cblxuICBpZiAoUmVhZGFibGVTdHJlYW0uZnJvbSkge1xuICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbS5mcm9tKGNvbnZlcnRJdGVyYWJsZVRvQnVmZmVyKGl0ZXJhYmxlKSlcbiAgfVxuXG4gIGxldCBpdGVyYXRvclxuICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKFxuICAgIHtcbiAgICAgIGFzeW5jIHN0YXJ0ICgpIHtcbiAgICAgICAgaXRlcmF0b3IgPSBpdGVyYWJsZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKVxuICAgICAgfSxcbiAgICAgIGFzeW5jIHB1bGwgKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgaXRlcmF0b3IubmV4dCgpXG4gICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBidWYgPSBCdWZmZXIuaXNCdWZmZXIodmFsdWUpID8gdmFsdWUgOiBCdWZmZXIuZnJvbSh2YWx1ZSlcbiAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUobmV3IFVpbnQ4QXJyYXkoYnVmKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udHJvbGxlci5kZXNpcmVkU2l6ZSA+IDBcbiAgICAgIH0sXG4gICAgICBhc3luYyBjYW5jZWwgKHJlYXNvbikge1xuICAgICAgICBhd2FpdCBpdGVyYXRvci5yZXR1cm4oKVxuICAgICAgfVxuICAgIH0sXG4gICAgMFxuICApXG59XG5cbi8vIFRoZSBjaHVuayBzaG91bGQgYmUgYSBGb3JtRGF0YSBpbnN0YW5jZSBhbmQgY29udGFpbnNcbi8vIGFsbCB0aGUgcmVxdWlyZWQgbWV0aG9kcy5cbmZ1bmN0aW9uIGlzRm9ybURhdGFMaWtlIChvYmplY3QpIHtcbiAgcmV0dXJuIChcbiAgICBvYmplY3QgJiZcbiAgICB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJlxuICAgIHR5cGVvZiBvYmplY3QuYXBwZW5kID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIG9iamVjdC5kZWxldGUgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2Ygb2JqZWN0LmdldCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBvYmplY3QuZ2V0QWxsID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIG9iamVjdC5oYXMgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2Ygb2JqZWN0LnNldCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIG9iamVjdFtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnRm9ybURhdGEnXG4gIClcbn1cblxuZnVuY3Rpb24gdGhyb3dJZkFib3J0ZWQgKHNpZ25hbCkge1xuICBpZiAoIXNpZ25hbCkgeyByZXR1cm4gfVxuICBpZiAodHlwZW9mIHNpZ25hbC50aHJvd0lmQWJvcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHNpZ25hbC50aHJvd0lmQWJvcnRlZCgpXG4gIH0gZWxzZSB7XG4gICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAvLyBET01FeGNlcHRpb24gbm90IGF2YWlsYWJsZSA8IHYxNy4wLjBcbiAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcignVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZCcpXG4gICAgICBlcnIubmFtZSA9ICdBYm9ydEVycm9yJ1xuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZEFib3J0TGlzdGVuZXIgKHNpZ25hbCwgbGlzdGVuZXIpIHtcbiAgaWYgKCdhZGRFdmVudExpc3RlbmVyJyBpbiBzaWduYWwpIHtcbiAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBsaXN0ZW5lciwgeyBvbmNlOiB0cnVlIH0pXG4gICAgcmV0dXJuICgpID0+IHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGxpc3RlbmVyKVxuICB9XG4gIHNpZ25hbC5hZGRMaXN0ZW5lcignYWJvcnQnLCBsaXN0ZW5lcilcbiAgcmV0dXJuICgpID0+IHNpZ25hbC5yZW1vdmVMaXN0ZW5lcignYWJvcnQnLCBsaXN0ZW5lcilcbn1cblxuY29uc3QgaGFzVG9XZWxsRm9ybWVkID0gISFTdHJpbmcucHJvdG90eXBlLnRvV2VsbEZvcm1lZFxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWxcbiAqL1xuZnVuY3Rpb24gdG9VU1ZTdHJpbmcgKHZhbCkge1xuICBpZiAoaGFzVG9XZWxsRm9ybWVkKSB7XG4gICAgcmV0dXJuIGAke3ZhbH1gLnRvV2VsbEZvcm1lZCgpXG4gIH0gZWxzZSBpZiAobm9kZVV0aWwudG9VU1ZTdHJpbmcpIHtcbiAgICByZXR1cm4gbm9kZVV0aWwudG9VU1ZTdHJpbmcodmFsKVxuICB9XG5cbiAgcmV0dXJuIGAke3ZhbH1gXG59XG5cbi8vIFBhcnNlZCBhY2NvcmRpbmdseSB0byBSRkMgOTExMFxuLy8gaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzkxMTAjZmllbGQuY29udGVudC1yYW5nZVxuZnVuY3Rpb24gcGFyc2VSYW5nZUhlYWRlciAocmFuZ2UpIHtcbiAgaWYgKHJhbmdlID09IG51bGwgfHwgcmFuZ2UgPT09ICcnKSByZXR1cm4geyBzdGFydDogMCwgZW5kOiBudWxsLCBzaXplOiBudWxsIH1cblxuICBjb25zdCBtID0gcmFuZ2UgPyByYW5nZS5tYXRjaCgvXmJ5dGVzIChcXGQrKS0oXFxkKylcXC8oXFxkKyk/JC8pIDogbnVsbFxuICByZXR1cm4gbVxuICAgID8ge1xuICAgICAgICBzdGFydDogcGFyc2VJbnQobVsxXSksXG4gICAgICAgIGVuZDogbVsyXSA/IHBhcnNlSW50KG1bMl0pIDogbnVsbCxcbiAgICAgICAgc2l6ZTogbVszXSA/IHBhcnNlSW50KG1bM10pIDogbnVsbFxuICAgICAgfVxuICAgIDogbnVsbFxufVxuXG5jb25zdCBrRW51bWVyYWJsZVByb3BlcnR5ID0gT2JqZWN0LmNyZWF0ZShudWxsKVxua0VudW1lcmFibGVQcm9wZXJ0eS5lbnVtZXJhYmxlID0gdHJ1ZVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgbm9wLFxuICBpc0Rpc3R1cmJlZCxcbiAgaXNFcnJvcmVkLFxuICBpc1JlYWRhYmxlLFxuICB0b1VTVlN0cmluZyxcbiAgaXNSZWFkYWJsZUFib3J0ZWQsXG4gIGlzQmxvYkxpa2UsXG4gIHBhcnNlT3JpZ2luLFxuICBwYXJzZVVSTCxcbiAgZ2V0U2VydmVyTmFtZSxcbiAgaXNTdHJlYW0sXG4gIGlzSXRlcmFibGUsXG4gIGlzQXN5bmNJdGVyYWJsZSxcbiAgaXNEZXN0cm95ZWQsXG4gIGhlYWRlck5hbWVUb1N0cmluZyxcbiAgcGFyc2VSYXdIZWFkZXJzLFxuICBwYXJzZUhlYWRlcnMsXG4gIHBhcnNlS2VlcEFsaXZlVGltZW91dCxcbiAgZGVzdHJveSxcbiAgYm9keUxlbmd0aCxcbiAgZGVlcENsb25lLFxuICBSZWFkYWJsZVN0cmVhbUZyb20sXG4gIGlzQnVmZmVyLFxuICB2YWxpZGF0ZUhhbmRsZXIsXG4gIGdldFNvY2tldEluZm8sXG4gIGlzRm9ybURhdGFMaWtlLFxuICBidWlsZFVSTCxcbiAgdGhyb3dJZkFib3J0ZWQsXG4gIGFkZEFib3J0TGlzdGVuZXIsXG4gIHBhcnNlUmFuZ2VIZWFkZXIsXG4gIG5vZGVNYWpvcixcbiAgbm9kZU1pbm9yLFxuICBub2RlSGFzQXV0b1NlbGVjdEZhbWlseTogbm9kZU1ham9yID4gMTggfHwgKG5vZGVNYWpvciA9PT0gMTggJiYgbm9kZU1pbm9yID49IDEzKSxcbiAgc2FmZUhUVFBNZXRob2RzOiBbJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnLCAnVFJBQ0UnXVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmxldCBmYXN0Tm93ID0gRGF0ZS5ub3coKVxubGV0IGZhc3ROb3dUaW1lb3V0XG5cbmNvbnN0IGZhc3RUaW1lcnMgPSBbXVxuXG5mdW5jdGlvbiBvblRpbWVvdXQgKCkge1xuICBmYXN0Tm93ID0gRGF0ZS5ub3coKVxuXG4gIGxldCBsZW4gPSBmYXN0VGltZXJzLmxlbmd0aFxuICBsZXQgaWR4ID0gMFxuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgY29uc3QgdGltZXIgPSBmYXN0VGltZXJzW2lkeF1cblxuICAgIGlmICh0aW1lci5zdGF0ZSA9PT0gMCkge1xuICAgICAgdGltZXIuc3RhdGUgPSBmYXN0Tm93ICsgdGltZXIuZGVsYXlcbiAgICB9IGVsc2UgaWYgKHRpbWVyLnN0YXRlID4gMCAmJiBmYXN0Tm93ID49IHRpbWVyLnN0YXRlKSB7XG4gICAgICB0aW1lci5zdGF0ZSA9IC0xXG4gICAgICB0aW1lci5jYWxsYmFjayh0aW1lci5vcGFxdWUpXG4gICAgfVxuXG4gICAgaWYgKHRpbWVyLnN0YXRlID09PSAtMSkge1xuICAgICAgdGltZXIuc3RhdGUgPSAtMlxuICAgICAgaWYgKGlkeCAhPT0gbGVuIC0gMSkge1xuICAgICAgICBmYXN0VGltZXJzW2lkeF0gPSBmYXN0VGltZXJzLnBvcCgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmYXN0VGltZXJzLnBvcCgpXG4gICAgICB9XG4gICAgICBsZW4gLT0gMVxuICAgIH0gZWxzZSB7XG4gICAgICBpZHggKz0gMVxuICAgIH1cbiAgfVxuXG4gIGlmIChmYXN0VGltZXJzLmxlbmd0aCA+IDApIHtcbiAgICByZWZyZXNoVGltZW91dCgpXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVmcmVzaFRpbWVvdXQgKCkge1xuICBpZiAoZmFzdE5vd1RpbWVvdXQgJiYgZmFzdE5vd1RpbWVvdXQucmVmcmVzaCkge1xuICAgIGZhc3ROb3dUaW1lb3V0LnJlZnJlc2goKVxuICB9IGVsc2Uge1xuICAgIGNsZWFyVGltZW91dChmYXN0Tm93VGltZW91dClcbiAgICBmYXN0Tm93VGltZW91dCA9IHNldFRpbWVvdXQob25UaW1lb3V0LCAxZTMpXG4gICAgaWYgKGZhc3ROb3dUaW1lb3V0LnVucmVmKSB7XG4gICAgICBmYXN0Tm93VGltZW91dC51bnJlZigpXG4gICAgfVxuICB9XG59XG5cbmNsYXNzIFRpbWVvdXQge1xuICBjb25zdHJ1Y3RvciAoY2FsbGJhY2ssIGRlbGF5LCBvcGFxdWUpIHtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2tcbiAgICB0aGlzLmRlbGF5ID0gZGVsYXlcbiAgICB0aGlzLm9wYXF1ZSA9IG9wYXF1ZVxuXG4gICAgLy8gIC0yIG5vdCBpbiB0aW1lciBsaXN0XG4gICAgLy8gIC0xIGluIHRpbWVyIGxpc3QgYnV0IGluYWN0aXZlXG4gICAgLy8gICAwIGluIHRpbWVyIGxpc3Qgd2FpdGluZyBmb3IgdGltZVxuICAgIC8vID4gMCBpbiB0aW1lciBsaXN0IHdhaXRpbmcgZm9yIHRpbWUgdG8gZXhwaXJlXG4gICAgdGhpcy5zdGF0ZSA9IC0yXG5cbiAgICB0aGlzLnJlZnJlc2goKVxuICB9XG5cbiAgcmVmcmVzaCAoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09IC0yKSB7XG4gICAgICBmYXN0VGltZXJzLnB1c2godGhpcylcbiAgICAgIGlmICghZmFzdE5vd1RpbWVvdXQgfHwgZmFzdFRpbWVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmVmcmVzaFRpbWVvdXQoKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSAwXG4gIH1cblxuICBjbGVhciAoKSB7XG4gICAgdGhpcy5zdGF0ZSA9IC0xXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldFRpbWVvdXQgKGNhbGxiYWNrLCBkZWxheSwgb3BhcXVlKSB7XG4gICAgcmV0dXJuIGRlbGF5IDwgMWUzXG4gICAgICA/IHNldFRpbWVvdXQoY2FsbGJhY2ssIGRlbGF5LCBvcGFxdWUpXG4gICAgICA6IG5ldyBUaW1lb3V0KGNhbGxiYWNrLCBkZWxheSwgb3BhcXVlKVxuICB9LFxuICBjbGVhclRpbWVvdXQgKHRpbWVvdXQpIHtcbiAgICBpZiAodGltZW91dCBpbnN0YW5jZW9mIFRpbWVvdXQpIHtcbiAgICAgIHRpbWVvdXQuY2xlYXIoKVxuICAgIH0gZWxzZSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dClcbiAgICB9XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIENvcHlyaWdodCBCcmlhbiBXaGl0ZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tc2NkZXgvc3RyZWFtc2VhcmNoXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbiAqIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4gKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3JcbiAqIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkdcbiAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1NcbiAqIElOIFRIRSBTT0ZUV0FSRS5cbiAqXG4gKiBCYXNlZCBoZWF2aWx5IG9uIHRoZSBTdHJlYW1pbmcgQm95ZXItTW9vcmUtSG9yc3Bvb2wgQysrIGltcGxlbWVudGF0aW9uXG4gKiBieSBIb25nbGkgTGFpIGF0OiBodHRwczovL2dpdGh1Yi5jb20vRm9vQmFyV2lkZ2V0L2JveWVyLW1vb3JlLWhvcnNwb29sXG4gKi9cbmNvbnN0IEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ25vZGU6ZXZlbnRzJykuRXZlbnRFbWl0dGVyXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ25vZGU6dXRpbCcpLmluaGVyaXRzXG5cbmZ1bmN0aW9uIFNCTUggKG5lZWRsZSkge1xuICBpZiAodHlwZW9mIG5lZWRsZSA9PT0gJ3N0cmluZycpIHtcbiAgICBuZWVkbGUgPSBCdWZmZXIuZnJvbShuZWVkbGUpXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihuZWVkbGUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIG5lZWRsZSBoYXMgdG8gYmUgYSBTdHJpbmcgb3IgYSBCdWZmZXIuJylcbiAgfVxuXG4gIGNvbnN0IG5lZWRsZUxlbmd0aCA9IG5lZWRsZS5sZW5ndGhcblxuICBpZiAobmVlZGxlTGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgbmVlZGxlIGNhbm5vdCBiZSBhbiBlbXB0eSBTdHJpbmcvQnVmZmVyLicpXG4gIH1cblxuICBpZiAobmVlZGxlTGVuZ3RoID4gMjU2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgbmVlZGxlIGNhbm5vdCBoYXZlIGEgbGVuZ3RoIGJpZ2dlciB0aGFuIDI1Ni4nKVxuICB9XG5cbiAgdGhpcy5tYXhNYXRjaGVzID0gSW5maW5pdHlcbiAgdGhpcy5tYXRjaGVzID0gMFxuXG4gIHRoaXMuX29jYyA9IG5ldyBBcnJheSgyNTYpXG4gICAgLmZpbGwobmVlZGxlTGVuZ3RoKSAvLyBJbml0aWFsaXplIG9jY3VycmVuY2UgdGFibGUuXG4gIHRoaXMuX2xvb2tiZWhpbmRfc2l6ZSA9IDBcbiAgdGhpcy5fbmVlZGxlID0gbmVlZGxlXG4gIHRoaXMuX2J1ZnBvcyA9IDBcblxuICB0aGlzLl9sb29rYmVoaW5kID0gQnVmZmVyLmFsbG9jKG5lZWRsZUxlbmd0aClcblxuICAvLyBQb3B1bGF0ZSBvY2N1cnJlbmNlIHRhYmxlIHdpdGggYW5hbHlzaXMgb2YgdGhlIG5lZWRsZSxcbiAgLy8gaWdub3JpbmcgbGFzdCBsZXR0ZXIuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbmVlZGxlTGVuZ3RoIC0gMTsgKytpKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdmFyXG4gICAgdGhpcy5fb2NjW25lZWRsZVtpXV0gPSBuZWVkbGVMZW5ndGggLSAxIC0gaVxuICB9XG59XG5pbmhlcml0cyhTQk1ILCBFdmVudEVtaXR0ZXIpXG5cblNCTUgucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9sb29rYmVoaW5kX3NpemUgPSAwXG4gIHRoaXMubWF0Y2hlcyA9IDBcbiAgdGhpcy5fYnVmcG9zID0gMFxufVxuXG5TQk1ILnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBwb3MpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoY2h1bmspKSB7XG4gICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgJ2JpbmFyeScpXG4gIH1cbiAgY29uc3QgY2hsZW4gPSBjaHVuay5sZW5ndGhcbiAgdGhpcy5fYnVmcG9zID0gcG9zIHx8IDBcbiAgbGV0IHJcbiAgd2hpbGUgKHIgIT09IGNobGVuICYmIHRoaXMubWF0Y2hlcyA8IHRoaXMubWF4TWF0Y2hlcykgeyByID0gdGhpcy5fc2JtaF9mZWVkKGNodW5rKSB9XG4gIHJldHVybiByXG59XG5cblNCTUgucHJvdG90eXBlLl9zYm1oX2ZlZWQgPSBmdW5jdGlvbiAoZGF0YSkge1xuICBjb25zdCBsZW4gPSBkYXRhLmxlbmd0aFxuICBjb25zdCBuZWVkbGUgPSB0aGlzLl9uZWVkbGVcbiAgY29uc3QgbmVlZGxlTGVuZ3RoID0gbmVlZGxlLmxlbmd0aFxuICBjb25zdCBsYXN0TmVlZGxlQ2hhciA9IG5lZWRsZVtuZWVkbGVMZW5ndGggLSAxXVxuXG4gIC8vIFBvc2l0aXZlOiBwb2ludHMgdG8gYSBwb3NpdGlvbiBpbiBgZGF0YWBcbiAgLy8gICAgICAgICAgIHBvcyA9PSAzIHBvaW50cyB0byBkYXRhWzNdXG4gIC8vIE5lZ2F0aXZlOiBwb2ludHMgdG8gYSBwb3NpdGlvbiBpbiB0aGUgbG9va2JlaGluZCBidWZmZXJcbiAgLy8gICAgICAgICAgIHBvcyA9PSAtMiBwb2ludHMgdG8gbG9va2JlaGluZFtsb29rYmVoaW5kX3NpemUgLSAyXVxuICBsZXQgcG9zID0gLXRoaXMuX2xvb2tiZWhpbmRfc2l6ZVxuICBsZXQgY2hcblxuICBpZiAocG9zIDwgMCkge1xuICAgIC8vIExvb2tiZWhpbmQgYnVmZmVyIGlzIG5vdCBlbXB0eS4gUGVyZm9ybSBCb3llci1Nb29yZS1Ib3JzcG9vbFxuICAgIC8vIHNlYXJjaCB3aXRoIGNoYXJhY3RlciBsb29rdXAgY29kZSB0aGF0IGNvbnNpZGVycyBib3RoIHRoZVxuICAgIC8vIGxvb2tiZWhpbmQgYnVmZmVyIGFuZCB0aGUgY3VycmVudCByb3VuZCdzIGhheXN0YWNrIGRhdGEuXG4gICAgLy9cbiAgICAvLyBMb29wIHVudGlsXG4gICAgLy8gICB0aGVyZSBpcyBhIG1hdGNoLlxuICAgIC8vIG9yIHVudGlsXG4gICAgLy8gICB3ZSd2ZSBtb3ZlZCBwYXN0IHRoZSBwb3NpdGlvbiB0aGF0IHJlcXVpcmVzIHRoZVxuICAgIC8vICAgbG9va2JlaGluZCBidWZmZXIuIEluIHRoaXMgY2FzZSB3ZSBzd2l0Y2ggdG8gdGhlXG4gICAgLy8gICBvcHRpbWl6ZWQgbG9vcC5cbiAgICAvLyBvciB1bnRpbFxuICAgIC8vICAgdGhlIGNoYXJhY3RlciB0byBsb29rIGF0IGxpZXMgb3V0c2lkZSB0aGUgaGF5c3RhY2suXG4gICAgd2hpbGUgKHBvcyA8IDAgJiYgcG9zIDw9IGxlbiAtIG5lZWRsZUxlbmd0aCkge1xuICAgICAgY2ggPSB0aGlzLl9zYm1oX2xvb2t1cF9jaGFyKGRhdGEsIHBvcyArIG5lZWRsZUxlbmd0aCAtIDEpXG5cbiAgICAgIGlmIChcbiAgICAgICAgY2ggPT09IGxhc3ROZWVkbGVDaGFyICYmXG4gICAgICAgIHRoaXMuX3NibWhfbWVtY21wKGRhdGEsIHBvcywgbmVlZGxlTGVuZ3RoIC0gMSlcbiAgICAgICkge1xuICAgICAgICB0aGlzLl9sb29rYmVoaW5kX3NpemUgPSAwXG4gICAgICAgICsrdGhpcy5tYXRjaGVzXG4gICAgICAgIHRoaXMuZW1pdCgnaW5mbycsIHRydWUpXG5cbiAgICAgICAgcmV0dXJuICh0aGlzLl9idWZwb3MgPSBwb3MgKyBuZWVkbGVMZW5ndGgpXG4gICAgICB9XG4gICAgICBwb3MgKz0gdGhpcy5fb2NjW2NoXVxuICAgIH1cblxuICAgIC8vIE5vIG1hdGNoLlxuXG4gICAgaWYgKHBvcyA8IDApIHtcbiAgICAgIC8vIFRoZXJlJ3MgdG9vIGZldyBkYXRhIGZvciBCb3llci1Nb29yZS1Ib3JzcG9vbCB0byBydW4sXG4gICAgICAvLyBzbyBsZXQncyB1c2UgYSBkaWZmZXJlbnQgYWxnb3JpdGhtIHRvIHNraXAgYXMgbXVjaCBhc1xuICAgICAgLy8gd2UgY2FuLlxuICAgICAgLy8gRm9yd2FyZCBwb3MgdW50aWxcbiAgICAgIC8vICAgdGhlIHRyYWlsaW5nIHBhcnQgb2YgbG9va2JlaGluZCArIGRhdGFcbiAgICAgIC8vICAgbG9va3MgbGlrZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZWVkbGVcbiAgICAgIC8vIG9yIHVudGlsXG4gICAgICAvLyAgIHBvcyA9PSAwXG4gICAgICB3aGlsZSAocG9zIDwgMCAmJiAhdGhpcy5fc2JtaF9tZW1jbXAoZGF0YSwgcG9zLCBsZW4gLSBwb3MpKSB7ICsrcG9zIH1cbiAgICB9XG5cbiAgICBpZiAocG9zID49IDApIHtcbiAgICAgIC8vIERpc2NhcmQgbG9va2JlaGluZCBidWZmZXIuXG4gICAgICB0aGlzLmVtaXQoJ2luZm8nLCBmYWxzZSwgdGhpcy5fbG9va2JlaGluZCwgMCwgdGhpcy5fbG9va2JlaGluZF9zaXplKVxuICAgICAgdGhpcy5fbG9va2JlaGluZF9zaXplID0gMFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDdXQgb2ZmIHBhcnQgb2YgdGhlIGxvb2tiZWhpbmQgYnVmZmVyIHRoYXQgaGFzXG4gICAgICAvLyBiZWVuIHByb2Nlc3NlZCBhbmQgYXBwZW5kIHRoZSBlbnRpcmUgaGF5c3RhY2tcbiAgICAgIC8vIGludG8gaXQuXG4gICAgICBjb25zdCBieXRlc1RvQ3V0T2ZmID0gdGhpcy5fbG9va2JlaGluZF9zaXplICsgcG9zXG4gICAgICBpZiAoYnl0ZXNUb0N1dE9mZiA+IDApIHtcbiAgICAgICAgLy8gVGhlIGN1dCBvZmYgZGF0YSBpcyBndWFyYW50ZWVkIG5vdCB0byBjb250YWluIHRoZSBuZWVkbGUuXG4gICAgICAgIHRoaXMuZW1pdCgnaW5mbycsIGZhbHNlLCB0aGlzLl9sb29rYmVoaW5kLCAwLCBieXRlc1RvQ3V0T2ZmKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9sb29rYmVoaW5kLmNvcHkodGhpcy5fbG9va2JlaGluZCwgMCwgYnl0ZXNUb0N1dE9mZixcbiAgICAgICAgdGhpcy5fbG9va2JlaGluZF9zaXplIC0gYnl0ZXNUb0N1dE9mZilcbiAgICAgIHRoaXMuX2xvb2tiZWhpbmRfc2l6ZSAtPSBieXRlc1RvQ3V0T2ZmXG5cbiAgICAgIGRhdGEuY29weSh0aGlzLl9sb29rYmVoaW5kLCB0aGlzLl9sb29rYmVoaW5kX3NpemUpXG4gICAgICB0aGlzLl9sb29rYmVoaW5kX3NpemUgKz0gbGVuXG5cbiAgICAgIHRoaXMuX2J1ZnBvcyA9IGxlblxuICAgICAgcmV0dXJuIGxlblxuICAgIH1cbiAgfVxuXG4gIHBvcyArPSAocG9zID49IDApICogdGhpcy5fYnVmcG9zXG5cbiAgLy8gTG9va2JlaGluZCBidWZmZXIgaXMgbm93IGVtcHR5LiBXZSBvbmx5IG5lZWQgdG8gY2hlY2sgaWYgdGhlXG4gIC8vIG5lZWRsZSBpcyBpbiB0aGUgaGF5c3RhY2suXG4gIGlmIChkYXRhLmluZGV4T2YobmVlZGxlLCBwb3MpICE9PSAtMSkge1xuICAgIHBvcyA9IGRhdGEuaW5kZXhPZihuZWVkbGUsIHBvcylcbiAgICArK3RoaXMubWF0Y2hlc1xuICAgIGlmIChwb3MgPiAwKSB7IHRoaXMuZW1pdCgnaW5mbycsIHRydWUsIGRhdGEsIHRoaXMuX2J1ZnBvcywgcG9zKSB9IGVsc2UgeyB0aGlzLmVtaXQoJ2luZm8nLCB0cnVlKSB9XG5cbiAgICByZXR1cm4gKHRoaXMuX2J1ZnBvcyA9IHBvcyArIG5lZWRsZUxlbmd0aClcbiAgfSBlbHNlIHtcbiAgICBwb3MgPSBsZW4gLSBuZWVkbGVMZW5ndGhcbiAgfVxuXG4gIC8vIFRoZXJlIHdhcyBubyBtYXRjaC4gSWYgdGhlcmUncyB0cmFpbGluZyBoYXlzdGFjayBkYXRhIHRoYXQgd2UgY2Fubm90XG4gIC8vIG1hdGNoIHlldCB1c2luZyB0aGUgQm95ZXItTW9vcmUtSG9yc3Bvb2wgYWxnb3JpdGhtIChiZWNhdXNlIHRoZSB0cmFpbGluZ1xuICAvLyBkYXRhIGlzIGxlc3MgdGhhbiB0aGUgbmVlZGxlIHNpemUpIHRoZW4gbWF0Y2ggdXNpbmcgYSBtb2RpZmllZFxuICAvLyBhbGdvcml0aG0gdGhhdCBzdGFydHMgbWF0Y2hpbmcgZnJvbSB0aGUgYmVnaW5uaW5nIGluc3RlYWQgb2YgdGhlIGVuZC5cbiAgLy8gV2hhdGV2ZXIgdHJhaWxpbmcgZGF0YSBpcyBsZWZ0IGFmdGVyIHJ1bm5pbmcgdGhpcyBhbGdvcml0aG0gaXMgYWRkZWQgdG9cbiAgLy8gdGhlIGxvb2tiZWhpbmQgYnVmZmVyLlxuICB3aGlsZSAoXG4gICAgcG9zIDwgbGVuICYmXG4gICAgKFxuICAgICAgZGF0YVtwb3NdICE9PSBuZWVkbGVbMF0gfHxcbiAgICAgIChcbiAgICAgICAgKEJ1ZmZlci5jb21wYXJlKFxuICAgICAgICAgIGRhdGEuc3ViYXJyYXkocG9zLCBwb3MgKyBsZW4gLSBwb3MpLFxuICAgICAgICAgIG5lZWRsZS5zdWJhcnJheSgwLCBsZW4gLSBwb3MpXG4gICAgICAgICkgIT09IDApXG4gICAgICApXG4gICAgKVxuICApIHtcbiAgICArK3Bvc1xuICB9XG4gIGlmIChwb3MgPCBsZW4pIHtcbiAgICBkYXRhLmNvcHkodGhpcy5fbG9va2JlaGluZCwgMCwgcG9zLCBwb3MgKyAobGVuIC0gcG9zKSlcbiAgICB0aGlzLl9sb29rYmVoaW5kX3NpemUgPSBsZW4gLSBwb3NcbiAgfVxuXG4gIC8vIEV2ZXJ5dGhpbmcgdW50aWwgcG9zIGlzIGd1YXJhbnRlZWQgbm90IHRvIGNvbnRhaW4gbmVlZGxlIGRhdGEuXG4gIGlmIChwb3MgPiAwKSB7IHRoaXMuZW1pdCgnaW5mbycsIGZhbHNlLCBkYXRhLCB0aGlzLl9idWZwb3MsIHBvcyA8IGxlbiA/IHBvcyA6IGxlbikgfVxuXG4gIHRoaXMuX2J1ZnBvcyA9IGxlblxuICByZXR1cm4gbGVuXG59XG5cblNCTUgucHJvdG90eXBlLl9zYm1oX2xvb2t1cF9jaGFyID0gZnVuY3Rpb24gKGRhdGEsIHBvcykge1xuICByZXR1cm4gKHBvcyA8IDApXG4gICAgPyB0aGlzLl9sb29rYmVoaW5kW3RoaXMuX2xvb2tiZWhpbmRfc2l6ZSArIHBvc11cbiAgICA6IGRhdGFbcG9zXVxufVxuXG5TQk1ILnByb3RvdHlwZS5fc2JtaF9tZW1jbXAgPSBmdW5jdGlvbiAoZGF0YSwgcG9zLCBsZW4pIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXZhclxuICAgIGlmICh0aGlzLl9zYm1oX2xvb2t1cF9jaGFyKGRhdGEsIHBvcyArIGkpICE9PSB0aGlzLl9uZWVkbGVbaV0pIHsgcmV0dXJuIGZhbHNlIH1cbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNCTUhcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ25vZGU6dXRpbCcpLmluaGVyaXRzXG5jb25zdCBSZWFkYWJsZVN0cmVhbSA9IHJlcXVpcmUoJ25vZGU6c3RyZWFtJykuUmVhZGFibGVcblxuZnVuY3Rpb24gUGFydFN0cmVhbSAob3B0cykge1xuICBSZWFkYWJsZVN0cmVhbS5jYWxsKHRoaXMsIG9wdHMpXG59XG5pbmhlcml0cyhQYXJ0U3RyZWFtLCBSZWFkYWJsZVN0cmVhbSlcblxuUGFydFN0cmVhbS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge31cblxubW9kdWxlLmV4cG9ydHMgPSBQYXJ0U3RyZWFtXG4iLCIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRMaW1pdCAobGltaXRzLCBuYW1lLCBkZWZhdWx0TGltaXQpIHtcbiAgaWYgKFxuICAgICFsaW1pdHMgfHxcbiAgICBsaW1pdHNbbmFtZV0gPT09IHVuZGVmaW5lZCB8fFxuICAgIGxpbWl0c1tuYW1lXSA9PT0gbnVsbFxuICApIHsgcmV0dXJuIGRlZmF1bHRMaW1pdCB9XG5cbiAgaWYgKFxuICAgIHR5cGVvZiBsaW1pdHNbbmFtZV0gIT09ICdudW1iZXInIHx8XG4gICAgaXNOYU4obGltaXRzW25hbWVdKVxuICApIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignTGltaXQgJyArIG5hbWUgKyAnIGlzIG5vdCBhIHZhbGlkIG51bWJlcicpIH1cblxuICByZXR1cm4gbGltaXRzW25hbWVdXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnbm9kZTpldmVudHMnKS5FdmVudEVtaXR0ZXJcbmNvbnN0IGluaGVyaXRzID0gcmVxdWlyZSgnbm9kZTp1dGlsJykuaW5oZXJpdHNcbmNvbnN0IGdldExpbWl0ID0gcmVxdWlyZSgnLi4vLi4vLi4vbGliL3V0aWxzL2dldExpbWl0JylcblxuY29uc3QgU3RyZWFtU2VhcmNoID0gcmVxdWlyZSgnLi4vLi4vc3RyZWFtc2VhcmNoL3NibWgnKVxuXG5jb25zdCBCX0RDUkxGID0gQnVmZmVyLmZyb20oJ1xcclxcblxcclxcbicpXG5jb25zdCBSRV9DUkxGID0gL1xcclxcbi9nXG5jb25zdCBSRV9IRFIgPSAvXihbXjpdKyk6WyBcXHRdPyhbXFx4MDAtXFx4RkZdKyk/JC8gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb250cm9sLXJlZ2V4XG5cbmZ1bmN0aW9uIEhlYWRlclBhcnNlciAoY2ZnKSB7XG4gIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpXG5cbiAgY2ZnID0gY2ZnIHx8IHt9XG4gIGNvbnN0IHNlbGYgPSB0aGlzXG4gIHRoaXMubnJlYWQgPSAwXG4gIHRoaXMubWF4ZWQgPSBmYWxzZVxuICB0aGlzLm5wYWlycyA9IDBcbiAgdGhpcy5tYXhIZWFkZXJQYWlycyA9IGdldExpbWl0KGNmZywgJ21heEhlYWRlclBhaXJzJywgMjAwMClcbiAgdGhpcy5tYXhIZWFkZXJTaXplID0gZ2V0TGltaXQoY2ZnLCAnbWF4SGVhZGVyU2l6ZScsIDgwICogMTAyNClcbiAgdGhpcy5idWZmZXIgPSAnJ1xuICB0aGlzLmhlYWRlciA9IHt9XG4gIHRoaXMuZmluaXNoZWQgPSBmYWxzZVxuICB0aGlzLnNzID0gbmV3IFN0cmVhbVNlYXJjaChCX0RDUkxGKVxuICB0aGlzLnNzLm9uKCdpbmZvJywgZnVuY3Rpb24gKGlzTWF0Y2gsIGRhdGEsIHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoZGF0YSAmJiAhc2VsZi5tYXhlZCkge1xuICAgICAgaWYgKHNlbGYubnJlYWQgKyBlbmQgLSBzdGFydCA+PSBzZWxmLm1heEhlYWRlclNpemUpIHtcbiAgICAgICAgZW5kID0gc2VsZi5tYXhIZWFkZXJTaXplIC0gc2VsZi5ucmVhZCArIHN0YXJ0XG4gICAgICAgIHNlbGYubnJlYWQgPSBzZWxmLm1heEhlYWRlclNpemVcbiAgICAgICAgc2VsZi5tYXhlZCA9IHRydWVcbiAgICAgIH0gZWxzZSB7IHNlbGYubnJlYWQgKz0gKGVuZCAtIHN0YXJ0KSB9XG5cbiAgICAgIHNlbGYuYnVmZmVyICs9IGRhdGEudG9TdHJpbmcoJ2JpbmFyeScsIHN0YXJ0LCBlbmQpXG4gICAgfVxuICAgIGlmIChpc01hdGNoKSB7IHNlbGYuX2ZpbmlzaCgpIH1cbiAgfSlcbn1cbmluaGVyaXRzKEhlYWRlclBhcnNlciwgRXZlbnRFbWl0dGVyKVxuXG5IZWFkZXJQYXJzZXIucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoZGF0YSkge1xuICBjb25zdCByID0gdGhpcy5zcy5wdXNoKGRhdGEpXG4gIGlmICh0aGlzLmZpbmlzaGVkKSB7IHJldHVybiByIH1cbn1cblxuSGVhZGVyUGFyc2VyLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5maW5pc2hlZCA9IGZhbHNlXG4gIHRoaXMuYnVmZmVyID0gJydcbiAgdGhpcy5oZWFkZXIgPSB7fVxuICB0aGlzLnNzLnJlc2V0KClcbn1cblxuSGVhZGVyUGFyc2VyLnByb3RvdHlwZS5fZmluaXNoID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5idWZmZXIpIHsgdGhpcy5fcGFyc2VIZWFkZXIoKSB9XG4gIHRoaXMuc3MubWF0Y2hlcyA9IHRoaXMuc3MubWF4TWF0Y2hlc1xuICBjb25zdCBoZWFkZXIgPSB0aGlzLmhlYWRlclxuICB0aGlzLmhlYWRlciA9IHt9XG4gIHRoaXMuYnVmZmVyID0gJydcbiAgdGhpcy5maW5pc2hlZCA9IHRydWVcbiAgdGhpcy5ucmVhZCA9IHRoaXMubnBhaXJzID0gMFxuICB0aGlzLm1heGVkID0gZmFsc2VcbiAgdGhpcy5lbWl0KCdoZWFkZXInLCBoZWFkZXIpXG59XG5cbkhlYWRlclBhcnNlci5wcm90b3R5cGUuX3BhcnNlSGVhZGVyID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5ucGFpcnMgPT09IHRoaXMubWF4SGVhZGVyUGFpcnMpIHsgcmV0dXJuIH1cblxuICBjb25zdCBsaW5lcyA9IHRoaXMuYnVmZmVyLnNwbGl0KFJFX0NSTEYpXG4gIGNvbnN0IGxlbiA9IGxpbmVzLmxlbmd0aFxuICBsZXQgbSwgaFxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby12YXJcbiAgICBpZiAobGluZXNbaV0ubGVuZ3RoID09PSAwKSB7IGNvbnRpbnVlIH1cbiAgICBpZiAobGluZXNbaV1bMF0gPT09ICdcXHQnIHx8IGxpbmVzW2ldWzBdID09PSAnICcpIHtcbiAgICAgIC8vIGZvbGRlZCBoZWFkZXIgY29udGVudFxuICAgICAgLy8gUkZDMjgyMiBzYXlzIHRvIGp1c3QgcmVtb3ZlIHRoZSBDUkxGIGFuZCBub3QgdGhlIHdoaXRlc3BhY2UgZm9sbG93aW5nXG4gICAgICAvLyBpdCwgc28gd2UgZm9sbG93IHRoZSBSRkMgYW5kIGluY2x1ZGUgdGhlIGxlYWRpbmcgd2hpdGVzcGFjZSAuLi5cbiAgICAgIGlmIChoKSB7XG4gICAgICAgIHRoaXMuaGVhZGVyW2hdW3RoaXMuaGVhZGVyW2hdLmxlbmd0aCAtIDFdICs9IGxpbmVzW2ldXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcG9zQ29sb24gPSBsaW5lc1tpXS5pbmRleE9mKCc6JylcbiAgICBpZiAoXG4gICAgICBwb3NDb2xvbiA9PT0gLTEgfHxcbiAgICAgIHBvc0NvbG9uID09PSAwXG4gICAgKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgbSA9IFJFX0hEUi5leGVjKGxpbmVzW2ldKVxuICAgIGggPSBtWzFdLnRvTG93ZXJDYXNlKClcbiAgICB0aGlzLmhlYWRlcltoXSA9IHRoaXMuaGVhZGVyW2hdIHx8IFtdXG4gICAgdGhpcy5oZWFkZXJbaF0ucHVzaCgobVsyXSB8fCAnJykpXG4gICAgaWYgKCsrdGhpcy5ucGFpcnMgPT09IHRoaXMubWF4SGVhZGVyUGFpcnMpIHsgYnJlYWsgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gSGVhZGVyUGFyc2VyXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgV3JpdGFibGVTdHJlYW0gPSByZXF1aXJlKCdub2RlOnN0cmVhbScpLldyaXRhYmxlXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ25vZGU6dXRpbCcpLmluaGVyaXRzXG5cbmNvbnN0IFN0cmVhbVNlYXJjaCA9IHJlcXVpcmUoJy4uLy4uL3N0cmVhbXNlYXJjaC9zYm1oJylcblxuY29uc3QgUGFydFN0cmVhbSA9IHJlcXVpcmUoJy4vUGFydFN0cmVhbScpXG5jb25zdCBIZWFkZXJQYXJzZXIgPSByZXF1aXJlKCcuL0hlYWRlclBhcnNlcicpXG5cbmNvbnN0IERBU0ggPSA0NVxuY29uc3QgQl9PTkVEQVNIID0gQnVmZmVyLmZyb20oJy0nKVxuY29uc3QgQl9DUkxGID0gQnVmZmVyLmZyb20oJ1xcclxcbicpXG5jb25zdCBFTVBUWV9GTiA9IGZ1bmN0aW9uICgpIHt9XG5cbmZ1bmN0aW9uIERpY2VyIChjZmcpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIERpY2VyKSkgeyByZXR1cm4gbmV3IERpY2VyKGNmZykgfVxuICBXcml0YWJsZVN0cmVhbS5jYWxsKHRoaXMsIGNmZylcblxuICBpZiAoIWNmZyB8fCAoIWNmZy5oZWFkZXJGaXJzdCAmJiB0eXBlb2YgY2ZnLmJvdW5kYXJ5ICE9PSAnc3RyaW5nJykpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQm91bmRhcnkgcmVxdWlyZWQnKSB9XG5cbiAgaWYgKHR5cGVvZiBjZmcuYm91bmRhcnkgPT09ICdzdHJpbmcnKSB7IHRoaXMuc2V0Qm91bmRhcnkoY2ZnLmJvdW5kYXJ5KSB9IGVsc2UgeyB0aGlzLl9icGFyc2VyID0gdW5kZWZpbmVkIH1cblxuICB0aGlzLl9oZWFkZXJGaXJzdCA9IGNmZy5oZWFkZXJGaXJzdFxuXG4gIHRoaXMuX2Rhc2hlcyA9IDBcbiAgdGhpcy5fcGFydHMgPSAwXG4gIHRoaXMuX2ZpbmlzaGVkID0gZmFsc2VcbiAgdGhpcy5fcmVhbEZpbmlzaCA9IGZhbHNlXG4gIHRoaXMuX2lzUHJlYW1ibGUgPSB0cnVlXG4gIHRoaXMuX2p1c3RNYXRjaGVkID0gZmFsc2VcbiAgdGhpcy5fZmlyc3RXcml0ZSA9IHRydWVcbiAgdGhpcy5faW5IZWFkZXIgPSB0cnVlXG4gIHRoaXMuX3BhcnQgPSB1bmRlZmluZWRcbiAgdGhpcy5fY2IgPSB1bmRlZmluZWRcbiAgdGhpcy5faWdub3JlRGF0YSA9IGZhbHNlXG4gIHRoaXMuX3BhcnRPcHRzID0geyBoaWdoV2F0ZXJNYXJrOiBjZmcucGFydEh3bSB9XG4gIHRoaXMuX3BhdXNlID0gZmFsc2VcblxuICBjb25zdCBzZWxmID0gdGhpc1xuICB0aGlzLl9ocGFyc2VyID0gbmV3IEhlYWRlclBhcnNlcihjZmcpXG4gIHRoaXMuX2hwYXJzZXIub24oJ2hlYWRlcicsIGZ1bmN0aW9uIChoZWFkZXIpIHtcbiAgICBzZWxmLl9pbkhlYWRlciA9IGZhbHNlXG4gICAgc2VsZi5fcGFydC5lbWl0KCdoZWFkZXInLCBoZWFkZXIpXG4gIH0pXG59XG5pbmhlcml0cyhEaWNlciwgV3JpdGFibGVTdHJlYW0pXG5cbkRpY2VyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gKGV2KSB7XG4gIGlmIChldiA9PT0gJ2ZpbmlzaCcgJiYgIXRoaXMuX3JlYWxGaW5pc2gpIHtcbiAgICBpZiAoIXRoaXMuX2ZpbmlzaGVkKSB7XG4gICAgICBjb25zdCBzZWxmID0gdGhpc1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgZW5kIG9mIG11bHRpcGFydCBkYXRhJykpXG4gICAgICAgIGlmIChzZWxmLl9wYXJ0ICYmICFzZWxmLl9pZ25vcmVEYXRhKSB7XG4gICAgICAgICAgY29uc3QgdHlwZSA9IChzZWxmLl9pc1ByZWFtYmxlID8gJ1ByZWFtYmxlJyA6ICdQYXJ0JylcbiAgICAgICAgICBzZWxmLl9wYXJ0LmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKHR5cGUgKyAnIHRlcm1pbmF0ZWQgZWFybHkgZHVlIHRvIHVuZXhwZWN0ZWQgZW5kIG9mIG11bHRpcGFydCBkYXRhJykpXG4gICAgICAgICAgc2VsZi5fcGFydC5wdXNoKG51bGwpXG4gICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLl9yZWFsRmluaXNoID0gdHJ1ZVxuICAgICAgICAgICAgc2VsZi5lbWl0KCdmaW5pc2gnKVxuICAgICAgICAgICAgc2VsZi5fcmVhbEZpbmlzaCA9IGZhbHNlXG4gICAgICAgICAgfSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBzZWxmLl9yZWFsRmluaXNoID0gdHJ1ZVxuICAgICAgICBzZWxmLmVtaXQoJ2ZpbmlzaCcpXG4gICAgICAgIHNlbGYuX3JlYWxGaW5pc2ggPSBmYWxzZVxuICAgICAgfSlcbiAgICB9XG4gIH0gZWxzZSB7IFdyaXRhYmxlU3RyZWFtLnByb3RvdHlwZS5lbWl0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfVxufVxuXG5EaWNlci5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGRhdGEsIGVuY29kaW5nLCBjYikge1xuICAvLyBpZ25vcmUgdW5leHBlY3RlZCBkYXRhIChlLmcuIGV4dHJhIHRyYWlsZXIgZGF0YSBhZnRlciBmaW5pc2hlZClcbiAgaWYgKCF0aGlzLl9ocGFyc2VyICYmICF0aGlzLl9icGFyc2VyKSB7IHJldHVybiBjYigpIH1cblxuICBpZiAodGhpcy5faGVhZGVyRmlyc3QgJiYgdGhpcy5faXNQcmVhbWJsZSkge1xuICAgIGlmICghdGhpcy5fcGFydCkge1xuICAgICAgdGhpcy5fcGFydCA9IG5ldyBQYXJ0U3RyZWFtKHRoaXMuX3BhcnRPcHRzKVxuICAgICAgaWYgKHRoaXMubGlzdGVuZXJDb3VudCgncHJlYW1ibGUnKSAhPT0gMCkgeyB0aGlzLmVtaXQoJ3ByZWFtYmxlJywgdGhpcy5fcGFydCkgfSBlbHNlIHsgdGhpcy5faWdub3JlKCkgfVxuICAgIH1cbiAgICBjb25zdCByID0gdGhpcy5faHBhcnNlci5wdXNoKGRhdGEpXG4gICAgaWYgKCF0aGlzLl9pbkhlYWRlciAmJiByICE9PSB1bmRlZmluZWQgJiYgciA8IGRhdGEubGVuZ3RoKSB7IGRhdGEgPSBkYXRhLnNsaWNlKHIpIH0gZWxzZSB7IHJldHVybiBjYigpIH1cbiAgfVxuXG4gIC8vIGFsbG93cyBmb3IgXCJlYXNpZXJcIiB0ZXN0aW5nXG4gIGlmICh0aGlzLl9maXJzdFdyaXRlKSB7XG4gICAgdGhpcy5fYnBhcnNlci5wdXNoKEJfQ1JMRilcbiAgICB0aGlzLl9maXJzdFdyaXRlID0gZmFsc2VcbiAgfVxuXG4gIHRoaXMuX2JwYXJzZXIucHVzaChkYXRhKVxuXG4gIGlmICh0aGlzLl9wYXVzZSkgeyB0aGlzLl9jYiA9IGNiIH0gZWxzZSB7IGNiKCkgfVxufVxuXG5EaWNlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX3BhcnQgPSB1bmRlZmluZWRcbiAgdGhpcy5fYnBhcnNlciA9IHVuZGVmaW5lZFxuICB0aGlzLl9ocGFyc2VyID0gdW5kZWZpbmVkXG59XG5cbkRpY2VyLnByb3RvdHlwZS5zZXRCb3VuZGFyeSA9IGZ1bmN0aW9uIChib3VuZGFyeSkge1xuICBjb25zdCBzZWxmID0gdGhpc1xuICB0aGlzLl9icGFyc2VyID0gbmV3IFN0cmVhbVNlYXJjaCgnXFxyXFxuLS0nICsgYm91bmRhcnkpXG4gIHRoaXMuX2JwYXJzZXIub24oJ2luZm8nLCBmdW5jdGlvbiAoaXNNYXRjaCwgZGF0YSwgc3RhcnQsIGVuZCkge1xuICAgIHNlbGYuX29uaW5mbyhpc01hdGNoLCBkYXRhLCBzdGFydCwgZW5kKVxuICB9KVxufVxuXG5EaWNlci5wcm90b3R5cGUuX2lnbm9yZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuX3BhcnQgJiYgIXRoaXMuX2lnbm9yZURhdGEpIHtcbiAgICB0aGlzLl9pZ25vcmVEYXRhID0gdHJ1ZVxuICAgIHRoaXMuX3BhcnQub24oJ2Vycm9yJywgRU1QVFlfRk4pXG4gICAgLy8gd2UgbXVzdCBwZXJmb3JtIHNvbWUga2luZCBvZiByZWFkIG9uIHRoZSBzdHJlYW0gZXZlbiB0aG91Z2ggd2UgYXJlXG4gICAgLy8gaWdub3JpbmcgdGhlIGRhdGEsIG90aGVyd2lzZSBub2RlJ3MgUmVhZGFibGUgc3RyZWFtIHdpbGwgbm90IGVtaXQgJ2VuZCdcbiAgICAvLyBhZnRlciBwdXNoaW5nIG51bGwgdG8gdGhlIHN0cmVhbVxuICAgIHRoaXMuX3BhcnQucmVzdW1lKClcbiAgfVxufVxuXG5EaWNlci5wcm90b3R5cGUuX29uaW5mbyA9IGZ1bmN0aW9uIChpc01hdGNoLCBkYXRhLCBzdGFydCwgZW5kKSB7XG4gIGxldCBidWY7IGNvbnN0IHNlbGYgPSB0aGlzOyBsZXQgaSA9IDA7IGxldCByOyBsZXQgc2hvdWxkV3JpdGVNb3JlID0gdHJ1ZVxuXG4gIGlmICghdGhpcy5fcGFydCAmJiB0aGlzLl9qdXN0TWF0Y2hlZCAmJiBkYXRhKSB7XG4gICAgd2hpbGUgKHRoaXMuX2Rhc2hlcyA8IDIgJiYgKHN0YXJ0ICsgaSkgPCBlbmQpIHtcbiAgICAgIGlmIChkYXRhW3N0YXJ0ICsgaV0gPT09IERBU0gpIHtcbiAgICAgICAgKytpXG4gICAgICAgICsrdGhpcy5fZGFzaGVzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5fZGFzaGVzKSB7IGJ1ZiA9IEJfT05FREFTSCB9XG4gICAgICAgIHRoaXMuX2Rhc2hlcyA9IDBcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuX2Rhc2hlcyA9PT0gMikge1xuICAgICAgaWYgKChzdGFydCArIGkpIDwgZW5kICYmIHRoaXMubGlzdGVuZXJDb3VudCgndHJhaWxlcicpICE9PSAwKSB7IHRoaXMuZW1pdCgndHJhaWxlcicsIGRhdGEuc2xpY2Uoc3RhcnQgKyBpLCBlbmQpKSB9XG4gICAgICB0aGlzLnJlc2V0KClcbiAgICAgIHRoaXMuX2ZpbmlzaGVkID0gdHJ1ZVxuICAgICAgLy8gbm8gbW9yZSBwYXJ0cyB3aWxsIGJlIGFkZGVkXG4gICAgICBpZiAoc2VsZi5fcGFydHMgPT09IDApIHtcbiAgICAgICAgc2VsZi5fcmVhbEZpbmlzaCA9IHRydWVcbiAgICAgICAgc2VsZi5lbWl0KCdmaW5pc2gnKVxuICAgICAgICBzZWxmLl9yZWFsRmluaXNoID0gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuX2Rhc2hlcykgeyByZXR1cm4gfVxuICB9XG4gIGlmICh0aGlzLl9qdXN0TWF0Y2hlZCkgeyB0aGlzLl9qdXN0TWF0Y2hlZCA9IGZhbHNlIH1cbiAgaWYgKCF0aGlzLl9wYXJ0KSB7XG4gICAgdGhpcy5fcGFydCA9IG5ldyBQYXJ0U3RyZWFtKHRoaXMuX3BhcnRPcHRzKVxuICAgIHRoaXMuX3BhcnQuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICAgICAgc2VsZi5fdW5wYXVzZSgpXG4gICAgfVxuICAgIGlmICh0aGlzLl9pc1ByZWFtYmxlICYmIHRoaXMubGlzdGVuZXJDb3VudCgncHJlYW1ibGUnKSAhPT0gMCkge1xuICAgICAgdGhpcy5lbWl0KCdwcmVhbWJsZScsIHRoaXMuX3BhcnQpXG4gICAgfSBlbHNlIGlmICh0aGlzLl9pc1ByZWFtYmxlICE9PSB0cnVlICYmIHRoaXMubGlzdGVuZXJDb3VudCgncGFydCcpICE9PSAwKSB7XG4gICAgICB0aGlzLmVtaXQoJ3BhcnQnLCB0aGlzLl9wYXJ0KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9pZ25vcmUoKVxuICAgIH1cbiAgICBpZiAoIXRoaXMuX2lzUHJlYW1ibGUpIHsgdGhpcy5faW5IZWFkZXIgPSB0cnVlIH1cbiAgfVxuICBpZiAoZGF0YSAmJiBzdGFydCA8IGVuZCAmJiAhdGhpcy5faWdub3JlRGF0YSkge1xuICAgIGlmICh0aGlzLl9pc1ByZWFtYmxlIHx8ICF0aGlzLl9pbkhlYWRlcikge1xuICAgICAgaWYgKGJ1ZikgeyBzaG91bGRXcml0ZU1vcmUgPSB0aGlzLl9wYXJ0LnB1c2goYnVmKSB9XG4gICAgICBzaG91bGRXcml0ZU1vcmUgPSB0aGlzLl9wYXJ0LnB1c2goZGF0YS5zbGljZShzdGFydCwgZW5kKSlcbiAgICAgIGlmICghc2hvdWxkV3JpdGVNb3JlKSB7IHRoaXMuX3BhdXNlID0gdHJ1ZSB9XG4gICAgfSBlbHNlIGlmICghdGhpcy5faXNQcmVhbWJsZSAmJiB0aGlzLl9pbkhlYWRlcikge1xuICAgICAgaWYgKGJ1ZikgeyB0aGlzLl9ocGFyc2VyLnB1c2goYnVmKSB9XG4gICAgICByID0gdGhpcy5faHBhcnNlci5wdXNoKGRhdGEuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gICAgICBpZiAoIXRoaXMuX2luSGVhZGVyICYmIHIgIT09IHVuZGVmaW5lZCAmJiByIDwgZW5kKSB7IHRoaXMuX29uaW5mbyhmYWxzZSwgZGF0YSwgc3RhcnQgKyByLCBlbmQpIH1cbiAgICB9XG4gIH1cbiAgaWYgKGlzTWF0Y2gpIHtcbiAgICB0aGlzLl9ocGFyc2VyLnJlc2V0KClcbiAgICBpZiAodGhpcy5faXNQcmVhbWJsZSkgeyB0aGlzLl9pc1ByZWFtYmxlID0gZmFsc2UgfSBlbHNlIHtcbiAgICAgIGlmIChzdGFydCAhPT0gZW5kKSB7XG4gICAgICAgICsrdGhpcy5fcGFydHNcbiAgICAgICAgdGhpcy5fcGFydC5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICgtLXNlbGYuX3BhcnRzID09PSAwKSB7XG4gICAgICAgICAgICBpZiAoc2VsZi5fZmluaXNoZWQpIHtcbiAgICAgICAgICAgICAgc2VsZi5fcmVhbEZpbmlzaCA9IHRydWVcbiAgICAgICAgICAgICAgc2VsZi5lbWl0KCdmaW5pc2gnKVxuICAgICAgICAgICAgICBzZWxmLl9yZWFsRmluaXNoID0gZmFsc2VcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNlbGYuX3VucGF1c2UoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fcGFydC5wdXNoKG51bGwpXG4gICAgdGhpcy5fcGFydCA9IHVuZGVmaW5lZFxuICAgIHRoaXMuX2lnbm9yZURhdGEgPSBmYWxzZVxuICAgIHRoaXMuX2p1c3RNYXRjaGVkID0gdHJ1ZVxuICAgIHRoaXMuX2Rhc2hlcyA9IDBcbiAgfVxufVxuXG5EaWNlci5wcm90b3R5cGUuX3VucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5fcGF1c2UpIHsgcmV0dXJuIH1cblxuICB0aGlzLl9wYXVzZSA9IGZhbHNlXG4gIGlmICh0aGlzLl9jYikge1xuICAgIGNvbnN0IGNiID0gdGhpcy5fY2JcbiAgICB0aGlzLl9jYiA9IHVuZGVmaW5lZFxuICAgIGNiKClcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IERpY2VyXG4iLCIndXNlIHN0cmljdCdcblxuLy8gTm9kZSBoYXMgYWx3YXlzIHV0Zi04XG5jb25zdCB1dGY4RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTgnKVxuY29uc3QgdGV4dERlY29kZXJzID0gbmV3IE1hcChbXG4gIFsndXRmLTgnLCB1dGY4RGVjb2Rlcl0sXG4gIFsndXRmOCcsIHV0ZjhEZWNvZGVyXVxuXSlcblxuZnVuY3Rpb24gZ2V0RGVjb2RlciAoY2hhcnNldCkge1xuICBsZXQgbGNcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGNoYXJzZXQpIHtcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgICByZXR1cm4gZGVjb2RlcnMudXRmOFxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2FzY2lpJzogLy8gVE9ETzogTWFrZSB0aGVzZSBhIHNlcGFyYXRlLCBzdHJpY3QgZGVjb2Rlcj9cbiAgICAgIGNhc2UgJ3VzLWFzY2lpJzpcbiAgICAgIGNhc2UgJ2lzby04ODU5LTEnOlxuICAgICAgY2FzZSAnaXNvODg1OS0xJzpcbiAgICAgIGNhc2UgJ2lzbzg4NTkxJzpcbiAgICAgIGNhc2UgJ2lzb184ODU5LTEnOlxuICAgICAgY2FzZSAnd2luZG93cy0xMjUyJzpcbiAgICAgIGNhc2UgJ2lzb184ODU5LTE6MTk4Nyc6XG4gICAgICBjYXNlICdjcDEyNTInOlxuICAgICAgY2FzZSAneC1jcDEyNTInOlxuICAgICAgICByZXR1cm4gZGVjb2RlcnMubGF0aW4xXG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgICByZXR1cm4gZGVjb2RlcnMudXRmMTZsZVxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGRlY29kZXJzLmJhc2U2NFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxjID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBsYyA9IHRydWVcbiAgICAgICAgICBjaGFyc2V0ID0gY2hhcnNldC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVjb2RlcnMub3RoZXIuYmluZChjaGFyc2V0KVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBkZWNvZGVycyA9IHtcbiAgdXRmODogKGRhdGEsIHNvdXJjZUVuY29kaW5nKSA9PiB7XG4gICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgZGF0YSA9IEJ1ZmZlci5mcm9tKGRhdGEsIHNvdXJjZUVuY29kaW5nKVxuICAgIH1cbiAgICByZXR1cm4gZGF0YS51dGY4U2xpY2UoMCwgZGF0YS5sZW5ndGgpXG4gIH0sXG5cbiAgbGF0aW4xOiAoZGF0YSwgc291cmNlRW5jb2RpbmcpID0+IHtcbiAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZGF0YVxuICAgIH1cbiAgICByZXR1cm4gZGF0YS5sYXRpbjFTbGljZSgwLCBkYXRhLmxlbmd0aClcbiAgfSxcblxuICB1dGYxNmxlOiAoZGF0YSwgc291cmNlRW5jb2RpbmcpID0+IHtcbiAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICBkYXRhID0gQnVmZmVyLmZyb20oZGF0YSwgc291cmNlRW5jb2RpbmcpXG4gICAgfVxuICAgIHJldHVybiBkYXRhLnVjczJTbGljZSgwLCBkYXRhLmxlbmd0aClcbiAgfSxcblxuICBiYXNlNjQ6IChkYXRhLCBzb3VyY2VFbmNvZGluZykgPT4ge1xuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGRhdGEgPSBCdWZmZXIuZnJvbShkYXRhLCBzb3VyY2VFbmNvZGluZylcbiAgICB9XG4gICAgcmV0dXJuIGRhdGEuYmFzZTY0U2xpY2UoMCwgZGF0YS5sZW5ndGgpXG4gIH0sXG5cbiAgb3RoZXI6IChkYXRhLCBzb3VyY2VFbmNvZGluZykgPT4ge1xuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGRhdGEgPSBCdWZmZXIuZnJvbShkYXRhLCBzb3VyY2VFbmNvZGluZylcbiAgICB9XG5cbiAgICBpZiAodGV4dERlY29kZXJzLmhhcyh0aGlzLnRvU3RyaW5nKCkpKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdGV4dERlY29kZXJzLmdldCh0aGlzKS5kZWNvZGUoZGF0YSlcbiAgICAgIH0gY2F0Y2gge31cbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJ1xuICAgICAgPyBkYXRhXG4gICAgICA6IGRhdGEudG9TdHJpbmcoKVxuICB9XG59XG5cbmZ1bmN0aW9uIGRlY29kZVRleHQgKHRleHQsIHNvdXJjZUVuY29kaW5nLCBkZXN0RW5jb2RpbmcpIHtcbiAgaWYgKHRleHQpIHtcbiAgICByZXR1cm4gZ2V0RGVjb2RlcihkZXN0RW5jb2RpbmcpKHRleHQsIHNvdXJjZUVuY29kaW5nKVxuICB9XG4gIHJldHVybiB0ZXh0XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGVjb2RlVGV4dFxuIiwiLyogZXNsaW50LWRpc2FibGUgb2JqZWN0LXByb3BlcnR5LW5ld2xpbmUgKi9cbid1c2Ugc3RyaWN0J1xuXG5jb25zdCBkZWNvZGVUZXh0ID0gcmVxdWlyZSgnLi9kZWNvZGVUZXh0JylcblxuY29uc3QgUkVfRU5DT0RFRCA9IC8lW2EtZkEtRjAtOV1bYS1mQS1GMC05XS9nXG5cbmNvbnN0IEVuY29kZWRMb29rdXAgPSB7XG4gICclMDAnOiAnXFx4MDAnLCAnJTAxJzogJ1xceDAxJywgJyUwMic6ICdcXHgwMicsICclMDMnOiAnXFx4MDMnLCAnJTA0JzogJ1xceDA0JyxcbiAgJyUwNSc6ICdcXHgwNScsICclMDYnOiAnXFx4MDYnLCAnJTA3JzogJ1xceDA3JywgJyUwOCc6ICdcXHgwOCcsICclMDknOiAnXFx4MDknLFxuICAnJTBhJzogJ1xceDBhJywgJyUwQSc6ICdcXHgwYScsICclMGInOiAnXFx4MGInLCAnJTBCJzogJ1xceDBiJywgJyUwYyc6ICdcXHgwYycsXG4gICclMEMnOiAnXFx4MGMnLCAnJTBkJzogJ1xceDBkJywgJyUwRCc6ICdcXHgwZCcsICclMGUnOiAnXFx4MGUnLCAnJTBFJzogJ1xceDBlJyxcbiAgJyUwZic6ICdcXHgwZicsICclMEYnOiAnXFx4MGYnLCAnJTEwJzogJ1xceDEwJywgJyUxMSc6ICdcXHgxMScsICclMTInOiAnXFx4MTInLFxuICAnJTEzJzogJ1xceDEzJywgJyUxNCc6ICdcXHgxNCcsICclMTUnOiAnXFx4MTUnLCAnJTE2JzogJ1xceDE2JywgJyUxNyc6ICdcXHgxNycsXG4gICclMTgnOiAnXFx4MTgnLCAnJTE5JzogJ1xceDE5JywgJyUxYSc6ICdcXHgxYScsICclMUEnOiAnXFx4MWEnLCAnJTFiJzogJ1xceDFiJyxcbiAgJyUxQic6ICdcXHgxYicsICclMWMnOiAnXFx4MWMnLCAnJTFDJzogJ1xceDFjJywgJyUxZCc6ICdcXHgxZCcsICclMUQnOiAnXFx4MWQnLFxuICAnJTFlJzogJ1xceDFlJywgJyUxRSc6ICdcXHgxZScsICclMWYnOiAnXFx4MWYnLCAnJTFGJzogJ1xceDFmJywgJyUyMCc6ICdcXHgyMCcsXG4gICclMjEnOiAnXFx4MjEnLCAnJTIyJzogJ1xceDIyJywgJyUyMyc6ICdcXHgyMycsICclMjQnOiAnXFx4MjQnLCAnJTI1JzogJ1xceDI1JyxcbiAgJyUyNic6ICdcXHgyNicsICclMjcnOiAnXFx4MjcnLCAnJTI4JzogJ1xceDI4JywgJyUyOSc6ICdcXHgyOScsICclMmEnOiAnXFx4MmEnLFxuICAnJTJBJzogJ1xceDJhJywgJyUyYic6ICdcXHgyYicsICclMkInOiAnXFx4MmInLCAnJTJjJzogJ1xceDJjJywgJyUyQyc6ICdcXHgyYycsXG4gICclMmQnOiAnXFx4MmQnLCAnJTJEJzogJ1xceDJkJywgJyUyZSc6ICdcXHgyZScsICclMkUnOiAnXFx4MmUnLCAnJTJmJzogJ1xceDJmJyxcbiAgJyUyRic6ICdcXHgyZicsICclMzAnOiAnXFx4MzAnLCAnJTMxJzogJ1xceDMxJywgJyUzMic6ICdcXHgzMicsICclMzMnOiAnXFx4MzMnLFxuICAnJTM0JzogJ1xceDM0JywgJyUzNSc6ICdcXHgzNScsICclMzYnOiAnXFx4MzYnLCAnJTM3JzogJ1xceDM3JywgJyUzOCc6ICdcXHgzOCcsXG4gICclMzknOiAnXFx4MzknLCAnJTNhJzogJ1xceDNhJywgJyUzQSc6ICdcXHgzYScsICclM2InOiAnXFx4M2InLCAnJTNCJzogJ1xceDNiJyxcbiAgJyUzYyc6ICdcXHgzYycsICclM0MnOiAnXFx4M2MnLCAnJTNkJzogJ1xceDNkJywgJyUzRCc6ICdcXHgzZCcsICclM2UnOiAnXFx4M2UnLFxuICAnJTNFJzogJ1xceDNlJywgJyUzZic6ICdcXHgzZicsICclM0YnOiAnXFx4M2YnLCAnJTQwJzogJ1xceDQwJywgJyU0MSc6ICdcXHg0MScsXG4gICclNDInOiAnXFx4NDInLCAnJTQzJzogJ1xceDQzJywgJyU0NCc6ICdcXHg0NCcsICclNDUnOiAnXFx4NDUnLCAnJTQ2JzogJ1xceDQ2JyxcbiAgJyU0Nyc6ICdcXHg0NycsICclNDgnOiAnXFx4NDgnLCAnJTQ5JzogJ1xceDQ5JywgJyU0YSc6ICdcXHg0YScsICclNEEnOiAnXFx4NGEnLFxuICAnJTRiJzogJ1xceDRiJywgJyU0Qic6ICdcXHg0YicsICclNGMnOiAnXFx4NGMnLCAnJTRDJzogJ1xceDRjJywgJyU0ZCc6ICdcXHg0ZCcsXG4gICclNEQnOiAnXFx4NGQnLCAnJTRlJzogJ1xceDRlJywgJyU0RSc6ICdcXHg0ZScsICclNGYnOiAnXFx4NGYnLCAnJTRGJzogJ1xceDRmJyxcbiAgJyU1MCc6ICdcXHg1MCcsICclNTEnOiAnXFx4NTEnLCAnJTUyJzogJ1xceDUyJywgJyU1Myc6ICdcXHg1MycsICclNTQnOiAnXFx4NTQnLFxuICAnJTU1JzogJ1xceDU1JywgJyU1Nic6ICdcXHg1NicsICclNTcnOiAnXFx4NTcnLCAnJTU4JzogJ1xceDU4JywgJyU1OSc6ICdcXHg1OScsXG4gICclNWEnOiAnXFx4NWEnLCAnJTVBJzogJ1xceDVhJywgJyU1Yic6ICdcXHg1YicsICclNUInOiAnXFx4NWInLCAnJTVjJzogJ1xceDVjJyxcbiAgJyU1Qyc6ICdcXHg1YycsICclNWQnOiAnXFx4NWQnLCAnJTVEJzogJ1xceDVkJywgJyU1ZSc6ICdcXHg1ZScsICclNUUnOiAnXFx4NWUnLFxuICAnJTVmJzogJ1xceDVmJywgJyU1Ric6ICdcXHg1ZicsICclNjAnOiAnXFx4NjAnLCAnJTYxJzogJ1xceDYxJywgJyU2Mic6ICdcXHg2MicsXG4gICclNjMnOiAnXFx4NjMnLCAnJTY0JzogJ1xceDY0JywgJyU2NSc6ICdcXHg2NScsICclNjYnOiAnXFx4NjYnLCAnJTY3JzogJ1xceDY3JyxcbiAgJyU2OCc6ICdcXHg2OCcsICclNjknOiAnXFx4NjknLCAnJTZhJzogJ1xceDZhJywgJyU2QSc6ICdcXHg2YScsICclNmInOiAnXFx4NmInLFxuICAnJTZCJzogJ1xceDZiJywgJyU2Yyc6ICdcXHg2YycsICclNkMnOiAnXFx4NmMnLCAnJTZkJzogJ1xceDZkJywgJyU2RCc6ICdcXHg2ZCcsXG4gICclNmUnOiAnXFx4NmUnLCAnJTZFJzogJ1xceDZlJywgJyU2Zic6ICdcXHg2ZicsICclNkYnOiAnXFx4NmYnLCAnJTcwJzogJ1xceDcwJyxcbiAgJyU3MSc6ICdcXHg3MScsICclNzInOiAnXFx4NzInLCAnJTczJzogJ1xceDczJywgJyU3NCc6ICdcXHg3NCcsICclNzUnOiAnXFx4NzUnLFxuICAnJTc2JzogJ1xceDc2JywgJyU3Nyc6ICdcXHg3NycsICclNzgnOiAnXFx4NzgnLCAnJTc5JzogJ1xceDc5JywgJyU3YSc6ICdcXHg3YScsXG4gICclN0EnOiAnXFx4N2EnLCAnJTdiJzogJ1xceDdiJywgJyU3Qic6ICdcXHg3YicsICclN2MnOiAnXFx4N2MnLCAnJTdDJzogJ1xceDdjJyxcbiAgJyU3ZCc6ICdcXHg3ZCcsICclN0QnOiAnXFx4N2QnLCAnJTdlJzogJ1xceDdlJywgJyU3RSc6ICdcXHg3ZScsICclN2YnOiAnXFx4N2YnLFxuICAnJTdGJzogJ1xceDdmJywgJyU4MCc6ICdcXHg4MCcsICclODEnOiAnXFx4ODEnLCAnJTgyJzogJ1xceDgyJywgJyU4Myc6ICdcXHg4MycsXG4gICclODQnOiAnXFx4ODQnLCAnJTg1JzogJ1xceDg1JywgJyU4Nic6ICdcXHg4NicsICclODcnOiAnXFx4ODcnLCAnJTg4JzogJ1xceDg4JyxcbiAgJyU4OSc6ICdcXHg4OScsICclOGEnOiAnXFx4OGEnLCAnJThBJzogJ1xceDhhJywgJyU4Yic6ICdcXHg4YicsICclOEInOiAnXFx4OGInLFxuICAnJThjJzogJ1xceDhjJywgJyU4Qyc6ICdcXHg4YycsICclOGQnOiAnXFx4OGQnLCAnJThEJzogJ1xceDhkJywgJyU4ZSc6ICdcXHg4ZScsXG4gICclOEUnOiAnXFx4OGUnLCAnJThmJzogJ1xceDhmJywgJyU4Ric6ICdcXHg4ZicsICclOTAnOiAnXFx4OTAnLCAnJTkxJzogJ1xceDkxJyxcbiAgJyU5Mic6ICdcXHg5MicsICclOTMnOiAnXFx4OTMnLCAnJTk0JzogJ1xceDk0JywgJyU5NSc6ICdcXHg5NScsICclOTYnOiAnXFx4OTYnLFxuICAnJTk3JzogJ1xceDk3JywgJyU5OCc6ICdcXHg5OCcsICclOTknOiAnXFx4OTknLCAnJTlhJzogJ1xceDlhJywgJyU5QSc6ICdcXHg5YScsXG4gICclOWInOiAnXFx4OWInLCAnJTlCJzogJ1xceDliJywgJyU5Yyc6ICdcXHg5YycsICclOUMnOiAnXFx4OWMnLCAnJTlkJzogJ1xceDlkJyxcbiAgJyU5RCc6ICdcXHg5ZCcsICclOWUnOiAnXFx4OWUnLCAnJTlFJzogJ1xceDllJywgJyU5Zic6ICdcXHg5ZicsICclOUYnOiAnXFx4OWYnLFxuICAnJWEwJzogJ1xceGEwJywgJyVBMCc6ICdcXHhhMCcsICclYTEnOiAnXFx4YTEnLCAnJUExJzogJ1xceGExJywgJyVhMic6ICdcXHhhMicsXG4gICclQTInOiAnXFx4YTInLCAnJWEzJzogJ1xceGEzJywgJyVBMyc6ICdcXHhhMycsICclYTQnOiAnXFx4YTQnLCAnJUE0JzogJ1xceGE0JyxcbiAgJyVhNSc6ICdcXHhhNScsICclQTUnOiAnXFx4YTUnLCAnJWE2JzogJ1xceGE2JywgJyVBNic6ICdcXHhhNicsICclYTcnOiAnXFx4YTcnLFxuICAnJUE3JzogJ1xceGE3JywgJyVhOCc6ICdcXHhhOCcsICclQTgnOiAnXFx4YTgnLCAnJWE5JzogJ1xceGE5JywgJyVBOSc6ICdcXHhhOScsXG4gICclYWEnOiAnXFx4YWEnLCAnJUFhJzogJ1xceGFhJywgJyVhQSc6ICdcXHhhYScsICclQUEnOiAnXFx4YWEnLCAnJWFiJzogJ1xceGFiJyxcbiAgJyVBYic6ICdcXHhhYicsICclYUInOiAnXFx4YWInLCAnJUFCJzogJ1xceGFiJywgJyVhYyc6ICdcXHhhYycsICclQWMnOiAnXFx4YWMnLFxuICAnJWFDJzogJ1xceGFjJywgJyVBQyc6ICdcXHhhYycsICclYWQnOiAnXFx4YWQnLCAnJUFkJzogJ1xceGFkJywgJyVhRCc6ICdcXHhhZCcsXG4gICclQUQnOiAnXFx4YWQnLCAnJWFlJzogJ1xceGFlJywgJyVBZSc6ICdcXHhhZScsICclYUUnOiAnXFx4YWUnLCAnJUFFJzogJ1xceGFlJyxcbiAgJyVhZic6ICdcXHhhZicsICclQWYnOiAnXFx4YWYnLCAnJWFGJzogJ1xceGFmJywgJyVBRic6ICdcXHhhZicsICclYjAnOiAnXFx4YjAnLFxuICAnJUIwJzogJ1xceGIwJywgJyViMSc6ICdcXHhiMScsICclQjEnOiAnXFx4YjEnLCAnJWIyJzogJ1xceGIyJywgJyVCMic6ICdcXHhiMicsXG4gICclYjMnOiAnXFx4YjMnLCAnJUIzJzogJ1xceGIzJywgJyViNCc6ICdcXHhiNCcsICclQjQnOiAnXFx4YjQnLCAnJWI1JzogJ1xceGI1JyxcbiAgJyVCNSc6ICdcXHhiNScsICclYjYnOiAnXFx4YjYnLCAnJUI2JzogJ1xceGI2JywgJyViNyc6ICdcXHhiNycsICclQjcnOiAnXFx4YjcnLFxuICAnJWI4JzogJ1xceGI4JywgJyVCOCc6ICdcXHhiOCcsICclYjknOiAnXFx4YjknLCAnJUI5JzogJ1xceGI5JywgJyViYSc6ICdcXHhiYScsXG4gICclQmEnOiAnXFx4YmEnLCAnJWJBJzogJ1xceGJhJywgJyVCQSc6ICdcXHhiYScsICclYmInOiAnXFx4YmInLCAnJUJiJzogJ1xceGJiJyxcbiAgJyViQic6ICdcXHhiYicsICclQkInOiAnXFx4YmInLCAnJWJjJzogJ1xceGJjJywgJyVCYyc6ICdcXHhiYycsICclYkMnOiAnXFx4YmMnLFxuICAnJUJDJzogJ1xceGJjJywgJyViZCc6ICdcXHhiZCcsICclQmQnOiAnXFx4YmQnLCAnJWJEJzogJ1xceGJkJywgJyVCRCc6ICdcXHhiZCcsXG4gICclYmUnOiAnXFx4YmUnLCAnJUJlJzogJ1xceGJlJywgJyViRSc6ICdcXHhiZScsICclQkUnOiAnXFx4YmUnLCAnJWJmJzogJ1xceGJmJyxcbiAgJyVCZic6ICdcXHhiZicsICclYkYnOiAnXFx4YmYnLCAnJUJGJzogJ1xceGJmJywgJyVjMCc6ICdcXHhjMCcsICclQzAnOiAnXFx4YzAnLFxuICAnJWMxJzogJ1xceGMxJywgJyVDMSc6ICdcXHhjMScsICclYzInOiAnXFx4YzInLCAnJUMyJzogJ1xceGMyJywgJyVjMyc6ICdcXHhjMycsXG4gICclQzMnOiAnXFx4YzMnLCAnJWM0JzogJ1xceGM0JywgJyVDNCc6ICdcXHhjNCcsICclYzUnOiAnXFx4YzUnLCAnJUM1JzogJ1xceGM1JyxcbiAgJyVjNic6ICdcXHhjNicsICclQzYnOiAnXFx4YzYnLCAnJWM3JzogJ1xceGM3JywgJyVDNyc6ICdcXHhjNycsICclYzgnOiAnXFx4YzgnLFxuICAnJUM4JzogJ1xceGM4JywgJyVjOSc6ICdcXHhjOScsICclQzknOiAnXFx4YzknLCAnJWNhJzogJ1xceGNhJywgJyVDYSc6ICdcXHhjYScsXG4gICclY0EnOiAnXFx4Y2EnLCAnJUNBJzogJ1xceGNhJywgJyVjYic6ICdcXHhjYicsICclQ2InOiAnXFx4Y2InLCAnJWNCJzogJ1xceGNiJyxcbiAgJyVDQic6ICdcXHhjYicsICclY2MnOiAnXFx4Y2MnLCAnJUNjJzogJ1xceGNjJywgJyVjQyc6ICdcXHhjYycsICclQ0MnOiAnXFx4Y2MnLFxuICAnJWNkJzogJ1xceGNkJywgJyVDZCc6ICdcXHhjZCcsICclY0QnOiAnXFx4Y2QnLCAnJUNEJzogJ1xceGNkJywgJyVjZSc6ICdcXHhjZScsXG4gICclQ2UnOiAnXFx4Y2UnLCAnJWNFJzogJ1xceGNlJywgJyVDRSc6ICdcXHhjZScsICclY2YnOiAnXFx4Y2YnLCAnJUNmJzogJ1xceGNmJyxcbiAgJyVjRic6ICdcXHhjZicsICclQ0YnOiAnXFx4Y2YnLCAnJWQwJzogJ1xceGQwJywgJyVEMCc6ICdcXHhkMCcsICclZDEnOiAnXFx4ZDEnLFxuICAnJUQxJzogJ1xceGQxJywgJyVkMic6ICdcXHhkMicsICclRDInOiAnXFx4ZDInLCAnJWQzJzogJ1xceGQzJywgJyVEMyc6ICdcXHhkMycsXG4gICclZDQnOiAnXFx4ZDQnLCAnJUQ0JzogJ1xceGQ0JywgJyVkNSc6ICdcXHhkNScsICclRDUnOiAnXFx4ZDUnLCAnJWQ2JzogJ1xceGQ2JyxcbiAgJyVENic6ICdcXHhkNicsICclZDcnOiAnXFx4ZDcnLCAnJUQ3JzogJ1xceGQ3JywgJyVkOCc6ICdcXHhkOCcsICclRDgnOiAnXFx4ZDgnLFxuICAnJWQ5JzogJ1xceGQ5JywgJyVEOSc6ICdcXHhkOScsICclZGEnOiAnXFx4ZGEnLCAnJURhJzogJ1xceGRhJywgJyVkQSc6ICdcXHhkYScsXG4gICclREEnOiAnXFx4ZGEnLCAnJWRiJzogJ1xceGRiJywgJyVEYic6ICdcXHhkYicsICclZEInOiAnXFx4ZGInLCAnJURCJzogJ1xceGRiJyxcbiAgJyVkYyc6ICdcXHhkYycsICclRGMnOiAnXFx4ZGMnLCAnJWRDJzogJ1xceGRjJywgJyVEQyc6ICdcXHhkYycsICclZGQnOiAnXFx4ZGQnLFxuICAnJURkJzogJ1xceGRkJywgJyVkRCc6ICdcXHhkZCcsICclREQnOiAnXFx4ZGQnLCAnJWRlJzogJ1xceGRlJywgJyVEZSc6ICdcXHhkZScsXG4gICclZEUnOiAnXFx4ZGUnLCAnJURFJzogJ1xceGRlJywgJyVkZic6ICdcXHhkZicsICclRGYnOiAnXFx4ZGYnLCAnJWRGJzogJ1xceGRmJyxcbiAgJyVERic6ICdcXHhkZicsICclZTAnOiAnXFx4ZTAnLCAnJUUwJzogJ1xceGUwJywgJyVlMSc6ICdcXHhlMScsICclRTEnOiAnXFx4ZTEnLFxuICAnJWUyJzogJ1xceGUyJywgJyVFMic6ICdcXHhlMicsICclZTMnOiAnXFx4ZTMnLCAnJUUzJzogJ1xceGUzJywgJyVlNCc6ICdcXHhlNCcsXG4gICclRTQnOiAnXFx4ZTQnLCAnJWU1JzogJ1xceGU1JywgJyVFNSc6ICdcXHhlNScsICclZTYnOiAnXFx4ZTYnLCAnJUU2JzogJ1xceGU2JyxcbiAgJyVlNyc6ICdcXHhlNycsICclRTcnOiAnXFx4ZTcnLCAnJWU4JzogJ1xceGU4JywgJyVFOCc6ICdcXHhlOCcsICclZTknOiAnXFx4ZTknLFxuICAnJUU5JzogJ1xceGU5JywgJyVlYSc6ICdcXHhlYScsICclRWEnOiAnXFx4ZWEnLCAnJWVBJzogJ1xceGVhJywgJyVFQSc6ICdcXHhlYScsXG4gICclZWInOiAnXFx4ZWInLCAnJUViJzogJ1xceGViJywgJyVlQic6ICdcXHhlYicsICclRUInOiAnXFx4ZWInLCAnJWVjJzogJ1xceGVjJyxcbiAgJyVFYyc6ICdcXHhlYycsICclZUMnOiAnXFx4ZWMnLCAnJUVDJzogJ1xceGVjJywgJyVlZCc6ICdcXHhlZCcsICclRWQnOiAnXFx4ZWQnLFxuICAnJWVEJzogJ1xceGVkJywgJyVFRCc6ICdcXHhlZCcsICclZWUnOiAnXFx4ZWUnLCAnJUVlJzogJ1xceGVlJywgJyVlRSc6ICdcXHhlZScsXG4gICclRUUnOiAnXFx4ZWUnLCAnJWVmJzogJ1xceGVmJywgJyVFZic6ICdcXHhlZicsICclZUYnOiAnXFx4ZWYnLCAnJUVGJzogJ1xceGVmJyxcbiAgJyVmMCc6ICdcXHhmMCcsICclRjAnOiAnXFx4ZjAnLCAnJWYxJzogJ1xceGYxJywgJyVGMSc6ICdcXHhmMScsICclZjInOiAnXFx4ZjInLFxuICAnJUYyJzogJ1xceGYyJywgJyVmMyc6ICdcXHhmMycsICclRjMnOiAnXFx4ZjMnLCAnJWY0JzogJ1xceGY0JywgJyVGNCc6ICdcXHhmNCcsXG4gICclZjUnOiAnXFx4ZjUnLCAnJUY1JzogJ1xceGY1JywgJyVmNic6ICdcXHhmNicsICclRjYnOiAnXFx4ZjYnLCAnJWY3JzogJ1xceGY3JyxcbiAgJyVGNyc6ICdcXHhmNycsICclZjgnOiAnXFx4ZjgnLCAnJUY4JzogJ1xceGY4JywgJyVmOSc6ICdcXHhmOScsICclRjknOiAnXFx4ZjknLFxuICAnJWZhJzogJ1xceGZhJywgJyVGYSc6ICdcXHhmYScsICclZkEnOiAnXFx4ZmEnLCAnJUZBJzogJ1xceGZhJywgJyVmYic6ICdcXHhmYicsXG4gICclRmInOiAnXFx4ZmInLCAnJWZCJzogJ1xceGZiJywgJyVGQic6ICdcXHhmYicsICclZmMnOiAnXFx4ZmMnLCAnJUZjJzogJ1xceGZjJyxcbiAgJyVmQyc6ICdcXHhmYycsICclRkMnOiAnXFx4ZmMnLCAnJWZkJzogJ1xceGZkJywgJyVGZCc6ICdcXHhmZCcsICclZkQnOiAnXFx4ZmQnLFxuICAnJUZEJzogJ1xceGZkJywgJyVmZSc6ICdcXHhmZScsICclRmUnOiAnXFx4ZmUnLCAnJWZFJzogJ1xceGZlJywgJyVGRSc6ICdcXHhmZScsXG4gICclZmYnOiAnXFx4ZmYnLCAnJUZmJzogJ1xceGZmJywgJyVmRic6ICdcXHhmZicsICclRkYnOiAnXFx4ZmYnXG59XG5cbmZ1bmN0aW9uIGVuY29kZWRSZXBsYWNlciAobWF0Y2gpIHtcbiAgcmV0dXJuIEVuY29kZWRMb29rdXBbbWF0Y2hdXG59XG5cbmNvbnN0IFNUQVRFX0tFWSA9IDBcbmNvbnN0IFNUQVRFX1ZBTFVFID0gMVxuY29uc3QgU1RBVEVfQ0hBUlNFVCA9IDJcbmNvbnN0IFNUQVRFX0xBTkcgPSAzXG5cbmZ1bmN0aW9uIHBhcnNlUGFyYW1zIChzdHIpIHtcbiAgY29uc3QgcmVzID0gW11cbiAgbGV0IHN0YXRlID0gU1RBVEVfS0VZXG4gIGxldCBjaGFyc2V0ID0gJydcbiAgbGV0IGlucXVvdGUgPSBmYWxzZVxuICBsZXQgZXNjYXBpbmcgPSBmYWxzZVxuICBsZXQgcCA9IDBcbiAgbGV0IHRtcCA9ICcnXG4gIGNvbnN0IGxlbiA9IHN0ci5sZW5ndGhcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdmFyXG4gICAgY29uc3QgY2hhciA9IHN0cltpXVxuICAgIGlmIChjaGFyID09PSAnXFxcXCcgJiYgaW5xdW90ZSkge1xuICAgICAgaWYgKGVzY2FwaW5nKSB7IGVzY2FwaW5nID0gZmFsc2UgfSBlbHNlIHtcbiAgICAgICAgZXNjYXBpbmcgPSB0cnVlXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaGFyID09PSAnXCInKSB7XG4gICAgICBpZiAoIWVzY2FwaW5nKSB7XG4gICAgICAgIGlmIChpbnF1b3RlKSB7XG4gICAgICAgICAgaW5xdW90ZSA9IGZhbHNlXG4gICAgICAgICAgc3RhdGUgPSBTVEFURV9LRVlcbiAgICAgICAgfSBlbHNlIHsgaW5xdW90ZSA9IHRydWUgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfSBlbHNlIHsgZXNjYXBpbmcgPSBmYWxzZSB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChlc2NhcGluZyAmJiBpbnF1b3RlKSB7IHRtcCArPSAnXFxcXCcgfVxuICAgICAgZXNjYXBpbmcgPSBmYWxzZVxuICAgICAgaWYgKChzdGF0ZSA9PT0gU1RBVEVfQ0hBUlNFVCB8fCBzdGF0ZSA9PT0gU1RBVEVfTEFORykgJiYgY2hhciA9PT0gXCInXCIpIHtcbiAgICAgICAgaWYgKHN0YXRlID09PSBTVEFURV9DSEFSU0VUKSB7XG4gICAgICAgICAgc3RhdGUgPSBTVEFURV9MQU5HXG4gICAgICAgICAgY2hhcnNldCA9IHRtcC5zdWJzdHJpbmcoMSlcbiAgICAgICAgfSBlbHNlIHsgc3RhdGUgPSBTVEFURV9WQUxVRSB9XG4gICAgICAgIHRtcCA9ICcnXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBTVEFURV9LRVkgJiZcbiAgICAgICAgKGNoYXIgPT09ICcqJyB8fCBjaGFyID09PSAnPScpICYmXG4gICAgICAgIHJlcy5sZW5ndGgpIHtcbiAgICAgICAgc3RhdGUgPSBjaGFyID09PSAnKidcbiAgICAgICAgICA/IFNUQVRFX0NIQVJTRVRcbiAgICAgICAgICA6IFNUQVRFX1ZBTFVFXG4gICAgICAgIHJlc1twXSA9IFt0bXAsIHVuZGVmaW5lZF1cbiAgICAgICAgdG1wID0gJydcbiAgICAgICAgY29udGludWVcbiAgICAgIH0gZWxzZSBpZiAoIWlucXVvdGUgJiYgY2hhciA9PT0gJzsnKSB7XG4gICAgICAgIHN0YXRlID0gU1RBVEVfS0VZXG4gICAgICAgIGlmIChjaGFyc2V0KSB7XG4gICAgICAgICAgaWYgKHRtcC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRtcCA9IGRlY29kZVRleHQodG1wLnJlcGxhY2UoUkVfRU5DT0RFRCwgZW5jb2RlZFJlcGxhY2VyKSxcbiAgICAgICAgICAgICAgJ2JpbmFyeScsXG4gICAgICAgICAgICAgIGNoYXJzZXQpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNoYXJzZXQgPSAnJ1xuICAgICAgICB9IGVsc2UgaWYgKHRtcC5sZW5ndGgpIHtcbiAgICAgICAgICB0bXAgPSBkZWNvZGVUZXh0KHRtcCwgJ2JpbmFyeScsICd1dGY4JylcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzW3BdID09PSB1bmRlZmluZWQpIHsgcmVzW3BdID0gdG1wIH0gZWxzZSB7IHJlc1twXVsxXSA9IHRtcCB9XG4gICAgICAgIHRtcCA9ICcnXG4gICAgICAgICsrcFxuICAgICAgICBjb250aW51ZVxuICAgICAgfSBlbHNlIGlmICghaW5xdW90ZSAmJiAoY2hhciA9PT0gJyAnIHx8IGNoYXIgPT09ICdcXHQnKSkgeyBjb250aW51ZSB9XG4gICAgfVxuICAgIHRtcCArPSBjaGFyXG4gIH1cbiAgaWYgKGNoYXJzZXQgJiYgdG1wLmxlbmd0aCkge1xuICAgIHRtcCA9IGRlY29kZVRleHQodG1wLnJlcGxhY2UoUkVfRU5DT0RFRCwgZW5jb2RlZFJlcGxhY2VyKSxcbiAgICAgICdiaW5hcnknLFxuICAgICAgY2hhcnNldClcbiAgfSBlbHNlIGlmICh0bXApIHtcbiAgICB0bXAgPSBkZWNvZGVUZXh0KHRtcCwgJ2JpbmFyeScsICd1dGY4JylcbiAgfVxuXG4gIGlmIChyZXNbcF0gPT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0bXApIHsgcmVzW3BdID0gdG1wIH1cbiAgfSBlbHNlIHsgcmVzW3BdWzFdID0gdG1wIH1cblxuICByZXR1cm4gcmVzXG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyc2VQYXJhbXNcbiIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJhc2VuYW1lIChwYXRoKSB7XG4gIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHsgcmV0dXJuICcnIH1cbiAgZm9yICh2YXIgaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby12YXJcbiAgICBzd2l0Y2ggKHBhdGguY2hhckNvZGVBdChpKSkge1xuICAgICAgY2FzZSAweDJGOiAvLyAnLydcbiAgICAgIGNhc2UgMHg1QzogLy8gJ1xcJ1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZShpICsgMSlcbiAgICAgICAgcmV0dXJuIChwYXRoID09PSAnLi4nIHx8IHBhdGggPT09ICcuJyA/ICcnIDogcGF0aClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChwYXRoID09PSAnLi4nIHx8IHBhdGggPT09ICcuJyA/ICcnIDogcGF0aClcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG4vLyBUT0RPOlxuLy8gICogc3VwcG9ydCAxIG5lc3RlZCBtdWx0aXBhcnQgbGV2ZWxcbi8vICAgIChzZWUgc2Vjb25kIG11bHRpcGFydCBleGFtcGxlIGhlcmU6XG4vLyAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQwMS9pbnRlcmFjdC9mb3Jtcy5odG1sI2RpZHgtbXVsdGlwYXJ0Zm9ybS1kYXRhKVxuLy8gICogc3VwcG9ydCBsaW1pdHMuZmllbGROYW1lU2l6ZVxuLy8gICAgIC0tIHRoaXMgd2lsbCByZXF1aXJlIG1vZGlmaWNhdGlvbnMgdG8gdXRpbHMucGFyc2VQYXJhbXNcblxuY29uc3QgeyBSZWFkYWJsZSB9ID0gcmVxdWlyZSgnbm9kZTpzdHJlYW0nKVxuY29uc3QgeyBpbmhlcml0cyB9ID0gcmVxdWlyZSgnbm9kZTp1dGlsJylcblxuY29uc3QgRGljZXIgPSByZXF1aXJlKCcuLi8uLi9kZXBzL2RpY2VyL2xpYi9EaWNlcicpXG5cbmNvbnN0IHBhcnNlUGFyYW1zID0gcmVxdWlyZSgnLi4vdXRpbHMvcGFyc2VQYXJhbXMnKVxuY29uc3QgZGVjb2RlVGV4dCA9IHJlcXVpcmUoJy4uL3V0aWxzL2RlY29kZVRleHQnKVxuY29uc3QgYmFzZW5hbWUgPSByZXF1aXJlKCcuLi91dGlscy9iYXNlbmFtZScpXG5jb25zdCBnZXRMaW1pdCA9IHJlcXVpcmUoJy4uL3V0aWxzL2dldExpbWl0JylcblxuY29uc3QgUkVfQk9VTkRBUlkgPSAvXmJvdW5kYXJ5JC9pXG5jb25zdCBSRV9GSUVMRCA9IC9eZm9ybS1kYXRhJC9pXG5jb25zdCBSRV9DSEFSU0VUID0gL15jaGFyc2V0JC9pXG5jb25zdCBSRV9GSUxFTkFNRSA9IC9eZmlsZW5hbWUkL2lcbmNvbnN0IFJFX05BTUUgPSAvXm5hbWUkL2lcblxuTXVsdGlwYXJ0LmRldGVjdCA9IC9ebXVsdGlwYXJ0XFwvZm9ybS1kYXRhL2lcbmZ1bmN0aW9uIE11bHRpcGFydCAoYm95LCBjZmcpIHtcbiAgbGV0IGlcbiAgbGV0IGxlblxuICBjb25zdCBzZWxmID0gdGhpc1xuICBsZXQgYm91bmRhcnlcbiAgY29uc3QgbGltaXRzID0gY2ZnLmxpbWl0c1xuICBjb25zdCBpc1BhcnRBRmlsZSA9IGNmZy5pc1BhcnRBRmlsZSB8fCAoKGZpZWxkTmFtZSwgY29udGVudFR5cGUsIGZpbGVOYW1lKSA9PiAoY29udGVudFR5cGUgPT09ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIHx8IGZpbGVOYW1lICE9PSB1bmRlZmluZWQpKVxuICBjb25zdCBwYXJzZWRDb25UeXBlID0gY2ZnLnBhcnNlZENvblR5cGUgfHwgW11cbiAgY29uc3QgZGVmQ2hhcnNldCA9IGNmZy5kZWZDaGFyc2V0IHx8ICd1dGY4J1xuICBjb25zdCBwcmVzZXJ2ZVBhdGggPSBjZmcucHJlc2VydmVQYXRoXG4gIGNvbnN0IGZpbGVPcHRzID0geyBoaWdoV2F0ZXJNYXJrOiBjZmcuZmlsZUh3bSB9XG5cbiAgZm9yIChpID0gMCwgbGVuID0gcGFyc2VkQ29uVHlwZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHBhcnNlZENvblR5cGVbaV0pICYmXG4gICAgICBSRV9CT1VOREFSWS50ZXN0KHBhcnNlZENvblR5cGVbaV1bMF0pKSB7XG4gICAgICBib3VuZGFyeSA9IHBhcnNlZENvblR5cGVbaV1bMV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2hlY2tGaW5pc2hlZCAoKSB7XG4gICAgaWYgKG5lbmRzID09PSAwICYmIGZpbmlzaGVkICYmICFib3kuX2RvbmUpIHtcbiAgICAgIGZpbmlzaGVkID0gZmFsc2VcbiAgICAgIHNlbGYuZW5kKClcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIGJvdW5kYXJ5ICE9PSAnc3RyaW5nJykgeyB0aHJvdyBuZXcgRXJyb3IoJ011bHRpcGFydDogQm91bmRhcnkgbm90IGZvdW5kJykgfVxuXG4gIGNvbnN0IGZpZWxkU2l6ZUxpbWl0ID0gZ2V0TGltaXQobGltaXRzLCAnZmllbGRTaXplJywgMSAqIDEwMjQgKiAxMDI0KVxuICBjb25zdCBmaWxlU2l6ZUxpbWl0ID0gZ2V0TGltaXQobGltaXRzLCAnZmlsZVNpemUnLCBJbmZpbml0eSlcbiAgY29uc3QgZmlsZXNMaW1pdCA9IGdldExpbWl0KGxpbWl0cywgJ2ZpbGVzJywgSW5maW5pdHkpXG4gIGNvbnN0IGZpZWxkc0xpbWl0ID0gZ2V0TGltaXQobGltaXRzLCAnZmllbGRzJywgSW5maW5pdHkpXG4gIGNvbnN0IHBhcnRzTGltaXQgPSBnZXRMaW1pdChsaW1pdHMsICdwYXJ0cycsIEluZmluaXR5KVxuICBjb25zdCBoZWFkZXJQYWlyc0xpbWl0ID0gZ2V0TGltaXQobGltaXRzLCAnaGVhZGVyUGFpcnMnLCAyMDAwKVxuICBjb25zdCBoZWFkZXJTaXplTGltaXQgPSBnZXRMaW1pdChsaW1pdHMsICdoZWFkZXJTaXplJywgODAgKiAxMDI0KVxuXG4gIGxldCBuZmlsZXMgPSAwXG4gIGxldCBuZmllbGRzID0gMFxuICBsZXQgbmVuZHMgPSAwXG4gIGxldCBjdXJGaWxlXG4gIGxldCBjdXJGaWVsZFxuICBsZXQgZmluaXNoZWQgPSBmYWxzZVxuXG4gIHRoaXMuX25lZWREcmFpbiA9IGZhbHNlXG4gIHRoaXMuX3BhdXNlID0gZmFsc2VcbiAgdGhpcy5fY2IgPSB1bmRlZmluZWRcbiAgdGhpcy5fbnBhcnRzID0gMFxuICB0aGlzLl9ib3kgPSBib3lcblxuICBjb25zdCBwYXJzZXJDZmcgPSB7XG4gICAgYm91bmRhcnksXG4gICAgbWF4SGVhZGVyUGFpcnM6IGhlYWRlclBhaXJzTGltaXQsXG4gICAgbWF4SGVhZGVyU2l6ZTogaGVhZGVyU2l6ZUxpbWl0LFxuICAgIHBhcnRId206IGZpbGVPcHRzLmhpZ2hXYXRlck1hcmssXG4gICAgaGlnaFdhdGVyTWFyazogY2ZnLmhpZ2hXYXRlck1hcmtcbiAgfVxuXG4gIHRoaXMucGFyc2VyID0gbmV3IERpY2VyKHBhcnNlckNmZylcbiAgdGhpcy5wYXJzZXIub24oJ2RyYWluJywgZnVuY3Rpb24gKCkge1xuICAgIHNlbGYuX25lZWREcmFpbiA9IGZhbHNlXG4gICAgaWYgKHNlbGYuX2NiICYmICFzZWxmLl9wYXVzZSkge1xuICAgICAgY29uc3QgY2IgPSBzZWxmLl9jYlxuICAgICAgc2VsZi5fY2IgPSB1bmRlZmluZWRcbiAgICAgIGNiKClcbiAgICB9XG4gIH0pLm9uKCdwYXJ0JywgZnVuY3Rpb24gb25QYXJ0IChwYXJ0KSB7XG4gICAgaWYgKCsrc2VsZi5fbnBhcnRzID4gcGFydHNMaW1pdCkge1xuICAgICAgc2VsZi5wYXJzZXIucmVtb3ZlTGlzdGVuZXIoJ3BhcnQnLCBvblBhcnQpXG4gICAgICBzZWxmLnBhcnNlci5vbigncGFydCcsIHNraXBQYXJ0KVxuICAgICAgYm95LmhpdFBhcnRzTGltaXQgPSB0cnVlXG4gICAgICBib3kuZW1pdCgncGFydHNMaW1pdCcpXG4gICAgICByZXR1cm4gc2tpcFBhcnQocGFydClcbiAgICB9XG5cbiAgICAvLyBoYWNrIGJlY2F1c2Ugc3RyZWFtczIgX2Fsd2F5c18gZG9lc24ndCBlbWl0ICdlbmQnIHVudGlsIG5leHRUaWNrLCBzbyBsZXRcbiAgICAvLyB1cyBlbWl0ICdlbmQnIGVhcmx5IHNpbmNlIHdlIGtub3cgdGhlIHBhcnQgaGFzIGVuZGVkIGlmIHdlIGFyZSBhbHJlYWR5XG4gICAgLy8gc2VlaW5nIHRoZSBuZXh0IHBhcnRcbiAgICBpZiAoY3VyRmllbGQpIHtcbiAgICAgIGNvbnN0IGZpZWxkID0gY3VyRmllbGRcbiAgICAgIGZpZWxkLmVtaXQoJ2VuZCcpXG4gICAgICBmaWVsZC5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2VuZCcpXG4gICAgfVxuXG4gICAgcGFydC5vbignaGVhZGVyJywgZnVuY3Rpb24gKGhlYWRlcikge1xuICAgICAgbGV0IGNvbnR5cGVcbiAgICAgIGxldCBmaWVsZG5hbWVcbiAgICAgIGxldCBwYXJzZWRcbiAgICAgIGxldCBjaGFyc2V0XG4gICAgICBsZXQgZW5jb2RpbmdcbiAgICAgIGxldCBmaWxlbmFtZVxuICAgICAgbGV0IG5zaXplID0gMFxuXG4gICAgICBpZiAoaGVhZGVyWydjb250ZW50LXR5cGUnXSkge1xuICAgICAgICBwYXJzZWQgPSBwYXJzZVBhcmFtcyhoZWFkZXJbJ2NvbnRlbnQtdHlwZSddWzBdKVxuICAgICAgICBpZiAocGFyc2VkWzBdKSB7XG4gICAgICAgICAgY29udHlwZSA9IHBhcnNlZFswXS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgZm9yIChpID0gMCwgbGVuID0gcGFyc2VkLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgICBpZiAoUkVfQ0hBUlNFVC50ZXN0KHBhcnNlZFtpXVswXSkpIHtcbiAgICAgICAgICAgICAgY2hhcnNldCA9IHBhcnNlZFtpXVsxXS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjb250eXBlID09PSB1bmRlZmluZWQpIHsgY29udHlwZSA9ICd0ZXh0L3BsYWluJyB9XG4gICAgICBpZiAoY2hhcnNldCA9PT0gdW5kZWZpbmVkKSB7IGNoYXJzZXQgPSBkZWZDaGFyc2V0IH1cblxuICAgICAgaWYgKGhlYWRlclsnY29udGVudC1kaXNwb3NpdGlvbiddKSB7XG4gICAgICAgIHBhcnNlZCA9IHBhcnNlUGFyYW1zKGhlYWRlclsnY29udGVudC1kaXNwb3NpdGlvbiddWzBdKVxuICAgICAgICBpZiAoIVJFX0ZJRUxELnRlc3QocGFyc2VkWzBdKSkgeyByZXR1cm4gc2tpcFBhcnQocGFydCkgfVxuICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBwYXJzZWQubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICBpZiAoUkVfTkFNRS50ZXN0KHBhcnNlZFtpXVswXSkpIHtcbiAgICAgICAgICAgIGZpZWxkbmFtZSA9IHBhcnNlZFtpXVsxXVxuICAgICAgICAgIH0gZWxzZSBpZiAoUkVfRklMRU5BTUUudGVzdChwYXJzZWRbaV1bMF0pKSB7XG4gICAgICAgICAgICBmaWxlbmFtZSA9IHBhcnNlZFtpXVsxXVxuICAgICAgICAgICAgaWYgKCFwcmVzZXJ2ZVBhdGgpIHsgZmlsZW5hbWUgPSBiYXNlbmFtZShmaWxlbmFtZSkgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHsgcmV0dXJuIHNraXBQYXJ0KHBhcnQpIH1cblxuICAgICAgaWYgKGhlYWRlclsnY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddKSB7IGVuY29kaW5nID0gaGVhZGVyWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ11bMF0udG9Mb3dlckNhc2UoKSB9IGVsc2UgeyBlbmNvZGluZyA9ICc3Yml0JyB9XG5cbiAgICAgIGxldCBvbkRhdGEsXG4gICAgICAgIG9uRW5kXG5cbiAgICAgIGlmIChpc1BhcnRBRmlsZShmaWVsZG5hbWUsIGNvbnR5cGUsIGZpbGVuYW1lKSkge1xuICAgICAgICAvLyBmaWxlL2JpbmFyeSBmaWVsZFxuICAgICAgICBpZiAobmZpbGVzID09PSBmaWxlc0xpbWl0KSB7XG4gICAgICAgICAgaWYgKCFib3kuaGl0RmlsZXNMaW1pdCkge1xuICAgICAgICAgICAgYm95LmhpdEZpbGVzTGltaXQgPSB0cnVlXG4gICAgICAgICAgICBib3kuZW1pdCgnZmlsZXNMaW1pdCcpXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBza2lwUGFydChwYXJ0KVxuICAgICAgICB9XG5cbiAgICAgICAgKytuZmlsZXNcblxuICAgICAgICBpZiAoYm95Lmxpc3RlbmVyQ291bnQoJ2ZpbGUnKSA9PT0gMCkge1xuICAgICAgICAgIHNlbGYucGFyc2VyLl9pZ25vcmUoKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgKytuZW5kc1xuICAgICAgICBjb25zdCBmaWxlID0gbmV3IEZpbGVTdHJlYW0oZmlsZU9wdHMpXG4gICAgICAgIGN1ckZpbGUgPSBmaWxlXG4gICAgICAgIGZpbGUub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAtLW5lbmRzXG4gICAgICAgICAgc2VsZi5fcGF1c2UgPSBmYWxzZVxuICAgICAgICAgIGNoZWNrRmluaXNoZWQoKVxuICAgICAgICAgIGlmIChzZWxmLl9jYiAmJiAhc2VsZi5fbmVlZERyYWluKSB7XG4gICAgICAgICAgICBjb25zdCBjYiA9IHNlbGYuX2NiXG4gICAgICAgICAgICBzZWxmLl9jYiA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgY2IoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgZmlsZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgaWYgKCFzZWxmLl9wYXVzZSkgeyByZXR1cm4gfVxuICAgICAgICAgIHNlbGYuX3BhdXNlID0gZmFsc2VcbiAgICAgICAgICBpZiAoc2VsZi5fY2IgJiYgIXNlbGYuX25lZWREcmFpbikge1xuICAgICAgICAgICAgY29uc3QgY2IgPSBzZWxmLl9jYlxuICAgICAgICAgICAgc2VsZi5fY2IgPSB1bmRlZmluZWRcbiAgICAgICAgICAgIGNiKClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYm95LmVtaXQoJ2ZpbGUnLCBmaWVsZG5hbWUsIGZpbGUsIGZpbGVuYW1lLCBlbmNvZGluZywgY29udHlwZSlcblxuICAgICAgICBvbkRhdGEgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgIGlmICgobnNpemUgKz0gZGF0YS5sZW5ndGgpID4gZmlsZVNpemVMaW1pdCkge1xuICAgICAgICAgICAgY29uc3QgZXh0cmFsZW4gPSBmaWxlU2l6ZUxpbWl0IC0gbnNpemUgKyBkYXRhLmxlbmd0aFxuICAgICAgICAgICAgaWYgKGV4dHJhbGVuID4gMCkgeyBmaWxlLnB1c2goZGF0YS5zbGljZSgwLCBleHRyYWxlbikpIH1cbiAgICAgICAgICAgIGZpbGUudHJ1bmNhdGVkID0gdHJ1ZVxuICAgICAgICAgICAgZmlsZS5ieXRlc1JlYWQgPSBmaWxlU2l6ZUxpbWl0XG4gICAgICAgICAgICBwYXJ0LnJlbW92ZUFsbExpc3RlbmVycygnZGF0YScpXG4gICAgICAgICAgICBmaWxlLmVtaXQoJ2xpbWl0JylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH0gZWxzZSBpZiAoIWZpbGUucHVzaChkYXRhKSkgeyBzZWxmLl9wYXVzZSA9IHRydWUgfVxuXG4gICAgICAgICAgZmlsZS5ieXRlc1JlYWQgPSBuc2l6ZVxuICAgICAgICB9XG5cbiAgICAgICAgb25FbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY3VyRmlsZSA9IHVuZGVmaW5lZFxuICAgICAgICAgIGZpbGUucHVzaChudWxsKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBub24tZmlsZSBmaWVsZFxuICAgICAgICBpZiAobmZpZWxkcyA9PT0gZmllbGRzTGltaXQpIHtcbiAgICAgICAgICBpZiAoIWJveS5oaXRGaWVsZHNMaW1pdCkge1xuICAgICAgICAgICAgYm95LmhpdEZpZWxkc0xpbWl0ID0gdHJ1ZVxuICAgICAgICAgICAgYm95LmVtaXQoJ2ZpZWxkc0xpbWl0JylcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHNraXBQYXJ0KHBhcnQpXG4gICAgICAgIH1cblxuICAgICAgICArK25maWVsZHNcbiAgICAgICAgKytuZW5kc1xuICAgICAgICBsZXQgYnVmZmVyID0gJydcbiAgICAgICAgbGV0IHRydW5jYXRlZCA9IGZhbHNlXG4gICAgICAgIGN1ckZpZWxkID0gcGFydFxuXG4gICAgICAgIG9uRGF0YSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgaWYgKChuc2l6ZSArPSBkYXRhLmxlbmd0aCkgPiBmaWVsZFNpemVMaW1pdCkge1xuICAgICAgICAgICAgY29uc3QgZXh0cmFsZW4gPSAoZmllbGRTaXplTGltaXQgLSAobnNpemUgLSBkYXRhLmxlbmd0aCkpXG4gICAgICAgICAgICBidWZmZXIgKz0gZGF0YS50b1N0cmluZygnYmluYXJ5JywgMCwgZXh0cmFsZW4pXG4gICAgICAgICAgICB0cnVuY2F0ZWQgPSB0cnVlXG4gICAgICAgICAgICBwYXJ0LnJlbW92ZUFsbExpc3RlbmVycygnZGF0YScpXG4gICAgICAgICAgfSBlbHNlIHsgYnVmZmVyICs9IGRhdGEudG9TdHJpbmcoJ2JpbmFyeScpIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG9uRW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGN1ckZpZWxkID0gdW5kZWZpbmVkXG4gICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGgpIHsgYnVmZmVyID0gZGVjb2RlVGV4dChidWZmZXIsICdiaW5hcnknLCBjaGFyc2V0KSB9XG4gICAgICAgICAgYm95LmVtaXQoJ2ZpZWxkJywgZmllbGRuYW1lLCBidWZmZXIsIGZhbHNlLCB0cnVuY2F0ZWQsIGVuY29kaW5nLCBjb250eXBlKVxuICAgICAgICAgIC0tbmVuZHNcbiAgICAgICAgICBjaGVja0ZpbmlzaGVkKClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBBcyBvZiBub2RlQDJlZmU0YWI3NjE2NjYgKHYwLjEwLjI5Ky92MC4xMS4xNCspLCBidXNib3kgaGFkIGJlY29tZVxuICAgICAgICAgYnJva2VuLiBTdHJlYW1zMi9zdHJlYW1zMyBpcyBhIGh1Z2UgYmxhY2sgYm94IG9mIGNvbmZ1c2lvbiwgYnV0XG4gICAgICAgICBzb21laG93IG92ZXJyaWRpbmcgdGhlIHN5bmMgc3RhdGUgc2VlbXMgdG8gZml4IHRoaW5ncyBhZ2FpbiAoYW5kIHN0aWxsXG4gICAgICAgICBzZWVtcyB0byB3b3JrIGZvciBwcmV2aW91cyBub2RlIHZlcnNpb25zKS5cbiAgICAgICovXG4gICAgICBwYXJ0Ll9yZWFkYWJsZVN0YXRlLnN5bmMgPSBmYWxzZVxuXG4gICAgICBwYXJ0Lm9uKCdkYXRhJywgb25EYXRhKVxuICAgICAgcGFydC5vbignZW5kJywgb25FbmQpXG4gICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGN1ckZpbGUpIHsgY3VyRmlsZS5lbWl0KCdlcnJvcicsIGVycikgfVxuICAgIH0pXG4gIH0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBib3kuZW1pdCgnZXJyb3InLCBlcnIpXG4gIH0pLm9uKCdmaW5pc2gnLCBmdW5jdGlvbiAoKSB7XG4gICAgZmluaXNoZWQgPSB0cnVlXG4gICAgY2hlY2tGaW5pc2hlZCgpXG4gIH0pXG59XG5cbk11bHRpcGFydC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGNiKSB7XG4gIGNvbnN0IHIgPSB0aGlzLnBhcnNlci53cml0ZShjaHVuaylcbiAgaWYgKHIgJiYgIXRoaXMuX3BhdXNlKSB7XG4gICAgY2IoKVxuICB9IGVsc2Uge1xuICAgIHRoaXMuX25lZWREcmFpbiA9ICFyXG4gICAgdGhpcy5fY2IgPSBjYlxuICB9XG59XG5cbk11bHRpcGFydC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBzZWxmID0gdGhpc1xuXG4gIGlmIChzZWxmLnBhcnNlci53cml0YWJsZSkge1xuICAgIHNlbGYucGFyc2VyLmVuZCgpXG4gIH0gZWxzZSBpZiAoIXNlbGYuX2JveS5fZG9uZSkge1xuICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5fYm95Ll9kb25lID0gdHJ1ZVxuICAgICAgc2VsZi5fYm95LmVtaXQoJ2ZpbmlzaCcpXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBza2lwUGFydCAocGFydCkge1xuICBwYXJ0LnJlc3VtZSgpXG59XG5cbmZ1bmN0aW9uIEZpbGVTdHJlYW0gKG9wdHMpIHtcbiAgUmVhZGFibGUuY2FsbCh0aGlzLCBvcHRzKVxuXG4gIHRoaXMuYnl0ZXNSZWFkID0gMFxuXG4gIHRoaXMudHJ1bmNhdGVkID0gZmFsc2Vcbn1cblxuaW5oZXJpdHMoRmlsZVN0cmVhbSwgUmVhZGFibGUpXG5cbkZpbGVTdHJlYW0ucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHt9XG5cbm1vZHVsZS5leHBvcnRzID0gTXVsdGlwYXJ0XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgUkVfUExVUyA9IC9cXCsvZ1xuXG5jb25zdCBIRVggPSBbXG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXG4gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsXG4gIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXG4gIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBcbl1cblxuZnVuY3Rpb24gRGVjb2RlciAoKSB7XG4gIHRoaXMuYnVmZmVyID0gdW5kZWZpbmVkXG59XG5EZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgLy8gUmVwbGFjZSAnKycgd2l0aCAnICcgYmVmb3JlIGRlY29kaW5nXG4gIHN0ciA9IHN0ci5yZXBsYWNlKFJFX1BMVVMsICcgJylcbiAgbGV0IHJlcyA9ICcnXG4gIGxldCBpID0gMDsgbGV0IHAgPSAwOyBjb25zdCBsZW4gPSBzdHIubGVuZ3RoXG4gIGZvciAoOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAodGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFIRVhbc3RyLmNoYXJDb2RlQXQoaSldKSB7XG4gICAgICAgIHJlcyArPSAnJScgKyB0aGlzLmJ1ZmZlclxuICAgICAgICB0aGlzLmJ1ZmZlciA9IHVuZGVmaW5lZFxuICAgICAgICAtLWkgLy8gcmV0cnkgY2hhcmFjdGVyXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJ1ZmZlciArPSBzdHJbaV1cbiAgICAgICAgKytwXG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlci5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludCh0aGlzLmJ1ZmZlciwgMTYpKVxuICAgICAgICAgIHRoaXMuYnVmZmVyID0gdW5kZWZpbmVkXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0cltpXSA9PT0gJyUnKSB7XG4gICAgICBpZiAoaSA+IHApIHtcbiAgICAgICAgcmVzICs9IHN0ci5zdWJzdHJpbmcocCwgaSlcbiAgICAgICAgcCA9IGlcbiAgICAgIH1cbiAgICAgIHRoaXMuYnVmZmVyID0gJydcbiAgICAgICsrcFxuICAgIH1cbiAgfVxuICBpZiAocCA8IGxlbiAmJiB0aGlzLmJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7IHJlcyArPSBzdHIuc3Vic3RyaW5nKHApIH1cbiAgcmV0dXJuIHJlc1xufVxuRGVjb2Rlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuYnVmZmVyID0gdW5kZWZpbmVkXG59XG5cbm1vZHVsZS5leHBvcnRzID0gRGVjb2RlclxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IERlY29kZXIgPSByZXF1aXJlKCcuLi91dGlscy9EZWNvZGVyJylcbmNvbnN0IGRlY29kZVRleHQgPSByZXF1aXJlKCcuLi91dGlscy9kZWNvZGVUZXh0JylcbmNvbnN0IGdldExpbWl0ID0gcmVxdWlyZSgnLi4vdXRpbHMvZ2V0TGltaXQnKVxuXG5jb25zdCBSRV9DSEFSU0VUID0gL15jaGFyc2V0JC9pXG5cblVybEVuY29kZWQuZGV0ZWN0ID0gL15hcHBsaWNhdGlvblxcL3gtd3d3LWZvcm0tdXJsZW5jb2RlZC9pXG5mdW5jdGlvbiBVcmxFbmNvZGVkIChib3ksIGNmZykge1xuICBjb25zdCBsaW1pdHMgPSBjZmcubGltaXRzXG4gIGNvbnN0IHBhcnNlZENvblR5cGUgPSBjZmcucGFyc2VkQ29uVHlwZVxuICB0aGlzLmJveSA9IGJveVxuXG4gIHRoaXMuZmllbGRTaXplTGltaXQgPSBnZXRMaW1pdChsaW1pdHMsICdmaWVsZFNpemUnLCAxICogMTAyNCAqIDEwMjQpXG4gIHRoaXMuZmllbGROYW1lU2l6ZUxpbWl0ID0gZ2V0TGltaXQobGltaXRzLCAnZmllbGROYW1lU2l6ZScsIDEwMClcbiAgdGhpcy5maWVsZHNMaW1pdCA9IGdldExpbWl0KGxpbWl0cywgJ2ZpZWxkcycsIEluZmluaXR5KVxuXG4gIGxldCBjaGFyc2V0XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBwYXJzZWRDb25UeXBlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdmFyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGFyc2VkQ29uVHlwZVtpXSkgJiZcbiAgICAgICAgUkVfQ0hBUlNFVC50ZXN0KHBhcnNlZENvblR5cGVbaV1bMF0pKSB7XG4gICAgICBjaGFyc2V0ID0gcGFyc2VkQ29uVHlwZVtpXVsxXS50b0xvd2VyQ2FzZSgpXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmIChjaGFyc2V0ID09PSB1bmRlZmluZWQpIHsgY2hhcnNldCA9IGNmZy5kZWZDaGFyc2V0IHx8ICd1dGY4JyB9XG5cbiAgdGhpcy5kZWNvZGVyID0gbmV3IERlY29kZXIoKVxuICB0aGlzLmNoYXJzZXQgPSBjaGFyc2V0XG4gIHRoaXMuX2ZpZWxkcyA9IDBcbiAgdGhpcy5fc3RhdGUgPSAna2V5J1xuICB0aGlzLl9jaGVja2luZ0J5dGVzID0gdHJ1ZVxuICB0aGlzLl9ieXRlc0tleSA9IDBcbiAgdGhpcy5fYnl0ZXNWYWwgPSAwXG4gIHRoaXMuX2tleSA9ICcnXG4gIHRoaXMuX3ZhbCA9ICcnXG4gIHRoaXMuX2tleVRydW5jID0gZmFsc2VcbiAgdGhpcy5fdmFsVHJ1bmMgPSBmYWxzZVxuICB0aGlzLl9oaXRMaW1pdCA9IGZhbHNlXG59XG5cblVybEVuY29kZWQucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGRhdGEsIGNiKSB7XG4gIGlmICh0aGlzLl9maWVsZHMgPT09IHRoaXMuZmllbGRzTGltaXQpIHtcbiAgICBpZiAoIXRoaXMuYm95LmhpdEZpZWxkc0xpbWl0KSB7XG4gICAgICB0aGlzLmJveS5oaXRGaWVsZHNMaW1pdCA9IHRydWVcbiAgICAgIHRoaXMuYm95LmVtaXQoJ2ZpZWxkc0xpbWl0JylcbiAgICB9XG4gICAgcmV0dXJuIGNiKClcbiAgfVxuXG4gIGxldCBpZHhlcTsgbGV0IGlkeGFtcDsgbGV0IGk7IGxldCBwID0gMDsgY29uc3QgbGVuID0gZGF0YS5sZW5ndGhcblxuICB3aGlsZSAocCA8IGxlbikge1xuICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gJ2tleScpIHtcbiAgICAgIGlkeGVxID0gaWR4YW1wID0gdW5kZWZpbmVkXG4gICAgICBmb3IgKGkgPSBwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jaGVja2luZ0J5dGVzKSB7ICsrcCB9XG4gICAgICAgIGlmIChkYXRhW2ldID09PSAweDNELyogPSAqLykge1xuICAgICAgICAgIGlkeGVxID0gaVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YVtpXSA9PT0gMHgyNi8qICYgKi8pIHtcbiAgICAgICAgICBpZHhhbXAgPSBpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fY2hlY2tpbmdCeXRlcyAmJiB0aGlzLl9ieXRlc0tleSA9PT0gdGhpcy5maWVsZE5hbWVTaXplTGltaXQpIHtcbiAgICAgICAgICB0aGlzLl9oaXRMaW1pdCA9IHRydWVcbiAgICAgICAgICBicmVha1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2NoZWNraW5nQnl0ZXMpIHsgKyt0aGlzLl9ieXRlc0tleSB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpZHhlcSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIGtleSB3aXRoIGFzc2lnbm1lbnRcbiAgICAgICAgaWYgKGlkeGVxID4gcCkgeyB0aGlzLl9rZXkgKz0gdGhpcy5kZWNvZGVyLndyaXRlKGRhdGEudG9TdHJpbmcoJ2JpbmFyeScsIHAsIGlkeGVxKSkgfVxuICAgICAgICB0aGlzLl9zdGF0ZSA9ICd2YWwnXG5cbiAgICAgICAgdGhpcy5faGl0TGltaXQgPSBmYWxzZVxuICAgICAgICB0aGlzLl9jaGVja2luZ0J5dGVzID0gdHJ1ZVxuICAgICAgICB0aGlzLl92YWwgPSAnJ1xuICAgICAgICB0aGlzLl9ieXRlc1ZhbCA9IDBcbiAgICAgICAgdGhpcy5fdmFsVHJ1bmMgPSBmYWxzZVxuICAgICAgICB0aGlzLmRlY29kZXIucmVzZXQoKVxuXG4gICAgICAgIHAgPSBpZHhlcSArIDFcbiAgICAgIH0gZWxzZSBpZiAoaWR4YW1wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8ga2V5IHdpdGggbm8gYXNzaWdubWVudFxuICAgICAgICArK3RoaXMuX2ZpZWxkc1xuICAgICAgICBsZXQga2V5OyBjb25zdCBrZXlUcnVuYyA9IHRoaXMuX2tleVRydW5jXG4gICAgICAgIGlmIChpZHhhbXAgPiBwKSB7IGtleSA9ICh0aGlzLl9rZXkgKz0gdGhpcy5kZWNvZGVyLndyaXRlKGRhdGEudG9TdHJpbmcoJ2JpbmFyeScsIHAsIGlkeGFtcCkpKSB9IGVsc2UgeyBrZXkgPSB0aGlzLl9rZXkgfVxuXG4gICAgICAgIHRoaXMuX2hpdExpbWl0ID0gZmFsc2VcbiAgICAgICAgdGhpcy5fY2hlY2tpbmdCeXRlcyA9IHRydWVcbiAgICAgICAgdGhpcy5fa2V5ID0gJydcbiAgICAgICAgdGhpcy5fYnl0ZXNLZXkgPSAwXG4gICAgICAgIHRoaXMuX2tleVRydW5jID0gZmFsc2VcbiAgICAgICAgdGhpcy5kZWNvZGVyLnJlc2V0KClcblxuICAgICAgICBpZiAoa2V5Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuYm95LmVtaXQoJ2ZpZWxkJywgZGVjb2RlVGV4dChrZXksICdiaW5hcnknLCB0aGlzLmNoYXJzZXQpLFxuICAgICAgICAgICAgJycsXG4gICAgICAgICAgICBrZXlUcnVuYyxcbiAgICAgICAgICAgIGZhbHNlKVxuICAgICAgICB9XG5cbiAgICAgICAgcCA9IGlkeGFtcCArIDFcbiAgICAgICAgaWYgKHRoaXMuX2ZpZWxkcyA9PT0gdGhpcy5maWVsZHNMaW1pdCkgeyByZXR1cm4gY2IoKSB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2hpdExpbWl0KSB7XG4gICAgICAgIC8vIHdlIG1heSBub3QgaGF2ZSBoaXQgdGhlIGFjdHVhbCBsaW1pdCBpZiB0aGVyZSBhcmUgZW5jb2RlZCBieXRlcy4uLlxuICAgICAgICBpZiAoaSA+IHApIHsgdGhpcy5fa2V5ICs9IHRoaXMuZGVjb2Rlci53cml0ZShkYXRhLnRvU3RyaW5nKCdiaW5hcnknLCBwLCBpKSkgfVxuICAgICAgICBwID0gaVxuICAgICAgICBpZiAoKHRoaXMuX2J5dGVzS2V5ID0gdGhpcy5fa2V5Lmxlbmd0aCkgPT09IHRoaXMuZmllbGROYW1lU2l6ZUxpbWl0KSB7XG4gICAgICAgICAgLy8geWVwLCB3ZSBhY3R1YWxseSBkaWQgaGl0IHRoZSBsaW1pdFxuICAgICAgICAgIHRoaXMuX2NoZWNraW5nQnl0ZXMgPSBmYWxzZVxuICAgICAgICAgIHRoaXMuX2tleVRydW5jID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocCA8IGxlbikgeyB0aGlzLl9rZXkgKz0gdGhpcy5kZWNvZGVyLndyaXRlKGRhdGEudG9TdHJpbmcoJ2JpbmFyeScsIHApKSB9XG4gICAgICAgIHAgPSBsZW5cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWR4YW1wID0gdW5kZWZpbmVkXG4gICAgICBmb3IgKGkgPSBwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jaGVja2luZ0J5dGVzKSB7ICsrcCB9XG4gICAgICAgIGlmIChkYXRhW2ldID09PSAweDI2LyogJiAqLykge1xuICAgICAgICAgIGlkeGFtcCA9IGlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaGVja2luZ0J5dGVzICYmIHRoaXMuX2J5dGVzVmFsID09PSB0aGlzLmZpZWxkU2l6ZUxpbWl0KSB7XG4gICAgICAgICAgdGhpcy5faGl0TGltaXQgPSB0cnVlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9jaGVja2luZ0J5dGVzKSB7ICsrdGhpcy5fYnl0ZXNWYWwgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaWR4YW1wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgKyt0aGlzLl9maWVsZHNcbiAgICAgICAgaWYgKGlkeGFtcCA+IHApIHsgdGhpcy5fdmFsICs9IHRoaXMuZGVjb2Rlci53cml0ZShkYXRhLnRvU3RyaW5nKCdiaW5hcnknLCBwLCBpZHhhbXApKSB9XG4gICAgICAgIHRoaXMuYm95LmVtaXQoJ2ZpZWxkJywgZGVjb2RlVGV4dCh0aGlzLl9rZXksICdiaW5hcnknLCB0aGlzLmNoYXJzZXQpLFxuICAgICAgICAgIGRlY29kZVRleHQodGhpcy5fdmFsLCAnYmluYXJ5JywgdGhpcy5jaGFyc2V0KSxcbiAgICAgICAgICB0aGlzLl9rZXlUcnVuYyxcbiAgICAgICAgICB0aGlzLl92YWxUcnVuYylcbiAgICAgICAgdGhpcy5fc3RhdGUgPSAna2V5J1xuXG4gICAgICAgIHRoaXMuX2hpdExpbWl0ID0gZmFsc2VcbiAgICAgICAgdGhpcy5fY2hlY2tpbmdCeXRlcyA9IHRydWVcbiAgICAgICAgdGhpcy5fa2V5ID0gJydcbiAgICAgICAgdGhpcy5fYnl0ZXNLZXkgPSAwXG4gICAgICAgIHRoaXMuX2tleVRydW5jID0gZmFsc2VcbiAgICAgICAgdGhpcy5kZWNvZGVyLnJlc2V0KClcblxuICAgICAgICBwID0gaWR4YW1wICsgMVxuICAgICAgICBpZiAodGhpcy5fZmllbGRzID09PSB0aGlzLmZpZWxkc0xpbWl0KSB7IHJldHVybiBjYigpIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5faGl0TGltaXQpIHtcbiAgICAgICAgLy8gd2UgbWF5IG5vdCBoYXZlIGhpdCB0aGUgYWN0dWFsIGxpbWl0IGlmIHRoZXJlIGFyZSBlbmNvZGVkIGJ5dGVzLi4uXG4gICAgICAgIGlmIChpID4gcCkgeyB0aGlzLl92YWwgKz0gdGhpcy5kZWNvZGVyLndyaXRlKGRhdGEudG9TdHJpbmcoJ2JpbmFyeScsIHAsIGkpKSB9XG4gICAgICAgIHAgPSBpXG4gICAgICAgIGlmICgodGhpcy5fdmFsID09PSAnJyAmJiB0aGlzLmZpZWxkU2l6ZUxpbWl0ID09PSAwKSB8fFxuICAgICAgICAgICAgKHRoaXMuX2J5dGVzVmFsID0gdGhpcy5fdmFsLmxlbmd0aCkgPT09IHRoaXMuZmllbGRTaXplTGltaXQpIHtcbiAgICAgICAgICAvLyB5ZXAsIHdlIGFjdHVhbGx5IGRpZCBoaXQgdGhlIGxpbWl0XG4gICAgICAgICAgdGhpcy5fY2hlY2tpbmdCeXRlcyA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5fdmFsVHJ1bmMgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwIDwgbGVuKSB7IHRoaXMuX3ZhbCArPSB0aGlzLmRlY29kZXIud3JpdGUoZGF0YS50b1N0cmluZygnYmluYXJ5JywgcCkpIH1cbiAgICAgICAgcCA9IGxlblxuICAgICAgfVxuICAgIH1cbiAgfVxuICBjYigpXG59XG5cblVybEVuY29kZWQucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuYm95Ll9kb25lKSB7IHJldHVybiB9XG5cbiAgaWYgKHRoaXMuX3N0YXRlID09PSAna2V5JyAmJiB0aGlzLl9rZXkubGVuZ3RoID4gMCkge1xuICAgIHRoaXMuYm95LmVtaXQoJ2ZpZWxkJywgZGVjb2RlVGV4dCh0aGlzLl9rZXksICdiaW5hcnknLCB0aGlzLmNoYXJzZXQpLFxuICAgICAgJycsXG4gICAgICB0aGlzLl9rZXlUcnVuYyxcbiAgICAgIGZhbHNlKVxuICB9IGVsc2UgaWYgKHRoaXMuX3N0YXRlID09PSAndmFsJykge1xuICAgIHRoaXMuYm95LmVtaXQoJ2ZpZWxkJywgZGVjb2RlVGV4dCh0aGlzLl9rZXksICdiaW5hcnknLCB0aGlzLmNoYXJzZXQpLFxuICAgICAgZGVjb2RlVGV4dCh0aGlzLl92YWwsICdiaW5hcnknLCB0aGlzLmNoYXJzZXQpLFxuICAgICAgdGhpcy5fa2V5VHJ1bmMsXG4gICAgICB0aGlzLl92YWxUcnVuYylcbiAgfVxuICB0aGlzLmJveS5fZG9uZSA9IHRydWVcbiAgdGhpcy5ib3kuZW1pdCgnZmluaXNoJylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBVcmxFbmNvZGVkXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgV3JpdGFibGVTdHJlYW0gPSByZXF1aXJlKCdub2RlOnN0cmVhbScpLldyaXRhYmxlXG5jb25zdCB7IGluaGVyaXRzIH0gPSByZXF1aXJlKCdub2RlOnV0aWwnKVxuY29uc3QgRGljZXIgPSByZXF1aXJlKCcuLi9kZXBzL2RpY2VyL2xpYi9EaWNlcicpXG5cbmNvbnN0IE11bHRpcGFydFBhcnNlciA9IHJlcXVpcmUoJy4vdHlwZXMvbXVsdGlwYXJ0JylcbmNvbnN0IFVybGVuY29kZWRQYXJzZXIgPSByZXF1aXJlKCcuL3R5cGVzL3VybGVuY29kZWQnKVxuY29uc3QgcGFyc2VQYXJhbXMgPSByZXF1aXJlKCcuL3V0aWxzL3BhcnNlUGFyYW1zJylcblxuZnVuY3Rpb24gQnVzYm95IChvcHRzKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBCdXNib3kpKSB7IHJldHVybiBuZXcgQnVzYm95KG9wdHMpIH1cblxuICBpZiAodHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQnVzYm95IGV4cGVjdGVkIGFuIG9wdGlvbnMtT2JqZWN0LicpXG4gIH1cbiAgaWYgKHR5cGVvZiBvcHRzLmhlYWRlcnMgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQnVzYm95IGV4cGVjdGVkIGFuIG9wdGlvbnMtT2JqZWN0IHdpdGggaGVhZGVycy1hdHRyaWJ1dGUuJylcbiAgfVxuICBpZiAodHlwZW9mIG9wdHMuaGVhZGVyc1snY29udGVudC10eXBlJ10gIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWlzc2luZyBDb250ZW50LVR5cGUtaGVhZGVyLicpXG4gIH1cblxuICBjb25zdCB7XG4gICAgaGVhZGVycyxcbiAgICAuLi5zdHJlYW1PcHRpb25zXG4gIH0gPSBvcHRzXG5cbiAgdGhpcy5vcHRzID0ge1xuICAgIGF1dG9EZXN0cm95OiBmYWxzZSxcbiAgICAuLi5zdHJlYW1PcHRpb25zXG4gIH1cbiAgV3JpdGFibGVTdHJlYW0uY2FsbCh0aGlzLCB0aGlzLm9wdHMpXG5cbiAgdGhpcy5fZG9uZSA9IGZhbHNlXG4gIHRoaXMuX3BhcnNlciA9IHRoaXMuZ2V0UGFyc2VyQnlIZWFkZXJzKGhlYWRlcnMpXG4gIHRoaXMuX2ZpbmlzaGVkID0gZmFsc2Vcbn1cbmluaGVyaXRzKEJ1c2JveSwgV3JpdGFibGVTdHJlYW0pXG5cbkJ1c2JveS5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIChldikge1xuICBpZiAoZXYgPT09ICdmaW5pc2gnKSB7XG4gICAgaWYgKCF0aGlzLl9kb25lKSB7XG4gICAgICB0aGlzLl9wYXJzZXI/LmVuZCgpXG4gICAgICByZXR1cm5cbiAgICB9IGVsc2UgaWYgKHRoaXMuX2ZpbmlzaGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5fZmluaXNoZWQgPSB0cnVlXG4gIH1cbiAgV3JpdGFibGVTdHJlYW0ucHJvdG90eXBlLmVtaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdXNib3kucHJvdG90eXBlLmdldFBhcnNlckJ5SGVhZGVycyA9IGZ1bmN0aW9uIChoZWFkZXJzKSB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlUGFyYW1zKGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKVxuXG4gIGNvbnN0IGNmZyA9IHtcbiAgICBkZWZDaGFyc2V0OiB0aGlzLm9wdHMuZGVmQ2hhcnNldCxcbiAgICBmaWxlSHdtOiB0aGlzLm9wdHMuZmlsZUh3bSxcbiAgICBoZWFkZXJzLFxuICAgIGhpZ2hXYXRlck1hcms6IHRoaXMub3B0cy5oaWdoV2F0ZXJNYXJrLFxuICAgIGlzUGFydEFGaWxlOiB0aGlzLm9wdHMuaXNQYXJ0QUZpbGUsXG4gICAgbGltaXRzOiB0aGlzLm9wdHMubGltaXRzLFxuICAgIHBhcnNlZENvblR5cGU6IHBhcnNlZCxcbiAgICBwcmVzZXJ2ZVBhdGg6IHRoaXMub3B0cy5wcmVzZXJ2ZVBhdGhcbiAgfVxuXG4gIGlmIChNdWx0aXBhcnRQYXJzZXIuZGV0ZWN0LnRlc3QocGFyc2VkWzBdKSkge1xuICAgIHJldHVybiBuZXcgTXVsdGlwYXJ0UGFyc2VyKHRoaXMsIGNmZylcbiAgfVxuICBpZiAoVXJsZW5jb2RlZFBhcnNlci5kZXRlY3QudGVzdChwYXJzZWRbMF0pKSB7XG4gICAgcmV0dXJuIG5ldyBVcmxlbmNvZGVkUGFyc2VyKHRoaXMsIGNmZylcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIENvbnRlbnQtVHlwZS4nKVxufVxuXG5CdXNib3kucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRoaXMuX3BhcnNlci53cml0ZShjaHVuaywgY2IpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gQnVzYm95XG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gQnVzYm95XG5tb2R1bGUuZXhwb3J0cy5CdXNib3kgPSBCdXNib3lcblxubW9kdWxlLmV4cG9ydHMuRGljZXIgPSBEaWNlclxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgTWVzc2FnZUNoYW5uZWwsIHJlY2VpdmVNZXNzYWdlT25Qb3J0IH0gPSByZXF1aXJlKCd3b3JrZXJfdGhyZWFkcycpXG5cbmNvbnN0IGNvcnNTYWZlTGlzdGVkTWV0aG9kcyA9IFsnR0VUJywgJ0hFQUQnLCAnUE9TVCddXG5jb25zdCBjb3JzU2FmZUxpc3RlZE1ldGhvZHNTZXQgPSBuZXcgU2V0KGNvcnNTYWZlTGlzdGVkTWV0aG9kcylcblxuY29uc3QgbnVsbEJvZHlTdGF0dXMgPSBbMTAxLCAyMDQsIDIwNSwgMzA0XVxuXG5jb25zdCByZWRpcmVjdFN0YXR1cyA9IFszMDEsIDMwMiwgMzAzLCAzMDcsIDMwOF1cbmNvbnN0IHJlZGlyZWN0U3RhdHVzU2V0ID0gbmV3IFNldChyZWRpcmVjdFN0YXR1cylcblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2Jsb2NrLWJhZC1wb3J0XG5jb25zdCBiYWRQb3J0cyA9IFtcbiAgJzEnLCAnNycsICc5JywgJzExJywgJzEzJywgJzE1JywgJzE3JywgJzE5JywgJzIwJywgJzIxJywgJzIyJywgJzIzJywgJzI1JywgJzM3JywgJzQyJywgJzQzJywgJzUzJywgJzY5JywgJzc3JywgJzc5JyxcbiAgJzg3JywgJzk1JywgJzEwMScsICcxMDInLCAnMTAzJywgJzEwNCcsICcxMDknLCAnMTEwJywgJzExMScsICcxMTMnLCAnMTE1JywgJzExNycsICcxMTknLCAnMTIzJywgJzEzNScsICcxMzcnLFxuICAnMTM5JywgJzE0MycsICcxNjEnLCAnMTc5JywgJzM4OScsICc0MjcnLCAnNDY1JywgJzUxMicsICc1MTMnLCAnNTE0JywgJzUxNScsICc1MjYnLCAnNTMwJywgJzUzMScsICc1MzInLFxuICAnNTQwJywgJzU0OCcsICc1NTQnLCAnNTU2JywgJzU2MycsICc1ODcnLCAnNjAxJywgJzYzNicsICc5ODknLCAnOTkwJywgJzk5MycsICc5OTUnLCAnMTcxOScsICcxNzIwJywgJzE3MjMnLFxuICAnMjA0OScsICczNjU5JywgJzQwNDUnLCAnNTA2MCcsICc1MDYxJywgJzYwMDAnLCAnNjU2NicsICc2NjY1JywgJzY2NjYnLCAnNjY2NycsICc2NjY4JywgJzY2NjknLCAnNjY5NycsXG4gICcxMDA4MCdcbl1cblxuY29uc3QgYmFkUG9ydHNTZXQgPSBuZXcgU2V0KGJhZFBvcnRzKVxuXG4vLyBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLXJlZmVycmVyLXBvbGljeS8jcmVmZXJyZXItcG9saWNpZXNcbmNvbnN0IHJlZmVycmVyUG9saWN5ID0gW1xuICAnJyxcbiAgJ25vLXJlZmVycmVyJyxcbiAgJ25vLXJlZmVycmVyLXdoZW4tZG93bmdyYWRlJyxcbiAgJ3NhbWUtb3JpZ2luJyxcbiAgJ29yaWdpbicsXG4gICdzdHJpY3Qtb3JpZ2luJyxcbiAgJ29yaWdpbi13aGVuLWNyb3NzLW9yaWdpbicsXG4gICdzdHJpY3Qtb3JpZ2luLXdoZW4tY3Jvc3Mtb3JpZ2luJyxcbiAgJ3Vuc2FmZS11cmwnXG5dXG5jb25zdCByZWZlcnJlclBvbGljeVNldCA9IG5ldyBTZXQocmVmZXJyZXJQb2xpY3kpXG5cbmNvbnN0IHJlcXVlc3RSZWRpcmVjdCA9IFsnZm9sbG93JywgJ21hbnVhbCcsICdlcnJvciddXG5cbmNvbnN0IHNhZmVNZXRob2RzID0gWydHRVQnLCAnSEVBRCcsICdPUFRJT05TJywgJ1RSQUNFJ11cbmNvbnN0IHNhZmVNZXRob2RzU2V0ID0gbmV3IFNldChzYWZlTWV0aG9kcylcblxuY29uc3QgcmVxdWVzdE1vZGUgPSBbJ25hdmlnYXRlJywgJ3NhbWUtb3JpZ2luJywgJ25vLWNvcnMnLCAnY29ycyddXG5cbmNvbnN0IHJlcXVlc3RDcmVkZW50aWFscyA9IFsnb21pdCcsICdzYW1lLW9yaWdpbicsICdpbmNsdWRlJ11cblxuY29uc3QgcmVxdWVzdENhY2hlID0gW1xuICAnZGVmYXVsdCcsXG4gICduby1zdG9yZScsXG4gICdyZWxvYWQnLFxuICAnbm8tY2FjaGUnLFxuICAnZm9yY2UtY2FjaGUnLFxuICAnb25seS1pZi1jYWNoZWQnXG5dXG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXF1ZXN0LWJvZHktaGVhZGVyLW5hbWVcbmNvbnN0IHJlcXVlc3RCb2R5SGVhZGVyID0gW1xuICAnY29udGVudC1lbmNvZGluZycsXG4gICdjb250ZW50LWxhbmd1YWdlJyxcbiAgJ2NvbnRlbnQtbG9jYXRpb24nLFxuICAnY29udGVudC10eXBlJyxcbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2lzc3Vlcy8yMDIxXG4gIC8vICdDb250ZW50LUxlbmd0aCcgaXMgYSBmb3JiaWRkZW4gaGVhZGVyIG5hbWUsIHdoaWNoIGlzIHR5cGljYWxseVxuICAvLyByZW1vdmVkIGluIHRoZSBIZWFkZXJzIGltcGxlbWVudGF0aW9uLiBIb3dldmVyLCB1bmRpY2kgZG9lc24ndFxuICAvLyBmaWx0ZXIgb3V0IGhlYWRlcnMsIHNvIHdlIGFkZCBpdCBoZXJlLlxuICAnY29udGVudC1sZW5ndGgnXG5dXG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNlbnVtZGVmLXJlcXVlc3RkdXBsZXhcbmNvbnN0IHJlcXVlc3REdXBsZXggPSBbXG4gICdoYWxmJ1xuXVxuXG4vLyBodHRwOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNmb3JiaWRkZW4tbWV0aG9kXG5jb25zdCBmb3JiaWRkZW5NZXRob2RzID0gWydDT05ORUNUJywgJ1RSQUNFJywgJ1RSQUNLJ11cbmNvbnN0IGZvcmJpZGRlbk1ldGhvZHNTZXQgPSBuZXcgU2V0KGZvcmJpZGRlbk1ldGhvZHMpXG5cbmNvbnN0IHN1YnJlc291cmNlID0gW1xuICAnYXVkaW8nLFxuICAnYXVkaW93b3JrbGV0JyxcbiAgJ2ZvbnQnLFxuICAnaW1hZ2UnLFxuICAnbWFuaWZlc3QnLFxuICAncGFpbnR3b3JrbGV0JyxcbiAgJ3NjcmlwdCcsXG4gICdzdHlsZScsXG4gICd0cmFjaycsXG4gICd2aWRlbycsXG4gICd4c2x0JyxcbiAgJydcbl1cbmNvbnN0IHN1YnJlc291cmNlU2V0ID0gbmV3IFNldChzdWJyZXNvdXJjZSlcblxuLyoqIEB0eXBlIHtnbG9iYWxUaGlzWydET01FeGNlcHRpb24nXX0gKi9cbmNvbnN0IERPTUV4Y2VwdGlvbiA9IGdsb2JhbFRoaXMuRE9NRXhjZXB0aW9uID8/ICgoKSA9PiB7XG4gIC8vIERPTUV4Y2VwdGlvbiB3YXMgb25seSBtYWRlIGEgZ2xvYmFsIGluIE5vZGUgdjE3LjAuMCxcbiAgLy8gYnV0IGZldGNoIHN1cHBvcnRzID49IHYxNi44LlxuICB0cnkge1xuICAgIGF0b2IoJ34nKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKGVycikuY29uc3RydWN0b3JcbiAgfVxufSkoKVxuXG5sZXQgY2hhbm5lbFxuXG4vKiogQHR5cGUge2dsb2JhbFRoaXNbJ3N0cnVjdHVyZWRDbG9uZSddfSAqL1xuY29uc3Qgc3RydWN0dXJlZENsb25lID1cbiAgZ2xvYmFsVGhpcy5zdHJ1Y3R1cmVkQ2xvbmUgPz9cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvYjI3YWUyNGRjYzQyNTFiYWQ3MjZkOWQ4NGJhZjY3OGQxZjcwN2ZlZC9saWIvaW50ZXJuYWwvc3RydWN0dXJlZF9jbG9uZS5qc1xuICAvLyBzdHJ1Y3R1cmVkQ2xvbmUgd2FzIGFkZGVkIGluIHYxNy4wLjAsIGJ1dCBmZXRjaCBzdXBwb3J0cyB2MTYuOFxuICBmdW5jdGlvbiBzdHJ1Y3R1cmVkQ2xvbmUgKHZhbHVlLCBvcHRpb25zID0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21pc3NpbmcgYXJndW1lbnQnKVxuICAgIH1cblxuICAgIGlmICghY2hhbm5lbCkge1xuICAgICAgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpXG4gICAgfVxuICAgIGNoYW5uZWwucG9ydDEudW5yZWYoKVxuICAgIGNoYW5uZWwucG9ydDIudW5yZWYoKVxuICAgIGNoYW5uZWwucG9ydDEucG9zdE1lc3NhZ2UodmFsdWUsIG9wdGlvbnM/LnRyYW5zZmVyKVxuICAgIHJldHVybiByZWNlaXZlTWVzc2FnZU9uUG9ydChjaGFubmVsLnBvcnQyKS5tZXNzYWdlXG4gIH1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIERPTUV4Y2VwdGlvbixcbiAgc3RydWN0dXJlZENsb25lLFxuICBzdWJyZXNvdXJjZSxcbiAgZm9yYmlkZGVuTWV0aG9kcyxcbiAgcmVxdWVzdEJvZHlIZWFkZXIsXG4gIHJlZmVycmVyUG9saWN5LFxuICByZXF1ZXN0UmVkaXJlY3QsXG4gIHJlcXVlc3RNb2RlLFxuICByZXF1ZXN0Q3JlZGVudGlhbHMsXG4gIHJlcXVlc3RDYWNoZSxcbiAgcmVkaXJlY3RTdGF0dXMsXG4gIGNvcnNTYWZlTGlzdGVkTWV0aG9kcyxcbiAgbnVsbEJvZHlTdGF0dXMsXG4gIHNhZmVNZXRob2RzLFxuICBiYWRQb3J0cyxcbiAgcmVxdWVzdER1cGxleCxcbiAgc3VicmVzb3VyY2VTZXQsXG4gIGJhZFBvcnRzU2V0LFxuICByZWRpcmVjdFN0YXR1c1NldCxcbiAgY29yc1NhZmVMaXN0ZWRNZXRob2RzU2V0LFxuICBzYWZlTWV0aG9kc1NldCxcbiAgZm9yYmlkZGVuTWV0aG9kc1NldCxcbiAgcmVmZXJyZXJQb2xpY3lTZXRcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG4vLyBJbiBjYXNlIG9mIGJyZWFraW5nIGNoYW5nZXMsIGluY3JlYXNlIHRoZSB2ZXJzaW9uXG4vLyBudW1iZXIgdG8gYXZvaWQgY29uZmxpY3RzLlxuY29uc3QgZ2xvYmFsT3JpZ2luID0gU3ltYm9sLmZvcigndW5kaWNpLmdsb2JhbE9yaWdpbi4xJylcblxuZnVuY3Rpb24gZ2V0R2xvYmFsT3JpZ2luICgpIHtcbiAgcmV0dXJuIGdsb2JhbFRoaXNbZ2xvYmFsT3JpZ2luXVxufVxuXG5mdW5jdGlvbiBzZXRHbG9iYWxPcmlnaW4gKG5ld09yaWdpbikge1xuICBpZiAobmV3T3JpZ2luID09PSB1bmRlZmluZWQpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZ2xvYmFsVGhpcywgZ2xvYmFsT3JpZ2luLCB7XG4gICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2VcbiAgICB9KVxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBwYXJzZWRVUkwgPSBuZXcgVVJMKG5ld09yaWdpbilcblxuICBpZiAocGFyc2VkVVJMLnByb3RvY29sICE9PSAnaHR0cDonICYmIHBhcnNlZFVSTC5wcm90b2NvbCAhPT0gJ2h0dHBzOicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBPbmx5IGh0dHAgJiBodHRwcyB1cmxzIGFyZSBhbGxvd2VkLCByZWNlaXZlZCAke3BhcnNlZFVSTC5wcm90b2NvbH1gKVxuICB9XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbFRoaXMsIGdsb2JhbE9yaWdpbiwge1xuICAgIHZhbHVlOiBwYXJzZWRVUkwsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZVxuICB9KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0R2xvYmFsT3JpZ2luLFxuICBzZXRHbG9iYWxPcmlnaW5cbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IHJlZGlyZWN0U3RhdHVzU2V0LCByZWZlcnJlclBvbGljeVNldDogcmVmZXJyZXJQb2xpY3lUb2tlbnMsIGJhZFBvcnRzU2V0IH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5jb25zdCB7IGdldEdsb2JhbE9yaWdpbiB9ID0gcmVxdWlyZSgnLi9nbG9iYWwnKVxuY29uc3QgeyBwZXJmb3JtYW5jZSB9ID0gcmVxdWlyZSgncGVyZl9ob29rcycpXG5jb25zdCB7IGlzQmxvYkxpa2UsIHRvVVNWU3RyaW5nLCBSZWFkYWJsZVN0cmVhbUZyb20gfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuY29uc3QgeyBpc1VpbnQ4QXJyYXkgfSA9IHJlcXVpcmUoJ3V0aWwvdHlwZXMnKVxuXG5sZXQgc3VwcG9ydGVkSGFzaGVzID0gW11cblxuLy8gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9jcnlwdG8uaHRtbCNkZXRlcm1pbmluZy1pZi1jcnlwdG8tc3VwcG9ydC1pcy11bmF2YWlsYWJsZVxuLyoqIEB0eXBlIHtpbXBvcnQoJ2NyeXB0bycpfHVuZGVmaW5lZH0gKi9cbmxldCBjcnlwdG9cblxudHJ5IHtcbiAgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJylcbiAgY29uc3QgcG9zc2libGVSZWxldmFudEhhc2hlcyA9IFsnc2hhMjU2JywgJ3NoYTM4NCcsICdzaGE1MTInXVxuICBzdXBwb3J0ZWRIYXNoZXMgPSBjcnlwdG8uZ2V0SGFzaGVzKCkuZmlsdGVyKChoYXNoKSA9PiBwb3NzaWJsZVJlbGV2YW50SGFzaGVzLmluY2x1ZGVzKGhhc2gpKVxuLyogYzggaWdub3JlIG5leHQgMyAqL1xufSBjYXRjaCB7XG59XG5cbmZ1bmN0aW9uIHJlc3BvbnNlVVJMIChyZXNwb25zZSkge1xuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jcmVzcG9uc2VzXG4gIC8vIEEgcmVzcG9uc2UgaGFzIGFuIGFzc29jaWF0ZWQgVVJMLiBJdCBpcyBhIHBvaW50ZXIgdG8gdGhlIGxhc3QgVVJMXG4gIC8vIGluIHJlc3BvbnNl4oCZcyBVUkwgbGlzdCBhbmQgbnVsbCBpZiByZXNwb25zZeKAmXMgVVJMIGxpc3QgaXMgZW1wdHkuXG4gIGNvbnN0IHVybExpc3QgPSByZXNwb25zZS51cmxMaXN0XG4gIGNvbnN0IGxlbmd0aCA9IHVybExpc3QubGVuZ3RoXG4gIHJldHVybiBsZW5ndGggPT09IDAgPyBudWxsIDogdXJsTGlzdFtsZW5ndGggLSAxXS50b1N0cmluZygpXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LXJlc3BvbnNlLWxvY2F0aW9uLXVybFxuZnVuY3Rpb24gcmVzcG9uc2VMb2NhdGlvblVSTCAocmVzcG9uc2UsIHJlcXVlc3RGcmFnbWVudCkge1xuICAvLyAxLiBJZiByZXNwb25zZeKAmXMgc3RhdHVzIGlzIG5vdCBhIHJlZGlyZWN0IHN0YXR1cywgdGhlbiByZXR1cm4gbnVsbC5cbiAgaWYgKCFyZWRpcmVjdFN0YXR1c1NldC5oYXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvLyAyLiBMZXQgbG9jYXRpb24gYmUgdGhlIHJlc3VsdCBvZiBleHRyYWN0aW5nIGhlYWRlciBsaXN0IHZhbHVlcyBnaXZlblxuICAvLyBgTG9jYXRpb25gIGFuZCByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3QuXG4gIGxldCBsb2NhdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgnbG9jYXRpb24nKVxuXG4gIC8vIDMuIElmIGxvY2F0aW9uIGlzIGEgaGVhZGVyIHZhbHVlLCB0aGVuIHNldCBsb2NhdGlvbiB0byB0aGUgcmVzdWx0IG9mXG4gIC8vICAgIHBhcnNpbmcgbG9jYXRpb24gd2l0aCByZXNwb25zZeKAmXMgVVJMLlxuICBpZiAobG9jYXRpb24gIT09IG51bGwgJiYgaXNWYWxpZEhlYWRlclZhbHVlKGxvY2F0aW9uKSkge1xuICAgIGxvY2F0aW9uID0gbmV3IFVSTChsb2NhdGlvbiwgcmVzcG9uc2VVUkwocmVzcG9uc2UpKVxuICB9XG5cbiAgLy8gNC4gSWYgbG9jYXRpb24gaXMgYSBVUkwgd2hvc2UgZnJhZ21lbnQgaXMgbnVsbCwgdGhlbiBzZXQgbG9jYXRpb27igJlzXG4gIC8vIGZyYWdtZW50IHRvIHJlcXVlc3RGcmFnbWVudC5cbiAgaWYgKGxvY2F0aW9uICYmICFsb2NhdGlvbi5oYXNoKSB7XG4gICAgbG9jYXRpb24uaGFzaCA9IHJlcXVlc3RGcmFnbWVudFxuICB9XG5cbiAgLy8gNS4gUmV0dXJuIGxvY2F0aW9uLlxuICByZXR1cm4gbG9jYXRpb25cbn1cblxuLyoqIEByZXR1cm5zIHtVUkx9ICovXG5mdW5jdGlvbiByZXF1ZXN0Q3VycmVudFVSTCAocmVxdWVzdCkge1xuICByZXR1cm4gcmVxdWVzdC51cmxMaXN0W3JlcXVlc3QudXJsTGlzdC5sZW5ndGggLSAxXVxufVxuXG5mdW5jdGlvbiByZXF1ZXN0QmFkUG9ydCAocmVxdWVzdCkge1xuICAvLyAxLiBMZXQgdXJsIGJlIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJMLlxuICBjb25zdCB1cmwgPSByZXF1ZXN0Q3VycmVudFVSTChyZXF1ZXN0KVxuXG4gIC8vIDIuIElmIHVybOKAmXMgc2NoZW1lIGlzIGFuIEhUVFAoUykgc2NoZW1lIGFuZCB1cmzigJlzIHBvcnQgaXMgYSBiYWQgcG9ydCxcbiAgLy8gdGhlbiByZXR1cm4gYmxvY2tlZC5cbiAgaWYgKHVybElzSHR0cEh0dHBzU2NoZW1lKHVybCkgJiYgYmFkUG9ydHNTZXQuaGFzKHVybC5wb3J0KSkge1xuICAgIHJldHVybiAnYmxvY2tlZCdcbiAgfVxuXG4gIC8vIDMuIFJldHVybiBhbGxvd2VkLlxuICByZXR1cm4gJ2FsbG93ZWQnXG59XG5cbmZ1bmN0aW9uIGlzRXJyb3JMaWtlIChvYmplY3QpIHtcbiAgcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIEVycm9yIHx8IChcbiAgICBvYmplY3Q/LmNvbnN0cnVjdG9yPy5uYW1lID09PSAnRXJyb3InIHx8XG4gICAgb2JqZWN0Py5jb25zdHJ1Y3Rvcj8ubmFtZSA9PT0gJ0RPTUV4Y2VwdGlvbidcbiAgKVxufVxuXG4vLyBDaGVjayB3aGV0aGVyIHxzdGF0dXNUZXh0fCBpcyBhIEJ5dGVTdHJpbmcgYW5kXG4vLyBtYXRjaGVzIHRoZSBSZWFzb24tUGhyYXNlIHRva2VuIHByb2R1Y3Rpb24uXG4vLyBSRkMgMjYxNjogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzI2MTZcbi8vIFJGQyA3MjMwOiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMFxuLy8gXCJyZWFzb24tcGhyYXNlID0gKiggSFRBQiAvIFNQIC8gVkNIQVIgLyBvYnMtdGV4dCApXCJcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJvbWl1bS9jaHJvbWl1bS9ibG9iLzk0LjAuNDYwNC4xL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvZmV0Y2gvcmVzcG9uc2UuY2MjTDExNlxuZnVuY3Rpb24gaXNWYWxpZFJlYXNvblBocmFzZSAoc3RhdHVzVGV4dCkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YXR1c1RleHQubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBjID0gc3RhdHVzVGV4dC5jaGFyQ29kZUF0KGkpXG4gICAgaWYgKFxuICAgICAgIShcbiAgICAgICAgKFxuICAgICAgICAgIGMgPT09IDB4MDkgfHwgLy8gSFRBQlxuICAgICAgICAgIChjID49IDB4MjAgJiYgYyA8PSAweDdlKSB8fCAvLyBTUCAvIFZDSEFSXG4gICAgICAgICAgKGMgPj0gMHg4MCAmJiBjIDw9IDB4ZmYpXG4gICAgICAgICkgLy8gb2JzLXRleHRcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzAjc2VjdGlvbi0zLjIuNlxuICogQHBhcmFtIHtudW1iZXJ9IGNcbiAqL1xuZnVuY3Rpb24gaXNUb2tlbkNoYXJDb2RlIChjKSB7XG4gIHN3aXRjaCAoYykge1xuICAgIGNhc2UgMHgyMjpcbiAgICBjYXNlIDB4Mjg6XG4gICAgY2FzZSAweDI5OlxuICAgIGNhc2UgMHgyYzpcbiAgICBjYXNlIDB4MmY6XG4gICAgY2FzZSAweDNhOlxuICAgIGNhc2UgMHgzYjpcbiAgICBjYXNlIDB4M2M6XG4gICAgY2FzZSAweDNkOlxuICAgIGNhc2UgMHgzZTpcbiAgICBjYXNlIDB4M2Y6XG4gICAgY2FzZSAweDQwOlxuICAgIGNhc2UgMHg1YjpcbiAgICBjYXNlIDB4NWM6XG4gICAgY2FzZSAweDVkOlxuICAgIGNhc2UgMHg3YjpcbiAgICBjYXNlIDB4N2Q6XG4gICAgICAvLyBEUVVPVEUgYW5kIFwiKCksLzo7PD0+P0BbXFxde31cIlxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIFZDSEFSICV4MjEtN0VcbiAgICAgIHJldHVybiBjID49IDB4MjEgJiYgYyA8PSAweDdlXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hhcmFjdGVyc1xuICovXG5mdW5jdGlvbiBpc1ZhbGlkSFRUUFRva2VuIChjaGFyYWN0ZXJzKSB7XG4gIGlmIChjaGFyYWN0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhcmFjdGVycy5sZW5ndGg7ICsraSkge1xuICAgIGlmICghaXNUb2tlbkNoYXJDb2RlKGNoYXJhY3RlcnMuY2hhckNvZGVBdChpKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2hlYWRlci1uYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcG90ZW50aWFsVmFsdWVcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZEhlYWRlck5hbWUgKHBvdGVudGlhbFZhbHVlKSB7XG4gIHJldHVybiBpc1ZhbGlkSFRUUFRva2VuKHBvdGVudGlhbFZhbHVlKVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2hlYWRlci12YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IHBvdGVudGlhbFZhbHVlXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRIZWFkZXJWYWx1ZSAocG90ZW50aWFsVmFsdWUpIHtcbiAgLy8gLSBIYXMgbm8gbGVhZGluZyBvciB0cmFpbGluZyBIVFRQIHRhYiBvciBzcGFjZSBieXRlcy5cbiAgLy8gLSBDb250YWlucyBubyAweDAwIChOVUwpIG9yIEhUVFAgbmV3bGluZSBieXRlcy5cbiAgaWYgKFxuICAgIHBvdGVudGlhbFZhbHVlLnN0YXJ0c1dpdGgoJ1xcdCcpIHx8XG4gICAgcG90ZW50aWFsVmFsdWUuc3RhcnRzV2l0aCgnICcpIHx8XG4gICAgcG90ZW50aWFsVmFsdWUuZW5kc1dpdGgoJ1xcdCcpIHx8XG4gICAgcG90ZW50aWFsVmFsdWUuZW5kc1dpdGgoJyAnKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmIChcbiAgICBwb3RlbnRpYWxWYWx1ZS5pbmNsdWRlcygnXFwwJykgfHxcbiAgICBwb3RlbnRpYWxWYWx1ZS5pbmNsdWRlcygnXFxyJykgfHxcbiAgICBwb3RlbnRpYWxWYWx1ZS5pbmNsdWRlcygnXFxuJylcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vLyBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLXJlZmVycmVyLXBvbGljeS8jc2V0LXJlcXVlc3RzLXJlZmVycmVyLXBvbGljeS1vbi1yZWRpcmVjdFxuZnVuY3Rpb24gc2V0UmVxdWVzdFJlZmVycmVyUG9saWN5T25SZWRpcmVjdCAocmVxdWVzdCwgYWN0dWFsUmVzcG9uc2UpIHtcbiAgLy8gIEdpdmVuIGEgcmVxdWVzdCByZXF1ZXN0IGFuZCBhIHJlc3BvbnNlIGFjdHVhbFJlc3BvbnNlLCB0aGlzIGFsZ29yaXRobVxuICAvLyAgdXBkYXRlcyByZXF1ZXN04oCZcyByZWZlcnJlciBwb2xpY3kgYWNjb3JkaW5nIHRvIHRoZSBSZWZlcnJlci1Qb2xpY3lcbiAgLy8gIGhlYWRlciAoaWYgYW55KSBpbiBhY3R1YWxSZXNwb25zZS5cblxuICAvLyAxLiBMZXQgcG9saWN5IGJlIHRoZSByZXN1bHQgb2YgZXhlY3V0aW5nIMKnIDguMSBQYXJzZSBhIHJlZmVycmVyIHBvbGljeVxuICAvLyBmcm9tIGEgUmVmZXJyZXItUG9saWN5IGhlYWRlciBvbiBhY3R1YWxSZXNwb25zZS5cblxuICAvLyA4LjEgUGFyc2UgYSByZWZlcnJlciBwb2xpY3kgZnJvbSBhIFJlZmVycmVyLVBvbGljeSBoZWFkZXJcbiAgLy8gMS4gTGV0IHBvbGljeS10b2tlbnMgYmUgdGhlIHJlc3VsdCBvZiBleHRyYWN0aW5nIGhlYWRlciBsaXN0IHZhbHVlcyBnaXZlbiBgUmVmZXJyZXItUG9saWN5YCBhbmQgcmVzcG9uc2XigJlzIGhlYWRlciBsaXN0LlxuICBjb25zdCB7IGhlYWRlcnNMaXN0IH0gPSBhY3R1YWxSZXNwb25zZVxuICAvLyAyLiBMZXQgcG9saWN5IGJlIHRoZSBlbXB0eSBzdHJpbmcuXG4gIC8vIDMuIEZvciBlYWNoIHRva2VuIGluIHBvbGljeS10b2tlbnMsIGlmIHRva2VuIGlzIGEgcmVmZXJyZXIgcG9saWN5IGFuZCB0b2tlbiBpcyBub3QgdGhlIGVtcHR5IHN0cmluZywgdGhlbiBzZXQgcG9saWN5IHRvIHRva2VuLlxuICAvLyA0LiBSZXR1cm4gcG9saWN5LlxuICBjb25zdCBwb2xpY3lIZWFkZXIgPSAoaGVhZGVyc0xpc3QuZ2V0KCdyZWZlcnJlci1wb2xpY3knKSA/PyAnJykuc3BsaXQoJywnKVxuXG4gIC8vIE5vdGU6IEFzIHRoZSByZWZlcnJlci1wb2xpY3kgY2FuIGNvbnRhaW4gbXVsdGlwbGUgcG9saWNpZXNcbiAgLy8gc2VwYXJhdGVkIGJ5IGNvbW1hLCB3ZSBuZWVkIHRvIGxvb3AgdGhyb3VnaCBhbGwgb2YgdGhlbVxuICAvLyBhbmQgcGljayB0aGUgZmlyc3QgdmFsaWQgb25lLlxuICAvLyBSZWY6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvSGVhZGVycy9SZWZlcnJlci1Qb2xpY3kjc3BlY2lmeV9hX2ZhbGxiYWNrX3BvbGljeVxuICBsZXQgcG9saWN5ID0gJydcbiAgaWYgKHBvbGljeUhlYWRlci5sZW5ndGggPiAwKSB7XG4gICAgLy8gVGhlIHJpZ2h0LW1vc3QgcG9saWN5IHRha2VzIHByZWNlZGVuY2UuXG4gICAgLy8gVGhlIGxlZnQtbW9zdCBwb2xpY3kgaXMgdGhlIGZhbGxiYWNrLlxuICAgIGZvciAobGV0IGkgPSBwb2xpY3lIZWFkZXIubGVuZ3RoOyBpICE9PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IHRva2VuID0gcG9saWN5SGVhZGVyW2kgLSAxXS50cmltKClcbiAgICAgIGlmIChyZWZlcnJlclBvbGljeVRva2Vucy5oYXModG9rZW4pKSB7XG4gICAgICAgIHBvbGljeSA9IHRva2VuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gMi4gSWYgcG9saWN5IGlzIG5vdCB0aGUgZW1wdHkgc3RyaW5nLCB0aGVuIHNldCByZXF1ZXN04oCZcyByZWZlcnJlciBwb2xpY3kgdG8gcG9saWN5LlxuICBpZiAocG9saWN5ICE9PSAnJykge1xuICAgIHJlcXVlc3QucmVmZXJyZXJQb2xpY3kgPSBwb2xpY3lcbiAgfVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY3Jvc3Mtb3JpZ2luLXJlc291cmNlLXBvbGljeS1jaGVja1xuZnVuY3Rpb24gY3Jvc3NPcmlnaW5SZXNvdXJjZVBvbGljeUNoZWNrICgpIHtcbiAgLy8gVE9ET1xuICByZXR1cm4gJ2FsbG93ZWQnXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWNvcnMtY2hlY2tcbmZ1bmN0aW9uIGNvcnNDaGVjayAoKSB7XG4gIC8vIFRPRE9cbiAgcmV0dXJuICdzdWNjZXNzJ1xufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC10YW8tY2hlY2tcbmZ1bmN0aW9uIFRBT0NoZWNrICgpIHtcbiAgLy8gVE9ET1xuICByZXR1cm4gJ3N1Y2Nlc3MnXG59XG5cbmZ1bmN0aW9uIGFwcGVuZEZldGNoTWV0YWRhdGEgKGh0dHBSZXF1ZXN0KSB7XG4gIC8vICBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLWZldGNoLW1ldGFkYXRhLyNzZWMtZmV0Y2gtZGVzdC1oZWFkZXJcbiAgLy8gIFRPRE9cblxuICAvLyAgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmFwcHNlYy1mZXRjaC1tZXRhZGF0YS8jc2VjLWZldGNoLW1vZGUtaGVhZGVyXG5cbiAgLy8gIDEuIEFzc2VydDogcuKAmXMgdXJsIGlzIGEgcG90ZW50aWFsbHkgdHJ1c3R3b3J0aHkgVVJMLlxuICAvLyAgVE9ET1xuXG4gIC8vICAyLiBMZXQgaGVhZGVyIGJlIGEgU3RydWN0dXJlZCBIZWFkZXIgd2hvc2UgdmFsdWUgaXMgYSB0b2tlbi5cbiAgbGV0IGhlYWRlciA9IG51bGxcblxuICAvLyAgMy4gU2V0IGhlYWRlcuKAmXMgdmFsdWUgdG8gcuKAmXMgbW9kZS5cbiAgaGVhZGVyID0gaHR0cFJlcXVlc3QubW9kZVxuXG4gIC8vICA0LiBTZXQgYSBzdHJ1Y3R1cmVkIGZpZWxkIHZhbHVlIGBTZWMtRmV0Y2gtTW9kZWAvaGVhZGVyIGluIHLigJlzIGhlYWRlciBsaXN0LlxuICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5zZXQoJ3NlYy1mZXRjaC1tb2RlJywgaGVhZGVyKVxuXG4gIC8vICBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLWZldGNoLW1ldGFkYXRhLyNzZWMtZmV0Y2gtc2l0ZS1oZWFkZXJcbiAgLy8gIFRPRE9cblxuICAvLyAgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmFwcHNlYy1mZXRjaC1tZXRhZGF0YS8jc2VjLWZldGNoLXVzZXItaGVhZGVyXG4gIC8vICBUT0RPXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNhcHBlbmQtYS1yZXF1ZXN0LW9yaWdpbi1oZWFkZXJcbmZ1bmN0aW9uIGFwcGVuZFJlcXVlc3RPcmlnaW5IZWFkZXIgKHJlcXVlc3QpIHtcbiAgLy8gMS4gTGV0IHNlcmlhbGl6ZWRPcmlnaW4gYmUgdGhlIHJlc3VsdCBvZiBieXRlLXNlcmlhbGl6aW5nIGEgcmVxdWVzdCBvcmlnaW4gd2l0aCByZXF1ZXN0LlxuICBsZXQgc2VyaWFsaXplZE9yaWdpbiA9IHJlcXVlc3Qub3JpZ2luXG5cbiAgLy8gMi4gSWYgcmVxdWVzdOKAmXMgcmVzcG9uc2UgdGFpbnRpbmcgaXMgXCJjb3JzXCIgb3IgcmVxdWVzdOKAmXMgbW9kZSBpcyBcIndlYnNvY2tldFwiLCB0aGVuIGFwcGVuZCAoYE9yaWdpbmAsIHNlcmlhbGl6ZWRPcmlnaW4pIHRvIHJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICBpZiAocmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnY29ycycgfHwgcmVxdWVzdC5tb2RlID09PSAnd2Vic29ja2V0Jykge1xuICAgIGlmIChzZXJpYWxpemVkT3JpZ2luKSB7XG4gICAgICByZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgnb3JpZ2luJywgc2VyaWFsaXplZE9yaWdpbilcbiAgICB9XG5cbiAgLy8gMy4gT3RoZXJ3aXNlLCBpZiByZXF1ZXN04oCZcyBtZXRob2QgaXMgbmVpdGhlciBgR0VUYCBub3IgYEhFQURgLCB0aGVuOlxuICB9IGVsc2UgaWYgKHJlcXVlc3QubWV0aG9kICE9PSAnR0VUJyAmJiByZXF1ZXN0Lm1ldGhvZCAhPT0gJ0hFQUQnKSB7XG4gICAgLy8gMS4gU3dpdGNoIG9uIHJlcXVlc3TigJlzIHJlZmVycmVyIHBvbGljeTpcbiAgICBzd2l0Y2ggKHJlcXVlc3QucmVmZXJyZXJQb2xpY3kpIHtcbiAgICAgIGNhc2UgJ25vLXJlZmVycmVyJzpcbiAgICAgICAgLy8gU2V0IHNlcmlhbGl6ZWRPcmlnaW4gdG8gYG51bGxgLlxuICAgICAgICBzZXJpYWxpemVkT3JpZ2luID0gbnVsbFxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnbm8tcmVmZXJyZXItd2hlbi1kb3duZ3JhZGUnOlxuICAgICAgY2FzZSAnc3RyaWN0LW9yaWdpbic6XG4gICAgICBjYXNlICdzdHJpY3Qtb3JpZ2luLXdoZW4tY3Jvc3Mtb3JpZ2luJzpcbiAgICAgICAgLy8gSWYgcmVxdWVzdOKAmXMgb3JpZ2luIGlzIGEgdHVwbGUgb3JpZ2luLCBpdHMgc2NoZW1lIGlzIFwiaHR0cHNcIiwgYW5kIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBzY2hlbWUgaXMgbm90IFwiaHR0cHNcIiwgdGhlbiBzZXQgc2VyaWFsaXplZE9yaWdpbiB0byBgbnVsbGAuXG4gICAgICAgIGlmIChyZXF1ZXN0Lm9yaWdpbiAmJiB1cmxIYXNIdHRwc1NjaGVtZShyZXF1ZXN0Lm9yaWdpbikgJiYgIXVybEhhc0h0dHBzU2NoZW1lKHJlcXVlc3RDdXJyZW50VVJMKHJlcXVlc3QpKSkge1xuICAgICAgICAgIHNlcmlhbGl6ZWRPcmlnaW4gPSBudWxsXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3NhbWUtb3JpZ2luJzpcbiAgICAgICAgLy8gSWYgcmVxdWVzdOKAmXMgb3JpZ2luIGlzIG5vdCBzYW1lIG9yaWdpbiB3aXRoIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBvcmlnaW4sIHRoZW4gc2V0IHNlcmlhbGl6ZWRPcmlnaW4gdG8gYG51bGxgLlxuICAgICAgICBpZiAoIXNhbWVPcmlnaW4ocmVxdWVzdCwgcmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdCkpKSB7XG4gICAgICAgICAgc2VyaWFsaXplZE9yaWdpbiA9IG51bGxcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gRG8gbm90aGluZy5cbiAgICB9XG5cbiAgICBpZiAoc2VyaWFsaXplZE9yaWdpbikge1xuICAgICAgLy8gMi4gQXBwZW5kIChgT3JpZ2luYCwgc2VyaWFsaXplZE9yaWdpbikgdG8gcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gICAgICByZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgnb3JpZ2luJywgc2VyaWFsaXplZE9yaWdpbilcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29hcnNlbmVkU2hhcmVkQ3VycmVudFRpbWUgKGNyb3NzT3JpZ2luSXNvbGF0ZWRDYXBhYmlsaXR5KSB7XG4gIC8vIFRPRE9cbiAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjcmVhdGUtYW4tb3BhcXVlLXRpbWluZy1pbmZvXG5mdW5jdGlvbiBjcmVhdGVPcGFxdWVUaW1pbmdJbmZvICh0aW1pbmdJbmZvKSB7XG4gIHJldHVybiB7XG4gICAgc3RhcnRUaW1lOiB0aW1pbmdJbmZvLnN0YXJ0VGltZSA/PyAwLFxuICAgIHJlZGlyZWN0U3RhcnRUaW1lOiAwLFxuICAgIHJlZGlyZWN0RW5kVGltZTogMCxcbiAgICBwb3N0UmVkaXJlY3RTdGFydFRpbWU6IHRpbWluZ0luZm8uc3RhcnRUaW1lID8/IDAsXG4gICAgZmluYWxTZXJ2aWNlV29ya2VyU3RhcnRUaW1lOiAwLFxuICAgIGZpbmFsTmV0d29ya1Jlc3BvbnNlU3RhcnRUaW1lOiAwLFxuICAgIGZpbmFsTmV0d29ya1JlcXVlc3RTdGFydFRpbWU6IDAsXG4gICAgZW5kVGltZTogMCxcbiAgICBlbmNvZGVkQm9keVNpemU6IDAsXG4gICAgZGVjb2RlZEJvZHlTaXplOiAwLFxuICAgIGZpbmFsQ29ubmVjdGlvblRpbWluZ0luZm86IG51bGxcbiAgfVxufVxuXG4vLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9vcmlnaW4uaHRtbCNwb2xpY3ktY29udGFpbmVyXG5mdW5jdGlvbiBtYWtlUG9saWN5Q29udGFpbmVyICgpIHtcbiAgLy8gTm90ZTogdGhlIGZldGNoIHNwZWMgZG9lc24ndCBtYWtlIHVzZSBvZiBlbWJlZGRlciBwb2xpY3kgb3IgQ1NQIGxpc3RcbiAgcmV0dXJuIHtcbiAgICByZWZlcnJlclBvbGljeTogJ3N0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4nXG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvb3JpZ2luLmh0bWwjY2xvbmUtYS1wb2xpY3ktY29udGFpbmVyXG5mdW5jdGlvbiBjbG9uZVBvbGljeUNvbnRhaW5lciAocG9saWN5Q29udGFpbmVyKSB7XG4gIHJldHVybiB7XG4gICAgcmVmZXJyZXJQb2xpY3k6IHBvbGljeUNvbnRhaW5lci5yZWZlcnJlclBvbGljeVxuICB9XG59XG5cbi8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtcmVmZXJyZXItcG9saWN5LyNkZXRlcm1pbmUtcmVxdWVzdHMtcmVmZXJyZXJcbmZ1bmN0aW9uIGRldGVybWluZVJlcXVlc3RzUmVmZXJyZXIgKHJlcXVlc3QpIHtcbiAgLy8gMS4gTGV0IHBvbGljeSBiZSByZXF1ZXN0J3MgcmVmZXJyZXIgcG9saWN5LlxuICBjb25zdCBwb2xpY3kgPSByZXF1ZXN0LnJlZmVycmVyUG9saWN5XG5cbiAgLy8gTm90ZTogcG9saWN5IGNhbm5vdCAoc2hvdWxkbid0KSBiZSBudWxsIG9yIGFuIGVtcHR5IHN0cmluZy5cbiAgYXNzZXJ0KHBvbGljeSlcblxuICAvLyAyLiBMZXQgZW52aXJvbm1lbnQgYmUgcmVxdWVzdOKAmXMgY2xpZW50LlxuXG4gIGxldCByZWZlcnJlclNvdXJjZSA9IG51bGxcblxuICAvLyAzLiBTd2l0Y2ggb24gcmVxdWVzdOKAmXMgcmVmZXJyZXI6XG4gIGlmIChyZXF1ZXN0LnJlZmVycmVyID09PSAnY2xpZW50Jykge1xuICAgIC8vIE5vdGU6IG5vZGUgaXNuJ3QgYSBicm93c2VyIGFuZCBkb2Vzbid0IGltcGxlbWVudCBkb2N1bWVudC9pZnJhbWVzLFxuICAgIC8vIHNvIHdlIGJ5cGFzcyB0aGlzIHN0ZXAgYW5kIHJlcGxhY2UgaXQgd2l0aCBvdXIgb3duLlxuXG4gICAgY29uc3QgZ2xvYmFsT3JpZ2luID0gZ2V0R2xvYmFsT3JpZ2luKClcblxuICAgIGlmICghZ2xvYmFsT3JpZ2luIHx8IGdsb2JhbE9yaWdpbi5vcmlnaW4gPT09ICdudWxsJykge1xuICAgICAgcmV0dXJuICduby1yZWZlcnJlcidcbiAgICB9XG5cbiAgICAvLyBub3RlOiB3ZSBuZWVkIHRvIGNsb25lIGl0IGFzIGl0J3MgbXV0YXRlZFxuICAgIHJlZmVycmVyU291cmNlID0gbmV3IFVSTChnbG9iYWxPcmlnaW4pXG4gIH0gZWxzZSBpZiAocmVxdWVzdC5yZWZlcnJlciBpbnN0YW5jZW9mIFVSTCkge1xuICAgIC8vIExldCByZWZlcnJlclNvdXJjZSBiZSByZXF1ZXN04oCZcyByZWZlcnJlci5cbiAgICByZWZlcnJlclNvdXJjZSA9IHJlcXVlc3QucmVmZXJyZXJcbiAgfVxuXG4gIC8vIDQuIExldCByZXF1ZXN04oCZcyByZWZlcnJlclVSTCBiZSB0aGUgcmVzdWx0IG9mIHN0cmlwcGluZyByZWZlcnJlclNvdXJjZSBmb3JcbiAgLy8gICAgdXNlIGFzIGEgcmVmZXJyZXIuXG4gIGxldCByZWZlcnJlclVSTCA9IHN0cmlwVVJMRm9yUmVmZXJyZXIocmVmZXJyZXJTb3VyY2UpXG5cbiAgLy8gNS4gTGV0IHJlZmVycmVyT3JpZ2luIGJlIHRoZSByZXN1bHQgb2Ygc3RyaXBwaW5nIHJlZmVycmVyU291cmNlIGZvciB1c2UgYXNcbiAgLy8gICAgYSByZWZlcnJlciwgd2l0aCB0aGUgb3JpZ2luLW9ubHkgZmxhZyBzZXQgdG8gdHJ1ZS5cbiAgY29uc3QgcmVmZXJyZXJPcmlnaW4gPSBzdHJpcFVSTEZvclJlZmVycmVyKHJlZmVycmVyU291cmNlLCB0cnVlKVxuXG4gIC8vIDYuIElmIHRoZSByZXN1bHQgb2Ygc2VyaWFsaXppbmcgcmVmZXJyZXJVUkwgaXMgYSBzdHJpbmcgd2hvc2UgbGVuZ3RoIGlzXG4gIC8vICAgIGdyZWF0ZXIgdGhhbiA0MDk2LCBzZXQgcmVmZXJyZXJVUkwgdG8gcmVmZXJyZXJPcmlnaW4uXG4gIGlmIChyZWZlcnJlclVSTC50b1N0cmluZygpLmxlbmd0aCA+IDQwOTYpIHtcbiAgICByZWZlcnJlclVSTCA9IHJlZmVycmVyT3JpZ2luXG4gIH1cblxuICBjb25zdCBhcmVTYW1lT3JpZ2luID0gc2FtZU9yaWdpbihyZXF1ZXN0LCByZWZlcnJlclVSTClcbiAgY29uc3QgaXNOb25Qb3RlbnRpYWxseVRydXN0V29ydGh5ID0gaXNVUkxQb3RlbnRpYWxseVRydXN0d29ydGh5KHJlZmVycmVyVVJMKSAmJlxuICAgICFpc1VSTFBvdGVudGlhbGx5VHJ1c3R3b3J0aHkocmVxdWVzdC51cmwpXG5cbiAgLy8gOC4gRXhlY3V0ZSB0aGUgc3dpdGNoIHN0YXRlbWVudHMgY29ycmVzcG9uZGluZyB0byB0aGUgdmFsdWUgb2YgcG9saWN5OlxuICBzd2l0Y2ggKHBvbGljeSkge1xuICAgIGNhc2UgJ29yaWdpbic6IHJldHVybiByZWZlcnJlck9yaWdpbiAhPSBudWxsID8gcmVmZXJyZXJPcmlnaW4gOiBzdHJpcFVSTEZvclJlZmVycmVyKHJlZmVycmVyU291cmNlLCB0cnVlKVxuICAgIGNhc2UgJ3Vuc2FmZS11cmwnOiByZXR1cm4gcmVmZXJyZXJVUkxcbiAgICBjYXNlICdzYW1lLW9yaWdpbic6XG4gICAgICByZXR1cm4gYXJlU2FtZU9yaWdpbiA/IHJlZmVycmVyT3JpZ2luIDogJ25vLXJlZmVycmVyJ1xuICAgIGNhc2UgJ29yaWdpbi13aGVuLWNyb3NzLW9yaWdpbic6XG4gICAgICByZXR1cm4gYXJlU2FtZU9yaWdpbiA/IHJlZmVycmVyVVJMIDogcmVmZXJyZXJPcmlnaW5cbiAgICBjYXNlICdzdHJpY3Qtb3JpZ2luLXdoZW4tY3Jvc3Mtb3JpZ2luJzoge1xuICAgICAgY29uc3QgY3VycmVudFVSTCA9IHJlcXVlc3RDdXJyZW50VVJMKHJlcXVlc3QpXG5cbiAgICAgIC8vIDEuIElmIHRoZSBvcmlnaW4gb2YgcmVmZXJyZXJVUkwgYW5kIHRoZSBvcmlnaW4gb2YgcmVxdWVzdOKAmXMgY3VycmVudFxuICAgICAgLy8gICAgVVJMIGFyZSB0aGUgc2FtZSwgdGhlbiByZXR1cm4gcmVmZXJyZXJVUkwuXG4gICAgICBpZiAoc2FtZU9yaWdpbihyZWZlcnJlclVSTCwgY3VycmVudFVSTCkpIHtcbiAgICAgICAgcmV0dXJuIHJlZmVycmVyVVJMXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIElmIHJlZmVycmVyVVJMIGlzIGEgcG90ZW50aWFsbHkgdHJ1c3R3b3J0aHkgVVJMIGFuZCByZXF1ZXN04oCZc1xuICAgICAgLy8gICAgY3VycmVudCBVUkwgaXMgbm90IGEgcG90ZW50aWFsbHkgdHJ1c3R3b3J0aHkgVVJMLCB0aGVuIHJldHVybiBub1xuICAgICAgLy8gICAgcmVmZXJyZXIuXG4gICAgICBpZiAoaXNVUkxQb3RlbnRpYWxseVRydXN0d29ydGh5KHJlZmVycmVyVVJMKSAmJiAhaXNVUkxQb3RlbnRpYWxseVRydXN0d29ydGh5KGN1cnJlbnRVUkwpKSB7XG4gICAgICAgIHJldHVybiAnbm8tcmVmZXJyZXInXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIFJldHVybiByZWZlcnJlck9yaWdpbi5cbiAgICAgIHJldHVybiByZWZlcnJlck9yaWdpblxuICAgIH1cbiAgICBjYXNlICdzdHJpY3Qtb3JpZ2luJzogLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgLyoqXG4gICAgICAgICAqIDEuIElmIHJlZmVycmVyVVJMIGlzIGEgcG90ZW50aWFsbHkgdHJ1c3R3b3J0aHkgVVJMIGFuZFxuICAgICAgICAgKiByZXF1ZXN04oCZcyBjdXJyZW50IFVSTCBpcyBub3QgYSBwb3RlbnRpYWxseSB0cnVzdHdvcnRoeSBVUkwsXG4gICAgICAgICAqIHRoZW4gcmV0dXJuIG5vIHJlZmVycmVyLlxuICAgICAgICAgKiAyLiBSZXR1cm4gcmVmZXJyZXJPcmlnaW5cbiAgICAgICAgKi9cbiAgICBjYXNlICduby1yZWZlcnJlci13aGVuLWRvd25ncmFkZSc6IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgIC8qKlxuICAgICAgICogMS4gSWYgcmVmZXJyZXJVUkwgaXMgYSBwb3RlbnRpYWxseSB0cnVzdHdvcnRoeSBVUkwgYW5kXG4gICAgICAgKiByZXF1ZXN04oCZcyBjdXJyZW50IFVSTCBpcyBub3QgYSBwb3RlbnRpYWxseSB0cnVzdHdvcnRoeSBVUkwsXG4gICAgICAgKiB0aGVuIHJldHVybiBubyByZWZlcnJlci5cbiAgICAgICAqIDIuIFJldHVybiByZWZlcnJlck9yaWdpblxuICAgICAgKi9cblxuICAgIGRlZmF1bHQ6IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgIHJldHVybiBpc05vblBvdGVudGlhbGx5VHJ1c3RXb3J0aHkgPyAnbm8tcmVmZXJyZXInIDogcmVmZXJyZXJPcmlnaW5cbiAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmFwcHNlYy1yZWZlcnJlci1wb2xpY3kvI3N0cmlwLXVybFxuICogQHBhcmFtIHtVUkx9IHVybFxuICogQHBhcmFtIHtib29sZWFufHVuZGVmaW5lZH0gb3JpZ2luT25seVxuICovXG5mdW5jdGlvbiBzdHJpcFVSTEZvclJlZmVycmVyICh1cmwsIG9yaWdpbk9ubHkpIHtcbiAgLy8gMS4gQXNzZXJ0OiB1cmwgaXMgYSBVUkwuXG4gIGFzc2VydCh1cmwgaW5zdGFuY2VvZiBVUkwpXG5cbiAgLy8gMi4gSWYgdXJs4oCZcyBzY2hlbWUgaXMgYSBsb2NhbCBzY2hlbWUsIHRoZW4gcmV0dXJuIG5vIHJlZmVycmVyLlxuICBpZiAodXJsLnByb3RvY29sID09PSAnZmlsZTonIHx8IHVybC5wcm90b2NvbCA9PT0gJ2Fib3V0OicgfHwgdXJsLnByb3RvY29sID09PSAnYmxhbms6Jykge1xuICAgIHJldHVybiAnbm8tcmVmZXJyZXInXG4gIH1cblxuICAvLyAzLiBTZXQgdXJs4oCZcyB1c2VybmFtZSB0byB0aGUgZW1wdHkgc3RyaW5nLlxuICB1cmwudXNlcm5hbWUgPSAnJ1xuXG4gIC8vIDQuIFNldCB1cmzigJlzIHBhc3N3b3JkIHRvIHRoZSBlbXB0eSBzdHJpbmcuXG4gIHVybC5wYXNzd29yZCA9ICcnXG5cbiAgLy8gNS4gU2V0IHVybOKAmXMgZnJhZ21lbnQgdG8gbnVsbC5cbiAgdXJsLmhhc2ggPSAnJ1xuXG4gIC8vIDYuIElmIHRoZSBvcmlnaW4tb25seSBmbGFnIGlzIHRydWUsIHRoZW46XG4gIGlmIChvcmlnaW5Pbmx5KSB7XG4gICAgLy8gMS4gU2V0IHVybOKAmXMgcGF0aCB0byDCqyB0aGUgZW1wdHkgc3RyaW5nIMK7LlxuICAgIHVybC5wYXRobmFtZSA9ICcnXG5cbiAgICAvLyAyLiBTZXQgdXJs4oCZcyBxdWVyeSB0byBudWxsLlxuICAgIHVybC5zZWFyY2ggPSAnJ1xuICB9XG5cbiAgLy8gNy4gUmV0dXJuIHVybC5cbiAgcmV0dXJuIHVybFxufVxuXG5mdW5jdGlvbiBpc1VSTFBvdGVudGlhbGx5VHJ1c3R3b3J0aHkgKHVybCkge1xuICBpZiAoISh1cmwgaW5zdGFuY2VvZiBVUkwpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBJZiBjaGlsZCBvZiBhYm91dCwgcmV0dXJuIHRydWVcbiAgaWYgKHVybC5ocmVmID09PSAnYWJvdXQ6YmxhbmsnIHx8IHVybC5ocmVmID09PSAnYWJvdXQ6c3JjZG9jJykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvLyBJZiBzY2hlbWUgaXMgZGF0YSwgcmV0dXJuIHRydWVcbiAgaWYgKHVybC5wcm90b2NvbCA9PT0gJ2RhdGE6JykgcmV0dXJuIHRydWVcblxuICAvLyBJZiBmaWxlLCByZXR1cm4gdHJ1ZVxuICBpZiAodXJsLnByb3RvY29sID09PSAnZmlsZTonKSByZXR1cm4gdHJ1ZVxuXG4gIHJldHVybiBpc09yaWdpblBvdGVudGlhbGx5VHJ1c3R3b3J0aHkodXJsLm9yaWdpbilcblxuICBmdW5jdGlvbiBpc09yaWdpblBvdGVudGlhbGx5VHJ1c3R3b3J0aHkgKG9yaWdpbikge1xuICAgIC8vIElmIG9yaWdpbiBpcyBleHBsaWNpdGx5IG51bGwsIHJldHVybiBmYWxzZVxuICAgIGlmIChvcmlnaW4gPT0gbnVsbCB8fCBvcmlnaW4gPT09ICdudWxsJykgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCBvcmlnaW5Bc1VSTCA9IG5ldyBVUkwob3JpZ2luKVxuXG4gICAgLy8gSWYgc2VjdXJlLCByZXR1cm4gdHJ1ZVxuICAgIGlmIChvcmlnaW5Bc1VSTC5wcm90b2NvbCA9PT0gJ2h0dHBzOicgfHwgb3JpZ2luQXNVUkwucHJvdG9jb2wgPT09ICd3c3M6Jykge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvLyBJZiBsb2NhbGhvc3Qgb3IgdmFyaWFudHMsIHJldHVybiB0cnVlXG4gICAgaWYgKC9eMTI3KD86XFwuWzAtOV0rKXswLDJ9XFwuWzAtOV0rJHxeXFxbKD86MCo6KSo/Oj8wKjFcXF0kLy50ZXN0KG9yaWdpbkFzVVJMLmhvc3RuYW1lKSB8fFxuICAgICAob3JpZ2luQXNVUkwuaG9zdG5hbWUgPT09ICdsb2NhbGhvc3QnIHx8IG9yaWdpbkFzVVJMLmhvc3RuYW1lLmluY2x1ZGVzKCdsb2NhbGhvc3QuJykpIHx8XG4gICAgIChvcmlnaW5Bc1VSTC5ob3N0bmFtZS5lbmRzV2l0aCgnLmxvY2FsaG9zdCcpKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvLyBJZiBhbnkgb3RoZXIsIHJldHVybiBmYWxzZVxuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLXN1YnJlc291cmNlLWludGVncml0eS8jZG9lcy1yZXNwb25zZS1tYXRjaC1tZXRhZGF0YWxpc3RcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYnl0ZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRhZGF0YUxpc3RcbiAqL1xuZnVuY3Rpb24gYnl0ZXNNYXRjaCAoYnl0ZXMsIG1ldGFkYXRhTGlzdCkge1xuICAvLyBJZiBub2RlIGlzIG5vdCBidWlsdCB3aXRoIE9wZW5TU0wgc3VwcG9ydCwgd2UgY2Fubm90IGNoZWNrXG4gIC8vIGEgcmVxdWVzdCdzIGludGVncml0eSwgc28gYWxsb3cgaXQgYnkgZGVmYXVsdCAodGhlIHNwZWMgd2lsbFxuICAvLyBhbGxvdyByZXF1ZXN0cyBpZiBhbiBpbnZhbGlkIGhhc2ggaXMgZ2l2ZW4sIGFzIHByZWNlZGVuY2UpLlxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWY6IG9ubHkgaWYgbm9kZSBpcyBidWlsdCB3aXRoIC0td2l0aG91dC1zc2wgKi9cbiAgaWYgKGNyeXB0byA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIDEuIExldCBwYXJzZWRNZXRhZGF0YSBiZSB0aGUgcmVzdWx0IG9mIHBhcnNpbmcgbWV0YWRhdGFMaXN0LlxuICBjb25zdCBwYXJzZWRNZXRhZGF0YSA9IHBhcnNlTWV0YWRhdGEobWV0YWRhdGFMaXN0KVxuXG4gIC8vIDIuIElmIHBhcnNlZE1ldGFkYXRhIGlzIG5vIG1ldGFkYXRhLCByZXR1cm4gdHJ1ZS5cbiAgaWYgKHBhcnNlZE1ldGFkYXRhID09PSAnbm8gbWV0YWRhdGEnKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIDMuIElmIHJlc3BvbnNlIGlzIG5vdCBlbGlnaWJsZSBmb3IgaW50ZWdyaXR5IHZhbGlkYXRpb24sIHJldHVybiBmYWxzZS5cbiAgLy8gVE9ET1xuXG4gIC8vIDQuIElmIHBhcnNlZE1ldGFkYXRhIGlzIHRoZSBlbXB0eSBzZXQsIHJldHVybiB0cnVlLlxuICBpZiAocGFyc2VkTWV0YWRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIDUuIExldCBtZXRhZGF0YSBiZSB0aGUgcmVzdWx0IG9mIGdldHRpbmcgdGhlIHN0cm9uZ2VzdFxuICAvLyAgICBtZXRhZGF0YSBmcm9tIHBhcnNlZE1ldGFkYXRhLlxuICBjb25zdCBzdHJvbmdlc3QgPSBnZXRTdHJvbmdlc3RNZXRhZGF0YShwYXJzZWRNZXRhZGF0YSlcbiAgY29uc3QgbWV0YWRhdGEgPSBmaWx0ZXJNZXRhZGF0YUxpc3RCeUFsZ29yaXRobShwYXJzZWRNZXRhZGF0YSwgc3Ryb25nZXN0KVxuXG4gIC8vIDYuIEZvciBlYWNoIGl0ZW0gaW4gbWV0YWRhdGE6XG4gIGZvciAoY29uc3QgaXRlbSBvZiBtZXRhZGF0YSkge1xuICAgIC8vIDEuIExldCBhbGdvcml0aG0gYmUgdGhlIGFsZyBjb21wb25lbnQgb2YgaXRlbS5cbiAgICBjb25zdCBhbGdvcml0aG0gPSBpdGVtLmFsZ29cblxuICAgIC8vIDIuIExldCBleHBlY3RlZFZhbHVlIGJlIHRoZSB2YWwgY29tcG9uZW50IG9mIGl0ZW0uXG4gICAgY29uc3QgZXhwZWN0ZWRWYWx1ZSA9IGl0ZW0uaGFzaFxuXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWItcGxhdGZvcm0tdGVzdHMvd3B0L2NvbW1pdC9lNGM1Y2M3YTVlNDgwOTMyMjA1MjhkZmRkMWM0MDEyZGMzODM3YTBlXG4gICAgLy8gXCJiZSBsaWJlcmFsIHdpdGggcGFkZGluZ1wiLiBUaGlzIGlzIGFubm95aW5nLCBhbmQgaXQncyBub3QgZXZlbiBpbiB0aGUgc3BlYy5cblxuICAgIC8vIDMuIExldCBhY3R1YWxWYWx1ZSBiZSB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIGFsZ29yaXRobSB0byBieXRlcy5cbiAgICBsZXQgYWN0dWFsVmFsdWUgPSBjcnlwdG8uY3JlYXRlSGFzaChhbGdvcml0aG0pLnVwZGF0ZShieXRlcykuZGlnZXN0KCdiYXNlNjQnKVxuXG4gICAgaWYgKGFjdHVhbFZhbHVlW2FjdHVhbFZhbHVlLmxlbmd0aCAtIDFdID09PSAnPScpIHtcbiAgICAgIGlmIChhY3R1YWxWYWx1ZVthY3R1YWxWYWx1ZS5sZW5ndGggLSAyXSA9PT0gJz0nKSB7XG4gICAgICAgIGFjdHVhbFZhbHVlID0gYWN0dWFsVmFsdWUuc2xpY2UoMCwgLTIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY3R1YWxWYWx1ZSA9IGFjdHVhbFZhbHVlLnNsaWNlKDAsIC0xKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDQuIElmIGFjdHVhbFZhbHVlIGlzIGEgY2FzZS1zZW5zaXRpdmUgbWF0Y2ggZm9yIGV4cGVjdGVkVmFsdWUsXG4gICAgLy8gICAgcmV0dXJuIHRydWUuXG4gICAgaWYgKGNvbXBhcmVCYXNlNjRNaXhlZChhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgLy8gNy4gUmV0dXJuIGZhbHNlLlxuICByZXR1cm4gZmFsc2Vcbn1cblxuLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmFwcHNlYy1zdWJyZXNvdXJjZS1pbnRlZ3JpdHkvI2dyYW1tYXJkZWYtaGFzaC13aXRoLW9wdGlvbnNcbi8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9DU1AyLyNzb3VyY2UtbGlzdC1zeW50YXhcbi8vIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM1MjM0I2FwcGVuZGl4LUIuMVxuY29uc3QgcGFyc2VIYXNoV2l0aE9wdGlvbnMgPSAvKD88YWxnbz5zaGEyNTZ8c2hhMzg0fHNoYTUxMiktKCg/PGhhc2g+W0EtWmEtejAtOSsvXSt8W0EtWmEtejAtOV8tXSspPXswLDJ9KD86XFxzfCQpKCArWyEtfl0qKT8pPy9pXG5cbi8qKlxuICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLXN1YnJlc291cmNlLWludGVncml0eS8jcGFyc2UtbWV0YWRhdGFcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRhZGF0YVxuICovXG5mdW5jdGlvbiBwYXJzZU1ldGFkYXRhIChtZXRhZGF0YSkge1xuICAvLyAxLiBMZXQgcmVzdWx0IGJlIHRoZSBlbXB0eSBzZXQuXG4gIC8qKiBAdHlwZSB7eyBhbGdvOiBzdHJpbmcsIGhhc2g6IHN0cmluZyB9W119ICovXG4gIGNvbnN0IHJlc3VsdCA9IFtdXG5cbiAgLy8gMi4gTGV0IGVtcHR5IGJlIGVxdWFsIHRvIHRydWUuXG4gIGxldCBlbXB0eSA9IHRydWVcblxuICAvLyAzLiBGb3IgZWFjaCB0b2tlbiByZXR1cm5lZCBieSBzcGxpdHRpbmcgbWV0YWRhdGEgb24gc3BhY2VzOlxuICBmb3IgKGNvbnN0IHRva2VuIG9mIG1ldGFkYXRhLnNwbGl0KCcgJykpIHtcbiAgICAvLyAxLiBTZXQgZW1wdHkgdG8gZmFsc2UuXG4gICAgZW1wdHkgPSBmYWxzZVxuXG4gICAgLy8gMi4gUGFyc2UgdG9rZW4gYXMgYSBoYXNoLXdpdGgtb3B0aW9ucy5cbiAgICBjb25zdCBwYXJzZWRUb2tlbiA9IHBhcnNlSGFzaFdpdGhPcHRpb25zLmV4ZWModG9rZW4pXG5cbiAgICAvLyAzLiBJZiB0b2tlbiBkb2VzIG5vdCBwYXJzZSwgY29udGludWUgdG8gdGhlIG5leHQgdG9rZW4uXG4gICAgaWYgKFxuICAgICAgcGFyc2VkVG9rZW4gPT09IG51bGwgfHxcbiAgICAgIHBhcnNlZFRva2VuLmdyb3VwcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICBwYXJzZWRUb2tlbi5ncm91cHMuYWxnbyA9PT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICAvLyBOb3RlOiBDaHJvbWl1bSBibG9ja3MgdGhlIHJlcXVlc3QgYXQgdGhpcyBwb2ludCwgYnV0IEZpcmVmb3hcbiAgICAgIC8vIGdpdmVzIGEgd2FybmluZyB0aGF0IGFuIGludmFsaWQgaW50ZWdyaXR5IHdhcyBnaXZlbi4gVGhlXG4gICAgICAvLyBjb3JyZWN0IGJlaGF2aW9yIGlzIHRvIGlnbm9yZSB0aGVzZSwgYW5kIHN1YnNlcXVlbnRseSBub3RcbiAgICAgIC8vIGNoZWNrIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIHJlc291cmNlLlxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyA0LiBMZXQgYWxnb3JpdGhtIGJlIHRoZSBoYXNoLWFsZ28gY29tcG9uZW50IG9mIHRva2VuLlxuICAgIGNvbnN0IGFsZ29yaXRobSA9IHBhcnNlZFRva2VuLmdyb3Vwcy5hbGdvLnRvTG93ZXJDYXNlKClcblxuICAgIC8vIDUuIElmIGFsZ29yaXRobSBpcyBhIGhhc2ggZnVuY3Rpb24gcmVjb2duaXplZCBieSB0aGUgdXNlclxuICAgIC8vICAgIGFnZW50LCBhZGQgdGhlIHBhcnNlZCB0b2tlbiB0byByZXN1bHQuXG4gICAgaWYgKHN1cHBvcnRlZEhhc2hlcy5pbmNsdWRlcyhhbGdvcml0aG0pKSB7XG4gICAgICByZXN1bHQucHVzaChwYXJzZWRUb2tlbi5ncm91cHMpXG4gICAgfVxuICB9XG5cbiAgLy8gNC4gUmV0dXJuIG5vIG1ldGFkYXRhIGlmIGVtcHR5IGlzIHRydWUsIG90aGVyd2lzZSByZXR1cm4gcmVzdWx0LlxuICBpZiAoZW1wdHkgPT09IHRydWUpIHtcbiAgICByZXR1cm4gJ25vIG1ldGFkYXRhJ1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIEBwYXJhbSB7eyBhbGdvOiAnc2hhMjU2JyB8ICdzaGEzODQnIHwgJ3NoYTUxMicgfVtdfSBtZXRhZGF0YUxpc3RcbiAqL1xuZnVuY3Rpb24gZ2V0U3Ryb25nZXN0TWV0YWRhdGEgKG1ldGFkYXRhTGlzdCkge1xuICAvLyBMZXQgYWxnb3JpdGhtIGJlIHRoZSBhbGdvIGNvbXBvbmVudCBvZiB0aGUgZmlyc3QgaXRlbSBpbiBtZXRhZGF0YUxpc3QuXG4gIC8vIENhbiBiZSBzaGEyNTZcbiAgbGV0IGFsZ29yaXRobSA9IG1ldGFkYXRhTGlzdFswXS5hbGdvXG4gIC8vIElmIHRoZSBhbGdvcml0aG0gaXMgc2hhNTEyLCB0aGVuIGl0IGlzIHRoZSBzdHJvbmdlc3RcbiAgLy8gYW5kIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHlcbiAgaWYgKGFsZ29yaXRobVszXSA9PT0gJzUnKSB7XG4gICAgcmV0dXJuIGFsZ29yaXRobVxuICB9XG5cbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBtZXRhZGF0YUxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IG1ldGFkYXRhTGlzdFtpXVxuICAgIC8vIElmIHRoZSBhbGdvcml0aG0gaXMgc2hhNTEyLCB0aGVuIGl0IGlzIHRoZSBzdHJvbmdlc3RcbiAgICAvLyBhbmQgd2UgY2FuIGJyZWFrIHRoZSBsb29wIGltbWVkaWF0ZWx5XG4gICAgaWYgKG1ldGFkYXRhLmFsZ29bM10gPT09ICc1Jykge1xuICAgICAgYWxnb3JpdGhtID0gJ3NoYTUxMidcbiAgICAgIGJyZWFrXG4gICAgLy8gSWYgdGhlIGFsZ29yaXRobSBpcyBzaGEzODQsIHRoZW4gYSBwb3RlbnRpYWwgc2hhMjU2IG9yIHNoYTM4NCBpcyBpZ25vcmVkXG4gICAgfSBlbHNlIGlmIChhbGdvcml0aG1bM10gPT09ICczJykge1xuICAgICAgY29udGludWVcbiAgICAvLyBhbGdvcml0aG0gaXMgc2hhMjU2LCBjaGVjayBpZiBhbGdvcml0aG0gaXMgc2hhMzg0IGFuZCBpZiBzbywgc2V0IGl0IGFzXG4gICAgLy8gdGhlIHN0cm9uZ2VzdFxuICAgIH0gZWxzZSBpZiAobWV0YWRhdGEuYWxnb1szXSA9PT0gJzMnKSB7XG4gICAgICBhbGdvcml0aG0gPSAnc2hhMzg0J1xuICAgIH1cbiAgfVxuICByZXR1cm4gYWxnb3JpdGhtXG59XG5cbmZ1bmN0aW9uIGZpbHRlck1ldGFkYXRhTGlzdEJ5QWxnb3JpdGhtIChtZXRhZGF0YUxpc3QsIGFsZ29yaXRobSkge1xuICBpZiAobWV0YWRhdGFMaXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBtZXRhZGF0YUxpc3RcbiAgfVxuXG4gIGxldCBwb3MgPSAwXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWV0YWRhdGFMaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKG1ldGFkYXRhTGlzdFtpXS5hbGdvID09PSBhbGdvcml0aG0pIHtcbiAgICAgIG1ldGFkYXRhTGlzdFtwb3MrK10gPSBtZXRhZGF0YUxpc3RbaV1cbiAgICB9XG4gIH1cblxuICBtZXRhZGF0YUxpc3QubGVuZ3RoID0gcG9zXG5cbiAgcmV0dXJuIG1ldGFkYXRhTGlzdFxufVxuXG4vKipcbiAqIENvbXBhcmVzIHR3byBiYXNlNjQgc3RyaW5ncywgYWxsb3dpbmcgZm9yIGJhc2U2NHVybFxuICogaW4gdGhlIHNlY29uZCBzdHJpbmcuXG4gKlxuKiBAcGFyYW0ge3N0cmluZ30gYWN0dWFsVmFsdWUgYWx3YXlzIGJhc2U2NFxuICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVmFsdWUgYmFzZTY0IG9yIGJhc2U2NHVybFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVCYXNlNjRNaXhlZCAoYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpIHtcbiAgaWYgKGFjdHVhbFZhbHVlLmxlbmd0aCAhPT0gZXhwZWN0ZWRWYWx1ZS5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFjdHVhbFZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKGFjdHVhbFZhbHVlW2ldICE9PSBleHBlY3RlZFZhbHVlW2ldKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChhY3R1YWxWYWx1ZVtpXSA9PT0gJysnICYmIGV4cGVjdGVkVmFsdWVbaV0gPT09ICctJykgfHxcbiAgICAgICAgKGFjdHVhbFZhbHVlW2ldID09PSAnLycgJiYgZXhwZWN0ZWRWYWx1ZVtpXSA9PT0gJ18nKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vLyBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLXVwZ3JhZGUtaW5zZWN1cmUtcmVxdWVzdHMvI3VwZ3JhZGUtcmVxdWVzdFxuZnVuY3Rpb24gdHJ5VXBncmFkZVJlcXVlc3RUb0FQb3RlbnRpYWxseVRydXN0d29ydGh5VVJMIChyZXF1ZXN0KSB7XG4gIC8vIFRPRE9cbn1cblxuLyoqXG4gKiBAbGluayB7aHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvb3JpZ2luLmh0bWwjc2FtZS1vcmlnaW59XG4gKiBAcGFyYW0ge1VSTH0gQVxuICogQHBhcmFtIHtVUkx9IEJcbiAqL1xuZnVuY3Rpb24gc2FtZU9yaWdpbiAoQSwgQikge1xuICAvLyAxLiBJZiBBIGFuZCBCIGFyZSB0aGUgc2FtZSBvcGFxdWUgb3JpZ2luLCB0aGVuIHJldHVybiB0cnVlLlxuICBpZiAoQS5vcmlnaW4gPT09IEIub3JpZ2luICYmIEEub3JpZ2luID09PSAnbnVsbCcpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gMi4gSWYgQSBhbmQgQiBhcmUgYm90aCB0dXBsZSBvcmlnaW5zIGFuZCB0aGVpciBzY2hlbWVzLFxuICAvLyAgICBob3N0cywgYW5kIHBvcnQgYXJlIGlkZW50aWNhbCwgdGhlbiByZXR1cm4gdHJ1ZS5cbiAgaWYgKEEucHJvdG9jb2wgPT09IEIucHJvdG9jb2wgJiYgQS5ob3N0bmFtZSA9PT0gQi5ob3N0bmFtZSAmJiBBLnBvcnQgPT09IEIucG9ydCkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvLyAzLiBSZXR1cm4gZmFsc2UuXG4gIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBjcmVhdGVEZWZlcnJlZFByb21pc2UgKCkge1xuICBsZXQgcmVzXG4gIGxldCByZWpcbiAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICByZXMgPSByZXNvbHZlXG4gICAgcmVqID0gcmVqZWN0XG4gIH0pXG5cbiAgcmV0dXJuIHsgcHJvbWlzZSwgcmVzb2x2ZTogcmVzLCByZWplY3Q6IHJlaiB9XG59XG5cbmZ1bmN0aW9uIGlzQWJvcnRlZCAoZmV0Y2hQYXJhbXMpIHtcbiAgcmV0dXJuIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuc3RhdGUgPT09ICdhYm9ydGVkJ1xufVxuXG5mdW5jdGlvbiBpc0NhbmNlbGxlZCAoZmV0Y2hQYXJhbXMpIHtcbiAgcmV0dXJuIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuc3RhdGUgPT09ICdhYm9ydGVkJyB8fFxuICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuc3RhdGUgPT09ICd0ZXJtaW5hdGVkJ1xufVxuXG5jb25zdCBub3JtYWxpemVNZXRob2RSZWNvcmQgPSB7XG4gIGRlbGV0ZTogJ0RFTEVURScsXG4gIERFTEVURTogJ0RFTEVURScsXG4gIGdldDogJ0dFVCcsXG4gIEdFVDogJ0dFVCcsXG4gIGhlYWQ6ICdIRUFEJyxcbiAgSEVBRDogJ0hFQUQnLFxuICBvcHRpb25zOiAnT1BUSU9OUycsXG4gIE9QVElPTlM6ICdPUFRJT05TJyxcbiAgcG9zdDogJ1BPU1QnLFxuICBQT1NUOiAnUE9TVCcsXG4gIHB1dDogJ1BVVCcsXG4gIFBVVDogJ1BVVCdcbn1cblxuLy8gTm90ZTogb2JqZWN0IHByb3RvdHlwZXMgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGJlIHJlZmVyZW5jZWQuIGUuZy4gYE9iamVjdCNoYXNPd25Qcm9wZXJ0eWAuXG5PYmplY3Quc2V0UHJvdG90eXBlT2Yobm9ybWFsaXplTWV0aG9kUmVjb3JkLCBudWxsKVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtbWV0aG9kLW5vcm1hbGl6ZVxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZFxuICovXG5mdW5jdGlvbiBub3JtYWxpemVNZXRob2QgKG1ldGhvZCkge1xuICByZXR1cm4gbm9ybWFsaXplTWV0aG9kUmVjb3JkW21ldGhvZC50b0xvd2VyQ2FzZSgpXSA/PyBtZXRob2Rcbn1cblxuLy8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI3NlcmlhbGl6ZS1hLWphdmFzY3JpcHQtdmFsdWUtdG8tYS1qc29uLXN0cmluZ1xuZnVuY3Rpb24gc2VyaWFsaXplSmF2YXNjcmlwdFZhbHVlVG9KU09OU3RyaW5nICh2YWx1ZSkge1xuICAvLyAxLiBMZXQgcmVzdWx0IGJlID8gQ2FsbCglSlNPTi5zdHJpbmdpZnklLCB1bmRlZmluZWQsIMKrIHZhbHVlIMK7KS5cbiAgY29uc3QgcmVzdWx0ID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG5cbiAgLy8gMi4gSWYgcmVzdWx0IGlzIHVuZGVmaW5lZCwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVmFsdWUgaXMgbm90IEpTT04gc2VyaWFsaXphYmxlJylcbiAgfVxuXG4gIC8vIDMuIEFzc2VydDogcmVzdWx0IGlzIGEgc3RyaW5nLlxuICBhc3NlcnQodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycpXG5cbiAgLy8gNC4gUmV0dXJuIHJlc3VsdC5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSUyNWl0ZXJhdG9ycHJvdG90eXBlJTI1LW9iamVjdFxuY29uc3QgZXNJdGVyYXRvclByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihPYmplY3QuZ2V0UHJvdG90eXBlT2YoW11bU3ltYm9sLml0ZXJhdG9yXSgpKSlcblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jZGZuLWl0ZXJhdG9yLXByb3RvdHlwZS1vYmplY3RcbiAqIEBwYXJhbSB7KCkgPT4gdW5rbm93bltdfSBpdGVyYXRvclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgbmFtZSBvZiB0aGUgaW5zdGFuY2VcbiAqIEBwYXJhbSB7J2tleSd8J3ZhbHVlJ3wna2V5K3ZhbHVlJ30ga2luZFxuICovXG5mdW5jdGlvbiBtYWtlSXRlcmF0b3IgKGl0ZXJhdG9yLCBuYW1lLCBraW5kKSB7XG4gIGNvbnN0IG9iamVjdCA9IHtcbiAgICBpbmRleDogMCxcbiAgICBraW5kLFxuICAgIHRhcmdldDogaXRlcmF0b3JcbiAgfVxuXG4gIGNvbnN0IGkgPSB7XG4gICAgbmV4dCAoKSB7XG4gICAgICAvLyAxLiBMZXQgaW50ZXJmYWNlIGJlIHRoZSBpbnRlcmZhY2UgZm9yIHdoaWNoIHRoZSBpdGVyYXRvciBwcm90b3R5cGUgb2JqZWN0IGV4aXN0cy5cblxuICAgICAgLy8gMi4gTGV0IHRoaXNWYWx1ZSBiZSB0aGUgdGhpcyB2YWx1ZS5cblxuICAgICAgLy8gMy4gTGV0IG9iamVjdCBiZSA/IFRvT2JqZWN0KHRoaXNWYWx1ZSkuXG5cbiAgICAgIC8vIDQuIElmIG9iamVjdCBpcyBhIHBsYXRmb3JtIG9iamVjdCwgdGhlbiBwZXJmb3JtIGEgc2VjdXJpdHlcbiAgICAgIC8vICAgIGNoZWNrLCBwYXNzaW5nOlxuXG4gICAgICAvLyA1LiBJZiBvYmplY3QgaXMgbm90IGEgZGVmYXVsdCBpdGVyYXRvciBvYmplY3QgZm9yIGludGVyZmFjZSxcbiAgICAgIC8vICAgIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpICE9PSBpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgYCduZXh0JyBjYWxsZWQgb24gYW4gb2JqZWN0IHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IGludGVyZmFjZSAke25hbWV9IEl0ZXJhdG9yLmBcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyA2LiBMZXQgaW5kZXggYmUgb2JqZWN04oCZcyBpbmRleC5cbiAgICAgIC8vIDcuIExldCBraW5kIGJlIG9iamVjdOKAmXMga2luZC5cbiAgICAgIC8vIDguIExldCB2YWx1ZXMgYmUgb2JqZWN04oCZcyB0YXJnZXQncyB2YWx1ZSBwYWlycyB0byBpdGVyYXRlIG92ZXIuXG4gICAgICBjb25zdCB7IGluZGV4LCBraW5kLCB0YXJnZXQgfSA9IG9iamVjdFxuICAgICAgY29uc3QgdmFsdWVzID0gdGFyZ2V0KClcblxuICAgICAgLy8gOS4gTGV0IGxlbiBiZSB0aGUgbGVuZ3RoIG9mIHZhbHVlcy5cbiAgICAgIGNvbnN0IGxlbiA9IHZhbHVlcy5sZW5ndGhcblxuICAgICAgLy8gMTAuIElmIGluZGV4IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBsZW4sIHRoZW4gcmV0dXJuXG4gICAgICAvLyAgICAgQ3JlYXRlSXRlclJlc3VsdE9iamVjdCh1bmRlZmluZWQsIHRydWUpLlxuICAgICAgaWYgKGluZGV4ID49IGxlbikge1xuICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH1cbiAgICAgIH1cblxuICAgICAgLy8gMTEuIExldCBwYWlyIGJlIHRoZSBlbnRyeSBpbiB2YWx1ZXMgYXQgaW5kZXggaW5kZXguXG4gICAgICBjb25zdCBwYWlyID0gdmFsdWVzW2luZGV4XVxuXG4gICAgICAvLyAxMi4gU2V0IG9iamVjdOKAmXMgaW5kZXggdG8gaW5kZXggKyAxLlxuICAgICAgb2JqZWN0LmluZGV4ID0gaW5kZXggKyAxXG5cbiAgICAgIC8vIDEzLiBSZXR1cm4gdGhlIGl0ZXJhdG9yIHJlc3VsdCBmb3IgcGFpciBhbmQga2luZC5cbiAgICAgIHJldHVybiBpdGVyYXRvclJlc3VsdChwYWlyLCBraW5kKVxuICAgIH0sXG4gICAgLy8gVGhlIGNsYXNzIHN0cmluZyBvZiBhbiBpdGVyYXRvciBwcm90b3R5cGUgb2JqZWN0IGZvciBhIGdpdmVuIGludGVyZmFjZSBpcyB0aGVcbiAgICAvLyByZXN1bHQgb2YgY29uY2F0ZW5hdGluZyB0aGUgaWRlbnRpZmllciBvZiB0aGUgaW50ZXJmYWNlIGFuZCB0aGUgc3RyaW5nIFwiIEl0ZXJhdG9yXCIuXG4gICAgW1N5bWJvbC50b1N0cmluZ1RhZ106IGAke25hbWV9IEl0ZXJhdG9yYFxuICB9XG5cbiAgLy8gVGhlIFtbUHJvdG90eXBlXV0gaW50ZXJuYWwgc2xvdCBvZiBhbiBpdGVyYXRvciBwcm90b3R5cGUgb2JqZWN0IG11c3QgYmUgJUl0ZXJhdG9yUHJvdG90eXBlJS5cbiAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGksIGVzSXRlcmF0b3JQcm90b3R5cGUpXG4gIC8vIGVzSXRlcmF0b3JQcm90b3R5cGUgbmVlZHMgdG8gYmUgdGhlIHByb3RvdHlwZSBvZiBpXG4gIC8vIHdoaWNoIGlzIHRoZSBwcm90b3R5cGUgb2YgYW4gZW1wdHkgb2JqZWN0LiBZZXMsIGl0J3MgY29uZnVzaW5nLlxuICByZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKHt9LCBpKVxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2l0ZXJhdG9yLXJlc3VsdFxuZnVuY3Rpb24gaXRlcmF0b3JSZXN1bHQgKHBhaXIsIGtpbmQpIHtcbiAgbGV0IHJlc3VsdFxuXG4gIC8vIDEuIExldCByZXN1bHQgYmUgYSB2YWx1ZSBkZXRlcm1pbmVkIGJ5IHRoZSB2YWx1ZSBvZiBraW5kOlxuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlICdrZXknOiB7XG4gICAgICAvLyAxLiBMZXQgaWRsS2V5IGJlIHBhaXLigJlzIGtleS5cbiAgICAgIC8vIDIuIExldCBrZXkgYmUgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIGlkbEtleSB0byBhblxuICAgICAgLy8gICAgRUNNQVNjcmlwdCB2YWx1ZS5cbiAgICAgIC8vIDMuIHJlc3VsdCBpcyBrZXkuXG4gICAgICByZXN1bHQgPSBwYWlyWzBdXG4gICAgICBicmVha1xuICAgIH1cbiAgICBjYXNlICd2YWx1ZSc6IHtcbiAgICAgIC8vIDEuIExldCBpZGxWYWx1ZSBiZSBwYWly4oCZcyB2YWx1ZS5cbiAgICAgIC8vIDIuIExldCB2YWx1ZSBiZSB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgaWRsVmFsdWUgdG9cbiAgICAgIC8vICAgIGFuIEVDTUFTY3JpcHQgdmFsdWUuXG4gICAgICAvLyAzLiByZXN1bHQgaXMgdmFsdWUuXG4gICAgICByZXN1bHQgPSBwYWlyWzFdXG4gICAgICBicmVha1xuICAgIH1cbiAgICBjYXNlICdrZXkrdmFsdWUnOiB7XG4gICAgICAvLyAxLiBMZXQgaWRsS2V5IGJlIHBhaXLigJlzIGtleS5cbiAgICAgIC8vIDIuIExldCBpZGxWYWx1ZSBiZSBwYWly4oCZcyB2YWx1ZS5cbiAgICAgIC8vIDMuIExldCBrZXkgYmUgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIGlkbEtleSB0byBhblxuICAgICAgLy8gICAgRUNNQVNjcmlwdCB2YWx1ZS5cbiAgICAgIC8vIDQuIExldCB2YWx1ZSBiZSB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgaWRsVmFsdWUgdG9cbiAgICAgIC8vICAgIGFuIEVDTUFTY3JpcHQgdmFsdWUuXG4gICAgICAvLyA1LiBMZXQgYXJyYXkgYmUgISBBcnJheUNyZWF0ZSgyKS5cbiAgICAgIC8vIDYuIENhbGwgISBDcmVhdGVEYXRhUHJvcGVydHkoYXJyYXksIFwiMFwiLCBrZXkpLlxuICAgICAgLy8gNy4gQ2FsbCAhIENyZWF0ZURhdGFQcm9wZXJ0eShhcnJheSwgXCIxXCIsIHZhbHVlKS5cbiAgICAgIC8vIDguIHJlc3VsdCBpcyBhcnJheS5cbiAgICAgIHJlc3VsdCA9IHBhaXJcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgLy8gMi4gUmV0dXJuIENyZWF0ZUl0ZXJSZXN1bHRPYmplY3QocmVzdWx0LCBmYWxzZSkuXG4gIHJldHVybiB7IHZhbHVlOiByZXN1bHQsIGRvbmU6IGZhbHNlIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNib2R5LWZ1bGx5LXJlYWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZnVsbHlSZWFkQm9keSAoYm9keSwgcHJvY2Vzc0JvZHksIHByb2Nlc3NCb2R5RXJyb3IpIHtcbiAgLy8gMS4gSWYgdGFza0Rlc3RpbmF0aW9uIGlzIG51bGwsIHRoZW4gc2V0IHRhc2tEZXN0aW5hdGlvbiB0b1xuICAvLyAgICB0aGUgcmVzdWx0IG9mIHN0YXJ0aW5nIGEgbmV3IHBhcmFsbGVsIHF1ZXVlLlxuXG4gIC8vIDIuIExldCBzdWNjZXNzU3RlcHMgZ2l2ZW4gYSBieXRlIHNlcXVlbmNlIGJ5dGVzIGJlIHRvIHF1ZXVlIGFcbiAgLy8gICAgZmV0Y2ggdGFzayB0byBydW4gcHJvY2Vzc0JvZHkgZ2l2ZW4gYnl0ZXMsIHdpdGggdGFza0Rlc3RpbmF0aW9uLlxuICBjb25zdCBzdWNjZXNzU3RlcHMgPSBwcm9jZXNzQm9keVxuXG4gIC8vIDMuIExldCBlcnJvclN0ZXBzIGJlIHRvIHF1ZXVlIGEgZmV0Y2ggdGFzayB0byBydW4gcHJvY2Vzc0JvZHlFcnJvcixcbiAgLy8gICAgd2l0aCB0YXNrRGVzdGluYXRpb24uXG4gIGNvbnN0IGVycm9yU3RlcHMgPSBwcm9jZXNzQm9keUVycm9yXG5cbiAgLy8gNC4gTGV0IHJlYWRlciBiZSB0aGUgcmVzdWx0IG9mIGdldHRpbmcgYSByZWFkZXIgZm9yIGJvZHnigJlzIHN0cmVhbS5cbiAgLy8gICAgSWYgdGhhdCB0aHJldyBhbiBleGNlcHRpb24sIHRoZW4gcnVuIGVycm9yU3RlcHMgd2l0aCB0aGF0XG4gIC8vICAgIGV4Y2VwdGlvbiBhbmQgcmV0dXJuLlxuICBsZXQgcmVhZGVyXG5cbiAgdHJ5IHtcbiAgICByZWFkZXIgPSBib2R5LnN0cmVhbS5nZXRSZWFkZXIoKVxuICB9IGNhdGNoIChlKSB7XG4gICAgZXJyb3JTdGVwcyhlKVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gNS4gUmVhZCBhbGwgYnl0ZXMgZnJvbSByZWFkZXIsIGdpdmVuIHN1Y2Nlc3NTdGVwcyBhbmQgZXJyb3JTdGVwcy5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkQWxsQnl0ZXMocmVhZGVyKVxuICAgIHN1Y2Nlc3NTdGVwcyhyZXN1bHQpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBlcnJvclN0ZXBzKGUpXG4gIH1cbn1cblxuLyoqIEB0eXBlIHtSZWFkYWJsZVN0cmVhbX0gKi9cbmxldCBSZWFkYWJsZVN0cmVhbSA9IGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW1cblxuZnVuY3Rpb24gaXNSZWFkYWJsZVN0cmVhbUxpa2UgKHN0cmVhbSkge1xuICBpZiAoIVJlYWRhYmxlU3RyZWFtKSB7XG4gICAgUmVhZGFibGVTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0vd2ViJykuUmVhZGFibGVTdHJlYW1cbiAgfVxuXG4gIHJldHVybiBzdHJlYW0gaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbSB8fCAoXG4gICAgc3RyZWFtW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdSZWFkYWJsZVN0cmVhbScgJiZcbiAgICB0eXBlb2Ygc3RyZWFtLnRlZSA9PT0gJ2Z1bmN0aW9uJ1xuICApXG59XG5cbmNvbnN0IE1BWElNVU1fQVJHVU1FTlRfTEVOR1RIID0gNjU1MzVcblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNpc29tb3JwaGljLWRlY29kZVxuICogQHBhcmFtIHtudW1iZXJbXXxVaW50OEFycmF5fSBpbnB1dFxuICovXG5mdW5jdGlvbiBpc29tb3JwaGljRGVjb2RlIChpbnB1dCkge1xuICAvLyAxLiBUbyBpc29tb3JwaGljIGRlY29kZSBhIGJ5dGUgc2VxdWVuY2UgaW5wdXQsIHJldHVybiBhIHN0cmluZyB3aG9zZSBjb2RlIHBvaW50XG4gIC8vICAgIGxlbmd0aCBpcyBlcXVhbCB0byBpbnB1dOKAmXMgbGVuZ3RoIGFuZCB3aG9zZSBjb2RlIHBvaW50cyBoYXZlIHRoZSBzYW1lIHZhbHVlc1xuICAvLyAgICBhcyB0aGUgdmFsdWVzIG9mIGlucHV04oCZcyBieXRlcywgaW4gdGhlIHNhbWUgb3JkZXIuXG5cbiAgaWYgKGlucHV0Lmxlbmd0aCA8IE1BWElNVU1fQVJHVU1FTlRfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uaW5wdXQpXG4gIH1cblxuICByZXR1cm4gaW5wdXQucmVkdWNlKChwcmV2aW91cywgY3VycmVudCkgPT4gcHJldmlvdXMgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGN1cnJlbnQpLCAnJylcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcjxVaW50OEFycmF5Pn0gY29udHJvbGxlclxuICovXG5mdW5jdGlvbiByZWFkYWJsZVN0cmVhbUNsb3NlIChjb250cm9sbGVyKSB7XG4gIHRyeSB7XG4gICAgY29udHJvbGxlci5jbG9zZSgpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIFRPRE86IGFkZCBjb21tZW50IGV4cGxhaW5pbmcgd2h5IHRoaXMgZXJyb3Igb2NjdXJzLlxuICAgIGlmICghZXJyLm1lc3NhZ2UuaW5jbHVkZXMoJ0NvbnRyb2xsZXIgaXMgYWxyZWFkeSBjbG9zZWQnKSkge1xuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jaXNvbW9ycGhpYy1lbmNvZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dFxuICovXG5mdW5jdGlvbiBpc29tb3JwaGljRW5jb2RlIChpbnB1dCkge1xuICAvLyAxLiBBc3NlcnQ6IGlucHV0IGNvbnRhaW5zIG5vIGNvZGUgcG9pbnRzIGdyZWF0ZXIgdGhhbiBVKzAwRkYuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICBhc3NlcnQoaW5wdXQuY2hhckNvZGVBdChpKSA8PSAweEZGKVxuICB9XG5cbiAgLy8gMi4gUmV0dXJuIGEgYnl0ZSBzZXF1ZW5jZSB3aG9zZSBsZW5ndGggaXMgZXF1YWwgdG8gaW5wdXTigJlzIGNvZGVcbiAgLy8gICAgcG9pbnQgbGVuZ3RoIGFuZCB3aG9zZSBieXRlcyBoYXZlIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGVcbiAgLy8gICAgdmFsdWVzIG9mIGlucHV04oCZcyBjb2RlIHBvaW50cywgaW4gdGhlIHNhbWUgb3JkZXJcbiAgcmV0dXJuIGlucHV0XG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3N0cmVhbXMuc3BlYy53aGF0d2cub3JnLyNyZWFkYWJsZXN0cmVhbWRlZmF1bHRyZWFkZXItcmVhZC1hbGwtYnl0ZXNcbiAqIEBzZWUgaHR0cHM6Ly9zdHJlYW1zLnNwZWMud2hhdHdnLm9yZy8jcmVhZC1sb29wXG4gKiBAcGFyYW0ge1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcn0gcmVhZGVyXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRBbGxCeXRlcyAocmVhZGVyKSB7XG4gIGNvbnN0IGJ5dGVzID0gW11cbiAgbGV0IGJ5dGVMZW5ndGggPSAwXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCB7IGRvbmUsIHZhbHVlOiBjaHVuayB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKVxuXG4gICAgaWYgKGRvbmUpIHtcbiAgICAgIC8vIDEuIENhbGwgc3VjY2Vzc1N0ZXBzIHdpdGggYnl0ZXMuXG4gICAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChieXRlcywgYnl0ZUxlbmd0aClcbiAgICB9XG5cbiAgICAvLyAxLiBJZiBjaHVuayBpcyBub3QgYSBVaW50OEFycmF5IG9iamVjdCwgY2FsbCBmYWlsdXJlU3RlcHNcbiAgICAvLyAgICB3aXRoIGEgVHlwZUVycm9yIGFuZCBhYm9ydCB0aGVzZSBzdGVwcy5cbiAgICBpZiAoIWlzVWludDhBcnJheShjaHVuaykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlY2VpdmVkIG5vbi1VaW50OEFycmF5IGNodW5rJylcbiAgICB9XG5cbiAgICAvLyAyLiBBcHBlbmQgdGhlIGJ5dGVzIHJlcHJlc2VudGVkIGJ5IGNodW5rIHRvIGJ5dGVzLlxuICAgIGJ5dGVzLnB1c2goY2h1bmspXG4gICAgYnl0ZUxlbmd0aCArPSBjaHVuay5sZW5ndGhcblxuICAgIC8vIDMuIFJlYWQtbG9vcCBnaXZlbiByZWFkZXIsIGJ5dGVzLCBzdWNjZXNzU3RlcHMsIGFuZCBmYWlsdXJlU3RlcHMuXG4gIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNpcy1sb2NhbFxuICogQHBhcmFtIHtVUkx9IHVybFxuICovXG5mdW5jdGlvbiB1cmxJc0xvY2FsICh1cmwpIHtcbiAgYXNzZXJ0KCdwcm90b2NvbCcgaW4gdXJsKSAvLyBlbnN1cmUgaXQncyBhIHVybCBvYmplY3RcblxuICBjb25zdCBwcm90b2NvbCA9IHVybC5wcm90b2NvbFxuXG4gIHJldHVybiBwcm90b2NvbCA9PT0gJ2Fib3V0OicgfHwgcHJvdG9jb2wgPT09ICdibG9iOicgfHwgcHJvdG9jb2wgPT09ICdkYXRhOidcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ3xVUkx9IHVybFxuICovXG5mdW5jdGlvbiB1cmxIYXNIdHRwc1NjaGVtZSAodXJsKSB7XG4gIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB1cmwuc3RhcnRzV2l0aCgnaHR0cHM6JylcbiAgfVxuXG4gIHJldHVybiB1cmwucHJvdG9jb2wgPT09ICdodHRwczonXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaHR0cC1zY2hlbWVcbiAqIEBwYXJhbSB7VVJMfSB1cmxcbiAqL1xuZnVuY3Rpb24gdXJsSXNIdHRwSHR0cHNTY2hlbWUgKHVybCkge1xuICBhc3NlcnQoJ3Byb3RvY29sJyBpbiB1cmwpIC8vIGVuc3VyZSBpdCdzIGEgdXJsIG9iamVjdFxuXG4gIGNvbnN0IHByb3RvY29sID0gdXJsLnByb3RvY29sXG5cbiAgcmV0dXJuIHByb3RvY29sID09PSAnaHR0cDonIHx8IHByb3RvY29sID09PSAnaHR0cHM6J1xufVxuXG4vKipcbiAqIEZldGNoIHN1cHBvcnRzIG5vZGUgPj0gMTYuOC4wLCBidXQgT2JqZWN0Lmhhc093biB3YXMgYWRkZWQgaW4gdjE2LjkuMC5cbiAqL1xuY29uc3QgaGFzT3duID0gT2JqZWN0Lmhhc093biB8fCAoKGRpY3QsIGtleSkgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRpY3QsIGtleSkpXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc0Fib3J0ZWQsXG4gIGlzQ2FuY2VsbGVkLFxuICBjcmVhdGVEZWZlcnJlZFByb21pc2UsXG4gIFJlYWRhYmxlU3RyZWFtRnJvbSxcbiAgdG9VU1ZTdHJpbmcsXG4gIHRyeVVwZ3JhZGVSZXF1ZXN0VG9BUG90ZW50aWFsbHlUcnVzdHdvcnRoeVVSTCxcbiAgY29hcnNlbmVkU2hhcmVkQ3VycmVudFRpbWUsXG4gIGRldGVybWluZVJlcXVlc3RzUmVmZXJyZXIsXG4gIG1ha2VQb2xpY3lDb250YWluZXIsXG4gIGNsb25lUG9saWN5Q29udGFpbmVyLFxuICBhcHBlbmRGZXRjaE1ldGFkYXRhLFxuICBhcHBlbmRSZXF1ZXN0T3JpZ2luSGVhZGVyLFxuICBUQU9DaGVjayxcbiAgY29yc0NoZWNrLFxuICBjcm9zc09yaWdpblJlc291cmNlUG9saWN5Q2hlY2ssXG4gIGNyZWF0ZU9wYXF1ZVRpbWluZ0luZm8sXG4gIHNldFJlcXVlc3RSZWZlcnJlclBvbGljeU9uUmVkaXJlY3QsXG4gIGlzVmFsaWRIVFRQVG9rZW4sXG4gIHJlcXVlc3RCYWRQb3J0LFxuICByZXF1ZXN0Q3VycmVudFVSTCxcbiAgcmVzcG9uc2VVUkwsXG4gIHJlc3BvbnNlTG9jYXRpb25VUkwsXG4gIGlzQmxvYkxpa2UsXG4gIGlzVVJMUG90ZW50aWFsbHlUcnVzdHdvcnRoeSxcbiAgaXNWYWxpZFJlYXNvblBocmFzZSxcbiAgc2FtZU9yaWdpbixcbiAgbm9ybWFsaXplTWV0aG9kLFxuICBzZXJpYWxpemVKYXZhc2NyaXB0VmFsdWVUb0pTT05TdHJpbmcsXG4gIG1ha2VJdGVyYXRvcixcbiAgaXNWYWxpZEhlYWRlck5hbWUsXG4gIGlzVmFsaWRIZWFkZXJWYWx1ZSxcbiAgaGFzT3duLFxuICBpc0Vycm9yTGlrZSxcbiAgZnVsbHlSZWFkQm9keSxcbiAgYnl0ZXNNYXRjaCxcbiAgaXNSZWFkYWJsZVN0cmVhbUxpa2UsXG4gIHJlYWRhYmxlU3RyZWFtQ2xvc2UsXG4gIGlzb21vcnBoaWNFbmNvZGUsXG4gIGlzb21vcnBoaWNEZWNvZGUsXG4gIHVybElzTG9jYWwsXG4gIHVybEhhc0h0dHBzU2NoZW1lLFxuICB1cmxJc0h0dHBIdHRwc1NjaGVtZSxcbiAgcmVhZEFsbEJ5dGVzLFxuICBub3JtYWxpemVNZXRob2RSZWNvcmQsXG4gIHBhcnNlTWV0YWRhdGFcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAga1VybDogU3ltYm9sKCd1cmwnKSxcbiAga0hlYWRlcnM6IFN5bWJvbCgnaGVhZGVycycpLFxuICBrU2lnbmFsOiBTeW1ib2woJ3NpZ25hbCcpLFxuICBrU3RhdGU6IFN5bWJvbCgnc3RhdGUnKSxcbiAga0d1YXJkOiBTeW1ib2woJ2d1YXJkJyksXG4gIGtSZWFsbTogU3ltYm9sKCdyZWFsbScpXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyB0eXBlcyB9ID0gcmVxdWlyZSgndXRpbCcpXG5jb25zdCB7IGhhc093biwgdG9VU1ZTdHJpbmcgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuLi8uLi90eXBlcy93ZWJpZGwnKS5XZWJpZGx9ICovXG5jb25zdCB3ZWJpZGwgPSB7fVxud2ViaWRsLmNvbnZlcnRlcnMgPSB7fVxud2ViaWRsLnV0aWwgPSB7fVxud2ViaWRsLmVycm9ycyA9IHt9XG5cbndlYmlkbC5lcnJvcnMuZXhjZXB0aW9uID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoYCR7bWVzc2FnZS5oZWFkZXJ9OiAke21lc3NhZ2UubWVzc2FnZX1gKVxufVxuXG53ZWJpZGwuZXJyb3JzLmNvbnZlcnNpb25GYWlsZWQgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICBjb25zdCBwbHVyYWwgPSBjb250ZXh0LnR5cGVzLmxlbmd0aCA9PT0gMSA/ICcnIDogJyBvbmUgb2YnXG4gIGNvbnN0IG1lc3NhZ2UgPVxuICAgIGAke2NvbnRleHQuYXJndW1lbnR9IGNvdWxkIG5vdCBiZSBjb252ZXJ0ZWQgdG9gICtcbiAgICBgJHtwbHVyYWx9OiAke2NvbnRleHQudHlwZXMuam9pbignLCAnKX0uYFxuXG4gIHJldHVybiB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgaGVhZGVyOiBjb250ZXh0LnByZWZpeCxcbiAgICBtZXNzYWdlXG4gIH0pXG59XG5cbndlYmlkbC5lcnJvcnMuaW52YWxpZEFyZ3VtZW50ID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgcmV0dXJuIHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICBoZWFkZXI6IGNvbnRleHQucHJlZml4LFxuICAgIG1lc3NhZ2U6IGBcIiR7Y29udGV4dC52YWx1ZX1cIiBpcyBhbiBpbnZhbGlkICR7Y29udGV4dC50eXBlfS5gXG4gIH0pXG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jaW1wbGVtZW50c1xud2ViaWRsLmJyYW5kQ2hlY2sgPSBmdW5jdGlvbiAoViwgSSwgb3B0cyA9IHVuZGVmaW5lZCkge1xuICBpZiAob3B0cz8uc3RyaWN0ICE9PSBmYWxzZSAmJiAhKFYgaW5zdGFuY2VvZiBJKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgaW52b2NhdGlvbicpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFY/LltTeW1ib2wudG9TdHJpbmdUYWddID09PSBJLnByb3RvdHlwZVtTeW1ib2wudG9TdHJpbmdUYWddXG4gIH1cbn1cblxud2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2sgPSBmdW5jdGlvbiAoeyBsZW5ndGggfSwgbWluLCBjdHgpIHtcbiAgaWYgKGxlbmd0aCA8IG1pbikge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgIG1lc3NhZ2U6IGAke21pbn0gYXJndW1lbnQke21pbiAhPT0gMSA/ICdzJyA6ICcnfSByZXF1aXJlZCwgYCArXG4gICAgICAgICAgICAgICBgYnV0JHtsZW5ndGggPyAnIG9ubHknIDogJyd9ICR7bGVuZ3RofSBmb3VuZC5gLFxuICAgICAgLi4uY3R4XG4gICAgfSlcbiAgfVxufVxuXG53ZWJpZGwuaWxsZWdhbENvbnN0cnVjdG9yID0gZnVuY3Rpb24gKCkge1xuICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgaGVhZGVyOiAnVHlwZUVycm9yJyxcbiAgICBtZXNzYWdlOiAnSWxsZWdhbCBjb25zdHJ1Y3RvcidcbiAgfSlcbn1cblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWRhdGEtdHlwZXMtYW5kLXZhbHVlc1xud2ViaWRsLnV0aWwuVHlwZSA9IGZ1bmN0aW9uIChWKSB7XG4gIHN3aXRjaCAodHlwZW9mIFYpIHtcbiAgICBjYXNlICd1bmRlZmluZWQnOiByZXR1cm4gJ1VuZGVmaW5lZCdcbiAgICBjYXNlICdib29sZWFuJzogcmV0dXJuICdCb29sZWFuJ1xuICAgIGNhc2UgJ3N0cmluZyc6IHJldHVybiAnU3RyaW5nJ1xuICAgIGNhc2UgJ3N5bWJvbCc6IHJldHVybiAnU3ltYm9sJ1xuICAgIGNhc2UgJ251bWJlcic6IHJldHVybiAnTnVtYmVyJ1xuICAgIGNhc2UgJ2JpZ2ludCc6IHJldHVybiAnQmlnSW50J1xuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICBjYXNlICdvYmplY3QnOiB7XG4gICAgICBpZiAoViA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gJ051bGwnXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnT2JqZWN0J1xuICAgIH1cbiAgfVxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2Fic3RyYWN0LW9wZGVmLWNvbnZlcnR0b2ludFxud2ViaWRsLnV0aWwuQ29udmVydFRvSW50ID0gZnVuY3Rpb24gKFYsIGJpdExlbmd0aCwgc2lnbmVkbmVzcywgb3B0cyA9IHt9KSB7XG4gIGxldCB1cHBlckJvdW5kXG4gIGxldCBsb3dlckJvdW5kXG5cbiAgLy8gMS4gSWYgYml0TGVuZ3RoIGlzIDY0LCB0aGVuOlxuICBpZiAoYml0TGVuZ3RoID09PSA2NCkge1xuICAgIC8vIDEuIExldCB1cHBlckJvdW5kIGJlIDJeNTMg4oiSIDEuXG4gICAgdXBwZXJCb3VuZCA9IE1hdGgucG93KDIsIDUzKSAtIDFcblxuICAgIC8vIDIuIElmIHNpZ25lZG5lc3MgaXMgXCJ1bnNpZ25lZFwiLCB0aGVuIGxldCBsb3dlckJvdW5kIGJlIDAuXG4gICAgaWYgKHNpZ25lZG5lc3MgPT09ICd1bnNpZ25lZCcpIHtcbiAgICAgIGxvd2VyQm91bmQgPSAwXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDMuIE90aGVyd2lzZSBsZXQgbG93ZXJCb3VuZCBiZSDiiJIyXjUzICsgMS5cbiAgICAgIGxvd2VyQm91bmQgPSBNYXRoLnBvdygtMiwgNTMpICsgMVxuICAgIH1cbiAgfSBlbHNlIGlmIChzaWduZWRuZXNzID09PSAndW5zaWduZWQnKSB7XG4gICAgLy8gMi4gT3RoZXJ3aXNlLCBpZiBzaWduZWRuZXNzIGlzIFwidW5zaWduZWRcIiwgdGhlbjpcblxuICAgIC8vIDEuIExldCBsb3dlckJvdW5kIGJlIDAuXG4gICAgbG93ZXJCb3VuZCA9IDBcblxuICAgIC8vIDIuIExldCB1cHBlckJvdW5kIGJlIDJeYml0TGVuZ3RoIOKIkiAxLlxuICAgIHVwcGVyQm91bmQgPSBNYXRoLnBvdygyLCBiaXRMZW5ndGgpIC0gMVxuICB9IGVsc2Uge1xuICAgIC8vIDMuIE90aGVyd2lzZTpcblxuICAgIC8vIDEuIExldCBsb3dlckJvdW5kIGJlIC0yXmJpdExlbmd0aCDiiJIgMS5cbiAgICBsb3dlckJvdW5kID0gTWF0aC5wb3coLTIsIGJpdExlbmd0aCkgLSAxXG5cbiAgICAvLyAyLiBMZXQgdXBwZXJCb3VuZCBiZSAyXmJpdExlbmd0aCDiiJIgMSDiiJIgMS5cbiAgICB1cHBlckJvdW5kID0gTWF0aC5wb3coMiwgYml0TGVuZ3RoIC0gMSkgLSAxXG4gIH1cblxuICAvLyA0LiBMZXQgeCBiZSA/IFRvTnVtYmVyKFYpLlxuICBsZXQgeCA9IE51bWJlcihWKVxuXG4gIC8vIDUuIElmIHggaXMg4oiSMCwgdGhlbiBzZXQgeCB0byArMC5cbiAgaWYgKHggPT09IDApIHtcbiAgICB4ID0gMFxuICB9XG5cbiAgLy8gNi4gSWYgdGhlIGNvbnZlcnNpb24gaXMgdG8gYW4gSURMIHR5cGUgYXNzb2NpYXRlZFxuICAvLyAgICB3aXRoIHRoZSBbRW5mb3JjZVJhbmdlXSBleHRlbmRlZCBhdHRyaWJ1dGUsIHRoZW46XG4gIGlmIChvcHRzLmVuZm9yY2VSYW5nZSA9PT0gdHJ1ZSkge1xuICAgIC8vIDEuIElmIHggaXMgTmFOLCAr4oieLCBvciDiiJLiiJ4sIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKFxuICAgICAgTnVtYmVyLmlzTmFOKHgpIHx8XG4gICAgICB4ID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgfHxcbiAgICAgIHggPT09IE51bWJlci5ORUdBVElWRV9JTkZJTklUWVxuICAgICkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6ICdJbnRlZ2VyIGNvbnZlcnNpb24nLFxuICAgICAgICBtZXNzYWdlOiBgQ291bGQgbm90IGNvbnZlcnQgJHtWfSB0byBhbiBpbnRlZ2VyLmBcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gMi4gU2V0IHggdG8gSW50ZWdlclBhcnQoeCkuXG4gICAgeCA9IHdlYmlkbC51dGlsLkludGVnZXJQYXJ0KHgpXG5cbiAgICAvLyAzLiBJZiB4IDwgbG93ZXJCb3VuZCBvciB4ID4gdXBwZXJCb3VuZCwgdGhlblxuICAgIC8vICAgIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmICh4IDwgbG93ZXJCb3VuZCB8fCB4ID4gdXBwZXJCb3VuZCkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6ICdJbnRlZ2VyIGNvbnZlcnNpb24nLFxuICAgICAgICBtZXNzYWdlOiBgVmFsdWUgbXVzdCBiZSBiZXR3ZWVuICR7bG93ZXJCb3VuZH0tJHt1cHBlckJvdW5kfSwgZ290ICR7eH0uYFxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyA0LiBSZXR1cm4geC5cbiAgICByZXR1cm4geFxuICB9XG5cbiAgLy8gNy4gSWYgeCBpcyBub3QgTmFOIGFuZCB0aGUgY29udmVyc2lvbiBpcyB0byBhbiBJRExcbiAgLy8gICAgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIFtDbGFtcF0gZXh0ZW5kZWRcbiAgLy8gICAgYXR0cmlidXRlLCB0aGVuOlxuICBpZiAoIU51bWJlci5pc05hTih4KSAmJiBvcHRzLmNsYW1wID09PSB0cnVlKSB7XG4gICAgLy8gMS4gU2V0IHggdG8gbWluKG1heCh4LCBsb3dlckJvdW5kKSwgdXBwZXJCb3VuZCkuXG4gICAgeCA9IE1hdGgubWluKE1hdGgubWF4KHgsIGxvd2VyQm91bmQpLCB1cHBlckJvdW5kKVxuXG4gICAgLy8gMi4gUm91bmQgeCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLCBjaG9vc2luZyB0aGVcbiAgICAvLyAgICBldmVuIGludGVnZXIgaWYgaXQgbGllcyBoYWxmd2F5IGJldHdlZW4gdHdvLFxuICAgIC8vICAgIGFuZCBjaG9vc2luZyArMCByYXRoZXIgdGhhbiDiiJIwLlxuICAgIGlmIChNYXRoLmZsb29yKHgpICUgMiA9PT0gMCkge1xuICAgICAgeCA9IE1hdGguZmxvb3IoeClcbiAgICB9IGVsc2Uge1xuICAgICAgeCA9IE1hdGguY2VpbCh4KVxuICAgIH1cblxuICAgIC8vIDMuIFJldHVybiB4LlxuICAgIHJldHVybiB4XG4gIH1cblxuICAvLyA4LiBJZiB4IGlzIE5hTiwgKzAsICviiJ4sIG9yIOKIkuKIniwgdGhlbiByZXR1cm4gKzAuXG4gIGlmIChcbiAgICBOdW1iZXIuaXNOYU4oeCkgfHxcbiAgICAoeCA9PT0gMCAmJiBPYmplY3QuaXMoMCwgeCkpIHx8XG4gICAgeCA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIHx8XG4gICAgeCA9PT0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZXG4gICkge1xuICAgIHJldHVybiAwXG4gIH1cblxuICAvLyA5LiBTZXQgeCB0byBJbnRlZ2VyUGFydCh4KS5cbiAgeCA9IHdlYmlkbC51dGlsLkludGVnZXJQYXJ0KHgpXG5cbiAgLy8gMTAuIFNldCB4IHRvIHggbW9kdWxvIDJeYml0TGVuZ3RoLlxuICB4ID0geCAlIE1hdGgucG93KDIsIGJpdExlbmd0aClcblxuICAvLyAxMS4gSWYgc2lnbmVkbmVzcyBpcyBcInNpZ25lZFwiIGFuZCB4IOKJpSAyXmJpdExlbmd0aCDiiJIgMSxcbiAgLy8gICAgdGhlbiByZXR1cm4geCDiiJIgMl5iaXRMZW5ndGguXG4gIGlmIChzaWduZWRuZXNzID09PSAnc2lnbmVkJyAmJiB4ID49IE1hdGgucG93KDIsIGJpdExlbmd0aCkgLSAxKSB7XG4gICAgcmV0dXJuIHggLSBNYXRoLnBvdygyLCBiaXRMZW5ndGgpXG4gIH1cblxuICAvLyAxMi4gT3RoZXJ3aXNlLCByZXR1cm4geC5cbiAgcmV0dXJuIHhcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNhYnN0cmFjdC1vcGRlZi1pbnRlZ2VycGFydFxud2ViaWRsLnV0aWwuSW50ZWdlclBhcnQgPSBmdW5jdGlvbiAobikge1xuICAvLyAxLiBMZXQgciBiZSBmbG9vcihhYnMobikpLlxuICBjb25zdCByID0gTWF0aC5mbG9vcihNYXRoLmFicyhuKSlcblxuICAvLyAyLiBJZiBuIDwgMCwgdGhlbiByZXR1cm4gLTEgw5cgci5cbiAgaWYgKG4gPCAwKSB7XG4gICAgcmV0dXJuIC0xICogclxuICB9XG5cbiAgLy8gMy4gT3RoZXJ3aXNlLCByZXR1cm4gci5cbiAgcmV0dXJuIHJcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNlcy1zZXF1ZW5jZVxud2ViaWRsLnNlcXVlbmNlQ29udmVydGVyID0gZnVuY3Rpb24gKGNvbnZlcnRlcikge1xuICByZXR1cm4gKFYpID0+IHtcbiAgICAvLyAxLiBJZiBUeXBlKFYpIGlzIG5vdCBPYmplY3QsIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmICh3ZWJpZGwudXRpbC5UeXBlKFYpICE9PSAnT2JqZWN0Jykge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6ICdTZXF1ZW5jZScsXG4gICAgICAgIG1lc3NhZ2U6IGBWYWx1ZSBvZiB0eXBlICR7d2ViaWRsLnV0aWwuVHlwZShWKX0gaXMgbm90IGFuIE9iamVjdC5gXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDIuIExldCBtZXRob2QgYmUgPyBHZXRNZXRob2QoViwgQEBpdGVyYXRvcikuXG4gICAgLyoqIEB0eXBlIHtHZW5lcmF0b3J9ICovXG4gICAgY29uc3QgbWV0aG9kID0gVj8uW1N5bWJvbC5pdGVyYXRvcl0/LigpXG4gICAgY29uc3Qgc2VxID0gW11cblxuICAgIC8vIDMuIElmIG1ldGhvZCBpcyB1bmRlZmluZWQsIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmIChcbiAgICAgIG1ldGhvZCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0eXBlb2YgbWV0aG9kLm5leHQgIT09ICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgaGVhZGVyOiAnU2VxdWVuY2UnLFxuICAgICAgICBtZXNzYWdlOiAnT2JqZWN0IGlzIG5vdCBhbiBpdGVyYXRvci4nXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jY3JlYXRlLXNlcXVlbmNlLWZyb20taXRlcmFibGVcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gbWV0aG9kLm5leHQoKVxuXG4gICAgICBpZiAoZG9uZSkge1xuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBzZXEucHVzaChjb252ZXJ0ZXIodmFsdWUpKVxuICAgIH1cblxuICAgIHJldHVybiBzZXFcbiAgfVxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2VzLXRvLXJlY29yZFxud2ViaWRsLnJlY29yZENvbnZlcnRlciA9IGZ1bmN0aW9uIChrZXlDb252ZXJ0ZXIsIHZhbHVlQ29udmVydGVyKSB7XG4gIHJldHVybiAoTykgPT4ge1xuICAgIC8vIDEuIElmIFR5cGUoTykgaXMgbm90IE9iamVjdCwgdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKHdlYmlkbC51dGlsLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgIGhlYWRlcjogJ1JlY29yZCcsXG4gICAgICAgIG1lc3NhZ2U6IGBWYWx1ZSBvZiB0eXBlICR7d2ViaWRsLnV0aWwuVHlwZShPKX0gaXMgbm90IGFuIE9iamVjdC5gXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDIuIExldCByZXN1bHQgYmUgYSBuZXcgZW1wdHkgaW5zdGFuY2Ugb2YgcmVjb3JkPEssIFY+LlxuICAgIGNvbnN0IHJlc3VsdCA9IHt9XG5cbiAgICBpZiAoIXR5cGVzLmlzUHJveHkoTykpIHtcbiAgICAgIC8vIE9iamVjdC5rZXlzIG9ubHkgcmV0dXJucyBlbnVtZXJhYmxlIHByb3BlcnRpZXNcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhPKVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIC8vIDEuIExldCB0eXBlZEtleSBiZSBrZXkgY29udmVydGVkIHRvIGFuIElETCB2YWx1ZSBvZiB0eXBlIEsuXG4gICAgICAgIGNvbnN0IHR5cGVkS2V5ID0ga2V5Q29udmVydGVyKGtleSlcblxuICAgICAgICAvLyAyLiBMZXQgdmFsdWUgYmUgPyBHZXQoTywga2V5KS5cbiAgICAgICAgLy8gMy4gTGV0IHR5cGVkVmFsdWUgYmUgdmFsdWUgY29udmVydGVkIHRvIGFuIElETCB2YWx1ZSBvZiB0eXBlIFYuXG4gICAgICAgIGNvbnN0IHR5cGVkVmFsdWUgPSB2YWx1ZUNvbnZlcnRlcihPW2tleV0pXG5cbiAgICAgICAgLy8gNC4gU2V0IHJlc3VsdFt0eXBlZEtleV0gdG8gdHlwZWRWYWx1ZS5cbiAgICAgICAgcmVzdWx0W3R5cGVkS2V5XSA9IHR5cGVkVmFsdWVcbiAgICAgIH1cblxuICAgICAgLy8gNS4gUmV0dXJuIHJlc3VsdC5cbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICAvLyAzLiBMZXQga2V5cyBiZSA/IE8uW1tPd25Qcm9wZXJ0eUtleXNdXSgpLlxuICAgIGNvbnN0IGtleXMgPSBSZWZsZWN0Lm93bktleXMoTylcblxuICAgIC8vIDQuIEZvciBlYWNoIGtleSBvZiBrZXlzLlxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIC8vIDEuIExldCBkZXNjIGJlID8gTy5bW0dldE93blByb3BlcnR5XV0oa2V5KS5cbiAgICAgIGNvbnN0IGRlc2MgPSBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBrZXkpXG5cbiAgICAgIC8vIDIuIElmIGRlc2MgaXMgbm90IHVuZGVmaW5lZCBhbmQgZGVzYy5bW0VudW1lcmFibGVdXSBpcyB0cnVlOlxuICAgICAgaWYgKGRlc2M/LmVudW1lcmFibGUpIHtcbiAgICAgICAgLy8gMS4gTGV0IHR5cGVkS2V5IGJlIGtleSBjb252ZXJ0ZWQgdG8gYW4gSURMIHZhbHVlIG9mIHR5cGUgSy5cbiAgICAgICAgY29uc3QgdHlwZWRLZXkgPSBrZXlDb252ZXJ0ZXIoa2V5KVxuXG4gICAgICAgIC8vIDIuIExldCB2YWx1ZSBiZSA/IEdldChPLCBrZXkpLlxuICAgICAgICAvLyAzLiBMZXQgdHlwZWRWYWx1ZSBiZSB2YWx1ZSBjb252ZXJ0ZWQgdG8gYW4gSURMIHZhbHVlIG9mIHR5cGUgVi5cbiAgICAgICAgY29uc3QgdHlwZWRWYWx1ZSA9IHZhbHVlQ29udmVydGVyKE9ba2V5XSlcblxuICAgICAgICAvLyA0LiBTZXQgcmVzdWx0W3R5cGVkS2V5XSB0byB0eXBlZFZhbHVlLlxuICAgICAgICByZXN1bHRbdHlwZWRLZXldID0gdHlwZWRWYWx1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDUuIFJldHVybiByZXN1bHQuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG59XG5cbndlYmlkbC5pbnRlcmZhY2VDb252ZXJ0ZXIgPSBmdW5jdGlvbiAoaSkge1xuICByZXR1cm4gKFYsIG9wdHMgPSB7fSkgPT4ge1xuICAgIGlmIChvcHRzLnN0cmljdCAhPT0gZmFsc2UgJiYgIShWIGluc3RhbmNlb2YgaSkpIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgaGVhZGVyOiBpLm5hbWUsXG4gICAgICAgIG1lc3NhZ2U6IGBFeHBlY3RlZCAke1Z9IHRvIGJlIGFuIGluc3RhbmNlIG9mICR7aS5uYW1lfS5gXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBWXG4gIH1cbn1cblxud2ViaWRsLmRpY3Rpb25hcnlDb252ZXJ0ZXIgPSBmdW5jdGlvbiAoY29udmVydGVycykge1xuICByZXR1cm4gKGRpY3Rpb25hcnkpID0+IHtcbiAgICBjb25zdCB0eXBlID0gd2ViaWRsLnV0aWwuVHlwZShkaWN0aW9uYXJ5KVxuICAgIGNvbnN0IGRpY3QgPSB7fVxuXG4gICAgaWYgKHR5cGUgPT09ICdOdWxsJyB8fCB0eXBlID09PSAnVW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGRpY3RcbiAgICB9IGVsc2UgaWYgKHR5cGUgIT09ICdPYmplY3QnKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgIGhlYWRlcjogJ0RpY3Rpb25hcnknLFxuICAgICAgICBtZXNzYWdlOiBgRXhwZWN0ZWQgJHtkaWN0aW9uYXJ5fSB0byBiZSBvbmUgb2Y6IE51bGwsIFVuZGVmaW5lZCwgT2JqZWN0LmBcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBvcHRpb25zIG9mIGNvbnZlcnRlcnMpIHtcbiAgICAgIGNvbnN0IHsga2V5LCBkZWZhdWx0VmFsdWUsIHJlcXVpcmVkLCBjb252ZXJ0ZXIgfSA9IG9wdGlvbnNcblxuICAgICAgaWYgKHJlcXVpcmVkID09PSB0cnVlKSB7XG4gICAgICAgIGlmICghaGFzT3duKGRpY3Rpb25hcnksIGtleSkpIHtcbiAgICAgICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgICBoZWFkZXI6ICdEaWN0aW9uYXJ5JyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBNaXNzaW5nIHJlcXVpcmVkIGtleSBcIiR7a2V5fVwiLmBcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCB2YWx1ZSA9IGRpY3Rpb25hcnlba2V5XVxuICAgICAgY29uc3QgaGFzRGVmYXVsdCA9IGhhc093bihvcHRpb25zLCAnZGVmYXVsdFZhbHVlJylcblxuICAgICAgLy8gT25seSB1c2UgZGVmYXVsdFZhbHVlIGlmIHZhbHVlIGlzIHVuZGVmaW5lZCBhbmRcbiAgICAgIC8vIGEgZGVmYXVsdFZhbHVlIG9wdGlvbnMgd2FzIHByb3ZpZGVkLlxuICAgICAgaWYgKGhhc0RlZmF1bHQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZSA/PyBkZWZhdWx0VmFsdWVcbiAgICAgIH1cblxuICAgICAgLy8gQSBrZXkgY2FuIGJlIG9wdGlvbmFsIGFuZCBoYXZlIG5vIGRlZmF1bHQgdmFsdWUuXG4gICAgICAvLyBXaGVuIHRoaXMgaGFwcGVucywgZG8gbm90IHBlcmZvcm0gYSBjb252ZXJzaW9uLFxuICAgICAgLy8gYW5kIGRvIG5vdCBhc3NpZ24gdGhlIGtleSBhIHZhbHVlLlxuICAgICAgaWYgKHJlcXVpcmVkIHx8IGhhc0RlZmF1bHQgfHwgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZSA9IGNvbnZlcnRlcih2YWx1ZSlcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgb3B0aW9ucy5hbGxvd2VkVmFsdWVzICYmXG4gICAgICAgICAgIW9wdGlvbnMuYWxsb3dlZFZhbHVlcy5pbmNsdWRlcyh2YWx1ZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICAgICAgaGVhZGVyOiAnRGljdGlvbmFyeScsXG4gICAgICAgICAgICBtZXNzYWdlOiBgJHt2YWx1ZX0gaXMgbm90IGFuIGFjY2VwdGVkIHR5cGUuIEV4cGVjdGVkIG9uZSBvZiAke29wdGlvbnMuYWxsb3dlZFZhbHVlcy5qb2luKCcsICcpfS5gXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGRpY3Rba2V5XSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpY3RcbiAgfVxufVxuXG53ZWJpZGwubnVsbGFibGVDb252ZXJ0ZXIgPSBmdW5jdGlvbiAoY29udmVydGVyKSB7XG4gIHJldHVybiAoVikgPT4ge1xuICAgIGlmIChWID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gVlxuICAgIH1cblxuICAgIHJldHVybiBjb252ZXJ0ZXIoVilcbiAgfVxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2VzLURPTVN0cmluZ1xud2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nID0gZnVuY3Rpb24gKFYsIG9wdHMgPSB7fSkge1xuICAvLyAxLiBJZiBWIGlzIG51bGwgYW5kIHRoZSBjb252ZXJzaW9uIGlzIHRvIGFuIElETCB0eXBlXG4gIC8vICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgW0xlZ2FjeU51bGxUb0VtcHR5U3RyaW5nXVxuICAvLyAgICBleHRlbmRlZCBhdHRyaWJ1dGUsIHRoZW4gcmV0dXJuIHRoZSBET01TdHJpbmcgdmFsdWVcbiAgLy8gICAgdGhhdCByZXByZXNlbnRzIHRoZSBlbXB0eSBzdHJpbmcuXG4gIGlmIChWID09PSBudWxsICYmIG9wdHMubGVnYWN5TnVsbFRvRW1wdHlTdHJpbmcpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIDIuIExldCB4IGJlID8gVG9TdHJpbmcoVikuXG4gIGlmICh0eXBlb2YgViA9PT0gJ3N5bWJvbCcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb3VsZCBub3QgY29udmVydCBhcmd1bWVudCBvZiB0eXBlIHN5bWJvbCB0byBzdHJpbmcuJylcbiAgfVxuXG4gIC8vIDMuIFJldHVybiB0aGUgSURMIERPTVN0cmluZyB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlXG4gIC8vICAgIHNhbWUgc2VxdWVuY2Ugb2YgY29kZSB1bml0cyBhcyB0aGUgb25lIHRoZVxuICAvLyAgICBFQ01BU2NyaXB0IFN0cmluZyB2YWx1ZSB4IHJlcHJlc2VudHMuXG4gIHJldHVybiBTdHJpbmcoVilcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNlcy1CeXRlU3RyaW5nXG53ZWJpZGwuY29udmVydGVycy5CeXRlU3RyaW5nID0gZnVuY3Rpb24gKFYpIHtcbiAgLy8gMS4gTGV0IHggYmUgPyBUb1N0cmluZyhWKS5cbiAgLy8gTm90ZTogRE9NU3RyaW5nIGNvbnZlcnRlciBwZXJmb3JtID8gVG9TdHJpbmcoVilcbiAgY29uc3QgeCA9IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyhWKVxuXG4gIC8vIDIuIElmIHRoZSB2YWx1ZSBvZiBhbnkgZWxlbWVudCBvZiB4IGlzIGdyZWF0ZXIgdGhhblxuICAvLyAgICAyNTUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB4Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGlmICh4LmNoYXJDb2RlQXQoaW5kZXgpID4gMjU1KSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnQ2Fubm90IGNvbnZlcnQgYXJndW1lbnQgdG8gYSBCeXRlU3RyaW5nIGJlY2F1c2UgdGhlIGNoYXJhY3RlciBhdCAnICtcbiAgICAgICAgYGluZGV4ICR7aW5kZXh9IGhhcyBhIHZhbHVlIG9mICR7eC5jaGFyQ29kZUF0KGluZGV4KX0gd2hpY2ggaXMgZ3JlYXRlciB0aGFuIDI1NS5gXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgLy8gMy4gUmV0dXJuIGFuIElETCBCeXRlU3RyaW5nIHZhbHVlIHdob3NlIGxlbmd0aCBpcyB0aGVcbiAgLy8gICAgbGVuZ3RoIG9mIHgsIGFuZCB3aGVyZSB0aGUgdmFsdWUgb2YgZWFjaCBlbGVtZW50IGlzXG4gIC8vICAgIHRoZSB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIHguXG4gIHJldHVybiB4XG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jZXMtVVNWU3RyaW5nXG53ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcgPSB0b1VTVlN0cmluZ1xuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2VzLWJvb2xlYW5cbndlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4gPSBmdW5jdGlvbiAoVikge1xuICAvLyAxLiBMZXQgeCBiZSB0aGUgcmVzdWx0IG9mIGNvbXB1dGluZyBUb0Jvb2xlYW4oVikuXG4gIGNvbnN0IHggPSBCb29sZWFuKFYpXG5cbiAgLy8gMi4gUmV0dXJuIHRoZSBJREwgYm9vbGVhbiB2YWx1ZSB0aGF0IGlzIHRoZSBvbmUgdGhhdCByZXByZXNlbnRzXG4gIC8vICAgIHRoZSBzYW1lIHRydXRoIHZhbHVlIGFzIHRoZSBFQ01BU2NyaXB0IEJvb2xlYW4gdmFsdWUgeC5cbiAgcmV0dXJuIHhcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNlcy1hbnlcbndlYmlkbC5jb252ZXJ0ZXJzLmFueSA9IGZ1bmN0aW9uIChWKSB7XG4gIHJldHVybiBWXG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jZXMtbG9uZy1sb25nXG53ZWJpZGwuY29udmVydGVyc1snbG9uZyBsb25nJ10gPSBmdW5jdGlvbiAoVikge1xuICAvLyAxLiBMZXQgeCBiZSA/IENvbnZlcnRUb0ludChWLCA2NCwgXCJzaWduZWRcIikuXG4gIGNvbnN0IHggPSB3ZWJpZGwudXRpbC5Db252ZXJ0VG9JbnQoViwgNjQsICdzaWduZWQnKVxuXG4gIC8vIDIuIFJldHVybiB0aGUgSURMIGxvbmcgbG9uZyB2YWx1ZSB0aGF0IHJlcHJlc2VudHNcbiAgLy8gICAgdGhlIHNhbWUgbnVtZXJpYyB2YWx1ZSBhcyB4LlxuICByZXR1cm4geFxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2VzLXVuc2lnbmVkLWxvbmctbG9uZ1xud2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIGxvbmcgbG9uZyddID0gZnVuY3Rpb24gKFYpIHtcbiAgLy8gMS4gTGV0IHggYmUgPyBDb252ZXJ0VG9JbnQoViwgNjQsIFwidW5zaWduZWRcIikuXG4gIGNvbnN0IHggPSB3ZWJpZGwudXRpbC5Db252ZXJ0VG9JbnQoViwgNjQsICd1bnNpZ25lZCcpXG5cbiAgLy8gMi4gUmV0dXJuIHRoZSBJREwgdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlIHRoYXRcbiAgLy8gICAgcmVwcmVzZW50cyB0aGUgc2FtZSBudW1lcmljIHZhbHVlIGFzIHguXG4gIHJldHVybiB4XG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jZXMtdW5zaWduZWQtbG9uZ1xud2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIGxvbmcnXSA9IGZ1bmN0aW9uIChWKSB7XG4gIC8vIDEuIExldCB4IGJlID8gQ29udmVydFRvSW50KFYsIDMyLCBcInVuc2lnbmVkXCIpLlxuICBjb25zdCB4ID0gd2ViaWRsLnV0aWwuQ29udmVydFRvSW50KFYsIDMyLCAndW5zaWduZWQnKVxuXG4gIC8vIDIuIFJldHVybiB0aGUgSURMIHVuc2lnbmVkIGxvbmcgdmFsdWUgdGhhdFxuICAvLyAgICByZXByZXNlbnRzIHRoZSBzYW1lIG51bWVyaWMgdmFsdWUgYXMgeC5cbiAgcmV0dXJuIHhcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNlcy11bnNpZ25lZC1zaG9ydFxud2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIHNob3J0J10gPSBmdW5jdGlvbiAoViwgb3B0cykge1xuICAvLyAxLiBMZXQgeCBiZSA/IENvbnZlcnRUb0ludChWLCAxNiwgXCJ1bnNpZ25lZFwiKS5cbiAgY29uc3QgeCA9IHdlYmlkbC51dGlsLkNvbnZlcnRUb0ludChWLCAxNiwgJ3Vuc2lnbmVkJywgb3B0cylcblxuICAvLyAyLiBSZXR1cm4gdGhlIElETCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSB0aGF0IHJlcHJlc2VudHNcbiAgLy8gICAgdGhlIHNhbWUgbnVtZXJpYyB2YWx1ZSBhcyB4LlxuICByZXR1cm4geFxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2lkbC1BcnJheUJ1ZmZlclxud2ViaWRsLmNvbnZlcnRlcnMuQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiAoViwgb3B0cyA9IHt9KSB7XG4gIC8vIDEuIElmIFR5cGUoVikgaXMgbm90IE9iamVjdCwgb3IgViBkb2VzIG5vdCBoYXZlIGFuXG4gIC8vICAgIFtbQXJyYXlCdWZmZXJEYXRhXV0gaW50ZXJuYWwgc2xvdCwgdGhlbiB0aHJvdyBhXG4gIC8vICAgIFR5cGVFcnJvci5cbiAgLy8gc2VlOiBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb3BlcnRpZXMtb2YtdGhlLWFycmF5YnVmZmVyLWluc3RhbmNlc1xuICAvLyBzZWU6IGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvcGVydGllcy1vZi10aGUtc2hhcmVkYXJyYXlidWZmZXItaW5zdGFuY2VzXG4gIGlmIChcbiAgICB3ZWJpZGwudXRpbC5UeXBlKFYpICE9PSAnT2JqZWN0JyB8fFxuICAgICF0eXBlcy5pc0FueUFycmF5QnVmZmVyKFYpXG4gICkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuY29udmVyc2lvbkZhaWxlZCh7XG4gICAgICBwcmVmaXg6IGAke1Z9YCxcbiAgICAgIGFyZ3VtZW50OiBgJHtWfWAsXG4gICAgICB0eXBlczogWydBcnJheUJ1ZmZlciddXG4gICAgfSlcbiAgfVxuXG4gIC8vIDIuIElmIHRoZSBjb252ZXJzaW9uIGlzIG5vdCB0byBhbiBJREwgdHlwZSBhc3NvY2lhdGVkXG4gIC8vICAgIHdpdGggdGhlIFtBbGxvd1NoYXJlZF0gZXh0ZW5kZWQgYXR0cmlidXRlLCBhbmRcbiAgLy8gICAgSXNTaGFyZWRBcnJheUJ1ZmZlcihWKSBpcyB0cnVlLCB0aGVuIHRocm93IGFcbiAgLy8gICAgVHlwZUVycm9yLlxuICBpZiAob3B0cy5hbGxvd1NoYXJlZCA9PT0gZmFsc2UgJiYgdHlwZXMuaXNTaGFyZWRBcnJheUJ1ZmZlcihWKSkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgIGhlYWRlcjogJ0FycmF5QnVmZmVyJyxcbiAgICAgIG1lc3NhZ2U6ICdTaGFyZWRBcnJheUJ1ZmZlciBpcyBub3QgYWxsb3dlZC4nXG4gICAgfSlcbiAgfVxuXG4gIC8vIDMuIElmIHRoZSBjb252ZXJzaW9uIGlzIG5vdCB0byBhbiBJREwgdHlwZSBhc3NvY2lhdGVkXG4gIC8vICAgIHdpdGggdGhlIFtBbGxvd1Jlc2l6YWJsZV0gZXh0ZW5kZWQgYXR0cmlidXRlLCBhbmRcbiAgLy8gICAgSXNSZXNpemFibGVBcnJheUJ1ZmZlcihWKSBpcyB0cnVlLCB0aGVuIHRocm93IGFcbiAgLy8gICAgVHlwZUVycm9yLlxuICAvLyBOb3RlOiByZXNpemFibGUgQXJyYXlCdWZmZXJzIGFyZSBjdXJyZW50bHkgYSBwcm9wb3NhbC5cblxuICAvLyA0LiBSZXR1cm4gdGhlIElETCBBcnJheUJ1ZmZlciB2YWx1ZSB0aGF0IGlzIGFcbiAgLy8gICAgcmVmZXJlbmNlIHRvIHRoZSBzYW1lIG9iamVjdCBhcyBWLlxuICByZXR1cm4gVlxufVxuXG53ZWJpZGwuY29udmVydGVycy5UeXBlZEFycmF5ID0gZnVuY3Rpb24gKFYsIFQsIG9wdHMgPSB7fSkge1xuICAvLyAxLiBMZXQgVCBiZSB0aGUgSURMIHR5cGUgViBpcyBiZWluZyBjb252ZXJ0ZWQgdG8uXG5cbiAgLy8gMi4gSWYgVHlwZShWKSBpcyBub3QgT2JqZWN0LCBvciBWIGRvZXMgbm90IGhhdmUgYVxuICAvLyAgICBbW1R5cGVkQXJyYXlOYW1lXV0gaW50ZXJuYWwgc2xvdCB3aXRoIGEgdmFsdWVcbiAgLy8gICAgZXF1YWwgdG8gVOKAmXMgbmFtZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgaWYgKFxuICAgIHdlYmlkbC51dGlsLlR5cGUoVikgIT09ICdPYmplY3QnIHx8XG4gICAgIXR5cGVzLmlzVHlwZWRBcnJheShWKSB8fFxuICAgIFYuY29uc3RydWN0b3IubmFtZSAhPT0gVC5uYW1lXG4gICkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuY29udmVyc2lvbkZhaWxlZCh7XG4gICAgICBwcmVmaXg6IGAke1QubmFtZX1gLFxuICAgICAgYXJndW1lbnQ6IGAke1Z9YCxcbiAgICAgIHR5cGVzOiBbVC5uYW1lXVxuICAgIH0pXG4gIH1cblxuICAvLyAzLiBJZiB0aGUgY29udmVyc2lvbiBpcyBub3QgdG8gYW4gSURMIHR5cGUgYXNzb2NpYXRlZFxuICAvLyAgICB3aXRoIHRoZSBbQWxsb3dTaGFyZWRdIGV4dGVuZGVkIGF0dHJpYnV0ZSwgYW5kXG4gIC8vICAgIElzU2hhcmVkQXJyYXlCdWZmZXIoVi5bW1ZpZXdlZEFycmF5QnVmZmVyXV0pIGlzXG4gIC8vICAgIHRydWUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gIGlmIChvcHRzLmFsbG93U2hhcmVkID09PSBmYWxzZSAmJiB0eXBlcy5pc1NoYXJlZEFycmF5QnVmZmVyKFYuYnVmZmVyKSkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgIGhlYWRlcjogJ0FycmF5QnVmZmVyJyxcbiAgICAgIG1lc3NhZ2U6ICdTaGFyZWRBcnJheUJ1ZmZlciBpcyBub3QgYWxsb3dlZC4nXG4gICAgfSlcbiAgfVxuXG4gIC8vIDQuIElmIHRoZSBjb252ZXJzaW9uIGlzIG5vdCB0byBhbiBJREwgdHlwZSBhc3NvY2lhdGVkXG4gIC8vICAgIHdpdGggdGhlIFtBbGxvd1Jlc2l6YWJsZV0gZXh0ZW5kZWQgYXR0cmlidXRlLCBhbmRcbiAgLy8gICAgSXNSZXNpemFibGVBcnJheUJ1ZmZlcihWLltbVmlld2VkQXJyYXlCdWZmZXJdXSkgaXNcbiAgLy8gICAgdHJ1ZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgLy8gTm90ZTogcmVzaXphYmxlIGFycmF5IGJ1ZmZlcnMgYXJlIGN1cnJlbnRseSBhIHByb3Bvc2FsXG5cbiAgLy8gNS4gUmV0dXJuIHRoZSBJREwgdmFsdWUgb2YgdHlwZSBUIHRoYXQgaXMgYSByZWZlcmVuY2VcbiAgLy8gICAgdG8gdGhlIHNhbWUgb2JqZWN0IGFzIFYuXG4gIHJldHVybiBWXG59XG5cbndlYmlkbC5jb252ZXJ0ZXJzLkRhdGFWaWV3ID0gZnVuY3Rpb24gKFYsIG9wdHMgPSB7fSkge1xuICAvLyAxLiBJZiBUeXBlKFYpIGlzIG5vdCBPYmplY3QsIG9yIFYgZG9lcyBub3QgaGF2ZSBhXG4gIC8vICAgIFtbRGF0YVZpZXddXSBpbnRlcm5hbCBzbG90LCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICBpZiAod2ViaWRsLnV0aWwuVHlwZShWKSAhPT0gJ09iamVjdCcgfHwgIXR5cGVzLmlzRGF0YVZpZXcoVikpIHtcbiAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICBoZWFkZXI6ICdEYXRhVmlldycsXG4gICAgICBtZXNzYWdlOiAnT2JqZWN0IGlzIG5vdCBhIERhdGFWaWV3LidcbiAgICB9KVxuICB9XG5cbiAgLy8gMi4gSWYgdGhlIGNvbnZlcnNpb24gaXMgbm90IHRvIGFuIElETCB0eXBlIGFzc29jaWF0ZWRcbiAgLy8gICAgd2l0aCB0aGUgW0FsbG93U2hhcmVkXSBleHRlbmRlZCBhdHRyaWJ1dGUsIGFuZFxuICAvLyAgICBJc1NoYXJlZEFycmF5QnVmZmVyKFYuW1tWaWV3ZWRBcnJheUJ1ZmZlcl1dKSBpcyB0cnVlLFxuICAvLyAgICB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICBpZiAob3B0cy5hbGxvd1NoYXJlZCA9PT0gZmFsc2UgJiYgdHlwZXMuaXNTaGFyZWRBcnJheUJ1ZmZlcihWLmJ1ZmZlcikpIHtcbiAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICBoZWFkZXI6ICdBcnJheUJ1ZmZlcicsXG4gICAgICBtZXNzYWdlOiAnU2hhcmVkQXJyYXlCdWZmZXIgaXMgbm90IGFsbG93ZWQuJ1xuICAgIH0pXG4gIH1cblxuICAvLyAzLiBJZiB0aGUgY29udmVyc2lvbiBpcyBub3QgdG8gYW4gSURMIHR5cGUgYXNzb2NpYXRlZFxuICAvLyAgICB3aXRoIHRoZSBbQWxsb3dSZXNpemFibGVdIGV4dGVuZGVkIGF0dHJpYnV0ZSwgYW5kXG4gIC8vICAgIElzUmVzaXphYmxlQXJyYXlCdWZmZXIoVi5bW1ZpZXdlZEFycmF5QnVmZmVyXV0pIGlzXG4gIC8vICAgIHRydWUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gIC8vIE5vdGU6IHJlc2l6YWJsZSBBcnJheUJ1ZmZlcnMgYXJlIGN1cnJlbnRseSBhIHByb3Bvc2FsXG5cbiAgLy8gNC4gUmV0dXJuIHRoZSBJREwgRGF0YVZpZXcgdmFsdWUgdGhhdCBpcyBhIHJlZmVyZW5jZVxuICAvLyAgICB0byB0aGUgc2FtZSBvYmplY3QgYXMgVi5cbiAgcmV0dXJuIFZcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNCdWZmZXJTb3VyY2VcbndlYmlkbC5jb252ZXJ0ZXJzLkJ1ZmZlclNvdXJjZSA9IGZ1bmN0aW9uIChWLCBvcHRzID0ge30pIHtcbiAgaWYgKHR5cGVzLmlzQW55QXJyYXlCdWZmZXIoVikpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuQXJyYXlCdWZmZXIoViwgb3B0cylcbiAgfVxuXG4gIGlmICh0eXBlcy5pc1R5cGVkQXJyYXkoVikpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuVHlwZWRBcnJheShWLCBWLmNvbnN0cnVjdG9yKVxuICB9XG5cbiAgaWYgKHR5cGVzLmlzRGF0YVZpZXcoVikpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuRGF0YVZpZXcoViwgb3B0cylcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoYENvdWxkIG5vdCBjb252ZXJ0ICR7Vn0gdG8gYSBCdWZmZXJTb3VyY2UuYClcbn1cblxud2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPEJ5dGVTdHJpbmc+J10gPSB3ZWJpZGwuc2VxdWVuY2VDb252ZXJ0ZXIoXG4gIHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmdcbilcblxud2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPHNlcXVlbmNlPEJ5dGVTdHJpbmc+PiddID0gd2ViaWRsLnNlcXVlbmNlQ29udmVydGVyKFxuICB3ZWJpZGwuY29udmVydGVyc1snc2VxdWVuY2U8Qnl0ZVN0cmluZz4nXVxuKVxuXG53ZWJpZGwuY29udmVydGVyc1sncmVjb3JkPEJ5dGVTdHJpbmcsIEJ5dGVTdHJpbmc+J10gPSB3ZWJpZGwucmVjb3JkQ29udmVydGVyKFxuICB3ZWJpZGwuY29udmVydGVycy5CeXRlU3RyaW5nLFxuICB3ZWJpZGwuY29udmVydGVycy5CeXRlU3RyaW5nXG4pXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB3ZWJpZGxcbn1cbiIsImNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5jb25zdCB7IGF0b2IgfSA9IHJlcXVpcmUoJ2J1ZmZlcicpXG5jb25zdCB7IGlzb21vcnBoaWNEZWNvZGUgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5cbmNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9taW1lc25pZmYuc3BlYy53aGF0d2cub3JnLyNodHRwLXRva2VuLWNvZGUtcG9pbnRcbiAqL1xuY29uc3QgSFRUUF9UT0tFTl9DT0RFUE9JTlRTID0gL15bISMkJSYnKistLl5ffH5BLVphLXowLTldKyQvXG5jb25zdCBIVFRQX1dISVRFU1BBQ0VfUkVHRVggPSAvKFxcdTAwMEF8XFx1MDAwRHxcXHUwMDA5fFxcdTAwMjApLyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9taW1lc25pZmYuc3BlYy53aGF0d2cub3JnLyNodHRwLXF1b3RlZC1zdHJpbmctdG9rZW4tY29kZS1wb2ludFxuICovXG5jb25zdCBIVFRQX1FVT1RFRF9TVFJJTkdfVE9LRU5TID0gL1tcXHUwMDA5fFxcdTAwMjAtXFx1MDA3RXxcXHUwMDgwLVxcdTAwRkZdLyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkYXRhLXVybC1wcm9jZXNzb3Jcbi8qKiBAcGFyYW0ge1VSTH0gZGF0YVVSTCAqL1xuZnVuY3Rpb24gZGF0YVVSTFByb2Nlc3NvciAoZGF0YVVSTCkge1xuICAvLyAxLiBBc3NlcnQ6IGRhdGFVUkzigJlzIHNjaGVtZSBpcyBcImRhdGFcIi5cbiAgYXNzZXJ0KGRhdGFVUkwucHJvdG9jb2wgPT09ICdkYXRhOicpXG5cbiAgLy8gMi4gTGV0IGlucHV0IGJlIHRoZSByZXN1bHQgb2YgcnVubmluZyB0aGUgVVJMXG4gIC8vIHNlcmlhbGl6ZXIgb24gZGF0YVVSTCB3aXRoIGV4Y2x1ZGUgZnJhZ21lbnRcbiAgLy8gc2V0IHRvIHRydWUuXG4gIGxldCBpbnB1dCA9IFVSTFNlcmlhbGl6ZXIoZGF0YVVSTCwgdHJ1ZSlcblxuICAvLyAzLiBSZW1vdmUgdGhlIGxlYWRpbmcgXCJkYXRhOlwiIHN0cmluZyBmcm9tIGlucHV0LlxuICBpbnB1dCA9IGlucHV0LnNsaWNlKDUpXG5cbiAgLy8gNC4gTGV0IHBvc2l0aW9uIHBvaW50IGF0IHRoZSBzdGFydCBvZiBpbnB1dC5cbiAgY29uc3QgcG9zaXRpb24gPSB7IHBvc2l0aW9uOiAwIH1cblxuICAvLyA1LiBMZXQgbWltZVR5cGUgYmUgdGhlIHJlc3VsdCBvZiBjb2xsZWN0aW5nIGFcbiAgLy8gc2VxdWVuY2Ugb2YgY29kZSBwb2ludHMgdGhhdCBhcmUgbm90IGVxdWFsXG4gIC8vIHRvIFUrMDAyQyAoLCksIGdpdmVuIHBvc2l0aW9uLlxuICBsZXQgbWltZVR5cGUgPSBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzRmFzdChcbiAgICAnLCcsXG4gICAgaW5wdXQsXG4gICAgcG9zaXRpb25cbiAgKVxuXG4gIC8vIDYuIFN0cmlwIGxlYWRpbmcgYW5kIHRyYWlsaW5nIEFTQ0lJIHdoaXRlc3BhY2VcbiAgLy8gZnJvbSBtaW1lVHlwZS5cbiAgLy8gVW5kaWNpIGltcGxlbWVudGF0aW9uIG5vdGU6IHdlIG5lZWQgdG8gc3RvcmUgdGhlXG4gIC8vIGxlbmd0aCBiZWNhdXNlIGlmIHRoZSBtaW1ldHlwZSBoYXMgc3BhY2VzIHJlbW92ZWQsXG4gIC8vIHRoZSB3cm9uZyBhbW91bnQgd2lsbCBiZSBzbGljZWQgZnJvbSB0aGUgaW5wdXQgaW5cbiAgLy8gc3RlcCAjOVxuICBjb25zdCBtaW1lVHlwZUxlbmd0aCA9IG1pbWVUeXBlLmxlbmd0aFxuICBtaW1lVHlwZSA9IHJlbW92ZUFTQ0lJV2hpdGVzcGFjZShtaW1lVHlwZSwgdHJ1ZSwgdHJ1ZSlcblxuICAvLyA3LiBJZiBwb3NpdGlvbiBpcyBwYXN0IHRoZSBlbmQgb2YgaW5wdXQsIHRoZW5cbiAgLy8gcmV0dXJuIGZhaWx1cmVcbiAgaWYgKHBvc2l0aW9uLnBvc2l0aW9uID49IGlucHV0Lmxlbmd0aCkge1xuICAgIHJldHVybiAnZmFpbHVyZSdcbiAgfVxuXG4gIC8vIDguIEFkdmFuY2UgcG9zaXRpb24gYnkgMS5cbiAgcG9zaXRpb24ucG9zaXRpb24rK1xuXG4gIC8vIDkuIExldCBlbmNvZGVkQm9keSBiZSB0aGUgcmVtYWluZGVyIG9mIGlucHV0LlxuICBjb25zdCBlbmNvZGVkQm9keSA9IGlucHV0LnNsaWNlKG1pbWVUeXBlTGVuZ3RoICsgMSlcblxuICAvLyAxMC4gTGV0IGJvZHkgYmUgdGhlIHBlcmNlbnQtZGVjb2Rpbmcgb2YgZW5jb2RlZEJvZHkuXG4gIGxldCBib2R5ID0gc3RyaW5nUGVyY2VudERlY29kZShlbmNvZGVkQm9keSlcblxuICAvLyAxMS4gSWYgbWltZVR5cGUgZW5kcyB3aXRoIFUrMDAzQiAoOyksIGZvbGxvd2VkIGJ5XG4gIC8vIHplcm8gb3IgbW9yZSBVKzAwMjAgU1BBQ0UsIGZvbGxvd2VkIGJ5IGFuIEFTQ0lJXG4gIC8vIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2ggZm9yIFwiYmFzZTY0XCIsIHRoZW46XG4gIGlmICgvOyhcXHUwMDIwKXswLH1iYXNlNjQkL2kudGVzdChtaW1lVHlwZSkpIHtcbiAgICAvLyAxLiBMZXQgc3RyaW5nQm9keSBiZSB0aGUgaXNvbW9ycGhpYyBkZWNvZGUgb2YgYm9keS5cbiAgICBjb25zdCBzdHJpbmdCb2R5ID0gaXNvbW9ycGhpY0RlY29kZShib2R5KVxuXG4gICAgLy8gMi4gU2V0IGJvZHkgdG8gdGhlIGZvcmdpdmluZy1iYXNlNjQgZGVjb2RlIG9mXG4gICAgLy8gc3RyaW5nQm9keS5cbiAgICBib2R5ID0gZm9yZ2l2aW5nQmFzZTY0KHN0cmluZ0JvZHkpXG5cbiAgICAvLyAzLiBJZiBib2R5IGlzIGZhaWx1cmUsIHRoZW4gcmV0dXJuIGZhaWx1cmUuXG4gICAgaWYgKGJvZHkgPT09ICdmYWlsdXJlJykge1xuICAgICAgcmV0dXJuICdmYWlsdXJlJ1xuICAgIH1cblxuICAgIC8vIDQuIFJlbW92ZSB0aGUgbGFzdCA2IGNvZGUgcG9pbnRzIGZyb20gbWltZVR5cGUuXG4gICAgbWltZVR5cGUgPSBtaW1lVHlwZS5zbGljZSgwLCAtNilcblxuICAgIC8vIDUuIFJlbW92ZSB0cmFpbGluZyBVKzAwMjAgU1BBQ0UgY29kZSBwb2ludHMgZnJvbSBtaW1lVHlwZSxcbiAgICAvLyBpZiBhbnkuXG4gICAgbWltZVR5cGUgPSBtaW1lVHlwZS5yZXBsYWNlKC8oXFx1MDAyMCkrJC8sICcnKVxuXG4gICAgLy8gNi4gUmVtb3ZlIHRoZSBsYXN0IFUrMDAzQiAoOykgY29kZSBwb2ludCBmcm9tIG1pbWVUeXBlLlxuICAgIG1pbWVUeXBlID0gbWltZVR5cGUuc2xpY2UoMCwgLTEpXG4gIH1cblxuICAvLyAxMi4gSWYgbWltZVR5cGUgc3RhcnRzIHdpdGggVSswMDNCICg7KSwgdGhlbiBwcmVwZW5kXG4gIC8vIFwidGV4dC9wbGFpblwiIHRvIG1pbWVUeXBlLlxuICBpZiAobWltZVR5cGUuc3RhcnRzV2l0aCgnOycpKSB7XG4gICAgbWltZVR5cGUgPSAndGV4dC9wbGFpbicgKyBtaW1lVHlwZVxuICB9XG5cbiAgLy8gMTMuIExldCBtaW1lVHlwZVJlY29yZCBiZSB0aGUgcmVzdWx0IG9mIHBhcnNpbmdcbiAgLy8gbWltZVR5cGUuXG4gIGxldCBtaW1lVHlwZVJlY29yZCA9IHBhcnNlTUlNRVR5cGUobWltZVR5cGUpXG5cbiAgLy8gMTQuIElmIG1pbWVUeXBlUmVjb3JkIGlzIGZhaWx1cmUsIHRoZW4gc2V0XG4gIC8vIG1pbWVUeXBlUmVjb3JkIHRvIHRleHQvcGxhaW47Y2hhcnNldD1VUy1BU0NJSS5cbiAgaWYgKG1pbWVUeXBlUmVjb3JkID09PSAnZmFpbHVyZScpIHtcbiAgICBtaW1lVHlwZVJlY29yZCA9IHBhcnNlTUlNRVR5cGUoJ3RleHQvcGxhaW47Y2hhcnNldD1VUy1BU0NJSScpXG4gIH1cblxuICAvLyAxNS4gUmV0dXJuIGEgbmV3IGRhdGE6IFVSTCBzdHJ1Y3Qgd2hvc2UgTUlNRVxuICAvLyB0eXBlIGlzIG1pbWVUeXBlUmVjb3JkIGFuZCBib2R5IGlzIGJvZHkuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkYXRhLXVybC1zdHJ1Y3RcbiAgcmV0dXJuIHsgbWltZVR5cGU6IG1pbWVUeXBlUmVjb3JkLCBib2R5IH1cbn1cblxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LXVybC1zZXJpYWxpemVyXG4vKipcbiAqIEBwYXJhbSB7VVJMfSB1cmxcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZXhjbHVkZUZyYWdtZW50XG4gKi9cbmZ1bmN0aW9uIFVSTFNlcmlhbGl6ZXIgKHVybCwgZXhjbHVkZUZyYWdtZW50ID0gZmFsc2UpIHtcbiAgaWYgKCFleGNsdWRlRnJhZ21lbnQpIHtcbiAgICByZXR1cm4gdXJsLmhyZWZcbiAgfVxuXG4gIGNvbnN0IGhyZWYgPSB1cmwuaHJlZlxuICBjb25zdCBoYXNoTGVuZ3RoID0gdXJsLmhhc2gubGVuZ3RoXG5cbiAgcmV0dXJuIGhhc2hMZW5ndGggPT09IDAgPyBocmVmIDogaHJlZi5zdWJzdHJpbmcoMCwgaHJlZi5sZW5ndGggLSBoYXNoTGVuZ3RoKVxufVxuXG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jY29sbGVjdC1hLXNlcXVlbmNlLW9mLWNvZGUtcG9pbnRzXG4vKipcbiAqIEBwYXJhbSB7KGNoYXI6IHN0cmluZykgPT4gYm9vbGVhbn0gY29uZGl0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXRcbiAqIEBwYXJhbSB7eyBwb3NpdGlvbjogbnVtYmVyIH19IHBvc2l0aW9uXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHMgKGNvbmRpdGlvbiwgaW5wdXQsIHBvc2l0aW9uKSB7XG4gIC8vIDEuIExldCByZXN1bHQgYmUgdGhlIGVtcHR5IHN0cmluZy5cbiAgbGV0IHJlc3VsdCA9ICcnXG5cbiAgLy8gMi4gV2hpbGUgcG9zaXRpb24gZG9lc27igJl0IHBvaW50IHBhc3QgdGhlIGVuZCBvZiBpbnB1dCBhbmQgdGhlXG4gIC8vIGNvZGUgcG9pbnQgYXQgcG9zaXRpb24gd2l0aGluIGlucHV0IG1lZXRzIHRoZSBjb25kaXRpb24gY29uZGl0aW9uOlxuICB3aGlsZSAocG9zaXRpb24ucG9zaXRpb24gPCBpbnB1dC5sZW5ndGggJiYgY29uZGl0aW9uKGlucHV0W3Bvc2l0aW9uLnBvc2l0aW9uXSkpIHtcbiAgICAvLyAxLiBBcHBlbmQgdGhhdCBjb2RlIHBvaW50IHRvIHRoZSBlbmQgb2YgcmVzdWx0LlxuICAgIHJlc3VsdCArPSBpbnB1dFtwb3NpdGlvbi5wb3NpdGlvbl1cblxuICAgIC8vIDIuIEFkdmFuY2UgcG9zaXRpb24gYnkgMS5cbiAgICBwb3NpdGlvbi5wb3NpdGlvbisrXG4gIH1cblxuICAvLyAzLiBSZXR1cm4gcmVzdWx0LlxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogQSBmYXN0ZXIgY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50cyB0aGF0IG9ubHkgd29ya3Mgd2hlbiBjb21wYXJpbmcgYSBzaW5nbGUgY2hhcmFjdGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGNoYXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dFxuICogQHBhcmFtIHt7IHBvc2l0aW9uOiBudW1iZXIgfX0gcG9zaXRpb25cbiAqL1xuZnVuY3Rpb24gY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50c0Zhc3QgKGNoYXIsIGlucHV0LCBwb3NpdGlvbikge1xuICBjb25zdCBpZHggPSBpbnB1dC5pbmRleE9mKGNoYXIsIHBvc2l0aW9uLnBvc2l0aW9uKVxuICBjb25zdCBzdGFydCA9IHBvc2l0aW9uLnBvc2l0aW9uXG5cbiAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICBwb3NpdGlvbi5wb3NpdGlvbiA9IGlucHV0Lmxlbmd0aFxuICAgIHJldHVybiBpbnB1dC5zbGljZShzdGFydClcbiAgfVxuXG4gIHBvc2l0aW9uLnBvc2l0aW9uID0gaWR4XG4gIHJldHVybiBpbnB1dC5zbGljZShzdGFydCwgcG9zaXRpb24ucG9zaXRpb24pXG59XG5cbi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jc3RyaW5nLXBlcmNlbnQtZGVjb2RlXG4vKiogQHBhcmFtIHtzdHJpbmd9IGlucHV0ICovXG5mdW5jdGlvbiBzdHJpbmdQZXJjZW50RGVjb2RlIChpbnB1dCkge1xuICAvLyAxLiBMZXQgYnl0ZXMgYmUgdGhlIFVURi04IGVuY29kaW5nIG9mIGlucHV0LlxuICBjb25zdCBieXRlcyA9IGVuY29kZXIuZW5jb2RlKGlucHV0KVxuXG4gIC8vIDIuIFJldHVybiB0aGUgcGVyY2VudC1kZWNvZGluZyBvZiBieXRlcy5cbiAgcmV0dXJuIHBlcmNlbnREZWNvZGUoYnl0ZXMpXG59XG5cbi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jcGVyY2VudC1kZWNvZGVcbi8qKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGlucHV0ICovXG5mdW5jdGlvbiBwZXJjZW50RGVjb2RlIChpbnB1dCkge1xuICAvLyAxLiBMZXQgb3V0cHV0IGJlIGFuIGVtcHR5IGJ5dGUgc2VxdWVuY2UuXG4gIC8qKiBAdHlwZSB7bnVtYmVyW119ICovXG4gIGNvbnN0IG91dHB1dCA9IFtdXG5cbiAgLy8gMi4gRm9yIGVhY2ggYnl0ZSBieXRlIGluIGlucHV0OlxuICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYnl0ZSA9IGlucHV0W2ldXG5cbiAgICAvLyAxLiBJZiBieXRlIGlzIG5vdCAweDI1ICglKSwgdGhlbiBhcHBlbmQgYnl0ZSB0byBvdXRwdXQuXG4gICAgaWYgKGJ5dGUgIT09IDB4MjUpIHtcbiAgICAgIG91dHB1dC5wdXNoKGJ5dGUpXG5cbiAgICAvLyAyLiBPdGhlcndpc2UsIGlmIGJ5dGUgaXMgMHgyNSAoJSkgYW5kIHRoZSBuZXh0IHR3byBieXRlc1xuICAgIC8vIGFmdGVyIGJ5dGUgaW4gaW5wdXQgYXJlIG5vdCBpbiB0aGUgcmFuZ2VzXG4gICAgLy8gMHgzMCAoMCkgdG8gMHgzOSAoOSksIDB4NDEgKEEpIHRvIDB4NDYgKEYpLFxuICAgIC8vIGFuZCAweDYxIChhKSB0byAweDY2IChmKSwgYWxsIGluY2x1c2l2ZSwgYXBwZW5kIGJ5dGVcbiAgICAvLyB0byBvdXRwdXQuXG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGJ5dGUgPT09IDB4MjUgJiZcbiAgICAgICEvXlswLTlBLUZhLWZdezJ9JC9pLnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShpbnB1dFtpICsgMV0sIGlucHV0W2kgKyAyXSkpXG4gICAgKSB7XG4gICAgICBvdXRwdXQucHVzaCgweDI1KVxuXG4gICAgLy8gMy4gT3RoZXJ3aXNlOlxuICAgIH0gZWxzZSB7XG4gICAgICAvLyAxLiBMZXQgYnl0ZVBvaW50IGJlIHRoZSB0d28gYnl0ZXMgYWZ0ZXIgYnl0ZSBpbiBpbnB1dCxcbiAgICAgIC8vIGRlY29kZWQsIGFuZCB0aGVuIGludGVycHJldGVkIGFzIGhleGFkZWNpbWFsIG51bWJlci5cbiAgICAgIGNvbnN0IG5leHRUd29CeXRlcyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoaW5wdXRbaSArIDFdLCBpbnB1dFtpICsgMl0pXG4gICAgICBjb25zdCBieXRlUG9pbnQgPSBOdW1iZXIucGFyc2VJbnQobmV4dFR3b0J5dGVzLCAxNilcblxuICAgICAgLy8gMi4gQXBwZW5kIGEgYnl0ZSB3aG9zZSB2YWx1ZSBpcyBieXRlUG9pbnQgdG8gb3V0cHV0LlxuICAgICAgb3V0cHV0LnB1c2goYnl0ZVBvaW50KVxuXG4gICAgICAvLyAzLiBTa2lwIHRoZSBuZXh0IHR3byBieXRlcyBpbiBpbnB1dC5cbiAgICAgIGkgKz0gMlxuICAgIH1cbiAgfVxuXG4gIC8vIDMuIFJldHVybiBvdXRwdXQuXG4gIHJldHVybiBVaW50OEFycmF5LmZyb20ob3V0cHV0KVxufVxuXG4vLyBodHRwczovL21pbWVzbmlmZi5zcGVjLndoYXR3Zy5vcmcvI3BhcnNlLWEtbWltZS10eXBlXG4vKiogQHBhcmFtIHtzdHJpbmd9IGlucHV0ICovXG5mdW5jdGlvbiBwYXJzZU1JTUVUeXBlIChpbnB1dCkge1xuICAvLyAxLiBSZW1vdmUgYW55IGxlYWRpbmcgYW5kIHRyYWlsaW5nIEhUVFAgd2hpdGVzcGFjZVxuICAvLyBmcm9tIGlucHV0LlxuICBpbnB1dCA9IHJlbW92ZUhUVFBXaGl0ZXNwYWNlKGlucHV0LCB0cnVlLCB0cnVlKVxuXG4gIC8vIDIuIExldCBwb3NpdGlvbiBiZSBhIHBvc2l0aW9uIHZhcmlhYmxlIGZvciBpbnB1dCxcbiAgLy8gaW5pdGlhbGx5IHBvaW50aW5nIGF0IHRoZSBzdGFydCBvZiBpbnB1dC5cbiAgY29uc3QgcG9zaXRpb24gPSB7IHBvc2l0aW9uOiAwIH1cblxuICAvLyAzLiBMZXQgdHlwZSBiZSB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmcgYSBzZXF1ZW5jZVxuICAvLyBvZiBjb2RlIHBvaW50cyB0aGF0IGFyZSBub3QgVSswMDJGICgvKSBmcm9tXG4gIC8vIGlucHV0LCBnaXZlbiBwb3NpdGlvbi5cbiAgY29uc3QgdHlwZSA9IGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0KFxuICAgICcvJyxcbiAgICBpbnB1dCxcbiAgICBwb3NpdGlvblxuICApXG5cbiAgLy8gNC4gSWYgdHlwZSBpcyB0aGUgZW1wdHkgc3RyaW5nIG9yIGRvZXMgbm90IHNvbGVseVxuICAvLyBjb250YWluIEhUVFAgdG9rZW4gY29kZSBwb2ludHMsIHRoZW4gcmV0dXJuIGZhaWx1cmUuXG4gIC8vIGh0dHBzOi8vbWltZXNuaWZmLnNwZWMud2hhdHdnLm9yZy8jaHR0cC10b2tlbi1jb2RlLXBvaW50XG4gIGlmICh0eXBlLmxlbmd0aCA9PT0gMCB8fCAhSFRUUF9UT0tFTl9DT0RFUE9JTlRTLnRlc3QodHlwZSkpIHtcbiAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gIH1cblxuICAvLyA1LiBJZiBwb3NpdGlvbiBpcyBwYXN0IHRoZSBlbmQgb2YgaW5wdXQsIHRoZW4gcmV0dXJuXG4gIC8vIGZhaWx1cmVcbiAgaWYgKHBvc2l0aW9uLnBvc2l0aW9uID4gaW5wdXQubGVuZ3RoKSB7XG4gICAgcmV0dXJuICdmYWlsdXJlJ1xuICB9XG5cbiAgLy8gNi4gQWR2YW5jZSBwb3NpdGlvbiBieSAxLiAoVGhpcyBza2lwcyBwYXN0IFUrMDAyRiAoLykuKVxuICBwb3NpdGlvbi5wb3NpdGlvbisrXG5cbiAgLy8gNy4gTGV0IHN1YnR5cGUgYmUgdGhlIHJlc3VsdCBvZiBjb2xsZWN0aW5nIGEgc2VxdWVuY2Ugb2ZcbiAgLy8gY29kZSBwb2ludHMgdGhhdCBhcmUgbm90IFUrMDAzQiAoOykgZnJvbSBpbnB1dCwgZ2l2ZW5cbiAgLy8gcG9zaXRpb24uXG4gIGxldCBzdWJ0eXBlID0gY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50c0Zhc3QoXG4gICAgJzsnLFxuICAgIGlucHV0LFxuICAgIHBvc2l0aW9uXG4gIClcblxuICAvLyA4LiBSZW1vdmUgYW55IHRyYWlsaW5nIEhUVFAgd2hpdGVzcGFjZSBmcm9tIHN1YnR5cGUuXG4gIHN1YnR5cGUgPSByZW1vdmVIVFRQV2hpdGVzcGFjZShzdWJ0eXBlLCBmYWxzZSwgdHJ1ZSlcblxuICAvLyA5LiBJZiBzdWJ0eXBlIGlzIHRoZSBlbXB0eSBzdHJpbmcgb3IgZG9lcyBub3Qgc29sZWx5XG4gIC8vIGNvbnRhaW4gSFRUUCB0b2tlbiBjb2RlIHBvaW50cywgdGhlbiByZXR1cm4gZmFpbHVyZS5cbiAgaWYgKHN1YnR5cGUubGVuZ3RoID09PSAwIHx8ICFIVFRQX1RPS0VOX0NPREVQT0lOVFMudGVzdChzdWJ0eXBlKSkge1xuICAgIHJldHVybiAnZmFpbHVyZSdcbiAgfVxuXG4gIGNvbnN0IHR5cGVMb3dlcmNhc2UgPSB0eXBlLnRvTG93ZXJDYXNlKClcbiAgY29uc3Qgc3VidHlwZUxvd2VyY2FzZSA9IHN1YnR5cGUudG9Mb3dlckNhc2UoKVxuXG4gIC8vIDEwLiBMZXQgbWltZVR5cGUgYmUgYSBuZXcgTUlNRSB0eXBlIHJlY29yZCB3aG9zZSB0eXBlXG4gIC8vIGlzIHR5cGUsIGluIEFTQ0lJIGxvd2VyY2FzZSwgYW5kIHN1YnR5cGUgaXMgc3VidHlwZSxcbiAgLy8gaW4gQVNDSUkgbG93ZXJjYXNlLlxuICAvLyBodHRwczovL21pbWVzbmlmZi5zcGVjLndoYXR3Zy5vcmcvI21pbWUtdHlwZVxuICBjb25zdCBtaW1lVHlwZSA9IHtcbiAgICB0eXBlOiB0eXBlTG93ZXJjYXNlLFxuICAgIHN1YnR5cGU6IHN1YnR5cGVMb3dlcmNhc2UsXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSAqL1xuICAgIHBhcmFtZXRlcnM6IG5ldyBNYXAoKSxcbiAgICAvLyBodHRwczovL21pbWVzbmlmZi5zcGVjLndoYXR3Zy5vcmcvI21pbWUtdHlwZS1lc3NlbmNlXG4gICAgZXNzZW5jZTogYCR7dHlwZUxvd2VyY2FzZX0vJHtzdWJ0eXBlTG93ZXJjYXNlfWBcbiAgfVxuXG4gIC8vIDExLiBXaGlsZSBwb3NpdGlvbiBpcyBub3QgcGFzdCB0aGUgZW5kIG9mIGlucHV0OlxuICB3aGlsZSAocG9zaXRpb24ucG9zaXRpb24gPCBpbnB1dC5sZW5ndGgpIHtcbiAgICAvLyAxLiBBZHZhbmNlIHBvc2l0aW9uIGJ5IDEuIChUaGlzIHNraXBzIHBhc3QgVSswMDNCICg7KS4pXG4gICAgcG9zaXRpb24ucG9zaXRpb24rK1xuXG4gICAgLy8gMi4gQ29sbGVjdCBhIHNlcXVlbmNlIG9mIGNvZGUgcG9pbnRzIHRoYXQgYXJlIEhUVFBcbiAgICAvLyB3aGl0ZXNwYWNlIGZyb20gaW5wdXQgZ2l2ZW4gcG9zaXRpb24uXG4gICAgY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50cyhcbiAgICAgIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNodHRwLXdoaXRlc3BhY2VcbiAgICAgIGNoYXIgPT4gSFRUUF9XSElURVNQQUNFX1JFR0VYLnRlc3QoY2hhciksXG4gICAgICBpbnB1dCxcbiAgICAgIHBvc2l0aW9uXG4gICAgKVxuXG4gICAgLy8gMy4gTGV0IHBhcmFtZXRlck5hbWUgYmUgdGhlIHJlc3VsdCBvZiBjb2xsZWN0aW5nIGFcbiAgICAvLyBzZXF1ZW5jZSBvZiBjb2RlIHBvaW50cyB0aGF0IGFyZSBub3QgVSswMDNCICg7KVxuICAgIC8vIG9yIFUrMDAzRCAoPSkgZnJvbSBpbnB1dCwgZ2l2ZW4gcG9zaXRpb24uXG4gICAgbGV0IHBhcmFtZXRlck5hbWUgPSBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzKFxuICAgICAgKGNoYXIpID0+IGNoYXIgIT09ICc7JyAmJiBjaGFyICE9PSAnPScsXG4gICAgICBpbnB1dCxcbiAgICAgIHBvc2l0aW9uXG4gICAgKVxuXG4gICAgLy8gNC4gU2V0IHBhcmFtZXRlck5hbWUgdG8gcGFyYW1ldGVyTmFtZSwgaW4gQVNDSUlcbiAgICAvLyBsb3dlcmNhc2UuXG4gICAgcGFyYW1ldGVyTmFtZSA9IHBhcmFtZXRlck5hbWUudG9Mb3dlckNhc2UoKVxuXG4gICAgLy8gNS4gSWYgcG9zaXRpb24gaXMgbm90IHBhc3QgdGhlIGVuZCBvZiBpbnB1dCwgdGhlbjpcbiAgICBpZiAocG9zaXRpb24ucG9zaXRpb24gPCBpbnB1dC5sZW5ndGgpIHtcbiAgICAgIC8vIDEuIElmIHRoZSBjb2RlIHBvaW50IGF0IHBvc2l0aW9uIHdpdGhpbiBpbnB1dCBpc1xuICAgICAgLy8gVSswMDNCICg7KSwgdGhlbiBjb250aW51ZS5cbiAgICAgIGlmIChpbnB1dFtwb3NpdGlvbi5wb3NpdGlvbl0gPT09ICc7Jykge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyLiBBZHZhbmNlIHBvc2l0aW9uIGJ5IDEuIChUaGlzIHNraXBzIHBhc3QgVSswMDNEICg9KS4pXG4gICAgICBwb3NpdGlvbi5wb3NpdGlvbisrXG4gICAgfVxuXG4gICAgLy8gNi4gSWYgcG9zaXRpb24gaXMgcGFzdCB0aGUgZW5kIG9mIGlucHV0LCB0aGVuIGJyZWFrLlxuICAgIGlmIChwb3NpdGlvbi5wb3NpdGlvbiA+IGlucHV0Lmxlbmd0aCkge1xuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICAvLyA3LiBMZXQgcGFyYW1ldGVyVmFsdWUgYmUgbnVsbC5cbiAgICBsZXQgcGFyYW1ldGVyVmFsdWUgPSBudWxsXG5cbiAgICAvLyA4LiBJZiB0aGUgY29kZSBwb2ludCBhdCBwb3NpdGlvbiB3aXRoaW4gaW5wdXQgaXNcbiAgICAvLyBVKzAwMjIgKFwiKSwgdGhlbjpcbiAgICBpZiAoaW5wdXRbcG9zaXRpb24ucG9zaXRpb25dID09PSAnXCInKSB7XG4gICAgICAvLyAxLiBTZXQgcGFyYW1ldGVyVmFsdWUgdG8gdGhlIHJlc3VsdCBvZiBjb2xsZWN0aW5nXG4gICAgICAvLyBhbiBIVFRQIHF1b3RlZCBzdHJpbmcgZnJvbSBpbnB1dCwgZ2l2ZW4gcG9zaXRpb25cbiAgICAgIC8vIGFuZCB0aGUgZXh0cmFjdC12YWx1ZSBmbGFnLlxuICAgICAgcGFyYW1ldGVyVmFsdWUgPSBjb2xsZWN0QW5IVFRQUXVvdGVkU3RyaW5nKGlucHV0LCBwb3NpdGlvbiwgdHJ1ZSlcblxuICAgICAgLy8gMi4gQ29sbGVjdCBhIHNlcXVlbmNlIG9mIGNvZGUgcG9pbnRzIHRoYXQgYXJlIG5vdFxuICAgICAgLy8gVSswMDNCICg7KSBmcm9tIGlucHV0LCBnaXZlbiBwb3NpdGlvbi5cbiAgICAgIGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0KFxuICAgICAgICAnOycsXG4gICAgICAgIGlucHV0LFxuICAgICAgICBwb3NpdGlvblxuICAgICAgKVxuXG4gICAgLy8gOS4gT3RoZXJ3aXNlOlxuICAgIH0gZWxzZSB7XG4gICAgICAvLyAxLiBTZXQgcGFyYW1ldGVyVmFsdWUgdG8gdGhlIHJlc3VsdCBvZiBjb2xsZWN0aW5nXG4gICAgICAvLyBhIHNlcXVlbmNlIG9mIGNvZGUgcG9pbnRzIHRoYXQgYXJlIG5vdCBVKzAwM0IgKDspXG4gICAgICAvLyBmcm9tIGlucHV0LCBnaXZlbiBwb3NpdGlvbi5cbiAgICAgIHBhcmFtZXRlclZhbHVlID0gY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50c0Zhc3QoXG4gICAgICAgICc7JyxcbiAgICAgICAgaW5wdXQsXG4gICAgICAgIHBvc2l0aW9uXG4gICAgICApXG5cbiAgICAgIC8vIDIuIFJlbW92ZSBhbnkgdHJhaWxpbmcgSFRUUCB3aGl0ZXNwYWNlIGZyb20gcGFyYW1ldGVyVmFsdWUuXG4gICAgICBwYXJhbWV0ZXJWYWx1ZSA9IHJlbW92ZUhUVFBXaGl0ZXNwYWNlKHBhcmFtZXRlclZhbHVlLCBmYWxzZSwgdHJ1ZSlcblxuICAgICAgLy8gMy4gSWYgcGFyYW1ldGVyVmFsdWUgaXMgdGhlIGVtcHR5IHN0cmluZywgdGhlbiBjb250aW51ZS5cbiAgICAgIGlmIChwYXJhbWV0ZXJWYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAxMC4gSWYgYWxsIG9mIHRoZSBmb2xsb3dpbmcgYXJlIHRydWVcbiAgICAvLyAtIHBhcmFtZXRlck5hbWUgaXMgbm90IHRoZSBlbXB0eSBzdHJpbmdcbiAgICAvLyAtIHBhcmFtZXRlck5hbWUgc29sZWx5IGNvbnRhaW5zIEhUVFAgdG9rZW4gY29kZSBwb2ludHNcbiAgICAvLyAtIHBhcmFtZXRlclZhbHVlIHNvbGVseSBjb250YWlucyBIVFRQIHF1b3RlZC1zdHJpbmcgdG9rZW4gY29kZSBwb2ludHNcbiAgICAvLyAtIG1pbWVUeXBl4oCZcyBwYXJhbWV0ZXJzW3BhcmFtZXRlck5hbWVdIGRvZXMgbm90IGV4aXN0XG4gICAgLy8gdGhlbiBzZXQgbWltZVR5cGXigJlzIHBhcmFtZXRlcnNbcGFyYW1ldGVyTmFtZV0gdG8gcGFyYW1ldGVyVmFsdWUuXG4gICAgaWYgKFxuICAgICAgcGFyYW1ldGVyTmFtZS5sZW5ndGggIT09IDAgJiZcbiAgICAgIEhUVFBfVE9LRU5fQ09ERVBPSU5UUy50ZXN0KHBhcmFtZXRlck5hbWUpICYmXG4gICAgICAocGFyYW1ldGVyVmFsdWUubGVuZ3RoID09PSAwIHx8IEhUVFBfUVVPVEVEX1NUUklOR19UT0tFTlMudGVzdChwYXJhbWV0ZXJWYWx1ZSkpICYmXG4gICAgICAhbWltZVR5cGUucGFyYW1ldGVycy5oYXMocGFyYW1ldGVyTmFtZSlcbiAgICApIHtcbiAgICAgIG1pbWVUeXBlLnBhcmFtZXRlcnMuc2V0KHBhcmFtZXRlck5hbWUsIHBhcmFtZXRlclZhbHVlKVxuICAgIH1cbiAgfVxuXG4gIC8vIDEyLiBSZXR1cm4gbWltZVR5cGUuXG4gIHJldHVybiBtaW1lVHlwZVxufVxuXG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jZm9yZ2l2aW5nLWJhc2U2NC1kZWNvZGVcbi8qKiBAcGFyYW0ge3N0cmluZ30gZGF0YSAqL1xuZnVuY3Rpb24gZm9yZ2l2aW5nQmFzZTY0IChkYXRhKSB7XG4gIC8vIDEuIFJlbW92ZSBhbGwgQVNDSUkgd2hpdGVzcGFjZSBmcm9tIGRhdGEuXG4gIGRhdGEgPSBkYXRhLnJlcGxhY2UoL1tcXHUwMDA5XFx1MDAwQVxcdTAwMENcXHUwMDBEXFx1MDAyMF0vZywgJycpICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cbiAgLy8gMi4gSWYgZGF0YeKAmXMgY29kZSBwb2ludCBsZW5ndGggZGl2aWRlcyBieSA0IGxlYXZpbmdcbiAgLy8gbm8gcmVtYWluZGVyLCB0aGVuOlxuICBpZiAoZGF0YS5sZW5ndGggJSA0ID09PSAwKSB7XG4gICAgLy8gMS4gSWYgZGF0YSBlbmRzIHdpdGggb25lIG9yIHR3byBVKzAwM0QgKD0pIGNvZGUgcG9pbnRzLFxuICAgIC8vIHRoZW4gcmVtb3ZlIHRoZW0gZnJvbSBkYXRhLlxuICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoLz0/PSQvLCAnJylcbiAgfVxuXG4gIC8vIDMuIElmIGRhdGHigJlzIGNvZGUgcG9pbnQgbGVuZ3RoIGRpdmlkZXMgYnkgNCBsZWF2aW5nXG4gIC8vIGEgcmVtYWluZGVyIG9mIDEsIHRoZW4gcmV0dXJuIGZhaWx1cmUuXG4gIGlmIChkYXRhLmxlbmd0aCAlIDQgPT09IDEpIHtcbiAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gIH1cblxuICAvLyA0LiBJZiBkYXRhIGNvbnRhaW5zIGEgY29kZSBwb2ludCB0aGF0IGlzIG5vdCBvbmUgb2ZcbiAgLy8gIFUrMDAyQiAoKylcbiAgLy8gIFUrMDAyRiAoLylcbiAgLy8gIEFTQ0lJIGFscGhhbnVtZXJpY1xuICAvLyB0aGVuIHJldHVybiBmYWlsdXJlLlxuICBpZiAoL1teKy8wLTlBLVphLXpdLy50ZXN0KGRhdGEpKSB7XG4gICAgcmV0dXJuICdmYWlsdXJlJ1xuICB9XG5cbiAgY29uc3QgYmluYXJ5ID0gYXRvYihkYXRhKVxuICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJpbmFyeS5sZW5ndGgpXG5cbiAgZm9yIChsZXQgYnl0ZSA9IDA7IGJ5dGUgPCBiaW5hcnkubGVuZ3RoOyBieXRlKyspIHtcbiAgICBieXRlc1tieXRlXSA9IGJpbmFyeS5jaGFyQ29kZUF0KGJ5dGUpXG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbGxlY3QtYW4taHR0cC1xdW90ZWQtc3RyaW5nXG4vLyB0ZXN0czogaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2V4YW1wbGUtaHR0cC1xdW90ZWQtc3RyaW5nXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dFxuICogQHBhcmFtIHt7IHBvc2l0aW9uOiBudW1iZXIgfX0gcG9zaXRpb25cbiAqIEBwYXJhbSB7Ym9vbGVhbj99IGV4dHJhY3RWYWx1ZVxuICovXG5mdW5jdGlvbiBjb2xsZWN0QW5IVFRQUXVvdGVkU3RyaW5nIChpbnB1dCwgcG9zaXRpb24sIGV4dHJhY3RWYWx1ZSkge1xuICAvLyAxLiBMZXQgcG9zaXRpb25TdGFydCBiZSBwb3NpdGlvbi5cbiAgY29uc3QgcG9zaXRpb25TdGFydCA9IHBvc2l0aW9uLnBvc2l0aW9uXG5cbiAgLy8gMi4gTGV0IHZhbHVlIGJlIHRoZSBlbXB0eSBzdHJpbmcuXG4gIGxldCB2YWx1ZSA9ICcnXG5cbiAgLy8gMy4gQXNzZXJ0OiB0aGUgY29kZSBwb2ludCBhdCBwb3NpdGlvbiB3aXRoaW4gaW5wdXRcbiAgLy8gaXMgVSswMDIyIChcIikuXG4gIGFzc2VydChpbnB1dFtwb3NpdGlvbi5wb3NpdGlvbl0gPT09ICdcIicpXG5cbiAgLy8gNC4gQWR2YW5jZSBwb3NpdGlvbiBieSAxLlxuICBwb3NpdGlvbi5wb3NpdGlvbisrXG5cbiAgLy8gNS4gV2hpbGUgdHJ1ZTpcbiAgd2hpbGUgKHRydWUpIHtcbiAgICAvLyAxLiBBcHBlbmQgdGhlIHJlc3VsdCBvZiBjb2xsZWN0aW5nIGEgc2VxdWVuY2Ugb2YgY29kZSBwb2ludHNcbiAgICAvLyB0aGF0IGFyZSBub3QgVSswMDIyIChcIikgb3IgVSswMDVDIChcXCkgZnJvbSBpbnB1dCwgZ2l2ZW5cbiAgICAvLyBwb3NpdGlvbiwgdG8gdmFsdWUuXG4gICAgdmFsdWUgKz0gY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50cyhcbiAgICAgIChjaGFyKSA9PiBjaGFyICE9PSAnXCInICYmIGNoYXIgIT09ICdcXFxcJyxcbiAgICAgIGlucHV0LFxuICAgICAgcG9zaXRpb25cbiAgICApXG5cbiAgICAvLyAyLiBJZiBwb3NpdGlvbiBpcyBwYXN0IHRoZSBlbmQgb2YgaW5wdXQsIHRoZW4gYnJlYWsuXG4gICAgaWYgKHBvc2l0aW9uLnBvc2l0aW9uID49IGlucHV0Lmxlbmd0aCkge1xuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICAvLyAzLiBMZXQgcXVvdGVPckJhY2tzbGFzaCBiZSB0aGUgY29kZSBwb2ludCBhdCBwb3NpdGlvbiB3aXRoaW5cbiAgICAvLyBpbnB1dC5cbiAgICBjb25zdCBxdW90ZU9yQmFja3NsYXNoID0gaW5wdXRbcG9zaXRpb24ucG9zaXRpb25dXG5cbiAgICAvLyA0LiBBZHZhbmNlIHBvc2l0aW9uIGJ5IDEuXG4gICAgcG9zaXRpb24ucG9zaXRpb24rK1xuXG4gICAgLy8gNS4gSWYgcXVvdGVPckJhY2tzbGFzaCBpcyBVKzAwNUMgKFxcKSwgdGhlbjpcbiAgICBpZiAocXVvdGVPckJhY2tzbGFzaCA9PT0gJ1xcXFwnKSB7XG4gICAgICAvLyAxLiBJZiBwb3NpdGlvbiBpcyBwYXN0IHRoZSBlbmQgb2YgaW5wdXQsIHRoZW4gYXBwZW5kXG4gICAgICAvLyBVKzAwNUMgKFxcKSB0byB2YWx1ZSBhbmQgYnJlYWsuXG4gICAgICBpZiAocG9zaXRpb24ucG9zaXRpb24gPj0gaW5wdXQubGVuZ3RoKSB7XG4gICAgICAgIHZhbHVlICs9ICdcXFxcJ1xuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBBcHBlbmQgdGhlIGNvZGUgcG9pbnQgYXQgcG9zaXRpb24gd2l0aGluIGlucHV0IHRvIHZhbHVlLlxuICAgICAgdmFsdWUgKz0gaW5wdXRbcG9zaXRpb24ucG9zaXRpb25dXG5cbiAgICAgIC8vIDMuIEFkdmFuY2UgcG9zaXRpb24gYnkgMS5cbiAgICAgIHBvc2l0aW9uLnBvc2l0aW9uKytcblxuICAgIC8vIDYuIE90aGVyd2lzZTpcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gMS4gQXNzZXJ0OiBxdW90ZU9yQmFja3NsYXNoIGlzIFUrMDAyMiAoXCIpLlxuICAgICAgYXNzZXJ0KHF1b3RlT3JCYWNrc2xhc2ggPT09ICdcIicpXG5cbiAgICAgIC8vIDIuIEJyZWFrLlxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICAvLyA2LiBJZiB0aGUgZXh0cmFjdC12YWx1ZSBmbGFnIGlzIHNldCwgdGhlbiByZXR1cm4gdmFsdWUuXG4gIGlmIChleHRyYWN0VmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8vIDcuIFJldHVybiB0aGUgY29kZSBwb2ludHMgZnJvbSBwb3NpdGlvblN0YXJ0IHRvIHBvc2l0aW9uLFxuICAvLyBpbmNsdXNpdmUsIHdpdGhpbiBpbnB1dC5cbiAgcmV0dXJuIGlucHV0LnNsaWNlKHBvc2l0aW9uU3RhcnQsIHBvc2l0aW9uLnBvc2l0aW9uKVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9taW1lc25pZmYuc3BlYy53aGF0d2cub3JnLyNzZXJpYWxpemUtYS1taW1lLXR5cGVcbiAqL1xuZnVuY3Rpb24gc2VyaWFsaXplQU1pbWVUeXBlIChtaW1lVHlwZSkge1xuICBhc3NlcnQobWltZVR5cGUgIT09ICdmYWlsdXJlJylcbiAgY29uc3QgeyBwYXJhbWV0ZXJzLCBlc3NlbmNlIH0gPSBtaW1lVHlwZVxuXG4gIC8vIDEuIExldCBzZXJpYWxpemF0aW9uIGJlIHRoZSBjb25jYXRlbmF0aW9uIG9mIG1pbWVUeXBl4oCZc1xuICAvLyAgICB0eXBlLCBVKzAwMkYgKC8pLCBhbmQgbWltZVR5cGXigJlzIHN1YnR5cGUuXG4gIGxldCBzZXJpYWxpemF0aW9uID0gZXNzZW5jZVxuXG4gIC8vIDIuIEZvciBlYWNoIG5hbWUg4oaSIHZhbHVlIG9mIG1pbWVUeXBl4oCZcyBwYXJhbWV0ZXJzOlxuICBmb3IgKGxldCBbbmFtZSwgdmFsdWVdIG9mIHBhcmFtZXRlcnMuZW50cmllcygpKSB7XG4gICAgLy8gMS4gQXBwZW5kIFUrMDAzQiAoOykgdG8gc2VyaWFsaXphdGlvbi5cbiAgICBzZXJpYWxpemF0aW9uICs9ICc7J1xuXG4gICAgLy8gMi4gQXBwZW5kIG5hbWUgdG8gc2VyaWFsaXphdGlvbi5cbiAgICBzZXJpYWxpemF0aW9uICs9IG5hbWVcblxuICAgIC8vIDMuIEFwcGVuZCBVKzAwM0QgKD0pIHRvIHNlcmlhbGl6YXRpb24uXG4gICAgc2VyaWFsaXphdGlvbiArPSAnPSdcblxuICAgIC8vIDQuIElmIHZhbHVlIGRvZXMgbm90IHNvbGVseSBjb250YWluIEhUVFAgdG9rZW4gY29kZVxuICAgIC8vICAgIHBvaW50cyBvciB2YWx1ZSBpcyB0aGUgZW1wdHkgc3RyaW5nLCB0aGVuOlxuICAgIGlmICghSFRUUF9UT0tFTl9DT0RFUE9JTlRTLnRlc3QodmFsdWUpKSB7XG4gICAgICAvLyAxLiBQcmVjZWRlIGVhY2ggb2NjdXJlbmNlIG9mIFUrMDAyMiAoXCIpIG9yXG4gICAgICAvLyAgICBVKzAwNUMgKFxcKSBpbiB2YWx1ZSB3aXRoIFUrMDA1QyAoXFwpLlxuICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC8oXFxcXHxcIikvZywgJ1xcXFwkMScpXG5cbiAgICAgIC8vIDIuIFByZXBlbmQgVSswMDIyIChcIikgdG8gdmFsdWUuXG4gICAgICB2YWx1ZSA9ICdcIicgKyB2YWx1ZVxuXG4gICAgICAvLyAzLiBBcHBlbmQgVSswMDIyIChcIikgdG8gdmFsdWUuXG4gICAgICB2YWx1ZSArPSAnXCInXG4gICAgfVxuXG4gICAgLy8gNS4gQXBwZW5kIHZhbHVlIHRvIHNlcmlhbGl6YXRpb24uXG4gICAgc2VyaWFsaXphdGlvbiArPSB2YWx1ZVxuICB9XG5cbiAgLy8gMy4gUmV0dXJuIHNlcmlhbGl6YXRpb24uXG4gIHJldHVybiBzZXJpYWxpemF0aW9uXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaHR0cC13aGl0ZXNwYWNlXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hhclxuICovXG5mdW5jdGlvbiBpc0hUVFBXaGl0ZVNwYWNlIChjaGFyKSB7XG4gIHJldHVybiBjaGFyID09PSAnXFxyJyB8fCBjaGFyID09PSAnXFxuJyB8fCBjaGFyID09PSAnXFx0JyB8fCBjaGFyID09PSAnICdcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNodHRwLXdoaXRlc3BhY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlSFRUUFdoaXRlc3BhY2UgKHN0ciwgbGVhZGluZyA9IHRydWUsIHRyYWlsaW5nID0gdHJ1ZSkge1xuICBsZXQgbGVhZCA9IDBcbiAgbGV0IHRyYWlsID0gc3RyLmxlbmd0aCAtIDFcblxuICBpZiAobGVhZGluZykge1xuICAgIGZvciAoOyBsZWFkIDwgc3RyLmxlbmd0aCAmJiBpc0hUVFBXaGl0ZVNwYWNlKHN0cltsZWFkXSk7IGxlYWQrKyk7XG4gIH1cblxuICBpZiAodHJhaWxpbmcpIHtcbiAgICBmb3IgKDsgdHJhaWwgPiAwICYmIGlzSFRUUFdoaXRlU3BhY2Uoc3RyW3RyYWlsXSk7IHRyYWlsLS0pO1xuICB9XG5cbiAgcmV0dXJuIHN0ci5zbGljZShsZWFkLCB0cmFpbCArIDEpXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jYXNjaWktd2hpdGVzcGFjZVxuICogQHBhcmFtIHtzdHJpbmd9IGNoYXJcbiAqL1xuZnVuY3Rpb24gaXNBU0NJSVdoaXRlc3BhY2UgKGNoYXIpIHtcbiAgcmV0dXJuIGNoYXIgPT09ICdcXHInIHx8IGNoYXIgPT09ICdcXG4nIHx8IGNoYXIgPT09ICdcXHQnIHx8IGNoYXIgPT09ICdcXGYnIHx8IGNoYXIgPT09ICcgJ1xufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWxlYWRpbmctYW5kLXRyYWlsaW5nLWFzY2lpLXdoaXRlc3BhY2VcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQVNDSUlXaGl0ZXNwYWNlIChzdHIsIGxlYWRpbmcgPSB0cnVlLCB0cmFpbGluZyA9IHRydWUpIHtcbiAgbGV0IGxlYWQgPSAwXG4gIGxldCB0cmFpbCA9IHN0ci5sZW5ndGggLSAxXG5cbiAgaWYgKGxlYWRpbmcpIHtcbiAgICBmb3IgKDsgbGVhZCA8IHN0ci5sZW5ndGggJiYgaXNBU0NJSVdoaXRlc3BhY2Uoc3RyW2xlYWRdKTsgbGVhZCsrKTtcbiAgfVxuXG4gIGlmICh0cmFpbGluZykge1xuICAgIGZvciAoOyB0cmFpbCA+IDAgJiYgaXNBU0NJSVdoaXRlc3BhY2Uoc3RyW3RyYWlsXSk7IHRyYWlsLS0pO1xuICB9XG5cbiAgcmV0dXJuIHN0ci5zbGljZShsZWFkLCB0cmFpbCArIDEpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBkYXRhVVJMUHJvY2Vzc29yLFxuICBVUkxTZXJpYWxpemVyLFxuICBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzLFxuICBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzRmFzdCxcbiAgc3RyaW5nUGVyY2VudERlY29kZSxcbiAgcGFyc2VNSU1FVHlwZSxcbiAgY29sbGVjdEFuSFRUUFF1b3RlZFN0cmluZyxcbiAgc2VyaWFsaXplQU1pbWVUeXBlXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBCbG9iLCBGaWxlOiBOYXRpdmVGaWxlIH0gPSByZXF1aXJlKCdidWZmZXInKVxuY29uc3QgeyB0eXBlcyB9ID0gcmVxdWlyZSgndXRpbCcpXG5jb25zdCB7IGtTdGF0ZSB9ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgaXNCbG9iTGlrZSB9ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHsgd2ViaWRsIH0gPSByZXF1aXJlKCcuL3dlYmlkbCcpXG5jb25zdCB7IHBhcnNlTUlNRVR5cGUsIHNlcmlhbGl6ZUFNaW1lVHlwZSB9ID0gcmVxdWlyZSgnLi9kYXRhVVJMJylcbmNvbnN0IHsga0VudW1lcmFibGVQcm9wZXJ0eSB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKVxuXG5jbGFzcyBGaWxlIGV4dGVuZHMgQmxvYiB7XG4gIGNvbnN0cnVjdG9yIChmaWxlQml0cywgZmlsZU5hbWUsIG9wdGlvbnMgPSB7fSkge1xuICAgIC8vIFRoZSBGaWxlIGNvbnN0cnVjdG9yIGlzIGludm9rZWQgd2l0aCB0d28gb3IgdGhyZWUgcGFyYW1ldGVycywgZGVwZW5kaW5nXG4gICAgLy8gb24gd2hldGhlciB0aGUgb3B0aW9uYWwgZGljdGlvbmFyeSBwYXJhbWV0ZXIgaXMgdXNlZC4gV2hlbiB0aGUgRmlsZSgpXG4gICAgLy8gY29uc3RydWN0b3IgaXMgaW52b2tlZCwgdXNlciBhZ2VudHMgbXVzdCBydW4gdGhlIGZvbGxvd2luZyBzdGVwczpcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDIsIHsgaGVhZGVyOiAnRmlsZSBjb25zdHJ1Y3RvcicgfSlcblxuICAgIGZpbGVCaXRzID0gd2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPEJsb2JQYXJ0PiddKGZpbGVCaXRzKVxuICAgIGZpbGVOYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKGZpbGVOYW1lKVxuICAgIG9wdGlvbnMgPSB3ZWJpZGwuY29udmVydGVycy5GaWxlUHJvcGVydHlCYWcob3B0aW9ucylcblxuICAgIC8vIDEuIExldCBieXRlcyBiZSB0aGUgcmVzdWx0IG9mIHByb2Nlc3NpbmcgYmxvYiBwYXJ0cyBnaXZlbiBmaWxlQml0cyBhbmRcbiAgICAvLyBvcHRpb25zLlxuICAgIC8vIE5vdGU6IEJsb2IgaGFuZGxlcyB0aGlzIGZvciB1c1xuXG4gICAgLy8gMi4gTGV0IG4gYmUgdGhlIGZpbGVOYW1lIGFyZ3VtZW50IHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICBjb25zdCBuID0gZmlsZU5hbWVcblxuICAgIC8vIDMuIFByb2Nlc3MgRmlsZVByb3BlcnR5QmFnIGRpY3Rpb25hcnkgYXJndW1lbnQgYnkgcnVubmluZyB0aGUgZm9sbG93aW5nXG4gICAgLy8gc3Vic3RlcHM6XG5cbiAgICAvLyAgICAxLiBJZiB0aGUgdHlwZSBtZW1iZXIgaXMgcHJvdmlkZWQgYW5kIGlzIG5vdCB0aGUgZW1wdHkgc3RyaW5nLCBsZXQgdFxuICAgIC8vICAgIGJlIHNldCB0byB0aGUgdHlwZSBkaWN0aW9uYXJ5IG1lbWJlci4gSWYgdCBjb250YWlucyBhbnkgY2hhcmFjdGVyc1xuICAgIC8vICAgIG91dHNpZGUgdGhlIHJhbmdlIFUrMDAyMCB0byBVKzAwN0UsIHRoZW4gc2V0IHQgdG8gdGhlIGVtcHR5IHN0cmluZ1xuICAgIC8vICAgIGFuZCByZXR1cm4gZnJvbSB0aGVzZSBzdWJzdGVwcy5cbiAgICAvLyAgICAyLiBDb252ZXJ0IGV2ZXJ5IGNoYXJhY3RlciBpbiB0IHRvIEFTQ0lJIGxvd2VyY2FzZS5cbiAgICBsZXQgdCA9IG9wdGlvbnMudHlwZVxuICAgIGxldCBkXG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbGFiZWxzXG4gICAgc3Vic3RlcDoge1xuICAgICAgaWYgKHQpIHtcbiAgICAgICAgdCA9IHBhcnNlTUlNRVR5cGUodClcblxuICAgICAgICBpZiAodCA9PT0gJ2ZhaWx1cmUnKSB7XG4gICAgICAgICAgdCA9ICcnXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxhYmVsc1xuICAgICAgICAgIGJyZWFrIHN1YnN0ZXBcbiAgICAgICAgfVxuXG4gICAgICAgIHQgPSBzZXJpYWxpemVBTWltZVR5cGUodCkudG9Mb3dlckNhc2UoKVxuICAgICAgfVxuXG4gICAgICAvLyAgICAzLiBJZiB0aGUgbGFzdE1vZGlmaWVkIG1lbWJlciBpcyBwcm92aWRlZCwgbGV0IGQgYmUgc2V0IHRvIHRoZVxuICAgICAgLy8gICAgbGFzdE1vZGlmaWVkIGRpY3Rpb25hcnkgbWVtYmVyLiBJZiBpdCBpcyBub3QgcHJvdmlkZWQsIHNldCBkIHRvIHRoZVxuICAgICAgLy8gICAgY3VycmVudCBkYXRlIGFuZCB0aW1lIHJlcHJlc2VudGVkIGFzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlXG4gICAgICAvLyAgICB0aGUgVW5peCBFcG9jaCAod2hpY2ggaXMgdGhlIGVxdWl2YWxlbnQgb2YgRGF0ZS5ub3coKSBbRUNNQS0yNjJdKS5cbiAgICAgIGQgPSBvcHRpb25zLmxhc3RNb2RpZmllZFxuICAgIH1cblxuICAgIC8vIDQuIFJldHVybiBhIG5ldyBGaWxlIG9iamVjdCBGIHN1Y2ggdGhhdDpcbiAgICAvLyBGIHJlZmVycyB0byB0aGUgYnl0ZXMgYnl0ZSBzZXF1ZW5jZS5cbiAgICAvLyBGLnNpemUgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgdG90YWwgYnl0ZXMgaW4gYnl0ZXMuXG4gICAgLy8gRi5uYW1lIGlzIHNldCB0byBuLlxuICAgIC8vIEYudHlwZSBpcyBzZXQgdG8gdC5cbiAgICAvLyBGLmxhc3RNb2RpZmllZCBpcyBzZXQgdG8gZC5cblxuICAgIHN1cGVyKHByb2Nlc3NCbG9iUGFydHMoZmlsZUJpdHMsIG9wdGlvbnMpLCB7IHR5cGU6IHQgfSlcbiAgICB0aGlzW2tTdGF0ZV0gPSB7XG4gICAgICBuYW1lOiBuLFxuICAgICAgbGFzdE1vZGlmaWVkOiBkLFxuICAgICAgdHlwZTogdFxuICAgIH1cbiAgfVxuXG4gIGdldCBuYW1lICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlKVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5uYW1lXG4gIH1cblxuICBnZXQgbGFzdE1vZGlmaWVkICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlKVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5sYXN0TW9kaWZpZWRcbiAgfVxuXG4gIGdldCB0eXBlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlKVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS50eXBlXG4gIH1cbn1cblxuY2xhc3MgRmlsZUxpa2Uge1xuICBjb25zdHJ1Y3RvciAoYmxvYkxpa2UsIGZpbGVOYW1lLCBvcHRpb25zID0ge30pIHtcbiAgICAvLyBUT0RPOiBhcmd1bWVudCBpZGwgdHlwZSBjaGVja1xuXG4gICAgLy8gVGhlIEZpbGUgY29uc3RydWN0b3IgaXMgaW52b2tlZCB3aXRoIHR3byBvciB0aHJlZSBwYXJhbWV0ZXJzLCBkZXBlbmRpbmdcbiAgICAvLyBvbiB3aGV0aGVyIHRoZSBvcHRpb25hbCBkaWN0aW9uYXJ5IHBhcmFtZXRlciBpcyB1c2VkLiBXaGVuIHRoZSBGaWxlKClcbiAgICAvLyBjb25zdHJ1Y3RvciBpcyBpbnZva2VkLCB1c2VyIGFnZW50cyBtdXN0IHJ1biB0aGUgZm9sbG93aW5nIHN0ZXBzOlxuXG4gICAgLy8gMS4gTGV0IGJ5dGVzIGJlIHRoZSByZXN1bHQgb2YgcHJvY2Vzc2luZyBibG9iIHBhcnRzIGdpdmVuIGZpbGVCaXRzIGFuZFxuICAgIC8vIG9wdGlvbnMuXG5cbiAgICAvLyAyLiBMZXQgbiBiZSB0aGUgZmlsZU5hbWUgYXJndW1lbnQgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgIGNvbnN0IG4gPSBmaWxlTmFtZVxuXG4gICAgLy8gMy4gUHJvY2VzcyBGaWxlUHJvcGVydHlCYWcgZGljdGlvbmFyeSBhcmd1bWVudCBieSBydW5uaW5nIHRoZSBmb2xsb3dpbmdcbiAgICAvLyBzdWJzdGVwczpcblxuICAgIC8vICAgIDEuIElmIHRoZSB0eXBlIG1lbWJlciBpcyBwcm92aWRlZCBhbmQgaXMgbm90IHRoZSBlbXB0eSBzdHJpbmcsIGxldCB0XG4gICAgLy8gICAgYmUgc2V0IHRvIHRoZSB0eXBlIGRpY3Rpb25hcnkgbWVtYmVyLiBJZiB0IGNvbnRhaW5zIGFueSBjaGFyYWN0ZXJzXG4gICAgLy8gICAgb3V0c2lkZSB0aGUgcmFuZ2UgVSswMDIwIHRvIFUrMDA3RSwgdGhlbiBzZXQgdCB0byB0aGUgZW1wdHkgc3RyaW5nXG4gICAgLy8gICAgYW5kIHJldHVybiBmcm9tIHRoZXNlIHN1YnN0ZXBzLlxuICAgIC8vICAgIFRPRE9cbiAgICBjb25zdCB0ID0gb3B0aW9ucy50eXBlXG5cbiAgICAvLyAgICAyLiBDb252ZXJ0IGV2ZXJ5IGNoYXJhY3RlciBpbiB0IHRvIEFTQ0lJIGxvd2VyY2FzZS5cbiAgICAvLyAgICBUT0RPXG5cbiAgICAvLyAgICAzLiBJZiB0aGUgbGFzdE1vZGlmaWVkIG1lbWJlciBpcyBwcm92aWRlZCwgbGV0IGQgYmUgc2V0IHRvIHRoZVxuICAgIC8vICAgIGxhc3RNb2RpZmllZCBkaWN0aW9uYXJ5IG1lbWJlci4gSWYgaXQgaXMgbm90IHByb3ZpZGVkLCBzZXQgZCB0byB0aGVcbiAgICAvLyAgICBjdXJyZW50IGRhdGUgYW5kIHRpbWUgcmVwcmVzZW50ZWQgYXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2VcbiAgICAvLyAgICB0aGUgVW5peCBFcG9jaCAod2hpY2ggaXMgdGhlIGVxdWl2YWxlbnQgb2YgRGF0ZS5ub3coKSBbRUNNQS0yNjJdKS5cbiAgICBjb25zdCBkID0gb3B0aW9ucy5sYXN0TW9kaWZpZWQgPz8gRGF0ZS5ub3coKVxuXG4gICAgLy8gNC4gUmV0dXJuIGEgbmV3IEZpbGUgb2JqZWN0IEYgc3VjaCB0aGF0OlxuICAgIC8vIEYgcmVmZXJzIHRvIHRoZSBieXRlcyBieXRlIHNlcXVlbmNlLlxuICAgIC8vIEYuc2l6ZSBpcyBzZXQgdG8gdGhlIG51bWJlciBvZiB0b3RhbCBieXRlcyBpbiBieXRlcy5cbiAgICAvLyBGLm5hbWUgaXMgc2V0IHRvIG4uXG4gICAgLy8gRi50eXBlIGlzIHNldCB0byB0LlxuICAgIC8vIEYubGFzdE1vZGlmaWVkIGlzIHNldCB0byBkLlxuXG4gICAgdGhpc1trU3RhdGVdID0ge1xuICAgICAgYmxvYkxpa2UsXG4gICAgICBuYW1lOiBuLFxuICAgICAgdHlwZTogdCxcbiAgICAgIGxhc3RNb2RpZmllZDogZFxuICAgIH1cbiAgfVxuXG4gIHN0cmVhbSAoLi4uYXJncykge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVMaWtlKVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5ibG9iTGlrZS5zdHJlYW0oLi4uYXJncylcbiAgfVxuXG4gIGFycmF5QnVmZmVyICguLi5hcmdzKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZUxpa2UpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmJsb2JMaWtlLmFycmF5QnVmZmVyKC4uLmFyZ3MpXG4gIH1cblxuICBzbGljZSAoLi4uYXJncykge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVMaWtlKVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5ibG9iTGlrZS5zbGljZSguLi5hcmdzKVxuICB9XG5cbiAgdGV4dCAoLi4uYXJncykge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVMaWtlKVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5ibG9iTGlrZS50ZXh0KC4uLmFyZ3MpXG4gIH1cblxuICBnZXQgc2l6ZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZUxpa2UpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmJsb2JMaWtlLnNpemVcbiAgfVxuXG4gIGdldCB0eXBlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlTGlrZSlcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uYmxvYkxpa2UudHlwZVxuICB9XG5cbiAgZ2V0IG5hbWUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVMaWtlKVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5uYW1lXG4gIH1cblxuICBnZXQgbGFzdE1vZGlmaWVkICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlTGlrZSlcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ubGFzdE1vZGlmaWVkXG4gIH1cblxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10gKCkge1xuICAgIHJldHVybiAnRmlsZSdcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhGaWxlLnByb3RvdHlwZSwge1xuICBbU3ltYm9sLnRvU3RyaW5nVGFnXToge1xuICAgIHZhbHVlOiAnRmlsZScsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0sXG4gIG5hbWU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGxhc3RNb2RpZmllZDoga0VudW1lcmFibGVQcm9wZXJ0eVxufSlcblxud2ViaWRsLmNvbnZlcnRlcnMuQmxvYiA9IHdlYmlkbC5pbnRlcmZhY2VDb252ZXJ0ZXIoQmxvYilcblxud2ViaWRsLmNvbnZlcnRlcnMuQmxvYlBhcnQgPSBmdW5jdGlvbiAoViwgb3B0cykge1xuICBpZiAod2ViaWRsLnV0aWwuVHlwZShWKSA9PT0gJ09iamVjdCcpIHtcbiAgICBpZiAoaXNCbG9iTGlrZShWKSkge1xuICAgICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLkJsb2IoViwgeyBzdHJpY3Q6IGZhbHNlIH0pXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgQXJyYXlCdWZmZXIuaXNWaWV3KFYpIHx8XG4gICAgICB0eXBlcy5pc0FueUFycmF5QnVmZmVyKFYpXG4gICAgKSB7XG4gICAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuQnVmZmVyU291cmNlKFYsIG9wdHMpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhWLCBvcHRzKVxufVxuXG53ZWJpZGwuY29udmVydGVyc1snc2VxdWVuY2U8QmxvYlBhcnQ+J10gPSB3ZWJpZGwuc2VxdWVuY2VDb252ZXJ0ZXIoXG4gIHdlYmlkbC5jb252ZXJ0ZXJzLkJsb2JQYXJ0XG4pXG5cbi8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9GaWxlQVBJLyNkZm4tRmlsZVByb3BlcnR5QmFnXG53ZWJpZGwuY29udmVydGVycy5GaWxlUHJvcGVydHlCYWcgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIHtcbiAgICBrZXk6ICdsYXN0TW9kaWZpZWQnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnNbJ2xvbmcgbG9uZyddLFxuICAgIGdldCBkZWZhdWx0VmFsdWUgKCkge1xuICAgICAgcmV0dXJuIERhdGUubm93KClcbiAgICB9XG4gIH0sXG4gIHtcbiAgICBrZXk6ICd0eXBlJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6ICcnXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdlbmRpbmdzJyxcbiAgICBjb252ZXJ0ZXI6ICh2YWx1ZSkgPT4ge1xuICAgICAgdmFsdWUgPSB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcodmFsdWUpXG4gICAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKClcblxuICAgICAgaWYgKHZhbHVlICE9PSAnbmF0aXZlJykge1xuICAgICAgICB2YWx1ZSA9ICd0cmFuc3BhcmVudCdcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfSxcbiAgICBkZWZhdWx0VmFsdWU6ICd0cmFuc3BhcmVudCdcbiAgfVxuXSlcblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9GaWxlQVBJLyNwcm9jZXNzLWJsb2ItcGFydHNcbiAqIEBwYXJhbSB7KE5vZGVKUy5UeXBlZEFycmF5fEJsb2J8c3RyaW5nKVtdfSBwYXJ0c1xuICogQHBhcmFtIHt7IHR5cGU6IHN0cmluZywgZW5kaW5nczogc3RyaW5nIH19IG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0Jsb2JQYXJ0cyAocGFydHMsIG9wdGlvbnMpIHtcbiAgLy8gMS4gTGV0IGJ5dGVzIGJlIGFuIGVtcHR5IHNlcXVlbmNlIG9mIGJ5dGVzLlxuICAvKiogQHR5cGUge05vZGVKUy5UeXBlZEFycmF5W119ICovXG4gIGNvbnN0IGJ5dGVzID0gW11cblxuICAvLyAyLiBGb3IgZWFjaCBlbGVtZW50IGluIHBhcnRzOlxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgcGFydHMpIHtcbiAgICAvLyAxLiBJZiBlbGVtZW50IGlzIGEgVVNWU3RyaW5nLCBydW4gdGhlIGZvbGxvd2luZyBzdWJzdGVwczpcbiAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyAxLiBMZXQgcyBiZSBlbGVtZW50LlxuICAgICAgbGV0IHMgPSBlbGVtZW50XG5cbiAgICAgIC8vIDIuIElmIHRoZSBlbmRpbmdzIG1lbWJlciBvZiBvcHRpb25zIGlzIFwibmF0aXZlXCIsIHNldCBzXG4gICAgICAvLyAgICB0byB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgbGluZSBlbmRpbmdzIHRvIG5hdGl2ZVxuICAgICAgLy8gICAgb2YgZWxlbWVudC5cbiAgICAgIGlmIChvcHRpb25zLmVuZGluZ3MgPT09ICduYXRpdmUnKSB7XG4gICAgICAgIHMgPSBjb252ZXJ0TGluZUVuZGluZ3NOYXRpdmUocylcbiAgICAgIH1cblxuICAgICAgLy8gMy4gQXBwZW5kIHRoZSByZXN1bHQgb2YgVVRGLTggZW5jb2RpbmcgcyB0byBieXRlcy5cbiAgICAgIGJ5dGVzLnB1c2goZW5jb2Rlci5lbmNvZGUocykpXG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHR5cGVzLmlzQW55QXJyYXlCdWZmZXIoZWxlbWVudCkgfHxcbiAgICAgIHR5cGVzLmlzVHlwZWRBcnJheShlbGVtZW50KVxuICAgICkge1xuICAgICAgLy8gMi4gSWYgZWxlbWVudCBpcyBhIEJ1ZmZlclNvdXJjZSwgZ2V0IGEgY29weSBvZiB0aGVcbiAgICAgIC8vICAgIGJ5dGVzIGhlbGQgYnkgdGhlIGJ1ZmZlciBzb3VyY2UsIGFuZCBhcHBlbmQgdGhvc2VcbiAgICAgIC8vICAgIGJ5dGVzIHRvIGJ5dGVzLlxuICAgICAgaWYgKCFlbGVtZW50LmJ1ZmZlcikgeyAvLyBBcnJheUJ1ZmZlclxuICAgICAgICBieXRlcy5wdXNoKG5ldyBVaW50OEFycmF5KGVsZW1lbnQpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgICBuZXcgVWludDhBcnJheShlbGVtZW50LmJ1ZmZlciwgZWxlbWVudC5ieXRlT2Zmc2V0LCBlbGVtZW50LmJ5dGVMZW5ndGgpXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzQmxvYkxpa2UoZWxlbWVudCkpIHtcbiAgICAgIC8vIDMuIElmIGVsZW1lbnQgaXMgYSBCbG9iLCBhcHBlbmQgdGhlIGJ5dGVzIGl0IHJlcHJlc2VudHNcbiAgICAgIC8vICAgIHRvIGJ5dGVzLlxuICAgICAgYnl0ZXMucHVzaChlbGVtZW50KVxuICAgIH1cbiAgfVxuXG4gIC8vIDMuIFJldHVybiBieXRlcy5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvRmlsZUFQSS8jY29udmVydC1saW5lLWVuZGluZ3MtdG8tbmF0aXZlXG4gKiBAcGFyYW0ge3N0cmluZ30gc1xuICovXG5mdW5jdGlvbiBjb252ZXJ0TGluZUVuZGluZ3NOYXRpdmUgKHMpIHtcbiAgLy8gMS4gTGV0IG5hdGl2ZSBsaW5lIGVuZGluZyBiZSBiZSB0aGUgY29kZSBwb2ludCBVKzAwMEEgTEYuXG4gIGxldCBuYXRpdmVMaW5lRW5kaW5nID0gJ1xcbidcblxuICAvLyAyLiBJZiB0aGUgdW5kZXJseWluZyBwbGF0Zm9ybeKAmXMgY29udmVudGlvbnMgYXJlIHRvXG4gIC8vICAgIHJlcHJlc2VudCBuZXdsaW5lcyBhcyBhIGNhcnJpYWdlIHJldHVybiBhbmQgbGluZSBmZWVkXG4gIC8vICAgIHNlcXVlbmNlLCBzZXQgbmF0aXZlIGxpbmUgZW5kaW5nIHRvIHRoZSBjb2RlIHBvaW50XG4gIC8vICAgIFUrMDAwRCBDUiBmb2xsb3dlZCBieSB0aGUgY29kZSBwb2ludCBVKzAwMEEgTEYuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgbmF0aXZlTGluZUVuZGluZyA9ICdcXHJcXG4nXG4gIH1cblxuICByZXR1cm4gcy5yZXBsYWNlKC9cXHI/XFxuL2csIG5hdGl2ZUxpbmVFbmRpbmcpXG59XG5cbi8vIElmIHRoaXMgZnVuY3Rpb24gaXMgbW92ZWQgdG8gLi91dGlsLmpzLCBzb21lIHRvb2xzIChzdWNoIGFzXG4vLyByb2xsdXApIHdpbGwgd2FybiBhYm91dCBjaXJjdWxhciBkZXBlbmRlbmNpZXMuIFNlZTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2lzc3Vlcy8xNjI5XG5mdW5jdGlvbiBpc0ZpbGVMaWtlIChvYmplY3QpIHtcbiAgcmV0dXJuIChcbiAgICAoTmF0aXZlRmlsZSAmJiBvYmplY3QgaW5zdGFuY2VvZiBOYXRpdmVGaWxlKSB8fFxuICAgIG9iamVjdCBpbnN0YW5jZW9mIEZpbGUgfHwgKFxuICAgICAgb2JqZWN0ICYmXG4gICAgICAodHlwZW9mIG9iamVjdC5zdHJlYW0gPT09ICdmdW5jdGlvbicgfHxcbiAgICAgIHR5cGVvZiBvYmplY3QuYXJyYXlCdWZmZXIgPT09ICdmdW5jdGlvbicpICYmXG4gICAgICBvYmplY3RbU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gJ0ZpbGUnXG4gICAgKVxuICApXG59XG5cbm1vZHVsZS5leHBvcnRzID0geyBGaWxlLCBGaWxlTGlrZSwgaXNGaWxlTGlrZSB9XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBpc0Jsb2JMaWtlLCB0b1VTVlN0cmluZywgbWFrZUl0ZXJhdG9yIH0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3QgeyBrU3RhdGUgfSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IEZpbGU6IFVuZGljaUZpbGUsIEZpbGVMaWtlLCBpc0ZpbGVMaWtlIH0gPSByZXF1aXJlKCcuL2ZpbGUnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4vd2ViaWRsJylcbmNvbnN0IHsgQmxvYiwgRmlsZTogTmF0aXZlRmlsZSB9ID0gcmVxdWlyZSgnYnVmZmVyJylcblxuLyoqIEB0eXBlIHtnbG9iYWxUaGlzWydGaWxlJ119ICovXG5jb25zdCBGaWxlID0gTmF0aXZlRmlsZSA/PyBVbmRpY2lGaWxlXG5cbi8vIGh0dHBzOi8veGhyLnNwZWMud2hhdHdnLm9yZy8jZm9ybWRhdGFcbmNsYXNzIEZvcm1EYXRhIHtcbiAgY29uc3RydWN0b3IgKGZvcm0pIHtcbiAgICBpZiAoZm9ybSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmNvbnZlcnNpb25GYWlsZWQoe1xuICAgICAgICBwcmVmaXg6ICdGb3JtRGF0YSBjb25zdHJ1Y3RvcicsXG4gICAgICAgIGFyZ3VtZW50OiAnQXJndW1lbnQgMScsXG4gICAgICAgIHR5cGVzOiBbJ3VuZGVmaW5lZCddXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXNba1N0YXRlXSA9IFtdXG4gIH1cblxuICBhcHBlbmQgKG5hbWUsIHZhbHVlLCBmaWxlbmFtZSA9IHVuZGVmaW5lZCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZvcm1EYXRhKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAyLCB7IGhlYWRlcjogJ0Zvcm1EYXRhLmFwcGVuZCcgfSlcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmICFpc0Jsb2JMaWtlKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgXCJGYWlsZWQgdG8gZXhlY3V0ZSAnYXBwZW5kJyBvbiAnRm9ybURhdGEnOiBwYXJhbWV0ZXIgMiBpcyBub3Qgb2YgdHlwZSAnQmxvYidcIlxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIDEuIExldCB2YWx1ZSBiZSB2YWx1ZSBpZiBnaXZlbjsgb3RoZXJ3aXNlIGJsb2JWYWx1ZS5cblxuICAgIG5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcobmFtZSlcbiAgICB2YWx1ZSA9IGlzQmxvYkxpa2UodmFsdWUpXG4gICAgICA/IHdlYmlkbC5jb252ZXJ0ZXJzLkJsb2IodmFsdWUsIHsgc3RyaWN0OiBmYWxzZSB9KVxuICAgICAgOiB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcodmFsdWUpXG4gICAgZmlsZW5hbWUgPSBhcmd1bWVudHMubGVuZ3RoID09PSAzXG4gICAgICA/IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhmaWxlbmFtZSlcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAvLyAyLiBMZXQgZW50cnkgYmUgdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhbiBlbnRyeSB3aXRoXG4gICAgLy8gbmFtZSwgdmFsdWUsIGFuZCBmaWxlbmFtZSBpZiBnaXZlbi5cbiAgICBjb25zdCBlbnRyeSA9IG1ha2VFbnRyeShuYW1lLCB2YWx1ZSwgZmlsZW5hbWUpXG5cbiAgICAvLyAzLiBBcHBlbmQgZW50cnkgdG8gdGhpc+KAmXMgZW50cnkgbGlzdC5cbiAgICB0aGlzW2tTdGF0ZV0ucHVzaChlbnRyeSlcbiAgfVxuXG4gIGRlbGV0ZSAobmFtZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZvcm1EYXRhKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0Zvcm1EYXRhLmRlbGV0ZScgfSlcblxuICAgIG5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcobmFtZSlcblxuICAgIC8vIFRoZSBkZWxldGUobmFtZSkgbWV0aG9kIHN0ZXBzIGFyZSB0byByZW1vdmUgYWxsIGVudHJpZXMgd2hvc2UgbmFtZVxuICAgIC8vIGlzIG5hbWUgZnJvbSB0aGlz4oCZcyBlbnRyeSBsaXN0LlxuICAgIHRoaXNba1N0YXRlXSA9IHRoaXNba1N0YXRlXS5maWx0ZXIoZW50cnkgPT4gZW50cnkubmFtZSAhPT0gbmFtZSlcbiAgfVxuXG4gIGdldCAobmFtZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZvcm1EYXRhKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0Zvcm1EYXRhLmdldCcgfSlcblxuICAgIG5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcobmFtZSlcblxuICAgIC8vIDEuIElmIHRoZXJlIGlzIG5vIGVudHJ5IHdob3NlIG5hbWUgaXMgbmFtZSBpbiB0aGlz4oCZcyBlbnRyeSBsaXN0LFxuICAgIC8vIHRoZW4gcmV0dXJuIG51bGwuXG4gICAgY29uc3QgaWR4ID0gdGhpc1trU3RhdGVdLmZpbmRJbmRleCgoZW50cnkpID0+IGVudHJ5Lm5hbWUgPT09IG5hbWUpXG4gICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgLy8gMi4gUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZW50cnkgd2hvc2UgbmFtZSBpcyBuYW1lIGZyb21cbiAgICAvLyB0aGlz4oCZcyBlbnRyeSBsaXN0LlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV1baWR4XS52YWx1ZVxuICB9XG5cbiAgZ2V0QWxsIChuYW1lKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRm9ybURhdGEpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnRm9ybURhdGEuZ2V0QWxsJyB9KVxuXG4gICAgbmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhuYW1lKVxuXG4gICAgLy8gMS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgd2hvc2UgbmFtZSBpcyBuYW1lIGluIHRoaXPigJlzIGVudHJ5IGxpc3QsXG4gICAgLy8gdGhlbiByZXR1cm4gdGhlIGVtcHR5IGxpc3QuXG4gICAgLy8gMi4gUmV0dXJuIHRoZSB2YWx1ZXMgb2YgYWxsIGVudHJpZXMgd2hvc2UgbmFtZSBpcyBuYW1lLCBpbiBvcmRlcixcbiAgICAvLyBmcm9tIHRoaXPigJlzIGVudHJ5IGxpc3QuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXVxuICAgICAgLmZpbHRlcigoZW50cnkpID0+IGVudHJ5Lm5hbWUgPT09IG5hbWUpXG4gICAgICAubWFwKChlbnRyeSkgPT4gZW50cnkudmFsdWUpXG4gIH1cblxuICBoYXMgKG5hbWUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGb3JtRGF0YSlcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdGb3JtRGF0YS5oYXMnIH0pXG5cbiAgICBuYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKG5hbWUpXG5cbiAgICAvLyBUaGUgaGFzKG5hbWUpIG1ldGhvZCBzdGVwcyBhcmUgdG8gcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYW4gZW50cnlcbiAgICAvLyB3aG9zZSBuYW1lIGlzIG5hbWUgaW4gdGhpc+KAmXMgZW50cnkgbGlzdDsgb3RoZXJ3aXNlIGZhbHNlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uZmluZEluZGV4KChlbnRyeSkgPT4gZW50cnkubmFtZSA9PT0gbmFtZSkgIT09IC0xXG4gIH1cblxuICBzZXQgKG5hbWUsIHZhbHVlLCBmaWxlbmFtZSA9IHVuZGVmaW5lZCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZvcm1EYXRhKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAyLCB7IGhlYWRlcjogJ0Zvcm1EYXRhLnNldCcgfSlcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmICFpc0Jsb2JMaWtlKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgXCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2V0JyBvbiAnRm9ybURhdGEnOiBwYXJhbWV0ZXIgMiBpcyBub3Qgb2YgdHlwZSAnQmxvYidcIlxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIFRoZSBzZXQobmFtZSwgdmFsdWUpIGFuZCBzZXQobmFtZSwgYmxvYlZhbHVlLCBmaWxlbmFtZSkgbWV0aG9kIHN0ZXBzXG4gICAgLy8gYXJlOlxuXG4gICAgLy8gMS4gTGV0IHZhbHVlIGJlIHZhbHVlIGlmIGdpdmVuOyBvdGhlcndpc2UgYmxvYlZhbHVlLlxuXG4gICAgbmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhuYW1lKVxuICAgIHZhbHVlID0gaXNCbG9iTGlrZSh2YWx1ZSlcbiAgICAgID8gd2ViaWRsLmNvbnZlcnRlcnMuQmxvYih2YWx1ZSwgeyBzdHJpY3Q6IGZhbHNlIH0pXG4gICAgICA6IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyh2YWx1ZSlcbiAgICBmaWxlbmFtZSA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDNcbiAgICAgID8gdG9VU1ZTdHJpbmcoZmlsZW5hbWUpXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gICAgLy8gMi4gTGV0IGVudHJ5IGJlIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYW4gZW50cnkgd2l0aCBuYW1lLCB2YWx1ZSwgYW5kXG4gICAgLy8gZmlsZW5hbWUgaWYgZ2l2ZW4uXG4gICAgY29uc3QgZW50cnkgPSBtYWtlRW50cnkobmFtZSwgdmFsdWUsIGZpbGVuYW1lKVxuXG4gICAgLy8gMy4gSWYgdGhlcmUgYXJlIGVudHJpZXMgaW4gdGhpc+KAmXMgZW50cnkgbGlzdCB3aG9zZSBuYW1lIGlzIG5hbWUsIHRoZW5cbiAgICAvLyByZXBsYWNlIHRoZSBmaXJzdCBzdWNoIGVudHJ5IHdpdGggZW50cnkgYW5kIHJlbW92ZSB0aGUgb3RoZXJzLlxuICAgIGNvbnN0IGlkeCA9IHRoaXNba1N0YXRlXS5maW5kSW5kZXgoKGVudHJ5KSA9PiBlbnRyeS5uYW1lID09PSBuYW1lKVxuICAgIGlmIChpZHggIT09IC0xKSB7XG4gICAgICB0aGlzW2tTdGF0ZV0gPSBbXG4gICAgICAgIC4uLnRoaXNba1N0YXRlXS5zbGljZSgwLCBpZHgpLFxuICAgICAgICBlbnRyeSxcbiAgICAgICAgLi4udGhpc1trU3RhdGVdLnNsaWNlKGlkeCArIDEpLmZpbHRlcigoZW50cnkpID0+IGVudHJ5Lm5hbWUgIT09IG5hbWUpXG4gICAgICBdXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDQuIE90aGVyd2lzZSwgYXBwZW5kIGVudHJ5IHRvIHRoaXPigJlzIGVudHJ5IGxpc3QuXG4gICAgICB0aGlzW2tTdGF0ZV0ucHVzaChlbnRyeSlcbiAgICB9XG4gIH1cblxuICBlbnRyaWVzICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGb3JtRGF0YSlcblxuICAgIHJldHVybiBtYWtlSXRlcmF0b3IoXG4gICAgICAoKSA9PiB0aGlzW2tTdGF0ZV0ubWFwKHBhaXIgPT4gW3BhaXIubmFtZSwgcGFpci52YWx1ZV0pLFxuICAgICAgJ0Zvcm1EYXRhJyxcbiAgICAgICdrZXkrdmFsdWUnXG4gICAgKVxuICB9XG5cbiAga2V5cyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRm9ybURhdGEpXG5cbiAgICByZXR1cm4gbWFrZUl0ZXJhdG9yKFxuICAgICAgKCkgPT4gdGhpc1trU3RhdGVdLm1hcChwYWlyID0+IFtwYWlyLm5hbWUsIHBhaXIudmFsdWVdKSxcbiAgICAgICdGb3JtRGF0YScsXG4gICAgICAna2V5J1xuICAgIClcbiAgfVxuXG4gIHZhbHVlcyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRm9ybURhdGEpXG5cbiAgICByZXR1cm4gbWFrZUl0ZXJhdG9yKFxuICAgICAgKCkgPT4gdGhpc1trU3RhdGVdLm1hcChwYWlyID0+IFtwYWlyLm5hbWUsIHBhaXIudmFsdWVdKSxcbiAgICAgICdGb3JtRGF0YScsXG4gICAgICAndmFsdWUnXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7KHZhbHVlOiBzdHJpbmcsIGtleTogc3RyaW5nLCBzZWxmOiBGb3JtRGF0YSkgPT4gdm9pZH0gY2FsbGJhY2tGblxuICAgKiBAcGFyYW0ge3Vua25vd259IHRoaXNBcmdcbiAgICovXG4gIGZvckVhY2ggKGNhbGxiYWNrRm4sIHRoaXNBcmcgPSBnbG9iYWxUaGlzKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRm9ybURhdGEpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnRm9ybURhdGEuZm9yRWFjaCcgfSlcblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2tGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgXCJGYWlsZWQgdG8gZXhlY3V0ZSAnZm9yRWFjaCcgb24gJ0Zvcm1EYXRhJzogcGFyYW1ldGVyIDEgaXMgbm90IG9mIHR5cGUgJ0Z1bmN0aW9uJy5cIlxuICAgICAgKVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMpIHtcbiAgICAgIGNhbGxiYWNrRm4uYXBwbHkodGhpc0FyZywgW3ZhbHVlLCBrZXksIHRoaXNdKVxuICAgIH1cbiAgfVxufVxuXG5Gb3JtRGF0YS5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IEZvcm1EYXRhLnByb3RvdHlwZS5lbnRyaWVzXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEZvcm1EYXRhLnByb3RvdHlwZSwge1xuICBbU3ltYm9sLnRvU3RyaW5nVGFnXToge1xuICAgIHZhbHVlOiAnRm9ybURhdGEnLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9XG59KVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybS1jb250cm9sLWluZnJhc3RydWN0dXJlLmh0bWwjY3JlYXRlLWFuLWVudHJ5XG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtzdHJpbmd8QmxvYn0gdmFsdWVcbiAqIEBwYXJhbSB7P3N0cmluZ30gZmlsZW5hbWVcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIG1ha2VFbnRyeSAobmFtZSwgdmFsdWUsIGZpbGVuYW1lKSB7XG4gIC8vIDEuIFNldCBuYW1lIHRvIHRoZSByZXN1bHQgb2YgY29udmVydGluZyBuYW1lIGludG8gYSBzY2FsYXIgdmFsdWUgc3RyaW5nLlxuICAvLyBcIlRvIGNvbnZlcnQgYSBzdHJpbmcgaW50byBhIHNjYWxhciB2YWx1ZSBzdHJpbmcsIHJlcGxhY2UgYW55IHN1cnJvZ2F0ZXNcbiAgLy8gIHdpdGggVStGRkZELlwiXG4gIC8vIHNlZTogaHR0cHM6Ly9ub2RlanMub3JnL2Rpc3QvbGF0ZXN0LXYxOC54L2RvY3MvYXBpL2J1ZmZlci5odG1sI2J1ZnRvc3RyaW5nZW5jb2Rpbmctc3RhcnQtZW5kXG4gIG5hbWUgPSBCdWZmZXIuZnJvbShuYW1lKS50b1N0cmluZygndXRmOCcpXG5cbiAgLy8gMi4gSWYgdmFsdWUgaXMgYSBzdHJpbmcsIHRoZW4gc2V0IHZhbHVlIHRvIHRoZSByZXN1bHQgb2YgY29udmVydGluZ1xuICAvLyAgICB2YWx1ZSBpbnRvIGEgc2NhbGFyIHZhbHVlIHN0cmluZy5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICB2YWx1ZSA9IEJ1ZmZlci5mcm9tKHZhbHVlKS50b1N0cmluZygndXRmOCcpXG4gIH0gZWxzZSB7XG4gICAgLy8gMy4gT3RoZXJ3aXNlOlxuXG4gICAgLy8gMS4gSWYgdmFsdWUgaXMgbm90IGEgRmlsZSBvYmplY3QsIHRoZW4gc2V0IHZhbHVlIHRvIGEgbmV3IEZpbGUgb2JqZWN0LFxuICAgIC8vICAgIHJlcHJlc2VudGluZyB0aGUgc2FtZSBieXRlcywgd2hvc2UgbmFtZSBhdHRyaWJ1dGUgdmFsdWUgaXMgXCJibG9iXCJcbiAgICBpZiAoIWlzRmlsZUxpa2UodmFsdWUpKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlIGluc3RhbmNlb2YgQmxvYlxuICAgICAgICA/IG5ldyBGaWxlKFt2YWx1ZV0sICdibG9iJywgeyB0eXBlOiB2YWx1ZS50eXBlIH0pXG4gICAgICAgIDogbmV3IEZpbGVMaWtlKHZhbHVlLCAnYmxvYicsIHsgdHlwZTogdmFsdWUudHlwZSB9KVxuICAgIH1cblxuICAgIC8vIDIuIElmIGZpbGVuYW1lIGlzIGdpdmVuLCB0aGVuIHNldCB2YWx1ZSB0byBhIG5ldyBGaWxlIG9iamVjdCxcbiAgICAvLyAgICByZXByZXNlbnRpbmcgdGhlIHNhbWUgYnl0ZXMsIHdob3NlIG5hbWUgYXR0cmlidXRlIGlzIGZpbGVuYW1lLlxuICAgIGlmIChmaWxlbmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvKiogQHR5cGUge0ZpbGVQcm9wZXJ0eUJhZ30gKi9cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIHR5cGU6IHZhbHVlLnR5cGUsXG4gICAgICAgIGxhc3RNb2RpZmllZDogdmFsdWUubGFzdE1vZGlmaWVkXG4gICAgICB9XG5cbiAgICAgIHZhbHVlID0gKE5hdGl2ZUZpbGUgJiYgdmFsdWUgaW5zdGFuY2VvZiBOYXRpdmVGaWxlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIFVuZGljaUZpbGVcbiAgICAgICAgPyBuZXcgRmlsZShbdmFsdWVdLCBmaWxlbmFtZSwgb3B0aW9ucylcbiAgICAgICAgOiBuZXcgRmlsZUxpa2UodmFsdWUsIGZpbGVuYW1lLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuXG4gIC8vIDQuIFJldHVybiBhbiBlbnRyeSB3aG9zZSBuYW1lIGlzIG5hbWUgYW5kIHdob3NlIHZhbHVlIGlzIHZhbHVlLlxuICByZXR1cm4geyBuYW1lLCB2YWx1ZSB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0geyBGb3JtRGF0YSB9XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgQnVzYm95ID0gcmVxdWlyZSgnQGZhc3RpZnkvYnVzYm95JylcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3Qge1xuICBSZWFkYWJsZVN0cmVhbUZyb20sXG4gIGlzQmxvYkxpa2UsXG4gIGlzUmVhZGFibGVTdHJlYW1MaWtlLFxuICByZWFkYWJsZVN0cmVhbUNsb3NlLFxuICBjcmVhdGVEZWZlcnJlZFByb21pc2UsXG4gIGZ1bGx5UmVhZEJvZHlcbn0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3QgeyBGb3JtRGF0YSB9ID0gcmVxdWlyZSgnLi9mb3JtZGF0YScpXG5jb25zdCB7IGtTdGF0ZSB9ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgd2ViaWRsIH0gPSByZXF1aXJlKCcuL3dlYmlkbCcpXG5jb25zdCB7IERPTUV4Y2VwdGlvbiwgc3RydWN0dXJlZENsb25lIH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5jb25zdCB7IEJsb2IsIEZpbGU6IE5hdGl2ZUZpbGUgfSA9IHJlcXVpcmUoJ2J1ZmZlcicpXG5jb25zdCB7IGtCb2R5VXNlZCB9ID0gcmVxdWlyZSgnLi4vY29yZS9zeW1ib2xzJylcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5jb25zdCB7IGlzRXJyb3JlZCB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgaXNVaW50OEFycmF5LCBpc0FycmF5QnVmZmVyIH0gPSByZXF1aXJlKCd1dGlsL3R5cGVzJylcbmNvbnN0IHsgRmlsZTogVW5kaWNpRmlsZSB9ID0gcmVxdWlyZSgnLi9maWxlJylcbmNvbnN0IHsgcGFyc2VNSU1FVHlwZSwgc2VyaWFsaXplQU1pbWVUeXBlIH0gPSByZXF1aXJlKCcuL2RhdGFVUkwnKVxuXG5sZXQgcmFuZG9tXG50cnkge1xuICBjb25zdCBjcnlwdG8gPSByZXF1aXJlKCdub2RlOmNyeXB0bycpXG4gIHJhbmRvbSA9IChtYXgpID0+IGNyeXB0by5yYW5kb21JbnQoMCwgbWF4KVxufSBjYXRjaCB7XG4gIHJhbmRvbSA9IChtYXgpID0+IE1hdGguZmxvb3IoTWF0aC5yYW5kb20obWF4KSlcbn1cblxubGV0IFJlYWRhYmxlU3RyZWFtID0gZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbVxuXG4vKiogQHR5cGUge2dsb2JhbFRoaXNbJ0ZpbGUnXX0gKi9cbmNvbnN0IEZpbGUgPSBOYXRpdmVGaWxlID8/IFVuZGljaUZpbGVcbmNvbnN0IHRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKClcbmNvbnN0IHRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKClcblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtYm9keWluaXQtZXh0cmFjdFxuZnVuY3Rpb24gZXh0cmFjdEJvZHkgKG9iamVjdCwga2VlcGFsaXZlID0gZmFsc2UpIHtcbiAgaWYgKCFSZWFkYWJsZVN0cmVhbSkge1xuICAgIFJlYWRhYmxlU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtL3dlYicpLlJlYWRhYmxlU3RyZWFtXG4gIH1cblxuICAvLyAxLiBMZXQgc3RyZWFtIGJlIG51bGwuXG4gIGxldCBzdHJlYW0gPSBudWxsXG5cbiAgLy8gMi4gSWYgb2JqZWN0IGlzIGEgUmVhZGFibGVTdHJlYW0gb2JqZWN0LCB0aGVuIHNldCBzdHJlYW0gdG8gb2JqZWN0LlxuICBpZiAob2JqZWN0IGluc3RhbmNlb2YgUmVhZGFibGVTdHJlYW0pIHtcbiAgICBzdHJlYW0gPSBvYmplY3RcbiAgfSBlbHNlIGlmIChpc0Jsb2JMaWtlKG9iamVjdCkpIHtcbiAgICAvLyAzLiBPdGhlcndpc2UsIGlmIG9iamVjdCBpcyBhIEJsb2Igb2JqZWN0LCBzZXQgc3RyZWFtIHRvIHRoZVxuICAgIC8vICAgIHJlc3VsdCBvZiBydW5uaW5nIG9iamVjdOKAmXMgZ2V0IHN0cmVhbS5cbiAgICBzdHJlYW0gPSBvYmplY3Quc3RyZWFtKClcbiAgfSBlbHNlIHtcbiAgICAvLyA0LiBPdGhlcndpc2UsIHNldCBzdHJlYW0gdG8gYSBuZXcgUmVhZGFibGVTdHJlYW0gb2JqZWN0LCBhbmQgc2V0XG4gICAgLy8gICAgdXAgc3RyZWFtLlxuICAgIHN0cmVhbSA9IG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgICBhc3luYyBwdWxsIChjb250cm9sbGVyKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShcbiAgICAgICAgICB0eXBlb2Ygc291cmNlID09PSAnc3RyaW5nJyA/IHRleHRFbmNvZGVyLmVuY29kZShzb3VyY2UpIDogc291cmNlXG4gICAgICAgIClcbiAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gcmVhZGFibGVTdHJlYW1DbG9zZShjb250cm9sbGVyKSlcbiAgICAgIH0sXG4gICAgICBzdGFydCAoKSB7fSxcbiAgICAgIHR5cGU6IHVuZGVmaW5lZFxuICAgIH0pXG4gIH1cblxuICAvLyA1LiBBc3NlcnQ6IHN0cmVhbSBpcyBhIFJlYWRhYmxlU3RyZWFtIG9iamVjdC5cbiAgYXNzZXJ0KGlzUmVhZGFibGVTdHJlYW1MaWtlKHN0cmVhbSkpXG5cbiAgLy8gNi4gTGV0IGFjdGlvbiBiZSBudWxsLlxuICBsZXQgYWN0aW9uID0gbnVsbFxuXG4gIC8vIDcuIExldCBzb3VyY2UgYmUgbnVsbC5cbiAgbGV0IHNvdXJjZSA9IG51bGxcblxuICAvLyA4LiBMZXQgbGVuZ3RoIGJlIG51bGwuXG4gIGxldCBsZW5ndGggPSBudWxsXG5cbiAgLy8gOS4gTGV0IHR5cGUgYmUgbnVsbC5cbiAgbGV0IHR5cGUgPSBudWxsXG5cbiAgLy8gMTAuIFN3aXRjaCBvbiBvYmplY3Q6XG4gIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnc3RyaW5nJykge1xuICAgIC8vIFNldCBzb3VyY2UgdG8gdGhlIFVURi04IGVuY29kaW5nIG9mIG9iamVjdC5cbiAgICAvLyBOb3RlOiBzZXR0aW5nIHNvdXJjZSB0byBhIFVpbnQ4QXJyYXkgaGVyZSBicmVha3Mgc29tZSBtb2NraW5nIGFzc3VtcHRpb25zLlxuICAgIHNvdXJjZSA9IG9iamVjdFxuXG4gICAgLy8gU2V0IHR5cGUgdG8gYHRleHQvcGxhaW47Y2hhcnNldD1VVEYtOGAuXG4gICAgdHlwZSA9ICd0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTgnXG4gIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zKSB7XG4gICAgLy8gVVJMU2VhcmNoUGFyYW1zXG5cbiAgICAvLyBzcGVjIHNheXMgdG8gcnVuIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBvbiBib2R5Lmxpc3RcbiAgICAvLyB0aGlzIGlzIGltcGxlbWVudGVkIGluIE5vZGUuanMgYXMgYXBhcnQgb2YgYW4gVVJMU2VhcmNoUGFyYW1zIGluc3RhbmNlIHRvU3RyaW5nIG1ldGhvZFxuICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvZTQ2YzY4MGJmMmIyMTFiYmQ1MmNmOTU5Y2ExN2VlOThjN2Y2NTdmNS9saWIvaW50ZXJuYWwvdXJsLmpzI0w0OTBcbiAgICAvLyBhbmQgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvZTQ2YzY4MGJmMmIyMTFiYmQ1MmNmOTU5Y2ExN2VlOThjN2Y2NTdmNS9saWIvaW50ZXJuYWwvdXJsLmpzI0wxMTAwXG5cbiAgICAvLyBTZXQgc291cmNlIHRvIHRoZSByZXN1bHQgb2YgcnVubmluZyB0aGUgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIHNlcmlhbGl6ZXIgd2l0aCBvYmplY3TigJlzIGxpc3QuXG4gICAgc291cmNlID0gb2JqZWN0LnRvU3RyaW5nKClcblxuICAgIC8vIFNldCB0eXBlIHRvIGBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOGAuXG4gICAgdHlwZSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCdcbiAgfSBlbHNlIGlmIChpc0FycmF5QnVmZmVyKG9iamVjdCkpIHtcbiAgICAvLyBCdWZmZXJTb3VyY2UvQXJyYXlCdWZmZXJcblxuICAgIC8vIFNldCBzb3VyY2UgdG8gYSBjb3B5IG9mIHRoZSBieXRlcyBoZWxkIGJ5IG9iamVjdC5cbiAgICBzb3VyY2UgPSBuZXcgVWludDhBcnJheShvYmplY3Quc2xpY2UoKSlcbiAgfSBlbHNlIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcob2JqZWN0KSkge1xuICAgIC8vIEJ1ZmZlclNvdXJjZS9BcnJheUJ1ZmZlclZpZXdcblxuICAgIC8vIFNldCBzb3VyY2UgdG8gYSBjb3B5IG9mIHRoZSBieXRlcyBoZWxkIGJ5IG9iamVjdC5cbiAgICBzb3VyY2UgPSBuZXcgVWludDhBcnJheShvYmplY3QuYnVmZmVyLnNsaWNlKG9iamVjdC5ieXRlT2Zmc2V0LCBvYmplY3QuYnl0ZU9mZnNldCArIG9iamVjdC5ieXRlTGVuZ3RoKSlcbiAgfSBlbHNlIGlmICh1dGlsLmlzRm9ybURhdGFMaWtlKG9iamVjdCkpIHtcbiAgICBjb25zdCBib3VuZGFyeSA9IGAtLS0tZm9ybWRhdGEtdW5kaWNpLTAke2Ake3JhbmRvbSgxZTExKX1gLnBhZFN0YXJ0KDExLCAnMCcpfWBcbiAgICBjb25zdCBwcmVmaXggPSBgLS0ke2JvdW5kYXJ5fVxcclxcbkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YWBcblxuICAgIC8qISBmb3JtZGF0YS1wb2x5ZmlsbC4gTUlUIExpY2Vuc2UuIEppbW15IFfDpHJ0aW5nIDxodHRwczovL2ppbW15LndhcnRpbmcuc2Uvb3BlbnNvdXJjZT4gKi9cbiAgICBjb25zdCBlc2NhcGUgPSAoc3RyKSA9PlxuICAgICAgc3RyLnJlcGxhY2UoL1xcbi9nLCAnJTBBJykucmVwbGFjZSgvXFxyL2csICclMEQnKS5yZXBsYWNlKC9cIi9nLCAnJTIyJylcbiAgICBjb25zdCBub3JtYWxpemVMaW5lZmVlZHMgPSAodmFsdWUpID0+IHZhbHVlLnJlcGxhY2UoL1xccj9cXG58XFxyL2csICdcXHJcXG4nKVxuXG4gICAgLy8gU2V0IGFjdGlvbiB0byB0aGlzIHN0ZXA6IHJ1biB0aGUgbXVsdGlwYXJ0L2Zvcm0tZGF0YVxuICAgIC8vIGVuY29kaW5nIGFsZ29yaXRobSwgd2l0aCBvYmplY3TigJlzIGVudHJ5IGxpc3QgYW5kIFVURi04LlxuICAgIC8vIC0gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIGJvZHkgaXMgaW1tdXRhYmxlIGFuZCBjYW4ndCBiZSBjaGFuZ2VkIGFmdGVyd29yZHNcbiAgICAvLyAtIFRoYXQgdGhlIGNvbnRlbnQtbGVuZ3RoIGlzIGNhbGN1bGF0ZWQgaW4gYWR2YW5jZS5cbiAgICAvLyAtIEFuZCB0aGF0IGFsbCBwYXJ0cyBhcmUgcHJlLWVuY29kZWQgYW5kIHJlYWR5IHRvIGJlIHNlbnQuXG5cbiAgICBjb25zdCBibG9iUGFydHMgPSBbXVxuICAgIGNvbnN0IHJuID0gbmV3IFVpbnQ4QXJyYXkoWzEzLCAxMF0pIC8vICdcXHJcXG4nXG4gICAgbGVuZ3RoID0gMFxuICAgIGxldCBoYXNVbmtub3duU2l6ZVZhbHVlID0gZmFsc2VcblxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBvYmplY3QpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IGNodW5rID0gdGV4dEVuY29kZXIuZW5jb2RlKHByZWZpeCArXG4gICAgICAgICAgYDsgbmFtZT1cIiR7ZXNjYXBlKG5vcm1hbGl6ZUxpbmVmZWVkcyhuYW1lKSl9XCJgICtcbiAgICAgICAgICBgXFxyXFxuXFxyXFxuJHtub3JtYWxpemVMaW5lZmVlZHModmFsdWUpfVxcclxcbmApXG4gICAgICAgIGJsb2JQYXJ0cy5wdXNoKGNodW5rKVxuICAgICAgICBsZW5ndGggKz0gY2h1bmsuYnl0ZUxlbmd0aFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY2h1bmsgPSB0ZXh0RW5jb2Rlci5lbmNvZGUoYCR7cHJlZml4fTsgbmFtZT1cIiR7ZXNjYXBlKG5vcm1hbGl6ZUxpbmVmZWVkcyhuYW1lKSl9XCJgICtcbiAgICAgICAgICAodmFsdWUubmFtZSA/IGA7IGZpbGVuYW1lPVwiJHtlc2NhcGUodmFsdWUubmFtZSl9XCJgIDogJycpICsgJ1xcclxcbicgK1xuICAgICAgICAgIGBDb250ZW50LVR5cGU6ICR7XG4gICAgICAgICAgICB2YWx1ZS50eXBlIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXG4gICAgICAgICAgfVxcclxcblxcclxcbmApXG4gICAgICAgIGJsb2JQYXJ0cy5wdXNoKGNodW5rLCB2YWx1ZSwgcm4pXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUuc2l6ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBsZW5ndGggKz0gY2h1bmsuYnl0ZUxlbmd0aCArIHZhbHVlLnNpemUgKyBybi5ieXRlTGVuZ3RoXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGFzVW5rbm93blNpemVWYWx1ZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNodW5rID0gdGV4dEVuY29kZXIuZW5jb2RlKGAtLSR7Ym91bmRhcnl9LS1gKVxuICAgIGJsb2JQYXJ0cy5wdXNoKGNodW5rKVxuICAgIGxlbmd0aCArPSBjaHVuay5ieXRlTGVuZ3RoXG4gICAgaWYgKGhhc1Vua25vd25TaXplVmFsdWUpIHtcbiAgICAgIGxlbmd0aCA9IG51bGxcbiAgICB9XG5cbiAgICAvLyBTZXQgc291cmNlIHRvIG9iamVjdC5cbiAgICBzb3VyY2UgPSBvYmplY3RcblxuICAgIGFjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uICogKCkge1xuICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIGJsb2JQYXJ0cykge1xuICAgICAgICBpZiAocGFydC5zdHJlYW0pIHtcbiAgICAgICAgICB5aWVsZCAqIHBhcnQuc3RyZWFtKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB5aWVsZCBwYXJ0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgdHlwZSB0byBgbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9YCxcbiAgICAvLyBmb2xsb3dlZCBieSB0aGUgbXVsdGlwYXJ0L2Zvcm0tZGF0YSBib3VuZGFyeSBzdHJpbmcgZ2VuZXJhdGVkXG4gICAgLy8gYnkgdGhlIG11bHRpcGFydC9mb3JtLWRhdGEgZW5jb2RpbmcgYWxnb3JpdGhtLlxuICAgIHR5cGUgPSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9JyArIGJvdW5kYXJ5XG4gIH0gZWxzZSBpZiAoaXNCbG9iTGlrZShvYmplY3QpKSB7XG4gICAgLy8gQmxvYlxuXG4gICAgLy8gU2V0IHNvdXJjZSB0byBvYmplY3QuXG4gICAgc291cmNlID0gb2JqZWN0XG5cbiAgICAvLyBTZXQgbGVuZ3RoIHRvIG9iamVjdOKAmXMgc2l6ZS5cbiAgICBsZW5ndGggPSBvYmplY3Quc2l6ZVxuXG4gICAgLy8gSWYgb2JqZWN04oCZcyB0eXBlIGF0dHJpYnV0ZSBpcyBub3QgdGhlIGVtcHR5IGJ5dGUgc2VxdWVuY2UsIHNldFxuICAgIC8vIHR5cGUgdG8gaXRzIHZhbHVlLlxuICAgIGlmIChvYmplY3QudHlwZSkge1xuICAgICAgdHlwZSA9IG9iamVjdC50eXBlXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBvYmplY3RbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gSWYga2VlcGFsaXZlIGlzIHRydWUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKGtlZXBhbGl2ZSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigna2VlcGFsaXZlJylcbiAgICB9XG5cbiAgICAvLyBJZiBvYmplY3QgaXMgZGlzdHVyYmVkIG9yIGxvY2tlZCwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAodXRpbC5pc0Rpc3R1cmJlZChvYmplY3QpIHx8IG9iamVjdC5sb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdSZXNwb25zZSBib2R5IG9iamVjdCBzaG91bGQgbm90IGJlIGRpc3R1cmJlZCBvciBsb2NrZWQnXG4gICAgICApXG4gICAgfVxuXG4gICAgc3RyZWFtID1cbiAgICAgIG9iamVjdCBpbnN0YW5jZW9mIFJlYWRhYmxlU3RyZWFtID8gb2JqZWN0IDogUmVhZGFibGVTdHJlYW1Gcm9tKG9iamVjdClcbiAgfVxuXG4gIC8vIDExLiBJZiBzb3VyY2UgaXMgYSBieXRlIHNlcXVlbmNlLCB0aGVuIHNldCBhY3Rpb24gdG8gYVxuICAvLyBzdGVwIHRoYXQgcmV0dXJucyBzb3VyY2UgYW5kIGxlbmd0aCB0byBzb3VyY2XigJlzIGxlbmd0aC5cbiAgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnIHx8IHV0aWwuaXNCdWZmZXIoc291cmNlKSkge1xuICAgIGxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHNvdXJjZSlcbiAgfVxuXG4gIC8vIDEyLiBJZiBhY3Rpb24gaXMgbm9uLW51bGwsIHRoZW4gcnVuIHRoZXNlIHN0ZXBzIGluIGluIHBhcmFsbGVsOlxuICBpZiAoYWN0aW9uICE9IG51bGwpIHtcbiAgICAvLyBSdW4gYWN0aW9uLlxuICAgIGxldCBpdGVyYXRvclxuICAgIHN0cmVhbSA9IG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgICBhc3luYyBzdGFydCAoKSB7XG4gICAgICAgIGl0ZXJhdG9yID0gYWN0aW9uKG9iamVjdClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKClcbiAgICAgIH0sXG4gICAgICBhc3luYyBwdWxsIChjb250cm9sbGVyKSB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGF3YWl0IGl0ZXJhdG9yLm5leHQoKVxuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgIC8vIFdoZW4gcnVubmluZyBhY3Rpb24gaXMgZG9uZSwgY2xvc2Ugc3RyZWFtLlxuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gV2hlbmV2ZXIgb25lIG9yIG1vcmUgYnl0ZXMgYXJlIGF2YWlsYWJsZSBhbmQgc3RyZWFtIGlzIG5vdCBlcnJvcmVkLFxuICAgICAgICAgIC8vIGVucXVldWUgYSBVaW50OEFycmF5IHdyYXBwaW5nIGFuIEFycmF5QnVmZmVyIGNvbnRhaW5pbmcgdGhlIGF2YWlsYWJsZVxuICAgICAgICAgIC8vIGJ5dGVzIGludG8gc3RyZWFtLlxuICAgICAgICAgIGlmICghaXNFcnJvcmVkKHN0cmVhbSkpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShuZXcgVWludDhBcnJheSh2YWx1ZSkpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLmRlc2lyZWRTaXplID4gMFxuICAgICAgfSxcbiAgICAgIGFzeW5jIGNhbmNlbCAocmVhc29uKSB7XG4gICAgICAgIGF3YWl0IGl0ZXJhdG9yLnJldHVybigpXG4gICAgICB9LFxuICAgICAgdHlwZTogdW5kZWZpbmVkXG4gICAgfSlcbiAgfVxuXG4gIC8vIDEzLiBMZXQgYm9keSBiZSBhIGJvZHkgd2hvc2Ugc3RyZWFtIGlzIHN0cmVhbSwgc291cmNlIGlzIHNvdXJjZSxcbiAgLy8gYW5kIGxlbmd0aCBpcyBsZW5ndGguXG4gIGNvbnN0IGJvZHkgPSB7IHN0cmVhbSwgc291cmNlLCBsZW5ndGggfVxuXG4gIC8vIDE0LiBSZXR1cm4gKGJvZHksIHR5cGUpLlxuICByZXR1cm4gW2JvZHksIHR5cGVdXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNib2R5aW5pdC1zYWZlbHktZXh0cmFjdFxuZnVuY3Rpb24gc2FmZWx5RXh0cmFjdEJvZHkgKG9iamVjdCwga2VlcGFsaXZlID0gZmFsc2UpIHtcbiAgaWYgKCFSZWFkYWJsZVN0cmVhbSkge1xuICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgUmVhZGFibGVTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0vd2ViJykuUmVhZGFibGVTdHJlYW1cbiAgfVxuXG4gIC8vIFRvIHNhZmVseSBleHRyYWN0IGEgYm9keSBhbmQgYSBgQ29udGVudC1UeXBlYCB2YWx1ZSBmcm9tXG4gIC8vIGEgYnl0ZSBzZXF1ZW5jZSBvciBCb2R5SW5pdCBvYmplY3Qgb2JqZWN0LCBydW4gdGhlc2Ugc3RlcHM6XG5cbiAgLy8gMS4gSWYgb2JqZWN0IGlzIGEgUmVhZGFibGVTdHJlYW0gb2JqZWN0LCB0aGVuOlxuICBpZiAob2JqZWN0IGluc3RhbmNlb2YgUmVhZGFibGVTdHJlYW0pIHtcbiAgICAvLyBBc3NlcnQ6IG9iamVjdCBpcyBuZWl0aGVyIGRpc3R1cmJlZCBub3IgbG9ja2VkLlxuICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgYXNzZXJ0KCF1dGlsLmlzRGlzdHVyYmVkKG9iamVjdCksICdUaGUgYm9keSBoYXMgYWxyZWFkeSBiZWVuIGNvbnN1bWVkLicpXG4gICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICBhc3NlcnQoIW9iamVjdC5sb2NrZWQsICdUaGUgc3RyZWFtIGlzIGxvY2tlZC4nKVxuICB9XG5cbiAgLy8gMi4gUmV0dXJuIHRoZSByZXN1bHRzIG9mIGV4dHJhY3Rpbmcgb2JqZWN0LlxuICByZXR1cm4gZXh0cmFjdEJvZHkob2JqZWN0LCBrZWVwYWxpdmUpXG59XG5cbmZ1bmN0aW9uIGNsb25lQm9keSAoYm9keSkge1xuICAvLyBUbyBjbG9uZSBhIGJvZHkgYm9keSwgcnVuIHRoZXNlIHN0ZXBzOlxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWJvZHktY2xvbmVcblxuICAvLyAxLiBMZXQgwqsgb3V0MSwgb3V0MiDCuyBiZSB0aGUgcmVzdWx0IG9mIHRlZWluZyBib2R54oCZcyBzdHJlYW0uXG4gIGNvbnN0IFtvdXQxLCBvdXQyXSA9IGJvZHkuc3RyZWFtLnRlZSgpXG4gIGNvbnN0IG91dDJDbG9uZSA9IHN0cnVjdHVyZWRDbG9uZShvdXQyLCB7IHRyYW5zZmVyOiBbb3V0Ml0gfSlcbiAgLy8gVGhpcywgZm9yIHdoYXRldmVyIHJlYXNvbnMsIHVucmVmcyBvdXQyQ2xvbmUgd2hpY2ggYWxsb3dzXG4gIC8vIHRoZSBwcm9jZXNzIHRvIGV4aXQgYnkgaXRzZWxmLlxuICBjb25zdCBbLCBmaW5hbENsb25lXSA9IG91dDJDbG9uZS50ZWUoKVxuXG4gIC8vIDIuIFNldCBib2R54oCZcyBzdHJlYW0gdG8gb3V0MS5cbiAgYm9keS5zdHJlYW0gPSBvdXQxXG5cbiAgLy8gMy4gUmV0dXJuIGEgYm9keSB3aG9zZSBzdHJlYW0gaXMgb3V0MiBhbmQgb3RoZXIgbWVtYmVycyBhcmUgY29waWVkIGZyb20gYm9keS5cbiAgcmV0dXJuIHtcbiAgICBzdHJlYW06IGZpbmFsQ2xvbmUsXG4gICAgbGVuZ3RoOiBib2R5Lmxlbmd0aCxcbiAgICBzb3VyY2U6IGJvZHkuc291cmNlXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gKiBjb25zdW1lQm9keSAoYm9keSkge1xuICBpZiAoYm9keSkge1xuICAgIGlmIChpc1VpbnQ4QXJyYXkoYm9keSkpIHtcbiAgICAgIHlpZWxkIGJvZHlcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3RyZWFtID0gYm9keS5zdHJlYW1cblxuICAgICAgaWYgKHV0aWwuaXNEaXN0dXJiZWQoc3RyZWFtKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgYm9keSBoYXMgYWxyZWFkeSBiZWVuIGNvbnN1bWVkLicpXG4gICAgICB9XG5cbiAgICAgIGlmIChzdHJlYW0ubG9ja2VkKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBzdHJlYW0gaXMgbG9ja2VkLicpXG4gICAgICB9XG5cbiAgICAgIC8vIENvbXBhdC5cbiAgICAgIHN0cmVhbVtrQm9keVVzZWRdID0gdHJ1ZVxuXG4gICAgICB5aWVsZCAqIHN0cmVhbVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0aHJvd0lmQWJvcnRlZCAoc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmFib3J0ZWQpIHtcbiAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdUaGUgb3BlcmF0aW9uIHdhcyBhYm9ydGVkLicsICdBYm9ydEVycm9yJylcbiAgfVxufVxuXG5mdW5jdGlvbiBib2R5TWl4aW5NZXRob2RzIChpbnN0YW5jZSkge1xuICBjb25zdCBtZXRob2RzID0ge1xuICAgIGJsb2IgKCkge1xuICAgICAgLy8gVGhlIGJsb2IoKSBtZXRob2Qgc3RlcHMgYXJlIHRvIHJldHVybiB0aGUgcmVzdWx0IG9mXG4gICAgICAvLyBydW5uaW5nIGNvbnN1bWUgYm9keSB3aXRoIHRoaXMgYW5kIHRoZSBmb2xsb3dpbmcgc3RlcFxuICAgICAgLy8gZ2l2ZW4gYSBieXRlIHNlcXVlbmNlIGJ5dGVzOiByZXR1cm4gYSBCbG9iIHdob3NlXG4gICAgICAvLyBjb250ZW50cyBhcmUgYnl0ZXMgYW5kIHdob3NlIHR5cGUgYXR0cmlidXRlIGlzIHRoaXPigJlzXG4gICAgICAvLyBNSU1FIHR5cGUuXG4gICAgICByZXR1cm4gc3BlY0NvbnN1bWVCb2R5KHRoaXMsIChieXRlcykgPT4ge1xuICAgICAgICBsZXQgbWltZVR5cGUgPSBib2R5TWltZVR5cGUodGhpcylcblxuICAgICAgICBpZiAobWltZVR5cGUgPT09ICdmYWlsdXJlJykge1xuICAgICAgICAgIG1pbWVUeXBlID0gJydcbiAgICAgICAgfSBlbHNlIGlmIChtaW1lVHlwZSkge1xuICAgICAgICAgIG1pbWVUeXBlID0gc2VyaWFsaXplQU1pbWVUeXBlKG1pbWVUeXBlKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0dXJuIGEgQmxvYiB3aG9zZSBjb250ZW50cyBhcmUgYnl0ZXMgYW5kIHR5cGUgYXR0cmlidXRlXG4gICAgICAgIC8vIGlzIG1pbWVUeXBlLlxuICAgICAgICByZXR1cm4gbmV3IEJsb2IoW2J5dGVzXSwgeyB0eXBlOiBtaW1lVHlwZSB9KVxuICAgICAgfSwgaW5zdGFuY2UpXG4gICAgfSxcblxuICAgIGFycmF5QnVmZmVyICgpIHtcbiAgICAgIC8vIFRoZSBhcnJheUJ1ZmZlcigpIG1ldGhvZCBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoZSByZXN1bHRcbiAgICAgIC8vIG9mIHJ1bm5pbmcgY29uc3VtZSBib2R5IHdpdGggdGhpcyBhbmQgdGhlIGZvbGxvd2luZyBzdGVwXG4gICAgICAvLyBnaXZlbiBhIGJ5dGUgc2VxdWVuY2UgYnl0ZXM6IHJldHVybiBhIG5ldyBBcnJheUJ1ZmZlclxuICAgICAgLy8gd2hvc2UgY29udGVudHMgYXJlIGJ5dGVzLlxuICAgICAgcmV0dXJuIHNwZWNDb25zdW1lQm9keSh0aGlzLCAoYnl0ZXMpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ5dGVzKS5idWZmZXJcbiAgICAgIH0sIGluc3RhbmNlKVxuICAgIH0sXG5cbiAgICB0ZXh0ICgpIHtcbiAgICAgIC8vIFRoZSB0ZXh0KCkgbWV0aG9kIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhlIHJlc3VsdCBvZiBydW5uaW5nXG4gICAgICAvLyBjb25zdW1lIGJvZHkgd2l0aCB0aGlzIGFuZCBVVEYtOCBkZWNvZGUuXG4gICAgICByZXR1cm4gc3BlY0NvbnN1bWVCb2R5KHRoaXMsIHV0ZjhEZWNvZGVCeXRlcywgaW5zdGFuY2UpXG4gICAgfSxcblxuICAgIGpzb24gKCkge1xuICAgICAgLy8gVGhlIGpzb24oKSBtZXRob2Qgc3RlcHMgYXJlIHRvIHJldHVybiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmdcbiAgICAgIC8vIGNvbnN1bWUgYm9keSB3aXRoIHRoaXMgYW5kIHBhcnNlIEpTT04gZnJvbSBieXRlcy5cbiAgICAgIHJldHVybiBzcGVjQ29uc3VtZUJvZHkodGhpcywgcGFyc2VKU09ORnJvbUJ5dGVzLCBpbnN0YW5jZSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZm9ybURhdGEgKCkge1xuICAgICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgaW5zdGFuY2UpXG5cbiAgICAgIHRocm93SWZBYm9ydGVkKHRoaXNba1N0YXRlXSlcblxuICAgICAgY29uc3QgY29udGVudFR5cGUgPSB0aGlzLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKVxuXG4gICAgICAvLyBJZiBtaW1lVHlwZeKAmXMgZXNzZW5jZSBpcyBcIm11bHRpcGFydC9mb3JtLWRhdGFcIiwgdGhlbjpcbiAgICAgIGlmICgvbXVsdGlwYXJ0XFwvZm9ybS1kYXRhLy50ZXN0KGNvbnRlbnRUeXBlKSkge1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge31cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5oZWFkZXJzKSBoZWFkZXJzW2tleS50b0xvd2VyQ2FzZSgpXSA9IHZhbHVlXG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2VGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG5cbiAgICAgICAgbGV0IGJ1c2JveVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYnVzYm95ID0gbmV3IEJ1c2JveSh7XG4gICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgcHJlc2VydmVQYXRoOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihgJHtlcnJ9YCwgJ0Fib3J0RXJyb3InKVxuICAgICAgICB9XG5cbiAgICAgICAgYnVzYm95Lm9uKCdmaWVsZCcsIChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgIHJlc3BvbnNlRm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICB9KVxuICAgICAgICBidXNib3kub24oJ2ZpbGUnLCAobmFtZSwgdmFsdWUsIGZpbGVuYW1lLCBlbmNvZGluZywgbWltZVR5cGUpID0+IHtcbiAgICAgICAgICBjb25zdCBjaHVua3MgPSBbXVxuXG4gICAgICAgICAgaWYgKGVuY29kaW5nID09PSAnYmFzZTY0JyB8fCBlbmNvZGluZy50b0xvd2VyQ2FzZSgpID09PSAnYmFzZTY0Jykge1xuICAgICAgICAgICAgbGV0IGJhc2U2NGNodW5rID0gJydcblxuICAgICAgICAgICAgdmFsdWUub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICAgICAgICAgICAgYmFzZTY0Y2h1bmsgKz0gY2h1bmsudG9TdHJpbmcoKS5yZXBsYWNlKC9bXFxyXFxuXS9nbSwgJycpXG5cbiAgICAgICAgICAgICAgY29uc3QgZW5kID0gYmFzZTY0Y2h1bmsubGVuZ3RoIC0gYmFzZTY0Y2h1bmsubGVuZ3RoICUgNFxuICAgICAgICAgICAgICBjaHVua3MucHVzaChCdWZmZXIuZnJvbShiYXNlNjRjaHVuay5zbGljZSgwLCBlbmQpLCAnYmFzZTY0JykpXG5cbiAgICAgICAgICAgICAgYmFzZTY0Y2h1bmsgPSBiYXNlNjRjaHVuay5zbGljZShlbmQpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdmFsdWUub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgY2h1bmtzLnB1c2goQnVmZmVyLmZyb20oYmFzZTY0Y2h1bmssICdiYXNlNjQnKSlcbiAgICAgICAgICAgICAgcmVzcG9uc2VGb3JtRGF0YS5hcHBlbmQobmFtZSwgbmV3IEZpbGUoY2h1bmtzLCBmaWxlbmFtZSwgeyB0eXBlOiBtaW1lVHlwZSB9KSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlLm9uKCdkYXRhJywgKGNodW5rKSA9PiB7XG4gICAgICAgICAgICAgIGNodW5rcy5wdXNoKGNodW5rKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHZhbHVlLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgIHJlc3BvbnNlRm9ybURhdGEuYXBwZW5kKG5hbWUsIG5ldyBGaWxlKGNodW5rcywgZmlsZW5hbWUsIHsgdHlwZTogbWltZVR5cGUgfSkpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBidXNib3lSZXNvbHZlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGJ1c2JveS5vbignZmluaXNoJywgcmVzb2x2ZSlcbiAgICAgICAgICBidXNib3kub24oJ2Vycm9yJywgKGVycikgPT4gcmVqZWN0KG5ldyBUeXBlRXJyb3IoZXJyKSkpXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHRoaXMuYm9keSAhPT0gbnVsbCkgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBjb25zdW1lQm9keSh0aGlzW2tTdGF0ZV0uYm9keSkpIGJ1c2JveS53cml0ZShjaHVuaylcbiAgICAgICAgYnVzYm95LmVuZCgpXG4gICAgICAgIGF3YWl0IGJ1c2JveVJlc29sdmVcblxuICAgICAgICByZXR1cm4gcmVzcG9uc2VGb3JtRGF0YVxuICAgICAgfSBlbHNlIGlmICgvYXBwbGljYXRpb25cXC94LXd3dy1mb3JtLXVybGVuY29kZWQvLnRlc3QoY29udGVudFR5cGUpKSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSwgaWYgbWltZVR5cGXigJlzIGVzc2VuY2UgaXMgXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIiwgdGhlbjpcblxuICAgICAgICAvLyAxLiBMZXQgZW50cmllcyBiZSB0aGUgcmVzdWx0IG9mIHBhcnNpbmcgYnl0ZXMuXG4gICAgICAgIGxldCBlbnRyaWVzXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGV0IHRleHQgPSAnJ1xuICAgICAgICAgIC8vIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBwYXJzZXIgd2lsbCBrZWVwIHRoZSBCT00uXG4gICAgICAgICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LXVybGVuY29kZWQtcGFyc2VyXG4gICAgICAgICAgLy8gTm90ZSB0aGF0IHN0cmVhbWluZyBkZWNvZGVyIGlzIHN0YXRlZnVsIGFuZCBjYW5ub3QgYmUgcmV1c2VkXG4gICAgICAgICAgY29uc3Qgc3RyZWFtaW5nRGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTgnLCB7IGlnbm9yZUJPTTogdHJ1ZSB9KVxuXG4gICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBjb25zdW1lQm9keSh0aGlzW2tTdGF0ZV0uYm9keSkpIHtcbiAgICAgICAgICAgIGlmICghaXNVaW50OEFycmF5KGNodW5rKSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBVaW50OEFycmF5IGNodW5rJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRleHQgKz0gc3RyZWFtaW5nRGVjb2Rlci5kZWNvZGUoY2h1bmssIHsgc3RyZWFtOiB0cnVlIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIHRleHQgKz0gc3RyZWFtaW5nRGVjb2Rlci5kZWNvZGUoKVxuICAgICAgICAgIGVudHJpZXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHRleHQpXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBVbmNsZWFyIHdoZW4gbmV3IFVSTFNlYXJjaFBhcmFtcyBjYW4gZmFpbCBvbiBhIHN0cmluZy5cbiAgICAgICAgICAvLyAyLiBJZiBlbnRyaWVzIGlzIGZhaWx1cmUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgVHlwZUVycm9yKCksIHsgY2F1c2U6IGVyciB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMy4gUmV0dXJuIGEgbmV3IEZvcm1EYXRhIG9iamVjdCB3aG9zZSBlbnRyaWVzIGFyZSBlbnRyaWVzLlxuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3JtRGF0YVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2FpdCBhIHRpY2sgYmVmb3JlIGNoZWNraW5nIGlmIHRoZSByZXF1ZXN0IGhhcyBiZWVuIGFib3J0ZWQuXG4gICAgICAgIC8vIE90aGVyd2lzZSwgYSBUeXBlRXJyb3IgY2FuIGJlIHRocm93biB3aGVuIGFuIEFib3J0RXJyb3Igc2hvdWxkLlxuICAgICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKVxuXG4gICAgICAgIHRocm93SWZBYm9ydGVkKHRoaXNba1N0YXRlXSlcblxuICAgICAgICAvLyBPdGhlcndpc2UsIHRocm93IGEgVHlwZUVycm9yLlxuICAgICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgaGVhZGVyOiBgJHtpbnN0YW5jZS5uYW1lfS5mb3JtRGF0YWAsXG4gICAgICAgICAgbWVzc2FnZTogJ0NvdWxkIG5vdCBwYXJzZSBjb250ZW50IGFzIEZvcm1EYXRhLidcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWV0aG9kc1xufVxuXG5mdW5jdGlvbiBtaXhpbkJvZHkgKHByb3RvdHlwZSkge1xuICBPYmplY3QuYXNzaWduKHByb3RvdHlwZS5wcm90b3R5cGUsIGJvZHlNaXhpbk1ldGhvZHMocHJvdG90eXBlKSlcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWJvZHktY29uc3VtZS1ib2R5XG4gKiBAcGFyYW0ge1Jlc3BvbnNlfFJlcXVlc3R9IG9iamVjdFxuICogQHBhcmFtIHsodmFsdWU6IHVua25vd24pID0+IHVua25vd259IGNvbnZlcnRCeXRlc1RvSlNWYWx1ZVxuICogQHBhcmFtIHtSZXNwb25zZXxSZXF1ZXN0fSBpbnN0YW5jZVxuICovXG5hc3luYyBmdW5jdGlvbiBzcGVjQ29uc3VtZUJvZHkgKG9iamVjdCwgY29udmVydEJ5dGVzVG9KU1ZhbHVlLCBpbnN0YW5jZSkge1xuICB3ZWJpZGwuYnJhbmRDaGVjayhvYmplY3QsIGluc3RhbmNlKVxuXG4gIHRocm93SWZBYm9ydGVkKG9iamVjdFtrU3RhdGVdKVxuXG4gIC8vIDEuIElmIG9iamVjdCBpcyB1bnVzYWJsZSwgdGhlbiByZXR1cm4gYSBwcm9taXNlIHJlamVjdGVkXG4gIC8vICAgIHdpdGggYSBUeXBlRXJyb3IuXG4gIGlmIChib2R5VW51c2FibGUob2JqZWN0W2tTdGF0ZV0uYm9keSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCb2R5IGlzIHVudXNhYmxlJylcbiAgfVxuXG4gIC8vIDIuIExldCBwcm9taXNlIGJlIGEgbmV3IHByb21pc2UuXG4gIGNvbnN0IHByb21pc2UgPSBjcmVhdGVEZWZlcnJlZFByb21pc2UoKVxuXG4gIC8vIDMuIExldCBlcnJvclN0ZXBzIGdpdmVuIGVycm9yIGJlIHRvIHJlamVjdCBwcm9taXNlIHdpdGggZXJyb3IuXG4gIGNvbnN0IGVycm9yU3RlcHMgPSAoZXJyb3IpID0+IHByb21pc2UucmVqZWN0KGVycm9yKVxuXG4gIC8vIDQuIExldCBzdWNjZXNzU3RlcHMgZ2l2ZW4gYSBieXRlIHNlcXVlbmNlIGRhdGEgYmUgdG8gcmVzb2x2ZVxuICAvLyAgICBwcm9taXNlIHdpdGggdGhlIHJlc3VsdCBvZiBydW5uaW5nIGNvbnZlcnRCeXRlc1RvSlNWYWx1ZVxuICAvLyAgICB3aXRoIGRhdGEuIElmIHRoYXQgdGhyZXcgYW4gZXhjZXB0aW9uLCB0aGVuIHJ1biBlcnJvclN0ZXBzXG4gIC8vICAgIHdpdGggdGhhdCBleGNlcHRpb24uXG4gIGNvbnN0IHN1Y2Nlc3NTdGVwcyA9IChkYXRhKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHByb21pc2UucmVzb2x2ZShjb252ZXJ0Qnl0ZXNUb0pTVmFsdWUoZGF0YSkpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JTdGVwcyhlKVxuICAgIH1cbiAgfVxuXG4gIC8vIDUuIElmIG9iamVjdOKAmXMgYm9keSBpcyBudWxsLCB0aGVuIHJ1biBzdWNjZXNzU3RlcHMgd2l0aCBhblxuICAvLyAgICBlbXB0eSBieXRlIHNlcXVlbmNlLlxuICBpZiAob2JqZWN0W2tTdGF0ZV0uYm9keSA9PSBudWxsKSB7XG4gICAgc3VjY2Vzc1N0ZXBzKG5ldyBVaW50OEFycmF5KCkpXG4gICAgcmV0dXJuIHByb21pc2UucHJvbWlzZVxuICB9XG5cbiAgLy8gNi4gT3RoZXJ3aXNlLCBmdWxseSByZWFkIG9iamVjdOKAmXMgYm9keSBnaXZlbiBzdWNjZXNzU3RlcHMsXG4gIC8vICAgIGVycm9yU3RlcHMsIGFuZCBvYmplY3TigJlzIHJlbGV2YW50IGdsb2JhbCBvYmplY3QuXG4gIGF3YWl0IGZ1bGx5UmVhZEJvZHkob2JqZWN0W2tTdGF0ZV0uYm9keSwgc3VjY2Vzc1N0ZXBzLCBlcnJvclN0ZXBzKVxuXG4gIC8vIDcuIFJldHVybiBwcm9taXNlLlxuICByZXR1cm4gcHJvbWlzZS5wcm9taXNlXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNib2R5LXVudXNhYmxlXG5mdW5jdGlvbiBib2R5VW51c2FibGUgKGJvZHkpIHtcbiAgLy8gQW4gb2JqZWN0IGluY2x1ZGluZyB0aGUgQm9keSBpbnRlcmZhY2UgbWl4aW4gaXNcbiAgLy8gc2FpZCB0byBiZSB1bnVzYWJsZSBpZiBpdHMgYm9keSBpcyBub24tbnVsbCBhbmRcbiAgLy8gaXRzIGJvZHnigJlzIHN0cmVhbSBpcyBkaXN0dXJiZWQgb3IgbG9ja2VkLlxuICByZXR1cm4gYm9keSAhPSBudWxsICYmIChib2R5LnN0cmVhbS5sb2NrZWQgfHwgdXRpbC5pc0Rpc3R1cmJlZChib2R5LnN0cmVhbSkpXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2VuY29kaW5nLnNwZWMud2hhdHdnLm9yZy8jdXRmLTgtZGVjb2RlXG4gKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyXG4gKi9cbmZ1bmN0aW9uIHV0ZjhEZWNvZGVCeXRlcyAoYnVmZmVyKSB7XG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyAxLiBMZXQgYnVmZmVyIGJlIHRoZSByZXN1bHQgb2YgcGVla2luZyB0aHJlZSBieXRlcyBmcm9tXG4gIC8vICAgIGlvUXVldWUsIGNvbnZlcnRlZCB0byBhIGJ5dGUgc2VxdWVuY2UuXG5cbiAgLy8gMi4gSWYgYnVmZmVyIGlzIDB4RUYgMHhCQiAweEJGLCB0aGVuIHJlYWQgdGhyZWVcbiAgLy8gICAgYnl0ZXMgZnJvbSBpb1F1ZXVlLiAoRG8gbm90aGluZyB3aXRoIHRob3NlIGJ5dGVzLilcbiAgaWYgKGJ1ZmZlclswXSA9PT0gMHhFRiAmJiBidWZmZXJbMV0gPT09IDB4QkIgJiYgYnVmZmVyWzJdID09PSAweEJGKSB7XG4gICAgYnVmZmVyID0gYnVmZmVyLnN1YmFycmF5KDMpXG4gIH1cblxuICAvLyAzLiBQcm9jZXNzIGEgcXVldWUgd2l0aCBhbiBpbnN0YW5jZSBvZiBVVEYtOOKAmXNcbiAgLy8gICAgZGVjb2RlciwgaW9RdWV1ZSwgb3V0cHV0LCBhbmQgXCJyZXBsYWNlbWVudFwiLlxuICBjb25zdCBvdXRwdXQgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoYnVmZmVyKVxuXG4gIC8vIDQuIFJldHVybiBvdXRwdXQuXG4gIHJldHVybiBvdXRwdXRcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNwYXJzZS1qc29uLWJ5dGVzLXRvLWEtamF2YXNjcmlwdC12YWx1ZVxuICogQHBhcmFtIHtVaW50OEFycmF5fSBieXRlc1xuICovXG5mdW5jdGlvbiBwYXJzZUpTT05Gcm9tQnl0ZXMgKGJ5dGVzKSB7XG4gIHJldHVybiBKU09OLnBhcnNlKHV0ZjhEZWNvZGVCeXRlcyhieXRlcykpXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1ib2R5LW1pbWUtdHlwZVxuICogQHBhcmFtIHtpbXBvcnQoJy4vcmVzcG9uc2UnKS5SZXNwb25zZXxpbXBvcnQoJy4vcmVxdWVzdCcpLlJlcXVlc3R9IG9iamVjdFxuICovXG5mdW5jdGlvbiBib2R5TWltZVR5cGUgKG9iamVjdCkge1xuICBjb25zdCB7IGhlYWRlcnNMaXN0IH0gPSBvYmplY3Rba1N0YXRlXVxuICBjb25zdCBjb250ZW50VHlwZSA9IGhlYWRlcnNMaXN0LmdldCgnY29udGVudC10eXBlJylcblxuICBpZiAoY29udGVudFR5cGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gIH1cblxuICByZXR1cm4gcGFyc2VNSU1FVHlwZShjb250ZW50VHlwZSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGV4dHJhY3RCb2R5LFxuICBzYWZlbHlFeHRyYWN0Qm9keSxcbiAgY2xvbmVCb2R5LFxuICBtaXhpbkJvZHlcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7XG4gIEludmFsaWRBcmd1bWVudEVycm9yLFxuICBOb3RTdXBwb3J0ZWRFcnJvclxufSA9IHJlcXVpcmUoJy4vZXJyb3JzJylcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5jb25zdCB7IGtIVFRQMkJ1aWxkUmVxdWVzdCwga0hUVFAyQ29weUhlYWRlcnMsIGtIVFRQMUJ1aWxkUmVxdWVzdCB9ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKVxuXG4vLyB0b2tlblJlZ0V4cCBhbmQgaGVhZGVyQ2hhclJlZ2V4IGhhdmUgYmVlbiBsaWZ0ZWQgZnJvbVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvbWFpbi9saWIvX2h0dHBfY29tbW9uLmpzXG5cbi8qKlxuICogVmVyaWZpZXMgdGhhdCB0aGUgZ2l2ZW4gdmFsIGlzIGEgdmFsaWQgSFRUUCB0b2tlblxuICogcGVyIHRoZSBydWxlcyBkZWZpbmVkIGluIFJGQyA3MjMwXG4gKiBTZWUgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzAjc2VjdGlvbi0zLjIuNlxuICovXG5jb25zdCB0b2tlblJlZ0V4cCA9IC9eW1xcXl9gYS16QS1aXFwtMC05ISMkJSYnKisufH5dKyQvXG5cbi8qKlxuICogTWF0Y2hlcyBpZiB2YWwgY29udGFpbnMgYW4gaW52YWxpZCBmaWVsZC12Y2hhclxuICogIGZpZWxkLXZhbHVlICAgID0gKiggZmllbGQtY29udGVudCAvIG9icy1mb2xkIClcbiAqICBmaWVsZC1jb250ZW50ICA9IGZpZWxkLXZjaGFyIFsgMSooIFNQIC8gSFRBQiApIGZpZWxkLXZjaGFyIF1cbiAqICBmaWVsZC12Y2hhciAgICA9IFZDSEFSIC8gb2JzLXRleHRcbiAqL1xuY29uc3QgaGVhZGVyQ2hhclJlZ2V4ID0gL1teXFx0XFx4MjAtXFx4N2VcXHg4MC1cXHhmZl0vXG5cbi8vIFZlcmlmaWVzIHRoYXQgYSBnaXZlbiBwYXRoIGlzIHZhbGlkIGRvZXMgbm90IGNvbnRhaW4gY29udHJvbCBjaGFycyBcXHgwMCB0byBcXHgyMFxuY29uc3QgaW52YWxpZFBhdGhSZWdleCA9IC9bXlxcdTAwMjEtXFx1MDBmZl0vXG5cbmNvbnN0IGtIYW5kbGVyID0gU3ltYm9sKCdoYW5kbGVyJylcblxuY29uc3QgY2hhbm5lbHMgPSB7fVxuXG5sZXQgZXh0cmFjdEJvZHlcblxudHJ5IHtcbiAgY29uc3QgZGlhZ25vc3RpY3NDaGFubmVsID0gcmVxdWlyZSgnZGlhZ25vc3RpY3NfY2hhbm5lbCcpXG4gIGNoYW5uZWxzLmNyZWF0ZSA9IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6cmVxdWVzdDpjcmVhdGUnKVxuICBjaGFubmVscy5ib2R5U2VudCA9IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6cmVxdWVzdDpib2R5U2VudCcpXG4gIGNoYW5uZWxzLmhlYWRlcnMgPSBkaWFnbm9zdGljc0NoYW5uZWwuY2hhbm5lbCgndW5kaWNpOnJlcXVlc3Q6aGVhZGVycycpXG4gIGNoYW5uZWxzLnRyYWlsZXJzID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTpyZXF1ZXN0OnRyYWlsZXJzJylcbiAgY2hhbm5lbHMuZXJyb3IgPSBkaWFnbm9zdGljc0NoYW5uZWwuY2hhbm5lbCgndW5kaWNpOnJlcXVlc3Q6ZXJyb3InKVxufSBjYXRjaCB7XG4gIGNoYW5uZWxzLmNyZWF0ZSA9IHsgaGFzU3Vic2NyaWJlcnM6IGZhbHNlIH1cbiAgY2hhbm5lbHMuYm9keVNlbnQgPSB7IGhhc1N1YnNjcmliZXJzOiBmYWxzZSB9XG4gIGNoYW5uZWxzLmhlYWRlcnMgPSB7IGhhc1N1YnNjcmliZXJzOiBmYWxzZSB9XG4gIGNoYW5uZWxzLnRyYWlsZXJzID0geyBoYXNTdWJzY3JpYmVyczogZmFsc2UgfVxuICBjaGFubmVscy5lcnJvciA9IHsgaGFzU3Vic2NyaWJlcnM6IGZhbHNlIH1cbn1cblxuY2xhc3MgUmVxdWVzdCB7XG4gIGNvbnN0cnVjdG9yIChvcmlnaW4sIHtcbiAgICBwYXRoLFxuICAgIG1ldGhvZCxcbiAgICBib2R5LFxuICAgIGhlYWRlcnMsXG4gICAgcXVlcnksXG4gICAgaWRlbXBvdGVudCxcbiAgICBibG9ja2luZyxcbiAgICB1cGdyYWRlLFxuICAgIGhlYWRlcnNUaW1lb3V0LFxuICAgIGJvZHlUaW1lb3V0LFxuICAgIHJlc2V0LFxuICAgIHRocm93T25FcnJvcixcbiAgICBleHBlY3RDb250aW51ZVxuICB9LCBoYW5kbGVyKSB7XG4gICAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdwYXRoIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBwYXRoWzBdICE9PSAnLycgJiZcbiAgICAgICEocGF0aC5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgcGF0aC5zdGFydHNXaXRoKCdodHRwczovLycpKSAmJlxuICAgICAgbWV0aG9kICE9PSAnQ09OTkVDVCdcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcigncGF0aCBtdXN0IGJlIGFuIGFic29sdXRlIFVSTCBvciBzdGFydCB3aXRoIGEgc2xhc2gnKVxuICAgIH0gZWxzZSBpZiAoaW52YWxpZFBhdGhSZWdleC5leGVjKHBhdGgpICE9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgcmVxdWVzdCBwYXRoJylcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG1ldGhvZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignbWV0aG9kIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH0gZWxzZSBpZiAodG9rZW5SZWdFeHAuZXhlYyhtZXRob2QpID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgcmVxdWVzdCBtZXRob2QnKVxuICAgIH1cblxuICAgIGlmICh1cGdyYWRlICYmIHR5cGVvZiB1cGdyYWRlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCd1cGdyYWRlIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cblxuICAgIGlmIChoZWFkZXJzVGltZW91dCAhPSBudWxsICYmICghTnVtYmVyLmlzRmluaXRlKGhlYWRlcnNUaW1lb3V0KSB8fCBoZWFkZXJzVGltZW91dCA8IDApKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgaGVhZGVyc1RpbWVvdXQnKVxuICAgIH1cblxuICAgIGlmIChib2R5VGltZW91dCAhPSBudWxsICYmICghTnVtYmVyLmlzRmluaXRlKGJvZHlUaW1lb3V0KSB8fCBib2R5VGltZW91dCA8IDApKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgYm9keVRpbWVvdXQnKVxuICAgIH1cblxuICAgIGlmIChyZXNldCAhPSBudWxsICYmIHR5cGVvZiByZXNldCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgcmVzZXQnKVxuICAgIH1cblxuICAgIGlmIChleHBlY3RDb250aW51ZSAhPSBudWxsICYmIHR5cGVvZiBleHBlY3RDb250aW51ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgZXhwZWN0Q29udGludWUnKVxuICAgIH1cblxuICAgIHRoaXMuaGVhZGVyc1RpbWVvdXQgPSBoZWFkZXJzVGltZW91dFxuXG4gICAgdGhpcy5ib2R5VGltZW91dCA9IGJvZHlUaW1lb3V0XG5cbiAgICB0aGlzLnRocm93T25FcnJvciA9IHRocm93T25FcnJvciA9PT0gdHJ1ZVxuXG4gICAgdGhpcy5tZXRob2QgPSBtZXRob2RcblxuICAgIHRoaXMuYWJvcnQgPSBudWxsXG5cbiAgICBpZiAoYm9keSA9PSBudWxsKSB7XG4gICAgICB0aGlzLmJvZHkgPSBudWxsXG4gICAgfSBlbHNlIGlmICh1dGlsLmlzU3RyZWFtKGJvZHkpKSB7XG4gICAgICB0aGlzLmJvZHkgPSBib2R5XG5cbiAgICAgIGNvbnN0IHJTdGF0ZSA9IHRoaXMuYm9keS5fcmVhZGFibGVTdGF0ZVxuICAgICAgaWYgKCFyU3RhdGUgfHwgIXJTdGF0ZS5hdXRvRGVzdHJveSkge1xuICAgICAgICB0aGlzLmVuZEhhbmRsZXIgPSBmdW5jdGlvbiBhdXRvRGVzdHJveSAoKSB7XG4gICAgICAgICAgdXRpbC5kZXN0cm95KHRoaXMpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ib2R5Lm9uKCdlbmQnLCB0aGlzLmVuZEhhbmRsZXIpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuZXJyb3JIYW5kbGVyID0gZXJyID0+IHtcbiAgICAgICAgaWYgKHRoaXMuYWJvcnQpIHtcbiAgICAgICAgICB0aGlzLmFib3J0KGVycilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVycm9yID0gZXJyXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuYm9keS5vbignZXJyb3InLCB0aGlzLmVycm9ySGFuZGxlcilcbiAgICB9IGVsc2UgaWYgKHV0aWwuaXNCdWZmZXIoYm9keSkpIHtcbiAgICAgIHRoaXMuYm9keSA9IGJvZHkuYnl0ZUxlbmd0aCA/IGJvZHkgOiBudWxsXG4gICAgfSBlbHNlIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoYm9keSkpIHtcbiAgICAgIHRoaXMuYm9keSA9IGJvZHkuYnVmZmVyLmJ5dGVMZW5ndGggPyBCdWZmZXIuZnJvbShib2R5LmJ1ZmZlciwgYm9keS5ieXRlT2Zmc2V0LCBib2R5LmJ5dGVMZW5ndGgpIDogbnVsbFxuICAgIH0gZWxzZSBpZiAoYm9keSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICB0aGlzLmJvZHkgPSBib2R5LmJ5dGVMZW5ndGggPyBCdWZmZXIuZnJvbShib2R5KSA6IG51bGxcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5ib2R5ID0gYm9keS5sZW5ndGggPyBCdWZmZXIuZnJvbShib2R5KSA6IG51bGxcbiAgICB9IGVsc2UgaWYgKHV0aWwuaXNGb3JtRGF0YUxpa2UoYm9keSkgfHwgdXRpbC5pc0l0ZXJhYmxlKGJvZHkpIHx8IHV0aWwuaXNCbG9iTGlrZShib2R5KSkge1xuICAgICAgdGhpcy5ib2R5ID0gYm9keVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2JvZHkgbXVzdCBiZSBhIHN0cmluZywgYSBCdWZmZXIsIGEgUmVhZGFibGUgc3RyZWFtLCBhbiBpdGVyYWJsZSwgb3IgYW4gYXN5bmMgaXRlcmFibGUnKVxuICAgIH1cblxuICAgIHRoaXMuY29tcGxldGVkID0gZmFsc2VcblxuICAgIHRoaXMuYWJvcnRlZCA9IGZhbHNlXG5cbiAgICB0aGlzLnVwZ3JhZGUgPSB1cGdyYWRlIHx8IG51bGxcblxuICAgIHRoaXMucGF0aCA9IHF1ZXJ5ID8gdXRpbC5idWlsZFVSTChwYXRoLCBxdWVyeSkgOiBwYXRoXG5cbiAgICB0aGlzLm9yaWdpbiA9IG9yaWdpblxuXG4gICAgdGhpcy5pZGVtcG90ZW50ID0gaWRlbXBvdGVudCA9PSBudWxsXG4gICAgICA/IG1ldGhvZCA9PT0gJ0hFQUQnIHx8IG1ldGhvZCA9PT0gJ0dFVCdcbiAgICAgIDogaWRlbXBvdGVudFxuXG4gICAgdGhpcy5ibG9ja2luZyA9IGJsb2NraW5nID09IG51bGwgPyBmYWxzZSA6IGJsb2NraW5nXG5cbiAgICB0aGlzLnJlc2V0ID0gcmVzZXQgPT0gbnVsbCA/IG51bGwgOiByZXNldFxuXG4gICAgdGhpcy5ob3N0ID0gbnVsbFxuXG4gICAgdGhpcy5jb250ZW50TGVuZ3RoID0gbnVsbFxuXG4gICAgdGhpcy5jb250ZW50VHlwZSA9IG51bGxcblxuICAgIHRoaXMuaGVhZGVycyA9ICcnXG5cbiAgICAvLyBPbmx5IGZvciBIMlxuICAgIHRoaXMuZXhwZWN0Q29udGludWUgPSBleHBlY3RDb250aW51ZSAhPSBudWxsID8gZXhwZWN0Q29udGludWUgOiBmYWxzZVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaGVhZGVycykpIHtcbiAgICAgIGlmIChoZWFkZXJzLmxlbmd0aCAlIDIgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdoZWFkZXJzIGFycmF5IG11c3QgYmUgZXZlbicpXG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgcHJvY2Vzc0hlYWRlcih0aGlzLCBoZWFkZXJzW2ldLCBoZWFkZXJzW2kgKyAxXSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGhlYWRlcnMgJiYgdHlwZW9mIGhlYWRlcnMgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaGVhZGVycylcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldXG4gICAgICAgIHByb2Nlc3NIZWFkZXIodGhpcywga2V5LCBoZWFkZXJzW2tleV0pXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChoZWFkZXJzICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaGVhZGVycyBtdXN0IGJlIGFuIG9iamVjdCBvciBhbiBhcnJheScpXG4gICAgfVxuXG4gICAgaWYgKHV0aWwuaXNGb3JtRGF0YUxpa2UodGhpcy5ib2R5KSkge1xuICAgICAgaWYgKHV0aWwubm9kZU1ham9yIDwgMTYgfHwgKHV0aWwubm9kZU1ham9yID09PSAxNiAmJiB1dGlsLm5vZGVNaW5vciA8IDgpKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignRm9ybS1EYXRhIGJvZGllcyBhcmUgb25seSBzdXBwb3J0ZWQgaW4gbm9kZSB2MTYuOCBhbmQgbmV3ZXIuJylcbiAgICAgIH1cblxuICAgICAgaWYgKCFleHRyYWN0Qm9keSkge1xuICAgICAgICBleHRyYWN0Qm9keSA9IHJlcXVpcmUoJy4uL2ZldGNoL2JvZHkuanMnKS5leHRyYWN0Qm9keVxuICAgICAgfVxuXG4gICAgICBjb25zdCBbYm9keVN0cmVhbSwgY29udGVudFR5cGVdID0gZXh0cmFjdEJvZHkoYm9keSlcbiAgICAgIGlmICh0aGlzLmNvbnRlbnRUeXBlID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlXG4gICAgICAgIHRoaXMuaGVhZGVycyArPSBgY29udGVudC10eXBlOiAke2NvbnRlbnRUeXBlfVxcclxcbmBcbiAgICAgIH1cbiAgICAgIHRoaXMuYm9keSA9IGJvZHlTdHJlYW0uc3RyZWFtXG4gICAgICB0aGlzLmNvbnRlbnRMZW5ndGggPSBib2R5U3RyZWFtLmxlbmd0aFxuICAgIH0gZWxzZSBpZiAodXRpbC5pc0Jsb2JMaWtlKGJvZHkpICYmIHRoaXMuY29udGVudFR5cGUgPT0gbnVsbCAmJiBib2R5LnR5cGUpIHtcbiAgICAgIHRoaXMuY29udGVudFR5cGUgPSBib2R5LnR5cGVcbiAgICAgIHRoaXMuaGVhZGVycyArPSBgY29udGVudC10eXBlOiAke2JvZHkudHlwZX1cXHJcXG5gXG4gICAgfVxuXG4gICAgdXRpbC52YWxpZGF0ZUhhbmRsZXIoaGFuZGxlciwgbWV0aG9kLCB1cGdyYWRlKVxuXG4gICAgdGhpcy5zZXJ2ZXJuYW1lID0gdXRpbC5nZXRTZXJ2ZXJOYW1lKHRoaXMuaG9zdClcblxuICAgIHRoaXNba0hhbmRsZXJdID0gaGFuZGxlclxuXG4gICAgaWYgKGNoYW5uZWxzLmNyZWF0ZS5oYXNTdWJzY3JpYmVycykge1xuICAgICAgY2hhbm5lbHMuY3JlYXRlLnB1Ymxpc2goeyByZXF1ZXN0OiB0aGlzIH0pXG4gICAgfVxuICB9XG5cbiAgb25Cb2R5U2VudCAoY2h1bmspIHtcbiAgICBpZiAodGhpc1trSGFuZGxlcl0ub25Cb2R5U2VudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHRoaXNba0hhbmRsZXJdLm9uQm9keVNlbnQoY2h1bmspXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5hYm9ydChlcnIpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25SZXF1ZXN0U2VudCAoKSB7XG4gICAgaWYgKGNoYW5uZWxzLmJvZHlTZW50Lmhhc1N1YnNjcmliZXJzKSB7XG4gICAgICBjaGFubmVscy5ib2R5U2VudC5wdWJsaXNoKHsgcmVxdWVzdDogdGhpcyB9KVxuICAgIH1cblxuICAgIGlmICh0aGlzW2tIYW5kbGVyXS5vblJlcXVlc3RTZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdGhpc1trSGFuZGxlcl0ub25SZXF1ZXN0U2VudCgpXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5hYm9ydChlcnIpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCkge1xuICAgIGFzc2VydCghdGhpcy5hYm9ydGVkKVxuICAgIGFzc2VydCghdGhpcy5jb21wbGV0ZWQpXG5cbiAgICBpZiAodGhpcy5lcnJvcikge1xuICAgICAgYWJvcnQodGhpcy5lcnJvcilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hYm9ydCA9IGFib3J0XG4gICAgICByZXR1cm4gdGhpc1trSGFuZGxlcl0ub25Db25uZWN0KGFib3J0KVxuICAgIH1cbiAgfVxuXG4gIG9uSGVhZGVycyAoc3RhdHVzQ29kZSwgaGVhZGVycywgcmVzdW1lLCBzdGF0dXNUZXh0KSB7XG4gICAgYXNzZXJ0KCF0aGlzLmFib3J0ZWQpXG4gICAgYXNzZXJ0KCF0aGlzLmNvbXBsZXRlZClcblxuICAgIGlmIChjaGFubmVscy5oZWFkZXJzLmhhc1N1YnNjcmliZXJzKSB7XG4gICAgICBjaGFubmVscy5oZWFkZXJzLnB1Ymxpc2goeyByZXF1ZXN0OiB0aGlzLCByZXNwb25zZTogeyBzdGF0dXNDb2RlLCBoZWFkZXJzLCBzdGF0dXNUZXh0IH0gfSlcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXNba0hhbmRsZXJdLm9uSGVhZGVycyhzdGF0dXNDb2RlLCBoZWFkZXJzLCByZXN1bWUsIHN0YXR1c1RleHQpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmFib3J0KGVycilcbiAgICB9XG4gIH1cblxuICBvbkRhdGEgKGNodW5rKSB7XG4gICAgYXNzZXJ0KCF0aGlzLmFib3J0ZWQpXG4gICAgYXNzZXJ0KCF0aGlzLmNvbXBsZXRlZClcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpc1trSGFuZGxlcl0ub25EYXRhKGNodW5rKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5hYm9ydChlcnIpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICBvblVwZ3JhZGUgKHN0YXR1c0NvZGUsIGhlYWRlcnMsIHNvY2tldCkge1xuICAgIGFzc2VydCghdGhpcy5hYm9ydGVkKVxuICAgIGFzc2VydCghdGhpcy5jb21wbGV0ZWQpXG5cbiAgICByZXR1cm4gdGhpc1trSGFuZGxlcl0ub25VcGdyYWRlKHN0YXR1c0NvZGUsIGhlYWRlcnMsIHNvY2tldClcbiAgfVxuXG4gIG9uQ29tcGxldGUgKHRyYWlsZXJzKSB7XG4gICAgdGhpcy5vbkZpbmFsbHkoKVxuXG4gICAgYXNzZXJ0KCF0aGlzLmFib3J0ZWQpXG5cbiAgICB0aGlzLmNvbXBsZXRlZCA9IHRydWVcbiAgICBpZiAoY2hhbm5lbHMudHJhaWxlcnMuaGFzU3Vic2NyaWJlcnMpIHtcbiAgICAgIGNoYW5uZWxzLnRyYWlsZXJzLnB1Ymxpc2goeyByZXF1ZXN0OiB0aGlzLCB0cmFpbGVycyB9KVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpc1trSGFuZGxlcl0ub25Db21wbGV0ZSh0cmFpbGVycylcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIFRPRE8gKGZpeCk6IFRoaXMgbWlnaHQgYmUgYSBiYWQgaWRlYT9cbiAgICAgIHRoaXMub25FcnJvcihlcnIpXG4gICAgfVxuICB9XG5cbiAgb25FcnJvciAoZXJyb3IpIHtcbiAgICB0aGlzLm9uRmluYWxseSgpXG5cbiAgICBpZiAoY2hhbm5lbHMuZXJyb3IuaGFzU3Vic2NyaWJlcnMpIHtcbiAgICAgIGNoYW5uZWxzLmVycm9yLnB1Ymxpc2goeyByZXF1ZXN0OiB0aGlzLCBlcnJvciB9KVxuICAgIH1cblxuICAgIGlmICh0aGlzLmFib3J0ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLmFib3J0ZWQgPSB0cnVlXG5cbiAgICByZXR1cm4gdGhpc1trSGFuZGxlcl0ub25FcnJvcihlcnJvcilcbiAgfVxuXG4gIG9uRmluYWxseSAoKSB7XG4gICAgaWYgKHRoaXMuZXJyb3JIYW5kbGVyKSB7XG4gICAgICB0aGlzLmJvZHkub2ZmKCdlcnJvcicsIHRoaXMuZXJyb3JIYW5kbGVyKVxuICAgICAgdGhpcy5lcnJvckhhbmRsZXIgPSBudWxsXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZW5kSGFuZGxlcikge1xuICAgICAgdGhpcy5ib2R5Lm9mZignZW5kJywgdGhpcy5lbmRIYW5kbGVyKVxuICAgICAgdGhpcy5lbmRIYW5kbGVyID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE86IGFkanVzdCB0byBzdXBwb3J0IEgyXG4gIGFkZEhlYWRlciAoa2V5LCB2YWx1ZSkge1xuICAgIHByb2Nlc3NIZWFkZXIodGhpcywga2V5LCB2YWx1ZSlcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhdGljIFtrSFRUUDFCdWlsZFJlcXVlc3RdIChvcmlnaW4sIG9wdHMsIGhhbmRsZXIpIHtcbiAgICAvLyBUT0RPOiBNaWdyYXRlIGhlYWRlciBwYXJzaW5nIGhlcmUsIHRvIG1ha2UgUmVxdWVzdHNcbiAgICAvLyBIVFRQIGFnbm9zdGljXG4gICAgcmV0dXJuIG5ldyBSZXF1ZXN0KG9yaWdpbiwgb3B0cywgaGFuZGxlcilcbiAgfVxuXG4gIHN0YXRpYyBba0hUVFAyQnVpbGRSZXF1ZXN0XSAob3JpZ2luLCBvcHRzLCBoYW5kbGVyKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IG9wdHMuaGVhZGVyc1xuICAgIG9wdHMgPSB7IC4uLm9wdHMsIGhlYWRlcnM6IG51bGwgfVxuXG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KG9yaWdpbiwgb3B0cywgaGFuZGxlcilcblxuICAgIHJlcXVlc3QuaGVhZGVycyA9IHt9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgICAgaWYgKGhlYWRlcnMubGVuZ3RoICUgMiAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2hlYWRlcnMgYXJyYXkgbXVzdCBiZSBldmVuJylcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICBwcm9jZXNzSGVhZGVyKHJlcXVlc3QsIGhlYWRlcnNbaV0sIGhlYWRlcnNbaSArIDFdLCB0cnVlKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaGVhZGVycyAmJiB0eXBlb2YgaGVhZGVycyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhoZWFkZXJzKVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV1cbiAgICAgICAgcHJvY2Vzc0hlYWRlcihyZXF1ZXN0LCBrZXksIGhlYWRlcnNba2V5XSwgdHJ1ZSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGhlYWRlcnMgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdoZWFkZXJzIG11c3QgYmUgYW4gb2JqZWN0IG9yIGFuIGFycmF5JylcbiAgICB9XG5cbiAgICByZXR1cm4gcmVxdWVzdFxuICB9XG5cbiAgc3RhdGljIFtrSFRUUDJDb3B5SGVhZGVyc10gKHJhdykge1xuICAgIGNvbnN0IHJhd0hlYWRlcnMgPSByYXcuc3BsaXQoJ1xcclxcbicpXG4gICAgY29uc3QgaGVhZGVycyA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IGhlYWRlciBvZiByYXdIZWFkZXJzKSB7XG4gICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBoZWFkZXIuc3BsaXQoJzogJylcblxuICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoID09PSAwKSBjb250aW51ZVxuXG4gICAgICBpZiAoaGVhZGVyc1trZXldKSBoZWFkZXJzW2tleV0gKz0gYCwke3ZhbHVlfWBcbiAgICAgIGVsc2UgaGVhZGVyc1trZXldID0gdmFsdWVcbiAgICB9XG5cbiAgICByZXR1cm4gaGVhZGVyc1xuICB9XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NIZWFkZXJWYWx1ZSAoa2V5LCB2YWwsIHNraXBBcHBlbmQpIHtcbiAgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihgaW52YWxpZCAke2tleX0gaGVhZGVyYClcbiAgfVxuXG4gIHZhbCA9IHZhbCAhPSBudWxsID8gYCR7dmFsfWAgOiAnJ1xuXG4gIGlmIChoZWFkZXJDaGFyUmVnZXguZXhlYyh2YWwpICE9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKGBpbnZhbGlkICR7a2V5fSBoZWFkZXJgKVxuICB9XG5cbiAgcmV0dXJuIHNraXBBcHBlbmQgPyB2YWwgOiBgJHtrZXl9OiAke3ZhbH1cXHJcXG5gXG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NIZWFkZXIgKHJlcXVlc3QsIGtleSwgdmFsLCBza2lwQXBwZW5kID0gZmFsc2UpIHtcbiAgaWYgKHZhbCAmJiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsKSkpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoYGludmFsaWQgJHtrZXl9IGhlYWRlcmApXG4gIH0gZWxzZSBpZiAodmFsID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChcbiAgICByZXF1ZXN0Lmhvc3QgPT09IG51bGwgJiZcbiAgICBrZXkubGVuZ3RoID09PSA0ICYmXG4gICAga2V5LnRvTG93ZXJDYXNlKCkgPT09ICdob3N0J1xuICApIHtcbiAgICBpZiAoaGVhZGVyQ2hhclJlZ2V4LmV4ZWModmFsKSAhPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKGBpbnZhbGlkICR7a2V5fSBoZWFkZXJgKVxuICAgIH1cbiAgICAvLyBDb25zdW1lZCBieSBDbGllbnRcbiAgICByZXF1ZXN0Lmhvc3QgPSB2YWxcbiAgfSBlbHNlIGlmIChcbiAgICByZXF1ZXN0LmNvbnRlbnRMZW5ndGggPT09IG51bGwgJiZcbiAgICBrZXkubGVuZ3RoID09PSAxNCAmJlxuICAgIGtleS50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC1sZW5ndGgnXG4gICkge1xuICAgIHJlcXVlc3QuY29udGVudExlbmd0aCA9IHBhcnNlSW50KHZhbCwgMTApXG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocmVxdWVzdC5jb250ZW50TGVuZ3RoKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGNvbnRlbnQtbGVuZ3RoIGhlYWRlcicpXG4gICAgfVxuICB9IGVsc2UgaWYgKFxuICAgIHJlcXVlc3QuY29udGVudFR5cGUgPT09IG51bGwgJiZcbiAgICBrZXkubGVuZ3RoID09PSAxMiAmJlxuICAgIGtleS50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC10eXBlJ1xuICApIHtcbiAgICByZXF1ZXN0LmNvbnRlbnRUeXBlID0gdmFsXG4gICAgaWYgKHNraXBBcHBlbmQpIHJlcXVlc3QuaGVhZGVyc1trZXldID0gcHJvY2Vzc0hlYWRlclZhbHVlKGtleSwgdmFsLCBza2lwQXBwZW5kKVxuICAgIGVsc2UgcmVxdWVzdC5oZWFkZXJzICs9IHByb2Nlc3NIZWFkZXJWYWx1ZShrZXksIHZhbClcbiAgfSBlbHNlIGlmIChcbiAgICBrZXkubGVuZ3RoID09PSAxNyAmJlxuICAgIGtleS50b0xvd2VyQ2FzZSgpID09PSAndHJhbnNmZXItZW5jb2RpbmcnXG4gICkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCB0cmFuc2Zlci1lbmNvZGluZyBoZWFkZXInKVxuICB9IGVsc2UgaWYgKFxuICAgIGtleS5sZW5ndGggPT09IDEwICYmXG4gICAga2V5LnRvTG93ZXJDYXNlKCkgPT09ICdjb25uZWN0aW9uJ1xuICApIHtcbiAgICBjb25zdCB2YWx1ZSA9IHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gdmFsLnRvTG93ZXJDYXNlKCkgOiBudWxsXG4gICAgaWYgKHZhbHVlICE9PSAnY2xvc2UnICYmIHZhbHVlICE9PSAna2VlcC1hbGl2ZScpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBjb25uZWN0aW9uIGhlYWRlcicpXG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJ2Nsb3NlJykge1xuICAgICAgcmVxdWVzdC5yZXNldCA9IHRydWVcbiAgICB9XG4gIH0gZWxzZSBpZiAoXG4gICAga2V5Lmxlbmd0aCA9PT0gMTAgJiZcbiAgICBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2tlZXAtYWxpdmUnXG4gICkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBrZWVwLWFsaXZlIGhlYWRlcicpXG4gIH0gZWxzZSBpZiAoXG4gICAga2V5Lmxlbmd0aCA9PT0gNyAmJlxuICAgIGtleS50b0xvd2VyQ2FzZSgpID09PSAndXBncmFkZSdcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIHVwZ3JhZGUgaGVhZGVyJylcbiAgfSBlbHNlIGlmIChcbiAgICBrZXkubGVuZ3RoID09PSA2ICYmXG4gICAga2V5LnRvTG93ZXJDYXNlKCkgPT09ICdleHBlY3QnXG4gICkge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFcnJvcignZXhwZWN0IGhlYWRlciBub3Qgc3VwcG9ydGVkJylcbiAgfSBlbHNlIGlmICh0b2tlblJlZ0V4cC5leGVjKGtleSkgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgaGVhZGVyIGtleScpXG4gIH0gZWxzZSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNraXBBcHBlbmQpIHtcbiAgICAgICAgICBpZiAocmVxdWVzdC5oZWFkZXJzW2tleV0pIHJlcXVlc3QuaGVhZGVyc1trZXldICs9IGAsJHtwcm9jZXNzSGVhZGVyVmFsdWUoa2V5LCB2YWxbaV0sIHNraXBBcHBlbmQpfWBcbiAgICAgICAgICBlbHNlIHJlcXVlc3QuaGVhZGVyc1trZXldID0gcHJvY2Vzc0hlYWRlclZhbHVlKGtleSwgdmFsW2ldLCBza2lwQXBwZW5kKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcXVlc3QuaGVhZGVycyArPSBwcm9jZXNzSGVhZGVyVmFsdWUoa2V5LCB2YWxbaV0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNraXBBcHBlbmQpIHJlcXVlc3QuaGVhZGVyc1trZXldID0gcHJvY2Vzc0hlYWRlclZhbHVlKGtleSwgdmFsLCBza2lwQXBwZW5kKVxuICAgICAgZWxzZSByZXF1ZXN0LmhlYWRlcnMgKz0gcHJvY2Vzc0hlYWRlclZhbHVlKGtleSwgdmFsKVxuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlcXVlc3RcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKVxuXG5jbGFzcyBEaXNwYXRjaGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgZGlzcGF0Y2ggKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJylcbiAgfVxuXG4gIGNsb3NlICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpXG4gIH1cblxuICBkZXN0cm95ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBEaXNwYXRjaGVyXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgRGlzcGF0Y2hlciA9IHJlcXVpcmUoJy4vZGlzcGF0Y2hlcicpXG5jb25zdCB7XG4gIENsaWVudERlc3Ryb3llZEVycm9yLFxuICBDbGllbnRDbG9zZWRFcnJvcixcbiAgSW52YWxpZEFyZ3VtZW50RXJyb3Jcbn0gPSByZXF1aXJlKCcuL2NvcmUvZXJyb3JzJylcbmNvbnN0IHsga0Rlc3Ryb3ksIGtDbG9zZSwga0Rpc3BhdGNoLCBrSW50ZXJjZXB0b3JzIH0gPSByZXF1aXJlKCcuL2NvcmUvc3ltYm9scycpXG5cbmNvbnN0IGtEZXN0cm95ZWQgPSBTeW1ib2woJ2Rlc3Ryb3llZCcpXG5jb25zdCBrQ2xvc2VkID0gU3ltYm9sKCdjbG9zZWQnKVxuY29uc3Qga09uRGVzdHJveWVkID0gU3ltYm9sKCdvbkRlc3Ryb3llZCcpXG5jb25zdCBrT25DbG9zZWQgPSBTeW1ib2woJ29uQ2xvc2VkJylcbmNvbnN0IGtJbnRlcmNlcHRlZERpc3BhdGNoID0gU3ltYm9sKCdJbnRlcmNlcHRlZCBEaXNwYXRjaCcpXG5cbmNsYXNzIERpc3BhdGNoZXJCYXNlIGV4dGVuZHMgRGlzcGF0Y2hlciB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBzdXBlcigpXG5cbiAgICB0aGlzW2tEZXN0cm95ZWRdID0gZmFsc2VcbiAgICB0aGlzW2tPbkRlc3Ryb3llZF0gPSBudWxsXG4gICAgdGhpc1trQ2xvc2VkXSA9IGZhbHNlXG4gICAgdGhpc1trT25DbG9zZWRdID0gW11cbiAgfVxuXG4gIGdldCBkZXN0cm95ZWQgKCkge1xuICAgIHJldHVybiB0aGlzW2tEZXN0cm95ZWRdXG4gIH1cblxuICBnZXQgY2xvc2VkICgpIHtcbiAgICByZXR1cm4gdGhpc1trQ2xvc2VkXVxuICB9XG5cbiAgZ2V0IGludGVyY2VwdG9ycyAoKSB7XG4gICAgcmV0dXJuIHRoaXNba0ludGVyY2VwdG9yc11cbiAgfVxuXG4gIHNldCBpbnRlcmNlcHRvcnMgKG5ld0ludGVyY2VwdG9ycykge1xuICAgIGlmIChuZXdJbnRlcmNlcHRvcnMpIHtcbiAgICAgIGZvciAobGV0IGkgPSBuZXdJbnRlcmNlcHRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgaW50ZXJjZXB0b3IgPSB0aGlzW2tJbnRlcmNlcHRvcnNdW2ldXG4gICAgICAgIGlmICh0eXBlb2YgaW50ZXJjZXB0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludGVyY2VwdG9yIG11c3QgYmUgYW4gZnVuY3Rpb24nKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpc1trSW50ZXJjZXB0b3JzXSA9IG5ld0ludGVyY2VwdG9yc1xuICB9XG5cbiAgY2xvc2UgKGNhbGxiYWNrKSB7XG4gICAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMuY2xvc2UoKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICAgIHJldHVybiBlcnIgPyByZWplY3QoZXJyKSA6IHJlc29sdmUoZGF0YSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGNhbGxiYWNrJylcbiAgICB9XG5cbiAgICBpZiAodGhpc1trRGVzdHJveWVkXSkge1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2FsbGJhY2sobmV3IENsaWVudERlc3Ryb3llZEVycm9yKCksIG51bGwpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXNba0Nsb3NlZF0pIHtcbiAgICAgIGlmICh0aGlzW2tPbkNsb3NlZF0pIHtcbiAgICAgICAgdGhpc1trT25DbG9zZWRdLnB1c2goY2FsbGJhY2spXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBjYWxsYmFjayhudWxsLCBudWxsKSlcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXNba0Nsb3NlZF0gPSB0cnVlXG4gICAgdGhpc1trT25DbG9zZWRdLnB1c2goY2FsbGJhY2spXG5cbiAgICBjb25zdCBvbkNsb3NlZCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IHRoaXNba09uQ2xvc2VkXVxuICAgICAgdGhpc1trT25DbG9zZWRdID0gbnVsbFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2FsbGJhY2tzW2ldKG51bGwsIG51bGwpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2hvdWxkIG5vdCBlcnJvci5cbiAgICB0aGlzW2tDbG9zZV0oKVxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5kZXN0cm95KCkpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHF1ZXVlTWljcm90YXNrKG9uQ2xvc2VkKVxuICAgICAgfSlcbiAgfVxuXG4gIGRlc3Ryb3kgKGVyciwgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIGVyciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBlcnJcbiAgICAgIGVyciA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5kZXN0cm95KGVyciwgKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICAgIHJldHVybiBlcnIgPyAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogc2hvdWxkIG5ldmVyIGVycm9yICovIHJlamVjdChlcnIpIDogcmVzb2x2ZShkYXRhKVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgY2FsbGJhY2snKVxuICAgIH1cblxuICAgIGlmICh0aGlzW2tEZXN0cm95ZWRdKSB7XG4gICAgICBpZiAodGhpc1trT25EZXN0cm95ZWRdKSB7XG4gICAgICAgIHRoaXNba09uRGVzdHJveWVkXS5wdXNoKGNhbGxiYWNrKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2FsbGJhY2sobnVsbCwgbnVsbCkpXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIWVycikge1xuICAgICAgZXJyID0gbmV3IENsaWVudERlc3Ryb3llZEVycm9yKClcbiAgICB9XG5cbiAgICB0aGlzW2tEZXN0cm95ZWRdID0gdHJ1ZVxuICAgIHRoaXNba09uRGVzdHJveWVkXSA9IHRoaXNba09uRGVzdHJveWVkXSB8fCBbXVxuICAgIHRoaXNba09uRGVzdHJveWVkXS5wdXNoKGNhbGxiYWNrKVxuXG4gICAgY29uc3Qgb25EZXN0cm95ZWQgPSAoKSA9PiB7XG4gICAgICBjb25zdCBjYWxsYmFja3MgPSB0aGlzW2tPbkRlc3Ryb3llZF1cbiAgICAgIHRoaXNba09uRGVzdHJveWVkXSA9IG51bGxcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNhbGxiYWNrc1tpXShudWxsLCBudWxsKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNob3VsZCBub3QgZXJyb3IuXG4gICAgdGhpc1trRGVzdHJveV0oZXJyKS50aGVuKCgpID0+IHtcbiAgICAgIHF1ZXVlTWljcm90YXNrKG9uRGVzdHJveWVkKVxuICAgIH0pXG4gIH1cblxuICBba0ludGVyY2VwdGVkRGlzcGF0Y2hdIChvcHRzLCBoYW5kbGVyKSB7XG4gICAgaWYgKCF0aGlzW2tJbnRlcmNlcHRvcnNdIHx8IHRoaXNba0ludGVyY2VwdG9yc10ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzW2tJbnRlcmNlcHRlZERpc3BhdGNoXSA9IHRoaXNba0Rpc3BhdGNoXVxuICAgICAgcmV0dXJuIHRoaXNba0Rpc3BhdGNoXShvcHRzLCBoYW5kbGVyKVxuICAgIH1cblxuICAgIGxldCBkaXNwYXRjaCA9IHRoaXNba0Rpc3BhdGNoXS5iaW5kKHRoaXMpXG4gICAgZm9yIChsZXQgaSA9IHRoaXNba0ludGVyY2VwdG9yc10ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGRpc3BhdGNoID0gdGhpc1trSW50ZXJjZXB0b3JzXVtpXShkaXNwYXRjaClcbiAgICB9XG4gICAgdGhpc1trSW50ZXJjZXB0ZWREaXNwYXRjaF0gPSBkaXNwYXRjaFxuICAgIHJldHVybiBkaXNwYXRjaChvcHRzLCBoYW5kbGVyKVxuICB9XG5cbiAgZGlzcGF0Y2ggKG9wdHMsIGhhbmRsZXIpIHtcbiAgICBpZiAoIWhhbmRsZXIgfHwgdHlwZW9mIGhhbmRsZXIgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2hhbmRsZXIgbXVzdCBiZSBhbiBvYmplY3QnKVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBpZiAoIW9wdHMgfHwgdHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignb3B0cyBtdXN0IGJlIGFuIG9iamVjdC4nKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpc1trRGVzdHJveWVkXSB8fCB0aGlzW2tPbkRlc3Ryb3llZF0pIHtcbiAgICAgICAgdGhyb3cgbmV3IENsaWVudERlc3Ryb3llZEVycm9yKClcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXNba0Nsb3NlZF0pIHtcbiAgICAgICAgdGhyb3cgbmV3IENsaWVudENsb3NlZEVycm9yKClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXNba0ludGVyY2VwdGVkRGlzcGF0Y2hdKG9wdHMsIGhhbmRsZXIpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAodHlwZW9mIGhhbmRsZXIub25FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgb25FcnJvciBtZXRob2QnKVxuICAgICAgfVxuXG4gICAgICBoYW5kbGVyLm9uRXJyb3IoZXJyKVxuXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBEaXNwYXRjaGVyQmFzZVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IG5ldCA9IHJlcXVpcmUoJ25ldCcpXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yLCBDb25uZWN0VGltZW91dEVycm9yIH0gPSByZXF1aXJlKCcuL2Vycm9ycycpXG5cbmxldCB0bHMgLy8gaW5jbHVkZSB0bHMgY29uZGl0aW9uYWxseSBzaW5jZSBpdCBpcyBub3QgYWx3YXlzIGF2YWlsYWJsZVxuXG4vLyBUT0RPOiBzZXNzaW9uIHJlLXVzZSBkb2VzIG5vdCB3YWl0IGZvciB0aGUgZmlyc3Rcbi8vIGNvbm5lY3Rpb24gdG8gcmVzb2x2ZSB0aGUgc2Vzc2lvbiBhbmQgbWlnaHQgdGhlcmVmb3JlXG4vLyByZXNvbHZlIHRoZSBzYW1lIHNlcnZlcm5hbWUgbXVsdGlwbGUgdGltZXMgZXZlbiB3aGVuXG4vLyByZS11c2UgaXMgZW5hYmxlZC5cblxubGV0IFNlc3Npb25DYWNoZVxuLy8gRklYTUU6IHJlbW92ZSB3b3JrYXJvdW5kIHdoZW4gdGhlIE5vZGUgYnVnIGlzIGZpeGVkXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzQ5MzQ0I2lzc3VlY29tbWVudC0xNzQxNzc2MzA4XG5pZiAoZ2xvYmFsLkZpbmFsaXphdGlvblJlZ2lzdHJ5ICYmICFwcm9jZXNzLmVudi5OT0RFX1Y4X0NPVkVSQUdFKSB7XG4gIFNlc3Npb25DYWNoZSA9IGNsYXNzIFdlYWtTZXNzaW9uQ2FjaGUge1xuICAgIGNvbnN0cnVjdG9yIChtYXhDYWNoZWRTZXNzaW9ucykge1xuICAgICAgdGhpcy5fbWF4Q2FjaGVkU2Vzc2lvbnMgPSBtYXhDYWNoZWRTZXNzaW9uc1xuICAgICAgdGhpcy5fc2Vzc2lvbkNhY2hlID0gbmV3IE1hcCgpXG4gICAgICB0aGlzLl9zZXNzaW9uUmVnaXN0cnkgPSBuZXcgZ2xvYmFsLkZpbmFsaXphdGlvblJlZ2lzdHJ5KChrZXkpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3Nlc3Npb25DYWNoZS5zaXplIDwgdGhpcy5fbWF4Q2FjaGVkU2Vzc2lvbnMpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlZiA9IHRoaXMuX3Nlc3Npb25DYWNoZS5nZXQoa2V5KVxuICAgICAgICBpZiAocmVmICE9PSB1bmRlZmluZWQgJiYgcmVmLmRlcmVmKCkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuX3Nlc3Npb25DYWNoZS5kZWxldGUoa2V5KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIGdldCAoc2Vzc2lvbktleSkge1xuICAgICAgY29uc3QgcmVmID0gdGhpcy5fc2Vzc2lvbkNhY2hlLmdldChzZXNzaW9uS2V5KVxuICAgICAgcmV0dXJuIHJlZiA/IHJlZi5kZXJlZigpIDogbnVsbFxuICAgIH1cblxuICAgIHNldCAoc2Vzc2lvbktleSwgc2Vzc2lvbikge1xuICAgICAgaWYgKHRoaXMuX21heENhY2hlZFNlc3Npb25zID09PSAwKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB0aGlzLl9zZXNzaW9uQ2FjaGUuc2V0KHNlc3Npb25LZXksIG5ldyBXZWFrUmVmKHNlc3Npb24pKVxuICAgICAgdGhpcy5fc2Vzc2lvblJlZ2lzdHJ5LnJlZ2lzdGVyKHNlc3Npb24sIHNlc3Npb25LZXkpXG4gICAgfVxuICB9XG59IGVsc2Uge1xuICBTZXNzaW9uQ2FjaGUgPSBjbGFzcyBTaW1wbGVTZXNzaW9uQ2FjaGUge1xuICAgIGNvbnN0cnVjdG9yIChtYXhDYWNoZWRTZXNzaW9ucykge1xuICAgICAgdGhpcy5fbWF4Q2FjaGVkU2Vzc2lvbnMgPSBtYXhDYWNoZWRTZXNzaW9uc1xuICAgICAgdGhpcy5fc2Vzc2lvbkNhY2hlID0gbmV3IE1hcCgpXG4gICAgfVxuXG4gICAgZ2V0IChzZXNzaW9uS2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbkNhY2hlLmdldChzZXNzaW9uS2V5KVxuICAgIH1cblxuICAgIHNldCAoc2Vzc2lvbktleSwgc2Vzc2lvbikge1xuICAgICAgaWYgKHRoaXMuX21heENhY2hlZFNlc3Npb25zID09PSAwKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fc2Vzc2lvbkNhY2hlLnNpemUgPj0gdGhpcy5fbWF4Q2FjaGVkU2Vzc2lvbnMpIHtcbiAgICAgICAgLy8gcmVtb3ZlIHRoZSBvbGRlc3Qgc2Vzc2lvblxuICAgICAgICBjb25zdCB7IHZhbHVlOiBvbGRlc3RLZXkgfSA9IHRoaXMuX3Nlc3Npb25DYWNoZS5rZXlzKCkubmV4dCgpXG4gICAgICAgIHRoaXMuX3Nlc3Npb25DYWNoZS5kZWxldGUob2xkZXN0S2V5KVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9zZXNzaW9uQ2FjaGUuc2V0KHNlc3Npb25LZXksIHNlc3Npb24pXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ29ubmVjdG9yICh7IGFsbG93SDIsIG1heENhY2hlZFNlc3Npb25zLCBzb2NrZXRQYXRoLCB0aW1lb3V0LCAuLi5vcHRzIH0pIHtcbiAgaWYgKG1heENhY2hlZFNlc3Npb25zICE9IG51bGwgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKG1heENhY2hlZFNlc3Npb25zKSB8fCBtYXhDYWNoZWRTZXNzaW9ucyA8IDApKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdtYXhDYWNoZWRTZXNzaW9ucyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBvciB6ZXJvJylcbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnMgPSB7IHBhdGg6IHNvY2tldFBhdGgsIC4uLm9wdHMgfVxuICBjb25zdCBzZXNzaW9uQ2FjaGUgPSBuZXcgU2Vzc2lvbkNhY2hlKG1heENhY2hlZFNlc3Npb25zID09IG51bGwgPyAxMDAgOiBtYXhDYWNoZWRTZXNzaW9ucylcbiAgdGltZW91dCA9IHRpbWVvdXQgPT0gbnVsbCA/IDEwZTMgOiB0aW1lb3V0XG4gIGFsbG93SDIgPSBhbGxvd0gyICE9IG51bGwgPyBhbGxvd0gyIDogZmFsc2VcbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbm5lY3QgKHsgaG9zdG5hbWUsIGhvc3QsIHByb3RvY29sLCBwb3J0LCBzZXJ2ZXJuYW1lLCBsb2NhbEFkZHJlc3MsIGh0dHBTb2NrZXQgfSwgY2FsbGJhY2spIHtcbiAgICBsZXQgc29ja2V0XG4gICAgaWYgKHByb3RvY29sID09PSAnaHR0cHM6Jykge1xuICAgICAgaWYgKCF0bHMpIHtcbiAgICAgICAgdGxzID0gcmVxdWlyZSgndGxzJylcbiAgICAgIH1cbiAgICAgIHNlcnZlcm5hbWUgPSBzZXJ2ZXJuYW1lIHx8IG9wdGlvbnMuc2VydmVybmFtZSB8fCB1dGlsLmdldFNlcnZlck5hbWUoaG9zdCkgfHwgbnVsbFxuXG4gICAgICBjb25zdCBzZXNzaW9uS2V5ID0gc2VydmVybmFtZSB8fCBob3N0bmFtZVxuICAgICAgY29uc3Qgc2Vzc2lvbiA9IHNlc3Npb25DYWNoZS5nZXQoc2Vzc2lvbktleSkgfHwgbnVsbFxuXG4gICAgICBhc3NlcnQoc2Vzc2lvbktleSlcblxuICAgICAgc29ja2V0ID0gdGxzLmNvbm5lY3Qoe1xuICAgICAgICBoaWdoV2F0ZXJNYXJrOiAxNjM4NCwgLy8gVExTIGluIG5vZGUgY2FuJ3QgaGF2ZSBiaWdnZXIgSFdNIGFueXdheS4uLlxuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBzZXJ2ZXJuYW1lLFxuICAgICAgICBzZXNzaW9uLFxuICAgICAgICBsb2NhbEFkZHJlc3MsXG4gICAgICAgIC8vIFRPRE8oSFRUUC8yKTogQWRkIHN1cHBvcnQgZm9yIGgyY1xuICAgICAgICBBTFBOUHJvdG9jb2xzOiBhbGxvd0gyID8gWydodHRwLzEuMScsICdoMiddIDogWydodHRwLzEuMSddLFxuICAgICAgICBzb2NrZXQ6IGh0dHBTb2NrZXQsIC8vIHVwZ3JhZGUgc29ja2V0IGNvbm5lY3Rpb25cbiAgICAgICAgcG9ydDogcG9ydCB8fCA0NDMsXG4gICAgICAgIGhvc3Q6IGhvc3RuYW1lXG4gICAgICB9KVxuXG4gICAgICBzb2NrZXRcbiAgICAgICAgLm9uKCdzZXNzaW9uJywgZnVuY3Rpb24gKHNlc3Npb24pIHtcbiAgICAgICAgICAvLyBUT0RPIChmaXgpOiBDYW4gYSBzZXNzaW9uIGJlY29tZSBpbnZhbGlkIG9uY2UgZXN0YWJsaXNoZWQ/IERvbid0IHRoaW5rIHNvP1xuICAgICAgICAgIHNlc3Npb25DYWNoZS5zZXQoc2Vzc2lvbktleSwgc2Vzc2lvbilcbiAgICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KCFodHRwU29ja2V0LCAnaHR0cFNvY2tldCBjYW4gb25seSBiZSBzZW50IG9uIFRMUyB1cGRhdGUnKVxuICAgICAgc29ja2V0ID0gbmV0LmNvbm5lY3Qoe1xuICAgICAgICBoaWdoV2F0ZXJNYXJrOiA2NCAqIDEwMjQsIC8vIFNhbWUgYXMgbm9kZWpzIGZzIHN0cmVhbXMuXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGxvY2FsQWRkcmVzcyxcbiAgICAgICAgcG9ydDogcG9ydCB8fCA4MCxcbiAgICAgICAgaG9zdDogaG9zdG5hbWVcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gU2V0IFRDUCBrZWVwIGFsaXZlIG9wdGlvbnMgb24gdGhlIHNvY2tldCBoZXJlIGluc3RlYWQgb2YgaW4gY29ubmVjdCgpIGZvciB0aGUgY2FzZSBvZiBhc3NpZ25pbmcgdGhlIHNvY2tldFxuICAgIGlmIChvcHRpb25zLmtlZXBBbGl2ZSA9PSBudWxsIHx8IG9wdGlvbnMua2VlcEFsaXZlKSB7XG4gICAgICBjb25zdCBrZWVwQWxpdmVJbml0aWFsRGVsYXkgPSBvcHRpb25zLmtlZXBBbGl2ZUluaXRpYWxEZWxheSA9PT0gdW5kZWZpbmVkID8gNjBlMyA6IG9wdGlvbnMua2VlcEFsaXZlSW5pdGlhbERlbGF5XG4gICAgICBzb2NrZXQuc2V0S2VlcEFsaXZlKHRydWUsIGtlZXBBbGl2ZUluaXRpYWxEZWxheSlcbiAgICB9XG5cbiAgICBjb25zdCBjYW5jZWxUaW1lb3V0ID0gc2V0dXBUaW1lb3V0KCgpID0+IG9uQ29ubmVjdFRpbWVvdXQoc29ja2V0KSwgdGltZW91dClcblxuICAgIHNvY2tldFxuICAgICAgLnNldE5vRGVsYXkodHJ1ZSlcbiAgICAgIC5vbmNlKHByb3RvY29sID09PSAnaHR0cHM6JyA/ICdzZWN1cmVDb25uZWN0JyA6ICdjb25uZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjYW5jZWxUaW1lb3V0KClcblxuICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICBjb25zdCBjYiA9IGNhbGxiYWNrXG4gICAgICAgICAgY2FsbGJhY2sgPSBudWxsXG4gICAgICAgICAgY2IobnVsbCwgdGhpcylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGNhbmNlbFRpbWVvdXQoKVxuXG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgIGNvbnN0IGNiID0gY2FsbGJhY2tcbiAgICAgICAgICBjYWxsYmFjayA9IG51bGxcbiAgICAgICAgICBjYihlcnIpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICByZXR1cm4gc29ja2V0XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0dXBUaW1lb3V0IChvbkNvbm5lY3RUaW1lb3V0LCB0aW1lb3V0KSB7XG4gIGlmICghdGltZW91dCkge1xuICAgIHJldHVybiAoKSA9PiB7fVxuICB9XG5cbiAgbGV0IHMxID0gbnVsbFxuICBsZXQgczIgPSBudWxsXG4gIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIC8vIHNldEltbWVkaWF0ZSBpcyBhZGRlZCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBwcmlvdG9yaXNlIHNvY2tldCBlcnJvciBldmVudHMgb3ZlciB0aW1lb3V0c1xuICAgIHMxID0gc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgICAgIC8vIFdpbmRvd3MgbmVlZHMgYW4gZXh0cmEgc2V0SW1tZWRpYXRlIHByb2JhYmx5IGR1ZSB0byBpbXBsZW1lbnRhdGlvbiBkaWZmZXJlbmNlcyBpbiB0aGUgc29ja2V0IGxvZ2ljXG4gICAgICAgIHMyID0gc2V0SW1tZWRpYXRlKCgpID0+IG9uQ29ubmVjdFRpbWVvdXQoKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uQ29ubmVjdFRpbWVvdXQoKVxuICAgICAgfVxuICAgIH0pXG4gIH0sIHRpbWVvdXQpXG4gIHJldHVybiAoKSA9PiB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZClcbiAgICBjbGVhckltbWVkaWF0ZShzMSlcbiAgICBjbGVhckltbWVkaWF0ZShzMilcbiAgfVxufVxuXG5mdW5jdGlvbiBvbkNvbm5lY3RUaW1lb3V0IChzb2NrZXQpIHtcbiAgdXRpbC5kZXN0cm95KHNvY2tldCwgbmV3IENvbm5lY3RUaW1lb3V0RXJyb3IoKSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBidWlsZENvbm5lY3RvclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmVudW1Ub01hcCA9IHZvaWQgMDtcbmZ1bmN0aW9uIGVudW1Ub01hcChvYmopIHtcbiAgICBjb25zdCByZXMgPSB7fTtcbiAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmVzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXM7XG59XG5leHBvcnRzLmVudW1Ub01hcCA9IGVudW1Ub01hcDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TUEVDSUFMX0hFQURFUlMgPSBleHBvcnRzLkhFQURFUl9TVEFURSA9IGV4cG9ydHMuTUlOT1IgPSBleHBvcnRzLk1BSk9SID0gZXhwb3J0cy5DT05ORUNUSU9OX1RPS0VOX0NIQVJTID0gZXhwb3J0cy5IRUFERVJfQ0hBUlMgPSBleHBvcnRzLlRPS0VOID0gZXhwb3J0cy5TVFJJQ1RfVE9LRU4gPSBleHBvcnRzLkhFWCA9IGV4cG9ydHMuVVJMX0NIQVIgPSBleHBvcnRzLlNUUklDVF9VUkxfQ0hBUiA9IGV4cG9ydHMuVVNFUklORk9fQ0hBUlMgPSBleHBvcnRzLk1BUksgPSBleHBvcnRzLkFMUEhBTlVNID0gZXhwb3J0cy5OVU0gPSBleHBvcnRzLkhFWF9NQVAgPSBleHBvcnRzLk5VTV9NQVAgPSBleHBvcnRzLkFMUEhBID0gZXhwb3J0cy5GSU5JU0ggPSBleHBvcnRzLkhfTUVUSE9EX01BUCA9IGV4cG9ydHMuTUVUSE9EX01BUCA9IGV4cG9ydHMuTUVUSE9EU19SVFNQID0gZXhwb3J0cy5NRVRIT0RTX0lDRSA9IGV4cG9ydHMuTUVUSE9EU19IVFRQID0gZXhwb3J0cy5NRVRIT0RTID0gZXhwb3J0cy5MRU5JRU5UX0ZMQUdTID0gZXhwb3J0cy5GTEFHUyA9IGV4cG9ydHMuVFlQRSA9IGV4cG9ydHMuRVJST1IgPSB2b2lkIDA7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG4vLyBDIGhlYWRlcnNcbnZhciBFUlJPUjtcbihmdW5jdGlvbiAoRVJST1IpIHtcbiAgICBFUlJPUltFUlJPUltcIk9LXCJdID0gMF0gPSBcIk9LXCI7XG4gICAgRVJST1JbRVJST1JbXCJJTlRFUk5BTFwiXSA9IDFdID0gXCJJTlRFUk5BTFwiO1xuICAgIEVSUk9SW0VSUk9SW1wiU1RSSUNUXCJdID0gMl0gPSBcIlNUUklDVFwiO1xuICAgIEVSUk9SW0VSUk9SW1wiTEZfRVhQRUNURURcIl0gPSAzXSA9IFwiTEZfRVhQRUNURURcIjtcbiAgICBFUlJPUltFUlJPUltcIlVORVhQRUNURURfQ09OVEVOVF9MRU5HVEhcIl0gPSA0XSA9IFwiVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSFwiO1xuICAgIEVSUk9SW0VSUk9SW1wiQ0xPU0VEX0NPTk5FQ1RJT05cIl0gPSA1XSA9IFwiQ0xPU0VEX0NPTk5FQ1RJT05cIjtcbiAgICBFUlJPUltFUlJPUltcIklOVkFMSURfTUVUSE9EXCJdID0gNl0gPSBcIklOVkFMSURfTUVUSE9EXCI7XG4gICAgRVJST1JbRVJST1JbXCJJTlZBTElEX1VSTFwiXSA9IDddID0gXCJJTlZBTElEX1VSTFwiO1xuICAgIEVSUk9SW0VSUk9SW1wiSU5WQUxJRF9DT05TVEFOVFwiXSA9IDhdID0gXCJJTlZBTElEX0NPTlNUQU5UXCI7XG4gICAgRVJST1JbRVJST1JbXCJJTlZBTElEX1ZFUlNJT05cIl0gPSA5XSA9IFwiSU5WQUxJRF9WRVJTSU9OXCI7XG4gICAgRVJST1JbRVJST1JbXCJJTlZBTElEX0hFQURFUl9UT0tFTlwiXSA9IDEwXSA9IFwiSU5WQUxJRF9IRUFERVJfVE9LRU5cIjtcbiAgICBFUlJPUltFUlJPUltcIklOVkFMSURfQ09OVEVOVF9MRU5HVEhcIl0gPSAxMV0gPSBcIklOVkFMSURfQ09OVEVOVF9MRU5HVEhcIjtcbiAgICBFUlJPUltFUlJPUltcIklOVkFMSURfQ0hVTktfU0laRVwiXSA9IDEyXSA9IFwiSU5WQUxJRF9DSFVOS19TSVpFXCI7XG4gICAgRVJST1JbRVJST1JbXCJJTlZBTElEX1NUQVRVU1wiXSA9IDEzXSA9IFwiSU5WQUxJRF9TVEFUVVNcIjtcbiAgICBFUlJPUltFUlJPUltcIklOVkFMSURfRU9GX1NUQVRFXCJdID0gMTRdID0gXCJJTlZBTElEX0VPRl9TVEFURVwiO1xuICAgIEVSUk9SW0VSUk9SW1wiSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElOR1wiXSA9IDE1XSA9IFwiSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElOR1wiO1xuICAgIEVSUk9SW0VSUk9SW1wiQ0JfTUVTU0FHRV9CRUdJTlwiXSA9IDE2XSA9IFwiQ0JfTUVTU0FHRV9CRUdJTlwiO1xuICAgIEVSUk9SW0VSUk9SW1wiQ0JfSEVBREVSU19DT01QTEVURVwiXSA9IDE3XSA9IFwiQ0JfSEVBREVSU19DT01QTEVURVwiO1xuICAgIEVSUk9SW0VSUk9SW1wiQ0JfTUVTU0FHRV9DT01QTEVURVwiXSA9IDE4XSA9IFwiQ0JfTUVTU0FHRV9DT01QTEVURVwiO1xuICAgIEVSUk9SW0VSUk9SW1wiQ0JfQ0hVTktfSEVBREVSXCJdID0gMTldID0gXCJDQl9DSFVOS19IRUFERVJcIjtcbiAgICBFUlJPUltFUlJPUltcIkNCX0NIVU5LX0NPTVBMRVRFXCJdID0gMjBdID0gXCJDQl9DSFVOS19DT01QTEVURVwiO1xuICAgIEVSUk9SW0VSUk9SW1wiUEFVU0VEXCJdID0gMjFdID0gXCJQQVVTRURcIjtcbiAgICBFUlJPUltFUlJPUltcIlBBVVNFRF9VUEdSQURFXCJdID0gMjJdID0gXCJQQVVTRURfVVBHUkFERVwiO1xuICAgIEVSUk9SW0VSUk9SW1wiUEFVU0VEX0gyX1VQR1JBREVcIl0gPSAyM10gPSBcIlBBVVNFRF9IMl9VUEdSQURFXCI7XG4gICAgRVJST1JbRVJST1JbXCJVU0VSXCJdID0gMjRdID0gXCJVU0VSXCI7XG59KShFUlJPUiA9IGV4cG9ydHMuRVJST1IgfHwgKGV4cG9ydHMuRVJST1IgPSB7fSkpO1xudmFyIFRZUEU7XG4oZnVuY3Rpb24gKFRZUEUpIHtcbiAgICBUWVBFW1RZUEVbXCJCT1RIXCJdID0gMF0gPSBcIkJPVEhcIjtcbiAgICBUWVBFW1RZUEVbXCJSRVFVRVNUXCJdID0gMV0gPSBcIlJFUVVFU1RcIjtcbiAgICBUWVBFW1RZUEVbXCJSRVNQT05TRVwiXSA9IDJdID0gXCJSRVNQT05TRVwiO1xufSkoVFlQRSA9IGV4cG9ydHMuVFlQRSB8fCAoZXhwb3J0cy5UWVBFID0ge30pKTtcbnZhciBGTEFHUztcbihmdW5jdGlvbiAoRkxBR1MpIHtcbiAgICBGTEFHU1tGTEFHU1tcIkNPTk5FQ1RJT05fS0VFUF9BTElWRVwiXSA9IDFdID0gXCJDT05ORUNUSU9OX0tFRVBfQUxJVkVcIjtcbiAgICBGTEFHU1tGTEFHU1tcIkNPTk5FQ1RJT05fQ0xPU0VcIl0gPSAyXSA9IFwiQ09OTkVDVElPTl9DTE9TRVwiO1xuICAgIEZMQUdTW0ZMQUdTW1wiQ09OTkVDVElPTl9VUEdSQURFXCJdID0gNF0gPSBcIkNPTk5FQ1RJT05fVVBHUkFERVwiO1xuICAgIEZMQUdTW0ZMQUdTW1wiQ0hVTktFRFwiXSA9IDhdID0gXCJDSFVOS0VEXCI7XG4gICAgRkxBR1NbRkxBR1NbXCJVUEdSQURFXCJdID0gMTZdID0gXCJVUEdSQURFXCI7XG4gICAgRkxBR1NbRkxBR1NbXCJDT05URU5UX0xFTkdUSFwiXSA9IDMyXSA9IFwiQ09OVEVOVF9MRU5HVEhcIjtcbiAgICBGTEFHU1tGTEFHU1tcIlNLSVBCT0RZXCJdID0gNjRdID0gXCJTS0lQQk9EWVwiO1xuICAgIEZMQUdTW0ZMQUdTW1wiVFJBSUxJTkdcIl0gPSAxMjhdID0gXCJUUkFJTElOR1wiO1xuICAgIC8vIDEgPDwgOCBpcyB1bnVzZWRcbiAgICBGTEFHU1tGTEFHU1tcIlRSQU5TRkVSX0VOQ09ESU5HXCJdID0gNTEyXSA9IFwiVFJBTlNGRVJfRU5DT0RJTkdcIjtcbn0pKEZMQUdTID0gZXhwb3J0cy5GTEFHUyB8fCAoZXhwb3J0cy5GTEFHUyA9IHt9KSk7XG52YXIgTEVOSUVOVF9GTEFHUztcbihmdW5jdGlvbiAoTEVOSUVOVF9GTEFHUykge1xuICAgIExFTklFTlRfRkxBR1NbTEVOSUVOVF9GTEFHU1tcIkhFQURFUlNcIl0gPSAxXSA9IFwiSEVBREVSU1wiO1xuICAgIExFTklFTlRfRkxBR1NbTEVOSUVOVF9GTEFHU1tcIkNIVU5LRURfTEVOR1RIXCJdID0gMl0gPSBcIkNIVU5LRURfTEVOR1RIXCI7XG4gICAgTEVOSUVOVF9GTEFHU1tMRU5JRU5UX0ZMQUdTW1wiS0VFUF9BTElWRVwiXSA9IDRdID0gXCJLRUVQX0FMSVZFXCI7XG59KShMRU5JRU5UX0ZMQUdTID0gZXhwb3J0cy5MRU5JRU5UX0ZMQUdTIHx8IChleHBvcnRzLkxFTklFTlRfRkxBR1MgPSB7fSkpO1xudmFyIE1FVEhPRFM7XG4oZnVuY3Rpb24gKE1FVEhPRFMpIHtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJERUxFVEVcIl0gPSAwXSA9IFwiREVMRVRFXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiR0VUXCJdID0gMV0gPSBcIkdFVFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkhFQURcIl0gPSAyXSA9IFwiSEVBRFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlBPU1RcIl0gPSAzXSA9IFwiUE9TVFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlBVVFwiXSA9IDRdID0gXCJQVVRcIjtcbiAgICAvKiBwYXRob2xvZ2ljYWwgKi9cbiAgICBNRVRIT0RTW01FVEhPRFNbXCJDT05ORUNUXCJdID0gNV0gPSBcIkNPTk5FQ1RcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJPUFRJT05TXCJdID0gNl0gPSBcIk9QVElPTlNcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJUUkFDRVwiXSA9IDddID0gXCJUUkFDRVwiO1xuICAgIC8qIFdlYkRBViAqL1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkNPUFlcIl0gPSA4XSA9IFwiQ09QWVwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkxPQ0tcIl0gPSA5XSA9IFwiTE9DS1wiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIk1LQ09MXCJdID0gMTBdID0gXCJNS0NPTFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIk1PVkVcIl0gPSAxMV0gPSBcIk1PVkVcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJQUk9QRklORFwiXSA9IDEyXSA9IFwiUFJPUEZJTkRcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJQUk9QUEFUQ0hcIl0gPSAxM10gPSBcIlBST1BQQVRDSFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlNFQVJDSFwiXSA9IDE0XSA9IFwiU0VBUkNIXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiVU5MT0NLXCJdID0gMTVdID0gXCJVTkxPQ0tcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJCSU5EXCJdID0gMTZdID0gXCJCSU5EXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUkVCSU5EXCJdID0gMTddID0gXCJSRUJJTkRcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJVTkJJTkRcIl0gPSAxOF0gPSBcIlVOQklORFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkFDTFwiXSA9IDE5XSA9IFwiQUNMXCI7XG4gICAgLyogc3VidmVyc2lvbiAqL1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlJFUE9SVFwiXSA9IDIwXSA9IFwiUkVQT1JUXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiTUtBQ1RJVklUWVwiXSA9IDIxXSA9IFwiTUtBQ1RJVklUWVwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkNIRUNLT1VUXCJdID0gMjJdID0gXCJDSEVDS09VVFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIk1FUkdFXCJdID0gMjNdID0gXCJNRVJHRVwiO1xuICAgIC8qIHVwbnAgKi9cbiAgICBNRVRIT0RTW01FVEhPRFNbXCJNLVNFQVJDSFwiXSA9IDI0XSA9IFwiTS1TRUFSQ0hcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJOT1RJRllcIl0gPSAyNV0gPSBcIk5PVElGWVwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlNVQlNDUklCRVwiXSA9IDI2XSA9IFwiU1VCU0NSSUJFXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiVU5TVUJTQ1JJQkVcIl0gPSAyN10gPSBcIlVOU1VCU0NSSUJFXCI7XG4gICAgLyogUkZDLTU3ODkgKi9cbiAgICBNRVRIT0RTW01FVEhPRFNbXCJQQVRDSFwiXSA9IDI4XSA9IFwiUEFUQ0hcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJQVVJHRVwiXSA9IDI5XSA9IFwiUFVSR0VcIjtcbiAgICAvKiBDYWxEQVYgKi9cbiAgICBNRVRIT0RTW01FVEhPRFNbXCJNS0NBTEVOREFSXCJdID0gMzBdID0gXCJNS0NBTEVOREFSXCI7XG4gICAgLyogUkZDLTIwNjgsIHNlY3Rpb24gMTkuNi4xLjIgKi9cbiAgICBNRVRIT0RTW01FVEhPRFNbXCJMSU5LXCJdID0gMzFdID0gXCJMSU5LXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiVU5MSU5LXCJdID0gMzJdID0gXCJVTkxJTktcIjtcbiAgICAvKiBpY2VjYXN0ICovXG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiU09VUkNFXCJdID0gMzNdID0gXCJTT1VSQ0VcIjtcbiAgICAvKiBSRkMtNzU0MCwgc2VjdGlvbiAxMS42ICovXG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUFJJXCJdID0gMzRdID0gXCJQUklcIjtcbiAgICAvKiBSRkMtMjMyNiBSVFNQICovXG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiREVTQ1JJQkVcIl0gPSAzNV0gPSBcIkRFU0NSSUJFXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiQU5OT1VOQ0VcIl0gPSAzNl0gPSBcIkFOTk9VTkNFXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiU0VUVVBcIl0gPSAzN10gPSBcIlNFVFVQXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUExBWVwiXSA9IDM4XSA9IFwiUExBWVwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlBBVVNFXCJdID0gMzldID0gXCJQQVVTRVwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlRFQVJET1dOXCJdID0gNDBdID0gXCJURUFSRE9XTlwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkdFVF9QQVJBTUVURVJcIl0gPSA0MV0gPSBcIkdFVF9QQVJBTUVURVJcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJTRVRfUEFSQU1FVEVSXCJdID0gNDJdID0gXCJTRVRfUEFSQU1FVEVSXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUkVESVJFQ1RcIl0gPSA0M10gPSBcIlJFRElSRUNUXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUkVDT1JEXCJdID0gNDRdID0gXCJSRUNPUkRcIjtcbiAgICAvKiBSQU9QICovXG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiRkxVU0hcIl0gPSA0NV0gPSBcIkZMVVNIXCI7XG59KShNRVRIT0RTID0gZXhwb3J0cy5NRVRIT0RTIHx8IChleHBvcnRzLk1FVEhPRFMgPSB7fSkpO1xuZXhwb3J0cy5NRVRIT0RTX0hUVFAgPSBbXG4gICAgTUVUSE9EUy5ERUxFVEUsXG4gICAgTUVUSE9EUy5HRVQsXG4gICAgTUVUSE9EUy5IRUFELFxuICAgIE1FVEhPRFMuUE9TVCxcbiAgICBNRVRIT0RTLlBVVCxcbiAgICBNRVRIT0RTLkNPTk5FQ1QsXG4gICAgTUVUSE9EUy5PUFRJT05TLFxuICAgIE1FVEhPRFMuVFJBQ0UsXG4gICAgTUVUSE9EUy5DT1BZLFxuICAgIE1FVEhPRFMuTE9DSyxcbiAgICBNRVRIT0RTLk1LQ09MLFxuICAgIE1FVEhPRFMuTU9WRSxcbiAgICBNRVRIT0RTLlBST1BGSU5ELFxuICAgIE1FVEhPRFMuUFJPUFBBVENILFxuICAgIE1FVEhPRFMuU0VBUkNILFxuICAgIE1FVEhPRFMuVU5MT0NLLFxuICAgIE1FVEhPRFMuQklORCxcbiAgICBNRVRIT0RTLlJFQklORCxcbiAgICBNRVRIT0RTLlVOQklORCxcbiAgICBNRVRIT0RTLkFDTCxcbiAgICBNRVRIT0RTLlJFUE9SVCxcbiAgICBNRVRIT0RTLk1LQUNUSVZJVFksXG4gICAgTUVUSE9EUy5DSEVDS09VVCxcbiAgICBNRVRIT0RTLk1FUkdFLFxuICAgIE1FVEhPRFNbJ00tU0VBUkNIJ10sXG4gICAgTUVUSE9EUy5OT1RJRlksXG4gICAgTUVUSE9EUy5TVUJTQ1JJQkUsXG4gICAgTUVUSE9EUy5VTlNVQlNDUklCRSxcbiAgICBNRVRIT0RTLlBBVENILFxuICAgIE1FVEhPRFMuUFVSR0UsXG4gICAgTUVUSE9EUy5NS0NBTEVOREFSLFxuICAgIE1FVEhPRFMuTElOSyxcbiAgICBNRVRIT0RTLlVOTElOSyxcbiAgICBNRVRIT0RTLlBSSSxcbiAgICAvLyBUT0RPKGluZHV0bnkpOiBzaG91bGQgd2UgYWxsb3cgaXQgd2l0aCBIVFRQP1xuICAgIE1FVEhPRFMuU09VUkNFLFxuXTtcbmV4cG9ydHMuTUVUSE9EU19JQ0UgPSBbXG4gICAgTUVUSE9EUy5TT1VSQ0UsXG5dO1xuZXhwb3J0cy5NRVRIT0RTX1JUU1AgPSBbXG4gICAgTUVUSE9EUy5PUFRJT05TLFxuICAgIE1FVEhPRFMuREVTQ1JJQkUsXG4gICAgTUVUSE9EUy5BTk5PVU5DRSxcbiAgICBNRVRIT0RTLlNFVFVQLFxuICAgIE1FVEhPRFMuUExBWSxcbiAgICBNRVRIT0RTLlBBVVNFLFxuICAgIE1FVEhPRFMuVEVBUkRPV04sXG4gICAgTUVUSE9EUy5HRVRfUEFSQU1FVEVSLFxuICAgIE1FVEhPRFMuU0VUX1BBUkFNRVRFUixcbiAgICBNRVRIT0RTLlJFRElSRUNULFxuICAgIE1FVEhPRFMuUkVDT1JELFxuICAgIE1FVEhPRFMuRkxVU0gsXG4gICAgLy8gRm9yIEFpclBsYXlcbiAgICBNRVRIT0RTLkdFVCxcbiAgICBNRVRIT0RTLlBPU1QsXG5dO1xuZXhwb3J0cy5NRVRIT0RfTUFQID0gdXRpbHNfMS5lbnVtVG9NYXAoTUVUSE9EUyk7XG5leHBvcnRzLkhfTUVUSE9EX01BUCA9IHt9O1xuT2JqZWN0LmtleXMoZXhwb3J0cy5NRVRIT0RfTUFQKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBpZiAoL15ILy50ZXN0KGtleSkpIHtcbiAgICAgICAgZXhwb3J0cy5IX01FVEhPRF9NQVBba2V5XSA9IGV4cG9ydHMuTUVUSE9EX01BUFtrZXldO1xuICAgIH1cbn0pO1xudmFyIEZJTklTSDtcbihmdW5jdGlvbiAoRklOSVNIKSB7XG4gICAgRklOSVNIW0ZJTklTSFtcIlNBRkVcIl0gPSAwXSA9IFwiU0FGRVwiO1xuICAgIEZJTklTSFtGSU5JU0hbXCJTQUZFX1dJVEhfQ0JcIl0gPSAxXSA9IFwiU0FGRV9XSVRIX0NCXCI7XG4gICAgRklOSVNIW0ZJTklTSFtcIlVOU0FGRVwiXSA9IDJdID0gXCJVTlNBRkVcIjtcbn0pKEZJTklTSCA9IGV4cG9ydHMuRklOSVNIIHx8IChleHBvcnRzLkZJTklTSCA9IHt9KSk7XG5leHBvcnRzLkFMUEhBID0gW107XG5mb3IgKGxldCBpID0gJ0EnLmNoYXJDb2RlQXQoMCk7IGkgPD0gJ1onLmNoYXJDb2RlQXQoMCk7IGkrKykge1xuICAgIC8vIFVwcGVyIGNhc2VcbiAgICBleHBvcnRzLkFMUEhBLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShpKSk7XG4gICAgLy8gTG93ZXIgY2FzZVxuICAgIGV4cG9ydHMuQUxQSEEucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGkgKyAweDIwKSk7XG59XG5leHBvcnRzLk5VTV9NQVAgPSB7XG4gICAgMDogMCwgMTogMSwgMjogMiwgMzogMywgNDogNCxcbiAgICA1OiA1LCA2OiA2LCA3OiA3LCA4OiA4LCA5OiA5LFxufTtcbmV4cG9ydHMuSEVYX01BUCA9IHtcbiAgICAwOiAwLCAxOiAxLCAyOiAyLCAzOiAzLCA0OiA0LFxuICAgIDU6IDUsIDY6IDYsIDc6IDcsIDg6IDgsIDk6IDksXG4gICAgQTogMFhBLCBCOiAwWEIsIEM6IDBYQywgRDogMFhELCBFOiAwWEUsIEY6IDBYRixcbiAgICBhOiAweGEsIGI6IDB4YiwgYzogMHhjLCBkOiAweGQsIGU6IDB4ZSwgZjogMHhmLFxufTtcbmV4cG9ydHMuTlVNID0gW1xuICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5Jyxcbl07XG5leHBvcnRzLkFMUEhBTlVNID0gZXhwb3J0cy5BTFBIQS5jb25jYXQoZXhwb3J0cy5OVU0pO1xuZXhwb3J0cy5NQVJLID0gWyctJywgJ18nLCAnLicsICchJywgJ34nLCAnKicsICdcXCcnLCAnKCcsICcpJ107XG5leHBvcnRzLlVTRVJJTkZPX0NIQVJTID0gZXhwb3J0cy5BTFBIQU5VTVxuICAgIC5jb25jYXQoZXhwb3J0cy5NQVJLKVxuICAgIC5jb25jYXQoWyclJywgJzsnLCAnOicsICcmJywgJz0nLCAnKycsICckJywgJywnXSk7XG4vLyBUT0RPKGluZHV0bnkpOiB1c2UgUkZDXG5leHBvcnRzLlNUUklDVF9VUkxfQ0hBUiA9IFtcbiAgICAnIScsICdcIicsICckJywgJyUnLCAnJicsICdcXCcnLFxuICAgICcoJywgJyknLCAnKicsICcrJywgJywnLCAnLScsICcuJywgJy8nLFxuICAgICc6JywgJzsnLCAnPCcsICc9JywgJz4nLFxuICAgICdAJywgJ1snLCAnXFxcXCcsICddJywgJ14nLCAnXycsXG4gICAgJ2AnLFxuICAgICd7JywgJ3wnLCAnfScsICd+Jyxcbl0uY29uY2F0KGV4cG9ydHMuQUxQSEFOVU0pO1xuZXhwb3J0cy5VUkxfQ0hBUiA9IGV4cG9ydHMuU1RSSUNUX1VSTF9DSEFSXG4gICAgLmNvbmNhdChbJ1xcdCcsICdcXGYnXSk7XG4vLyBBbGwgY2hhcmFjdGVycyB3aXRoIDB4ODAgYml0IHNldCB0byAxXG5mb3IgKGxldCBpID0gMHg4MDsgaSA8PSAweGZmOyBpKyspIHtcbiAgICBleHBvcnRzLlVSTF9DSEFSLnB1c2goaSk7XG59XG5leHBvcnRzLkhFWCA9IGV4cG9ydHMuTlVNLmNvbmNhdChbJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJ10pO1xuLyogVG9rZW5zIGFzIGRlZmluZWQgYnkgcmZjIDI2MTYuIEFsc28gbG93ZXJjYXNlcyB0aGVtLlxuICogICAgICAgIHRva2VuICAgICAgID0gMSo8YW55IENIQVIgZXhjZXB0IENUTHMgb3Igc2VwYXJhdG9ycz5cbiAqICAgICBzZXBhcmF0b3JzICAgICA9IFwiKFwiIHwgXCIpXCIgfCBcIjxcIiB8IFwiPlwiIHwgXCJAXCJcbiAqICAgICAgICAgICAgICAgICAgICB8IFwiLFwiIHwgXCI7XCIgfCBcIjpcIiB8IFwiXFxcIiB8IDxcIj5cbiAqICAgICAgICAgICAgICAgICAgICB8IFwiL1wiIHwgXCJbXCIgfCBcIl1cIiB8IFwiP1wiIHwgXCI9XCJcbiAqICAgICAgICAgICAgICAgICAgICB8IFwie1wiIHwgXCJ9XCIgfCBTUCB8IEhUXG4gKi9cbmV4cG9ydHMuU1RSSUNUX1RPS0VOID0gW1xuICAgICchJywgJyMnLCAnJCcsICclJywgJyYnLCAnXFwnJyxcbiAgICAnKicsICcrJywgJy0nLCAnLicsXG4gICAgJ14nLCAnXycsICdgJyxcbiAgICAnfCcsICd+Jyxcbl0uY29uY2F0KGV4cG9ydHMuQUxQSEFOVU0pO1xuZXhwb3J0cy5UT0tFTiA9IGV4cG9ydHMuU1RSSUNUX1RPS0VOLmNvbmNhdChbJyAnXSk7XG4vKlxuICogVmVyaWZ5IHRoYXQgYSBjaGFyIGlzIGEgdmFsaWQgdmlzaWJsZSAocHJpbnRhYmxlKSBVUy1BU0NJSVxuICogY2hhcmFjdGVyIG9yICV4ODAtRkZcbiAqL1xuZXhwb3J0cy5IRUFERVJfQ0hBUlMgPSBbJ1xcdCddO1xuZm9yIChsZXQgaSA9IDMyOyBpIDw9IDI1NTsgaSsrKSB7XG4gICAgaWYgKGkgIT09IDEyNykge1xuICAgICAgICBleHBvcnRzLkhFQURFUl9DSEFSUy5wdXNoKGkpO1xuICAgIH1cbn1cbi8vICcsJyA9IFxceDQ0XG5leHBvcnRzLkNPTk5FQ1RJT05fVE9LRU5fQ0hBUlMgPSBleHBvcnRzLkhFQURFUl9DSEFSUy5maWx0ZXIoKGMpID0+IGMgIT09IDQ0KTtcbmV4cG9ydHMuTUFKT1IgPSBleHBvcnRzLk5VTV9NQVA7XG5leHBvcnRzLk1JTk9SID0gZXhwb3J0cy5NQUpPUjtcbnZhciBIRUFERVJfU1RBVEU7XG4oZnVuY3Rpb24gKEhFQURFUl9TVEFURSkge1xuICAgIEhFQURFUl9TVEFURVtIRUFERVJfU1RBVEVbXCJHRU5FUkFMXCJdID0gMF0gPSBcIkdFTkVSQUxcIjtcbiAgICBIRUFERVJfU1RBVEVbSEVBREVSX1NUQVRFW1wiQ09OTkVDVElPTlwiXSA9IDFdID0gXCJDT05ORUNUSU9OXCI7XG4gICAgSEVBREVSX1NUQVRFW0hFQURFUl9TVEFURVtcIkNPTlRFTlRfTEVOR1RIXCJdID0gMl0gPSBcIkNPTlRFTlRfTEVOR1RIXCI7XG4gICAgSEVBREVSX1NUQVRFW0hFQURFUl9TVEFURVtcIlRSQU5TRkVSX0VOQ09ESU5HXCJdID0gM10gPSBcIlRSQU5TRkVSX0VOQ09ESU5HXCI7XG4gICAgSEVBREVSX1NUQVRFW0hFQURFUl9TVEFURVtcIlVQR1JBREVcIl0gPSA0XSA9IFwiVVBHUkFERVwiO1xuICAgIEhFQURFUl9TVEFURVtIRUFERVJfU1RBVEVbXCJDT05ORUNUSU9OX0tFRVBfQUxJVkVcIl0gPSA1XSA9IFwiQ09OTkVDVElPTl9LRUVQX0FMSVZFXCI7XG4gICAgSEVBREVSX1NUQVRFW0hFQURFUl9TVEFURVtcIkNPTk5FQ1RJT05fQ0xPU0VcIl0gPSA2XSA9IFwiQ09OTkVDVElPTl9DTE9TRVwiO1xuICAgIEhFQURFUl9TVEFURVtIRUFERVJfU1RBVEVbXCJDT05ORUNUSU9OX1VQR1JBREVcIl0gPSA3XSA9IFwiQ09OTkVDVElPTl9VUEdSQURFXCI7XG4gICAgSEVBREVSX1NUQVRFW0hFQURFUl9TVEFURVtcIlRSQU5TRkVSX0VOQ09ESU5HX0NIVU5LRURcIl0gPSA4XSA9IFwiVFJBTlNGRVJfRU5DT0RJTkdfQ0hVTktFRFwiO1xufSkoSEVBREVSX1NUQVRFID0gZXhwb3J0cy5IRUFERVJfU1RBVEUgfHwgKGV4cG9ydHMuSEVBREVSX1NUQVRFID0ge30pKTtcbmV4cG9ydHMuU1BFQ0lBTF9IRUFERVJTID0ge1xuICAgICdjb25uZWN0aW9uJzogSEVBREVSX1NUQVRFLkNPTk5FQ1RJT04sXG4gICAgJ2NvbnRlbnQtbGVuZ3RoJzogSEVBREVSX1NUQVRFLkNPTlRFTlRfTEVOR1RILFxuICAgICdwcm94eS1jb25uZWN0aW9uJzogSEVBREVSX1NUQVRFLkNPTk5FQ1RJT04sXG4gICAgJ3RyYW5zZmVyLWVuY29kaW5nJzogSEVBREVSX1NUQVRFLlRSQU5TRkVSX0VOQ09ESU5HLFxuICAgICd1cGdyYWRlJzogSEVBREVSX1NUQVRFLlVQR1JBREUsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RhbnRzLmpzLm1hcCIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsga0JvZHlVc2VkIH0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcbmNvbnN0IEVFID0gcmVxdWlyZSgnZXZlbnRzJylcblxuY29uc3QgcmVkaXJlY3RhYmxlU3RhdHVzQ29kZXMgPSBbMzAwLCAzMDEsIDMwMiwgMzAzLCAzMDcsIDMwOF1cblxuY29uc3Qga0JvZHkgPSBTeW1ib2woJ2JvZHknKVxuXG5jbGFzcyBCb2R5QXN5bmNJdGVyYWJsZSB7XG4gIGNvbnN0cnVjdG9yIChib2R5KSB7XG4gICAgdGhpc1trQm9keV0gPSBib2R5XG4gICAgdGhpc1trQm9keVVzZWRdID0gZmFsc2VcbiAgfVxuXG4gIGFzeW5jICogW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSAoKSB7XG4gICAgYXNzZXJ0KCF0aGlzW2tCb2R5VXNlZF0sICdkaXN0dXJiZWQnKVxuICAgIHRoaXNba0JvZHlVc2VkXSA9IHRydWVcbiAgICB5aWVsZCAqIHRoaXNba0JvZHldXG4gIH1cbn1cblxuY2xhc3MgUmVkaXJlY3RIYW5kbGVyIHtcbiAgY29uc3RydWN0b3IgKGRpc3BhdGNoLCBtYXhSZWRpcmVjdGlvbnMsIG9wdHMsIGhhbmRsZXIpIHtcbiAgICBpZiAobWF4UmVkaXJlY3Rpb25zICE9IG51bGwgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKG1heFJlZGlyZWN0aW9ucykgfHwgbWF4UmVkaXJlY3Rpb25zIDwgMCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignbWF4UmVkaXJlY3Rpb25zIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKVxuICAgIH1cblxuICAgIHV0aWwudmFsaWRhdGVIYW5kbGVyKGhhbmRsZXIsIG9wdHMubWV0aG9kLCBvcHRzLnVwZ3JhZGUpXG5cbiAgICB0aGlzLmRpc3BhdGNoID0gZGlzcGF0Y2hcbiAgICB0aGlzLmxvY2F0aW9uID0gbnVsbFxuICAgIHRoaXMuYWJvcnQgPSBudWxsXG4gICAgdGhpcy5vcHRzID0geyAuLi5vcHRzLCBtYXhSZWRpcmVjdGlvbnM6IDAgfSAvLyBvcHRzIG11c3QgYmUgYSBjb3B5XG4gICAgdGhpcy5tYXhSZWRpcmVjdGlvbnMgPSBtYXhSZWRpcmVjdGlvbnNcbiAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyXG4gICAgdGhpcy5oaXN0b3J5ID0gW11cblxuICAgIGlmICh1dGlsLmlzU3RyZWFtKHRoaXMub3B0cy5ib2R5KSkge1xuICAgICAgLy8gVE9ETyAoZml4KTogUHJvdmlkZSBzb21lIHdheSBmb3IgdGhlIHVzZXIgdG8gY2FjaGUgdGhlIGZpbGUgdG8gZS5nLiAvdG1wXG4gICAgICAvLyBzbyB0aGF0IGl0IGNhbiBiZSBkaXNwYXRjaGVkIGFnYWluP1xuICAgICAgLy8gVE9ETyAoZml4KTogRG8gd2UgbmVlZCAxMDAtZXhwZWN0IHN1cHBvcnQgdG8gcHJvdmlkZSBhIHdheSB0byBkbyB0aGlzIHByb3Blcmx5P1xuICAgICAgaWYgKHV0aWwuYm9keUxlbmd0aCh0aGlzLm9wdHMuYm9keSkgPT09IDApIHtcbiAgICAgICAgdGhpcy5vcHRzLmJvZHlcbiAgICAgICAgICAub24oJ2RhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBhc3NlcnQoZmFsc2UpXG4gICAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdHMuYm9keS5yZWFkYWJsZURpZFJlYWQgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aGlzLm9wdHMuYm9keVtrQm9keVVzZWRdID0gZmFsc2VcbiAgICAgICAgRUUucHJvdG90eXBlLm9uLmNhbGwodGhpcy5vcHRzLmJvZHksICdkYXRhJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRoaXNba0JvZHlVc2VkXSA9IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMub3B0cy5ib2R5ICYmIHR5cGVvZiB0aGlzLm9wdHMuYm9keS5waXBlVG8gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFRPRE8gKGZpeCk6IFdlIGNhbid0IGFjY2VzcyBSZWFkYWJsZVN0cmVhbSBpbnRlcm5hbCBzdGF0ZVxuICAgICAgLy8gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGl0IGhhcyBiZWVuIGRpc3R1cmJlZC4gVGhpcyBpcyBqdXN0XG4gICAgICAvLyBhIHdvcmthcm91bmQuXG4gICAgICB0aGlzLm9wdHMuYm9keSA9IG5ldyBCb2R5QXN5bmNJdGVyYWJsZSh0aGlzLm9wdHMuYm9keSlcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5vcHRzLmJvZHkgJiZcbiAgICAgIHR5cGVvZiB0aGlzLm9wdHMuYm9keSAhPT0gJ3N0cmluZycgJiZcbiAgICAgICFBcnJheUJ1ZmZlci5pc1ZpZXcodGhpcy5vcHRzLmJvZHkpICYmXG4gICAgICB1dGlsLmlzSXRlcmFibGUodGhpcy5vcHRzLmJvZHkpXG4gICAgKSB7XG4gICAgICAvLyBUT0RPOiBTaG91bGQgd2UgYWxsb3cgcmUtdXNpbmcgaXRlcmFibGUgaWYgIXRoaXMub3B0cy5pZGVtcG90ZW50XG4gICAgICAvLyBvciB0aHJvdWdoIHNvbWUgb3RoZXIgZmxhZz9cbiAgICAgIHRoaXMub3B0cy5ib2R5ID0gbmV3IEJvZHlBc3luY0l0ZXJhYmxlKHRoaXMub3B0cy5ib2R5KVxuICAgIH1cbiAgfVxuXG4gIG9uQ29ubmVjdCAoYWJvcnQpIHtcbiAgICB0aGlzLmFib3J0ID0gYWJvcnRcbiAgICB0aGlzLmhhbmRsZXIub25Db25uZWN0KGFib3J0LCB7IGhpc3Rvcnk6IHRoaXMuaGlzdG9yeSB9KVxuICB9XG5cbiAgb25VcGdyYWRlIChzdGF0dXNDb2RlLCBoZWFkZXJzLCBzb2NrZXQpIHtcbiAgICB0aGlzLmhhbmRsZXIub25VcGdyYWRlKHN0YXR1c0NvZGUsIGhlYWRlcnMsIHNvY2tldClcbiAgfVxuXG4gIG9uRXJyb3IgKGVycm9yKSB7XG4gICAgdGhpcy5oYW5kbGVyLm9uRXJyb3IoZXJyb3IpXG4gIH1cblxuICBvbkhlYWRlcnMgKHN0YXR1c0NvZGUsIGhlYWRlcnMsIHJlc3VtZSwgc3RhdHVzVGV4dCkge1xuICAgIHRoaXMubG9jYXRpb24gPSB0aGlzLmhpc3RvcnkubGVuZ3RoID49IHRoaXMubWF4UmVkaXJlY3Rpb25zIHx8IHV0aWwuaXNEaXN0dXJiZWQodGhpcy5vcHRzLmJvZHkpXG4gICAgICA/IG51bGxcbiAgICAgIDogcGFyc2VMb2NhdGlvbihzdGF0dXNDb2RlLCBoZWFkZXJzKVxuXG4gICAgaWYgKHRoaXMub3B0cy5vcmlnaW4pIHtcbiAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKG5ldyBVUkwodGhpcy5vcHRzLnBhdGgsIHRoaXMub3B0cy5vcmlnaW4pKVxuICAgIH1cblxuICAgIGlmICghdGhpcy5sb2NhdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkhlYWRlcnMoc3RhdHVzQ29kZSwgaGVhZGVycywgcmVzdW1lLCBzdGF0dXNUZXh0KVxuICAgIH1cblxuICAgIGNvbnN0IHsgb3JpZ2luLCBwYXRobmFtZSwgc2VhcmNoIH0gPSB1dGlsLnBhcnNlVVJMKG5ldyBVUkwodGhpcy5sb2NhdGlvbiwgdGhpcy5vcHRzLm9yaWdpbiAmJiBuZXcgVVJMKHRoaXMub3B0cy5wYXRoLCB0aGlzLm9wdHMub3JpZ2luKSkpXG4gICAgY29uc3QgcGF0aCA9IHNlYXJjaCA/IGAke3BhdGhuYW1lfSR7c2VhcmNofWAgOiBwYXRobmFtZVxuXG4gICAgLy8gUmVtb3ZlIGhlYWRlcnMgcmVmZXJyaW5nIHRvIHRoZSBvcmlnaW5hbCBVUkwuXG4gICAgLy8gQnkgZGVmYXVsdCBpdCBpcyBIb3N0IG9ubHksIHVubGVzcyBpdCdzIGEgMzAzIChzZWUgYmVsb3cpLCB3aGljaCByZW1vdmVzIGFsc28gYWxsIENvbnRlbnQtKiBoZWFkZXJzLlxuICAgIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi40XG4gICAgdGhpcy5vcHRzLmhlYWRlcnMgPSBjbGVhblJlcXVlc3RIZWFkZXJzKHRoaXMub3B0cy5oZWFkZXJzLCBzdGF0dXNDb2RlID09PSAzMDMsIHRoaXMub3B0cy5vcmlnaW4gIT09IG9yaWdpbilcbiAgICB0aGlzLm9wdHMucGF0aCA9IHBhdGhcbiAgICB0aGlzLm9wdHMub3JpZ2luID0gb3JpZ2luXG4gICAgdGhpcy5vcHRzLm1heFJlZGlyZWN0aW9ucyA9IDBcbiAgICB0aGlzLm9wdHMucXVlcnkgPSBudWxsXG5cbiAgICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNC40XG4gICAgLy8gSW4gY2FzZSBvZiBIVFRQIDMwMywgYWx3YXlzIHJlcGxhY2UgbWV0aG9kIHRvIGJlIGVpdGhlciBIRUFEIG9yIEdFVFxuICAgIGlmIChzdGF0dXNDb2RlID09PSAzMDMgJiYgdGhpcy5vcHRzLm1ldGhvZCAhPT0gJ0hFQUQnKSB7XG4gICAgICB0aGlzLm9wdHMubWV0aG9kID0gJ0dFVCdcbiAgICAgIHRoaXMub3B0cy5ib2R5ID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIG9uRGF0YSAoY2h1bmspIHtcbiAgICBpZiAodGhpcy5sb2NhdGlvbikge1xuICAgICAgLypcbiAgICAgICAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjRcblxuICAgICAgICBUTERSOiB1bmRpY2kgYWx3YXlzIGlnbm9yZXMgM3h4IHJlc3BvbnNlIGJvZGllcy5cblxuICAgICAgICBSZWRpcmVjdGlvbiBpcyB1c2VkIHRvIHNlcnZlIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgZnJvbSBhbm90aGVyIFVSTCwgc28gaXQgaXMgYXNzdW1lcyB0aGF0XG4gICAgICAgIG5vIGJvZHkgaXMgZ2VuZXJhdGVkIChhbmQgdGh1cyBjYW4gYmUgaWdub3JlZCkuIEV2ZW4gdGhvdWdoIGdlbmVyYXRpbmcgYSBib2R5IGlzIG5vdCBwcm9oaWJpdGVkLlxuXG4gICAgICAgIEZvciBzdGF0dXMgMzAxLCAzMDIsIDMwMywgMzA3IGFuZCAzMDggKHRoZSBsYXR0ZXIgZnJvbSBSRkMgNzIzOCksIHRoZSBzcGVjcyBtZW50aW9uIHRoYXQgdGhlIGJvZHkgdXN1YWxseVxuICAgICAgICAod2hpY2ggbWVhbnMgaXQncyBvcHRpb25hbCBhbmQgbm90IG1hbmRhdGVkKSBjb250YWluIGp1c3QgYW4gaHlwZXJsaW5rIHRvIHRoZSB2YWx1ZSBvZlxuICAgICAgICB0aGUgTG9jYXRpb24gcmVzcG9uc2UgaGVhZGVyLCBzbyB0aGUgYm9keSBjYW4gYmUgaWdub3JlZCBzYWZlbHkuXG5cbiAgICAgICAgRm9yIHN0YXR1cyAzMDAsIHdoaWNoIGlzIFwiTXVsdGlwbGUgQ2hvaWNlc1wiLCB0aGUgc3BlYyBtZW50aW9ucyBib3RoIGdlbmVyYXRpbmcgYSBMb2NhdGlvblxuICAgICAgICByZXNwb25zZSBoZWFkZXIgQU5EIGEgcmVzcG9uc2UgYm9keSB3aXRoIHRoZSBvdGhlciBwb3NzaWJsZSBsb2NhdGlvbiB0byBmb2xsb3cuXG4gICAgICAgIFNpbmNlIHRoZSBzcGVjIGV4cGxpY2l0aWx5IGNob29zZXMgbm90IHRvIHNwZWNpZnkgYSBmb3JtYXQgZm9yIHN1Y2ggYm9keSBhbmQgbGVhdmUgaXQgdG9cbiAgICAgICAgc2VydmVycyBhbmQgYnJvd3NlcnMgaW1wbGVtZW50b3JzLCB3ZSBpZ25vcmUgdGhlIGJvZHkgYXMgdGhlcmUgaXMgbm8gc3BlY2lmaWVkIHdheSB0byBldmVudHVhbGx5IHBhcnNlIGl0LlxuICAgICAgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkRhdGEoY2h1bmspXG4gICAgfVxuICB9XG5cbiAgb25Db21wbGV0ZSAodHJhaWxlcnMpIHtcbiAgICBpZiAodGhpcy5sb2NhdGlvbikge1xuICAgICAgLypcbiAgICAgICAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjRcblxuICAgICAgICBUTERSOiB1bmRpY2kgYWx3YXlzIGlnbm9yZXMgM3h4IHJlc3BvbnNlIHRyYWlsZXJzIGFzIHRoZXkgYXJlIG5vdCBleHBlY3RlZCBpbiBjYXNlIG9mIHJlZGlyZWN0aW9uc1xuICAgICAgICBhbmQgbmVpdGhlciBhcmUgdXNlZnVsIGlmIHByZXNlbnQuXG5cbiAgICAgICAgU2VlIGNvbW1lbnQgb24gb25EYXRhIG1ldGhvZCBhYm92ZSBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbnMuXG4gICAgICAqL1xuXG4gICAgICB0aGlzLmxvY2F0aW9uID0gbnVsbFxuICAgICAgdGhpcy5hYm9ydCA9IG51bGxcblxuICAgICAgdGhpcy5kaXNwYXRjaCh0aGlzLm9wdHMsIHRoaXMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGFuZGxlci5vbkNvbXBsZXRlKHRyYWlsZXJzKVxuICAgIH1cbiAgfVxuXG4gIG9uQm9keVNlbnQgKGNodW5rKSB7XG4gICAgaWYgKHRoaXMuaGFuZGxlci5vbkJvZHlTZW50KSB7XG4gICAgICB0aGlzLmhhbmRsZXIub25Cb2R5U2VudChjaHVuaylcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VMb2NhdGlvbiAoc3RhdHVzQ29kZSwgaGVhZGVycykge1xuICBpZiAocmVkaXJlY3RhYmxlU3RhdHVzQ29kZXMuaW5kZXhPZihzdGF0dXNDb2RlKSA9PT0gLTEpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgaWYgKGhlYWRlcnNbaV0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09PSAnbG9jYXRpb24nKSB7XG4gICAgICByZXR1cm4gaGVhZGVyc1tpICsgMV1cbiAgICB9XG4gIH1cbn1cblxuLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjQuNFxuZnVuY3Rpb24gc2hvdWxkUmVtb3ZlSGVhZGVyIChoZWFkZXIsIHJlbW92ZUNvbnRlbnQsIHVua25vd25PcmlnaW4pIHtcbiAgaWYgKGhlYWRlci5sZW5ndGggPT09IDQpIHtcbiAgICByZXR1cm4gdXRpbC5oZWFkZXJOYW1lVG9TdHJpbmcoaGVhZGVyKSA9PT0gJ2hvc3QnXG4gIH1cbiAgaWYgKHJlbW92ZUNvbnRlbnQgJiYgdXRpbC5oZWFkZXJOYW1lVG9TdHJpbmcoaGVhZGVyKS5zdGFydHNXaXRoKCdjb250ZW50LScpKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICBpZiAodW5rbm93bk9yaWdpbiAmJiAoaGVhZGVyLmxlbmd0aCA9PT0gMTMgfHwgaGVhZGVyLmxlbmd0aCA9PT0gNiB8fCBoZWFkZXIubGVuZ3RoID09PSAxOSkpIHtcbiAgICBjb25zdCBuYW1lID0gdXRpbC5oZWFkZXJOYW1lVG9TdHJpbmcoaGVhZGVyKVxuICAgIHJldHVybiBuYW1lID09PSAnYXV0aG9yaXphdGlvbicgfHwgbmFtZSA9PT0gJ2Nvb2tpZScgfHwgbmFtZSA9PT0gJ3Byb3h5LWF1dGhvcml6YXRpb24nXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi40XG5mdW5jdGlvbiBjbGVhblJlcXVlc3RIZWFkZXJzIChoZWFkZXJzLCByZW1vdmVDb250ZW50LCB1bmtub3duT3JpZ2luKSB7XG4gIGNvbnN0IHJldCA9IFtdXG4gIGlmIChBcnJheS5pc0FycmF5KGhlYWRlcnMpKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICBpZiAoIXNob3VsZFJlbW92ZUhlYWRlcihoZWFkZXJzW2ldLCByZW1vdmVDb250ZW50LCB1bmtub3duT3JpZ2luKSkge1xuICAgICAgICByZXQucHVzaChoZWFkZXJzW2ldLCBoZWFkZXJzW2kgKyAxXSlcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoaGVhZGVycyAmJiB0eXBlb2YgaGVhZGVycyA9PT0gJ29iamVjdCcpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhoZWFkZXJzKSkge1xuICAgICAgaWYgKCFzaG91bGRSZW1vdmVIZWFkZXIoa2V5LCByZW1vdmVDb250ZW50LCB1bmtub3duT3JpZ2luKSkge1xuICAgICAgICByZXQucHVzaChrZXksIGhlYWRlcnNba2V5XSlcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYXNzZXJ0KGhlYWRlcnMgPT0gbnVsbCwgJ2hlYWRlcnMgbXVzdCBiZSBhbiBvYmplY3Qgb3IgYW4gYXJyYXknKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSZWRpcmVjdEhhbmRsZXJcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBSZWRpcmVjdEhhbmRsZXIgPSByZXF1aXJlKCcuLi9oYW5kbGVyL1JlZGlyZWN0SGFuZGxlcicpXG5cbmZ1bmN0aW9uIGNyZWF0ZVJlZGlyZWN0SW50ZXJjZXB0b3IgKHsgbWF4UmVkaXJlY3Rpb25zOiBkZWZhdWx0TWF4UmVkaXJlY3Rpb25zIH0pIHtcbiAgcmV0dXJuIChkaXNwYXRjaCkgPT4ge1xuICAgIHJldHVybiBmdW5jdGlvbiBJbnRlcmNlcHQgKG9wdHMsIGhhbmRsZXIpIHtcbiAgICAgIGNvbnN0IHsgbWF4UmVkaXJlY3Rpb25zID0gZGVmYXVsdE1heFJlZGlyZWN0aW9ucyB9ID0gb3B0c1xuXG4gICAgICBpZiAoIW1heFJlZGlyZWN0aW9ucykge1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2gob3B0cywgaGFuZGxlcilcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVkaXJlY3RIYW5kbGVyID0gbmV3IFJlZGlyZWN0SGFuZGxlcihkaXNwYXRjaCwgbWF4UmVkaXJlY3Rpb25zLCBvcHRzLCBoYW5kbGVyKVxuICAgICAgb3B0cyA9IHsgLi4ub3B0cywgbWF4UmVkaXJlY3Rpb25zOiAwIH0gLy8gU3RvcCBzdWIgZGlzcGF0Y2hlciBmcm9tIGFsc28gcmVkaXJlY3RpbmcuXG4gICAgICByZXR1cm4gZGlzcGF0Y2gob3B0cywgcmVkaXJlY3RIYW5kbGVyKVxuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVJlZGlyZWN0SW50ZXJjZXB0b3JcbiIsIm1vZHVsZS5leHBvcnRzID0gJ0FHRnpiUUVBQUFBQk1BaGdBWDhCZjJBRGYzOS9BWDlnQkg5L2YzOEJmMkFBQUdBRGYzOS9BR0FCZndCZ0FuOS9BR0FHZjM5L2YzOS9BQUxMQVFnRFpXNTJHSGRoYzIxZmIyNWZhR1ZoWkdWeWMxOWpiMjF3YkdWMFpRQUNBMlZ1ZGhWM1lYTnRYMjl1WDIxbGMzTmhaMlZmWW1WbmFXNEFBQU5sYm5ZTGQyRnpiVjl2Ymw5MWNtd0FBUU5sYm5ZT2QyRnpiVjl2Ymw5emRHRjBkWE1BQVFObGJuWVVkMkZ6YlY5dmJsOW9aV0ZrWlhKZlptbGxiR1FBQVFObGJuWVVkMkZ6YlY5dmJsOW9aV0ZrWlhKZmRtRnNkV1VBQVFObGJuWU1kMkZ6YlY5dmJsOWliMlI1QUFFRFpXNTJHSGRoYzIxZmIyNWZiV1Z6YzJGblpWOWpiMjF3YkdWMFpRQUFBMFpGQXdNRUFBQUZBQUFBQUFBQUJRRUZBQVVGQlFBQUJnQUFBQUFHQmdZR0FRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQkFBQUJBUWNBQUFVRkF3QUJCQVVCY0FFU0VnVURBUUFDQmdnQmZ3RkJnTlFFQ3dmUkJTSUdiV1Z0YjNKNUFnQUxYMmx1YVhScFlXeHBlbVVBQ1JsZlgybHVaR2x5WldOMFgyWjFibU4wYVc5dVgzUmhZbXhsQVFBTGJHeG9kSFJ3WDJsdWFYUUFDaGhzYkdoMGRIQmZjMmh2ZFd4a1gydGxaWEJmWVd4cGRtVUFRUXhzYkdoMGRIQmZZV3hzYjJNQURBWnRZV3hzYjJNQVJndHNiR2gwZEhCZlpuSmxaUUFOQkdaeVpXVUFTQTlzYkdoMGRIQmZaMlYwWDNSNWNHVUFEaFZzYkdoMGRIQmZaMlYwWDJoMGRIQmZiV0ZxYjNJQUR4VnNiR2gwZEhCZloyVjBYMmgwZEhCZmJXbHViM0lBRUJGc2JHaDBkSEJmWjJWMFgyMWxkR2h2WkFBUkZteHNhSFIwY0Y5blpYUmZjM1JoZEhWelgyTnZaR1VBRWhKc2JHaDBkSEJmWjJWMFgzVndaM0poWkdVQUV3eHNiR2gwZEhCZmNtVnpaWFFBRkE1c2JHaDBkSEJmWlhobFkzVjBaUUFWRkd4c2FIUjBjRjl6WlhSMGFXNW5jMTlwYm1sMEFCWU5iR3hvZEhSd1gyWnBibWx6YUFBWERHeHNhSFIwY0Y5d1lYVnpaUUFZRFd4c2FIUjBjRjl5WlhOMWJXVUFHUnRzYkdoMGRIQmZjbVZ6ZFcxbFgyRm1kR1Z5WDNWd1ozSmhaR1VBR2hCc2JHaDBkSEJmWjJWMFgyVnljbTV2QUJzWGJHeG9kSFJ3WDJkbGRGOWxjbkp2Y2w5eVpXRnpiMjRBSEJkc2JHaDBkSEJmYzJWMFgyVnljbTl5WDNKbFlYTnZiZ0FkRkd4c2FIUjBjRjluWlhSZlpYSnliM0pmY0c5ekFCNFJiR3hvZEhSd1gyVnljbTV2WDI1aGJXVUFIeEpzYkdoMGRIQmZiV1YwYUc5a1gyNWhiV1VBSUJKc2JHaDBkSEJmYzNSaGRIVnpYMjVoYldVQUlScHNiR2gwZEhCZmMyVjBYMnhsYm1sbGJuUmZhR1ZoWkdWeWN3QWlJV3hzYUhSMGNGOXpaWFJmYkdWdWFXVnVkRjlqYUhWdWEyVmtYMnhsYm1kMGFBQWpIV3hzYUhSMGNGOXpaWFJmYkdWdWFXVnVkRjlyWldWd1gyRnNhWFpsQUNRa2JHeG9kSFJ3WDNObGRGOXNaVzVwWlc1MFgzUnlZVzV6Wm1WeVgyVnVZMjlrYVc1bkFDVVliR3hvZEhSd1gyMWxjM05oWjJWZmJtVmxaSE5mWlc5bUFEOEpGd0VBUVFFTEVRRUNBd1FGQ3dZSE5UazNNUzh0SnlzcENzTGdBa1VDQUFzSUFCQ0lnSUNBQUFzWkFDQUFFTUtBZ0lBQUdpQUFJQUkyQWpnZ0FDQUJPZ0FvQ3h3QUlBQWdBQzhCTWlBQUxRQXVJQUFRd1lDQWdBQVFnSUNBZ0FBTEtnRUJmMEhBQUJER2dJQ0FBQ0lCRU1LQWdJQUFHaUFCUVlDSWdJQUFOZ0k0SUFFZ0FEb0FLQ0FCQ3dvQUlBQVF5SUNBZ0FBTEJ3QWdBQzBBS0FzSEFDQUFMUUFxQ3djQUlBQXRBQ3NMQndBZ0FDMEFLUXNIQUNBQUx3RXlDd2NBSUFBdEFDNExSUUVFZnlBQUtBSVlJUUVnQUMwQUxTRUNJQUF0QUNnaEF5QUFLQUk0SVFRZ0FCRENnSUNBQUJvZ0FDQUVOZ0k0SUFBZ0F6b0FLQ0FBSUFJNkFDMGdBQ0FCTmdJWUN4RUFJQUFnQVNBQklBSnFFTU9BZ0lBQUN4QUFJQUJCQUVIY0FCRE1nSUNBQUJvTFp3RUJmMEVBSVFFQ1FDQUFLQUlNRFFBQ1FBSkFBa0FDUUNBQUxRQXZEZ01CQUFNQ0N5QUFLQUk0SWdGRkRRQWdBU2dDTENJQlJRMEFJQUFnQVJHQWdJQ0FBQUFpQVEwREMwRUFEd3NReW9DQWdBQUFDeUFBUWNPV2dJQUFOZ0lRUVE0aEFRc2dBUXNlQUFKQUlBQW9BZ3dOQUNBQVFkR2JnSUFBTmdJUUlBQkJGVFlDREFzTEZnQUNRQ0FBS0FJTVFSVkhEUUFnQUVFQU5nSU1Dd3NXQUFKQUlBQW9BZ3hCRmtjTkFDQUFRUUEyQWd3TEN3Y0FJQUFvQWd3TEJ3QWdBQ2dDRUFzSkFDQUFJQUUyQWhBTEJ3QWdBQ2dDRkFzaUFBSkFJQUJCSkVrTkFCREtnSUNBQUFBTElBQkJBblJCb0xPQWdBQnFLQUlBQ3lJQUFrQWdBRUV1U1EwQUVNcUFnSUFBQUFzZ0FFRUNkRUd3dElDQUFHb29BZ0FMN2dzQkFYOUI2NmlBZ0FBaEFRSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQUJCbkg5cUR2UURZMklBQVdGaFlXRmhZUUlEQkFWaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhCZ2NJQ1FvTERBME9EMkZoWVdGaEVHRmhZV0ZoWVdGaFlXRmhFV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZUklURkJVV0Z4Z1pHaHRoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoSEIwZUh5QWhJaU1rSlNZbktDa3FLeXd0TGk4d01USXpORFUyWVRjNE9UcGhZV0ZoWVdGaFlUdGhZV0U4WVdGaFlUMCtQMkZoWVdGaFlXRmhRR0ZoUVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlVSkRSRVZHUjBoSlNrdE1UVTVQVUZGU1UyRmhZV0ZoWVdGaFZGVldWMWhaV2x0aFhGMWhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZlWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWDJCaEMwSGhwNENBQUE4TFFhU2hnSUFBRHd0Qnk2eUFnQUFQQzBIK3NZQ0FBQThMUWNDa2dJQUFEd3RCcTZTQWdBQVBDMEdOcUlDQUFBOExRZUttZ0lBQUR3dEJnTENBZ0FBUEMwRzVyNENBQUE4TFFkZWtnSUFBRHd0Qjc1K0FnQUFQQzBIaG40Q0FBQThMUWZxZmdJQUFEd3RCOHFDQWdBQVBDMEdvcjRDQUFBOExRYTZ5Z0lBQUR3dEJpTENBZ0FBUEMwSHNwNENBQUE4TFFZS2lnSUFBRHd0QmpwMkFnQUFQQzBIUXJvQ0FBQThMUWNxamdJQUFEd3RCeGJLQWdBQVBDMEhmbklDQUFBOExRZEtjZ0lBQUR3dEJ4S0NBZ0FBUEMwSFhvSUNBQUE4TFFhS2ZnSUFBRHd0QjdhNkFnQUFQQzBHcnNJQ0FBQThMUWRTbGdJQUFEd3RCeks2QWdBQVBDMEg2cm9DQUFBOExRZnlyZ0lBQUR3dEIwckNBZ0FBUEMwSHhuWUNBQUE4TFFidWdnSUFBRHd0Qjk2dUFnQUFQQzBHUXNZQ0FBQThMUWRleGdJQUFEd3RCb3EyQWdBQVBDMEhVcDRDQUFBOExRZUNyZ0lBQUR3dEJuNnlBZ0FBUEMwSHJzWUNBQUE4TFFkV2ZnSUFBRHd0QnlyR0FnQUFQQzBIZXBZQ0FBQThMUWRTZWdJQUFEd3RCOUp5QWdBQVBDMEduc29DQUFBOExRYkdkZ0lBQUR3dEJvSjJBZ0FBUEMwRzVzWUNBQUE4TFFieXdnSUFBRHd0QmtxR0FnQUFQQzBHenBvQ0FBQThMUWVtc2dJQUFEd3RCcko2QWdBQVBDMEhVcTRDQUFBOExRZmVtZ0lBQUR3dEJnS2FBZ0FBUEMwR3dvWUNBQUE4TFFmNmVnSUFBRHd0QmphT0FnQUFQQzBHSnJZQ0FBQThMUWZlaWdJQUFEd3RCb0xHQWdBQVBDMEd1bjRDQUFBOExRY2FsZ0lBQUR3dEI2SjZBZ0FBUEMwR1Rvb0NBQUE4TFFjS3ZnSUFBRHd0Qnc1MkFnQUFQQzBHTHJJQ0FBQThMUWVHZGdJQUFEd3RCamErQWdBQVBDMEhxb1lDQUFBOExRYlN0Z0lBQUR3dEIwcStBZ0FBUEMwSGZzb0NBQUE4TFFkS3lnSUFBRHd0QjhMQ0FnQUFQQzBHcG9vQ0FBQThMUWZtamdJQUFEd3RCbVo2QWdBQVBDMEcxcklDQUFBOExRWnV3Z0lBQUR3dEJrcktBZ0FBUEMwRzJxNENBQUE4TFFjS2lnSUFBRHd0QitMS0FnQUFQQzBHZXBZQ0FBQThMUWRDaWdJQUFEd3RCdXA2QWdBQVBDMEdCbm9DQUFBOExFTXFBZ0lBQUFBdEIxcUdBZ0FBaEFRc2dBUXNXQUNBQUlBQXRBQzFCL2dGeElBRkJBRWR5T2dBdEN4a0FJQUFnQUMwQUxVSDlBWEVnQVVFQVIwRUJkSEk2QUMwTEdRQWdBQ0FBTFFBdFFmc0JjU0FCUVFCSFFRSjBjam9BTFFzWkFDQUFJQUF0QUMxQjl3RnhJQUZCQUVkQkEzUnlPZ0F0Q3k0QkFuOUJBQ0VEQWtBZ0FDZ0NPQ0lFUlEwQUlBUW9BZ0FpQkVVTkFDQUFJQVFSZ0lDQWdBQUFJUU1MSUFNTFNRRUNmMEVBSVFNQ1FDQUFLQUk0SWdSRkRRQWdCQ2dDQkNJRVJRMEFJQUFnQVNBQ0lBRnJJQVFSZ1lDQWdBQUFJZ05CZjBjTkFDQUFRY2FSZ0lBQU5nSVFRUmdoQXdzZ0F3c3VBUUovUVFBaEF3SkFJQUFvQWpnaUJFVU5BQ0FFS0FJd0lnUkZEUUFnQUNBRUVZQ0FnSUFBQUNFREN5QURDMGtCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FnZ2lCRVVOQUNBQUlBRWdBaUFCYXlBRUVZR0FnSUFBQUNJRFFYOUhEUUFnQUVIMmlvQ0FBRFlDRUVFWUlRTUxJQU1MTGdFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NOQ0lFUlEwQUlBQWdCQkdBZ0lDQUFBQWhBd3NnQXd0SkFRSi9RUUFoQXdKQUlBQW9BamdpQkVVTkFDQUVLQUlNSWdSRkRRQWdBQ0FCSUFJZ0FXc2dCQkdCZ0lDQUFBQWlBMEYvUncwQUlBQkI3WnFBZ0FBMkFoQkJHQ0VEQ3lBREN5NEJBbjlCQUNFREFrQWdBQ2dDT0NJRVJRMEFJQVFvQWpnaUJFVU5BQ0FBSUFRUmdJQ0FnQUFBSVFNTElBTUxTUUVDZjBFQUlRTUNRQ0FBS0FJNElnUkZEUUFnQkNnQ0VDSUVSUTBBSUFBZ0FTQUNJQUZySUFRUmdZQ0FnQUFBSWdOQmYwY05BQ0FBUVpXUWdJQUFOZ0lRUVJnaEF3c2dBd3N1QVFKL1FRQWhBd0pBSUFBb0FqZ2lCRVVOQUNBRUtBSThJZ1JGRFFBZ0FDQUVFWUNBZ0lBQUFDRURDeUFEQzBrQkFuOUJBQ0VEQWtBZ0FDZ0NPQ0lFUlEwQUlBUW9BaFFpQkVVTkFDQUFJQUVnQWlBQmF5QUVFWUdBZ0lBQUFDSURRWDlIRFFBZ0FFR3FtNENBQURZQ0VFRVlJUU1MSUFNTExnRUNmMEVBSVFNQ1FDQUFLQUk0SWdSRkRRQWdCQ2dDUUNJRVJRMEFJQUFnQkJHQWdJQ0FBQUFoQXdzZ0F3dEpBUUovUVFBaEF3SkFJQUFvQWpnaUJFVU5BQ0FFS0FJWUlnUkZEUUFnQUNBQklBSWdBV3NnQkJHQmdJQ0FBQUFpQTBGL1J3MEFJQUJCN1pPQWdBQTJBaEJCR0NFREN5QURDeTRCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FrUWlCRVVOQUNBQUlBUVJnSUNBZ0FBQUlRTUxJQU1MTGdFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NKQ0lFUlEwQUlBQWdCQkdBZ0lDQUFBQWhBd3NnQXdzdUFRSi9RUUFoQXdKQUlBQW9BamdpQkVVTkFDQUVLQUlzSWdSRkRRQWdBQ0FFRVlDQWdJQUFBQ0VEQ3lBREMwa0JBbjlCQUNFREFrQWdBQ2dDT0NJRVJRMEFJQVFvQWlnaUJFVU5BQ0FBSUFFZ0FpQUJheUFFRVlHQWdJQUFBQ0lEUVg5SERRQWdBRUgyaUlDQUFEWUNFRUVZSVFNTElBTUxMZ0VDZjBFQUlRTUNRQ0FBS0FJNElnUkZEUUFnQkNnQ1VDSUVSUTBBSUFBZ0JCR0FnSUNBQUFBaEF3c2dBd3RKQVFKL1FRQWhBd0pBSUFBb0FqZ2lCRVVOQUNBRUtBSWNJZ1JGRFFBZ0FDQUJJQUlnQVdzZ0JCR0JnSUNBQUFBaUEwRi9SdzBBSUFCQndwbUFnQUEyQWhCQkdDRURDeUFEQ3k0QkFuOUJBQ0VEQWtBZ0FDZ0NPQ0lFUlEwQUlBUW9Ba2dpQkVVTkFDQUFJQVFSZ0lDQWdBQUFJUU1MSUFNTFNRRUNmMEVBSVFNQ1FDQUFLQUk0SWdSRkRRQWdCQ2dDSUNJRVJRMEFJQUFnQVNBQ0lBRnJJQVFSZ1lDQWdBQUFJZ05CZjBjTkFDQUFRWlNVZ0lBQU5nSVFRUmdoQXdzZ0F3c3VBUUovUVFBaEF3SkFJQUFvQWpnaUJFVU5BQ0FFS0FKTUlnUkZEUUFnQUNBRUVZQ0FnSUFBQUNFREN5QURDeTRCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FsUWlCRVVOQUNBQUlBUVJnSUNBZ0FBQUlRTUxJQU1MTGdFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NXQ0lFUlEwQUlBQWdCQkdBZ0lDQUFBQWhBd3NnQXd0RkFRRi9Ba0FDUUNBQUx3RXdRUlJ4UVJSSERRQkJBU0VESUFBdEFDaEJBVVlOQVNBQUx3RXlRZVVBUmlFRERBRUxJQUF0QUNsQkJVWWhBd3NnQUNBRE9nQXVRUUFML2dFQkEzOUJBU0VEQWtBZ0FDOEJNQ0lFUVFoeERRQWdBQ2tESUVJQVVpRURDd0pBQWtBZ0FDMEFMa1VOQUVFQklRVWdBQzBBS1VFRlJnMEJRUUVoQlNBRVFjQUFjVVVnQTNGQkFVY05BUXRCQUNFRklBUkJ3QUJ4RFFCQkFpRUZJQVJCLy84RGNTSURRUWh4RFFBQ1FDQURRWUFFY1VVTkFBSkFJQUF0QUNoQkFVY05BQ0FBTFFBdFFRcHhEUUJCQlE4TFFRUVBDd0pBSUFOQklIRU5BQUpBSUFBdEFDaEJBVVlOQUNBQUx3RXlRZi8vQTNFaUFFR2NmMnBCNUFCSkRRQWdBRUhNQVVZTkFDQUFRYkFDUmcwQVFRUWhCU0FFUVNoeFJRMENJQU5CaUFSeFFZQUVSZzBDQzBFQUR3dEJBRUVESUFBcEF5QlFHeUVGQ3lBRkMySUJBbjlCQUNFQkFrQWdBQzBBS0VFQlJnMEFJQUF2QVRKQi8vOERjU0lDUVp4L2FrSGtBRWtOQUNBQ1Fjd0JSZzBBSUFKQnNBSkdEUUFnQUM4Qk1DSUFRY0FBY1EwQVFRRWhBU0FBUVlnRWNVR0FCRVlOQUNBQVFTaHhSU0VCQ3lBQkM2Y0JBUU4vQWtBQ1FBSkFJQUF0QUNwRkRRQWdBQzBBSzBVTkFFRUFJUU1nQUM4Qk1DSUVRUUp4UlEwQkRBSUxRUUFoQXlBQUx3RXdJZ1JCQVhGRkRRRUxRUUVoQXlBQUxRQW9RUUZHRFFBZ0FDOEJNa0gvL3dOeElnVkJuSDlxUWVRQVNRMEFJQVZCekFGR0RRQWdCVUd3QWtZTkFDQUVRY0FBY1EwQVFRQWhBeUFFUVlnRWNVR0FCRVlOQUNBRVFTaHhRUUJISVFNTElBQkJBRHNCTUNBQVFRQTZBQzhnQXd1WkFRRUNmd0pBQWtBQ1FDQUFMUUFxUlEwQUlBQXRBQ3RGRFFCQkFDRUJJQUF2QVRBaUFrRUNjVVVOQVF3Q0MwRUFJUUVnQUM4Qk1DSUNRUUZ4UlEwQkMwRUJJUUVnQUMwQUtFRUJSZzBBSUFBdkFUSkIvLzhEY1NJQVFaeC9ha0hrQUVrTkFDQUFRY3dCUmcwQUlBQkJzQUpHRFFBZ0FrSEFBSEVOQUVFQUlRRWdBa0dJQkhGQmdBUkdEUUFnQWtFb2NVRUFSeUVCQ3lBQkMxa0FJQUJCR0dwQ0FEY0RBQ0FBUWdBM0F3QWdBRUU0YWtJQU53TUFJQUJCTUdwQ0FEY0RBQ0FBUVNocVFnQTNBd0FnQUVFZ2FrSUFOd01BSUFCQkVHcENBRGNEQUNBQVFRaHFRZ0EzQXdBZ0FFSGRBVFlDSEVFQUMzc0JBWDhDUUNBQUtBSU1JZ01OQUFKQUlBQW9BZ1JGRFFBZ0FDQUJOZ0lFQ3dKQUlBQWdBU0FDRU1TQWdJQUFJZ01OQUNBQUtBSU1Ed3NnQUNBRE5nSWNRUUFoQXlBQUtBSUVJZ0ZGRFFBZ0FDQUJJQUlnQUNnQ0NCR0JnSUNBQUFBaUFVVU5BQ0FBSUFJMkFoUWdBQ0FCTmdJTUlBRWhBd3NnQXd2azh3RUREbjhEZmdSL0k0Q0FnSUFBUVJCcklnTWtnSUNBZ0FBZ0FTRUVJQUVoQlNBQklRWWdBU0VISUFFaENDQUJJUWtnQVNFS0lBRWhDeUFCSVF3Z0FTRU5JQUVoRGlBQklROENRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBQ2dDSENJUVFYOXFEdDBCMmdFQjJRRUNBd1FGQmdjSUNRb0xEQTBPMkFFUEVOY0JFUkxXQVJNVUZSWVhHQmthRytBQjN3RWNIUjdWQVI4Z0lTSWpKQ1hVQVNZbktDa3FLeXpUQWRJQkxTN1JBZEFCTHpBeE1qTTBOVFkzT0RrNk96dzlQajlBUVVKRFJFVkcyd0ZIU0VsS3p3SE9BVXZOQVV6TUFVMU9UMUJSVWxOVVZWWlhXRmxhVzF4ZFhsOWdZV0pqWkdWbVoyaHBhbXRzYlc1dmNIRnljM1IxZG5kNGVYcDdmSDErZjRBQmdRR0NBWU1CaEFHRkFZWUJod0dJQVlrQmlnR0xBWXdCalFHT0FZOEJrQUdSQVpJQmt3R1VBWlVCbGdHWEFaZ0JtUUdhQVpzQm5BR2RBWjRCbndHZ0FhRUJvZ0dqQWFRQnBRR21BYWNCcUFHcEFhb0Jxd0dzQWEwQnJnR3ZBYkFCc1FHeUFiTUJ0QUcxQWJZQnR3SExBY29CdUFISkFia0J5QUc2QWJzQnZBRzlBYjRCdndIQUFjRUJ3Z0hEQWNRQnhRSEdBUURjQVF0QkFDRVFETVlCQzBFT0lSQU14UUVMUVEwaEVBekVBUXRCRHlFUURNTUJDMEVRSVJBTXdnRUxRUk1oRUF6QkFRdEJGQ0VRRE1BQkMwRVZJUkFNdndFTFFSWWhFQXkrQVF0QkZ5RVFETDBCQzBFWUlSQU12QUVMUVJraEVBeTdBUXRCR2lFUURMb0JDMEViSVJBTXVRRUxRUndoRUF5NEFRdEJDQ0VRRExjQkMwRWRJUkFNdGdFTFFTQWhFQXkxQVF0Qkh5RVFETFFCQzBFSElSQU1zd0VMUVNFaEVBeXlBUXRCSWlFUURMRUJDMEVlSVJBTXNBRUxRU01oRUF5dkFRdEJFaUVRREs0QkMwRVJJUkFNclFFTFFTUWhFQXlzQVF0QkpTRVFES3NCQzBFbUlSQU1xZ0VMUVNjaEVBeXBBUXRCd3dFaEVBeW9BUXRCS1NFUURLY0JDMEVySVJBTXBnRUxRU3doRUF5bEFRdEJMU0VRREtRQkMwRXVJUkFNb3dFTFFTOGhFQXlpQVF0QnhBRWhFQXloQVF0Qk1DRVFES0FCQzBFMElSQU1ud0VMUVF3aEVBeWVBUXRCTVNFUURKMEJDMEV5SVJBTW5BRUxRVE1oRUF5YkFRdEJPU0VRREpvQkMwRTFJUkFNbVFFTFFjVUJJUkFNbUFFTFFRc2hFQXlYQVF0Qk9pRVFESllCQzBFMklSQU1sUUVMUVFvaEVBeVVBUXRCTnlFUURKTUJDMEU0SVJBTWtnRUxRVHdoRUF5UkFRdEJPeUVRREpBQkMwRTlJUkFNandFTFFRa2hFQXlPQVF0QktDRVFESTBCQzBFK0lSQU1qQUVMUVQ4aEVBeUxBUXRCd0FBaEVBeUtBUXRCd1FBaEVBeUpBUXRCd2dBaEVBeUlBUXRCd3dBaEVBeUhBUXRCeEFBaEVBeUdBUXRCeFFBaEVBeUZBUXRCeGdBaEVBeUVBUXRCS2lFUURJTUJDMEhIQUNFUURJSUJDMEhJQUNFUURJRUJDMEhKQUNFUURJQUJDMEhLQUNFUURIOExRY3NBSVJBTWZndEJ6UUFoRUF4OUMwSE1BQ0VRREh3TFFjNEFJUkFNZXd0Qnp3QWhFQXg2QzBIUUFDRVFESGtMUWRFQUlSQU1lQXRCMGdBaEVBeDNDMEhUQUNFUURIWUxRZFFBSVJBTWRRdEIxZ0FoRUF4MEMwSFZBQ0VRREhNTFFRWWhFQXh5QzBIWEFDRVFESEVMUVFVaEVBeHdDMEhZQUNFUURHOExRUVFoRUF4dUMwSFpBQ0VRREcwTFFkb0FJUkFNYkF0QjJ3QWhFQXhyQzBIY0FDRVFER29MUVFNaEVBeHBDMEhkQUNFUURHZ0xRZDRBSVJBTVp3dEIzd0FoRUF4bUMwSGhBQ0VRREdVTFFlQUFJUkFNWkF0QjRnQWhFQXhqQzBIakFDRVFER0lMUVFJaEVBeGhDMEhrQUNFUURHQUxRZVVBSVJBTVh3dEI1Z0FoRUF4ZUMwSG5BQ0VRREYwTFFlZ0FJUkFNWEF0QjZRQWhFQXhiQzBIcUFDRVFERm9MUWVzQUlSQU1XUXRCN0FBaEVBeFlDMEh0QUNFUURGY0xRZTRBSVJBTVZndEI3d0FoRUF4VkMwSHdBQ0VRREZRTFFmRUFJUkFNVXd0QjhnQWhFQXhTQzBIekFDRVFERkVMUWZRQUlSQU1VQXRCOVFBaEVBeFBDMEgyQUNFUURFNExRZmNBSVJBTVRRdEIrQUFoRUF4TUMwSDVBQ0VRREVzTFFmb0FJUkFNU2d0Qit3QWhFQXhKQzBIOEFDRVFERWdMUWYwQUlSQU1Sd3RCL2dBaEVBeEdDMEgvQUNFUURFVUxRWUFCSVJBTVJBdEJnUUVoRUF4REMwR0NBU0VRREVJTFFZTUJJUkFNUVF0QmhBRWhFQXhBQzBHRkFTRVFERDhMUVlZQklSQU1QZ3RCaHdFaEVBdzlDMEdJQVNFUUREd0xRWWtCSVJBTU93dEJpZ0VoRUF3NkMwR0xBU0VRRERrTFFZd0JJUkFNT0F0QmpRRWhFQXczQzBHT0FTRVFERFlMUVk4QklSQU1OUXRCa0FFaEVBdzBDMEdSQVNFUURETUxRWklCSVJBTU1ndEJrd0VoRUF3eEMwR1VBU0VRRERBTFFaVUJJUkFNTHd0QmxnRWhFQXd1QzBHWEFTRVFEQzBMUVpnQklSQU1MQXRCbVFFaEVBd3JDMEdhQVNFUURDb0xRWnNCSVJBTUtRdEJuQUVoRUF3b0MwR2RBU0VRRENjTFFaNEJJUkFNSmd0Qm53RWhFQXdsQzBHZ0FTRVFEQ1FMUWFFQklSQU1Jd3RCb2dFaEVBd2lDMEdqQVNFUURDRUxRYVFCSVJBTUlBdEJwUUVoRUF3ZkMwR21BU0VRREI0TFFhY0JJUkFNSFF0QnFBRWhFQXdjQzBHcEFTRVFEQnNMUWFvQklSQU1HZ3RCcXdFaEVBd1pDMEdzQVNFUURCZ0xRYTBCSVJBTUZ3dEJyZ0VoRUF3V0MwRUJJUkFNRlF0QnJ3RWhFQXdVQzBHd0FTRVFEQk1MUWJFQklSQU1FZ3RCc3dFaEVBd1JDMEd5QVNFUURCQUxRYlFCSVJBTUR3dEJ0UUVoRUF3T0MwRzJBU0VRREEwTFFiY0JJUkFNREF0QnVBRWhFQXdMQzBHNUFTRVFEQW9MUWJvQklSQU1DUXRCdXdFaEVBd0lDMEhHQVNFUURBY0xRYndCSVJBTUJndEJ2UUVoRUF3RkMwRytBU0VRREFRTFFiOEJJUkFNQXd0QndBRWhFQXdDQzBIQ0FTRVFEQUVMUWNFQklSQUxBMEFDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBUURzY0JBQUVDQXdRRkJnY0lDUW9MREEwT0R4QVJFaE1VRlJZWEdCa2FHeHdlSHlBaEl5VW9QMEJCUkVWR1IwaEpTa3RNVFU5UVVWSlQzZ05YV1Z0Y1hXQmlaV1puYUdscWEyeHRiM0J4Y25OMGRYWjNlSGw2ZTN4OWZvQUJnZ0dGQVlZQmh3R0pBWXNCakFHTkFZNEJqd0dRQVpFQmxBR1ZBWllCbHdHWUFaa0JtZ0diQVp3Qm5RR2VBWjhCb0FHaEFhSUJvd0drQWFVQnBnR25BYWdCcVFHcUFhc0JyQUd0QWE0QnJ3R3dBYkVCc2dHekFiUUJ0UUcyQWJjQnVBRzVBYm9CdXdHOEFiMEJ2Z0cvQWNBQndRSENBY01CeEFIRkFjWUJ4d0hJQWNrQnlnSExBY3dCelFIT0FjOEIwQUhSQWRJQjB3SFVBZFVCMWdIWEFkZ0IyUUhhQWRzQjNBSGRBZDRCNEFIaEFlSUI0d0hrQWVVQjVnSG5BZWdCNlFIcUFlc0I3QUh0QWU0Qjd3SHdBZkVCOGdIekFaa0NwQUt3QXY0Qy9nSUxJQUVpQkNBQ1J3M3pBVUhkQVNFUURQOERDeUFCSWhBZ0FrY04zUUZCd3dFaEVBeitBd3NnQVNJQklBSkhEWkFCUWZjQUlSQU0vUU1MSUFFaUFTQUNSdzJHQVVIdkFDRVFEUHdEQ3lBQklnRWdBa2NOZjBIcUFDRVFEUHNEQ3lBQklnRWdBa2NOZTBIb0FDRVFEUG9EQ3lBQklnRWdBa2NOZUVIbUFDRVFEUGtEQ3lBQklnRWdBa2NOR2tFWUlSQU0rQU1MSUFFaUFTQUNSdzBVUVJJaEVBejNBd3NnQVNJQklBSkhEVmxCeFFBaEVBejJBd3NnQVNJQklBSkhEVXBCUHlFUURQVURDeUFCSWdFZ0FrY05TRUU4SVJBTTlBTUxJQUVpQVNBQ1J3MUJRVEVoRUF6ekF3c2dBQzBBTGtFQlJnM3JBd3lIQWdzZ0FDQUJJZ0VnQWhEQWdJQ0FBRUVCUnczbUFTQUFRZ0EzQXlBTTV3RUxJQUFnQVNJQklBSVF0SUNBZ0FBaUVBM25BU0FCSVFFTTlRSUxBa0FnQVNJQklBSkhEUUJCQmlFUURQQURDeUFBSUFGQkFXb2lBU0FDRUx1QWdJQUFJaEFONkFFZ0FTRUJEREVMSUFCQ0FEY0RJRUVTSVJBTTFRTUxJQUVpRUNBQ1J3MHJRUjBoRUF6dEF3c0NRQ0FCSWdFZ0FrWU5BQ0FCUVFGcUlRRkJFQ0VRRE5RREMwRUhJUkFNN0FNTElBQkNBQ0FBS1FNZ0loRWdBaUFCSWhCcnJTSVNmU0lUSUJNZ0VWWWJOd01nSUJFZ0VsWWlGRVVONVFGQkNDRVFET3NEQ3dKQUlBRWlBU0FDUmcwQUlBQkJpWUNBZ0FBMkFnZ2dBQ0FCTmdJRUlBRWhBVUVVSVJBTTBnTUxRUWtoRUF6cUF3c2dBU0VCSUFBcEF5QlFEZVFCSUFFaEFRenlBZ3NDUUNBQklnRWdBa2NOQUVFTElSQU02UU1MSUFBZ0FVRUJhaUlCSUFJUXRvQ0FnQUFpRUEzbEFTQUJJUUVNOGdJTElBQWdBU0lCSUFJUXVJQ0FnQUFpRUEzbEFTQUJJUUVNOGdJTElBQWdBU0lCSUFJUXVJQ0FnQUFpRUEzbUFTQUJJUUVNRFFzZ0FDQUJJZ0VnQWhDNmdJQ0FBQ0lRRGVjQklBRWhBUXp3QWdzQ1FDQUJJZ0VnQWtjTkFFRVBJUkFNNVFNTElBRXRBQUFpRUVFN1JnMElJQkJCRFVjTjZBRWdBVUVCYWlFQkRPOENDeUFBSUFFaUFTQUNFTHFBZ0lBQUloQU42QUVnQVNFQkRQSUNDd05BQWtBZ0FTMEFBRUh3dFlDQUFHb3RBQUFpRUVFQlJnMEFJQkJCQWtjTjZ3RWdBQ2dDQkNFUUlBQkJBRFlDQkNBQUlCQWdBVUVCYWlJQkVMbUFnSUFBSWhBTjZnRWdBU0VCRFBRQ0N5QUJRUUZxSWdFZ0FrY05BQXRCRWlFUURPSURDeUFBSUFFaUFTQUNFTHFBZ0lBQUloQU42UUVnQVNFQkRBb0xJQUVpQVNBQ1J3MEdRUnNoRUF6Z0F3c0NRQ0FCSWdFZ0FrY05BRUVXSVJBTTRBTUxJQUJCaW9DQWdBQTJBZ2dnQUNBQk5nSUVJQUFnQVNBQ0VMaUFnSUFBSWhBTjZnRWdBU0VCUVNBaEVBekdBd3NDUUNBQklnRWdBa1lOQUFOQUFrQWdBUzBBQUVId3Q0Q0FBR290QUFBaUVFRUNSZzBBQWtBZ0VFRi9hZzRFNVFIc0FRRHJBZXdCQ3lBQlFRRnFJUUZCQ0NFUURNZ0RDeUFCUVFGcUlnRWdBa2NOQUF0QkZTRVFETjhEQzBFVklSQU0zZ01MQTBBQ1FDQUJMUUFBUWZDNWdJQUFhaTBBQUNJUVFRSkdEUUFnRUVGL2FnNEUzZ0hzQWVBQjZ3SHNBUXNnQVVFQmFpSUJJQUpIRFFBTFFSZ2hFQXpkQXdzQ1FDQUJJZ0VnQWtZTkFDQUFRWXVBZ0lBQU5nSUlJQUFnQVRZQ0JDQUJJUUZCQnlFUURNUURDMEVaSVJBTTNBTUxJQUZCQVdvaEFRd0NDd0pBSUFFaUZDQUNSdzBBUVJvaEVBemJBd3NnRkNFQkFrQWdGQzBBQUVGemFnNFUzUUx1QXU0QzdnTHVBdTRDN2dMdUF1NEM3Z0x1QXU0QzdnTHVBdTRDN2dMdUF1NEM3Z0lBN2dJTFFRQWhFQ0FBUVFBMkFod2dBRUd2aTRDQUFEWUNFQ0FBUVFJMkFnd2dBQ0FVUVFGcU5nSVVETm9EQ3dKQUlBRXRBQUFpRUVFN1JnMEFJQkJCRFVjTjZBRWdBVUVCYWlFQkRPVUNDeUFCUVFGcUlRRUxRU0loRUF5L0F3c0NRQ0FCSWhBZ0FrY05BRUVjSVJBTTJBTUxRZ0FoRVNBUUlRRWdFQzBBQUVGUWFnNDM1d0htQVFFQ0F3UUZCZ2NJQUFBQUFBQUFBQWtLQ3d3TkRnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUR4QVJFaE1VQUF0QkhpRVFETDBEQzBJQ0lSRU01UUVMUWdNaEVRemtBUXRDQkNFUkRPTUJDMElGSVJFTTRnRUxRZ1loRVF6aEFRdENCeUVSRE9BQkMwSUlJUkVNM3dFTFFna2hFUXplQVF0Q0NpRVJETjBCQzBJTElSRU0zQUVMUWd3aEVRemJBUXRDRFNFUkROb0JDMElPSVJFTTJRRUxRZzhoRVF6WUFRdENDaUVSRE5jQkMwSUxJUkVNMWdFTFFnd2hFUXpWQVF0Q0RTRVJETlFCQzBJT0lSRU0wd0VMUWc4aEVRelNBUXRDQUNFUkFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FRTFFBQVFWQnFEamZsQWVRQkFBRUNBd1FGQmdmbUFlWUI1Z0htQWVZQjVnSG1BUWdKQ2dzTURlWUI1Z0htQWVZQjVnSG1BZVlCNWdIbUFlWUI1Z0htQWVZQjVnSG1BZVlCNWdIbUFlWUI1Z0htQWVZQjVnSG1BZVlCNWdFT0R4QVJFaFBtQVF0Q0FpRVJET1FCQzBJRElSRU00d0VMUWdRaEVRemlBUXRDQlNFUkRPRUJDMElHSVJFTTRBRUxRZ2NoRVF6ZkFRdENDQ0VSRE40QkMwSUpJUkVNM1FFTFFnb2hFUXpjQVF0Q0N5RVJETnNCQzBJTUlSRU0yZ0VMUWcwaEVRelpBUXRDRGlFUkROZ0JDMElQSVJFTTF3RUxRZ29oRVF6V0FRdENDeUVSRE5VQkMwSU1JUkVNMUFFTFFnMGhFUXpUQVF0Q0RpRVJETklCQzBJUElSRU0wUUVMSUFCQ0FDQUFLUU1nSWhFZ0FpQUJJaEJyclNJU2ZTSVRJQk1nRVZZYk53TWdJQkVnRWxZaUZFVU4wZ0ZCSHlFUURNQURDd0pBSUFFaUFTQUNSZzBBSUFCQmlZQ0FnQUEyQWdnZ0FDQUJOZ0lFSUFFaEFVRWtJUkFNcHdNTFFTQWhFQXkvQXdzZ0FDQUJJaEFnQWhDK2dJQ0FBRUYvYWc0RnRnRUF4UUlCMFFIU0FRdEJFU0VRREtRREN5QUFRUUU2QUM4Z0VDRUJETHNEQ3lBQklnRWdBa2NOMGdGQkpDRVFETHNEQ3lBQklnMGdBa2NOSGtIR0FDRVFETG9EQ3lBQUlBRWlBU0FDRUxLQWdJQUFJaEFOMUFFZ0FTRUJETFVCQ3lBQkloQWdBa2NOSmtIUUFDRVFETGdEQ3dKQUlBRWlBU0FDUncwQVFTZ2hFQXk0QXdzZ0FFRUFOZ0lFSUFCQmpJQ0FnQUEyQWdnZ0FDQUJJQUVRc1lDQWdBQWlFQTNUQVNBQklRRU0yQUVMQWtBZ0FTSVFJQUpIRFFCQktTRVFETGNEQ3lBUUxRQUFJZ0ZCSUVZTkZDQUJRUWxIRGRNQklCQkJBV29oQVF3VkN3SkFJQUVpQVNBQ1JnMEFJQUZCQVdvaEFRd1hDMEVxSVJBTXRRTUxBa0FnQVNJUUlBSkhEUUJCS3lFUURMVURDd0pBSUJBdEFBQWlBVUVKUmcwQUlBRkJJRWNOMVFFTElBQXRBQ3hCQ0VZTjB3RWdFQ0VCREpFREN3SkFJQUVpQVNBQ1J3MEFRU3doRUF5MEF3c2dBUzBBQUVFS1J3M1ZBU0FCUVFGcUlRRU15UUlMSUFFaURpQUNSdzNWQVVFdklSQU1zZ01MQTBBQ1FDQUJMUUFBSWhCQklFWU5BQUpBSUJCQmRtb09CQURjQWR3QkFOb0JDeUFCSVFFTTRBRUxJQUZCQVdvaUFTQUNSdzBBQzBFeElSQU1zUU1MUVRJaEVDQUJJaFFnQWtZTnNBTWdBaUFVYXlBQUtBSUFJZ0ZxSVJVZ0ZDQUJhMEVEYWlFV0FrQURRQ0FVTFFBQUloZEJJSElnRnlBWFFiOS9ha0gvQVhGQkdra2JRZjhCY1NBQlFmQzdnSUFBYWkwQUFFY05BUUpBSUFGQkEwY05BRUVHSVFFTWxnTUxJQUZCQVdvaEFTQVVRUUZxSWhRZ0FrY05BQXNnQUNBVk5nSUFETEVEQ3lBQVFRQTJBZ0FnRkNFQkROa0JDMEV6SVJBZ0FTSVVJQUpHRGE4RElBSWdGR3NnQUNnQ0FDSUJhaUVWSUJRZ0FXdEJDR29oRmdKQUEwQWdGQzBBQUNJWFFTQnlJQmNnRjBHL2YycEIvd0Z4UVJwSkcwSC9BWEVnQVVIMHU0Q0FBR290QUFCSERRRUNRQ0FCUVFoSERRQkJCU0VCREpVREN5QUJRUUZxSVFFZ0ZFRUJhaUlVSUFKSERRQUxJQUFnRlRZQ0FBeXdBd3NnQUVFQU5nSUFJQlFoQVF6WUFRdEJOQ0VRSUFFaUZDQUNSZzJ1QXlBQ0lCUnJJQUFvQWdBaUFXb2hGU0FVSUFGclFRVnFJUllDUUFOQUlCUXRBQUFpRjBFZ2NpQVhJQmRCdjM5cVFmOEJjVUVhU1J0Qi93RnhJQUZCME1LQWdBQnFMUUFBUncwQkFrQWdBVUVGUncwQVFRY2hBUXlVQXdzZ0FVRUJhaUVCSUJSQkFXb2lGQ0FDUncwQUN5QUFJQlUyQWdBTXJ3TUxJQUJCQURZQ0FDQVVJUUVNMXdFTEFrQWdBU0lCSUFKR0RRQURRQUpBSUFFdEFBQkJnTDZBZ0FCcUxRQUFJaEJCQVVZTkFDQVFRUUpHRFFvZ0FTRUJETjBCQ3lBQlFRRnFJZ0VnQWtjTkFBdEJNQ0VRREs0REMwRXdJUkFNclFNTEFrQWdBU0lCSUFKR0RRQURRQUpBSUFFdEFBQWlFRUVnUmcwQUlCQkJkbW9PQk5rQjJnSGFBZGtCMmdFTElBRkJBV29pQVNBQ1J3MEFDMEU0SVJBTXJRTUxRVGdoRUF5c0F3c0RRQUpBSUFFdEFBQWlFRUVnUmcwQUlCQkJDVWNOQXdzZ0FVRUJhaUlCSUFKSERRQUxRVHdoRUF5ckF3c0RRQUpBSUFFdEFBQWlFRUVnUmcwQUFrQUNRQ0FRUVhacURnVGFBUUVCMmdFQUN5QVFRU3hHRGRzQkN5QUJJUUVNQkFzZ0FVRUJhaUlCSUFKSERRQUxRVDhoRUF5cUF3c2dBU0VCRE5zQkMwSEFBQ0VRSUFFaUZDQUNSZzJvQXlBQ0lCUnJJQUFvQWdBaUFXb2hGaUFVSUFGclFRWnFJUmNDUUFOQUlCUXRBQUJCSUhJZ0FVR0F3SUNBQUdvdEFBQkhEUUVnQVVFR1JnMk9BeUFCUVFGcUlRRWdGRUVCYWlJVUlBSkhEUUFMSUFBZ0ZqWUNBQXlwQXdzZ0FFRUFOZ0lBSUJRaEFRdEJOaUVRREk0REN3SkFJQUVpRHlBQ1J3MEFRY0VBSVJBTXB3TUxJQUJCaklDQWdBQTJBZ2dnQUNBUE5nSUVJQThoQVNBQUxRQXNRWDlxRGdUTkFkVUIxd0haQVljREN5QUJRUUZxSVFFTXpBRUxBa0FnQVNJQklBSkdEUUFEUUFKQUlBRXRBQUFpRUVFZ2NpQVFJQkJCdjM5cVFmOEJjVUVhU1J0Qi93RnhJaEJCQ1VZTkFDQVFRU0JHRFFBQ1FBSkFBa0FDUUNBUVFaMS9hZzRUQUFNREF3TURBd01CQXdNREF3TURBd01EQWdNTElBRkJBV29oQVVFeElSQU1rUU1MSUFGQkFXb2hBVUV5SVJBTWtBTUxJQUZCQVdvaEFVRXpJUkFNandNTElBRWhBUXpRQVFzZ0FVRUJhaUlCSUFKSERRQUxRVFVoRUF5bEF3dEJOU0VRREtRREN3SkFJQUVpQVNBQ1JnMEFBMEFDUUNBQkxRQUFRWUM4Z0lBQWFpMEFBRUVCUmcwQUlBRWhBUXpUQVFzZ0FVRUJhaUlCSUFKSERRQUxRVDBoRUF5a0F3dEJQU0VRREtNREN5QUFJQUVpQVNBQ0VMQ0FnSUFBSWhBTjFnRWdBU0VCREFFTElCQkJBV29oQVF0QlBDRVFESWNEQ3dKQUlBRWlBU0FDUncwQVFjSUFJUkFNb0FNTEFrQURRQUpBSUFFdEFBQkJkMm9PR0FBQy9nTCtBb1FEL2dMK0F2NEMvZ0wrQXY0Qy9nTCtBdjRDL2dMK0F2NEMvZ0wrQXY0Qy9nTCtBdjRDQVA0Q0N5QUJRUUZxSWdFZ0FrY05BQXRCd2dBaEVBeWdBd3NnQVVFQmFpRUJJQUF0QUMxQkFYRkZEYjBCSUFFaEFRdEJMQ0VRRElVREN5QUJJZ0VnQWtjTjB3RkJ4QUFoRUF5ZEF3c0RRQUpBSUFFdEFBQkJrTUNBZ0FCcUxRQUFRUUZHRFFBZ0FTRUJETGNDQ3lBQlFRRnFJZ0VnQWtjTkFBdEJ4UUFoRUF5Y0F3c2dEUzBBQUNJUVFTQkdEYk1CSUJCQk9rY05nUU1nQUNnQ0JDRUJJQUJCQURZQ0JDQUFJQUVnRFJDdmdJQ0FBQ0lCRGRBQklBMUJBV29oQVF5ekFndEJ4d0FoRUNBQklnMGdBa1lObWdNZ0FpQU5heUFBS0FJQUlnRnFJUllnRFNBQmEwRUZhaUVYQTBBZ0RTMEFBQ0lVUVNCeUlCUWdGRUcvZjJwQi93RnhRUnBKRzBIL0FYRWdBVUdRd29DQUFHb3RBQUJIRFlBRElBRkJCVVlOOUFJZ0FVRUJhaUVCSUExQkFXb2lEU0FDUncwQUN5QUFJQlkyQWdBTW1nTUxRY2dBSVJBZ0FTSU5JQUpHRFprRElBSWdEV3NnQUNnQ0FDSUJhaUVXSUEwZ0FXdEJDV29oRndOQUlBMHRBQUFpRkVFZ2NpQVVJQlJCdjM5cVFmOEJjVUVhU1J0Qi93RnhJQUZCbHNLQWdBQnFMUUFBUnczL0FnSkFJQUZCQ1VjTkFFRUNJUUVNOVFJTElBRkJBV29oQVNBTlFRRnFJZzBnQWtjTkFBc2dBQ0FXTmdJQURKa0RDd0pBSUFFaURTQUNSdzBBUWNrQUlSQU1tUU1MQWtBQ1FDQU5MUUFBSWdGQklISWdBU0FCUWI5L2FrSC9BWEZCR2trYlFmOEJjVUdTZjJvT0J3Q0FBNEFEZ0FPQUE0QURBWUFEQ3lBTlFRRnFJUUZCUGlFUURJQURDeUFOUVFGcUlRRkJQeUVRRFA4Q0MwSEtBQ0VRSUFFaURTQUNSZzJYQXlBQ0lBMXJJQUFvQWdBaUFXb2hGaUFOSUFGclFRRnFJUmNEUUNBTkxRQUFJaFJCSUhJZ0ZDQVVRYjkvYWtIL0FYRkJHa2tiUWY4QmNTQUJRYURDZ0lBQWFpMEFBRWNOL1FJZ0FVRUJSZzN3QWlBQlFRRnFJUUVnRFVFQmFpSU5JQUpIRFFBTElBQWdGallDQUF5WEF3dEJ5d0FoRUNBQklnMGdBa1lObGdNZ0FpQU5heUFBS0FJQUlnRnFJUllnRFNBQmEwRU9haUVYQTBBZ0RTMEFBQ0lVUVNCeUlCUWdGRUcvZjJwQi93RnhRUnBKRzBIL0FYRWdBVUdpd29DQUFHb3RBQUJIRGZ3Q0lBRkJEa1lOOEFJZ0FVRUJhaUVCSUExQkFXb2lEU0FDUncwQUN5QUFJQlkyQWdBTWxnTUxRY3dBSVJBZ0FTSU5JQUpHRFpVRElBSWdEV3NnQUNnQ0FDSUJhaUVXSUEwZ0FXdEJEMm9oRndOQUlBMHRBQUFpRkVFZ2NpQVVJQlJCdjM5cVFmOEJjVUVhU1J0Qi93RnhJQUZCd01LQWdBQnFMUUFBUnczN0FnSkFJQUZCRDBjTkFFRURJUUVNOFFJTElBRkJBV29oQVNBTlFRRnFJZzBnQWtjTkFBc2dBQ0FXTmdJQURKVURDMEhOQUNFUUlBRWlEU0FDUmcyVUF5QUNJQTFySUFBb0FnQWlBV29oRmlBTklBRnJRUVZxSVJjRFFDQU5MUUFBSWhSQklISWdGQ0FVUWI5L2FrSC9BWEZCR2trYlFmOEJjU0FCUWREQ2dJQUFhaTBBQUVjTitnSUNRQ0FCUVFWSERRQkJCQ0VCRFBBQ0N5QUJRUUZxSVFFZ0RVRUJhaUlOSUFKSERRQUxJQUFnRmpZQ0FBeVVBd3NDUUNBQklnMGdBa2NOQUVIT0FDRVFESlFEQ3dKQUFrQUNRQUpBSUEwdEFBQWlBVUVnY2lBQklBRkJ2MzlxUWY4QmNVRWFTUnRCL3dGeFFaMS9hZzRUQVAwQy9RTDlBdjBDL1FMOUF2MEMvUUw5QXYwQy9RTDlBZ0g5QXYwQy9RSUNBLzBDQ3lBTlFRRnFJUUZCd1FBaEVBejlBZ3NnRFVFQmFpRUJRY0lBSVJBTS9BSUxJQTFCQVdvaEFVSERBQ0VRRFBzQ0N5QU5RUUZxSVFGQnhBQWhFQXo2QWdzQ1FDQUJJZ0VnQWtZTkFDQUFRWTJBZ0lBQU5nSUlJQUFnQVRZQ0JDQUJJUUZCeFFBaEVBejZBZ3RCendBaEVBeVNBd3NnRUNFQkFrQUNRQ0FRTFFBQVFYWnFEZ1FCcUFLb0FnQ29BZ3NnRUVFQmFpRUJDMEVuSVJBTStBSUxBa0FnQVNJQklBSkhEUUJCMFFBaEVBeVJBd3NDUUNBQkxRQUFRU0JHRFFBZ0FTRUJESTBCQ3lBQlFRRnFJUUVnQUMwQUxVRUJjVVVOeHdFZ0FTRUJESXdCQ3lBQkloY2dBa2NOeUFGQjBnQWhFQXlQQXd0QjB3QWhFQ0FCSWhRZ0FrWU5qZ01nQWlBVWF5QUFLQUlBSWdGcUlSWWdGQ0FCYTBFQmFpRVhBMEFnRkMwQUFDQUJRZGJDZ0lBQWFpMEFBRWNOekFFZ0FVRUJSZzNIQVNBQlFRRnFJUUVnRkVFQmFpSVVJQUpIRFFBTElBQWdGallDQUF5T0F3c0NRQ0FCSWdFZ0FrY05BRUhWQUNFUURJNERDeUFCTFFBQVFRcEhEY3dCSUFGQkFXb2hBUXpIQVFzQ1FDQUJJZ0VnQWtjTkFFSFdBQ0VRREkwREN3SkFBa0FnQVMwQUFFRjJhZzRFQU0wQnpRRUJ6UUVMSUFGQkFXb2hBUXpIQVFzZ0FVRUJhaUVCUWNvQUlSQU04d0lMSUFBZ0FTSUJJQUlRcm9DQWdBQWlFQTNMQVNBQklRRkJ6UUFoRUF6eUFnc2dBQzBBS1VFaVJnMkZBd3ltQWdzQ1FDQUJJZ0VnQWtjTkFFSGJBQ0VRRElvREMwRUFJUlJCQVNFWFFRRWhGa0VBSVJBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0FTMEFBRUZRYWc0SzFBSFRBUUFCQWdNRUJRWUkxUUVMUVFJaEVBd0dDMEVESVJBTUJRdEJCQ0VRREFRTFFRVWhFQXdEQzBFR0lSQU1BZ3RCQnlFUURBRUxRUWdoRUF0QkFDRVhRUUFoRmtFQUlSUU16QUVMUVFraEVFRUJJUlJCQUNFWFFRQWhGZ3pMQVFzQ1FDQUJJZ0VnQWtjTkFFSGRBQ0VRRElrREN5QUJMUUFBUVM1SERjd0JJQUZCQVdvaEFReW1BZ3NnQVNJQklBSkhEY3dCUWQ4QUlSQU1od01MQWtBZ0FTSUJJQUpHRFFBZ0FFR09nSUNBQURZQ0NDQUFJQUUyQWdRZ0FTRUJRZEFBSVJBTTdnSUxRZUFBSVJBTWhnTUxRZUVBSVJBZ0FTSUJJQUpHRFlVRElBSWdBV3NnQUNnQ0FDSVVhaUVXSUFFZ0ZHdEJBMm9oRndOQUlBRXRBQUFnRkVIaXdvQ0FBR290QUFCSERjMEJJQlJCQTBZTnpBRWdGRUVCYWlFVUlBRkJBV29pQVNBQ1J3MEFDeUFBSUJZMkFnQU1oUU1MUWVJQUlSQWdBU0lCSUFKR0RZUURJQUlnQVdzZ0FDZ0NBQ0lVYWlFV0lBRWdGR3RCQW1vaEZ3TkFJQUV0QUFBZ0ZFSG13b0NBQUdvdEFBQkhEY3dCSUJSQkFrWU56Z0VnRkVFQmFpRVVJQUZCQVdvaUFTQUNSdzBBQ3lBQUlCWTJBZ0FNaEFNTFFlTUFJUkFnQVNJQklBSkdEWU1ESUFJZ0FXc2dBQ2dDQUNJVWFpRVdJQUVnRkd0QkEyb2hGd05BSUFFdEFBQWdGRUhwd29DQUFHb3RBQUJIRGNzQklCUkJBMFlOemdFZ0ZFRUJhaUVVSUFGQkFXb2lBU0FDUncwQUN5QUFJQlkyQWdBTWd3TUxBa0FnQVNJQklBSkhEUUJCNVFBaEVBeURBd3NnQUNBQlFRRnFJZ0VnQWhDb2dJQ0FBQ0lRRGMwQklBRWhBVUhXQUNFUURPa0NDd0pBSUFFaUFTQUNSZzBBQTBBQ1FDQUJMUUFBSWhCQklFWU5BQUpBQWtBQ1FDQVFRYmgvYWc0TEFBSFBBYzhCendIUEFjOEJ6d0hQQWM4QkFzOEJDeUFCUVFGcUlRRkIwZ0FoRUF6dEFnc2dBVUVCYWlFQlFkTUFJUkFNN0FJTElBRkJBV29oQVVIVUFDRVFET3NDQ3lBQlFRRnFJZ0VnQWtjTkFBdEI1QUFoRUF5Q0F3dEI1QUFoRUF5QkF3c0RRQUpBSUFFdEFBQkI4TUtBZ0FCcUxRQUFJaEJCQVVZTkFDQVFRWDVxRGdQUEFkQUIwUUhTQVFzZ0FVRUJhaUlCSUFKSERRQUxRZVlBSVJBTWdBTUxBa0FnQVNJQklBSkdEUUFnQVVFQmFpRUJEQU1MUWVjQUlSQU0vd0lMQTBBQ1FDQUJMUUFBUWZERWdJQUFhaTBBQUNJUVFRRkdEUUFDUUNBUVFYNXFEZ1RTQWRNQjFBRUExUUVMSUFFaEFVSFhBQ0VRRE9jQ0N5QUJRUUZxSWdFZ0FrY05BQXRCNkFBaEVBeitBZ3NDUUNBQklnRWdBa2NOQUVIcEFDRVFEUDRDQ3dKQUlBRXRBQUFpRUVGMmFnNGF1Z0hWQWRVQnZBSFZBZFVCMVFIVkFkVUIxUUhWQWRVQjFRSFZBZFVCMVFIVkFkVUIxUUhWQWRVQjFRSEtBZFVCMVFFQTB3RUxJQUZCQVdvaEFRdEJCaUVRRE9NQ0N3TkFBa0FnQVMwQUFFSHd4b0NBQUdvdEFBQkJBVVlOQUNBQklRRU1uZ0lMSUFGQkFXb2lBU0FDUncwQUMwSHFBQ0VRRFBzQ0N3SkFJQUVpQVNBQ1JnMEFJQUZCQVdvaEFRd0RDMEhyQUNFUURQb0NDd0pBSUFFaUFTQUNSdzBBUWV3QUlSQU0rZ0lMSUFGQkFXb2hBUXdCQ3dKQUlBRWlBU0FDUncwQVFlMEFJUkFNK1FJTElBRkJBV29oQVF0QkJDRVFETjRDQ3dKQUlBRWlGQ0FDUncwQVFlNEFJUkFNOXdJTElCUWhBUUpBQWtBQ1FDQVVMUUFBUWZESWdJQUFhaTBBQUVGL2FnNEgxQUhWQWRZQkFKd0NBUUxYQVFzZ0ZFRUJhaUVCREFvTElCUkJBV29oQVF6TkFRdEJBQ0VRSUFCQkFEWUNIQ0FBUVp1U2dJQUFOZ0lRSUFCQkJ6WUNEQ0FBSUJSQkFXbzJBaFFNOWdJTEFrQURRQUpBSUFFdEFBQkI4TWlBZ0FCcUxRQUFJaEJCQkVZTkFBSkFBa0FnRUVGL2FnNEgwZ0hUQWRRQjJRRUFCQUhaQVFzZ0FTRUJRZG9BSVJBTTRBSUxJQUZCQVdvaEFVSGNBQ0VRRE44Q0N5QUJRUUZxSWdFZ0FrY05BQXRCN3dBaEVBejJBZ3NnQVVFQmFpRUJETXNCQ3dKQUlBRWlGQ0FDUncwQVFmQUFJUkFNOVFJTElCUXRBQUJCTDBjTjFBRWdGRUVCYWlFQkRBWUxBa0FnQVNJVUlBSkhEUUJCOFFBaEVBejBBZ3NDUUNBVUxRQUFJZ0ZCTDBjTkFDQVVRUUZxSVFGQjNRQWhFQXpiQWdzZ0FVRjJhaUlFUVJaTERkTUJRUUVnQkhSQmlZQ0FBbkZGRGRNQkRNb0NDd0pBSUFFaUFTQUNSZzBBSUFGQkFXb2hBVUhlQUNFUUROb0NDMEh5QUNFUURQSUNDd0pBSUFFaUZDQUNSdzBBUWZRQUlSQU04Z0lMSUJRaEFRSkFJQlF0QUFCQjhNeUFnQUJxTFFBQVFYOXFEZ1BKQXBRQ0FOUUJDMEhoQUNFUUROZ0NDd0pBSUFFaUZDQUNSZzBBQTBBQ1FDQVVMUUFBUWZES2dJQUFhaTBBQUNJQlFRTkdEUUFDUUNBQlFYOXFEZ0xMQWdEVkFRc2dGQ0VCUWQ4QUlSQU0yZ0lMSUJSQkFXb2lGQ0FDUncwQUMwSHpBQ0VRRFBFQ0MwSHpBQ0VRRFBBQ0N3SkFJQUVpQVNBQ1JnMEFJQUJCajRDQWdBQTJBZ2dnQUNBQk5nSUVJQUVoQVVIZ0FDRVFETmNDQzBIMUFDRVFETzhDQ3dKQUlBRWlBU0FDUncwQVFmWUFJUkFNN3dJTElBQkJqNENBZ0FBMkFnZ2dBQ0FCTmdJRUlBRWhBUXRCQXlFUUROUUNDd05BSUFFdEFBQkJJRWNOd3dJZ0FVRUJhaUlCSUFKSERRQUxRZmNBSVJBTTdBSUxBa0FnQVNJQklBSkhEUUJCK0FBaEVBenNBZ3NnQVMwQUFFRWdSdzNPQVNBQlFRRnFJUUVNN3dFTElBQWdBU0lCSUFJUXJJQ0FnQUFpRUEzT0FTQUJJUUVNamdJTEFrQWdBU0lFSUFKSERRQkIrZ0FoRUF6cUFnc2dCQzBBQUVITUFFY04wUUVnQkVFQmFpRUJRUk1oRUF6UEFRc0NRQ0FCSWdRZ0FrY05BRUg3QUNFUURPa0NDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFWcUlSQURRQ0FFTFFBQUlBRkI4TTZBZ0FCcUxRQUFSdzNRQVNBQlFRVkdEYzRCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUWZzQUlSQU02QUlMQWtBZ0FTSUVJQUpIRFFCQi9BQWhFQXpvQWdzQ1FBSkFJQVF0QUFCQnZYOXFEZ3dBMFFIUkFkRUIwUUhSQWRFQjBRSFJBZEVCMFFFQjBRRUxJQVJCQVdvaEFVSG1BQ0VRRE04Q0N5QUVRUUZxSVFGQjV3QWhFQXpPQWdzQ1FDQUJJZ1FnQWtjTkFFSDlBQ0VRRE9jQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUUpxSVJBQ1FBTkFJQVF0QUFBZ0FVSHR6NENBQUdvdEFBQkhEYzhCSUFGQkFrWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUg5QUNFUURPY0NDeUFBUVFBMkFnQWdFRUVCYWlFQlFSQWhFQXpNQVFzQ1FDQUJJZ1FnQWtjTkFFSCtBQ0VRRE9ZQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUVZxSVJBQ1FBTkFJQVF0QUFBZ0FVSDJ6b0NBQUdvdEFBQkhEYzRCSUFGQkJVWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUgrQUNFUURPWUNDeUFBUVFBMkFnQWdFRUVCYWlFQlFSWWhFQXpMQVFzQ1FDQUJJZ1FnQWtjTkFFSC9BQ0VRRE9VQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUU5xSVJBQ1FBTkFJQVF0QUFBZ0FVSDh6b0NBQUdvdEFBQkhEYzBCSUFGQkEwWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUgvQUNFUURPVUNDeUFBUVFBMkFnQWdFRUVCYWlFQlFRVWhFQXpLQVFzQ1FDQUJJZ1FnQWtjTkFFR0FBU0VRRE9RQ0N5QUVMUUFBUWRrQVJ3M0xBU0FFUVFGcUlRRkJDQ0VRRE1rQkN3SkFJQUVpQkNBQ1J3MEFRWUVCSVJBTTR3SUxBa0FDUUNBRUxRQUFRYkovYWc0REFNd0JBY3dCQ3lBRVFRRnFJUUZCNndBaEVBektBZ3NnQkVFQmFpRUJRZXdBSVJBTXlRSUxBa0FnQVNJRUlBSkhEUUJCZ2dFaEVBemlBZ3NDUUFKQUlBUXRBQUJCdUg5cURnZ0F5d0hMQWNzQnl3SExBY3NCQWNzQkN5QUVRUUZxSVFGQjZnQWhFQXpKQWdzZ0JFRUJhaUVCUWUwQUlSQU15QUlMQWtBZ0FTSUVJQUpIRFFCQmd3RWhFQXpoQWdzZ0FpQUVheUFBS0FJQUlnRnFJUkFnQkNBQmEwRUNhaUVVQWtBRFFDQUVMUUFBSUFGQmdNK0FnQUJxTFFBQVJ3M0pBU0FCUVFKR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJBMkFnQkJnd0VoRUF6aEFndEJBQ0VRSUFCQkFEWUNBQ0FVUVFGcUlRRU14Z0VMQWtBZ0FTSUVJQUpIRFFCQmhBRWhFQXpnQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUVhaUVRQWtBRFFDQUVMUUFBSUFGQmc4K0FnQUJxTFFBQVJ3M0lBU0FCUVFSR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJoQUVoRUF6Z0Fnc2dBRUVBTmdJQUlCQkJBV29oQVVFaklSQU14UUVMQWtBZ0FTSUVJQUpIRFFCQmhRRWhFQXpmQWdzQ1FBSkFJQVF0QUFCQnRIOXFEZ2dBeUFISUFjZ0J5QUhJQWNnQkFjZ0JDeUFFUVFGcUlRRkI3d0FoRUF6R0Fnc2dCRUVCYWlFQlFmQUFJUkFNeFFJTEFrQWdBU0lFSUFKSERRQkJoZ0VoRUF6ZUFnc2dCQzBBQUVIRkFFY054UUVnQkVFQmFpRUJESU1DQ3dKQUlBRWlCQ0FDUncwQVFZY0JJUkFNM1FJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBMm9oRUFKQUEwQWdCQzBBQUNBQlFZalBnSUFBYWkwQUFFY054UUVnQVVFRFJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRWWNCSVJBTTNRSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkxTRVFETUlCQ3dKQUlBRWlCQ0FDUncwQVFZZ0JJUkFNM0FJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJDR29oRUFKQUEwQWdCQzBBQUNBQlFkRFBnSUFBYWkwQUFFY054QUVnQVVFSVJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRWWdCSVJBTTNBSUxJQUJCQURZQ0FDQVFRUUZxSVFGQktTRVFETUVCQ3dKQUlBRWlBU0FDUncwQVFZa0JJUkFNMndJTFFRRWhFQ0FCTFFBQVFkOEFSdzNBQVNBQlFRRnFJUUVNZ1FJTEFrQWdBU0lFSUFKSERRQkJpZ0VoRUF6YUFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVCYWlFUUEwQWdCQzBBQUNBQlFZelBnSUFBYWkwQUFFY053UUVnQVVFQlJnMnZBaUFCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUdLQVNFUUROa0NDd0pBSUFFaUJDQUNSdzBBUVlzQklSQU0yUUlMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFtb2hFQUpBQTBBZ0JDMEFBQ0FCUVk3UGdJQUFhaTBBQUVjTndRRWdBVUVDUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFZc0JJUkFNMlFJTElBQkJBRFlDQUNBUVFRRnFJUUZCQWlFUURMNEJDd0pBSUFFaUJDQUNSdzBBUVl3QklSQU0yQUlMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFXb2hFQUpBQTBBZ0JDMEFBQ0FCUWZEUGdJQUFhaTBBQUVjTndBRWdBVUVCUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFZd0JJUkFNMkFJTElBQkJBRFlDQUNBUVFRRnFJUUZCSHlFUURMMEJDd0pBSUFFaUJDQUNSdzBBUVkwQklSQU0xd0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFXb2hFQUpBQTBBZ0JDMEFBQ0FCUWZMUGdJQUFhaTBBQUVjTnZ3RWdBVUVCUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFZMEJJUkFNMXdJTElBQkJBRFlDQUNBUVFRRnFJUUZCQ1NFUURMd0JDd0pBSUFFaUJDQUNSdzBBUVk0QklSQU0xZ0lMQWtBQ1FDQUVMUUFBUWJkL2FnNEhBTDhCdndHL0FiOEJ2d0VCdndFTElBUkJBV29oQVVINEFDRVFETDBDQ3lBRVFRRnFJUUZCK1FBaEVBeThBZ3NDUUNBQklnUWdBa2NOQUVHUEFTRVFETlVDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRVnFJUkFDUUFOQUlBUXRBQUFnQVVHUno0Q0FBR290QUFCSERiMEJJQUZCQlVZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR1BBU0VRRE5VQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVJnaEVBeTZBUXNDUUNBQklnUWdBa2NOQUVHUUFTRVFETlFDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRSnFJUkFDUUFOQUlBUXRBQUFnQVVHWHo0Q0FBR290QUFCSERid0JJQUZCQWtZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR1FBU0VRRE5RQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVJjaEVBeTVBUXNDUUNBQklnUWdBa2NOQUVHUkFTRVFETk1DQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRWnFJUkFDUUFOQUlBUXRBQUFnQVVHYXo0Q0FBR290QUFCSERic0JJQUZCQmtZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR1JBU0VRRE5NQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVJVaEVBeTRBUXNDUUNBQklnUWdBa2NOQUVHU0FTRVFETklDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRVnFJUkFDUUFOQUlBUXRBQUFnQVVHaHo0Q0FBR290QUFCSERib0JJQUZCQlVZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR1NBU0VRRE5JQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVI0aEVBeTNBUXNDUUNBQklnUWdBa2NOQUVHVEFTRVFETkVDQ3lBRUxRQUFRY3dBUncyNEFTQUVRUUZxSVFGQkNpRVFETFlCQ3dKQUlBUWdBa2NOQUVHVUFTRVFETkFDQ3dKQUFrQWdCQzBBQUVHL2Yyb09Ed0M1QWJrQnVRRzVBYmtCdVFHNUFia0J1UUc1QWJrQnVRRzVBUUc1QVFzZ0JFRUJhaUVCUWY0QUlSQU10d0lMSUFSQkFXb2hBVUgvQUNFUURMWUNDd0pBSUFRZ0FrY05BRUdWQVNFUURNOENDd0pBQWtBZ0JDMEFBRUcvZjJvT0F3QzRBUUc0QVFzZ0JFRUJhaUVCUWYwQUlSQU10Z0lMSUFSQkFXb2hCRUdBQVNFUURMVUNDd0pBSUFRZ0FrY05BRUdXQVNFUURNNENDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFGcUlSQUNRQU5BSUFRdEFBQWdBVUduejRDQUFHb3RBQUJIRGJZQklBRkJBVVlOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHV0FTRVFETTRDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUXNoRUF5ekFRc0NRQ0FFSUFKSERRQkJsd0VoRUF6TkFnc0NRQUpBQWtBQ1FDQUVMUUFBUVZOcURpTUF1QUc0QWJnQnVBRzRBYmdCdUFHNEFiZ0J1QUc0QWJnQnVBRzRBYmdCdUFHNEFiZ0J1QUc0QWJnQnVBRzRBUUc0QWJnQnVBRzRBYmdCQXJnQnVBRzRBUU80QVFzZ0JFRUJhaUVCUWZzQUlSQU10Z0lMSUFSQkFXb2hBVUg4QUNFUURMVUNDeUFFUVFGcUlRUkJnUUVoRUF5MEFnc2dCRUVCYWlFRVFZSUJJUkFNc3dJTEFrQWdCQ0FDUncwQVFaZ0JJUkFNekFJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJCR29oRUFKQUEwQWdCQzBBQUNBQlFhblBnSUFBYWkwQUFFY050QUVnQVVFRVJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRWmdCSVJBTXpBSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkdTRVFETEVCQ3dKQUlBUWdBa2NOQUVHWkFTRVFETXNDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRVnFJUkFDUUFOQUlBUXRBQUFnQVVHdXo0Q0FBR290QUFCSERiTUJJQUZCQlVZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR1pBU0VRRE1zQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVFZaEVBeXdBUXNDUUNBRUlBSkhEUUJCbWdFaEVBektBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFQmFpRVFBa0FEUUNBRUxRQUFJQUZCdE0rQWdBQnFMUUFBUncyeUFTQUJRUUZHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQm1nRWhFQXpLQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVjSVJBTXJ3RUxBa0FnQkNBQ1J3MEFRWnNCSVJBTXlRSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQVdvaEVBSkFBMEFnQkMwQUFDQUJRYmJQZ0lBQWFpMEFBRWNOc1FFZ0FVRUJSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUVpzQklSQU15UUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJKeUVRREs0QkN3SkFJQVFnQWtjTkFFR2NBU0VRRE1nQ0N3SkFBa0FnQkMwQUFFR3NmMm9PQWdBQnNRRUxJQVJCQVdvaEJFR0dBU0VRREs4Q0N5QUVRUUZxSVFSQmh3RWhFQXl1QWdzQ1FDQUVJQUpIRFFCQm5RRWhFQXpIQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUJhaUVRQWtBRFFDQUVMUUFBSUFGQnVNK0FnQUJxTFFBQVJ3MnZBU0FCUVFGR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJuUUVoRUF6SEFnc2dBRUVBTmdJQUlCQkJBV29oQVVFbUlSQU1yQUVMQWtBZ0JDQUNSdzBBUVo0QklSQU14Z0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFXb2hFQUpBQTBBZ0JDMEFBQ0FCUWJyUGdJQUFhaTBBQUVjTnJnRWdBVUVCUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFaNEJJUkFNeGdJTElBQkJBRFlDQUNBUVFRRnFJUUZCQXlFUURLc0JDd0pBSUFRZ0FrY05BRUdmQVNFUURNVUNDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFKcUlSQUNRQU5BSUFRdEFBQWdBVUh0ejRDQUFHb3RBQUJIRGEwQklBRkJBa1lOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHZkFTRVFETVVDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUXdoRUF5cUFRc0NRQ0FFSUFKSERRQkJvQUVoRUF6RUFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVEYWlFUUFrQURRQ0FFTFFBQUlBRkJ2TStBZ0FCcUxRQUFSdzJzQVNBQlFRTkdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCb0FFaEVBekVBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRU5JUkFNcVFFTEFrQWdCQ0FDUncwQVFhRUJJUkFNd3dJTEFrQUNRQ0FFTFFBQVFicC9hZzRMQUt3QnJBR3NBYXdCckFHc0Fhd0JyQUdzQVFHc0FRc2dCRUVCYWlFRVFZc0JJUkFNcWdJTElBUkJBV29oQkVHTUFTRVFES2tDQ3dKQUlBUWdBa2NOQUVHaUFTRVFETUlDQ3lBRUxRQUFRZEFBUncycEFTQUVRUUZxSVFRTTZRRUxBa0FnQkNBQ1J3MEFRYU1CSVJBTXdRSUxBa0FDUUNBRUxRQUFRYmQvYWc0SEFhb0JxZ0dxQWFvQnFnRUFxZ0VMSUFSQkFXb2hCRUdPQVNFUURLZ0NDeUFFUVFGcUlRRkJJaUVRREtZQkN3SkFJQVFnQWtjTkFFR2tBU0VRRE1BQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUUZxSVJBQ1FBTkFJQVF0QUFBZ0FVSEF6NENBQUdvdEFBQkhEYWdCSUFGQkFVWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUdrQVNFUURNQUNDeUFBUVFBMkFnQWdFRUVCYWlFQlFSMGhFQXlsQVFzQ1FDQUVJQUpIRFFCQnBRRWhFQXkvQWdzQ1FBSkFJQVF0QUFCQnJuOXFEZ01BcUFFQnFBRUxJQVJCQVdvaEJFR1FBU0VRREtZQ0N5QUVRUUZxSVFGQkJDRVFES1FCQ3dKQUlBUWdBa2NOQUVHbUFTRVFETDRDQ3dKQUFrQUNRQUpBQWtBZ0JDMEFBRUcvZjJvT0ZRQ3FBYW9CcWdHcUFhb0JxZ0dxQWFvQnFnR3FBUUdxQWFvQkFxb0JxZ0VEcWdHcUFRU3FBUXNnQkVFQmFpRUVRWWdCSVJBTXFBSUxJQVJCQVdvaEJFR0pBU0VRREtjQ0N5QUVRUUZxSVFSQmlnRWhFQXltQWdzZ0JFRUJhaUVFUVk4QklSQU1wUUlMSUFSQkFXb2hCRUdSQVNFUURLUUNDd0pBSUFRZ0FrY05BRUduQVNFUURMMENDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFKcUlSQUNRQU5BSUFRdEFBQWdBVUh0ejRDQUFHb3RBQUJIRGFVQklBRkJBa1lOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHbkFTRVFETDBDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUkVoRUF5aUFRc0NRQ0FFSUFKSERRQkJxQUVoRUF5OEFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVDYWlFUUFrQURRQ0FFTFFBQUlBRkJ3cytBZ0FCcUxRQUFSdzJrQVNBQlFRSkdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCcUFFaEVBeThBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRXNJUkFNb1FFTEFrQWdCQ0FDUncwQVFha0JJUkFNdXdJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJCR29oRUFKQUEwQWdCQzBBQUNBQlFjWFBnSUFBYWkwQUFFY05vd0VnQVVFRVJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRYWtCSVJBTXV3SUxJQUJCQURZQ0FDQVFRUUZxSVFGQkt5RVFES0FCQ3dKQUlBUWdBa2NOQUVHcUFTRVFETG9DQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRSnFJUkFDUUFOQUlBUXRBQUFnQVVIS3o0Q0FBR290QUFCSERhSUJJQUZCQWtZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR3FBU0VRRExvQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVJRaEVBeWZBUXNDUUNBRUlBSkhEUUJCcXdFaEVBeTVBZ3NDUUFKQUFrQUNRQ0FFTFFBQVFiNS9hZzRQQUFFQ3BBR2tBYVFCcEFHa0FhUUJwQUdrQWFRQnBBR2tBUU9rQVFzZ0JFRUJhaUVFUVpNQklSQU1vZ0lMSUFSQkFXb2hCRUdVQVNFUURLRUNDeUFFUVFGcUlRUkJsUUVoRUF5Z0Fnc2dCRUVCYWlFRVFaWUJJUkFNbndJTEFrQWdCQ0FDUncwQVFhd0JJUkFNdUFJTElBUXRBQUJCeFFCSERaOEJJQVJCQVdvaEJBemdBUXNDUUNBRUlBSkhEUUJCclFFaEVBeTNBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFQ2FpRVFBa0FEUUNBRUxRQUFJQUZCemMrQWdBQnFMUUFBUncyZkFTQUJRUUpHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQnJRRWhFQXkzQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVPSVJBTW5BRUxBa0FnQkNBQ1J3MEFRYTRCSVJBTXRnSUxJQVF0QUFCQjBBQkhEWjBCSUFSQkFXb2hBVUVsSVJBTW13RUxBa0FnQkNBQ1J3MEFRYThCSVJBTXRRSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQ0dvaEVBSkFBMEFnQkMwQUFDQUJRZERQZ0lBQWFpMEFBRWNOblFFZ0FVRUlSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUWE4QklSQU10UUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJLaUVRREpvQkN3SkFJQVFnQWtjTkFFR3dBU0VRRExRQ0N3SkFBa0FnQkMwQUFFR3JmMm9PQ3dDZEFaMEJuUUdkQVowQm5RR2RBWjBCblFFQm5RRUxJQVJCQVdvaEJFR2FBU0VRREpzQ0N5QUVRUUZxSVFSQm13RWhFQXlhQWdzQ1FDQUVJQUpIRFFCQnNRRWhFQXl6QWdzQ1FBSkFJQVF0QUFCQnYzOXFEaFFBbkFHY0Fad0JuQUdjQVp3Qm5BR2NBWndCbkFHY0Fad0JuQUdjQVp3Qm5BR2NBWndCQVp3QkN5QUVRUUZxSVFSQm1RRWhFQXlhQWdzZ0JFRUJhaUVFUVp3QklSQU1tUUlMQWtBZ0JDQUNSdzBBUWJJQklSQU1zZ0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkEyb2hFQUpBQTBBZ0JDMEFBQ0FCUWRuUGdJQUFhaTBBQUVjTm1nRWdBVUVEUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFiSUJJUkFNc2dJTElBQkJBRFlDQUNBUVFRRnFJUUZCSVNFUURKY0JDd0pBSUFRZ0FrY05BRUd6QVNFUURMRUNDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFacUlSQUNRQU5BSUFRdEFBQWdBVUhkejRDQUFHb3RBQUJIRFprQklBRkJCa1lOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHekFTRVFETEVDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUm9oRUF5V0FRc0NRQ0FFSUFKSERRQkJ0QUVoRUF5d0Fnc0NRQUpBQWtBZ0JDMEFBRUc3ZjJvT0VRQ2FBWm9CbWdHYUFab0JtZ0dhQVpvQm1nRUJtZ0dhQVpvQm1nR2FBUUthQVFzZ0JFRUJhaUVFUVowQklSQU1tQUlMSUFSQkFXb2hCRUdlQVNFUURKY0NDeUFFUVFGcUlRUkJud0VoRUF5V0Fnc0NRQ0FFSUFKSERRQkJ0UUVoRUF5dkFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVGYWlFUUFrQURRQ0FFTFFBQUlBRkI1TStBZ0FCcUxRQUFSdzJYQVNBQlFRVkdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCdFFFaEVBeXZBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRW9JUkFNbEFFTEFrQWdCQ0FDUncwQVFiWUJJUkFNcmdJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBbW9oRUFKQUEwQWdCQzBBQUNBQlFlclBnSUFBYWkwQUFFY05sZ0VnQVVFQ1JnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRYllCSVJBTXJnSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkJ5RVFESk1CQ3dKQUlBUWdBa2NOQUVHM0FTRVFESzBDQ3dKQUFrQWdCQzBBQUVHN2Yyb09EZ0NXQVpZQmxnR1dBWllCbGdHV0FaWUJsZ0dXQVpZQmxnRUJsZ0VMSUFSQkFXb2hCRUdoQVNFUURKUUNDeUFFUVFGcUlRUkJvZ0VoRUF5VEFnc0NRQ0FFSUFKSERRQkJ1QUVoRUF5c0Fnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVDYWlFUUFrQURRQ0FFTFFBQUlBRkI3YytBZ0FCcUxRQUFSdzJVQVNBQlFRSkdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCdUFFaEVBeXNBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRVNJUkFNa1FFTEFrQWdCQ0FDUncwQVFia0JJUkFNcXdJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBV29oRUFKQUEwQWdCQzBBQUNBQlFmRFBnSUFBYWkwQUFFY05rd0VnQVVFQlJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRYmtCSVJBTXF3SUxJQUJCQURZQ0FDQVFRUUZxSVFGQklDRVFESkFCQ3dKQUlBUWdBa2NOQUVHNkFTRVFES29DQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRRnFJUkFDUUFOQUlBUXRBQUFnQVVIeXo0Q0FBR290QUFCSERaSUJJQUZCQVVZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFRzZBU0VRREtvQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVE4aEVBeVBBUXNDUUNBRUlBSkhEUUJCdXdFaEVBeXBBZ3NDUUFKQUlBUXRBQUJCdDM5cURnY0FrZ0dTQVpJQmtnR1NBUUdTQVFzZ0JFRUJhaUVFUWFVQklSQU1rQUlMSUFSQkFXb2hCRUdtQVNFUURJOENDd0pBSUFRZ0FrY05BRUc4QVNFUURLZ0NDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFkcUlSQUNRQU5BSUFRdEFBQWdBVUgwejRDQUFHb3RBQUJIRFpBQklBRkJCMFlOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHOEFTRVFES2dDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUnNoRUF5TkFRc0NRQ0FFSUFKSERRQkJ2UUVoRUF5bkFnc0NRQUpBQWtBZ0JDMEFBRUcrZjJvT0VnQ1JBWkVCa1FHUkFaRUJrUUdSQVpFQmtRRUJrUUdSQVpFQmtRR1JBWkVCQXBFQkN5QUVRUUZxSVFSQnBBRWhFQXlQQWdzZ0JFRUJhaUVFUWFjQklSQU1qZ0lMSUFSQkFXb2hCRUdvQVNFUURJMENDd0pBSUFRZ0FrY05BRUcrQVNFUURLWUNDeUFFTFFBQVFjNEFSdzJOQVNBRVFRRnFJUVFNendFTEFrQWdCQ0FDUncwQVFiOEJJUkFNcFFJTEFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQkMwQUFFRy9mMm9PRlFBQkFnT2NBUVFGQnB3Qm5BR2NBUWNJQ1FvTG5BRU1EUTRQbkFFTElBUkJBV29oQVVIb0FDRVFESm9DQ3lBRVFRRnFJUUZCNlFBaEVBeVpBZ3NnQkVFQmFpRUJRZTRBSVJBTW1BSUxJQVJCQVdvaEFVSHlBQ0VRREpjQ0N5QUVRUUZxSVFGQjh3QWhFQXlXQWdzZ0JFRUJhaUVCUWZZQUlSQU1sUUlMSUFSQkFXb2hBVUgzQUNFUURKUUNDeUFFUVFGcUlRRkIrZ0FoRUF5VEFnc2dCRUVCYWlFRVFZTUJJUkFNa2dJTElBUkJBV29oQkVHRUFTRVFESkVDQ3lBRVFRRnFJUVJCaFFFaEVBeVFBZ3NnQkVFQmFpRUVRWklCSVJBTWp3SUxJQVJCQVdvaEJFR1lBU0VRREk0Q0N5QUVRUUZxSVFSQm9BRWhFQXlOQWdzZ0JFRUJhaUVFUWFNQklSQU1qQUlMSUFSQkFXb2hCRUdxQVNFUURJc0NDd0pBSUFRZ0FrWU5BQ0FBUVpDQWdJQUFOZ0lJSUFBZ0JEWUNCRUdyQVNFUURJc0NDMEhBQVNFUURLTUNDeUFBSUFVZ0FoQ3FnSUNBQUNJQkRZc0JJQVVoQVF4Y0N3SkFJQVlnQWtZTkFDQUdRUUZxSVFVTWpRRUxRY0lCSVJBTW9RSUxBMEFDUUNBUUxRQUFRWFpxRGdTTUFRQUFqd0VBQ3lBUVFRRnFJaEFnQWtjTkFBdEJ3d0VoRUF5Z0Fnc0NRQ0FISUFKR0RRQWdBRUdSZ0lDQUFEWUNDQ0FBSUFjMkFnUWdCeUVCUVFFaEVBeUhBZ3RCeEFFaEVBeWZBZ3NDUUNBSElBSkhEUUJCeFFFaEVBeWZBZ3NDUUFKQUlBY3RBQUJCZG1vT0JBSE9BYzRCQU00QkN5QUhRUUZxSVFZTWpRRUxJQWRCQVdvaEJReUpBUXNDUUNBSElBSkhEUUJCeGdFaEVBeWVBZ3NDUUFKQUlBY3RBQUJCZG1vT0Z3R1BBWThCQVk4Qmp3R1BBWThCandHUEFZOEJqd0dQQVk4Qmp3R1BBWThCandHUEFZOEJqd0dQQVFDUEFRc2dCMEVCYWlFSEMwR3dBU0VRRElRQ0N3SkFJQWdnQWtjTkFFSElBU0VRREowQ0N5QUlMUUFBUVNCSERZMEJJQUJCQURzQk1pQUlRUUZxSVFGQnN3RWhFQXlEQWdzZ0FTRVhBa0FEUUNBWElnY2dBa1lOQVNBSExRQUFRVkJxUWY4QmNTSVFRUXBQRGN3QkFrQWdBQzhCTWlJVVFaa3pTdzBBSUFBZ0ZFRUtiQ0lVT3dFeUlCQkIvLzhEY3lBVVFmNy9BM0ZKRFFBZ0IwRUJhaUVYSUFBZ0ZDQVFhaUlRT3dFeUlCQkIvLzhEY1VIb0Iwa05BUXNMUVFBaEVDQUFRUUEyQWh3Z0FFSEJpWUNBQURZQ0VDQUFRUTAyQWd3Z0FDQUhRUUZxTmdJVURKd0NDMEhIQVNFUURKc0NDeUFBSUFnZ0FoQ3VnSUNBQUNJUVJRM0tBU0FRUVJWSERZd0JJQUJCeUFFMkFod2dBQ0FJTmdJVUlBQkJ5WmVBZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXlhQWdzQ1FDQUpJQUpIRFFCQnpBRWhFQXlhQWd0QkFDRVVRUUVoRjBFQklSWkJBQ0VRQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUFrdEFBQkJVR29PQ3BZQmxRRUFBUUlEQkFVR0NKY0JDMEVDSVJBTUJndEJBeUVRREFVTFFRUWhFQXdFQzBFRklSQU1Bd3RCQmlFUURBSUxRUWNoRUF3QkMwRUlJUkFMUVFBaEYwRUFJUlpCQUNFVURJNEJDMEVKSVJCQkFTRVVRUUFoRjBFQUlSWU1qUUVMQWtBZ0NpQUNSdzBBUWM0QklSQU1tUUlMSUFvdEFBQkJMa2NOamdFZ0NrRUJhaUVKRE1vQkN5QUxJQUpIRFk0QlFkQUJJUkFNbHdJTEFrQWdDeUFDUmcwQUlBQkJqb0NBZ0FBMkFnZ2dBQ0FMTmdJRVFiY0JJUkFNL2dFTFFkRUJJUkFNbGdJTEFrQWdCQ0FDUncwQVFkSUJJUkFNbGdJTElBSWdCR3NnQUNnQ0FDSVFhaUVVSUFRZ0VHdEJCR29oQ3dOQUlBUXRBQUFnRUVIOHo0Q0FBR290QUFCSERZNEJJQkJCQkVZTjZRRWdFRUVCYWlFUUlBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkIwZ0VoRUF5VkFnc2dBQ0FNSUFJUXJJQ0FnQUFpQVEyTkFTQU1JUUVNdUFFTEFrQWdCQ0FDUncwQVFkUUJJUkFNbEFJTElBSWdCR3NnQUNnQ0FDSVFhaUVVSUFRZ0VHdEJBV29oREFOQUlBUXRBQUFnRUVHQjBJQ0FBR290QUFCSERZOEJJQkJCQVVZTmpnRWdFRUVCYWlFUUlBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkIxQUVoRUF5VEFnc0NRQ0FFSUFKSERRQkIxZ0VoRUF5VEFnc2dBaUFFYXlBQUtBSUFJaEJxSVJRZ0JDQVFhMEVDYWlFTEEwQWdCQzBBQUNBUVFZUFFnSUFBYWkwQUFFY05qZ0VnRUVFQ1JnMlFBU0FRUVFGcUlSQWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUhXQVNFUURKSUNDd0pBSUFRZ0FrY05BRUhYQVNFUURKSUNDd0pBQWtBZ0JDMEFBRUc3ZjJvT0VBQ1BBWThCandHUEFZOEJqd0dQQVk4Qmp3R1BBWThCandHUEFZOEJBWThCQ3lBRVFRRnFJUVJCdXdFaEVBejVBUXNnQkVFQmFpRUVRYndCSVJBTStBRUxBa0FnQkNBQ1J3MEFRZGdCSVJBTWtRSUxJQVF0QUFCQnlBQkhEWXdCSUFSQkFXb2hCQXpFQVFzQ1FDQUVJQUpHRFFBZ0FFR1FnSUNBQURZQ0NDQUFJQVEyQWdSQnZnRWhFQXozQVF0QjJRRWhFQXlQQWdzQ1FDQUVJQUpIRFFCQjJnRWhFQXlQQWdzZ0JDMEFBRUhJQUVZTnd3RWdBRUVCT2dBb0RMa0JDeUFBUVFJNkFDOGdBQ0FFSUFJUXBvQ0FnQUFpRUEyTkFVSENBU0VRRFBRQkN5QUFMUUFvUVg5cURnSzNBYmtCdUFFTEEwQUNRQ0FFTFFBQVFYWnFEZ1FBamdHT0FRQ09BUXNnQkVFQmFpSUVJQUpIRFFBTFFkMEJJUkFNaXdJTElBQkJBRG9BTHlBQUxRQXRRUVJ4UlEyRUFnc2dBRUVBT2dBdklBQkJBVG9BTkNBQklRRU1qQUVMSUJCQkZVWU4yZ0VnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRYWVPZ0lBQU5nSVFJQUJCRWpZQ0RFRUFJUkFNaUFJTEFrQWdBQ0FRSUFJUXRJQ0FnQUFpQkEwQUlCQWhBUXlCQWdzQ1FDQUVRUlZIRFFBZ0FFRUROZ0ljSUFBZ0VEWUNGQ0FBUWJDWWdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTWlBSUxJQUJCQURZQ0hDQUFJQkEyQWhRZ0FFR25qb0NBQURZQ0VDQUFRUkkyQWd4QkFDRVFESWNDQ3lBUVFSVkdEZFlCSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUhhallDQUFEWUNFQ0FBUVJRMkFneEJBQ0VRRElZQ0N5QUFLQUlFSVJjZ0FFRUFOZ0lFSUJBZ0VhZHFJaFloQVNBQUlCY2dFQ0FXSUJRYkloQVF0WUNBZ0FBaUZFVU5qUUVnQUVFSE5nSWNJQUFnRURZQ0ZDQUFJQlEyQWd4QkFDRVFESVVDQ3lBQUlBQXZBVEJCZ0FGeU93RXdJQUVoQVF0QktpRVFET29CQ3lBUVFSVkdEZEVCSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUdEaklDQUFEWUNFQ0FBUVJNMkFneEJBQ0VRRElJQ0N5QVFRUlZHRGM4QklBQkJBRFlDSENBQUlBRTJBaFFnQUVHYWo0Q0FBRFlDRUNBQVFTSTJBZ3hCQUNFUURJRUNDeUFBS0FJRUlSQWdBRUVBTmdJRUFrQWdBQ0FRSUFFUXQ0Q0FnQUFpRUEwQUlBRkJBV29oQVF5TkFRc2dBRUVNTmdJY0lBQWdFRFlDRENBQUlBRkJBV28yQWhSQkFDRVFESUFDQ3lBUVFSVkdEY3dCSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUdhajRDQUFEWUNFQ0FBUVNJMkFneEJBQ0VRRFA4QkN5QUFLQUlFSVJBZ0FFRUFOZ0lFQWtBZ0FDQVFJQUVRdDRDQWdBQWlFQTBBSUFGQkFXb2hBUXlNQVFzZ0FFRU5OZ0ljSUFBZ0VEWUNEQ0FBSUFGQkFXbzJBaFJCQUNFUURQNEJDeUFRUVJWR0Rja0JJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSEdqSUNBQURZQ0VDQUFRU00yQWd4QkFDRVFEUDBCQ3lBQUtBSUVJUkFnQUVFQU5nSUVBa0FnQUNBUUlBRVF1WUNBZ0FBaUVBMEFJQUZCQVdvaEFReUxBUXNnQUVFT05nSWNJQUFnRURZQ0RDQUFJQUZCQVdvMkFoUkJBQ0VRRFB3QkN5QUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQndKV0FnQUEyQWhBZ0FFRUNOZ0lNUVFBaEVBejdBUXNnRUVFVlJnM0ZBU0FBUVFBMkFod2dBQ0FCTmdJVUlBQkJ4b3lBZ0FBMkFoQWdBRUVqTmdJTVFRQWhFQXo2QVFzZ0FFRVFOZ0ljSUFBZ0FUWUNGQ0FBSUJBMkFneEJBQ0VRRFBrQkN5QUFLQUlFSVFRZ0FFRUFOZ0lFQWtBZ0FDQUVJQUVRdVlDQWdBQWlCQTBBSUFGQkFXb2hBUXp4QVFzZ0FFRVJOZ0ljSUFBZ0JEWUNEQ0FBSUFGQkFXbzJBaFJCQUNFUURQZ0JDeUFRUVJWR0RjRUJJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSEdqSUNBQURZQ0VDQUFRU00yQWd4QkFDRVFEUGNCQ3lBQUtBSUVJUkFnQUVFQU5nSUVBa0FnQUNBUUlBRVF1WUNBZ0FBaUVBMEFJQUZCQVdvaEFReUlBUXNnQUVFVE5nSWNJQUFnRURZQ0RDQUFJQUZCQVdvMkFoUkJBQ0VRRFBZQkN5QUFLQUlFSVFRZ0FFRUFOZ0lFQWtBZ0FDQUVJQUVRdVlDQWdBQWlCQTBBSUFGQkFXb2hBUXp0QVFzZ0FFRVVOZ0ljSUFBZ0JEWUNEQ0FBSUFGQkFXbzJBaFJCQUNFUURQVUJDeUFRUVJWR0RiMEJJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFR2FqNENBQURZQ0VDQUFRU0kyQWd4QkFDRVFEUFFCQ3lBQUtBSUVJUkFnQUVFQU5nSUVBa0FnQUNBUUlBRVF0NENBZ0FBaUVBMEFJQUZCQVdvaEFReUdBUXNnQUVFV05nSWNJQUFnRURZQ0RDQUFJQUZCQVdvMkFoUkJBQ0VRRFBNQkN5QUFLQUlFSVFRZ0FFRUFOZ0lFQWtBZ0FDQUVJQUVRdDRDQWdBQWlCQTBBSUFGQkFXb2hBUXpwQVFzZ0FFRVhOZ0ljSUFBZ0JEWUNEQ0FBSUFGQkFXbzJBaFJCQUNFUURQSUJDeUFBUVFBMkFod2dBQ0FCTmdJVUlBQkJ6Wk9BZ0FBMkFoQWdBRUVNTmdJTVFRQWhFQXp4QVF0Q0FTRVJDeUFRUVFGcUlRRUNRQ0FBS1FNZ0loSkMvLy8vLy8vLy8vOFBWZzBBSUFBZ0VrSUVoaUFSaERjRElDQUJJUUVNaEFFTElBQkJBRFlDSENBQUlBRTJBaFFnQUVHdGlZQ0FBRFlDRUNBQVFRdzJBZ3hCQUNFUURPOEJDeUFBUVFBMkFod2dBQ0FRTmdJVUlBQkJ6Wk9BZ0FBMkFoQWdBRUVNTmdJTVFRQWhFQXp1QVFzZ0FDZ0NCQ0VYSUFCQkFEWUNCQ0FRSUJHbmFpSVdJUUVnQUNBWElCQWdGaUFVR3lJUUVMV0FnSUFBSWhSRkRYTWdBRUVGTmdJY0lBQWdFRFlDRkNBQUlCUTJBZ3hCQUNFUURPMEJDeUFBUVFBMkFod2dBQ0FRTmdJVUlBQkJxcHlBZ0FBMkFoQWdBRUVQTmdJTVFRQWhFQXpzQVFzZ0FDQVFJQUlRdElDQWdBQWlBUTBCSUJBaEFRdEJEaUVRRE5FQkN3SkFJQUZCRlVjTkFDQUFRUUkyQWh3Z0FDQVFOZ0lVSUFCQnNKaUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBenFBUXNnQUVFQU5nSWNJQUFnRURZQ0ZDQUFRYWVPZ0lBQU5nSVFJQUJCRWpZQ0RFRUFJUkFNNlFFTElBRkJBV29oRUFKQUlBQXZBVEFpQVVHQUFYRkZEUUFDUUNBQUlCQWdBaEM3Z0lDQUFDSUJEUUFnRUNFQkRIQUxJQUZCRlVjTnVnRWdBRUVGTmdJY0lBQWdFRFlDRkNBQVFmbVhnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU02UUVMQWtBZ0FVR2dCSEZCb0FSSERRQWdBQzBBTFVFQ2NRMEFJQUJCQURZQ0hDQUFJQkEyQWhRZ0FFR1drNENBQURZQ0VDQUFRUVEyQWd4QkFDRVFET2tCQ3lBQUlCQWdBaEM5Z0lDQUFCb2dFQ0VCQWtBQ1FBSkFBa0FDUUNBQUlCQWdBaEN6Z0lDQUFBNFdBZ0VBQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQXdRTElBQkJBVG9BTGdzZ0FDQUFMd0V3UWNBQWNqc0JNQ0FRSVFFTFFTWWhFQXpSQVFzZ0FFRWpOZ0ljSUFBZ0VEWUNGQ0FBUWFXV2dJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTTZRRUxJQUJCQURZQ0hDQUFJQkEyQWhRZ0FFSFZpNENBQURZQ0VDQUFRUkUyQWd4QkFDRVFET2dCQ3lBQUxRQXRRUUZ4UlEwQlFjTUJJUkFNemdFTEFrQWdEU0FDUmcwQUEwQUNRQ0FOTFFBQVFTQkdEUUFnRFNFQkRNUUJDeUFOUVFGcUlnMGdBa2NOQUF0QkpTRVFET2NCQzBFbElSQU01Z0VMSUFBb0FnUWhCQ0FBUVFBMkFnUWdBQ0FFSUEwUXI0Q0FnQUFpQkVVTnJRRWdBRUVtTmdJY0lBQWdCRFlDRENBQUlBMUJBV28yQWhSQkFDRVFET1VCQ3lBUVFSVkdEYXNCSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUg5allDQUFEWUNFQ0FBUVIwMkFneEJBQ0VRRE9RQkN5QUFRU2MyQWh3Z0FDQUJOZ0lVSUFBZ0VEWUNERUVBSVJBTTR3RUxJQkFoQVVFQklSUUNRQUpBQWtBQ1FBSkFBa0FDUUNBQUxRQXNRWDVxRGdjR0JRVURBUUlBQlFzZ0FDQUFMd0V3UVFoeU93RXdEQU1MUVFJaEZBd0JDMEVFSVJRTElBQkJBVG9BTENBQUlBQXZBVEFnRkhJN0FUQUxJQkFoQVF0Qkt5RVFETW9CQ3lBQVFRQTJBaHdnQUNBUU5nSVVJQUJCcTVLQWdBQTJBaEFnQUVFTE5nSU1RUUFoRUF6aUFRc2dBRUVBTmdJY0lBQWdBVFlDRkNBQVFlR1BnSUFBTmdJUUlBQkJDallDREVFQUlSQU00UUVMSUFCQkFEb0FMQ0FRSVFFTXZRRUxJQkFoQVVFQklSUUNRQUpBQWtBQ1FBSkFJQUF0QUN4QmUyb09CQU1CQWdBRkN5QUFJQUF2QVRCQkNISTdBVEFNQXd0QkFpRVVEQUVMUVFRaEZBc2dBRUVCT2dBc0lBQWdBQzhCTUNBVWNqc0JNQXNnRUNFQkMwRXBJUkFNeFFFTElBQkJBRFlDSENBQUlBRTJBaFFnQUVId2xJQ0FBRFlDRUNBQVFRTTJBZ3hCQUNFUUROMEJDd0pBSUE0dEFBQkJEVWNOQUNBQUtBSUVJUUVnQUVFQU5nSUVBa0FnQUNBQklBNFFzWUNBZ0FBaUFRMEFJQTVCQVdvaEFReDFDeUFBUVN3MkFod2dBQ0FCTmdJTUlBQWdEa0VCYWpZQ0ZFRUFJUkFNM1FFTElBQXRBQzFCQVhGRkRRRkJ4QUVoRUF6REFRc0NRQ0FPSUFKSERRQkJMU0VRRE53QkN3SkFBa0FEUUFKQUlBNHRBQUJCZG1vT0JBSUFBQU1BQ3lBT1FRRnFJZzRnQWtjTkFBdEJMU0VRRE4wQkN5QUFLQUlFSVFFZ0FFRUFOZ0lFQWtBZ0FDQUJJQTRRc1lDQWdBQWlBUTBBSUE0aEFReDBDeUFBUVN3MkFod2dBQ0FPTmdJVUlBQWdBVFlDREVFQUlSQU0zQUVMSUFBb0FnUWhBU0FBUVFBMkFnUUNRQ0FBSUFFZ0RoQ3hnSUNBQUNJQkRRQWdEa0VCYWlFQkRITUxJQUJCTERZQ0hDQUFJQUUyQWd3Z0FDQU9RUUZxTmdJVVFRQWhFQXpiQVFzZ0FDZ0NCQ0VFSUFCQkFEWUNCQ0FBSUFRZ0RoQ3hnSUNBQUNJRURhQUJJQTRoQVF6T0FRc2dFRUVzUncwQklBRkJBV29oRUVFQklRRUNRQUpBQWtBQ1FBSkFJQUF0QUN4QmUyb09CQU1CQWdRQUN5QVFJUUVNQkF0QkFpRUJEQUVMUVFRaEFRc2dBRUVCT2dBc0lBQWdBQzhCTUNBQmNqc0JNQ0FRSVFFTUFRc2dBQ0FBTHdFd1FRaHlPd0V3SUJBaEFRdEJPU0VRREw4QkN5QUFRUUE2QUN3Z0FTRUJDMEUwSVJBTXZRRUxJQUFnQUM4Qk1FRWdjanNCTUNBQklRRU1BZ3NnQUNnQ0JDRUVJQUJCQURZQ0JBSkFJQUFnQkNBQkVMR0FnSUFBSWdRTkFDQUJJUUVNeHdFTElBQkJOellDSENBQUlBRTJBaFFnQUNBRU5nSU1RUUFoRUF6VUFRc2dBRUVJT2dBc0lBRWhBUXRCTUNFUURMa0JDd0pBSUFBdEFDaEJBVVlOQUNBQklRRU1CQXNnQUMwQUxVRUljVVVOa3dFZ0FTRUJEQU1MSUFBdEFEQkJJSEVObEFGQnhRRWhFQXkzQVFzQ1FDQVBJQUpHRFFBQ1FBTkFBa0FnRHkwQUFFRlFhaUlCUWY4QmNVRUtTUTBBSUE4aEFVRTFJUkFNdWdFTElBQXBBeUFpRVVLWnMrYk1tYlBtekJsV0RRRWdBQ0FSUWdwK0loRTNBeUFnRVNBQnJVTC9BWU1pRWtKL2hWWU5BU0FBSUJFZ0VudzNBeUFnRDBFQmFpSVBJQUpIRFFBTFFUa2hFQXpSQVFzZ0FDZ0NCQ0VDSUFCQkFEWUNCQ0FBSUFJZ0QwRUJhaUlFRUxHQWdJQUFJZ0lObFFFZ0JDRUJETU1CQzBFNUlSQU16d0VMQWtBZ0FDOEJNQ0lCUVFoeFJRMEFJQUF0QUNoQkFVY05BQ0FBTFFBdFFRaHhSUTJRQVFzZ0FDQUJRZmY3QTNGQmdBUnlPd0V3SUE4aEFRdEJOeUVRRExRQkN5QUFJQUF2QVRCQkVISTdBVEFNcXdFTElCQkJGVVlOaXdFZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWZDT2dJQUFOZ0lRSUFCQkhEWUNERUVBSVJBTXl3RUxJQUJCd3dBMkFod2dBQ0FCTmdJTUlBQWdEVUVCYWpZQ0ZFRUFJUkFNeWdFTEFrQWdBUzBBQUVFNlJ3MEFJQUFvQWdRaEVDQUFRUUEyQWdRQ1FDQUFJQkFnQVJDdmdJQ0FBQ0lRRFFBZ0FVRUJhaUVCREdNTElBQkJ3d0EyQWh3Z0FDQVFOZ0lNSUFBZ0FVRUJhallDRkVFQUlSQU15Z0VMSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUd4a1lDQUFEWUNFQ0FBUVFvMkFneEJBQ0VRRE1rQkN5QUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQm9KbUFnQUEyQWhBZ0FFRWVOZ0lNUVFBaEVBeklBUXNnQUVFQU5nSUFDeUFBUVlBU093RXFJQUFnRjBFQmFpSUJJQUlRcUlDQWdBQWlFQTBCSUFFaEFRdEJ4d0FoRUF5c0FRc2dFRUVWUncyREFTQUFRZEVBTmdJY0lBQWdBVFlDRkNBQVFlT1hnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU14QUVMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQ25nSUNBQUNJUURRQWdBU0VCREY0TElBQkIwZ0EyQWh3Z0FDQUJOZ0lVSUFBZ0VEWUNERUVBSVJBTXd3RUxJQUJCQURZQ0hDQUFJQlEyQWhRZ0FFSEJxSUNBQURZQ0VDQUFRUWMyQWd3Z0FFRUFOZ0lBUVFBaEVBekNBUXNnQUNnQ0JDRVFJQUJCQURZQ0JBSkFJQUFnRUNBQkVLZUFnSUFBSWhBTkFDQUJJUUVNWFFzZ0FFSFRBRFlDSENBQUlBRTJBaFFnQUNBUU5nSU1RUUFoRUF6QkFRdEJBQ0VRSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUdBa1lDQUFEWUNFQ0FBUVFrMkFnd013QUVMSUJCQkZVWU5mU0FBUVFBMkFod2dBQ0FCTmdJVUlBQkJsSTJBZ0FBMkFoQWdBRUVoTmdJTVFRQWhFQXkvQVF0QkFTRVdRUUFoRjBFQUlSUkJBU0VRQ3lBQUlCQTZBQ3NnQVVFQmFpRUJBa0FDUUNBQUxRQXRRUkJ4RFFBQ1FBSkFBa0FnQUMwQUtnNERBUUFDQkFzZ0ZrVU5Bd3dDQ3lBVURRRU1BZ3NnRjBVTkFRc2dBQ2dDQkNFUUlBQkJBRFlDQkFKQUlBQWdFQ0FCRUsyQWdJQUFJaEFOQUNBQklRRU1YQXNnQUVIWUFEWUNIQ0FBSUFFMkFoUWdBQ0FRTmdJTVFRQWhFQXkrQVFzZ0FDZ0NCQ0VFSUFCQkFEWUNCQUpBSUFBZ0JDQUJFSzJBZ0lBQUlnUU5BQ0FCSVFFTXJRRUxJQUJCMlFBMkFod2dBQ0FCTmdJVUlBQWdCRFlDREVFQUlSQU12UUVMSUFBb0FnUWhCQ0FBUVFBMkFnUUNRQ0FBSUFRZ0FSQ3RnSUNBQUNJRURRQWdBU0VCREtzQkN5QUFRZG9BTmdJY0lBQWdBVFlDRkNBQUlBUTJBZ3hCQUNFUURMd0JDeUFBS0FJRUlRUWdBRUVBTmdJRUFrQWdBQ0FFSUFFUXJZQ0FnQUFpQkEwQUlBRWhBUXlwQVFzZ0FFSGNBRFlDSENBQUlBRTJBaFFnQUNBRU5nSU1RUUFoRUF5N0FRc0NRQ0FCTFFBQVFWQnFJaEJCL3dGeFFRcFBEUUFnQUNBUU9nQXFJQUZCQVdvaEFVSFBBQ0VRREtJQkN5QUFLQUlFSVFRZ0FFRUFOZ0lFQWtBZ0FDQUVJQUVRcllDQWdBQWlCQTBBSUFFaEFReW5BUXNnQUVIZUFEWUNIQ0FBSUFFMkFoUWdBQ0FFTmdJTVFRQWhFQXk2QVFzZ0FFRUFOZ0lBSUJkQkFXb2hBUUpBSUFBdEFDbEJJMDhOQUNBQklRRU1XUXNnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRZE9KZ0lBQU5nSVFJQUJCQ0RZQ0RFRUFJUkFNdVFFTElBQkJBRFlDQUF0QkFDRVFJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFR1FzNENBQURZQ0VDQUFRUWcyQWd3TXR3RUxJQUJCQURZQ0FDQVhRUUZxSVFFQ1FDQUFMUUFwUVNGSERRQWdBU0VCREZZTElBQkJBRFlDSENBQUlBRTJBaFFnQUVHYmlvQ0FBRFlDRUNBQVFRZzJBZ3hCQUNFUURMWUJDeUFBUVFBMkFnQWdGMEVCYWlFQkFrQWdBQzBBS1NJUVFWMXFRUXRQRFFBZ0FTRUJERlVMQWtBZ0VFRUdTdzBBUVFFZ0VIUkJ5Z0J4UlEwQUlBRWhBUXhWQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFmZUpnSUFBTmdJUUlBQkJDRFlDREF5MUFRc2dFRUVWUmcxeElBQkJBRFlDSENBQUlBRTJBaFFnQUVHNWpZQ0FBRFlDRUNBQVFSbzJBZ3hCQUNFUURMUUJDeUFBS0FJRUlSQWdBRUVBTmdJRUFrQWdBQ0FRSUFFUXA0Q0FnQUFpRUEwQUlBRWhBUXhVQ3lBQVFlVUFOZ0ljSUFBZ0FUWUNGQ0FBSUJBMkFneEJBQ0VRRExNQkN5QUFLQUlFSVJBZ0FFRUFOZ0lFQWtBZ0FDQVFJQUVRcDRDQWdBQWlFQTBBSUFFaEFReE5DeUFBUWRJQU5nSWNJQUFnQVRZQ0ZDQUFJQkEyQWd4QkFDRVFETElCQ3lBQUtBSUVJUkFnQUVFQU5nSUVBa0FnQUNBUUlBRVFwNENBZ0FBaUVBMEFJQUVoQVF4TkN5QUFRZE1BTmdJY0lBQWdBVFlDRkNBQUlCQTJBZ3hCQUNFUURMRUJDeUFBS0FJRUlSQWdBRUVBTmdJRUFrQWdBQ0FRSUFFUXA0Q0FnQUFpRUEwQUlBRWhBUXhSQ3lBQVFlVUFOZ0ljSUFBZ0FUWUNGQ0FBSUJBMkFneEJBQ0VRRExBQkN5QUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQnhvcUFnQUEyQWhBZ0FFRUhOZ0lNUVFBaEVBeXZBUXNnQUNnQ0JDRVFJQUJCQURZQ0JBSkFJQUFnRUNBQkVLZUFnSUFBSWhBTkFDQUJJUUVNU1FzZ0FFSFNBRFlDSENBQUlBRTJBaFFnQUNBUU5nSU1RUUFoRUF5dUFRc2dBQ2dDQkNFUUlBQkJBRFlDQkFKQUlBQWdFQ0FCRUtlQWdJQUFJaEFOQUNBQklRRU1TUXNnQUVIVEFEWUNIQ0FBSUFFMkFoUWdBQ0FRTmdJTVFRQWhFQXl0QVFzZ0FDZ0NCQ0VRSUFCQkFEWUNCQUpBSUFBZ0VDQUJFS2VBZ0lBQUloQU5BQ0FCSVFFTVRRc2dBRUhsQURZQ0hDQUFJQUUyQWhRZ0FDQVFOZ0lNUVFBaEVBeXNBUXNnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRZHlJZ0lBQU5nSVFJQUJCQnpZQ0RFRUFJUkFNcXdFTElCQkJQMGNOQVNBQlFRRnFJUUVMUVFVaEVBeVFBUXRCQUNFUUlBQkJBRFlDSENBQUlBRTJBaFFnQUVIOWtvQ0FBRFlDRUNBQVFRYzJBZ3dNcUFFTElBQW9BZ1FoRUNBQVFRQTJBZ1FDUUNBQUlCQWdBUkNuZ0lDQUFDSVFEUUFnQVNFQkRFSUxJQUJCMGdBMkFod2dBQ0FCTmdJVUlBQWdFRFlDREVFQUlSQU1wd0VMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQ25nSUNBQUNJUURRQWdBU0VCREVJTElBQkIwd0EyQWh3Z0FDQUJOZ0lVSUFBZ0VEWUNERUVBSVJBTXBnRUxJQUFvQWdRaEVDQUFRUUEyQWdRQ1FDQUFJQkFnQVJDbmdJQ0FBQ0lRRFFBZ0FTRUJERVlMSUFCQjVRQTJBaHdnQUNBQk5nSVVJQUFnRURZQ0RFRUFJUkFNcFFFTElBQW9BZ1FoQVNBQVFRQTJBZ1FDUUNBQUlBRWdGQkNuZ0lDQUFDSUJEUUFnRkNFQkREOExJQUJCMGdBMkFod2dBQ0FVTmdJVUlBQWdBVFlDREVFQUlSQU1wQUVMSUFBb0FnUWhBU0FBUVFBMkFnUUNRQ0FBSUFFZ0ZCQ25nSUNBQUNJQkRRQWdGQ0VCREQ4TElBQkIwd0EyQWh3Z0FDQVVOZ0lVSUFBZ0FUWUNERUVBSVJBTW93RUxJQUFvQWdRaEFTQUFRUUEyQWdRQ1FDQUFJQUVnRkJDbmdJQ0FBQ0lCRFFBZ0ZDRUJERU1MSUFCQjVRQTJBaHdnQUNBVU5nSVVJQUFnQVRZQ0RFRUFJUkFNb2dFTElBQkJBRFlDSENBQUlCUTJBaFFnQUVIRGo0Q0FBRFlDRUNBQVFRYzJBZ3hCQUNFUURLRUJDeUFBUVFBMkFod2dBQ0FCTmdJVUlBQkJ3NCtBZ0FBMkFoQWdBRUVITmdJTVFRQWhFQXlnQVF0QkFDRVFJQUJCQURZQ0hDQUFJQlEyQWhRZ0FFR01uSUNBQURZQ0VDQUFRUWMyQWd3TW53RUxJQUJCQURZQ0hDQUFJQlEyQWhRZ0FFR01uSUNBQURZQ0VDQUFRUWMyQWd4QkFDRVFESjRCQ3lBQVFRQTJBaHdnQUNBVU5nSVVJQUJCL3BHQWdBQTJBaEFnQUVFSE5nSU1RUUFoRUF5ZEFRc2dBRUVBTmdJY0lBQWdBVFlDRkNBQVFZNmJnSUFBTmdJUUlBQkJCallDREVFQUlSQU1uQUVMSUJCQkZVWU5WeUFBUVFBMkFod2dBQ0FCTmdJVUlBQkJ6STZBZ0FBMkFoQWdBRUVnTmdJTVFRQWhFQXliQVFzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVrSVJBTElBQWdFRG9BS1NBQUtBSUVJUkFnQUVFQU5nSUVJQUFnRUNBQkVLdUFnSUFBSWhBTlZDQUJJUUVNUGdzZ0FFRUFOZ0lBQzBFQUlSQWdBRUVBTmdJY0lBQWdCRFlDRkNBQVFmR2JnSUFBTmdJUUlBQkJCallDREF5WEFRc2dBVUVWUmcxUUlBQkJBRFlDSENBQUlBVTJBaFFnQUVId2pJQ0FBRFlDRUNBQVFSczJBZ3hCQUNFUURKWUJDeUFBS0FJRUlRVWdBRUVBTmdJRUlBQWdCU0FRRUttQWdJQUFJZ1VOQVNBUVFRRnFJUVVMUWEwQklSQU1ld3NnQUVIQkFUWUNIQ0FBSUFVMkFnd2dBQ0FRUVFGcU5nSVVRUUFoRUF5VEFRc2dBQ2dDQkNFR0lBQkJBRFlDQkNBQUlBWWdFQkNwZ0lDQUFDSUdEUUVnRUVFQmFpRUdDMEd1QVNFUURIZ0xJQUJCd2dFMkFod2dBQ0FHTmdJTUlBQWdFRUVCYWpZQ0ZFRUFJUkFNa0FFTElBQkJBRFlDSENBQUlBYzJBaFFnQUVHWGk0Q0FBRFlDRUNBQVFRMDJBZ3hCQUNFUURJOEJDeUFBUVFBMkFod2dBQ0FJTmdJVUlBQkI0NUNBZ0FBMkFoQWdBRUVKTmdJTVFRQWhFQXlPQVFzZ0FFRUFOZ0ljSUFBZ0NEWUNGQ0FBUVpTTmdJQUFOZ0lRSUFCQklUWUNERUVBSVJBTWpRRUxRUUVoRmtFQUlSZEJBQ0VVUVFFaEVBc2dBQ0FRT2dBcklBbEJBV29oQ0FKQUFrQWdBQzBBTFVFUWNRMEFBa0FDUUFKQUlBQXRBQ29PQXdFQUFnUUxJQlpGRFFNTUFnc2dGQTBCREFJTElCZEZEUUVMSUFBb0FnUWhFQ0FBUVFBMkFnUWdBQ0FRSUFnUXJZQ0FnQUFpRUVVTlBTQUFRY2tCTmdJY0lBQWdDRFlDRkNBQUlCQTJBZ3hCQUNFUURJd0JDeUFBS0FJRUlRUWdBRUVBTmdJRUlBQWdCQ0FJRUsyQWdJQUFJZ1JGRFhZZ0FFSEtBVFlDSENBQUlBZzJBaFFnQUNBRU5nSU1RUUFoRUF5TEFRc2dBQ2dDQkNFRUlBQkJBRFlDQkNBQUlBUWdDUkN0Z0lDQUFDSUVSUTEwSUFCQnl3RTJBaHdnQUNBSk5nSVVJQUFnQkRZQ0RFRUFJUkFNaWdFTElBQW9BZ1FoQkNBQVFRQTJBZ1FnQUNBRUlBb1FyWUNBZ0FBaUJFVU5jaUFBUWMwQk5nSWNJQUFnQ2pZQ0ZDQUFJQVEyQWd4QkFDRVFESWtCQ3dKQUlBc3RBQUJCVUdvaUVFSC9BWEZCQ2s4TkFDQUFJQkE2QUNvZ0MwRUJhaUVLUWJZQklSQU1jQXNnQUNnQ0JDRUVJQUJCQURZQ0JDQUFJQVFnQ3hDdGdJQ0FBQ0lFUlExd0lBQkJ6d0UyQWh3Z0FDQUxOZ0lVSUFBZ0JEWUNERUVBSVJBTWlBRUxJQUJCQURZQ0hDQUFJQVEyQWhRZ0FFR1FzNENBQURZQ0VDQUFRUWcyQWd3Z0FFRUFOZ0lBUVFBaEVBeUhBUXNnQVVFVlJnMC9JQUJCQURZQ0hDQUFJQXcyQWhRZ0FFSE1qb0NBQURZQ0VDQUFRU0EyQWd4QkFDRVFESVlCQ3lBQVFZRUVPd0VvSUFBb0FnUWhFQ0FBUWdBM0F3QWdBQ0FRSUF4QkFXb2lEQkNyZ0lDQUFDSVFSUTA0SUFCQjB3RTJBaHdnQUNBTU5nSVVJQUFnRURZQ0RFRUFJUkFNaFFFTElBQkJBRFlDQUF0QkFDRVFJQUJCQURZQ0hDQUFJQVEyQWhRZ0FFSFltNENBQURZQ0VDQUFRUWcyQWd3TWd3RUxJQUFvQWdRaEVDQUFRZ0EzQXdBZ0FDQVFJQXRCQVdvaUN4Q3JnSUNBQUNJUURRRkJ4Z0VoRUF4cEN5QUFRUUk2QUNnTVZRc2dBRUhWQVRZQ0hDQUFJQXMyQWhRZ0FDQVFOZ0lNUVFBaEVBeUFBUXNnRUVFVlJnMDNJQUJCQURZQ0hDQUFJQVEyQWhRZ0FFR2tqSUNBQURZQ0VDQUFRUkEyQWd4QkFDRVFESDhMSUFBdEFEUkJBVWNOTkNBQUlBUWdBaEM4Z0lDQUFDSVFSUTAwSUJCQkZVY05OU0FBUWR3Qk5nSWNJQUFnQkRZQ0ZDQUFRZFdXZ0lBQU5nSVFJQUJCRlRZQ0RFRUFJUkFNZmd0QkFDRVFJQUJCQURZQ0hDQUFRYStMZ0lBQU5nSVFJQUJCQWpZQ0RDQUFJQlJCQVdvMkFoUU1mUXRCQUNFUURHTUxRUUloRUF4aUMwRU5JUkFNWVF0QkR5RVFER0FMUVNVaEVBeGZDMEVUSVJBTVhndEJGU0VRREYwTFFSWWhFQXhjQzBFWElSQU1Xd3RCR0NFUURGb0xRUmtoRUF4WkMwRWFJUkFNV0F0Qkd5RVFERmNMUVJ3aEVBeFdDMEVkSVJBTVZRdEJIeUVRREZRTFFTRWhFQXhUQzBFaklSQU1VZ3RCeGdBaEVBeFJDMEV1SVJBTVVBdEJMeUVRREU4TFFUc2hFQXhPQzBFOUlSQU1UUXRCeUFBaEVBeE1DMEhKQUNFUURFc0xRY3NBSVJBTVNndEJ6QUFoRUF4SkMwSE9BQ0VRREVnTFFkRUFJUkFNUnd0QjFRQWhFQXhHQzBIWUFDRVFERVVMUWRrQUlSQU1SQXRCMndBaEVBeERDMEhrQUNFUURFSUxRZVVBSVJBTVFRdEI4UUFoRUF4QUMwSDBBQ0VRREQ4TFFZMEJJUkFNUGd0Qmx3RWhFQXc5QzBHcEFTRVFERHdMUWF3QklSQU1Pd3RCd0FFaEVBdzZDMEc1QVNFUUREa0xRYThCSVJBTU9BdEJzUUVoRUF3M0MwR3lBU0VRRERZTFFiUUJJUkFNTlF0QnRRRWhFQXcwQzBHNkFTRVFERE1MUWIwQklSQU1NZ3RCdndFaEVBd3hDMEhCQVNFUUREQUxJQUJCQURZQ0hDQUFJQVEyQWhRZ0FFSHBpNENBQURZQ0VDQUFRUjgyQWd4QkFDRVFERWdMSUFCQjJ3RTJBaHdnQUNBRU5nSVVJQUJCK3BhQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF4SEN5QUFRZmdBTmdJY0lBQWdERFlDRkNBQVFjcVlnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1SZ3NnQUVIUkFEWUNIQ0FBSUFVMkFoUWdBRUd3bDRDQUFEWUNFQ0FBUVJVMkFneEJBQ0VRREVVTElBQkIrUUEyQWh3Z0FDQUJOZ0lVSUFBZ0VEWUNERUVBSVJBTVJBc2dBRUg0QURZQ0hDQUFJQUUyQWhRZ0FFSEttSUNBQURZQ0VDQUFRUlUyQWd4QkFDRVFERU1MSUFCQjVBQTJBaHdnQUNBQk5nSVVJQUJCNDVlQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF4Q0N5QUFRZGNBTmdJY0lBQWdBVFlDRkNBQVFjbVhnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1RUXNnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRYm1OZ0lBQU5nSVFJQUJCR2pZQ0RFRUFJUkFNUUFzZ0FFSENBRFlDSENBQUlBRTJBaFFnQUVIam1JQ0FBRFlDRUNBQVFSVTJBZ3hCQUNFUUREOExJQUJCQURZQ0JDQUFJQThnRHhDeGdJQ0FBQ0lFUlEwQklBQkJPallDSENBQUlBUTJBZ3dnQUNBUFFRRnFOZ0lVUVFBaEVBdytDeUFBS0FJRUlRUWdBRUVBTmdJRUFrQWdBQ0FFSUFFUXNZQ0FnQUFpQkVVTkFDQUFRVHMyQWh3Z0FDQUVOZ0lNSUFBZ0FVRUJhallDRkVFQUlSQU1QZ3NnQVVFQmFpRUJEQzBMSUE5QkFXb2hBUXd0Q3lBQVFRQTJBaHdnQUNBUE5nSVVJQUJCNUpLQWdBQTJBaEFnQUVFRU5nSU1RUUFoRUF3N0N5QUFRVFkyQWh3Z0FDQUVOZ0lVSUFBZ0FqWUNERUVBSVJBTU9nc2dBRUV1TmdJY0lBQWdEallDRkNBQUlBUTJBZ3hCQUNFUUREa0xJQUJCMEFBMkFod2dBQ0FCTmdJVUlBQkJrWmlBZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXc0Q3lBTlFRRnFJUUVNTEFzZ0FFRVZOZ0ljSUFBZ0FUWUNGQ0FBUVlLWmdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTU5nc2dBRUViTmdJY0lBQWdBVFlDRkNBQVFaR1hnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1OUXNnQUVFUE5nSWNJQUFnQVRZQ0ZDQUFRWkdYZ0lBQU5nSVFJQUJCRlRZQ0RFRUFJUkFNTkFzZ0FFRUxOZ0ljSUFBZ0FUWUNGQ0FBUVpHWGdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTU13c2dBRUVhTmdJY0lBQWdBVFlDRkNBQVFZS1pnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1NZ3NnQUVFTE5nSWNJQUFnQVRZQ0ZDQUFRWUtaZ0lBQU5nSVFJQUJCRlRZQ0RFRUFJUkFNTVFzZ0FFRUtOZ0ljSUFBZ0FUWUNGQ0FBUWVTV2dJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTU1Bc2dBRUVlTmdJY0lBQWdBVFlDRkNBQVFmbVhnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1Md3NnQUVFQU5nSWNJQUFnRURZQ0ZDQUFRZHFOZ0lBQU5nSVFJQUJCRkRZQ0RFRUFJUkFNTGdzZ0FFRUVOZ0ljSUFBZ0FUWUNGQ0FBUWJDWWdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTUxRc2dBRUVBTmdJQUlBdEJBV29oQ3d0QnVBRWhFQXdTQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRZlVBSVJBTUVRc2dBU0VCQWtBZ0FDMEFLVUVGUncwQVFlTUFJUkFNRVF0QjRnQWhFQXdRQzBFQUlSQWdBRUVBTmdJY0lBQkI1SkdBZ0FBMkFoQWdBRUVITmdJTUlBQWdGRUVCYWpZQ0ZBd29DeUFBUVFBMkFnQWdGMEVCYWlFQlFjQUFJUkFNRGd0QkFTRUJDeUFBSUFFNkFDd2dBRUVBTmdJQUlCZEJBV29oQVF0QktDRVFEQXNMSUFFaEFRdEJPQ0VRREFrTEFrQWdBU0lQSUFKR0RRQURRQUpBSUE4dEFBQkJnTDZBZ0FCcUxRQUFJZ0ZCQVVZTkFDQUJRUUpIRFFNZ0QwRUJhaUVCREFRTElBOUJBV29pRHlBQ1J3MEFDMEUrSVJBTUlndEJQaUVRRENFTElBQkJBRG9BTENBUElRRU1BUXRCQ3lFUURBWUxRVG9oRUF3RkN5QUJRUUZxSVFGQkxTRVFEQVFMSUFBZ0FUb0FMQ0FBUVFBMkFnQWdGa0VCYWlFQlFRd2hFQXdEQ3lBQVFRQTJBZ0FnRjBFQmFpRUJRUW9oRUF3Q0N5QUFRUUEyQWdBTElBQkJBRG9BTENBTklRRkJDU0VRREFBTEMwRUFJUkFnQUVFQU5nSWNJQUFnQ3pZQ0ZDQUFRYzJRZ0lBQU5nSVFJQUJCQ1RZQ0RBd1hDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0NqWUNGQ0FBUWVtS2dJQUFOZ0lRSUFCQkNUWUNEQXdXQzBFQUlSQWdBRUVBTmdJY0lBQWdDVFlDRkNBQVFiZVFnSUFBTmdJUUlBQkJDVFlDREF3VkMwRUFJUkFnQUVFQU5nSWNJQUFnQ0RZQ0ZDQUFRWnlSZ0lBQU5nSVFJQUJCQ1RZQ0RBd1VDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWMyUWdJQUFOZ0lRSUFCQkNUWUNEQXdUQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFlbUtnSUFBTmdJUUlBQkJDVFlDREF3U0MwRUFJUkFnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRYmVRZ0lBQU5nSVFJQUJCQ1RZQ0RBd1JDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUVp5UmdJQUFOZ0lRSUFCQkNUWUNEQXdRQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFaZVZnSUFBTmdJUUlBQkJEellDREF3UEMwRUFJUkFnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRWmVWZ0lBQU5nSVFJQUJCRHpZQ0RBd09DMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWNDU2dJQUFOZ0lRSUFCQkN6WUNEQXdOQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFaV0pnSUFBTmdJUUlBQkJDellDREF3TUMwRUFJUkFnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRZUdQZ0lBQU5nSVFJQUJCQ2pZQ0RBd0xDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWZ1UGdJQUFOZ0lRSUFCQkNqWUNEQXdLQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFmR1pnSUFBTmdJUUlBQkJBallDREF3SkMwRUFJUkFnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRY1NVZ0lBQU5nSVFJQUJCQWpZQ0RBd0lDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWZLVmdJQUFOZ0lRSUFCQkFqWUNEQXdIQ3lBQVFRSTJBaHdnQUNBQk5nSVVJQUJCbkpxQWdBQTJBaEFnQUVFV05nSU1RUUFoRUF3R0MwRUJJUkFNQlF0QjFBQWhFQ0FCSWdRZ0FrWU5CQ0FEUVFocUlBQWdCQ0FDUWRqQ2dJQUFRUW9ReFlDQWdBQWdBeWdDRENFRUlBTW9BZ2dPQXdFRUFnQUxFTXFBZ0lBQUFBc2dBRUVBTmdJY0lBQkJ0WnFBZ0FBMkFoQWdBRUVYTmdJTUlBQWdCRUVCYWpZQ0ZFRUFJUkFNQWdzZ0FFRUFOZ0ljSUFBZ0JEWUNGQ0FBUWNxYWdJQUFOZ0lRSUFCQkNUWUNERUVBSVJBTUFRc0NRQ0FCSWdRZ0FrY05BRUVpSVJBTUFRc2dBRUdKZ0lDQUFEWUNDQ0FBSUFRMkFnUkJJU0VRQ3lBRFFSQnFKSUNBZ0lBQUlCQUxyd0VCQW44Z0FTZ0NBQ0VHQWtBQ1FDQUNJQU5HRFFBZ0JDQUdhaUVFSUFZZ0Eyb2dBbXNoQnlBQ0lBWkJmM01nQldvaUJtb2hCUU5BQWtBZ0FpMEFBQ0FFTFFBQVJnMEFRUUloQkF3REN3SkFJQVlOQUVFQUlRUWdCU0VDREFNTElBWkJmMm9oQmlBRVFRRnFJUVFnQWtFQmFpSUNJQU5IRFFBTElBY2hCaUFESVFJTElBQkJBVFlDQUNBQklBWTJBZ0FnQUNBQ05nSUVEd3NnQVVFQU5nSUFJQUFnQkRZQ0FDQUFJQUkyQWdRTENnQWdBQkRIZ0lDQUFBdnlOZ0VMZnlPQWdJQ0FBRUVRYXlJQkpJQ0FnSUFBQWtCQkFDZ0NvTkNBZ0FBTkFFRUFFTXVBZ0lBQVFZRFVoSUFBYXlJQ1Fka0FTUTBBUVFBaEF3SkFRUUFvQXVEVGdJQUFJZ1FOQUVFQVFuODNBdXpUZ0lBQVFRQkNnSUNFZ0lDQXdBQTNBdVRUZ0lBQVFRQWdBVUVJYWtGd2NVSFlxdFdxQlhNaUJEWUM0Tk9BZ0FCQkFFRUFOZ0wwMDRDQUFFRUFRUUEyQXNUVGdJQUFDMEVBSUFJMkFzelRnSUFBUVFCQmdOU0VnQUEyQXNqVGdJQUFRUUJCZ05TRWdBQTJBcGpRZ0lBQVFRQWdCRFlDck5DQWdBQkJBRUYvTmdLbzBJQ0FBQU5BSUFOQnhOQ0FnQUJxSUFOQnVOQ0FnQUJxSWdRMkFnQWdCQ0FEUWJEUWdJQUFhaUlGTmdJQUlBTkJ2TkNBZ0FCcUlBVTJBZ0FnQTBITTBJQ0FBR29nQTBIQTBJQ0FBR29pQlRZQ0FDQUZJQVEyQWdBZ0EwSFUwSUNBQUdvZ0EwSEkwSUNBQUdvaUJEWUNBQ0FFSUFVMkFnQWdBMEhRMElDQUFHb2dCRFlDQUNBRFFTQnFJZ05CZ0FKSERRQUxRWURVaElBQVFYaEJnTlNFZ0FCclFROXhRUUJCZ05TRWdBQkJDR3BCRDNFYklnTnFJZ1JCQkdvZ0FrRklhaUlGSUFOcklnTkJBWEkyQWdCQkFFRUFLQUx3MDRDQUFEWUNwTkNBZ0FCQkFDQUROZ0tVMElDQUFFRUFJQVEyQXFEUWdJQUFRWURVaElBQUlBVnFRVGcyQWdRTEFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUFCQjdBRkxEUUFDUUVFQUtBS0kwSUNBQUNJR1FSQWdBRUVUYWtGd2NTQUFRUXRKR3lJQ1FRTjJJZ1IySWdOQkEzRkZEUUFDUUFKQUlBTkJBWEVnQkhKQkFYTWlCVUVEZENJRVFiRFFnSUFBYWlJRElBUkJ1TkNBZ0FCcUtBSUFJZ1FvQWdnaUFrY05BRUVBSUFaQmZpQUZkM0UyQW9qUWdJQUFEQUVMSUFNZ0FqWUNDQ0FDSUFNMkFnd0xJQVJCQ0dvaEF5QUVJQVZCQTNRaUJVRURjallDQkNBRUlBVnFJZ1FnQkNnQ0JFRUJjallDQkF3TUN5QUNRUUFvQXBEUWdJQUFJZ2RORFFFQ1FDQURSUTBBQWtBQ1FDQURJQVIwUVFJZ0JIUWlBMEVBSUFOcmNuRWlBMEVBSUFOcmNVRi9haUlESUFOQkRIWkJFSEVpQTNZaUJFRUZka0VJY1NJRklBTnlJQVFnQlhZaUEwRUNka0VFY1NJRWNpQURJQVIySWdOQkFYWkJBbkVpQkhJZ0F5QUVkaUlEUVFGMlFRRnhJZ1J5SUFNZ0JIWnFJZ1JCQTNRaUEwR3cwSUNBQUdvaUJTQURRYmpRZ0lBQWFpZ0NBQ0lES0FJSUlnQkhEUUJCQUNBR1FYNGdCSGR4SWdZMkFvalFnSUFBREFFTElBVWdBRFlDQ0NBQUlBVTJBZ3dMSUFNZ0FrRURjallDQkNBRElBUkJBM1FpQkdvZ0JDQUNheUlGTmdJQUlBTWdBbW9pQUNBRlFRRnlOZ0lFQWtBZ0IwVU5BQ0FIUVhoeFFiRFFnSUFBYWlFQ1FRQW9BcHpRZ0lBQUlRUUNRQUpBSUFaQkFTQUhRUU4yZENJSWNRMEFRUUFnQmlBSWNqWUNpTkNBZ0FBZ0FpRUlEQUVMSUFJb0FnZ2hDQXNnQ0NBRU5nSU1JQUlnQkRZQ0NDQUVJQUkyQWd3Z0JDQUlOZ0lJQ3lBRFFRaHFJUU5CQUNBQU5nS2MwSUNBQUVFQUlBVTJBcERRZ0lBQURBd0xRUUFvQW96UWdJQUFJZ2xGRFFFZ0NVRUFJQWxyY1VGL2FpSURJQU5CREhaQkVIRWlBM1lpQkVFRmRrRUljU0lGSUFOeUlBUWdCWFlpQTBFQ2RrRUVjU0lFY2lBRElBUjJJZ05CQVhaQkFuRWlCSElnQXlBRWRpSURRUUYyUVFGeElnUnlJQU1nQkhacVFRSjBRYmpTZ0lBQWFpZ0NBQ0lBS0FJRVFYaHhJQUpySVFRZ0FDRUZBa0FEUUFKQUlBVW9BaEFpQXcwQUlBVkJGR29vQWdBaUEwVU5BZ3NnQXlnQ0JFRjRjU0FDYXlJRklBUWdCU0FFU1NJRkd5RUVJQU1nQUNBRkd5RUFJQU1oQlF3QUN3c2dBQ2dDR0NFS0FrQWdBQ2dDRENJSUlBQkdEUUFnQUNnQ0NDSURRUUFvQXBqUWdJQUFTUm9nQ0NBRE5nSUlJQU1nQ0RZQ0RBd0xDd0pBSUFCQkZHb2lCU2dDQUNJRERRQWdBQ2dDRUNJRFJRMERJQUJCRUdvaEJRc0RRQ0FGSVFzZ0F5SUlRUlJxSWdVb0FnQWlBdzBBSUFoQkVHb2hCU0FJS0FJUUlnTU5BQXNnQzBFQU5nSUFEQW9MUVg4aEFpQUFRYjkvU3cwQUlBQkJFMm9pQTBGd2NTRUNRUUFvQW96UWdJQUFJZ2RGRFFCQkFDRUxBa0FnQWtHQUFra05BRUVmSVFzZ0FrSC8vLzhIU3cwQUlBTkJDSFlpQXlBRFFZRCtQMnBCRUhaQkNIRWlBM1FpQkNBRVFZRGdIMnBCRUhaQkJIRWlCSFFpQlNBRlFZQ0FEMnBCRUhaQkFuRWlCWFJCRDNZZ0F5QUVjaUFGY21zaUEwRUJkQ0FDSUFOQkZXcDJRUUZ4Y2tFY2FpRUxDMEVBSUFKcklRUUNRQUpBQWtBQ1FDQUxRUUowUWJqU2dJQUFhaWdDQUNJRkRRQkJBQ0VEUVFBaENBd0JDMEVBSVFNZ0FrRUFRUmtnQzBFQmRtc2dDMEVmUmh0MElRQkJBQ0VJQTBBQ1FDQUZLQUlFUVhoeElBSnJJZ1lnQkU4TkFDQUdJUVFnQlNFSUlBWU5BRUVBSVFRZ0JTRUlJQVVoQXd3REN5QURJQVZCRkdvb0FnQWlCaUFHSUFVZ0FFRWRka0VFY1dwQkVHb29BZ0FpQlVZYklBTWdCaHNoQXlBQVFRRjBJUUFnQlEwQUN3c0NRQ0FESUFoeURRQkJBQ0VJUVFJZ0MzUWlBMEVBSUFOcmNpQUhjU0lEUlEwRElBTkJBQ0FEYTNGQmYyb2lBeUFEUVF4MlFSQnhJZ04ySWdWQkJYWkJDSEVpQUNBRGNpQUZJQUIySWdOQkFuWkJCSEVpQlhJZ0F5QUZkaUlEUVFGMlFRSnhJZ1Z5SUFNZ0JYWWlBMEVCZGtFQmNTSUZjaUFESUFWMmFrRUNkRUc0MG9DQUFHb29BZ0FoQXdzZ0EwVU5BUXNEUUNBREtBSUVRWGh4SUFKcklnWWdCRWtoQUFKQUlBTW9BaEFpQlEwQUlBTkJGR29vQWdBaEJRc2dCaUFFSUFBYklRUWdBeUFJSUFBYklRZ2dCU0VESUFVTkFBc0xJQWhGRFFBZ0JFRUFLQUtRMElDQUFDQUNhMDhOQUNBSUtBSVlJUXNDUUNBSUtBSU1JZ0FnQ0VZTkFDQUlLQUlJSWdOQkFDZ0NtTkNBZ0FCSkdpQUFJQU0yQWdnZ0F5QUFOZ0lNREFrTEFrQWdDRUVVYWlJRktBSUFJZ01OQUNBSUtBSVFJZ05GRFFNZ0NFRVFhaUVGQ3dOQUlBVWhCaUFESWdCQkZHb2lCU2dDQUNJRERRQWdBRUVRYWlFRklBQW9BaEFpQXcwQUN5QUdRUUEyQWdBTUNBc0NRRUVBS0FLUTBJQ0FBQ0lESUFKSkRRQkJBQ2dDbk5DQWdBQWhCQUpBQWtBZ0F5QUNheUlGUVJCSkRRQWdCQ0FDYWlJQUlBVkJBWEkyQWdSQkFDQUZOZ0tRMElDQUFFRUFJQUEyQXB6UWdJQUFJQVFnQTJvZ0JUWUNBQ0FFSUFKQkEzSTJBZ1FNQVFzZ0JDQURRUU55TmdJRUlBUWdBMm9pQXlBREtBSUVRUUZ5TmdJRVFRQkJBRFlDbk5DQWdBQkJBRUVBTmdLUTBJQ0FBQXNnQkVFSWFpRUREQW9MQWtCQkFDZ0NsTkNBZ0FBaUFDQUNUUTBBUVFBb0FxRFFnSUFBSWdNZ0Ftb2lCQ0FBSUFKcklnVkJBWEkyQWdSQkFDQUZOZ0tVMElDQUFFRUFJQVEyQXFEUWdJQUFJQU1nQWtFRGNqWUNCQ0FEUVFocUlRTU1DZ3NDUUFKQVFRQW9BdURUZ0lBQVJRMEFRUUFvQXVqVGdJQUFJUVFNQVF0QkFFSi9Od0xzMDRDQUFFRUFRb0NBaElDQWdNQUFOd0xrMDRDQUFFRUFJQUZCREdwQmNIRkIyS3JWcWdWek5nTGcwNENBQUVFQVFRQTJBdlRUZ0lBQVFRQkJBRFlDeE5PQWdBQkJnSUFFSVFRTFFRQWhBd0pBSUFRZ0FrSEhBR29pQjJvaUJrRUFJQVJySWd0eElnZ2dBa3NOQUVFQVFUQTJBdmpUZ0lBQURBb0xBa0JCQUNnQ3dOT0FnQUFpQTBVTkFBSkFRUUFvQXJqVGdJQUFJZ1FnQ0dvaUJTQUVUUTBBSUFVZ0EwME5BUXRCQUNFRFFRQkJNRFlDK05PQWdBQU1DZ3RCQUMwQXhOT0FnQUJCQkhFTkJBSkFBa0FDUUVFQUtBS2cwSUNBQUNJRVJRMEFRY2pUZ0lBQUlRTURRQUpBSUFNb0FnQWlCU0FFU3cwQUlBVWdBeWdDQkdvZ0JFc05Bd3NnQXlnQ0NDSUREUUFMQzBFQUVNdUFnSUFBSWdCQmYwWU5CU0FJSVFZQ1FFRUFLQUxrMDRDQUFDSURRWDlxSWdRZ0FIRkZEUUFnQ0NBQWF5QUVJQUJxUVFBZ0EydHhhaUVHQ3lBR0lBSk5EUVVnQmtIKy8vLy9CMHNOQlFKQVFRQW9Bc0RUZ0lBQUlnTkZEUUJCQUNnQ3VOT0FnQUFpQkNBR2FpSUZJQVJORFFZZ0JTQURTdzBHQ3lBR0VNdUFnSUFBSWdNZ0FFY05BUXdIQ3lBR0lBQnJJQXR4SWdaQi92Ly8vd2RMRFFRZ0JoRExnSUNBQUNJQUlBTW9BZ0FnQXlnQ0JHcEdEUU1nQUNFREN3SkFJQU5CZjBZTkFDQUNRY2dBYWlBR1RRMEFBa0FnQnlBR2EwRUFLQUxvMDRDQUFDSUVha0VBSUFScmNTSUVRZjcvLy84SFRRMEFJQU1oQUF3SEN3SkFJQVFReTRDQWdBQkJmMFlOQUNBRUlBWnFJUVlnQXlFQURBY0xRUUFnQm1zUXk0Q0FnQUFhREFRTElBTWhBQ0FEUVg5SERRVU1Bd3RCQUNFSURBY0xRUUFoQUF3RkN5QUFRWDlIRFFJTFFRQkJBQ2dDeE5PQWdBQkJCSEkyQXNUVGdJQUFDeUFJUWY3Ly8vOEhTdzBCSUFnUXk0Q0FnQUFoQUVFQUVNdUFnSUFBSVFNZ0FFRi9SZzBCSUFOQmYwWU5BU0FBSUFOUERRRWdBeUFBYXlJR0lBSkJPR3BORFFFTFFRQkJBQ2dDdU5PQWdBQWdCbW9pQXpZQ3VOT0FnQUFDUUNBRFFRQW9BcnpUZ0lBQVRRMEFRUUFnQXpZQ3ZOT0FnQUFMQWtBQ1FBSkFBa0JCQUNnQ29OQ0FnQUFpQkVVTkFFSEkwNENBQUNFREEwQWdBQ0FES0FJQUlnVWdBeWdDQkNJSWFrWU5BaUFES0FJSUlnTU5BQXdEQ3dzQ1FBSkFRUUFvQXBqUWdJQUFJZ05GRFFBZ0FDQURUdzBCQzBFQUlBQTJBcGpRZ0lBQUMwRUFJUU5CQUNBR05nTE0wNENBQUVFQUlBQTJBc2pUZ0lBQVFRQkJmellDcU5DQWdBQkJBRUVBS0FMZzA0Q0FBRFlDck5DQWdBQkJBRUVBTmdMVTA0Q0FBQU5BSUFOQnhOQ0FnQUJxSUFOQnVOQ0FnQUJxSWdRMkFnQWdCQ0FEUWJEUWdJQUFhaUlGTmdJQUlBTkJ2TkNBZ0FCcUlBVTJBZ0FnQTBITTBJQ0FBR29nQTBIQTBJQ0FBR29pQlRZQ0FDQUZJQVEyQWdBZ0EwSFUwSUNBQUdvZ0EwSEkwSUNBQUdvaUJEWUNBQ0FFSUFVMkFnQWdBMEhRMElDQUFHb2dCRFlDQUNBRFFTQnFJZ05CZ0FKSERRQUxJQUJCZUNBQWEwRVBjVUVBSUFCQkNHcEJEM0ViSWdOcUlnUWdCa0ZJYWlJRklBTnJJZ05CQVhJMkFnUkJBRUVBS0FMdzA0Q0FBRFlDcE5DQWdBQkJBQ0FETmdLVTBJQ0FBRUVBSUFRMkFxRFFnSUFBSUFBZ0JXcEJPRFlDQkF3Q0N5QURMUUFNUVFoeERRQWdCQ0FGU1EwQUlBUWdBRThOQUNBRVFYZ2dCR3RCRDNGQkFDQUVRUWhxUVE5eEd5SUZhaUlBUVFBb0FwVFFnSUFBSUFacUlnc2dCV3NpQlVFQmNqWUNCQ0FESUFnZ0JtbzJBZ1JCQUVFQUtBTHcwNENBQURZQ3BOQ0FnQUJCQUNBRk5nS1UwSUNBQUVFQUlBQTJBcURRZ0lBQUlBUWdDMnBCT0RZQ0JBd0JDd0pBSUFCQkFDZ0NtTkNBZ0FBaUNFOE5BRUVBSUFBMkFwalFnSUFBSUFBaENBc2dBQ0FHYWlFRlFjalRnSUFBSVFNQ1FBSkFBa0FDUUFKQUFrQUNRQU5BSUFNb0FnQWdCVVlOQVNBREtBSUlJZ01OQUF3Q0N3c2dBeTBBREVFSWNVVU5BUXRCeU5PQWdBQWhBd05BQWtBZ0F5Z0NBQ0lGSUFSTERRQWdCU0FES0FJRWFpSUZJQVJMRFFNTElBTW9BZ2doQXd3QUN3c2dBeUFBTmdJQUlBTWdBeWdDQkNBR2FqWUNCQ0FBUVhnZ0FHdEJEM0ZCQUNBQVFRaHFRUTl4RzJvaUN5QUNRUU55TmdJRUlBVkJlQ0FGYTBFUGNVRUFJQVZCQ0dwQkQzRWJhaUlHSUFzZ0Ftb2lBbXNoQXdKQUlBWWdCRWNOQUVFQUlBSTJBcURRZ0lBQVFRQkJBQ2dDbE5DQWdBQWdBMm9pQXpZQ2xOQ0FnQUFnQWlBRFFRRnlOZ0lFREFNTEFrQWdCa0VBS0FLYzBJQ0FBRWNOQUVFQUlBSTJBcHpRZ0lBQVFRQkJBQ2dDa05DQWdBQWdBMm9pQXpZQ2tOQ0FnQUFnQWlBRFFRRnlOZ0lFSUFJZ0Eyb2dBellDQUF3REN3SkFJQVlvQWdRaUJFRURjVUVCUncwQUlBUkJlSEVoQndKQUFrQWdCRUgvQVVzTkFDQUdLQUlJSWdVZ0JFRURkaUlJUVFOMFFiRFFnSUFBYWlJQVJob0NRQ0FHS0FJTUlnUWdCVWNOQUVFQVFRQW9Bb2pRZ0lBQVFYNGdDSGR4TmdLSTBJQ0FBQXdDQ3lBRUlBQkdHaUFFSUFVMkFnZ2dCU0FFTmdJTURBRUxJQVlvQWhnaENRSkFBa0FnQmlnQ0RDSUFJQVpHRFFBZ0JpZ0NDQ0lFSUFoSkdpQUFJQVEyQWdnZ0JDQUFOZ0lNREFFTEFrQWdCa0VVYWlJRUtBSUFJZ1VOQUNBR1FSQnFJZ1FvQWdBaUJRMEFRUUFoQUF3QkN3TkFJQVFoQ0NBRklnQkJGR29pQkNnQ0FDSUZEUUFnQUVFUWFpRUVJQUFvQWhBaUJRMEFDeUFJUVFBMkFnQUxJQWxGRFFBQ1FBSkFJQVlnQmlnQ0hDSUZRUUowUWJqU2dJQUFhaUlFS0FJQVJ3MEFJQVFnQURZQ0FDQUFEUUZCQUVFQUtBS00wSUNBQUVGK0lBVjNjVFlDak5DQWdBQU1BZ3NnQ1VFUVFSUWdDU2dDRUNBR1JodHFJQUEyQWdBZ0FFVU5BUXNnQUNBSk5nSVlBa0FnQmlnQ0VDSUVSUTBBSUFBZ0JEWUNFQ0FFSUFBMkFoZ0xJQVlvQWhRaUJFVU5BQ0FBUVJScUlBUTJBZ0FnQkNBQU5nSVlDeUFISUFOcUlRTWdCaUFIYWlJR0tBSUVJUVFMSUFZZ0JFRitjVFlDQkNBQ0lBTnFJQU0yQWdBZ0FpQURRUUZ5TmdJRUFrQWdBMEgvQVVzTkFDQURRWGh4UWJEUWdJQUFhaUVFQWtBQ1FFRUFLQUtJMElDQUFDSUZRUUVnQTBFRGRuUWlBM0VOQUVFQUlBVWdBM0kyQW9qUWdJQUFJQVFoQXd3QkN5QUVLQUlJSVFNTElBTWdBallDRENBRUlBSTJBZ2dnQWlBRU5nSU1JQUlnQXpZQ0NBd0RDMEVmSVFRQ1FDQURRZi8vL3dkTERRQWdBMEVJZGlJRUlBUkJnUDQvYWtFUWRrRUljU0lFZENJRklBVkJnT0FmYWtFUWRrRUVjU0lGZENJQUlBQkJnSUFQYWtFUWRrRUNjU0lBZEVFUGRpQUVJQVZ5SUFCeWF5SUVRUUYwSUFNZ0JFRVZhblpCQVhGeVFSeHFJUVFMSUFJZ0JEWUNIQ0FDUWdBM0FoQWdCRUVDZEVHNDBvQ0FBR29oQlFKQVFRQW9Bb3pRZ0lBQUlnQkJBU0FFZENJSWNRMEFJQVVnQWpZQ0FFRUFJQUFnQ0hJMkFvelFnSUFBSUFJZ0JUWUNHQ0FDSUFJMkFnZ2dBaUFDTmdJTURBTUxJQU5CQUVFWklBUkJBWFpySUFSQkgwWWJkQ0VFSUFVb0FnQWhBQU5BSUFBaUJTZ0NCRUY0Y1NBRFJnMENJQVJCSFhZaEFDQUVRUUYwSVFRZ0JTQUFRUVJ4YWtFUWFpSUlLQUlBSWdBTkFBc2dDQ0FDTmdJQUlBSWdCVFlDR0NBQ0lBSTJBZ3dnQWlBQ05nSUlEQUlMSUFCQmVDQUFhMEVQY1VFQUlBQkJDR3BCRDNFYklnTnFJZ3NnQmtGSWFpSUlJQU5ySWdOQkFYSTJBZ1FnQUNBSWFrRTROZ0lFSUFRZ0JVRTNJQVZyUVE5eFFRQWdCVUZKYWtFUGNSdHFRVUZxSWdnZ0NDQUVRUkJxU1JzaUNFRWpOZ0lFUVFCQkFDZ0M4Tk9BZ0FBMkFxVFFnSUFBUVFBZ0F6WUNsTkNBZ0FCQkFDQUxOZ0tnMElDQUFDQUlRUkJxUVFBcEF0RFRnSUFBTndJQUlBaEJBQ2tDeU5PQWdBQTNBZ2hCQUNBSVFRaHFOZ0xRMDRDQUFFRUFJQVkyQXN6VGdJQUFRUUFnQURZQ3lOT0FnQUJCQUVFQU5nTFUwNENBQUNBSVFTUnFJUU1EUUNBRFFRYzJBZ0FnQTBFRWFpSURJQVZKRFFBTElBZ2dCRVlOQXlBSUlBZ29BZ1JCZm5FMkFnUWdDQ0FJSUFScklnQTJBZ0FnQkNBQVFRRnlOZ0lFQWtBZ0FFSC9BVXNOQUNBQVFYaHhRYkRRZ0lBQWFpRURBa0FDUUVFQUtBS0kwSUNBQUNJRlFRRWdBRUVEZG5RaUFIRU5BRUVBSUFVZ0FISTJBb2pRZ0lBQUlBTWhCUXdCQ3lBREtBSUlJUVVMSUFVZ0JEWUNEQ0FESUFRMkFnZ2dCQ0FETmdJTUlBUWdCVFlDQ0F3RUMwRWZJUU1DUUNBQVFmLy8vd2RMRFFBZ0FFRUlkaUlESUFOQmdQNC9ha0VRZGtFSWNTSURkQ0lGSUFWQmdPQWZha0VRZGtFRWNTSUZkQ0lJSUFoQmdJQVBha0VRZGtFQ2NTSUlkRUVQZGlBRElBVnlJQWh5YXlJRFFRRjBJQUFnQTBFVmFuWkJBWEZ5UVJ4cUlRTUxJQVFnQXpZQ0hDQUVRZ0EzQWhBZ0EwRUNkRUc0MG9DQUFHb2hCUUpBUVFBb0FvelFnSUFBSWdoQkFTQURkQ0lHY1EwQUlBVWdCRFlDQUVFQUlBZ2dCbkkyQW96UWdJQUFJQVFnQlRZQ0dDQUVJQVEyQWdnZ0JDQUVOZ0lNREFRTElBQkJBRUVaSUFOQkFYWnJJQU5CSDBZYmRDRURJQVVvQWdBaENBTkFJQWdpQlNnQ0JFRjRjU0FBUmcwRElBTkJIWFloQ0NBRFFRRjBJUU1nQlNBSVFRUnhha0VRYWlJR0tBSUFJZ2dOQUFzZ0JpQUVOZ0lBSUFRZ0JUWUNHQ0FFSUFRMkFnd2dCQ0FFTmdJSURBTUxJQVVvQWdnaUF5QUNOZ0lNSUFVZ0FqWUNDQ0FDUVFBMkFoZ2dBaUFGTmdJTUlBSWdBellDQ0FzZ0MwRUlhaUVEREFVTElBVW9BZ2dpQXlBRU5nSU1JQVVnQkRZQ0NDQUVRUUEyQWhnZ0JDQUZOZ0lNSUFRZ0F6WUNDQXRCQUNnQ2xOQ0FnQUFpQXlBQ1RRMEFRUUFvQXFEUWdJQUFJZ1FnQW1vaUJTQURJQUpySWdOQkFYSTJBZ1JCQUNBRE5nS1UwSUNBQUVFQUlBVTJBcURRZ0lBQUlBUWdBa0VEY2pZQ0JDQUVRUWhxSVFNTUF3dEJBQ0VEUVFCQk1EWUMrTk9BZ0FBTUFnc0NRQ0FMUlEwQUFrQUNRQ0FJSUFnb0Fod2lCVUVDZEVHNDBvQ0FBR29pQXlnQ0FFY05BQ0FESUFBMkFnQWdBQTBCUVFBZ0IwRitJQVYzY1NJSE5nS00wSUNBQUF3Q0N5QUxRUkJCRkNBTEtBSVFJQWhHRzJvZ0FEWUNBQ0FBUlEwQkN5QUFJQXMyQWhnQ1FDQUlLQUlRSWdORkRRQWdBQ0FETmdJUUlBTWdBRFlDR0FzZ0NFRVVhaWdDQUNJRFJRMEFJQUJCRkdvZ0F6WUNBQ0FESUFBMkFoZ0xBa0FDUUNBRVFROUxEUUFnQ0NBRUlBSnFJZ05CQTNJMkFnUWdDQ0FEYWlJRElBTW9BZ1JCQVhJMkFnUU1BUXNnQ0NBQ2FpSUFJQVJCQVhJMkFnUWdDQ0FDUVFOeU5nSUVJQUFnQkdvZ0JEWUNBQUpBSUFSQi93RkxEUUFnQkVGNGNVR3cwSUNBQUdvaEF3SkFBa0JCQUNnQ2lOQ0FnQUFpQlVFQklBUkJBM1owSWdSeERRQkJBQ0FGSUFSeU5nS0kwSUNBQUNBRElRUU1BUXNnQXlnQ0NDRUVDeUFFSUFBMkFnd2dBeUFBTmdJSUlBQWdBellDRENBQUlBUTJBZ2dNQVF0Qkh5RURBa0FnQkVILy8vOEhTdzBBSUFSQkNIWWlBeUFEUVlEK1AycEJFSFpCQ0hFaUEzUWlCU0FGUVlEZ0gycEJFSFpCQkhFaUJYUWlBaUFDUVlDQUQycEJFSFpCQW5FaUFuUkJEM1lnQXlBRmNpQUNjbXNpQTBFQmRDQUVJQU5CRldwMlFRRnhja0VjYWlFREN5QUFJQU0yQWh3Z0FFSUFOd0lRSUFOQkFuUkJ1TktBZ0FCcUlRVUNRQ0FIUVFFZ0EzUWlBbkVOQUNBRklBQTJBZ0JCQUNBSElBSnlOZ0tNMElDQUFDQUFJQVUyQWhnZ0FDQUFOZ0lJSUFBZ0FEWUNEQXdCQ3lBRVFRQkJHU0FEUVFGMmF5QURRUjlHRzNRaEF5QUZLQUlBSVFJQ1FBTkFJQUlpQlNnQ0JFRjRjU0FFUmcwQklBTkJIWFloQWlBRFFRRjBJUU1nQlNBQ1FRUnhha0VRYWlJR0tBSUFJZ0lOQUFzZ0JpQUFOZ0lBSUFBZ0JUWUNHQ0FBSUFBMkFnd2dBQ0FBTmdJSURBRUxJQVVvQWdnaUF5QUFOZ0lNSUFVZ0FEWUNDQ0FBUVFBMkFoZ2dBQ0FGTmdJTUlBQWdBellDQ0FzZ0NFRUlhaUVEREFFTEFrQWdDa1VOQUFKQUFrQWdBQ0FBS0FJY0lnVkJBblJCdU5LQWdBQnFJZ01vQWdCSERRQWdBeUFJTmdJQUlBZ05BVUVBSUFsQmZpQUZkM0UyQW96UWdJQUFEQUlMSUFwQkVFRVVJQW9vQWhBZ0FFWWJhaUFJTmdJQUlBaEZEUUVMSUFnZ0NqWUNHQUpBSUFBb0FoQWlBMFVOQUNBSUlBTTJBaEFnQXlBSU5nSVlDeUFBUVJScUtBSUFJZ05GRFFBZ0NFRVVhaUFETmdJQUlBTWdDRFlDR0FzQ1FBSkFJQVJCRDBzTkFDQUFJQVFnQW1vaUEwRURjallDQkNBQUlBTnFJZ01nQXlnQ0JFRUJjallDQkF3QkN5QUFJQUpxSWdVZ0JFRUJjallDQkNBQUlBSkJBM0kyQWdRZ0JTQUVhaUFFTmdJQUFrQWdCMFVOQUNBSFFYaHhRYkRRZ0lBQWFpRUNRUUFvQXB6UWdJQUFJUU1DUUFKQVFRRWdCMEVEZG5RaUNDQUdjUTBBUVFBZ0NDQUdjallDaU5DQWdBQWdBaUVJREFFTElBSW9BZ2doQ0FzZ0NDQUROZ0lNSUFJZ0F6WUNDQ0FESUFJMkFnd2dBeUFJTmdJSUMwRUFJQVUyQXB6UWdJQUFRUUFnQkRZQ2tOQ0FnQUFMSUFCQkNHb2hBd3NnQVVFUWFpU0FnSUNBQUNBREN3b0FJQUFReVlDQWdBQUw0ZzBCQjM4Q1FDQUFSUTBBSUFCQmVHb2lBU0FBUVh4cUtBSUFJZ0pCZUhFaUFHb2hBd0pBSUFKQkFYRU5BQ0FDUVFOeFJRMEJJQUVnQVNnQ0FDSUNheUlCUVFBb0FwalFnSUFBSWdSSkRRRWdBaUFBYWlFQUFrQWdBVUVBS0FLYzBJQ0FBRVlOQUFKQUlBSkIvd0ZMRFFBZ0FTZ0NDQ0lFSUFKQkEzWWlCVUVEZEVHdzBJQ0FBR29pQmtZYUFrQWdBU2dDRENJQ0lBUkhEUUJCQUVFQUtBS0kwSUNBQUVGK0lBVjNjVFlDaU5DQWdBQU1Bd3NnQWlBR1Job2dBaUFFTmdJSUlBUWdBallDREF3Q0N5QUJLQUlZSVFjQ1FBSkFJQUVvQWd3aUJpQUJSZzBBSUFFb0FnZ2lBaUFFU1JvZ0JpQUNOZ0lJSUFJZ0JqWUNEQXdCQ3dKQUlBRkJGR29pQWlnQ0FDSUVEUUFnQVVFUWFpSUNLQUlBSWdRTkFFRUFJUVlNQVFzRFFDQUNJUVVnQkNJR1FSUnFJZ0lvQWdBaUJBMEFJQVpCRUdvaEFpQUdLQUlRSWdRTkFBc2dCVUVBTmdJQUN5QUhSUTBCQWtBQ1FDQUJJQUVvQWh3aUJFRUNkRUc0MG9DQUFHb2lBaWdDQUVjTkFDQUNJQVkyQWdBZ0JnMEJRUUJCQUNnQ2pOQ0FnQUJCZmlBRWQzRTJBb3pRZ0lBQURBTUxJQWRCRUVFVUlBY29BaEFnQVVZYmFpQUdOZ0lBSUFaRkRRSUxJQVlnQnpZQ0dBSkFJQUVvQWhBaUFrVU5BQ0FHSUFJMkFoQWdBaUFHTmdJWUN5QUJLQUlVSWdKRkRRRWdCa0VVYWlBQ05nSUFJQUlnQmpZQ0dBd0JDeUFES0FJRUlnSkJBM0ZCQTBjTkFDQURJQUpCZm5FMkFnUkJBQ0FBTmdLUTBJQ0FBQ0FCSUFCcUlBQTJBZ0FnQVNBQVFRRnlOZ0lFRHdzZ0FTQURUdzBBSUFNb0FnUWlBa0VCY1VVTkFBSkFBa0FnQWtFQ2NRMEFBa0FnQTBFQUtBS2cwSUNBQUVjTkFFRUFJQUUyQXFEUWdJQUFRUUJCQUNnQ2xOQ0FnQUFnQUdvaUFEWUNsTkNBZ0FBZ0FTQUFRUUZ5TmdJRUlBRkJBQ2dDbk5DQWdBQkhEUU5CQUVFQU5nS1EwSUNBQUVFQVFRQTJBcHpRZ0lBQUR3c0NRQ0FEUVFBb0FwelFnSUFBUncwQVFRQWdBVFlDbk5DQWdBQkJBRUVBS0FLUTBJQ0FBQ0FBYWlJQU5nS1EwSUNBQUNBQklBQkJBWEkyQWdRZ0FTQUFhaUFBTmdJQUR3c2dBa0Y0Y1NBQWFpRUFBa0FDUUNBQ1FmOEJTdzBBSUFNb0FnZ2lCQ0FDUVFOMklnVkJBM1JCc05DQWdBQnFJZ1pHR2dKQUlBTW9BZ3dpQWlBRVJ3MEFRUUJCQUNnQ2lOQ0FnQUJCZmlBRmQzRTJBb2pRZ0lBQURBSUxJQUlnQmtZYUlBSWdCRFlDQ0NBRUlBSTJBZ3dNQVFzZ0F5Z0NHQ0VIQWtBQ1FDQURLQUlNSWdZZ0EwWU5BQ0FES0FJSUlnSkJBQ2dDbU5DQWdBQkpHaUFHSUFJMkFnZ2dBaUFHTmdJTURBRUxBa0FnQTBFVWFpSUNLQUlBSWdRTkFDQURRUkJxSWdJb0FnQWlCQTBBUVFBaEJnd0JDd05BSUFJaEJTQUVJZ1pCRkdvaUFpZ0NBQ0lFRFFBZ0JrRVFhaUVDSUFZb0FoQWlCQTBBQ3lBRlFRQTJBZ0FMSUFkRkRRQUNRQUpBSUFNZ0F5Z0NIQ0lFUVFKMFFialNnSUFBYWlJQ0tBSUFSdzBBSUFJZ0JqWUNBQ0FHRFFGQkFFRUFLQUtNMElDQUFFRitJQVIzY1RZQ2pOQ0FnQUFNQWdzZ0IwRVFRUlFnQnlnQ0VDQURSaHRxSUFZMkFnQWdCa1VOQVFzZ0JpQUhOZ0lZQWtBZ0F5Z0NFQ0lDUlEwQUlBWWdBallDRUNBQ0lBWTJBaGdMSUFNb0FoUWlBa1VOQUNBR1FSUnFJQUkyQWdBZ0FpQUdOZ0lZQ3lBQklBQnFJQUEyQWdBZ0FTQUFRUUZ5TmdJRUlBRkJBQ2dDbk5DQWdBQkhEUUZCQUNBQU5nS1EwSUNBQUE4TElBTWdBa0YrY1RZQ0JDQUJJQUJxSUFBMkFnQWdBU0FBUVFGeU5nSUVDd0pBSUFCQi93RkxEUUFnQUVGNGNVR3cwSUNBQUdvaEFnSkFBa0JCQUNnQ2lOQ0FnQUFpQkVFQklBQkJBM1owSWdCeERRQkJBQ0FFSUFCeU5nS0kwSUNBQUNBQ0lRQU1BUXNnQWlnQ0NDRUFDeUFBSUFFMkFnd2dBaUFCTmdJSUlBRWdBallDRENBQklBQTJBZ2dQQzBFZklRSUNRQ0FBUWYvLy93ZExEUUFnQUVFSWRpSUNJQUpCZ1A0L2FrRVFka0VJY1NJQ2RDSUVJQVJCZ09BZmFrRVFka0VFY1NJRWRDSUdJQVpCZ0lBUGFrRVFka0VDY1NJR2RFRVBkaUFDSUFSeUlBWnlheUlDUVFGMElBQWdBa0VWYW5aQkFYRnlRUnhxSVFJTElBRWdBallDSENBQlFnQTNBaEFnQWtFQ2RFRzQwb0NBQUdvaEJBSkFBa0JCQUNnQ2pOQ0FnQUFpQmtFQklBSjBJZ054RFFBZ0JDQUJOZ0lBUVFBZ0JpQURjallDak5DQWdBQWdBU0FFTmdJWUlBRWdBVFlDQ0NBQklBRTJBZ3dNQVFzZ0FFRUFRUmtnQWtFQmRtc2dBa0VmUmh0MElRSWdCQ2dDQUNFR0FrQURRQ0FHSWdRb0FnUkJlSEVnQUVZTkFTQUNRUjEySVFZZ0FrRUJkQ0VDSUFRZ0JrRUVjV3BCRUdvaUF5Z0NBQ0lHRFFBTElBTWdBVFlDQUNBQklBUTJBaGdnQVNBQk5nSU1JQUVnQVRZQ0NBd0JDeUFFS0FJSUlnQWdBVFlDRENBRUlBRTJBZ2dnQVVFQU5nSVlJQUVnQkRZQ0RDQUJJQUEyQWdnTFFRQkJBQ2dDcU5DQWdBQkJmMm9pQVVGL0lBRWJOZ0tvMElDQUFBc0xCQUFBQUF0T0FBSkFJQUFOQUQ4QVFSQjBEd3NDUUNBQVFmLy9BM0VOQUNBQVFYOU1EUUFDUUNBQVFSQjJRQUFpQUVGL1J3MEFRUUJCTURZQytOT0FnQUJCZnc4TElBQkJFSFFQQ3hES2dJQ0FBQUFMOGdJQ0EzOEJmZ0pBSUFKRkRRQWdBQ0FCT2dBQUlBSWdBR29pQTBGL2FpQUJPZ0FBSUFKQkEwa05BQ0FBSUFFNkFBSWdBQ0FCT2dBQklBTkJmV29nQVRvQUFDQURRWDVxSUFFNkFBQWdBa0VIU1EwQUlBQWdBVG9BQXlBRFFYeHFJQUU2QUFBZ0FrRUpTUTBBSUFCQkFDQUFhMEVEY1NJRWFpSURJQUZCL3dGeFFZR0NoQWhzSWdFMkFnQWdBeUFDSUFSclFYeHhJZ1JxSWdKQmZHb2dBVFlDQUNBRVFRbEpEUUFnQXlBQk5nSUlJQU1nQVRZQ0JDQUNRWGhxSUFFMkFnQWdBa0YwYWlBQk5nSUFJQVJCR1VrTkFDQURJQUUyQWhnZ0F5QUJOZ0lVSUFNZ0FUWUNFQ0FESUFFMkFnd2dBa0Z3YWlBQk5nSUFJQUpCYkdvZ0FUWUNBQ0FDUVdocUlBRTJBZ0FnQWtGa2FpQUJOZ0lBSUFRZ0EwRUVjVUVZY2lJRmF5SUNRU0JKRFFBZ0FhMUNnWUNBZ0JCK0lRWWdBeUFGYWlFQkEwQWdBU0FHTndNWUlBRWdCamNERUNBQklBWTNBd2dnQVNBR053TUFJQUZCSUdvaEFTQUNRV0JxSWdKQkgwc05BQXNMSUFBTEM0NUlBUUJCZ0FnTGhrZ0JBQUFBQWdBQUFBTUFBQUFBQUFBQUFBQUFBQVFBQUFBRkFBQUFBQUFBQUFBQUFBQUdBQUFBQndBQUFBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRWx1ZG1Gc2FXUWdZMmhoY2lCcGJpQjFjbXdnY1hWbGNua0FVM0JoYmlCallXeHNZbUZqYXlCbGNuSnZjaUJwYmlCdmJsOWliMlI1QUVOdmJuUmxiblF0VEdWdVozUm9JRzkyWlhKbWJHOTNBRU5vZFc1cklITnBlbVVnYjNabGNtWnNiM2NBVW1WemNHOXVjMlVnYjNabGNtWnNiM2NBU1c1MllXeHBaQ0J0WlhSb2IyUWdabTl5SUVoVVZGQXZlQzU0SUhKbGNYVmxjM1FBU1c1MllXeHBaQ0J0WlhSb2IyUWdabTl5SUZKVVUxQXZlQzU0SUhKbGNYVmxjM1FBUlhod1pXTjBaV1FnVTA5VlVrTkZJRzFsZEdodlpDQm1iM0lnU1VORkwzZ3VlQ0J5WlhGMVpYTjBBRWx1ZG1Gc2FXUWdZMmhoY2lCcGJpQjFjbXdnWm5KaFoyMWxiblFnYzNSaGNuUUFSWGh3WldOMFpXUWdaRzkwQUZOd1lXNGdZMkZzYkdKaFkyc2daWEp5YjNJZ2FXNGdiMjVmYzNSaGRIVnpBRWx1ZG1Gc2FXUWdjbVZ6Y0c5dWMyVWdjM1JoZEhWekFFbHVkbUZzYVdRZ1kyaGhjbUZqZEdWeUlHbHVJR05vZFc1cklHVjRkR1Z1YzJsdmJuTUFWWE5sY2lCallXeHNZbUZqYXlCbGNuSnZjZ0JnYjI1ZmNtVnpaWFJnSUdOaGJHeGlZV05ySUdWeWNtOXlBR0J2Ymw5amFIVnVhMTlvWldGa1pYSmdJR05oYkd4aVlXTnJJR1Z5Y205eUFHQnZibDl0WlhOellXZGxYMkpsWjJsdVlDQmpZV3hzWW1GamF5Qmxjbkp2Y2dCZ2IyNWZZMmgxYm10ZlpYaDBaVzV6YVc5dVgzWmhiSFZsWUNCallXeHNZbUZqYXlCbGNuSnZjZ0JnYjI1ZmMzUmhkSFZ6WDJOdmJYQnNaWFJsWUNCallXeHNZbUZqYXlCbGNuSnZjZ0JnYjI1ZmRtVnljMmx2Ymw5amIyMXdiR1YwWldBZ1kyRnNiR0poWTJzZ1pYSnliM0lBWUc5dVgzVnliRjlqYjIxd2JHVjBaV0FnWTJGc2JHSmhZMnNnWlhKeWIzSUFZRzl1WDJOb2RXNXJYMk52YlhCc1pYUmxZQ0JqWVd4c1ltRmpheUJsY25KdmNnQmdiMjVmYUdWaFpHVnlYM1poYkhWbFgyTnZiWEJzWlhSbFlDQmpZV3hzWW1GamF5Qmxjbkp2Y2dCZ2IyNWZiV1Z6YzJGblpWOWpiMjF3YkdWMFpXQWdZMkZzYkdKaFkyc2daWEp5YjNJQVlHOXVYMjFsZEdodlpGOWpiMjF3YkdWMFpXQWdZMkZzYkdKaFkyc2daWEp5YjNJQVlHOXVYMmhsWVdSbGNsOW1hV1ZzWkY5amIyMXdiR1YwWldBZ1kyRnNiR0poWTJzZ1pYSnliM0lBWUc5dVgyTm9kVzVyWDJWNGRHVnVjMmx2Ymw5dVlXMWxZQ0JqWVd4c1ltRmpheUJsY25KdmNnQlZibVY0Y0dWamRHVmtJR05vWVhJZ2FXNGdkWEpzSUhObGNuWmxjZ0JKYm5aaGJHbGtJR2hsWVdSbGNpQjJZV3gxWlNCamFHRnlBRWx1ZG1Gc2FXUWdhR1ZoWkdWeUlHWnBaV3hrSUdOb1lYSUFVM0JoYmlCallXeHNZbUZqYXlCbGNuSnZjaUJwYmlCdmJsOTJaWEp6YVc5dUFFbHVkbUZzYVdRZ2JXbHViM0lnZG1WeWMybHZiZ0JKYm5aaGJHbGtJRzFoYW05eUlIWmxjbk5wYjI0QVJYaHdaV04wWldRZ2MzQmhZMlVnWVdaMFpYSWdkbVZ5YzJsdmJnQkZlSEJsWTNSbFpDQkRVa3hHSUdGbWRHVnlJSFpsY25OcGIyNEFTVzUyWVd4cFpDQklWRlJRSUhabGNuTnBiMjRBU1c1MllXeHBaQ0JvWldGa1pYSWdkRzlyWlc0QVUzQmhiaUJqWVd4c1ltRmpheUJsY25KdmNpQnBiaUJ2Ymw5MWNtd0FTVzUyWVd4cFpDQmphR0Z5WVdOMFpYSnpJR2x1SUhWeWJBQlZibVY0Y0dWamRHVmtJSE4wWVhKMElHTm9ZWElnYVc0Z2RYSnNBRVJ2ZFdKc1pTQkFJR2x1SUhWeWJBQkZiWEIwZVNCRGIyNTBaVzUwTFV4bGJtZDBhQUJKYm5aaGJHbGtJR05vWVhKaFkzUmxjaUJwYmlCRGIyNTBaVzUwTFV4bGJtZDBhQUJFZFhCc2FXTmhkR1VnUTI5dWRHVnVkQzFNWlc1bmRHZ0FTVzUyWVd4cFpDQmphR0Z5SUdsdUlIVnliQ0J3WVhSb0FFTnZiblJsYm5RdFRHVnVaM1JvSUdOaGJpZDBJR0psSUhCeVpYTmxiblFnZDJsMGFDQlVjbUZ1YzJabGNpMUZibU52WkdsdVp3QkpiblpoYkdsa0lHTm9ZWEpoWTNSbGNpQnBiaUJqYUhWdWF5QnphWHBsQUZOd1lXNGdZMkZzYkdKaFkyc2daWEp5YjNJZ2FXNGdiMjVmYUdWaFpHVnlYM1poYkhWbEFGTndZVzRnWTJGc2JHSmhZMnNnWlhKeWIzSWdhVzRnYjI1ZlkyaDFibXRmWlhoMFpXNXphVzl1WDNaaGJIVmxBRWx1ZG1Gc2FXUWdZMmhoY21GamRHVnlJR2x1SUdOb2RXNXJJR1Y0ZEdWdWMybHZibk1nZG1Gc2RXVUFUV2x6YzJsdVp5QmxlSEJsWTNSbFpDQk1SaUJoWm5SbGNpQm9aV0ZrWlhJZ2RtRnNkV1VBU1c1MllXeHBaQ0JnVkhKaGJuTm1aWEl0Ulc1amIyUnBibWRnSUdobFlXUmxjaUIyWVd4MVpRQkpiblpoYkdsa0lHTm9ZWEpoWTNSbGNpQnBiaUJqYUhWdWF5QmxlSFJsYm5OcGIyNXpJSEYxYjNSbElIWmhiSFZsQUVsdWRtRnNhV1FnWTJoaGNtRmpkR1Z5SUdsdUlHTm9kVzVySUdWNGRHVnVjMmx2Ym5NZ2NYVnZkR1ZrSUhaaGJIVmxBRkJoZFhObFpDQmllU0J2Ymw5b1pXRmtaWEp6WDJOdmJYQnNaWFJsQUVsdWRtRnNhV1FnUlU5R0lITjBZWFJsQUc5dVgzSmxjMlYwSUhCaGRYTmxBRzl1WDJOb2RXNXJYMmhsWVdSbGNpQndZWFZ6WlFCdmJsOXRaWE56WVdkbFgySmxaMmx1SUhCaGRYTmxBRzl1WDJOb2RXNXJYMlY0ZEdWdWMybHZibDkyWVd4MVpTQndZWFZ6WlFCdmJsOXpkR0YwZFhOZlkyOXRjR3hsZEdVZ2NHRjFjMlVBYjI1ZmRtVnljMmx2Ymw5amIyMXdiR1YwWlNCd1lYVnpaUUJ2Ymw5MWNteGZZMjl0Y0d4bGRHVWdjR0YxYzJVQWIyNWZZMmgxYm10ZlkyOXRjR3hsZEdVZ2NHRjFjMlVBYjI1ZmFHVmhaR1Z5WDNaaGJIVmxYMk52YlhCc1pYUmxJSEJoZFhObEFHOXVYMjFsYzNOaFoyVmZZMjl0Y0d4bGRHVWdjR0YxYzJVQWIyNWZiV1YwYUc5a1gyTnZiWEJzWlhSbElIQmhkWE5sQUc5dVgyaGxZV1JsY2w5bWFXVnNaRjlqYjIxd2JHVjBaU0J3WVhWelpRQnZibDlqYUhWdWExOWxlSFJsYm5OcGIyNWZibUZ0WlNCd1lYVnpaUUJWYm1WNGNHVmpkR1ZrSUhOd1lXTmxJR0ZtZEdWeUlITjBZWEowSUd4cGJtVUFVM0JoYmlCallXeHNZbUZqYXlCbGNuSnZjaUJwYmlCdmJsOWphSFZ1YTE5bGVIUmxibk5wYjI1ZmJtRnRaUUJKYm5aaGJHbGtJR05vWVhKaFkzUmxjaUJwYmlCamFIVnVheUJsZUhSbGJuTnBiMjV6SUc1aGJXVUFVR0YxYzJVZ2IyNGdRMDlPVGtWRFZDOVZjR2R5WVdSbEFGQmhkWE5sSUc5dUlGQlNTUzlWY0dkeVlXUmxBRVY0Y0dWamRHVmtJRWhVVkZBdk1pQkRiMjV1WldOMGFXOXVJRkJ5WldaaFkyVUFVM0JoYmlCallXeHNZbUZqYXlCbGNuSnZjaUJwYmlCdmJsOXRaWFJvYjJRQVJYaHdaV04wWldRZ2MzQmhZMlVnWVdaMFpYSWdiV1YwYUc5a0FGTndZVzRnWTJGc2JHSmhZMnNnWlhKeWIzSWdhVzRnYjI1ZmFHVmhaR1Z5WDJacFpXeGtBRkJoZFhObFpBQkpiblpoYkdsa0lIZHZjbVFnWlc1amIzVnVkR1Z5WldRQVNXNTJZV3hwWkNCdFpYUm9iMlFnWlc1amIzVnVkR1Z5WldRQVZXNWxlSEJsWTNSbFpDQmphR0Z5SUdsdUlIVnliQ0J6WTJobGJXRUFVbVZ4ZFdWemRDQm9ZWE1nYVc1MllXeHBaQ0JnVkhKaGJuTm1aWEl0Ulc1amIyUnBibWRnQUZOWFNWUkRTRjlRVWs5WVdRQlZVMFZmVUZKUFdGa0FUVXRCUTFSSlZrbFVXUUJWVGxCU1QwTkZVMU5CUWt4RlgwVk9WRWxVV1FCRFQxQlpBRTFQVmtWRVgxQkZVazFCVGtWT1ZFeFpBRlJQVDE5RlFWSk1XUUJPVDFSSlJsa0FSa0ZKVEVWRVgwUkZVRVZPUkVWT1Exa0FRa0ZFWDBkQlZFVlhRVmtBVUV4QldRQlFWVlFBUTBoRlEwdFBWVlFBUjBGVVJWZEJXVjlVU1UxRlQxVlVBRkpGVVZWRlUxUmZWRWxOUlU5VlZBQk9SVlJYVDFKTFgwTlBUazVGUTFSZlZFbE5SVTlWVkFCRFQwNU9SVU5VU1U5T1gxUkpUVVZQVlZRQVRFOUhTVTVmVkVsTlJVOVZWQUJPUlZSWFQxSkxYMUpGUVVSZlZFbE5SVTlWVkFCUVQxTlVBRTFKVTBSSlVrVkRWRVZFWDFKRlVWVkZVMVFBUTB4SlJVNVVYME5NVDFORlJGOVNSVkZWUlZOVUFFTk1TVVZPVkY5RFRFOVRSVVJmVEU5QlJGOUNRVXhCVGtORlJGOVNSVkZWUlZOVUFFSkJSRjlTUlZGVlJWTlVBRWhVVkZCZlVrVlJWVVZUVkY5VFJVNVVYMVJQWDBoVVZGQlRYMUJQVWxRQVVrVlFUMUpVQUVsTlgwRmZWRVZCVUU5VUFGSkZVMFZVWDBOUFRsUkZUbFFBVGs5ZlEwOU9WRVZPVkFCUVFWSlVTVUZNWDBOUFRsUkZUbFFBU0ZCRlgwbE9Wa0ZNU1VSZlEwOU9VMVJCVGxRQVNGQkZYME5DWDFKRlUwVlVBRWRGVkFCSVVFVmZVMVJTU1VOVUFFTlBUa1pNU1VOVUFGUkZUVkJQVWtGU1dWOVNSVVJKVWtWRFZBQlFSVkpOUVU1RlRsUmZVa1ZFU1ZKRlExUUFRMDlPVGtWRFZBQk5WVXhVU1Y5VFZFRlVWVk1BU0ZCRlgwbE9Wa0ZNU1VSZlUxUkJWRlZUQUZSUFQxOU5RVTVaWDFKRlVWVkZVMVJUQUVWQlVreFpYMGhKVGxSVEFGVk9RVlpCU1V4QlFreEZYMFpQVWw5TVJVZEJURjlTUlVGVFQwNVRBRTlRVkVsUFRsTUFVMWRKVkVOSVNVNUhYMUJTVDFSUFEwOU1Vd0JXUVZKSlFVNVVYMEZNVTA5ZlRrVkhUMVJKUVZSRlV3Qk5WVXhVU1ZCTVJWOURTRTlKUTBWVEFFbE9WRVZTVGtGTVgxTkZVbFpGVWw5RlVsSlBVZ0JYUlVKZlUwVlNWa1ZTWDFWT1MwNVBWMDVmUlZKU1QxSUFVa0ZKVEVkVlRsOUZVbEpQVWdCSlJFVk9WRWxVV1Y5UVVrOVdTVVJGVWw5QlZWUklSVTVVU1VOQlZFbFBUbDlGVWxKUFVnQlRVMHhmUTBWU1ZFbEdTVU5CVkVWZlJWSlNUMUlBU1U1V1FVeEpSRjlZWDBaUFVsZEJVa1JGUkY5R1QxSUFVMFZVWDFCQlVrRk5SVlJGVWdCSFJWUmZVRUZTUVUxRlZFVlNBRWhRUlY5VlUwVlNBRk5GUlY5UFZFaEZVZ0JJVUVWZlEwSmZRMGhWVGt0ZlNFVkJSRVZTQUUxTFEwRk1SVTVFUVZJQVUwVlVWVkFBVjBWQ1gxTkZVbFpGVWw5SlUxOUVUMWRPQUZSRlFWSkVUMWRPQUVoUVJWOURURTlUUlVSZlEwOU9Ua1ZEVkVsUFRnQklSVlZTU1ZOVVNVTmZSVmhRU1ZKQlZFbFBUZ0JFU1ZORFQwNU9SVU5VUlVSZlQxQkZVa0ZVU1U5T0FFNVBUbDlCVlZSSVQxSkpWRUZVU1ZaRlgwbE9SazlTVFVGVVNVOU9BRWhRUlY5SlRsWkJURWxFWDFaRlVsTkpUMDRBU0ZCRlgwTkNYMDFGVTFOQlIwVmZRa1ZIU1U0QVUwbFVSVjlKVTE5R1VrOWFSVTRBU0ZCRlgwbE9Wa0ZNU1VSZlNFVkJSRVZTWDFSUFMwVk9BRWxPVmtGTVNVUmZWRTlMUlU0QVJrOVNRa2xFUkVWT0FFVk9TRUZPUTBWZldVOVZVbDlEUVV4TkFFaFFSVjlKVGxaQlRFbEVYMVZTVEFCQ1RFOURTMFZFWDBKWlgxQkJVa1ZPVkVGTVgwTlBUbFJTVDB3QVRVdERUMHdBUVVOTUFFaFFSVjlKVGxSRlVrNUJUQUJTUlZGVlJWTlVYMGhGUVVSRlVsOUdTVVZNUkZOZlZFOVBYMHhCVWtkRlgxVk9UMFpHU1VOSlFVd0FTRkJGWDA5TEFGVk9URWxPU3dCVlRreFBRMHNBVUZKSkFGSkZWRkpaWDFkSlZFZ0FTRkJGWDBsT1ZrRk1TVVJmUTA5T1ZFVk9WRjlNUlU1SFZFZ0FTRkJGWDFWT1JWaFFSVU5VUlVSZlEwOU9WRVZPVkY5TVJVNUhWRWdBUmt4VlUwZ0FVRkpQVUZCQlZFTklBRTB0VTBWQlVrTklBRlZTU1Y5VVQwOWZURTlPUndCUVVrOURSVk5UU1U1SEFFMUpVME5GVEV4QlRrVlBWVk5mVUVWU1UwbFRWRVZPVkY5WFFWSk9TVTVIQUUxSlUwTkZURXhCVGtWUFZWTmZWMEZTVGtsT1J3QklVRVZmU1U1V1FVeEpSRjlVVWtGT1UwWkZVbDlGVGtOUFJFbE9Sd0JGZUhCbFkzUmxaQ0JEVWt4R0FFaFFSVjlKVGxaQlRFbEVYME5JVlU1TFgxTkpXa1VBVFU5V1JRQkRUMDVVU1U1VlJRQklVRVZmUTBKZlUxUkJWRlZUWDBOUFRWQk1SVlJGQUVoUVJWOURRbDlJUlVGRVJWSlRYME5QVFZCTVJWUkZBRWhRUlY5RFFsOVdSVkpUU1U5T1gwTlBUVkJNUlZSRkFFaFFSVjlEUWw5VlVreGZRMDlOVUV4RlZFVUFTRkJGWDBOQ1gwTklWVTVMWDBOUFRWQk1SVlJGQUVoUVJWOURRbDlJUlVGRVJWSmZWa0ZNVlVWZlEwOU5VRXhGVkVVQVNGQkZYME5DWDBOSVZVNUxYMFZZVkVWT1UwbFBUbDlXUVV4VlJWOURUMDFRVEVWVVJRQklVRVZmUTBKZlEwaFZUa3RmUlZoVVJVNVRTVTlPWDA1QlRVVmZRMDlOVUV4RlZFVUFTRkJGWDBOQ1gwMUZVMU5CUjBWZlEwOU5VRXhGVkVVQVNGQkZYME5DWDAxRlZFaFBSRjlEVDAxUVRFVlVSUUJJVUVWZlEwSmZTRVZCUkVWU1gwWkpSVXhFWDBOUFRWQk1SVlJGQUVSRlRFVlVSUUJJVUVWZlNVNVdRVXhKUkY5RlQwWmZVMVJCVkVVQVNVNVdRVXhKUkY5VFUweGZRMFZTVkVsR1NVTkJWRVVBVUVGVlUwVUFUazlmVWtWVFVFOU9VMFVBVlU1VFZWQlFUMUpVUlVSZlRVVkVTVUZmVkZsUVJRQkhUMDVGQUU1UFZGOUJRME5GVUZSQlFreEZBRk5GVWxaSlEwVmZWVTVCVmtGSlRFRkNURVVBVWtGT1IwVmZUazlVWDFOQlZFbFRSa2xCUWt4RkFFOVNTVWRKVGw5SlUxOVZUbEpGUVVOSVFVSk1SUUJTUlZOUVQwNVRSVjlKVTE5VFZFRk1SUUJRVlZKSFJRQk5SVkpIUlFCU1JWRlZSVk5VWDBoRlFVUkZVbDlHU1VWTVJGTmZWRTlQWDB4QlVrZEZBRkpGVVZWRlUxUmZTRVZCUkVWU1gxUlBUMTlNUVZKSFJRQlFRVmxNVDBGRVgxUlBUMTlNUVZKSFJRQkpUbE5WUmtaSlEwbEZUbFJmVTFSUFVrRkhSUUJJVUVWZlVFRlZVMFZFWDFWUVIxSkJSRVVBU0ZCRlgxQkJWVk5GUkY5SU1sOVZVRWRTUVVSRkFGTlBWVkpEUlFCQlRrNVBWVTVEUlFCVVVrRkRSUUJJVUVWZlZVNUZXRkJGUTFSRlJGOVRVRUZEUlFCRVJWTkRVa2xDUlFCVlRsTlZRbE5EVWtsQ1JRQlNSVU5QVWtRQVNGQkZYMGxPVmtGTVNVUmZUVVZVU0U5RUFFNVBWRjlHVDFWT1JBQlFVazlRUmtsT1JBQlZUa0pKVGtRQVVrVkNTVTVFQUZWT1FWVlVTRTlTU1ZwRlJBQk5SVlJJVDBSZlRrOVVYMEZNVEU5WFJVUUFTRlJVVUY5V1JWSlRTVTlPWDA1UFZGOVRWVkJRVDFKVVJVUUFRVXhTUlVGRVdWOVNSVkJQVWxSRlJBQkJRME5GVUZSRlJBQk9UMVJmU1UxUVRFVk5SVTVVUlVRQVRFOVBVRjlFUlZSRlExUkZSQUJJVUVWZlExSmZSVmhRUlVOVVJVUUFTRkJGWDB4R1gwVllVRVZEVkVWRUFFTlNSVUZVUlVRQVNVMWZWVk5GUkFCSVVFVmZVRUZWVTBWRUFGUkpUVVZQVlZSZlQwTkRWVkpGUkFCUVFWbE5SVTVVWDFKRlVWVkpVa1ZFQUZCU1JVTlBUa1JKVkVsUFRsOVNSVkZWU1ZKRlJBQlFVazlZV1Y5QlZWUklSVTVVU1VOQlZFbFBUbDlTUlZGVlNWSkZSQUJPUlZSWFQxSkxYMEZWVkVoRlRsUkpRMEZVU1U5T1gxSkZVVlZKVWtWRUFFeEZUa2RVU0Y5U1JWRlZTVkpGUkFCVFUweGZRMFZTVkVsR1NVTkJWRVZmVWtWUlZVbFNSVVFBVlZCSFVrRkVSVjlTUlZGVlNWSkZSQUJRUVVkRlgwVllVRWxTUlVRQVVGSkZRMDlPUkVsVVNVOU9YMFpCU1V4RlJBQkZXRkJGUTFSQlZFbFBUbDlHUVVsTVJVUUFVa1ZXUVV4SlJFRlVTVTlPWDBaQlNVeEZSQUJUVTB4ZlNFRk9SRk5JUVV0RlgwWkJTVXhGUkFCTVQwTkxSVVFBVkZKQlRsTkdUMUpOUVZSSlQwNWZRVkJRVEVsRlJBQk9UMVJmVFU5RVNVWkpSVVFBVGs5VVgwVllWRVZPUkVWRUFFSkJUa1JYU1VSVVNGOU1TVTFKVkY5RldFTkZSVVJGUkFCVFNWUkZYMGxUWDA5V1JWSk1UMEZFUlVRQVNFVkJSQUJGZUhCbFkzUmxaQ0JJVkZSUUx3QUFYaE1BQUNZVEFBQXdFQUFBOEJjQUFKMFRBQUFWRWdBQU9SY0FBUEFTQUFBS0VBQUFkUklBQUswU0FBQ0NFd0FBVHhRQUFIOFFBQUNnRlFBQUl4UUFBSWtTQUFDTEZBQUFUUlVBQU5RUkFBRFBGQUFBRUJnQUFNa1dBQURjRmdBQXdSRUFBT0FYQUFDN0ZBQUFkQlFBQUh3VkFBRGxGQUFBQ0JjQUFCOFFBQUJsRlFBQW94UUFBQ2dWQUFBQ0ZRQUFtUlVBQUN3UUFBQ0xHUUFBVHc4QUFOUU9BQUJxRUFBQXpoQUFBQUlYQUFDSkRnQUFiaE1BQUJ3VEFBQm1GQUFBVmhjQUFNRVRBQURORXdBQWJCTUFBR2dYQUFCbUZ3QUFYeGNBQUNJVEFBRE9Ed0FBYVE0QUFOZ09BQUJqRmdBQXl4TUFBS29PQUFBb0Z3QUFKaGNBQU1VVEFBQmRGZ0FBNkJFQUFHY1RBQUJsRXdBQThoWUFBSE1UQUFBZEZ3QUErUllBQVBNUkFBRFBEZ0FBemhVQUFBd1NBQUN6RVFBQXBSRUFBR0VRQUFBeUZ3QUF1eE1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBUUlCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQUFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRQUFBQUFBQUFBQUFBQUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJREFnSUNBZ0lBQUFJQ0FBSUNBQUlDQWdJQ0FnSUNBZ0lBQkFBQUFBQUFBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUFBQUFDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdBQ0FBSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNBQUlDQWdJQ0FBQUNBZ0FDQWdBQ0FnSUNBZ0lDQWdJQ0FBTUFCQUFBQUFJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQUFBQUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUFBZ0FDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWJHOXpaV1ZsY0MxaGJHbDJaUUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQUFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUFBQUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQkFRRUJBUUVCQVFFQkFRSUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCWTJoMWJtdGxaQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRRUFBUUVCQVFFQUFBRUJBQUVCQUFFQkFRRUJBUUVCQVFFQUFBQUFBQUFBQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVBQUFBQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRQUJBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCbFkzUnBiMjVsYm5RdGJHVnVaM1JvYjI1eWIzaDVMV052Ym01bFkzUnBiMjRBQUFBQUFBQUFBQUFBQUFBQUFBQnlZVzV6Wm1WeUxXVnVZMjlrYVc1bmNHZHlZV1JsRFFvTkNnMEtVMDBOQ2cwS1ZGUlFMME5GTDFSVFVDOEFBQUFBQUFBQUFBQUFBQUFCQWdBQkF3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFBQUFBQUFBQUFBQUFRSUFBUU1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQVFFRkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRQUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUFBQUFBQUFBQUFBQUVBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUJBQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUFCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVBQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQUFBQUFBQUFBQUFBQUFRQUFBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1FQUFBRUJBUUVCQVFFQkFRRUJBVUVCQVFFQkFRRUJBUUVCQVFBQkFBR0J3UUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBQUVBQVFBQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJQUFBQUFBQUFEQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd0FBQUFBQUFBTURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUFBQUFBQUFBQUFBQUlBQUFBQUFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNQUFBQUFBQUFEQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQk9UMVZPUTBWRlEwdFBWVlJPUlVOVVJWUkZRMUpKUWtWTVZWTklSVlJGUVVSVFJVRlNRMGhTUjBWRFZFbFdTVlJaVEVWT1JFRlNWa1ZQVkVsR1dWQlVTVTlPVTBOSVUwVkJXVk5VUVZSRFNFZEZUMUpFU1ZKRlExUlBVbFJTUTBoUVFWSkJUVVZVUlZKVlVrTkZRbE5EVWtsQ1JVRlNSRTlYVGtGRFJVbE9SRTVMUTB0VlFsTkRVa2xDUlVoVVZGQXZRVVJVVUM4PSdcbiIsIm1vZHVsZS5leHBvcnRzID0gJ0FHRnpiUUVBQUFBQk1BaGdBWDhCZjJBRGYzOS9BWDlnQkg5L2YzOEJmMkFBQUdBRGYzOS9BR0FCZndCZ0FuOS9BR0FHZjM5L2YzOS9BQUxMQVFnRFpXNTJHSGRoYzIxZmIyNWZhR1ZoWkdWeWMxOWpiMjF3YkdWMFpRQUNBMlZ1ZGhWM1lYTnRYMjl1WDIxbGMzTmhaMlZmWW1WbmFXNEFBQU5sYm5ZTGQyRnpiVjl2Ymw5MWNtd0FBUU5sYm5ZT2QyRnpiVjl2Ymw5emRHRjBkWE1BQVFObGJuWVVkMkZ6YlY5dmJsOW9aV0ZrWlhKZlptbGxiR1FBQVFObGJuWVVkMkZ6YlY5dmJsOW9aV0ZrWlhKZmRtRnNkV1VBQVFObGJuWU1kMkZ6YlY5dmJsOWliMlI1QUFFRFpXNTJHSGRoYzIxZmIyNWZiV1Z6YzJGblpWOWpiMjF3YkdWMFpRQUFBMFpGQXdNRUFBQUZBQUFBQUFBQUJRRUZBQVVGQlFBQUJnQUFBQUFHQmdZR0FRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQkFBQUJBUWNBQUFVRkF3QUJCQVVCY0FFU0VnVURBUUFDQmdnQmZ3RkJnTlFFQ3dmUkJTSUdiV1Z0YjNKNUFnQUxYMmx1YVhScFlXeHBlbVVBQ1JsZlgybHVaR2x5WldOMFgyWjFibU4wYVc5dVgzUmhZbXhsQVFBTGJHeG9kSFJ3WDJsdWFYUUFDaGhzYkdoMGRIQmZjMmh2ZFd4a1gydGxaWEJmWVd4cGRtVUFRUXhzYkdoMGRIQmZZV3hzYjJNQURBWnRZV3hzYjJNQVJndHNiR2gwZEhCZlpuSmxaUUFOQkdaeVpXVUFTQTlzYkdoMGRIQmZaMlYwWDNSNWNHVUFEaFZzYkdoMGRIQmZaMlYwWDJoMGRIQmZiV0ZxYjNJQUR4VnNiR2gwZEhCZloyVjBYMmgwZEhCZmJXbHViM0lBRUJGc2JHaDBkSEJmWjJWMFgyMWxkR2h2WkFBUkZteHNhSFIwY0Y5blpYUmZjM1JoZEhWelgyTnZaR1VBRWhKc2JHaDBkSEJmWjJWMFgzVndaM0poWkdVQUV3eHNiR2gwZEhCZmNtVnpaWFFBRkE1c2JHaDBkSEJmWlhobFkzVjBaUUFWRkd4c2FIUjBjRjl6WlhSMGFXNW5jMTlwYm1sMEFCWU5iR3hvZEhSd1gyWnBibWx6YUFBWERHeHNhSFIwY0Y5d1lYVnpaUUFZRFd4c2FIUjBjRjl5WlhOMWJXVUFHUnRzYkdoMGRIQmZjbVZ6ZFcxbFgyRm1kR1Z5WDNWd1ozSmhaR1VBR2hCc2JHaDBkSEJmWjJWMFgyVnljbTV2QUJzWGJHeG9kSFJ3WDJkbGRGOWxjbkp2Y2w5eVpXRnpiMjRBSEJkc2JHaDBkSEJmYzJWMFgyVnljbTl5WDNKbFlYTnZiZ0FkRkd4c2FIUjBjRjluWlhSZlpYSnliM0pmY0c5ekFCNFJiR3hvZEhSd1gyVnljbTV2WDI1aGJXVUFIeEpzYkdoMGRIQmZiV1YwYUc5a1gyNWhiV1VBSUJKc2JHaDBkSEJmYzNSaGRIVnpYMjVoYldVQUlScHNiR2gwZEhCZmMyVjBYMnhsYm1sbGJuUmZhR1ZoWkdWeWN3QWlJV3hzYUhSMGNGOXpaWFJmYkdWdWFXVnVkRjlqYUhWdWEyVmtYMnhsYm1kMGFBQWpIV3hzYUhSMGNGOXpaWFJmYkdWdWFXVnVkRjlyWldWd1gyRnNhWFpsQUNRa2JHeG9kSFJ3WDNObGRGOXNaVzVwWlc1MFgzUnlZVzV6Wm1WeVgyVnVZMjlrYVc1bkFDVVliR3hvZEhSd1gyMWxjM05oWjJWZmJtVmxaSE5mWlc5bUFEOEpGd0VBUVFFTEVRRUNBd1FGQ3dZSE5UazNNUzh0SnlzcENyTGdBa1VDQUFzSUFCQ0lnSUNBQUFzWkFDQUFFTUtBZ0lBQUdpQUFJQUkyQWpnZ0FDQUJPZ0FvQ3h3QUlBQWdBQzhCTWlBQUxRQXVJQUFRd1lDQWdBQVFnSUNBZ0FBTEtnRUJmMEhBQUJER2dJQ0FBQ0lCRU1LQWdJQUFHaUFCUVlDSWdJQUFOZ0k0SUFFZ0FEb0FLQ0FCQ3dvQUlBQVF5SUNBZ0FBTEJ3QWdBQzBBS0FzSEFDQUFMUUFxQ3djQUlBQXRBQ3NMQndBZ0FDMEFLUXNIQUNBQUx3RXlDd2NBSUFBdEFDNExSUUVFZnlBQUtBSVlJUUVnQUMwQUxTRUNJQUF0QUNnaEF5QUFLQUk0SVFRZ0FCRENnSUNBQUJvZ0FDQUVOZ0k0SUFBZ0F6b0FLQ0FBSUFJNkFDMGdBQ0FCTmdJWUN4RUFJQUFnQVNBQklBSnFFTU9BZ0lBQUN4QUFJQUJCQUVIY0FCRE1nSUNBQUJvTFp3RUJmMEVBSVFFQ1FDQUFLQUlNRFFBQ1FBSkFBa0FDUUNBQUxRQXZEZ01CQUFNQ0N5QUFLQUk0SWdGRkRRQWdBU2dDTENJQlJRMEFJQUFnQVJHQWdJQ0FBQUFpQVEwREMwRUFEd3NReW9DQWdBQUFDeUFBUWNPV2dJQUFOZ0lRUVE0aEFRc2dBUXNlQUFKQUlBQW9BZ3dOQUNBQVFkR2JnSUFBTmdJUUlBQkJGVFlDREFzTEZnQUNRQ0FBS0FJTVFSVkhEUUFnQUVFQU5nSU1Dd3NXQUFKQUlBQW9BZ3hCRmtjTkFDQUFRUUEyQWd3TEN3Y0FJQUFvQWd3TEJ3QWdBQ2dDRUFzSkFDQUFJQUUyQWhBTEJ3QWdBQ2dDRkFzaUFBSkFJQUJCSkVrTkFCREtnSUNBQUFBTElBQkJBblJCb0xPQWdBQnFLQUlBQ3lJQUFrQWdBRUV1U1EwQUVNcUFnSUFBQUFzZ0FFRUNkRUd3dElDQUFHb29BZ0FMN2dzQkFYOUI2NmlBZ0FBaEFRSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQUJCbkg5cUR2UURZMklBQVdGaFlXRmhZUUlEQkFWaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhCZ2NJQ1FvTERBME9EMkZoWVdGaEVHRmhZV0ZoWVdGaFlXRmhFV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZUklURkJVV0Z4Z1pHaHRoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoSEIwZUh5QWhJaU1rSlNZbktDa3FLeXd0TGk4d01USXpORFUyWVRjNE9UcGhZV0ZoWVdGaFlUdGhZV0U4WVdGaFlUMCtQMkZoWVdGaFlXRmhRR0ZoUVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlVSkRSRVZHUjBoSlNrdE1UVTVQVUZGU1UyRmhZV0ZoWVdGaFZGVldWMWhaV2x0aFhGMWhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZlWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWDJCaEMwSGhwNENBQUE4TFFhU2hnSUFBRHd0Qnk2eUFnQUFQQzBIK3NZQ0FBQThMUWNDa2dJQUFEd3RCcTZTQWdBQVBDMEdOcUlDQUFBOExRZUttZ0lBQUR3dEJnTENBZ0FBUEMwRzVyNENBQUE4TFFkZWtnSUFBRHd0Qjc1K0FnQUFQQzBIaG40Q0FBQThMUWZxZmdJQUFEd3RCOHFDQWdBQVBDMEdvcjRDQUFBOExRYTZ5Z0lBQUR3dEJpTENBZ0FBUEMwSHNwNENBQUE4TFFZS2lnSUFBRHd0QmpwMkFnQUFQQzBIUXJvQ0FBQThMUWNxamdJQUFEd3RCeGJLQWdBQVBDMEhmbklDQUFBOExRZEtjZ0lBQUR3dEJ4S0NBZ0FBUEMwSFhvSUNBQUE4TFFhS2ZnSUFBRHd0QjdhNkFnQUFQQzBHcnNJQ0FBQThMUWRTbGdJQUFEd3RCeks2QWdBQVBDMEg2cm9DQUFBOExRZnlyZ0lBQUR3dEIwckNBZ0FBUEMwSHhuWUNBQUE4TFFidWdnSUFBRHd0Qjk2dUFnQUFQQzBHUXNZQ0FBQThMUWRleGdJQUFEd3RCb3EyQWdBQVBDMEhVcDRDQUFBOExRZUNyZ0lBQUR3dEJuNnlBZ0FBUEMwSHJzWUNBQUE4TFFkV2ZnSUFBRHd0QnlyR0FnQUFQQzBIZXBZQ0FBQThMUWRTZWdJQUFEd3RCOUp5QWdBQVBDMEduc29DQUFBOExRYkdkZ0lBQUR3dEJvSjJBZ0FBUEMwRzVzWUNBQUE4TFFieXdnSUFBRHd0QmtxR0FnQUFQQzBHenBvQ0FBQThMUWVtc2dJQUFEd3RCcko2QWdBQVBDMEhVcTRDQUFBOExRZmVtZ0lBQUR3dEJnS2FBZ0FBUEMwR3dvWUNBQUE4TFFmNmVnSUFBRHd0QmphT0FnQUFQQzBHSnJZQ0FBQThMUWZlaWdJQUFEd3RCb0xHQWdBQVBDMEd1bjRDQUFBOExRY2FsZ0lBQUR3dEI2SjZBZ0FBUEMwR1Rvb0NBQUE4TFFjS3ZnSUFBRHd0Qnc1MkFnQUFQQzBHTHJJQ0FBQThMUWVHZGdJQUFEd3RCamErQWdBQVBDMEhxb1lDQUFBOExRYlN0Z0lBQUR3dEIwcStBZ0FBUEMwSGZzb0NBQUE4TFFkS3lnSUFBRHd0QjhMQ0FnQUFQQzBHcG9vQ0FBQThMUWZtamdJQUFEd3RCbVo2QWdBQVBDMEcxcklDQUFBOExRWnV3Z0lBQUR3dEJrcktBZ0FBUEMwRzJxNENBQUE4TFFjS2lnSUFBRHd0QitMS0FnQUFQQzBHZXBZQ0FBQThMUWRDaWdJQUFEd3RCdXA2QWdBQVBDMEdCbm9DQUFBOExFTXFBZ0lBQUFBdEIxcUdBZ0FBaEFRc2dBUXNXQUNBQUlBQXRBQzFCL2dGeElBRkJBRWR5T2dBdEN4a0FJQUFnQUMwQUxVSDlBWEVnQVVFQVIwRUJkSEk2QUMwTEdRQWdBQ0FBTFFBdFFmc0JjU0FCUVFCSFFRSjBjam9BTFFzWkFDQUFJQUF0QUMxQjl3RnhJQUZCQUVkQkEzUnlPZ0F0Q3k0QkFuOUJBQ0VEQWtBZ0FDZ0NPQ0lFUlEwQUlBUW9BZ0FpQkVVTkFDQUFJQVFSZ0lDQWdBQUFJUU1MSUFNTFNRRUNmMEVBSVFNQ1FDQUFLQUk0SWdSRkRRQWdCQ2dDQkNJRVJRMEFJQUFnQVNBQ0lBRnJJQVFSZ1lDQWdBQUFJZ05CZjBjTkFDQUFRY2FSZ0lBQU5nSVFRUmdoQXdzZ0F3c3VBUUovUVFBaEF3SkFJQUFvQWpnaUJFVU5BQ0FFS0FJd0lnUkZEUUFnQUNBRUVZQ0FnSUFBQUNFREN5QURDMGtCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FnZ2lCRVVOQUNBQUlBRWdBaUFCYXlBRUVZR0FnSUFBQUNJRFFYOUhEUUFnQUVIMmlvQ0FBRFlDRUVFWUlRTUxJQU1MTGdFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NOQ0lFUlEwQUlBQWdCQkdBZ0lDQUFBQWhBd3NnQXd0SkFRSi9RUUFoQXdKQUlBQW9BamdpQkVVTkFDQUVLQUlNSWdSRkRRQWdBQ0FCSUFJZ0FXc2dCQkdCZ0lDQUFBQWlBMEYvUncwQUlBQkI3WnFBZ0FBMkFoQkJHQ0VEQ3lBREN5NEJBbjlCQUNFREFrQWdBQ2dDT0NJRVJRMEFJQVFvQWpnaUJFVU5BQ0FBSUFRUmdJQ0FnQUFBSVFNTElBTUxTUUVDZjBFQUlRTUNRQ0FBS0FJNElnUkZEUUFnQkNnQ0VDSUVSUTBBSUFBZ0FTQUNJQUZySUFRUmdZQ0FnQUFBSWdOQmYwY05BQ0FBUVpXUWdJQUFOZ0lRUVJnaEF3c2dBd3N1QVFKL1FRQWhBd0pBSUFBb0FqZ2lCRVVOQUNBRUtBSThJZ1JGRFFBZ0FDQUVFWUNBZ0lBQUFDRURDeUFEQzBrQkFuOUJBQ0VEQWtBZ0FDZ0NPQ0lFUlEwQUlBUW9BaFFpQkVVTkFDQUFJQUVnQWlBQmF5QUVFWUdBZ0lBQUFDSURRWDlIRFFBZ0FFR3FtNENBQURZQ0VFRVlJUU1MSUFNTExnRUNmMEVBSVFNQ1FDQUFLQUk0SWdSRkRRQWdCQ2dDUUNJRVJRMEFJQUFnQkJHQWdJQ0FBQUFoQXdzZ0F3dEpBUUovUVFBaEF3SkFJQUFvQWpnaUJFVU5BQ0FFS0FJWUlnUkZEUUFnQUNBQklBSWdBV3NnQkJHQmdJQ0FBQUFpQTBGL1J3MEFJQUJCN1pPQWdBQTJBaEJCR0NFREN5QURDeTRCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FrUWlCRVVOQUNBQUlBUVJnSUNBZ0FBQUlRTUxJQU1MTGdFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NKQ0lFUlEwQUlBQWdCQkdBZ0lDQUFBQWhBd3NnQXdzdUFRSi9RUUFoQXdKQUlBQW9BamdpQkVVTkFDQUVLQUlzSWdSRkRRQWdBQ0FFRVlDQWdJQUFBQ0VEQ3lBREMwa0JBbjlCQUNFREFrQWdBQ2dDT0NJRVJRMEFJQVFvQWlnaUJFVU5BQ0FBSUFFZ0FpQUJheUFFRVlHQWdJQUFBQ0lEUVg5SERRQWdBRUgyaUlDQUFEWUNFRUVZSVFNTElBTUxMZ0VDZjBFQUlRTUNRQ0FBS0FJNElnUkZEUUFnQkNnQ1VDSUVSUTBBSUFBZ0JCR0FnSUNBQUFBaEF3c2dBd3RKQVFKL1FRQWhBd0pBSUFBb0FqZ2lCRVVOQUNBRUtBSWNJZ1JGRFFBZ0FDQUJJQUlnQVdzZ0JCR0JnSUNBQUFBaUEwRi9SdzBBSUFCQndwbUFnQUEyQWhCQkdDRURDeUFEQ3k0QkFuOUJBQ0VEQWtBZ0FDZ0NPQ0lFUlEwQUlBUW9Ba2dpQkVVTkFDQUFJQVFSZ0lDQWdBQUFJUU1MSUFNTFNRRUNmMEVBSVFNQ1FDQUFLQUk0SWdSRkRRQWdCQ2dDSUNJRVJRMEFJQUFnQVNBQ0lBRnJJQVFSZ1lDQWdBQUFJZ05CZjBjTkFDQUFRWlNVZ0lBQU5nSVFRUmdoQXdzZ0F3c3VBUUovUVFBaEF3SkFJQUFvQWpnaUJFVU5BQ0FFS0FKTUlnUkZEUUFnQUNBRUVZQ0FnSUFBQUNFREN5QURDeTRCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FsUWlCRVVOQUNBQUlBUVJnSUNBZ0FBQUlRTUxJQU1MTGdFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NXQ0lFUlEwQUlBQWdCQkdBZ0lDQUFBQWhBd3NnQXd0RkFRRi9Ba0FDUUNBQUx3RXdRUlJ4UVJSSERRQkJBU0VESUFBdEFDaEJBVVlOQVNBQUx3RXlRZVVBUmlFRERBRUxJQUF0QUNsQkJVWWhBd3NnQUNBRE9nQXVRUUFML2dFQkEzOUJBU0VEQWtBZ0FDOEJNQ0lFUVFoeERRQWdBQ2tESUVJQVVpRURDd0pBQWtBZ0FDMEFMa1VOQUVFQklRVWdBQzBBS1VFRlJnMEJRUUVoQlNBRVFjQUFjVVVnQTNGQkFVY05BUXRCQUNFRklBUkJ3QUJ4RFFCQkFpRUZJQVJCLy84RGNTSURRUWh4RFFBQ1FDQURRWUFFY1VVTkFBSkFJQUF0QUNoQkFVY05BQ0FBTFFBdFFRcHhEUUJCQlE4TFFRUVBDd0pBSUFOQklIRU5BQUpBSUFBdEFDaEJBVVlOQUNBQUx3RXlRZi8vQTNFaUFFR2NmMnBCNUFCSkRRQWdBRUhNQVVZTkFDQUFRYkFDUmcwQVFRUWhCU0FFUVNoeFJRMENJQU5CaUFSeFFZQUVSZzBDQzBFQUR3dEJBRUVESUFBcEF5QlFHeUVGQ3lBRkMySUJBbjlCQUNFQkFrQWdBQzBBS0VFQlJnMEFJQUF2QVRKQi8vOERjU0lDUVp4L2FrSGtBRWtOQUNBQ1Fjd0JSZzBBSUFKQnNBSkdEUUFnQUM4Qk1DSUFRY0FBY1EwQVFRRWhBU0FBUVlnRWNVR0FCRVlOQUNBQVFTaHhSU0VCQ3lBQkM2Y0JBUU4vQWtBQ1FBSkFJQUF0QUNwRkRRQWdBQzBBSzBVTkFFRUFJUU1nQUM4Qk1DSUVRUUp4UlEwQkRBSUxRUUFoQXlBQUx3RXdJZ1JCQVhGRkRRRUxRUUVoQXlBQUxRQW9RUUZHRFFBZ0FDOEJNa0gvL3dOeElnVkJuSDlxUWVRQVNRMEFJQVZCekFGR0RRQWdCVUd3QWtZTkFDQUVRY0FBY1EwQVFRQWhBeUFFUVlnRWNVR0FCRVlOQUNBRVFTaHhRUUJISVFNTElBQkJBRHNCTUNBQVFRQTZBQzhnQXd1WkFRRUNmd0pBQWtBQ1FDQUFMUUFxUlEwQUlBQXRBQ3RGRFFCQkFDRUJJQUF2QVRBaUFrRUNjVVVOQVF3Q0MwRUFJUUVnQUM4Qk1DSUNRUUZ4UlEwQkMwRUJJUUVnQUMwQUtFRUJSZzBBSUFBdkFUSkIvLzhEY1NJQVFaeC9ha0hrQUVrTkFDQUFRY3dCUmcwQUlBQkJzQUpHRFFBZ0FrSEFBSEVOQUVFQUlRRWdBa0dJQkhGQmdBUkdEUUFnQWtFb2NVRUFSeUVCQ3lBQkMwa0JBWHNnQUVFUWF2ME1BQUFBQUFBQUFBQUFBQUFBQUFBQUFDSUIvUXNEQUNBQUlBSDlDd01BSUFCQk1Hb2dBZjBMQXdBZ0FFRWdhaUFCL1FzREFDQUFRZDBCTmdJY1FRQUxld0VCZndKQUlBQW9BZ3dpQXcwQUFrQWdBQ2dDQkVVTkFDQUFJQUUyQWdRTEFrQWdBQ0FCSUFJUXhJQ0FnQUFpQXcwQUlBQW9BZ3dQQ3lBQUlBTTJBaHhCQUNFRElBQW9BZ1FpQVVVTkFDQUFJQUVnQWlBQUtBSUlFWUdBZ0lBQUFDSUJSUTBBSUFBZ0FqWUNGQ0FBSUFFMkFnd2dBU0VEQ3lBREMrVHpBUU1PZndOK0JIOGpnSUNBZ0FCQkVHc2lBeVNBZ0lDQUFDQUJJUVFnQVNFRklBRWhCaUFCSVFjZ0FTRUlJQUVoQ1NBQklRb2dBU0VMSUFFaERDQUJJUTBnQVNFT0lBRWhEd0pBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FBS0FJY0loQkJmMm9PM1FIYUFRSFpBUUlEQkFVR0J3Z0pDZ3NNRFE3WUFROFExd0VSRXRZQkV4UVZGaGNZR1JvYjRBSGZBUndkSHRVQkh5QWhJaU1rSmRRQkppY29LU29yTE5NQjBnRXRMdEVCMEFFdk1ERXlNelExTmpjNE9UbzdQRDArUDBCQlFrTkVSVWJiQVVkSVNVclBBYzRCUzgwQlRNd0JUVTVQVUZGU1UxUlZWbGRZV1ZwYlhGMWVYMkJoWW1Oa1pXWm5hR2xxYTJ4dGJtOXdjWEp6ZEhWMmQzaDVlbnQ4Zlg1L2dBR0JBWUlCZ3dHRUFZVUJoZ0dIQVlnQmlRR0tBWXNCakFHTkFZNEJqd0dRQVpFQmtnR1RBWlFCbFFHV0FaY0JtQUdaQVpvQm13R2NBWjBCbmdHZkFhQUJvUUdpQWFNQnBBR2xBYVlCcHdHb0Fha0JxZ0dyQWF3QnJRR3VBYThCc0FHeEFiSUJzd0cwQWJVQnRnRzNBY3NCeWdHNEFja0J1UUhJQWJvQnV3RzhBYjBCdmdHL0FjQUJ3UUhDQWNNQnhBSEZBY1lCQU53QkMwRUFJUkFNeGdFTFFRNGhFQXpGQVF0QkRTRVFETVFCQzBFUElSQU13d0VMUVJBaEVBekNBUXRCRXlFUURNRUJDMEVVSVJBTXdBRUxRUlVoRUF5L0FRdEJGaUVRREw0QkMwRVhJUkFNdlFFTFFSZ2hFQXk4QVF0QkdTRVFETHNCQzBFYUlSQU11Z0VMUVJzaEVBeTVBUXRCSENFUURMZ0JDMEVJSVJBTXR3RUxRUjBoRUF5MkFRdEJJQ0VRRExVQkMwRWZJUkFNdEFFTFFRY2hFQXl6QVF0QklTRVFETElCQzBFaUlSQU1zUUVMUVI0aEVBeXdBUXRCSXlFUURLOEJDMEVTSVJBTXJnRUxRUkVoRUF5dEFRdEJKQ0VRREt3QkMwRWxJUkFNcXdFTFFTWWhFQXlxQVF0Qkp5RVFES2tCQzBIREFTRVFES2dCQzBFcElSQU1wd0VMUVNzaEVBeW1BUXRCTENFUURLVUJDMEV0SVJBTXBBRUxRUzRoRUF5akFRdEJMeUVRREtJQkMwSEVBU0VRREtFQkMwRXdJUkFNb0FFTFFUUWhFQXlmQVF0QkRDRVFESjRCQzBFeElSQU1uUUVMUVRJaEVBeWNBUXRCTXlFUURKc0JDMEU1SVJBTW1nRUxRVFVoRUF5WkFRdEJ4UUVoRUF5WUFRdEJDeUVRREpjQkMwRTZJUkFNbGdFTFFUWWhFQXlWQVF0QkNpRVFESlFCQzBFM0lSQU1rd0VMUVRnaEVBeVNBUXRCUENFUURKRUJDMEU3SVJBTWtBRUxRVDBoRUF5UEFRdEJDU0VRREk0QkMwRW9JUkFNalFFTFFUNGhFQXlNQVF0QlB5RVFESXNCQzBIQUFDRVFESW9CQzBIQkFDRVFESWtCQzBIQ0FDRVFESWdCQzBIREFDRVFESWNCQzBIRUFDRVFESVlCQzBIRkFDRVFESVVCQzBIR0FDRVFESVFCQzBFcUlSQU1nd0VMUWNjQUlSQU1nZ0VMUWNnQUlSQU1nUUVMUWNrQUlSQU1nQUVMUWNvQUlSQU1md3RCeXdBaEVBeCtDMEhOQUNFUURIMExRY3dBSVJBTWZBdEJ6Z0FoRUF4N0MwSFBBQ0VRREhvTFFkQUFJUkFNZVF0QjBRQWhFQXg0QzBIU0FDRVFESGNMUWRNQUlSQU1kZ3RCMUFBaEVBeDFDMEhXQUNFUURIUUxRZFVBSVJBTWN3dEJCaUVRREhJTFFkY0FJUkFNY1F0QkJTRVFESEFMUWRnQUlSQU1id3RCQkNFUURHNExRZGtBSVJBTWJRdEIyZ0FoRUF4c0MwSGJBQ0VRREdzTFFkd0FJUkFNYWd0QkF5RVFER2tMUWQwQUlSQU1hQXRCM2dBaEVBeG5DMEhmQUNFUURHWUxRZUVBSVJBTVpRdEI0QUFoRUF4a0MwSGlBQ0VRREdNTFFlTUFJUkFNWWd0QkFpRVFER0VMUWVRQUlSQU1ZQXRCNVFBaEVBeGZDMEhtQUNFUURGNExRZWNBSVJBTVhRdEI2QUFoRUF4Y0MwSHBBQ0VRREZzTFFlb0FJUkFNV2d0QjZ3QWhFQXhaQzBIc0FDRVFERmdMUWUwQUlSQU1Wd3RCN2dBaEVBeFdDMEh2QUNFUURGVUxRZkFBSVJBTVZBdEI4UUFoRUF4VEMwSHlBQ0VRREZJTFFmTUFJUkFNVVF0QjlBQWhFQXhRQzBIMUFDRVFERThMUWZZQUlSQU1UZ3RCOXdBaEVBeE5DMEg0QUNFUURFd0xRZmtBSVJBTVN3dEIrZ0FoRUF4S0MwSDdBQ0VRREVrTFFmd0FJUkFNU0F0Qi9RQWhFQXhIQzBIK0FDRVFERVlMUWY4QUlSQU1SUXRCZ0FFaEVBeEVDMEdCQVNFUURFTUxRWUlCSVJBTVFndEJnd0VoRUF4QkMwR0VBU0VRREVBTFFZVUJJUkFNUHd0QmhnRWhFQXcrQzBHSEFTRVFERDBMUVlnQklSQU1QQXRCaVFFaEVBdzdDMEdLQVNFUUREb0xRWXNCSVJBTU9RdEJqQUVoRUF3NEMwR05BU0VRRERjTFFZNEJJUkFNTmd0Qmp3RWhFQXcxQzBHUUFTRVFERFFMUVpFQklSQU1Nd3RCa2dFaEVBd3lDMEdUQVNFUURERUxRWlFCSVJBTU1BdEJsUUVoRUF3dkMwR1dBU0VRREM0TFFaY0JJUkFNTFF0Qm1BRWhFQXdzQzBHWkFTRVFEQ3NMUVpvQklSQU1LZ3RCbXdFaEVBd3BDMEdjQVNFUURDZ0xRWjBCSVJBTUp3dEJuZ0VoRUF3bUMwR2ZBU0VRRENVTFFhQUJJUkFNSkF0Qm9RRWhFQXdqQzBHaUFTRVFEQ0lMUWFNQklSQU1JUXRCcEFFaEVBd2dDMEdsQVNFUURCOExRYVlCSVJBTUhndEJwd0VoRUF3ZEMwR29BU0VRREJ3TFFha0JJUkFNR3d0QnFnRWhFQXdhQzBHckFTRVFEQmtMUWF3QklSQU1HQXRCclFFaEVBd1hDMEd1QVNFUURCWUxRUUVoRUF3VkMwR3ZBU0VRREJRTFFiQUJJUkFNRXd0QnNRRWhFQXdTQzBHekFTRVFEQkVMUWJJQklSQU1FQXRCdEFFaEVBd1BDMEcxQVNFUURBNExRYllCSVJBTURRdEJ0d0VoRUF3TUMwRzRBU0VRREFzTFFia0JJUkFNQ2d0QnVnRWhFQXdKQzBHN0FTRVFEQWdMUWNZQklSQU1Cd3RCdkFFaEVBd0dDMEc5QVNFUURBVUxRYjRCSVJBTUJBdEJ2d0VoRUF3REMwSEFBU0VRREFJTFFjSUJJUkFNQVF0QndRRWhFQXNEUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlCQU94d0VBQVFJREJBVUdCd2dKQ2dzTURRNFBFQkVTRXhRVkZoY1lHUm9iSEI0ZklDRWpKU2cvUUVGRVJVWkhTRWxLUzB4TlQxQlJVbFBlQTFkWlcxeGRZR0psWm1kb2FXcHJiRzF2Y0hGeWMzUjFkbmQ0ZVhwN2ZIMStnQUdDQVlVQmhnR0hBWWtCaXdHTUFZMEJqZ0dQQVpBQmtRR1VBWlVCbGdHWEFaZ0JtUUdhQVpzQm5BR2RBWjRCbndHZ0FhRUJvZ0dqQWFRQnBRR21BYWNCcUFHcEFhb0Jxd0dzQWEwQnJnR3ZBYkFCc1FHeUFiTUJ0QUcxQWJZQnR3RzRBYmtCdWdHN0Fid0J2UUcrQWI4QndBSEJBY0lCd3dIRUFjVUJ4Z0hIQWNnQnlRSEtBY3NCekFITkFjNEJ6d0hRQWRFQjBnSFRBZFFCMVFIV0FkY0IyQUhaQWRvQjJ3SGNBZDBCM2dIZ0FlRUI0Z0hqQWVRQjVRSG1BZWNCNkFIcEFlb0I2d0hzQWUwQjdnSHZBZkFCOFFIeUFmTUJtUUtrQXJBQy9nTCtBZ3NnQVNJRUlBSkhEZk1CUWQwQklSQU0vd01MSUFFaUVDQUNSdzNkQVVIREFTRVFEUDREQ3lBQklnRWdBa2NOa0FGQjl3QWhFQXo5QXdzZ0FTSUJJQUpIRFlZQlFlOEFJUkFNL0FNTElBRWlBU0FDUncxL1Flb0FJUkFNK3dNTElBRWlBU0FDUncxN1FlZ0FJUkFNK2dNTElBRWlBU0FDUncxNFFlWUFJUkFNK1FNTElBRWlBU0FDUncwYVFSZ2hFQXo0QXdzZ0FTSUJJQUpIRFJSQkVpRVFEUGNEQ3lBQklnRWdBa2NOV1VIRkFDRVFEUFlEQ3lBQklnRWdBa2NOU2tFL0lSQU05UU1MSUFFaUFTQUNSdzFJUVR3aEVBejBBd3NnQVNJQklBSkhEVUZCTVNFUURQTURDeUFBTFFBdVFRRkdEZXNEREljQ0N5QUFJQUVpQVNBQ0VNQ0FnSUFBUVFGSERlWUJJQUJDQURjRElBem5BUXNnQUNBQklnRWdBaEMwZ0lDQUFDSVFEZWNCSUFFaEFRejFBZ3NDUUNBQklnRWdBa2NOQUVFR0lSQU04QU1MSUFBZ0FVRUJhaUlCSUFJUXU0Q0FnQUFpRUEzb0FTQUJJUUVNTVFzZ0FFSUFOd01nUVJJaEVBelZBd3NnQVNJUUlBSkhEU3RCSFNFUURPMERDd0pBSUFFaUFTQUNSZzBBSUFGQkFXb2hBVUVRSVJBTTFBTUxRUWNoRUF6c0F3c2dBRUlBSUFBcEF5QWlFU0FDSUFFaUVHdXRJaEo5SWhNZ0V5QVJWaHMzQXlBZ0VTQVNWaUlVUlEzbEFVRUlJUkFNNndNTEFrQWdBU0lCSUFKR0RRQWdBRUdKZ0lDQUFEWUNDQ0FBSUFFMkFnUWdBU0VCUVJRaEVBelNBd3RCQ1NFUURPb0RDeUFCSVFFZ0FDa0RJRkFONUFFZ0FTRUJEUElDQ3dKQUlBRWlBU0FDUncwQVFRc2hFQXpwQXdzZ0FDQUJRUUZxSWdFZ0FoQzJnSUNBQUNJUURlVUJJQUVoQVF6eUFnc2dBQ0FCSWdFZ0FoQzRnSUNBQUNJUURlVUJJQUVoQVF6eUFnc2dBQ0FCSWdFZ0FoQzRnSUNBQUNJUURlWUJJQUVoQVF3TkN5QUFJQUVpQVNBQ0VMcUFnSUFBSWhBTjV3RWdBU0VCRFBBQ0N3SkFJQUVpQVNBQ1J3MEFRUThoRUF6bEF3c2dBUzBBQUNJUVFUdEdEUWdnRUVFTlJ3M29BU0FCUVFGcUlRRU03d0lMSUFBZ0FTSUJJQUlRdW9DQWdBQWlFQTNvQVNBQklRRU04Z0lMQTBBQ1FDQUJMUUFBUWZDMWdJQUFhaTBBQUNJUVFRRkdEUUFnRUVFQ1J3M3JBU0FBS0FJRUlSQWdBRUVBTmdJRUlBQWdFQ0FCUVFGcUlnRVF1WUNBZ0FBaUVBM3FBU0FCSVFFTTlBSUxJQUZCQVdvaUFTQUNSdzBBQzBFU0lSQU00Z01MSUFBZ0FTSUJJQUlRdW9DQWdBQWlFQTNwQVNBQklRRU1DZ3NnQVNJQklBSkhEUVpCR3lFUURPQURDd0pBSUFFaUFTQUNSdzBBUVJZaEVBemdBd3NnQUVHS2dJQ0FBRFlDQ0NBQUlBRTJBZ1FnQUNBQklBSVF1SUNBZ0FBaUVBM3FBU0FCSVFGQklDRVFETVlEQ3dKQUlBRWlBU0FDUmcwQUEwQUNRQ0FCTFFBQVFmQzNnSUFBYWkwQUFDSVFRUUpHRFFBQ1FDQVFRWDlxRGdUbEFld0JBT3NCN0FFTElBRkJBV29oQVVFSUlSQU15QU1MSUFGQkFXb2lBU0FDUncwQUMwRVZJUkFNM3dNTFFSVWhFQXplQXdzRFFBSkFJQUV0QUFCQjhMbUFnQUJxTFFBQUloQkJBa1lOQUNBUVFYOXFEZ1RlQWV3QjRBSHJBZXdCQ3lBQlFRRnFJZ0VnQWtjTkFBdEJHQ0VRRE4wREN3SkFJQUVpQVNBQ1JnMEFJQUJCaTRDQWdBQTJBZ2dnQUNBQk5nSUVJQUVoQVVFSElSQU14QU1MUVJraEVBemNBd3NnQVVFQmFpRUJEQUlMQWtBZ0FTSVVJQUpIRFFCQkdpRVFETnNEQ3lBVUlRRUNRQ0FVTFFBQVFYTnFEaFRkQXU0QzdnTHVBdTRDN2dMdUF1NEM3Z0x1QXU0QzdnTHVBdTRDN2dMdUF1NEM3Z0x1QWdEdUFndEJBQ0VRSUFCQkFEWUNIQ0FBUWErTGdJQUFOZ0lRSUFCQkFqWUNEQ0FBSUJSQkFXbzJBaFFNMmdNTEFrQWdBUzBBQUNJUVFUdEdEUUFnRUVFTlJ3M29BU0FCUVFGcUlRRU01UUlMSUFGQkFXb2hBUXRCSWlFUURMOERDd0pBSUFFaUVDQUNSdzBBUVJ3aEVBellBd3RDQUNFUklCQWhBU0FRTFFBQVFWQnFEamZuQWVZQkFRSURCQVVHQndnQUFBQUFBQUFBQ1FvTERBME9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVBFQkVTRXhRQUMwRWVJUkFNdlFNTFFnSWhFUXpsQVF0Q0F5RVJET1FCQzBJRUlSRU00d0VMUWdVaEVRemlBUXRDQmlFUkRPRUJDMElISVJFTTRBRUxRZ2doRVF6ZkFRdENDU0VSRE40QkMwSUtJUkVNM1FFTFFnc2hFUXpjQVF0Q0RDRVJETnNCQzBJTklSRU0yZ0VMUWc0aEVRelpBUXRDRHlFUkROZ0JDMElLSVJFTTF3RUxRZ3NoRVF6V0FRdENEQ0VSRE5VQkMwSU5JUkVNMUFFTFFnNGhFUXpUQVF0Q0R5RVJETklCQzBJQUlSRUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUJBdEFBQkJVR29PTitVQjVBRUFBUUlEQkFVR0IrWUI1Z0htQWVZQjVnSG1BZVlCQ0FrS0N3d041Z0htQWVZQjVnSG1BZVlCNWdIbUFlWUI1Z0htQWVZQjVnSG1BZVlCNWdIbUFlWUI1Z0htQWVZQjVnSG1BZVlCNWdIbUFRNFBFQkVTRStZQkMwSUNJUkVNNUFFTFFnTWhFUXpqQVF0Q0JDRVJET0lCQzBJRklSRU00UUVMUWdZaEVRemdBUXRDQnlFUkROOEJDMElJSVJFTTNnRUxRZ2toRVF6ZEFRdENDaUVSRE53QkMwSUxJUkVNMndFTFFnd2hFUXphQVF0Q0RTRVJETmtCQzBJT0lSRU0yQUVMUWc4aEVRelhBUXRDQ2lFUkROWUJDMElMSVJFTTFRRUxRZ3doRVF6VUFRdENEU0VSRE5NQkMwSU9JUkVNMGdFTFFnOGhFUXpSQVFzZ0FFSUFJQUFwQXlBaUVTQUNJQUVpRUd1dEloSjlJaE1nRXlBUlZoczNBeUFnRVNBU1ZpSVVSUTNTQVVFZklSQU13QU1MQWtBZ0FTSUJJQUpHRFFBZ0FFR0pnSUNBQURZQ0NDQUFJQUUyQWdRZ0FTRUJRU1FoRUF5bkF3dEJJQ0VRREw4REN5QUFJQUVpRUNBQ0VMNkFnSUFBUVg5cURnVzJBUURGQWdIUkFkSUJDMEVSSVJBTXBBTUxJQUJCQVRvQUx5QVFJUUVNdXdNTElBRWlBU0FDUnczU0FVRWtJUkFNdXdNTElBRWlEU0FDUncwZVFjWUFJUkFNdWdNTElBQWdBU0lCSUFJUXNvQ0FnQUFpRUEzVUFTQUJJUUVNdFFFTElBRWlFQ0FDUncwbVFkQUFJUkFNdUFNTEFrQWdBU0lCSUFKSERRQkJLQ0VRRExnREN5QUFRUUEyQWdRZ0FFR01nSUNBQURZQ0NDQUFJQUVnQVJDeGdJQ0FBQ0lRRGRNQklBRWhBUXpZQVFzQ1FDQUJJaEFnQWtjTkFFRXBJUkFNdHdNTElCQXRBQUFpQVVFZ1JnMFVJQUZCQ1VjTjB3RWdFRUVCYWlFQkRCVUxBa0FnQVNJQklBSkdEUUFnQVVFQmFpRUJEQmNMUVNvaEVBeTFBd3NDUUNBQkloQWdBa2NOQUVFcklSQU10UU1MQWtBZ0VDMEFBQ0lCUVFsR0RRQWdBVUVnUnczVkFRc2dBQzBBTEVFSVJnM1RBU0FRSVFFTWtRTUxBa0FnQVNJQklBSkhEUUJCTENFUURMUURDeUFCTFFBQVFRcEhEZFVCSUFGQkFXb2hBUXpKQWdzZ0FTSU9JQUpIRGRVQlFTOGhFQXl5QXdzRFFBSkFJQUV0QUFBaUVFRWdSZzBBQWtBZ0VFRjJhZzRFQU53QjNBRUEyZ0VMSUFFaEFRemdBUXNnQVVFQmFpSUJJQUpIRFFBTFFURWhFQXl4QXd0Qk1pRVFJQUVpRkNBQ1JnMndBeUFDSUJScklBQW9BZ0FpQVdvaEZTQVVJQUZyUVFOcUlSWUNRQU5BSUJRdEFBQWlGMEVnY2lBWElCZEJ2MzlxUWY4QmNVRWFTUnRCL3dGeElBRkI4THVBZ0FCcUxRQUFSdzBCQWtBZ0FVRURSdzBBUVFZaEFReVdBd3NnQVVFQmFpRUJJQlJCQVdvaUZDQUNSdzBBQ3lBQUlCVTJBZ0FNc1FNTElBQkJBRFlDQUNBVUlRRU0yUUVMUVRNaEVDQUJJaFFnQWtZTnJ3TWdBaUFVYXlBQUtBSUFJZ0ZxSVJVZ0ZDQUJhMEVJYWlFV0FrQURRQ0FVTFFBQUloZEJJSElnRnlBWFFiOS9ha0gvQVhGQkdra2JRZjhCY1NBQlFmUzdnSUFBYWkwQUFFY05BUUpBSUFGQkNFY05BRUVGSVFFTWxRTUxJQUZCQVdvaEFTQVVRUUZxSWhRZ0FrY05BQXNnQUNBVk5nSUFETEFEQ3lBQVFRQTJBZ0FnRkNFQkROZ0JDMEUwSVJBZ0FTSVVJQUpHRGE0RElBSWdGR3NnQUNnQ0FDSUJhaUVWSUJRZ0FXdEJCV29oRmdKQUEwQWdGQzBBQUNJWFFTQnlJQmNnRjBHL2YycEIvd0Z4UVJwSkcwSC9BWEVnQVVIUXdvQ0FBR290QUFCSERRRUNRQ0FCUVFWSERRQkJCeUVCREpRREN5QUJRUUZxSVFFZ0ZFRUJhaUlVSUFKSERRQUxJQUFnRlRZQ0FBeXZBd3NnQUVFQU5nSUFJQlFoQVF6WEFRc0NRQ0FCSWdFZ0FrWU5BQU5BQWtBZ0FTMEFBRUdBdm9DQUFHb3RBQUFpRUVFQlJnMEFJQkJCQWtZTkNpQUJJUUVNM1FFTElBRkJBV29pQVNBQ1J3MEFDMEV3SVJBTXJnTUxRVEFoRUF5dEF3c0NRQ0FCSWdFZ0FrWU5BQU5BQWtBZ0FTMEFBQ0lRUVNCR0RRQWdFRUYyYWc0RTJRSGFBZG9CMlFIYUFRc2dBVUVCYWlJQklBSkhEUUFMUVRnaEVBeXRBd3RCT0NFUURLd0RDd05BQWtBZ0FTMEFBQ0lRUVNCR0RRQWdFRUVKUncwREN5QUJRUUZxSWdFZ0FrY05BQXRCUENFUURLc0RDd05BQWtBZ0FTMEFBQ0lRUVNCR0RRQUNRQUpBSUJCQmRtb09CTm9CQVFIYUFRQUxJQkJCTEVZTjJ3RUxJQUVoQVF3RUN5QUJRUUZxSWdFZ0FrY05BQXRCUHlFUURLb0RDeUFCSVFFTTJ3RUxRY0FBSVJBZ0FTSVVJQUpHRGFnRElBSWdGR3NnQUNnQ0FDSUJhaUVXSUJRZ0FXdEJCbW9oRndKQUEwQWdGQzBBQUVFZ2NpQUJRWURBZ0lBQWFpMEFBRWNOQVNBQlFRWkdEWTRESUFGQkFXb2hBU0FVUVFGcUloUWdBa2NOQUFzZ0FDQVdOZ0lBREtrREN5QUFRUUEyQWdBZ0ZDRUJDMEUySVJBTWpnTUxBa0FnQVNJUElBSkhEUUJCd1FBaEVBeW5Bd3NnQUVHTWdJQ0FBRFlDQ0NBQUlBODJBZ1FnRHlFQklBQXRBQ3hCZjJvT0JNMEIxUUhYQWRrQmh3TUxJQUZCQVdvaEFRek1BUXNDUUNBQklnRWdBa1lOQUFOQUFrQWdBUzBBQUNJUVFTQnlJQkFnRUVHL2YycEIvd0Z4UVJwSkcwSC9BWEVpRUVFSlJnMEFJQkJCSUVZTkFBSkFBa0FDUUFKQUlCQkJuWDlxRGhNQUF3TURBd01EQXdFREF3TURBd01EQXdNQ0F3c2dBVUVCYWlFQlFURWhFQXlSQXdzZ0FVRUJhaUVCUVRJaEVBeVFBd3NnQVVFQmFpRUJRVE1oRUF5UEF3c2dBU0VCRE5BQkN5QUJRUUZxSWdFZ0FrY05BQXRCTlNFUURLVURDMEUxSVJBTXBBTUxBa0FnQVNJQklBSkdEUUFEUUFKQUlBRXRBQUJCZ0x5QWdBQnFMUUFBUVFGR0RRQWdBU0VCRE5NQkN5QUJRUUZxSWdFZ0FrY05BQXRCUFNFUURLUURDMEU5SVJBTW93TUxJQUFnQVNJQklBSVFzSUNBZ0FBaUVBM1dBU0FCSVFFTUFRc2dFRUVCYWlFQkMwRThJUkFNaHdNTEFrQWdBU0lCSUFKSERRQkJ3Z0FoRUF5Z0F3c0NRQU5BQWtBZ0FTMEFBRUYzYWc0WUFBTCtBdjRDaEFQK0F2NEMvZ0wrQXY0Qy9nTCtBdjRDL2dMK0F2NEMvZ0wrQXY0Qy9nTCtBdjRDL2dJQS9nSUxJQUZCQVdvaUFTQUNSdzBBQzBIQ0FDRVFES0FEQ3lBQlFRRnFJUUVnQUMwQUxVRUJjVVVOdlFFZ0FTRUJDMEVzSVJBTWhRTUxJQUVpQVNBQ1J3M1RBVUhFQUNFUURKMERDd05BQWtBZ0FTMEFBRUdRd0lDQUFHb3RBQUJCQVVZTkFDQUJJUUVNdHdJTElBRkJBV29pQVNBQ1J3MEFDMEhGQUNFUURKd0RDeUFOTFFBQUloQkJJRVlOc3dFZ0VFRTZSdzJCQXlBQUtBSUVJUUVnQUVFQU5nSUVJQUFnQVNBTkVLK0FnSUFBSWdFTjBBRWdEVUVCYWlFQkRMTUNDMEhIQUNFUUlBRWlEU0FDUmcyYUF5QUNJQTFySUFBb0FnQWlBV29oRmlBTklBRnJRUVZxSVJjRFFDQU5MUUFBSWhSQklISWdGQ0FVUWI5L2FrSC9BWEZCR2trYlFmOEJjU0FCUVpEQ2dJQUFhaTBBQUVjTmdBTWdBVUVGUmczMEFpQUJRUUZxSVFFZ0RVRUJhaUlOSUFKSERRQUxJQUFnRmpZQ0FBeWFBd3RCeUFBaEVDQUJJZzBnQWtZTm1RTWdBaUFOYXlBQUtBSUFJZ0ZxSVJZZ0RTQUJhMEVKYWlFWEEwQWdEUzBBQUNJVVFTQnlJQlFnRkVHL2YycEIvd0Z4UVJwSkcwSC9BWEVnQVVHV3dvQ0FBR290QUFCSERmOENBa0FnQVVFSlJ3MEFRUUloQVF6MUFnc2dBVUVCYWlFQklBMUJBV29pRFNBQ1J3MEFDeUFBSUJZMkFnQU1tUU1MQWtBZ0FTSU5JQUpIRFFCQnlRQWhFQXlaQXdzQ1FBSkFJQTB0QUFBaUFVRWdjaUFCSUFGQnYzOXFRZjhCY1VFYVNSdEIvd0Z4UVpKL2FnNEhBSUFEZ0FPQUE0QURnQU1CZ0FNTElBMUJBV29oQVVFK0lSQU1nQU1MSUExQkFXb2hBVUUvSVJBTS93SUxRY29BSVJBZ0FTSU5JQUpHRFpjRElBSWdEV3NnQUNnQ0FDSUJhaUVXSUEwZ0FXdEJBV29oRndOQUlBMHRBQUFpRkVFZ2NpQVVJQlJCdjM5cVFmOEJjVUVhU1J0Qi93RnhJQUZCb01LQWdBQnFMUUFBUnczOUFpQUJRUUZHRGZBQ0lBRkJBV29oQVNBTlFRRnFJZzBnQWtjTkFBc2dBQ0FXTmdJQURKY0RDMEhMQUNFUUlBRWlEU0FDUmcyV0F5QUNJQTFySUFBb0FnQWlBV29oRmlBTklBRnJRUTVxSVJjRFFDQU5MUUFBSWhSQklISWdGQ0FVUWI5L2FrSC9BWEZCR2trYlFmOEJjU0FCUWFMQ2dJQUFhaTBBQUVjTi9BSWdBVUVPUmczd0FpQUJRUUZxSVFFZ0RVRUJhaUlOSUFKSERRQUxJQUFnRmpZQ0FBeVdBd3RCekFBaEVDQUJJZzBnQWtZTmxRTWdBaUFOYXlBQUtBSUFJZ0ZxSVJZZ0RTQUJhMEVQYWlFWEEwQWdEUzBBQUNJVVFTQnlJQlFnRkVHL2YycEIvd0Z4UVJwSkcwSC9BWEVnQVVIQXdvQ0FBR290QUFCSERmc0NBa0FnQVVFUFJ3MEFRUU1oQVF6eEFnc2dBVUVCYWlFQklBMUJBV29pRFNBQ1J3MEFDeUFBSUJZMkFnQU1sUU1MUWMwQUlSQWdBU0lOSUFKR0RaUURJQUlnRFdzZ0FDZ0NBQ0lCYWlFV0lBMGdBV3RCQldvaEZ3TkFJQTB0QUFBaUZFRWdjaUFVSUJSQnYzOXFRZjhCY1VFYVNSdEIvd0Z4SUFGQjBNS0FnQUJxTFFBQVJ3MzZBZ0pBSUFGQkJVY05BRUVFSVFFTThBSUxJQUZCQVdvaEFTQU5RUUZxSWcwZ0FrY05BQXNnQUNBV05nSUFESlFEQ3dKQUlBRWlEU0FDUncwQVFjNEFJUkFNbEFNTEFrQUNRQUpBQWtBZ0RTMEFBQ0lCUVNCeUlBRWdBVUcvZjJwQi93RnhRUnBKRzBIL0FYRkJuWDlxRGhNQS9RTDlBdjBDL1FMOUF2MEMvUUw5QXYwQy9RTDlBdjBDQWYwQy9RTDlBZ0lEL1FJTElBMUJBV29oQVVIQkFDRVFEUDBDQ3lBTlFRRnFJUUZCd2dBaEVBejhBZ3NnRFVFQmFpRUJRY01BSVJBTSt3SUxJQTFCQVdvaEFVSEVBQ0VRRFBvQ0N3SkFJQUVpQVNBQ1JnMEFJQUJCallDQWdBQTJBZ2dnQUNBQk5nSUVJQUVoQVVIRkFDRVFEUG9DQzBIUEFDRVFESklEQ3lBUUlRRUNRQUpBSUJBdEFBQkJkbW9PQkFHb0FxZ0NBS2dDQ3lBUVFRRnFJUUVMUVNjaEVBejRBZ3NDUUNBQklnRWdBa2NOQUVIUkFDRVFESkVEQ3dKQUlBRXRBQUJCSUVZTkFDQUJJUUVNalFFTElBRkJBV29oQVNBQUxRQXRRUUZ4UlEzSEFTQUJJUUVNakFFTElBRWlGeUFDUnczSUFVSFNBQ0VRREk4REMwSFRBQ0VRSUFFaUZDQUNSZzJPQXlBQ0lCUnJJQUFvQWdBaUFXb2hGaUFVSUFGclFRRnFJUmNEUUNBVUxRQUFJQUZCMXNLQWdBQnFMUUFBUnczTUFTQUJRUUZHRGNjQklBRkJBV29oQVNBVVFRRnFJaFFnQWtjTkFBc2dBQ0FXTmdJQURJNERDd0pBSUFFaUFTQUNSdzBBUWRVQUlSQU1qZ01MSUFFdEFBQkJDa2NOekFFZ0FVRUJhaUVCRE1jQkN3SkFJQUVpQVNBQ1J3MEFRZFlBSVJBTWpRTUxBa0FDUUNBQkxRQUFRWFpxRGdRQXpRSE5BUUhOQVFzZ0FVRUJhaUVCRE1jQkN5QUJRUUZxSVFGQnlnQWhFQXp6QWdzZ0FDQUJJZ0VnQWhDdWdJQ0FBQ0lRRGNzQklBRWhBVUhOQUNFUURQSUNDeUFBTFFBcFFTSkdEWVVEREtZQ0N3SkFJQUVpQVNBQ1J3MEFRZHNBSVJBTWlnTUxRUUFoRkVFQklSZEJBU0VXUVFBaEVBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUJMUUFBUVZCcURnclVBZE1CQUFFQ0F3UUZCZ2pWQVF0QkFpRVFEQVlMUVFNaEVBd0ZDMEVFSVJBTUJBdEJCU0VRREFNTFFRWWhFQXdDQzBFSElSQU1BUXRCQ0NFUUMwRUFJUmRCQUNFV1FRQWhGQXpNQVF0QkNTRVFRUUVoRkVFQUlSZEJBQ0VXRE1zQkN3SkFJQUVpQVNBQ1J3MEFRZDBBSVJBTWlRTUxJQUV0QUFCQkxrY056QUVnQVVFQmFpRUJES1lDQ3lBQklnRWdBa2NOekFGQjN3QWhFQXlIQXdzQ1FDQUJJZ0VnQWtZTkFDQUFRWTZBZ0lBQU5nSUlJQUFnQVRZQ0JDQUJJUUZCMEFBaEVBenVBZ3RCNEFBaEVBeUdBd3RCNFFBaEVDQUJJZ0VnQWtZTmhRTWdBaUFCYXlBQUtBSUFJaFJxSVJZZ0FTQVVhMEVEYWlFWEEwQWdBUzBBQUNBVVFlTENnSUFBYWkwQUFFY056UUVnRkVFRFJnM01BU0FVUVFGcUlSUWdBVUVCYWlJQklBSkhEUUFMSUFBZ0ZqWUNBQXlGQXd0QjRnQWhFQ0FCSWdFZ0FrWU5oQU1nQWlBQmF5QUFLQUlBSWhScUlSWWdBU0FVYTBFQ2FpRVhBMEFnQVMwQUFDQVVRZWJDZ0lBQWFpMEFBRWNOekFFZ0ZFRUNSZzNPQVNBVVFRRnFJUlFnQVVFQmFpSUJJQUpIRFFBTElBQWdGallDQUF5RUF3dEI0d0FoRUNBQklnRWdBa1lOZ3dNZ0FpQUJheUFBS0FJQUloUnFJUllnQVNBVWEwRURhaUVYQTBBZ0FTMEFBQ0FVUWVuQ2dJQUFhaTBBQUVjTnl3RWdGRUVEUmczT0FTQVVRUUZxSVJRZ0FVRUJhaUlCSUFKSERRQUxJQUFnRmpZQ0FBeURBd3NDUUNBQklnRWdBa2NOQUVIbEFDRVFESU1EQ3lBQUlBRkJBV29pQVNBQ0VLaUFnSUFBSWhBTnpRRWdBU0VCUWRZQUlSQU02UUlMQWtBZ0FTSUJJQUpHRFFBRFFBSkFJQUV0QUFBaUVFRWdSZzBBQWtBQ1FBSkFJQkJCdUg5cURnc0FBYzhCendIUEFjOEJ6d0hQQWM4Qnp3RUN6d0VMSUFGQkFXb2hBVUhTQUNFUURPMENDeUFCUVFGcUlRRkIwd0FoRUF6c0Fnc2dBVUVCYWlFQlFkUUFJUkFNNndJTElBRkJBV29pQVNBQ1J3MEFDMEhrQUNFUURJSURDMEhrQUNFUURJRURDd05BQWtBZ0FTMEFBRUh3d29DQUFHb3RBQUFpRUVFQlJnMEFJQkJCZm1vT0E4OEIwQUhSQWRJQkN5QUJRUUZxSWdFZ0FrY05BQXRCNWdBaEVBeUFBd3NDUUNBQklnRWdBa1lOQUNBQlFRRnFJUUVNQXd0QjV3QWhFQXovQWdzRFFBSkFJQUV0QUFCQjhNU0FnQUJxTFFBQUloQkJBVVlOQUFKQUlCQkJmbW9PQk5JQjB3SFVBUURWQVFzZ0FTRUJRZGNBSVJBTTV3SUxJQUZCQVdvaUFTQUNSdzBBQzBIb0FDRVFEUDRDQ3dKQUlBRWlBU0FDUncwQVFla0FJUkFNL2dJTEFrQWdBUzBBQUNJUVFYWnFEaHE2QWRVQjFRRzhBZFVCMVFIVkFkVUIxUUhWQWRVQjFRSFZBZFVCMVFIVkFkVUIxUUhWQWRVQjFRSFZBY29CMVFIVkFRRFRBUXNnQVVFQmFpRUJDMEVHSVJBTTR3SUxBMEFDUUNBQkxRQUFRZkRHZ0lBQWFpMEFBRUVCUmcwQUlBRWhBUXllQWdzZ0FVRUJhaUlCSUFKSERRQUxRZW9BSVJBTSt3SUxBa0FnQVNJQklBSkdEUUFnQVVFQmFpRUJEQU1MUWVzQUlSQU0rZ0lMQWtBZ0FTSUJJQUpIRFFCQjdBQWhFQXo2QWdzZ0FVRUJhaUVCREFFTEFrQWdBU0lCSUFKSERRQkI3UUFoRUF6NUFnc2dBVUVCYWlFQkMwRUVJUkFNM2dJTEFrQWdBU0lVSUFKSERRQkI3Z0FoRUF6M0Fnc2dGQ0VCQWtBQ1FBSkFJQlF0QUFCQjhNaUFnQUJxTFFBQVFYOXFEZ2ZVQWRVQjFnRUFuQUlCQXRjQkN5QVVRUUZxSVFFTUNnc2dGRUVCYWlFQkRNMEJDMEVBSVJBZ0FFRUFOZ0ljSUFCQm01S0FnQUEyQWhBZ0FFRUhOZ0lNSUFBZ0ZFRUJhallDRkF6MkFnc0NRQU5BQWtBZ0FTMEFBRUh3eUlDQUFHb3RBQUFpRUVFRVJnMEFBa0FDUUNBUVFYOXFEZ2ZTQWRNQjFBSFpBUUFFQWRrQkN5QUJJUUZCMmdBaEVBemdBZ3NnQVVFQmFpRUJRZHdBSVJBTTN3SUxJQUZCQVdvaUFTQUNSdzBBQzBIdkFDRVFEUFlDQ3lBQlFRRnFJUUVNeXdFTEFrQWdBU0lVSUFKSERRQkI4QUFoRUF6MUFnc2dGQzBBQUVFdlJ3M1VBU0FVUVFGcUlRRU1CZ3NDUUNBQkloUWdBa2NOQUVIeEFDRVFEUFFDQ3dKQUlCUXRBQUFpQVVFdlJ3MEFJQlJCQVdvaEFVSGRBQ0VRRE5zQ0N5QUJRWFpxSWdSQkZrc04wd0ZCQVNBRWRFR0pnSUFDY1VVTjB3RU15Z0lMQWtBZ0FTSUJJQUpHRFFBZ0FVRUJhaUVCUWQ0QUlSQU0yZ0lMUWZJQUlSQU04Z0lMQWtBZ0FTSVVJQUpIRFFCQjlBQWhFQXp5QWdzZ0ZDRUJBa0FnRkMwQUFFSHd6SUNBQUdvdEFBQkJmMm9PQThrQ2xBSUExQUVMUWVFQUlSQU0yQUlMQWtBZ0FTSVVJQUpHRFFBRFFBSkFJQlF0QUFCQjhNcUFnQUJxTFFBQUlnRkJBMFlOQUFKQUlBRkJmMm9PQXNzQ0FOVUJDeUFVSVFGQjN3QWhFQXphQWdzZ0ZFRUJhaUlVSUFKSERRQUxRZk1BSVJBTThRSUxRZk1BSVJBTThBSUxBa0FnQVNJQklBSkdEUUFnQUVHUGdJQ0FBRFlDQ0NBQUlBRTJBZ1FnQVNFQlFlQUFJUkFNMXdJTFFmVUFJUkFNN3dJTEFrQWdBU0lCSUFKSERRQkI5Z0FoRUF6dkFnc2dBRUdQZ0lDQUFEWUNDQ0FBSUFFMkFnUWdBU0VCQzBFRElSQU0xQUlMQTBBZ0FTMEFBRUVnUnczREFpQUJRUUZxSWdFZ0FrY05BQXRCOXdBaEVBenNBZ3NDUUNBQklnRWdBa2NOQUVINEFDRVFET3dDQ3lBQkxRQUFRU0JIRGM0QklBRkJBV29oQVF6dkFRc2dBQ0FCSWdFZ0FoQ3NnSUNBQUNJUURjNEJJQUVoQVF5T0Fnc0NRQ0FCSWdRZ0FrY05BRUg2QUNFUURPb0NDeUFFTFFBQVFjd0FSdzNSQVNBRVFRRnFJUUZCRXlFUURNOEJDd0pBSUFFaUJDQUNSdzBBUWZzQUlSQU02UUlMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkJXb2hFQU5BSUFRdEFBQWdBVUh3em9DQUFHb3RBQUJIRGRBQklBRkJCVVlOemdFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQit3QWhFQXpvQWdzQ1FDQUJJZ1FnQWtjTkFFSDhBQ0VRRE9nQ0N3SkFBa0FnQkMwQUFFRzlmMm9PREFEUkFkRUIwUUhSQWRFQjBRSFJBZEVCMFFIUkFRSFJBUXNnQkVFQmFpRUJRZVlBSVJBTXp3SUxJQVJCQVdvaEFVSG5BQ0VRRE00Q0N3SkFJQUVpQkNBQ1J3MEFRZjBBSVJBTTV3SUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQW1vaEVBSkFBMEFnQkMwQUFDQUJRZTNQZ0lBQWFpMEFBRWNOendFZ0FVRUNSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUWYwQUlSQU01d0lMSUFCQkFEWUNBQ0FRUVFGcUlRRkJFQ0VRRE13QkN3SkFJQUVpQkNBQ1J3MEFRZjRBSVJBTTVnSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQldvaEVBSkFBMEFnQkMwQUFDQUJRZmJPZ0lBQWFpMEFBRWNOemdFZ0FVRUZSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUWY0QUlSQU01Z0lMSUFCQkFEWUNBQ0FRUVFGcUlRRkJGaUVRRE1zQkN3SkFJQUVpQkNBQ1J3MEFRZjhBSVJBTTVRSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQTJvaEVBSkFBMEFnQkMwQUFDQUJRZnpPZ0lBQWFpMEFBRWNOelFFZ0FVRURSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUWY4QUlSQU01UUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJCU0VRRE1vQkN3SkFJQUVpQkNBQ1J3MEFRWUFCSVJBTTVBSUxJQVF0QUFCQjJRQkhEY3NCSUFSQkFXb2hBVUVJSVJBTXlRRUxBa0FnQVNJRUlBSkhEUUJCZ1FFaEVBempBZ3NDUUFKQUlBUXRBQUJCc245cURnTUF6QUVCekFFTElBUkJBV29oQVVIckFDRVFETW9DQ3lBRVFRRnFJUUZCN0FBaEVBekpBZ3NDUUNBQklnUWdBa2NOQUVHQ0FTRVFET0lDQ3dKQUFrQWdCQzBBQUVHNGYyb09DQURMQWNzQnl3SExBY3NCeXdFQnl3RUxJQVJCQVdvaEFVSHFBQ0VRRE1rQ0N5QUVRUUZxSVFGQjdRQWhFQXpJQWdzQ1FDQUJJZ1FnQWtjTkFFR0RBU0VRRE9FQ0N5QUNJQVJySUFBb0FnQWlBV29oRUNBRUlBRnJRUUpxSVJRQ1FBTkFJQVF0QUFBZ0FVR0F6NENBQUdvdEFBQkhEY2tCSUFGQkFrWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0VEWUNBRUdEQVNFUURPRUNDMEVBSVJBZ0FFRUFOZ0lBSUJSQkFXb2hBUXpHQVFzQ1FDQUJJZ1FnQWtjTkFFR0VBU0VRRE9BQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUVJxSVJBQ1FBTkFJQVF0QUFBZ0FVR0R6NENBQUdvdEFBQkhEY2dCSUFGQkJFWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUdFQVNFUURPQUNDeUFBUVFBMkFnQWdFRUVCYWlFQlFTTWhFQXpGQVFzQ1FDQUJJZ1FnQWtjTkFFR0ZBU0VRRE44Q0N3SkFBa0FnQkMwQUFFRzBmMm9PQ0FESUFjZ0J5QUhJQWNnQnlBRUJ5QUVMSUFSQkFXb2hBVUh2QUNFUURNWUNDeUFFUVFGcUlRRkI4QUFoRUF6RkFnc0NRQ0FCSWdRZ0FrY05BRUdHQVNFUURONENDeUFFTFFBQVFjVUFSdzNGQVNBRVFRRnFJUUVNZ3dJTEFrQWdBU0lFSUFKSERRQkJod0VoRUF6ZEFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVEYWlFUUFrQURRQ0FFTFFBQUlBRkJpTStBZ0FCcUxRQUFSdzNGQVNBQlFRTkdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCaHdFaEVBemRBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRXRJUkFNd2dFTEFrQWdBU0lFSUFKSERRQkJpQUVoRUF6Y0Fnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVJYWlFUUFrQURRQ0FFTFFBQUlBRkIwTStBZ0FCcUxRQUFSdzNFQVNBQlFRaEdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCaUFFaEVBemNBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRXBJUkFNd1FFTEFrQWdBU0lCSUFKSERRQkJpUUVoRUF6YkFndEJBU0VRSUFFdEFBQkIzd0JIRGNBQklBRkJBV29oQVF5QkFnc0NRQ0FCSWdRZ0FrY05BRUdLQVNFUUROb0NDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFGcUlSQURRQ0FFTFFBQUlBRkJqTStBZ0FCcUxRQUFSdzNCQVNBQlFRRkdEYThDSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUVlvQklSQU0yUUlMQWtBZ0FTSUVJQUpIRFFCQml3RWhFQXpaQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUNhaUVRQWtBRFFDQUVMUUFBSUFGQmpzK0FnQUJxTFFBQVJ3M0JBU0FCUVFKR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJpd0VoRUF6WkFnc2dBRUVBTmdJQUlCQkJBV29oQVVFQ0lSQU12Z0VMQWtBZ0FTSUVJQUpIRFFCQmpBRWhFQXpZQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUJhaUVRQWtBRFFDQUVMUUFBSUFGQjhNK0FnQUJxTFFBQVJ3M0FBU0FCUVFGR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJqQUVoRUF6WUFnc2dBRUVBTmdJQUlCQkJBV29oQVVFZklSQU12UUVMQWtBZ0FTSUVJQUpIRFFCQmpRRWhFQXpYQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUJhaUVRQWtBRFFDQUVMUUFBSUFGQjhzK0FnQUJxTFFBQVJ3Mi9BU0FCUVFGR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJqUUVoRUF6WEFnc2dBRUVBTmdJQUlCQkJBV29oQVVFSklSQU12QUVMQWtBZ0FTSUVJQUpIRFFCQmpnRWhFQXpXQWdzQ1FBSkFJQVF0QUFCQnQzOXFEZ2NBdndHL0FiOEJ2d0cvQVFHL0FRc2dCRUVCYWlFQlFmZ0FJUkFNdlFJTElBUkJBV29oQVVINUFDRVFETHdDQ3dKQUlBRWlCQ0FDUncwQVFZOEJJUkFNMVFJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJCV29oRUFKQUEwQWdCQzBBQUNBQlFaSFBnSUFBYWkwQUFFY052UUVnQVVFRlJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRWThCSVJBTTFRSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkdDRVFETG9CQ3dKQUlBRWlCQ0FDUncwQVFaQUJJUkFNMUFJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBbW9oRUFKQUEwQWdCQzBBQUNBQlFaZlBnSUFBYWkwQUFFY052QUVnQVVFQ1JnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRWkFCSVJBTTFBSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkZ5RVFETGtCQ3dKQUlBRWlCQ0FDUncwQVFaRUJJUkFNMHdJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJCbW9oRUFKQUEwQWdCQzBBQUNBQlFaclBnSUFBYWkwQUFFY051d0VnQVVFR1JnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRWkVCSVJBTTB3SUxJQUJCQURZQ0FDQVFRUUZxSVFGQkZTRVFETGdCQ3dKQUlBRWlCQ0FDUncwQVFaSUJJUkFNMGdJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJCV29oRUFKQUEwQWdCQzBBQUNBQlFhSFBnSUFBYWkwQUFFY051Z0VnQVVFRlJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRWklCSVJBTTBnSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkhpRVFETGNCQ3dKQUlBRWlCQ0FDUncwQVFaTUJJUkFNMFFJTElBUXRBQUJCekFCSERiZ0JJQVJCQVdvaEFVRUtJUkFNdGdFTEFrQWdCQ0FDUncwQVFaUUJJUkFNMEFJTEFrQUNRQ0FFTFFBQVFiOS9hZzRQQUxrQnVRRzVBYmtCdVFHNUFia0J1UUc1QWJrQnVRRzVBYmtCQWJrQkN5QUVRUUZxSVFGQi9nQWhFQXkzQWdzZ0JFRUJhaUVCUWY4QUlSQU10Z0lMQWtBZ0JDQUNSdzBBUVpVQklSQU16d0lMQWtBQ1FDQUVMUUFBUWI5L2FnNERBTGdCQWJnQkN5QUVRUUZxSVFGQi9RQWhFQXkyQWdzZ0JFRUJhaUVFUVlBQklSQU10UUlMQWtBZ0JDQUNSdzBBUVpZQklSQU16Z0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFXb2hFQUpBQTBBZ0JDMEFBQ0FCUWFmUGdJQUFhaTBBQUVjTnRnRWdBVUVCUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFaWUJJUkFNemdJTElBQkJBRFlDQUNBUVFRRnFJUUZCQ3lFUURMTUJDd0pBSUFRZ0FrY05BRUdYQVNFUURNMENDd0pBQWtBQ1FBSkFJQVF0QUFCQlUyb09Jd0M0QWJnQnVBRzRBYmdCdUFHNEFiZ0J1QUc0QWJnQnVBRzRBYmdCdUFHNEFiZ0J1QUc0QWJnQnVBRzRBYmdCQWJnQnVBRzRBYmdCdUFFQ3VBRzRBYmdCQTdnQkN5QUVRUUZxSVFGQit3QWhFQXkyQWdzZ0JFRUJhaUVCUWZ3QUlSQU10UUlMSUFSQkFXb2hCRUdCQVNFUURMUUNDeUFFUVFGcUlRUkJnZ0VoRUF5ekFnc0NRQ0FFSUFKSERRQkJtQUVoRUF6TUFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVFYWlFUUFrQURRQ0FFTFFBQUlBRkJxYytBZ0FCcUxRQUFSdzIwQVNBQlFRUkdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCbUFFaEVBek1BZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRVpJUkFNc1FFTEFrQWdCQ0FDUncwQVFaa0JJUkFNeXdJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJCV29oRUFKQUEwQWdCQzBBQUNBQlFhN1BnSUFBYWkwQUFFY05zd0VnQVVFRlJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRWmtCSVJBTXl3SUxJQUJCQURZQ0FDQVFRUUZxSVFGQkJpRVFETEFCQ3dKQUlBUWdBa2NOQUVHYUFTRVFETW9DQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRRnFJUkFDUUFOQUlBUXRBQUFnQVVHMHo0Q0FBR290QUFCSERiSUJJQUZCQVVZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR2FBU0VRRE1vQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVJ3aEVBeXZBUXNDUUNBRUlBSkhEUUJCbXdFaEVBekpBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFQmFpRVFBa0FEUUNBRUxRQUFJQUZCdHMrQWdBQnFMUUFBUncyeEFTQUJRUUZHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQm13RWhFQXpKQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVuSVJBTXJnRUxBa0FnQkNBQ1J3MEFRWndCSVJBTXlBSUxBa0FDUUNBRUxRQUFRYXgvYWc0Q0FBR3hBUXNnQkVFQmFpRUVRWVlCSVJBTXJ3SUxJQVJCQVdvaEJFR0hBU0VRREs0Q0N3SkFJQVFnQWtjTkFFR2RBU0VRRE1jQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUUZxSVJBQ1FBTkFJQVF0QUFBZ0FVRzR6NENBQUdvdEFBQkhEYThCSUFGQkFVWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUdkQVNFUURNY0NDeUFBUVFBMkFnQWdFRUVCYWlFQlFTWWhFQXlzQVFzQ1FDQUVJQUpIRFFCQm5nRWhFQXpHQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUJhaUVRQWtBRFFDQUVMUUFBSUFGQnVzK0FnQUJxTFFBQVJ3MnVBU0FCUVFGR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJuZ0VoRUF6R0Fnc2dBRUVBTmdJQUlCQkJBV29oQVVFRElSQU1xd0VMQWtBZ0JDQUNSdzBBUVo4QklSQU14UUlMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFtb2hFQUpBQTBBZ0JDMEFBQ0FCUWUzUGdJQUFhaTBBQUVjTnJRRWdBVUVDUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFaOEJJUkFNeFFJTElBQkJBRFlDQUNBUVFRRnFJUUZCRENFUURLb0JDd0pBSUFRZ0FrY05BRUdnQVNFUURNUUNDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFOcUlSQUNRQU5BSUFRdEFBQWdBVUc4ejRDQUFHb3RBQUJIRGF3QklBRkJBMFlOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHZ0FTRVFETVFDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUTBoRUF5cEFRc0NRQ0FFSUFKSERRQkJvUUVoRUF6REFnc0NRQUpBSUFRdEFBQkJ1bjlxRGdzQXJBR3NBYXdCckFHc0Fhd0JyQUdzQWF3QkFhd0JDeUFFUVFGcUlRUkJpd0VoRUF5cUFnc2dCRUVCYWlFRVFZd0JJUkFNcVFJTEFrQWdCQ0FDUncwQVFhSUJJUkFNd2dJTElBUXRBQUJCMEFCSERha0JJQVJCQVdvaEJBenBBUXNDUUNBRUlBSkhEUUJCb3dFaEVBekJBZ3NDUUFKQUlBUXRBQUJCdDM5cURnY0JxZ0dxQWFvQnFnR3FBUUNxQVFzZ0JFRUJhaUVFUVk0QklSQU1xQUlMSUFSQkFXb2hBVUVpSVJBTXBnRUxBa0FnQkNBQ1J3MEFRYVFCSVJBTXdBSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQVdvaEVBSkFBMEFnQkMwQUFDQUJRY0RQZ0lBQWFpMEFBRWNOcUFFZ0FVRUJSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUWFRQklSQU13QUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJIU0VRREtVQkN3SkFJQVFnQWtjTkFFR2xBU0VRREw4Q0N3SkFBa0FnQkMwQUFFR3VmMm9PQXdDb0FRR29BUXNnQkVFQmFpRUVRWkFCSVJBTXBnSUxJQVJCQVdvaEFVRUVJUkFNcEFFTEFrQWdCQ0FDUncwQVFhWUJJUkFNdmdJTEFrQUNRQUpBQWtBQ1FDQUVMUUFBUWI5L2FnNFZBS29CcWdHcUFhb0JxZ0dxQWFvQnFnR3FBYW9CQWFvQnFnRUNxZ0dxQVFPcUFhb0JCS29CQ3lBRVFRRnFJUVJCaUFFaEVBeW9BZ3NnQkVFQmFpRUVRWWtCSVJBTXB3SUxJQVJCQVdvaEJFR0tBU0VRREtZQ0N5QUVRUUZxSVFSQmp3RWhFQXlsQWdzZ0JFRUJhaUVFUVpFQklSQU1wQUlMQWtBZ0JDQUNSdzBBUWFjQklSQU12UUlMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFtb2hFQUpBQTBBZ0JDMEFBQ0FCUWUzUGdJQUFhaTBBQUVjTnBRRWdBVUVDUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFhY0JJUkFNdlFJTElBQkJBRFlDQUNBUVFRRnFJUUZCRVNFUURLSUJDd0pBSUFRZ0FrY05BRUdvQVNFUURMd0NDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFKcUlSQUNRQU5BSUFRdEFBQWdBVUhDejRDQUFHb3RBQUJIRGFRQklBRkJBa1lOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHb0FTRVFETHdDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRU3doRUF5aEFRc0NRQ0FFSUFKSERRQkJxUUVoRUF5N0Fnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVFYWlFUUFrQURRQ0FFTFFBQUlBRkJ4YytBZ0FCcUxRQUFSdzJqQVNBQlFRUkdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCcVFFaEVBeTdBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRXJJUkFNb0FFTEFrQWdCQ0FDUncwQVFhb0JJUkFNdWdJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBbW9oRUFKQUEwQWdCQzBBQUNBQlFjclBnSUFBYWkwQUFFY05vZ0VnQVVFQ1JnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRYW9CSVJBTXVnSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkZDRVFESjhCQ3dKQUlBUWdBa2NOQUVHckFTRVFETGtDQ3dKQUFrQUNRQUpBSUFRdEFBQkJ2bjlxRGc4QUFRS2tBYVFCcEFHa0FhUUJwQUdrQWFRQnBBR2tBYVFCQTZRQkN5QUVRUUZxSVFSQmt3RWhFQXlpQWdzZ0JFRUJhaUVFUVpRQklSQU1vUUlMSUFSQkFXb2hCRUdWQVNFUURLQUNDeUFFUVFGcUlRUkJsZ0VoRUF5ZkFnc0NRQ0FFSUFKSERRQkJyQUVoRUF5NEFnc2dCQzBBQUVIRkFFY05ud0VnQkVFQmFpRUVET0FCQ3dKQUlBUWdBa2NOQUVHdEFTRVFETGNDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRSnFJUkFDUUFOQUlBUXRBQUFnQVVITno0Q0FBR290QUFCSERaOEJJQUZCQWtZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR3RBU0VRRExjQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVE0aEVBeWNBUXNDUUNBRUlBSkhEUUJCcmdFaEVBeTJBZ3NnQkMwQUFFSFFBRWNOblFFZ0JFRUJhaUVCUVNVaEVBeWJBUXNDUUNBRUlBSkhEUUJCcndFaEVBeTFBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFSWFpRVFBa0FEUUNBRUxRQUFJQUZCME0rQWdBQnFMUUFBUncyZEFTQUJRUWhHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQnJ3RWhFQXkxQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVxSVJBTW1nRUxBa0FnQkNBQ1J3MEFRYkFCSVJBTXRBSUxBa0FDUUNBRUxRQUFRYXQvYWc0TEFKMEJuUUdkQVowQm5RR2RBWjBCblFHZEFRR2RBUXNnQkVFQmFpRUVRWm9CSVJBTW13SUxJQVJCQVdvaEJFR2JBU0VRREpvQ0N3SkFJQVFnQWtjTkFFR3hBU0VRRExNQ0N3SkFBa0FnQkMwQUFFRy9mMm9PRkFDY0Fad0JuQUdjQVp3Qm5BR2NBWndCbkFHY0Fad0JuQUdjQVp3Qm5BR2NBWndCbkFFQm5BRUxJQVJCQVdvaEJFR1pBU0VRREpvQ0N5QUVRUUZxSVFSQm5BRWhFQXlaQWdzQ1FDQUVJQUpIRFFCQnNnRWhFQXl5QWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRURhaUVRQWtBRFFDQUVMUUFBSUFGQjJjK0FnQUJxTFFBQVJ3MmFBU0FCUVFOR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJzZ0VoRUF5eUFnc2dBRUVBTmdJQUlCQkJBV29oQVVFaElSQU1sd0VMQWtBZ0JDQUNSdzBBUWJNQklSQU1zUUlMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkJtb2hFQUpBQTBBZ0JDMEFBQ0FCUWQzUGdJQUFhaTBBQUVjTm1RRWdBVUVHUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFiTUJJUkFNc1FJTElBQkJBRFlDQUNBUVFRRnFJUUZCR2lFUURKWUJDd0pBSUFRZ0FrY05BRUcwQVNFUURMQUNDd0pBQWtBQ1FDQUVMUUFBUWJ0L2FnNFJBSm9CbWdHYUFab0JtZ0dhQVpvQm1nR2FBUUdhQVpvQm1nR2FBWm9CQXBvQkN5QUVRUUZxSVFSQm5RRWhFQXlZQWdzZ0JFRUJhaUVFUVo0QklSQU1sd0lMSUFSQkFXb2hCRUdmQVNFUURKWUNDd0pBSUFRZ0FrY05BRUcxQVNFUURLOENDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFWcUlSQUNRQU5BSUFRdEFBQWdBVUhrejRDQUFHb3RBQUJIRFpjQklBRkJCVVlOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHMUFTRVFESzhDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRU2doRUF5VUFRc0NRQ0FFSUFKSERRQkJ0Z0VoRUF5dUFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVDYWlFUUFrQURRQ0FFTFFBQUlBRkI2cytBZ0FCcUxRQUFSdzJXQVNBQlFRSkdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCdGdFaEVBeXVBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRUhJUkFNa3dFTEFrQWdCQ0FDUncwQVFiY0JJUkFNclFJTEFrQUNRQ0FFTFFBQVFidC9hZzRPQUpZQmxnR1dBWllCbGdHV0FaWUJsZ0dXQVpZQmxnR1dBUUdXQVFzZ0JFRUJhaUVFUWFFQklSQU1sQUlMSUFSQkFXb2hCRUdpQVNFUURKTUNDd0pBSUFRZ0FrY05BRUc0QVNFUURLd0NDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFKcUlSQUNRQU5BSUFRdEFBQWdBVUh0ejRDQUFHb3RBQUJIRFpRQklBRkJBa1lOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHNEFTRVFES3dDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUkloRUF5UkFRc0NRQ0FFSUFKSERRQkJ1UUVoRUF5ckFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVCYWlFUUFrQURRQ0FFTFFBQUlBRkI4TStBZ0FCcUxRQUFSdzJUQVNBQlFRRkdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCdVFFaEVBeXJBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRWdJUkFNa0FFTEFrQWdCQ0FDUncwQVFib0JJUkFNcWdJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBV29oRUFKQUEwQWdCQzBBQUNBQlFmTFBnSUFBYWkwQUFFY05rZ0VnQVVFQlJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRYm9CSVJBTXFnSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkR5RVFESThCQ3dKQUlBUWdBa2NOQUVHN0FTRVFES2tDQ3dKQUFrQWdCQzBBQUVHM2Yyb09Cd0NTQVpJQmtnR1NBWklCQVpJQkN5QUVRUUZxSVFSQnBRRWhFQXlRQWdzZ0JFRUJhaUVFUWFZQklSQU1qd0lMQWtBZ0JDQUNSdzBBUWJ3QklSQU1xQUlMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkIyb2hFQUpBQTBBZ0JDMEFBQ0FCUWZUUGdJQUFhaTBBQUVjTmtBRWdBVUVIUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFid0JJUkFNcUFJTElBQkJBRFlDQUNBUVFRRnFJUUZCR3lFUURJMEJDd0pBSUFRZ0FrY05BRUc5QVNFUURLY0NDd0pBQWtBQ1FDQUVMUUFBUWI1L2FnNFNBSkVCa1FHUkFaRUJrUUdSQVpFQmtRR1JBUUdSQVpFQmtRR1JBWkVCa1FFQ2tRRUxJQVJCQVdvaEJFR2tBU0VRREk4Q0N5QUVRUUZxSVFSQnB3RWhFQXlPQWdzZ0JFRUJhaUVFUWFnQklSQU1qUUlMQWtBZ0JDQUNSdzBBUWI0QklSQU1wZ0lMSUFRdEFBQkJ6Z0JIRFkwQklBUkJBV29oQkF6UEFRc0NRQ0FFSUFKSERRQkJ2d0VoRUF5bEFnc0NRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBRUxRQUFRYjkvYWc0VkFBRUNBNXdCQkFVR25BR2NBWndCQndnSkNndWNBUXdORGcrY0FRc2dCRUVCYWlFQlFlZ0FJUkFNbWdJTElBUkJBV29oQVVIcEFDRVFESmtDQ3lBRVFRRnFJUUZCN2dBaEVBeVlBZ3NnQkVFQmFpRUJRZklBSVJBTWx3SUxJQVJCQVdvaEFVSHpBQ0VRREpZQ0N5QUVRUUZxSVFGQjlnQWhFQXlWQWdzZ0JFRUJhaUVCUWZjQUlSQU1sQUlMSUFSQkFXb2hBVUg2QUNFUURKTUNDeUFFUVFGcUlRUkJnd0VoRUF5U0Fnc2dCRUVCYWlFRVFZUUJJUkFNa1FJTElBUkJBV29oQkVHRkFTRVFESkFDQ3lBRVFRRnFJUVJCa2dFaEVBeVBBZ3NnQkVFQmFpRUVRWmdCSVJBTWpnSUxJQVJCQVdvaEJFR2dBU0VRREkwQ0N5QUVRUUZxSVFSQm93RWhFQXlNQWdzZ0JFRUJhaUVFUWFvQklSQU1pd0lMQWtBZ0JDQUNSZzBBSUFCQmtJQ0FnQUEyQWdnZ0FDQUVOZ0lFUWFzQklSQU1pd0lMUWNBQklSQU1vd0lMSUFBZ0JTQUNFS3FBZ0lBQUlnRU5pd0VnQlNFQkRGd0xBa0FnQmlBQ1JnMEFJQVpCQVdvaEJReU5BUXRCd2dFaEVBeWhBZ3NEUUFKQUlCQXRBQUJCZG1vT0JJd0JBQUNQQVFBTElCQkJBV29pRUNBQ1J3MEFDMEhEQVNFUURLQUNDd0pBSUFjZ0FrWU5BQ0FBUVpHQWdJQUFOZ0lJSUFBZ0J6WUNCQ0FISVFGQkFTRVFESWNDQzBIRUFTRVFESjhDQ3dKQUlBY2dBa2NOQUVIRkFTRVFESjhDQ3dKQUFrQWdCeTBBQUVGMmFnNEVBYzRCemdFQXpnRUxJQWRCQVdvaEJneU5BUXNnQjBFQmFpRUZESWtCQ3dKQUlBY2dBa2NOQUVIR0FTRVFESjRDQ3dKQUFrQWdCeTBBQUVGMmFnNFhBWThCandFQmp3R1BBWThCandHUEFZOEJqd0dQQVk4Qmp3R1BBWThCandHUEFZOEJqd0dQQVk4QkFJOEJDeUFIUVFGcUlRY0xRYkFCSVJBTWhBSUxBa0FnQ0NBQ1J3MEFRY2dCSVJBTW5RSUxJQWd0QUFCQklFY05qUUVnQUVFQU93RXlJQWhCQVdvaEFVR3pBU0VRRElNQ0N5QUJJUmNDUUFOQUlCY2lCeUFDUmcwQklBY3RBQUJCVUdwQi93RnhJaEJCQ2s4TnpBRUNRQ0FBTHdFeUloUkJtVE5MRFFBZ0FDQVVRUXBzSWhRN0FUSWdFRUgvL3dOeklCUkIvdjhEY1VrTkFDQUhRUUZxSVJjZ0FDQVVJQkJxSWhBN0FUSWdFRUgvL3dOeFFlZ0hTUTBCQ3d0QkFDRVFJQUJCQURZQ0hDQUFRY0dKZ0lBQU5nSVFJQUJCRFRZQ0RDQUFJQWRCQVdvMkFoUU1uQUlMUWNjQklSQU1td0lMSUFBZ0NDQUNFSzZBZ0lBQUloQkZEY29CSUJCQkZVY05qQUVnQUVISUFUWUNIQ0FBSUFnMkFoUWdBRUhKbDRDQUFEWUNFQ0FBUVJVMkFneEJBQ0VRREpvQ0N3SkFJQWtnQWtjTkFFSE1BU0VRREpvQ0MwRUFJUlJCQVNFWFFRRWhGa0VBSVJBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0NTMEFBRUZRYWc0S2xnR1ZBUUFCQWdNRUJRWUlsd0VMUVFJaEVBd0dDMEVESVJBTUJRdEJCQ0VRREFRTFFRVWhFQXdEQzBFR0lSQU1BZ3RCQnlFUURBRUxRUWdoRUF0QkFDRVhRUUFoRmtFQUlSUU1qZ0VMUVFraEVFRUJJUlJCQUNFWFFRQWhGZ3lOQVFzQ1FDQUtJQUpIRFFCQnpnRWhFQXlaQWdzZ0NpMEFBRUV1UncyT0FTQUtRUUZxSVFrTXlnRUxJQXNnQWtjTmpnRkIwQUVoRUF5WEFnc0NRQ0FMSUFKR0RRQWdBRUdPZ0lDQUFEWUNDQ0FBSUFzMkFnUkJ0d0VoRUF6K0FRdEIwUUVoRUF5V0Fnc0NRQ0FFSUFKSERRQkIwZ0VoRUF5V0Fnc2dBaUFFYXlBQUtBSUFJaEJxSVJRZ0JDQVFhMEVFYWlFTEEwQWdCQzBBQUNBUVFmelBnSUFBYWkwQUFFY05qZ0VnRUVFRVJnM3BBU0FRUVFGcUlSQWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUhTQVNFUURKVUNDeUFBSUF3Z0FoQ3NnSUNBQUNJQkRZMEJJQXdoQVF5NEFRc0NRQ0FFSUFKSERRQkIxQUVoRUF5VUFnc2dBaUFFYXlBQUtBSUFJaEJxSVJRZ0JDQVFhMEVCYWlFTUEwQWdCQzBBQUNBUVFZSFFnSUFBYWkwQUFFY05qd0VnRUVFQlJnMk9BU0FRUVFGcUlSQWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUhVQVNFUURKTUNDd0pBSUFRZ0FrY05BRUhXQVNFUURKTUNDeUFDSUFScklBQW9BZ0FpRUdvaEZDQUVJQkJyUVFKcUlRc0RRQ0FFTFFBQUlCQkJnOUNBZ0FCcUxRQUFSdzJPQVNBUVFRSkdEWkFCSUJCQkFXb2hFQ0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUWRZQklSQU1rZ0lMQWtBZ0JDQUNSdzBBUWRjQklSQU1rZ0lMQWtBQ1FDQUVMUUFBUWJ0L2FnNFFBSThCandHUEFZOEJqd0dQQVk4Qmp3R1BBWThCandHUEFZOEJqd0VCandFTElBUkJBV29oQkVHN0FTRVFEUGtCQ3lBRVFRRnFJUVJCdkFFaEVBejRBUXNDUUNBRUlBSkhEUUJCMkFFaEVBeVJBZ3NnQkMwQUFFSElBRWNOakFFZ0JFRUJhaUVFRE1RQkN3SkFJQVFnQWtZTkFDQUFRWkNBZ0lBQU5nSUlJQUFnQkRZQ0JFRytBU0VRRFBjQkMwSFpBU0VRREk4Q0N3SkFJQVFnQWtjTkFFSGFBU0VRREk4Q0N5QUVMUUFBUWNnQVJnM0RBU0FBUVFFNkFDZ011UUVMSUFCQkFqb0FMeUFBSUFRZ0FoQ21nSUNBQUNJUURZMEJRY0lCSVJBTTlBRUxJQUF0QUNoQmYyb09BcmNCdVFHNEFRc0RRQUpBSUFRdEFBQkJkbW9PQkFDT0FZNEJBSTRCQ3lBRVFRRnFJZ1FnQWtjTkFBdEIzUUVoRUF5TEFnc2dBRUVBT2dBdklBQXRBQzFCQkhGRkRZUUNDeUFBUVFBNkFDOGdBRUVCT2dBMElBRWhBUXlNQVFzZ0VFRVZSZzNhQVNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCcDQ2QWdBQTJBaEFnQUVFU05nSU1RUUFoRUF5SUFnc0NRQ0FBSUJBZ0FoQzBnSUNBQUNJRURRQWdFQ0VCRElFQ0N3SkFJQVJCRlVjTkFDQUFRUU0yQWh3Z0FDQVFOZ0lVSUFCQnNKaUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBeUlBZ3NnQUVFQU5nSWNJQUFnRURZQ0ZDQUFRYWVPZ0lBQU5nSVFJQUJCRWpZQ0RFRUFJUkFNaHdJTElCQkJGVVlOMWdFZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWRxTmdJQUFOZ0lRSUFCQkZEWUNERUVBSVJBTWhnSUxJQUFvQWdRaEZ5QUFRUUEyQWdRZ0VDQVJwMm9pRmlFQklBQWdGeUFRSUJZZ0ZCc2lFQkMxZ0lDQUFDSVVSUTJOQVNBQVFRYzJBaHdnQUNBUU5nSVVJQUFnRkRZQ0RFRUFJUkFNaFFJTElBQWdBQzhCTUVHQUFYSTdBVEFnQVNFQkMwRXFJUkFNNmdFTElCQkJGVVlOMFFFZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUVlPTWdJQUFOZ0lRSUFCQkV6WUNERUVBSVJBTWdnSUxJQkJCRlVZTnp3RWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFacVBnSUFBTmdJUUlBQkJJallDREVFQUlSQU1nUUlMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQzNnSUNBQUNJUURRQWdBVUVCYWlFQkRJMEJDeUFBUVF3MkFod2dBQ0FRTmdJTUlBQWdBVUVCYWpZQ0ZFRUFJUkFNZ0FJTElCQkJGVVlOekFFZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUVpxUGdJQUFOZ0lRSUFCQklqWUNERUVBSVJBTS93RUxJQUFvQWdRaEVDQUFRUUEyQWdRQ1FDQUFJQkFnQVJDM2dJQ0FBQ0lRRFFBZ0FVRUJhaUVCREl3QkN5QUFRUTAyQWh3Z0FDQVFOZ0lNSUFBZ0FVRUJhallDRkVFQUlSQU0vZ0VMSUJCQkZVWU55UUVnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRY2FNZ0lBQU5nSVFJQUJCSXpZQ0RFRUFJUkFNL1FFTElBQW9BZ1FoRUNBQVFRQTJBZ1FDUUNBQUlCQWdBUkM1Z0lDQUFDSVFEUUFnQVVFQmFpRUJESXNCQ3lBQVFRNDJBaHdnQUNBUU5nSU1JQUFnQVVFQmFqWUNGRUVBSVJBTS9BRUxJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSEFsWUNBQURZQ0VDQUFRUUkyQWd4QkFDRVFEUHNCQ3lBUVFSVkdEY1VCSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUhHaklDQUFEWUNFQ0FBUVNNMkFneEJBQ0VRRFBvQkN5QUFRUkEyQWh3Z0FDQUJOZ0lVSUFBZ0VEWUNERUVBSVJBTStRRUxJQUFvQWdRaEJDQUFRUUEyQWdRQ1FDQUFJQVFnQVJDNWdJQ0FBQ0lFRFFBZ0FVRUJhaUVCRFBFQkN5QUFRUkUyQWh3Z0FDQUVOZ0lNSUFBZ0FVRUJhallDRkVFQUlSQU0rQUVMSUJCQkZVWU53UUVnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRY2FNZ0lBQU5nSVFJQUJCSXpZQ0RFRUFJUkFNOXdFTElBQW9BZ1FoRUNBQVFRQTJBZ1FDUUNBQUlCQWdBUkM1Z0lDQUFDSVFEUUFnQVVFQmFpRUJESWdCQ3lBQVFSTTJBaHdnQUNBUU5nSU1JQUFnQVVFQmFqWUNGRUVBSVJBTTlnRUxJQUFvQWdRaEJDQUFRUUEyQWdRQ1FDQUFJQVFnQVJDNWdJQ0FBQ0lFRFFBZ0FVRUJhaUVCRE8wQkN5QUFRUlEyQWh3Z0FDQUVOZ0lNSUFBZ0FVRUJhallDRkVFQUlSQU05UUVMSUJCQkZVWU52UUVnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRWnFQZ0lBQU5nSVFJQUJCSWpZQ0RFRUFJUkFNOUFFTElBQW9BZ1FoRUNBQVFRQTJBZ1FDUUNBQUlCQWdBUkMzZ0lDQUFDSVFEUUFnQVVFQmFpRUJESVlCQ3lBQVFSWTJBaHdnQUNBUU5nSU1JQUFnQVVFQmFqWUNGRUVBSVJBTTh3RUxJQUFvQWdRaEJDQUFRUUEyQWdRQ1FDQUFJQVFnQVJDM2dJQ0FBQ0lFRFFBZ0FVRUJhaUVCRE9rQkN5QUFRUmMyQWh3Z0FDQUVOZ0lNSUFBZ0FVRUJhallDRkVFQUlSQU04Z0VMSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUhOazRDQUFEWUNFQ0FBUVF3MkFneEJBQ0VRRFBFQkMwSUJJUkVMSUJCQkFXb2hBUUpBSUFBcEF5QWlFa0wvLy8vLy8vLy8vdzlXRFFBZ0FDQVNRZ1NHSUJHRU53TWdJQUVoQVF5RUFRc2dBRUVBTmdJY0lBQWdBVFlDRkNBQVFhMkpnSUFBTmdJUUlBQkJERFlDREVFQUlSQU03d0VMSUFCQkFEWUNIQ0FBSUJBMkFoUWdBRUhOazRDQUFEWUNFQ0FBUVF3MkFneEJBQ0VRRE80QkN5QUFLQUlFSVJjZ0FFRUFOZ0lFSUJBZ0VhZHFJaFloQVNBQUlCY2dFQ0FXSUJRYkloQVF0WUNBZ0FBaUZFVU5jeUFBUVFVMkFod2dBQ0FRTmdJVUlBQWdGRFlDREVFQUlSQU03UUVMSUFCQkFEWUNIQ0FBSUJBMkFoUWdBRUdxbklDQUFEWUNFQ0FBUVE4MkFneEJBQ0VRRE93QkN5QUFJQkFnQWhDMGdJQ0FBQ0lCRFFFZ0VDRUJDMEVPSVJBTTBRRUxBa0FnQVVFVlJ3MEFJQUJCQWpZQ0hDQUFJQkEyQWhRZ0FFR3dtSUNBQURZQ0VDQUFRUlUyQWd4QkFDRVFET29CQ3lBQVFRQTJBaHdnQUNBUU5nSVVJQUJCcDQ2QWdBQTJBaEFnQUVFU05nSU1RUUFoRUF6cEFRc2dBVUVCYWlFUUFrQWdBQzhCTUNJQlFZQUJjVVVOQUFKQUlBQWdFQ0FDRUx1QWdJQUFJZ0VOQUNBUUlRRU1jQXNnQVVFVlJ3MjZBU0FBUVFVMkFod2dBQ0FRTmdJVUlBQkIrWmVBZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXpwQVFzQ1FDQUJRYUFFY1VHZ0JFY05BQ0FBTFFBdFFRSnhEUUFnQUVFQU5nSWNJQUFnRURZQ0ZDQUFRWmFUZ0lBQU5nSVFJQUJCQkRZQ0RFRUFJUkFNNlFFTElBQWdFQ0FDRUwyQWdJQUFHaUFRSVFFQ1FBSkFBa0FDUUFKQUlBQWdFQ0FDRUxPQWdJQUFEaFlDQVFBRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRREJBc2dBRUVCT2dBdUN5QUFJQUF2QVRCQndBQnlPd0V3SUJBaEFRdEJKaUVRRE5FQkN5QUFRU00yQWh3Z0FDQVFOZ0lVSUFCQnBaYUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBenBBUXNnQUVFQU5nSWNJQUFnRURZQ0ZDQUFRZFdMZ0lBQU5nSVFJQUJCRVRZQ0RFRUFJUkFNNkFFTElBQXRBQzFCQVhGRkRRRkJ3d0VoRUF6T0FRc0NRQ0FOSUFKR0RRQURRQUpBSUEwdEFBQkJJRVlOQUNBTklRRU14QUVMSUExQkFXb2lEU0FDUncwQUMwRWxJUkFNNXdFTFFTVWhFQXptQVFzZ0FDZ0NCQ0VFSUFCQkFEWUNCQ0FBSUFRZ0RSQ3ZnSUNBQUNJRVJRMnRBU0FBUVNZMkFod2dBQ0FFTmdJTUlBQWdEVUVCYWpZQ0ZFRUFJUkFNNVFFTElCQkJGVVlOcXdFZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWYyTmdJQUFOZ0lRSUFCQkhUWUNERUVBSVJBTTVBRUxJQUJCSnpZQ0hDQUFJQUUyQWhRZ0FDQVFOZ0lNUVFBaEVBempBUXNnRUNFQlFRRWhGQUpBQWtBQ1FBSkFBa0FDUUFKQUlBQXRBQ3hCZm1vT0J3WUZCUU1CQWdBRkN5QUFJQUF2QVRCQkNISTdBVEFNQXd0QkFpRVVEQUVMUVFRaEZBc2dBRUVCT2dBc0lBQWdBQzhCTUNBVWNqc0JNQXNnRUNFQkMwRXJJUkFNeWdFTElBQkJBRFlDSENBQUlCQTJBaFFnQUVHcmtvQ0FBRFlDRUNBQVFRczJBZ3hCQUNFUURPSUJDeUFBUVFBMkFod2dBQ0FCTmdJVUlBQkI0WStBZ0FBMkFoQWdBRUVLTmdJTVFRQWhFQXpoQVFzZ0FFRUFPZ0FzSUJBaEFReTlBUXNnRUNFQlFRRWhGQUpBQWtBQ1FBSkFBa0FnQUMwQUxFRjdhZzRFQXdFQ0FBVUxJQUFnQUM4Qk1FRUljanNCTUF3REMwRUNJUlFNQVF0QkJDRVVDeUFBUVFFNkFDd2dBQ0FBTHdFd0lCUnlPd0V3Q3lBUUlRRUxRU2toRUF6RkFRc2dBRUVBTmdJY0lBQWdBVFlDRkNBQVFmQ1VnSUFBTmdJUUlBQkJBellDREVFQUlSQU0zUUVMQWtBZ0RpMEFBRUVOUncwQUlBQW9BZ1FoQVNBQVFRQTJBZ1FDUUNBQUlBRWdEaEN4Z0lDQUFDSUJEUUFnRGtFQmFpRUJESFVMSUFCQkxEWUNIQ0FBSUFFMkFnd2dBQ0FPUVFGcU5nSVVRUUFoRUF6ZEFRc2dBQzBBTFVFQmNVVU5BVUhFQVNFUURNTUJDd0pBSUE0Z0FrY05BRUV0SVJBTTNBRUxBa0FDUUFOQUFrQWdEaTBBQUVGMmFnNEVBZ0FBQXdBTElBNUJBV29pRGlBQ1J3MEFDMEV0SVJBTTNRRUxJQUFvQWdRaEFTQUFRUUEyQWdRQ1FDQUFJQUVnRGhDeGdJQ0FBQ0lCRFFBZ0RpRUJESFFMSUFCQkxEWUNIQ0FBSUE0MkFoUWdBQ0FCTmdJTVFRQWhFQXpjQVFzZ0FDZ0NCQ0VCSUFCQkFEWUNCQUpBSUFBZ0FTQU9FTEdBZ0lBQUlnRU5BQ0FPUVFGcUlRRU1jd3NnQUVFc05nSWNJQUFnQVRZQ0RDQUFJQTVCQVdvMkFoUkJBQ0VRRE5zQkN5QUFLQUlFSVFRZ0FFRUFOZ0lFSUFBZ0JDQU9FTEdBZ0lBQUlnUU5vQUVnRGlFQkRNNEJDeUFRUVN4SERRRWdBVUVCYWlFUVFRRWhBUUpBQWtBQ1FBSkFBa0FnQUMwQUxFRjdhZzRFQXdFQ0JBQUxJQkFoQVF3RUMwRUNJUUVNQVF0QkJDRUJDeUFBUVFFNkFDd2dBQ0FBTHdFd0lBRnlPd0V3SUJBaEFRd0JDeUFBSUFBdkFUQkJDSEk3QVRBZ0VDRUJDMEU1SVJBTXZ3RUxJQUJCQURvQUxDQUJJUUVMUVRRaEVBeTlBUXNnQUNBQUx3RXdRU0J5T3dFd0lBRWhBUXdDQ3lBQUtBSUVJUVFnQUVFQU5nSUVBa0FnQUNBRUlBRVFzWUNBZ0FBaUJBMEFJQUVoQVF6SEFRc2dBRUUzTmdJY0lBQWdBVFlDRkNBQUlBUTJBZ3hCQUNFUUROUUJDeUFBUVFnNkFDd2dBU0VCQzBFd0lSQU11UUVMQWtBZ0FDMEFLRUVCUmcwQUlBRWhBUXdFQ3lBQUxRQXRRUWh4UlEyVEFTQUJJUUVNQXdzZ0FDMEFNRUVnY1EyVUFVSEZBU0VRRExjQkN3SkFJQThnQWtZTkFBSkFBMEFDUUNBUExRQUFRVkJxSWdGQi93RnhRUXBKRFFBZ0R5RUJRVFVoRUF5NkFRc2dBQ2tESUNJUlFwbXo1c3lacytiTUdWWU5BU0FBSUJGQ0NuNGlFVGNESUNBUklBR3RRdjhCZ3lJU1FuK0ZWZzBCSUFBZ0VTQVNmRGNESUNBUFFRRnFJZzhnQWtjTkFBdEJPU0VRRE5FQkN5QUFLQUlFSVFJZ0FFRUFOZ0lFSUFBZ0FpQVBRUUZxSWdRUXNZQ0FnQUFpQWcyVkFTQUVJUUVNd3dFTFFUa2hFQXpQQVFzQ1FDQUFMd0V3SWdGQkNIRkZEUUFnQUMwQUtFRUJSdzBBSUFBdEFDMUJDSEZGRFpBQkN5QUFJQUZCOS9zRGNVR0FCSEk3QVRBZ0R5RUJDMEUzSVJBTXRBRUxJQUFnQUM4Qk1FRVFjanNCTUF5ckFRc2dFRUVWUmcyTEFTQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQjhJNkFnQUEyQWhBZ0FFRWNOZ0lNUVFBaEVBekxBUXNnQUVIREFEWUNIQ0FBSUFFMkFnd2dBQ0FOUVFGcU5nSVVRUUFoRUF6S0FRc0NRQ0FCTFFBQVFUcEhEUUFnQUNnQ0JDRVFJQUJCQURZQ0JBSkFJQUFnRUNBQkVLK0FnSUFBSWhBTkFDQUJRUUZxSVFFTVl3c2dBRUhEQURZQ0hDQUFJQkEyQWd3Z0FDQUJRUUZxTmdJVVFRQWhFQXpLQVFzZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWJHUmdJQUFOZ0lRSUFCQkNqWUNERUVBSVJBTXlRRUxJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFR2dtWUNBQURZQ0VDQUFRUjQyQWd4QkFDRVFETWdCQ3lBQVFRQTJBZ0FMSUFCQmdCSTdBU29nQUNBWFFRRnFJZ0VnQWhDb2dJQ0FBQ0lRRFFFZ0FTRUJDMEhIQUNFUURLd0JDeUFRUVJWSERZTUJJQUJCMFFBMkFod2dBQ0FCTmdJVUlBQkI0NWVBZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXpFQVFzZ0FDZ0NCQ0VRSUFCQkFEWUNCQUpBSUFBZ0VDQUJFS2VBZ0lBQUloQU5BQ0FCSVFFTVhnc2dBRUhTQURZQ0hDQUFJQUUyQWhRZ0FDQVFOZ0lNUVFBaEVBekRBUXNnQUVFQU5nSWNJQUFnRkRZQ0ZDQUFRY0dvZ0lBQU5nSVFJQUJCQnpZQ0RDQUFRUUEyQWdCQkFDRVFETUlCQ3lBQUtBSUVJUkFnQUVFQU5nSUVBa0FnQUNBUUlBRVFwNENBZ0FBaUVBMEFJQUVoQVF4ZEN5QUFRZE1BTmdJY0lBQWdBVFlDRkNBQUlCQTJBZ3hCQUNFUURNRUJDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUVlDUmdJQUFOZ0lRSUFCQkNUWUNEQXpBQVFzZ0VFRVZSZzE5SUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUdVallDQUFEWUNFQ0FBUVNFMkFneEJBQ0VRREw4QkMwRUJJUlpCQUNFWFFRQWhGRUVCSVJBTElBQWdFRG9BS3lBQlFRRnFJUUVDUUFKQUlBQXRBQzFCRUhFTkFBSkFBa0FDUUNBQUxRQXFEZ01CQUFJRUN5QVdSUTBEREFJTElCUU5BUXdDQ3lBWFJRMEJDeUFBS0FJRUlSQWdBRUVBTmdJRUFrQWdBQ0FRSUFFUXJZQ0FnQUFpRUEwQUlBRWhBUXhjQ3lBQVFkZ0FOZ0ljSUFBZ0FUWUNGQ0FBSUJBMkFneEJBQ0VRREw0QkN5QUFLQUlFSVFRZ0FFRUFOZ0lFQWtBZ0FDQUVJQUVRcllDQWdBQWlCQTBBSUFFaEFReXRBUXNnQUVIWkFEWUNIQ0FBSUFFMkFoUWdBQ0FFTmdJTVFRQWhFQXk5QVFzZ0FDZ0NCQ0VFSUFCQkFEWUNCQUpBSUFBZ0JDQUJFSzJBZ0lBQUlnUU5BQ0FCSVFFTXF3RUxJQUJCMmdBMkFod2dBQ0FCTmdJVUlBQWdCRFlDREVFQUlSQU12QUVMSUFBb0FnUWhCQ0FBUVFBMkFnUUNRQ0FBSUFRZ0FSQ3RnSUNBQUNJRURRQWdBU0VCREtrQkN5QUFRZHdBTmdJY0lBQWdBVFlDRkNBQUlBUTJBZ3hCQUNFUURMc0JDd0pBSUFFdEFBQkJVR29pRUVIL0FYRkJDazhOQUNBQUlCQTZBQ29nQVVFQmFpRUJRYzhBSVJBTW9nRUxJQUFvQWdRaEJDQUFRUUEyQWdRQ1FDQUFJQVFnQVJDdGdJQ0FBQ0lFRFFBZ0FTRUJES2NCQ3lBQVFkNEFOZ0ljSUFBZ0FUWUNGQ0FBSUFRMkFneEJBQ0VRRExvQkN5QUFRUUEyQWdBZ0YwRUJhaUVCQWtBZ0FDMEFLVUVqVHcwQUlBRWhBUXhaQ3lBQVFRQTJBaHdnQUNBQk5nSVVJQUJCMDRtQWdBQTJBaEFnQUVFSU5nSU1RUUFoRUF5NUFRc2dBRUVBTmdJQUMwRUFJUkFnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRWkN6Z0lBQU5nSVFJQUJCQ0RZQ0RBeTNBUXNnQUVFQU5nSUFJQmRCQVdvaEFRSkFJQUF0QUNsQklVY05BQ0FCSVFFTVZnc2dBRUVBTmdJY0lBQWdBVFlDRkNBQVFadUtnSUFBTmdJUUlBQkJDRFlDREVFQUlSQU10Z0VMSUFCQkFEWUNBQ0FYUVFGcUlRRUNRQ0FBTFFBcEloQkJYV3BCQzA4TkFDQUJJUUVNVlFzQ1FDQVFRUVpMRFFCQkFTQVFkRUhLQUhGRkRRQWdBU0VCREZVTFFRQWhFQ0FBUVFBMkFod2dBQ0FCTmdJVUlBQkI5NG1BZ0FBMkFoQWdBRUVJTmdJTURMVUJDeUFRUVJWR0RYRWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFibU5nSUFBTmdJUUlBQkJHallDREVFQUlSQU10QUVMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQ25nSUNBQUNJUURRQWdBU0VCREZRTElBQkI1UUEyQWh3Z0FDQUJOZ0lVSUFBZ0VEWUNERUVBSVJBTXN3RUxJQUFvQWdRaEVDQUFRUUEyQWdRQ1FDQUFJQkFnQVJDbmdJQ0FBQ0lRRFFBZ0FTRUJERTBMSUFCQjBnQTJBaHdnQUNBQk5nSVVJQUFnRURZQ0RFRUFJUkFNc2dFTElBQW9BZ1FoRUNBQVFRQTJBZ1FDUUNBQUlCQWdBUkNuZ0lDQUFDSVFEUUFnQVNFQkRFMExJQUJCMHdBMkFod2dBQ0FCTmdJVUlBQWdFRFlDREVFQUlSQU1zUUVMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQ25nSUNBQUNJUURRQWdBU0VCREZFTElBQkI1UUEyQWh3Z0FDQUJOZ0lVSUFBZ0VEWUNERUVBSVJBTXNBRUxJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSEdpb0NBQURZQ0VDQUFRUWMyQWd4QkFDRVFESzhCQ3lBQUtBSUVJUkFnQUVFQU5nSUVBa0FnQUNBUUlBRVFwNENBZ0FBaUVBMEFJQUVoQVF4SkN5QUFRZElBTmdJY0lBQWdBVFlDRkNBQUlCQTJBZ3hCQUNFUURLNEJDeUFBS0FJRUlSQWdBRUVBTmdJRUFrQWdBQ0FRSUFFUXA0Q0FnQUFpRUEwQUlBRWhBUXhKQ3lBQVFkTUFOZ0ljSUFBZ0FUWUNGQ0FBSUJBMkFneEJBQ0VRREswQkN5QUFLQUlFSVJBZ0FFRUFOZ0lFQWtBZ0FDQVFJQUVRcDRDQWdBQWlFQTBBSUFFaEFReE5DeUFBUWVVQU5nSWNJQUFnQVRZQ0ZDQUFJQkEyQWd4QkFDRVFES3dCQ3lBQVFRQTJBaHdnQUNBQk5nSVVJQUJCM0lpQWdBQTJBaEFnQUVFSE5nSU1RUUFoRUF5ckFRc2dFRUUvUncwQklBRkJBV29oQVF0QkJTRVFESkFCQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFmMlNnSUFBTmdJUUlBQkJCellDREF5b0FRc2dBQ2dDQkNFUUlBQkJBRFlDQkFKQUlBQWdFQ0FCRUtlQWdJQUFJaEFOQUNBQklRRU1RZ3NnQUVIU0FEWUNIQ0FBSUFFMkFoUWdBQ0FRTmdJTVFRQWhFQXluQVFzZ0FDZ0NCQ0VRSUFCQkFEWUNCQUpBSUFBZ0VDQUJFS2VBZ0lBQUloQU5BQ0FCSVFFTVFnc2dBRUhUQURZQ0hDQUFJQUUyQWhRZ0FDQVFOZ0lNUVFBaEVBeW1BUXNnQUNnQ0JDRVFJQUJCQURZQ0JBSkFJQUFnRUNBQkVLZUFnSUFBSWhBTkFDQUJJUUVNUmdzZ0FFSGxBRFlDSENBQUlBRTJBaFFnQUNBUU5nSU1RUUFoRUF5bEFRc2dBQ2dDQkNFQklBQkJBRFlDQkFKQUlBQWdBU0FVRUtlQWdJQUFJZ0VOQUNBVUlRRU1Qd3NnQUVIU0FEWUNIQ0FBSUJRMkFoUWdBQ0FCTmdJTVFRQWhFQXlrQVFzZ0FDZ0NCQ0VCSUFCQkFEWUNCQUpBSUFBZ0FTQVVFS2VBZ0lBQUlnRU5BQ0FVSVFFTVB3c2dBRUhUQURZQ0hDQUFJQlEyQWhRZ0FDQUJOZ0lNUVFBaEVBeWpBUXNnQUNnQ0JDRUJJQUJCQURZQ0JBSkFJQUFnQVNBVUVLZUFnSUFBSWdFTkFDQVVJUUVNUXdzZ0FFSGxBRFlDSENBQUlCUTJBaFFnQUNBQk5nSU1RUUFoRUF5aUFRc2dBRUVBTmdJY0lBQWdGRFlDRkNBQVFjT1BnSUFBTmdJUUlBQkJCellDREVFQUlSQU1vUUVMSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUhEajRDQUFEWUNFQ0FBUVFjMkFneEJBQ0VRREtBQkMwRUFJUkFnQUVFQU5nSWNJQUFnRkRZQ0ZDQUFRWXljZ0lBQU5nSVFJQUJCQnpZQ0RBeWZBUXNnQUVFQU5nSWNJQUFnRkRZQ0ZDQUFRWXljZ0lBQU5nSVFJQUJCQnpZQ0RFRUFJUkFNbmdFTElBQkJBRFlDSENBQUlCUTJBaFFnQUVIK2tZQ0FBRFlDRUNBQVFRYzJBZ3hCQUNFUURKMEJDeUFBUVFBMkFod2dBQ0FCTmdJVUlBQkJqcHVBZ0FBMkFoQWdBRUVHTmdJTVFRQWhFQXljQVFzZ0VFRVZSZzFYSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUhNam9DQUFEWUNFQ0FBUVNBMkFneEJBQ0VRREpzQkN5QUFRUUEyQWdBZ0VFRUJhaUVCUVNRaEVBc2dBQ0FRT2dBcElBQW9BZ1FoRUNBQVFRQTJBZ1FnQUNBUUlBRVFxNENBZ0FBaUVBMVVJQUVoQVF3K0N5QUFRUUEyQWdBTFFRQWhFQ0FBUVFBMkFod2dBQ0FFTmdJVUlBQkI4WnVBZ0FBMkFoQWdBRUVHTmdJTURKY0JDeUFCUVJWR0RWQWdBRUVBTmdJY0lBQWdCVFlDRkNBQVFmQ01nSUFBTmdJUUlBQkJHellDREVFQUlSQU1sZ0VMSUFBb0FnUWhCU0FBUVFBMkFnUWdBQ0FGSUJBUXFZQ0FnQUFpQlEwQklCQkJBV29oQlF0QnJRRWhFQXg3Q3lBQVFjRUJOZ0ljSUFBZ0JUWUNEQ0FBSUJCQkFXbzJBaFJCQUNFUURKTUJDeUFBS0FJRUlRWWdBRUVBTmdJRUlBQWdCaUFRRUttQWdJQUFJZ1lOQVNBUVFRRnFJUVlMUWE0QklSQU1lQXNnQUVIQ0FUWUNIQ0FBSUFZMkFnd2dBQ0FRUVFGcU5nSVVRUUFoRUF5UUFRc2dBRUVBTmdJY0lBQWdCellDRkNBQVFaZUxnSUFBTmdJUUlBQkJEVFlDREVFQUlSQU1qd0VMSUFCQkFEWUNIQ0FBSUFnMkFoUWdBRUhqa0lDQUFEWUNFQ0FBUVFrMkFneEJBQ0VRREk0QkN5QUFRUUEyQWh3Z0FDQUlOZ0lVSUFCQmxJMkFnQUEyQWhBZ0FFRWhOZ0lNUVFBaEVBeU5BUXRCQVNFV1FRQWhGMEVBSVJSQkFTRVFDeUFBSUJBNkFDc2dDVUVCYWlFSUFrQUNRQ0FBTFFBdFFSQnhEUUFDUUFKQUFrQWdBQzBBS2c0REFRQUNCQXNnRmtVTkF3d0NDeUFVRFFFTUFnc2dGMFVOQVFzZ0FDZ0NCQ0VRSUFCQkFEWUNCQ0FBSUJBZ0NCQ3RnSUNBQUNJUVJRMDlJQUJCeVFFMkFod2dBQ0FJTmdJVUlBQWdFRFlDREVFQUlSQU1qQUVMSUFBb0FnUWhCQ0FBUVFBMkFnUWdBQ0FFSUFnUXJZQ0FnQUFpQkVVTmRpQUFRY29CTmdJY0lBQWdDRFlDRkNBQUlBUTJBZ3hCQUNFUURJc0JDeUFBS0FJRUlRUWdBRUVBTmdJRUlBQWdCQ0FKRUsyQWdJQUFJZ1JGRFhRZ0FFSExBVFlDSENBQUlBazJBaFFnQUNBRU5nSU1RUUFoRUF5S0FRc2dBQ2dDQkNFRUlBQkJBRFlDQkNBQUlBUWdDaEN0Z0lDQUFDSUVSUTF5SUFCQnpRRTJBaHdnQUNBS05nSVVJQUFnQkRZQ0RFRUFJUkFNaVFFTEFrQWdDeTBBQUVGUWFpSVFRZjhCY1VFS1R3MEFJQUFnRURvQUtpQUxRUUZxSVFwQnRnRWhFQXh3Q3lBQUtBSUVJUVFnQUVFQU5nSUVJQUFnQkNBTEVLMkFnSUFBSWdSRkRYQWdBRUhQQVRZQ0hDQUFJQXMyQWhRZ0FDQUVOZ0lNUVFBaEVBeUlBUXNnQUVFQU5nSWNJQUFnQkRZQ0ZDQUFRWkN6Z0lBQU5nSVFJQUJCQ0RZQ0RDQUFRUUEyQWdCQkFDRVFESWNCQ3lBQlFSVkdEVDhnQUVFQU5nSWNJQUFnRERZQ0ZDQUFRY3lPZ0lBQU5nSVFJQUJCSURZQ0RFRUFJUkFNaGdFTElBQkJnUVE3QVNnZ0FDZ0NCQ0VRSUFCQ0FEY0RBQ0FBSUJBZ0RFRUJhaUlNRUt1QWdJQUFJaEJGRFRnZ0FFSFRBVFlDSENBQUlBdzJBaFFnQUNBUU5nSU1RUUFoRUF5RkFRc2dBRUVBTmdJQUMwRUFJUkFnQUVFQU5nSWNJQUFnQkRZQ0ZDQUFRZGliZ0lBQU5nSVFJQUJCQ0RZQ0RBeURBUXNnQUNnQ0JDRVFJQUJDQURjREFDQUFJQkFnQzBFQmFpSUxFS3VBZ0lBQUloQU5BVUhHQVNFUURHa0xJQUJCQWpvQUtBeFZDeUFBUWRVQk5nSWNJQUFnQ3pZQ0ZDQUFJQkEyQWd4QkFDRVFESUFCQ3lBUVFSVkdEVGNnQUVFQU5nSWNJQUFnQkRZQ0ZDQUFRYVNNZ0lBQU5nSVFJQUJCRURZQ0RFRUFJUkFNZndzZ0FDMEFORUVCUncwMElBQWdCQ0FDRUx5QWdJQUFJaEJGRFRRZ0VFRVZSdzAxSUFCQjNBRTJBaHdnQUNBRU5nSVVJQUJCMVphQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF4K0MwRUFJUkFnQUVFQU5nSWNJQUJCcjR1QWdBQTJBaEFnQUVFQ05nSU1JQUFnRkVFQmFqWUNGQXg5QzBFQUlSQU1Zd3RCQWlFUURHSUxRUTBoRUF4aEMwRVBJUkFNWUF0QkpTRVFERjhMUVJNaEVBeGVDMEVWSVJBTVhRdEJGaUVRREZ3TFFSY2hFQXhiQzBFWUlSQU1XZ3RCR1NFUURGa0xRUm9oRUF4WUMwRWJJUkFNVnd0QkhDRVFERllMUVIwaEVBeFZDMEVmSVJBTVZBdEJJU0VRREZNTFFTTWhFQXhTQzBIR0FDRVFERkVMUVM0aEVBeFFDMEV2SVJBTVR3dEJPeUVRREU0TFFUMGhFQXhOQzBISUFDRVFERXdMUWNrQUlSQU1Td3RCeXdBaEVBeEtDMEhNQUNFUURFa0xRYzRBSVJBTVNBdEIwUUFoRUF4SEMwSFZBQ0VRREVZTFFkZ0FJUkFNUlF0QjJRQWhFQXhFQzBIYkFDRVFERU1MUWVRQUlSQU1RZ3RCNVFBaEVBeEJDMEh4QUNFUURFQUxRZlFBSVJBTVB3dEJqUUVoRUF3K0MwR1hBU0VRREQwTFFha0JJUkFNUEF0QnJBRWhFQXc3QzBIQUFTRVFERG9MUWJrQklSQU1PUXRCcndFaEVBdzRDMEd4QVNFUUREY0xRYklCSVJBTU5ndEJ0QUVoRUF3MUMwRzFBU0VRRERRTFFib0JJUkFNTXd0QnZRRWhFQXd5QzBHL0FTRVFEREVMUWNFQklSQU1NQXNnQUVFQU5nSWNJQUFnQkRZQ0ZDQUFRZW1MZ0lBQU5nSVFJQUJCSHpZQ0RFRUFJUkFNU0FzZ0FFSGJBVFlDSENBQUlBUTJBaFFnQUVINmxvQ0FBRFlDRUNBQVFSVTJBZ3hCQUNFUURFY0xJQUJCK0FBMkFod2dBQ0FNTmdJVUlBQkJ5cGlBZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXhHQ3lBQVFkRUFOZ0ljSUFBZ0JUWUNGQ0FBUWJDWGdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTVJRc2dBRUg1QURZQ0hDQUFJQUUyQWhRZ0FDQVFOZ0lNUVFBaEVBeEVDeUFBUWZnQU5nSWNJQUFnQVRZQ0ZDQUFRY3FZZ0lBQU5nSVFJQUJCRlRZQ0RFRUFJUkFNUXdzZ0FFSGtBRFlDSENBQUlBRTJBaFFnQUVIamw0Q0FBRFlDRUNBQVFSVTJBZ3hCQUNFUURFSUxJQUJCMXdBMkFod2dBQ0FCTmdJVUlBQkJ5WmVBZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXhCQ3lBQVFRQTJBaHdnQUNBQk5nSVVJQUJCdVkyQWdBQTJBaEFnQUVFYU5nSU1RUUFoRUF4QUN5QUFRY0lBTmdJY0lBQWdBVFlDRkNBQVFlT1lnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1Qd3NnQUVFQU5nSUVJQUFnRHlBUEVMR0FnSUFBSWdSRkRRRWdBRUU2TmdJY0lBQWdCRFlDRENBQUlBOUJBV28yQWhSQkFDRVFERDRMSUFBb0FnUWhCQ0FBUVFBMkFnUUNRQ0FBSUFRZ0FSQ3hnSUNBQUNJRVJRMEFJQUJCT3pZQ0hDQUFJQVEyQWd3Z0FDQUJRUUZxTmdJVVFRQWhFQXcrQ3lBQlFRRnFJUUVNTFFzZ0QwRUJhaUVCREMwTElBQkJBRFlDSENBQUlBODJBaFFnQUVIa2tvQ0FBRFlDRUNBQVFRUTJBZ3hCQUNFUUREc0xJQUJCTmpZQ0hDQUFJQVEyQWhRZ0FDQUNOZ0lNUVFBaEVBdzZDeUFBUVM0MkFod2dBQ0FPTmdJVUlBQWdCRFlDREVFQUlSQU1PUXNnQUVIUUFEWUNIQ0FBSUFFMkFoUWdBRUdSbUlDQUFEWUNFQ0FBUVJVMkFneEJBQ0VRRERnTElBMUJBV29oQVF3c0N5QUFRUlUyQWh3Z0FDQUJOZ0lVSUFCQmdwbUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBdzJDeUFBUVJzMkFod2dBQ0FCTmdJVUlBQkJrWmVBZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXcxQ3lBQVFRODJBaHdnQUNBQk5nSVVJQUJCa1plQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF3MEN5QUFRUXMyQWh3Z0FDQUJOZ0lVSUFCQmtaZUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBd3pDeUFBUVJvMkFod2dBQ0FCTmdJVUlBQkJncG1BZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXd5Q3lBQVFRczJBaHdnQUNBQk5nSVVJQUJCZ3BtQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF3eEN5QUFRUW8yQWh3Z0FDQUJOZ0lVSUFCQjVKYUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBd3dDeUFBUVI0MkFod2dBQ0FCTmdJVUlBQkIrWmVBZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXd2Q3lBQVFRQTJBaHdnQUNBUU5nSVVJQUJCMm8yQWdBQTJBaEFnQUVFVU5nSU1RUUFoRUF3dUN5QUFRUVEyQWh3Z0FDQUJOZ0lVSUFCQnNKaUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBd3RDeUFBUVFBMkFnQWdDMEVCYWlFTEMwRzRBU0VRREJJTElBQkJBRFlDQUNBUVFRRnFJUUZCOVFBaEVBd1JDeUFCSVFFQ1FDQUFMUUFwUVFWSERRQkI0d0FoRUF3UkMwSGlBQ0VRREJBTFFRQWhFQ0FBUVFBMkFod2dBRUhra1lDQUFEWUNFQ0FBUVFjMkFnd2dBQ0FVUVFGcU5nSVVEQ2dMSUFCQkFEWUNBQ0FYUVFGcUlRRkJ3QUFoRUF3T0MwRUJJUUVMSUFBZ0FUb0FMQ0FBUVFBMkFnQWdGMEVCYWlFQkMwRW9JUkFNQ3dzZ0FTRUJDMEU0SVJBTUNRc0NRQ0FCSWc4Z0FrWU5BQU5BQWtBZ0R5MEFBRUdBdm9DQUFHb3RBQUFpQVVFQlJnMEFJQUZCQWtjTkF5QVBRUUZxSVFFTUJBc2dEMEVCYWlJUElBSkhEUUFMUVQ0aEVBd2lDMEUrSVJBTUlRc2dBRUVBT2dBc0lBOGhBUXdCQzBFTElSQU1CZ3RCT2lFUURBVUxJQUZCQVdvaEFVRXRJUkFNQkFzZ0FDQUJPZ0FzSUFCQkFEWUNBQ0FXUVFGcUlRRkJEQ0VRREFNTElBQkJBRFlDQUNBWFFRRnFJUUZCQ2lFUURBSUxJQUJCQURZQ0FBc2dBRUVBT2dBc0lBMGhBVUVKSVJBTUFBc0xRUUFoRUNBQVFRQTJBaHdnQUNBTE5nSVVJQUJCelpDQWdBQTJBaEFnQUVFSk5nSU1EQmNMUVFBaEVDQUFRUUEyQWh3Z0FDQUtOZ0lVSUFCQjZZcUFnQUEyQWhBZ0FFRUpOZ0lNREJZTFFRQWhFQ0FBUVFBMkFod2dBQ0FKTmdJVUlBQkJ0NUNBZ0FBMkFoQWdBRUVKTmdJTURCVUxRUUFoRUNBQVFRQTJBaHdnQUNBSU5nSVVJQUJCbkpHQWdBQTJBaEFnQUVFSk5nSU1EQlFMUVFBaEVDQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQnpaQ0FnQUEyQWhBZ0FFRUpOZ0lNREJNTFFRQWhFQ0FBUVFBMkFod2dBQ0FCTmdJVUlBQkI2WXFBZ0FBMkFoQWdBRUVKTmdJTURCSUxRUUFoRUNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCdDVDQWdBQTJBaEFnQUVFSk5nSU1EQkVMUVFBaEVDQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQm5KR0FnQUEyQWhBZ0FFRUpOZ0lNREJBTFFRQWhFQ0FBUVFBMkFod2dBQ0FCTmdJVUlBQkJsNVdBZ0FBMkFoQWdBRUVQTmdJTURBOExRUUFoRUNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCbDVXQWdBQTJBaEFnQUVFUE5nSU1EQTRMUVFBaEVDQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQndKS0FnQUEyQWhBZ0FFRUxOZ0lNREEwTFFRQWhFQ0FBUVFBMkFod2dBQ0FCTmdJVUlBQkJsWW1BZ0FBMkFoQWdBRUVMTmdJTURBd0xRUUFoRUNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCNFkrQWdBQTJBaEFnQUVFS05nSU1EQXNMUVFBaEVDQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQis0K0FnQUEyQWhBZ0FFRUtOZ0lNREFvTFFRQWhFQ0FBUVFBMkFod2dBQ0FCTmdJVUlBQkI4Wm1BZ0FBMkFoQWdBRUVDTmdJTURBa0xRUUFoRUNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCeEpTQWdBQTJBaEFnQUVFQ05nSU1EQWdMUVFBaEVDQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQjhwV0FnQUEyQWhBZ0FFRUNOZ0lNREFjTElBQkJBallDSENBQUlBRTJBaFFnQUVHY21vQ0FBRFlDRUNBQVFSWTJBZ3hCQUNFUURBWUxRUUVoRUF3RkMwSFVBQ0VRSUFFaUJDQUNSZzBFSUFOQkNHb2dBQ0FFSUFKQjJNS0FnQUJCQ2hERmdJQ0FBQ0FES0FJTUlRUWdBeWdDQ0E0REFRUUNBQXNReW9DQWdBQUFDeUFBUVFBMkFod2dBRUcxbW9DQUFEWUNFQ0FBUVJjMkFnd2dBQ0FFUVFGcU5nSVVRUUFoRUF3Q0N5QUFRUUEyQWh3Z0FDQUVOZ0lVSUFCQnlwcUFnQUEyQWhBZ0FFRUpOZ0lNUVFBaEVBd0JDd0pBSUFFaUJDQUNSdzBBUVNJaEVBd0JDeUFBUVltQWdJQUFOZ0lJSUFBZ0JEWUNCRUVoSVJBTElBTkJFR29rZ0lDQWdBQWdFQXV2QVFFQ2Z5QUJLQUlBSVFZQ1FBSkFJQUlnQTBZTkFDQUVJQVpxSVFRZ0JpQURhaUFDYXlFSElBSWdCa0YvY3lBRmFpSUdhaUVGQTBBQ1FDQUNMUUFBSUFRdEFBQkdEUUJCQWlFRURBTUxBa0FnQmcwQVFRQWhCQ0FGSVFJTUF3c2dCa0YvYWlFR0lBUkJBV29oQkNBQ1FRRnFJZ0lnQTBjTkFBc2dCeUVHSUFNaEFnc2dBRUVCTmdJQUlBRWdCallDQUNBQUlBSTJBZ1FQQ3lBQlFRQTJBZ0FnQUNBRU5nSUFJQUFnQWpZQ0JBc0tBQ0FBRU1lQWdJQUFDL0kyQVF0L0k0Q0FnSUFBUVJCcklnRWtnSUNBZ0FBQ1FFRUFLQUtnMElDQUFBMEFRUUFReTRDQWdBQkJnTlNFZ0FCcklnSkIyUUJKRFFCQkFDRURBa0JCQUNnQzROT0FnQUFpQkEwQVFRQkNmemNDN05PQWdBQkJBRUtBZ0lTQWdJREFBRGNDNU5PQWdBQkJBQ0FCUVFocVFYQnhRZGlxMWFvRmN5SUVOZ0xnMDRDQUFFRUFRUUEyQXZUVGdJQUFRUUJCQURZQ3hOT0FnQUFMUVFBZ0FqWUN6Tk9BZ0FCQkFFR0ExSVNBQURZQ3lOT0FnQUJCQUVHQTFJU0FBRFlDbU5DQWdBQkJBQ0FFTmdLczBJQ0FBRUVBUVg4MkFxalFnSUFBQTBBZ0EwSEUwSUNBQUdvZ0EwRzQwSUNBQUdvaUJEWUNBQ0FFSUFOQnNOQ0FnQUJxSWdVMkFnQWdBMEc4MElDQUFHb2dCVFlDQUNBRFFjelFnSUFBYWlBRFFjRFFnSUFBYWlJRk5nSUFJQVVnQkRZQ0FDQURRZFRRZ0lBQWFpQURRY2pRZ0lBQWFpSUVOZ0lBSUFRZ0JUWUNBQ0FEUWREUWdJQUFhaUFFTmdJQUlBTkJJR29pQTBHQUFrY05BQXRCZ05TRWdBQkJlRUdBMUlTQUFHdEJEM0ZCQUVHQTFJU0FBRUVJYWtFUGNSc2lBMm9pQkVFRWFpQUNRVWhxSWdVZ0Eyc2lBMEVCY2pZQ0FFRUFRUUFvQXZEVGdJQUFOZ0trMElDQUFFRUFJQU0yQXBUUWdJQUFRUUFnQkRZQ29OQ0FnQUJCZ05TRWdBQWdCV3BCT0RZQ0JBc0NRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0FFSHNBVXNOQUFKQVFRQW9Bb2pRZ0lBQUlnWkJFQ0FBUVJOcVFYQnhJQUJCQzBrYklnSkJBM1lpQkhZaUEwRURjVVVOQUFKQUFrQWdBMEVCY1NBRWNrRUJjeUlGUVFOMElnUkJzTkNBZ0FCcUlnTWdCRUc0MElDQUFHb29BZ0FpQkNnQ0NDSUNSdzBBUVFBZ0JrRitJQVYzY1RZQ2lOQ0FnQUFNQVFzZ0F5QUNOZ0lJSUFJZ0F6WUNEQXNnQkVFSWFpRURJQVFnQlVFRGRDSUZRUU55TmdJRUlBUWdCV29pQkNBRUtBSUVRUUZ5TmdJRURBd0xJQUpCQUNnQ2tOQ0FnQUFpQjAwTkFRSkFJQU5GRFFBQ1FBSkFJQU1nQkhSQkFpQUVkQ0lEUVFBZ0EydHljU0lEUVFBZ0EydHhRWDlxSWdNZ0EwRU1ka0VRY1NJRGRpSUVRUVYyUVFoeElnVWdBM0lnQkNBRmRpSURRUUoyUVFSeElnUnlJQU1nQkhZaUEwRUJka0VDY1NJRWNpQURJQVIySWdOQkFYWkJBWEVpQkhJZ0F5QUVkbW9pQkVFRGRDSURRYkRRZ0lBQWFpSUZJQU5CdU5DQWdBQnFLQUlBSWdNb0FnZ2lBRWNOQUVFQUlBWkJmaUFFZDNFaUJqWUNpTkNBZ0FBTUFRc2dCU0FBTmdJSUlBQWdCVFlDREFzZ0F5QUNRUU55TmdJRUlBTWdCRUVEZENJRWFpQUVJQUpySWdVMkFnQWdBeUFDYWlJQUlBVkJBWEkyQWdRQ1FDQUhSUTBBSUFkQmVIRkJzTkNBZ0FCcUlRSkJBQ2dDbk5DQWdBQWhCQUpBQWtBZ0JrRUJJQWRCQTNaMElnaHhEUUJCQUNBR0lBaHlOZ0tJMElDQUFDQUNJUWdNQVFzZ0FpZ0NDQ0VJQ3lBSUlBUTJBZ3dnQWlBRU5nSUlJQVFnQWpZQ0RDQUVJQWcyQWdnTElBTkJDR29oQTBFQUlBQTJBcHpRZ0lBQVFRQWdCVFlDa05DQWdBQU1EQXRCQUNnQ2pOQ0FnQUFpQ1VVTkFTQUpRUUFnQ1d0eFFYOXFJZ01nQTBFTWRrRVFjU0lEZGlJRVFRVjJRUWh4SWdVZ0EzSWdCQ0FGZGlJRFFRSjJRUVJ4SWdSeUlBTWdCSFlpQTBFQmRrRUNjU0lFY2lBRElBUjJJZ05CQVhaQkFYRWlCSElnQXlBRWRtcEJBblJCdU5LQWdBQnFLQUlBSWdBb0FnUkJlSEVnQW1zaEJDQUFJUVVDUUFOQUFrQWdCU2dDRUNJRERRQWdCVUVVYWlnQ0FDSURSUTBDQ3lBREtBSUVRWGh4SUFKcklnVWdCQ0FGSUFSSklnVWJJUVFnQXlBQUlBVWJJUUFnQXlFRkRBQUxDeUFBS0FJWUlRb0NRQ0FBS0FJTUlnZ2dBRVlOQUNBQUtBSUlJZ05CQUNnQ21OQ0FnQUJKR2lBSUlBTTJBZ2dnQXlBSU5nSU1EQXNMQWtBZ0FFRVVhaUlGS0FJQUlnTU5BQ0FBS0FJUUlnTkZEUU1nQUVFUWFpRUZDd05BSUFVaEN5QURJZ2hCRkdvaUJTZ0NBQ0lERFFBZ0NFRVFhaUVGSUFnb0FoQWlBdzBBQ3lBTFFRQTJBZ0FNQ2d0QmZ5RUNJQUJCdjM5TERRQWdBRUVUYWlJRFFYQnhJUUpCQUNnQ2pOQ0FnQUFpQjBVTkFFRUFJUXNDUUNBQ1FZQUNTUTBBUVI4aEN5QUNRZi8vL3dkTERRQWdBMEVJZGlJRElBTkJnUDQvYWtFUWRrRUljU0lEZENJRUlBUkJnT0FmYWtFUWRrRUVjU0lFZENJRklBVkJnSUFQYWtFUWRrRUNjU0lGZEVFUGRpQURJQVJ5SUFWeWF5SURRUUYwSUFJZ0EwRVZhblpCQVhGeVFSeHFJUXNMUVFBZ0Ftc2hCQUpBQWtBQ1FBSkFJQXRCQW5SQnVOS0FnQUJxS0FJQUlnVU5BRUVBSVFOQkFDRUlEQUVMUVFBaEF5QUNRUUJCR1NBTFFRRjJheUFMUVI5R0czUWhBRUVBSVFnRFFBSkFJQVVvQWdSQmVIRWdBbXNpQmlBRVR3MEFJQVloQkNBRklRZ2dCZzBBUVFBaEJDQUZJUWdnQlNFRERBTUxJQU1nQlVFVWFpZ0NBQ0lHSUFZZ0JTQUFRUjEyUVFSeGFrRVFhaWdDQUNJRlJoc2dBeUFHR3lFRElBQkJBWFFoQUNBRkRRQUxDd0pBSUFNZ0NISU5BRUVBSVFoQkFpQUxkQ0lEUVFBZ0EydHlJQWR4SWdORkRRTWdBMEVBSUFOcmNVRi9haUlESUFOQkRIWkJFSEVpQTNZaUJVRUZka0VJY1NJQUlBTnlJQVVnQUhZaUEwRUNka0VFY1NJRmNpQURJQVYySWdOQkFYWkJBbkVpQlhJZ0F5QUZkaUlEUVFGMlFRRnhJZ1Z5SUFNZ0JYWnFRUUowUWJqU2dJQUFhaWdDQUNFREN5QURSUTBCQ3dOQUlBTW9BZ1JCZUhFZ0Ftc2lCaUFFU1NFQUFrQWdBeWdDRUNJRkRRQWdBMEVVYWlnQ0FDRUZDeUFHSUFRZ0FCc2hCQ0FESUFnZ0FCc2hDQ0FGSVFNZ0JRMEFDd3NnQ0VVTkFDQUVRUUFvQXBEUWdJQUFJQUpyVHcwQUlBZ29BaGdoQ3dKQUlBZ29BZ3dpQUNBSVJnMEFJQWdvQWdnaUEwRUFLQUtZMElDQUFFa2FJQUFnQXpZQ0NDQURJQUEyQWd3TUNRc0NRQ0FJUVJScUlnVW9BZ0FpQXcwQUlBZ29BaEFpQTBVTkF5QUlRUkJxSVFVTEEwQWdCU0VHSUFNaUFFRVVhaUlGS0FJQUlnTU5BQ0FBUVJCcUlRVWdBQ2dDRUNJRERRQUxJQVpCQURZQ0FBd0lDd0pBUVFBb0FwRFFnSUFBSWdNZ0Fra05BRUVBS0FLYzBJQ0FBQ0VFQWtBQ1FDQURJQUpySWdWQkVFa05BQ0FFSUFKcUlnQWdCVUVCY2pZQ0JFRUFJQVUyQXBEUWdJQUFRUUFnQURZQ25OQ0FnQUFnQkNBRGFpQUZOZ0lBSUFRZ0FrRURjallDQkF3QkN5QUVJQU5CQTNJMkFnUWdCQ0FEYWlJRElBTW9BZ1JCQVhJMkFnUkJBRUVBTmdLYzBJQ0FBRUVBUVFBMkFwRFFnSUFBQ3lBRVFRaHFJUU1NQ2dzQ1FFRUFLQUtVMElDQUFDSUFJQUpORFFCQkFDZ0NvTkNBZ0FBaUF5QUNhaUlFSUFBZ0Ftc2lCVUVCY2pZQ0JFRUFJQVUyQXBUUWdJQUFRUUFnQkRZQ29OQ0FnQUFnQXlBQ1FRTnlOZ0lFSUFOQkNHb2hBd3dLQ3dKQUFrQkJBQ2dDNE5PQWdBQkZEUUJCQUNnQzZOT0FnQUFoQkF3QkMwRUFRbjgzQXV6VGdJQUFRUUJDZ0lDRWdJQ0F3QUEzQXVUVGdJQUFRUUFnQVVFTWFrRndjVUhZcXRXcUJYTTJBdURUZ0lBQVFRQkJBRFlDOU5PQWdBQkJBRUVBTmdMRTA0Q0FBRUdBZ0FRaEJBdEJBQ0VEQWtBZ0JDQUNRY2NBYWlJSGFpSUdRUUFnQkdzaUMzRWlDQ0FDU3cwQVFRQkJNRFlDK05PQWdBQU1DZ3NDUUVFQUtBTEEwNENBQUNJRFJRMEFBa0JCQUNnQ3VOT0FnQUFpQkNBSWFpSUZJQVJORFFBZ0JTQURUUTBCQzBFQUlRTkJBRUV3TmdMNDA0Q0FBQXdLQzBFQUxRREUwNENBQUVFRWNRMEVBa0FDUUFKQVFRQW9BcURRZ0lBQUlnUkZEUUJCeU5PQWdBQWhBd05BQWtBZ0F5Z0NBQ0lGSUFSTERRQWdCU0FES0FJRWFpQUVTdzBEQ3lBREtBSUlJZ01OQUFzTFFRQVF5NENBZ0FBaUFFRi9SZzBGSUFnaEJnSkFRUUFvQXVUVGdJQUFJZ05CZjJvaUJDQUFjVVVOQUNBSUlBQnJJQVFnQUdwQkFDQURhM0ZxSVFZTElBWWdBazBOQlNBR1FmNy8vLzhIU3cwRkFrQkJBQ2dDd05PQWdBQWlBMFVOQUVFQUtBSzQwNENBQUNJRUlBWnFJZ1VnQkUwTkJpQUZJQU5MRFFZTElBWVF5NENBZ0FBaUF5QUFSdzBCREFjTElBWWdBR3NnQzNFaUJrSCsvLy8vQjBzTkJDQUdFTXVBZ0lBQUlnQWdBeWdDQUNBREtBSUVha1lOQXlBQUlRTUxBa0FnQTBGL1JnMEFJQUpCeUFCcUlBWk5EUUFDUUNBSElBWnJRUUFvQXVqVGdJQUFJZ1JxUVFBZ0JHdHhJZ1JCL3YvLy93ZE5EUUFnQXlFQURBY0xBa0FnQkJETGdJQ0FBRUYvUmcwQUlBUWdCbW9oQmlBRElRQU1Cd3RCQUNBR2F4RExnSUNBQUJvTUJBc2dBeUVBSUFOQmYwY05CUXdEQzBFQUlRZ01Cd3RCQUNFQURBVUxJQUJCZjBjTkFndEJBRUVBS0FMRTA0Q0FBRUVFY2pZQ3hOT0FnQUFMSUFoQi92Ly8vd2RMRFFFZ0NCRExnSUNBQUNFQVFRQVF5NENBZ0FBaEF5QUFRWDlHRFFFZ0EwRi9SZzBCSUFBZ0EwOE5BU0FESUFCcklnWWdBa0U0YWswTkFRdEJBRUVBS0FLNDA0Q0FBQ0FHYWlJRE5nSzQwNENBQUFKQUlBTkJBQ2dDdk5PQWdBQk5EUUJCQUNBRE5nSzgwNENBQUFzQ1FBSkFBa0FDUUVFQUtBS2cwSUNBQUNJRVJRMEFRY2pUZ0lBQUlRTURRQ0FBSUFNb0FnQWlCU0FES0FJRUlnaHFSZzBDSUFNb0FnZ2lBdzBBREFNTEN3SkFBa0JCQUNnQ21OQ0FnQUFpQTBVTkFDQUFJQU5QRFFFTFFRQWdBRFlDbU5DQWdBQUxRUUFoQTBFQUlBWTJBc3pUZ0lBQVFRQWdBRFlDeU5PQWdBQkJBRUYvTmdLbzBJQ0FBRUVBUVFBb0F1RFRnSUFBTmdLczBJQ0FBRUVBUVFBMkF0VFRnSUFBQTBBZ0EwSEUwSUNBQUdvZ0EwRzQwSUNBQUdvaUJEWUNBQ0FFSUFOQnNOQ0FnQUJxSWdVMkFnQWdBMEc4MElDQUFHb2dCVFlDQUNBRFFjelFnSUFBYWlBRFFjRFFnSUFBYWlJRk5nSUFJQVVnQkRZQ0FDQURRZFRRZ0lBQWFpQURRY2pRZ0lBQWFpSUVOZ0lBSUFRZ0JUWUNBQ0FEUWREUWdJQUFhaUFFTmdJQUlBTkJJR29pQTBHQUFrY05BQXNnQUVGNElBQnJRUTl4UVFBZ0FFRUlha0VQY1JzaUEyb2lCQ0FHUVVocUlnVWdBMnNpQTBFQmNqWUNCRUVBUVFBb0F2RFRnSUFBTmdLazBJQ0FBRUVBSUFNMkFwVFFnSUFBUVFBZ0JEWUNvTkNBZ0FBZ0FDQUZha0U0TmdJRURBSUxJQU10QUF4QkNIRU5BQ0FFSUFWSkRRQWdCQ0FBVHcwQUlBUkJlQ0FFYTBFUGNVRUFJQVJCQ0dwQkQzRWJJZ1ZxSWdCQkFDZ0NsTkNBZ0FBZ0Jtb2lDeUFGYXlJRlFRRnlOZ0lFSUFNZ0NDQUdhallDQkVFQVFRQW9BdkRUZ0lBQU5nS2swSUNBQUVFQUlBVTJBcFRRZ0lBQVFRQWdBRFlDb05DQWdBQWdCQ0FMYWtFNE5nSUVEQUVMQWtBZ0FFRUFLQUtZMElDQUFDSUlUdzBBUVFBZ0FEWUNtTkNBZ0FBZ0FDRUlDeUFBSUFacUlRVkJ5Tk9BZ0FBaEF3SkFBa0FDUUFKQUFrQUNRQUpBQTBBZ0F5Z0NBQ0FGUmcwQklBTW9BZ2dpQXcwQURBSUxDeUFETFFBTVFRaHhSUTBCQzBISTA0Q0FBQ0VEQTBBQ1FDQURLQUlBSWdVZ0JFc05BQ0FGSUFNb0FnUnFJZ1VnQkVzTkF3c2dBeWdDQ0NFRERBQUxDeUFESUFBMkFnQWdBeUFES0FJRUlBWnFOZ0lFSUFCQmVDQUFhMEVQY1VFQUlBQkJDR3BCRDNFYmFpSUxJQUpCQTNJMkFnUWdCVUY0SUFWclFROXhRUUFnQlVFSWFrRVBjUnRxSWdZZ0N5QUNhaUlDYXlFREFrQWdCaUFFUncwQVFRQWdBallDb05DQWdBQkJBRUVBS0FLVTBJQ0FBQ0FEYWlJRE5nS1UwSUNBQUNBQ0lBTkJBWEkyQWdRTUF3c0NRQ0FHUVFBb0FwelFnSUFBUncwQVFRQWdBallDbk5DQWdBQkJBRUVBS0FLUTBJQ0FBQ0FEYWlJRE5nS1EwSUNBQUNBQ0lBTkJBWEkyQWdRZ0FpQURhaUFETmdJQURBTUxBa0FnQmlnQ0JDSUVRUU54UVFGSERRQWdCRUY0Y1NFSEFrQUNRQ0FFUWY4QlN3MEFJQVlvQWdnaUJTQUVRUU4ySWdoQkEzUkJzTkNBZ0FCcUlnQkdHZ0pBSUFZb0Fnd2lCQ0FGUncwQVFRQkJBQ2dDaU5DQWdBQkJmaUFJZDNFMkFvalFnSUFBREFJTElBUWdBRVlhSUFRZ0JUWUNDQ0FGSUFRMkFnd01BUXNnQmlnQ0dDRUpBa0FDUUNBR0tBSU1JZ0FnQmtZTkFDQUdLQUlJSWdRZ0NFa2FJQUFnQkRZQ0NDQUVJQUEyQWd3TUFRc0NRQ0FHUVJScUlnUW9BZ0FpQlEwQUlBWkJFR29pQkNnQ0FDSUZEUUJCQUNFQURBRUxBMEFnQkNFSUlBVWlBRUVVYWlJRUtBSUFJZ1VOQUNBQVFSQnFJUVFnQUNnQ0VDSUZEUUFMSUFoQkFEWUNBQXNnQ1VVTkFBSkFBa0FnQmlBR0tBSWNJZ1ZCQW5SQnVOS0FnQUJxSWdRb0FnQkhEUUFnQkNBQU5nSUFJQUFOQVVFQVFRQW9Bb3pRZ0lBQVFYNGdCWGR4TmdLTTBJQ0FBQXdDQ3lBSlFSQkJGQ0FKS0FJUUlBWkdHMm9nQURZQ0FDQUFSUTBCQ3lBQUlBazJBaGdDUUNBR0tBSVFJZ1JGRFFBZ0FDQUVOZ0lRSUFRZ0FEWUNHQXNnQmlnQ0ZDSUVSUTBBSUFCQkZHb2dCRFlDQUNBRUlBQTJBaGdMSUFjZ0Eyb2hBeUFHSUFkcUlnWW9BZ1FoQkFzZ0JpQUVRWDV4TmdJRUlBSWdBMm9nQXpZQ0FDQUNJQU5CQVhJMkFnUUNRQ0FEUWY4QlN3MEFJQU5CZUhGQnNOQ0FnQUJxSVFRQ1FBSkFRUUFvQW9qUWdJQUFJZ1ZCQVNBRFFRTjJkQ0lEY1EwQVFRQWdCU0FEY2pZQ2lOQ0FnQUFnQkNFRERBRUxJQVFvQWdnaEF3c2dBeUFDTmdJTUlBUWdBallDQ0NBQ0lBUTJBZ3dnQWlBRE5nSUlEQU1MUVI4aEJBSkFJQU5CLy8vL0Iwc05BQ0FEUVFoMklnUWdCRUdBL2o5cVFSQjJRUWh4SWdSMElnVWdCVUdBNEI5cVFSQjJRUVJ4SWdWMElnQWdBRUdBZ0E5cVFSQjJRUUp4SWdCMFFROTJJQVFnQlhJZ0FISnJJZ1JCQVhRZ0F5QUVRUlZxZGtFQmNYSkJIR29oQkFzZ0FpQUVOZ0ljSUFKQ0FEY0NFQ0FFUVFKMFFialNnSUFBYWlFRkFrQkJBQ2dDak5DQWdBQWlBRUVCSUFSMElnaHhEUUFnQlNBQ05nSUFRUUFnQUNBSWNqWUNqTkNBZ0FBZ0FpQUZOZ0lZSUFJZ0FqWUNDQ0FDSUFJMkFnd01Bd3NnQTBFQVFSa2dCRUVCZG1zZ0JFRWZSaHQwSVFRZ0JTZ0NBQ0VBQTBBZ0FDSUZLQUlFUVhoeElBTkdEUUlnQkVFZGRpRUFJQVJCQVhRaEJDQUZJQUJCQkhGcVFSQnFJZ2dvQWdBaUFBMEFDeUFJSUFJMkFnQWdBaUFGTmdJWUlBSWdBallDRENBQ0lBSTJBZ2dNQWdzZ0FFRjRJQUJyUVE5eFFRQWdBRUVJYWtFUGNSc2lBMm9pQ3lBR1FVaHFJZ2dnQTJzaUEwRUJjallDQkNBQUlBaHFRVGcyQWdRZ0JDQUZRVGNnQld0QkQzRkJBQ0FGUVVscVFROXhHMnBCUVdvaUNDQUlJQVJCRUdwSkd5SUlRU00yQWdSQkFFRUFLQUx3MDRDQUFEWUNwTkNBZ0FCQkFDQUROZ0tVMElDQUFFRUFJQXMyQXFEUWdJQUFJQWhCRUdwQkFDa0MwTk9BZ0FBM0FnQWdDRUVBS1FMSTA0Q0FBRGNDQ0VFQUlBaEJDR28yQXREVGdJQUFRUUFnQmpZQ3pOT0FnQUJCQUNBQU5nTEkwNENBQUVFQVFRQTJBdFRUZ0lBQUlBaEJKR29oQXdOQUlBTkJCellDQUNBRFFRUnFJZ01nQlVrTkFBc2dDQ0FFUmcwRElBZ2dDQ2dDQkVGK2NUWUNCQ0FJSUFnZ0JHc2lBRFlDQUNBRUlBQkJBWEkyQWdRQ1FDQUFRZjhCU3cwQUlBQkJlSEZCc05DQWdBQnFJUU1DUUFKQVFRQW9Bb2pRZ0lBQUlnVkJBU0FBUVFOMmRDSUFjUTBBUVFBZ0JTQUFjallDaU5DQWdBQWdBeUVGREFFTElBTW9BZ2doQlFzZ0JTQUVOZ0lNSUFNZ0JEWUNDQ0FFSUFNMkFnd2dCQ0FGTmdJSURBUUxRUjhoQXdKQUlBQkIvLy8vQjBzTkFDQUFRUWgySWdNZ0EwR0EvajlxUVJCMlFRaHhJZ04wSWdVZ0JVR0E0QjlxUVJCMlFRUnhJZ1YwSWdnZ0NFR0FnQTlxUVJCMlFRSnhJZ2gwUVE5MklBTWdCWElnQ0hKcklnTkJBWFFnQUNBRFFSVnFka0VCY1hKQkhHb2hBd3NnQkNBRE5nSWNJQVJDQURjQ0VDQURRUUowUWJqU2dJQUFhaUVGQWtCQkFDZ0NqTkNBZ0FBaUNFRUJJQU4wSWdaeERRQWdCU0FFTmdJQVFRQWdDQ0FHY2pZQ2pOQ0FnQUFnQkNBRk5nSVlJQVFnQkRZQ0NDQUVJQVEyQWd3TUJBc2dBRUVBUVJrZ0EwRUJkbXNnQTBFZlJodDBJUU1nQlNnQ0FDRUlBMEFnQ0NJRktBSUVRWGh4SUFCR0RRTWdBMEVkZGlFSUlBTkJBWFFoQXlBRklBaEJCSEZxUVJCcUlnWW9BZ0FpQ0EwQUN5QUdJQVEyQWdBZ0JDQUZOZ0lZSUFRZ0JEWUNEQ0FFSUFRMkFnZ01Bd3NnQlNnQ0NDSURJQUkyQWd3Z0JTQUNOZ0lJSUFKQkFEWUNHQ0FDSUFVMkFnd2dBaUFETmdJSUN5QUxRUWhxSVFNTUJRc2dCU2dDQ0NJRElBUTJBZ3dnQlNBRU5nSUlJQVJCQURZQ0dDQUVJQVUyQWd3Z0JDQUROZ0lJQzBFQUtBS1UwSUNBQUNJRElBSk5EUUJCQUNnQ29OQ0FnQUFpQkNBQ2FpSUZJQU1nQW1zaUEwRUJjallDQkVFQUlBTTJBcFRRZ0lBQVFRQWdCVFlDb05DQWdBQWdCQ0FDUVFOeU5nSUVJQVJCQ0dvaEF3d0RDMEVBSVFOQkFFRXdOZ0w0MDRDQUFBd0NDd0pBSUF0RkRRQUNRQUpBSUFnZ0NDZ0NIQ0lGUVFKMFFialNnSUFBYWlJREtBSUFSdzBBSUFNZ0FEWUNBQ0FBRFFGQkFDQUhRWDRnQlhkeElnYzJBb3pRZ0lBQURBSUxJQXRCRUVFVUlBc29BaEFnQ0VZYmFpQUFOZ0lBSUFCRkRRRUxJQUFnQ3pZQ0dBSkFJQWdvQWhBaUEwVU5BQ0FBSUFNMkFoQWdBeUFBTmdJWUN5QUlRUlJxS0FJQUlnTkZEUUFnQUVFVWFpQUROZ0lBSUFNZ0FEWUNHQXNDUUFKQUlBUkJEMHNOQUNBSUlBUWdBbW9pQTBFRGNqWUNCQ0FJSUFOcUlnTWdBeWdDQkVFQmNqWUNCQXdCQ3lBSUlBSnFJZ0FnQkVFQmNqWUNCQ0FJSUFKQkEzSTJBZ1FnQUNBRWFpQUVOZ0lBQWtBZ0JFSC9BVXNOQUNBRVFYaHhRYkRRZ0lBQWFpRURBa0FDUUVFQUtBS0kwSUNBQUNJRlFRRWdCRUVEZG5RaUJIRU5BRUVBSUFVZ0JISTJBb2pRZ0lBQUlBTWhCQXdCQ3lBREtBSUlJUVFMSUFRZ0FEWUNEQ0FESUFBMkFnZ2dBQ0FETmdJTUlBQWdCRFlDQ0F3QkMwRWZJUU1DUUNBRVFmLy8vd2RMRFFBZ0JFRUlkaUlESUFOQmdQNC9ha0VRZGtFSWNTSURkQ0lGSUFWQmdPQWZha0VRZGtFRWNTSUZkQ0lDSUFKQmdJQVBha0VRZGtFQ2NTSUNkRUVQZGlBRElBVnlJQUp5YXlJRFFRRjBJQVFnQTBFVmFuWkJBWEZ5UVJ4cUlRTUxJQUFnQXpZQ0hDQUFRZ0EzQWhBZ0EwRUNkRUc0MG9DQUFHb2hCUUpBSUFkQkFTQURkQ0lDY1EwQUlBVWdBRFlDQUVFQUlBY2dBbkkyQW96UWdJQUFJQUFnQlRZQ0dDQUFJQUEyQWdnZ0FDQUFOZ0lNREFFTElBUkJBRUVaSUFOQkFYWnJJQU5CSDBZYmRDRURJQVVvQWdBaEFnSkFBMEFnQWlJRktBSUVRWGh4SUFSR0RRRWdBMEVkZGlFQ0lBTkJBWFFoQXlBRklBSkJCSEZxUVJCcUlnWW9BZ0FpQWcwQUN5QUdJQUEyQWdBZ0FDQUZOZ0lZSUFBZ0FEWUNEQ0FBSUFBMkFnZ01BUXNnQlNnQ0NDSURJQUEyQWd3Z0JTQUFOZ0lJSUFCQkFEWUNHQ0FBSUFVMkFnd2dBQ0FETmdJSUN5QUlRUWhxSVFNTUFRc0NRQ0FLUlEwQUFrQUNRQ0FBSUFBb0Fod2lCVUVDZEVHNDBvQ0FBR29pQXlnQ0FFY05BQ0FESUFnMkFnQWdDQTBCUVFBZ0NVRitJQVYzY1RZQ2pOQ0FnQUFNQWdzZ0NrRVFRUlFnQ2lnQ0VDQUFSaHRxSUFnMkFnQWdDRVVOQVFzZ0NDQUtOZ0lZQWtBZ0FDZ0NFQ0lEUlEwQUlBZ2dBellDRUNBRElBZzJBaGdMSUFCQkZHb29BZ0FpQTBVTkFDQUlRUlJxSUFNMkFnQWdBeUFJTmdJWUN3SkFBa0FnQkVFUFN3MEFJQUFnQkNBQ2FpSURRUU55TmdJRUlBQWdBMm9pQXlBREtBSUVRUUZ5TmdJRURBRUxJQUFnQW1vaUJTQUVRUUZ5TmdJRUlBQWdBa0VEY2pZQ0JDQUZJQVJxSUFRMkFnQUNRQ0FIUlEwQUlBZEJlSEZCc05DQWdBQnFJUUpCQUNnQ25OQ0FnQUFoQXdKQUFrQkJBU0FIUVFOMmRDSUlJQVp4RFFCQkFDQUlJQVp5TmdLSTBJQ0FBQ0FDSVFnTUFRc2dBaWdDQ0NFSUN5QUlJQU0yQWd3Z0FpQUROZ0lJSUFNZ0FqWUNEQ0FESUFnMkFnZ0xRUUFnQlRZQ25OQ0FnQUJCQUNBRU5nS1EwSUNBQUFzZ0FFRUlhaUVEQ3lBQlFSQnFKSUNBZ0lBQUlBTUxDZ0FnQUJESmdJQ0FBQXZpRFFFSGZ3SkFJQUJGRFFBZ0FFRjRhaUlCSUFCQmZHb29BZ0FpQWtGNGNTSUFhaUVEQWtBZ0FrRUJjUTBBSUFKQkEzRkZEUUVnQVNBQktBSUFJZ0pySWdGQkFDZ0NtTkNBZ0FBaUJFa05BU0FDSUFCcUlRQUNRQ0FCUVFBb0FwelFnSUFBUmcwQUFrQWdBa0gvQVVzTkFDQUJLQUlJSWdRZ0FrRURkaUlGUVFOMFFiRFFnSUFBYWlJR1Job0NRQ0FCS0FJTUlnSWdCRWNOQUVFQVFRQW9Bb2pRZ0lBQVFYNGdCWGR4TmdLSTBJQ0FBQXdEQ3lBQ0lBWkdHaUFDSUFRMkFnZ2dCQ0FDTmdJTURBSUxJQUVvQWhnaEJ3SkFBa0FnQVNnQ0RDSUdJQUZHRFFBZ0FTZ0NDQ0lDSUFSSkdpQUdJQUkyQWdnZ0FpQUdOZ0lNREFFTEFrQWdBVUVVYWlJQ0tBSUFJZ1FOQUNBQlFSQnFJZ0lvQWdBaUJBMEFRUUFoQmd3QkN3TkFJQUloQlNBRUlnWkJGR29pQWlnQ0FDSUVEUUFnQmtFUWFpRUNJQVlvQWhBaUJBMEFDeUFGUVFBMkFnQUxJQWRGRFFFQ1FBSkFJQUVnQVNnQ0hDSUVRUUowUWJqU2dJQUFhaUlDS0FJQVJ3MEFJQUlnQmpZQ0FDQUdEUUZCQUVFQUtBS00wSUNBQUVGK0lBUjNjVFlDak5DQWdBQU1Bd3NnQjBFUVFSUWdCeWdDRUNBQlJodHFJQVkyQWdBZ0JrVU5BZ3NnQmlBSE5nSVlBa0FnQVNnQ0VDSUNSUTBBSUFZZ0FqWUNFQ0FDSUFZMkFoZ0xJQUVvQWhRaUFrVU5BU0FHUVJScUlBSTJBZ0FnQWlBR05nSVlEQUVMSUFNb0FnUWlBa0VEY1VFRFJ3MEFJQU1nQWtGK2NUWUNCRUVBSUFBMkFwRFFnSUFBSUFFZ0FHb2dBRFlDQUNBQklBQkJBWEkyQWdRUEN5QUJJQU5QRFFBZ0F5Z0NCQ0lDUVFGeFJRMEFBa0FDUUNBQ1FRSnhEUUFDUUNBRFFRQW9BcURRZ0lBQVJ3MEFRUUFnQVRZQ29OQ0FnQUJCQUVFQUtBS1UwSUNBQUNBQWFpSUFOZ0tVMElDQUFDQUJJQUJCQVhJMkFnUWdBVUVBS0FLYzBJQ0FBRWNOQTBFQVFRQTJBcERRZ0lBQVFRQkJBRFlDbk5DQWdBQVBDd0pBSUFOQkFDZ0NuTkNBZ0FCSERRQkJBQ0FCTmdLYzBJQ0FBRUVBUVFBb0FwRFFnSUFBSUFCcUlnQTJBcERRZ0lBQUlBRWdBRUVCY2pZQ0JDQUJJQUJxSUFBMkFnQVBDeUFDUVhoeElBQnFJUUFDUUFKQUlBSkIvd0ZMRFFBZ0F5Z0NDQ0lFSUFKQkEzWWlCVUVEZEVHdzBJQ0FBR29pQmtZYUFrQWdBeWdDRENJQ0lBUkhEUUJCQUVFQUtBS0kwSUNBQUVGK0lBVjNjVFlDaU5DQWdBQU1BZ3NnQWlBR1Job2dBaUFFTmdJSUlBUWdBallDREF3QkN5QURLQUlZSVFjQ1FBSkFJQU1vQWd3aUJpQURSZzBBSUFNb0FnZ2lBa0VBS0FLWTBJQ0FBRWthSUFZZ0FqWUNDQ0FDSUFZMkFnd01BUXNDUUNBRFFSUnFJZ0lvQWdBaUJBMEFJQU5CRUdvaUFpZ0NBQ0lFRFFCQkFDRUdEQUVMQTBBZ0FpRUZJQVFpQmtFVWFpSUNLQUlBSWdRTkFDQUdRUkJxSVFJZ0JpZ0NFQ0lFRFFBTElBVkJBRFlDQUFzZ0IwVU5BQUpBQWtBZ0F5QURLQUljSWdSQkFuUkJ1TktBZ0FCcUlnSW9BZ0JIRFFBZ0FpQUdOZ0lBSUFZTkFVRUFRUUFvQW96UWdJQUFRWDRnQkhkeE5nS00wSUNBQUF3Q0N5QUhRUkJCRkNBSEtBSVFJQU5HRzJvZ0JqWUNBQ0FHUlEwQkN5QUdJQWMyQWhnQ1FDQURLQUlRSWdKRkRRQWdCaUFDTmdJUUlBSWdCallDR0FzZ0F5Z0NGQ0lDUlEwQUlBWkJGR29nQWpZQ0FDQUNJQVkyQWhnTElBRWdBR29nQURZQ0FDQUJJQUJCQVhJMkFnUWdBVUVBS0FLYzBJQ0FBRWNOQVVFQUlBQTJBcERRZ0lBQUR3c2dBeUFDUVg1eE5nSUVJQUVnQUdvZ0FEWUNBQ0FCSUFCQkFYSTJBZ1FMQWtBZ0FFSC9BVXNOQUNBQVFYaHhRYkRRZ0lBQWFpRUNBa0FDUUVFQUtBS0kwSUNBQUNJRVFRRWdBRUVEZG5RaUFIRU5BRUVBSUFRZ0FISTJBb2pRZ0lBQUlBSWhBQXdCQ3lBQ0tBSUlJUUFMSUFBZ0FUWUNEQ0FDSUFFMkFnZ2dBU0FDTmdJTUlBRWdBRFlDQ0E4TFFSOGhBZ0pBSUFCQi8vLy9CMHNOQUNBQVFRaDJJZ0lnQWtHQS9qOXFRUkIyUVFoeElnSjBJZ1FnQkVHQTRCOXFRUkIyUVFSeElnUjBJZ1lnQmtHQWdBOXFRUkIyUVFKeElnWjBRUTkySUFJZ0JISWdCbkpySWdKQkFYUWdBQ0FDUVJWcWRrRUJjWEpCSEdvaEFnc2dBU0FDTmdJY0lBRkNBRGNDRUNBQ1FRSjBRYmpTZ0lBQWFpRUVBa0FDUUVFQUtBS00wSUNBQUNJR1FRRWdBblFpQTNFTkFDQUVJQUUyQWdCQkFDQUdJQU55TmdLTTBJQ0FBQ0FCSUFRMkFoZ2dBU0FCTmdJSUlBRWdBVFlDREF3QkN5QUFRUUJCR1NBQ1FRRjJheUFDUVI5R0czUWhBaUFFS0FJQUlRWUNRQU5BSUFZaUJDZ0NCRUY0Y1NBQVJnMEJJQUpCSFhZaEJpQUNRUUYwSVFJZ0JDQUdRUVJ4YWtFUWFpSURLQUlBSWdZTkFBc2dBeUFCTmdJQUlBRWdCRFlDR0NBQklBRTJBZ3dnQVNBQk5nSUlEQUVMSUFRb0FnZ2lBQ0FCTmdJTUlBUWdBVFlDQ0NBQlFRQTJBaGdnQVNBRU5nSU1JQUVnQURZQ0NBdEJBRUVBS0FLbzBJQ0FBRUYvYWlJQlFYOGdBUnMyQXFqUWdJQUFDd3NFQUFBQUMwNEFBa0FnQUEwQVB3QkJFSFFQQ3dKQUlBQkIvLzhEY1EwQUlBQkJmMHdOQUFKQUlBQkJFSFpBQUNJQVFYOUhEUUJCQUVFd05nTDQwNENBQUVGL0R3c2dBRUVRZEE4TEVNcUFnSUFBQUF2eUFnSURmd0YrQWtBZ0FrVU5BQ0FBSUFFNkFBQWdBaUFBYWlJRFFYOXFJQUU2QUFBZ0FrRURTUTBBSUFBZ0FUb0FBaUFBSUFFNkFBRWdBMEY5YWlBQk9nQUFJQU5CZm1vZ0FUb0FBQ0FDUVFkSkRRQWdBQ0FCT2dBRElBTkJmR29nQVRvQUFDQUNRUWxKRFFBZ0FFRUFJQUJyUVFOeElnUnFJZ01nQVVIL0FYRkJnWUtFQ0d3aUFUWUNBQ0FESUFJZ0JHdEJmSEVpQkdvaUFrRjhhaUFCTmdJQUlBUkJDVWtOQUNBRElBRTJBZ2dnQXlBQk5nSUVJQUpCZUdvZ0FUWUNBQ0FDUVhScUlBRTJBZ0FnQkVFWlNRMEFJQU1nQVRZQ0dDQURJQUUyQWhRZ0F5QUJOZ0lRSUFNZ0FUWUNEQ0FDUVhCcUlBRTJBZ0FnQWtGc2FpQUJOZ0lBSUFKQmFHb2dBVFlDQUNBQ1FXUnFJQUUyQWdBZ0JDQURRUVJ4UVJoeUlnVnJJZ0pCSUVrTkFDQUJyVUtCZ0lDQUVINGhCaUFESUFWcUlRRURRQ0FCSUFZM0F4Z2dBU0FHTndNUUlBRWdCamNEQ0NBQklBWTNBd0FnQVVFZ2FpRUJJQUpCWUdvaUFrRWZTdzBBQ3dzZ0FBc0xqa2dCQUVHQUNBdUdTQUVBQUFBQ0FBQUFBd0FBQUFBQUFBQUFBQUFBQkFBQUFBVUFBQUFBQUFBQUFBQUFBQVlBQUFBSEFBQUFDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBU1c1MllXeHBaQ0JqYUdGeUlHbHVJSFZ5YkNCeGRXVnllUUJUY0dGdUlHTmhiR3hpWVdOcklHVnljbTl5SUdsdUlHOXVYMkp2WkhrQVEyOXVkR1Z1ZEMxTVpXNW5kR2dnYjNabGNtWnNiM2NBUTJoMWJtc2djMmw2WlNCdmRtVnlabXh2ZHdCU1pYTndiMjV6WlNCdmRtVnlabXh2ZHdCSmJuWmhiR2xrSUcxbGRHaHZaQ0JtYjNJZ1NGUlVVQzk0TG5nZ2NtVnhkV1Z6ZEFCSmJuWmhiR2xrSUcxbGRHaHZaQ0JtYjNJZ1VsUlRVQzk0TG5nZ2NtVnhkV1Z6ZEFCRmVIQmxZM1JsWkNCVFQxVlNRMFVnYldWMGFHOWtJR1p2Y2lCSlEwVXZlQzU0SUhKbGNYVmxjM1FBU1c1MllXeHBaQ0JqYUdGeUlHbHVJSFZ5YkNCbWNtRm5iV1Z1ZENCemRHRnlkQUJGZUhCbFkzUmxaQ0JrYjNRQVUzQmhiaUJqWVd4c1ltRmpheUJsY25KdmNpQnBiaUJ2Ymw5emRHRjBkWE1BU1c1MllXeHBaQ0J5WlhOd2IyNXpaU0J6ZEdGMGRYTUFTVzUyWVd4cFpDQmphR0Z5WVdOMFpYSWdhVzRnWTJoMWJtc2daWGgwWlc1emFXOXVjd0JWYzJWeUlHTmhiR3hpWVdOcklHVnljbTl5QUdCdmJsOXlaWE5sZEdBZ1kyRnNiR0poWTJzZ1pYSnliM0lBWUc5dVgyTm9kVzVyWDJobFlXUmxjbUFnWTJGc2JHSmhZMnNnWlhKeWIzSUFZRzl1WDIxbGMzTmhaMlZmWW1WbmFXNWdJR05oYkd4aVlXTnJJR1Z5Y205eUFHQnZibDlqYUhWdWExOWxlSFJsYm5OcGIyNWZkbUZzZFdWZ0lHTmhiR3hpWVdOcklHVnljbTl5QUdCdmJsOXpkR0YwZFhOZlkyOXRjR3hsZEdWZ0lHTmhiR3hpWVdOcklHVnljbTl5QUdCdmJsOTJaWEp6YVc5dVgyTnZiWEJzWlhSbFlDQmpZV3hzWW1GamF5Qmxjbkp2Y2dCZ2IyNWZkWEpzWDJOdmJYQnNaWFJsWUNCallXeHNZbUZqYXlCbGNuSnZjZ0JnYjI1ZlkyaDFibXRmWTI5dGNHeGxkR1ZnSUdOaGJHeGlZV05ySUdWeWNtOXlBR0J2Ymw5b1pXRmtaWEpmZG1Gc2RXVmZZMjl0Y0d4bGRHVmdJR05oYkd4aVlXTnJJR1Z5Y205eUFHQnZibDl0WlhOellXZGxYMk52YlhCc1pYUmxZQ0JqWVd4c1ltRmpheUJsY25KdmNnQmdiMjVmYldWMGFHOWtYMk52YlhCc1pYUmxZQ0JqWVd4c1ltRmpheUJsY25KdmNnQmdiMjVmYUdWaFpHVnlYMlpwWld4a1gyTnZiWEJzWlhSbFlDQmpZV3hzWW1GamF5Qmxjbkp2Y2dCZ2IyNWZZMmgxYm10ZlpYaDBaVzV6YVc5dVgyNWhiV1ZnSUdOaGJHeGlZV05ySUdWeWNtOXlBRlZ1Wlhod1pXTjBaV1FnWTJoaGNpQnBiaUIxY213Z2MyVnlkbVZ5QUVsdWRtRnNhV1FnYUdWaFpHVnlJSFpoYkhWbElHTm9ZWElBU1c1MllXeHBaQ0JvWldGa1pYSWdabWxsYkdRZ1kyaGhjZ0JUY0dGdUlHTmhiR3hpWVdOcklHVnljbTl5SUdsdUlHOXVYM1psY25OcGIyNEFTVzUyWVd4cFpDQnRhVzV2Y2lCMlpYSnphVzl1QUVsdWRtRnNhV1FnYldGcWIzSWdkbVZ5YzJsdmJnQkZlSEJsWTNSbFpDQnpjR0ZqWlNCaFpuUmxjaUIyWlhKemFXOXVBRVY0Y0dWamRHVmtJRU5TVEVZZ1lXWjBaWElnZG1WeWMybHZiZ0JKYm5aaGJHbGtJRWhVVkZBZ2RtVnljMmx2YmdCSmJuWmhiR2xrSUdobFlXUmxjaUIwYjJ0bGJnQlRjR0Z1SUdOaGJHeGlZV05ySUdWeWNtOXlJR2x1SUc5dVgzVnliQUJKYm5aaGJHbGtJR05vWVhKaFkzUmxjbk1nYVc0Z2RYSnNBRlZ1Wlhod1pXTjBaV1FnYzNSaGNuUWdZMmhoY2lCcGJpQjFjbXdBUkc5MVlteGxJRUFnYVc0Z2RYSnNBRVZ0Y0hSNUlFTnZiblJsYm5RdFRHVnVaM1JvQUVsdWRtRnNhV1FnWTJoaGNtRmpkR1Z5SUdsdUlFTnZiblJsYm5RdFRHVnVaM1JvQUVSMWNHeHBZMkYwWlNCRGIyNTBaVzUwTFV4bGJtZDBhQUJKYm5aaGJHbGtJR05vWVhJZ2FXNGdkWEpzSUhCaGRHZ0FRMjl1ZEdWdWRDMU1aVzVuZEdnZ1kyRnVKM1FnWW1VZ2NISmxjMlZ1ZENCM2FYUm9JRlJ5WVc1elptVnlMVVZ1WTI5a2FXNW5BRWx1ZG1Gc2FXUWdZMmhoY21GamRHVnlJR2x1SUdOb2RXNXJJSE5wZW1VQVUzQmhiaUJqWVd4c1ltRmpheUJsY25KdmNpQnBiaUJ2Ymw5b1pXRmtaWEpmZG1Gc2RXVUFVM0JoYmlCallXeHNZbUZqYXlCbGNuSnZjaUJwYmlCdmJsOWphSFZ1YTE5bGVIUmxibk5wYjI1ZmRtRnNkV1VBU1c1MllXeHBaQ0JqYUdGeVlXTjBaWElnYVc0Z1kyaDFibXNnWlhoMFpXNXphVzl1Y3lCMllXeDFaUUJOYVhOemFXNW5JR1Y0Y0dWamRHVmtJRXhHSUdGbWRHVnlJR2hsWVdSbGNpQjJZV3gxWlFCSmJuWmhiR2xrSUdCVWNtRnVjMlpsY2kxRmJtTnZaR2x1WjJBZ2FHVmhaR1Z5SUhaaGJIVmxBRWx1ZG1Gc2FXUWdZMmhoY21GamRHVnlJR2x1SUdOb2RXNXJJR1Y0ZEdWdWMybHZibk1nY1hWdmRHVWdkbUZzZFdVQVNXNTJZV3hwWkNCamFHRnlZV04wWlhJZ2FXNGdZMmgxYm1zZ1pYaDBaVzV6YVc5dWN5QnhkVzkwWldRZ2RtRnNkV1VBVUdGMWMyVmtJR0o1SUc5dVgyaGxZV1JsY25OZlkyOXRjR3hsZEdVQVNXNTJZV3hwWkNCRlQwWWdjM1JoZEdVQWIyNWZjbVZ6WlhRZ2NHRjFjMlVBYjI1ZlkyaDFibXRmYUdWaFpHVnlJSEJoZFhObEFHOXVYMjFsYzNOaFoyVmZZbVZuYVc0Z2NHRjFjMlVBYjI1ZlkyaDFibXRmWlhoMFpXNXphVzl1WDNaaGJIVmxJSEJoZFhObEFHOXVYM04wWVhSMWMxOWpiMjF3YkdWMFpTQndZWFZ6WlFCdmJsOTJaWEp6YVc5dVgyTnZiWEJzWlhSbElIQmhkWE5sQUc5dVgzVnliRjlqYjIxd2JHVjBaU0J3WVhWelpRQnZibDlqYUhWdWExOWpiMjF3YkdWMFpTQndZWFZ6WlFCdmJsOW9aV0ZrWlhKZmRtRnNkV1ZmWTI5dGNHeGxkR1VnY0dGMWMyVUFiMjVmYldWemMyRm5aVjlqYjIxd2JHVjBaU0J3WVhWelpRQnZibDl0WlhSb2IyUmZZMjl0Y0d4bGRHVWdjR0YxYzJVQWIyNWZhR1ZoWkdWeVgyWnBaV3hrWDJOdmJYQnNaWFJsSUhCaGRYTmxBRzl1WDJOb2RXNXJYMlY0ZEdWdWMybHZibDl1WVcxbElIQmhkWE5sQUZWdVpYaHdaV04wWldRZ2MzQmhZMlVnWVdaMFpYSWdjM1JoY25RZ2JHbHVaUUJUY0dGdUlHTmhiR3hpWVdOcklHVnljbTl5SUdsdUlHOXVYMk5vZFc1clgyVjRkR1Z1YzJsdmJsOXVZVzFsQUVsdWRtRnNhV1FnWTJoaGNtRmpkR1Z5SUdsdUlHTm9kVzVySUdWNGRHVnVjMmx2Ym5NZ2JtRnRaUUJRWVhWelpTQnZiaUJEVDA1T1JVTlVMMVZ3WjNKaFpHVUFVR0YxYzJVZ2IyNGdVRkpKTDFWd1ozSmhaR1VBUlhod1pXTjBaV1FnU0ZSVVVDOHlJRU52Ym01bFkzUnBiMjRnVUhKbFptRmpaUUJUY0dGdUlHTmhiR3hpWVdOcklHVnljbTl5SUdsdUlHOXVYMjFsZEdodlpBQkZlSEJsWTNSbFpDQnpjR0ZqWlNCaFpuUmxjaUJ0WlhSb2IyUUFVM0JoYmlCallXeHNZbUZqYXlCbGNuSnZjaUJwYmlCdmJsOW9aV0ZrWlhKZlptbGxiR1FBVUdGMWMyVmtBRWx1ZG1Gc2FXUWdkMjl5WkNCbGJtTnZkVzUwWlhKbFpBQkpiblpoYkdsa0lHMWxkR2h2WkNCbGJtTnZkVzUwWlhKbFpBQlZibVY0Y0dWamRHVmtJR05vWVhJZ2FXNGdkWEpzSUhOamFHVnRZUUJTWlhGMVpYTjBJR2hoY3lCcGJuWmhiR2xrSUdCVWNtRnVjMlpsY2kxRmJtTnZaR2x1WjJBQVUxZEpWRU5JWDFCU1QxaFpBRlZUUlY5UVVrOVlXUUJOUzBGRFZFbFdTVlJaQUZWT1VGSlBRMFZUVTBGQ1RFVmZSVTVVU1ZSWkFFTlBVRmtBVFU5V1JVUmZVRVZTVFVGT1JVNVVURmtBVkU5UFgwVkJVa3haQUU1UFZFbEdXUUJHUVVsTVJVUmZSRVZRUlU1RVJVNURXUUJDUVVSZlIwRlVSVmRCV1FCUVRFRlpBRkJWVkFCRFNFVkRTMDlWVkFCSFFWUkZWMEZaWDFSSlRVVlBWVlFBVWtWUlZVVlRWRjlVU1UxRlQxVlVBRTVGVkZkUFVrdGZRMDlPVGtWRFZGOVVTVTFGVDFWVUFFTlBUazVGUTFSSlQwNWZWRWxOUlU5VlZBQk1UMGRKVGw5VVNVMUZUMVZVQUU1RlZGZFBVa3RmVWtWQlJGOVVTVTFGVDFWVUFGQlBVMVFBVFVsVFJFbFNSVU5VUlVSZlVrVlJWVVZUVkFCRFRFbEZUbFJmUTB4UFUwVkVYMUpGVVZWRlUxUUFRMHhKUlU1VVgwTk1UMU5GUkY5TVQwRkVYMEpCVEVGT1EwVkVYMUpGVVZWRlUxUUFRa0ZFWDFKRlVWVkZVMVFBU0ZSVVVGOVNSVkZWUlZOVVgxTkZUbFJmVkU5ZlNGUlVVRk5mVUU5U1ZBQlNSVkJQVWxRQVNVMWZRVjlVUlVGUVQxUUFVa1ZUUlZSZlEwOU9WRVZPVkFCT1QxOURUMDVVUlU1VUFGQkJVbFJKUVV4ZlEwOU9WRVZPVkFCSVVFVmZTVTVXUVV4SlJGOURUMDVUVkVGT1ZBQklVRVZmUTBKZlVrVlRSVlFBUjBWVUFFaFFSVjlUVkZKSlExUUFRMDlPUmt4SlExUUFWRVZOVUU5U1FWSlpYMUpGUkVsU1JVTlVBRkJGVWsxQlRrVk9WRjlTUlVSSlVrVkRWQUJEVDA1T1JVTlVBRTFWVEZSSlgxTlVRVlJWVXdCSVVFVmZTVTVXUVV4SlJGOVRWRUZVVlZNQVZFOVBYMDFCVGxsZlVrVlJWVVZUVkZNQVJVRlNURmxmU0VsT1ZGTUFWVTVCVmtGSlRFRkNURVZmUms5U1gweEZSMEZNWDFKRlFWTlBUbE1BVDFCVVNVOU9Vd0JUVjBsVVEwaEpUa2RmVUZKUFZFOURUMHhUQUZaQlVrbEJUbFJmUVV4VFQxOU9SVWRQVkVsQlZFVlRBRTFWVEZSSlVFeEZYME5JVDBsRFJWTUFTVTVVUlZKT1FVeGZVMFZTVmtWU1gwVlNVazlTQUZkRlFsOVRSVkpXUlZKZlZVNUxUazlYVGw5RlVsSlBVZ0JTUVVsTVIxVk9YMFZTVWs5U0FFbEVSVTVVU1ZSWlgxQlNUMVpKUkVWU1gwRlZWRWhGVGxSSlEwRlVTVTlPWDBWU1VrOVNBRk5UVEY5RFJWSlVTVVpKUTBGVVJWOUZVbEpQVWdCSlRsWkJURWxFWDFoZlJrOVNWMEZTUkVWRVgwWlBVZ0JUUlZSZlVFRlNRVTFGVkVWU0FFZEZWRjlRUVZKQlRVVlVSVklBU0ZCRlgxVlRSVklBVTBWRlgwOVVTRVZTQUVoUVJWOURRbDlEU0ZWT1MxOUlSVUZFUlZJQVRVdERRVXhGVGtSQlVnQlRSVlJWVUFCWFJVSmZVMFZTVmtWU1gwbFRYMFJQVjA0QVZFVkJVa1JQVjA0QVNGQkZYME5NVDFORlJGOURUMDVPUlVOVVNVOU9BRWhGVlZKSlUxUkpRMTlGV0ZCSlVrRlVTVTlPQUVSSlUwTlBUazVGUTFSRlJGOVBVRVZTUVZSSlQwNEFUazlPWDBGVlZFaFBVa2xVUVZSSlZrVmZTVTVHVDFKTlFWUkpUMDRBU0ZCRlgwbE9Wa0ZNU1VSZlZrVlNVMGxQVGdCSVVFVmZRMEpmVFVWVFUwRkhSVjlDUlVkSlRnQlRTVlJGWDBsVFgwWlNUMXBGVGdCSVVFVmZTVTVXUVV4SlJGOUlSVUZFUlZKZlZFOUxSVTRBU1U1V1FVeEpSRjlVVDB0RlRnQkdUMUpDU1VSRVJVNEFSVTVJUVU1RFJWOVpUMVZTWDBOQlRFMEFTRkJGWDBsT1ZrRk1TVVJmVlZKTUFFSk1UME5MUlVSZlFsbGZVRUZTUlU1VVFVeGZRMDlPVkZKUFRBQk5TME5QVEFCQlEwd0FTRkJGWDBsT1ZFVlNUa0ZNQUZKRlVWVkZVMVJmU0VWQlJFVlNYMFpKUlV4RVUxOVVUMDlmVEVGU1IwVmZWVTVQUmtaSlEwbEJUQUJJVUVWZlQwc0FWVTVNU1U1TEFGVk9URTlEU3dCUVVra0FVa1ZVVWxsZlYwbFVTQUJJVUVWZlNVNVdRVXhKUkY5RFQwNVVSVTVVWDB4RlRrZFVTQUJJVUVWZlZVNUZXRkJGUTFSRlJGOURUMDVVUlU1VVgweEZUa2RVU0FCR1RGVlRTQUJRVWs5UVVFRlVRMGdBVFMxVFJVRlNRMGdBVlZKSlgxUlBUMTlNVDA1SEFGQlNUME5GVTFOSlRrY0FUVWxUUTBWTVRFRk9SVTlWVTE5UVJWSlRTVk5VUlU1VVgxZEJVazVKVGtjQVRVbFRRMFZNVEVGT1JVOVZVMTlYUVZKT1NVNUhBRWhRUlY5SlRsWkJURWxFWDFSU1FVNVRSa1ZTWDBWT1EwOUVTVTVIQUVWNGNHVmpkR1ZrSUVOU1RFWUFTRkJGWDBsT1ZrRk1TVVJmUTBoVlRrdGZVMGxhUlFCTlQxWkZBRU5QVGxSSlRsVkZBRWhRUlY5RFFsOVRWRUZVVlZOZlEwOU5VRXhGVkVVQVNGQkZYME5DWDBoRlFVUkZVbE5mUTA5TlVFeEZWRVVBU0ZCRlgwTkNYMVpGVWxOSlQwNWZRMDlOVUV4RlZFVUFTRkJGWDBOQ1gxVlNURjlEVDAxUVRFVlVSUUJJVUVWZlEwSmZRMGhWVGt0ZlEwOU5VRXhGVkVVQVNGQkZYME5DWDBoRlFVUkZVbDlXUVV4VlJWOURUMDFRVEVWVVJRQklVRVZmUTBKZlEwaFZUa3RmUlZoVVJVNVRTVTlPWDFaQlRGVkZYME5QVFZCTVJWUkZBRWhRUlY5RFFsOURTRlZPUzE5RldGUkZUbE5KVDA1ZlRrRk5SVjlEVDAxUVRFVlVSUUJJVUVWZlEwSmZUVVZUVTBGSFJWOURUMDFRVEVWVVJRQklVRVZmUTBKZlRVVlVTRTlFWDBOUFRWQk1SVlJGQUVoUVJWOURRbDlJUlVGRVJWSmZSa2xGVEVSZlEwOU5VRXhGVkVVQVJFVk1SVlJGQUVoUVJWOUpUbFpCVEVsRVgwVlBSbDlUVkVGVVJRQkpUbFpCVEVsRVgxTlRURjlEUlZKVVNVWkpRMEZVUlFCUVFWVlRSUUJPVDE5U1JWTlFUMDVUUlFCVlRsTlZVRkJQVWxSRlJGOU5SVVJKUVY5VVdWQkZBRWRQVGtVQVRrOVVYMEZEUTBWUVZFRkNURVVBVTBWU1ZrbERSVjlWVGtGV1FVbE1RVUpNUlFCU1FVNUhSVjlPVDFSZlUwRlVTVk5HU1VGQ1RFVUFUMUpKUjBsT1gwbFRYMVZPVWtWQlEwaEJRa3hGQUZKRlUxQlBUbE5GWDBsVFgxTlVRVXhGQUZCVlVrZEZBRTFGVWtkRkFGSkZVVlZGVTFSZlNFVkJSRVZTWDBaSlJVeEVVMTlVVDA5ZlRFRlNSMFVBVWtWUlZVVlRWRjlJUlVGRVJWSmZWRTlQWDB4QlVrZEZBRkJCV1V4UFFVUmZWRTlQWDB4QlVrZEZBRWxPVTFWR1JrbERTVVZPVkY5VFZFOVNRVWRGQUVoUVJWOVFRVlZUUlVSZlZWQkhVa0ZFUlFCSVVFVmZVRUZWVTBWRVgwZ3lYMVZRUjFKQlJFVUFVMDlWVWtORkFFRk9UazlWVGtORkFGUlNRVU5GQUVoUVJWOVZUa1ZZVUVWRFZFVkVYMU5RUVVORkFFUkZVME5TU1VKRkFGVk9VMVZDVTBOU1NVSkZBRkpGUTA5U1JBQklVRVZmU1U1V1FVeEpSRjlOUlZSSVQwUUFUazlVWDBaUFZVNUVBRkJTVDFCR1NVNUVBRlZPUWtsT1JBQlNSVUpKVGtRQVZVNUJWVlJJVDFKSldrVkVBRTFGVkVoUFJGOU9UMVJmUVV4TVQxZEZSQUJJVkZSUVgxWkZVbE5KVDA1ZlRrOVVYMU5WVUZCUFVsUkZSQUJCVEZKRlFVUlpYMUpGVUU5U1ZFVkVBRUZEUTBWUVZFVkVBRTVQVkY5SlRWQk1SVTFGVGxSRlJBQk1UMDlRWDBSRlZFVkRWRVZFQUVoUVJWOURVbDlGV0ZCRlExUkZSQUJJVUVWZlRFWmZSVmhRUlVOVVJVUUFRMUpGUVZSRlJBQkpUVjlWVTBWRUFFaFFSVjlRUVZWVFJVUUFWRWxOUlU5VlZGOVBRME5WVWtWRUFGQkJXVTFGVGxSZlVrVlJWVWxTUlVRQVVGSkZRMDlPUkVsVVNVOU9YMUpGVVZWSlVrVkVBRkJTVDFoWlgwRlZWRWhGVGxSSlEwRlVTVTlPWDFKRlVWVkpVa1ZFQUU1RlZGZFBVa3RmUVZWVVNFVk9WRWxEUVZSSlQwNWZVa1ZSVlVsU1JVUUFURVZPUjFSSVgxSkZVVlZKVWtWRUFGTlRURjlEUlZKVVNVWkpRMEZVUlY5U1JWRlZTVkpGUkFCVlVFZFNRVVJGWDFKRlVWVkpVa1ZFQUZCQlIwVmZSVmhRU1ZKRlJBQlFVa1ZEVDA1RVNWUkpUMDVmUmtGSlRFVkVBRVZZVUVWRFZFRlVTVTlPWDBaQlNVeEZSQUJTUlZaQlRFbEVRVlJKVDA1ZlJrRkpURVZFQUZOVFRGOUlRVTVFVTBoQlMwVmZSa0ZKVEVWRUFFeFBRMHRGUkFCVVVrRk9VMFpQVWsxQlZFbFBUbDlCVUZCTVNVVkVBRTVQVkY5TlQwUkpSa2xGUkFCT1QxUmZSVmhVUlU1RVJVUUFRa0ZPUkZkSlJGUklYMHhKVFVsVVgwVllRMFZGUkVWRUFGTkpWRVZmU1ZOZlQxWkZVa3hQUVVSRlJBQklSVUZFQUVWNGNHVmpkR1ZrSUVoVVZGQXZBQUJlRXdBQUpoTUFBREFRQUFEd0Z3QUFuUk1BQUJVU0FBQTVGd0FBOEJJQUFBb1FBQUIxRWdBQXJSSUFBSUlUQUFCUEZBQUFmeEFBQUtBVkFBQWpGQUFBaVJJQUFJc1VBQUJORlFBQTFCRUFBTThVQUFBUUdBQUF5UllBQU53V0FBREJFUUFBNEJjQUFMc1VBQUIwRkFBQWZCVUFBT1VVQUFBSUZ3QUFIeEFBQUdVVkFBQ2pGQUFBS0JVQUFBSVZBQUNaRlFBQUxCQUFBSXNaQUFCUER3QUExQTRBQUdvUUFBRE9FQUFBQWhjQUFJa09BQUJ1RXdBQUhCTUFBR1lVQUFCV0Z3QUF3Uk1BQU0wVEFBQnNFd0FBYUJjQUFHWVhBQUJmRndBQUloTUFBTTRQQUFCcERnQUEyQTRBQUdNV0FBRExFd0FBcWc0QUFDZ1hBQUFtRndBQXhSTUFBRjBXQUFEb0VRQUFaeE1BQUdVVEFBRHlGZ0FBY3hNQUFCMFhBQUQ1RmdBQTh4RUFBTThPQUFET0ZRQUFEQklBQUxNUkFBQ2xFUUFBWVJBQUFESVhBQUM3RXdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVCQWdFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRQUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFnTUNBZ0lDQWdBQUFnSUFBZ0lBQWdJQ0FnSUNBZ0lDQWdBRUFBQUFBQUFDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0FBQUFJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FBSUFBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlBQWdJQ0FnSUFBQUlDQUFJQ0FBSUNBZ0lDQWdJQ0FnSUFBd0FFQUFBQUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQUFBQUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0FDQUFJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQnNiM05sWldWd0xXRnNhWFpsQUFBQUFBQUFBQUFBQUFBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRQUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRRUJBUUVCQVFFQkFRRUJBZ0VCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVBQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFGamFIVnVhMlZrQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBUUFCQVFFQkFRQUFBUUVBQVFFQUFRRUJBUUVCQVFFQkFRQUFBQUFBQUFBQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQUFBRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBQUVBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHVmpkR2x2Ym1WdWRDMXNaVzVuZEdodmJuSnZlSGt0WTI5dWJtVmpkR2x2YmdBQUFBQUFBQUFBQUFBQUFBQUFBSEpoYm5ObVpYSXRaVzVqYjJScGJtZHdaM0poWkdVTkNnMEtEUXBUVFEwS0RRcFVWRkF2UTBVdlZGTlFMd0FBQUFBQUFBQUFBQUFBQUFFQ0FBRURBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQUFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUFBQUFBQUFBQUFBQUJBZ0FCQXdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRQkFRVUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQUFBQUFBQUFBQUFBQVFBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUVBQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRQUFBQUFBQUFBQUFBQUJBQUFDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXdRQUFBUUVCQVFFQkFRRUJBUUVCUVFFQkFRRUJBUUVCQVFFQkFBRUFBWUhCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVBQVFBQkFBRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFBQUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVFBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFnQUFBQUFBQUFNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQUFBQUFBQUFBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQUFBQUFBQUFBQUFBQWdBQUFBQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3QUFBQUFBQUFNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRTVQVlU1RFJVVkRTMDlWVkU1RlExUkZWRVZEVWtsQ1JVeFZVMGhGVkVWQlJGTkZRVkpEU0ZKSFJVTlVTVlpKVkZsTVJVNUVRVkpXUlU5VVNVWlpVRlJKVDA1VFEwaFRSVUZaVTFSQlZFTklSMFZQVWtSSlVrVkRWRTlTVkZKRFNGQkJVa0ZOUlZSRlVsVlNRMFZDVTBOU1NVSkZRVkpFVDFkT1FVTkZTVTVFVGt0RFMxVkNVME5TU1VKRlNGUlVVQzlCUkZSUUx3PT0nXG4iLCIvLyBAdHMtY2hlY2tcblxuJ3VzZSBzdHJpY3QnXG5cbi8qIGdsb2JhbCBXZWJBc3NlbWJseSAqL1xuXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuY29uc3QgbmV0ID0gcmVxdWlyZSgnbmV0JylcbmNvbnN0IGh0dHAgPSByZXF1aXJlKCdodHRwJylcbmNvbnN0IHsgcGlwZWxpbmUgfSA9IHJlcXVpcmUoJ3N0cmVhbScpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi9jb3JlL3V0aWwnKVxuY29uc3QgdGltZXJzID0gcmVxdWlyZSgnLi90aW1lcnMnKVxuY29uc3QgUmVxdWVzdCA9IHJlcXVpcmUoJy4vY29yZS9yZXF1ZXN0JylcbmNvbnN0IERpc3BhdGNoZXJCYXNlID0gcmVxdWlyZSgnLi9kaXNwYXRjaGVyLWJhc2UnKVxuY29uc3Qge1xuICBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IsXG4gIFJlc3BvbnNlQ29udGVudExlbmd0aE1pc21hdGNoRXJyb3IsXG4gIEludmFsaWRBcmd1bWVudEVycm9yLFxuICBSZXF1ZXN0QWJvcnRlZEVycm9yLFxuICBIZWFkZXJzVGltZW91dEVycm9yLFxuICBIZWFkZXJzT3ZlcmZsb3dFcnJvcixcbiAgU29ja2V0RXJyb3IsXG4gIEluZm9ybWF0aW9uYWxFcnJvcixcbiAgQm9keVRpbWVvdXRFcnJvcixcbiAgSFRUUFBhcnNlckVycm9yLFxuICBSZXNwb25zZUV4Y2VlZGVkTWF4U2l6ZUVycm9yLFxuICBDbGllbnREZXN0cm95ZWRFcnJvclxufSA9IHJlcXVpcmUoJy4vY29yZS9lcnJvcnMnKVxuY29uc3QgYnVpbGRDb25uZWN0b3IgPSByZXF1aXJlKCcuL2NvcmUvY29ubmVjdCcpXG5jb25zdCB7XG4gIGtVcmwsXG4gIGtSZXNldCxcbiAga1NlcnZlck5hbWUsXG4gIGtDbGllbnQsXG4gIGtCdXN5LFxuICBrUGFyc2VyLFxuICBrQ29ubmVjdCxcbiAga0Jsb2NraW5nLFxuICBrUmVzdW1pbmcsXG4gIGtSdW5uaW5nLFxuICBrUGVuZGluZyxcbiAga1NpemUsXG4gIGtXcml0aW5nLFxuICBrUXVldWUsXG4gIGtDb25uZWN0ZWQsXG4gIGtDb25uZWN0aW5nLFxuICBrTmVlZERyYWluLFxuICBrTm9SZWYsXG4gIGtLZWVwQWxpdmVEZWZhdWx0VGltZW91dCxcbiAga0hvc3RIZWFkZXIsXG4gIGtQZW5kaW5nSWR4LFxuICBrUnVubmluZ0lkeCxcbiAga0Vycm9yLFxuICBrUGlwZWxpbmluZyxcbiAga1NvY2tldCxcbiAga0tlZXBBbGl2ZVRpbWVvdXRWYWx1ZSxcbiAga01heEhlYWRlcnNTaXplLFxuICBrS2VlcEFsaXZlTWF4VGltZW91dCxcbiAga0tlZXBBbGl2ZVRpbWVvdXRUaHJlc2hvbGQsXG4gIGtIZWFkZXJzVGltZW91dCxcbiAga0JvZHlUaW1lb3V0LFxuICBrU3RyaWN0Q29udGVudExlbmd0aCxcbiAga0Nvbm5lY3RvcixcbiAga01heFJlZGlyZWN0aW9ucyxcbiAga01heFJlcXVlc3RzLFxuICBrQ291bnRlcixcbiAga0Nsb3NlLFxuICBrRGVzdHJveSxcbiAga0Rpc3BhdGNoLFxuICBrSW50ZXJjZXB0b3JzLFxuICBrTG9jYWxBZGRyZXNzLFxuICBrTWF4UmVzcG9uc2VTaXplLFxuICBrSFRUUENvbm5WZXJzaW9uLFxuICAvLyBIVFRQMlxuICBrSG9zdCxcbiAga0hUVFAyU2Vzc2lvbixcbiAga0hUVFAyU2Vzc2lvblN0YXRlLFxuICBrSFRUUDJCdWlsZFJlcXVlc3QsXG4gIGtIVFRQMkNvcHlIZWFkZXJzLFxuICBrSFRUUDFCdWlsZFJlcXVlc3Rcbn0gPSByZXF1aXJlKCcuL2NvcmUvc3ltYm9scycpXG5cbi8qKiBAdHlwZSB7aW1wb3J0KCdodHRwMicpfSAqL1xubGV0IGh0dHAyXG50cnkge1xuICBodHRwMiA9IHJlcXVpcmUoJ2h0dHAyJylcbn0gY2F0Y2gge1xuICAvLyBAdHMtaWdub3JlXG4gIGh0dHAyID0geyBjb25zdGFudHM6IHt9IH1cbn1cblxuY29uc3Qge1xuICBjb25zdGFudHM6IHtcbiAgICBIVFRQMl9IRUFERVJfQVVUSE9SSVRZLFxuICAgIEhUVFAyX0hFQURFUl9NRVRIT0QsXG4gICAgSFRUUDJfSEVBREVSX1BBVEgsXG4gICAgSFRUUDJfSEVBREVSX1NDSEVNRSxcbiAgICBIVFRQMl9IRUFERVJfQ09OVEVOVF9MRU5HVEgsXG4gICAgSFRUUDJfSEVBREVSX0VYUEVDVCxcbiAgICBIVFRQMl9IRUFERVJfU1RBVFVTXG4gIH1cbn0gPSBodHRwMlxuXG4vLyBFeHBlcmltZW50YWxcbmxldCBoMkV4cGVyaW1lbnRhbFdhcm5lZCA9IGZhbHNlXG5cbmNvbnN0IEZhc3RCdWZmZXIgPSBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdXG5cbmNvbnN0IGtDbG9zZWRSZXNvbHZlID0gU3ltYm9sKCdrQ2xvc2VkUmVzb2x2ZScpXG5cbmNvbnN0IGNoYW5uZWxzID0ge31cblxudHJ5IHtcbiAgY29uc3QgZGlhZ25vc3RpY3NDaGFubmVsID0gcmVxdWlyZSgnZGlhZ25vc3RpY3NfY2hhbm5lbCcpXG4gIGNoYW5uZWxzLnNlbmRIZWFkZXJzID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTpjbGllbnQ6c2VuZEhlYWRlcnMnKVxuICBjaGFubmVscy5iZWZvcmVDb25uZWN0ID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTpjbGllbnQ6YmVmb3JlQ29ubmVjdCcpXG4gIGNoYW5uZWxzLmNvbm5lY3RFcnJvciA9IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6Y2xpZW50OmNvbm5lY3RFcnJvcicpXG4gIGNoYW5uZWxzLmNvbm5lY3RlZCA9IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6Y2xpZW50OmNvbm5lY3RlZCcpXG59IGNhdGNoIHtcbiAgY2hhbm5lbHMuc2VuZEhlYWRlcnMgPSB7IGhhc1N1YnNjcmliZXJzOiBmYWxzZSB9XG4gIGNoYW5uZWxzLmJlZm9yZUNvbm5lY3QgPSB7IGhhc1N1YnNjcmliZXJzOiBmYWxzZSB9XG4gIGNoYW5uZWxzLmNvbm5lY3RFcnJvciA9IHsgaGFzU3Vic2NyaWJlcnM6IGZhbHNlIH1cbiAgY2hhbm5lbHMuY29ubmVjdGVkID0geyBoYXNTdWJzY3JpYmVyczogZmFsc2UgfVxufVxuXG4vKipcbiAqIEB0eXBlIHtpbXBvcnQoJy4uL3R5cGVzL2NsaWVudCcpLmRlZmF1bHR9XG4gKi9cbmNsYXNzIENsaWVudCBleHRlbmRzIERpc3BhdGNoZXJCYXNlIHtcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfFVSTH0gdXJsXG4gICAqIEBwYXJhbSB7aW1wb3J0KCcuLi90eXBlcy9jbGllbnQnKS5DbGllbnQuT3B0aW9uc30gb3B0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3IgKHVybCwge1xuICAgIGludGVyY2VwdG9ycyxcbiAgICBtYXhIZWFkZXJTaXplLFxuICAgIGhlYWRlcnNUaW1lb3V0LFxuICAgIHNvY2tldFRpbWVvdXQsXG4gICAgcmVxdWVzdFRpbWVvdXQsXG4gICAgY29ubmVjdFRpbWVvdXQsXG4gICAgYm9keVRpbWVvdXQsXG4gICAgaWRsZVRpbWVvdXQsXG4gICAga2VlcEFsaXZlLFxuICAgIGtlZXBBbGl2ZVRpbWVvdXQsXG4gICAgbWF4S2VlcEFsaXZlVGltZW91dCxcbiAgICBrZWVwQWxpdmVNYXhUaW1lb3V0LFxuICAgIGtlZXBBbGl2ZVRpbWVvdXRUaHJlc2hvbGQsXG4gICAgc29ja2V0UGF0aCxcbiAgICBwaXBlbGluaW5nLFxuICAgIHRscyxcbiAgICBzdHJpY3RDb250ZW50TGVuZ3RoLFxuICAgIG1heENhY2hlZFNlc3Npb25zLFxuICAgIG1heFJlZGlyZWN0aW9ucyxcbiAgICBjb25uZWN0LFxuICAgIG1heFJlcXVlc3RzUGVyQ2xpZW50LFxuICAgIGxvY2FsQWRkcmVzcyxcbiAgICBtYXhSZXNwb25zZVNpemUsXG4gICAgYXV0b1NlbGVjdEZhbWlseSxcbiAgICBhdXRvU2VsZWN0RmFtaWx5QXR0ZW1wdFRpbWVvdXQsXG4gICAgLy8gaDJcbiAgICBhbGxvd0gyLFxuICAgIG1heENvbmN1cnJlbnRTdHJlYW1zXG4gIH0gPSB7fSkge1xuICAgIHN1cGVyKClcblxuICAgIGlmIChrZWVwQWxpdmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCd1bnN1cHBvcnRlZCBrZWVwQWxpdmUsIHVzZSBwaXBlbGluaW5nPTAgaW5zdGVhZCcpXG4gICAgfVxuXG4gICAgaWYgKHNvY2tldFRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCd1bnN1cHBvcnRlZCBzb2NrZXRUaW1lb3V0LCB1c2UgaGVhZGVyc1RpbWVvdXQgJiBib2R5VGltZW91dCBpbnN0ZWFkJylcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdFRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCd1bnN1cHBvcnRlZCByZXF1ZXN0VGltZW91dCwgdXNlIGhlYWRlcnNUaW1lb3V0ICYgYm9keVRpbWVvdXQgaW5zdGVhZCcpXG4gICAgfVxuXG4gICAgaWYgKGlkbGVUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcigndW5zdXBwb3J0ZWQgaWRsZVRpbWVvdXQsIHVzZSBrZWVwQWxpdmVUaW1lb3V0IGluc3RlYWQnKVxuICAgIH1cblxuICAgIGlmIChtYXhLZWVwQWxpdmVUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcigndW5zdXBwb3J0ZWQgbWF4S2VlcEFsaXZlVGltZW91dCwgdXNlIGtlZXBBbGl2ZU1heFRpbWVvdXQgaW5zdGVhZCcpXG4gICAgfVxuXG4gICAgaWYgKG1heEhlYWRlclNpemUgIT0gbnVsbCAmJiAhTnVtYmVyLmlzRmluaXRlKG1heEhlYWRlclNpemUpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgbWF4SGVhZGVyU2l6ZScpXG4gICAgfVxuXG4gICAgaWYgKHNvY2tldFBhdGggIT0gbnVsbCAmJiB0eXBlb2Ygc29ja2V0UGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBzb2NrZXRQYXRoJylcbiAgICB9XG5cbiAgICBpZiAoY29ubmVjdFRpbWVvdXQgIT0gbnVsbCAmJiAoIU51bWJlci5pc0Zpbml0ZShjb25uZWN0VGltZW91dCkgfHwgY29ubmVjdFRpbWVvdXQgPCAwKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGNvbm5lY3RUaW1lb3V0JylcbiAgICB9XG5cbiAgICBpZiAoa2VlcEFsaXZlVGltZW91dCAhPSBudWxsICYmICghTnVtYmVyLmlzRmluaXRlKGtlZXBBbGl2ZVRpbWVvdXQpIHx8IGtlZXBBbGl2ZVRpbWVvdXQgPD0gMCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBrZWVwQWxpdmVUaW1lb3V0JylcbiAgICB9XG5cbiAgICBpZiAoa2VlcEFsaXZlTWF4VGltZW91dCAhPSBudWxsICYmICghTnVtYmVyLmlzRmluaXRlKGtlZXBBbGl2ZU1heFRpbWVvdXQpIHx8IGtlZXBBbGl2ZU1heFRpbWVvdXQgPD0gMCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBrZWVwQWxpdmVNYXhUaW1lb3V0JylcbiAgICB9XG5cbiAgICBpZiAoa2VlcEFsaXZlVGltZW91dFRocmVzaG9sZCAhPSBudWxsICYmICFOdW1iZXIuaXNGaW5pdGUoa2VlcEFsaXZlVGltZW91dFRocmVzaG9sZCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBrZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkJylcbiAgICB9XG5cbiAgICBpZiAoaGVhZGVyc1RpbWVvdXQgIT0gbnVsbCAmJiAoIU51bWJlci5pc0ludGVnZXIoaGVhZGVyc1RpbWVvdXQpIHx8IGhlYWRlcnNUaW1lb3V0IDwgMCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaGVhZGVyc1RpbWVvdXQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgb3IgemVybycpXG4gICAgfVxuXG4gICAgaWYgKGJvZHlUaW1lb3V0ICE9IG51bGwgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKGJvZHlUaW1lb3V0KSB8fCBib2R5VGltZW91dCA8IDApKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2JvZHlUaW1lb3V0IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIG9yIHplcm8nKVxuICAgIH1cblxuICAgIGlmIChjb25uZWN0ICE9IG51bGwgJiYgdHlwZW9mIGNvbm5lY3QgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGNvbm5lY3QgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2Nvbm5lY3QgbXVzdCBiZSBhIGZ1bmN0aW9uIG9yIGFuIG9iamVjdCcpXG4gICAgfVxuXG4gICAgaWYgKG1heFJlZGlyZWN0aW9ucyAhPSBudWxsICYmICghTnVtYmVyLmlzSW50ZWdlcihtYXhSZWRpcmVjdGlvbnMpIHx8IG1heFJlZGlyZWN0aW9ucyA8IDApKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ21heFJlZGlyZWN0aW9ucyBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJylcbiAgICB9XG5cbiAgICBpZiAobWF4UmVxdWVzdHNQZXJDbGllbnQgIT0gbnVsbCAmJiAoIU51bWJlci5pc0ludGVnZXIobWF4UmVxdWVzdHNQZXJDbGllbnQpIHx8IG1heFJlcXVlc3RzUGVyQ2xpZW50IDwgMCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignbWF4UmVxdWVzdHNQZXJDbGllbnQgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpXG4gICAgfVxuXG4gICAgaWYgKGxvY2FsQWRkcmVzcyAhPSBudWxsICYmICh0eXBlb2YgbG9jYWxBZGRyZXNzICE9PSAnc3RyaW5nJyB8fCBuZXQuaXNJUChsb2NhbEFkZHJlc3MpID09PSAwKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdsb2NhbEFkZHJlc3MgbXVzdCBiZSB2YWxpZCBzdHJpbmcgSVAgYWRkcmVzcycpXG4gICAgfVxuXG4gICAgaWYgKG1heFJlc3BvbnNlU2l6ZSAhPSBudWxsICYmICghTnVtYmVyLmlzSW50ZWdlcihtYXhSZXNwb25zZVNpemUpIHx8IG1heFJlc3BvbnNlU2l6ZSA8IC0xKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdtYXhSZXNwb25zZVNpemUgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgYXV0b1NlbGVjdEZhbWlseUF0dGVtcHRUaW1lb3V0ICE9IG51bGwgJiZcbiAgICAgICghTnVtYmVyLmlzSW50ZWdlcihhdXRvU2VsZWN0RmFtaWx5QXR0ZW1wdFRpbWVvdXQpIHx8IGF1dG9TZWxlY3RGYW1pbHlBdHRlbXB0VGltZW91dCA8IC0xKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdhdXRvU2VsZWN0RmFtaWx5QXR0ZW1wdFRpbWVvdXQgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpXG4gICAgfVxuXG4gICAgLy8gaDJcbiAgICBpZiAoYWxsb3dIMiAhPSBudWxsICYmIHR5cGVvZiBhbGxvd0gyICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignYWxsb3dIMiBtdXN0IGJlIGEgdmFsaWQgYm9vbGVhbiB2YWx1ZScpXG4gICAgfVxuXG4gICAgaWYgKG1heENvbmN1cnJlbnRTdHJlYW1zICE9IG51bGwgJiYgKHR5cGVvZiBtYXhDb25jdXJyZW50U3RyZWFtcyAhPT0gJ251bWJlcicgfHwgbWF4Q29uY3VycmVudFN0cmVhbXMgPCAxKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdtYXhDb25jdXJyZW50U3RyZWFtcyBtdXN0IGJlIGEgcG9zc2l0aXZlIGludGVnZXIsIGdyZWF0ZXIgdGhhbiAwJylcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNvbm5lY3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbm5lY3QgPSBidWlsZENvbm5lY3Rvcih7XG4gICAgICAgIC4uLnRscyxcbiAgICAgICAgbWF4Q2FjaGVkU2Vzc2lvbnMsXG4gICAgICAgIGFsbG93SDIsXG4gICAgICAgIHNvY2tldFBhdGgsXG4gICAgICAgIHRpbWVvdXQ6IGNvbm5lY3RUaW1lb3V0LFxuICAgICAgICAuLi4odXRpbC5ub2RlSGFzQXV0b1NlbGVjdEZhbWlseSAmJiBhdXRvU2VsZWN0RmFtaWx5ID8geyBhdXRvU2VsZWN0RmFtaWx5LCBhdXRvU2VsZWN0RmFtaWx5QXR0ZW1wdFRpbWVvdXQgfSA6IHVuZGVmaW5lZCksXG4gICAgICAgIC4uLmNvbm5lY3RcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpc1trSW50ZXJjZXB0b3JzXSA9IGludGVyY2VwdG9ycyAmJiBpbnRlcmNlcHRvcnMuQ2xpZW50ICYmIEFycmF5LmlzQXJyYXkoaW50ZXJjZXB0b3JzLkNsaWVudClcbiAgICAgID8gaW50ZXJjZXB0b3JzLkNsaWVudFxuICAgICAgOiBbY3JlYXRlUmVkaXJlY3RJbnRlcmNlcHRvcih7IG1heFJlZGlyZWN0aW9ucyB9KV1cbiAgICB0aGlzW2tVcmxdID0gdXRpbC5wYXJzZU9yaWdpbih1cmwpXG4gICAgdGhpc1trQ29ubmVjdG9yXSA9IGNvbm5lY3RcbiAgICB0aGlzW2tTb2NrZXRdID0gbnVsbFxuICAgIHRoaXNba1BpcGVsaW5pbmddID0gcGlwZWxpbmluZyAhPSBudWxsID8gcGlwZWxpbmluZyA6IDFcbiAgICB0aGlzW2tNYXhIZWFkZXJzU2l6ZV0gPSBtYXhIZWFkZXJTaXplIHx8IGh0dHAubWF4SGVhZGVyU2l6ZVxuICAgIHRoaXNba0tlZXBBbGl2ZURlZmF1bHRUaW1lb3V0XSA9IGtlZXBBbGl2ZVRpbWVvdXQgPT0gbnVsbCA/IDRlMyA6IGtlZXBBbGl2ZVRpbWVvdXRcbiAgICB0aGlzW2tLZWVwQWxpdmVNYXhUaW1lb3V0XSA9IGtlZXBBbGl2ZU1heFRpbWVvdXQgPT0gbnVsbCA/IDYwMGUzIDoga2VlcEFsaXZlTWF4VGltZW91dFxuICAgIHRoaXNba0tlZXBBbGl2ZVRpbWVvdXRUaHJlc2hvbGRdID0ga2VlcEFsaXZlVGltZW91dFRocmVzaG9sZCA9PSBudWxsID8gMWUzIDoga2VlcEFsaXZlVGltZW91dFRocmVzaG9sZFxuICAgIHRoaXNba0tlZXBBbGl2ZVRpbWVvdXRWYWx1ZV0gPSB0aGlzW2tLZWVwQWxpdmVEZWZhdWx0VGltZW91dF1cbiAgICB0aGlzW2tTZXJ2ZXJOYW1lXSA9IG51bGxcbiAgICB0aGlzW2tMb2NhbEFkZHJlc3NdID0gbG9jYWxBZGRyZXNzICE9IG51bGwgPyBsb2NhbEFkZHJlc3MgOiBudWxsXG4gICAgdGhpc1trUmVzdW1pbmddID0gMCAvLyAwLCBpZGxlLCAxLCBzY2hlZHVsZWQsIDIgcmVzdW1pbmdcbiAgICB0aGlzW2tOZWVkRHJhaW5dID0gMCAvLyAwLCBpZGxlLCAxLCBzY2hlZHVsZWQsIDIgcmVzdW1pbmdcbiAgICB0aGlzW2tIb3N0SGVhZGVyXSA9IGBob3N0OiAke3RoaXNba1VybF0uaG9zdG5hbWV9JHt0aGlzW2tVcmxdLnBvcnQgPyBgOiR7dGhpc1trVXJsXS5wb3J0fWAgOiAnJ31cXHJcXG5gXG4gICAgdGhpc1trQm9keVRpbWVvdXRdID0gYm9keVRpbWVvdXQgIT0gbnVsbCA/IGJvZHlUaW1lb3V0IDogMzAwZTNcbiAgICB0aGlzW2tIZWFkZXJzVGltZW91dF0gPSBoZWFkZXJzVGltZW91dCAhPSBudWxsID8gaGVhZGVyc1RpbWVvdXQgOiAzMDBlM1xuICAgIHRoaXNba1N0cmljdENvbnRlbnRMZW5ndGhdID0gc3RyaWN0Q29udGVudExlbmd0aCA9PSBudWxsID8gdHJ1ZSA6IHN0cmljdENvbnRlbnRMZW5ndGhcbiAgICB0aGlzW2tNYXhSZWRpcmVjdGlvbnNdID0gbWF4UmVkaXJlY3Rpb25zXG4gICAgdGhpc1trTWF4UmVxdWVzdHNdID0gbWF4UmVxdWVzdHNQZXJDbGllbnRcbiAgICB0aGlzW2tDbG9zZWRSZXNvbHZlXSA9IG51bGxcbiAgICB0aGlzW2tNYXhSZXNwb25zZVNpemVdID0gbWF4UmVzcG9uc2VTaXplID4gLTEgPyBtYXhSZXNwb25zZVNpemUgOiAtMVxuICAgIHRoaXNba0hUVFBDb25uVmVyc2lvbl0gPSAnaDEnXG5cbiAgICAvLyBIVFRQLzJcbiAgICB0aGlzW2tIVFRQMlNlc3Npb25dID0gbnVsbFxuICAgIHRoaXNba0hUVFAyU2Vzc2lvblN0YXRlXSA9ICFhbGxvd0gyXG4gICAgICA/IG51bGxcbiAgICAgIDoge1xuICAgICAgICAvLyBzdHJlYW1zOiBudWxsLCAvLyBGaXhlZCBxdWV1ZSBvZiBzdHJlYW1zIC0gRm9yIGZ1dHVyZSBzdXBwb3J0IG9mIGBwdXNoYFxuICAgICAgICAgIG9wZW5TdHJlYW1zOiAwLCAvLyBLZWVwIHRyYWNrIG9mIHRoZW0gdG8gZGVjaWRlIHdldGhlciBvciBub3QgdW5yZWYgdGhlIHNlc3Npb25cbiAgICAgICAgICBtYXhDb25jdXJyZW50U3RyZWFtczogbWF4Q29uY3VycmVudFN0cmVhbXMgIT0gbnVsbCA/IG1heENvbmN1cnJlbnRTdHJlYW1zIDogMTAwIC8vIE1heCBwZWVyQ29uY3VycmVudFN0cmVhbXMgZm9yIGEgTm9kZSBoMiBzZXJ2ZXJcbiAgICAgICAgfVxuICAgIHRoaXNba0hvc3RdID0gYCR7dGhpc1trVXJsXS5ob3N0bmFtZX0ke3RoaXNba1VybF0ucG9ydCA/IGA6JHt0aGlzW2tVcmxdLnBvcnR9YCA6ICcnfWBcblxuICAgIC8vIGtRdWV1ZSBpcyBidWlsdCB1cCBvZiAzIHNlY3Rpb25zIHNlcGFyYXRlZCBieVxuICAgIC8vIHRoZSBrUnVubmluZ0lkeCBhbmQga1BlbmRpbmdJZHggaW5kaWNlcy5cbiAgICAvLyB8ICAgY29tcGxldGUgICB8ICAgcnVubmluZyAgIHwgICBwZW5kaW5nICAgfFxuICAgIC8vICAgICAgICAgICAgICAgIF4ga1J1bm5pbmdJZHggXiBrUGVuZGluZ0lkeCBeIGtRdWV1ZS5sZW5ndGhcbiAgICAvLyBrUnVubmluZ0lkeCBwb2ludHMgdG8gdGhlIGZpcnN0IHJ1bm5pbmcgZWxlbWVudC5cbiAgICAvLyBrUGVuZGluZ0lkeCBwb2ludHMgdG8gdGhlIGZpcnN0IHBlbmRpbmcgZWxlbWVudC5cbiAgICAvLyBUaGlzIGltcGxlbWVudHMgYSBmYXN0IHF1ZXVlIHdpdGggYW4gYW1vcnRpemVkXG4gICAgLy8gdGltZSBvZiBPKDEpLlxuXG4gICAgdGhpc1trUXVldWVdID0gW11cbiAgICB0aGlzW2tSdW5uaW5nSWR4XSA9IDBcbiAgICB0aGlzW2tQZW5kaW5nSWR4XSA9IDBcbiAgfVxuXG4gIGdldCBwaXBlbGluaW5nICgpIHtcbiAgICByZXR1cm4gdGhpc1trUGlwZWxpbmluZ11cbiAgfVxuXG4gIHNldCBwaXBlbGluaW5nICh2YWx1ZSkge1xuICAgIHRoaXNba1BpcGVsaW5pbmddID0gdmFsdWVcbiAgICByZXN1bWUodGhpcywgdHJ1ZSlcbiAgfVxuXG4gIGdldCBba1BlbmRpbmddICgpIHtcbiAgICByZXR1cm4gdGhpc1trUXVldWVdLmxlbmd0aCAtIHRoaXNba1BlbmRpbmdJZHhdXG4gIH1cblxuICBnZXQgW2tSdW5uaW5nXSAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1BlbmRpbmdJZHhdIC0gdGhpc1trUnVubmluZ0lkeF1cbiAgfVxuXG4gIGdldCBba1NpemVdICgpIHtcbiAgICByZXR1cm4gdGhpc1trUXVldWVdLmxlbmd0aCAtIHRoaXNba1J1bm5pbmdJZHhdXG4gIH1cblxuICBnZXQgW2tDb25uZWN0ZWRdICgpIHtcbiAgICByZXR1cm4gISF0aGlzW2tTb2NrZXRdICYmICF0aGlzW2tDb25uZWN0aW5nXSAmJiAhdGhpc1trU29ja2V0XS5kZXN0cm95ZWRcbiAgfVxuXG4gIGdldCBba0J1c3ldICgpIHtcbiAgICBjb25zdCBzb2NrZXQgPSB0aGlzW2tTb2NrZXRdXG4gICAgcmV0dXJuIChcbiAgICAgIChzb2NrZXQgJiYgKHNvY2tldFtrUmVzZXRdIHx8IHNvY2tldFtrV3JpdGluZ10gfHwgc29ja2V0W2tCbG9ja2luZ10pKSB8fFxuICAgICAgKHRoaXNba1NpemVdID49ICh0aGlzW2tQaXBlbGluaW5nXSB8fCAxKSkgfHxcbiAgICAgIHRoaXNba1BlbmRpbmddID4gMFxuICAgIClcbiAgfVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZTogb25seSB1c2VkIGZvciB0ZXN0ICovXG4gIFtrQ29ubmVjdF0gKGNiKSB7XG4gICAgY29ubmVjdCh0aGlzKVxuICAgIHRoaXMub25jZSgnY29ubmVjdCcsIGNiKVxuICB9XG5cbiAgW2tEaXNwYXRjaF0gKG9wdHMsIGhhbmRsZXIpIHtcbiAgICBjb25zdCBvcmlnaW4gPSBvcHRzLm9yaWdpbiB8fCB0aGlzW2tVcmxdLm9yaWdpblxuXG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXNba0hUVFBDb25uVmVyc2lvbl0gPT09ICdoMidcbiAgICAgID8gUmVxdWVzdFtrSFRUUDJCdWlsZFJlcXVlc3RdKG9yaWdpbiwgb3B0cywgaGFuZGxlcilcbiAgICAgIDogUmVxdWVzdFtrSFRUUDFCdWlsZFJlcXVlc3RdKG9yaWdpbiwgb3B0cywgaGFuZGxlcilcblxuICAgIHRoaXNba1F1ZXVlXS5wdXNoKHJlcXVlc3QpXG4gICAgaWYgKHRoaXNba1Jlc3VtaW5nXSkge1xuICAgICAgLy8gRG8gbm90aGluZy5cbiAgICB9IGVsc2UgaWYgKHV0aWwuYm9keUxlbmd0aChyZXF1ZXN0LmJvZHkpID09IG51bGwgJiYgdXRpbC5pc0l0ZXJhYmxlKHJlcXVlc3QuYm9keSkpIHtcbiAgICAgIC8vIFdhaXQgYSB0aWNrIGluIGNhc2Ugc3RyZWFtL2l0ZXJhdG9yIGlzIGVuZGVkIGluIHRoZSBzYW1lIHRpY2suXG4gICAgICB0aGlzW2tSZXN1bWluZ10gPSAxXG4gICAgICBwcm9jZXNzLm5leHRUaWNrKHJlc3VtZSwgdGhpcylcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdW1lKHRoaXMsIHRydWUpXG4gICAgfVxuXG4gICAgaWYgKHRoaXNba1Jlc3VtaW5nXSAmJiB0aGlzW2tOZWVkRHJhaW5dICE9PSAyICYmIHRoaXNba0J1c3ldKSB7XG4gICAgICB0aGlzW2tOZWVkRHJhaW5dID0gMlxuICAgIH1cblxuICAgIHJldHVybiB0aGlzW2tOZWVkRHJhaW5dIDwgMlxuICB9XG5cbiAgYXN5bmMgW2tDbG9zZV0gKCkge1xuICAgIC8vIFRPRE86IGZvciBIMiB3ZSBuZWVkIHRvIGdyYWNlZnVsbHkgZmx1c2ggdGhlIHJlbWFpbmluZyBlbnF1ZXVlZFxuICAgIC8vIHJlcXVlc3QgYW5kIGNsb3NlIGVhY2ggc3RyZWFtLlxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgaWYgKCF0aGlzW2tTaXplXSkge1xuICAgICAgICByZXNvbHZlKG51bGwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzW2tDbG9zZWRSZXNvbHZlXSA9IHJlc29sdmVcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgW2tEZXN0cm95XSAoZXJyKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0cyA9IHRoaXNba1F1ZXVlXS5zcGxpY2UodGhpc1trUGVuZGluZ0lkeF0pXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcXVlc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSByZXF1ZXN0c1tpXVxuICAgICAgICBlcnJvclJlcXVlc3QodGhpcywgcmVxdWVzdCwgZXJyKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjYWxsYmFjayA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXNba0Nsb3NlZFJlc29sdmVdKSB7XG4gICAgICAgICAgLy8gVE9ETyAoZml4KTogU2hvdWxkIHdlIGVycm9yIGhlcmUgd2l0aCBDbGllbnREZXN0cm95ZWRFcnJvcj9cbiAgICAgICAgICB0aGlzW2tDbG9zZWRSZXNvbHZlXSgpXG4gICAgICAgICAgdGhpc1trQ2xvc2VkUmVzb2x2ZV0gPSBudWxsXG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzW2tIVFRQMlNlc3Npb25dICE9IG51bGwpIHtcbiAgICAgICAgdXRpbC5kZXN0cm95KHRoaXNba0hUVFAyU2Vzc2lvbl0sIGVycilcbiAgICAgICAgdGhpc1trSFRUUDJTZXNzaW9uXSA9IG51bGxcbiAgICAgICAgdGhpc1trSFRUUDJTZXNzaW9uU3RhdGVdID0gbnVsbFxuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXNba1NvY2tldF0pIHtcbiAgICAgICAgcXVldWVNaWNyb3Rhc2soY2FsbGJhY2spXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1dGlsLmRlc3Ryb3kodGhpc1trU29ja2V0XS5vbignY2xvc2UnLCBjYWxsYmFjayksIGVycilcbiAgICAgIH1cblxuICAgICAgcmVzdW1lKHRoaXMpXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBvbkh0dHAyU2Vzc2lvbkVycm9yIChlcnIpIHtcbiAgYXNzZXJ0KGVyci5jb2RlICE9PSAnRVJSX1RMU19DRVJUX0FMVE5BTUVfSU5WQUxJRCcpXG5cbiAgdGhpc1trU29ja2V0XVtrRXJyb3JdID0gZXJyXG5cbiAgb25FcnJvcih0aGlzW2tDbGllbnRdLCBlcnIpXG59XG5cbmZ1bmN0aW9uIG9uSHR0cDJGcmFtZUVycm9yICh0eXBlLCBjb2RlLCBpZCkge1xuICBjb25zdCBlcnIgPSBuZXcgSW5mb3JtYXRpb25hbEVycm9yKGBIVFRQLzI6IFwiZnJhbWVFcnJvclwiIHJlY2VpdmVkIC0gdHlwZSAke3R5cGV9LCBjb2RlICR7Y29kZX1gKVxuXG4gIGlmIChpZCA9PT0gMCkge1xuICAgIHRoaXNba1NvY2tldF1ba0Vycm9yXSA9IGVyclxuICAgIG9uRXJyb3IodGhpc1trQ2xpZW50XSwgZXJyKVxuICB9XG59XG5cbmZ1bmN0aW9uIG9uSHR0cDJTZXNzaW9uRW5kICgpIHtcbiAgdXRpbC5kZXN0cm95KHRoaXMsIG5ldyBTb2NrZXRFcnJvcignb3RoZXIgc2lkZSBjbG9zZWQnKSlcbiAgdXRpbC5kZXN0cm95KHRoaXNba1NvY2tldF0sIG5ldyBTb2NrZXRFcnJvcignb3RoZXIgc2lkZSBjbG9zZWQnKSlcbn1cblxuZnVuY3Rpb24gb25IVFRQMkdvQXdheSAoY29kZSkge1xuICBjb25zdCBjbGllbnQgPSB0aGlzW2tDbGllbnRdXG4gIGNvbnN0IGVyciA9IG5ldyBJbmZvcm1hdGlvbmFsRXJyb3IoYEhUVFAvMjogXCJHT0FXQVlcIiBmcmFtZSByZWNlaXZlZCB3aXRoIGNvZGUgJHtjb2RlfWApXG4gIGNsaWVudFtrU29ja2V0XSA9IG51bGxcbiAgY2xpZW50W2tIVFRQMlNlc3Npb25dID0gbnVsbFxuXG4gIGlmIChjbGllbnQuZGVzdHJveWVkKSB7XG4gICAgYXNzZXJ0KHRoaXNba1BlbmRpbmddID09PSAwKVxuXG4gICAgLy8gRmFpbCBlbnRpcmUgcXVldWUuXG4gICAgY29uc3QgcmVxdWVzdHMgPSBjbGllbnRba1F1ZXVlXS5zcGxpY2UoY2xpZW50W2tSdW5uaW5nSWR4XSlcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcXVlc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gcmVxdWVzdHNbaV1cbiAgICAgIGVycm9yUmVxdWVzdCh0aGlzLCByZXF1ZXN0LCBlcnIpXG4gICAgfVxuICB9IGVsc2UgaWYgKGNsaWVudFtrUnVubmluZ10gPiAwKSB7XG4gICAgLy8gRmFpbCBoZWFkIG9mIHBpcGVsaW5lLlxuICAgIGNvbnN0IHJlcXVlc3QgPSBjbGllbnRba1F1ZXVlXVtjbGllbnRba1J1bm5pbmdJZHhdXVxuICAgIGNsaWVudFtrUXVldWVdW2NsaWVudFtrUnVubmluZ0lkeF0rK10gPSBudWxsXG5cbiAgICBlcnJvclJlcXVlc3QoY2xpZW50LCByZXF1ZXN0LCBlcnIpXG4gIH1cblxuICBjbGllbnRba1BlbmRpbmdJZHhdID0gY2xpZW50W2tSdW5uaW5nSWR4XVxuXG4gIGFzc2VydChjbGllbnRba1J1bm5pbmddID09PSAwKVxuXG4gIGNsaWVudC5lbWl0KCdkaXNjb25uZWN0JyxcbiAgICBjbGllbnRba1VybF0sXG4gICAgW2NsaWVudF0sXG4gICAgZXJyXG4gIClcblxuICByZXN1bWUoY2xpZW50KVxufVxuXG5jb25zdCBjb25zdGFudHMgPSByZXF1aXJlKCcuL2xsaHR0cC9jb25zdGFudHMnKVxuY29uc3QgY3JlYXRlUmVkaXJlY3RJbnRlcmNlcHRvciA9IHJlcXVpcmUoJy4vaW50ZXJjZXB0b3IvcmVkaXJlY3RJbnRlcmNlcHRvcicpXG5jb25zdCBFTVBUWV9CVUYgPSBCdWZmZXIuYWxsb2MoMClcblxuYXN5bmMgZnVuY3Rpb24gbGF6eWxsaHR0cCAoKSB7XG4gIGNvbnN0IGxsaHR0cFdhc21EYXRhID0gcHJvY2Vzcy5lbnYuSkVTVF9XT1JLRVJfSUQgPyByZXF1aXJlKCcuL2xsaHR0cC9sbGh0dHAtd2FzbS5qcycpIDogdW5kZWZpbmVkXG5cbiAgbGV0IG1vZFxuICB0cnkge1xuICAgIG1vZCA9IGF3YWl0IFdlYkFzc2VtYmx5LmNvbXBpbGUoQnVmZmVyLmZyb20ocmVxdWlyZSgnLi9sbGh0dHAvbGxodHRwX3NpbWQtd2FzbS5qcycpLCAnYmFzZTY0JykpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXG4gICAgLy8gV2UgY291bGQgY2hlY2sgaWYgdGhlIGVycm9yIHdhcyBjYXVzZWQgYnkgdGhlIHNpbWQgb3B0aW9uIG5vdFxuICAgIC8vIGJlaW5nIGVuYWJsZWQsIGJ1dCB0aGUgb2NjdXJyaW5nIG9mIHRoaXMgb3RoZXIgZXJyb3JcbiAgICAvLyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9lbXNjcmlwdGVuLWNvcmUvZW1zY3JpcHRlbi9pc3N1ZXMvMTE0OTVcbiAgICAvLyBnb3QgbWUgdG8gcmVtb3ZlIHRoYXQgY2hlY2sgdG8gYXZvaWQgYnJlYWtpbmcgTm9kZSAxMi5cbiAgICBtb2QgPSBhd2FpdCBXZWJBc3NlbWJseS5jb21waWxlKEJ1ZmZlci5mcm9tKGxsaHR0cFdhc21EYXRhIHx8IHJlcXVpcmUoJy4vbGxodHRwL2xsaHR0cC13YXNtLmpzJyksICdiYXNlNjQnKSlcbiAgfVxuXG4gIHJldHVybiBhd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShtb2QsIHtcbiAgICBlbnY6IHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuXG4gICAgICB3YXNtX29uX3VybDogKHAsIGF0LCBsZW4pID0+IHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH0sXG4gICAgICB3YXNtX29uX3N0YXR1czogKHAsIGF0LCBsZW4pID0+IHtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGN1cnJlbnRQYXJzZXIucHRyLCBwKVxuICAgICAgICBjb25zdCBzdGFydCA9IGF0IC0gY3VycmVudEJ1ZmZlclB0ciArIGN1cnJlbnRCdWZmZXJSZWYuYnl0ZU9mZnNldFxuICAgICAgICByZXR1cm4gY3VycmVudFBhcnNlci5vblN0YXR1cyhuZXcgRmFzdEJ1ZmZlcihjdXJyZW50QnVmZmVyUmVmLmJ1ZmZlciwgc3RhcnQsIGxlbikpIHx8IDBcbiAgICAgIH0sXG4gICAgICB3YXNtX29uX21lc3NhZ2VfYmVnaW46IChwKSA9PiB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjdXJyZW50UGFyc2VyLnB0ciwgcClcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQYXJzZXIub25NZXNzYWdlQmVnaW4oKSB8fCAwXG4gICAgICB9LFxuICAgICAgd2FzbV9vbl9oZWFkZXJfZmllbGQ6IChwLCBhdCwgbGVuKSA9PiB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjdXJyZW50UGFyc2VyLnB0ciwgcClcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBhdCAtIGN1cnJlbnRCdWZmZXJQdHIgKyBjdXJyZW50QnVmZmVyUmVmLmJ5dGVPZmZzZXRcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQYXJzZXIub25IZWFkZXJGaWVsZChuZXcgRmFzdEJ1ZmZlcihjdXJyZW50QnVmZmVyUmVmLmJ1ZmZlciwgc3RhcnQsIGxlbikpIHx8IDBcbiAgICAgIH0sXG4gICAgICB3YXNtX29uX2hlYWRlcl92YWx1ZTogKHAsIGF0LCBsZW4pID0+IHtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGN1cnJlbnRQYXJzZXIucHRyLCBwKVxuICAgICAgICBjb25zdCBzdGFydCA9IGF0IC0gY3VycmVudEJ1ZmZlclB0ciArIGN1cnJlbnRCdWZmZXJSZWYuYnl0ZU9mZnNldFxuICAgICAgICByZXR1cm4gY3VycmVudFBhcnNlci5vbkhlYWRlclZhbHVlKG5ldyBGYXN0QnVmZmVyKGN1cnJlbnRCdWZmZXJSZWYuYnVmZmVyLCBzdGFydCwgbGVuKSkgfHwgMFxuICAgICAgfSxcbiAgICAgIHdhc21fb25faGVhZGVyc19jb21wbGV0ZTogKHAsIHN0YXR1c0NvZGUsIHVwZ3JhZGUsIHNob3VsZEtlZXBBbGl2ZSkgPT4ge1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY3VycmVudFBhcnNlci5wdHIsIHApXG4gICAgICAgIHJldHVybiBjdXJyZW50UGFyc2VyLm9uSGVhZGVyc0NvbXBsZXRlKHN0YXR1c0NvZGUsIEJvb2xlYW4odXBncmFkZSksIEJvb2xlYW4oc2hvdWxkS2VlcEFsaXZlKSkgfHwgMFxuICAgICAgfSxcbiAgICAgIHdhc21fb25fYm9keTogKHAsIGF0LCBsZW4pID0+IHtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGN1cnJlbnRQYXJzZXIucHRyLCBwKVxuICAgICAgICBjb25zdCBzdGFydCA9IGF0IC0gY3VycmVudEJ1ZmZlclB0ciArIGN1cnJlbnRCdWZmZXJSZWYuYnl0ZU9mZnNldFxuICAgICAgICByZXR1cm4gY3VycmVudFBhcnNlci5vbkJvZHkobmV3IEZhc3RCdWZmZXIoY3VycmVudEJ1ZmZlclJlZi5idWZmZXIsIHN0YXJ0LCBsZW4pKSB8fCAwXG4gICAgICB9LFxuICAgICAgd2FzbV9vbl9tZXNzYWdlX2NvbXBsZXRlOiAocCkgPT4ge1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY3VycmVudFBhcnNlci5wdHIsIHApXG4gICAgICAgIHJldHVybiBjdXJyZW50UGFyc2VyLm9uTWVzc2FnZUNvbXBsZXRlKCkgfHwgMFxuICAgICAgfVxuXG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIGNhbWVsY2FzZSAqL1xuICAgIH1cbiAgfSlcbn1cblxubGV0IGxsaHR0cEluc3RhbmNlID0gbnVsbFxubGV0IGxsaHR0cFByb21pc2UgPSBsYXp5bGxodHRwKClcbmxsaHR0cFByb21pc2UuY2F0Y2goKVxuXG5sZXQgY3VycmVudFBhcnNlciA9IG51bGxcbmxldCBjdXJyZW50QnVmZmVyUmVmID0gbnVsbFxubGV0IGN1cnJlbnRCdWZmZXJTaXplID0gMFxubGV0IGN1cnJlbnRCdWZmZXJQdHIgPSBudWxsXG5cbmNvbnN0IFRJTUVPVVRfSEVBREVSUyA9IDFcbmNvbnN0IFRJTUVPVVRfQk9EWSA9IDJcbmNvbnN0IFRJTUVPVVRfSURMRSA9IDNcblxuY2xhc3MgUGFyc2VyIHtcbiAgY29uc3RydWN0b3IgKGNsaWVudCwgc29ja2V0LCB7IGV4cG9ydHMgfSkge1xuICAgIGFzc2VydChOdW1iZXIuaXNGaW5pdGUoY2xpZW50W2tNYXhIZWFkZXJzU2l6ZV0pICYmIGNsaWVudFtrTWF4SGVhZGVyc1NpemVdID4gMClcblxuICAgIHRoaXMubGxodHRwID0gZXhwb3J0c1xuICAgIHRoaXMucHRyID0gdGhpcy5sbGh0dHAubGxodHRwX2FsbG9jKGNvbnN0YW50cy5UWVBFLlJFU1BPTlNFKVxuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50XG4gICAgdGhpcy5zb2NrZXQgPSBzb2NrZXRcbiAgICB0aGlzLnRpbWVvdXQgPSBudWxsXG4gICAgdGhpcy50aW1lb3V0VmFsdWUgPSBudWxsXG4gICAgdGhpcy50aW1lb3V0VHlwZSA9IG51bGxcbiAgICB0aGlzLnN0YXR1c0NvZGUgPSBudWxsXG4gICAgdGhpcy5zdGF0dXNUZXh0ID0gJydcbiAgICB0aGlzLnVwZ3JhZGUgPSBmYWxzZVxuICAgIHRoaXMuaGVhZGVycyA9IFtdXG4gICAgdGhpcy5oZWFkZXJzU2l6ZSA9IDBcbiAgICB0aGlzLmhlYWRlcnNNYXhTaXplID0gY2xpZW50W2tNYXhIZWFkZXJzU2l6ZV1cbiAgICB0aGlzLnNob3VsZEtlZXBBbGl2ZSA9IGZhbHNlXG4gICAgdGhpcy5wYXVzZWQgPSBmYWxzZVxuICAgIHRoaXMucmVzdW1lID0gdGhpcy5yZXN1bWUuYmluZCh0aGlzKVxuXG4gICAgdGhpcy5ieXRlc1JlYWQgPSAwXG5cbiAgICB0aGlzLmtlZXBBbGl2ZSA9ICcnXG4gICAgdGhpcy5jb250ZW50TGVuZ3RoID0gJydcbiAgICB0aGlzLmNvbm5lY3Rpb24gPSAnJ1xuICAgIHRoaXMubWF4UmVzcG9uc2VTaXplID0gY2xpZW50W2tNYXhSZXNwb25zZVNpemVdXG4gIH1cblxuICBzZXRUaW1lb3V0ICh2YWx1ZSwgdHlwZSkge1xuICAgIHRoaXMudGltZW91dFR5cGUgPSB0eXBlXG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLnRpbWVvdXRWYWx1ZSkge1xuICAgICAgdGltZXJzLmNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpXG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZXJzLnNldFRpbWVvdXQob25QYXJzZXJUaW1lb3V0LCB2YWx1ZSwgdGhpcylcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2U6IG9ubHkgZm9yIGplc3RcbiAgICAgICAgaWYgKHRoaXMudGltZW91dC51bnJlZikge1xuICAgICAgICAgIHRoaXMudGltZW91dC51bnJlZigpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudGltZW91dCA9IG51bGxcbiAgICAgIH1cbiAgICAgIHRoaXMudGltZW91dFZhbHVlID0gdmFsdWVcbiAgICB9IGVsc2UgaWYgKHRoaXMudGltZW91dCkge1xuICAgICAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2U6IG9ubHkgZm9yIGplc3RcbiAgICAgIGlmICh0aGlzLnRpbWVvdXQucmVmcmVzaCkge1xuICAgICAgICB0aGlzLnRpbWVvdXQucmVmcmVzaCgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVzdW1lICgpIHtcbiAgICBpZiAodGhpcy5zb2NrZXQuZGVzdHJveWVkIHx8ICF0aGlzLnBhdXNlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXNzZXJ0KHRoaXMucHRyICE9IG51bGwpXG4gICAgYXNzZXJ0KGN1cnJlbnRQYXJzZXIgPT0gbnVsbClcblxuICAgIHRoaXMubGxodHRwLmxsaHR0cF9yZXN1bWUodGhpcy5wdHIpXG5cbiAgICBhc3NlcnQodGhpcy50aW1lb3V0VHlwZSA9PT0gVElNRU9VVF9CT0RZKVxuICAgIGlmICh0aGlzLnRpbWVvdXQpIHtcbiAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBvbmx5IGZvciBqZXN0XG4gICAgICBpZiAodGhpcy50aW1lb3V0LnJlZnJlc2gpIHtcbiAgICAgICAgdGhpcy50aW1lb3V0LnJlZnJlc2goKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMucGF1c2VkID0gZmFsc2VcbiAgICB0aGlzLmV4ZWN1dGUodGhpcy5zb2NrZXQucmVhZCgpIHx8IEVNUFRZX0JVRikgLy8gRmx1c2ggcGFyc2VyLlxuICAgIHRoaXMucmVhZE1vcmUoKVxuICB9XG5cbiAgcmVhZE1vcmUgKCkge1xuICAgIHdoaWxlICghdGhpcy5wYXVzZWQgJiYgdGhpcy5wdHIpIHtcbiAgICAgIGNvbnN0IGNodW5rID0gdGhpcy5zb2NrZXQucmVhZCgpXG4gICAgICBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXhlY3V0ZShjaHVuaylcbiAgICB9XG4gIH1cblxuICBleGVjdXRlIChkYXRhKSB7XG4gICAgYXNzZXJ0KHRoaXMucHRyICE9IG51bGwpXG4gICAgYXNzZXJ0KGN1cnJlbnRQYXJzZXIgPT0gbnVsbClcbiAgICBhc3NlcnQoIXRoaXMucGF1c2VkKVxuXG4gICAgY29uc3QgeyBzb2NrZXQsIGxsaHR0cCB9ID0gdGhpc1xuXG4gICAgaWYgKGRhdGEubGVuZ3RoID4gY3VycmVudEJ1ZmZlclNpemUpIHtcbiAgICAgIGlmIChjdXJyZW50QnVmZmVyUHRyKSB7XG4gICAgICAgIGxsaHR0cC5mcmVlKGN1cnJlbnRCdWZmZXJQdHIpXG4gICAgICB9XG4gICAgICBjdXJyZW50QnVmZmVyU2l6ZSA9IE1hdGguY2VpbChkYXRhLmxlbmd0aCAvIDQwOTYpICogNDA5NlxuICAgICAgY3VycmVudEJ1ZmZlclB0ciA9IGxsaHR0cC5tYWxsb2MoY3VycmVudEJ1ZmZlclNpemUpXG4gICAgfVxuXG4gICAgbmV3IFVpbnQ4QXJyYXkobGxodHRwLm1lbW9yeS5idWZmZXIsIGN1cnJlbnRCdWZmZXJQdHIsIGN1cnJlbnRCdWZmZXJTaXplKS5zZXQoZGF0YSlcblxuICAgIC8vIENhbGwgYGV4ZWN1dGVgIG9uIHRoZSB3YXNtIHBhcnNlci5cbiAgICAvLyBXZSBwYXNzIHRoZSBgbGxodHRwX3BhcnNlcmAgcG9pbnRlciBhZGRyZXNzLCB0aGUgcG9pbnRlciBhZGRyZXNzIG9mIGJ1ZmZlciB2aWV3IGRhdGEsXG4gICAgLy8gYW5kIGZpbmFsbHkgdGhlIGxlbmd0aCBvZiBieXRlcyB0byBwYXJzZS5cbiAgICAvLyBUaGUgcmV0dXJuIHZhbHVlIGlzIGFuIGVycm9yIGNvZGUgb3IgYGNvbnN0YW50cy5FUlJPUi5PS2AuXG4gICAgdHJ5IHtcbiAgICAgIGxldCByZXRcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY3VycmVudEJ1ZmZlclJlZiA9IGRhdGFcbiAgICAgICAgY3VycmVudFBhcnNlciA9IHRoaXNcbiAgICAgICAgcmV0ID0gbGxodHRwLmxsaHR0cF9leGVjdXRlKHRoaXMucHRyLCBjdXJyZW50QnVmZmVyUHRyLCBkYXRhLmxlbmd0aClcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtY2F0Y2ggKi9cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogZGlmZmljdWx0IHRvIG1ha2UgYSB0ZXN0IGNhc2UgZm9yICovXG4gICAgICAgIHRocm93IGVyclxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY3VycmVudFBhcnNlciA9IG51bGxcbiAgICAgICAgY3VycmVudEJ1ZmZlclJlZiA9IG51bGxcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb2Zmc2V0ID0gbGxodHRwLmxsaHR0cF9nZXRfZXJyb3JfcG9zKHRoaXMucHRyKSAtIGN1cnJlbnRCdWZmZXJQdHJcblxuICAgICAgaWYgKHJldCA9PT0gY29uc3RhbnRzLkVSUk9SLlBBVVNFRF9VUEdSQURFKSB7XG4gICAgICAgIHRoaXMub25VcGdyYWRlKGRhdGEuc2xpY2Uob2Zmc2V0KSlcbiAgICAgIH0gZWxzZSBpZiAocmV0ID09PSBjb25zdGFudHMuRVJST1IuUEFVU0VEKSB7XG4gICAgICAgIHRoaXMucGF1c2VkID0gdHJ1ZVxuICAgICAgICBzb2NrZXQudW5zaGlmdChkYXRhLnNsaWNlKG9mZnNldCkpXG4gICAgICB9IGVsc2UgaWYgKHJldCAhPT0gY29uc3RhbnRzLkVSUk9SLk9LKSB7XG4gICAgICAgIGNvbnN0IHB0ciA9IGxsaHR0cC5sbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbih0aGlzLnB0cilcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSAnJ1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZTogZGlmZmljdWx0IHRvIG1ha2UgYSB0ZXN0IGNhc2UgZm9yICovXG4gICAgICAgIGlmIChwdHIpIHtcbiAgICAgICAgICBjb25zdCBsZW4gPSBuZXcgVWludDhBcnJheShsbGh0dHAubWVtb3J5LmJ1ZmZlciwgcHRyKS5pbmRleE9mKDApXG4gICAgICAgICAgbWVzc2FnZSA9XG4gICAgICAgICAgICAnUmVzcG9uc2UgZG9lcyBub3QgbWF0Y2ggdGhlIEhUVFAvMS4xIHByb3RvY29sICgnICtcbiAgICAgICAgICAgIEJ1ZmZlci5mcm9tKGxsaHR0cC5tZW1vcnkuYnVmZmVyLCBwdHIsIGxlbikudG9TdHJpbmcoKSArXG4gICAgICAgICAgICAnKSdcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgSFRUUFBhcnNlckVycm9yKG1lc3NhZ2UsIGNvbnN0YW50cy5FUlJPUltyZXRdLCBkYXRhLnNsaWNlKG9mZnNldCkpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBlcnIpXG4gICAgfVxuICB9XG5cbiAgZGVzdHJveSAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucHRyICE9IG51bGwpXG4gICAgYXNzZXJ0KGN1cnJlbnRQYXJzZXIgPT0gbnVsbClcblxuICAgIHRoaXMubGxodHRwLmxsaHR0cF9mcmVlKHRoaXMucHRyKVxuICAgIHRoaXMucHRyID0gbnVsbFxuXG4gICAgdGltZXJzLmNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpXG4gICAgdGhpcy50aW1lb3V0ID0gbnVsbFxuICAgIHRoaXMudGltZW91dFZhbHVlID0gbnVsbFxuICAgIHRoaXMudGltZW91dFR5cGUgPSBudWxsXG5cbiAgICB0aGlzLnBhdXNlZCA9IGZhbHNlXG4gIH1cblxuICBvblN0YXR1cyAoYnVmKSB7XG4gICAgdGhpcy5zdGF0dXNUZXh0ID0gYnVmLnRvU3RyaW5nKClcbiAgfVxuXG4gIG9uTWVzc2FnZUJlZ2luICgpIHtcbiAgICBjb25zdCB7IHNvY2tldCwgY2xpZW50IH0gPSB0aGlzXG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogZGlmZmljdWx0IHRvIG1ha2UgYSB0ZXN0IGNhc2UgZm9yICovXG4gICAgaWYgKHNvY2tldC5kZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3QgPSBjbGllbnRba1F1ZXVlXVtjbGllbnRba1J1bm5pbmdJZHhdXVxuICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICB9XG5cbiAgb25IZWFkZXJGaWVsZCAoYnVmKSB7XG4gICAgY29uc3QgbGVuID0gdGhpcy5oZWFkZXJzLmxlbmd0aFxuXG4gICAgaWYgKChsZW4gJiAxKSA9PT0gMCkge1xuICAgICAgdGhpcy5oZWFkZXJzLnB1c2goYnVmKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhlYWRlcnNbbGVuIC0gMV0gPSBCdWZmZXIuY29uY2F0KFt0aGlzLmhlYWRlcnNbbGVuIC0gMV0sIGJ1Zl0pXG4gICAgfVxuXG4gICAgdGhpcy50cmFja0hlYWRlcihidWYubGVuZ3RoKVxuICB9XG5cbiAgb25IZWFkZXJWYWx1ZSAoYnVmKSB7XG4gICAgbGV0IGxlbiA9IHRoaXMuaGVhZGVycy5sZW5ndGhcblxuICAgIGlmICgobGVuICYgMSkgPT09IDEpIHtcbiAgICAgIHRoaXMuaGVhZGVycy5wdXNoKGJ1ZilcbiAgICAgIGxlbiArPSAxXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGVhZGVyc1tsZW4gLSAxXSA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuaGVhZGVyc1tsZW4gLSAxXSwgYnVmXSlcbiAgICB9XG5cbiAgICBjb25zdCBrZXkgPSB0aGlzLmhlYWRlcnNbbGVuIC0gMl1cbiAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMTAgJiYga2V5LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PT0gJ2tlZXAtYWxpdmUnKSB7XG4gICAgICB0aGlzLmtlZXBBbGl2ZSArPSBidWYudG9TdHJpbmcoKVxuICAgIH0gZWxzZSBpZiAoa2V5Lmxlbmd0aCA9PT0gMTAgJiYga2V5LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PT0gJ2Nvbm5lY3Rpb24nKSB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb24gKz0gYnVmLnRvU3RyaW5nKClcbiAgICB9IGVsc2UgaWYgKGtleS5sZW5ndGggPT09IDE0ICYmIGtleS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LWxlbmd0aCcpIHtcbiAgICAgIHRoaXMuY29udGVudExlbmd0aCArPSBidWYudG9TdHJpbmcoKVxuICAgIH1cblxuICAgIHRoaXMudHJhY2tIZWFkZXIoYnVmLmxlbmd0aClcbiAgfVxuXG4gIHRyYWNrSGVhZGVyIChsZW4pIHtcbiAgICB0aGlzLmhlYWRlcnNTaXplICs9IGxlblxuICAgIGlmICh0aGlzLmhlYWRlcnNTaXplID49IHRoaXMuaGVhZGVyc01heFNpemUpIHtcbiAgICAgIHV0aWwuZGVzdHJveSh0aGlzLnNvY2tldCwgbmV3IEhlYWRlcnNPdmVyZmxvd0Vycm9yKCkpXG4gICAgfVxuICB9XG5cbiAgb25VcGdyYWRlIChoZWFkKSB7XG4gICAgY29uc3QgeyB1cGdyYWRlLCBjbGllbnQsIHNvY2tldCwgaGVhZGVycywgc3RhdHVzQ29kZSB9ID0gdGhpc1xuXG4gICAgYXNzZXJ0KHVwZ3JhZGUpXG5cbiAgICBjb25zdCByZXF1ZXN0ID0gY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XV1cbiAgICBhc3NlcnQocmVxdWVzdClcblxuICAgIGFzc2VydCghc29ja2V0LmRlc3Ryb3llZClcbiAgICBhc3NlcnQoc29ja2V0ID09PSBjbGllbnRba1NvY2tldF0pXG4gICAgYXNzZXJ0KCF0aGlzLnBhdXNlZClcbiAgICBhc3NlcnQocmVxdWVzdC51cGdyYWRlIHx8IHJlcXVlc3QubWV0aG9kID09PSAnQ09OTkVDVCcpXG5cbiAgICB0aGlzLnN0YXR1c0NvZGUgPSBudWxsXG4gICAgdGhpcy5zdGF0dXNUZXh0ID0gJydcbiAgICB0aGlzLnNob3VsZEtlZXBBbGl2ZSA9IG51bGxcblxuICAgIGFzc2VydCh0aGlzLmhlYWRlcnMubGVuZ3RoICUgMiA9PT0gMClcbiAgICB0aGlzLmhlYWRlcnMgPSBbXVxuICAgIHRoaXMuaGVhZGVyc1NpemUgPSAwXG5cbiAgICBzb2NrZXQudW5zaGlmdChoZWFkKVxuXG4gICAgc29ja2V0W2tQYXJzZXJdLmRlc3Ryb3koKVxuICAgIHNvY2tldFtrUGFyc2VyXSA9IG51bGxcblxuICAgIHNvY2tldFtrQ2xpZW50XSA9IG51bGxcbiAgICBzb2NrZXRba0Vycm9yXSA9IG51bGxcbiAgICBzb2NrZXRcbiAgICAgIC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvblNvY2tldEVycm9yKVxuICAgICAgLnJlbW92ZUxpc3RlbmVyKCdyZWFkYWJsZScsIG9uU29ja2V0UmVhZGFibGUpXG4gICAgICAucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uU29ja2V0RW5kKVxuICAgICAgLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uU29ja2V0Q2xvc2UpXG5cbiAgICBjbGllbnRba1NvY2tldF0gPSBudWxsXG4gICAgY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XSsrXSA9IG51bGxcbiAgICBjbGllbnQuZW1pdCgnZGlzY29ubmVjdCcsIGNsaWVudFtrVXJsXSwgW2NsaWVudF0sIG5ldyBJbmZvcm1hdGlvbmFsRXJyb3IoJ3VwZ3JhZGUnKSlcblxuICAgIHRyeSB7XG4gICAgICByZXF1ZXN0Lm9uVXBncmFkZShzdGF0dXNDb2RlLCBoZWFkZXJzLCBzb2NrZXQpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBlcnIpXG4gICAgfVxuXG4gICAgcmVzdW1lKGNsaWVudClcbiAgfVxuXG4gIG9uSGVhZGVyc0NvbXBsZXRlIChzdGF0dXNDb2RlLCB1cGdyYWRlLCBzaG91bGRLZWVwQWxpdmUpIHtcbiAgICBjb25zdCB7IGNsaWVudCwgc29ja2V0LCBoZWFkZXJzLCBzdGF0dXNUZXh0IH0gPSB0aGlzXG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogZGlmZmljdWx0IHRvIG1ha2UgYSB0ZXN0IGNhc2UgZm9yICovXG4gICAgaWYgKHNvY2tldC5kZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3QgPSBjbGllbnRba1F1ZXVlXVtjbGllbnRba1J1bm5pbmdJZHhdXVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGRpZmZpY3VsdCB0byBtYWtlIGEgdGVzdCBjYXNlIGZvciAqL1xuICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuXG4gICAgYXNzZXJ0KCF0aGlzLnVwZ3JhZGUpXG4gICAgYXNzZXJ0KHRoaXMuc3RhdHVzQ29kZSA8IDIwMClcblxuICAgIGlmIChzdGF0dXNDb2RlID09PSAxMDApIHtcbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIG5ldyBTb2NrZXRFcnJvcignYmFkIHJlc3BvbnNlJywgdXRpbC5nZXRTb2NrZXRJbmZvKHNvY2tldCkpKVxuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuXG4gICAgLyogdGhpcyBjYW4gb25seSBoYXBwZW4gaWYgc2VydmVyIGlzIG1pc2JlaGF2aW5nICovXG4gICAgaWYgKHVwZ3JhZGUgJiYgIXJlcXVlc3QudXBncmFkZSkge1xuICAgICAgdXRpbC5kZXN0cm95KHNvY2tldCwgbmV3IFNvY2tldEVycm9yKCdiYWQgdXBncmFkZScsIHV0aWwuZ2V0U29ja2V0SW5mbyhzb2NrZXQpKSlcbiAgICAgIHJldHVybiAtMVxuICAgIH1cblxuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0aGlzLnRpbWVvdXRUeXBlLCBUSU1FT1VUX0hFQURFUlMpXG5cbiAgICB0aGlzLnN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlXG4gICAgdGhpcy5zaG91bGRLZWVwQWxpdmUgPSAoXG4gICAgICBzaG91bGRLZWVwQWxpdmUgfHxcbiAgICAgIC8vIE92ZXJyaWRlIGxsaHR0cCB2YWx1ZSB3aGljaCBkb2VzIG5vdCBhbGxvdyBrZWVwQWxpdmUgZm9yIEhFQUQuXG4gICAgICAocmVxdWVzdC5tZXRob2QgPT09ICdIRUFEJyAmJiAhc29ja2V0W2tSZXNldF0gJiYgdGhpcy5jb25uZWN0aW9uLnRvTG93ZXJDYXNlKCkgPT09ICdrZWVwLWFsaXZlJylcbiAgICApXG5cbiAgICBpZiAodGhpcy5zdGF0dXNDb2RlID49IDIwMCkge1xuICAgICAgY29uc3QgYm9keVRpbWVvdXQgPSByZXF1ZXN0LmJvZHlUaW1lb3V0ICE9IG51bGxcbiAgICAgICAgPyByZXF1ZXN0LmJvZHlUaW1lb3V0XG4gICAgICAgIDogY2xpZW50W2tCb2R5VGltZW91dF1cbiAgICAgIHRoaXMuc2V0VGltZW91dChib2R5VGltZW91dCwgVElNRU9VVF9CT0RZKVxuICAgIH0gZWxzZSBpZiAodGhpcy50aW1lb3V0KSB7XG4gICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZTogb25seSBmb3IgamVzdFxuICAgICAgaWYgKHRoaXMudGltZW91dC5yZWZyZXNoKSB7XG4gICAgICAgIHRoaXMudGltZW91dC5yZWZyZXNoKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5tZXRob2QgPT09ICdDT05ORUNUJykge1xuICAgICAgYXNzZXJ0KGNsaWVudFtrUnVubmluZ10gPT09IDEpXG4gICAgICB0aGlzLnVwZ3JhZGUgPSB0cnVlXG4gICAgICByZXR1cm4gMlxuICAgIH1cblxuICAgIGlmICh1cGdyYWRlKSB7XG4gICAgICBhc3NlcnQoY2xpZW50W2tSdW5uaW5nXSA9PT0gMSlcbiAgICAgIHRoaXMudXBncmFkZSA9IHRydWVcbiAgICAgIHJldHVybiAyXG4gICAgfVxuXG4gICAgYXNzZXJ0KHRoaXMuaGVhZGVycy5sZW5ndGggJSAyID09PSAwKVxuICAgIHRoaXMuaGVhZGVycyA9IFtdXG4gICAgdGhpcy5oZWFkZXJzU2l6ZSA9IDBcblxuICAgIGlmICh0aGlzLnNob3VsZEtlZXBBbGl2ZSAmJiBjbGllbnRba1BpcGVsaW5pbmddKSB7XG4gICAgICBjb25zdCBrZWVwQWxpdmVUaW1lb3V0ID0gdGhpcy5rZWVwQWxpdmUgPyB1dGlsLnBhcnNlS2VlcEFsaXZlVGltZW91dCh0aGlzLmtlZXBBbGl2ZSkgOiBudWxsXG5cbiAgICAgIGlmIChrZWVwQWxpdmVUaW1lb3V0ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IE1hdGgubWluKFxuICAgICAgICAgIGtlZXBBbGl2ZVRpbWVvdXQgLSBjbGllbnRba0tlZXBBbGl2ZVRpbWVvdXRUaHJlc2hvbGRdLFxuICAgICAgICAgIGNsaWVudFtrS2VlcEFsaXZlTWF4VGltZW91dF1cbiAgICAgICAgKVxuICAgICAgICBpZiAodGltZW91dCA8PSAwKSB7XG4gICAgICAgICAgc29ja2V0W2tSZXNldF0gPSB0cnVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2xpZW50W2tLZWVwQWxpdmVUaW1lb3V0VmFsdWVdID0gdGltZW91dFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGllbnRba0tlZXBBbGl2ZVRpbWVvdXRWYWx1ZV0gPSBjbGllbnRba0tlZXBBbGl2ZURlZmF1bHRUaW1lb3V0XVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdG9wIG1vcmUgcmVxdWVzdHMgZnJvbSBiZWluZyBkaXNwYXRjaGVkLlxuICAgICAgc29ja2V0W2tSZXNldF0gPSB0cnVlXG4gICAgfVxuXG4gICAgY29uc3QgcGF1c2UgPSByZXF1ZXN0Lm9uSGVhZGVycyhzdGF0dXNDb2RlLCBoZWFkZXJzLCB0aGlzLnJlc3VtZSwgc3RhdHVzVGV4dCkgPT09IGZhbHNlXG5cbiAgICBpZiAocmVxdWVzdC5hYm9ydGVkKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5tZXRob2QgPT09ICdIRUFEJykge1xuICAgICAgcmV0dXJuIDFcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzQ29kZSA8IDIwMCkge1xuICAgICAgcmV0dXJuIDFcbiAgICB9XG5cbiAgICBpZiAoc29ja2V0W2tCbG9ja2luZ10pIHtcbiAgICAgIHNvY2tldFtrQmxvY2tpbmddID0gZmFsc2VcbiAgICAgIHJlc3VtZShjbGllbnQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdXNlID8gY29uc3RhbnRzLkVSUk9SLlBBVVNFRCA6IDBcbiAgfVxuXG4gIG9uQm9keSAoYnVmKSB7XG4gICAgY29uc3QgeyBjbGllbnQsIHNvY2tldCwgc3RhdHVzQ29kZSwgbWF4UmVzcG9uc2VTaXplIH0gPSB0aGlzXG5cbiAgICBpZiAoc29ja2V0LmRlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdCA9IGNsaWVudFtrUXVldWVdW2NsaWVudFtrUnVubmluZ0lkeF1dXG4gICAgYXNzZXJ0KHJlcXVlc3QpXG5cbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodGhpcy50aW1lb3V0VHlwZSwgVElNRU9VVF9CT0RZKVxuICAgIGlmICh0aGlzLnRpbWVvdXQpIHtcbiAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBvbmx5IGZvciBqZXN0XG4gICAgICBpZiAodGhpcy50aW1lb3V0LnJlZnJlc2gpIHtcbiAgICAgICAgdGhpcy50aW1lb3V0LnJlZnJlc2goKVxuICAgICAgfVxuICAgIH1cblxuICAgIGFzc2VydChzdGF0dXNDb2RlID49IDIwMClcblxuICAgIGlmIChtYXhSZXNwb25zZVNpemUgPiAtMSAmJiB0aGlzLmJ5dGVzUmVhZCArIGJ1Zi5sZW5ndGggPiBtYXhSZXNwb25zZVNpemUpIHtcbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIG5ldyBSZXNwb25zZUV4Y2VlZGVkTWF4U2l6ZUVycm9yKCkpXG4gICAgICByZXR1cm4gLTFcbiAgICB9XG5cbiAgICB0aGlzLmJ5dGVzUmVhZCArPSBidWYubGVuZ3RoXG5cbiAgICBpZiAocmVxdWVzdC5vbkRhdGEoYnVmKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBjb25zdGFudHMuRVJST1IuUEFVU0VEXG4gICAgfVxuICB9XG5cbiAgb25NZXNzYWdlQ29tcGxldGUgKCkge1xuICAgIGNvbnN0IHsgY2xpZW50LCBzb2NrZXQsIHN0YXR1c0NvZGUsIHVwZ3JhZGUsIGhlYWRlcnMsIGNvbnRlbnRMZW5ndGgsIGJ5dGVzUmVhZCwgc2hvdWxkS2VlcEFsaXZlIH0gPSB0aGlzXG5cbiAgICBpZiAoc29ja2V0LmRlc3Ryb3llZCAmJiAoIXN0YXR1c0NvZGUgfHwgc2hvdWxkS2VlcEFsaXZlKSkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuXG4gICAgaWYgKHVwZ3JhZGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3QgPSBjbGllbnRba1F1ZXVlXVtjbGllbnRba1J1bm5pbmdJZHhdXVxuICAgIGFzc2VydChyZXF1ZXN0KVxuXG4gICAgYXNzZXJ0KHN0YXR1c0NvZGUgPj0gMTAwKVxuXG4gICAgdGhpcy5zdGF0dXNDb2RlID0gbnVsbFxuICAgIHRoaXMuc3RhdHVzVGV4dCA9ICcnXG4gICAgdGhpcy5ieXRlc1JlYWQgPSAwXG4gICAgdGhpcy5jb250ZW50TGVuZ3RoID0gJydcbiAgICB0aGlzLmtlZXBBbGl2ZSA9ICcnXG4gICAgdGhpcy5jb25uZWN0aW9uID0gJydcblxuICAgIGFzc2VydCh0aGlzLmhlYWRlcnMubGVuZ3RoICUgMiA9PT0gMClcbiAgICB0aGlzLmhlYWRlcnMgPSBbXVxuICAgIHRoaXMuaGVhZGVyc1NpemUgPSAwXG5cbiAgICBpZiAoc3RhdHVzQ29kZSA8IDIwMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IHNob3VsZCBiZSBoYW5kbGVkIGJ5IGxsaHR0cD8gKi9cbiAgICBpZiAocmVxdWVzdC5tZXRob2QgIT09ICdIRUFEJyAmJiBjb250ZW50TGVuZ3RoICYmIGJ5dGVzUmVhZCAhPT0gcGFyc2VJbnQoY29udGVudExlbmd0aCwgMTApKSB7XG4gICAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgUmVzcG9uc2VDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcigpKVxuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuXG4gICAgcmVxdWVzdC5vbkNvbXBsZXRlKGhlYWRlcnMpXG5cbiAgICBjbGllbnRba1F1ZXVlXVtjbGllbnRba1J1bm5pbmdJZHhdKytdID0gbnVsbFxuXG4gICAgaWYgKHNvY2tldFtrV3JpdGluZ10pIHtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjbGllbnRba1J1bm5pbmddLCAwKVxuICAgICAgLy8gUmVzcG9uc2UgY29tcGxldGVkIGJlZm9yZSByZXF1ZXN0LlxuICAgICAgdXRpbC5kZXN0cm95KHNvY2tldCwgbmV3IEluZm9ybWF0aW9uYWxFcnJvcigncmVzZXQnKSlcbiAgICAgIHJldHVybiBjb25zdGFudHMuRVJST1IuUEFVU0VEXG4gICAgfSBlbHNlIGlmICghc2hvdWxkS2VlcEFsaXZlKSB7XG4gICAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgSW5mb3JtYXRpb25hbEVycm9yKCdyZXNldCcpKVxuICAgICAgcmV0dXJuIGNvbnN0YW50cy5FUlJPUi5QQVVTRURcbiAgICB9IGVsc2UgaWYgKHNvY2tldFtrUmVzZXRdICYmIGNsaWVudFtrUnVubmluZ10gPT09IDApIHtcbiAgICAgIC8vIERlc3Ryb3kgc29ja2V0IG9uY2UgYWxsIHJlcXVlc3RzIGhhdmUgY29tcGxldGVkLlxuICAgICAgLy8gVGhlIHJlcXVlc3QgYXQgdGhlIHRhaWwgb2YgdGhlIHBpcGVsaW5lIGlzIHRoZSBvbmVcbiAgICAgIC8vIHRoYXQgcmVxdWVzdGVkIHJlc2V0IGFuZCBubyBmdXJ0aGVyIHJlcXVlc3RzIHNob3VsZFxuICAgICAgLy8gaGF2ZSBiZWVuIHF1ZXVlZCBzaW5jZSB0aGVuLlxuICAgICAgdXRpbC5kZXN0cm95KHNvY2tldCwgbmV3IEluZm9ybWF0aW9uYWxFcnJvcigncmVzZXQnKSlcbiAgICAgIHJldHVybiBjb25zdGFudHMuRVJST1IuUEFVU0VEXG4gICAgfSBlbHNlIGlmIChjbGllbnRba1BpcGVsaW5pbmddID09PSAxKSB7XG4gICAgICAvLyBXZSBtdXN0IHdhaXQgYSBmdWxsIGV2ZW50IGxvb3AgY3ljbGUgdG8gcmV1c2UgdGhpcyBzb2NrZXQgdG8gbWFrZSBzdXJlXG4gICAgICAvLyB0aGF0IG5vbi1zcGVjIGNvbXBsaWFudCBzZXJ2ZXJzIGFyZSBub3QgY2xvc2luZyB0aGUgY29ubmVjdGlvbiBldmVuIGlmIHRoZXlcbiAgICAgIC8vIHNhaWQgdGhleSB3b24ndC5cbiAgICAgIHNldEltbWVkaWF0ZShyZXN1bWUsIGNsaWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdW1lKGNsaWVudClcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gb25QYXJzZXJUaW1lb3V0IChwYXJzZXIpIHtcbiAgY29uc3QgeyBzb2NrZXQsIHRpbWVvdXRUeXBlLCBjbGllbnQgfSA9IHBhcnNlclxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmICh0aW1lb3V0VHlwZSA9PT0gVElNRU9VVF9IRUFERVJTKSB7XG4gICAgaWYgKCFzb2NrZXRba1dyaXRpbmddIHx8IHNvY2tldC53cml0YWJsZU5lZWREcmFpbiB8fCBjbGllbnRba1J1bm5pbmddID4gMSkge1xuICAgICAgYXNzZXJ0KCFwYXJzZXIucGF1c2VkLCAnY2Fubm90IGJlIHBhdXNlZCB3aGlsZSB3YWl0aW5nIGZvciBoZWFkZXJzJylcbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIG5ldyBIZWFkZXJzVGltZW91dEVycm9yKCkpXG4gICAgfVxuICB9IGVsc2UgaWYgKHRpbWVvdXRUeXBlID09PSBUSU1FT1VUX0JPRFkpIHtcbiAgICBpZiAoIXBhcnNlci5wYXVzZWQpIHtcbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIG5ldyBCb2R5VGltZW91dEVycm9yKCkpXG4gICAgfVxuICB9IGVsc2UgaWYgKHRpbWVvdXRUeXBlID09PSBUSU1FT1VUX0lETEUpIHtcbiAgICBhc3NlcnQoY2xpZW50W2tSdW5uaW5nXSA9PT0gMCAmJiBjbGllbnRba0tlZXBBbGl2ZVRpbWVvdXRWYWx1ZV0pXG4gICAgdXRpbC5kZXN0cm95KHNvY2tldCwgbmV3IEluZm9ybWF0aW9uYWxFcnJvcignc29ja2V0IGlkbGUgdGltZW91dCcpKVxuICB9XG59XG5cbmZ1bmN0aW9uIG9uU29ja2V0UmVhZGFibGUgKCkge1xuICBjb25zdCB7IFtrUGFyc2VyXTogcGFyc2VyIH0gPSB0aGlzXG4gIGlmIChwYXJzZXIpIHtcbiAgICBwYXJzZXIucmVhZE1vcmUoKVxuICB9XG59XG5cbmZ1bmN0aW9uIG9uU29ja2V0RXJyb3IgKGVycikge1xuICBjb25zdCB7IFtrQ2xpZW50XTogY2xpZW50LCBba1BhcnNlcl06IHBhcnNlciB9ID0gdGhpc1xuXG4gIGFzc2VydChlcnIuY29kZSAhPT0gJ0VSUl9UTFNfQ0VSVF9BTFROQU1FX0lOVkFMSUQnKVxuXG4gIGlmIChjbGllbnRba0hUVFBDb25uVmVyc2lvbl0gIT09ICdoMicpIHtcbiAgICAvLyBPbiBNYWMgT1MsIHdlIGdldCBhbiBFQ09OTlJFU0VUIGV2ZW4gaWYgdGhlcmUgaXMgYSBmdWxsIGJvZHkgdG8gYmUgZm9yd2FyZGVkXG4gICAgLy8gdG8gdGhlIHVzZXIuXG4gICAgaWYgKGVyci5jb2RlID09PSAnRUNPTk5SRVNFVCcgJiYgcGFyc2VyLnN0YXR1c0NvZGUgJiYgIXBhcnNlci5zaG91bGRLZWVwQWxpdmUpIHtcbiAgICAgIC8vIFdlIHRyZWF0IGFsbCBpbmNvbWluZyBkYXRhIHNvIGZvciBhcyBhIHZhbGlkIHJlc3BvbnNlLlxuICAgICAgcGFyc2VyLm9uTWVzc2FnZUNvbXBsZXRlKClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfVxuXG4gIHRoaXNba0Vycm9yXSA9IGVyclxuXG4gIG9uRXJyb3IodGhpc1trQ2xpZW50XSwgZXJyKVxufVxuXG5mdW5jdGlvbiBvbkVycm9yIChjbGllbnQsIGVycikge1xuICBpZiAoXG4gICAgY2xpZW50W2tSdW5uaW5nXSA9PT0gMCAmJlxuICAgIGVyci5jb2RlICE9PSAnVU5EX0VSUl9JTkZPJyAmJlxuICAgIGVyci5jb2RlICE9PSAnVU5EX0VSUl9TT0NLRVQnXG4gICkge1xuICAgIC8vIEVycm9yIGlzIG5vdCBjYXVzZWQgYnkgcnVubmluZyByZXF1ZXN0IGFuZCBub3QgYSByZWNvdmVyYWJsZVxuICAgIC8vIHNvY2tldCBlcnJvci5cblxuICAgIGFzc2VydChjbGllbnRba1BlbmRpbmdJZHhdID09PSBjbGllbnRba1J1bm5pbmdJZHhdKVxuXG4gICAgY29uc3QgcmVxdWVzdHMgPSBjbGllbnRba1F1ZXVlXS5zcGxpY2UoY2xpZW50W2tSdW5uaW5nSWR4XSlcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcXVlc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gcmVxdWVzdHNbaV1cbiAgICAgIGVycm9yUmVxdWVzdChjbGllbnQsIHJlcXVlc3QsIGVycilcbiAgICB9XG4gICAgYXNzZXJ0KGNsaWVudFtrU2l6ZV0gPT09IDApXG4gIH1cbn1cblxuZnVuY3Rpb24gb25Tb2NrZXRFbmQgKCkge1xuICBjb25zdCB7IFtrUGFyc2VyXTogcGFyc2VyLCBba0NsaWVudF06IGNsaWVudCB9ID0gdGhpc1xuXG4gIGlmIChjbGllbnRba0hUVFBDb25uVmVyc2lvbl0gIT09ICdoMicpIHtcbiAgICBpZiAocGFyc2VyLnN0YXR1c0NvZGUgJiYgIXBhcnNlci5zaG91bGRLZWVwQWxpdmUpIHtcbiAgICAgIC8vIFdlIHRyZWF0IGFsbCBpbmNvbWluZyBkYXRhIHNvIGZhciBhcyBhIHZhbGlkIHJlc3BvbnNlLlxuICAgICAgcGFyc2VyLm9uTWVzc2FnZUNvbXBsZXRlKClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfVxuXG4gIHV0aWwuZGVzdHJveSh0aGlzLCBuZXcgU29ja2V0RXJyb3IoJ290aGVyIHNpZGUgY2xvc2VkJywgdXRpbC5nZXRTb2NrZXRJbmZvKHRoaXMpKSlcbn1cblxuZnVuY3Rpb24gb25Tb2NrZXRDbG9zZSAoKSB7XG4gIGNvbnN0IHsgW2tDbGllbnRdOiBjbGllbnQsIFtrUGFyc2VyXTogcGFyc2VyIH0gPSB0aGlzXG5cbiAgaWYgKGNsaWVudFtrSFRUUENvbm5WZXJzaW9uXSA9PT0gJ2gxJyAmJiBwYXJzZXIpIHtcbiAgICBpZiAoIXRoaXNba0Vycm9yXSAmJiBwYXJzZXIuc3RhdHVzQ29kZSAmJiAhcGFyc2VyLnNob3VsZEtlZXBBbGl2ZSkge1xuICAgICAgLy8gV2UgdHJlYXQgYWxsIGluY29taW5nIGRhdGEgc28gZmFyIGFzIGEgdmFsaWQgcmVzcG9uc2UuXG4gICAgICBwYXJzZXIub25NZXNzYWdlQ29tcGxldGUoKVxuICAgIH1cblxuICAgIHRoaXNba1BhcnNlcl0uZGVzdHJveSgpXG4gICAgdGhpc1trUGFyc2VyXSA9IG51bGxcbiAgfVxuXG4gIGNvbnN0IGVyciA9IHRoaXNba0Vycm9yXSB8fCBuZXcgU29ja2V0RXJyb3IoJ2Nsb3NlZCcsIHV0aWwuZ2V0U29ja2V0SW5mbyh0aGlzKSlcblxuICBjbGllbnRba1NvY2tldF0gPSBudWxsXG5cbiAgaWYgKGNsaWVudC5kZXN0cm95ZWQpIHtcbiAgICBhc3NlcnQoY2xpZW50W2tQZW5kaW5nXSA9PT0gMClcblxuICAgIC8vIEZhaWwgZW50aXJlIHF1ZXVlLlxuICAgIGNvbnN0IHJlcXVlc3RzID0gY2xpZW50W2tRdWV1ZV0uc3BsaWNlKGNsaWVudFtrUnVubmluZ0lkeF0pXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXF1ZXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHJlcXVlc3RzW2ldXG4gICAgICBlcnJvclJlcXVlc3QoY2xpZW50LCByZXF1ZXN0LCBlcnIpXG4gICAgfVxuICB9IGVsc2UgaWYgKGNsaWVudFtrUnVubmluZ10gPiAwICYmIGVyci5jb2RlICE9PSAnVU5EX0VSUl9JTkZPJykge1xuICAgIC8vIEZhaWwgaGVhZCBvZiBwaXBlbGluZS5cbiAgICBjb25zdCByZXF1ZXN0ID0gY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XV1cbiAgICBjbGllbnRba1F1ZXVlXVtjbGllbnRba1J1bm5pbmdJZHhdKytdID0gbnVsbFxuXG4gICAgZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgZXJyKVxuICB9XG5cbiAgY2xpZW50W2tQZW5kaW5nSWR4XSA9IGNsaWVudFtrUnVubmluZ0lkeF1cblxuICBhc3NlcnQoY2xpZW50W2tSdW5uaW5nXSA9PT0gMClcblxuICBjbGllbnQuZW1pdCgnZGlzY29ubmVjdCcsIGNsaWVudFtrVXJsXSwgW2NsaWVudF0sIGVycilcblxuICByZXN1bWUoY2xpZW50KVxufVxuXG5hc3luYyBmdW5jdGlvbiBjb25uZWN0IChjbGllbnQpIHtcbiAgYXNzZXJ0KCFjbGllbnRba0Nvbm5lY3RpbmddKVxuICBhc3NlcnQoIWNsaWVudFtrU29ja2V0XSlcblxuICBsZXQgeyBob3N0LCBob3N0bmFtZSwgcHJvdG9jb2wsIHBvcnQgfSA9IGNsaWVudFtrVXJsXVxuXG4gIC8vIFJlc29sdmUgaXB2NlxuICBpZiAoaG9zdG5hbWVbMF0gPT09ICdbJykge1xuICAgIGNvbnN0IGlkeCA9IGhvc3RuYW1lLmluZGV4T2YoJ10nKVxuXG4gICAgYXNzZXJ0KGlkeCAhPT0gLTEpXG4gICAgY29uc3QgaXAgPSBob3N0bmFtZS5zdWJzdHJpbmcoMSwgaWR4KVxuXG4gICAgYXNzZXJ0KG5ldC5pc0lQKGlwKSlcbiAgICBob3N0bmFtZSA9IGlwXG4gIH1cblxuICBjbGllbnRba0Nvbm5lY3RpbmddID0gdHJ1ZVxuXG4gIGlmIChjaGFubmVscy5iZWZvcmVDb25uZWN0Lmhhc1N1YnNjcmliZXJzKSB7XG4gICAgY2hhbm5lbHMuYmVmb3JlQ29ubmVjdC5wdWJsaXNoKHtcbiAgICAgIGNvbm5lY3RQYXJhbXM6IHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgaG9zdG5hbWUsXG4gICAgICAgIHByb3RvY29sLFxuICAgICAgICBwb3J0LFxuICAgICAgICBzZXJ2ZXJuYW1lOiBjbGllbnRba1NlcnZlck5hbWVdLFxuICAgICAgICBsb2NhbEFkZHJlc3M6IGNsaWVudFtrTG9jYWxBZGRyZXNzXVxuICAgICAgfSxcbiAgICAgIGNvbm5lY3RvcjogY2xpZW50W2tDb25uZWN0b3JdXG4gICAgfSlcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3Qgc29ja2V0ID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY2xpZW50W2tDb25uZWN0b3JdKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgaG9zdG5hbWUsXG4gICAgICAgIHByb3RvY29sLFxuICAgICAgICBwb3J0LFxuICAgICAgICBzZXJ2ZXJuYW1lOiBjbGllbnRba1NlcnZlck5hbWVdLFxuICAgICAgICBsb2NhbEFkZHJlc3M6IGNsaWVudFtrTG9jYWxBZGRyZXNzXVxuICAgICAgfSwgKGVyciwgc29ja2V0KSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoc29ja2V0KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpZiAoY2xpZW50LmRlc3Ryb3llZCkge1xuICAgICAgdXRpbC5kZXN0cm95KHNvY2tldC5vbignZXJyb3InLCAoKSA9PiB7fSksIG5ldyBDbGllbnREZXN0cm95ZWRFcnJvcigpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY2xpZW50W2tDb25uZWN0aW5nXSA9IGZhbHNlXG5cbiAgICBhc3NlcnQoc29ja2V0KVxuXG4gICAgY29uc3QgaXNIMiA9IHNvY2tldC5hbHBuUHJvdG9jb2wgPT09ICdoMidcbiAgICBpZiAoaXNIMikge1xuICAgICAgaWYgKCFoMkV4cGVyaW1lbnRhbFdhcm5lZCkge1xuICAgICAgICBoMkV4cGVyaW1lbnRhbFdhcm5lZCA9IHRydWVcbiAgICAgICAgcHJvY2Vzcy5lbWl0V2FybmluZygnSDIgc3VwcG9ydCBpcyBleHBlcmltZW50YWwsIGV4cGVjdCB0aGVtIHRvIGNoYW5nZSBhdCBhbnkgdGltZS4nLCB7XG4gICAgICAgICAgY29kZTogJ1VORElDSS1IMidcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGh0dHAyLmNvbm5lY3QoY2xpZW50W2tVcmxdLCB7XG4gICAgICAgIGNyZWF0ZUNvbm5lY3Rpb246ICgpID0+IHNvY2tldCxcbiAgICAgICAgcGVlck1heENvbmN1cnJlbnRTdHJlYW1zOiBjbGllbnRba0hUVFAyU2Vzc2lvblN0YXRlXS5tYXhDb25jdXJyZW50U3RyZWFtc1xuICAgICAgfSlcblxuICAgICAgY2xpZW50W2tIVFRQQ29ublZlcnNpb25dID0gJ2gyJ1xuICAgICAgc2Vzc2lvbltrQ2xpZW50XSA9IGNsaWVudFxuICAgICAgc2Vzc2lvbltrU29ja2V0XSA9IHNvY2tldFxuICAgICAgc2Vzc2lvbi5vbignZXJyb3InLCBvbkh0dHAyU2Vzc2lvbkVycm9yKVxuICAgICAgc2Vzc2lvbi5vbignZnJhbWVFcnJvcicsIG9uSHR0cDJGcmFtZUVycm9yKVxuICAgICAgc2Vzc2lvbi5vbignZW5kJywgb25IdHRwMlNlc3Npb25FbmQpXG4gICAgICBzZXNzaW9uLm9uKCdnb2F3YXknLCBvbkhUVFAyR29Bd2F5KVxuICAgICAgc2Vzc2lvbi5vbignY2xvc2UnLCBvblNvY2tldENsb3NlKVxuICAgICAgc2Vzc2lvbi51bnJlZigpXG5cbiAgICAgIGNsaWVudFtrSFRUUDJTZXNzaW9uXSA9IHNlc3Npb25cbiAgICAgIHNvY2tldFtrSFRUUDJTZXNzaW9uXSA9IHNlc3Npb25cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFsbGh0dHBJbnN0YW5jZSkge1xuICAgICAgICBsbGh0dHBJbnN0YW5jZSA9IGF3YWl0IGxsaHR0cFByb21pc2VcbiAgICAgICAgbGxodHRwUHJvbWlzZSA9IG51bGxcbiAgICAgIH1cblxuICAgICAgc29ja2V0W2tOb1JlZl0gPSBmYWxzZVxuICAgICAgc29ja2V0W2tXcml0aW5nXSA9IGZhbHNlXG4gICAgICBzb2NrZXRba1Jlc2V0XSA9IGZhbHNlXG4gICAgICBzb2NrZXRba0Jsb2NraW5nXSA9IGZhbHNlXG4gICAgICBzb2NrZXRba1BhcnNlcl0gPSBuZXcgUGFyc2VyKGNsaWVudCwgc29ja2V0LCBsbGh0dHBJbnN0YW5jZSlcbiAgICB9XG5cbiAgICBzb2NrZXRba0NvdW50ZXJdID0gMFxuICAgIHNvY2tldFtrTWF4UmVxdWVzdHNdID0gY2xpZW50W2tNYXhSZXF1ZXN0c11cbiAgICBzb2NrZXRba0NsaWVudF0gPSBjbGllbnRcbiAgICBzb2NrZXRba0Vycm9yXSA9IG51bGxcblxuICAgIHNvY2tldFxuICAgICAgLm9uKCdlcnJvcicsIG9uU29ja2V0RXJyb3IpXG4gICAgICAub24oJ3JlYWRhYmxlJywgb25Tb2NrZXRSZWFkYWJsZSlcbiAgICAgIC5vbignZW5kJywgb25Tb2NrZXRFbmQpXG4gICAgICAub24oJ2Nsb3NlJywgb25Tb2NrZXRDbG9zZSlcblxuICAgIGNsaWVudFtrU29ja2V0XSA9IHNvY2tldFxuXG4gICAgaWYgKGNoYW5uZWxzLmNvbm5lY3RlZC5oYXNTdWJzY3JpYmVycykge1xuICAgICAgY2hhbm5lbHMuY29ubmVjdGVkLnB1Ymxpc2goe1xuICAgICAgICBjb25uZWN0UGFyYW1zOiB7XG4gICAgICAgICAgaG9zdCxcbiAgICAgICAgICBob3N0bmFtZSxcbiAgICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgICBwb3J0LFxuICAgICAgICAgIHNlcnZlcm5hbWU6IGNsaWVudFtrU2VydmVyTmFtZV0sXG4gICAgICAgICAgbG9jYWxBZGRyZXNzOiBjbGllbnRba0xvY2FsQWRkcmVzc11cbiAgICAgICAgfSxcbiAgICAgICAgY29ubmVjdG9yOiBjbGllbnRba0Nvbm5lY3Rvcl0sXG4gICAgICAgIHNvY2tldFxuICAgICAgfSlcbiAgICB9XG4gICAgY2xpZW50LmVtaXQoJ2Nvbm5lY3QnLCBjbGllbnRba1VybF0sIFtjbGllbnRdKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoY2xpZW50LmRlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY2xpZW50W2tDb25uZWN0aW5nXSA9IGZhbHNlXG5cbiAgICBpZiAoY2hhbm5lbHMuY29ubmVjdEVycm9yLmhhc1N1YnNjcmliZXJzKSB7XG4gICAgICBjaGFubmVscy5jb25uZWN0RXJyb3IucHVibGlzaCh7XG4gICAgICAgIGNvbm5lY3RQYXJhbXM6IHtcbiAgICAgICAgICBob3N0LFxuICAgICAgICAgIGhvc3RuYW1lLFxuICAgICAgICAgIHByb3RvY29sLFxuICAgICAgICAgIHBvcnQsXG4gICAgICAgICAgc2VydmVybmFtZTogY2xpZW50W2tTZXJ2ZXJOYW1lXSxcbiAgICAgICAgICBsb2NhbEFkZHJlc3M6IGNsaWVudFtrTG9jYWxBZGRyZXNzXVxuICAgICAgICB9LFxuICAgICAgICBjb25uZWN0b3I6IGNsaWVudFtrQ29ubmVjdG9yXSxcbiAgICAgICAgZXJyb3I6IGVyclxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoZXJyLmNvZGUgPT09ICdFUlJfVExTX0NFUlRfQUxUTkFNRV9JTlZBTElEJykge1xuICAgICAgYXNzZXJ0KGNsaWVudFtrUnVubmluZ10gPT09IDApXG4gICAgICB3aGlsZSAoY2xpZW50W2tQZW5kaW5nXSA+IDAgJiYgY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tQZW5kaW5nSWR4XV0uc2VydmVybmFtZSA9PT0gY2xpZW50W2tTZXJ2ZXJOYW1lXSkge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tQZW5kaW5nSWR4XSsrXVxuICAgICAgICBlcnJvclJlcXVlc3QoY2xpZW50LCByZXF1ZXN0LCBlcnIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG9uRXJyb3IoY2xpZW50LCBlcnIpXG4gICAgfVxuXG4gICAgY2xpZW50LmVtaXQoJ2Nvbm5lY3Rpb25FcnJvcicsIGNsaWVudFtrVXJsXSwgW2NsaWVudF0sIGVycilcbiAgfVxuXG4gIHJlc3VtZShjbGllbnQpXG59XG5cbmZ1bmN0aW9uIGVtaXREcmFpbiAoY2xpZW50KSB7XG4gIGNsaWVudFtrTmVlZERyYWluXSA9IDBcbiAgY2xpZW50LmVtaXQoJ2RyYWluJywgY2xpZW50W2tVcmxdLCBbY2xpZW50XSlcbn1cblxuZnVuY3Rpb24gcmVzdW1lIChjbGllbnQsIHN5bmMpIHtcbiAgaWYgKGNsaWVudFtrUmVzdW1pbmddID09PSAyKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjbGllbnRba1Jlc3VtaW5nXSA9IDJcblxuICBfcmVzdW1lKGNsaWVudCwgc3luYylcbiAgY2xpZW50W2tSZXN1bWluZ10gPSAwXG5cbiAgaWYgKGNsaWVudFtrUnVubmluZ0lkeF0gPiAyNTYpIHtcbiAgICBjbGllbnRba1F1ZXVlXS5zcGxpY2UoMCwgY2xpZW50W2tSdW5uaW5nSWR4XSlcbiAgICBjbGllbnRba1BlbmRpbmdJZHhdIC09IGNsaWVudFtrUnVubmluZ0lkeF1cbiAgICBjbGllbnRba1J1bm5pbmdJZHhdID0gMFxuICB9XG59XG5cbmZ1bmN0aW9uIF9yZXN1bWUgKGNsaWVudCwgc3luYykge1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChjbGllbnQuZGVzdHJveWVkKSB7XG4gICAgICBhc3NlcnQoY2xpZW50W2tQZW5kaW5nXSA9PT0gMClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChjbGllbnRba0Nsb3NlZFJlc29sdmVdICYmICFjbGllbnRba1NpemVdKSB7XG4gICAgICBjbGllbnRba0Nsb3NlZFJlc29sdmVdKClcbiAgICAgIGNsaWVudFtrQ2xvc2VkUmVzb2x2ZV0gPSBudWxsXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzb2NrZXQgPSBjbGllbnRba1NvY2tldF1cblxuICAgIGlmIChzb2NrZXQgJiYgIXNvY2tldC5kZXN0cm95ZWQgJiYgc29ja2V0LmFscG5Qcm90b2NvbCAhPT0gJ2gyJykge1xuICAgICAgaWYgKGNsaWVudFtrU2l6ZV0gPT09IDApIHtcbiAgICAgICAgaWYgKCFzb2NrZXRba05vUmVmXSAmJiBzb2NrZXQudW5yZWYpIHtcbiAgICAgICAgICBzb2NrZXQudW5yZWYoKVxuICAgICAgICAgIHNvY2tldFtrTm9SZWZdID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNvY2tldFtrTm9SZWZdICYmIHNvY2tldC5yZWYpIHtcbiAgICAgICAgc29ja2V0LnJlZigpXG4gICAgICAgIHNvY2tldFtrTm9SZWZdID0gZmFsc2VcbiAgICAgIH1cblxuICAgICAgaWYgKGNsaWVudFtrU2l6ZV0gPT09IDApIHtcbiAgICAgICAgaWYgKHNvY2tldFtrUGFyc2VyXS50aW1lb3V0VHlwZSAhPT0gVElNRU9VVF9JRExFKSB7XG4gICAgICAgICAgc29ja2V0W2tQYXJzZXJdLnNldFRpbWVvdXQoY2xpZW50W2tLZWVwQWxpdmVUaW1lb3V0VmFsdWVdLCBUSU1FT1VUX0lETEUpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY2xpZW50W2tSdW5uaW5nXSA+IDAgJiYgc29ja2V0W2tQYXJzZXJdLnN0YXR1c0NvZGUgPCAyMDApIHtcbiAgICAgICAgaWYgKHNvY2tldFtrUGFyc2VyXS50aW1lb3V0VHlwZSAhPT0gVElNRU9VVF9IRUFERVJTKSB7XG4gICAgICAgICAgY29uc3QgcmVxdWVzdCA9IGNsaWVudFtrUXVldWVdW2NsaWVudFtrUnVubmluZ0lkeF1dXG4gICAgICAgICAgY29uc3QgaGVhZGVyc1RpbWVvdXQgPSByZXF1ZXN0LmhlYWRlcnNUaW1lb3V0ICE9IG51bGxcbiAgICAgICAgICAgID8gcmVxdWVzdC5oZWFkZXJzVGltZW91dFxuICAgICAgICAgICAgOiBjbGllbnRba0hlYWRlcnNUaW1lb3V0XVxuICAgICAgICAgIHNvY2tldFtrUGFyc2VyXS5zZXRUaW1lb3V0KGhlYWRlcnNUaW1lb3V0LCBUSU1FT1VUX0hFQURFUlMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2xpZW50W2tCdXN5XSkge1xuICAgICAgY2xpZW50W2tOZWVkRHJhaW5dID0gMlxuICAgIH0gZWxzZSBpZiAoY2xpZW50W2tOZWVkRHJhaW5dID09PSAyKSB7XG4gICAgICBpZiAoc3luYykge1xuICAgICAgICBjbGllbnRba05lZWREcmFpbl0gPSAxXG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdERyYWluLCBjbGllbnQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbWl0RHJhaW4oY2xpZW50KVxuICAgICAgfVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoY2xpZW50W2tQZW5kaW5nXSA9PT0gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGNsaWVudFtrUnVubmluZ10gPj0gKGNsaWVudFtrUGlwZWxpbmluZ10gfHwgMSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3QgPSBjbGllbnRba1F1ZXVlXVtjbGllbnRba1BlbmRpbmdJZHhdXVxuXG4gICAgaWYgKGNsaWVudFtrVXJsXS5wcm90b2NvbCA9PT0gJ2h0dHBzOicgJiYgY2xpZW50W2tTZXJ2ZXJOYW1lXSAhPT0gcmVxdWVzdC5zZXJ2ZXJuYW1lKSB7XG4gICAgICBpZiAoY2xpZW50W2tSdW5uaW5nXSA+IDApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNsaWVudFtrU2VydmVyTmFtZV0gPSByZXF1ZXN0LnNlcnZlcm5hbWVcblxuICAgICAgaWYgKHNvY2tldCAmJiBzb2NrZXQuc2VydmVybmFtZSAhPT0gcmVxdWVzdC5zZXJ2ZXJuYW1lKSB7XG4gICAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIG5ldyBJbmZvcm1hdGlvbmFsRXJyb3IoJ3NlcnZlcm5hbWUgY2hhbmdlZCcpKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2xpZW50W2tDb25uZWN0aW5nXSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFzb2NrZXQgJiYgIWNsaWVudFtrSFRUUDJTZXNzaW9uXSkge1xuICAgICAgY29ubmVjdChjbGllbnQpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoc29ja2V0LmRlc3Ryb3llZCB8fCBzb2NrZXRba1dyaXRpbmddIHx8IHNvY2tldFtrUmVzZXRdIHx8IHNvY2tldFtrQmxvY2tpbmddKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoY2xpZW50W2tSdW5uaW5nXSA+IDAgJiYgIXJlcXVlc3QuaWRlbXBvdGVudCkge1xuICAgICAgLy8gTm9uLWlkZW1wb3RlbnQgcmVxdWVzdCBjYW5ub3QgYmUgcmV0cmllZC5cbiAgICAgIC8vIEVuc3VyZSB0aGF0IG5vIG90aGVyIHJlcXVlc3RzIGFyZSBpbmZsaWdodCBhbmRcbiAgICAgIC8vIGNvdWxkIGNhdXNlIGZhaWx1cmUuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoY2xpZW50W2tSdW5uaW5nXSA+IDAgJiYgKHJlcXVlc3QudXBncmFkZSB8fCByZXF1ZXN0Lm1ldGhvZCA9PT0gJ0NPTk5FQ1QnKSkge1xuICAgICAgLy8gRG9uJ3QgZGlzcGF0Y2ggYW4gdXBncmFkZSB1bnRpbCBhbGwgcHJlY2VkaW5nIHJlcXVlc3RzIGhhdmUgY29tcGxldGVkLlxuICAgICAgLy8gQSBtaXNiZWhhdmluZyBzZXJ2ZXIgbWlnaHQgdXBncmFkZSB0aGUgY29ubmVjdGlvbiBiZWZvcmUgYWxsIHBpcGVsaW5lZFxuICAgICAgLy8gcmVxdWVzdCBoYXMgY29tcGxldGVkLlxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGNsaWVudFtrUnVubmluZ10gPiAwICYmIHV0aWwuYm9keUxlbmd0aChyZXF1ZXN0LmJvZHkpICE9PSAwICYmXG4gICAgICAodXRpbC5pc1N0cmVhbShyZXF1ZXN0LmJvZHkpIHx8IHV0aWwuaXNBc3luY0l0ZXJhYmxlKHJlcXVlc3QuYm9keSkpKSB7XG4gICAgICAvLyBSZXF1ZXN0IHdpdGggc3RyZWFtIG9yIGl0ZXJhdG9yIGJvZHkgY2FuIGVycm9yIHdoaWxlIG90aGVyIHJlcXVlc3RzXG4gICAgICAvLyBhcmUgaW5mbGlnaHQgYW5kIGluZGlyZWN0bHkgZXJyb3IgdGhvc2UgYXMgd2VsbC5cbiAgICAgIC8vIEVuc3VyZSB0aGlzIGRvZXNuJ3QgaGFwcGVuIGJ5IHdhaXRpbmcgZm9yIGluZmxpZ2h0XG4gICAgICAvLyB0byBjb21wbGV0ZSBiZWZvcmUgZGlzcGF0Y2hpbmcuXG5cbiAgICAgIC8vIFJlcXVlc3Qgd2l0aCBzdHJlYW0gb3IgaXRlcmF0b3IgYm9keSBjYW5ub3QgYmUgcmV0cmllZC5cbiAgICAgIC8vIEVuc3VyZSB0aGF0IG5vIG90aGVyIHJlcXVlc3RzIGFyZSBpbmZsaWdodCBhbmRcbiAgICAgIC8vIGNvdWxkIGNhdXNlIGZhaWx1cmUuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIXJlcXVlc3QuYWJvcnRlZCAmJiB3cml0ZShjbGllbnQsIHJlcXVlc3QpKSB7XG4gICAgICBjbGllbnRba1BlbmRpbmdJZHhdKytcbiAgICB9IGVsc2Uge1xuICAgICAgY2xpZW50W2tRdWV1ZV0uc3BsaWNlKGNsaWVudFtrUGVuZGluZ0lkeF0sIDEpXG4gICAgfVxuICB9XG59XG5cbi8vIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM3MjMwI3NlY3Rpb24tMy4zLjJcbmZ1bmN0aW9uIHNob3VsZFNlbmRDb250ZW50TGVuZ3RoIChtZXRob2QpIHtcbiAgcmV0dXJuIG1ldGhvZCAhPT0gJ0dFVCcgJiYgbWV0aG9kICE9PSAnSEVBRCcgJiYgbWV0aG9kICE9PSAnT1BUSU9OUycgJiYgbWV0aG9kICE9PSAnVFJBQ0UnICYmIG1ldGhvZCAhPT0gJ0NPTk5FQ1QnXG59XG5cbmZ1bmN0aW9uIHdyaXRlIChjbGllbnQsIHJlcXVlc3QpIHtcbiAgaWYgKGNsaWVudFtrSFRUUENvbm5WZXJzaW9uXSA9PT0gJ2gyJykge1xuICAgIHdyaXRlSDIoY2xpZW50LCBjbGllbnRba0hUVFAyU2Vzc2lvbl0sIHJlcXVlc3QpXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB7IGJvZHksIG1ldGhvZCwgcGF0aCwgaG9zdCwgdXBncmFkZSwgaGVhZGVycywgYmxvY2tpbmcsIHJlc2V0IH0gPSByZXF1ZXN0XG5cbiAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi00LjMuMVxuICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTQuMy4yXG4gIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNC4zLjVcblxuICAvLyBTZW5kaW5nIGEgcGF5bG9hZCBib2R5IG9uIGEgcmVxdWVzdCB0aGF0IGRvZXMgbm90XG4gIC8vIGV4cGVjdCBpdCBjYW4gY2F1c2UgdW5kZWZpbmVkIGJlaGF2aW9yIG9uIHNvbWVcbiAgLy8gc2VydmVycyBhbmQgY29ycnVwdCBjb25uZWN0aW9uIHN0YXRlLiBEbyBub3RcbiAgLy8gcmUtdXNlIHRoZSBjb25uZWN0aW9uIGZvciBmdXJ0aGVyIHJlcXVlc3RzLlxuXG4gIGNvbnN0IGV4cGVjdHNQYXlsb2FkID0gKFxuICAgIG1ldGhvZCA9PT0gJ1BVVCcgfHxcbiAgICBtZXRob2QgPT09ICdQT1NUJyB8fFxuICAgIG1ldGhvZCA9PT0gJ1BBVENIJ1xuICApXG5cbiAgaWYgKGJvZHkgJiYgdHlwZW9mIGJvZHkucmVhZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIFRyeSB0byByZWFkIEVPRiBpbiBvcmRlciB0byBnZXQgbGVuZ3RoLlxuICAgIGJvZHkucmVhZCgwKVxuICB9XG5cbiAgY29uc3QgYm9keUxlbmd0aCA9IHV0aWwuYm9keUxlbmd0aChib2R5KVxuXG4gIGxldCBjb250ZW50TGVuZ3RoID0gYm9keUxlbmd0aFxuXG4gIGlmIChjb250ZW50TGVuZ3RoID09PSBudWxsKSB7XG4gICAgY29udGVudExlbmd0aCA9IHJlcXVlc3QuY29udGVudExlbmd0aFxuICB9XG5cbiAgaWYgKGNvbnRlbnRMZW5ndGggPT09IDAgJiYgIWV4cGVjdHNQYXlsb2FkKSB7XG4gICAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzAjc2VjdGlvbi0zLjMuMlxuICAgIC8vIEEgdXNlciBhZ2VudCBTSE9VTEQgTk9UIHNlbmQgYSBDb250ZW50LUxlbmd0aCBoZWFkZXIgZmllbGQgd2hlblxuICAgIC8vIHRoZSByZXF1ZXN0IG1lc3NhZ2UgZG9lcyBub3QgY29udGFpbiBhIHBheWxvYWQgYm9keSBhbmQgdGhlIG1ldGhvZFxuICAgIC8vIHNlbWFudGljcyBkbyBub3QgYW50aWNpcGF0ZSBzdWNoIGEgYm9keS5cblxuICAgIGNvbnRlbnRMZW5ndGggPSBudWxsXG4gIH1cblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9pc3N1ZXMvMjA0NlxuICAvLyBBIHVzZXIgYWdlbnQgbWF5IHNlbmQgYSBDb250ZW50LUxlbmd0aCBoZWFkZXIgd2l0aCAwIHZhbHVlLCB0aGlzIHNob3VsZCBiZSBhbGxvd2VkLlxuICBpZiAoc2hvdWxkU2VuZENvbnRlbnRMZW5ndGgobWV0aG9kKSAmJiBjb250ZW50TGVuZ3RoID4gMCAmJiByZXF1ZXN0LmNvbnRlbnRMZW5ndGggIT09IG51bGwgJiYgcmVxdWVzdC5jb250ZW50TGVuZ3RoICE9PSBjb250ZW50TGVuZ3RoKSB7XG4gICAgaWYgKGNsaWVudFtrU3RyaWN0Q29udGVudExlbmd0aF0pIHtcbiAgICAgIGVycm9yUmVxdWVzdChjbGllbnQsIHJlcXVlc3QsIG5ldyBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IoKSlcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcobmV3IFJlcXVlc3RDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcigpKVxuICB9XG5cbiAgY29uc3Qgc29ja2V0ID0gY2xpZW50W2tTb2NrZXRdXG5cbiAgdHJ5IHtcbiAgICByZXF1ZXN0Lm9uQ29ubmVjdCgoZXJyKSA9PiB7XG4gICAgICBpZiAocmVxdWVzdC5hYm9ydGVkIHx8IHJlcXVlc3QuY29tcGxldGVkKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBlcnJvclJlcXVlc3QoY2xpZW50LCByZXF1ZXN0LCBlcnIgfHwgbmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoKSlcblxuICAgICAgdXRpbC5kZXN0cm95KHNvY2tldCwgbmV3IEluZm9ybWF0aW9uYWxFcnJvcignYWJvcnRlZCcpKVxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVycm9yUmVxdWVzdChjbGllbnQsIHJlcXVlc3QsIGVycilcbiAgfVxuXG4gIGlmIChyZXF1ZXN0LmFib3J0ZWQpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmIChtZXRob2QgPT09ICdIRUFEJykge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tY29sbGluYS91bmRpY2kvaXNzdWVzLzI1OFxuICAgIC8vIENsb3NlIGFmdGVyIGEgSEVBRCByZXF1ZXN0IHRvIGludGVyb3Agd2l0aCBtaXNiZWhhdmluZyBzZXJ2ZXJzXG4gICAgLy8gdGhhdCBtYXkgc2VuZCBhIGJvZHkgaW4gdGhlIHJlc3BvbnNlLlxuXG4gICAgc29ja2V0W2tSZXNldF0gPSB0cnVlXG4gIH1cblxuICBpZiAodXBncmFkZSB8fCBtZXRob2QgPT09ICdDT05ORUNUJykge1xuICAgIC8vIE9uIENPTk5FQ1Qgb3IgdXBncmFkZSwgYmxvY2sgcGlwZWxpbmUgZnJvbSBkaXNwYXRjaGluZyBmdXJ0aGVyXG4gICAgLy8gcmVxdWVzdHMgb24gdGhpcyBjb25uZWN0aW9uLlxuXG4gICAgc29ja2V0W2tSZXNldF0gPSB0cnVlXG4gIH1cblxuICBpZiAocmVzZXQgIT0gbnVsbCkge1xuICAgIHNvY2tldFtrUmVzZXRdID0gcmVzZXRcbiAgfVxuXG4gIGlmIChjbGllbnRba01heFJlcXVlc3RzXSAmJiBzb2NrZXRba0NvdW50ZXJdKysgPj0gY2xpZW50W2tNYXhSZXF1ZXN0c10pIHtcbiAgICBzb2NrZXRba1Jlc2V0XSA9IHRydWVcbiAgfVxuXG4gIGlmIChibG9ja2luZykge1xuICAgIHNvY2tldFtrQmxvY2tpbmddID0gdHJ1ZVxuICB9XG5cbiAgbGV0IGhlYWRlciA9IGAke21ldGhvZH0gJHtwYXRofSBIVFRQLzEuMVxcclxcbmBcblxuICBpZiAodHlwZW9mIGhvc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgaGVhZGVyICs9IGBob3N0OiAke2hvc3R9XFxyXFxuYFxuICB9IGVsc2Uge1xuICAgIGhlYWRlciArPSBjbGllbnRba0hvc3RIZWFkZXJdXG4gIH1cblxuICBpZiAodXBncmFkZSkge1xuICAgIGhlYWRlciArPSBgY29ubmVjdGlvbjogdXBncmFkZVxcclxcbnVwZ3JhZGU6ICR7dXBncmFkZX1cXHJcXG5gXG4gIH0gZWxzZSBpZiAoY2xpZW50W2tQaXBlbGluaW5nXSAmJiAhc29ja2V0W2tSZXNldF0pIHtcbiAgICBoZWFkZXIgKz0gJ2Nvbm5lY3Rpb246IGtlZXAtYWxpdmVcXHJcXG4nXG4gIH0gZWxzZSB7XG4gICAgaGVhZGVyICs9ICdjb25uZWN0aW9uOiBjbG9zZVxcclxcbidcbiAgfVxuXG4gIGlmIChoZWFkZXJzKSB7XG4gICAgaGVhZGVyICs9IGhlYWRlcnNcbiAgfVxuXG4gIGlmIChjaGFubmVscy5zZW5kSGVhZGVycy5oYXNTdWJzY3JpYmVycykge1xuICAgIGNoYW5uZWxzLnNlbmRIZWFkZXJzLnB1Ymxpc2goeyByZXF1ZXN0LCBoZWFkZXJzOiBoZWFkZXIsIHNvY2tldCB9KVxuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2U6IGFzc2VydGlvbiAqL1xuICBpZiAoIWJvZHkgfHwgYm9keUxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChjb250ZW50TGVuZ3RoID09PSAwKSB7XG4gICAgICBzb2NrZXQud3JpdGUoYCR7aGVhZGVyfWNvbnRlbnQtbGVuZ3RoOiAwXFxyXFxuXFxyXFxuYCwgJ2xhdGluMScpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChjb250ZW50TGVuZ3RoID09PSBudWxsLCAnbm8gYm9keSBtdXN0IG5vdCBoYXZlIGNvbnRlbnQgbGVuZ3RoJylcbiAgICAgIHNvY2tldC53cml0ZShgJHtoZWFkZXJ9XFxyXFxuYCwgJ2xhdGluMScpXG4gICAgfVxuICAgIHJlcXVlc3Qub25SZXF1ZXN0U2VudCgpXG4gIH0gZWxzZSBpZiAodXRpbC5pc0J1ZmZlcihib2R5KSkge1xuICAgIGFzc2VydChjb250ZW50TGVuZ3RoID09PSBib2R5LmJ5dGVMZW5ndGgsICdidWZmZXIgYm9keSBtdXN0IGhhdmUgY29udGVudCBsZW5ndGgnKVxuXG4gICAgc29ja2V0LmNvcmsoKVxuICAgIHNvY2tldC53cml0ZShgJHtoZWFkZXJ9Y29udGVudC1sZW5ndGg6ICR7Y29udGVudExlbmd0aH1cXHJcXG5cXHJcXG5gLCAnbGF0aW4xJylcbiAgICBzb2NrZXQud3JpdGUoYm9keSlcbiAgICBzb2NrZXQudW5jb3JrKClcbiAgICByZXF1ZXN0Lm9uQm9keVNlbnQoYm9keSlcbiAgICByZXF1ZXN0Lm9uUmVxdWVzdFNlbnQoKVxuICAgIGlmICghZXhwZWN0c1BheWxvYWQpIHtcbiAgICAgIHNvY2tldFtrUmVzZXRdID0gdHJ1ZVxuICAgIH1cbiAgfSBlbHNlIGlmICh1dGlsLmlzQmxvYkxpa2UoYm9keSkpIHtcbiAgICBpZiAodHlwZW9mIGJvZHkuc3RyZWFtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB3cml0ZUl0ZXJhYmxlKHsgYm9keTogYm9keS5zdHJlYW0oKSwgY2xpZW50LCByZXF1ZXN0LCBzb2NrZXQsIGNvbnRlbnRMZW5ndGgsIGhlYWRlciwgZXhwZWN0c1BheWxvYWQgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgd3JpdGVCbG9iKHsgYm9keSwgY2xpZW50LCByZXF1ZXN0LCBzb2NrZXQsIGNvbnRlbnRMZW5ndGgsIGhlYWRlciwgZXhwZWN0c1BheWxvYWQgfSlcbiAgICB9XG4gIH0gZWxzZSBpZiAodXRpbC5pc1N0cmVhbShib2R5KSkge1xuICAgIHdyaXRlU3RyZWFtKHsgYm9keSwgY2xpZW50LCByZXF1ZXN0LCBzb2NrZXQsIGNvbnRlbnRMZW5ndGgsIGhlYWRlciwgZXhwZWN0c1BheWxvYWQgfSlcbiAgfSBlbHNlIGlmICh1dGlsLmlzSXRlcmFibGUoYm9keSkpIHtcbiAgICB3cml0ZUl0ZXJhYmxlKHsgYm9keSwgY2xpZW50LCByZXF1ZXN0LCBzb2NrZXQsIGNvbnRlbnRMZW5ndGgsIGhlYWRlciwgZXhwZWN0c1BheWxvYWQgfSlcbiAgfSBlbHNlIHtcbiAgICBhc3NlcnQoZmFsc2UpXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG5mdW5jdGlvbiB3cml0ZUgyIChjbGllbnQsIHNlc3Npb24sIHJlcXVlc3QpIHtcbiAgY29uc3QgeyBib2R5LCBtZXRob2QsIHBhdGgsIGhvc3QsIHVwZ3JhZGUsIGV4cGVjdENvbnRpbnVlLCBzaWduYWwsIGhlYWRlcnM6IHJlcUhlYWRlcnMgfSA9IHJlcXVlc3RcblxuICBsZXQgaGVhZGVyc1xuICBpZiAodHlwZW9mIHJlcUhlYWRlcnMgPT09ICdzdHJpbmcnKSBoZWFkZXJzID0gUmVxdWVzdFtrSFRUUDJDb3B5SGVhZGVyc10ocmVxSGVhZGVycy50cmltKCkpXG4gIGVsc2UgaGVhZGVycyA9IHJlcUhlYWRlcnNcblxuICBpZiAodXBncmFkZSkge1xuICAgIGVycm9yUmVxdWVzdChjbGllbnQsIHJlcXVlc3QsIG5ldyBFcnJvcignVXBncmFkZSBub3Qgc3VwcG9ydGVkIGZvciBIMicpKVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBUT0RPKEhUVFAvMik6IFNob3VsZCB3ZSBjYWxsIG9uQ29ubmVjdCBpbW1lZGlhdGVseSBvciBvbiBzdHJlYW0gcmVhZHkgZXZlbnQ/XG4gICAgcmVxdWVzdC5vbkNvbm5lY3QoKGVycikgPT4ge1xuICAgICAgaWYgKHJlcXVlc3QuYWJvcnRlZCB8fCByZXF1ZXN0LmNvbXBsZXRlZCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgZXJyIHx8IG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKCkpXG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgZXJyKVxuICB9XG5cbiAgaWYgKHJlcXVlc3QuYWJvcnRlZCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqIEB0eXBlIHtpbXBvcnQoJ25vZGU6aHR0cDInKS5DbGllbnRIdHRwMlN0cmVhbX0gKi9cbiAgbGV0IHN0cmVhbVxuICBjb25zdCBoMlN0YXRlID0gY2xpZW50W2tIVFRQMlNlc3Npb25TdGF0ZV1cblxuICBoZWFkZXJzW0hUVFAyX0hFQURFUl9BVVRIT1JJVFldID0gaG9zdCB8fCBjbGllbnRba0hvc3RdXG4gIGhlYWRlcnNbSFRUUDJfSEVBREVSX01FVEhPRF0gPSBtZXRob2RcblxuICBpZiAobWV0aG9kID09PSAnQ09OTkVDVCcpIHtcbiAgICBzZXNzaW9uLnJlZigpXG4gICAgLy8gd2UgYXJlIGFscmVhZHkgY29ubmVjdGVkLCBzdHJlYW1zIGFyZSBwZW5kaW5nLCBmaXJzdCByZXF1ZXN0XG4gICAgLy8gd2lsbCBjcmVhdGUgYSBuZXcgc3RyZWFtLiBXZSB0cmlnZ2VyIGEgcmVxdWVzdCB0byBjcmVhdGUgdGhlIHN0cmVhbSBhbmQgd2FpdCB1bnRpbFxuICAgIC8vIGByZWFkeWAgZXZlbnQgaXMgdHJpZ2dlcmVkXG4gICAgLy8gV2UgZGlzYWJsZWQgZW5kU3RyZWFtIHRvIGFsbG93IHRoZSB1c2VyIHRvIHdyaXRlIHRvIHRoZSBzdHJlYW1cbiAgICBzdHJlYW0gPSBzZXNzaW9uLnJlcXVlc3QoaGVhZGVycywgeyBlbmRTdHJlYW06IGZhbHNlLCBzaWduYWwgfSlcblxuICAgIGlmIChzdHJlYW0uaWQgJiYgIXN0cmVhbS5wZW5kaW5nKSB7XG4gICAgICByZXF1ZXN0Lm9uVXBncmFkZShudWxsLCBudWxsLCBzdHJlYW0pXG4gICAgICArK2gyU3RhdGUub3BlblN0cmVhbXNcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyZWFtLm9uY2UoJ3JlYWR5JywgKCkgPT4ge1xuICAgICAgICByZXF1ZXN0Lm9uVXBncmFkZShudWxsLCBudWxsLCBzdHJlYW0pXG4gICAgICAgICsraDJTdGF0ZS5vcGVuU3RyZWFtc1xuICAgICAgfSlcbiAgICB9XG5cbiAgICBzdHJlYW0ub25jZSgnY2xvc2UnLCAoKSA9PiB7XG4gICAgICBoMlN0YXRlLm9wZW5TdHJlYW1zIC09IDFcbiAgICAgIC8vIFRPRE8oSFRUUC8yKTogdW5yZWYgb25seSBpZiBjdXJyZW50IHN0cmVhbXMgY291bnQgaXMgMFxuICAgICAgaWYgKGgyU3RhdGUub3BlblN0cmVhbXMgPT09IDApIHNlc3Npb24udW5yZWYoKVxuICAgIH0pXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc1NDAjc2VjdGlvbi04LjNcbiAgLy8gOnBhdGggYW5kIDpzY2hlbWUgaGVhZGVycyBtdXN0IGJlIG9taXRlZCB3aGVuIHNlbmRpbmcgQ09OTkVDVFxuXG4gIGhlYWRlcnNbSFRUUDJfSEVBREVSX1BBVEhdID0gcGF0aFxuICBoZWFkZXJzW0hUVFAyX0hFQURFUl9TQ0hFTUVdID0gJ2h0dHBzJ1xuXG4gIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNC4zLjFcbiAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi00LjMuMlxuICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTQuMy41XG5cbiAgLy8gU2VuZGluZyBhIHBheWxvYWQgYm9keSBvbiBhIHJlcXVlc3QgdGhhdCBkb2VzIG5vdFxuICAvLyBleHBlY3QgaXQgY2FuIGNhdXNlIHVuZGVmaW5lZCBiZWhhdmlvciBvbiBzb21lXG4gIC8vIHNlcnZlcnMgYW5kIGNvcnJ1cHQgY29ubmVjdGlvbiBzdGF0ZS4gRG8gbm90XG4gIC8vIHJlLXVzZSB0aGUgY29ubmVjdGlvbiBmb3IgZnVydGhlciByZXF1ZXN0cy5cblxuICBjb25zdCBleHBlY3RzUGF5bG9hZCA9IChcbiAgICBtZXRob2QgPT09ICdQVVQnIHx8XG4gICAgbWV0aG9kID09PSAnUE9TVCcgfHxcbiAgICBtZXRob2QgPT09ICdQQVRDSCdcbiAgKVxuXG4gIGlmIChib2R5ICYmIHR5cGVvZiBib2R5LnJlYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBUcnkgdG8gcmVhZCBFT0YgaW4gb3JkZXIgdG8gZ2V0IGxlbmd0aC5cbiAgICBib2R5LnJlYWQoMClcbiAgfVxuXG4gIGxldCBjb250ZW50TGVuZ3RoID0gdXRpbC5ib2R5TGVuZ3RoKGJvZHkpXG5cbiAgaWYgKGNvbnRlbnRMZW5ndGggPT0gbnVsbCkge1xuICAgIGNvbnRlbnRMZW5ndGggPSByZXF1ZXN0LmNvbnRlbnRMZW5ndGhcbiAgfVxuXG4gIGlmIChjb250ZW50TGVuZ3RoID09PSAwIHx8ICFleHBlY3RzUGF5bG9hZCkge1xuICAgIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMwI3NlY3Rpb24tMy4zLjJcbiAgICAvLyBBIHVzZXIgYWdlbnQgU0hPVUxEIE5PVCBzZW5kIGEgQ29udGVudC1MZW5ndGggaGVhZGVyIGZpZWxkIHdoZW5cbiAgICAvLyB0aGUgcmVxdWVzdCBtZXNzYWdlIGRvZXMgbm90IGNvbnRhaW4gYSBwYXlsb2FkIGJvZHkgYW5kIHRoZSBtZXRob2RcbiAgICAvLyBzZW1hbnRpY3MgZG8gbm90IGFudGljaXBhdGUgc3VjaCBhIGJvZHkuXG5cbiAgICBjb250ZW50TGVuZ3RoID0gbnVsbFxuICB9XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzIwNDZcbiAgLy8gQSB1c2VyIGFnZW50IG1heSBzZW5kIGEgQ29udGVudC1MZW5ndGggaGVhZGVyIHdpdGggMCB2YWx1ZSwgdGhpcyBzaG91bGQgYmUgYWxsb3dlZC5cbiAgaWYgKHNob3VsZFNlbmRDb250ZW50TGVuZ3RoKG1ldGhvZCkgJiYgY29udGVudExlbmd0aCA+IDAgJiYgcmVxdWVzdC5jb250ZW50TGVuZ3RoICE9IG51bGwgJiYgcmVxdWVzdC5jb250ZW50TGVuZ3RoICE9PSBjb250ZW50TGVuZ3RoKSB7XG4gICAgaWYgKGNsaWVudFtrU3RyaWN0Q29udGVudExlbmd0aF0pIHtcbiAgICAgIGVycm9yUmVxdWVzdChjbGllbnQsIHJlcXVlc3QsIG5ldyBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IoKSlcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcobmV3IFJlcXVlc3RDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcigpKVxuICB9XG5cbiAgaWYgKGNvbnRlbnRMZW5ndGggIT0gbnVsbCkge1xuICAgIGFzc2VydChib2R5LCAnbm8gYm9keSBtdXN0IG5vdCBoYXZlIGNvbnRlbnQgbGVuZ3RoJylcbiAgICBoZWFkZXJzW0hUVFAyX0hFQURFUl9DT05URU5UX0xFTkdUSF0gPSBgJHtjb250ZW50TGVuZ3RofWBcbiAgfVxuXG4gIHNlc3Npb24ucmVmKClcblxuICBjb25zdCBzaG91bGRFbmRTdHJlYW0gPSBtZXRob2QgPT09ICdHRVQnIHx8IG1ldGhvZCA9PT0gJ0hFQUQnXG4gIGlmIChleHBlY3RDb250aW51ZSkge1xuICAgIGhlYWRlcnNbSFRUUDJfSEVBREVSX0VYUEVDVF0gPSAnMTAwLWNvbnRpbnVlJ1xuICAgIHN0cmVhbSA9IHNlc3Npb24ucmVxdWVzdChoZWFkZXJzLCB7IGVuZFN0cmVhbTogc2hvdWxkRW5kU3RyZWFtLCBzaWduYWwgfSlcblxuICAgIHN0cmVhbS5vbmNlKCdjb250aW51ZScsIHdyaXRlQm9keUgyKVxuICB9IGVsc2Uge1xuICAgIHN0cmVhbSA9IHNlc3Npb24ucmVxdWVzdChoZWFkZXJzLCB7XG4gICAgICBlbmRTdHJlYW06IHNob3VsZEVuZFN0cmVhbSxcbiAgICAgIHNpZ25hbFxuICAgIH0pXG4gICAgd3JpdGVCb2R5SDIoKVxuICB9XG5cbiAgLy8gSW5jcmVtZW50IGNvdW50ZXIgYXMgd2UgaGF2ZSBuZXcgc2V2ZXJhbCBzdHJlYW1zIG9wZW5cbiAgKytoMlN0YXRlLm9wZW5TdHJlYW1zXG5cbiAgc3RyZWFtLm9uY2UoJ3Jlc3BvbnNlJywgaGVhZGVycyA9PiB7XG4gICAgY29uc3QgeyBbSFRUUDJfSEVBREVSX1NUQVRVU106IHN0YXR1c0NvZGUsIC4uLnJlYWxIZWFkZXJzIH0gPSBoZWFkZXJzXG5cbiAgICBpZiAocmVxdWVzdC5vbkhlYWRlcnMoTnVtYmVyKHN0YXR1c0NvZGUpLCByZWFsSGVhZGVycywgc3RyZWFtLnJlc3VtZS5iaW5kKHN0cmVhbSksICcnKSA9PT0gZmFsc2UpIHtcbiAgICAgIHN0cmVhbS5wYXVzZSgpXG4gICAgfVxuICB9KVxuXG4gIHN0cmVhbS5vbmNlKCdlbmQnLCAoKSA9PiB7XG4gICAgcmVxdWVzdC5vbkNvbXBsZXRlKFtdKVxuICB9KVxuXG4gIHN0cmVhbS5vbignZGF0YScsIChjaHVuaykgPT4ge1xuICAgIGlmIChyZXF1ZXN0Lm9uRGF0YShjaHVuaykgPT09IGZhbHNlKSB7XG4gICAgICBzdHJlYW0ucGF1c2UoKVxuICAgIH1cbiAgfSlcblxuICBzdHJlYW0ub25jZSgnY2xvc2UnLCAoKSA9PiB7XG4gICAgaDJTdGF0ZS5vcGVuU3RyZWFtcyAtPSAxXG4gICAgLy8gVE9ETyhIVFRQLzIpOiB1bnJlZiBvbmx5IGlmIGN1cnJlbnQgc3RyZWFtcyBjb3VudCBpcyAwXG4gICAgaWYgKGgyU3RhdGUub3BlblN0cmVhbXMgPT09IDApIHtcbiAgICAgIHNlc3Npb24udW5yZWYoKVxuICAgIH1cbiAgfSlcblxuICBzdHJlYW0ub25jZSgnZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGNsaWVudFtrSFRUUDJTZXNzaW9uXSAmJiAhY2xpZW50W2tIVFRQMlNlc3Npb25dLmRlc3Ryb3llZCAmJiAhdGhpcy5jbG9zZWQgJiYgIXRoaXMuZGVzdHJveWVkKSB7XG4gICAgICBoMlN0YXRlLnN0cmVhbXMgLT0gMVxuICAgICAgdXRpbC5kZXN0cm95KHN0cmVhbSwgZXJyKVxuICAgIH1cbiAgfSlcblxuICBzdHJlYW0ub25jZSgnZnJhbWVFcnJvcicsICh0eXBlLCBjb2RlKSA9PiB7XG4gICAgY29uc3QgZXJyID0gbmV3IEluZm9ybWF0aW9uYWxFcnJvcihgSFRUUC8yOiBcImZyYW1lRXJyb3JcIiByZWNlaXZlZCAtIHR5cGUgJHt0eXBlfSwgY29kZSAke2NvZGV9YClcbiAgICBlcnJvclJlcXVlc3QoY2xpZW50LCByZXF1ZXN0LCBlcnIpXG5cbiAgICBpZiAoY2xpZW50W2tIVFRQMlNlc3Npb25dICYmICFjbGllbnRba0hUVFAyU2Vzc2lvbl0uZGVzdHJveWVkICYmICF0aGlzLmNsb3NlZCAmJiAhdGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgIGgyU3RhdGUuc3RyZWFtcyAtPSAxXG4gICAgICB1dGlsLmRlc3Ryb3koc3RyZWFtLCBlcnIpXG4gICAgfVxuICB9KVxuXG4gIC8vIHN0cmVhbS5vbignYWJvcnRlZCcsICgpID0+IHtcbiAgLy8gICAvLyBUT0RPKEhUVFAvMik6IFN1cHBvcnQgYWJvcnRlZFxuICAvLyB9KVxuXG4gIC8vIHN0cmVhbS5vbigndGltZW91dCcsICgpID0+IHtcbiAgLy8gICAvLyBUT0RPKEhUVFAvMik6IFN1cHBvcnQgdGltZW91dFxuICAvLyB9KVxuXG4gIC8vIHN0cmVhbS5vbigncHVzaCcsIGhlYWRlcnMgPT4ge1xuICAvLyAgIC8vIFRPRE8oSFRUUC8yKTogU3VwcG9yIHB1c2hcbiAgLy8gfSlcblxuICAvLyBzdHJlYW0ub24oJ3RyYWlsZXJzJywgaGVhZGVycyA9PiB7XG4gIC8vICAgLy8gVE9ETyhIVFRQLzIpOiBTdXBwb3J0IHRyYWlsZXJzXG4gIC8vIH0pXG5cbiAgcmV0dXJuIHRydWVcblxuICBmdW5jdGlvbiB3cml0ZUJvZHlIMiAoKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2U6IGFzc2VydGlvbiAqL1xuICAgIGlmICghYm9keSkge1xuICAgICAgcmVxdWVzdC5vblJlcXVlc3RTZW50KClcbiAgICB9IGVsc2UgaWYgKHV0aWwuaXNCdWZmZXIoYm9keSkpIHtcbiAgICAgIGFzc2VydChjb250ZW50TGVuZ3RoID09PSBib2R5LmJ5dGVMZW5ndGgsICdidWZmZXIgYm9keSBtdXN0IGhhdmUgY29udGVudCBsZW5ndGgnKVxuICAgICAgc3RyZWFtLmNvcmsoKVxuICAgICAgc3RyZWFtLndyaXRlKGJvZHkpXG4gICAgICBzdHJlYW0udW5jb3JrKClcbiAgICAgIHN0cmVhbS5lbmQoKVxuICAgICAgcmVxdWVzdC5vbkJvZHlTZW50KGJvZHkpXG4gICAgICByZXF1ZXN0Lm9uUmVxdWVzdFNlbnQoKVxuICAgIH0gZWxzZSBpZiAodXRpbC5pc0Jsb2JMaWtlKGJvZHkpKSB7XG4gICAgICBpZiAodHlwZW9mIGJvZHkuc3RyZWFtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdyaXRlSXRlcmFibGUoe1xuICAgICAgICAgIGNsaWVudCxcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIGNvbnRlbnRMZW5ndGgsXG4gICAgICAgICAgaDJzdHJlYW06IHN0cmVhbSxcbiAgICAgICAgICBleHBlY3RzUGF5bG9hZCxcbiAgICAgICAgICBib2R5OiBib2R5LnN0cmVhbSgpLFxuICAgICAgICAgIHNvY2tldDogY2xpZW50W2tTb2NrZXRdLFxuICAgICAgICAgIGhlYWRlcjogJydcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdyaXRlQmxvYih7XG4gICAgICAgICAgYm9keSxcbiAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICBjb250ZW50TGVuZ3RoLFxuICAgICAgICAgIGV4cGVjdHNQYXlsb2FkLFxuICAgICAgICAgIGgyc3RyZWFtOiBzdHJlYW0sXG4gICAgICAgICAgaGVhZGVyOiAnJyxcbiAgICAgICAgICBzb2NrZXQ6IGNsaWVudFtrU29ja2V0XVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodXRpbC5pc1N0cmVhbShib2R5KSkge1xuICAgICAgd3JpdGVTdHJlYW0oe1xuICAgICAgICBib2R5LFxuICAgICAgICBjbGllbnQsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIGNvbnRlbnRMZW5ndGgsXG4gICAgICAgIGV4cGVjdHNQYXlsb2FkLFxuICAgICAgICBzb2NrZXQ6IGNsaWVudFtrU29ja2V0XSxcbiAgICAgICAgaDJzdHJlYW06IHN0cmVhbSxcbiAgICAgICAgaGVhZGVyOiAnJ1xuICAgICAgfSlcbiAgICB9IGVsc2UgaWYgKHV0aWwuaXNJdGVyYWJsZShib2R5KSkge1xuICAgICAgd3JpdGVJdGVyYWJsZSh7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGNsaWVudCxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgY29udGVudExlbmd0aCxcbiAgICAgICAgZXhwZWN0c1BheWxvYWQsXG4gICAgICAgIGhlYWRlcjogJycsXG4gICAgICAgIGgyc3RyZWFtOiBzdHJlYW0sXG4gICAgICAgIHNvY2tldDogY2xpZW50W2tTb2NrZXRdXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoZmFsc2UpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHdyaXRlU3RyZWFtICh7IGgyc3RyZWFtLCBib2R5LCBjbGllbnQsIHJlcXVlc3QsIHNvY2tldCwgY29udGVudExlbmd0aCwgaGVhZGVyLCBleHBlY3RzUGF5bG9hZCB9KSB7XG4gIGFzc2VydChjb250ZW50TGVuZ3RoICE9PSAwIHx8IGNsaWVudFtrUnVubmluZ10gPT09IDAsICdzdHJlYW0gYm9keSBjYW5ub3QgYmUgcGlwZWxpbmVkJylcblxuICBpZiAoY2xpZW50W2tIVFRQQ29ublZlcnNpb25dID09PSAnaDInKSB7XG4gICAgLy8gRm9yIEhUVFAvMiwgaXMgZW5vdWdoIHRvIHBpcGUgdGhlIHN0cmVhbVxuICAgIGNvbnN0IHBpcGUgPSBwaXBlbGluZShcbiAgICAgIGJvZHksXG4gICAgICBoMnN0cmVhbSxcbiAgICAgIChlcnIpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHV0aWwuZGVzdHJveShib2R5LCBlcnIpXG4gICAgICAgICAgdXRpbC5kZXN0cm95KGgyc3RyZWFtLCBlcnIpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVxdWVzdC5vblJlcXVlc3RTZW50KClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIClcblxuICAgIHBpcGUub24oJ2RhdGEnLCBvblBpcGVEYXRhKVxuICAgIHBpcGUub25jZSgnZW5kJywgKCkgPT4ge1xuICAgICAgcGlwZS5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uUGlwZURhdGEpXG4gICAgICB1dGlsLmRlc3Ryb3kocGlwZSlcbiAgICB9KVxuXG4gICAgZnVuY3Rpb24gb25QaXBlRGF0YSAoY2h1bmspIHtcbiAgICAgIHJlcXVlc3Qub25Cb2R5U2VudChjaHVuaylcbiAgICB9XG5cbiAgICByZXR1cm5cbiAgfVxuXG4gIGxldCBmaW5pc2hlZCA9IGZhbHNlXG5cbiAgY29uc3Qgd3JpdGVyID0gbmV3IEFzeW5jV3JpdGVyKHsgc29ja2V0LCByZXF1ZXN0LCBjb250ZW50TGVuZ3RoLCBjbGllbnQsIGV4cGVjdHNQYXlsb2FkLCBoZWFkZXIgfSlcblxuICBjb25zdCBvbkRhdGEgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICBpZiAoZmluaXNoZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBpZiAoIXdyaXRlci53cml0ZShjaHVuaykgJiYgdGhpcy5wYXVzZSkge1xuICAgICAgICB0aGlzLnBhdXNlKClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHV0aWwuZGVzdHJveSh0aGlzLCBlcnIpXG4gICAgfVxuICB9XG4gIGNvbnN0IG9uRHJhaW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGZpbmlzaGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoYm9keS5yZXN1bWUpIHtcbiAgICAgIGJvZHkucmVzdW1lKClcbiAgICB9XG4gIH1cbiAgY29uc3Qgb25BYm9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZmluaXNoZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBlcnIgPSBuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gb25GaW5pc2hlZChlcnIpKVxuICB9XG4gIGNvbnN0IG9uRmluaXNoZWQgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGZpbmlzaGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBmaW5pc2hlZCA9IHRydWVcblxuICAgIGFzc2VydChzb2NrZXQuZGVzdHJveWVkIHx8IChzb2NrZXRba1dyaXRpbmddICYmIGNsaWVudFtrUnVubmluZ10gPD0gMSkpXG5cbiAgICBzb2NrZXRcbiAgICAgIC5vZmYoJ2RyYWluJywgb25EcmFpbilcbiAgICAgIC5vZmYoJ2Vycm9yJywgb25GaW5pc2hlZClcblxuICAgIGJvZHlcbiAgICAgIC5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uRGF0YSlcbiAgICAgIC5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25GaW5pc2hlZClcbiAgICAgIC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbkZpbmlzaGVkKVxuICAgICAgLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uQWJvcnQpXG5cbiAgICBpZiAoIWVycikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgd3JpdGVyLmVuZCgpXG4gICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICBlcnIgPSBlclxuICAgICAgfVxuICAgIH1cblxuICAgIHdyaXRlci5kZXN0cm95KGVycilcblxuICAgIGlmIChlcnIgJiYgKGVyci5jb2RlICE9PSAnVU5EX0VSUl9JTkZPJyB8fCBlcnIubWVzc2FnZSAhPT0gJ3Jlc2V0JykpIHtcbiAgICAgIHV0aWwuZGVzdHJveShib2R5LCBlcnIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHV0aWwuZGVzdHJveShib2R5KVxuICAgIH1cbiAgfVxuXG4gIGJvZHlcbiAgICAub24oJ2RhdGEnLCBvbkRhdGEpXG4gICAgLm9uKCdlbmQnLCBvbkZpbmlzaGVkKVxuICAgIC5vbignZXJyb3InLCBvbkZpbmlzaGVkKVxuICAgIC5vbignY2xvc2UnLCBvbkFib3J0KVxuXG4gIGlmIChib2R5LnJlc3VtZSkge1xuICAgIGJvZHkucmVzdW1lKClcbiAgfVxuXG4gIHNvY2tldFxuICAgIC5vbignZHJhaW4nLCBvbkRyYWluKVxuICAgIC5vbignZXJyb3InLCBvbkZpbmlzaGVkKVxufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUJsb2IgKHsgaDJzdHJlYW0sIGJvZHksIGNsaWVudCwgcmVxdWVzdCwgc29ja2V0LCBjb250ZW50TGVuZ3RoLCBoZWFkZXIsIGV4cGVjdHNQYXlsb2FkIH0pIHtcbiAgYXNzZXJ0KGNvbnRlbnRMZW5ndGggPT09IGJvZHkuc2l6ZSwgJ2Jsb2IgYm9keSBtdXN0IGhhdmUgY29udGVudCBsZW5ndGgnKVxuXG4gIGNvbnN0IGlzSDIgPSBjbGllbnRba0hUVFBDb25uVmVyc2lvbl0gPT09ICdoMidcbiAgdHJ5IHtcbiAgICBpZiAoY29udGVudExlbmd0aCAhPSBudWxsICYmIGNvbnRlbnRMZW5ndGggIT09IGJvZHkuc2l6ZSkge1xuICAgICAgdGhyb3cgbmV3IFJlcXVlc3RDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcigpXG4gICAgfVxuXG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oYXdhaXQgYm9keS5hcnJheUJ1ZmZlcigpKVxuXG4gICAgaWYgKGlzSDIpIHtcbiAgICAgIGgyc3RyZWFtLmNvcmsoKVxuICAgICAgaDJzdHJlYW0ud3JpdGUoYnVmZmVyKVxuICAgICAgaDJzdHJlYW0udW5jb3JrKClcbiAgICB9IGVsc2Uge1xuICAgICAgc29ja2V0LmNvcmsoKVxuICAgICAgc29ja2V0LndyaXRlKGAke2hlYWRlcn1jb250ZW50LWxlbmd0aDogJHtjb250ZW50TGVuZ3RofVxcclxcblxcclxcbmAsICdsYXRpbjEnKVxuICAgICAgc29ja2V0LndyaXRlKGJ1ZmZlcilcbiAgICAgIHNvY2tldC51bmNvcmsoKVxuICAgIH1cblxuICAgIHJlcXVlc3Qub25Cb2R5U2VudChidWZmZXIpXG4gICAgcmVxdWVzdC5vblJlcXVlc3RTZW50KClcblxuICAgIGlmICghZXhwZWN0c1BheWxvYWQpIHtcbiAgICAgIHNvY2tldFtrUmVzZXRdID0gdHJ1ZVxuICAgIH1cblxuICAgIHJlc3VtZShjbGllbnQpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHV0aWwuZGVzdHJveShpc0gyID8gaDJzdHJlYW0gOiBzb2NrZXQsIGVycilcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUl0ZXJhYmxlICh7IGgyc3RyZWFtLCBib2R5LCBjbGllbnQsIHJlcXVlc3QsIHNvY2tldCwgY29udGVudExlbmd0aCwgaGVhZGVyLCBleHBlY3RzUGF5bG9hZCB9KSB7XG4gIGFzc2VydChjb250ZW50TGVuZ3RoICE9PSAwIHx8IGNsaWVudFtrUnVubmluZ10gPT09IDAsICdpdGVyYXRvciBib2R5IGNhbm5vdCBiZSBwaXBlbGluZWQnKVxuXG4gIGxldCBjYWxsYmFjayA9IG51bGxcbiAgZnVuY3Rpb24gb25EcmFpbiAoKSB7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBjb25zdCBjYiA9IGNhbGxiYWNrXG4gICAgICBjYWxsYmFjayA9IG51bGxcbiAgICAgIGNiKClcbiAgICB9XG4gIH1cblxuICBjb25zdCB3YWl0Rm9yRHJhaW4gPSAoKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgYXNzZXJ0KGNhbGxiYWNrID09PSBudWxsKVxuXG4gICAgaWYgKHNvY2tldFtrRXJyb3JdKSB7XG4gICAgICByZWplY3Qoc29ja2V0W2tFcnJvcl0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrID0gcmVzb2x2ZVxuICAgIH1cbiAgfSlcblxuICBpZiAoY2xpZW50W2tIVFRQQ29ublZlcnNpb25dID09PSAnaDInKSB7XG4gICAgaDJzdHJlYW1cbiAgICAgIC5vbignY2xvc2UnLCBvbkRyYWluKVxuICAgICAgLm9uKCdkcmFpbicsIG9uRHJhaW4pXG5cbiAgICB0cnkge1xuICAgICAgLy8gSXQncyB1cCB0byB0aGUgdXNlciB0byBzb21laG93IGFib3J0IHRoZSBhc3luYyBpdGVyYWJsZS5cbiAgICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgYm9keSkge1xuICAgICAgICBpZiAoc29ja2V0W2tFcnJvcl0pIHtcbiAgICAgICAgICB0aHJvdyBzb2NrZXRba0Vycm9yXVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzID0gaDJzdHJlYW0ud3JpdGUoY2h1bmspXG4gICAgICAgIHJlcXVlc3Qub25Cb2R5U2VudChjaHVuaylcbiAgICAgICAgaWYgKCFyZXMpIHtcbiAgICAgICAgICBhd2FpdCB3YWl0Rm9yRHJhaW4oKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBoMnN0cmVhbS5kZXN0cm95KGVycilcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcmVxdWVzdC5vblJlcXVlc3RTZW50KClcbiAgICAgIGgyc3RyZWFtLmVuZCgpXG4gICAgICBoMnN0cmVhbVxuICAgICAgICAub2ZmKCdjbG9zZScsIG9uRHJhaW4pXG4gICAgICAgIC5vZmYoJ2RyYWluJywgb25EcmFpbilcbiAgICB9XG5cbiAgICByZXR1cm5cbiAgfVxuXG4gIHNvY2tldFxuICAgIC5vbignY2xvc2UnLCBvbkRyYWluKVxuICAgIC5vbignZHJhaW4nLCBvbkRyYWluKVxuXG4gIGNvbnN0IHdyaXRlciA9IG5ldyBBc3luY1dyaXRlcih7IHNvY2tldCwgcmVxdWVzdCwgY29udGVudExlbmd0aCwgY2xpZW50LCBleHBlY3RzUGF5bG9hZCwgaGVhZGVyIH0pXG4gIHRyeSB7XG4gICAgLy8gSXQncyB1cCB0byB0aGUgdXNlciB0byBzb21laG93IGFib3J0IHRoZSBhc3luYyBpdGVyYWJsZS5cbiAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIGJvZHkpIHtcbiAgICAgIGlmIChzb2NrZXRba0Vycm9yXSkge1xuICAgICAgICB0aHJvdyBzb2NrZXRba0Vycm9yXVxuICAgICAgfVxuXG4gICAgICBpZiAoIXdyaXRlci53cml0ZShjaHVuaykpIHtcbiAgICAgICAgYXdhaXQgd2FpdEZvckRyYWluKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3cml0ZXIuZW5kKClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgd3JpdGVyLmRlc3Ryb3koZXJyKVxuICB9IGZpbmFsbHkge1xuICAgIHNvY2tldFxuICAgICAgLm9mZignY2xvc2UnLCBvbkRyYWluKVxuICAgICAgLm9mZignZHJhaW4nLCBvbkRyYWluKVxuICB9XG59XG5cbmNsYXNzIEFzeW5jV3JpdGVyIHtcbiAgY29uc3RydWN0b3IgKHsgc29ja2V0LCByZXF1ZXN0LCBjb250ZW50TGVuZ3RoLCBjbGllbnQsIGV4cGVjdHNQYXlsb2FkLCBoZWFkZXIgfSkge1xuICAgIHRoaXMuc29ja2V0ID0gc29ja2V0XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdFxuICAgIHRoaXMuY29udGVudExlbmd0aCA9IGNvbnRlbnRMZW5ndGhcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudFxuICAgIHRoaXMuYnl0ZXNXcml0dGVuID0gMFxuICAgIHRoaXMuZXhwZWN0c1BheWxvYWQgPSBleHBlY3RzUGF5bG9hZFxuICAgIHRoaXMuaGVhZGVyID0gaGVhZGVyXG5cbiAgICBzb2NrZXRba1dyaXRpbmddID0gdHJ1ZVxuICB9XG5cbiAgd3JpdGUgKGNodW5rKSB7XG4gICAgY29uc3QgeyBzb2NrZXQsIHJlcXVlc3QsIGNvbnRlbnRMZW5ndGgsIGNsaWVudCwgYnl0ZXNXcml0dGVuLCBleHBlY3RzUGF5bG9hZCwgaGVhZGVyIH0gPSB0aGlzXG5cbiAgICBpZiAoc29ja2V0W2tFcnJvcl0pIHtcbiAgICAgIHRocm93IHNvY2tldFtrRXJyb3JdXG4gICAgfVxuXG4gICAgaWYgKHNvY2tldC5kZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGNvbnN0IGxlbiA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGNodW5rKVxuICAgIGlmICghbGVuKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIC8vIFdlIHNob3VsZCBkZWZlciB3cml0aW5nIGNodW5rcy5cbiAgICBpZiAoY29udGVudExlbmd0aCAhPT0gbnVsbCAmJiBieXRlc1dyaXR0ZW4gKyBsZW4gPiBjb250ZW50TGVuZ3RoKSB7XG4gICAgICBpZiAoY2xpZW50W2tTdHJpY3RDb250ZW50TGVuZ3RoXSkge1xuICAgICAgICB0aHJvdyBuZXcgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yKClcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5lbWl0V2FybmluZyhuZXcgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yKCkpXG4gICAgfVxuXG4gICAgc29ja2V0LmNvcmsoKVxuXG4gICAgaWYgKGJ5dGVzV3JpdHRlbiA9PT0gMCkge1xuICAgICAgaWYgKCFleHBlY3RzUGF5bG9hZCkge1xuICAgICAgICBzb2NrZXRba1Jlc2V0XSA9IHRydWVcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbnRlbnRMZW5ndGggPT09IG51bGwpIHtcbiAgICAgICAgc29ja2V0LndyaXRlKGAke2hlYWRlcn10cmFuc2Zlci1lbmNvZGluZzogY2h1bmtlZFxcclxcbmAsICdsYXRpbjEnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc29ja2V0LndyaXRlKGAke2hlYWRlcn1jb250ZW50LWxlbmd0aDogJHtjb250ZW50TGVuZ3RofVxcclxcblxcclxcbmAsICdsYXRpbjEnKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb250ZW50TGVuZ3RoID09PSBudWxsKSB7XG4gICAgICBzb2NrZXQud3JpdGUoYFxcclxcbiR7bGVuLnRvU3RyaW5nKDE2KX1cXHJcXG5gLCAnbGF0aW4xJylcbiAgICB9XG5cbiAgICB0aGlzLmJ5dGVzV3JpdHRlbiArPSBsZW5cblxuICAgIGNvbnN0IHJldCA9IHNvY2tldC53cml0ZShjaHVuaylcblxuICAgIHNvY2tldC51bmNvcmsoKVxuXG4gICAgcmVxdWVzdC5vbkJvZHlTZW50KGNodW5rKVxuXG4gICAgaWYgKCFyZXQpIHtcbiAgICAgIGlmIChzb2NrZXRba1BhcnNlcl0udGltZW91dCAmJiBzb2NrZXRba1BhcnNlcl0udGltZW91dFR5cGUgPT09IFRJTUVPVVRfSEVBREVSUykge1xuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZTogb25seSBmb3IgamVzdFxuICAgICAgICBpZiAoc29ja2V0W2tQYXJzZXJdLnRpbWVvdXQucmVmcmVzaCkge1xuICAgICAgICAgIHNvY2tldFtrUGFyc2VyXS50aW1lb3V0LnJlZnJlc2goKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldFxuICB9XG5cbiAgZW5kICgpIHtcbiAgICBjb25zdCB7IHNvY2tldCwgY29udGVudExlbmd0aCwgY2xpZW50LCBieXRlc1dyaXR0ZW4sIGV4cGVjdHNQYXlsb2FkLCBoZWFkZXIsIHJlcXVlc3QgfSA9IHRoaXNcbiAgICByZXF1ZXN0Lm9uUmVxdWVzdFNlbnQoKVxuXG4gICAgc29ja2V0W2tXcml0aW5nXSA9IGZhbHNlXG5cbiAgICBpZiAoc29ja2V0W2tFcnJvcl0pIHtcbiAgICAgIHRocm93IHNvY2tldFtrRXJyb3JdXG4gICAgfVxuXG4gICAgaWYgKHNvY2tldC5kZXN0cm95ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChieXRlc1dyaXR0ZW4gPT09IDApIHtcbiAgICAgIGlmIChleHBlY3RzUGF5bG9hZCkge1xuICAgICAgICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMy4yXG4gICAgICAgIC8vIEEgdXNlciBhZ2VudCBTSE9VTEQgc2VuZCBhIENvbnRlbnQtTGVuZ3RoIGluIGEgcmVxdWVzdCBtZXNzYWdlIHdoZW5cbiAgICAgICAgLy8gbm8gVHJhbnNmZXItRW5jb2RpbmcgaXMgc2VudCBhbmQgdGhlIHJlcXVlc3QgbWV0aG9kIGRlZmluZXMgYSBtZWFuaW5nXG4gICAgICAgIC8vIGZvciBhbiBlbmNsb3NlZCBwYXlsb2FkIGJvZHkuXG5cbiAgICAgICAgc29ja2V0LndyaXRlKGAke2hlYWRlcn1jb250ZW50LWxlbmd0aDogMFxcclxcblxcclxcbmAsICdsYXRpbjEnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc29ja2V0LndyaXRlKGAke2hlYWRlcn1cXHJcXG5gLCAnbGF0aW4xJylcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbnRlbnRMZW5ndGggPT09IG51bGwpIHtcbiAgICAgIHNvY2tldC53cml0ZSgnXFxyXFxuMFxcclxcblxcclxcbicsICdsYXRpbjEnKVxuICAgIH1cblxuICAgIGlmIChjb250ZW50TGVuZ3RoICE9PSBudWxsICYmIGJ5dGVzV3JpdHRlbiAhPT0gY29udGVudExlbmd0aCkge1xuICAgICAgaWYgKGNsaWVudFtrU3RyaWN0Q29udGVudExlbmd0aF0pIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlcXVlc3RDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcigpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKG5ldyBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IoKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc29ja2V0W2tQYXJzZXJdLnRpbWVvdXQgJiYgc29ja2V0W2tQYXJzZXJdLnRpbWVvdXRUeXBlID09PSBUSU1FT1VUX0hFQURFUlMpIHtcbiAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBvbmx5IGZvciBqZXN0XG4gICAgICBpZiAoc29ja2V0W2tQYXJzZXJdLnRpbWVvdXQucmVmcmVzaCkge1xuICAgICAgICBzb2NrZXRba1BhcnNlcl0udGltZW91dC5yZWZyZXNoKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXN1bWUoY2xpZW50KVxuICB9XG5cbiAgZGVzdHJveSAoZXJyKSB7XG4gICAgY29uc3QgeyBzb2NrZXQsIGNsaWVudCB9ID0gdGhpc1xuXG4gICAgc29ja2V0W2tXcml0aW5nXSA9IGZhbHNlXG5cbiAgICBpZiAoZXJyKSB7XG4gICAgICBhc3NlcnQoY2xpZW50W2tSdW5uaW5nXSA8PSAxLCAncGlwZWxpbmUgc2hvdWxkIG9ubHkgY29udGFpbiB0aGlzIHJlcXVlc3QnKVxuICAgICAgdXRpbC5kZXN0cm95KHNvY2tldCwgZXJyKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBlcnJvclJlcXVlc3QgKGNsaWVudCwgcmVxdWVzdCwgZXJyKSB7XG4gIHRyeSB7XG4gICAgcmVxdWVzdC5vbkVycm9yKGVycilcbiAgICBhc3NlcnQocmVxdWVzdC5hYm9ydGVkKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjbGllbnQuZW1pdCgnZXJyb3InLCBlcnIpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBDbGllbnRcbiIsIi8qIGVzbGludC1kaXNhYmxlICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vLyBFeHRyYWN0ZWQgZnJvbSBub2RlL2xpYi9pbnRlcm5hbC9maXhlZF9xdWV1ZS5qc1xuXG4vLyBDdXJyZW50bHkgb3B0aW1hbCBxdWV1ZSBzaXplLCB0ZXN0ZWQgb24gVjggNi4wIC0gNi42LiBNdXN0IGJlIHBvd2VyIG9mIHR3by5cbmNvbnN0IGtTaXplID0gMjA0ODtcbmNvbnN0IGtNYXNrID0ga1NpemUgLSAxO1xuXG4vLyBUaGUgRml4ZWRRdWV1ZSBpcyBpbXBsZW1lbnRlZCBhcyBhIHNpbmdseS1saW5rZWQgbGlzdCBvZiBmaXhlZC1zaXplXG4vLyBjaXJjdWxhciBidWZmZXJzLiBJdCBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzOlxuLy9cbi8vICBoZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhaWxcbi8vICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuLy8gICAgdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2XG4vLyArLS0tLS0tLS0tLS0rIDwtLS0tLVxcICAgICAgICstLS0tLS0tLS0tLSsgPC0tLS0tLVxcICAgICAgICAgKy0tLS0tLS0tLS0tK1xuLy8gfCAgW251bGxdICAgfCAgICAgICAgXFwtLS0tLSB8ICAgbmV4dCAgICB8ICAgICAgICAgXFwtLS0tLS0tIHwgICBuZXh0ICAgIHxcbi8vICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tK1xuLy8gfCAgIGl0ZW0gICAgfCA8LS0gYm90dG9tICAgIHwgICBpdGVtICAgIHwgPC0tIGJvdHRvbSAgICAgICB8ICBbZW1wdHldICB8XG4vLyB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfCAgICAgICAgICAgICAgICAgIHwgIFtlbXB0eV0gIHxcbi8vIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgICAgfCAgW2VtcHR5XSAgfFxuLy8gfCAgIGl0ZW0gICAgfCAgICAgICAgICAgICAgIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICAgICB8ICBbZW1wdHldICB8XG4vLyB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfCAgICAgICBib3R0b20gLS0+IHwgICBpdGVtICAgIHxcbi8vIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfFxuLy8gfCAgICAuLi4gICAgfCAgICAgICAgICAgICAgIHwgICAgLi4uICAgIHwgICAgICAgICAgICAgICAgICB8ICAgIC4uLiAgICB8XG4vLyB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfCAgICAgICAgICAgICAgICAgIHwgICBpdGVtICAgIHxcbi8vIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfFxuLy8gfCAgW2VtcHR5XSAgfCA8LS0gdG9wICAgICAgIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8XG4vLyB8ICBbZW1wdHldICB8ICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfCAgICAgICAgICAgICAgICAgIHwgICBpdGVtICAgIHxcbi8vIHwgIFtlbXB0eV0gIHwgICAgICAgICAgICAgICB8ICBbZW1wdHldICB8IDwtLSB0b3AgIHRvcCAtLT4gfCAgW2VtcHR5XSAgfFxuLy8gKy0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rXG4vL1xuLy8gT3IsIGlmIHRoZXJlIGlzIG9ubHkgb25lIGNpcmN1bGFyIGJ1ZmZlciwgaXQgbG9va3Mgc29tZXRoaW5nXG4vLyBsaWtlIGVpdGhlciBvZiB0aGVzZTpcbi8vXG4vLyAgaGVhZCAgIHRhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkICAgdGFpbFxuLy8gICAgfCAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8XG4vLyAgICB2ICAgICB2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgICAgIHZcbi8vICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tK1xuLy8gfCAgW251bGxdICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBbbnVsbF0gICB8XG4vLyArLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLStcbi8vIHwgIFtlbXB0eV0gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfFxuLy8gfCAgW2VtcHR5XSAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8XG4vLyB8ICAgaXRlbSAgICB8IDwtLSBib3R0b20gICAgICAgICAgICB0b3AgLS0+IHwgIFtlbXB0eV0gIHxcbi8vIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgW2VtcHR5XSAgfFxuLy8gfCAgW2VtcHR5XSAgfCA8LS0gdG9wICAgICAgICAgICAgYm90dG9tIC0tPiB8ICAgaXRlbSAgICB8XG4vLyB8ICBbZW1wdHldICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBpdGVtICAgIHxcbi8vICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tK1xuLy9cbi8vIEFkZGluZyBhIHZhbHVlIG1lYW5zIG1vdmluZyBgdG9wYCBmb3J3YXJkIGJ5IG9uZSwgcmVtb3ZpbmcgbWVhbnNcbi8vIG1vdmluZyBgYm90dG9tYCBmb3J3YXJkIGJ5IG9uZS4gQWZ0ZXIgcmVhY2hpbmcgdGhlIGVuZCwgdGhlIHF1ZXVlXG4vLyB3cmFwcyBhcm91bmQuXG4vL1xuLy8gV2hlbiBgdG9wID09PSBib3R0b21gIHRoZSBjdXJyZW50IHF1ZXVlIGlzIGVtcHR5IGFuZCB3aGVuXG4vLyBgdG9wICsgMSA9PT0gYm90dG9tYCBpdCdzIGZ1bGwuIFRoaXMgd2FzdGVzIGEgc2luZ2xlIHNwYWNlIG9mIHN0b3JhZ2Vcbi8vIGJ1dCBhbGxvd3MgbXVjaCBxdWlja2VyIGNoZWNrcy5cblxuY2xhc3MgRml4ZWRDaXJjdWxhckJ1ZmZlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuYm90dG9tID0gMDtcbiAgICB0aGlzLnRvcCA9IDA7XG4gICAgdGhpcy5saXN0ID0gbmV3IEFycmF5KGtTaXplKTtcbiAgICB0aGlzLm5leHQgPSBudWxsO1xuICB9XG5cbiAgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy50b3AgPT09IHRoaXMuYm90dG9tO1xuICB9XG5cbiAgaXNGdWxsKCkge1xuICAgIHJldHVybiAoKHRoaXMudG9wICsgMSkgJiBrTWFzaykgPT09IHRoaXMuYm90dG9tO1xuICB9XG5cbiAgcHVzaChkYXRhKSB7XG4gICAgdGhpcy5saXN0W3RoaXMudG9wXSA9IGRhdGE7XG4gICAgdGhpcy50b3AgPSAodGhpcy50b3AgKyAxKSAmIGtNYXNrO1xuICB9XG5cbiAgc2hpZnQoKSB7XG4gICAgY29uc3QgbmV4dEl0ZW0gPSB0aGlzLmxpc3RbdGhpcy5ib3R0b21dO1xuICAgIGlmIChuZXh0SXRlbSA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5saXN0W3RoaXMuYm90dG9tXSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmJvdHRvbSA9ICh0aGlzLmJvdHRvbSArIDEpICYga01hc2s7XG4gICAgcmV0dXJuIG5leHRJdGVtO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgRml4ZWRRdWV1ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG5ldyBGaXhlZENpcmN1bGFyQnVmZmVyKCk7XG4gIH1cblxuICBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLmhlYWQuaXNFbXB0eSgpO1xuICB9XG5cbiAgcHVzaChkYXRhKSB7XG4gICAgaWYgKHRoaXMuaGVhZC5pc0Z1bGwoKSkge1xuICAgICAgLy8gSGVhZCBpcyBmdWxsOiBDcmVhdGVzIGEgbmV3IHF1ZXVlLCBzZXRzIHRoZSBvbGQgcXVldWUncyBgLm5leHRgIHRvIGl0LFxuICAgICAgLy8gYW5kIHNldHMgaXQgYXMgdGhlIG5ldyBtYWluIHF1ZXVlLlxuICAgICAgdGhpcy5oZWFkID0gdGhpcy5oZWFkLm5leHQgPSBuZXcgRml4ZWRDaXJjdWxhckJ1ZmZlcigpO1xuICAgIH1cbiAgICB0aGlzLmhlYWQucHVzaChkYXRhKTtcbiAgfVxuXG4gIHNoaWZ0KCkge1xuICAgIGNvbnN0IHRhaWwgPSB0aGlzLnRhaWw7XG4gICAgY29uc3QgbmV4dCA9IHRhaWwuc2hpZnQoKTtcbiAgICBpZiAodGFpbC5pc0VtcHR5KCkgJiYgdGFpbC5uZXh0ICE9PSBudWxsKSB7XG4gICAgICAvLyBJZiB0aGVyZSBpcyBhbm90aGVyIHF1ZXVlLCBpdCBmb3JtcyB0aGUgbmV3IHRhaWwuXG4gICAgICB0aGlzLnRhaWwgPSB0YWlsLm5leHQ7XG4gICAgfVxuICAgIHJldHVybiBuZXh0O1xuICB9XG59O1xuIiwiY29uc3QgeyBrRnJlZSwga0Nvbm5lY3RlZCwga1BlbmRpbmcsIGtRdWV1ZWQsIGtSdW5uaW5nLCBrU2l6ZSB9ID0gcmVxdWlyZSgnLi9jb3JlL3N5bWJvbHMnKVxuY29uc3Qga1Bvb2wgPSBTeW1ib2woJ3Bvb2wnKVxuXG5jbGFzcyBQb29sU3RhdHMge1xuICBjb25zdHJ1Y3RvciAocG9vbCkge1xuICAgIHRoaXNba1Bvb2xdID0gcG9vbFxuICB9XG5cbiAgZ2V0IGNvbm5lY3RlZCAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1Bvb2xdW2tDb25uZWN0ZWRdXG4gIH1cblxuICBnZXQgZnJlZSAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1Bvb2xdW2tGcmVlXVxuICB9XG5cbiAgZ2V0IHBlbmRpbmcgKCkge1xuICAgIHJldHVybiB0aGlzW2tQb29sXVtrUGVuZGluZ11cbiAgfVxuXG4gIGdldCBxdWV1ZWQgKCkge1xuICAgIHJldHVybiB0aGlzW2tQb29sXVtrUXVldWVkXVxuICB9XG5cbiAgZ2V0IHJ1bm5pbmcgKCkge1xuICAgIHJldHVybiB0aGlzW2tQb29sXVtrUnVubmluZ11cbiAgfVxuXG4gIGdldCBzaXplICgpIHtcbiAgICByZXR1cm4gdGhpc1trUG9vbF1ba1NpemVdXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBQb29sU3RhdHNcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBEaXNwYXRjaGVyQmFzZSA9IHJlcXVpcmUoJy4vZGlzcGF0Y2hlci1iYXNlJylcbmNvbnN0IEZpeGVkUXVldWUgPSByZXF1aXJlKCcuL25vZGUvZml4ZWQtcXVldWUnKVxuY29uc3QgeyBrQ29ubmVjdGVkLCBrU2l6ZSwga1J1bm5pbmcsIGtQZW5kaW5nLCBrUXVldWVkLCBrQnVzeSwga0ZyZWUsIGtVcmwsIGtDbG9zZSwga0Rlc3Ryb3ksIGtEaXNwYXRjaCB9ID0gcmVxdWlyZSgnLi9jb3JlL3N5bWJvbHMnKVxuY29uc3QgUG9vbFN0YXRzID0gcmVxdWlyZSgnLi9wb29sLXN0YXRzJylcblxuY29uc3Qga0NsaWVudHMgPSBTeW1ib2woJ2NsaWVudHMnKVxuY29uc3Qga05lZWREcmFpbiA9IFN5bWJvbCgnbmVlZERyYWluJylcbmNvbnN0IGtRdWV1ZSA9IFN5bWJvbCgncXVldWUnKVxuY29uc3Qga0Nsb3NlZFJlc29sdmUgPSBTeW1ib2woJ2Nsb3NlZCByZXNvbHZlJylcbmNvbnN0IGtPbkRyYWluID0gU3ltYm9sKCdvbkRyYWluJylcbmNvbnN0IGtPbkNvbm5lY3QgPSBTeW1ib2woJ29uQ29ubmVjdCcpXG5jb25zdCBrT25EaXNjb25uZWN0ID0gU3ltYm9sKCdvbkRpc2Nvbm5lY3QnKVxuY29uc3Qga09uQ29ubmVjdGlvbkVycm9yID0gU3ltYm9sKCdvbkNvbm5lY3Rpb25FcnJvcicpXG5jb25zdCBrR2V0RGlzcGF0Y2hlciA9IFN5bWJvbCgnZ2V0IGRpc3BhdGNoZXInKVxuY29uc3Qga0FkZENsaWVudCA9IFN5bWJvbCgnYWRkIGNsaWVudCcpXG5jb25zdCBrUmVtb3ZlQ2xpZW50ID0gU3ltYm9sKCdyZW1vdmUgY2xpZW50JylcbmNvbnN0IGtTdGF0cyA9IFN5bWJvbCgnc3RhdHMnKVxuXG5jbGFzcyBQb29sQmFzZSBleHRlbmRzIERpc3BhdGNoZXJCYXNlIHtcbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHN1cGVyKClcblxuICAgIHRoaXNba1F1ZXVlXSA9IG5ldyBGaXhlZFF1ZXVlKClcbiAgICB0aGlzW2tDbGllbnRzXSA9IFtdXG4gICAgdGhpc1trUXVldWVkXSA9IDBcblxuICAgIGNvbnN0IHBvb2wgPSB0aGlzXG5cbiAgICB0aGlzW2tPbkRyYWluXSA9IGZ1bmN0aW9uIG9uRHJhaW4gKG9yaWdpbiwgdGFyZ2V0cykge1xuICAgICAgY29uc3QgcXVldWUgPSBwb29sW2tRdWV1ZV1cblxuICAgICAgbGV0IG5lZWREcmFpbiA9IGZhbHNlXG5cbiAgICAgIHdoaWxlICghbmVlZERyYWluKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBxdWV1ZS5zaGlmdCgpXG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgcG9vbFtrUXVldWVkXS0tXG4gICAgICAgIG5lZWREcmFpbiA9ICF0aGlzLmRpc3BhdGNoKGl0ZW0ub3B0cywgaXRlbS5oYW5kbGVyKVxuICAgICAgfVxuXG4gICAgICB0aGlzW2tOZWVkRHJhaW5dID0gbmVlZERyYWluXG5cbiAgICAgIGlmICghdGhpc1trTmVlZERyYWluXSAmJiBwb29sW2tOZWVkRHJhaW5dKSB7XG4gICAgICAgIHBvb2xba05lZWREcmFpbl0gPSBmYWxzZVxuICAgICAgICBwb29sLmVtaXQoJ2RyYWluJywgb3JpZ2luLCBbcG9vbCwgLi4udGFyZ2V0c10pXG4gICAgICB9XG5cbiAgICAgIGlmIChwb29sW2tDbG9zZWRSZXNvbHZlXSAmJiBxdWV1ZS5pc0VtcHR5KCkpIHtcbiAgICAgICAgUHJvbWlzZVxuICAgICAgICAgIC5hbGwocG9vbFtrQ2xpZW50c10ubWFwKGMgPT4gYy5jbG9zZSgpKSlcbiAgICAgICAgICAudGhlbihwb29sW2tDbG9zZWRSZXNvbHZlXSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzW2tPbkNvbm5lY3RdID0gKG9yaWdpbiwgdGFyZ2V0cykgPT4ge1xuICAgICAgcG9vbC5lbWl0KCdjb25uZWN0Jywgb3JpZ2luLCBbcG9vbCwgLi4udGFyZ2V0c10pXG4gICAgfVxuXG4gICAgdGhpc1trT25EaXNjb25uZWN0XSA9IChvcmlnaW4sIHRhcmdldHMsIGVycikgPT4ge1xuICAgICAgcG9vbC5lbWl0KCdkaXNjb25uZWN0Jywgb3JpZ2luLCBbcG9vbCwgLi4udGFyZ2V0c10sIGVycilcbiAgICB9XG5cbiAgICB0aGlzW2tPbkNvbm5lY3Rpb25FcnJvcl0gPSAob3JpZ2luLCB0YXJnZXRzLCBlcnIpID0+IHtcbiAgICAgIHBvb2wuZW1pdCgnY29ubmVjdGlvbkVycm9yJywgb3JpZ2luLCBbcG9vbCwgLi4udGFyZ2V0c10sIGVycilcbiAgICB9XG5cbiAgICB0aGlzW2tTdGF0c10gPSBuZXcgUG9vbFN0YXRzKHRoaXMpXG4gIH1cblxuICBnZXQgW2tCdXN5XSAoKSB7XG4gICAgcmV0dXJuIHRoaXNba05lZWREcmFpbl1cbiAgfVxuXG4gIGdldCBba0Nvbm5lY3RlZF0gKCkge1xuICAgIHJldHVybiB0aGlzW2tDbGllbnRzXS5maWx0ZXIoY2xpZW50ID0+IGNsaWVudFtrQ29ubmVjdGVkXSkubGVuZ3RoXG4gIH1cblxuICBnZXQgW2tGcmVlXSAoKSB7XG4gICAgcmV0dXJuIHRoaXNba0NsaWVudHNdLmZpbHRlcihjbGllbnQgPT4gY2xpZW50W2tDb25uZWN0ZWRdICYmICFjbGllbnRba05lZWREcmFpbl0pLmxlbmd0aFxuICB9XG5cbiAgZ2V0IFtrUGVuZGluZ10gKCkge1xuICAgIGxldCByZXQgPSB0aGlzW2tRdWV1ZWRdXG4gICAgZm9yIChjb25zdCB7IFtrUGVuZGluZ106IHBlbmRpbmcgfSBvZiB0aGlzW2tDbGllbnRzXSkge1xuICAgICAgcmV0ICs9IHBlbmRpbmdcbiAgICB9XG4gICAgcmV0dXJuIHJldFxuICB9XG5cbiAgZ2V0IFtrUnVubmluZ10gKCkge1xuICAgIGxldCByZXQgPSAwXG4gICAgZm9yIChjb25zdCB7IFtrUnVubmluZ106IHJ1bm5pbmcgfSBvZiB0aGlzW2tDbGllbnRzXSkge1xuICAgICAgcmV0ICs9IHJ1bm5pbmdcbiAgICB9XG4gICAgcmV0dXJuIHJldFxuICB9XG5cbiAgZ2V0IFtrU2l6ZV0gKCkge1xuICAgIGxldCByZXQgPSB0aGlzW2tRdWV1ZWRdXG4gICAgZm9yIChjb25zdCB7IFtrU2l6ZV06IHNpemUgfSBvZiB0aGlzW2tDbGllbnRzXSkge1xuICAgICAgcmV0ICs9IHNpemVcbiAgICB9XG4gICAgcmV0dXJuIHJldFxuICB9XG5cbiAgZ2V0IHN0YXRzICgpIHtcbiAgICByZXR1cm4gdGhpc1trU3RhdHNdXG4gIH1cblxuICBhc3luYyBba0Nsb3NlXSAoKSB7XG4gICAgaWYgKHRoaXNba1F1ZXVlXS5pc0VtcHR5KCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLmFsbCh0aGlzW2tDbGllbnRzXS5tYXAoYyA9PiBjLmNsb3NlKCkpKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgdGhpc1trQ2xvc2VkUmVzb2x2ZV0gPSByZXNvbHZlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIFtrRGVzdHJveV0gKGVycikge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpc1trUXVldWVdLnNoaWZ0KClcbiAgICAgIGlmICghaXRlbSkge1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgaXRlbS5oYW5kbGVyLm9uRXJyb3IoZXJyKVxuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLmFsbCh0aGlzW2tDbGllbnRzXS5tYXAoYyA9PiBjLmRlc3Ryb3koZXJyKSkpXG4gIH1cblxuICBba0Rpc3BhdGNoXSAob3B0cywgaGFuZGxlcikge1xuICAgIGNvbnN0IGRpc3BhdGNoZXIgPSB0aGlzW2tHZXREaXNwYXRjaGVyXSgpXG5cbiAgICBpZiAoIWRpc3BhdGNoZXIpIHtcbiAgICAgIHRoaXNba05lZWREcmFpbl0gPSB0cnVlXG4gICAgICB0aGlzW2tRdWV1ZV0ucHVzaCh7IG9wdHMsIGhhbmRsZXIgfSlcbiAgICAgIHRoaXNba1F1ZXVlZF0rK1xuICAgIH0gZWxzZSBpZiAoIWRpc3BhdGNoZXIuZGlzcGF0Y2gob3B0cywgaGFuZGxlcikpIHtcbiAgICAgIGRpc3BhdGNoZXJba05lZWREcmFpbl0gPSB0cnVlXG4gICAgICB0aGlzW2tOZWVkRHJhaW5dID0gIXRoaXNba0dldERpc3BhdGNoZXJdKClcbiAgICB9XG5cbiAgICByZXR1cm4gIXRoaXNba05lZWREcmFpbl1cbiAgfVxuXG4gIFtrQWRkQ2xpZW50XSAoY2xpZW50KSB7XG4gICAgY2xpZW50XG4gICAgICAub24oJ2RyYWluJywgdGhpc1trT25EcmFpbl0pXG4gICAgICAub24oJ2Nvbm5lY3QnLCB0aGlzW2tPbkNvbm5lY3RdKVxuICAgICAgLm9uKCdkaXNjb25uZWN0JywgdGhpc1trT25EaXNjb25uZWN0XSlcbiAgICAgIC5vbignY29ubmVjdGlvbkVycm9yJywgdGhpc1trT25Db25uZWN0aW9uRXJyb3JdKVxuXG4gICAgdGhpc1trQ2xpZW50c10ucHVzaChjbGllbnQpXG5cbiAgICBpZiAodGhpc1trTmVlZERyYWluXSkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzW2tOZWVkRHJhaW5dKSB7XG4gICAgICAgICAgdGhpc1trT25EcmFpbl0oY2xpZW50W2tVcmxdLCBbdGhpcywgY2xpZW50XSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgW2tSZW1vdmVDbGllbnRdIChjbGllbnQpIHtcbiAgICBjbGllbnQuY2xvc2UoKCkgPT4ge1xuICAgICAgY29uc3QgaWR4ID0gdGhpc1trQ2xpZW50c10uaW5kZXhPZihjbGllbnQpXG4gICAgICBpZiAoaWR4ICE9PSAtMSkge1xuICAgICAgICB0aGlzW2tDbGllbnRzXS5zcGxpY2UoaWR4LCAxKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzW2tOZWVkRHJhaW5dID0gdGhpc1trQ2xpZW50c10uc29tZShkaXNwYXRjaGVyID0+IChcbiAgICAgICFkaXNwYXRjaGVyW2tOZWVkRHJhaW5dICYmXG4gICAgICBkaXNwYXRjaGVyLmNsb3NlZCAhPT0gdHJ1ZSAmJlxuICAgICAgZGlzcGF0Y2hlci5kZXN0cm95ZWQgIT09IHRydWVcbiAgICApKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBQb29sQmFzZSxcbiAga0NsaWVudHMsXG4gIGtOZWVkRHJhaW4sXG4gIGtBZGRDbGllbnQsXG4gIGtSZW1vdmVDbGllbnQsXG4gIGtHZXREaXNwYXRjaGVyXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBQb29sQmFzZSxcbiAga0NsaWVudHMsXG4gIGtOZWVkRHJhaW4sXG4gIGtBZGRDbGllbnQsXG4gIGtHZXREaXNwYXRjaGVyXG59ID0gcmVxdWlyZSgnLi9wb29sLWJhc2UnKVxuY29uc3QgQ2xpZW50ID0gcmVxdWlyZSgnLi9jbGllbnQnKVxuY29uc3Qge1xuICBJbnZhbGlkQXJndW1lbnRFcnJvclxufSA9IHJlcXVpcmUoJy4vY29yZS9lcnJvcnMnKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4vY29yZS91dGlsJylcbmNvbnN0IHsga1VybCwga0ludGVyY2VwdG9ycyB9ID0gcmVxdWlyZSgnLi9jb3JlL3N5bWJvbHMnKVxuY29uc3QgYnVpbGRDb25uZWN0b3IgPSByZXF1aXJlKCcuL2NvcmUvY29ubmVjdCcpXG5cbmNvbnN0IGtPcHRpb25zID0gU3ltYm9sKCdvcHRpb25zJylcbmNvbnN0IGtDb25uZWN0aW9ucyA9IFN5bWJvbCgnY29ubmVjdGlvbnMnKVxuY29uc3Qga0ZhY3RvcnkgPSBTeW1ib2woJ2ZhY3RvcnknKVxuXG5mdW5jdGlvbiBkZWZhdWx0RmFjdG9yeSAob3JpZ2luLCBvcHRzKSB7XG4gIHJldHVybiBuZXcgQ2xpZW50KG9yaWdpbiwgb3B0cylcbn1cblxuY2xhc3MgUG9vbCBleHRlbmRzIFBvb2xCYXNlIHtcbiAgY29uc3RydWN0b3IgKG9yaWdpbiwge1xuICAgIGNvbm5lY3Rpb25zLFxuICAgIGZhY3RvcnkgPSBkZWZhdWx0RmFjdG9yeSxcbiAgICBjb25uZWN0LFxuICAgIGNvbm5lY3RUaW1lb3V0LFxuICAgIHRscyxcbiAgICBtYXhDYWNoZWRTZXNzaW9ucyxcbiAgICBzb2NrZXRQYXRoLFxuICAgIGF1dG9TZWxlY3RGYW1pbHksXG4gICAgYXV0b1NlbGVjdEZhbWlseUF0dGVtcHRUaW1lb3V0LFxuICAgIGFsbG93SDIsXG4gICAgLi4ub3B0aW9uc1xuICB9ID0ge30pIHtcbiAgICBzdXBlcigpXG5cbiAgICBpZiAoY29ubmVjdGlvbnMgIT0gbnVsbCAmJiAoIU51bWJlci5pc0Zpbml0ZShjb25uZWN0aW9ucykgfHwgY29ubmVjdGlvbnMgPCAwKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGNvbm5lY3Rpb25zJylcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZhY3RvcnkgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignZmFjdG9yeSBtdXN0IGJlIGEgZnVuY3Rpb24uJylcbiAgICB9XG5cbiAgICBpZiAoY29ubmVjdCAhPSBudWxsICYmIHR5cGVvZiBjb25uZWN0ICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBjb25uZWN0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdjb25uZWN0IG11c3QgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3QnKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29ubmVjdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29ubmVjdCA9IGJ1aWxkQ29ubmVjdG9yKHtcbiAgICAgICAgLi4udGxzLFxuICAgICAgICBtYXhDYWNoZWRTZXNzaW9ucyxcbiAgICAgICAgYWxsb3dIMixcbiAgICAgICAgc29ja2V0UGF0aCxcbiAgICAgICAgdGltZW91dDogY29ubmVjdFRpbWVvdXQsXG4gICAgICAgIC4uLih1dGlsLm5vZGVIYXNBdXRvU2VsZWN0RmFtaWx5ICYmIGF1dG9TZWxlY3RGYW1pbHkgPyB7IGF1dG9TZWxlY3RGYW1pbHksIGF1dG9TZWxlY3RGYW1pbHlBdHRlbXB0VGltZW91dCB9IDogdW5kZWZpbmVkKSxcbiAgICAgICAgLi4uY29ubmVjdFxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0aGlzW2tJbnRlcmNlcHRvcnNdID0gb3B0aW9ucy5pbnRlcmNlcHRvcnMgJiYgb3B0aW9ucy5pbnRlcmNlcHRvcnMuUG9vbCAmJiBBcnJheS5pc0FycmF5KG9wdGlvbnMuaW50ZXJjZXB0b3JzLlBvb2wpXG4gICAgICA/IG9wdGlvbnMuaW50ZXJjZXB0b3JzLlBvb2xcbiAgICAgIDogW11cbiAgICB0aGlzW2tDb25uZWN0aW9uc10gPSBjb25uZWN0aW9ucyB8fCBudWxsXG4gICAgdGhpc1trVXJsXSA9IHV0aWwucGFyc2VPcmlnaW4ob3JpZ2luKVxuICAgIHRoaXNba09wdGlvbnNdID0geyAuLi51dGlsLmRlZXBDbG9uZShvcHRpb25zKSwgY29ubmVjdCwgYWxsb3dIMiB9XG4gICAgdGhpc1trT3B0aW9uc10uaW50ZXJjZXB0b3JzID0gb3B0aW9ucy5pbnRlcmNlcHRvcnNcbiAgICAgID8geyAuLi5vcHRpb25zLmludGVyY2VwdG9ycyB9XG4gICAgICA6IHVuZGVmaW5lZFxuICAgIHRoaXNba0ZhY3RvcnldID0gZmFjdG9yeVxuXG4gICAgdGhpcy5vbignY29ubmVjdGlvbkVycm9yJywgKG9yaWdpbiwgdGFyZ2V0cywgZXJyb3IpID0+IHtcbiAgICAgIC8vIElmIGEgY29ubmVjdGlvbiBlcnJvciBvY2N1cnMsIHdlIHJlbW92ZSB0aGUgY2xpZW50IGZyb20gdGhlIHBvb2wsXG4gICAgICAvLyBhbmQgZW1pdCBhIGNvbm5lY3Rpb25FcnJvciBldmVudC4gVGhleSB3aWxsIG5vdCBiZSByZS11c2VkLlxuICAgICAgLy8gRml4ZXMgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzM4OTVcbiAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgLy8gRG8gbm90IHVzZSBrUmVtb3ZlQ2xpZW50IGhlcmUsIGFzIGl0IHdpbGwgY2xvc2UgdGhlIGNsaWVudCxcbiAgICAgICAgLy8gYnV0IHRoZSBjbGllbnQgY2Fubm90IGJlIGNsb3NlZCBpbiB0aGlzIHN0YXRlLlxuICAgICAgICBjb25zdCBpZHggPSB0aGlzW2tDbGllbnRzXS5pbmRleE9mKHRhcmdldClcbiAgICAgICAgaWYgKGlkeCAhPT0gLTEpIHtcbiAgICAgICAgICB0aGlzW2tDbGllbnRzXS5zcGxpY2UoaWR4LCAxKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIFtrR2V0RGlzcGF0Y2hlcl0gKCkge1xuICAgIGxldCBkaXNwYXRjaGVyID0gdGhpc1trQ2xpZW50c10uZmluZChkaXNwYXRjaGVyID0+ICFkaXNwYXRjaGVyW2tOZWVkRHJhaW5dKVxuXG4gICAgaWYgKGRpc3BhdGNoZXIpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaGVyXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzW2tDb25uZWN0aW9uc10gfHwgdGhpc1trQ2xpZW50c10ubGVuZ3RoIDwgdGhpc1trQ29ubmVjdGlvbnNdKSB7XG4gICAgICBkaXNwYXRjaGVyID0gdGhpc1trRmFjdG9yeV0odGhpc1trVXJsXSwgdGhpc1trT3B0aW9uc10pXG4gICAgICB0aGlzW2tBZGRDbGllbnRdKGRpc3BhdGNoZXIpXG4gICAgfVxuXG4gICAgcmV0dXJuIGRpc3BhdGNoZXJcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFBvb2xcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7XG4gIEJhbGFuY2VkUG9vbE1pc3NpbmdVcHN0cmVhbUVycm9yLFxuICBJbnZhbGlkQXJndW1lbnRFcnJvclxufSA9IHJlcXVpcmUoJy4vY29yZS9lcnJvcnMnKVxuY29uc3Qge1xuICBQb29sQmFzZSxcbiAga0NsaWVudHMsXG4gIGtOZWVkRHJhaW4sXG4gIGtBZGRDbGllbnQsXG4gIGtSZW1vdmVDbGllbnQsXG4gIGtHZXREaXNwYXRjaGVyXG59ID0gcmVxdWlyZSgnLi9wb29sLWJhc2UnKVxuY29uc3QgUG9vbCA9IHJlcXVpcmUoJy4vcG9vbCcpXG5jb25zdCB7IGtVcmwsIGtJbnRlcmNlcHRvcnMgfSA9IHJlcXVpcmUoJy4vY29yZS9zeW1ib2xzJylcbmNvbnN0IHsgcGFyc2VPcmlnaW4gfSA9IHJlcXVpcmUoJy4vY29yZS91dGlsJylcbmNvbnN0IGtGYWN0b3J5ID0gU3ltYm9sKCdmYWN0b3J5JylcblxuY29uc3Qga09wdGlvbnMgPSBTeW1ib2woJ29wdGlvbnMnKVxuY29uc3Qga0dyZWF0ZXN0Q29tbW9uRGl2aXNvciA9IFN5bWJvbCgna0dyZWF0ZXN0Q29tbW9uRGl2aXNvcicpXG5jb25zdCBrQ3VycmVudFdlaWdodCA9IFN5bWJvbCgna0N1cnJlbnRXZWlnaHQnKVxuY29uc3Qga0luZGV4ID0gU3ltYm9sKCdrSW5kZXgnKVxuY29uc3Qga1dlaWdodCA9IFN5bWJvbCgna1dlaWdodCcpXG5jb25zdCBrTWF4V2VpZ2h0UGVyU2VydmVyID0gU3ltYm9sKCdrTWF4V2VpZ2h0UGVyU2VydmVyJylcbmNvbnN0IGtFcnJvclBlbmFsdHkgPSBTeW1ib2woJ2tFcnJvclBlbmFsdHknKVxuXG5mdW5jdGlvbiBnZXRHcmVhdGVzdENvbW1vbkRpdmlzb3IgKGEsIGIpIHtcbiAgaWYgKGIgPT09IDApIHJldHVybiBhXG4gIHJldHVybiBnZXRHcmVhdGVzdENvbW1vbkRpdmlzb3IoYiwgYSAlIGIpXG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRGYWN0b3J5IChvcmlnaW4sIG9wdHMpIHtcbiAgcmV0dXJuIG5ldyBQb29sKG9yaWdpbiwgb3B0cylcbn1cblxuY2xhc3MgQmFsYW5jZWRQb29sIGV4dGVuZHMgUG9vbEJhc2Uge1xuICBjb25zdHJ1Y3RvciAodXBzdHJlYW1zID0gW10sIHsgZmFjdG9yeSA9IGRlZmF1bHRGYWN0b3J5LCAuLi5vcHRzIH0gPSB7fSkge1xuICAgIHN1cGVyKClcblxuICAgIHRoaXNba09wdGlvbnNdID0gb3B0c1xuICAgIHRoaXNba0luZGV4XSA9IC0xXG4gICAgdGhpc1trQ3VycmVudFdlaWdodF0gPSAwXG5cbiAgICB0aGlzW2tNYXhXZWlnaHRQZXJTZXJ2ZXJdID0gdGhpc1trT3B0aW9uc10ubWF4V2VpZ2h0UGVyU2VydmVyIHx8IDEwMFxuICAgIHRoaXNba0Vycm9yUGVuYWx0eV0gPSB0aGlzW2tPcHRpb25zXS5lcnJvclBlbmFsdHkgfHwgMTVcblxuICAgIGlmICghQXJyYXkuaXNBcnJheSh1cHN0cmVhbXMpKSB7XG4gICAgICB1cHN0cmVhbXMgPSBbdXBzdHJlYW1zXVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZmFjdG9yeSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdmYWN0b3J5IG11c3QgYmUgYSBmdW5jdGlvbi4nKVxuICAgIH1cblxuICAgIHRoaXNba0ludGVyY2VwdG9yc10gPSBvcHRzLmludGVyY2VwdG9ycyAmJiBvcHRzLmludGVyY2VwdG9ycy5CYWxhbmNlZFBvb2wgJiYgQXJyYXkuaXNBcnJheShvcHRzLmludGVyY2VwdG9ycy5CYWxhbmNlZFBvb2wpXG4gICAgICA/IG9wdHMuaW50ZXJjZXB0b3JzLkJhbGFuY2VkUG9vbFxuICAgICAgOiBbXVxuICAgIHRoaXNba0ZhY3RvcnldID0gZmFjdG9yeVxuXG4gICAgZm9yIChjb25zdCB1cHN0cmVhbSBvZiB1cHN0cmVhbXMpIHtcbiAgICAgIHRoaXMuYWRkVXBzdHJlYW0odXBzdHJlYW0pXG4gICAgfVxuICAgIHRoaXMuX3VwZGF0ZUJhbGFuY2VkUG9vbFN0YXRzKClcbiAgfVxuXG4gIGFkZFVwc3RyZWFtICh1cHN0cmVhbSkge1xuICAgIGNvbnN0IHVwc3RyZWFtT3JpZ2luID0gcGFyc2VPcmlnaW4odXBzdHJlYW0pLm9yaWdpblxuXG4gICAgaWYgKHRoaXNba0NsaWVudHNdLmZpbmQoKHBvb2wpID0+IChcbiAgICAgIHBvb2xba1VybF0ub3JpZ2luID09PSB1cHN0cmVhbU9yaWdpbiAmJlxuICAgICAgcG9vbC5jbG9zZWQgIT09IHRydWUgJiZcbiAgICAgIHBvb2wuZGVzdHJveWVkICE9PSB0cnVlXG4gICAgKSkpIHtcbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuICAgIGNvbnN0IHBvb2wgPSB0aGlzW2tGYWN0b3J5XSh1cHN0cmVhbU9yaWdpbiwgT2JqZWN0LmFzc2lnbih7fSwgdGhpc1trT3B0aW9uc10pKVxuXG4gICAgdGhpc1trQWRkQ2xpZW50XShwb29sKVxuICAgIHBvb2wub24oJ2Nvbm5lY3QnLCAoKSA9PiB7XG4gICAgICBwb29sW2tXZWlnaHRdID0gTWF0aC5taW4odGhpc1trTWF4V2VpZ2h0UGVyU2VydmVyXSwgcG9vbFtrV2VpZ2h0XSArIHRoaXNba0Vycm9yUGVuYWx0eV0pXG4gICAgfSlcblxuICAgIHBvb2wub24oJ2Nvbm5lY3Rpb25FcnJvcicsICgpID0+IHtcbiAgICAgIHBvb2xba1dlaWdodF0gPSBNYXRoLm1heCgxLCBwb29sW2tXZWlnaHRdIC0gdGhpc1trRXJyb3JQZW5hbHR5XSlcbiAgICAgIHRoaXMuX3VwZGF0ZUJhbGFuY2VkUG9vbFN0YXRzKClcbiAgICB9KVxuXG4gICAgcG9vbC5vbignZGlzY29ubmVjdCcsICguLi5hcmdzKSA9PiB7XG4gICAgICBjb25zdCBlcnIgPSBhcmdzWzJdXG4gICAgICBpZiAoZXJyICYmIGVyci5jb2RlID09PSAnVU5EX0VSUl9TT0NLRVQnKSB7XG4gICAgICAgIC8vIGRlY3JlYXNlIHRoZSB3ZWlnaHQgb2YgdGhlIHBvb2wuXG4gICAgICAgIHBvb2xba1dlaWdodF0gPSBNYXRoLm1heCgxLCBwb29sW2tXZWlnaHRdIC0gdGhpc1trRXJyb3JQZW5hbHR5XSlcbiAgICAgICAgdGhpcy5fdXBkYXRlQmFsYW5jZWRQb29sU3RhdHMoKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBmb3IgKGNvbnN0IGNsaWVudCBvZiB0aGlzW2tDbGllbnRzXSkge1xuICAgICAgY2xpZW50W2tXZWlnaHRdID0gdGhpc1trTWF4V2VpZ2h0UGVyU2VydmVyXVxuICAgIH1cblxuICAgIHRoaXMuX3VwZGF0ZUJhbGFuY2VkUG9vbFN0YXRzKClcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBfdXBkYXRlQmFsYW5jZWRQb29sU3RhdHMgKCkge1xuICAgIHRoaXNba0dyZWF0ZXN0Q29tbW9uRGl2aXNvcl0gPSB0aGlzW2tDbGllbnRzXS5tYXAocCA9PiBwW2tXZWlnaHRdKS5yZWR1Y2UoZ2V0R3JlYXRlc3RDb21tb25EaXZpc29yLCAwKVxuICB9XG5cbiAgcmVtb3ZlVXBzdHJlYW0gKHVwc3RyZWFtKSB7XG4gICAgY29uc3QgdXBzdHJlYW1PcmlnaW4gPSBwYXJzZU9yaWdpbih1cHN0cmVhbSkub3JpZ2luXG5cbiAgICBjb25zdCBwb29sID0gdGhpc1trQ2xpZW50c10uZmluZCgocG9vbCkgPT4gKFxuICAgICAgcG9vbFtrVXJsXS5vcmlnaW4gPT09IHVwc3RyZWFtT3JpZ2luICYmXG4gICAgICBwb29sLmNsb3NlZCAhPT0gdHJ1ZSAmJlxuICAgICAgcG9vbC5kZXN0cm95ZWQgIT09IHRydWVcbiAgICApKVxuXG4gICAgaWYgKHBvb2wpIHtcbiAgICAgIHRoaXNba1JlbW92ZUNsaWVudF0ocG9vbClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgZ2V0IHVwc3RyZWFtcyAoKSB7XG4gICAgcmV0dXJuIHRoaXNba0NsaWVudHNdXG4gICAgICAuZmlsdGVyKGRpc3BhdGNoZXIgPT4gZGlzcGF0Y2hlci5jbG9zZWQgIT09IHRydWUgJiYgZGlzcGF0Y2hlci5kZXN0cm95ZWQgIT09IHRydWUpXG4gICAgICAubWFwKChwKSA9PiBwW2tVcmxdLm9yaWdpbilcbiAgfVxuXG4gIFtrR2V0RGlzcGF0Y2hlcl0gKCkge1xuICAgIC8vIFdlIHZhbGlkYXRlIHRoYXQgcG9vbHMgaXMgZ3JlYXRlciB0aGFuIDAsXG4gICAgLy8gb3RoZXJ3aXNlIHdlIHdvdWxkIGhhdmUgdG8gd2FpdCB1bnRpbCBhbiB1cHN0cmVhbVxuICAgIC8vIGlzIGFkZGVkLCB3aGljaCBtaWdodCBuZXZlciBoYXBwZW4uXG4gICAgaWYgKHRoaXNba0NsaWVudHNdLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEJhbGFuY2VkUG9vbE1pc3NpbmdVcHN0cmVhbUVycm9yKClcbiAgICB9XG5cbiAgICBjb25zdCBkaXNwYXRjaGVyID0gdGhpc1trQ2xpZW50c10uZmluZChkaXNwYXRjaGVyID0+IChcbiAgICAgICFkaXNwYXRjaGVyW2tOZWVkRHJhaW5dICYmXG4gICAgICBkaXNwYXRjaGVyLmNsb3NlZCAhPT0gdHJ1ZSAmJlxuICAgICAgZGlzcGF0Y2hlci5kZXN0cm95ZWQgIT09IHRydWVcbiAgICApKVxuXG4gICAgaWYgKCFkaXNwYXRjaGVyKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBhbGxDbGllbnRzQnVzeSA9IHRoaXNba0NsaWVudHNdLm1hcChwb29sID0+IHBvb2xba05lZWREcmFpbl0pLnJlZHVjZSgoYSwgYikgPT4gYSAmJiBiLCB0cnVlKVxuXG4gICAgaWYgKGFsbENsaWVudHNCdXN5KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBsZXQgY291bnRlciA9IDBcblxuICAgIGxldCBtYXhXZWlnaHRJbmRleCA9IHRoaXNba0NsaWVudHNdLmZpbmRJbmRleChwb29sID0+ICFwb29sW2tOZWVkRHJhaW5dKVxuXG4gICAgd2hpbGUgKGNvdW50ZXIrKyA8IHRoaXNba0NsaWVudHNdLmxlbmd0aCkge1xuICAgICAgdGhpc1trSW5kZXhdID0gKHRoaXNba0luZGV4XSArIDEpICUgdGhpc1trQ2xpZW50c10ubGVuZ3RoXG4gICAgICBjb25zdCBwb29sID0gdGhpc1trQ2xpZW50c11bdGhpc1trSW5kZXhdXVxuXG4gICAgICAvLyBmaW5kIHBvb2wgaW5kZXggd2l0aCB0aGUgbGFyZ2VzdCB3ZWlnaHRcbiAgICAgIGlmIChwb29sW2tXZWlnaHRdID4gdGhpc1trQ2xpZW50c11bbWF4V2VpZ2h0SW5kZXhdW2tXZWlnaHRdICYmICFwb29sW2tOZWVkRHJhaW5dKSB7XG4gICAgICAgIG1heFdlaWdodEluZGV4ID0gdGhpc1trSW5kZXhdXG4gICAgICB9XG5cbiAgICAgIC8vIGRlY3JlYXNlIHRoZSBjdXJyZW50IHdlaWdodCBldmVyeSBgdGhpc1trQ2xpZW50c10ubGVuZ3RoYC5cbiAgICAgIGlmICh0aGlzW2tJbmRleF0gPT09IDApIHtcbiAgICAgICAgLy8gU2V0IHRoZSBjdXJyZW50IHdlaWdodCB0byB0aGUgbmV4dCBsb3dlciB3ZWlnaHQuXG4gICAgICAgIHRoaXNba0N1cnJlbnRXZWlnaHRdID0gdGhpc1trQ3VycmVudFdlaWdodF0gLSB0aGlzW2tHcmVhdGVzdENvbW1vbkRpdmlzb3JdXG5cbiAgICAgICAgaWYgKHRoaXNba0N1cnJlbnRXZWlnaHRdIDw9IDApIHtcbiAgICAgICAgICB0aGlzW2tDdXJyZW50V2VpZ2h0XSA9IHRoaXNba01heFdlaWdodFBlclNlcnZlcl1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHBvb2xba1dlaWdodF0gPj0gdGhpc1trQ3VycmVudFdlaWdodF0gJiYgKCFwb29sW2tOZWVkRHJhaW5dKSkge1xuICAgICAgICByZXR1cm4gcG9vbFxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXNba0N1cnJlbnRXZWlnaHRdID0gdGhpc1trQ2xpZW50c11bbWF4V2VpZ2h0SW5kZXhdW2tXZWlnaHRdXG4gICAgdGhpc1trSW5kZXhdID0gbWF4V2VpZ2h0SW5kZXhcbiAgICByZXR1cm4gdGhpc1trQ2xpZW50c11bbWF4V2VpZ2h0SW5kZXhdXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBCYWxhbmNlZFBvb2xcbiIsIid1c2Ugc3RyaWN0J1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgZmlsZTogb25seSBmb3IgTm9kZSAxMiAqL1xuXG5jb25zdCB7IGtDb25uZWN0ZWQsIGtTaXplIH0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuXG5jbGFzcyBDb21wYXRXZWFrUmVmIHtcbiAgY29uc3RydWN0b3IgKHZhbHVlKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gIH1cblxuICBkZXJlZiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVba0Nvbm5lY3RlZF0gPT09IDAgJiYgdGhpcy52YWx1ZVtrU2l6ZV0gPT09IDBcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IHRoaXMudmFsdWVcbiAgfVxufVxuXG5jbGFzcyBDb21wYXRGaW5hbGl6ZXIge1xuICBjb25zdHJ1Y3RvciAoZmluYWxpemVyKSB7XG4gICAgdGhpcy5maW5hbGl6ZXIgPSBmaW5hbGl6ZXJcbiAgfVxuXG4gIHJlZ2lzdGVyIChkaXNwYXRjaGVyLCBrZXkpIHtcbiAgICBpZiAoZGlzcGF0Y2hlci5vbikge1xuICAgICAgZGlzcGF0Y2hlci5vbignZGlzY29ubmVjdCcsICgpID0+IHtcbiAgICAgICAgaWYgKGRpc3BhdGNoZXJba0Nvbm5lY3RlZF0gPT09IDAgJiYgZGlzcGF0Y2hlcltrU2l6ZV0gPT09IDApIHtcbiAgICAgICAgICB0aGlzLmZpbmFsaXplcihrZXkpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICAvLyBGSVhNRTogcmVtb3ZlIHdvcmthcm91bmQgd2hlbiB0aGUgTm9kZSBidWcgaXMgZml4ZWRcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy80OTM0NCNpc3N1ZWNvbW1lbnQtMTc0MTc3NjMwOFxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9WOF9DT1ZFUkFHRSkge1xuICAgIHJldHVybiB7XG4gICAgICBXZWFrUmVmOiBDb21wYXRXZWFrUmVmLFxuICAgICAgRmluYWxpemF0aW9uUmVnaXN0cnk6IENvbXBhdEZpbmFsaXplclxuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIFdlYWtSZWY6IGdsb2JhbC5XZWFrUmVmIHx8IENvbXBhdFdlYWtSZWYsXG4gICAgRmluYWxpemF0aW9uUmVnaXN0cnk6IGdsb2JhbC5GaW5hbGl6YXRpb25SZWdpc3RyeSB8fCBDb21wYXRGaW5hbGl6ZXJcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IHJlcXVpcmUoJy4vY29yZS9lcnJvcnMnKVxuY29uc3QgeyBrQ2xpZW50cywga1J1bm5pbmcsIGtDbG9zZSwga0Rlc3Ryb3ksIGtEaXNwYXRjaCwga0ludGVyY2VwdG9ycyB9ID0gcmVxdWlyZSgnLi9jb3JlL3N5bWJvbHMnKVxuY29uc3QgRGlzcGF0Y2hlckJhc2UgPSByZXF1aXJlKCcuL2Rpc3BhdGNoZXItYmFzZScpXG5jb25zdCBQb29sID0gcmVxdWlyZSgnLi9wb29sJylcbmNvbnN0IENsaWVudCA9IHJlcXVpcmUoJy4vY2xpZW50JylcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuL2NvcmUvdXRpbCcpXG5jb25zdCBjcmVhdGVSZWRpcmVjdEludGVyY2VwdG9yID0gcmVxdWlyZSgnLi9pbnRlcmNlcHRvci9yZWRpcmVjdEludGVyY2VwdG9yJylcbmNvbnN0IHsgV2Vha1JlZiwgRmluYWxpemF0aW9uUmVnaXN0cnkgfSA9IHJlcXVpcmUoJy4vY29tcGF0L2Rpc3BhdGNoZXItd2Vha3JlZicpKClcblxuY29uc3Qga09uQ29ubmVjdCA9IFN5bWJvbCgnb25Db25uZWN0JylcbmNvbnN0IGtPbkRpc2Nvbm5lY3QgPSBTeW1ib2woJ29uRGlzY29ubmVjdCcpXG5jb25zdCBrT25Db25uZWN0aW9uRXJyb3IgPSBTeW1ib2woJ29uQ29ubmVjdGlvbkVycm9yJylcbmNvbnN0IGtNYXhSZWRpcmVjdGlvbnMgPSBTeW1ib2woJ21heFJlZGlyZWN0aW9ucycpXG5jb25zdCBrT25EcmFpbiA9IFN5bWJvbCgnb25EcmFpbicpXG5jb25zdCBrRmFjdG9yeSA9IFN5bWJvbCgnZmFjdG9yeScpXG5jb25zdCBrRmluYWxpemVyID0gU3ltYm9sKCdmaW5hbGl6ZXInKVxuY29uc3Qga09wdGlvbnMgPSBTeW1ib2woJ29wdGlvbnMnKVxuXG5mdW5jdGlvbiBkZWZhdWx0RmFjdG9yeSAob3JpZ2luLCBvcHRzKSB7XG4gIHJldHVybiBvcHRzICYmIG9wdHMuY29ubmVjdGlvbnMgPT09IDFcbiAgICA/IG5ldyBDbGllbnQob3JpZ2luLCBvcHRzKVxuICAgIDogbmV3IFBvb2wob3JpZ2luLCBvcHRzKVxufVxuXG5jbGFzcyBBZ2VudCBleHRlbmRzIERpc3BhdGNoZXJCYXNlIHtcbiAgY29uc3RydWN0b3IgKHsgZmFjdG9yeSA9IGRlZmF1bHRGYWN0b3J5LCBtYXhSZWRpcmVjdGlvbnMgPSAwLCBjb25uZWN0LCAuLi5vcHRpb25zIH0gPSB7fSkge1xuICAgIHN1cGVyKClcblxuICAgIGlmICh0eXBlb2YgZmFjdG9yeSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdmYWN0b3J5IG11c3QgYmUgYSBmdW5jdGlvbi4nKVxuICAgIH1cblxuICAgIGlmIChjb25uZWN0ICE9IG51bGwgJiYgdHlwZW9mIGNvbm5lY3QgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGNvbm5lY3QgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2Nvbm5lY3QgbXVzdCBiZSBhIGZ1bmN0aW9uIG9yIGFuIG9iamVjdCcpXG4gICAgfVxuXG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG1heFJlZGlyZWN0aW9ucykgfHwgbWF4UmVkaXJlY3Rpb25zIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdtYXhSZWRpcmVjdGlvbnMgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpXG4gICAgfVxuXG4gICAgaWYgKGNvbm5lY3QgJiYgdHlwZW9mIGNvbm5lY3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbm5lY3QgPSB7IC4uLmNvbm5lY3QgfVxuICAgIH1cblxuICAgIHRoaXNba0ludGVyY2VwdG9yc10gPSBvcHRpb25zLmludGVyY2VwdG9ycyAmJiBvcHRpb25zLmludGVyY2VwdG9ycy5BZ2VudCAmJiBBcnJheS5pc0FycmF5KG9wdGlvbnMuaW50ZXJjZXB0b3JzLkFnZW50KVxuICAgICAgPyBvcHRpb25zLmludGVyY2VwdG9ycy5BZ2VudFxuICAgICAgOiBbY3JlYXRlUmVkaXJlY3RJbnRlcmNlcHRvcih7IG1heFJlZGlyZWN0aW9ucyB9KV1cblxuICAgIHRoaXNba09wdGlvbnNdID0geyAuLi51dGlsLmRlZXBDbG9uZShvcHRpb25zKSwgY29ubmVjdCB9XG4gICAgdGhpc1trT3B0aW9uc10uaW50ZXJjZXB0b3JzID0gb3B0aW9ucy5pbnRlcmNlcHRvcnNcbiAgICAgID8geyAuLi5vcHRpb25zLmludGVyY2VwdG9ycyB9XG4gICAgICA6IHVuZGVmaW5lZFxuICAgIHRoaXNba01heFJlZGlyZWN0aW9uc10gPSBtYXhSZWRpcmVjdGlvbnNcbiAgICB0aGlzW2tGYWN0b3J5XSA9IGZhY3RvcnlcbiAgICB0aGlzW2tDbGllbnRzXSA9IG5ldyBNYXAoKVxuICAgIHRoaXNba0ZpbmFsaXplcl0gPSBuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGdjIGlzIHVuZGV0ZXJtaW5pc3RpYyAqLyBrZXkgPT4ge1xuICAgICAgY29uc3QgcmVmID0gdGhpc1trQ2xpZW50c10uZ2V0KGtleSlcbiAgICAgIGlmIChyZWYgIT09IHVuZGVmaW5lZCAmJiByZWYuZGVyZWYoKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXNba0NsaWVudHNdLmRlbGV0ZShrZXkpXG4gICAgICB9XG4gICAgfSlcblxuICAgIGNvbnN0IGFnZW50ID0gdGhpc1xuXG4gICAgdGhpc1trT25EcmFpbl0gPSAob3JpZ2luLCB0YXJnZXRzKSA9PiB7XG4gICAgICBhZ2VudC5lbWl0KCdkcmFpbicsIG9yaWdpbiwgW2FnZW50LCAuLi50YXJnZXRzXSlcbiAgICB9XG5cbiAgICB0aGlzW2tPbkNvbm5lY3RdID0gKG9yaWdpbiwgdGFyZ2V0cykgPT4ge1xuICAgICAgYWdlbnQuZW1pdCgnY29ubmVjdCcsIG9yaWdpbiwgW2FnZW50LCAuLi50YXJnZXRzXSlcbiAgICB9XG5cbiAgICB0aGlzW2tPbkRpc2Nvbm5lY3RdID0gKG9yaWdpbiwgdGFyZ2V0cywgZXJyKSA9PiB7XG4gICAgICBhZ2VudC5lbWl0KCdkaXNjb25uZWN0Jywgb3JpZ2luLCBbYWdlbnQsIC4uLnRhcmdldHNdLCBlcnIpXG4gICAgfVxuXG4gICAgdGhpc1trT25Db25uZWN0aW9uRXJyb3JdID0gKG9yaWdpbiwgdGFyZ2V0cywgZXJyKSA9PiB7XG4gICAgICBhZ2VudC5lbWl0KCdjb25uZWN0aW9uRXJyb3InLCBvcmlnaW4sIFthZ2VudCwgLi4udGFyZ2V0c10sIGVycilcbiAgICB9XG4gIH1cblxuICBnZXQgW2tSdW5uaW5nXSAoKSB7XG4gICAgbGV0IHJldCA9IDBcbiAgICBmb3IgKGNvbnN0IHJlZiBvZiB0aGlzW2tDbGllbnRzXS52YWx1ZXMoKSkge1xuICAgICAgY29uc3QgY2xpZW50ID0gcmVmLmRlcmVmKClcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBnYyBpcyB1bmRldGVybWluaXN0aWMgKi9cbiAgICAgIGlmIChjbGllbnQpIHtcbiAgICAgICAgcmV0ICs9IGNsaWVudFtrUnVubmluZ11cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldFxuICB9XG5cbiAgW2tEaXNwYXRjaF0gKG9wdHMsIGhhbmRsZXIpIHtcbiAgICBsZXQga2V5XG4gICAgaWYgKG9wdHMub3JpZ2luICYmICh0eXBlb2Ygb3B0cy5vcmlnaW4gPT09ICdzdHJpbmcnIHx8IG9wdHMub3JpZ2luIGluc3RhbmNlb2YgVVJMKSkge1xuICAgICAga2V5ID0gU3RyaW5nKG9wdHMub3JpZ2luKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ29wdHMub3JpZ2luIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIG9yIFVSTC4nKVxuICAgIH1cblxuICAgIGNvbnN0IHJlZiA9IHRoaXNba0NsaWVudHNdLmdldChrZXkpXG5cbiAgICBsZXQgZGlzcGF0Y2hlciA9IHJlZiA/IHJlZi5kZXJlZigpIDogbnVsbFxuICAgIGlmICghZGlzcGF0Y2hlcikge1xuICAgICAgZGlzcGF0Y2hlciA9IHRoaXNba0ZhY3RvcnldKG9wdHMub3JpZ2luLCB0aGlzW2tPcHRpb25zXSlcbiAgICAgICAgLm9uKCdkcmFpbicsIHRoaXNba09uRHJhaW5dKVxuICAgICAgICAub24oJ2Nvbm5lY3QnLCB0aGlzW2tPbkNvbm5lY3RdKVxuICAgICAgICAub24oJ2Rpc2Nvbm5lY3QnLCB0aGlzW2tPbkRpc2Nvbm5lY3RdKVxuICAgICAgICAub24oJ2Nvbm5lY3Rpb25FcnJvcicsIHRoaXNba09uQ29ubmVjdGlvbkVycm9yXSlcblxuICAgICAgdGhpc1trQ2xpZW50c10uc2V0KGtleSwgbmV3IFdlYWtSZWYoZGlzcGF0Y2hlcikpXG4gICAgICB0aGlzW2tGaW5hbGl6ZXJdLnJlZ2lzdGVyKGRpc3BhdGNoZXIsIGtleSlcbiAgICB9XG5cbiAgICByZXR1cm4gZGlzcGF0Y2hlci5kaXNwYXRjaChvcHRzLCBoYW5kbGVyKVxuICB9XG5cbiAgYXN5bmMgW2tDbG9zZV0gKCkge1xuICAgIGNvbnN0IGNsb3NlUHJvbWlzZXMgPSBbXVxuICAgIGZvciAoY29uc3QgcmVmIG9mIHRoaXNba0NsaWVudHNdLnZhbHVlcygpKSB7XG4gICAgICBjb25zdCBjbGllbnQgPSByZWYuZGVyZWYoKVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2U6IGdjIGlzIHVuZGV0ZXJtaW5pc3RpYyAqL1xuICAgICAgaWYgKGNsaWVudCkge1xuICAgICAgICBjbG9zZVByb21pc2VzLnB1c2goY2xpZW50LmNsb3NlKCkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoY2xvc2VQcm9taXNlcylcbiAgfVxuXG4gIGFzeW5jIFtrRGVzdHJveV0gKGVycikge1xuICAgIGNvbnN0IGRlc3Ryb3lQcm9taXNlcyA9IFtdXG4gICAgZm9yIChjb25zdCByZWYgb2YgdGhpc1trQ2xpZW50c10udmFsdWVzKCkpIHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IHJlZi5kZXJlZigpXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZTogZ2MgaXMgdW5kZXRlcm1pbmlzdGljICovXG4gICAgICBpZiAoY2xpZW50KSB7XG4gICAgICAgIGRlc3Ryb3lQcm9taXNlcy5wdXNoKGNsaWVudC5kZXN0cm95KGVycikpXG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoZGVzdHJveVByb21pc2VzKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQWdlbnRcbiIsIi8vIFBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL3B1bGwvOTA3XG5cbid1c2Ugc3RyaWN0J1xuXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuY29uc3QgeyBSZWFkYWJsZSB9ID0gcmVxdWlyZSgnc3RyZWFtJylcbmNvbnN0IHsgUmVxdWVzdEFib3J0ZWRFcnJvciwgTm90U3VwcG9ydGVkRXJyb3IsIEludmFsaWRBcmd1bWVudEVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgUmVhZGFibGVTdHJlYW1Gcm9tLCB0b1VTVlN0cmluZyB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcblxubGV0IEJsb2JcblxuY29uc3Qga0NvbnN1bWUgPSBTeW1ib2woJ2tDb25zdW1lJylcbmNvbnN0IGtSZWFkaW5nID0gU3ltYm9sKCdrUmVhZGluZycpXG5jb25zdCBrQm9keSA9IFN5bWJvbCgna0JvZHknKVxuY29uc3Qga0Fib3J0ID0gU3ltYm9sKCdhYm9ydCcpXG5jb25zdCBrQ29udGVudFR5cGUgPSBTeW1ib2woJ2tDb250ZW50VHlwZScpXG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7fVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIEJvZHlSZWFkYWJsZSBleHRlbmRzIFJlYWRhYmxlIHtcbiAgY29uc3RydWN0b3IgKHtcbiAgICByZXN1bWUsXG4gICAgYWJvcnQsXG4gICAgY29udGVudFR5cGUgPSAnJyxcbiAgICBoaWdoV2F0ZXJNYXJrID0gNjQgKiAxMDI0IC8vIFNhbWUgYXMgbm9kZWpzIGZzIHN0cmVhbXMuXG4gIH0pIHtcbiAgICBzdXBlcih7XG4gICAgICBhdXRvRGVzdHJveTogdHJ1ZSxcbiAgICAgIHJlYWQ6IHJlc3VtZSxcbiAgICAgIGhpZ2hXYXRlck1hcmtcbiAgICB9KVxuXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kYXRhRW1pdHRlZCA9IGZhbHNlXG5cbiAgICB0aGlzW2tBYm9ydF0gPSBhYm9ydFxuICAgIHRoaXNba0NvbnN1bWVdID0gbnVsbFxuICAgIHRoaXNba0JvZHldID0gbnVsbFxuICAgIHRoaXNba0NvbnRlbnRUeXBlXSA9IGNvbnRlbnRUeXBlXG5cbiAgICAvLyBJcyBzdHJlYW0gYmVpbmcgY29uc3VtZWQgdGhyb3VnaCBSZWFkYWJsZSBBUEk/XG4gICAgLy8gVGhpcyBpcyBhbiBvcHRpbWl6YXRpb24gc28gdGhhdCB3ZSBhdm9pZCBjaGVja2luZ1xuICAgIC8vIGZvciAnZGF0YScgYW5kICdyZWFkYWJsZScgbGlzdGVuZXJzIGluIHRoZSBob3QgcGF0aFxuICAgIC8vIGluc2lkZSBwdXNoKCkuXG4gICAgdGhpc1trUmVhZGluZ10gPSBmYWxzZVxuICB9XG5cbiAgZGVzdHJveSAoZXJyKSB7XG4gICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAvLyBOb2RlIDwgMTZcbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgaWYgKCFlcnIgJiYgIXRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCkge1xuICAgICAgZXJyID0gbmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoKVxuICAgIH1cblxuICAgIGlmIChlcnIpIHtcbiAgICAgIHRoaXNba0Fib3J0XSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLmRlc3Ryb3koZXJyKVxuICB9XG5cbiAgZW1pdCAoZXYsIC4uLmFyZ3MpIHtcbiAgICBpZiAoZXYgPT09ICdkYXRhJykge1xuICAgICAgLy8gTm9kZSA8IDE2LjdcbiAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGF0YUVtaXR0ZWQgPSB0cnVlXG4gICAgfSBlbHNlIGlmIChldiA9PT0gJ2Vycm9yJykge1xuICAgICAgLy8gTm9kZSA8IDE2XG4gICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWVcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLmVtaXQoZXYsIC4uLmFyZ3MpXG4gIH1cblxuICBvbiAoZXYsIC4uLmFyZ3MpIHtcbiAgICBpZiAoZXYgPT09ICdkYXRhJyB8fCBldiA9PT0gJ3JlYWRhYmxlJykge1xuICAgICAgdGhpc1trUmVhZGluZ10gPSB0cnVlXG4gICAgfVxuICAgIHJldHVybiBzdXBlci5vbihldiwgLi4uYXJncylcbiAgfVxuXG4gIGFkZExpc3RlbmVyIChldiwgLi4uYXJncykge1xuICAgIHJldHVybiB0aGlzLm9uKGV2LCAuLi5hcmdzKVxuICB9XG5cbiAgb2ZmIChldiwgLi4uYXJncykge1xuICAgIGNvbnN0IHJldCA9IHN1cGVyLm9mZihldiwgLi4uYXJncylcbiAgICBpZiAoZXYgPT09ICdkYXRhJyB8fCBldiA9PT0gJ3JlYWRhYmxlJykge1xuICAgICAgdGhpc1trUmVhZGluZ10gPSAoXG4gICAgICAgIHRoaXMubGlzdGVuZXJDb3VudCgnZGF0YScpID4gMCB8fFxuICAgICAgICB0aGlzLmxpc3RlbmVyQ291bnQoJ3JlYWRhYmxlJykgPiAwXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiByZXRcbiAgfVxuXG4gIHJlbW92ZUxpc3RlbmVyIChldiwgLi4uYXJncykge1xuICAgIHJldHVybiB0aGlzLm9mZihldiwgLi4uYXJncylcbiAgfVxuXG4gIHB1c2ggKGNodW5rKSB7XG4gICAgaWYgKHRoaXNba0NvbnN1bWVdICYmIGNodW5rICE9PSBudWxsICYmIHRoaXMucmVhZGFibGVMZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN1bWVQdXNoKHRoaXNba0NvbnN1bWVdLCBjaHVuaylcbiAgICAgIHJldHVybiB0aGlzW2tSZWFkaW5nXSA/IHN1cGVyLnB1c2goY2h1bmspIDogdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gc3VwZXIucHVzaChjaHVuaylcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkb20tYm9keS10ZXh0XG4gIGFzeW5jIHRleHQgKCkge1xuICAgIHJldHVybiBjb25zdW1lKHRoaXMsICd0ZXh0JylcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkb20tYm9keS1qc29uXG4gIGFzeW5jIGpzb24gKCkge1xuICAgIHJldHVybiBjb25zdW1lKHRoaXMsICdqc29uJylcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkb20tYm9keS1ibG9iXG4gIGFzeW5jIGJsb2IgKCkge1xuICAgIHJldHVybiBjb25zdW1lKHRoaXMsICdibG9iJylcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkb20tYm9keS1hcnJheWJ1ZmZlclxuICBhc3luYyBhcnJheUJ1ZmZlciAoKSB7XG4gICAgcmV0dXJuIGNvbnN1bWUodGhpcywgJ2FycmF5QnVmZmVyJylcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkb20tYm9keS1mb3JtZGF0YVxuICBhc3luYyBmb3JtRGF0YSAoKSB7XG4gICAgLy8gVE9ETzogSW1wbGVtZW50LlxuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFcnJvcigpXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWJvZHktYm9keXVzZWRcbiAgZ2V0IGJvZHlVc2VkICgpIHtcbiAgICByZXR1cm4gdXRpbC5pc0Rpc3R1cmJlZCh0aGlzKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ib2R5LWJvZHlcbiAgZ2V0IGJvZHkgKCkge1xuICAgIGlmICghdGhpc1trQm9keV0pIHtcbiAgICAgIHRoaXNba0JvZHldID0gUmVhZGFibGVTdHJlYW1Gcm9tKHRoaXMpXG4gICAgICBpZiAodGhpc1trQ29uc3VtZV0pIHtcbiAgICAgICAgLy8gVE9ETzogSXMgdGhpcyB0aGUgYmVzdCB3YXkgdG8gZm9yY2UgYSBsb2NrP1xuICAgICAgICB0aGlzW2tCb2R5XS5nZXRSZWFkZXIoKSAvLyBFbnN1cmUgc3RyZWFtIGlzIGxvY2tlZC5cbiAgICAgICAgYXNzZXJ0KHRoaXNba0JvZHldLmxvY2tlZClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXNba0JvZHldXG4gIH1cblxuICBkdW1wIChvcHRzKSB7XG4gICAgbGV0IGxpbWl0ID0gb3B0cyAmJiBOdW1iZXIuaXNGaW5pdGUob3B0cy5saW1pdCkgPyBvcHRzLmxpbWl0IDogMjYyMTQ0XG4gICAgY29uc3Qgc2lnbmFsID0gb3B0cyAmJiBvcHRzLnNpZ25hbFxuXG4gICAgaWYgKHNpZ25hbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzaWduYWwgIT09ICdvYmplY3QnIHx8ICEoJ2Fib3J0ZWQnIGluIHNpZ25hbCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3NpZ25hbCBtdXN0IGJlIGFuIEFib3J0U2lnbmFsJylcbiAgICAgICAgfVxuICAgICAgICB1dGlsLnRocm93SWZBYm9ydGVkKHNpZ25hbClcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzaWduYWxMaXN0ZW5lckNsZWFudXAgPSBzaWduYWxcbiAgICAgICAgPyB1dGlsLmFkZEFib3J0TGlzdGVuZXIoc2lnbmFsLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5kZXN0cm95KClcbiAgICAgICAgfSlcbiAgICAgICAgOiBub29wXG5cbiAgICAgIHRoaXNcbiAgICAgICAgLm9uKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzaWduYWxMaXN0ZW5lckNsZWFudXAoKVxuICAgICAgICAgIGlmIChzaWduYWwgJiYgc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgIHJlamVjdChzaWduYWwucmVhc29uIHx8IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKCdUaGUgb3BlcmF0aW9uIHdhcyBhYm9ydGVkJyksIHsgbmFtZTogJ0Fib3J0RXJyb3InIH0pKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKG51bGwpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAub24oJ2Vycm9yJywgbm9vcClcbiAgICAgICAgLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICAgICAgbGltaXQgLT0gY2h1bmsubGVuZ3RoXG4gICAgICAgICAgaWYgKGxpbWl0IDw9IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAucmVzdW1lKClcbiAgICB9KVxuICB9XG59XG5cbi8vIGh0dHBzOi8vc3RyZWFtcy5zcGVjLndoYXR3Zy5vcmcvI3JlYWRhYmxlc3RyZWFtLWxvY2tlZFxuZnVuY3Rpb24gaXNMb2NrZWQgKHNlbGYpIHtcbiAgLy8gQ29uc3VtZSBpcyBhbiBpbXBsaWNpdCBsb2NrLlxuICByZXR1cm4gKHNlbGZba0JvZHldICYmIHNlbGZba0JvZHldLmxvY2tlZCA9PT0gdHJ1ZSkgfHwgc2VsZltrQ29uc3VtZV1cbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2JvZHktdW51c2FibGVcbmZ1bmN0aW9uIGlzVW51c2FibGUgKHNlbGYpIHtcbiAgcmV0dXJuIHV0aWwuaXNEaXN0dXJiZWQoc2VsZikgfHwgaXNMb2NrZWQoc2VsZilcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29uc3VtZSAoc3RyZWFtLCB0eXBlKSB7XG4gIGlmIChpc1VudXNhYmxlKHN0cmVhbSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd1bnVzYWJsZScpXG4gIH1cblxuICBhc3NlcnQoIXN0cmVhbVtrQ29uc3VtZV0pXG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBzdHJlYW1ba0NvbnN1bWVdID0ge1xuICAgICAgdHlwZSxcbiAgICAgIHN0cmVhbSxcbiAgICAgIHJlc29sdmUsXG4gICAgICByZWplY3QsXG4gICAgICBsZW5ndGg6IDAsXG4gICAgICBib2R5OiBbXVxuICAgIH1cblxuICAgIHN0cmVhbVxuICAgICAgLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgY29uc3VtZUZpbmlzaCh0aGlzW2tDb25zdW1lXSwgZXJyKVxuICAgICAgfSlcbiAgICAgIC5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzW2tDb25zdW1lXS5ib2R5ICE9PSBudWxsKSB7XG4gICAgICAgICAgY29uc3VtZUZpbmlzaCh0aGlzW2tDb25zdW1lXSwgbmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoKSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgIHByb2Nlc3MubmV4dFRpY2soY29uc3VtZVN0YXJ0LCBzdHJlYW1ba0NvbnN1bWVdKVxuICB9KVxufVxuXG5mdW5jdGlvbiBjb25zdW1lU3RhcnQgKGNvbnN1bWUpIHtcbiAgaWYgKGNvbnN1bWUuYm9keSA9PT0gbnVsbCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgeyBfcmVhZGFibGVTdGF0ZTogc3RhdGUgfSA9IGNvbnN1bWUuc3RyZWFtXG5cbiAgZm9yIChjb25zdCBjaHVuayBvZiBzdGF0ZS5idWZmZXIpIHtcbiAgICBjb25zdW1lUHVzaChjb25zdW1lLCBjaHVuaylcbiAgfVxuXG4gIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgY29uc3VtZUVuZCh0aGlzW2tDb25zdW1lXSlcbiAgfSBlbHNlIHtcbiAgICBjb25zdW1lLnN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3VtZUVuZCh0aGlzW2tDb25zdW1lXSlcbiAgICB9KVxuICB9XG5cbiAgY29uc3VtZS5zdHJlYW0ucmVzdW1lKClcblxuICB3aGlsZSAoY29uc3VtZS5zdHJlYW0ucmVhZCgpICE9IG51bGwpIHtcbiAgICAvLyBMb29wXG4gIH1cbn1cblxuZnVuY3Rpb24gY29uc3VtZUVuZCAoY29uc3VtZSkge1xuICBjb25zdCB7IHR5cGUsIGJvZHksIHJlc29sdmUsIHN0cmVhbSwgbGVuZ3RoIH0gPSBjb25zdW1lXG5cbiAgdHJ5IHtcbiAgICBpZiAodHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICByZXNvbHZlKHRvVVNWU3RyaW5nKEJ1ZmZlci5jb25jYXQoYm9keSkpKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2pzb24nKSB7XG4gICAgICByZXNvbHZlKEpTT04ucGFyc2UoQnVmZmVyLmNvbmNhdChib2R5KSkpXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnYXJyYXlCdWZmZXInKSB7XG4gICAgICBjb25zdCBkc3QgPSBuZXcgVWludDhBcnJheShsZW5ndGgpXG5cbiAgICAgIGxldCBwb3MgPSAwXG4gICAgICBmb3IgKGNvbnN0IGJ1ZiBvZiBib2R5KSB7XG4gICAgICAgIGRzdC5zZXQoYnVmLCBwb3MpXG4gICAgICAgIHBvcyArPSBidWYuYnl0ZUxlbmd0aFxuICAgICAgfVxuXG4gICAgICByZXNvbHZlKGRzdC5idWZmZXIpXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnYmxvYicpIHtcbiAgICAgIGlmICghQmxvYikge1xuICAgICAgICBCbG9iID0gcmVxdWlyZSgnYnVmZmVyJykuQmxvYlxuICAgICAgfVxuICAgICAgcmVzb2x2ZShuZXcgQmxvYihib2R5LCB7IHR5cGU6IHN0cmVhbVtrQ29udGVudFR5cGVdIH0pKVxuICAgIH1cblxuICAgIGNvbnN1bWVGaW5pc2goY29uc3VtZSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgc3RyZWFtLmRlc3Ryb3koZXJyKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnN1bWVQdXNoIChjb25zdW1lLCBjaHVuaykge1xuICBjb25zdW1lLmxlbmd0aCArPSBjaHVuay5sZW5ndGhcbiAgY29uc3VtZS5ib2R5LnB1c2goY2h1bmspXG59XG5cbmZ1bmN0aW9uIGNvbnN1bWVGaW5pc2ggKGNvbnN1bWUsIGVycikge1xuICBpZiAoY29uc3VtZS5ib2R5ID09PSBudWxsKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoZXJyKSB7XG4gICAgY29uc3VtZS5yZWplY3QoZXJyKVxuICB9IGVsc2Uge1xuICAgIGNvbnN1bWUucmVzb2x2ZSgpXG4gIH1cblxuICBjb25zdW1lLnR5cGUgPSBudWxsXG4gIGNvbnN1bWUuc3RyZWFtID0gbnVsbFxuICBjb25zdW1lLnJlc29sdmUgPSBudWxsXG4gIGNvbnN1bWUucmVqZWN0ID0gbnVsbFxuICBjb25zdW1lLmxlbmd0aCA9IDBcbiAgY29uc3VtZS5ib2R5ID0gbnVsbFxufVxuIiwiY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHtcbiAgUmVzcG9uc2VTdGF0dXNDb2RlRXJyb3Jcbn0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5jb25zdCB7IHRvVVNWU3RyaW5nIH0gPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuXG5hc3luYyBmdW5jdGlvbiBnZXRSZXNvbHZlRXJyb3JCb2R5Q2FsbGJhY2sgKHsgY2FsbGJhY2ssIGJvZHksIGNvbnRlbnRUeXBlLCBzdGF0dXNDb2RlLCBzdGF0dXNNZXNzYWdlLCBoZWFkZXJzIH0pIHtcbiAgYXNzZXJ0KGJvZHkpXG5cbiAgbGV0IGNodW5rcyA9IFtdXG4gIGxldCBsaW1pdCA9IDBcblxuICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIGJvZHkpIHtcbiAgICBjaHVua3MucHVzaChjaHVuaylcbiAgICBsaW1pdCArPSBjaHVuay5sZW5ndGhcbiAgICBpZiAobGltaXQgPiAxMjggKiAxMDI0KSB7XG4gICAgICBjaHVua3MgPSBudWxsXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdGF0dXNDb2RlID09PSAyMDQgfHwgIWNvbnRlbnRUeXBlIHx8ICFjaHVua3MpIHtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrLCBuZXcgUmVzcG9uc2VTdGF0dXNDb2RlRXJyb3IoYFJlc3BvbnNlIHN0YXR1cyBjb2RlICR7c3RhdHVzQ29kZX0ke3N0YXR1c01lc3NhZ2UgPyBgOiAke3N0YXR1c01lc3NhZ2V9YCA6ICcnfWAsIHN0YXR1c0NvZGUsIGhlYWRlcnMpKVxuICAgIHJldHVyblxuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAoY29udGVudFR5cGUuc3RhcnRzV2l0aCgnYXBwbGljYXRpb24vanNvbicpKSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gSlNPTi5wYXJzZSh0b1VTVlN0cmluZyhCdWZmZXIuY29uY2F0KGNodW5rcykpKVxuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjaywgbmV3IFJlc3BvbnNlU3RhdHVzQ29kZUVycm9yKGBSZXNwb25zZSBzdGF0dXMgY29kZSAke3N0YXR1c0NvZGV9JHtzdGF0dXNNZXNzYWdlID8gYDogJHtzdGF0dXNNZXNzYWdlfWAgOiAnJ31gLCBzdGF0dXNDb2RlLCBoZWFkZXJzLCBwYXlsb2FkKSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChjb250ZW50VHlwZS5zdGFydHNXaXRoKCd0ZXh0LycpKSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gdG9VU1ZTdHJpbmcoQnVmZmVyLmNvbmNhdChjaHVua3MpKVxuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjaywgbmV3IFJlc3BvbnNlU3RhdHVzQ29kZUVycm9yKGBSZXNwb25zZSBzdGF0dXMgY29kZSAke3N0YXR1c0NvZGV9JHtzdGF0dXNNZXNzYWdlID8gYDogJHtzdGF0dXNNZXNzYWdlfWAgOiAnJ31gLCBzdGF0dXNDb2RlLCBoZWFkZXJzLCBwYXlsb2FkKSlcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gUHJvY2VzcyBpbiBhIGZhbGxiYWNrIGlmIGVycm9yXG4gIH1cblxuICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrLCBuZXcgUmVzcG9uc2VTdGF0dXNDb2RlRXJyb3IoYFJlc3BvbnNlIHN0YXR1cyBjb2RlICR7c3RhdHVzQ29kZX0ke3N0YXR1c01lc3NhZ2UgPyBgOiAke3N0YXR1c01lc3NhZ2V9YCA6ICcnfWAsIHN0YXR1c0NvZGUsIGhlYWRlcnMpKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHsgZ2V0UmVzb2x2ZUVycm9yQm9keUNhbGxiYWNrIH1cbiIsImNvbnN0IHsgYWRkQWJvcnRMaXN0ZW5lciB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgUmVxdWVzdEFib3J0ZWRFcnJvciB9ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMnKVxuXG5jb25zdCBrTGlzdGVuZXIgPSBTeW1ib2woJ2tMaXN0ZW5lcicpXG5jb25zdCBrU2lnbmFsID0gU3ltYm9sKCdrU2lnbmFsJylcblxuZnVuY3Rpb24gYWJvcnQgKHNlbGYpIHtcbiAgaWYgKHNlbGYuYWJvcnQpIHtcbiAgICBzZWxmLmFib3J0KClcbiAgfSBlbHNlIHtcbiAgICBzZWxmLm9uRXJyb3IobmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoKSlcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRTaWduYWwgKHNlbGYsIHNpZ25hbCkge1xuICBzZWxmW2tTaWduYWxdID0gbnVsbFxuICBzZWxmW2tMaXN0ZW5lcl0gPSBudWxsXG5cbiAgaWYgKCFzaWduYWwpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgIGFib3J0KHNlbGYpXG4gICAgcmV0dXJuXG4gIH1cblxuICBzZWxmW2tTaWduYWxdID0gc2lnbmFsXG4gIHNlbGZba0xpc3RlbmVyXSA9ICgpID0+IHtcbiAgICBhYm9ydChzZWxmKVxuICB9XG5cbiAgYWRkQWJvcnRMaXN0ZW5lcihzZWxmW2tTaWduYWxdLCBzZWxmW2tMaXN0ZW5lcl0pXG59XG5cbmZ1bmN0aW9uIHJlbW92ZVNpZ25hbCAoc2VsZikge1xuICBpZiAoIXNlbGZba1NpZ25hbF0pIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmICgncmVtb3ZlRXZlbnRMaXN0ZW5lcicgaW4gc2VsZltrU2lnbmFsXSkge1xuICAgIHNlbGZba1NpZ25hbF0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBzZWxmW2tMaXN0ZW5lcl0pXG4gIH0gZWxzZSB7XG4gICAgc2VsZltrU2lnbmFsXS5yZW1vdmVMaXN0ZW5lcignYWJvcnQnLCBzZWxmW2tMaXN0ZW5lcl0pXG4gIH1cblxuICBzZWxmW2tTaWduYWxdID0gbnVsbFxuICBzZWxmW2tMaXN0ZW5lcl0gPSBudWxsXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhZGRTaWduYWwsXG4gIHJlbW92ZVNpZ25hbFxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFJlYWRhYmxlID0gcmVxdWlyZSgnLi9yZWFkYWJsZScpXG5jb25zdCB7XG4gIEludmFsaWRBcmd1bWVudEVycm9yLFxuICBSZXF1ZXN0QWJvcnRlZEVycm9yXG59ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMnKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5jb25zdCB7IGdldFJlc29sdmVFcnJvckJvZHlDYWxsYmFjayB9ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHsgQXN5bmNSZXNvdXJjZSB9ID0gcmVxdWlyZSgnYXN5bmNfaG9va3MnKVxuY29uc3QgeyBhZGRTaWduYWwsIHJlbW92ZVNpZ25hbCB9ID0gcmVxdWlyZSgnLi9hYm9ydC1zaWduYWwnKVxuXG5jbGFzcyBSZXF1ZXN0SGFuZGxlciBleHRlbmRzIEFzeW5jUmVzb3VyY2Uge1xuICBjb25zdHJ1Y3RvciAob3B0cywgY2FsbGJhY2spIHtcbiAgICBpZiAoIW9wdHMgfHwgdHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgb3B0cycpXG4gICAgfVxuXG4gICAgY29uc3QgeyBzaWduYWwsIG1ldGhvZCwgb3BhcXVlLCBib2R5LCBvbkluZm8sIHJlc3BvbnNlSGVhZGVycywgdGhyb3dPbkVycm9yLCBoaWdoV2F0ZXJNYXJrIH0gPSBvcHRzXG5cbiAgICB0cnkge1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgY2FsbGJhY2snKVxuICAgICAgfVxuXG4gICAgICBpZiAoaGlnaFdhdGVyTWFyayAmJiAodHlwZW9mIGhpZ2hXYXRlck1hcmsgIT09ICdudW1iZXInIHx8IGhpZ2hXYXRlck1hcmsgPCAwKSkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgaGlnaFdhdGVyTWFyaycpXG4gICAgICB9XG5cbiAgICAgIGlmIChzaWduYWwgJiYgdHlwZW9mIHNpZ25hbC5vbiAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdzaWduYWwgbXVzdCBiZSBhbiBFdmVudEVtaXR0ZXIgb3IgRXZlbnRUYXJnZXQnKVxuICAgICAgfVxuXG4gICAgICBpZiAobWV0aG9kID09PSAnQ09OTkVDVCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG1ldGhvZCcpXG4gICAgICB9XG5cbiAgICAgIGlmIChvbkluZm8gJiYgdHlwZW9mIG9uSW5mbyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgb25JbmZvIGNhbGxiYWNrJylcbiAgICAgIH1cblxuICAgICAgc3VwZXIoJ1VORElDSV9SRVFVRVNUJylcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmICh1dGlsLmlzU3RyZWFtKGJvZHkpKSB7XG4gICAgICAgIHV0aWwuZGVzdHJveShib2R5Lm9uKCdlcnJvcicsIHV0aWwubm9wKSwgZXJyKVxuICAgICAgfVxuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuXG4gICAgdGhpcy5yZXNwb25zZUhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMgfHwgbnVsbFxuICAgIHRoaXMub3BhcXVlID0gb3BhcXVlIHx8IG51bGxcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2tcbiAgICB0aGlzLnJlcyA9IG51bGxcbiAgICB0aGlzLmFib3J0ID0gbnVsbFxuICAgIHRoaXMuYm9keSA9IGJvZHlcbiAgICB0aGlzLnRyYWlsZXJzID0ge31cbiAgICB0aGlzLmNvbnRleHQgPSBudWxsXG4gICAgdGhpcy5vbkluZm8gPSBvbkluZm8gfHwgbnVsbFxuICAgIHRoaXMudGhyb3dPbkVycm9yID0gdGhyb3dPbkVycm9yXG4gICAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaGlnaFdhdGVyTWFya1xuXG4gICAgaWYgKHV0aWwuaXNTdHJlYW0oYm9keSkpIHtcbiAgICAgIGJvZHkub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBhZGRTaWduYWwodGhpcywgc2lnbmFsKVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCwgY29udGV4dCkge1xuICAgIGlmICghdGhpcy5jYWxsYmFjaykge1xuICAgICAgdGhyb3cgbmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoKVxuICAgIH1cblxuICAgIHRoaXMuYWJvcnQgPSBhYm9ydFxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHRcbiAgfVxuXG4gIG9uSGVhZGVycyAoc3RhdHVzQ29kZSwgcmF3SGVhZGVycywgcmVzdW1lLCBzdGF0dXNNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBjYWxsYmFjaywgb3BhcXVlLCBhYm9ydCwgY29udGV4dCwgcmVzcG9uc2VIZWFkZXJzLCBoaWdoV2F0ZXJNYXJrIH0gPSB0aGlzXG5cbiAgICBjb25zdCBoZWFkZXJzID0gcmVzcG9uc2VIZWFkZXJzID09PSAncmF3JyA/IHV0aWwucGFyc2VSYXdIZWFkZXJzKHJhd0hlYWRlcnMpIDogdXRpbC5wYXJzZUhlYWRlcnMocmF3SGVhZGVycylcblxuICAgIGlmIChzdGF0dXNDb2RlIDwgMjAwKSB7XG4gICAgICBpZiAodGhpcy5vbkluZm8pIHtcbiAgICAgICAgdGhpcy5vbkluZm8oeyBzdGF0dXNDb2RlLCBoZWFkZXJzIH0pXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWRIZWFkZXJzID0gcmVzcG9uc2VIZWFkZXJzID09PSAncmF3JyA/IHV0aWwucGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpIDogaGVhZGVyc1xuICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcGFyc2VkSGVhZGVyc1snY29udGVudC10eXBlJ11cbiAgICBjb25zdCBib2R5ID0gbmV3IFJlYWRhYmxlKHsgcmVzdW1lLCBhYm9ydCwgY29udGVudFR5cGUsIGhpZ2hXYXRlck1hcmsgfSlcblxuICAgIHRoaXMuY2FsbGJhY2sgPSBudWxsXG4gICAgdGhpcy5yZXMgPSBib2R5XG4gICAgaWYgKGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICBpZiAodGhpcy50aHJvd09uRXJyb3IgJiYgc3RhdHVzQ29kZSA+PSA0MDApIHtcbiAgICAgICAgdGhpcy5ydW5JbkFzeW5jU2NvcGUoZ2V0UmVzb2x2ZUVycm9yQm9keUNhbGxiYWNrLCBudWxsLFxuICAgICAgICAgIHsgY2FsbGJhY2ssIGJvZHksIGNvbnRlbnRUeXBlLCBzdGF0dXNDb2RlLCBzdGF0dXNNZXNzYWdlLCBoZWFkZXJzIH1cbiAgICAgICAgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ydW5JbkFzeW5jU2NvcGUoY2FsbGJhY2ssIG51bGwsIG51bGwsIHtcbiAgICAgICAgICBzdGF0dXNDb2RlLFxuICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgdHJhaWxlcnM6IHRoaXMudHJhaWxlcnMsXG4gICAgICAgICAgb3BhcXVlLFxuICAgICAgICAgIGJvZHksXG4gICAgICAgICAgY29udGV4dFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uRGF0YSAoY2h1bmspIHtcbiAgICBjb25zdCB7IHJlcyB9ID0gdGhpc1xuICAgIHJldHVybiByZXMucHVzaChjaHVuaylcbiAgfVxuXG4gIG9uQ29tcGxldGUgKHRyYWlsZXJzKSB7XG4gICAgY29uc3QgeyByZXMgfSA9IHRoaXNcblxuICAgIHJlbW92ZVNpZ25hbCh0aGlzKVxuXG4gICAgdXRpbC5wYXJzZUhlYWRlcnModHJhaWxlcnMsIHRoaXMudHJhaWxlcnMpXG5cbiAgICByZXMucHVzaChudWxsKVxuICB9XG5cbiAgb25FcnJvciAoZXJyKSB7XG4gICAgY29uc3QgeyByZXMsIGNhbGxiYWNrLCBib2R5LCBvcGFxdWUgfSA9IHRoaXNcblxuICAgIHJlbW92ZVNpZ25hbCh0aGlzKVxuXG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAvLyBUT0RPOiBEb2VzIHRoaXMgbmVlZCBxdWV1ZU1pY3JvdGFzaz9cbiAgICAgIHRoaXMuY2FsbGJhY2sgPSBudWxsXG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIHRoaXMucnVuSW5Bc3luY1Njb3BlKGNhbGxiYWNrLCBudWxsLCBlcnIsIHsgb3BhcXVlIH0pXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChyZXMpIHtcbiAgICAgIHRoaXMucmVzID0gbnVsbFxuICAgICAgLy8gRW5zdXJlIGFsbCBxdWV1ZWQgaGFuZGxlcnMgYXJlIGludm9rZWQgYmVmb3JlIGRlc3Ryb3lpbmcgcmVzLlxuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICB1dGlsLmRlc3Ryb3kocmVzLCBlcnIpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChib2R5KSB7XG4gICAgICB0aGlzLmJvZHkgPSBudWxsXG4gICAgICB1dGlsLmRlc3Ryb3koYm9keSwgZXJyKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXF1ZXN0IChvcHRzLCBjYWxsYmFjaykge1xuICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICByZXF1ZXN0LmNhbGwodGhpcywgb3B0cywgKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICByZXR1cm4gZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKGRhdGEpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICB0cnkge1xuICAgIHRoaXMuZGlzcGF0Y2gob3B0cywgbmV3IFJlcXVlc3RIYW5kbGVyKG9wdHMsIGNhbGxiYWNrKSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuICAgIGNvbnN0IG9wYXF1ZSA9IG9wdHMgJiYgb3B0cy5vcGFxdWVcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBjYWxsYmFjayhlcnIsIHsgb3BhcXVlIH0pKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWVzdFxubW9kdWxlLmV4cG9ydHMuUmVxdWVzdEhhbmRsZXIgPSBSZXF1ZXN0SGFuZGxlclxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgZmluaXNoZWQsIFBhc3NUaHJvdWdoIH0gPSByZXF1aXJlKCdzdHJlYW0nKVxuY29uc3Qge1xuICBJbnZhbGlkQXJndW1lbnRFcnJvcixcbiAgSW52YWxpZFJldHVyblZhbHVlRXJyb3IsXG4gIFJlcXVlc3RBYm9ydGVkRXJyb3Jcbn0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgZ2V0UmVzb2x2ZUVycm9yQm9keUNhbGxiYWNrIH0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3QgeyBBc3luY1Jlc291cmNlIH0gPSByZXF1aXJlKCdhc3luY19ob29rcycpXG5jb25zdCB7IGFkZFNpZ25hbCwgcmVtb3ZlU2lnbmFsIH0gPSByZXF1aXJlKCcuL2Fib3J0LXNpZ25hbCcpXG5cbmNsYXNzIFN0cmVhbUhhbmRsZXIgZXh0ZW5kcyBBc3luY1Jlc291cmNlIHtcbiAgY29uc3RydWN0b3IgKG9wdHMsIGZhY3RvcnksIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFvcHRzIHx8IHR5cGVvZiBvcHRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9wdHMnKVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2lnbmFsLCBtZXRob2QsIG9wYXF1ZSwgYm9keSwgb25JbmZvLCByZXNwb25zZUhlYWRlcnMsIHRocm93T25FcnJvciB9ID0gb3B0c1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGNhbGxiYWNrJylcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBmYWN0b3J5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBmYWN0b3J5JylcbiAgICAgIH1cblxuICAgICAgaWYgKHNpZ25hbCAmJiB0eXBlb2Ygc2lnbmFsLm9uICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3NpZ25hbCBtdXN0IGJlIGFuIEV2ZW50RW1pdHRlciBvciBFdmVudFRhcmdldCcpXG4gICAgICB9XG5cbiAgICAgIGlmIChtZXRob2QgPT09ICdDT05ORUNUJykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgbWV0aG9kJylcbiAgICAgIH1cblxuICAgICAgaWYgKG9uSW5mbyAmJiB0eXBlb2Ygb25JbmZvICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvbkluZm8gY2FsbGJhY2snKVxuICAgICAgfVxuXG4gICAgICBzdXBlcignVU5ESUNJX1NUUkVBTScpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAodXRpbC5pc1N0cmVhbShib2R5KSkge1xuICAgICAgICB1dGlsLmRlc3Ryb3koYm9keS5vbignZXJyb3InLCB1dGlsLm5vcCksIGVycilcbiAgICAgIH1cbiAgICAgIHRocm93IGVyclxuICAgIH1cblxuICAgIHRoaXMucmVzcG9uc2VIZWFkZXJzID0gcmVzcG9uc2VIZWFkZXJzIHx8IG51bGxcbiAgICB0aGlzLm9wYXF1ZSA9IG9wYXF1ZSB8fCBudWxsXG4gICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeVxuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHRoaXMucmVzID0gbnVsbFxuICAgIHRoaXMuYWJvcnQgPSBudWxsXG4gICAgdGhpcy5jb250ZXh0ID0gbnVsbFxuICAgIHRoaXMudHJhaWxlcnMgPSBudWxsXG4gICAgdGhpcy5ib2R5ID0gYm9keVxuICAgIHRoaXMub25JbmZvID0gb25JbmZvIHx8IG51bGxcbiAgICB0aGlzLnRocm93T25FcnJvciA9IHRocm93T25FcnJvciB8fCBmYWxzZVxuXG4gICAgaWYgKHV0aWwuaXNTdHJlYW0oYm9keSkpIHtcbiAgICAgIGJvZHkub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBhZGRTaWduYWwodGhpcywgc2lnbmFsKVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCwgY29udGV4dCkge1xuICAgIGlmICghdGhpcy5jYWxsYmFjaykge1xuICAgICAgdGhyb3cgbmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoKVxuICAgIH1cblxuICAgIHRoaXMuYWJvcnQgPSBhYm9ydFxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHRcbiAgfVxuXG4gIG9uSGVhZGVycyAoc3RhdHVzQ29kZSwgcmF3SGVhZGVycywgcmVzdW1lLCBzdGF0dXNNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBmYWN0b3J5LCBvcGFxdWUsIGNvbnRleHQsIGNhbGxiYWNrLCByZXNwb25zZUhlYWRlcnMgfSA9IHRoaXNcblxuICAgIGNvbnN0IGhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMgPT09ICdyYXcnID8gdXRpbC5wYXJzZVJhd0hlYWRlcnMocmF3SGVhZGVycykgOiB1dGlsLnBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKVxuXG4gICAgaWYgKHN0YXR1c0NvZGUgPCAyMDApIHtcbiAgICAgIGlmICh0aGlzLm9uSW5mbykge1xuICAgICAgICB0aGlzLm9uSW5mbyh7IHN0YXR1c0NvZGUsIGhlYWRlcnMgfSlcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuZmFjdG9yeSA9IG51bGxcblxuICAgIGxldCByZXNcblxuICAgIGlmICh0aGlzLnRocm93T25FcnJvciAmJiBzdGF0dXNDb2RlID49IDQwMCkge1xuICAgICAgY29uc3QgcGFyc2VkSGVhZGVycyA9IHJlc3BvbnNlSGVhZGVycyA9PT0gJ3JhdycgPyB1dGlsLnBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKSA6IGhlYWRlcnNcbiAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcGFyc2VkSGVhZGVyc1snY29udGVudC10eXBlJ11cbiAgICAgIHJlcyA9IG5ldyBQYXNzVGhyb3VnaCgpXG5cbiAgICAgIHRoaXMuY2FsbGJhY2sgPSBudWxsXG4gICAgICB0aGlzLnJ1bkluQXN5bmNTY29wZShnZXRSZXNvbHZlRXJyb3JCb2R5Q2FsbGJhY2ssIG51bGwsXG4gICAgICAgIHsgY2FsbGJhY2ssIGJvZHk6IHJlcywgY29udGVudFR5cGUsIHN0YXR1c0NvZGUsIHN0YXR1c01lc3NhZ2UsIGhlYWRlcnMgfVxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZmFjdG9yeSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgcmVzID0gdGhpcy5ydW5JbkFzeW5jU2NvcGUoZmFjdG9yeSwgbnVsbCwge1xuICAgICAgICBzdGF0dXNDb2RlLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBvcGFxdWUsXG4gICAgICAgIGNvbnRleHRcbiAgICAgIH0pXG5cbiAgICAgIGlmIChcbiAgICAgICAgIXJlcyB8fFxuICAgICAgICB0eXBlb2YgcmVzLndyaXRlICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgIHR5cGVvZiByZXMuZW5kICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgIHR5cGVvZiByZXMub24gIT09ICdmdW5jdGlvbidcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJldHVyblZhbHVlRXJyb3IoJ2V4cGVjdGVkIFdyaXRhYmxlJylcbiAgICAgIH1cblxuICAgICAgLy8gVE9ETzogQXZvaWQgZmluaXNoZWQuIEl0IHJlZ2lzdGVycyBhbiB1bm5lY2Vzc2FyeSBhbW91bnQgb2YgbGlzdGVuZXJzLlxuICAgICAgZmluaXNoZWQocmVzLCB7IHJlYWRhYmxlOiBmYWxzZSB9LCAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHJlcywgb3BhcXVlLCB0cmFpbGVycywgYWJvcnQgfSA9IHRoaXNcblxuICAgICAgICB0aGlzLnJlcyA9IG51bGxcbiAgICAgICAgaWYgKGVyciB8fCAhcmVzLnJlYWRhYmxlKSB7XG4gICAgICAgICAgdXRpbC5kZXN0cm95KHJlcywgZXJyKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IG51bGxcbiAgICAgICAgdGhpcy5ydW5JbkFzeW5jU2NvcGUoY2FsbGJhY2ssIG51bGwsIGVyciB8fCBudWxsLCB7IG9wYXF1ZSwgdHJhaWxlcnMgfSlcblxuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgYWJvcnQoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIHJlcy5vbignZHJhaW4nLCByZXN1bWUpXG5cbiAgICB0aGlzLnJlcyA9IHJlc1xuXG4gICAgY29uc3QgbmVlZERyYWluID0gcmVzLndyaXRhYmxlTmVlZERyYWluICE9PSB1bmRlZmluZWRcbiAgICAgID8gcmVzLndyaXRhYmxlTmVlZERyYWluXG4gICAgICA6IHJlcy5fd3JpdGFibGVTdGF0ZSAmJiByZXMuX3dyaXRhYmxlU3RhdGUubmVlZERyYWluXG5cbiAgICByZXR1cm4gbmVlZERyYWluICE9PSB0cnVlXG4gIH1cblxuICBvbkRhdGEgKGNodW5rKSB7XG4gICAgY29uc3QgeyByZXMgfSA9IHRoaXNcblxuICAgIHJldHVybiByZXMgPyByZXMud3JpdGUoY2h1bmspIDogdHJ1ZVxuICB9XG5cbiAgb25Db21wbGV0ZSAodHJhaWxlcnMpIHtcbiAgICBjb25zdCB7IHJlcyB9ID0gdGhpc1xuXG4gICAgcmVtb3ZlU2lnbmFsKHRoaXMpXG5cbiAgICBpZiAoIXJlcykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy50cmFpbGVycyA9IHV0aWwucGFyc2VIZWFkZXJzKHRyYWlsZXJzKVxuXG4gICAgcmVzLmVuZCgpXG4gIH1cblxuICBvbkVycm9yIChlcnIpIHtcbiAgICBjb25zdCB7IHJlcywgY2FsbGJhY2ssIG9wYXF1ZSwgYm9keSB9ID0gdGhpc1xuXG4gICAgcmVtb3ZlU2lnbmFsKHRoaXMpXG5cbiAgICB0aGlzLmZhY3RvcnkgPSBudWxsXG5cbiAgICBpZiAocmVzKSB7XG4gICAgICB0aGlzLnJlcyA9IG51bGxcbiAgICAgIHV0aWwuZGVzdHJveShyZXMsIGVycilcbiAgICB9IGVsc2UgaWYgKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLmNhbGxiYWNrID0gbnVsbFxuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICB0aGlzLnJ1bkluQXN5bmNTY29wZShjYWxsYmFjaywgbnVsbCwgZXJyLCB7IG9wYXF1ZSB9KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoYm9keSkge1xuICAgICAgdGhpcy5ib2R5ID0gbnVsbFxuICAgICAgdXRpbC5kZXN0cm95KGJvZHksIGVycilcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RyZWFtIChvcHRzLCBmYWN0b3J5LCBjYWxsYmFjaykge1xuICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBzdHJlYW0uY2FsbCh0aGlzLCBvcHRzLCBmYWN0b3J5LCAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgIHJldHVybiBlcnIgPyByZWplY3QoZXJyKSA6IHJlc29sdmUoZGF0YSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIHRyeSB7XG4gICAgdGhpcy5kaXNwYXRjaChvcHRzLCBuZXcgU3RyZWFtSGFuZGxlcihvcHRzLCBmYWN0b3J5LCBjYWxsYmFjaykpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgICBjb25zdCBvcGFxdWUgPSBvcHRzICYmIG9wdHMub3BhcXVlXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2FsbGJhY2soZXJyLCB7IG9wYXF1ZSB9KSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmVhbVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHtcbiAgUmVhZGFibGUsXG4gIER1cGxleCxcbiAgUGFzc1Rocm91Z2hcbn0gPSByZXF1aXJlKCdzdHJlYW0nKVxuY29uc3Qge1xuICBJbnZhbGlkQXJndW1lbnRFcnJvcixcbiAgSW52YWxpZFJldHVyblZhbHVlRXJyb3IsXG4gIFJlcXVlc3RBYm9ydGVkRXJyb3Jcbn0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgQXN5bmNSZXNvdXJjZSB9ID0gcmVxdWlyZSgnYXN5bmNfaG9va3MnKVxuY29uc3QgeyBhZGRTaWduYWwsIHJlbW92ZVNpZ25hbCB9ID0gcmVxdWlyZSgnLi9hYm9ydC1zaWduYWwnKVxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcblxuY29uc3Qga1Jlc3VtZSA9IFN5bWJvbCgncmVzdW1lJylcblxuY2xhc3MgUGlwZWxpbmVSZXF1ZXN0IGV4dGVuZHMgUmVhZGFibGUge1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgc3VwZXIoeyBhdXRvRGVzdHJveTogdHJ1ZSB9KVxuXG4gICAgdGhpc1trUmVzdW1lXSA9IG51bGxcbiAgfVxuXG4gIF9yZWFkICgpIHtcbiAgICBjb25zdCB7IFtrUmVzdW1lXTogcmVzdW1lIH0gPSB0aGlzXG5cbiAgICBpZiAocmVzdW1lKSB7XG4gICAgICB0aGlzW2tSZXN1bWVdID0gbnVsbFxuICAgICAgcmVzdW1lKClcbiAgICB9XG4gIH1cblxuICBfZGVzdHJveSAoZXJyLCBjYWxsYmFjaykge1xuICAgIHRoaXMuX3JlYWQoKVxuXG4gICAgY2FsbGJhY2soZXJyKVxuICB9XG59XG5cbmNsYXNzIFBpcGVsaW5lUmVzcG9uc2UgZXh0ZW5kcyBSZWFkYWJsZSB7XG4gIGNvbnN0cnVjdG9yIChyZXN1bWUpIHtcbiAgICBzdXBlcih7IGF1dG9EZXN0cm95OiB0cnVlIH0pXG4gICAgdGhpc1trUmVzdW1lXSA9IHJlc3VtZVxuICB9XG5cbiAgX3JlYWQgKCkge1xuICAgIHRoaXNba1Jlc3VtZV0oKVxuICB9XG5cbiAgX2Rlc3Ryb3kgKGVyciwgY2FsbGJhY2spIHtcbiAgICBpZiAoIWVyciAmJiAhdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgICBlcnIgPSBuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpXG4gICAgfVxuXG4gICAgY2FsbGJhY2soZXJyKVxuICB9XG59XG5cbmNsYXNzIFBpcGVsaW5lSGFuZGxlciBleHRlbmRzIEFzeW5jUmVzb3VyY2Uge1xuICBjb25zdHJ1Y3RvciAob3B0cywgaGFuZGxlcikge1xuICAgIGlmICghb3B0cyB8fCB0eXBlb2Ygb3B0cyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvcHRzJylcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGhhbmRsZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBoYW5kbGVyJylcbiAgICB9XG5cbiAgICBjb25zdCB7IHNpZ25hbCwgbWV0aG9kLCBvcGFxdWUsIG9uSW5mbywgcmVzcG9uc2VIZWFkZXJzIH0gPSBvcHRzXG5cbiAgICBpZiAoc2lnbmFsICYmIHR5cGVvZiBzaWduYWwub24gIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3NpZ25hbCBtdXN0IGJlIGFuIEV2ZW50RW1pdHRlciBvciBFdmVudFRhcmdldCcpXG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gJ0NPTk5FQ1QnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgbWV0aG9kJylcbiAgICB9XG5cbiAgICBpZiAob25JbmZvICYmIHR5cGVvZiBvbkluZm8gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvbkluZm8gY2FsbGJhY2snKVxuICAgIH1cblxuICAgIHN1cGVyKCdVTkRJQ0lfUElQRUxJTkUnKVxuXG4gICAgdGhpcy5vcGFxdWUgPSBvcGFxdWUgfHwgbnVsbFxuICAgIHRoaXMucmVzcG9uc2VIZWFkZXJzID0gcmVzcG9uc2VIZWFkZXJzIHx8IG51bGxcbiAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyXG4gICAgdGhpcy5hYm9ydCA9IG51bGxcbiAgICB0aGlzLmNvbnRleHQgPSBudWxsXG4gICAgdGhpcy5vbkluZm8gPSBvbkluZm8gfHwgbnVsbFxuXG4gICAgdGhpcy5yZXEgPSBuZXcgUGlwZWxpbmVSZXF1ZXN0KCkub24oJ2Vycm9yJywgdXRpbC5ub3ApXG5cbiAgICB0aGlzLnJldCA9IG5ldyBEdXBsZXgoe1xuICAgICAgcmVhZGFibGVPYmplY3RNb2RlOiBvcHRzLm9iamVjdE1vZGUsXG4gICAgICBhdXRvRGVzdHJveTogdHJ1ZSxcbiAgICAgIHJlYWQ6ICgpID0+IHtcbiAgICAgICAgY29uc3QgeyBib2R5IH0gPSB0aGlzXG5cbiAgICAgICAgaWYgKGJvZHkgJiYgYm9keS5yZXN1bWUpIHtcbiAgICAgICAgICBib2R5LnJlc3VtZSgpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB3cml0ZTogKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spID0+IHtcbiAgICAgICAgY29uc3QgeyByZXEgfSA9IHRoaXNcblxuICAgICAgICBpZiAocmVxLnB1c2goY2h1bmssIGVuY29kaW5nKSB8fCByZXEuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkKSB7XG4gICAgICAgICAgY2FsbGJhY2soKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcVtrUmVzdW1lXSA9IGNhbGxiYWNrXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBkZXN0cm95OiAoZXJyLCBjYWxsYmFjaykgPT4ge1xuICAgICAgICBjb25zdCB7IGJvZHksIHJlcSwgcmVzLCByZXQsIGFib3J0IH0gPSB0aGlzXG5cbiAgICAgICAgaWYgKCFlcnIgJiYgIXJldC5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgICAgICAgZXJyID0gbmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFib3J0ICYmIGVycikge1xuICAgICAgICAgIGFib3J0KClcbiAgICAgICAgfVxuXG4gICAgICAgIHV0aWwuZGVzdHJveShib2R5LCBlcnIpXG4gICAgICAgIHV0aWwuZGVzdHJveShyZXEsIGVycilcbiAgICAgICAgdXRpbC5kZXN0cm95KHJlcywgZXJyKVxuXG4gICAgICAgIHJlbW92ZVNpZ25hbCh0aGlzKVxuXG4gICAgICAgIGNhbGxiYWNrKGVycilcbiAgICAgIH1cbiAgICB9KS5vbigncHJlZmluaXNoJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyByZXEgfSA9IHRoaXNcblxuICAgICAgLy8gTm9kZSA8IDE1IGRvZXMgbm90IGNhbGwgX2ZpbmFsIGluIHNhbWUgdGljay5cbiAgICAgIHJlcS5wdXNoKG51bGwpXG4gICAgfSlcblxuICAgIHRoaXMucmVzID0gbnVsbFxuXG4gICAgYWRkU2lnbmFsKHRoaXMsIHNpZ25hbClcbiAgfVxuXG4gIG9uQ29ubmVjdCAoYWJvcnQsIGNvbnRleHQpIHtcbiAgICBjb25zdCB7IHJldCwgcmVzIH0gPSB0aGlzXG5cbiAgICBhc3NlcnQoIXJlcywgJ3BpcGVsaW5lIGNhbm5vdCBiZSByZXRyaWVkJylcblxuICAgIGlmIChyZXQuZGVzdHJveWVkKSB7XG4gICAgICB0aHJvdyBuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpXG4gICAgfVxuXG4gICAgdGhpcy5hYm9ydCA9IGFib3J0XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dFxuICB9XG5cbiAgb25IZWFkZXJzIChzdGF0dXNDb2RlLCByYXdIZWFkZXJzLCByZXN1bWUpIHtcbiAgICBjb25zdCB7IG9wYXF1ZSwgaGFuZGxlciwgY29udGV4dCB9ID0gdGhpc1xuXG4gICAgaWYgKHN0YXR1c0NvZGUgPCAyMDApIHtcbiAgICAgIGlmICh0aGlzLm9uSW5mbykge1xuICAgICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5yZXNwb25zZUhlYWRlcnMgPT09ICdyYXcnID8gdXRpbC5wYXJzZVJhd0hlYWRlcnMocmF3SGVhZGVycykgOiB1dGlsLnBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKVxuICAgICAgICB0aGlzLm9uSW5mbyh7IHN0YXR1c0NvZGUsIGhlYWRlcnMgfSlcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMucmVzID0gbmV3IFBpcGVsaW5lUmVzcG9uc2UocmVzdW1lKVxuXG4gICAgbGV0IGJvZHlcbiAgICB0cnkge1xuICAgICAgdGhpcy5oYW5kbGVyID0gbnVsbFxuICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMucmVzcG9uc2VIZWFkZXJzID09PSAncmF3JyA/IHV0aWwucGFyc2VSYXdIZWFkZXJzKHJhd0hlYWRlcnMpIDogdXRpbC5wYXJzZUhlYWRlcnMocmF3SGVhZGVycylcbiAgICAgIGJvZHkgPSB0aGlzLnJ1bkluQXN5bmNTY29wZShoYW5kbGVyLCBudWxsLCB7XG4gICAgICAgIHN0YXR1c0NvZGUsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIG9wYXF1ZSxcbiAgICAgICAgYm9keTogdGhpcy5yZXMsXG4gICAgICAgIGNvbnRleHRcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLnJlcy5vbignZXJyb3InLCB1dGlsLm5vcClcbiAgICAgIHRocm93IGVyclxuICAgIH1cblxuICAgIGlmICghYm9keSB8fCB0eXBlb2YgYm9keS5vbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXR1cm5WYWx1ZUVycm9yKCdleHBlY3RlZCBSZWFkYWJsZScpXG4gICAgfVxuXG4gICAgYm9keVxuICAgICAgLm9uKCdkYXRhJywgKGNodW5rKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcmV0LCBib2R5IH0gPSB0aGlzXG5cbiAgICAgICAgaWYgKCFyZXQucHVzaChjaHVuaykgJiYgYm9keS5wYXVzZSkge1xuICAgICAgICAgIGJvZHkucGF1c2UoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgICAgY29uc3QgeyByZXQgfSA9IHRoaXNcblxuICAgICAgICB1dGlsLmRlc3Ryb3kocmV0LCBlcnIpXG4gICAgICB9KVxuICAgICAgLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcmV0IH0gPSB0aGlzXG5cbiAgICAgICAgcmV0LnB1c2gobnVsbClcbiAgICAgIH0pXG4gICAgICAub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB7IHJldCB9ID0gdGhpc1xuXG4gICAgICAgIGlmICghcmV0Ll9yZWFkYWJsZVN0YXRlLmVuZGVkKSB7XG4gICAgICAgICAgdXRpbC5kZXN0cm95KHJldCwgbmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoKSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgIHRoaXMuYm9keSA9IGJvZHlcbiAgfVxuXG4gIG9uRGF0YSAoY2h1bmspIHtcbiAgICBjb25zdCB7IHJlcyB9ID0gdGhpc1xuICAgIHJldHVybiByZXMucHVzaChjaHVuaylcbiAgfVxuXG4gIG9uQ29tcGxldGUgKHRyYWlsZXJzKSB7XG4gICAgY29uc3QgeyByZXMgfSA9IHRoaXNcbiAgICByZXMucHVzaChudWxsKVxuICB9XG5cbiAgb25FcnJvciAoZXJyKSB7XG4gICAgY29uc3QgeyByZXQgfSA9IHRoaXNcbiAgICB0aGlzLmhhbmRsZXIgPSBudWxsXG4gICAgdXRpbC5kZXN0cm95KHJldCwgZXJyKVxuICB9XG59XG5cbmZ1bmN0aW9uIHBpcGVsaW5lIChvcHRzLCBoYW5kbGVyKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGlwZWxpbmVIYW5kbGVyID0gbmV3IFBpcGVsaW5lSGFuZGxlcihvcHRzLCBoYW5kbGVyKVxuICAgIHRoaXMuZGlzcGF0Y2goeyAuLi5vcHRzLCBib2R5OiBwaXBlbGluZUhhbmRsZXIucmVxIH0sIHBpcGVsaW5lSGFuZGxlcilcbiAgICByZXR1cm4gcGlwZWxpbmVIYW5kbGVyLnJldFxuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gbmV3IFBhc3NUaHJvdWdoKCkuZGVzdHJveShlcnIpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwaXBlbGluZVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IsIFJlcXVlc3RBYm9ydGVkRXJyb3IsIFNvY2tldEVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5jb25zdCB7IEFzeW5jUmVzb3VyY2UgfSA9IHJlcXVpcmUoJ2FzeW5jX2hvb2tzJylcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBhZGRTaWduYWwsIHJlbW92ZVNpZ25hbCB9ID0gcmVxdWlyZSgnLi9hYm9ydC1zaWduYWwnKVxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcblxuY2xhc3MgVXBncmFkZUhhbmRsZXIgZXh0ZW5kcyBBc3luY1Jlc291cmNlIHtcbiAgY29uc3RydWN0b3IgKG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFvcHRzIHx8IHR5cGVvZiBvcHRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9wdHMnKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBjYWxsYmFjaycpXG4gICAgfVxuXG4gICAgY29uc3QgeyBzaWduYWwsIG9wYXF1ZSwgcmVzcG9uc2VIZWFkZXJzIH0gPSBvcHRzXG5cbiAgICBpZiAoc2lnbmFsICYmIHR5cGVvZiBzaWduYWwub24gIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3NpZ25hbCBtdXN0IGJlIGFuIEV2ZW50RW1pdHRlciBvciBFdmVudFRhcmdldCcpXG4gICAgfVxuXG4gICAgc3VwZXIoJ1VORElDSV9VUEdSQURFJylcblxuICAgIHRoaXMucmVzcG9uc2VIZWFkZXJzID0gcmVzcG9uc2VIZWFkZXJzIHx8IG51bGxcbiAgICB0aGlzLm9wYXF1ZSA9IG9wYXF1ZSB8fCBudWxsXG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrXG4gICAgdGhpcy5hYm9ydCA9IG51bGxcbiAgICB0aGlzLmNvbnRleHQgPSBudWxsXG5cbiAgICBhZGRTaWduYWwodGhpcywgc2lnbmFsKVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCwgY29udGV4dCkge1xuICAgIGlmICghdGhpcy5jYWxsYmFjaykge1xuICAgICAgdGhyb3cgbmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoKVxuICAgIH1cblxuICAgIHRoaXMuYWJvcnQgPSBhYm9ydFxuICAgIHRoaXMuY29udGV4dCA9IG51bGxcbiAgfVxuXG4gIG9uSGVhZGVycyAoKSB7XG4gICAgdGhyb3cgbmV3IFNvY2tldEVycm9yKCdiYWQgdXBncmFkZScsIG51bGwpXG4gIH1cblxuICBvblVwZ3JhZGUgKHN0YXR1c0NvZGUsIHJhd0hlYWRlcnMsIHNvY2tldCkge1xuICAgIGNvbnN0IHsgY2FsbGJhY2ssIG9wYXF1ZSwgY29udGV4dCB9ID0gdGhpc1xuXG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHN0YXR1c0NvZGUsIDEwMSlcblxuICAgIHJlbW92ZVNpZ25hbCh0aGlzKVxuXG4gICAgdGhpcy5jYWxsYmFjayA9IG51bGxcbiAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5yZXNwb25zZUhlYWRlcnMgPT09ICdyYXcnID8gdXRpbC5wYXJzZVJhd0hlYWRlcnMocmF3SGVhZGVycykgOiB1dGlsLnBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKVxuICAgIHRoaXMucnVuSW5Bc3luY1Njb3BlKGNhbGxiYWNrLCBudWxsLCBudWxsLCB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgc29ja2V0LFxuICAgICAgb3BhcXVlLFxuICAgICAgY29udGV4dFxuICAgIH0pXG4gIH1cblxuICBvbkVycm9yIChlcnIpIHtcbiAgICBjb25zdCB7IGNhbGxiYWNrLCBvcGFxdWUgfSA9IHRoaXNcblxuICAgIHJlbW92ZVNpZ25hbCh0aGlzKVxuXG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLmNhbGxiYWNrID0gbnVsbFxuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICB0aGlzLnJ1bkluQXN5bmNTY29wZShjYWxsYmFjaywgbnVsbCwgZXJyLCB7IG9wYXF1ZSB9KVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBncmFkZSAob3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdXBncmFkZS5jYWxsKHRoaXMsIG9wdHMsIChlcnIsIGRhdGEpID0+IHtcbiAgICAgICAgcmV0dXJuIGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZShkYXRhKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB1cGdyYWRlSGFuZGxlciA9IG5ldyBVcGdyYWRlSGFuZGxlcihvcHRzLCBjYWxsYmFjaylcbiAgICB0aGlzLmRpc3BhdGNoKHtcbiAgICAgIC4uLm9wdHMsXG4gICAgICBtZXRob2Q6IG9wdHMubWV0aG9kIHx8ICdHRVQnLFxuICAgICAgdXBncmFkZTogb3B0cy5wcm90b2NvbCB8fCAnV2Vic29ja2V0J1xuICAgIH0sIHVwZ3JhZGVIYW5kbGVyKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG4gICAgY29uc3Qgb3BhcXVlID0gb3B0cyAmJiBvcHRzLm9wYXF1ZVxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IGNhbGxiYWNrKGVyciwgeyBvcGFxdWUgfSkpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB1cGdyYWRlXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBBc3luY1Jlc291cmNlIH0gPSByZXF1aXJlKCdhc3luY19ob29rcycpXG5jb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yLCBSZXF1ZXN0QWJvcnRlZEVycm9yLCBTb2NrZXRFcnJvciB9ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMnKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5jb25zdCB7IGFkZFNpZ25hbCwgcmVtb3ZlU2lnbmFsIH0gPSByZXF1aXJlKCcuL2Fib3J0LXNpZ25hbCcpXG5cbmNsYXNzIENvbm5lY3RIYW5kbGVyIGV4dGVuZHMgQXN5bmNSZXNvdXJjZSB7XG4gIGNvbnN0cnVjdG9yIChvcHRzLCBjYWxsYmFjaykge1xuICAgIGlmICghb3B0cyB8fCB0eXBlb2Ygb3B0cyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvcHRzJylcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgY2FsbGJhY2snKVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2lnbmFsLCBvcGFxdWUsIHJlc3BvbnNlSGVhZGVycyB9ID0gb3B0c1xuXG4gICAgaWYgKHNpZ25hbCAmJiB0eXBlb2Ygc2lnbmFsLm9uICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdzaWduYWwgbXVzdCBiZSBhbiBFdmVudEVtaXR0ZXIgb3IgRXZlbnRUYXJnZXQnKVxuICAgIH1cblxuICAgIHN1cGVyKCdVTkRJQ0lfQ09OTkVDVCcpXG5cbiAgICB0aGlzLm9wYXF1ZSA9IG9wYXF1ZSB8fCBudWxsXG4gICAgdGhpcy5yZXNwb25zZUhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMgfHwgbnVsbFxuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHRoaXMuYWJvcnQgPSBudWxsXG5cbiAgICBhZGRTaWduYWwodGhpcywgc2lnbmFsKVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCwgY29udGV4dCkge1xuICAgIGlmICghdGhpcy5jYWxsYmFjaykge1xuICAgICAgdGhyb3cgbmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoKVxuICAgIH1cblxuICAgIHRoaXMuYWJvcnQgPSBhYm9ydFxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHRcbiAgfVxuXG4gIG9uSGVhZGVycyAoKSB7XG4gICAgdGhyb3cgbmV3IFNvY2tldEVycm9yKCdiYWQgY29ubmVjdCcsIG51bGwpXG4gIH1cblxuICBvblVwZ3JhZGUgKHN0YXR1c0NvZGUsIHJhd0hlYWRlcnMsIHNvY2tldCkge1xuICAgIGNvbnN0IHsgY2FsbGJhY2ssIG9wYXF1ZSwgY29udGV4dCB9ID0gdGhpc1xuXG4gICAgcmVtb3ZlU2lnbmFsKHRoaXMpXG5cbiAgICB0aGlzLmNhbGxiYWNrID0gbnVsbFxuXG4gICAgbGV0IGhlYWRlcnMgPSByYXdIZWFkZXJzXG4gICAgLy8gSW5kaWNhdGVzIGlzIGFuIEhUVFAyU2Vzc2lvblxuICAgIGlmIChoZWFkZXJzICE9IG51bGwpIHtcbiAgICAgIGhlYWRlcnMgPSB0aGlzLnJlc3BvbnNlSGVhZGVycyA9PT0gJ3JhdycgPyB1dGlsLnBhcnNlUmF3SGVhZGVycyhyYXdIZWFkZXJzKSA6IHV0aWwucGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpXG4gICAgfVxuXG4gICAgdGhpcy5ydW5JbkFzeW5jU2NvcGUoY2FsbGJhY2ssIG51bGwsIG51bGwsIHtcbiAgICAgIHN0YXR1c0NvZGUsXG4gICAgICBoZWFkZXJzLFxuICAgICAgc29ja2V0LFxuICAgICAgb3BhcXVlLFxuICAgICAgY29udGV4dFxuICAgIH0pXG4gIH1cblxuICBvbkVycm9yIChlcnIpIHtcbiAgICBjb25zdCB7IGNhbGxiYWNrLCBvcGFxdWUgfSA9IHRoaXNcblxuICAgIHJlbW92ZVNpZ25hbCh0aGlzKVxuXG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLmNhbGxiYWNrID0gbnVsbFxuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICB0aGlzLnJ1bkluQXN5bmNTY29wZShjYWxsYmFjaywgbnVsbCwgZXJyLCB7IG9wYXF1ZSB9KVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29ubmVjdCAob3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29ubmVjdC5jYWxsKHRoaXMsIG9wdHMsIChlcnIsIGRhdGEpID0+IHtcbiAgICAgICAgcmV0dXJuIGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZShkYXRhKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjb25uZWN0SGFuZGxlciA9IG5ldyBDb25uZWN0SGFuZGxlcihvcHRzLCBjYWxsYmFjaylcbiAgICB0aGlzLmRpc3BhdGNoKHsgLi4ub3B0cywgbWV0aG9kOiAnQ09OTkVDVCcgfSwgY29ubmVjdEhhbmRsZXIpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgICBjb25zdCBvcGFxdWUgPSBvcHRzICYmIG9wdHMub3BhcXVlXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2FsbGJhY2soZXJyLCB7IG9wYXF1ZSB9KSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbm5lY3RcbiIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cy5yZXF1ZXN0ID0gcmVxdWlyZSgnLi9hcGktcmVxdWVzdCcpXG5tb2R1bGUuZXhwb3J0cy5zdHJlYW0gPSByZXF1aXJlKCcuL2FwaS1zdHJlYW0nKVxubW9kdWxlLmV4cG9ydHMucGlwZWxpbmUgPSByZXF1aXJlKCcuL2FwaS1waXBlbGluZScpXG5tb2R1bGUuZXhwb3J0cy51cGdyYWRlID0gcmVxdWlyZSgnLi9hcGktdXBncmFkZScpXG5tb2R1bGUuZXhwb3J0cy5jb25uZWN0ID0gcmVxdWlyZSgnLi9hcGktY29ubmVjdCcpXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBVbmRpY2lFcnJvciB9ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMnKVxuXG5jbGFzcyBNb2NrTm90TWF0Y2hlZEVycm9yIGV4dGVuZHMgVW5kaWNpRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgTW9ja05vdE1hdGNoZWRFcnJvcilcbiAgICB0aGlzLm5hbWUgPSAnTW9ja05vdE1hdGNoZWRFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdUaGUgcmVxdWVzdCBkb2VzIG5vdCBtYXRjaCBhbnkgcmVnaXN0ZXJlZCBtb2NrIGRpc3BhdGNoZXMnXG4gICAgdGhpcy5jb2RlID0gJ1VORF9NT0NLX0VSUl9NT0NLX05PVF9NQVRDSEVEJ1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBNb2NrTm90TWF0Y2hlZEVycm9yXG59XG4iLCIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGtBZ2VudDogU3ltYm9sKCdhZ2VudCcpLFxuICBrT3B0aW9uczogU3ltYm9sKCdvcHRpb25zJyksXG4gIGtGYWN0b3J5OiBTeW1ib2woJ2ZhY3RvcnknKSxcbiAga0Rpc3BhdGNoZXM6IFN5bWJvbCgnZGlzcGF0Y2hlcycpLFxuICBrRGlzcGF0Y2hLZXk6IFN5bWJvbCgnZGlzcGF0Y2gga2V5JyksXG4gIGtEZWZhdWx0SGVhZGVyczogU3ltYm9sKCdkZWZhdWx0IGhlYWRlcnMnKSxcbiAga0RlZmF1bHRUcmFpbGVyczogU3ltYm9sKCdkZWZhdWx0IHRyYWlsZXJzJyksXG4gIGtDb250ZW50TGVuZ3RoOiBTeW1ib2woJ2NvbnRlbnQgbGVuZ3RoJyksXG4gIGtNb2NrQWdlbnQ6IFN5bWJvbCgnbW9jayBhZ2VudCcpLFxuICBrTW9ja0FnZW50U2V0OiBTeW1ib2woJ21vY2sgYWdlbnQgc2V0JyksXG4gIGtNb2NrQWdlbnRHZXQ6IFN5bWJvbCgnbW9jayBhZ2VudCBnZXQnKSxcbiAga01vY2tEaXNwYXRjaDogU3ltYm9sKCdtb2NrIGRpc3BhdGNoJyksXG4gIGtDbG9zZTogU3ltYm9sKCdjbG9zZScpLFxuICBrT3JpZ2luYWxDbG9zZTogU3ltYm9sKCdvcmlnaW5hbCBhZ2VudCBjbG9zZScpLFxuICBrT3JpZ2luOiBTeW1ib2woJ29yaWdpbicpLFxuICBrSXNNb2NrQWN0aXZlOiBTeW1ib2woJ2lzIG1vY2sgYWN0aXZlJyksXG4gIGtOZXRDb25uZWN0OiBTeW1ib2woJ25ldCBjb25uZWN0JyksXG4gIGtHZXROZXRDb25uZWN0OiBTeW1ib2woJ2dldCBuZXQgY29ubmVjdCcpLFxuICBrQ29ubmVjdGVkOiBTeW1ib2woJ2Nvbm5lY3RlZCcpXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBNb2NrTm90TWF0Y2hlZEVycm9yIH0gPSByZXF1aXJlKCcuL21vY2stZXJyb3JzJylcbmNvbnN0IHtcbiAga0Rpc3BhdGNoZXMsXG4gIGtNb2NrQWdlbnQsXG4gIGtPcmlnaW5hbERpc3BhdGNoLFxuICBrT3JpZ2luLFxuICBrR2V0TmV0Q29ubmVjdFxufSA9IHJlcXVpcmUoJy4vbW9jay1zeW1ib2xzJylcbmNvbnN0IHsgYnVpbGRVUkwsIG5vcCB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgU1RBVFVTX0NPREVTIH0gPSByZXF1aXJlKCdodHRwJylcbmNvbnN0IHtcbiAgdHlwZXM6IHtcbiAgICBpc1Byb21pc2VcbiAgfVxufSA9IHJlcXVpcmUoJ3V0aWwnKVxuXG5mdW5jdGlvbiBtYXRjaFZhbHVlIChtYXRjaCwgdmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBtYXRjaCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbWF0Y2ggPT09IHZhbHVlXG4gIH1cbiAgaWYgKG1hdGNoIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgcmV0dXJuIG1hdGNoLnRlc3QodmFsdWUpXG4gIH1cbiAgaWYgKHR5cGVvZiBtYXRjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBtYXRjaCh2YWx1ZSkgPT09IHRydWVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZnVuY3Rpb24gbG93ZXJDYXNlRW50cmllcyAoaGVhZGVycykge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpLm1hcCgoW2hlYWRlck5hbWUsIGhlYWRlclZhbHVlXSkgPT4ge1xuICAgICAgcmV0dXJuIFtoZWFkZXJOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCksIGhlYWRlclZhbHVlXVxuICAgIH0pXG4gIClcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vLi4vaW5kZXgnKS5IZWFkZXJzfHN0cmluZ1tdfFJlY29yZDxzdHJpbmcsIHN0cmluZz59IGhlYWRlcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqL1xuZnVuY3Rpb24gZ2V0SGVhZGVyQnlOYW1lIChoZWFkZXJzLCBrZXkpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoaGVhZGVycykpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIGlmIChoZWFkZXJzW2ldLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IGtleS50b0xvY2FsZUxvd2VyQ2FzZSgpKSB7XG4gICAgICAgIHJldHVybiBoZWFkZXJzW2kgKyAxXVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfSBlbHNlIGlmICh0eXBlb2YgaGVhZGVycy5nZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gaGVhZGVycy5nZXQoa2V5KVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBsb3dlckNhc2VFbnRyaWVzKGhlYWRlcnMpW2tleS50b0xvY2FsZUxvd2VyQ2FzZSgpXVxuICB9XG59XG5cbi8qKiBAcGFyYW0ge3N0cmluZ1tdfSBoZWFkZXJzICovXG5mdW5jdGlvbiBidWlsZEhlYWRlcnNGcm9tQXJyYXkgKGhlYWRlcnMpIHsgLy8gZmV0Y2ggSGVhZGVyc0xpc3RcbiAgY29uc3QgY2xvbmUgPSBoZWFkZXJzLnNsaWNlKClcbiAgY29uc3QgZW50cmllcyA9IFtdXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjbG9uZS5sZW5ndGg7IGluZGV4ICs9IDIpIHtcbiAgICBlbnRyaWVzLnB1c2goW2Nsb25lW2luZGV4XSwgY2xvbmVbaW5kZXggKyAxXV0pXG4gIH1cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhlbnRyaWVzKVxufVxuXG5mdW5jdGlvbiBtYXRjaEhlYWRlcnMgKG1vY2tEaXNwYXRjaCwgaGVhZGVycykge1xuICBpZiAodHlwZW9mIG1vY2tEaXNwYXRjaC5oZWFkZXJzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaGVhZGVycykpIHsgLy8gZmV0Y2ggSGVhZGVyc0xpc3RcbiAgICAgIGhlYWRlcnMgPSBidWlsZEhlYWRlcnNGcm9tQXJyYXkoaGVhZGVycylcbiAgICB9XG4gICAgcmV0dXJuIG1vY2tEaXNwYXRjaC5oZWFkZXJzKGhlYWRlcnMgPyBsb3dlckNhc2VFbnRyaWVzKGhlYWRlcnMpIDoge30pXG4gIH1cbiAgaWYgKHR5cGVvZiBtb2NrRGlzcGF0Y2guaGVhZGVycyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIGlmICh0eXBlb2YgaGVhZGVycyAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIG1vY2tEaXNwYXRjaC5oZWFkZXJzICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZm9yIChjb25zdCBbbWF0Y2hIZWFkZXJOYW1lLCBtYXRjaEhlYWRlclZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtb2NrRGlzcGF0Y2guaGVhZGVycykpIHtcbiAgICBjb25zdCBoZWFkZXJWYWx1ZSA9IGdldEhlYWRlckJ5TmFtZShoZWFkZXJzLCBtYXRjaEhlYWRlck5hbWUpXG5cbiAgICBpZiAoIW1hdGNoVmFsdWUobWF0Y2hIZWFkZXJWYWx1ZSwgaGVhZGVyVmFsdWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gc2FmZVVybCAocGF0aCkge1xuICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHBhdGhcbiAgfVxuXG4gIGNvbnN0IHBhdGhTZWdtZW50cyA9IHBhdGguc3BsaXQoJz8nKVxuXG4gIGlmIChwYXRoU2VnbWVudHMubGVuZ3RoICE9PSAyKSB7XG4gICAgcmV0dXJuIHBhdGhcbiAgfVxuXG4gIGNvbnN0IHFwID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhwYXRoU2VnbWVudHMucG9wKCkpXG4gIHFwLnNvcnQoKVxuICByZXR1cm4gWy4uLnBhdGhTZWdtZW50cywgcXAudG9TdHJpbmcoKV0uam9pbignPycpXG59XG5cbmZ1bmN0aW9uIG1hdGNoS2V5IChtb2NrRGlzcGF0Y2gsIHsgcGF0aCwgbWV0aG9kLCBib2R5LCBoZWFkZXJzIH0pIHtcbiAgY29uc3QgcGF0aE1hdGNoID0gbWF0Y2hWYWx1ZShtb2NrRGlzcGF0Y2gucGF0aCwgcGF0aClcbiAgY29uc3QgbWV0aG9kTWF0Y2ggPSBtYXRjaFZhbHVlKG1vY2tEaXNwYXRjaC5tZXRob2QsIG1ldGhvZClcbiAgY29uc3QgYm9keU1hdGNoID0gdHlwZW9mIG1vY2tEaXNwYXRjaC5ib2R5ICE9PSAndW5kZWZpbmVkJyA/IG1hdGNoVmFsdWUobW9ja0Rpc3BhdGNoLmJvZHksIGJvZHkpIDogdHJ1ZVxuICBjb25zdCBoZWFkZXJzTWF0Y2ggPSBtYXRjaEhlYWRlcnMobW9ja0Rpc3BhdGNoLCBoZWFkZXJzKVxuICByZXR1cm4gcGF0aE1hdGNoICYmIG1ldGhvZE1hdGNoICYmIGJvZHlNYXRjaCAmJiBoZWFkZXJzTWF0Y2hcbn1cblxuZnVuY3Rpb24gZ2V0UmVzcG9uc2VEYXRhIChkYXRhKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoZGF0YSkpIHtcbiAgICByZXR1cm4gZGF0YVxuICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBkYXRhLnRvU3RyaW5nKClcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRNb2NrRGlzcGF0Y2ggKG1vY2tEaXNwYXRjaGVzLCBrZXkpIHtcbiAgY29uc3QgYmFzZVBhdGggPSBrZXkucXVlcnkgPyBidWlsZFVSTChrZXkucGF0aCwga2V5LnF1ZXJ5KSA6IGtleS5wYXRoXG4gIGNvbnN0IHJlc29sdmVkUGF0aCA9IHR5cGVvZiBiYXNlUGF0aCA9PT0gJ3N0cmluZycgPyBzYWZlVXJsKGJhc2VQYXRoKSA6IGJhc2VQYXRoXG5cbiAgLy8gTWF0Y2ggcGF0aFxuICBsZXQgbWF0Y2hlZE1vY2tEaXNwYXRjaGVzID0gbW9ja0Rpc3BhdGNoZXMuZmlsdGVyKCh7IGNvbnN1bWVkIH0pID0+ICFjb25zdW1lZCkuZmlsdGVyKCh7IHBhdGggfSkgPT4gbWF0Y2hWYWx1ZShzYWZlVXJsKHBhdGgpLCByZXNvbHZlZFBhdGgpKVxuICBpZiAobWF0Y2hlZE1vY2tEaXNwYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBNb2NrTm90TWF0Y2hlZEVycm9yKGBNb2NrIGRpc3BhdGNoIG5vdCBtYXRjaGVkIGZvciBwYXRoICcke3Jlc29sdmVkUGF0aH0nYClcbiAgfVxuXG4gIC8vIE1hdGNoIG1ldGhvZFxuICBtYXRjaGVkTW9ja0Rpc3BhdGNoZXMgPSBtYXRjaGVkTW9ja0Rpc3BhdGNoZXMuZmlsdGVyKCh7IG1ldGhvZCB9KSA9PiBtYXRjaFZhbHVlKG1ldGhvZCwga2V5Lm1ldGhvZCkpXG4gIGlmIChtYXRjaGVkTW9ja0Rpc3BhdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IE1vY2tOb3RNYXRjaGVkRXJyb3IoYE1vY2sgZGlzcGF0Y2ggbm90IG1hdGNoZWQgZm9yIG1ldGhvZCAnJHtrZXkubWV0aG9kfSdgKVxuICB9XG5cbiAgLy8gTWF0Y2ggYm9keVxuICBtYXRjaGVkTW9ja0Rpc3BhdGNoZXMgPSBtYXRjaGVkTW9ja0Rpc3BhdGNoZXMuZmlsdGVyKCh7IGJvZHkgfSkgPT4gdHlwZW9mIGJvZHkgIT09ICd1bmRlZmluZWQnID8gbWF0Y2hWYWx1ZShib2R5LCBrZXkuYm9keSkgOiB0cnVlKVxuICBpZiAobWF0Y2hlZE1vY2tEaXNwYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBNb2NrTm90TWF0Y2hlZEVycm9yKGBNb2NrIGRpc3BhdGNoIG5vdCBtYXRjaGVkIGZvciBib2R5ICcke2tleS5ib2R5fSdgKVxuICB9XG5cbiAgLy8gTWF0Y2ggaGVhZGVyc1xuICBtYXRjaGVkTW9ja0Rpc3BhdGNoZXMgPSBtYXRjaGVkTW9ja0Rpc3BhdGNoZXMuZmlsdGVyKChtb2NrRGlzcGF0Y2gpID0+IG1hdGNoSGVhZGVycyhtb2NrRGlzcGF0Y2gsIGtleS5oZWFkZXJzKSlcbiAgaWYgKG1hdGNoZWRNb2NrRGlzcGF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgTW9ja05vdE1hdGNoZWRFcnJvcihgTW9jayBkaXNwYXRjaCBub3QgbWF0Y2hlZCBmb3IgaGVhZGVycyAnJHt0eXBlb2Yga2V5LmhlYWRlcnMgPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoa2V5LmhlYWRlcnMpIDoga2V5LmhlYWRlcnN9J2ApXG4gIH1cblxuICByZXR1cm4gbWF0Y2hlZE1vY2tEaXNwYXRjaGVzWzBdXG59XG5cbmZ1bmN0aW9uIGFkZE1vY2tEaXNwYXRjaCAobW9ja0Rpc3BhdGNoZXMsIGtleSwgZGF0YSkge1xuICBjb25zdCBiYXNlRGF0YSA9IHsgdGltZXNJbnZva2VkOiAwLCB0aW1lczogMSwgcGVyc2lzdDogZmFsc2UsIGNvbnN1bWVkOiBmYWxzZSB9XG4gIGNvbnN0IHJlcGx5RGF0YSA9IHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nID8geyBjYWxsYmFjazogZGF0YSB9IDogeyAuLi5kYXRhIH1cbiAgY29uc3QgbmV3TW9ja0Rpc3BhdGNoID0geyAuLi5iYXNlRGF0YSwgLi4ua2V5LCBwZW5kaW5nOiB0cnVlLCBkYXRhOiB7IGVycm9yOiBudWxsLCAuLi5yZXBseURhdGEgfSB9XG4gIG1vY2tEaXNwYXRjaGVzLnB1c2gobmV3TW9ja0Rpc3BhdGNoKVxuICByZXR1cm4gbmV3TW9ja0Rpc3BhdGNoXG59XG5cbmZ1bmN0aW9uIGRlbGV0ZU1vY2tEaXNwYXRjaCAobW9ja0Rpc3BhdGNoZXMsIGtleSkge1xuICBjb25zdCBpbmRleCA9IG1vY2tEaXNwYXRjaGVzLmZpbmRJbmRleChkaXNwYXRjaCA9PiB7XG4gICAgaWYgKCFkaXNwYXRjaC5jb25zdW1lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiBtYXRjaEtleShkaXNwYXRjaCwga2V5KVxuICB9KVxuICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgbW9ja0Rpc3BhdGNoZXMuc3BsaWNlKGluZGV4LCAxKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkS2V5IChvcHRzKSB7XG4gIGNvbnN0IHsgcGF0aCwgbWV0aG9kLCBib2R5LCBoZWFkZXJzLCBxdWVyeSB9ID0gb3B0c1xuICByZXR1cm4ge1xuICAgIHBhdGgsXG4gICAgbWV0aG9kLFxuICAgIGJvZHksXG4gICAgaGVhZGVycyxcbiAgICBxdWVyeVxuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlS2V5VmFsdWVzIChkYXRhKSB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhkYXRhKS5yZWR1Y2UoKGtleVZhbHVlUGFpcnMsIFtrZXksIHZhbHVlXSkgPT4gW1xuICAgIC4uLmtleVZhbHVlUGFpcnMsXG4gICAgQnVmZmVyLmZyb20oYCR7a2V5fWApLFxuICAgIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUubWFwKHggPT4gQnVmZmVyLmZyb20oYCR7eH1gKSkgOiBCdWZmZXIuZnJvbShgJHt2YWx1ZX1gKVxuICBdLCBbXSlcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvU3RhdHVzXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhdHVzQ29kZVxuICovXG5mdW5jdGlvbiBnZXRTdGF0dXNUZXh0IChzdGF0dXNDb2RlKSB7XG4gIHJldHVybiBTVEFUVVNfQ09ERVNbc3RhdHVzQ29kZV0gfHwgJ3Vua25vd24nXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFJlc3BvbnNlIChib2R5KSB7XG4gIGNvbnN0IGJ1ZmZlcnMgPSBbXVxuICBmb3IgYXdhaXQgKGNvbnN0IGRhdGEgb2YgYm9keSkge1xuICAgIGJ1ZmZlcnMucHVzaChkYXRhKVxuICB9XG4gIHJldHVybiBCdWZmZXIuY29uY2F0KGJ1ZmZlcnMpLnRvU3RyaW5nKCd1dGY4Jylcbn1cblxuLyoqXG4gKiBNb2NrIGRpc3BhdGNoIGZ1bmN0aW9uIHVzZWQgdG8gc2ltdWxhdGUgdW5kaWNpIGRpc3BhdGNoZXNcbiAqL1xuZnVuY3Rpb24gbW9ja0Rpc3BhdGNoIChvcHRzLCBoYW5kbGVyKSB7XG4gIC8vIEdldCBtb2NrIGRpc3BhdGNoIGZyb20gYnVpbHQga2V5XG4gIGNvbnN0IGtleSA9IGJ1aWxkS2V5KG9wdHMpXG4gIGNvbnN0IG1vY2tEaXNwYXRjaCA9IGdldE1vY2tEaXNwYXRjaCh0aGlzW2tEaXNwYXRjaGVzXSwga2V5KVxuXG4gIG1vY2tEaXNwYXRjaC50aW1lc0ludm9rZWQrK1xuXG4gIC8vIEhlcmUncyB3aGVyZSB3ZSByZXNvbHZlIGEgY2FsbGJhY2sgaWYgYSBjYWxsYmFjayBpcyBwcmVzZW50IGZvciB0aGUgZGlzcGF0Y2ggZGF0YS5cbiAgaWYgKG1vY2tEaXNwYXRjaC5kYXRhLmNhbGxiYWNrKSB7XG4gICAgbW9ja0Rpc3BhdGNoLmRhdGEgPSB7IC4uLm1vY2tEaXNwYXRjaC5kYXRhLCAuLi5tb2NrRGlzcGF0Y2guZGF0YS5jYWxsYmFjayhvcHRzKSB9XG4gIH1cblxuICAvLyBQYXJzZSBtb2NrRGlzcGF0Y2ggZGF0YVxuICBjb25zdCB7IGRhdGE6IHsgc3RhdHVzQ29kZSwgZGF0YSwgaGVhZGVycywgdHJhaWxlcnMsIGVycm9yIH0sIGRlbGF5LCBwZXJzaXN0IH0gPSBtb2NrRGlzcGF0Y2hcbiAgY29uc3QgeyB0aW1lc0ludm9rZWQsIHRpbWVzIH0gPSBtb2NrRGlzcGF0Y2hcblxuICAvLyBJZiBpdCdzIHVzZWQgdXAgYW5kIG5vdCBwZXJzaXN0ZW50LCBtYXJrIGFzIGNvbnN1bWVkXG4gIG1vY2tEaXNwYXRjaC5jb25zdW1lZCA9ICFwZXJzaXN0ICYmIHRpbWVzSW52b2tlZCA+PSB0aW1lc1xuICBtb2NrRGlzcGF0Y2gucGVuZGluZyA9IHRpbWVzSW52b2tlZCA8IHRpbWVzXG5cbiAgLy8gSWYgc3BlY2lmaWVkLCB0cmlnZ2VyIGRpc3BhdGNoIGVycm9yXG4gIGlmIChlcnJvciAhPT0gbnVsbCkge1xuICAgIGRlbGV0ZU1vY2tEaXNwYXRjaCh0aGlzW2tEaXNwYXRjaGVzXSwga2V5KVxuICAgIGhhbmRsZXIub25FcnJvcihlcnJvcilcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gSGFuZGxlIHRoZSByZXF1ZXN0IHdpdGggYSBkZWxheSBpZiBuZWNlc3NhcnlcbiAgaWYgKHR5cGVvZiBkZWxheSA9PT0gJ251bWJlcicgJiYgZGVsYXkgPiAwKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBoYW5kbGVSZXBseSh0aGlzW2tEaXNwYXRjaGVzXSlcbiAgICB9LCBkZWxheSlcbiAgfSBlbHNlIHtcbiAgICBoYW5kbGVSZXBseSh0aGlzW2tEaXNwYXRjaGVzXSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZVJlcGx5IChtb2NrRGlzcGF0Y2hlcywgX2RhdGEgPSBkYXRhKSB7XG4gICAgLy8gZmV0Y2gncyBIZWFkZXJzTGlzdCBpcyBhIDFEIHN0cmluZyBhcnJheVxuICAgIGNvbnN0IG9wdHNIZWFkZXJzID0gQXJyYXkuaXNBcnJheShvcHRzLmhlYWRlcnMpXG4gICAgICA/IGJ1aWxkSGVhZGVyc0Zyb21BcnJheShvcHRzLmhlYWRlcnMpXG4gICAgICA6IG9wdHMuaGVhZGVyc1xuICAgIGNvbnN0IGJvZHkgPSB0eXBlb2YgX2RhdGEgPT09ICdmdW5jdGlvbidcbiAgICAgID8gX2RhdGEoeyAuLi5vcHRzLCBoZWFkZXJzOiBvcHRzSGVhZGVycyB9KVxuICAgICAgOiBfZGF0YVxuXG4gICAgLy8gdXRpbC50eXBlcy5pc1Byb21pc2UgaXMgbGlrZWx5IG5lZWRlZCBmb3IgamVzdC5cbiAgICBpZiAoaXNQcm9taXNlKGJvZHkpKSB7XG4gICAgICAvLyBJZiBoYW5kbGVSZXBseSBpcyBhc3luY2hyb25vdXMsIHRocm93aW5nIGFuIGVycm9yXG4gICAgICAvLyBpbiB0aGUgY2FsbGJhY2sgd2lsbCByZWplY3QgdGhlIHByb21pc2UsIHJhdGhlciB0aGFuXG4gICAgICAvLyBzeW5jaHJvbm91c2x5IHRocm93IHRoZSBlcnJvciwgd2hpY2ggYnJlYWtzIHNvbWUgdGVzdHMuXG4gICAgICAvLyBSYXRoZXIsIHdlIHdhaXQgZm9yIHRoZSBjYWxsYmFjayB0byByZXNvbHZlIGlmIGl0IGlzIGFcbiAgICAgIC8vIHByb21pc2UsIGFuZCB0aGVuIHJlLXJ1biBoYW5kbGVSZXBseSB3aXRoIHRoZSBuZXcgYm9keS5cbiAgICAgIGJvZHkudGhlbigobmV3RGF0YSkgPT4gaGFuZGxlUmVwbHkobW9ja0Rpc3BhdGNoZXMsIG5ld0RhdGEpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2VEYXRhID0gZ2V0UmVzcG9uc2VEYXRhKGJvZHkpXG4gICAgY29uc3QgcmVzcG9uc2VIZWFkZXJzID0gZ2VuZXJhdGVLZXlWYWx1ZXMoaGVhZGVycylcbiAgICBjb25zdCByZXNwb25zZVRyYWlsZXJzID0gZ2VuZXJhdGVLZXlWYWx1ZXModHJhaWxlcnMpXG5cbiAgICBoYW5kbGVyLmFib3J0ID0gbm9wXG4gICAgaGFuZGxlci5vbkhlYWRlcnMoc3RhdHVzQ29kZSwgcmVzcG9uc2VIZWFkZXJzLCByZXN1bWUsIGdldFN0YXR1c1RleHQoc3RhdHVzQ29kZSkpXG4gICAgaGFuZGxlci5vbkRhdGEoQnVmZmVyLmZyb20ocmVzcG9uc2VEYXRhKSlcbiAgICBoYW5kbGVyLm9uQ29tcGxldGUocmVzcG9uc2VUcmFpbGVycylcbiAgICBkZWxldGVNb2NrRGlzcGF0Y2gobW9ja0Rpc3BhdGNoZXMsIGtleSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc3VtZSAoKSB7fVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmZ1bmN0aW9uIGJ1aWxkTW9ja0Rpc3BhdGNoICgpIHtcbiAgY29uc3QgYWdlbnQgPSB0aGlzW2tNb2NrQWdlbnRdXG4gIGNvbnN0IG9yaWdpbiA9IHRoaXNba09yaWdpbl1cbiAgY29uc3Qgb3JpZ2luYWxEaXNwYXRjaCA9IHRoaXNba09yaWdpbmFsRGlzcGF0Y2hdXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGRpc3BhdGNoIChvcHRzLCBoYW5kbGVyKSB7XG4gICAgaWYgKGFnZW50LmlzTW9ja0FjdGl2ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbW9ja0Rpc3BhdGNoLmNhbGwodGhpcywgb3B0cywgaGFuZGxlcilcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE1vY2tOb3RNYXRjaGVkRXJyb3IpIHtcbiAgICAgICAgICBjb25zdCBuZXRDb25uZWN0ID0gYWdlbnRba0dldE5ldENvbm5lY3RdKClcbiAgICAgICAgICBpZiAobmV0Q29ubmVjdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBNb2NrTm90TWF0Y2hlZEVycm9yKGAke2Vycm9yLm1lc3NhZ2V9OiBzdWJzZXF1ZW50IHJlcXVlc3QgdG8gb3JpZ2luICR7b3JpZ2lufSB3YXMgbm90IGFsbG93ZWQgKG5ldC5jb25uZWN0IGRpc2FibGVkKWApXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjaGVja05ldENvbm5lY3QobmV0Q29ubmVjdCwgb3JpZ2luKSkge1xuICAgICAgICAgICAgb3JpZ2luYWxEaXNwYXRjaC5jYWxsKHRoaXMsIG9wdHMsIGhhbmRsZXIpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBNb2NrTm90TWF0Y2hlZEVycm9yKGAke2Vycm9yLm1lc3NhZ2V9OiBzdWJzZXF1ZW50IHJlcXVlc3QgdG8gb3JpZ2luICR7b3JpZ2lufSB3YXMgbm90IGFsbG93ZWQgKG5ldC5jb25uZWN0IGlzIG5vdCBlbmFibGVkIGZvciB0aGlzIG9yaWdpbilgKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG9yaWdpbmFsRGlzcGF0Y2guY2FsbCh0aGlzLCBvcHRzLCBoYW5kbGVyKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja05ldENvbm5lY3QgKG5ldENvbm5lY3QsIG9yaWdpbikge1xuICBjb25zdCB1cmwgPSBuZXcgVVJMKG9yaWdpbilcbiAgaWYgKG5ldENvbm5lY3QgPT09IHRydWUpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobmV0Q29ubmVjdCkgJiYgbmV0Q29ubmVjdC5zb21lKChtYXRjaGVyKSA9PiBtYXRjaFZhbHVlKG1hdGNoZXIsIHVybC5ob3N0KSkpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBidWlsZE1vY2tPcHRpb25zIChvcHRzKSB7XG4gIGlmIChvcHRzKSB7XG4gICAgY29uc3QgeyBhZ2VudCwgLi4ubW9ja09wdGlvbnMgfSA9IG9wdHNcbiAgICByZXR1cm4gbW9ja09wdGlvbnNcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0UmVzcG9uc2VEYXRhLFxuICBnZXRNb2NrRGlzcGF0Y2gsXG4gIGFkZE1vY2tEaXNwYXRjaCxcbiAgZGVsZXRlTW9ja0Rpc3BhdGNoLFxuICBidWlsZEtleSxcbiAgZ2VuZXJhdGVLZXlWYWx1ZXMsXG4gIG1hdGNoVmFsdWUsXG4gIGdldFJlc3BvbnNlLFxuICBnZXRTdGF0dXNUZXh0LFxuICBtb2NrRGlzcGF0Y2gsXG4gIGJ1aWxkTW9ja0Rpc3BhdGNoLFxuICBjaGVja05ldENvbm5lY3QsXG4gIGJ1aWxkTW9ja09wdGlvbnMsXG4gIGdldEhlYWRlckJ5TmFtZVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgZ2V0UmVzcG9uc2VEYXRhLCBidWlsZEtleSwgYWRkTW9ja0Rpc3BhdGNoIH0gPSByZXF1aXJlKCcuL21vY2stdXRpbHMnKVxuY29uc3Qge1xuICBrRGlzcGF0Y2hlcyxcbiAga0Rpc3BhdGNoS2V5LFxuICBrRGVmYXVsdEhlYWRlcnMsXG4gIGtEZWZhdWx0VHJhaWxlcnMsXG4gIGtDb250ZW50TGVuZ3RoLFxuICBrTW9ja0Rpc3BhdGNoXG59ID0gcmVxdWlyZSgnLi9tb2NrLXN5bWJvbHMnKVxuY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciB9ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMnKVxuY29uc3QgeyBidWlsZFVSTCB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcblxuLyoqXG4gKiBEZWZpbmVzIHRoZSBzY29wZSBBUEkgZm9yIGFuIGludGVyY2VwdG9yIHJlcGx5XG4gKi9cbmNsYXNzIE1vY2tTY29wZSB7XG4gIGNvbnN0cnVjdG9yIChtb2NrRGlzcGF0Y2gpIHtcbiAgICB0aGlzW2tNb2NrRGlzcGF0Y2hdID0gbW9ja0Rpc3BhdGNoXG4gIH1cblxuICAvKipcbiAgICogRGVsYXkgYSByZXBseSBieSBhIHNldCBhbW91bnQgaW4gbXMuXG4gICAqL1xuICBkZWxheSAod2FpdEluTXMpIHtcbiAgICBpZiAodHlwZW9mIHdhaXRJbk1zICE9PSAnbnVtYmVyJyB8fCAhTnVtYmVyLmlzSW50ZWdlcih3YWl0SW5NcykgfHwgd2FpdEluTXMgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCd3YWl0SW5NcyBtdXN0IGJlIGEgdmFsaWQgaW50ZWdlciA+IDAnKVxuICAgIH1cblxuICAgIHRoaXNba01vY2tEaXNwYXRjaF0uZGVsYXkgPSB3YWl0SW5Nc1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogRm9yIGEgZGVmaW5lZCByZXBseSwgbmV2ZXIgbWFyayBhcyBjb25zdW1lZC5cbiAgICovXG4gIHBlcnNpc3QgKCkge1xuICAgIHRoaXNba01vY2tEaXNwYXRjaF0ucGVyc2lzdCA9IHRydWVcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IG9uZSB0byBkZWZpbmUgYSByZXBseSBmb3IgYSBzZXQgYW1vdW50IG9mIG1hdGNoaW5nIHJlcXVlc3RzLlxuICAgKi9cbiAgdGltZXMgKHJlcGVhdFRpbWVzKSB7XG4gICAgaWYgKHR5cGVvZiByZXBlYXRUaW1lcyAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc0ludGVnZXIocmVwZWF0VGltZXMpIHx8IHJlcGVhdFRpbWVzIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcigncmVwZWF0VGltZXMgbXVzdCBiZSBhIHZhbGlkIGludGVnZXIgPiAwJylcbiAgICB9XG5cbiAgICB0aGlzW2tNb2NrRGlzcGF0Y2hdLnRpbWVzID0gcmVwZWF0VGltZXNcbiAgICByZXR1cm4gdGhpc1xuICB9XG59XG5cbi8qKlxuICogRGVmaW5lcyBhbiBpbnRlcmNlcHRvciBmb3IgYSBNb2NrXG4gKi9cbmNsYXNzIE1vY2tJbnRlcmNlcHRvciB7XG4gIGNvbnN0cnVjdG9yIChvcHRzLCBtb2NrRGlzcGF0Y2hlcykge1xuICAgIGlmICh0eXBlb2Ygb3B0cyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignb3B0cyBtdXN0IGJlIGFuIG9iamVjdCcpXG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3B0cy5wYXRoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdvcHRzLnBhdGggbXVzdCBiZSBkZWZpbmVkJylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvcHRzLm1ldGhvZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIG9wdHMubWV0aG9kID0gJ0dFVCdcbiAgICB9XG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2lzc3Vlcy8xMjQ1XG4gICAgLy8gQXMgcGVyIFJGQyAzOTg2LCBjbGllbnRzIGFyZSBub3Qgc3VwcG9zZWQgdG8gc2VuZCBVUklcbiAgICAvLyBmcmFnbWVudHMgdG8gc2VydmVycyB3aGVuIHRoZXkgcmV0cmlldmUgYSBkb2N1bWVudCxcbiAgICBpZiAodHlwZW9mIG9wdHMucGF0aCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChvcHRzLnF1ZXJ5KSB7XG4gICAgICAgIG9wdHMucGF0aCA9IGJ1aWxkVVJMKG9wdHMucGF0aCwgb3B0cy5xdWVyeSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE1hdGNoZXMgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvYmxvYi9tYWluL2xpYi9mZXRjaC9pbmRleC5qcyNMMTgxMVxuICAgICAgICBjb25zdCBwYXJzZWRVUkwgPSBuZXcgVVJMKG9wdHMucGF0aCwgJ2RhdGE6Ly8nKVxuICAgICAgICBvcHRzLnBhdGggPSBwYXJzZWRVUkwucGF0aG5hbWUgKyBwYXJzZWRVUkwuc2VhcmNoXG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3B0cy5tZXRob2QgPT09ICdzdHJpbmcnKSB7XG4gICAgICBvcHRzLm1ldGhvZCA9IG9wdHMubWV0aG9kLnRvVXBwZXJDYXNlKClcbiAgICB9XG5cbiAgICB0aGlzW2tEaXNwYXRjaEtleV0gPSBidWlsZEtleShvcHRzKVxuICAgIHRoaXNba0Rpc3BhdGNoZXNdID0gbW9ja0Rpc3BhdGNoZXNcbiAgICB0aGlzW2tEZWZhdWx0SGVhZGVyc10gPSB7fVxuICAgIHRoaXNba0RlZmF1bHRUcmFpbGVyc10gPSB7fVxuICAgIHRoaXNba0NvbnRlbnRMZW5ndGhdID0gZmFsc2VcbiAgfVxuXG4gIGNyZWF0ZU1vY2tTY29wZURpc3BhdGNoRGF0YSAoc3RhdHVzQ29kZSwgZGF0YSwgcmVzcG9uc2VPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCByZXNwb25zZURhdGEgPSBnZXRSZXNwb25zZURhdGEoZGF0YSlcbiAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gdGhpc1trQ29udGVudExlbmd0aF0gPyB7ICdjb250ZW50LWxlbmd0aCc6IHJlc3BvbnNlRGF0YS5sZW5ndGggfSA6IHt9XG4gICAgY29uc3QgaGVhZGVycyA9IHsgLi4udGhpc1trRGVmYXVsdEhlYWRlcnNdLCAuLi5jb250ZW50TGVuZ3RoLCAuLi5yZXNwb25zZU9wdGlvbnMuaGVhZGVycyB9XG4gICAgY29uc3QgdHJhaWxlcnMgPSB7IC4uLnRoaXNba0RlZmF1bHRUcmFpbGVyc10sIC4uLnJlc3BvbnNlT3B0aW9ucy50cmFpbGVycyB9XG5cbiAgICByZXR1cm4geyBzdGF0dXNDb2RlLCBkYXRhLCBoZWFkZXJzLCB0cmFpbGVycyB9XG4gIH1cblxuICB2YWxpZGF0ZVJlcGx5UGFyYW1ldGVycyAoc3RhdHVzQ29kZSwgZGF0YSwgcmVzcG9uc2VPcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBzdGF0dXNDb2RlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdzdGF0dXNDb2RlIG11c3QgYmUgZGVmaW5lZCcpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignZGF0YSBtdXN0IGJlIGRlZmluZWQnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlc3BvbnNlT3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcigncmVzcG9uc2VPcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0JylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTW9jayBhbiB1bmRpY2kgcmVxdWVzdCB3aXRoIGEgZGVmaW5lZCByZXBseS5cbiAgICovXG4gIHJlcGx5IChyZXBseURhdGEpIHtcbiAgICAvLyBWYWx1ZXMgb2YgcmVwbHkgYXJlbid0IGF2YWlsYWJsZSByaWdodCBub3cgYXMgdGhleVxuICAgIC8vIGNhbiBvbmx5IGJlIGF2YWlsYWJsZSB3aGVuIHRoZSByZXBseSBjYWxsYmFjayBpcyBpbnZva2VkLlxuICAgIGlmICh0eXBlb2YgcmVwbHlEYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBXZSdsbCBmaXJzdCB3cmFwIHRoZSBwcm92aWRlZCBjYWxsYmFjayBpbiBhbm90aGVyIGZ1bmN0aW9uLFxuICAgICAgLy8gdGhpcyBmdW5jdGlvbiB3aWxsIHByb3Blcmx5IHJlc29sdmUgdGhlIGRhdGEgZnJvbSB0aGUgY2FsbGJhY2tcbiAgICAgIC8vIHdoZW4gaW52b2tlZC5cbiAgICAgIGNvbnN0IHdyYXBwZWREZWZhdWx0c0NhbGxiYWNrID0gKG9wdHMpID0+IHtcbiAgICAgICAgLy8gT3VyIHJlcGx5IG9wdGlvbnMgY2FsbGJhY2sgY29udGFpbnMgdGhlIHBhcmFtZXRlciBmb3Igc3RhdHVzQ29kZSwgZGF0YSBhbmQgb3B0aW9ucy5cbiAgICAgICAgY29uc3QgcmVzb2x2ZWREYXRhID0gcmVwbHlEYXRhKG9wdHMpXG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgaXQgaXMgaW4gdGhlIHJpZ2h0IGZvcm1hdFxuICAgICAgICBpZiAodHlwZW9mIHJlc29sdmVkRGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3JlcGx5IG9wdGlvbnMgY2FsbGJhY2sgbXVzdCByZXR1cm4gYW4gb2JqZWN0JylcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgc3RhdHVzQ29kZSwgZGF0YSA9ICcnLCByZXNwb25zZU9wdGlvbnMgPSB7fSB9ID0gcmVzb2x2ZWREYXRhXG4gICAgICAgIHRoaXMudmFsaWRhdGVSZXBseVBhcmFtZXRlcnMoc3RhdHVzQ29kZSwgZGF0YSwgcmVzcG9uc2VPcHRpb25zKVxuICAgICAgICAvLyBTaW5jZSB0aGUgdmFsdWVzIGNhbiBiZSBvYnRhaW5lZCBpbW1lZGlhdGVseSB3ZSByZXR1cm4gdGhlbVxuICAgICAgICAvLyBmcm9tIHRoaXMgaGlnaGVyIG9yZGVyIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSByZXNvbHZlZCBsYXRlci5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi50aGlzLmNyZWF0ZU1vY2tTY29wZURpc3BhdGNoRGF0YShzdGF0dXNDb2RlLCBkYXRhLCByZXNwb25zZU9wdGlvbnMpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQWRkIHVzdWFsIGRpc3BhdGNoIGRhdGEsIGJ1dCB0aGlzIHRpbWUgc2V0IHRoZSBkYXRhIHBhcmFtZXRlciB0byBmdW5jdGlvbiB0aGF0IHdpbGwgZXZlbnR1YWxseSBwcm92aWRlIGRhdGEuXG4gICAgICBjb25zdCBuZXdNb2NrRGlzcGF0Y2ggPSBhZGRNb2NrRGlzcGF0Y2godGhpc1trRGlzcGF0Y2hlc10sIHRoaXNba0Rpc3BhdGNoS2V5XSwgd3JhcHBlZERlZmF1bHRzQ2FsbGJhY2spXG4gICAgICByZXR1cm4gbmV3IE1vY2tTY29wZShuZXdNb2NrRGlzcGF0Y2gpXG4gICAgfVxuXG4gICAgLy8gV2UgY2FuIGhhdmUgZWl0aGVyIG9uZSBvciB0aHJlZSBwYXJhbWV0ZXJzLCBpZiB3ZSBnZXQgaGVyZSxcbiAgICAvLyB3ZSBzaG91bGQgaGF2ZSAxLTMgcGFyYW1ldGVycy4gU28gd2Ugc3ByZWFkIHRoZSBhcmd1bWVudHMgb2ZcbiAgICAvLyB0aGlzIGZ1bmN0aW9uIHRvIG9idGFpbiB0aGUgcGFyYW1ldGVycywgc2luY2UgcmVwbHlEYXRhIHdpbGwgYWx3YXlzXG4gICAgLy8ganVzdCBiZSB0aGUgc3RhdHVzQ29kZS5cbiAgICBjb25zdCBbc3RhdHVzQ29kZSwgZGF0YSA9ICcnLCByZXNwb25zZU9wdGlvbnMgPSB7fV0gPSBbLi4uYXJndW1lbnRzXVxuICAgIHRoaXMudmFsaWRhdGVSZXBseVBhcmFtZXRlcnMoc3RhdHVzQ29kZSwgZGF0YSwgcmVzcG9uc2VPcHRpb25zKVxuXG4gICAgLy8gU2VuZCBpbi1hbHJlYWR5IHByb3ZpZGVkIGRhdGEgbGlrZSB1c3VhbFxuICAgIGNvbnN0IGRpc3BhdGNoRGF0YSA9IHRoaXMuY3JlYXRlTW9ja1Njb3BlRGlzcGF0Y2hEYXRhKHN0YXR1c0NvZGUsIGRhdGEsIHJlc3BvbnNlT3B0aW9ucylcbiAgICBjb25zdCBuZXdNb2NrRGlzcGF0Y2ggPSBhZGRNb2NrRGlzcGF0Y2godGhpc1trRGlzcGF0Y2hlc10sIHRoaXNba0Rpc3BhdGNoS2V5XSwgZGlzcGF0Y2hEYXRhKVxuICAgIHJldHVybiBuZXcgTW9ja1Njb3BlKG5ld01vY2tEaXNwYXRjaClcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2NrIGFuIHVuZGljaSByZXF1ZXN0IHdpdGggYSBkZWZpbmVkIGVycm9yLlxuICAgKi9cbiAgcmVwbHlXaXRoRXJyb3IgKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignZXJyb3IgbXVzdCBiZSBkZWZpbmVkJylcbiAgICB9XG5cbiAgICBjb25zdCBuZXdNb2NrRGlzcGF0Y2ggPSBhZGRNb2NrRGlzcGF0Y2godGhpc1trRGlzcGF0Y2hlc10sIHRoaXNba0Rpc3BhdGNoS2V5XSwgeyBlcnJvciB9KVxuICAgIHJldHVybiBuZXcgTW9ja1Njb3BlKG5ld01vY2tEaXNwYXRjaClcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZGVmYXVsdCByZXBseSBoZWFkZXJzIG9uIHRoZSBpbnRlcmNlcHRvciBmb3Igc3Vic2VxdWVudCByZXBsaWVzXG4gICAqL1xuICBkZWZhdWx0UmVwbHlIZWFkZXJzIChoZWFkZXJzKSB7XG4gICAgaWYgKHR5cGVvZiBoZWFkZXJzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdoZWFkZXJzIG11c3QgYmUgZGVmaW5lZCcpXG4gICAgfVxuXG4gICAgdGhpc1trRGVmYXVsdEhlYWRlcnNdID0gaGVhZGVyc1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogU2V0IGRlZmF1bHQgcmVwbHkgdHJhaWxlcnMgb24gdGhlIGludGVyY2VwdG9yIGZvciBzdWJzZXF1ZW50IHJlcGxpZXNcbiAgICovXG4gIGRlZmF1bHRSZXBseVRyYWlsZXJzICh0cmFpbGVycykge1xuICAgIGlmICh0eXBlb2YgdHJhaWxlcnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3RyYWlsZXJzIG11c3QgYmUgZGVmaW5lZCcpXG4gICAgfVxuXG4gICAgdGhpc1trRGVmYXVsdFRyYWlsZXJzXSA9IHRyYWlsZXJzXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcmVwbHkgY29udGVudCBsZW5ndGggaGVhZGVyIGZvciByZXBsaWVzIG9uIHRoZSBpbnRlcmNlcHRvclxuICAgKi9cbiAgcmVwbHlDb250ZW50TGVuZ3RoICgpIHtcbiAgICB0aGlzW2tDb250ZW50TGVuZ3RoXSA9IHRydWVcbiAgICByZXR1cm4gdGhpc1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzLk1vY2tJbnRlcmNlcHRvciA9IE1vY2tJbnRlcmNlcHRvclxubW9kdWxlLmV4cG9ydHMuTW9ja1Njb3BlID0gTW9ja1Njb3BlXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBwcm9taXNpZnkgfSA9IHJlcXVpcmUoJ3V0aWwnKVxuY29uc3QgQ2xpZW50ID0gcmVxdWlyZSgnLi4vY2xpZW50JylcbmNvbnN0IHsgYnVpbGRNb2NrRGlzcGF0Y2ggfSA9IHJlcXVpcmUoJy4vbW9jay11dGlscycpXG5jb25zdCB7XG4gIGtEaXNwYXRjaGVzLFxuICBrTW9ja0FnZW50LFxuICBrQ2xvc2UsXG4gIGtPcmlnaW5hbENsb3NlLFxuICBrT3JpZ2luLFxuICBrT3JpZ2luYWxEaXNwYXRjaCxcbiAga0Nvbm5lY3RlZFxufSA9IHJlcXVpcmUoJy4vbW9jay1zeW1ib2xzJylcbmNvbnN0IHsgTW9ja0ludGVyY2VwdG9yIH0gPSByZXF1aXJlKCcuL21vY2staW50ZXJjZXB0b3InKVxuY29uc3QgU3ltYm9scyA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5cbi8qKlxuICogTW9ja0NsaWVudCBwcm92aWRlcyBhbiBBUEkgdGhhdCBleHRlbmRzIHRoZSBDbGllbnQgdG8gaW5mbHVlbmNlIHRoZSBtb2NrRGlzcGF0Y2hlcy5cbiAqL1xuY2xhc3MgTW9ja0NsaWVudCBleHRlbmRzIENsaWVudCB7XG4gIGNvbnN0cnVjdG9yIChvcmlnaW4sIG9wdHMpIHtcbiAgICBzdXBlcihvcmlnaW4sIG9wdHMpXG5cbiAgICBpZiAoIW9wdHMgfHwgIW9wdHMuYWdlbnQgfHwgdHlwZW9mIG9wdHMuYWdlbnQuZGlzcGF0Y2ggIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignQXJndW1lbnQgb3B0cy5hZ2VudCBtdXN0IGltcGxlbWVudCBBZ2VudCcpXG4gICAgfVxuXG4gICAgdGhpc1trTW9ja0FnZW50XSA9IG9wdHMuYWdlbnRcbiAgICB0aGlzW2tPcmlnaW5dID0gb3JpZ2luXG4gICAgdGhpc1trRGlzcGF0Y2hlc10gPSBbXVxuICAgIHRoaXNba0Nvbm5lY3RlZF0gPSAxXG4gICAgdGhpc1trT3JpZ2luYWxEaXNwYXRjaF0gPSB0aGlzLmRpc3BhdGNoXG4gICAgdGhpc1trT3JpZ2luYWxDbG9zZV0gPSB0aGlzLmNsb3NlLmJpbmQodGhpcylcblxuICAgIHRoaXMuZGlzcGF0Y2ggPSBidWlsZE1vY2tEaXNwYXRjaC5jYWxsKHRoaXMpXG4gICAgdGhpcy5jbG9zZSA9IHRoaXNba0Nsb3NlXVxuICB9XG5cbiAgZ2V0IFtTeW1ib2xzLmtDb25uZWN0ZWRdICgpIHtcbiAgICByZXR1cm4gdGhpc1trQ29ubmVjdGVkXVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXAgdGhlIGJhc2UgaW50ZXJjZXB0b3IgZm9yIG1vY2tpbmcgcmVwbGllcyBmcm9tIHVuZGljaS5cbiAgICovXG4gIGludGVyY2VwdCAob3B0cykge1xuICAgIHJldHVybiBuZXcgTW9ja0ludGVyY2VwdG9yKG9wdHMsIHRoaXNba0Rpc3BhdGNoZXNdKVxuICB9XG5cbiAgYXN5bmMgW2tDbG9zZV0gKCkge1xuICAgIGF3YWl0IHByb21pc2lmeSh0aGlzW2tPcmlnaW5hbENsb3NlXSkoKVxuICAgIHRoaXNba0Nvbm5lY3RlZF0gPSAwXG4gICAgdGhpc1trTW9ja0FnZW50XVtTeW1ib2xzLmtDbGllbnRzXS5kZWxldGUodGhpc1trT3JpZ2luXSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IE1vY2tDbGllbnRcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IHByb21pc2lmeSB9ID0gcmVxdWlyZSgndXRpbCcpXG5jb25zdCBQb29sID0gcmVxdWlyZSgnLi4vcG9vbCcpXG5jb25zdCB7IGJ1aWxkTW9ja0Rpc3BhdGNoIH0gPSByZXF1aXJlKCcuL21vY2stdXRpbHMnKVxuY29uc3Qge1xuICBrRGlzcGF0Y2hlcyxcbiAga01vY2tBZ2VudCxcbiAga0Nsb3NlLFxuICBrT3JpZ2luYWxDbG9zZSxcbiAga09yaWdpbixcbiAga09yaWdpbmFsRGlzcGF0Y2gsXG4gIGtDb25uZWN0ZWRcbn0gPSByZXF1aXJlKCcuL21vY2stc3ltYm9scycpXG5jb25zdCB7IE1vY2tJbnRlcmNlcHRvciB9ID0gcmVxdWlyZSgnLi9tb2NrLWludGVyY2VwdG9yJylcbmNvbnN0IFN5bWJvbHMgPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciB9ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMnKVxuXG4vKipcbiAqIE1vY2tQb29sIHByb3ZpZGVzIGFuIEFQSSB0aGF0IGV4dGVuZHMgdGhlIFBvb2wgdG8gaW5mbHVlbmNlIHRoZSBtb2NrRGlzcGF0Y2hlcy5cbiAqL1xuY2xhc3MgTW9ja1Bvb2wgZXh0ZW5kcyBQb29sIHtcbiAgY29uc3RydWN0b3IgKG9yaWdpbiwgb3B0cykge1xuICAgIHN1cGVyKG9yaWdpbiwgb3B0cylcblxuICAgIGlmICghb3B0cyB8fCAhb3B0cy5hZ2VudCB8fCB0eXBlb2Ygb3B0cy5hZ2VudC5kaXNwYXRjaCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdBcmd1bWVudCBvcHRzLmFnZW50IG11c3QgaW1wbGVtZW50IEFnZW50JylcbiAgICB9XG5cbiAgICB0aGlzW2tNb2NrQWdlbnRdID0gb3B0cy5hZ2VudFxuICAgIHRoaXNba09yaWdpbl0gPSBvcmlnaW5cbiAgICB0aGlzW2tEaXNwYXRjaGVzXSA9IFtdXG4gICAgdGhpc1trQ29ubmVjdGVkXSA9IDFcbiAgICB0aGlzW2tPcmlnaW5hbERpc3BhdGNoXSA9IHRoaXMuZGlzcGF0Y2hcbiAgICB0aGlzW2tPcmlnaW5hbENsb3NlXSA9IHRoaXMuY2xvc2UuYmluZCh0aGlzKVxuXG4gICAgdGhpcy5kaXNwYXRjaCA9IGJ1aWxkTW9ja0Rpc3BhdGNoLmNhbGwodGhpcylcbiAgICB0aGlzLmNsb3NlID0gdGhpc1trQ2xvc2VdXG4gIH1cblxuICBnZXQgW1N5bWJvbHMua0Nvbm5lY3RlZF0gKCkge1xuICAgIHJldHVybiB0aGlzW2tDb25uZWN0ZWRdXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCB0aGUgYmFzZSBpbnRlcmNlcHRvciBmb3IgbW9ja2luZyByZXBsaWVzIGZyb20gdW5kaWNpLlxuICAgKi9cbiAgaW50ZXJjZXB0IChvcHRzKSB7XG4gICAgcmV0dXJuIG5ldyBNb2NrSW50ZXJjZXB0b3Iob3B0cywgdGhpc1trRGlzcGF0Y2hlc10pXG4gIH1cblxuICBhc3luYyBba0Nsb3NlXSAoKSB7XG4gICAgYXdhaXQgcHJvbWlzaWZ5KHRoaXNba09yaWdpbmFsQ2xvc2VdKSgpXG4gICAgdGhpc1trQ29ubmVjdGVkXSA9IDBcbiAgICB0aGlzW2tNb2NrQWdlbnRdW1N5bWJvbHMua0NsaWVudHNdLmRlbGV0ZSh0aGlzW2tPcmlnaW5dKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTW9ja1Bvb2xcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBzaW5ndWxhcnMgPSB7XG4gIHByb25vdW46ICdpdCcsXG4gIGlzOiAnaXMnLFxuICB3YXM6ICd3YXMnLFxuICB0aGlzOiAndGhpcydcbn1cblxuY29uc3QgcGx1cmFscyA9IHtcbiAgcHJvbm91bjogJ3RoZXknLFxuICBpczogJ2FyZScsXG4gIHdhczogJ3dlcmUnLFxuICB0aGlzOiAndGhlc2UnXG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgUGx1cmFsaXplciB7XG4gIGNvbnN0cnVjdG9yIChzaW5ndWxhciwgcGx1cmFsKSB7XG4gICAgdGhpcy5zaW5ndWxhciA9IHNpbmd1bGFyXG4gICAgdGhpcy5wbHVyYWwgPSBwbHVyYWxcbiAgfVxuXG4gIHBsdXJhbGl6ZSAoY291bnQpIHtcbiAgICBjb25zdCBvbmUgPSBjb3VudCA9PT0gMVxuICAgIGNvbnN0IGtleXMgPSBvbmUgPyBzaW5ndWxhcnMgOiBwbHVyYWxzXG4gICAgY29uc3Qgbm91biA9IG9uZSA/IHRoaXMuc2luZ3VsYXIgOiB0aGlzLnBsdXJhbFxuICAgIHJldHVybiB7IC4uLmtleXMsIGNvdW50LCBub3VuIH1cbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgVHJhbnNmb3JtIH0gPSByZXF1aXJlKCdzdHJlYW0nKVxuY29uc3QgeyBDb25zb2xlIH0gPSByZXF1aXJlKCdjb25zb2xlJylcblxuLyoqXG4gKiBHZXRzIHRoZSBvdXRwdXQgb2YgYGNvbnNvbGUudGFibGUo4oCmKWAgYXMgYSBzdHJpbmcuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgUGVuZGluZ0ludGVyY2VwdG9yc0Zvcm1hdHRlciB7XG4gIGNvbnN0cnVjdG9yICh7IGRpc2FibGVDb2xvcnMgfSA9IHt9KSB7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKHtcbiAgICAgIHRyYW5zZm9ybSAoY2h1bmssIF9lbmMsIGNiKSB7XG4gICAgICAgIGNiKG51bGwsIGNodW5rKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBDb25zb2xlKHtcbiAgICAgIHN0ZG91dDogdGhpcy50cmFuc2Zvcm0sXG4gICAgICBpbnNwZWN0T3B0aW9uczoge1xuICAgICAgICBjb2xvcnM6ICFkaXNhYmxlQ29sb3JzICYmICFwcm9jZXNzLmVudi5DSVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmb3JtYXQgKHBlbmRpbmdJbnRlcmNlcHRvcnMpIHtcbiAgICBjb25zdCB3aXRoUHJldHR5SGVhZGVycyA9IHBlbmRpbmdJbnRlcmNlcHRvcnMubWFwKFxuICAgICAgKHsgbWV0aG9kLCBwYXRoLCBkYXRhOiB7IHN0YXR1c0NvZGUgfSwgcGVyc2lzdCwgdGltZXMsIHRpbWVzSW52b2tlZCwgb3JpZ2luIH0pID0+ICh7XG4gICAgICAgIE1ldGhvZDogbWV0aG9kLFxuICAgICAgICBPcmlnaW46IG9yaWdpbixcbiAgICAgICAgUGF0aDogcGF0aCxcbiAgICAgICAgJ1N0YXR1cyBjb2RlJzogc3RhdHVzQ29kZSxcbiAgICAgICAgUGVyc2lzdGVudDogcGVyc2lzdCA/ICfinIUnIDogJ+KdjCcsXG4gICAgICAgIEludm9jYXRpb25zOiB0aW1lc0ludm9rZWQsXG4gICAgICAgIFJlbWFpbmluZzogcGVyc2lzdCA/IEluZmluaXR5IDogdGltZXMgLSB0aW1lc0ludm9rZWRcbiAgICAgIH0pKVxuXG4gICAgdGhpcy5sb2dnZXIudGFibGUod2l0aFByZXR0eUhlYWRlcnMpXG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnJlYWQoKS50b1N0cmluZygpXG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IGtDbGllbnRzIH0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuY29uc3QgQWdlbnQgPSByZXF1aXJlKCcuLi9hZ2VudCcpXG5jb25zdCB7XG4gIGtBZ2VudCxcbiAga01vY2tBZ2VudFNldCxcbiAga01vY2tBZ2VudEdldCxcbiAga0Rpc3BhdGNoZXMsXG4gIGtJc01vY2tBY3RpdmUsXG4gIGtOZXRDb25uZWN0LFxuICBrR2V0TmV0Q29ubmVjdCxcbiAga09wdGlvbnMsXG4gIGtGYWN0b3J5XG59ID0gcmVxdWlyZSgnLi9tb2NrLXN5bWJvbHMnKVxuY29uc3QgTW9ja0NsaWVudCA9IHJlcXVpcmUoJy4vbW9jay1jbGllbnQnKVxuY29uc3QgTW9ja1Bvb2wgPSByZXF1aXJlKCcuL21vY2stcG9vbCcpXG5jb25zdCB7IG1hdGNoVmFsdWUsIGJ1aWxkTW9ja09wdGlvbnMgfSA9IHJlcXVpcmUoJy4vbW9jay11dGlscycpXG5jb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yLCBVbmRpY2lFcnJvciB9ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMnKVxuY29uc3QgRGlzcGF0Y2hlciA9IHJlcXVpcmUoJy4uL2Rpc3BhdGNoZXInKVxuY29uc3QgUGx1cmFsaXplciA9IHJlcXVpcmUoJy4vcGx1cmFsaXplcicpXG5jb25zdCBQZW5kaW5nSW50ZXJjZXB0b3JzRm9ybWF0dGVyID0gcmVxdWlyZSgnLi9wZW5kaW5nLWludGVyY2VwdG9ycy1mb3JtYXR0ZXInKVxuXG5jbGFzcyBGYWtlV2Vha1JlZiB7XG4gIGNvbnN0cnVjdG9yICh2YWx1ZSkge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZVxuICB9XG5cbiAgZGVyZWYgKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlXG4gIH1cbn1cblxuY2xhc3MgTW9ja0FnZW50IGV4dGVuZHMgRGlzcGF0Y2hlciB7XG4gIGNvbnN0cnVjdG9yIChvcHRzKSB7XG4gICAgc3VwZXIob3B0cylcblxuICAgIHRoaXNba05ldENvbm5lY3RdID0gdHJ1ZVxuICAgIHRoaXNba0lzTW9ja0FjdGl2ZV0gPSB0cnVlXG5cbiAgICAvLyBJbnN0YW50aWF0ZSBBZ2VudCBhbmQgZW5jYXBzdWxhdGVcbiAgICBpZiAoKG9wdHMgJiYgb3B0cy5hZ2VudCAmJiB0eXBlb2Ygb3B0cy5hZ2VudC5kaXNwYXRjaCAhPT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignQXJndW1lbnQgb3B0cy5hZ2VudCBtdXN0IGltcGxlbWVudCBBZ2VudCcpXG4gICAgfVxuICAgIGNvbnN0IGFnZW50ID0gb3B0cyAmJiBvcHRzLmFnZW50ID8gb3B0cy5hZ2VudCA6IG5ldyBBZ2VudChvcHRzKVxuICAgIHRoaXNba0FnZW50XSA9IGFnZW50XG5cbiAgICB0aGlzW2tDbGllbnRzXSA9IGFnZW50W2tDbGllbnRzXVxuICAgIHRoaXNba09wdGlvbnNdID0gYnVpbGRNb2NrT3B0aW9ucyhvcHRzKVxuICB9XG5cbiAgZ2V0IChvcmlnaW4pIHtcbiAgICBsZXQgZGlzcGF0Y2hlciA9IHRoaXNba01vY2tBZ2VudEdldF0ob3JpZ2luKVxuXG4gICAgaWYgKCFkaXNwYXRjaGVyKSB7XG4gICAgICBkaXNwYXRjaGVyID0gdGhpc1trRmFjdG9yeV0ob3JpZ2luKVxuICAgICAgdGhpc1trTW9ja0FnZW50U2V0XShvcmlnaW4sIGRpc3BhdGNoZXIpXG4gICAgfVxuICAgIHJldHVybiBkaXNwYXRjaGVyXG4gIH1cblxuICBkaXNwYXRjaCAob3B0cywgaGFuZGxlcikge1xuICAgIC8vIENhbGwgTW9ja0FnZW50LmdldCB0byBwZXJmb3JtIGFkZGl0aW9uYWwgc2V0dXAgYmVmb3JlIGRpc3BhdGNoaW5nIGFzIG5vcm1hbFxuICAgIHRoaXMuZ2V0KG9wdHMub3JpZ2luKVxuICAgIHJldHVybiB0aGlzW2tBZ2VudF0uZGlzcGF0Y2gob3B0cywgaGFuZGxlcilcbiAgfVxuXG4gIGFzeW5jIGNsb3NlICgpIHtcbiAgICBhd2FpdCB0aGlzW2tBZ2VudF0uY2xvc2UoKVxuICAgIHRoaXNba0NsaWVudHNdLmNsZWFyKClcbiAgfVxuXG4gIGRlYWN0aXZhdGUgKCkge1xuICAgIHRoaXNba0lzTW9ja0FjdGl2ZV0gPSBmYWxzZVxuICB9XG5cbiAgYWN0aXZhdGUgKCkge1xuICAgIHRoaXNba0lzTW9ja0FjdGl2ZV0gPSB0cnVlXG4gIH1cblxuICBlbmFibGVOZXRDb25uZWN0IChtYXRjaGVyKSB7XG4gICAgaWYgKHR5cGVvZiBtYXRjaGVyID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbWF0Y2hlciA9PT0gJ2Z1bmN0aW9uJyB8fCBtYXRjaGVyIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzW2tOZXRDb25uZWN0XSkpIHtcbiAgICAgICAgdGhpc1trTmV0Q29ubmVjdF0ucHVzaChtYXRjaGVyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpc1trTmV0Q29ubmVjdF0gPSBbbWF0Y2hlcl1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtYXRjaGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpc1trTmV0Q29ubmVjdF0gPSB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignVW5zdXBwb3J0ZWQgbWF0Y2hlci4gTXVzdCBiZSBvbmUgb2YgU3RyaW5nfEZ1bmN0aW9ufFJlZ0V4cC4nKVxuICAgIH1cbiAgfVxuXG4gIGRpc2FibGVOZXRDb25uZWN0ICgpIHtcbiAgICB0aGlzW2tOZXRDb25uZWN0XSA9IGZhbHNlXG4gIH1cblxuICAvLyBUaGlzIGlzIHJlcXVpcmVkIHRvIGJ5cGFzcyBpc3N1ZXMgY2F1c2VkIGJ5IHVzaW5nIGdsb2JhbCBzeW1ib2xzIC0gc2VlOlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9pc3N1ZXMvMTQ0N1xuICBnZXQgaXNNb2NrQWN0aXZlICgpIHtcbiAgICByZXR1cm4gdGhpc1trSXNNb2NrQWN0aXZlXVxuICB9XG5cbiAgW2tNb2NrQWdlbnRTZXRdIChvcmlnaW4sIGRpc3BhdGNoZXIpIHtcbiAgICB0aGlzW2tDbGllbnRzXS5zZXQob3JpZ2luLCBuZXcgRmFrZVdlYWtSZWYoZGlzcGF0Y2hlcikpXG4gIH1cblxuICBba0ZhY3RvcnldIChvcmlnaW4pIHtcbiAgICBjb25zdCBtb2NrT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oeyBhZ2VudDogdGhpcyB9LCB0aGlzW2tPcHRpb25zXSlcbiAgICByZXR1cm4gdGhpc1trT3B0aW9uc10gJiYgdGhpc1trT3B0aW9uc10uY29ubmVjdGlvbnMgPT09IDFcbiAgICAgID8gbmV3IE1vY2tDbGllbnQob3JpZ2luLCBtb2NrT3B0aW9ucylcbiAgICAgIDogbmV3IE1vY2tQb29sKG9yaWdpbiwgbW9ja09wdGlvbnMpXG4gIH1cblxuICBba01vY2tBZ2VudEdldF0gKG9yaWdpbikge1xuICAgIC8vIEZpcnN0IGNoZWNrIGlmIHdlIGNhbiBpbW1lZGlhdGVseSBmaW5kIGl0XG4gICAgY29uc3QgcmVmID0gdGhpc1trQ2xpZW50c10uZ2V0KG9yaWdpbilcbiAgICBpZiAocmVmKSB7XG4gICAgICByZXR1cm4gcmVmLmRlcmVmKClcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgb3JpZ2luIGlzIG5vdCBhIHN0cmluZyBjcmVhdGUgYSBkdW1teSBwYXJlbnQgcG9vbCBhbmQgcmV0dXJuIHRvIHVzZXJcbiAgICBpZiAodHlwZW9mIG9yaWdpbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGRpc3BhdGNoZXIgPSB0aGlzW2tGYWN0b3J5XSgnaHR0cDovL2xvY2FsaG9zdDo5OTk5JylcbiAgICAgIHRoaXNba01vY2tBZ2VudFNldF0ob3JpZ2luLCBkaXNwYXRjaGVyKVxuICAgICAgcmV0dXJuIGRpc3BhdGNoZXJcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBtYXRjaCwgY3JlYXRlIGEgcG9vbCBhbmQgYXNzaWduIHRoZSBzYW1lIGRpc3BhdGNoZXNcbiAgICBmb3IgKGNvbnN0IFtrZXlNYXRjaGVyLCBub25FeHBsaWNpdFJlZl0gb2YgQXJyYXkuZnJvbSh0aGlzW2tDbGllbnRzXSkpIHtcbiAgICAgIGNvbnN0IG5vbkV4cGxpY2l0RGlzcGF0Y2hlciA9IG5vbkV4cGxpY2l0UmVmLmRlcmVmKClcbiAgICAgIGlmIChub25FeHBsaWNpdERpc3BhdGNoZXIgJiYgdHlwZW9mIGtleU1hdGNoZXIgIT09ICdzdHJpbmcnICYmIG1hdGNoVmFsdWUoa2V5TWF0Y2hlciwgb3JpZ2luKSkge1xuICAgICAgICBjb25zdCBkaXNwYXRjaGVyID0gdGhpc1trRmFjdG9yeV0ob3JpZ2luKVxuICAgICAgICB0aGlzW2tNb2NrQWdlbnRTZXRdKG9yaWdpbiwgZGlzcGF0Y2hlcilcbiAgICAgICAgZGlzcGF0Y2hlcltrRGlzcGF0Y2hlc10gPSBub25FeHBsaWNpdERpc3BhdGNoZXJba0Rpc3BhdGNoZXNdXG4gICAgICAgIHJldHVybiBkaXNwYXRjaGVyXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgW2tHZXROZXRDb25uZWN0XSAoKSB7XG4gICAgcmV0dXJuIHRoaXNba05ldENvbm5lY3RdXG4gIH1cblxuICBwZW5kaW5nSW50ZXJjZXB0b3JzICgpIHtcbiAgICBjb25zdCBtb2NrQWdlbnRDbGllbnRzID0gdGhpc1trQ2xpZW50c11cblxuICAgIHJldHVybiBBcnJheS5mcm9tKG1vY2tBZ2VudENsaWVudHMuZW50cmllcygpKVxuICAgICAgLmZsYXRNYXAoKFtvcmlnaW4sIHNjb3BlXSkgPT4gc2NvcGUuZGVyZWYoKVtrRGlzcGF0Y2hlc10ubWFwKGRpc3BhdGNoID0+ICh7IC4uLmRpc3BhdGNoLCBvcmlnaW4gfSkpKVxuICAgICAgLmZpbHRlcigoeyBwZW5kaW5nIH0pID0+IHBlbmRpbmcpXG4gIH1cblxuICBhc3NlcnROb1BlbmRpbmdJbnRlcmNlcHRvcnMgKHsgcGVuZGluZ0ludGVyY2VwdG9yc0Zvcm1hdHRlciA9IG5ldyBQZW5kaW5nSW50ZXJjZXB0b3JzRm9ybWF0dGVyKCkgfSA9IHt9KSB7XG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZ0ludGVyY2VwdG9ycygpXG5cbiAgICBpZiAocGVuZGluZy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHBsdXJhbGl6ZXIgPSBuZXcgUGx1cmFsaXplcignaW50ZXJjZXB0b3InLCAnaW50ZXJjZXB0b3JzJykucGx1cmFsaXplKHBlbmRpbmcubGVuZ3RoKVxuXG4gICAgdGhyb3cgbmV3IFVuZGljaUVycm9yKGBcbiR7cGx1cmFsaXplci5jb3VudH0gJHtwbHVyYWxpemVyLm5vdW59ICR7cGx1cmFsaXplci5pc30gcGVuZGluZzpcblxuJHtwZW5kaW5nSW50ZXJjZXB0b3JzRm9ybWF0dGVyLmZvcm1hdChwZW5kaW5nKX1cbmAudHJpbSgpKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTW9ja0FnZW50XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBrUHJveHksIGtDbG9zZSwga0Rlc3Ryb3ksIGtJbnRlcmNlcHRvcnMgfSA9IHJlcXVpcmUoJy4vY29yZS9zeW1ib2xzJylcbmNvbnN0IHsgVVJMIH0gPSByZXF1aXJlKCd1cmwnKVxuY29uc3QgQWdlbnQgPSByZXF1aXJlKCcuL2FnZW50JylcbmNvbnN0IFBvb2wgPSByZXF1aXJlKCcuL3Bvb2wnKVxuY29uc3QgRGlzcGF0Y2hlckJhc2UgPSByZXF1aXJlKCcuL2Rpc3BhdGNoZXItYmFzZScpXG5jb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yLCBSZXF1ZXN0QWJvcnRlZEVycm9yIH0gPSByZXF1aXJlKCcuL2NvcmUvZXJyb3JzJylcbmNvbnN0IGJ1aWxkQ29ubmVjdG9yID0gcmVxdWlyZSgnLi9jb3JlL2Nvbm5lY3QnKVxuXG5jb25zdCBrQWdlbnQgPSBTeW1ib2woJ3Byb3h5IGFnZW50JylcbmNvbnN0IGtDbGllbnQgPSBTeW1ib2woJ3Byb3h5IGNsaWVudCcpXG5jb25zdCBrUHJveHlIZWFkZXJzID0gU3ltYm9sKCdwcm94eSBoZWFkZXJzJylcbmNvbnN0IGtSZXF1ZXN0VGxzID0gU3ltYm9sKCdyZXF1ZXN0IHRscyBzZXR0aW5ncycpXG5jb25zdCBrUHJveHlUbHMgPSBTeW1ib2woJ3Byb3h5IHRscyBzZXR0aW5ncycpXG5jb25zdCBrQ29ubmVjdEVuZHBvaW50ID0gU3ltYm9sKCdjb25uZWN0IGVuZHBvaW50IGZ1bmN0aW9uJylcblxuZnVuY3Rpb24gZGVmYXVsdFByb3RvY29sUG9ydCAocHJvdG9jb2wpIHtcbiAgcmV0dXJuIHByb3RvY29sID09PSAnaHR0cHM6JyA/IDQ0MyA6IDgwXG59XG5cbmZ1bmN0aW9uIGJ1aWxkUHJveHlPcHRpb25zIChvcHRzKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ3N0cmluZycpIHtcbiAgICBvcHRzID0geyB1cmk6IG9wdHMgfVxuICB9XG5cbiAgaWYgKCFvcHRzIHx8ICFvcHRzLnVyaSkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignUHJveHkgb3B0cy51cmkgaXMgbWFuZGF0b3J5JylcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdXJpOiBvcHRzLnVyaSxcbiAgICBwcm90b2NvbDogb3B0cy5wcm90b2NvbCB8fCAnaHR0cHMnXG4gIH1cbn1cblxuZnVuY3Rpb24gZGVmYXVsdEZhY3RvcnkgKG9yaWdpbiwgb3B0cykge1xuICByZXR1cm4gbmV3IFBvb2wob3JpZ2luLCBvcHRzKVxufVxuXG5jbGFzcyBQcm94eUFnZW50IGV4dGVuZHMgRGlzcGF0Y2hlckJhc2Uge1xuICBjb25zdHJ1Y3RvciAob3B0cykge1xuICAgIHN1cGVyKG9wdHMpXG4gICAgdGhpc1trUHJveHldID0gYnVpbGRQcm94eU9wdGlvbnMob3B0cylcbiAgICB0aGlzW2tBZ2VudF0gPSBuZXcgQWdlbnQob3B0cylcbiAgICB0aGlzW2tJbnRlcmNlcHRvcnNdID0gb3B0cy5pbnRlcmNlcHRvcnMgJiYgb3B0cy5pbnRlcmNlcHRvcnMuUHJveHlBZ2VudCAmJiBBcnJheS5pc0FycmF5KG9wdHMuaW50ZXJjZXB0b3JzLlByb3h5QWdlbnQpXG4gICAgICA/IG9wdHMuaW50ZXJjZXB0b3JzLlByb3h5QWdlbnRcbiAgICAgIDogW11cblxuICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG9wdHMgPSB7IHVyaTogb3B0cyB9XG4gICAgfVxuXG4gICAgaWYgKCFvcHRzIHx8ICFvcHRzLnVyaSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdQcm94eSBvcHRzLnVyaSBpcyBtYW5kYXRvcnknKVxuICAgIH1cblxuICAgIGNvbnN0IHsgY2xpZW50RmFjdG9yeSA9IGRlZmF1bHRGYWN0b3J5IH0gPSBvcHRzXG5cbiAgICBpZiAodHlwZW9mIGNsaWVudEZhY3RvcnkgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignUHJveHkgb3B0cy5jbGllbnRGYWN0b3J5IG11c3QgYmUgYSBmdW5jdGlvbi4nKVxuICAgIH1cblxuICAgIHRoaXNba1JlcXVlc3RUbHNdID0gb3B0cy5yZXF1ZXN0VGxzXG4gICAgdGhpc1trUHJveHlUbHNdID0gb3B0cy5wcm94eVRsc1xuICAgIHRoaXNba1Byb3h5SGVhZGVyc10gPSBvcHRzLmhlYWRlcnMgfHwge31cblxuICAgIGNvbnN0IHJlc29sdmVkVXJsID0gbmV3IFVSTChvcHRzLnVyaSlcbiAgICBjb25zdCB7IG9yaWdpbiwgcG9ydCwgaG9zdCwgdXNlcm5hbWUsIHBhc3N3b3JkIH0gPSByZXNvbHZlZFVybFxuXG4gICAgaWYgKG9wdHMuYXV0aCAmJiBvcHRzLnRva2VuKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ29wdHMuYXV0aCBjYW5ub3QgYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIG9wdHMudG9rZW4nKVxuICAgIH0gZWxzZSBpZiAob3B0cy5hdXRoKSB7XG4gICAgICAvKiBAZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2Ygb3B0cy50b2tlbiAqL1xuICAgICAgdGhpc1trUHJveHlIZWFkZXJzXVsncHJveHktYXV0aG9yaXphdGlvbiddID0gYEJhc2ljICR7b3B0cy5hdXRofWBcbiAgICB9IGVsc2UgaWYgKG9wdHMudG9rZW4pIHtcbiAgICAgIHRoaXNba1Byb3h5SGVhZGVyc11bJ3Byb3h5LWF1dGhvcml6YXRpb24nXSA9IG9wdHMudG9rZW5cbiAgICB9IGVsc2UgaWYgKHVzZXJuYW1lICYmIHBhc3N3b3JkKSB7XG4gICAgICB0aGlzW2tQcm94eUhlYWRlcnNdWydwcm94eS1hdXRob3JpemF0aW9uJ10gPSBgQmFzaWMgJHtCdWZmZXIuZnJvbShgJHtkZWNvZGVVUklDb21wb25lbnQodXNlcm5hbWUpfToke2RlY29kZVVSSUNvbXBvbmVudChwYXNzd29yZCl9YCkudG9TdHJpbmcoJ2Jhc2U2NCcpfWBcbiAgICB9XG5cbiAgICBjb25zdCBjb25uZWN0ID0gYnVpbGRDb25uZWN0b3IoeyAuLi5vcHRzLnByb3h5VGxzIH0pXG4gICAgdGhpc1trQ29ubmVjdEVuZHBvaW50XSA9IGJ1aWxkQ29ubmVjdG9yKHsgLi4ub3B0cy5yZXF1ZXN0VGxzIH0pXG4gICAgdGhpc1trQ2xpZW50XSA9IGNsaWVudEZhY3RvcnkocmVzb2x2ZWRVcmwsIHsgY29ubmVjdCB9KVxuICAgIHRoaXNba0FnZW50XSA9IG5ldyBBZ2VudCh7XG4gICAgICAuLi5vcHRzLFxuICAgICAgY29ubmVjdDogYXN5bmMgKG9wdHMsIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIGxldCByZXF1ZXN0ZWRIb3N0ID0gb3B0cy5ob3N0XG4gICAgICAgIGlmICghb3B0cy5wb3J0KSB7XG4gICAgICAgICAgcmVxdWVzdGVkSG9zdCArPSBgOiR7ZGVmYXVsdFByb3RvY29sUG9ydChvcHRzLnByb3RvY29sKX1gXG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IHNvY2tldCwgc3RhdHVzQ29kZSB9ID0gYXdhaXQgdGhpc1trQ2xpZW50XS5jb25uZWN0KHtcbiAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgIHBvcnQsXG4gICAgICAgICAgICBwYXRoOiByZXF1ZXN0ZWRIb3N0LFxuICAgICAgICAgICAgc2lnbmFsOiBvcHRzLnNpZ25hbCxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgLi4udGhpc1trUHJveHlIZWFkZXJzXSxcbiAgICAgICAgICAgICAgaG9zdFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgaWYgKHN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgICAgICAgICAgc29ja2V0Lm9uKCdlcnJvcicsICgpID0+IHt9KS5kZXN0cm95KClcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKGBQcm94eSByZXNwb25zZSAoJHtzdGF0dXNDb2RlfSkgIT09IDIwMCB3aGVuIEhUVFAgVHVubmVsaW5nYCkpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChvcHRzLnByb3RvY29sICE9PSAnaHR0cHM6Jykge1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgc29ja2V0KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBzZXJ2ZXJuYW1lXG4gICAgICAgICAgaWYgKHRoaXNba1JlcXVlc3RUbHNdKSB7XG4gICAgICAgICAgICBzZXJ2ZXJuYW1lID0gdGhpc1trUmVxdWVzdFRsc10uc2VydmVybmFtZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXJ2ZXJuYW1lID0gb3B0cy5zZXJ2ZXJuYW1lXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXNba0Nvbm5lY3RFbmRwb2ludF0oeyAuLi5vcHRzLCBzZXJ2ZXJuYW1lLCBodHRwU29ja2V0OiBzb2NrZXQgfSwgY2FsbGJhY2spXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNhbGxiYWNrKGVycilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBkaXNwYXRjaCAob3B0cywgaGFuZGxlcikge1xuICAgIGNvbnN0IHsgaG9zdCB9ID0gbmV3IFVSTChvcHRzLm9yaWdpbilcbiAgICBjb25zdCBoZWFkZXJzID0gYnVpbGRIZWFkZXJzKG9wdHMuaGVhZGVycylcbiAgICB0aHJvd0lmUHJveHlBdXRoSXNTZW50KGhlYWRlcnMpXG4gICAgcmV0dXJuIHRoaXNba0FnZW50XS5kaXNwYXRjaChcbiAgICAgIHtcbiAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIC4uLmhlYWRlcnMsXG4gICAgICAgICAgaG9zdFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFuZGxlclxuICAgIClcbiAgfVxuXG4gIGFzeW5jIFtrQ2xvc2VdICgpIHtcbiAgICBhd2FpdCB0aGlzW2tBZ2VudF0uY2xvc2UoKVxuICAgIGF3YWl0IHRoaXNba0NsaWVudF0uY2xvc2UoKVxuICB9XG5cbiAgYXN5bmMgW2tEZXN0cm95XSAoKSB7XG4gICAgYXdhaXQgdGhpc1trQWdlbnRdLmRlc3Ryb3koKVxuICAgIGF3YWl0IHRoaXNba0NsaWVudF0uZGVzdHJveSgpXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPn0gaGVhZGVyc1xuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHN0cmluZz59XG4gKi9cbmZ1bmN0aW9uIGJ1aWxkSGVhZGVycyAoaGVhZGVycykge1xuICAvLyBXaGVuIHVzaW5nIHVuZGljaS5mZXRjaCwgdGhlIGhlYWRlcnMgbGlzdCBpcyBzdG9yZWRcbiAgLy8gYXMgYW4gYXJyYXkuXG4gIGlmIChBcnJheS5pc0FycmF5KGhlYWRlcnMpKSB7XG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAqL1xuICAgIGNvbnN0IGhlYWRlcnNQYWlyID0ge31cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgaGVhZGVyc1BhaXJbaGVhZGVyc1tpXV0gPSBoZWFkZXJzW2kgKyAxXVxuICAgIH1cblxuICAgIHJldHVybiBoZWFkZXJzUGFpclxuICB9XG5cbiAgcmV0dXJuIGhlYWRlcnNcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IGhlYWRlcnNcbiAqXG4gKiBQcmV2aW91cyB2ZXJzaW9ucyBvZiBQcm94eUFnZW50IHN1Z2dlc3RzIHRoZSBQcm94eS1BdXRob3JpemF0aW9uIGluIHJlcXVlc3QgaGVhZGVyc1xuICogTmV2ZXJ0aGVsZXNzLCBpdCB3YXMgY2hhbmdlZCBhbmQgdG8gYXZvaWQgYSBzZWN1cml0eSB2dWxuZXJhYmlsaXR5IGJ5IGVuZCB1c2Vyc1xuICogdGhpcyBjaGVjayB3YXMgY3JlYXRlZC5cbiAqIEl0IHNob3VsZCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnNcbiAqL1xuZnVuY3Rpb24gdGhyb3dJZlByb3h5QXV0aElzU2VudCAoaGVhZGVycykge1xuICBjb25zdCBleGlzdFByb3h5QXV0aCA9IGhlYWRlcnMgJiYgT2JqZWN0LmtleXMoaGVhZGVycylcbiAgICAuZmluZCgoa2V5KSA9PiBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ3Byb3h5LWF1dGhvcml6YXRpb24nKVxuICBpZiAoZXhpc3RQcm94eUF1dGgpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ1Byb3h5LUF1dGhvcml6YXRpb24gc2hvdWxkIGJlIHNlbnQgaW4gUHJveHlBZ2VudCBjb25zdHJ1Y3RvcicpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBQcm94eUFnZW50XG4iLCJjb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuXG5jb25zdCB7IGtSZXRyeUhhbmRsZXJEZWZhdWx0UmV0cnkgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCB7IFJlcXVlc3RSZXRyeUVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5jb25zdCB7IGlzRGlzdHVyYmVkLCBwYXJzZUhlYWRlcnMsIHBhcnNlUmFuZ2VIZWFkZXIgfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZVJldHJ5QWZ0ZXJIZWFkZXIgKHJldHJ5QWZ0ZXIpIHtcbiAgY29uc3QgY3VycmVudCA9IERhdGUubm93KClcbiAgY29uc3QgZGlmZiA9IG5ldyBEYXRlKHJldHJ5QWZ0ZXIpLmdldFRpbWUoKSAtIGN1cnJlbnRcblxuICByZXR1cm4gZGlmZlxufVxuXG5jbGFzcyBSZXRyeUhhbmRsZXIge1xuICBjb25zdHJ1Y3RvciAob3B0cywgaGFuZGxlcnMpIHtcbiAgICBjb25zdCB7IHJldHJ5T3B0aW9ucywgLi4uZGlzcGF0Y2hPcHRzIH0gPSBvcHRzXG4gICAgY29uc3Qge1xuICAgICAgLy8gUmV0cnkgc2NvcGVkXG4gICAgICByZXRyeTogcmV0cnlGbixcbiAgICAgIG1heFJldHJpZXMsXG4gICAgICBtYXhUaW1lb3V0LFxuICAgICAgbWluVGltZW91dCxcbiAgICAgIHRpbWVvdXRGYWN0b3IsXG4gICAgICAvLyBSZXNwb25zZSBzY29wZWRcbiAgICAgIG1ldGhvZHMsXG4gICAgICBlcnJvckNvZGVzLFxuICAgICAgcmV0cnlBZnRlcixcbiAgICAgIHN0YXR1c0NvZGVzXG4gICAgfSA9IHJldHJ5T3B0aW9ucyA/PyB7fVxuXG4gICAgdGhpcy5kaXNwYXRjaCA9IGhhbmRsZXJzLmRpc3BhdGNoXG4gICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcnMuaGFuZGxlclxuICAgIHRoaXMub3B0cyA9IGRpc3BhdGNoT3B0c1xuICAgIHRoaXMuYWJvcnQgPSBudWxsXG4gICAgdGhpcy5hYm9ydGVkID0gZmFsc2VcbiAgICB0aGlzLnJldHJ5T3B0cyA9IHtcbiAgICAgIHJldHJ5OiByZXRyeUZuID8/IFJldHJ5SGFuZGxlcltrUmV0cnlIYW5kbGVyRGVmYXVsdFJldHJ5XSxcbiAgICAgIHJldHJ5QWZ0ZXI6IHJldHJ5QWZ0ZXIgPz8gdHJ1ZSxcbiAgICAgIG1heFRpbWVvdXQ6IG1heFRpbWVvdXQgPz8gMzAgKiAxMDAwLCAvLyAzMHMsXG4gICAgICB0aW1lb3V0OiBtaW5UaW1lb3V0ID8/IDUwMCwgLy8gLjVzXG4gICAgICB0aW1lb3V0RmFjdG9yOiB0aW1lb3V0RmFjdG9yID8/IDIsXG4gICAgICBtYXhSZXRyaWVzOiBtYXhSZXRyaWVzID8/IDUsXG4gICAgICAvLyBXaGF0IGVycm9ycyB3ZSBzaG91bGQgcmV0cnlcbiAgICAgIG1ldGhvZHM6IG1ldGhvZHMgPz8gWydHRVQnLCAnSEVBRCcsICdPUFRJT05TJywgJ1BVVCcsICdERUxFVEUnLCAnVFJBQ0UnXSxcbiAgICAgIC8vIEluZGljYXRlcyB3aGljaCBlcnJvcnMgdG8gcmV0cnlcbiAgICAgIHN0YXR1c0NvZGVzOiBzdGF0dXNDb2RlcyA/PyBbNTAwLCA1MDIsIDUwMywgNTA0LCA0MjldLFxuICAgICAgLy8gTGlzdCBvZiBlcnJvcnMgdG8gcmV0cnlcbiAgICAgIGVycm9yQ29kZXM6IGVycm9yQ29kZXMgPz8gW1xuICAgICAgICAnRUNPTk5SRVNFVCcsXG4gICAgICAgICdFQ09OTlJFRlVTRUQnLFxuICAgICAgICAnRU5PVEZPVU5EJyxcbiAgICAgICAgJ0VORVRET1dOJyxcbiAgICAgICAgJ0VORVRVTlJFQUNIJyxcbiAgICAgICAgJ0VIT1NURE9XTicsXG4gICAgICAgICdFSE9TVFVOUkVBQ0gnLFxuICAgICAgICAnRVBJUEUnXG4gICAgICBdXG4gICAgfVxuXG4gICAgdGhpcy5yZXRyeUNvdW50ID0gMFxuICAgIHRoaXMuc3RhcnQgPSAwXG4gICAgdGhpcy5lbmQgPSBudWxsXG4gICAgdGhpcy5ldGFnID0gbnVsbFxuICAgIHRoaXMucmVzdW1lID0gbnVsbFxuXG4gICAgLy8gSGFuZGxlIHBvc3NpYmxlIG9uQ29ubmVjdCBkdXBsaWNhdGlvblxuICAgIHRoaXMuaGFuZGxlci5vbkNvbm5lY3QocmVhc29uID0+IHtcbiAgICAgIHRoaXMuYWJvcnRlZCA9IHRydWVcbiAgICAgIGlmICh0aGlzLmFib3J0KSB7XG4gICAgICAgIHRoaXMuYWJvcnQocmVhc29uKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZWFzb24gPSByZWFzb25cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgb25SZXF1ZXN0U2VudCAoKSB7XG4gICAgaWYgKHRoaXMuaGFuZGxlci5vblJlcXVlc3RTZW50KSB7XG4gICAgICB0aGlzLmhhbmRsZXIub25SZXF1ZXN0U2VudCgpXG4gICAgfVxuICB9XG5cbiAgb25VcGdyYWRlIChzdGF0dXNDb2RlLCBoZWFkZXJzLCBzb2NrZXQpIHtcbiAgICBpZiAodGhpcy5oYW5kbGVyLm9uVXBncmFkZSkge1xuICAgICAgdGhpcy5oYW5kbGVyLm9uVXBncmFkZShzdGF0dXNDb2RlLCBoZWFkZXJzLCBzb2NrZXQpXG4gICAgfVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCkge1xuICAgIGlmICh0aGlzLmFib3J0ZWQpIHtcbiAgICAgIGFib3J0KHRoaXMucmVhc29uKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFib3J0ID0gYWJvcnRcbiAgICB9XG4gIH1cblxuICBvbkJvZHlTZW50IChjaHVuaykge1xuICAgIGlmICh0aGlzLmhhbmRsZXIub25Cb2R5U2VudCkgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkJvZHlTZW50KGNodW5rKVxuICB9XG5cbiAgc3RhdGljIFtrUmV0cnlIYW5kbGVyRGVmYXVsdFJldHJ5XSAoZXJyLCB7IHN0YXRlLCBvcHRzIH0sIGNiKSB7XG4gICAgY29uc3QgeyBzdGF0dXNDb2RlLCBjb2RlLCBoZWFkZXJzIH0gPSBlcnJcbiAgICBjb25zdCB7IG1ldGhvZCwgcmV0cnlPcHRpb25zIH0gPSBvcHRzXG4gICAgY29uc3Qge1xuICAgICAgbWF4UmV0cmllcyxcbiAgICAgIHRpbWVvdXQsXG4gICAgICBtYXhUaW1lb3V0LFxuICAgICAgdGltZW91dEZhY3RvcixcbiAgICAgIHN0YXR1c0NvZGVzLFxuICAgICAgZXJyb3JDb2RlcyxcbiAgICAgIG1ldGhvZHNcbiAgICB9ID0gcmV0cnlPcHRpb25zXG4gICAgbGV0IHsgY291bnRlciwgY3VycmVudFRpbWVvdXQgfSA9IHN0YXRlXG5cbiAgICBjdXJyZW50VGltZW91dCA9XG4gICAgICBjdXJyZW50VGltZW91dCAhPSBudWxsICYmIGN1cnJlbnRUaW1lb3V0ID4gMCA/IGN1cnJlbnRUaW1lb3V0IDogdGltZW91dFxuXG4gICAgLy8gQW55IGNvZGUgdGhhdCBpcyBub3QgYSBVbmRpY2kncyBvcmlnaW5hdGVkIGFuZCBhbGxvd2VkIHRvIHJldHJ5XG4gICAgaWYgKFxuICAgICAgY29kZSAmJlxuICAgICAgY29kZSAhPT0gJ1VORF9FUlJfUkVRX1JFVFJZJyAmJlxuICAgICAgY29kZSAhPT0gJ1VORF9FUlJfU09DS0VUJyAmJlxuICAgICAgIWVycm9yQ29kZXMuaW5jbHVkZXMoY29kZSlcbiAgICApIHtcbiAgICAgIGNiKGVycilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIElmIGEgc2V0IG9mIG1ldGhvZCBhcmUgcHJvdmlkZWQgYW5kIHRoZSBjdXJyZW50IG1ldGhvZCBpcyBub3QgaW4gdGhlIGxpc3RcbiAgICBpZiAoQXJyYXkuaXNBcnJheShtZXRob2RzKSAmJiAhbWV0aG9kcy5pbmNsdWRlcyhtZXRob2QpKSB7XG4gICAgICBjYihlcnIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBJZiBhIHNldCBvZiBzdGF0dXMgY29kZSBhcmUgcHJvdmlkZWQgYW5kIHRoZSBjdXJyZW50IHN0YXR1cyBjb2RlIGlzIG5vdCBpbiB0aGUgbGlzdFxuICAgIGlmIChcbiAgICAgIHN0YXR1c0NvZGUgIT0gbnVsbCAmJlxuICAgICAgQXJyYXkuaXNBcnJheShzdGF0dXNDb2RlcykgJiZcbiAgICAgICFzdGF0dXNDb2Rlcy5pbmNsdWRlcyhzdGF0dXNDb2RlKVxuICAgICkge1xuICAgICAgY2IoZXJyKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gSWYgd2UgcmVhY2hlZCB0aGUgbWF4IG51bWJlciBvZiByZXRyaWVzXG4gICAgaWYgKGNvdW50ZXIgPiBtYXhSZXRyaWVzKSB7XG4gICAgICBjYihlcnIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBsZXQgcmV0cnlBZnRlckhlYWRlciA9IGhlYWRlcnMgIT0gbnVsbCAmJiBoZWFkZXJzWydyZXRyeS1hZnRlciddXG4gICAgaWYgKHJldHJ5QWZ0ZXJIZWFkZXIpIHtcbiAgICAgIHJldHJ5QWZ0ZXJIZWFkZXIgPSBOdW1iZXIocmV0cnlBZnRlckhlYWRlcilcbiAgICAgIHJldHJ5QWZ0ZXJIZWFkZXIgPSBpc05hTihyZXRyeUFmdGVySGVhZGVyKVxuICAgICAgICA/IGNhbGN1bGF0ZVJldHJ5QWZ0ZXJIZWFkZXIocmV0cnlBZnRlckhlYWRlcilcbiAgICAgICAgOiByZXRyeUFmdGVySGVhZGVyICogMWUzIC8vIFJldHJ5LUFmdGVyIGlzIGluIHNlY29uZHNcbiAgICB9XG5cbiAgICBjb25zdCByZXRyeVRpbWVvdXQgPVxuICAgICAgcmV0cnlBZnRlckhlYWRlciA+IDBcbiAgICAgICAgPyBNYXRoLm1pbihyZXRyeUFmdGVySGVhZGVyLCBtYXhUaW1lb3V0KVxuICAgICAgICA6IE1hdGgubWluKGN1cnJlbnRUaW1lb3V0ICogdGltZW91dEZhY3RvciAqKiBjb3VudGVyLCBtYXhUaW1lb3V0KVxuXG4gICAgc3RhdGUuY3VycmVudFRpbWVvdXQgPSByZXRyeVRpbWVvdXRcblxuICAgIHNldFRpbWVvdXQoKCkgPT4gY2IobnVsbCksIHJldHJ5VGltZW91dClcbiAgfVxuXG4gIG9uSGVhZGVycyAoc3RhdHVzQ29kZSwgcmF3SGVhZGVycywgcmVzdW1lLCBzdGF0dXNNZXNzYWdlKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IHBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKVxuXG4gICAgdGhpcy5yZXRyeUNvdW50ICs9IDFcblxuICAgIGlmIChzdGF0dXNDb2RlID49IDMwMCkge1xuICAgICAgdGhpcy5hYm9ydChcbiAgICAgICAgbmV3IFJlcXVlc3RSZXRyeUVycm9yKCdSZXF1ZXN0IGZhaWxlZCcsIHN0YXR1c0NvZGUsIHtcbiAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgIGNvdW50OiB0aGlzLnJldHJ5Q291bnRcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIENoZWNrcG9pbnQgZm9yIHJlc3VtZSBmcm9tIHdoZXJlIHdlIGxlZnQgaXRcbiAgICBpZiAodGhpcy5yZXN1bWUgIT0gbnVsbCkge1xuICAgICAgdGhpcy5yZXN1bWUgPSBudWxsXG5cbiAgICAgIGlmIChzdGF0dXNDb2RlICE9PSAyMDYpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29udGVudFJhbmdlID0gcGFyc2VSYW5nZUhlYWRlcihoZWFkZXJzWydjb250ZW50LXJhbmdlJ10pXG4gICAgICAvLyBJZiBubyBjb250ZW50IHJhbmdlXG4gICAgICBpZiAoIWNvbnRlbnRSYW5nZSkge1xuICAgICAgICB0aGlzLmFib3J0KFxuICAgICAgICAgIG5ldyBSZXF1ZXN0UmV0cnlFcnJvcignQ29udGVudC1SYW5nZSBtaXNtYXRjaCcsIHN0YXR1c0NvZGUsIHtcbiAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICBjb3VudDogdGhpcy5yZXRyeUNvdW50XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgLy8gTGV0J3Mgc3RhcnQgd2l0aCBhIHdlYWsgZXRhZyBjaGVja1xuICAgICAgaWYgKHRoaXMuZXRhZyAhPSBudWxsICYmIHRoaXMuZXRhZyAhPT0gaGVhZGVycy5ldGFnKSB7XG4gICAgICAgIHRoaXMuYWJvcnQoXG4gICAgICAgICAgbmV3IFJlcXVlc3RSZXRyeUVycm9yKCdFVGFnIG1pc21hdGNoJywgc3RhdHVzQ29kZSwge1xuICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgIGNvdW50OiB0aGlzLnJldHJ5Q291bnRcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHN0YXJ0LCBzaXplLCBlbmQgPSBzaXplIH0gPSBjb250ZW50UmFuZ2VcblxuICAgICAgYXNzZXJ0KHRoaXMuc3RhcnQgPT09IHN0YXJ0LCAnY29udGVudC1yYW5nZSBtaXNtYXRjaCcpXG4gICAgICBhc3NlcnQodGhpcy5lbmQgPT0gbnVsbCB8fCB0aGlzLmVuZCA9PT0gZW5kLCAnY29udGVudC1yYW5nZSBtaXNtYXRjaCcpXG5cbiAgICAgIHRoaXMucmVzdW1lID0gcmVzdW1lXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmICh0aGlzLmVuZCA9PSBudWxsKSB7XG4gICAgICBpZiAoc3RhdHVzQ29kZSA9PT0gMjA2KSB7XG4gICAgICAgIC8vIEZpcnN0IHRpbWUgd2UgcmVjZWl2ZSAyMDZcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBwYXJzZVJhbmdlSGVhZGVyKGhlYWRlcnNbJ2NvbnRlbnQtcmFuZ2UnXSlcblxuICAgICAgICBpZiAocmFuZ2UgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXIub25IZWFkZXJzKFxuICAgICAgICAgICAgc3RhdHVzQ29kZSxcbiAgICAgICAgICAgIHJhd0hlYWRlcnMsXG4gICAgICAgICAgICByZXN1bWUsXG4gICAgICAgICAgICBzdGF0dXNNZXNzYWdlXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBzdGFydCwgc2l6ZSwgZW5kID0gc2l6ZSB9ID0gcmFuZ2VcblxuICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgc3RhcnQgIT0gbnVsbCAmJiBOdW1iZXIuaXNGaW5pdGUoc3RhcnQpICYmIHRoaXMuc3RhcnQgIT09IHN0YXJ0LFxuICAgICAgICAgICdjb250ZW50LXJhbmdlIG1pc21hdGNoJ1xuICAgICAgICApXG4gICAgICAgIGFzc2VydChOdW1iZXIuaXNGaW5pdGUoc3RhcnQpKVxuICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgZW5kICE9IG51bGwgJiYgTnVtYmVyLmlzRmluaXRlKGVuZCkgJiYgdGhpcy5lbmQgIT09IGVuZCxcbiAgICAgICAgICAnaW52YWxpZCBjb250ZW50LWxlbmd0aCdcbiAgICAgICAgKVxuXG4gICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydFxuICAgICAgICB0aGlzLmVuZCA9IGVuZFxuICAgICAgfVxuXG4gICAgICAvLyBXZSBtYWtlIG91ciBiZXN0IHRvIGNoZWNrcG9pbnQgdGhlIGJvZHkgZm9yIGZ1cnRoZXIgcmFuZ2UgaGVhZGVyc1xuICAgICAgaWYgKHRoaXMuZW5kID09IG51bGwpIHtcbiAgICAgICAgY29uc3QgY29udGVudExlbmd0aCA9IGhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ11cbiAgICAgICAgdGhpcy5lbmQgPSBjb250ZW50TGVuZ3RoICE9IG51bGwgPyBOdW1iZXIoY29udGVudExlbmd0aCkgOiBudWxsXG4gICAgICB9XG5cbiAgICAgIGFzc2VydChOdW1iZXIuaXNGaW5pdGUodGhpcy5zdGFydCkpXG4gICAgICBhc3NlcnQoXG4gICAgICAgIHRoaXMuZW5kID09IG51bGwgfHwgTnVtYmVyLmlzRmluaXRlKHRoaXMuZW5kKSxcbiAgICAgICAgJ2ludmFsaWQgY29udGVudC1sZW5ndGgnXG4gICAgICApXG5cbiAgICAgIHRoaXMucmVzdW1lID0gcmVzdW1lXG4gICAgICB0aGlzLmV0YWcgPSBoZWFkZXJzLmV0YWcgIT0gbnVsbCA/IGhlYWRlcnMuZXRhZyA6IG51bGxcblxuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkhlYWRlcnMoXG4gICAgICAgIHN0YXR1c0NvZGUsXG4gICAgICAgIHJhd0hlYWRlcnMsXG4gICAgICAgIHJlc3VtZSxcbiAgICAgICAgc3RhdHVzTWVzc2FnZVxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IGVyciA9IG5ldyBSZXF1ZXN0UmV0cnlFcnJvcignUmVxdWVzdCBmYWlsZWQnLCBzdGF0dXNDb2RlLCB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgY291bnQ6IHRoaXMucmV0cnlDb3VudFxuICAgIH0pXG5cbiAgICB0aGlzLmFib3J0KGVycilcblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgb25EYXRhIChjaHVuaykge1xuICAgIHRoaXMuc3RhcnQgKz0gY2h1bmsubGVuZ3RoXG5cbiAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uRGF0YShjaHVuaylcbiAgfVxuXG4gIG9uQ29tcGxldGUgKHJhd1RyYWlsZXJzKSB7XG4gICAgdGhpcy5yZXRyeUNvdW50ID0gMFxuICAgIHJldHVybiB0aGlzLmhhbmRsZXIub25Db21wbGV0ZShyYXdUcmFpbGVycylcbiAgfVxuXG4gIG9uRXJyb3IgKGVycikge1xuICAgIGlmICh0aGlzLmFib3J0ZWQgfHwgaXNEaXN0dXJiZWQodGhpcy5vcHRzLmJvZHkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uRXJyb3IoZXJyKVxuICAgIH1cblxuICAgIHRoaXMucmV0cnlPcHRzLnJldHJ5KFxuICAgICAgZXJyLFxuICAgICAge1xuICAgICAgICBzdGF0ZTogeyBjb3VudGVyOiB0aGlzLnJldHJ5Q291bnQrKywgY3VycmVudFRpbWVvdXQ6IHRoaXMucmV0cnlBZnRlciB9LFxuICAgICAgICBvcHRzOiB7IHJldHJ5T3B0aW9uczogdGhpcy5yZXRyeU9wdHMsIC4uLnRoaXMub3B0cyB9XG4gICAgICB9LFxuICAgICAgb25SZXRyeS5iaW5kKHRoaXMpXG4gICAgKVxuXG4gICAgZnVuY3Rpb24gb25SZXRyeSAoZXJyKSB7XG4gICAgICBpZiAoZXJyICE9IG51bGwgfHwgdGhpcy5hYm9ydGVkIHx8IGlzRGlzdHVyYmVkKHRoaXMub3B0cy5ib2R5KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uRXJyb3IoZXJyKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zdGFydCAhPT0gMCkge1xuICAgICAgICB0aGlzLm9wdHMgPSB7XG4gICAgICAgICAgLi4udGhpcy5vcHRzLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIC4uLnRoaXMub3B0cy5oZWFkZXJzLFxuICAgICAgICAgICAgcmFuZ2U6IGBieXRlcz0ke3RoaXMuc3RhcnR9LSR7dGhpcy5lbmQgPz8gJyd9YFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoKHRoaXMub3B0cywgdGhpcylcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmhhbmRsZXIub25FcnJvcihlcnIpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmV0cnlIYW5kbGVyXG4iLCIndXNlIHN0cmljdCdcblxuLy8gV2UgaW5jbHVkZSBhIHZlcnNpb24gbnVtYmVyIGZvciB0aGUgRGlzcGF0Y2hlciBBUEkuIEluIGNhc2Ugb2YgYnJlYWtpbmcgY2hhbmdlcyxcbi8vIHRoaXMgdmVyc2lvbiBudW1iZXIgbXVzdCBiZSBpbmNyZWFzZWQgdG8gYXZvaWQgY29uZmxpY3RzLlxuY29uc3QgZ2xvYmFsRGlzcGF0Y2hlciA9IFN5bWJvbC5mb3IoJ3VuZGljaS5nbG9iYWxEaXNwYXRjaGVyLjEnKVxuY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciB9ID0gcmVxdWlyZSgnLi9jb3JlL2Vycm9ycycpXG5jb25zdCBBZ2VudCA9IHJlcXVpcmUoJy4vYWdlbnQnKVxuXG5pZiAoZ2V0R2xvYmFsRGlzcGF0Y2hlcigpID09PSB1bmRlZmluZWQpIHtcbiAgc2V0R2xvYmFsRGlzcGF0Y2hlcihuZXcgQWdlbnQoKSlcbn1cblxuZnVuY3Rpb24gc2V0R2xvYmFsRGlzcGF0Y2hlciAoYWdlbnQpIHtcbiAgaWYgKCFhZ2VudCB8fCB0eXBlb2YgYWdlbnQuZGlzcGF0Y2ggIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0FyZ3VtZW50IGFnZW50IG11c3QgaW1wbGVtZW50IEFnZW50JylcbiAgfVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZ2xvYmFsVGhpcywgZ2xvYmFsRGlzcGF0Y2hlciwge1xuICAgIHZhbHVlOiBhZ2VudCxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlXG4gIH0pXG59XG5cbmZ1bmN0aW9uIGdldEdsb2JhbERpc3BhdGNoZXIgKCkge1xuICByZXR1cm4gZ2xvYmFsVGhpc1tnbG9iYWxEaXNwYXRjaGVyXVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0R2xvYmFsRGlzcGF0Y2hlcixcbiAgZ2V0R2xvYmFsRGlzcGF0Y2hlclxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgRGVjb3JhdG9ySGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yIChoYW5kbGVyKSB7XG4gICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlclxuICB9XG5cbiAgb25Db25uZWN0ICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkNvbm5lY3QoLi4uYXJncylcbiAgfVxuXG4gIG9uRXJyb3IgKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uRXJyb3IoLi4uYXJncylcbiAgfVxuXG4gIG9uVXBncmFkZSAoLi4uYXJncykge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZXIub25VcGdyYWRlKC4uLmFyZ3MpXG4gIH1cblxuICBvbkhlYWRlcnMgKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uSGVhZGVycyguLi5hcmdzKVxuICB9XG5cbiAgb25EYXRhICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkRhdGEoLi4uYXJncylcbiAgfVxuXG4gIG9uQ29tcGxldGUgKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uQ29tcGxldGUoLi4uYXJncylcbiAgfVxuXG4gIG9uQm9keVNlbnQgKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uQm9keVNlbnQoLi4uYXJncylcbiAgfVxufVxuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL0V0aGFuLUFycm93b29kL3VuZGljaS1mZXRjaFxuXG4ndXNlIHN0cmljdCdcblxuY29uc3QgeyBrSGVhZGVyc0xpc3QsIGtDb25zdHJ1Y3QgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCB7IGtHdWFyZCB9ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsga0VudW1lcmFibGVQcm9wZXJ0eSB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHtcbiAgbWFrZUl0ZXJhdG9yLFxuICBpc1ZhbGlkSGVhZGVyTmFtZSxcbiAgaXNWYWxpZEhlYWRlclZhbHVlXG59ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCd1dGlsJylcbmNvbnN0IHsgd2ViaWRsIH0gPSByZXF1aXJlKCcuL3dlYmlkbCcpXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuXG5jb25zdCBrSGVhZGVyc01hcCA9IFN5bWJvbCgnaGVhZGVycyBtYXAnKVxuY29uc3Qga0hlYWRlcnNTb3J0ZWRNYXAgPSBTeW1ib2woJ2hlYWRlcnMgbWFwIHNvcnRlZCcpXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGNvZGVcbiAqL1xuZnVuY3Rpb24gaXNIVFRQV2hpdGVTcGFjZUNoYXJDb2RlIChjb2RlKSB7XG4gIHJldHVybiBjb2RlID09PSAweDAwYSB8fCBjb2RlID09PSAweDAwZCB8fCBjb2RlID09PSAweDAwOSB8fCBjb2RlID09PSAweDAyMFxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtaGVhZGVyLXZhbHVlLW5vcm1hbGl6ZVxuICogQHBhcmFtIHtzdHJpbmd9IHBvdGVudGlhbFZhbHVlXG4gKi9cbmZ1bmN0aW9uIGhlYWRlclZhbHVlTm9ybWFsaXplIChwb3RlbnRpYWxWYWx1ZSkge1xuICAvLyAgVG8gbm9ybWFsaXplIGEgYnl0ZSBzZXF1ZW5jZSBwb3RlbnRpYWxWYWx1ZSwgcmVtb3ZlXG4gIC8vICBhbnkgbGVhZGluZyBhbmQgdHJhaWxpbmcgSFRUUCB3aGl0ZXNwYWNlIGJ5dGVzIGZyb21cbiAgLy8gIHBvdGVudGlhbFZhbHVlLlxuICBsZXQgaSA9IDA7IGxldCBqID0gcG90ZW50aWFsVmFsdWUubGVuZ3RoXG5cbiAgd2hpbGUgKGogPiBpICYmIGlzSFRUUFdoaXRlU3BhY2VDaGFyQ29kZShwb3RlbnRpYWxWYWx1ZS5jaGFyQ29kZUF0KGogLSAxKSkpIC0talxuICB3aGlsZSAoaiA+IGkgJiYgaXNIVFRQV2hpdGVTcGFjZUNoYXJDb2RlKHBvdGVudGlhbFZhbHVlLmNoYXJDb2RlQXQoaSkpKSArK2lcblxuICByZXR1cm4gaSA9PT0gMCAmJiBqID09PSBwb3RlbnRpYWxWYWx1ZS5sZW5ndGggPyBwb3RlbnRpYWxWYWx1ZSA6IHBvdGVudGlhbFZhbHVlLnN1YnN0cmluZyhpLCBqKVxufVxuXG5mdW5jdGlvbiBmaWxsIChoZWFkZXJzLCBvYmplY3QpIHtcbiAgLy8gVG8gZmlsbCBhIEhlYWRlcnMgb2JqZWN0IGhlYWRlcnMgd2l0aCBhIGdpdmVuIG9iamVjdCBvYmplY3QsIHJ1biB0aGVzZSBzdGVwczpcblxuICAvLyAxLiBJZiBvYmplY3QgaXMgYSBzZXF1ZW5jZSwgdGhlbiBmb3IgZWFjaCBoZWFkZXIgaW4gb2JqZWN0OlxuICAvLyBOb3RlOiB3ZWJpZGwgY29udmVyc2lvbiB0byBhcnJheSBoYXMgYWxyZWFkeSBiZWVuIGRvbmUuXG4gIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iamVjdC5sZW5ndGg7ICsraSkge1xuICAgICAgY29uc3QgaGVhZGVyID0gb2JqZWN0W2ldXG4gICAgICAvLyAxLiBJZiBoZWFkZXIgZG9lcyBub3QgY29udGFpbiBleGFjdGx5IHR3byBpdGVtcywgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgIGlmIChoZWFkZXIubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICBoZWFkZXI6ICdIZWFkZXJzIGNvbnN0cnVjdG9yJyxcbiAgICAgICAgICBtZXNzYWdlOiBgZXhwZWN0ZWQgbmFtZS92YWx1ZSBwYWlyIHRvIGJlIGxlbmd0aCAyLCBmb3VuZCAke2hlYWRlci5sZW5ndGh9LmBcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gMi4gQXBwZW5kIChoZWFkZXLigJlzIGZpcnN0IGl0ZW0sIGhlYWRlcuKAmXMgc2Vjb25kIGl0ZW0pIHRvIGhlYWRlcnMuXG4gICAgICBhcHBlbmRIZWFkZXIoaGVhZGVycywgaGVhZGVyWzBdLCBoZWFkZXJbMV0pXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCkge1xuICAgIC8vIE5vdGU6IG51bGwgc2hvdWxkIHRocm93XG5cbiAgICAvLyAyLiBPdGhlcndpc2UsIG9iamVjdCBpcyBhIHJlY29yZCwgdGhlbiBmb3IgZWFjaCBrZXkg4oaSIHZhbHVlIGluIG9iamVjdCxcbiAgICAvLyAgICBhcHBlbmQgKGtleSwgdmFsdWUpIHRvIGhlYWRlcnNcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgYXBwZW5kSGVhZGVyKGhlYWRlcnMsIGtleXNbaV0sIG9iamVjdFtrZXlzW2ldXSlcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgd2ViaWRsLmVycm9ycy5jb252ZXJzaW9uRmFpbGVkKHtcbiAgICAgIHByZWZpeDogJ0hlYWRlcnMgY29uc3RydWN0b3InLFxuICAgICAgYXJndW1lbnQ6ICdBcmd1bWVudCAxJyxcbiAgICAgIHR5cGVzOiBbJ3NlcXVlbmNlPHNlcXVlbmNlPEJ5dGVTdHJpbmc+PicsICdyZWNvcmQ8Qnl0ZVN0cmluZywgQnl0ZVN0cmluZz4nXVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWhlYWRlcnMtYXBwZW5kXG4gKi9cbmZ1bmN0aW9uIGFwcGVuZEhlYWRlciAoaGVhZGVycywgbmFtZSwgdmFsdWUpIHtcbiAgLy8gMS4gTm9ybWFsaXplIHZhbHVlLlxuICB2YWx1ZSA9IGhlYWRlclZhbHVlTm9ybWFsaXplKHZhbHVlKVxuXG4gIC8vIDIuIElmIG5hbWUgaXMgbm90IGEgaGVhZGVyIG5hbWUgb3IgdmFsdWUgaXMgbm90IGFcbiAgLy8gICAgaGVhZGVyIHZhbHVlLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICBpZiAoIWlzVmFsaWRIZWFkZXJOYW1lKG5hbWUpKSB7XG4gICAgdGhyb3cgd2ViaWRsLmVycm9ycy5pbnZhbGlkQXJndW1lbnQoe1xuICAgICAgcHJlZml4OiAnSGVhZGVycy5hcHBlbmQnLFxuICAgICAgdmFsdWU6IG5hbWUsXG4gICAgICB0eXBlOiAnaGVhZGVyIG5hbWUnXG4gICAgfSlcbiAgfSBlbHNlIGlmICghaXNWYWxpZEhlYWRlclZhbHVlKHZhbHVlKSkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuaW52YWxpZEFyZ3VtZW50KHtcbiAgICAgIHByZWZpeDogJ0hlYWRlcnMuYXBwZW5kJyxcbiAgICAgIHZhbHVlLFxuICAgICAgdHlwZTogJ2hlYWRlciB2YWx1ZSdcbiAgICB9KVxuICB9XG5cbiAgLy8gMy4gSWYgaGVhZGVyc+KAmXMgZ3VhcmQgaXMgXCJpbW11dGFibGVcIiwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgLy8gNC4gT3RoZXJ3aXNlLCBpZiBoZWFkZXJz4oCZcyBndWFyZCBpcyBcInJlcXVlc3RcIiBhbmQgbmFtZSBpcyBhXG4gIC8vICAgIGZvcmJpZGRlbiBoZWFkZXIgbmFtZSwgcmV0dXJuLlxuICAvLyBOb3RlOiB1bmRpY2kgZG9lcyBub3QgaW1wbGVtZW50IGZvcmJpZGRlbiBoZWFkZXIgbmFtZXNcbiAgaWYgKGhlYWRlcnNba0d1YXJkXSA9PT0gJ2ltbXV0YWJsZScpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbW11dGFibGUnKVxuICB9IGVsc2UgaWYgKGhlYWRlcnNba0d1YXJkXSA9PT0gJ3JlcXVlc3Qtbm8tY29ycycpIHtcbiAgICAvLyA1LiBPdGhlcndpc2UsIGlmIGhlYWRlcnPigJlzIGd1YXJkIGlzIFwicmVxdWVzdC1uby1jb3JzXCI6XG4gICAgLy8gVE9ET1xuICB9XG5cbiAgLy8gNi4gT3RoZXJ3aXNlLCBpZiBoZWFkZXJz4oCZcyBndWFyZCBpcyBcInJlc3BvbnNlXCIgYW5kIG5hbWUgaXMgYVxuICAvLyAgICBmb3JiaWRkZW4gcmVzcG9uc2UtaGVhZGVyIG5hbWUsIHJldHVybi5cblxuICAvLyA3LiBBcHBlbmQgKG5hbWUsIHZhbHVlKSB0byBoZWFkZXJz4oCZcyBoZWFkZXIgbGlzdC5cbiAgcmV0dXJuIGhlYWRlcnNba0hlYWRlcnNMaXN0XS5hcHBlbmQobmFtZSwgdmFsdWUpXG5cbiAgLy8gOC4gSWYgaGVhZGVyc+KAmXMgZ3VhcmQgaXMgXCJyZXF1ZXN0LW5vLWNvcnNcIiwgdGhlbiByZW1vdmVcbiAgLy8gICAgcHJpdmlsZWdlZCBuby1DT1JTIHJlcXVlc3QgaGVhZGVycyBmcm9tIGhlYWRlcnNcbn1cblxuY2xhc3MgSGVhZGVyc0xpc3Qge1xuICAvKiogQHR5cGUge1tzdHJpbmcsIHN0cmluZ11bXXxudWxsfSAqL1xuICBjb29raWVzID0gbnVsbFxuXG4gIGNvbnN0cnVjdG9yIChpbml0KSB7XG4gICAgaWYgKGluaXQgaW5zdGFuY2VvZiBIZWFkZXJzTGlzdCkge1xuICAgICAgdGhpc1trSGVhZGVyc01hcF0gPSBuZXcgTWFwKGluaXRba0hlYWRlcnNNYXBdKVxuICAgICAgdGhpc1trSGVhZGVyc1NvcnRlZE1hcF0gPSBpbml0W2tIZWFkZXJzU29ydGVkTWFwXVxuICAgICAgdGhpcy5jb29raWVzID0gaW5pdC5jb29raWVzID09PSBudWxsID8gbnVsbCA6IFsuLi5pbml0LmNvb2tpZXNdXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNba0hlYWRlcnNNYXBdID0gbmV3IE1hcChpbml0KVxuICAgICAgdGhpc1trSGVhZGVyc1NvcnRlZE1hcF0gPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2hlYWRlci1saXN0LWNvbnRhaW5zXG4gIGNvbnRhaW5zIChuYW1lKSB7XG4gICAgLy8gQSBoZWFkZXIgbGlzdCBsaXN0IGNvbnRhaW5zIGEgaGVhZGVyIG5hbWUgbmFtZSBpZiBsaXN0XG4gICAgLy8gY29udGFpbnMgYSBoZWFkZXIgd2hvc2UgbmFtZSBpcyBhIGJ5dGUtY2FzZS1pbnNlbnNpdGl2ZVxuICAgIC8vIG1hdGNoIGZvciBuYW1lLlxuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKClcblxuICAgIHJldHVybiB0aGlzW2tIZWFkZXJzTWFwXS5oYXMobmFtZSlcbiAgfVxuXG4gIGNsZWFyICgpIHtcbiAgICB0aGlzW2tIZWFkZXJzTWFwXS5jbGVhcigpXG4gICAgdGhpc1trSGVhZGVyc1NvcnRlZE1hcF0gPSBudWxsXG4gICAgdGhpcy5jb29raWVzID0gbnVsbFxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtaGVhZGVyLWxpc3QtYXBwZW5kXG4gIGFwcGVuZCAobmFtZSwgdmFsdWUpIHtcbiAgICB0aGlzW2tIZWFkZXJzU29ydGVkTWFwXSA9IG51bGxcblxuICAgIC8vIDEuIElmIGxpc3QgY29udGFpbnMgbmFtZSwgdGhlbiBzZXQgbmFtZSB0byB0aGUgZmlyc3Qgc3VjaFxuICAgIC8vICAgIGhlYWRlcuKAmXMgbmFtZS5cbiAgICBjb25zdCBsb3dlcmNhc2VOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgY29uc3QgZXhpc3RzID0gdGhpc1trSGVhZGVyc01hcF0uZ2V0KGxvd2VyY2FzZU5hbWUpXG5cbiAgICAvLyAyLiBBcHBlbmQgKG5hbWUsIHZhbHVlKSB0byBsaXN0LlxuICAgIGlmIChleGlzdHMpIHtcbiAgICAgIGNvbnN0IGRlbGltaXRlciA9IGxvd2VyY2FzZU5hbWUgPT09ICdjb29raWUnID8gJzsgJyA6ICcsICdcbiAgICAgIHRoaXNba0hlYWRlcnNNYXBdLnNldChsb3dlcmNhc2VOYW1lLCB7XG4gICAgICAgIG5hbWU6IGV4aXN0cy5uYW1lLFxuICAgICAgICB2YWx1ZTogYCR7ZXhpc3RzLnZhbHVlfSR7ZGVsaW1pdGVyfSR7dmFsdWV9YFxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1trSGVhZGVyc01hcF0uc2V0KGxvd2VyY2FzZU5hbWUsIHsgbmFtZSwgdmFsdWUgfSlcbiAgICB9XG5cbiAgICBpZiAobG93ZXJjYXNlTmFtZSA9PT0gJ3NldC1jb29raWUnKSB7XG4gICAgICB0aGlzLmNvb2tpZXMgPz89IFtdXG4gICAgICB0aGlzLmNvb2tpZXMucHVzaCh2YWx1ZSlcbiAgICB9XG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1oZWFkZXItbGlzdC1zZXRcbiAgc2V0IChuYW1lLCB2YWx1ZSkge1xuICAgIHRoaXNba0hlYWRlcnNTb3J0ZWRNYXBdID0gbnVsbFxuICAgIGNvbnN0IGxvd2VyY2FzZU5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKClcblxuICAgIGlmIChsb3dlcmNhc2VOYW1lID09PSAnc2V0LWNvb2tpZScpIHtcbiAgICAgIHRoaXMuY29va2llcyA9IFt2YWx1ZV1cbiAgICB9XG5cbiAgICAvLyAxLiBJZiBsaXN0IGNvbnRhaW5zIG5hbWUsIHRoZW4gc2V0IHRoZSB2YWx1ZSBvZlxuICAgIC8vICAgIHRoZSBmaXJzdCBzdWNoIGhlYWRlciB0byB2YWx1ZSBhbmQgcmVtb3ZlIHRoZVxuICAgIC8vICAgIG90aGVycy5cbiAgICAvLyAyLiBPdGhlcndpc2UsIGFwcGVuZCBoZWFkZXIgKG5hbWUsIHZhbHVlKSB0byBsaXN0LlxuICAgIHRoaXNba0hlYWRlcnNNYXBdLnNldChsb3dlcmNhc2VOYW1lLCB7IG5hbWUsIHZhbHVlIH0pXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1oZWFkZXItbGlzdC1kZWxldGVcbiAgZGVsZXRlIChuYW1lKSB7XG4gICAgdGhpc1trSGVhZGVyc1NvcnRlZE1hcF0gPSBudWxsXG5cbiAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpXG5cbiAgICBpZiAobmFtZSA9PT0gJ3NldC1jb29raWUnKSB7XG4gICAgICB0aGlzLmNvb2tpZXMgPSBudWxsXG4gICAgfVxuXG4gICAgdGhpc1trSGVhZGVyc01hcF0uZGVsZXRlKG5hbWUpXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1oZWFkZXItbGlzdC1nZXRcbiAgZ2V0IChuYW1lKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzW2tIZWFkZXJzTWFwXS5nZXQobmFtZS50b0xvd2VyQ2FzZSgpKVxuXG4gICAgLy8gMS4gSWYgbGlzdCBkb2VzIG5vdCBjb250YWluIG5hbWUsIHRoZW4gcmV0dXJuIG51bGwuXG4gICAgLy8gMi4gUmV0dXJuIHRoZSB2YWx1ZXMgb2YgYWxsIGhlYWRlcnMgaW4gbGlzdCB3aG9zZSBuYW1lXG4gICAgLy8gICAgaXMgYSBieXRlLWNhc2UtaW5zZW5zaXRpdmUgbWF0Y2ggZm9yIG5hbWUsXG4gICAgLy8gICAgc2VwYXJhdGVkIGZyb20gZWFjaCBvdGhlciBieSAweDJDIDB4MjAsIGluIG9yZGVyLlxuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHZhbHVlLnZhbHVlXG4gIH1cblxuICAqIFtTeW1ib2wuaXRlcmF0b3JdICgpIHtcbiAgICAvLyB1c2UgdGhlIGxvd2VyY2FzZWQgbmFtZVxuICAgIGZvciAoY29uc3QgW25hbWUsIHsgdmFsdWUgfV0gb2YgdGhpc1trSGVhZGVyc01hcF0pIHtcbiAgICAgIHlpZWxkIFtuYW1lLCB2YWx1ZV1cbiAgICB9XG4gIH1cblxuICBnZXQgZW50cmllcyAoKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9XG5cbiAgICBpZiAodGhpc1trSGVhZGVyc01hcF0uc2l6ZSkge1xuICAgICAgZm9yIChjb25zdCB7IG5hbWUsIHZhbHVlIH0gb2YgdGhpc1trSGVhZGVyc01hcF0udmFsdWVzKCkpIHtcbiAgICAgICAgaGVhZGVyc1tuYW1lXSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGhlYWRlcnNcbiAgfVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaGVhZGVycy1jbGFzc1xuY2xhc3MgSGVhZGVycyB7XG4gIGNvbnN0cnVjdG9yIChpbml0ID0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGluaXQgPT09IGtDb25zdHJ1Y3QpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzW2tIZWFkZXJzTGlzdF0gPSBuZXcgSGVhZGVyc0xpc3QoKVxuXG4gICAgLy8gVGhlIG5ldyBIZWFkZXJzKGluaXQpIGNvbnN0cnVjdG9yIHN0ZXBzIGFyZTpcblxuICAgIC8vIDEuIFNldCB0aGlz4oCZcyBndWFyZCB0byBcIm5vbmVcIi5cbiAgICB0aGlzW2tHdWFyZF0gPSAnbm9uZSdcblxuICAgIC8vIDIuIElmIGluaXQgaXMgZ2l2ZW4sIHRoZW4gZmlsbCB0aGlzIHdpdGggaW5pdC5cbiAgICBpZiAoaW5pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpbml0ID0gd2ViaWRsLmNvbnZlcnRlcnMuSGVhZGVyc0luaXQoaW5pdClcbiAgICAgIGZpbGwodGhpcywgaW5pdClcbiAgICB9XG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWhlYWRlcnMtYXBwZW5kXG4gIGFwcGVuZCAobmFtZSwgdmFsdWUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBIZWFkZXJzKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAyLCB7IGhlYWRlcjogJ0hlYWRlcnMuYXBwZW5kJyB9KVxuXG4gICAgbmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmcobmFtZSlcbiAgICB2YWx1ZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmcodmFsdWUpXG5cbiAgICByZXR1cm4gYXBwZW5kSGVhZGVyKHRoaXMsIG5hbWUsIHZhbHVlKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1oZWFkZXJzLWRlbGV0ZVxuICBkZWxldGUgKG5hbWUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBIZWFkZXJzKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0hlYWRlcnMuZGVsZXRlJyB9KVxuXG4gICAgbmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmcobmFtZSlcblxuICAgIC8vIDEuIElmIG5hbWUgaXMgbm90IGEgaGVhZGVyIG5hbWUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKCFpc1ZhbGlkSGVhZGVyTmFtZShuYW1lKSkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5pbnZhbGlkQXJndW1lbnQoe1xuICAgICAgICBwcmVmaXg6ICdIZWFkZXJzLmRlbGV0ZScsXG4gICAgICAgIHZhbHVlOiBuYW1lLFxuICAgICAgICB0eXBlOiAnaGVhZGVyIG5hbWUnXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDIuIElmIHRoaXPigJlzIGd1YXJkIGlzIFwiaW1tdXRhYmxlXCIsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgLy8gMy4gT3RoZXJ3aXNlLCBpZiB0aGlz4oCZcyBndWFyZCBpcyBcInJlcXVlc3RcIiBhbmQgbmFtZSBpcyBhXG4gICAgLy8gICAgZm9yYmlkZGVuIGhlYWRlciBuYW1lLCByZXR1cm4uXG4gICAgLy8gNC4gT3RoZXJ3aXNlLCBpZiB0aGlz4oCZcyBndWFyZCBpcyBcInJlcXVlc3Qtbm8tY29yc1wiLCBuYW1lXG4gICAgLy8gICAgaXMgbm90IGEgbm8tQ09SUy1zYWZlbGlzdGVkIHJlcXVlc3QtaGVhZGVyIG5hbWUsIGFuZFxuICAgIC8vICAgIG5hbWUgaXMgbm90IGEgcHJpdmlsZWdlZCBuby1DT1JTIHJlcXVlc3QtaGVhZGVyIG5hbWUsXG4gICAgLy8gICAgcmV0dXJuLlxuICAgIC8vIDUuIE90aGVyd2lzZSwgaWYgdGhpc+KAmXMgZ3VhcmQgaXMgXCJyZXNwb25zZVwiIGFuZCBuYW1lIGlzXG4gICAgLy8gICAgYSBmb3JiaWRkZW4gcmVzcG9uc2UtaGVhZGVyIG5hbWUsIHJldHVybi5cbiAgICAvLyBOb3RlOiB1bmRpY2kgZG9lcyBub3QgaW1wbGVtZW50IGZvcmJpZGRlbiBoZWFkZXIgbmFtZXNcbiAgICBpZiAodGhpc1trR3VhcmRdID09PSAnaW1tdXRhYmxlJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW1tdXRhYmxlJylcbiAgICB9IGVsc2UgaWYgKHRoaXNba0d1YXJkXSA9PT0gJ3JlcXVlc3Qtbm8tY29ycycpIHtcbiAgICAgIC8vIFRPRE9cbiAgICB9XG5cbiAgICAvLyA2LiBJZiB0aGlz4oCZcyBoZWFkZXIgbGlzdCBkb2VzIG5vdCBjb250YWluIG5hbWUsIHRoZW5cbiAgICAvLyAgICByZXR1cm4uXG4gICAgaWYgKCF0aGlzW2tIZWFkZXJzTGlzdF0uY29udGFpbnMobmFtZSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIDcuIERlbGV0ZSBuYW1lIGZyb20gdGhpc+KAmXMgaGVhZGVyIGxpc3QuXG4gICAgLy8gOC4gSWYgdGhpc+KAmXMgZ3VhcmQgaXMgXCJyZXF1ZXN0LW5vLWNvcnNcIiwgdGhlbiByZW1vdmVcbiAgICAvLyAgICBwcml2aWxlZ2VkIG5vLUNPUlMgcmVxdWVzdCBoZWFkZXJzIGZyb20gdGhpcy5cbiAgICB0aGlzW2tIZWFkZXJzTGlzdF0uZGVsZXRlKG5hbWUpXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWhlYWRlcnMtZ2V0XG4gIGdldCAobmFtZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEhlYWRlcnMpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnSGVhZGVycy5nZXQnIH0pXG5cbiAgICBuYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZyhuYW1lKVxuXG4gICAgLy8gMS4gSWYgbmFtZSBpcyBub3QgYSBoZWFkZXIgbmFtZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAoIWlzVmFsaWRIZWFkZXJOYW1lKG5hbWUpKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmludmFsaWRBcmd1bWVudCh7XG4gICAgICAgIHByZWZpeDogJ0hlYWRlcnMuZ2V0JyxcbiAgICAgICAgdmFsdWU6IG5hbWUsXG4gICAgICAgIHR5cGU6ICdoZWFkZXIgbmFtZSdcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gMi4gUmV0dXJuIHRoZSByZXN1bHQgb2YgZ2V0dGluZyBuYW1lIGZyb20gdGhpc+KAmXMgaGVhZGVyXG4gICAgLy8gICAgbGlzdC5cbiAgICByZXR1cm4gdGhpc1trSGVhZGVyc0xpc3RdLmdldChuYW1lKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1oZWFkZXJzLWhhc1xuICBoYXMgKG5hbWUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBIZWFkZXJzKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0hlYWRlcnMuaGFzJyB9KVxuXG4gICAgbmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmcobmFtZSlcblxuICAgIC8vIDEuIElmIG5hbWUgaXMgbm90IGEgaGVhZGVyIG5hbWUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKCFpc1ZhbGlkSGVhZGVyTmFtZShuYW1lKSkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5pbnZhbGlkQXJndW1lbnQoe1xuICAgICAgICBwcmVmaXg6ICdIZWFkZXJzLmhhcycsXG4gICAgICAgIHZhbHVlOiBuYW1lLFxuICAgICAgICB0eXBlOiAnaGVhZGVyIG5hbWUnXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDIuIFJldHVybiB0cnVlIGlmIHRoaXPigJlzIGhlYWRlciBsaXN0IGNvbnRhaW5zIG5hbWU7XG4gICAgLy8gICAgb3RoZXJ3aXNlIGZhbHNlLlxuICAgIHJldHVybiB0aGlzW2tIZWFkZXJzTGlzdF0uY29udGFpbnMobmFtZSlcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkb20taGVhZGVycy1zZXRcbiAgc2V0IChuYW1lLCB2YWx1ZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEhlYWRlcnMpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDIsIHsgaGVhZGVyOiAnSGVhZGVycy5zZXQnIH0pXG5cbiAgICBuYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZyhuYW1lKVxuICAgIHZhbHVlID0gd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZyh2YWx1ZSlcblxuICAgIC8vIDEuIE5vcm1hbGl6ZSB2YWx1ZS5cbiAgICB2YWx1ZSA9IGhlYWRlclZhbHVlTm9ybWFsaXplKHZhbHVlKVxuXG4gICAgLy8gMi4gSWYgbmFtZSBpcyBub3QgYSBoZWFkZXIgbmFtZSBvciB2YWx1ZSBpcyBub3QgYVxuICAgIC8vICAgIGhlYWRlciB2YWx1ZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAoIWlzVmFsaWRIZWFkZXJOYW1lKG5hbWUpKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmludmFsaWRBcmd1bWVudCh7XG4gICAgICAgIHByZWZpeDogJ0hlYWRlcnMuc2V0JyxcbiAgICAgICAgdmFsdWU6IG5hbWUsXG4gICAgICAgIHR5cGU6ICdoZWFkZXIgbmFtZSdcbiAgICAgIH0pXG4gICAgfSBlbHNlIGlmICghaXNWYWxpZEhlYWRlclZhbHVlKHZhbHVlKSkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5pbnZhbGlkQXJndW1lbnQoe1xuICAgICAgICBwcmVmaXg6ICdIZWFkZXJzLnNldCcsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB0eXBlOiAnaGVhZGVyIHZhbHVlJ1xuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyAzLiBJZiB0aGlz4oCZcyBndWFyZCBpcyBcImltbXV0YWJsZVwiLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgIC8vIDQuIE90aGVyd2lzZSwgaWYgdGhpc+KAmXMgZ3VhcmQgaXMgXCJyZXF1ZXN0XCIgYW5kIG5hbWUgaXMgYVxuICAgIC8vICAgIGZvcmJpZGRlbiBoZWFkZXIgbmFtZSwgcmV0dXJuLlxuICAgIC8vIDUuIE90aGVyd2lzZSwgaWYgdGhpc+KAmXMgZ3VhcmQgaXMgXCJyZXF1ZXN0LW5vLWNvcnNcIiBhbmRcbiAgICAvLyAgICBuYW1lL3ZhbHVlIGlzIG5vdCBhIG5vLUNPUlMtc2FmZWxpc3RlZCByZXF1ZXN0LWhlYWRlcixcbiAgICAvLyAgICByZXR1cm4uXG4gICAgLy8gNi4gT3RoZXJ3aXNlLCBpZiB0aGlz4oCZcyBndWFyZCBpcyBcInJlc3BvbnNlXCIgYW5kIG5hbWUgaXMgYVxuICAgIC8vICAgIGZvcmJpZGRlbiByZXNwb25zZS1oZWFkZXIgbmFtZSwgcmV0dXJuLlxuICAgIC8vIE5vdGU6IHVuZGljaSBkb2VzIG5vdCBpbXBsZW1lbnQgZm9yYmlkZGVuIGhlYWRlciBuYW1lc1xuICAgIGlmICh0aGlzW2tHdWFyZF0gPT09ICdpbW11dGFibGUnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbW11dGFibGUnKVxuICAgIH0gZWxzZSBpZiAodGhpc1trR3VhcmRdID09PSAncmVxdWVzdC1uby1jb3JzJykge1xuICAgICAgLy8gVE9ET1xuICAgIH1cblxuICAgIC8vIDcuIFNldCAobmFtZSwgdmFsdWUpIGluIHRoaXPigJlzIGhlYWRlciBsaXN0LlxuICAgIC8vIDguIElmIHRoaXPigJlzIGd1YXJkIGlzIFwicmVxdWVzdC1uby1jb3JzXCIsIHRoZW4gcmVtb3ZlXG4gICAgLy8gICAgcHJpdmlsZWdlZCBuby1DT1JTIHJlcXVlc3QgaGVhZGVycyBmcm9tIHRoaXNcbiAgICB0aGlzW2tIZWFkZXJzTGlzdF0uc2V0KG5hbWUsIHZhbHVlKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1oZWFkZXJzLWdldHNldGNvb2tpZVxuICBnZXRTZXRDb29raWUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEhlYWRlcnMpXG5cbiAgICAvLyAxLiBJZiB0aGlz4oCZcyBoZWFkZXIgbGlzdCBkb2VzIG5vdCBjb250YWluIGBTZXQtQ29va2llYCwgdGhlbiByZXR1cm4gwqsgwrsuXG4gICAgLy8gMi4gUmV0dXJuIHRoZSB2YWx1ZXMgb2YgYWxsIGhlYWRlcnMgaW4gdGhpc+KAmXMgaGVhZGVyIGxpc3Qgd2hvc2UgbmFtZSBpc1xuICAgIC8vICAgIGEgYnl0ZS1jYXNlLWluc2Vuc2l0aXZlIG1hdGNoIGZvciBgU2V0LUNvb2tpZWAsIGluIG9yZGVyLlxuXG4gICAgY29uc3QgbGlzdCA9IHRoaXNba0hlYWRlcnNMaXN0XS5jb29raWVzXG5cbiAgICBpZiAobGlzdCkge1xuICAgICAgcmV0dXJuIFsuLi5saXN0XVxuICAgIH1cblxuICAgIHJldHVybiBbXVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtaGVhZGVyLWxpc3Qtc29ydC1hbmQtY29tYmluZVxuICBnZXQgW2tIZWFkZXJzU29ydGVkTWFwXSAoKSB7XG4gICAgaWYgKHRoaXNba0hlYWRlcnNMaXN0XVtrSGVhZGVyc1NvcnRlZE1hcF0pIHtcbiAgICAgIHJldHVybiB0aGlzW2tIZWFkZXJzTGlzdF1ba0hlYWRlcnNTb3J0ZWRNYXBdXG4gICAgfVxuXG4gICAgLy8gMS4gTGV0IGhlYWRlcnMgYmUgYW4gZW1wdHkgbGlzdCBvZiBoZWFkZXJzIHdpdGggdGhlIGtleSBiZWluZyB0aGUgbmFtZVxuICAgIC8vICAgIGFuZCB2YWx1ZSB0aGUgdmFsdWUuXG4gICAgY29uc3QgaGVhZGVycyA9IFtdXG5cbiAgICAvLyAyLiBMZXQgbmFtZXMgYmUgdGhlIHJlc3VsdCBvZiBjb252ZXJ0IGhlYWRlciBuYW1lcyB0byBhIHNvcnRlZC1sb3dlcmNhc2VcbiAgICAvLyAgICBzZXQgd2l0aCBhbGwgdGhlIG5hbWVzIG9mIHRoZSBoZWFkZXJzIGluIGxpc3QuXG4gICAgY29uc3QgbmFtZXMgPSBbLi4udGhpc1trSGVhZGVyc0xpc3RdXS5zb3J0KChhLCBiKSA9PiBhWzBdIDwgYlswXSA/IC0xIDogMSlcbiAgICBjb25zdCBjb29raWVzID0gdGhpc1trSGVhZGVyc0xpc3RdLmNvb2tpZXNcblxuICAgIC8vIDMuIEZvciBlYWNoIG5hbWUgb2YgbmFtZXM6XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7ICsraSkge1xuICAgICAgY29uc3QgW25hbWUsIHZhbHVlXSA9IG5hbWVzW2ldXG4gICAgICAvLyAxLiBJZiBuYW1lIGlzIGBzZXQtY29va2llYCwgdGhlbjpcbiAgICAgIGlmIChuYW1lID09PSAnc2V0LWNvb2tpZScpIHtcbiAgICAgICAgLy8gMS4gTGV0IHZhbHVlcyBiZSBhIGxpc3Qgb2YgYWxsIHZhbHVlcyBvZiBoZWFkZXJzIGluIGxpc3Qgd2hvc2UgbmFtZVxuICAgICAgICAvLyAgICBpcyBhIGJ5dGUtY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBmb3IgbmFtZSwgaW4gb3JkZXIuXG5cbiAgICAgICAgLy8gMi4gRm9yIGVhY2ggdmFsdWUgb2YgdmFsdWVzOlxuICAgICAgICAvLyAxLiBBcHBlbmQgKG5hbWUsIHZhbHVlKSB0byBoZWFkZXJzLlxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvb2tpZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICBoZWFkZXJzLnB1c2goW25hbWUsIGNvb2tpZXNbal1dKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAyLiBPdGhlcndpc2U6XG5cbiAgICAgICAgLy8gMS4gTGV0IHZhbHVlIGJlIHRoZSByZXN1bHQgb2YgZ2V0dGluZyBuYW1lIGZyb20gbGlzdC5cblxuICAgICAgICAvLyAyLiBBc3NlcnQ6IHZhbHVlIGlzIG5vbi1udWxsLlxuICAgICAgICBhc3NlcnQodmFsdWUgIT09IG51bGwpXG5cbiAgICAgICAgLy8gMy4gQXBwZW5kIChuYW1lLCB2YWx1ZSkgdG8gaGVhZGVycy5cbiAgICAgICAgaGVhZGVycy5wdXNoKFtuYW1lLCB2YWx1ZV0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpc1trSGVhZGVyc0xpc3RdW2tIZWFkZXJzU29ydGVkTWFwXSA9IGhlYWRlcnNcblxuICAgIC8vIDQuIFJldHVybiBoZWFkZXJzLlxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cblxuICBrZXlzICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBIZWFkZXJzKVxuXG4gICAgaWYgKHRoaXNba0d1YXJkXSA9PT0gJ2ltbXV0YWJsZScpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1trSGVhZGVyc1NvcnRlZE1hcF1cbiAgICAgIHJldHVybiBtYWtlSXRlcmF0b3IoKCkgPT4gdmFsdWUsICdIZWFkZXJzJyxcbiAgICAgICAgJ2tleScpXG4gICAgfVxuXG4gICAgcmV0dXJuIG1ha2VJdGVyYXRvcihcbiAgICAgICgpID0+IFsuLi50aGlzW2tIZWFkZXJzU29ydGVkTWFwXS52YWx1ZXMoKV0sXG4gICAgICAnSGVhZGVycycsXG4gICAgICAna2V5J1xuICAgIClcbiAgfVxuXG4gIHZhbHVlcyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgSGVhZGVycylcblxuICAgIGlmICh0aGlzW2tHdWFyZF0gPT09ICdpbW11dGFibGUnKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXNba0hlYWRlcnNTb3J0ZWRNYXBdXG4gICAgICByZXR1cm4gbWFrZUl0ZXJhdG9yKCgpID0+IHZhbHVlLCAnSGVhZGVycycsXG4gICAgICAgICd2YWx1ZScpXG4gICAgfVxuXG4gICAgcmV0dXJuIG1ha2VJdGVyYXRvcihcbiAgICAgICgpID0+IFsuLi50aGlzW2tIZWFkZXJzU29ydGVkTWFwXS52YWx1ZXMoKV0sXG4gICAgICAnSGVhZGVycycsXG4gICAgICAndmFsdWUnXG4gICAgKVxuICB9XG5cbiAgZW50cmllcyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgSGVhZGVycylcblxuICAgIGlmICh0aGlzW2tHdWFyZF0gPT09ICdpbW11dGFibGUnKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXNba0hlYWRlcnNTb3J0ZWRNYXBdXG4gICAgICByZXR1cm4gbWFrZUl0ZXJhdG9yKCgpID0+IHZhbHVlLCAnSGVhZGVycycsXG4gICAgICAgICdrZXkrdmFsdWUnKVxuICAgIH1cblxuICAgIHJldHVybiBtYWtlSXRlcmF0b3IoXG4gICAgICAoKSA9PiBbLi4udGhpc1trSGVhZGVyc1NvcnRlZE1hcF0udmFsdWVzKCldLFxuICAgICAgJ0hlYWRlcnMnLFxuICAgICAgJ2tleSt2YWx1ZSdcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsodmFsdWU6IHN0cmluZywga2V5OiBzdHJpbmcsIHNlbGY6IEhlYWRlcnMpID0+IHZvaWR9IGNhbGxiYWNrRm5cbiAgICogQHBhcmFtIHt1bmtub3dufSB0aGlzQXJnXG4gICAqL1xuICBmb3JFYWNoIChjYWxsYmFja0ZuLCB0aGlzQXJnID0gZ2xvYmFsVGhpcykge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEhlYWRlcnMpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnSGVhZGVycy5mb3JFYWNoJyB9KVxuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFja0ZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBcIkZhaWxlZCB0byBleGVjdXRlICdmb3JFYWNoJyBvbiAnSGVhZGVycyc6IHBhcmFtZXRlciAxIGlzIG5vdCBvZiB0eXBlICdGdW5jdGlvbicuXCJcbiAgICAgIClcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzKSB7XG4gICAgICBjYWxsYmFja0ZuLmFwcGx5KHRoaXNBcmcsIFt2YWx1ZSwga2V5LCB0aGlzXSlcbiAgICB9XG4gIH1cblxuICBbU3ltYm9sLmZvcignbm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20nKV0gKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEhlYWRlcnMpXG5cbiAgICByZXR1cm4gdGhpc1trSGVhZGVyc0xpc3RdXG4gIH1cbn1cblxuSGVhZGVycy5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IEhlYWRlcnMucHJvdG90eXBlLmVudHJpZXNcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoSGVhZGVycy5wcm90b3R5cGUsIHtcbiAgYXBwZW5kOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBkZWxldGU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGdldDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgaGFzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBzZXQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGdldFNldENvb2tpZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAga2V5czoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgdmFsdWVzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBlbnRyaWVzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBmb3JFYWNoOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBbU3ltYm9sLml0ZXJhdG9yXTogeyBlbnVtZXJhYmxlOiBmYWxzZSB9LFxuICBbU3ltYm9sLnRvU3RyaW5nVGFnXToge1xuICAgIHZhbHVlOiAnSGVhZGVycycsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0sXG4gIFt1dGlsLmluc3BlY3QuY3VzdG9tXToge1xuICAgIGVudW1lcmFibGU6IGZhbHNlXG4gIH1cbn0pXG5cbndlYmlkbC5jb252ZXJ0ZXJzLkhlYWRlcnNJbml0ID0gZnVuY3Rpb24gKFYpIHtcbiAgaWYgKHdlYmlkbC51dGlsLlR5cGUoVikgPT09ICdPYmplY3QnKSB7XG4gICAgaWYgKFZbU3ltYm9sLml0ZXJhdG9yXSkge1xuICAgICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzWydzZXF1ZW5jZTxzZXF1ZW5jZTxCeXRlU3RyaW5nPj4nXShWKVxuICAgIH1cblxuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVyc1sncmVjb3JkPEJ5dGVTdHJpbmcsIEJ5dGVTdHJpbmc+J10oVilcbiAgfVxuXG4gIHRocm93IHdlYmlkbC5lcnJvcnMuY29udmVyc2lvbkZhaWxlZCh7XG4gICAgcHJlZml4OiAnSGVhZGVycyBjb25zdHJ1Y3RvcicsXG4gICAgYXJndW1lbnQ6ICdBcmd1bWVudCAxJyxcbiAgICB0eXBlczogWydzZXF1ZW5jZTxzZXF1ZW5jZTxCeXRlU3RyaW5nPj4nLCAncmVjb3JkPEJ5dGVTdHJpbmcsIEJ5dGVTdHJpbmc+J11cbiAgfSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGZpbGwsXG4gIEhlYWRlcnMsXG4gIEhlYWRlcnNMaXN0XG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBIZWFkZXJzLCBIZWFkZXJzTGlzdCwgZmlsbCB9ID0gcmVxdWlyZSgnLi9oZWFkZXJzJylcbmNvbnN0IHsgZXh0cmFjdEJvZHksIGNsb25lQm9keSwgbWl4aW5Cb2R5IH0gPSByZXF1aXJlKCcuL2JvZHknKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5jb25zdCB7IGtFbnVtZXJhYmxlUHJvcGVydHkgfSA9IHV0aWxcbmNvbnN0IHtcbiAgaXNWYWxpZFJlYXNvblBocmFzZSxcbiAgaXNDYW5jZWxsZWQsXG4gIGlzQWJvcnRlZCxcbiAgaXNCbG9iTGlrZSxcbiAgc2VyaWFsaXplSmF2YXNjcmlwdFZhbHVlVG9KU09OU3RyaW5nLFxuICBpc0Vycm9yTGlrZSxcbiAgaXNvbW9ycGhpY0VuY29kZVxufSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7XG4gIHJlZGlyZWN0U3RhdHVzU2V0LFxuICBudWxsQm9keVN0YXR1cyxcbiAgRE9NRXhjZXB0aW9uXG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3QgeyBrU3RhdGUsIGtIZWFkZXJzLCBrR3VhcmQsIGtSZWFsbSB9ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgd2ViaWRsIH0gPSByZXF1aXJlKCcuL3dlYmlkbCcpXG5jb25zdCB7IEZvcm1EYXRhIH0gPSByZXF1aXJlKCcuL2Zvcm1kYXRhJylcbmNvbnN0IHsgZ2V0R2xvYmFsT3JpZ2luIH0gPSByZXF1aXJlKCcuL2dsb2JhbCcpXG5jb25zdCB7IFVSTFNlcmlhbGl6ZXIgfSA9IHJlcXVpcmUoJy4vZGF0YVVSTCcpXG5jb25zdCB7IGtIZWFkZXJzTGlzdCwga0NvbnN0cnVjdCB9ID0gcmVxdWlyZSgnLi4vY29yZS9zeW1ib2xzJylcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5jb25zdCB7IHR5cGVzIH0gPSByZXF1aXJlKCd1dGlsJylcblxuY29uc3QgUmVhZGFibGVTdHJlYW0gPSBnbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtIHx8IHJlcXVpcmUoJ3N0cmVhbS93ZWInKS5SZWFkYWJsZVN0cmVhbVxuY29uc3QgdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoJ3V0Zi04JylcblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI3Jlc3BvbnNlLWNsYXNzXG5jbGFzcyBSZXNwb25zZSB7XG4gIC8vIENyZWF0ZXMgbmV0d29yayBlcnJvciBSZXNwb25zZS5cbiAgc3RhdGljIGVycm9yICgpIHtcbiAgICAvLyBUT0RPXG4gICAgY29uc3QgcmVsZXZhbnRSZWFsbSA9IHsgc2V0dGluZ3NPYmplY3Q6IHt9IH1cblxuICAgIC8vIFRoZSBzdGF0aWMgZXJyb3IoKSBtZXRob2Qgc3RlcHMgYXJlIHRvIHJldHVybiB0aGUgcmVzdWx0IG9mIGNyZWF0aW5nIGFcbiAgICAvLyBSZXNwb25zZSBvYmplY3QsIGdpdmVuIGEgbmV3IG5ldHdvcmsgZXJyb3IsIFwiaW1tdXRhYmxlXCIsIGFuZCB0aGlz4oCZc1xuICAgIC8vIHJlbGV2YW50IFJlYWxtLlxuICAgIGNvbnN0IHJlc3BvbnNlT2JqZWN0ID0gbmV3IFJlc3BvbnNlKClcbiAgICByZXNwb25zZU9iamVjdFtrU3RhdGVdID0gbWFrZU5ldHdvcmtFcnJvcigpXG4gICAgcmVzcG9uc2VPYmplY3Rba1JlYWxtXSA9IHJlbGV2YW50UmVhbG1cbiAgICByZXNwb25zZU9iamVjdFtrSGVhZGVyc11ba0hlYWRlcnNMaXN0XSA9IHJlc3BvbnNlT2JqZWN0W2tTdGF0ZV0uaGVhZGVyc0xpc3RcbiAgICByZXNwb25zZU9iamVjdFtrSGVhZGVyc11ba0d1YXJkXSA9ICdpbW11dGFibGUnXG4gICAgcmVzcG9uc2VPYmplY3Rba0hlYWRlcnNdW2tSZWFsbV0gPSByZWxldmFudFJlYWxtXG4gICAgcmV0dXJuIHJlc3BvbnNlT2JqZWN0XG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLXJlc3BvbnNlLWpzb25cbiAgc3RhdGljIGpzb24gKGRhdGEsIGluaXQgPSB7fSkge1xuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdSZXNwb25zZS5qc29uJyB9KVxuXG4gICAgaWYgKGluaXQgIT09IG51bGwpIHtcbiAgICAgIGluaXQgPSB3ZWJpZGwuY29udmVydGVycy5SZXNwb25zZUluaXQoaW5pdClcbiAgICB9XG5cbiAgICAvLyAxLiBMZXQgYnl0ZXMgdGhlIHJlc3VsdCBvZiBydW5uaW5nIHNlcmlhbGl6ZSBhIEphdmFTY3JpcHQgdmFsdWUgdG8gSlNPTiBieXRlcyBvbiBkYXRhLlxuICAgIGNvbnN0IGJ5dGVzID0gdGV4dEVuY29kZXIuZW5jb2RlKFxuICAgICAgc2VyaWFsaXplSmF2YXNjcmlwdFZhbHVlVG9KU09OU3RyaW5nKGRhdGEpXG4gICAgKVxuXG4gICAgLy8gMi4gTGV0IGJvZHkgYmUgdGhlIHJlc3VsdCBvZiBleHRyYWN0aW5nIGJ5dGVzLlxuICAgIGNvbnN0IGJvZHkgPSBleHRyYWN0Qm9keShieXRlcylcblxuICAgIC8vIDMuIExldCByZXNwb25zZU9iamVjdCBiZSB0aGUgcmVzdWx0IG9mIGNyZWF0aW5nIGEgUmVzcG9uc2Ugb2JqZWN0LCBnaXZlbiBhIG5ldyByZXNwb25zZSxcbiAgICAvLyAgICBcInJlc3BvbnNlXCIsIGFuZCB0aGlz4oCZcyByZWxldmFudCBSZWFsbS5cbiAgICBjb25zdCByZWxldmFudFJlYWxtID0geyBzZXR0aW5nc09iamVjdDoge30gfVxuICAgIGNvbnN0IHJlc3BvbnNlT2JqZWN0ID0gbmV3IFJlc3BvbnNlKClcbiAgICByZXNwb25zZU9iamVjdFtrUmVhbG1dID0gcmVsZXZhbnRSZWFsbVxuICAgIHJlc3BvbnNlT2JqZWN0W2tIZWFkZXJzXVtrR3VhcmRdID0gJ3Jlc3BvbnNlJ1xuICAgIHJlc3BvbnNlT2JqZWN0W2tIZWFkZXJzXVtrUmVhbG1dID0gcmVsZXZhbnRSZWFsbVxuXG4gICAgLy8gNC4gUGVyZm9ybSBpbml0aWFsaXplIGEgcmVzcG9uc2UgZ2l2ZW4gcmVzcG9uc2VPYmplY3QsIGluaXQsIGFuZCAoYm9keSwgXCJhcHBsaWNhdGlvbi9qc29uXCIpLlxuICAgIGluaXRpYWxpemVSZXNwb25zZShyZXNwb25zZU9iamVjdCwgaW5pdCwgeyBib2R5OiBib2R5WzBdLCB0eXBlOiAnYXBwbGljYXRpb24vanNvbicgfSlcblxuICAgIC8vIDUuIFJldHVybiByZXNwb25zZU9iamVjdC5cbiAgICByZXR1cm4gcmVzcG9uc2VPYmplY3RcbiAgfVxuXG4gIC8vIENyZWF0ZXMgYSByZWRpcmVjdCBSZXNwb25zZSB0aGF0IHJlZGlyZWN0cyB0byB1cmwgd2l0aCBzdGF0dXMgc3RhdHVzLlxuICBzdGF0aWMgcmVkaXJlY3QgKHVybCwgc3RhdHVzID0gMzAyKSB7XG4gICAgY29uc3QgcmVsZXZhbnRSZWFsbSA9IHsgc2V0dGluZ3NPYmplY3Q6IHt9IH1cblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdSZXNwb25zZS5yZWRpcmVjdCcgfSlcblxuICAgIHVybCA9IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyh1cmwpXG4gICAgc3RhdHVzID0gd2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIHNob3J0J10oc3RhdHVzKVxuXG4gICAgLy8gMS4gTGV0IHBhcnNlZFVSTCBiZSB0aGUgcmVzdWx0IG9mIHBhcnNpbmcgdXJsIHdpdGggY3VycmVudCBzZXR0aW5nc1xuICAgIC8vIG9iamVjdOKAmXMgQVBJIGJhc2UgVVJMLlxuICAgIC8vIDIuIElmIHBhcnNlZFVSTCBpcyBmYWlsdXJlLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgIC8vIFRPRE86IGJhc2UtVVJMP1xuICAgIGxldCBwYXJzZWRVUkxcbiAgICB0cnkge1xuICAgICAgcGFyc2VkVVJMID0gbmV3IFVSTCh1cmwsIGdldEdsb2JhbE9yaWdpbigpKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgVHlwZUVycm9yKCdGYWlsZWQgdG8gcGFyc2UgVVJMIGZyb20gJyArIHVybCksIHtcbiAgICAgICAgY2F1c2U6IGVyclxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyAzLiBJZiBzdGF0dXMgaXMgbm90IGEgcmVkaXJlY3Qgc3RhdHVzLCB0aGVuIHRocm93IGEgUmFuZ2VFcnJvci5cbiAgICBpZiAoIXJlZGlyZWN0U3RhdHVzU2V0LmhhcyhzdGF0dXMpKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCBzdGF0dXMgY29kZSAnICsgc3RhdHVzKVxuICAgIH1cblxuICAgIC8vIDQuIExldCByZXNwb25zZU9iamVjdCBiZSB0aGUgcmVzdWx0IG9mIGNyZWF0aW5nIGEgUmVzcG9uc2Ugb2JqZWN0LFxuICAgIC8vIGdpdmVuIGEgbmV3IHJlc3BvbnNlLCBcImltbXV0YWJsZVwiLCBhbmQgdGhpc+KAmXMgcmVsZXZhbnQgUmVhbG0uXG4gICAgY29uc3QgcmVzcG9uc2VPYmplY3QgPSBuZXcgUmVzcG9uc2UoKVxuICAgIHJlc3BvbnNlT2JqZWN0W2tSZWFsbV0gPSByZWxldmFudFJlYWxtXG4gICAgcmVzcG9uc2VPYmplY3Rba0hlYWRlcnNdW2tHdWFyZF0gPSAnaW1tdXRhYmxlJ1xuICAgIHJlc3BvbnNlT2JqZWN0W2tIZWFkZXJzXVtrUmVhbG1dID0gcmVsZXZhbnRSZWFsbVxuXG4gICAgLy8gNS4gU2V0IHJlc3BvbnNlT2JqZWN04oCZcyByZXNwb25zZeKAmXMgc3RhdHVzIHRvIHN0YXR1cy5cbiAgICByZXNwb25zZU9iamVjdFtrU3RhdGVdLnN0YXR1cyA9IHN0YXR1c1xuXG4gICAgLy8gNi4gTGV0IHZhbHVlIGJlIHBhcnNlZFVSTCwgc2VyaWFsaXplZCBhbmQgaXNvbW9ycGhpYyBlbmNvZGVkLlxuICAgIGNvbnN0IHZhbHVlID0gaXNvbW9ycGhpY0VuY29kZShVUkxTZXJpYWxpemVyKHBhcnNlZFVSTCkpXG5cbiAgICAvLyA3LiBBcHBlbmQgYExvY2F0aW9uYC92YWx1ZSB0byByZXNwb25zZU9iamVjdOKAmXMgcmVzcG9uc2XigJlzIGhlYWRlciBsaXN0LlxuICAgIHJlc3BvbnNlT2JqZWN0W2tTdGF0ZV0uaGVhZGVyc0xpc3QuYXBwZW5kKCdsb2NhdGlvbicsIHZhbHVlKVxuXG4gICAgLy8gOC4gUmV0dXJuIHJlc3BvbnNlT2JqZWN0LlxuICAgIHJldHVybiByZXNwb25zZU9iamVjdFxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1yZXNwb25zZVxuICBjb25zdHJ1Y3RvciAoYm9keSA9IG51bGwsIGluaXQgPSB7fSkge1xuICAgIGlmIChib2R5ICE9PSBudWxsKSB7XG4gICAgICBib2R5ID0gd2ViaWRsLmNvbnZlcnRlcnMuQm9keUluaXQoYm9keSlcbiAgICB9XG5cbiAgICBpbml0ID0gd2ViaWRsLmNvbnZlcnRlcnMuUmVzcG9uc2VJbml0KGluaXQpXG5cbiAgICAvLyBUT0RPXG4gICAgdGhpc1trUmVhbG1dID0geyBzZXR0aW5nc09iamVjdDoge30gfVxuXG4gICAgLy8gMS4gU2V0IHRoaXPigJlzIHJlc3BvbnNlIHRvIGEgbmV3IHJlc3BvbnNlLlxuICAgIHRoaXNba1N0YXRlXSA9IG1ha2VSZXNwb25zZSh7fSlcblxuICAgIC8vIDIuIFNldCB0aGlz4oCZcyBoZWFkZXJzIHRvIGEgbmV3IEhlYWRlcnMgb2JqZWN0IHdpdGggdGhpc+KAmXMgcmVsZXZhbnRcbiAgICAvLyBSZWFsbSwgd2hvc2UgaGVhZGVyIGxpc3QgaXMgdGhpc+KAmXMgcmVzcG9uc2XigJlzIGhlYWRlciBsaXN0IGFuZCBndWFyZFxuICAgIC8vIGlzIFwicmVzcG9uc2VcIi5cbiAgICB0aGlzW2tIZWFkZXJzXSA9IG5ldyBIZWFkZXJzKGtDb25zdHJ1Y3QpXG4gICAgdGhpc1trSGVhZGVyc11ba0d1YXJkXSA9ICdyZXNwb25zZSdcbiAgICB0aGlzW2tIZWFkZXJzXVtrSGVhZGVyc0xpc3RdID0gdGhpc1trU3RhdGVdLmhlYWRlcnNMaXN0XG4gICAgdGhpc1trSGVhZGVyc11ba1JlYWxtXSA9IHRoaXNba1JlYWxtXVxuXG4gICAgLy8gMy4gTGV0IGJvZHlXaXRoVHlwZSBiZSBudWxsLlxuICAgIGxldCBib2R5V2l0aFR5cGUgPSBudWxsXG5cbiAgICAvLyA0LiBJZiBib2R5IGlzIG5vbi1udWxsLCB0aGVuIHNldCBib2R5V2l0aFR5cGUgdG8gdGhlIHJlc3VsdCBvZiBleHRyYWN0aW5nIGJvZHkuXG4gICAgaWYgKGJvZHkgIT0gbnVsbCkge1xuICAgICAgY29uc3QgW2V4dHJhY3RlZEJvZHksIHR5cGVdID0gZXh0cmFjdEJvZHkoYm9keSlcbiAgICAgIGJvZHlXaXRoVHlwZSA9IHsgYm9keTogZXh0cmFjdGVkQm9keSwgdHlwZSB9XG4gICAgfVxuXG4gICAgLy8gNS4gUGVyZm9ybSBpbml0aWFsaXplIGEgcmVzcG9uc2UgZ2l2ZW4gdGhpcywgaW5pdCwgYW5kIGJvZHlXaXRoVHlwZS5cbiAgICBpbml0aWFsaXplUmVzcG9uc2UodGhpcywgaW5pdCwgYm9keVdpdGhUeXBlKVxuICB9XG5cbiAgLy8gUmV0dXJucyByZXNwb25zZeKAmXMgdHlwZSwgZS5nLiwgXCJjb3JzXCIuXG4gIGdldCB0eXBlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXNwb25zZSlcblxuICAgIC8vIFRoZSB0eXBlIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHJlc3BvbnNl4oCZcyB0eXBlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0udHlwZVxuICB9XG5cbiAgLy8gUmV0dXJucyByZXNwb25zZeKAmXMgVVJMLCBpZiBpdCBoYXMgb25lOyBvdGhlcndpc2UgdGhlIGVtcHR5IHN0cmluZy5cbiAgZ2V0IHVybCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVzcG9uc2UpXG5cbiAgICBjb25zdCB1cmxMaXN0ID0gdGhpc1trU3RhdGVdLnVybExpc3RcblxuICAgIC8vIFRoZSB1cmwgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhlIGVtcHR5IHN0cmluZyBpZiB0aGlz4oCZc1xuICAgIC8vIHJlc3BvbnNl4oCZcyBVUkwgaXMgbnVsbDsgb3RoZXJ3aXNlIHRoaXPigJlzIHJlc3BvbnNl4oCZcyBVUkwsXG4gICAgLy8gc2VyaWFsaXplZCB3aXRoIGV4Y2x1ZGUgZnJhZ21lbnQgc2V0IHRvIHRydWUuXG4gICAgY29uc3QgdXJsID0gdXJsTGlzdFt1cmxMaXN0Lmxlbmd0aCAtIDFdID8/IG51bGxcblxuICAgIGlmICh1cmwgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cblxuICAgIHJldHVybiBVUkxTZXJpYWxpemVyKHVybCwgdHJ1ZSlcbiAgfVxuXG4gIC8vIFJldHVybnMgd2hldGhlciByZXNwb25zZSB3YXMgb2J0YWluZWQgdGhyb3VnaCBhIHJlZGlyZWN0LlxuICBnZXQgcmVkaXJlY3RlZCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVzcG9uc2UpXG5cbiAgICAvLyBUaGUgcmVkaXJlY3RlZCBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0cnVlIGlmIHRoaXPigJlzIHJlc3BvbnNl4oCZcyBVUkxcbiAgICAvLyBsaXN0IGhhcyBtb3JlIHRoYW4gb25lIGl0ZW07IG90aGVyd2lzZSBmYWxzZS5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLnVybExpc3QubGVuZ3RoID4gMVxuICB9XG5cbiAgLy8gUmV0dXJucyByZXNwb25zZeKAmXMgc3RhdHVzLlxuICBnZXQgc3RhdHVzICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXNwb25zZSlcblxuICAgIC8vIFRoZSBzdGF0dXMgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVzcG9uc2XigJlzIHN0YXR1cy5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLnN0YXR1c1xuICB9XG5cbiAgLy8gUmV0dXJucyB3aGV0aGVyIHJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgYW4gb2sgc3RhdHVzLlxuICBnZXQgb2sgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlc3BvbnNlKVxuXG4gICAgLy8gVGhlIG9rIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRydWUgaWYgdGhpc+KAmXMgcmVzcG9uc2XigJlzIHN0YXR1cyBpcyBhblxuICAgIC8vIG9rIHN0YXR1czsgb3RoZXJ3aXNlIGZhbHNlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uc3RhdHVzID49IDIwMCAmJiB0aGlzW2tTdGF0ZV0uc3RhdHVzIDw9IDI5OVxuICB9XG5cbiAgLy8gUmV0dXJucyByZXNwb25zZeKAmXMgc3RhdHVzIG1lc3NhZ2UuXG4gIGdldCBzdGF0dXNUZXh0ICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXNwb25zZSlcblxuICAgIC8vIFRoZSBzdGF0dXNUZXh0IGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHJlc3BvbnNl4oCZcyBzdGF0dXNcbiAgICAvLyBtZXNzYWdlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uc3RhdHVzVGV4dFxuICB9XG5cbiAgLy8gUmV0dXJucyByZXNwb25zZeKAmXMgaGVhZGVycyBhcyBIZWFkZXJzLlxuICBnZXQgaGVhZGVycyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVzcG9uc2UpXG5cbiAgICAvLyBUaGUgaGVhZGVycyBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlz4oCZcyBoZWFkZXJzLlxuICAgIHJldHVybiB0aGlzW2tIZWFkZXJzXVxuICB9XG5cbiAgZ2V0IGJvZHkgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlc3BvbnNlKVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5ib2R5ID8gdGhpc1trU3RhdGVdLmJvZHkuc3RyZWFtIDogbnVsbFxuICB9XG5cbiAgZ2V0IGJvZHlVc2VkICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXNwb25zZSlcblxuICAgIHJldHVybiAhIXRoaXNba1N0YXRlXS5ib2R5ICYmIHV0aWwuaXNEaXN0dXJiZWQodGhpc1trU3RhdGVdLmJvZHkuc3RyZWFtKVxuICB9XG5cbiAgLy8gUmV0dXJucyBhIGNsb25lIG9mIHJlc3BvbnNlLlxuICBjbG9uZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVzcG9uc2UpXG5cbiAgICAvLyAxLiBJZiB0aGlzIGlzIHVudXNhYmxlLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmICh0aGlzLmJvZHlVc2VkIHx8ICh0aGlzLmJvZHkgJiYgdGhpcy5ib2R5LmxvY2tlZCkpIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgaGVhZGVyOiAnUmVzcG9uc2UuY2xvbmUnLFxuICAgICAgICBtZXNzYWdlOiAnQm9keSBoYXMgYWxyZWFkeSBiZWVuIGNvbnN1bWVkLidcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gMi4gTGV0IGNsb25lZFJlc3BvbnNlIGJlIHRoZSByZXN1bHQgb2YgY2xvbmluZyB0aGlz4oCZcyByZXNwb25zZS5cbiAgICBjb25zdCBjbG9uZWRSZXNwb25zZSA9IGNsb25lUmVzcG9uc2UodGhpc1trU3RhdGVdKVxuXG4gICAgLy8gMy4gUmV0dXJuIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYSBSZXNwb25zZSBvYmplY3QsIGdpdmVuXG4gICAgLy8gY2xvbmVkUmVzcG9uc2UsIHRoaXPigJlzIGhlYWRlcnPigJlzIGd1YXJkLCBhbmQgdGhpc+KAmXMgcmVsZXZhbnQgUmVhbG0uXG4gICAgY29uc3QgY2xvbmVkUmVzcG9uc2VPYmplY3QgPSBuZXcgUmVzcG9uc2UoKVxuICAgIGNsb25lZFJlc3BvbnNlT2JqZWN0W2tTdGF0ZV0gPSBjbG9uZWRSZXNwb25zZVxuICAgIGNsb25lZFJlc3BvbnNlT2JqZWN0W2tSZWFsbV0gPSB0aGlzW2tSZWFsbV1cbiAgICBjbG9uZWRSZXNwb25zZU9iamVjdFtrSGVhZGVyc11ba0hlYWRlcnNMaXN0XSA9IGNsb25lZFJlc3BvbnNlLmhlYWRlcnNMaXN0XG4gICAgY2xvbmVkUmVzcG9uc2VPYmplY3Rba0hlYWRlcnNdW2tHdWFyZF0gPSB0aGlzW2tIZWFkZXJzXVtrR3VhcmRdXG4gICAgY2xvbmVkUmVzcG9uc2VPYmplY3Rba0hlYWRlcnNdW2tSZWFsbV0gPSB0aGlzW2tIZWFkZXJzXVtrUmVhbG1dXG5cbiAgICByZXR1cm4gY2xvbmVkUmVzcG9uc2VPYmplY3RcbiAgfVxufVxuXG5taXhpbkJvZHkoUmVzcG9uc2UpXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFJlc3BvbnNlLnByb3RvdHlwZSwge1xuICB0eXBlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICB1cmw6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHN0YXR1czoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgb2s6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHJlZGlyZWN0ZWQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHN0YXR1c1RleHQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGhlYWRlcnM6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGNsb25lOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBib2R5OiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBib2R5VXNlZDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHtcbiAgICB2YWx1ZTogJ1Jlc3BvbnNlJyxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfVxufSlcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVzcG9uc2UsIHtcbiAganNvbjoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgcmVkaXJlY3Q6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGVycm9yOiBrRW51bWVyYWJsZVByb3BlcnR5XG59KVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1yZXNwb25zZS1jbG9uZVxuZnVuY3Rpb24gY2xvbmVSZXNwb25zZSAocmVzcG9uc2UpIHtcbiAgLy8gVG8gY2xvbmUgYSByZXNwb25zZSByZXNwb25zZSwgcnVuIHRoZXNlIHN0ZXBzOlxuXG4gIC8vIDEuIElmIHJlc3BvbnNlIGlzIGEgZmlsdGVyZWQgcmVzcG9uc2UsIHRoZW4gcmV0dXJuIGEgbmV3IGlkZW50aWNhbFxuICAvLyBmaWx0ZXJlZCByZXNwb25zZSB3aG9zZSBpbnRlcm5hbCByZXNwb25zZSBpcyBhIGNsb25lIG9mIHJlc3BvbnNl4oCZc1xuICAvLyBpbnRlcm5hbCByZXNwb25zZS5cbiAgaWYgKHJlc3BvbnNlLmludGVybmFsUmVzcG9uc2UpIHtcbiAgICByZXR1cm4gZmlsdGVyUmVzcG9uc2UoXG4gICAgICBjbG9uZVJlc3BvbnNlKHJlc3BvbnNlLmludGVybmFsUmVzcG9uc2UpLFxuICAgICAgcmVzcG9uc2UudHlwZVxuICAgIClcbiAgfVxuXG4gIC8vIDIuIExldCBuZXdSZXNwb25zZSBiZSBhIGNvcHkgb2YgcmVzcG9uc2UsIGV4Y2VwdCBmb3IgaXRzIGJvZHkuXG4gIGNvbnN0IG5ld1Jlc3BvbnNlID0gbWFrZVJlc3BvbnNlKHsgLi4ucmVzcG9uc2UsIGJvZHk6IG51bGwgfSlcblxuICAvLyAzLiBJZiByZXNwb25zZeKAmXMgYm9keSBpcyBub24tbnVsbCwgdGhlbiBzZXQgbmV3UmVzcG9uc2XigJlzIGJvZHkgdG8gdGhlXG4gIC8vIHJlc3VsdCBvZiBjbG9uaW5nIHJlc3BvbnNl4oCZcyBib2R5LlxuICBpZiAocmVzcG9uc2UuYm9keSAhPSBudWxsKSB7XG4gICAgbmV3UmVzcG9uc2UuYm9keSA9IGNsb25lQm9keShyZXNwb25zZS5ib2R5KVxuICB9XG5cbiAgLy8gNC4gUmV0dXJuIG5ld1Jlc3BvbnNlLlxuICByZXR1cm4gbmV3UmVzcG9uc2Vcbn1cblxuZnVuY3Rpb24gbWFrZVJlc3BvbnNlIChpbml0KSB7XG4gIHJldHVybiB7XG4gICAgYWJvcnRlZDogZmFsc2UsXG4gICAgcmFuZ2VSZXF1ZXN0ZWQ6IGZhbHNlLFxuICAgIHRpbWluZ0FsbG93UGFzc2VkOiBmYWxzZSxcbiAgICByZXF1ZXN0SW5jbHVkZXNDcmVkZW50aWFsczogZmFsc2UsXG4gICAgdHlwZTogJ2RlZmF1bHQnLFxuICAgIHN0YXR1czogMjAwLFxuICAgIHRpbWluZ0luZm86IG51bGwsXG4gICAgY2FjaGVTdGF0ZTogJycsXG4gICAgc3RhdHVzVGV4dDogJycsXG4gICAgLi4uaW5pdCxcbiAgICBoZWFkZXJzTGlzdDogaW5pdC5oZWFkZXJzTGlzdFxuICAgICAgPyBuZXcgSGVhZGVyc0xpc3QoaW5pdC5oZWFkZXJzTGlzdClcbiAgICAgIDogbmV3IEhlYWRlcnNMaXN0KCksXG4gICAgdXJsTGlzdDogaW5pdC51cmxMaXN0ID8gWy4uLmluaXQudXJsTGlzdF0gOiBbXVxuICB9XG59XG5cbmZ1bmN0aW9uIG1ha2VOZXR3b3JrRXJyb3IgKHJlYXNvbikge1xuICBjb25zdCBpc0Vycm9yID0gaXNFcnJvckxpa2UocmVhc29uKVxuICByZXR1cm4gbWFrZVJlc3BvbnNlKHtcbiAgICB0eXBlOiAnZXJyb3InLFxuICAgIHN0YXR1czogMCxcbiAgICBlcnJvcjogaXNFcnJvclxuICAgICAgPyByZWFzb25cbiAgICAgIDogbmV3IEVycm9yKHJlYXNvbiA/IFN0cmluZyhyZWFzb24pIDogcmVhc29uKSxcbiAgICBhYm9ydGVkOiByZWFzb24gJiYgcmVhc29uLm5hbWUgPT09ICdBYm9ydEVycm9yJ1xuICB9KVxufVxuXG5mdW5jdGlvbiBtYWtlRmlsdGVyZWRSZXNwb25zZSAocmVzcG9uc2UsIHN0YXRlKSB7XG4gIHN0YXRlID0ge1xuICAgIGludGVybmFsUmVzcG9uc2U6IHJlc3BvbnNlLFxuICAgIC4uLnN0YXRlXG4gIH1cblxuICByZXR1cm4gbmV3IFByb3h5KHJlc3BvbnNlLCB7XG4gICAgZ2V0ICh0YXJnZXQsIHApIHtcbiAgICAgIHJldHVybiBwIGluIHN0YXRlID8gc3RhdGVbcF0gOiB0YXJnZXRbcF1cbiAgICB9LFxuICAgIHNldCAodGFyZ2V0LCBwLCB2YWx1ZSkge1xuICAgICAgYXNzZXJ0KCEocCBpbiBzdGF0ZSkpXG4gICAgICB0YXJnZXRbcF0gPSB2YWx1ZVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH0pXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWZpbHRlcmVkLXJlc3BvbnNlXG5mdW5jdGlvbiBmaWx0ZXJSZXNwb25zZSAocmVzcG9uc2UsIHR5cGUpIHtcbiAgLy8gU2V0IHJlc3BvbnNlIHRvIHRoZSBmb2xsb3dpbmcgZmlsdGVyZWQgcmVzcG9uc2Ugd2l0aCByZXNwb25zZSBhcyBpdHNcbiAgLy8gaW50ZXJuYWwgcmVzcG9uc2UsIGRlcGVuZGluZyBvbiByZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZzpcbiAgaWYgKHR5cGUgPT09ICdiYXNpYycpIHtcbiAgICAvLyBBIGJhc2ljIGZpbHRlcmVkIHJlc3BvbnNlIGlzIGEgZmlsdGVyZWQgcmVzcG9uc2Ugd2hvc2UgdHlwZSBpcyBcImJhc2ljXCJcbiAgICAvLyBhbmQgaGVhZGVyIGxpc3QgZXhjbHVkZXMgYW55IGhlYWRlcnMgaW4gaW50ZXJuYWwgcmVzcG9uc2XigJlzIGhlYWRlciBsaXN0XG4gICAgLy8gd2hvc2UgbmFtZSBpcyBhIGZvcmJpZGRlbiByZXNwb25zZS1oZWFkZXIgbmFtZS5cblxuICAgIC8vIE5vdGU6IHVuZGljaSBkb2VzIG5vdCBpbXBsZW1lbnQgZm9yYmlkZGVuIHJlc3BvbnNlLWhlYWRlciBuYW1lc1xuICAgIHJldHVybiBtYWtlRmlsdGVyZWRSZXNwb25zZShyZXNwb25zZSwge1xuICAgICAgdHlwZTogJ2Jhc2ljJyxcbiAgICAgIGhlYWRlcnNMaXN0OiByZXNwb25zZS5oZWFkZXJzTGlzdFxuICAgIH0pXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2NvcnMnKSB7XG4gICAgLy8gQSBDT1JTIGZpbHRlcmVkIHJlc3BvbnNlIGlzIGEgZmlsdGVyZWQgcmVzcG9uc2Ugd2hvc2UgdHlwZSBpcyBcImNvcnNcIlxuICAgIC8vIGFuZCBoZWFkZXIgbGlzdCBleGNsdWRlcyBhbnkgaGVhZGVycyBpbiBpbnRlcm5hbCByZXNwb25zZeKAmXMgaGVhZGVyXG4gICAgLy8gbGlzdCB3aG9zZSBuYW1lIGlzIG5vdCBhIENPUlMtc2FmZWxpc3RlZCByZXNwb25zZS1oZWFkZXIgbmFtZSwgZ2l2ZW5cbiAgICAvLyBpbnRlcm5hbCByZXNwb25zZeKAmXMgQ09SUy1leHBvc2VkIGhlYWRlci1uYW1lIGxpc3QuXG5cbiAgICAvLyBOb3RlOiB1bmRpY2kgZG9lcyBub3QgaW1wbGVtZW50IENPUlMtc2FmZWxpc3RlZCByZXNwb25zZS1oZWFkZXIgbmFtZXNcbiAgICByZXR1cm4gbWFrZUZpbHRlcmVkUmVzcG9uc2UocmVzcG9uc2UsIHtcbiAgICAgIHR5cGU6ICdjb3JzJyxcbiAgICAgIGhlYWRlcnNMaXN0OiByZXNwb25zZS5oZWFkZXJzTGlzdFxuICAgIH0pXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29wYXF1ZScpIHtcbiAgICAvLyBBbiBvcGFxdWUgZmlsdGVyZWQgcmVzcG9uc2UgaXMgYSBmaWx0ZXJlZCByZXNwb25zZSB3aG9zZSB0eXBlIGlzXG4gICAgLy8gXCJvcGFxdWVcIiwgVVJMIGxpc3QgaXMgdGhlIGVtcHR5IGxpc3QsIHN0YXR1cyBpcyAwLCBzdGF0dXMgbWVzc2FnZVxuICAgIC8vIGlzIHRoZSBlbXB0eSBieXRlIHNlcXVlbmNlLCBoZWFkZXIgbGlzdCBpcyBlbXB0eSwgYW5kIGJvZHkgaXMgbnVsbC5cblxuICAgIHJldHVybiBtYWtlRmlsdGVyZWRSZXNwb25zZShyZXNwb25zZSwge1xuICAgICAgdHlwZTogJ29wYXF1ZScsXG4gICAgICB1cmxMaXN0OiBPYmplY3QuZnJlZXplKFtdKSxcbiAgICAgIHN0YXR1czogMCxcbiAgICAgIHN0YXR1c1RleHQ6ICcnLFxuICAgICAgYm9keTogbnVsbFxuICAgIH0pXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29wYXF1ZXJlZGlyZWN0Jykge1xuICAgIC8vIEFuIG9wYXF1ZS1yZWRpcmVjdCBmaWx0ZXJlZCByZXNwb25zZSBpcyBhIGZpbHRlcmVkIHJlc3BvbnNlIHdob3NlIHR5cGVcbiAgICAvLyBpcyBcIm9wYXF1ZXJlZGlyZWN0XCIsIHN0YXR1cyBpcyAwLCBzdGF0dXMgbWVzc2FnZSBpcyB0aGUgZW1wdHkgYnl0ZVxuICAgIC8vIHNlcXVlbmNlLCBoZWFkZXIgbGlzdCBpcyBlbXB0eSwgYW5kIGJvZHkgaXMgbnVsbC5cblxuICAgIHJldHVybiBtYWtlRmlsdGVyZWRSZXNwb25zZShyZXNwb25zZSwge1xuICAgICAgdHlwZTogJ29wYXF1ZXJlZGlyZWN0JyxcbiAgICAgIHN0YXR1czogMCxcbiAgICAgIHN0YXR1c1RleHQ6ICcnLFxuICAgICAgaGVhZGVyc0xpc3Q6IFtdLFxuICAgICAgYm9keTogbnVsbFxuICAgIH0pXG4gIH0gZWxzZSB7XG4gICAgYXNzZXJ0KGZhbHNlKVxuICB9XG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNhcHByb3ByaWF0ZS1uZXR3b3JrLWVycm9yXG5mdW5jdGlvbiBtYWtlQXBwcm9wcmlhdGVOZXR3b3JrRXJyb3IgKGZldGNoUGFyYW1zLCBlcnIgPSBudWxsKSB7XG4gIC8vIDEuIEFzc2VydDogZmV0Y2hQYXJhbXMgaXMgY2FuY2VsZWQuXG4gIGFzc2VydChpc0NhbmNlbGxlZChmZXRjaFBhcmFtcykpXG5cbiAgLy8gMi4gUmV0dXJuIGFuIGFib3J0ZWQgbmV0d29yayBlcnJvciBpZiBmZXRjaFBhcmFtcyBpcyBhYm9ydGVkO1xuICAvLyBvdGhlcndpc2UgcmV0dXJuIGEgbmV0d29yayBlcnJvci5cbiAgcmV0dXJuIGlzQWJvcnRlZChmZXRjaFBhcmFtcylcbiAgICA/IG1ha2VOZXR3b3JrRXJyb3IoT2JqZWN0LmFzc2lnbihuZXcgRE9NRXhjZXB0aW9uKCdUaGUgb3BlcmF0aW9uIHdhcyBhYm9ydGVkLicsICdBYm9ydEVycm9yJyksIHsgY2F1c2U6IGVyciB9KSlcbiAgICA6IG1ha2VOZXR3b3JrRXJyb3IoT2JqZWN0LmFzc2lnbihuZXcgRE9NRXhjZXB0aW9uKCdSZXF1ZXN0IHdhcyBjYW5jZWxsZWQuJyksIHsgY2F1c2U6IGVyciB9KSlcbn1cblxuLy8gaHR0cHM6Ly93aGF0cHIub3JnL2ZldGNoLzEzOTIuaHRtbCNpbml0aWFsaXplLWEtcmVzcG9uc2VcbmZ1bmN0aW9uIGluaXRpYWxpemVSZXNwb25zZSAocmVzcG9uc2UsIGluaXQsIGJvZHkpIHtcbiAgLy8gMS4gSWYgaW5pdFtcInN0YXR1c1wiXSBpcyBub3QgaW4gdGhlIHJhbmdlIDIwMCB0byA1OTksIGluY2x1c2l2ZSwgdGhlblxuICAvLyAgICB0aHJvdyBhIFJhbmdlRXJyb3IuXG4gIGlmIChpbml0LnN0YXR1cyAhPT0gbnVsbCAmJiAoaW5pdC5zdGF0dXMgPCAyMDAgfHwgaW5pdC5zdGF0dXMgPiA1OTkpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2luaXRbXCJzdGF0dXNcIl0gbXVzdCBiZSBpbiB0aGUgcmFuZ2Ugb2YgMjAwIHRvIDU5OSwgaW5jbHVzaXZlLicpXG4gIH1cblxuICAvLyAyLiBJZiBpbml0W1wic3RhdHVzVGV4dFwiXSBkb2VzIG5vdCBtYXRjaCB0aGUgcmVhc29uLXBocmFzZSB0b2tlbiBwcm9kdWN0aW9uLFxuICAvLyAgICB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICBpZiAoJ3N0YXR1c1RleHQnIGluIGluaXQgJiYgaW5pdC5zdGF0dXNUZXh0ICE9IG51bGwpIHtcbiAgICAvLyBTZWUsIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMS4yOlxuICAgIC8vICAgcmVhc29uLXBocmFzZSAgPSAqKCBIVEFCIC8gU1AgLyBWQ0hBUiAvIG9icy10ZXh0IClcbiAgICBpZiAoIWlzVmFsaWRSZWFzb25QaHJhc2UoU3RyaW5nKGluaXQuc3RhdHVzVGV4dCkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHN0YXR1c1RleHQnKVxuICAgIH1cbiAgfVxuXG4gIC8vIDMuIFNldCByZXNwb25zZeKAmXMgcmVzcG9uc2XigJlzIHN0YXR1cyB0byBpbml0W1wic3RhdHVzXCJdLlxuICBpZiAoJ3N0YXR1cycgaW4gaW5pdCAmJiBpbml0LnN0YXR1cyAhPSBudWxsKSB7XG4gICAgcmVzcG9uc2Vba1N0YXRlXS5zdGF0dXMgPSBpbml0LnN0YXR1c1xuICB9XG5cbiAgLy8gNC4gU2V0IHJlc3BvbnNl4oCZcyByZXNwb25zZeKAmXMgc3RhdHVzIG1lc3NhZ2UgdG8gaW5pdFtcInN0YXR1c1RleHRcIl0uXG4gIGlmICgnc3RhdHVzVGV4dCcgaW4gaW5pdCAmJiBpbml0LnN0YXR1c1RleHQgIT0gbnVsbCkge1xuICAgIHJlc3BvbnNlW2tTdGF0ZV0uc3RhdHVzVGV4dCA9IGluaXQuc3RhdHVzVGV4dFxuICB9XG5cbiAgLy8gNS4gSWYgaW5pdFtcImhlYWRlcnNcIl0gZXhpc3RzLCB0aGVuIGZpbGwgcmVzcG9uc2XigJlzIGhlYWRlcnMgd2l0aCBpbml0W1wiaGVhZGVyc1wiXS5cbiAgaWYgKCdoZWFkZXJzJyBpbiBpbml0ICYmIGluaXQuaGVhZGVycyAhPSBudWxsKSB7XG4gICAgZmlsbChyZXNwb25zZVtrSGVhZGVyc10sIGluaXQuaGVhZGVycylcbiAgfVxuXG4gIC8vIDYuIElmIGJvZHkgd2FzIGdpdmVuLCB0aGVuOlxuICBpZiAoYm9keSkge1xuICAgIC8vIDEuIElmIHJlc3BvbnNlJ3Mgc3RhdHVzIGlzIGEgbnVsbCBib2R5IHN0YXR1cywgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAobnVsbEJvZHlTdGF0dXMuaW5jbHVkZXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6ICdSZXNwb25zZSBjb25zdHJ1Y3RvcicsXG4gICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cyBjb2RlICcgKyByZXNwb25zZS5zdGF0dXNcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gMi4gU2V0IHJlc3BvbnNlJ3MgYm9keSB0byBib2R5J3MgYm9keS5cbiAgICByZXNwb25zZVtrU3RhdGVdLmJvZHkgPSBib2R5LmJvZHlcblxuICAgIC8vIDMuIElmIGJvZHkncyB0eXBlIGlzIG5vbi1udWxsIGFuZCByZXNwb25zZSdzIGhlYWRlciBsaXN0IGRvZXMgbm90IGNvbnRhaW5cbiAgICAvLyAgICBgQ29udGVudC1UeXBlYCwgdGhlbiBhcHBlbmQgKGBDb250ZW50LVR5cGVgLCBib2R5J3MgdHlwZSkgdG8gcmVzcG9uc2UncyBoZWFkZXIgbGlzdC5cbiAgICBpZiAoYm9keS50eXBlICE9IG51bGwgJiYgIXJlc3BvbnNlW2tTdGF0ZV0uaGVhZGVyc0xpc3QuY29udGFpbnMoJ0NvbnRlbnQtVHlwZScpKSB7XG4gICAgICByZXNwb25zZVtrU3RhdGVdLmhlYWRlcnNMaXN0LmFwcGVuZCgnY29udGVudC10eXBlJywgYm9keS50eXBlKVxuICAgIH1cbiAgfVxufVxuXG53ZWJpZGwuY29udmVydGVycy5SZWFkYWJsZVN0cmVhbSA9IHdlYmlkbC5pbnRlcmZhY2VDb252ZXJ0ZXIoXG4gIFJlYWRhYmxlU3RyZWFtXG4pXG5cbndlYmlkbC5jb252ZXJ0ZXJzLkZvcm1EYXRhID0gd2ViaWRsLmludGVyZmFjZUNvbnZlcnRlcihcbiAgRm9ybURhdGFcbilcblxud2ViaWRsLmNvbnZlcnRlcnMuVVJMU2VhcmNoUGFyYW1zID0gd2ViaWRsLmludGVyZmFjZUNvbnZlcnRlcihcbiAgVVJMU2VhcmNoUGFyYW1zXG4pXG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyN0eXBlZGVmZGVmLXhtbGh0dHByZXF1ZXN0Ym9keWluaXRcbndlYmlkbC5jb252ZXJ0ZXJzLlhNTEh0dHBSZXF1ZXN0Qm9keUluaXQgPSBmdW5jdGlvbiAoVikge1xuICBpZiAodHlwZW9mIFYgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhWKVxuICB9XG5cbiAgaWYgKGlzQmxvYkxpa2UoVikpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuQmxvYihWLCB7IHN0cmljdDogZmFsc2UgfSlcbiAgfVxuXG4gIGlmICh0eXBlcy5pc0FycmF5QnVmZmVyKFYpIHx8IHR5cGVzLmlzVHlwZWRBcnJheShWKSB8fCB0eXBlcy5pc0RhdGFWaWV3KFYpKSB7XG4gICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLkJ1ZmZlclNvdXJjZShWKVxuICB9XG5cbiAgaWYgKHV0aWwuaXNGb3JtRGF0YUxpa2UoVikpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuRm9ybURhdGEoViwgeyBzdHJpY3Q6IGZhbHNlIH0pXG4gIH1cblxuICBpZiAoViBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcykge1xuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5VUkxTZWFyY2hQYXJhbXMoVilcbiAgfVxuXG4gIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcoVilcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2JvZHlpbml0XG53ZWJpZGwuY29udmVydGVycy5Cb2R5SW5pdCA9IGZ1bmN0aW9uIChWKSB7XG4gIGlmIChWIGluc3RhbmNlb2YgUmVhZGFibGVTdHJlYW0pIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuUmVhZGFibGVTdHJlYW0oVilcbiAgfVxuXG4gIC8vIE5vdGU6IHRoZSBzcGVjIGRvZXNuJ3QgaW5jbHVkZSBhc3luYyBpdGVyYWJsZXMsXG4gIC8vIHRoaXMgaXMgYW4gdW5kaWNpIGV4dGVuc2lvbi5cbiAgaWYgKFY/LltTeW1ib2wuYXN5bmNJdGVyYXRvcl0pIHtcbiAgICByZXR1cm4gVlxuICB9XG5cbiAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLlhNTEh0dHBSZXF1ZXN0Qm9keUluaXQoVilcbn1cblxud2ViaWRsLmNvbnZlcnRlcnMuUmVzcG9uc2VJbml0ID0gd2ViaWRsLmRpY3Rpb25hcnlDb252ZXJ0ZXIoW1xuICB7XG4gICAga2V5OiAnc3RhdHVzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzWyd1bnNpZ25lZCBzaG9ydCddLFxuICAgIGRlZmF1bHRWYWx1ZTogMjAwXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzdGF0dXNUZXh0JyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiAnJ1xuICB9LFxuICB7XG4gICAga2V5OiAnaGVhZGVycycsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5IZWFkZXJzSW5pdFxuICB9XG5dKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWFrZU5ldHdvcmtFcnJvcixcbiAgbWFrZVJlc3BvbnNlLFxuICBtYWtlQXBwcm9wcmlhdGVOZXR3b3JrRXJyb3IsXG4gIGZpbHRlclJlc3BvbnNlLFxuICBSZXNwb25zZSxcbiAgY2xvbmVSZXNwb25zZVxufVxuIiwiLyogZ2xvYmFscyBBYm9ydENvbnRyb2xsZXIgKi9cblxuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgZXh0cmFjdEJvZHksIG1peGluQm9keSwgY2xvbmVCb2R5IH0gPSByZXF1aXJlKCcuL2JvZHknKVxuY29uc3QgeyBIZWFkZXJzLCBmaWxsOiBmaWxsSGVhZGVycywgSGVhZGVyc0xpc3QgfSA9IHJlcXVpcmUoJy4vaGVhZGVycycpXG5jb25zdCB7IEZpbmFsaXphdGlvblJlZ2lzdHJ5IH0gPSByZXF1aXJlKCcuLi9jb21wYXQvZGlzcGF0Y2hlci13ZWFrcmVmJykoKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5jb25zdCB7XG4gIGlzVmFsaWRIVFRQVG9rZW4sXG4gIHNhbWVPcmlnaW4sXG4gIG5vcm1hbGl6ZU1ldGhvZCxcbiAgbWFrZVBvbGljeUNvbnRhaW5lcixcbiAgbm9ybWFsaXplTWV0aG9kUmVjb3JkXG59ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHtcbiAgZm9yYmlkZGVuTWV0aG9kc1NldCxcbiAgY29yc1NhZmVMaXN0ZWRNZXRob2RzU2V0LFxuICByZWZlcnJlclBvbGljeSxcbiAgcmVxdWVzdFJlZGlyZWN0LFxuICByZXF1ZXN0TW9kZSxcbiAgcmVxdWVzdENyZWRlbnRpYWxzLFxuICByZXF1ZXN0Q2FjaGUsXG4gIHJlcXVlc3REdXBsZXhcbn0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5jb25zdCB7IGtFbnVtZXJhYmxlUHJvcGVydHkgfSA9IHV0aWxcbmNvbnN0IHsga0hlYWRlcnMsIGtTaWduYWwsIGtTdGF0ZSwga0d1YXJkLCBrUmVhbG0gfSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IHdlYmlkbCB9ID0gcmVxdWlyZSgnLi93ZWJpZGwnKVxuY29uc3QgeyBnZXRHbG9iYWxPcmlnaW4gfSA9IHJlcXVpcmUoJy4vZ2xvYmFsJylcbmNvbnN0IHsgVVJMU2VyaWFsaXplciB9ID0gcmVxdWlyZSgnLi9kYXRhVVJMJylcbmNvbnN0IHsga0hlYWRlcnNMaXN0LCBrQ29uc3RydWN0IH0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsgZ2V0TWF4TGlzdGVuZXJzLCBzZXRNYXhMaXN0ZW5lcnMsIGdldEV2ZW50TGlzdGVuZXJzLCBkZWZhdWx0TWF4TGlzdGVuZXJzIH0gPSByZXF1aXJlKCdldmVudHMnKVxuXG5sZXQgVHJhbnNmb3JtU3RyZWFtID0gZ2xvYmFsVGhpcy5UcmFuc2Zvcm1TdHJlYW1cblxuY29uc3Qga0Fib3J0Q29udHJvbGxlciA9IFN5bWJvbCgnYWJvcnRDb250cm9sbGVyJylcblxuY29uc3QgcmVxdWVzdEZpbmFsaXplciA9IG5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeSgoeyBzaWduYWwsIGFib3J0IH0pID0+IHtcbiAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnQpXG59KVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jcmVxdWVzdC1jbGFzc1xuY2xhc3MgUmVxdWVzdCB7XG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkb20tcmVxdWVzdFxuICBjb25zdHJ1Y3RvciAoaW5wdXQsIGluaXQgPSB7fSkge1xuICAgIGlmIChpbnB1dCA9PT0ga0NvbnN0cnVjdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ1JlcXVlc3QgY29uc3RydWN0b3InIH0pXG5cbiAgICBpbnB1dCA9IHdlYmlkbC5jb252ZXJ0ZXJzLlJlcXVlc3RJbmZvKGlucHV0KVxuICAgIGluaXQgPSB3ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5pdChpbml0KVxuXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvd2ViYXBwYXBpcy5odG1sI2Vudmlyb25tZW50LXNldHRpbmdzLW9iamVjdFxuICAgIHRoaXNba1JlYWxtXSA9IHtcbiAgICAgIHNldHRpbmdzT2JqZWN0OiB7XG4gICAgICAgIGJhc2VVcmw6IGdldEdsb2JhbE9yaWdpbigpLFxuICAgICAgICBnZXQgb3JpZ2luICgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlVXJsPy5vcmlnaW5cbiAgICAgICAgfSxcbiAgICAgICAgcG9saWN5Q29udGFpbmVyOiBtYWtlUG9saWN5Q29udGFpbmVyKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAxLiBMZXQgcmVxdWVzdCBiZSBudWxsLlxuICAgIGxldCByZXF1ZXN0ID0gbnVsbFxuXG4gICAgLy8gMi4gTGV0IGZhbGxiYWNrTW9kZSBiZSBudWxsLlxuICAgIGxldCBmYWxsYmFja01vZGUgPSBudWxsXG5cbiAgICAvLyAzLiBMZXQgYmFzZVVSTCBiZSB0aGlz4oCZcyByZWxldmFudCBzZXR0aW5ncyBvYmplY3TigJlzIEFQSSBiYXNlIFVSTC5cbiAgICBjb25zdCBiYXNlVXJsID0gdGhpc1trUmVhbG1dLnNldHRpbmdzT2JqZWN0LmJhc2VVcmxcblxuICAgIC8vIDQuIExldCBzaWduYWwgYmUgbnVsbC5cbiAgICBsZXQgc2lnbmFsID0gbnVsbFxuXG4gICAgLy8gNS4gSWYgaW5wdXQgaXMgYSBzdHJpbmcsIHRoZW46XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIDEuIExldCBwYXJzZWRVUkwgYmUgdGhlIHJlc3VsdCBvZiBwYXJzaW5nIGlucHV0IHdpdGggYmFzZVVSTC5cbiAgICAgIC8vIDIuIElmIHBhcnNlZFVSTCBpcyBmYWlsdXJlLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgICAgbGV0IHBhcnNlZFVSTFxuICAgICAgdHJ5IHtcbiAgICAgICAgcGFyc2VkVVJMID0gbmV3IFVSTChpbnB1dCwgYmFzZVVybClcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGYWlsZWQgdG8gcGFyc2UgVVJMIGZyb20gJyArIGlucHV0LCB7IGNhdXNlOiBlcnIgfSlcbiAgICAgIH1cblxuICAgICAgLy8gMy4gSWYgcGFyc2VkVVJMIGluY2x1ZGVzIGNyZWRlbnRpYWxzLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgICAgaWYgKHBhcnNlZFVSTC51c2VybmFtZSB8fCBwYXJzZWRVUkwucGFzc3dvcmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAnUmVxdWVzdCBjYW5ub3QgYmUgY29uc3RydWN0ZWQgZnJvbSBhIFVSTCB0aGF0IGluY2x1ZGVzIGNyZWRlbnRpYWxzOiAnICtcbiAgICAgICAgICAgIGlucHV0XG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gNC4gU2V0IHJlcXVlc3QgdG8gYSBuZXcgcmVxdWVzdCB3aG9zZSBVUkwgaXMgcGFyc2VkVVJMLlxuICAgICAgcmVxdWVzdCA9IG1ha2VSZXF1ZXN0KHsgdXJsTGlzdDogW3BhcnNlZFVSTF0gfSlcblxuICAgICAgLy8gNS4gU2V0IGZhbGxiYWNrTW9kZSB0byBcImNvcnNcIi5cbiAgICAgIGZhbGxiYWNrTW9kZSA9ICdjb3JzJ1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyA2LiBPdGhlcndpc2U6XG5cbiAgICAgIC8vIDcuIEFzc2VydDogaW5wdXQgaXMgYSBSZXF1ZXN0IG9iamVjdC5cbiAgICAgIGFzc2VydChpbnB1dCBpbnN0YW5jZW9mIFJlcXVlc3QpXG5cbiAgICAgIC8vIDguIFNldCByZXF1ZXN0IHRvIGlucHV04oCZcyByZXF1ZXN0LlxuICAgICAgcmVxdWVzdCA9IGlucHV0W2tTdGF0ZV1cblxuICAgICAgLy8gOS4gU2V0IHNpZ25hbCB0byBpbnB1dOKAmXMgc2lnbmFsLlxuICAgICAgc2lnbmFsID0gaW5wdXRba1NpZ25hbF1cbiAgICB9XG5cbiAgICAvLyA3LiBMZXQgb3JpZ2luIGJlIHRoaXPigJlzIHJlbGV2YW50IHNldHRpbmdzIG9iamVjdOKAmXMgb3JpZ2luLlxuICAgIGNvbnN0IG9yaWdpbiA9IHRoaXNba1JlYWxtXS5zZXR0aW5nc09iamVjdC5vcmlnaW5cblxuICAgIC8vIDguIExldCB3aW5kb3cgYmUgXCJjbGllbnRcIi5cbiAgICBsZXQgd2luZG93ID0gJ2NsaWVudCdcblxuICAgIC8vIDkuIElmIHJlcXVlc3TigJlzIHdpbmRvdyBpcyBhbiBlbnZpcm9ubWVudCBzZXR0aW5ncyBvYmplY3QgYW5kIGl0cyBvcmlnaW5cbiAgICAvLyBpcyBzYW1lIG9yaWdpbiB3aXRoIG9yaWdpbiwgdGhlbiBzZXQgd2luZG93IHRvIHJlcXVlc3TigJlzIHdpbmRvdy5cbiAgICBpZiAoXG4gICAgICByZXF1ZXN0LndpbmRvdz8uY29uc3RydWN0b3I/Lm5hbWUgPT09ICdFbnZpcm9ubWVudFNldHRpbmdzT2JqZWN0JyAmJlxuICAgICAgc2FtZU9yaWdpbihyZXF1ZXN0LndpbmRvdywgb3JpZ2luKVxuICAgICkge1xuICAgICAgd2luZG93ID0gcmVxdWVzdC53aW5kb3dcbiAgICB9XG5cbiAgICAvLyAxMC4gSWYgaW5pdFtcIndpbmRvd1wiXSBleGlzdHMgYW5kIGlzIG5vbi1udWxsLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmIChpbml0LndpbmRvdyAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAnd2luZG93JyBvcHRpb24gJyR7d2luZG93fScgbXVzdCBiZSBudWxsYClcbiAgICB9XG5cbiAgICAvLyAxMS4gSWYgaW5pdFtcIndpbmRvd1wiXSBleGlzdHMsIHRoZW4gc2V0IHdpbmRvdyB0byBcIm5vLXdpbmRvd1wiLlxuICAgIGlmICgnd2luZG93JyBpbiBpbml0KSB7XG4gICAgICB3aW5kb3cgPSAnbm8td2luZG93J1xuICAgIH1cblxuICAgIC8vIDEyLiBTZXQgcmVxdWVzdCB0byBhIG5ldyByZXF1ZXN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgIHJlcXVlc3QgPSBtYWtlUmVxdWVzdCh7XG4gICAgICAvLyBVUkwgcmVxdWVzdOKAmXMgVVJMLlxuICAgICAgLy8gdW5kaWNpIGltcGxlbWVudGF0aW9uIG5vdGU6IHRoaXMgaXMgc2V0IGFzIHRoZSBmaXJzdCBpdGVtIGluIHJlcXVlc3QncyB1cmxMaXN0IGluIG1ha2VSZXF1ZXN0XG4gICAgICAvLyBtZXRob2QgcmVxdWVzdOKAmXMgbWV0aG9kLlxuICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgIC8vIGhlYWRlciBsaXN0IEEgY29weSBvZiByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgICAgIC8vIHVuZGljaSBpbXBsZW1lbnRhdGlvbiBub3RlOiBoZWFkZXJzTGlzdCBpcyBjbG9uZWQgaW4gbWFrZVJlcXVlc3RcbiAgICAgIGhlYWRlcnNMaXN0OiByZXF1ZXN0LmhlYWRlcnNMaXN0LFxuICAgICAgLy8gdW5zYWZlLXJlcXVlc3QgZmxhZyBTZXQuXG4gICAgICB1bnNhZmVSZXF1ZXN0OiByZXF1ZXN0LnVuc2FmZVJlcXVlc3QsXG4gICAgICAvLyBjbGllbnQgVGhpc+KAmXMgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN0LlxuICAgICAgY2xpZW50OiB0aGlzW2tSZWFsbV0uc2V0dGluZ3NPYmplY3QsXG4gICAgICAvLyB3aW5kb3cgd2luZG93LlxuICAgICAgd2luZG93LFxuICAgICAgLy8gcHJpb3JpdHkgcmVxdWVzdOKAmXMgcHJpb3JpdHkuXG4gICAgICBwcmlvcml0eTogcmVxdWVzdC5wcmlvcml0eSxcbiAgICAgIC8vIG9yaWdpbiByZXF1ZXN04oCZcyBvcmlnaW4uIFRoZSBwcm9wYWdhdGlvbiBvZiB0aGUgb3JpZ2luIGlzIG9ubHkgc2lnbmlmaWNhbnQgZm9yIG5hdmlnYXRpb24gcmVxdWVzdHNcbiAgICAgIC8vIGJlaW5nIGhhbmRsZWQgYnkgYSBzZXJ2aWNlIHdvcmtlci4gSW4gdGhpcyBzY2VuYXJpbyBhIHJlcXVlc3QgY2FuIGhhdmUgYW4gb3JpZ2luIHRoYXQgaXMgZGlmZmVyZW50XG4gICAgICAvLyBmcm9tIHRoZSBjdXJyZW50IGNsaWVudC5cbiAgICAgIG9yaWdpbjogcmVxdWVzdC5vcmlnaW4sXG4gICAgICAvLyByZWZlcnJlciByZXF1ZXN04oCZcyByZWZlcnJlci5cbiAgICAgIHJlZmVycmVyOiByZXF1ZXN0LnJlZmVycmVyLFxuICAgICAgLy8gcmVmZXJyZXIgcG9saWN5IHJlcXVlc3TigJlzIHJlZmVycmVyIHBvbGljeS5cbiAgICAgIHJlZmVycmVyUG9saWN5OiByZXF1ZXN0LnJlZmVycmVyUG9saWN5LFxuICAgICAgLy8gbW9kZSByZXF1ZXN04oCZcyBtb2RlLlxuICAgICAgbW9kZTogcmVxdWVzdC5tb2RlLFxuICAgICAgLy8gY3JlZGVudGlhbHMgbW9kZSByZXF1ZXN04oCZcyBjcmVkZW50aWFscyBtb2RlLlxuICAgICAgY3JlZGVudGlhbHM6IHJlcXVlc3QuY3JlZGVudGlhbHMsXG4gICAgICAvLyBjYWNoZSBtb2RlIHJlcXVlc3TigJlzIGNhY2hlIG1vZGUuXG4gICAgICBjYWNoZTogcmVxdWVzdC5jYWNoZSxcbiAgICAgIC8vIHJlZGlyZWN0IG1vZGUgcmVxdWVzdOKAmXMgcmVkaXJlY3QgbW9kZS5cbiAgICAgIHJlZGlyZWN0OiByZXF1ZXN0LnJlZGlyZWN0LFxuICAgICAgLy8gaW50ZWdyaXR5IG1ldGFkYXRhIHJlcXVlc3TigJlzIGludGVncml0eSBtZXRhZGF0YS5cbiAgICAgIGludGVncml0eTogcmVxdWVzdC5pbnRlZ3JpdHksXG4gICAgICAvLyBrZWVwYWxpdmUgcmVxdWVzdOKAmXMga2VlcGFsaXZlLlxuICAgICAga2VlcGFsaXZlOiByZXF1ZXN0LmtlZXBhbGl2ZSxcbiAgICAgIC8vIHJlbG9hZC1uYXZpZ2F0aW9uIGZsYWcgcmVxdWVzdOKAmXMgcmVsb2FkLW5hdmlnYXRpb24gZmxhZy5cbiAgICAgIHJlbG9hZE5hdmlnYXRpb246IHJlcXVlc3QucmVsb2FkTmF2aWdhdGlvbixcbiAgICAgIC8vIGhpc3RvcnktbmF2aWdhdGlvbiBmbGFnIHJlcXVlc3TigJlzIGhpc3RvcnktbmF2aWdhdGlvbiBmbGFnLlxuICAgICAgaGlzdG9yeU5hdmlnYXRpb246IHJlcXVlc3QuaGlzdG9yeU5hdmlnYXRpb24sXG4gICAgICAvLyBVUkwgbGlzdCBBIGNsb25lIG9mIHJlcXVlc3TigJlzIFVSTCBsaXN0LlxuICAgICAgdXJsTGlzdDogWy4uLnJlcXVlc3QudXJsTGlzdF1cbiAgICB9KVxuXG4gICAgY29uc3QgaW5pdEhhc0tleSA9IE9iamVjdC5rZXlzKGluaXQpLmxlbmd0aCAhPT0gMFxuXG4gICAgLy8gMTMuIElmIGluaXQgaXMgbm90IGVtcHR5LCB0aGVuOlxuICAgIGlmIChpbml0SGFzS2V5KSB7XG4gICAgICAvLyAxLiBJZiByZXF1ZXN04oCZcyBtb2RlIGlzIFwibmF2aWdhdGVcIiwgdGhlbiBzZXQgaXQgdG8gXCJzYW1lLW9yaWdpblwiLlxuICAgICAgaWYgKHJlcXVlc3QubW9kZSA9PT0gJ25hdmlnYXRlJykge1xuICAgICAgICByZXF1ZXN0Lm1vZGUgPSAnc2FtZS1vcmlnaW4nXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIFVuc2V0IHJlcXVlc3TigJlzIHJlbG9hZC1uYXZpZ2F0aW9uIGZsYWcuXG4gICAgICByZXF1ZXN0LnJlbG9hZE5hdmlnYXRpb24gPSBmYWxzZVxuXG4gICAgICAvLyAzLiBVbnNldCByZXF1ZXN04oCZcyBoaXN0b3J5LW5hdmlnYXRpb24gZmxhZy5cbiAgICAgIHJlcXVlc3QuaGlzdG9yeU5hdmlnYXRpb24gPSBmYWxzZVxuXG4gICAgICAvLyA0LiBTZXQgcmVxdWVzdOKAmXMgb3JpZ2luIHRvIFwiY2xpZW50XCIuXG4gICAgICByZXF1ZXN0Lm9yaWdpbiA9ICdjbGllbnQnXG5cbiAgICAgIC8vIDUuIFNldCByZXF1ZXN04oCZcyByZWZlcnJlciB0byBcImNsaWVudFwiXG4gICAgICByZXF1ZXN0LnJlZmVycmVyID0gJ2NsaWVudCdcblxuICAgICAgLy8gNi4gU2V0IHJlcXVlc3TigJlzIHJlZmVycmVyIHBvbGljeSB0byB0aGUgZW1wdHkgc3RyaW5nLlxuICAgICAgcmVxdWVzdC5yZWZlcnJlclBvbGljeSA9ICcnXG5cbiAgICAgIC8vIDcuIFNldCByZXF1ZXN04oCZcyBVUkwgdG8gcmVxdWVzdOKAmXMgY3VycmVudCBVUkwuXG4gICAgICByZXF1ZXN0LnVybCA9IHJlcXVlc3QudXJsTGlzdFtyZXF1ZXN0LnVybExpc3QubGVuZ3RoIC0gMV1cblxuICAgICAgLy8gOC4gU2V0IHJlcXVlc3TigJlzIFVSTCBsaXN0IHRvIMKrIHJlcXVlc3TigJlzIFVSTCDCuy5cbiAgICAgIHJlcXVlc3QudXJsTGlzdCA9IFtyZXF1ZXN0LnVybF1cbiAgICB9XG5cbiAgICAvLyAxNC4gSWYgaW5pdFtcInJlZmVycmVyXCJdIGV4aXN0cywgdGhlbjpcbiAgICBpZiAoaW5pdC5yZWZlcnJlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyAxLiBMZXQgcmVmZXJyZXIgYmUgaW5pdFtcInJlZmVycmVyXCJdLlxuICAgICAgY29uc3QgcmVmZXJyZXIgPSBpbml0LnJlZmVycmVyXG5cbiAgICAgIC8vIDIuIElmIHJlZmVycmVyIGlzIHRoZSBlbXB0eSBzdHJpbmcsIHRoZW4gc2V0IHJlcXVlc3TigJlzIHJlZmVycmVyIHRvIFwibm8tcmVmZXJyZXJcIi5cbiAgICAgIGlmIChyZWZlcnJlciA9PT0gJycpIHtcbiAgICAgICAgcmVxdWVzdC5yZWZlcnJlciA9ICduby1yZWZlcnJlcidcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIDEuIExldCBwYXJzZWRSZWZlcnJlciBiZSB0aGUgcmVzdWx0IG9mIHBhcnNpbmcgcmVmZXJyZXIgd2l0aFxuICAgICAgICAvLyBiYXNlVVJMLlxuICAgICAgICAvLyAyLiBJZiBwYXJzZWRSZWZlcnJlciBpcyBmYWlsdXJlLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgICAgICBsZXQgcGFyc2VkUmVmZXJyZXJcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJzZWRSZWZlcnJlciA9IG5ldyBVUkwocmVmZXJyZXIsIGJhc2VVcmwpXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFJlZmVycmVyIFwiJHtyZWZlcnJlcn1cIiBpcyBub3QgYSB2YWxpZCBVUkwuYCwgeyBjYXVzZTogZXJyIH0pXG4gICAgICAgIH1cblxuICAgICAgICAvLyAzLiBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlXG4gICAgICAgIC8vIC0gcGFyc2VkUmVmZXJyZXLigJlzIHNjaGVtZSBpcyBcImFib3V0XCIgYW5kIHBhdGggaXMgdGhlIHN0cmluZyBcImNsaWVudFwiXG4gICAgICAgIC8vIC0gcGFyc2VkUmVmZXJyZXLigJlzIG9yaWdpbiBpcyBub3Qgc2FtZSBvcmlnaW4gd2l0aCBvcmlnaW5cbiAgICAgICAgLy8gdGhlbiBzZXQgcmVxdWVzdOKAmXMgcmVmZXJyZXIgdG8gXCJjbGllbnRcIi5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIChwYXJzZWRSZWZlcnJlci5wcm90b2NvbCA9PT0gJ2Fib3V0OicgJiYgcGFyc2VkUmVmZXJyZXIuaG9zdG5hbWUgPT09ICdjbGllbnQnKSB8fFxuICAgICAgICAgIChvcmlnaW4gJiYgIXNhbWVPcmlnaW4ocGFyc2VkUmVmZXJyZXIsIHRoaXNba1JlYWxtXS5zZXR0aW5nc09iamVjdC5iYXNlVXJsKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmVxdWVzdC5yZWZlcnJlciA9ICdjbGllbnQnXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gNC4gT3RoZXJ3aXNlLCBzZXQgcmVxdWVzdOKAmXMgcmVmZXJyZXIgdG8gcGFyc2VkUmVmZXJyZXIuXG4gICAgICAgICAgcmVxdWVzdC5yZWZlcnJlciA9IHBhcnNlZFJlZmVycmVyXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAxNS4gSWYgaW5pdFtcInJlZmVycmVyUG9saWN5XCJdIGV4aXN0cywgdGhlbiBzZXQgcmVxdWVzdOKAmXMgcmVmZXJyZXIgcG9saWN5XG4gICAgLy8gdG8gaXQuXG4gICAgaWYgKGluaXQucmVmZXJyZXJQb2xpY3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVxdWVzdC5yZWZlcnJlclBvbGljeSA9IGluaXQucmVmZXJyZXJQb2xpY3lcbiAgICB9XG5cbiAgICAvLyAxNi4gTGV0IG1vZGUgYmUgaW5pdFtcIm1vZGVcIl0gaWYgaXQgZXhpc3RzLCBhbmQgZmFsbGJhY2tNb2RlIG90aGVyd2lzZS5cbiAgICBsZXQgbW9kZVxuICAgIGlmIChpbml0Lm1vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbW9kZSA9IGluaXQubW9kZVxuICAgIH0gZWxzZSB7XG4gICAgICBtb2RlID0gZmFsbGJhY2tNb2RlXG4gICAgfVxuXG4gICAgLy8gMTcuIElmIG1vZGUgaXMgXCJuYXZpZ2F0ZVwiLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmIChtb2RlID09PSAnbmF2aWdhdGUnKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgIGhlYWRlcjogJ1JlcXVlc3QgY29uc3RydWN0b3InLFxuICAgICAgICBtZXNzYWdlOiAnaW52YWxpZCByZXF1ZXN0IG1vZGUgbmF2aWdhdGUuJ1xuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyAxOC4gSWYgbW9kZSBpcyBub24tbnVsbCwgc2V0IHJlcXVlc3TigJlzIG1vZGUgdG8gbW9kZS5cbiAgICBpZiAobW9kZSAhPSBudWxsKSB7XG4gICAgICByZXF1ZXN0Lm1vZGUgPSBtb2RlXG4gICAgfVxuXG4gICAgLy8gMTkuIElmIGluaXRbXCJjcmVkZW50aWFsc1wiXSBleGlzdHMsIHRoZW4gc2V0IHJlcXVlc3TigJlzIGNyZWRlbnRpYWxzIG1vZGVcbiAgICAvLyB0byBpdC5cbiAgICBpZiAoaW5pdC5jcmVkZW50aWFscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXF1ZXN0LmNyZWRlbnRpYWxzID0gaW5pdC5jcmVkZW50aWFsc1xuICAgIH1cblxuICAgIC8vIDE4LiBJZiBpbml0W1wiY2FjaGVcIl0gZXhpc3RzLCB0aGVuIHNldCByZXF1ZXN04oCZcyBjYWNoZSBtb2RlIHRvIGl0LlxuICAgIGlmIChpbml0LmNhY2hlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlcXVlc3QuY2FjaGUgPSBpbml0LmNhY2hlXG4gICAgfVxuXG4gICAgLy8gMjEuIElmIHJlcXVlc3TigJlzIGNhY2hlIG1vZGUgaXMgXCJvbmx5LWlmLWNhY2hlZFwiIGFuZCByZXF1ZXN04oCZcyBtb2RlIGlzXG4gICAgLy8gbm90IFwic2FtZS1vcmlnaW5cIiwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAocmVxdWVzdC5jYWNoZSA9PT0gJ29ubHktaWYtY2FjaGVkJyAmJiByZXF1ZXN0Lm1vZGUgIT09ICdzYW1lLW9yaWdpbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIFwiJ29ubHktaWYtY2FjaGVkJyBjYW4gYmUgc2V0IG9ubHkgd2l0aCAnc2FtZS1vcmlnaW4nIG1vZGVcIlxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIDIyLiBJZiBpbml0W1wicmVkaXJlY3RcIl0gZXhpc3RzLCB0aGVuIHNldCByZXF1ZXN04oCZcyByZWRpcmVjdCBtb2RlIHRvIGl0LlxuICAgIGlmIChpbml0LnJlZGlyZWN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlcXVlc3QucmVkaXJlY3QgPSBpbml0LnJlZGlyZWN0XG4gICAgfVxuXG4gICAgLy8gMjMuIElmIGluaXRbXCJpbnRlZ3JpdHlcIl0gZXhpc3RzLCB0aGVuIHNldCByZXF1ZXN04oCZcyBpbnRlZ3JpdHkgbWV0YWRhdGEgdG8gaXQuXG4gICAgaWYgKGluaXQuaW50ZWdyaXR5ICE9IG51bGwpIHtcbiAgICAgIHJlcXVlc3QuaW50ZWdyaXR5ID0gU3RyaW5nKGluaXQuaW50ZWdyaXR5KVxuICAgIH1cblxuICAgIC8vIDI0LiBJZiBpbml0W1wia2VlcGFsaXZlXCJdIGV4aXN0cywgdGhlbiBzZXQgcmVxdWVzdOKAmXMga2VlcGFsaXZlIHRvIGl0LlxuICAgIGlmIChpbml0LmtlZXBhbGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXF1ZXN0LmtlZXBhbGl2ZSA9IEJvb2xlYW4oaW5pdC5rZWVwYWxpdmUpXG4gICAgfVxuXG4gICAgLy8gMjUuIElmIGluaXRbXCJtZXRob2RcIl0gZXhpc3RzLCB0aGVuOlxuICAgIGlmIChpbml0Lm1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyAxLiBMZXQgbWV0aG9kIGJlIGluaXRbXCJtZXRob2RcIl0uXG4gICAgICBsZXQgbWV0aG9kID0gaW5pdC5tZXRob2RcblxuICAgICAgLy8gMi4gSWYgbWV0aG9kIGlzIG5vdCBhIG1ldGhvZCBvciBtZXRob2QgaXMgYSBmb3JiaWRkZW4gbWV0aG9kLCB0aGVuXG4gICAgICAvLyB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgIGlmICghaXNWYWxpZEhUVFBUb2tlbihtZXRob2QpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCcke21ldGhvZH0nIGlzIG5vdCBhIHZhbGlkIEhUVFAgbWV0aG9kLmApXG4gICAgICB9XG5cbiAgICAgIGlmIChmb3JiaWRkZW5NZXRob2RzU2V0LmhhcyhtZXRob2QudG9VcHBlckNhc2UoKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJyR7bWV0aG9kfScgSFRUUCBtZXRob2QgaXMgdW5zdXBwb3J0ZWQuYClcbiAgICAgIH1cblxuICAgICAgLy8gMy4gTm9ybWFsaXplIG1ldGhvZC5cbiAgICAgIG1ldGhvZCA9IG5vcm1hbGl6ZU1ldGhvZFJlY29yZFttZXRob2RdID8/IG5vcm1hbGl6ZU1ldGhvZChtZXRob2QpXG5cbiAgICAgIC8vIDQuIFNldCByZXF1ZXN04oCZcyBtZXRob2QgdG8gbWV0aG9kLlxuICAgICAgcmVxdWVzdC5tZXRob2QgPSBtZXRob2RcbiAgICB9XG5cbiAgICAvLyAyNi4gSWYgaW5pdFtcInNpZ25hbFwiXSBleGlzdHMsIHRoZW4gc2V0IHNpZ25hbCB0byBpdC5cbiAgICBpZiAoaW5pdC5zaWduYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2lnbmFsID0gaW5pdC5zaWduYWxcbiAgICB9XG5cbiAgICAvLyAyNy4gU2V0IHRoaXPigJlzIHJlcXVlc3QgdG8gcmVxdWVzdC5cbiAgICB0aGlzW2tTdGF0ZV0gPSByZXF1ZXN0XG5cbiAgICAvLyAyOC4gU2V0IHRoaXPigJlzIHNpZ25hbCB0byBhIG5ldyBBYm9ydFNpZ25hbCBvYmplY3Qgd2l0aCB0aGlz4oCZcyByZWxldmFudFxuICAgIC8vIFJlYWxtLlxuICAgIC8vIFRPRE86IGNvdWxkIHRoaXMgYmUgc2ltcGxpZmllZCB3aXRoIEFib3J0U2lnbmFsLmFueVxuICAgIC8vIChodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1hYm9ydHNpZ25hbC1hbnkpXG4gICAgY29uc3QgYWMgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgICB0aGlzW2tTaWduYWxdID0gYWMuc2lnbmFsXG4gICAgdGhpc1trU2lnbmFsXVtrUmVhbG1dID0gdGhpc1trUmVhbG1dXG5cbiAgICAvLyAyOS4gSWYgc2lnbmFsIGlzIG5vdCBudWxsLCB0aGVuIG1ha2UgdGhpc+KAmXMgc2lnbmFsIGZvbGxvdyBzaWduYWwuXG4gICAgaWYgKHNpZ25hbCAhPSBudWxsKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFzaWduYWwgfHxcbiAgICAgICAgdHlwZW9mIHNpZ25hbC5hYm9ydGVkICE9PSAnYm9vbGVhbicgfHxcbiAgICAgICAgdHlwZW9mIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyICE9PSAnZnVuY3Rpb24nXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBcIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1JlcXVlc3QnOiBtZW1iZXIgc2lnbmFsIGlzIG5vdCBvZiB0eXBlIEFib3J0U2lnbmFsLlwiXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgIGFjLmFib3J0KHNpZ25hbC5yZWFzb24pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBLZWVwIGEgc3Ryb25nIHJlZiB0byBhYyB3aGlsZSByZXF1ZXN0IG9iamVjdFxuICAgICAgICAvLyBpcyBhbGl2ZS4gVGhpcyBpcyBuZWVkZWQgdG8gcHJldmVudCBBYm9ydENvbnRyb2xsZXJcbiAgICAgICAgLy8gZnJvbSBiZWluZyBwcmVtYXR1cmVseSBnYXJiYWdlIGNvbGxlY3RlZC5cbiAgICAgICAgLy8gU2VlLCBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9pc3N1ZXMvMTkyNi5cbiAgICAgICAgdGhpc1trQWJvcnRDb250cm9sbGVyXSA9IGFjXG5cbiAgICAgICAgY29uc3QgYWNSZWYgPSBuZXcgV2Vha1JlZihhYylcbiAgICAgICAgY29uc3QgYWJvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3QgYWMgPSBhY1JlZi5kZXJlZigpXG4gICAgICAgICAgaWYgKGFjICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFjLmFib3J0KHRoaXMucmVhc29uKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoaXJkLXBhcnR5IEFib3J0Q29udHJvbGxlcnMgbWF5IG5vdCB3b3JrIHdpdGggdGhlc2UuXG4gICAgICAgIC8vIFNlZSwgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvcHVsbC8xOTEwI2lzc3VlY29tbWVudC0xNDY0NDk1NjE5LlxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIElmIHRoZSBtYXggYW1vdW50IG9mIGxpc3RlbmVycyBpcyBlcXVhbCB0byB0aGUgZGVmYXVsdCwgaW5jcmVhc2UgaXRcbiAgICAgICAgICAvLyBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGluIG5vZGUgPj0gdjE5LjkuMFxuICAgICAgICAgIGlmICh0eXBlb2YgZ2V0TWF4TGlzdGVuZXJzID09PSAnZnVuY3Rpb24nICYmIGdldE1heExpc3RlbmVycyhzaWduYWwpID09PSBkZWZhdWx0TWF4TGlzdGVuZXJzKSB7XG4gICAgICAgICAgICBzZXRNYXhMaXN0ZW5lcnMoMTAwLCBzaWduYWwpXG4gICAgICAgICAgfSBlbHNlIGlmIChnZXRFdmVudExpc3RlbmVycyhzaWduYWwsICdhYm9ydCcpLmxlbmd0aCA+PSBkZWZhdWx0TWF4TGlzdGVuZXJzKSB7XG4gICAgICAgICAgICBzZXRNYXhMaXN0ZW5lcnMoMTAwLCBzaWduYWwpXG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHt9XG5cbiAgICAgICAgdXRpbC5hZGRBYm9ydExpc3RlbmVyKHNpZ25hbCwgYWJvcnQpXG4gICAgICAgIHJlcXVlc3RGaW5hbGl6ZXIucmVnaXN0ZXIoYWMsIHsgc2lnbmFsLCBhYm9ydCB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDMwLiBTZXQgdGhpc+KAmXMgaGVhZGVycyB0byBhIG5ldyBIZWFkZXJzIG9iamVjdCB3aXRoIHRoaXPigJlzIHJlbGV2YW50XG4gICAgLy8gUmVhbG0sIHdob3NlIGhlYWRlciBsaXN0IGlzIHJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGFuZCBndWFyZCBpc1xuICAgIC8vIFwicmVxdWVzdFwiLlxuICAgIHRoaXNba0hlYWRlcnNdID0gbmV3IEhlYWRlcnMoa0NvbnN0cnVjdClcbiAgICB0aGlzW2tIZWFkZXJzXVtrSGVhZGVyc0xpc3RdID0gcmVxdWVzdC5oZWFkZXJzTGlzdFxuICAgIHRoaXNba0hlYWRlcnNdW2tHdWFyZF0gPSAncmVxdWVzdCdcbiAgICB0aGlzW2tIZWFkZXJzXVtrUmVhbG1dID0gdGhpc1trUmVhbG1dXG5cbiAgICAvLyAzMS4gSWYgdGhpc+KAmXMgcmVxdWVzdOKAmXMgbW9kZSBpcyBcIm5vLWNvcnNcIiwgdGhlbjpcbiAgICBpZiAobW9kZSA9PT0gJ25vLWNvcnMnKSB7XG4gICAgICAvLyAxLiBJZiB0aGlz4oCZcyByZXF1ZXN04oCZcyBtZXRob2QgaXMgbm90IGEgQ09SUy1zYWZlbGlzdGVkIG1ldGhvZCxcbiAgICAgIC8vIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgICBpZiAoIWNvcnNTYWZlTGlzdGVkTWV0aG9kc1NldC5oYXMocmVxdWVzdC5tZXRob2QpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgYCcke3JlcXVlc3QubWV0aG9kfSBpcyB1bnN1cHBvcnRlZCBpbiBuby1jb3JzIG1vZGUuYFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIFNldCB0aGlz4oCZcyBoZWFkZXJz4oCZcyBndWFyZCB0byBcInJlcXVlc3Qtbm8tY29yc1wiLlxuICAgICAgdGhpc1trSGVhZGVyc11ba0d1YXJkXSA9ICdyZXF1ZXN0LW5vLWNvcnMnXG4gICAgfVxuXG4gICAgLy8gMzIuIElmIGluaXQgaXMgbm90IGVtcHR5LCB0aGVuOlxuICAgIGlmIChpbml0SGFzS2V5KSB7XG4gICAgICAvKiogQHR5cGUge0hlYWRlcnNMaXN0fSAqL1xuICAgICAgY29uc3QgaGVhZGVyc0xpc3QgPSB0aGlzW2tIZWFkZXJzXVtrSGVhZGVyc0xpc3RdXG4gICAgICAvLyAxLiBMZXQgaGVhZGVycyBiZSBhIGNvcHkgb2YgdGhpc+KAmXMgaGVhZGVycyBhbmQgaXRzIGFzc29jaWF0ZWQgaGVhZGVyXG4gICAgICAvLyBsaXN0LlxuICAgICAgLy8gMi4gSWYgaW5pdFtcImhlYWRlcnNcIl0gZXhpc3RzLCB0aGVuIHNldCBoZWFkZXJzIHRvIGluaXRbXCJoZWFkZXJzXCJdLlxuICAgICAgY29uc3QgaGVhZGVycyA9IGluaXQuaGVhZGVycyAhPT0gdW5kZWZpbmVkID8gaW5pdC5oZWFkZXJzIDogbmV3IEhlYWRlcnNMaXN0KGhlYWRlcnNMaXN0KVxuXG4gICAgICAvLyAzLiBFbXB0eSB0aGlz4oCZcyBoZWFkZXJz4oCZcyBoZWFkZXIgbGlzdC5cbiAgICAgIGhlYWRlcnNMaXN0LmNsZWFyKClcblxuICAgICAgLy8gNC4gSWYgaGVhZGVycyBpcyBhIEhlYWRlcnMgb2JqZWN0LCB0aGVuIGZvciBlYWNoIGhlYWRlciBpbiBpdHMgaGVhZGVyXG4gICAgICAvLyBsaXN0LCBhcHBlbmQgaGVhZGVy4oCZcyBuYW1lL2hlYWRlcuKAmXMgdmFsdWUgdG8gdGhpc+KAmXMgaGVhZGVycy5cbiAgICAgIGlmIChoZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVyc0xpc3QpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIGhlYWRlcnMpIHtcbiAgICAgICAgICBoZWFkZXJzTGlzdC5hcHBlbmQoa2V5LCB2YWwpXG4gICAgICAgIH1cbiAgICAgICAgLy8gTm90ZTogQ29weSB0aGUgYHNldC1jb29raWVgIG1ldGEtZGF0YS5cbiAgICAgICAgaGVhZGVyc0xpc3QuY29va2llcyA9IGhlYWRlcnMuY29va2llc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gNS4gT3RoZXJ3aXNlLCBmaWxsIHRoaXPigJlzIGhlYWRlcnMgd2l0aCBoZWFkZXJzLlxuICAgICAgICBmaWxsSGVhZGVycyh0aGlzW2tIZWFkZXJzXSwgaGVhZGVycylcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAzMy4gTGV0IGlucHV0Qm9keSBiZSBpbnB1dOKAmXMgcmVxdWVzdOKAmXMgYm9keSBpZiBpbnB1dCBpcyBhIFJlcXVlc3RcbiAgICAvLyBvYmplY3Q7IG90aGVyd2lzZSBudWxsLlxuICAgIGNvbnN0IGlucHV0Qm9keSA9IGlucHV0IGluc3RhbmNlb2YgUmVxdWVzdCA/IGlucHV0W2tTdGF0ZV0uYm9keSA6IG51bGxcblxuICAgIC8vIDM0LiBJZiBlaXRoZXIgaW5pdFtcImJvZHlcIl0gZXhpc3RzIGFuZCBpcyBub24tbnVsbCBvciBpbnB1dEJvZHkgaXNcbiAgICAvLyBub24tbnVsbCwgYW5kIHJlcXVlc3TigJlzIG1ldGhvZCBpcyBgR0VUYCBvciBgSEVBRGAsIHRoZW4gdGhyb3cgYVxuICAgIC8vIFR5cGVFcnJvci5cbiAgICBpZiAoXG4gICAgICAoaW5pdC5ib2R5ICE9IG51bGwgfHwgaW5wdXRCb2R5ICE9IG51bGwpICYmXG4gICAgICAocmVxdWVzdC5tZXRob2QgPT09ICdHRVQnIHx8IHJlcXVlc3QubWV0aG9kID09PSAnSEVBRCcpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZXF1ZXN0IHdpdGggR0VUL0hFQUQgbWV0aG9kIGNhbm5vdCBoYXZlIGJvZHkuJylcbiAgICB9XG5cbiAgICAvLyAzNS4gTGV0IGluaXRCb2R5IGJlIG51bGwuXG4gICAgbGV0IGluaXRCb2R5ID0gbnVsbFxuXG4gICAgLy8gMzYuIElmIGluaXRbXCJib2R5XCJdIGV4aXN0cyBhbmQgaXMgbm9uLW51bGwsIHRoZW46XG4gICAgaWYgKGluaXQuYm9keSAhPSBudWxsKSB7XG4gICAgICAvLyAxLiBMZXQgQ29udGVudC1UeXBlIGJlIG51bGwuXG4gICAgICAvLyAyLiBTZXQgaW5pdEJvZHkgYW5kIENvbnRlbnQtVHlwZSB0byB0aGUgcmVzdWx0IG9mIGV4dHJhY3RpbmdcbiAgICAgIC8vIGluaXRbXCJib2R5XCJdLCB3aXRoIGtlZXBhbGl2ZSBzZXQgdG8gcmVxdWVzdOKAmXMga2VlcGFsaXZlLlxuICAgICAgY29uc3QgW2V4dHJhY3RlZEJvZHksIGNvbnRlbnRUeXBlXSA9IGV4dHJhY3RCb2R5KFxuICAgICAgICBpbml0LmJvZHksXG4gICAgICAgIHJlcXVlc3Qua2VlcGFsaXZlXG4gICAgICApXG4gICAgICBpbml0Qm9keSA9IGV4dHJhY3RlZEJvZHlcblxuICAgICAgLy8gMywgSWYgQ29udGVudC1UeXBlIGlzIG5vbi1udWxsIGFuZCB0aGlz4oCZcyBoZWFkZXJz4oCZcyBoZWFkZXIgbGlzdCBkb2VzXG4gICAgICAvLyBub3QgY29udGFpbiBgQ29udGVudC1UeXBlYCwgdGhlbiBhcHBlbmQgYENvbnRlbnQtVHlwZWAvQ29udGVudC1UeXBlIHRvXG4gICAgICAvLyB0aGlz4oCZcyBoZWFkZXJzLlxuICAgICAgaWYgKGNvbnRlbnRUeXBlICYmICF0aGlzW2tIZWFkZXJzXVtrSGVhZGVyc0xpc3RdLmNvbnRhaW5zKCdjb250ZW50LXR5cGUnKSkge1xuICAgICAgICB0aGlzW2tIZWFkZXJzXS5hcHBlbmQoJ2NvbnRlbnQtdHlwZScsIGNvbnRlbnRUeXBlKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDM3LiBMZXQgaW5wdXRPckluaXRCb2R5IGJlIGluaXRCb2R5IGlmIGl0IGlzIG5vbi1udWxsOyBvdGhlcndpc2VcbiAgICAvLyBpbnB1dEJvZHkuXG4gICAgY29uc3QgaW5wdXRPckluaXRCb2R5ID0gaW5pdEJvZHkgPz8gaW5wdXRCb2R5XG5cbiAgICAvLyAzOC4gSWYgaW5wdXRPckluaXRCb2R5IGlzIG5vbi1udWxsIGFuZCBpbnB1dE9ySW5pdEJvZHnigJlzIHNvdXJjZSBpc1xuICAgIC8vIG51bGwsIHRoZW46XG4gICAgaWYgKGlucHV0T3JJbml0Qm9keSAhPSBudWxsICYmIGlucHV0T3JJbml0Qm9keS5zb3VyY2UgPT0gbnVsbCkge1xuICAgICAgLy8gMS4gSWYgaW5pdEJvZHkgaXMgbm9uLW51bGwgYW5kIGluaXRbXCJkdXBsZXhcIl0gZG9lcyBub3QgZXhpc3QsXG4gICAgICAvLyAgICB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgICAgaWYgKGluaXRCb2R5ICE9IG51bGwgJiYgaW5pdC5kdXBsZXggPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZXF1ZXN0SW5pdDogZHVwbGV4IG9wdGlvbiBpcyByZXF1aXJlZCB3aGVuIHNlbmRpbmcgYSBib2R5LicpXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIElmIHRoaXPigJlzIHJlcXVlc3TigJlzIG1vZGUgaXMgbmVpdGhlciBcInNhbWUtb3JpZ2luXCIgbm9yIFwiY29yc1wiLFxuICAgICAgLy8gdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgIGlmIChyZXF1ZXN0Lm1vZGUgIT09ICdzYW1lLW9yaWdpbicgJiYgcmVxdWVzdC5tb2RlICE9PSAnY29ycycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAnSWYgcmVxdWVzdCBpcyBtYWRlIGZyb20gUmVhZGFibGVTdHJlYW0sIG1vZGUgc2hvdWxkIGJlIFwic2FtZS1vcmlnaW5cIiBvciBcImNvcnNcIidcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyAzLiBTZXQgdGhpc+KAmXMgcmVxdWVzdOKAmXMgdXNlLUNPUlMtcHJlZmxpZ2h0IGZsYWcuXG4gICAgICByZXF1ZXN0LnVzZUNPUlNQcmVmbGlnaHRGbGFnID0gdHJ1ZVxuICAgIH1cblxuICAgIC8vIDM5LiBMZXQgZmluYWxCb2R5IGJlIGlucHV0T3JJbml0Qm9keS5cbiAgICBsZXQgZmluYWxCb2R5ID0gaW5wdXRPckluaXRCb2R5XG5cbiAgICAvLyA0MC4gSWYgaW5pdEJvZHkgaXMgbnVsbCBhbmQgaW5wdXRCb2R5IGlzIG5vbi1udWxsLCB0aGVuOlxuICAgIGlmIChpbml0Qm9keSA9PSBudWxsICYmIGlucHV0Qm9keSAhPSBudWxsKSB7XG4gICAgICAvLyAxLiBJZiBpbnB1dCBpcyB1bnVzYWJsZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgIGlmICh1dGlsLmlzRGlzdHVyYmVkKGlucHV0Qm9keS5zdHJlYW0pIHx8IGlucHV0Qm9keS5zdHJlYW0ubG9ja2VkKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgJ0Nhbm5vdCBjb25zdHJ1Y3QgYSBSZXF1ZXN0IHdpdGggYSBSZXF1ZXN0IG9iamVjdCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gdXNlZC4nXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gMi4gU2V0IGZpbmFsQm9keSB0byB0aGUgcmVzdWx0IG9mIGNyZWF0aW5nIGEgcHJveHkgZm9yIGlucHV0Qm9keS5cbiAgICAgIGlmICghVHJhbnNmb3JtU3RyZWFtKSB7XG4gICAgICAgIFRyYW5zZm9ybVN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbS93ZWInKS5UcmFuc2Zvcm1TdHJlYW1cbiAgICAgIH1cblxuICAgICAgLy8gaHR0cHM6Ly9zdHJlYW1zLnNwZWMud2hhdHdnLm9yZy8jcmVhZGFibGVzdHJlYW0tY3JlYXRlLWEtcHJveHlcbiAgICAgIGNvbnN0IGlkZW50aXR5VHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybVN0cmVhbSgpXG4gICAgICBpbnB1dEJvZHkuc3RyZWFtLnBpcGVUaHJvdWdoKGlkZW50aXR5VHJhbnNmb3JtKVxuICAgICAgZmluYWxCb2R5ID0ge1xuICAgICAgICBzb3VyY2U6IGlucHV0Qm9keS5zb3VyY2UsXG4gICAgICAgIGxlbmd0aDogaW5wdXRCb2R5Lmxlbmd0aCxcbiAgICAgICAgc3RyZWFtOiBpZGVudGl0eVRyYW5zZm9ybS5yZWFkYWJsZVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDQxLiBTZXQgdGhpc+KAmXMgcmVxdWVzdOKAmXMgYm9keSB0byBmaW5hbEJvZHkuXG4gICAgdGhpc1trU3RhdGVdLmJvZHkgPSBmaW5hbEJvZHlcbiAgfVxuXG4gIC8vIFJldHVybnMgcmVxdWVzdOKAmXMgSFRUUCBtZXRob2QsIHdoaWNoIGlzIFwiR0VUXCIgYnkgZGVmYXVsdC5cbiAgZ2V0IG1ldGhvZCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIC8vIFRoZSBtZXRob2QgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVxdWVzdOKAmXMgbWV0aG9kLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ubWV0aG9kXG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSBVUkwgb2YgcmVxdWVzdCBhcyBhIHN0cmluZy5cbiAgZ2V0IHVybCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIC8vIFRoZSB1cmwgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVxdWVzdOKAmXMgVVJMLCBzZXJpYWxpemVkLlxuICAgIHJldHVybiBVUkxTZXJpYWxpemVyKHRoaXNba1N0YXRlXS51cmwpXG4gIH1cblxuICAvLyBSZXR1cm5zIGEgSGVhZGVycyBvYmplY3QgY29uc2lzdGluZyBvZiB0aGUgaGVhZGVycyBhc3NvY2lhdGVkIHdpdGggcmVxdWVzdC5cbiAgLy8gTm90ZSB0aGF0IGhlYWRlcnMgYWRkZWQgaW4gdGhlIG5ldHdvcmsgbGF5ZXIgYnkgdGhlIHVzZXIgYWdlbnQgd2lsbCBub3RcbiAgLy8gYmUgYWNjb3VudGVkIGZvciBpbiB0aGlzIG9iamVjdCwgZS5nLiwgdGhlIFwiSG9zdFwiIGhlYWRlci5cbiAgZ2V0IGhlYWRlcnMgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUgaGVhZGVycyBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlz4oCZcyBoZWFkZXJzLlxuICAgIHJldHVybiB0aGlzW2tIZWFkZXJzXVxuICB9XG5cbiAgLy8gUmV0dXJucyB0aGUga2luZCBvZiByZXNvdXJjZSByZXF1ZXN0ZWQgYnkgcmVxdWVzdCwgZS5nLiwgXCJkb2N1bWVudFwiXG4gIC8vIG9yIFwic2NyaXB0XCIuXG4gIGdldCBkZXN0aW5hdGlvbiAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIC8vIFRoZSBkZXN0aW5hdGlvbiBnZXR0ZXIgYXJlIHRvIHJldHVybiB0aGlz4oCZcyByZXF1ZXN04oCZcyBkZXN0aW5hdGlvbi5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmRlc3RpbmF0aW9uXG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSByZWZlcnJlciBvZiByZXF1ZXN0LiBJdHMgdmFsdWUgY2FuIGJlIGEgc2FtZS1vcmlnaW4gVVJMIGlmXG4gIC8vIGV4cGxpY2l0bHkgc2V0IGluIGluaXQsIHRoZSBlbXB0eSBzdHJpbmcgdG8gaW5kaWNhdGUgbm8gcmVmZXJyZXIsIGFuZFxuICAvLyBcImFib3V0OmNsaWVudFwiIHdoZW4gZGVmYXVsdGluZyB0byB0aGUgZ2xvYmFs4oCZcyBkZWZhdWx0LiBUaGlzIGlzIHVzZWRcbiAgLy8gZHVyaW5nIGZldGNoaW5nIHRvIGRldGVybWluZSB0aGUgdmFsdWUgb2YgdGhlIGBSZWZlcmVyYCBoZWFkZXIgb2YgdGhlXG4gIC8vIHJlcXVlc3QgYmVpbmcgbWFkZS5cbiAgZ2V0IHJlZmVycmVyICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gMS4gSWYgdGhpc+KAmXMgcmVxdWVzdOKAmXMgcmVmZXJyZXIgaXMgXCJuby1yZWZlcnJlclwiLCB0aGVuIHJldHVybiB0aGVcbiAgICAvLyBlbXB0eSBzdHJpbmcuXG4gICAgaWYgKHRoaXNba1N0YXRlXS5yZWZlcnJlciA9PT0gJ25vLXJlZmVycmVyJykge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuXG4gICAgLy8gMi4gSWYgdGhpc+KAmXMgcmVxdWVzdOKAmXMgcmVmZXJyZXIgaXMgXCJjbGllbnRcIiwgdGhlbiByZXR1cm5cbiAgICAvLyBcImFib3V0OmNsaWVudFwiLlxuICAgIGlmICh0aGlzW2tTdGF0ZV0ucmVmZXJyZXIgPT09ICdjbGllbnQnKSB7XG4gICAgICByZXR1cm4gJ2Fib3V0OmNsaWVudCdcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhpc+KAmXMgcmVxdWVzdOKAmXMgcmVmZXJyZXIsIHNlcmlhbGl6ZWQuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5yZWZlcnJlci50b1N0cmluZygpXG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSByZWZlcnJlciBwb2xpY3kgYXNzb2NpYXRlZCB3aXRoIHJlcXVlc3QuXG4gIC8vIFRoaXMgaXMgdXNlZCBkdXJpbmcgZmV0Y2hpbmcgdG8gY29tcHV0ZSB0aGUgdmFsdWUgb2YgdGhlIHJlcXVlc3TigJlzXG4gIC8vIHJlZmVycmVyLlxuICBnZXQgcmVmZXJyZXJQb2xpY3kgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUgcmVmZXJyZXJQb2xpY3kgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVxdWVzdOKAmXMgcmVmZXJyZXIgcG9saWN5LlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ucmVmZXJyZXJQb2xpY3lcbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIG1vZGUgYXNzb2NpYXRlZCB3aXRoIHJlcXVlc3QsIHdoaWNoIGlzIGEgc3RyaW5nIGluZGljYXRpbmdcbiAgLy8gd2hldGhlciB0aGUgcmVxdWVzdCB3aWxsIHVzZSBDT1JTLCBvciB3aWxsIGJlIHJlc3RyaWN0ZWQgdG8gc2FtZS1vcmlnaW5cbiAgLy8gVVJMcy5cbiAgZ2V0IG1vZGUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUgbW9kZSBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlz4oCZcyByZXF1ZXN04oCZcyBtb2RlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ubW9kZVxuICB9XG5cbiAgLy8gUmV0dXJucyB0aGUgY3JlZGVudGlhbHMgbW9kZSBhc3NvY2lhdGVkIHdpdGggcmVxdWVzdCxcbiAgLy8gd2hpY2ggaXMgYSBzdHJpbmcgaW5kaWNhdGluZyB3aGV0aGVyIGNyZWRlbnRpYWxzIHdpbGwgYmUgc2VudCB3aXRoIHRoZVxuICAvLyByZXF1ZXN0IGFsd2F5cywgbmV2ZXIsIG9yIG9ubHkgd2hlbiBzZW50IHRvIGEgc2FtZS1vcmlnaW4gVVJMLlxuICBnZXQgY3JlZGVudGlhbHMgKCkge1xuICAgIC8vIFRoZSBjcmVkZW50aWFscyBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlz4oCZcyByZXF1ZXN04oCZcyBjcmVkZW50aWFscyBtb2RlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uY3JlZGVudGlhbHNcbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIGNhY2hlIG1vZGUgYXNzb2NpYXRlZCB3aXRoIHJlcXVlc3QsXG4gIC8vIHdoaWNoIGlzIGEgc3RyaW5nIGluZGljYXRpbmcgaG93IHRoZSByZXF1ZXN0IHdpbGxcbiAgLy8gaW50ZXJhY3Qgd2l0aCB0aGUgYnJvd3NlcuKAmXMgY2FjaGUgd2hlbiBmZXRjaGluZy5cbiAgZ2V0IGNhY2hlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIGNhY2hlIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHJlcXVlc3TigJlzIGNhY2hlIG1vZGUuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5jYWNoZVxuICB9XG5cbiAgLy8gUmV0dXJucyB0aGUgcmVkaXJlY3QgbW9kZSBhc3NvY2lhdGVkIHdpdGggcmVxdWVzdCxcbiAgLy8gd2hpY2ggaXMgYSBzdHJpbmcgaW5kaWNhdGluZyBob3cgcmVkaXJlY3RzIGZvciB0aGVcbiAgLy8gcmVxdWVzdCB3aWxsIGJlIGhhbmRsZWQgZHVyaW5nIGZldGNoaW5nLiBBIHJlcXVlc3RcbiAgLy8gd2lsbCBmb2xsb3cgcmVkaXJlY3RzIGJ5IGRlZmF1bHQuXG4gIGdldCByZWRpcmVjdCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIC8vIFRoZSByZWRpcmVjdCBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlz4oCZcyByZXF1ZXN04oCZcyByZWRpcmVjdCBtb2RlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ucmVkaXJlY3RcbiAgfVxuXG4gIC8vIFJldHVybnMgcmVxdWVzdOKAmXMgc3VicmVzb3VyY2UgaW50ZWdyaXR5IG1ldGFkYXRhLCB3aGljaCBpcyBhXG4gIC8vIGNyeXB0b2dyYXBoaWMgaGFzaCBvZiB0aGUgcmVzb3VyY2UgYmVpbmcgZmV0Y2hlZC4gSXRzIHZhbHVlXG4gIC8vIGNvbnNpc3RzIG9mIG11bHRpcGxlIGhhc2hlcyBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4gW1NSSV1cbiAgZ2V0IGludGVncml0eSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIC8vIFRoZSBpbnRlZ3JpdHkgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVxdWVzdOKAmXMgaW50ZWdyaXR5XG4gICAgLy8gbWV0YWRhdGEuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5pbnRlZ3JpdHlcbiAgfVxuXG4gIC8vIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgcmVxdWVzdCBjYW4gb3V0bGl2ZSB0aGVcbiAgLy8gZ2xvYmFsIGluIHdoaWNoIGl0IHdhcyBjcmVhdGVkLlxuICBnZXQga2VlcGFsaXZlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIGtlZXBhbGl2ZSBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlz4oCZcyByZXF1ZXN04oCZcyBrZWVwYWxpdmUuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5rZWVwYWxpdmVcbiAgfVxuXG4gIC8vIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgcmVxdWVzdCBpcyBmb3IgYSByZWxvYWRcbiAgLy8gbmF2aWdhdGlvbi5cbiAgZ2V0IGlzUmVsb2FkTmF2aWdhdGlvbiAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIC8vIFRoZSBpc1JlbG9hZE5hdmlnYXRpb24gZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdHJ1ZSBpZiB0aGlz4oCZc1xuICAgIC8vIHJlcXVlc3TigJlzIHJlbG9hZC1uYXZpZ2F0aW9uIGZsYWcgaXMgc2V0OyBvdGhlcndpc2UgZmFsc2UuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5yZWxvYWROYXZpZ2F0aW9uXG4gIH1cblxuICAvLyBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHJlcXVlc3QgaXMgZm9yIGEgaGlzdG9yeVxuICAvLyBuYXZpZ2F0aW9uIChhLmsuYS4gYmFjay1mb3dhcmQgbmF2aWdhdGlvbikuXG4gIGdldCBpc0hpc3RvcnlOYXZpZ2F0aW9uICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIGlzSGlzdG9yeU5hdmlnYXRpb24gZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdHJ1ZSBpZiB0aGlz4oCZcyByZXF1ZXN04oCZc1xuICAgIC8vIGhpc3RvcnktbmF2aWdhdGlvbiBmbGFnIGlzIHNldDsgb3RoZXJ3aXNlIGZhbHNlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uaGlzdG9yeU5hdmlnYXRpb25cbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIHNpZ25hbCBhc3NvY2lhdGVkIHdpdGggcmVxdWVzdCwgd2hpY2ggaXMgYW4gQWJvcnRTaWduYWxcbiAgLy8gb2JqZWN0IGluZGljYXRpbmcgd2hldGhlciBvciBub3QgcmVxdWVzdCBoYXMgYmVlbiBhYm9ydGVkLCBhbmQgaXRzXG4gIC8vIGFib3J0IGV2ZW50IGhhbmRsZXIuXG4gIGdldCBzaWduYWwgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUgc2lnbmFsIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHNpZ25hbC5cbiAgICByZXR1cm4gdGhpc1trU2lnbmFsXVxuICB9XG5cbiAgZ2V0IGJvZHkgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmJvZHkgPyB0aGlzW2tTdGF0ZV0uYm9keS5zdHJlYW0gOiBudWxsXG4gIH1cblxuICBnZXQgYm9keVVzZWQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICByZXR1cm4gISF0aGlzW2tTdGF0ZV0uYm9keSAmJiB1dGlsLmlzRGlzdHVyYmVkKHRoaXNba1N0YXRlXS5ib2R5LnN0cmVhbSlcbiAgfVxuXG4gIGdldCBkdXBsZXggKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICByZXR1cm4gJ2hhbGYnXG4gIH1cblxuICAvLyBSZXR1cm5zIGEgY2xvbmUgb2YgcmVxdWVzdC5cbiAgY2xvbmUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyAxLiBJZiB0aGlzIGlzIHVudXNhYmxlLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmICh0aGlzLmJvZHlVc2VkIHx8IHRoaXMuYm9keT8ubG9ja2VkKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd1bnVzYWJsZScpXG4gICAgfVxuXG4gICAgLy8gMi4gTGV0IGNsb25lZFJlcXVlc3QgYmUgdGhlIHJlc3VsdCBvZiBjbG9uaW5nIHRoaXPigJlzIHJlcXVlc3QuXG4gICAgY29uc3QgY2xvbmVkUmVxdWVzdCA9IGNsb25lUmVxdWVzdCh0aGlzW2tTdGF0ZV0pXG5cbiAgICAvLyAzLiBMZXQgY2xvbmVkUmVxdWVzdE9iamVjdCBiZSB0aGUgcmVzdWx0IG9mIGNyZWF0aW5nIGEgUmVxdWVzdCBvYmplY3QsXG4gICAgLy8gZ2l2ZW4gY2xvbmVkUmVxdWVzdCwgdGhpc+KAmXMgaGVhZGVyc+KAmXMgZ3VhcmQsIGFuZCB0aGlz4oCZcyByZWxldmFudCBSZWFsbS5cbiAgICBjb25zdCBjbG9uZWRSZXF1ZXN0T2JqZWN0ID0gbmV3IFJlcXVlc3Qoa0NvbnN0cnVjdClcbiAgICBjbG9uZWRSZXF1ZXN0T2JqZWN0W2tTdGF0ZV0gPSBjbG9uZWRSZXF1ZXN0XG4gICAgY2xvbmVkUmVxdWVzdE9iamVjdFtrUmVhbG1dID0gdGhpc1trUmVhbG1dXG4gICAgY2xvbmVkUmVxdWVzdE9iamVjdFtrSGVhZGVyc10gPSBuZXcgSGVhZGVycyhrQ29uc3RydWN0KVxuICAgIGNsb25lZFJlcXVlc3RPYmplY3Rba0hlYWRlcnNdW2tIZWFkZXJzTGlzdF0gPSBjbG9uZWRSZXF1ZXN0LmhlYWRlcnNMaXN0XG4gICAgY2xvbmVkUmVxdWVzdE9iamVjdFtrSGVhZGVyc11ba0d1YXJkXSA9IHRoaXNba0hlYWRlcnNdW2tHdWFyZF1cbiAgICBjbG9uZWRSZXF1ZXN0T2JqZWN0W2tIZWFkZXJzXVtrUmVhbG1dID0gdGhpc1trSGVhZGVyc11ba1JlYWxtXVxuXG4gICAgLy8gNC4gTWFrZSBjbG9uZWRSZXF1ZXN0T2JqZWN04oCZcyBzaWduYWwgZm9sbG93IHRoaXPigJlzIHNpZ25hbC5cbiAgICBjb25zdCBhYyA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgIGlmICh0aGlzLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBhYy5hYm9ydCh0aGlzLnNpZ25hbC5yZWFzb24pXG4gICAgfSBlbHNlIHtcbiAgICAgIHV0aWwuYWRkQWJvcnRMaXN0ZW5lcihcbiAgICAgICAgdGhpcy5zaWduYWwsXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICBhYy5hYm9ydCh0aGlzLnNpZ25hbC5yZWFzb24pXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG4gICAgY2xvbmVkUmVxdWVzdE9iamVjdFtrU2lnbmFsXSA9IGFjLnNpZ25hbFxuXG4gICAgLy8gNC4gUmV0dXJuIGNsb25lZFJlcXVlc3RPYmplY3QuXG4gICAgcmV0dXJuIGNsb25lZFJlcXVlc3RPYmplY3RcbiAgfVxufVxuXG5taXhpbkJvZHkoUmVxdWVzdClcblxuZnVuY3Rpb24gbWFrZVJlcXVlc3QgKGluaXQpIHtcbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI3JlcXVlc3RzXG4gIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgbWV0aG9kOiAnR0VUJyxcbiAgICBsb2NhbFVSTHNPbmx5OiBmYWxzZSxcbiAgICB1bnNhZmVSZXF1ZXN0OiBmYWxzZSxcbiAgICBib2R5OiBudWxsLFxuICAgIGNsaWVudDogbnVsbCxcbiAgICByZXNlcnZlZENsaWVudDogbnVsbCxcbiAgICByZXBsYWNlc0NsaWVudElkOiAnJyxcbiAgICB3aW5kb3c6ICdjbGllbnQnLFxuICAgIGtlZXBhbGl2ZTogZmFsc2UsXG4gICAgc2VydmljZVdvcmtlcnM6ICdhbGwnLFxuICAgIGluaXRpYXRvcjogJycsXG4gICAgZGVzdGluYXRpb246ICcnLFxuICAgIHByaW9yaXR5OiBudWxsLFxuICAgIG9yaWdpbjogJ2NsaWVudCcsXG4gICAgcG9saWN5Q29udGFpbmVyOiAnY2xpZW50JyxcbiAgICByZWZlcnJlcjogJ2NsaWVudCcsXG4gICAgcmVmZXJyZXJQb2xpY3k6ICcnLFxuICAgIG1vZGU6ICduby1jb3JzJyxcbiAgICB1c2VDT1JTUHJlZmxpZ2h0RmxhZzogZmFsc2UsXG4gICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsXG4gICAgdXNlQ3JlZGVudGlhbHM6IGZhbHNlLFxuICAgIGNhY2hlOiAnZGVmYXVsdCcsXG4gICAgcmVkaXJlY3Q6ICdmb2xsb3cnLFxuICAgIGludGVncml0eTogJycsXG4gICAgY3J5cHRvR3JhcGhpY3NOb25jZU1ldGFkYXRhOiAnJyxcbiAgICBwYXJzZXJNZXRhZGF0YTogJycsXG4gICAgcmVsb2FkTmF2aWdhdGlvbjogZmFsc2UsXG4gICAgaGlzdG9yeU5hdmlnYXRpb246IGZhbHNlLFxuICAgIHVzZXJBY3RpdmF0aW9uOiBmYWxzZSxcbiAgICB0YWludGVkT3JpZ2luOiBmYWxzZSxcbiAgICByZWRpcmVjdENvdW50OiAwLFxuICAgIHJlc3BvbnNlVGFpbnRpbmc6ICdiYXNpYycsXG4gICAgcHJldmVudE5vQ2FjaGVDYWNoZUNvbnRyb2xIZWFkZXJNb2RpZmljYXRpb246IGZhbHNlLFxuICAgIGRvbmU6IGZhbHNlLFxuICAgIHRpbWluZ0FsbG93RmFpbGVkOiBmYWxzZSxcbiAgICAuLi5pbml0LFxuICAgIGhlYWRlcnNMaXN0OiBpbml0LmhlYWRlcnNMaXN0XG4gICAgICA/IG5ldyBIZWFkZXJzTGlzdChpbml0LmhlYWRlcnNMaXN0KVxuICAgICAgOiBuZXcgSGVhZGVyc0xpc3QoKVxuICB9XG4gIHJlcXVlc3QudXJsID0gcmVxdWVzdC51cmxMaXN0WzBdXG4gIHJldHVybiByZXF1ZXN0XG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LXJlcXVlc3QtY2xvbmVcbmZ1bmN0aW9uIGNsb25lUmVxdWVzdCAocmVxdWVzdCkge1xuICAvLyBUbyBjbG9uZSBhIHJlcXVlc3QgcmVxdWVzdCwgcnVuIHRoZXNlIHN0ZXBzOlxuXG4gIC8vIDEuIExldCBuZXdSZXF1ZXN0IGJlIGEgY29weSBvZiByZXF1ZXN0LCBleGNlcHQgZm9yIGl0cyBib2R5LlxuICBjb25zdCBuZXdSZXF1ZXN0ID0gbWFrZVJlcXVlc3QoeyAuLi5yZXF1ZXN0LCBib2R5OiBudWxsIH0pXG5cbiAgLy8gMi4gSWYgcmVxdWVzdOKAmXMgYm9keSBpcyBub24tbnVsbCwgc2V0IG5ld1JlcXVlc3TigJlzIGJvZHkgdG8gdGhlXG4gIC8vIHJlc3VsdCBvZiBjbG9uaW5nIHJlcXVlc3TigJlzIGJvZHkuXG4gIGlmIChyZXF1ZXN0LmJvZHkgIT0gbnVsbCkge1xuICAgIG5ld1JlcXVlc3QuYm9keSA9IGNsb25lQm9keShyZXF1ZXN0LmJvZHkpXG4gIH1cblxuICAvLyAzLiBSZXR1cm4gbmV3UmVxdWVzdC5cbiAgcmV0dXJuIG5ld1JlcXVlc3Rcbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVxdWVzdC5wcm90b3R5cGUsIHtcbiAgbWV0aG9kOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICB1cmw6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGhlYWRlcnM6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHJlZGlyZWN0OiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBjbG9uZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgc2lnbmFsOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBkdXBsZXg6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGRlc3RpbmF0aW9uOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBib2R5OiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBib2R5VXNlZDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgaXNIaXN0b3J5TmF2aWdhdGlvbjoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgaXNSZWxvYWROYXZpZ2F0aW9uOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBrZWVwYWxpdmU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGludGVncml0eToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgY2FjaGU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGNyZWRlbnRpYWxzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBhdHRyaWJ1dGU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHJlZmVycmVyUG9saWN5OiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZWZlcnJlcjoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgbW9kZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHtcbiAgICB2YWx1ZTogJ1JlcXVlc3QnLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9XG59KVxuXG53ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0ID0gd2ViaWRsLmludGVyZmFjZUNvbnZlcnRlcihcbiAgUmVxdWVzdFxuKVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jcmVxdWVzdGluZm9cbndlYmlkbC5jb252ZXJ0ZXJzLlJlcXVlc3RJbmZvID0gZnVuY3Rpb24gKFYpIHtcbiAgaWYgKHR5cGVvZiBWID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcoVilcbiAgfVxuXG4gIGlmIChWIGluc3RhbmNlb2YgUmVxdWVzdCkge1xuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0KFYpXG4gIH1cblxuICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKFYpXG59XG5cbndlYmlkbC5jb252ZXJ0ZXJzLkFib3J0U2lnbmFsID0gd2ViaWRsLmludGVyZmFjZUNvbnZlcnRlcihcbiAgQWJvcnRTaWduYWxcbilcblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI3JlcXVlc3Rpbml0XG53ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5pdCA9IHdlYmlkbC5kaWN0aW9uYXJ5Q29udmVydGVyKFtcbiAge1xuICAgIGtleTogJ21ldGhvZCcsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5CeXRlU3RyaW5nXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdoZWFkZXJzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkhlYWRlcnNJbml0XG4gIH0sXG4gIHtcbiAgICBrZXk6ICdib2R5JyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5udWxsYWJsZUNvbnZlcnRlcihcbiAgICAgIHdlYmlkbC5jb252ZXJ0ZXJzLkJvZHlJbml0XG4gICAgKVxuICB9LFxuICB7XG4gICAga2V5OiAncmVmZXJyZXInLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdyZWZlcnJlclBvbGljeScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAgLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmFwcHNlYy1yZWZlcnJlci1wb2xpY3kvI3JlZmVycmVyLXBvbGljeVxuICAgIGFsbG93ZWRWYWx1ZXM6IHJlZmVycmVyUG9saWN5XG4gIH0sXG4gIHtcbiAgICBrZXk6ICdtb2RlJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyxcbiAgICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1yZXF1ZXN0LW1vZGVcbiAgICBhbGxvd2VkVmFsdWVzOiByZXF1ZXN0TW9kZVxuICB9LFxuICB7XG4gICAga2V5OiAnY3JlZGVudGlhbHMnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nLFxuICAgIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXF1ZXN0Y3JlZGVudGlhbHNcbiAgICBhbGxvd2VkVmFsdWVzOiByZXF1ZXN0Q3JlZGVudGlhbHNcbiAgfSxcbiAge1xuICAgIGtleTogJ2NhY2hlJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyxcbiAgICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jcmVxdWVzdGNhY2hlXG4gICAgYWxsb3dlZFZhbHVlczogcmVxdWVzdENhY2hlXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdyZWRpcmVjdCcsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI3JlcXVlc3RyZWRpcmVjdFxuICAgIGFsbG93ZWRWYWx1ZXM6IHJlcXVlc3RSZWRpcmVjdFxuICB9LFxuICB7XG4gICAga2V5OiAnaW50ZWdyaXR5JyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZ1xuICB9LFxuICB7XG4gICAga2V5OiAna2VlcGFsaXZlJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW5cbiAgfSxcbiAge1xuICAgIGtleTogJ3NpZ25hbCcsXG4gICAgY29udmVydGVyOiB3ZWJpZGwubnVsbGFibGVDb252ZXJ0ZXIoXG4gICAgICAoc2lnbmFsKSA9PiB3ZWJpZGwuY29udmVydGVycy5BYm9ydFNpZ25hbChcbiAgICAgICAgc2lnbmFsLFxuICAgICAgICB7IHN0cmljdDogZmFsc2UgfVxuICAgICAgKVxuICAgIClcbiAgfSxcbiAge1xuICAgIGtleTogJ3dpbmRvdycsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5hbnlcbiAgfSxcbiAge1xuICAgIGtleTogJ2R1cGxleCcsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAgYWxsb3dlZFZhbHVlczogcmVxdWVzdER1cGxleFxuICB9XG5dKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHsgUmVxdWVzdCwgbWFrZVJlcXVlc3QgfVxuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL0V0aGFuLUFycm93b29kL3VuZGljaS1mZXRjaFxuXG4ndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBSZXNwb25zZSxcbiAgbWFrZU5ldHdvcmtFcnJvcixcbiAgbWFrZUFwcHJvcHJpYXRlTmV0d29ya0Vycm9yLFxuICBmaWx0ZXJSZXNwb25zZSxcbiAgbWFrZVJlc3BvbnNlXG59ID0gcmVxdWlyZSgnLi9yZXNwb25zZScpXG5jb25zdCB7IEhlYWRlcnMgfSA9IHJlcXVpcmUoJy4vaGVhZGVycycpXG5jb25zdCB7IFJlcXVlc3QsIG1ha2VSZXF1ZXN0IH0gPSByZXF1aXJlKCcuL3JlcXVlc3QnKVxuY29uc3QgemxpYiA9IHJlcXVpcmUoJ3psaWInKVxuY29uc3Qge1xuICBieXRlc01hdGNoLFxuICBtYWtlUG9saWN5Q29udGFpbmVyLFxuICBjbG9uZVBvbGljeUNvbnRhaW5lcixcbiAgcmVxdWVzdEJhZFBvcnQsXG4gIFRBT0NoZWNrLFxuICBhcHBlbmRSZXF1ZXN0T3JpZ2luSGVhZGVyLFxuICByZXNwb25zZUxvY2F0aW9uVVJMLFxuICByZXF1ZXN0Q3VycmVudFVSTCxcbiAgc2V0UmVxdWVzdFJlZmVycmVyUG9saWN5T25SZWRpcmVjdCxcbiAgdHJ5VXBncmFkZVJlcXVlc3RUb0FQb3RlbnRpYWxseVRydXN0d29ydGh5VVJMLFxuICBjcmVhdGVPcGFxdWVUaW1pbmdJbmZvLFxuICBhcHBlbmRGZXRjaE1ldGFkYXRhLFxuICBjb3JzQ2hlY2ssXG4gIGNyb3NzT3JpZ2luUmVzb3VyY2VQb2xpY3lDaGVjayxcbiAgZGV0ZXJtaW5lUmVxdWVzdHNSZWZlcnJlcixcbiAgY29hcnNlbmVkU2hhcmVkQ3VycmVudFRpbWUsXG4gIGNyZWF0ZURlZmVycmVkUHJvbWlzZSxcbiAgaXNCbG9iTGlrZSxcbiAgc2FtZU9yaWdpbixcbiAgaXNDYW5jZWxsZWQsXG4gIGlzQWJvcnRlZCxcbiAgaXNFcnJvckxpa2UsXG4gIGZ1bGx5UmVhZEJvZHksXG4gIHJlYWRhYmxlU3RyZWFtQ2xvc2UsXG4gIGlzb21vcnBoaWNFbmNvZGUsXG4gIHVybElzTG9jYWwsXG4gIHVybElzSHR0cEh0dHBzU2NoZW1lLFxuICB1cmxIYXNIdHRwc1NjaGVtZVxufSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IGtTdGF0ZSwga0hlYWRlcnMsIGtHdWFyZCwga1JlYWxtIH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsgc2FmZWx5RXh0cmFjdEJvZHkgfSA9IHJlcXVpcmUoJy4vYm9keScpXG5jb25zdCB7XG4gIHJlZGlyZWN0U3RhdHVzU2V0LFxuICBudWxsQm9keVN0YXR1cyxcbiAgc2FmZU1ldGhvZHNTZXQsXG4gIHJlcXVlc3RCb2R5SGVhZGVyLFxuICBzdWJyZXNvdXJjZVNldCxcbiAgRE9NRXhjZXB0aW9uXG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3QgeyBrSGVhZGVyc0xpc3QgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpXG5jb25zdCB7IFJlYWRhYmxlLCBwaXBlbGluZSB9ID0gcmVxdWlyZSgnc3RyZWFtJylcbmNvbnN0IHsgYWRkQWJvcnRMaXN0ZW5lciwgaXNFcnJvcmVkLCBpc1JlYWRhYmxlLCBub2RlTWFqb3IsIG5vZGVNaW5vciB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgZGF0YVVSTFByb2Nlc3Nvciwgc2VyaWFsaXplQU1pbWVUeXBlIH0gPSByZXF1aXJlKCcuL2RhdGFVUkwnKVxuY29uc3QgeyBUcmFuc2Zvcm1TdHJlYW0gfSA9IHJlcXVpcmUoJ3N0cmVhbS93ZWInKVxuY29uc3QgeyBnZXRHbG9iYWxEaXNwYXRjaGVyIH0gPSByZXF1aXJlKCcuLi9nbG9iYWwnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4vd2ViaWRsJylcbmNvbnN0IHsgU1RBVFVTX0NPREVTIH0gPSByZXF1aXJlKCdodHRwJylcbmNvbnN0IEdFVF9PUl9IRUFEID0gWydHRVQnLCAnSEVBRCddXG5cbi8qKiBAdHlwZSB7aW1wb3J0KCdidWZmZXInKS5yZXNvbHZlT2JqZWN0VVJMfSAqL1xubGV0IHJlc29sdmVPYmplY3RVUkxcbmxldCBSZWFkYWJsZVN0cmVhbSA9IGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW1cblxuY2xhc3MgRmV0Y2ggZXh0ZW5kcyBFRSB7XG4gIGNvbnN0cnVjdG9yIChkaXNwYXRjaGVyKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgdGhpcy5kaXNwYXRjaGVyID0gZGlzcGF0Y2hlclxuICAgIHRoaXMuY29ubmVjdGlvbiA9IG51bGxcbiAgICB0aGlzLmR1bXAgPSBmYWxzZVxuICAgIHRoaXMuc3RhdGUgPSAnb25nb2luZydcbiAgICAvLyAyIHRlcm1pbmF0ZWQgbGlzdGVuZXJzIGdldCBhZGRlZCBwZXIgcmVxdWVzdCxcbiAgICAvLyBidXQgb25seSAxIGdldHMgcmVtb3ZlZC4gSWYgdGhlcmUgYXJlIDIwIHJlZGlyZWN0cyxcbiAgICAvLyAyMSBsaXN0ZW5lcnMgd2lsbCBiZSBhZGRlZC5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzE3MTFcbiAgICAvLyBUT0RPIChmaXgpOiBGaW5kIGFuZCBmaXggcm9vdCBjYXVzZSBmb3IgbGVha2VkIGxpc3RlbmVyLlxuICAgIHRoaXMuc2V0TWF4TGlzdGVuZXJzKDIxKVxuICB9XG5cbiAgdGVybWluYXRlIChyZWFzb24pIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gJ29uZ29pbmcnKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlID0gJ3Rlcm1pbmF0ZWQnXG4gICAgdGhpcy5jb25uZWN0aW9uPy5kZXN0cm95KHJlYXNvbilcbiAgICB0aGlzLmVtaXQoJ3Rlcm1pbmF0ZWQnLCByZWFzb24pXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZmV0Y2gtY29udHJvbGxlci1hYm9ydFxuICBhYm9ydCAoZXJyb3IpIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gJ29uZ29pbmcnKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyAxLiBTZXQgY29udHJvbGxlcuKAmXMgc3RhdGUgdG8gXCJhYm9ydGVkXCIuXG4gICAgdGhpcy5zdGF0ZSA9ICdhYm9ydGVkJ1xuXG4gICAgLy8gMi4gTGV0IGZhbGxiYWNrRXJyb3IgYmUgYW4gXCJBYm9ydEVycm9yXCIgRE9NRXhjZXB0aW9uLlxuICAgIC8vIDMuIFNldCBlcnJvciB0byBmYWxsYmFja0Vycm9yIGlmIGl0IGlzIG5vdCBnaXZlbi5cbiAgICBpZiAoIWVycm9yKSB7XG4gICAgICBlcnJvciA9IG5ldyBET01FeGNlcHRpb24oJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuJywgJ0Fib3J0RXJyb3InKVxuICAgIH1cblxuICAgIC8vIDQuIExldCBzZXJpYWxpemVkRXJyb3IgYmUgU3RydWN0dXJlZFNlcmlhbGl6ZShlcnJvcikuXG4gICAgLy8gICAgSWYgdGhhdCB0aHJldyBhbiBleGNlcHRpb24sIGNhdGNoIGl0LCBhbmQgbGV0XG4gICAgLy8gICAgc2VyaWFsaXplZEVycm9yIGJlIFN0cnVjdHVyZWRTZXJpYWxpemUoZmFsbGJhY2tFcnJvcikuXG5cbiAgICAvLyA1LiBTZXQgY29udHJvbGxlcuKAmXMgc2VyaWFsaXplZCBhYm9ydCByZWFzb24gdG8gc2VyaWFsaXplZEVycm9yLlxuICAgIHRoaXMuc2VyaWFsaXplZEFib3J0UmVhc29uID0gZXJyb3JcblxuICAgIHRoaXMuY29ubmVjdGlvbj8uZGVzdHJveShlcnJvcilcbiAgICB0aGlzLmVtaXQoJ3Rlcm1pbmF0ZWQnLCBlcnJvcilcbiAgfVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZmV0Y2gtbWV0aG9kXG5mdW5jdGlvbiBmZXRjaCAoaW5wdXQsIGluaXQgPSB7fSkge1xuICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnZ2xvYmFsVGhpcy5mZXRjaCcgfSlcblxuICAvLyAxLiBMZXQgcCBiZSBhIG5ldyBwcm9taXNlLlxuICBjb25zdCBwID0gY3JlYXRlRGVmZXJyZWRQcm9taXNlKClcblxuICAvLyAyLiBMZXQgcmVxdWVzdE9iamVjdCBiZSB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBpbml0aWFsIHZhbHVlIG9mXG4gIC8vIFJlcXVlc3QgYXMgY29uc3RydWN0b3Igd2l0aCBpbnB1dCBhbmQgaW5pdCBhcyBhcmd1bWVudHMuIElmIHRoaXMgdGhyb3dzXG4gIC8vIGFuIGV4Y2VwdGlvbiwgcmVqZWN0IHAgd2l0aCBpdCBhbmQgcmV0dXJuIHAuXG4gIGxldCByZXF1ZXN0T2JqZWN0XG5cbiAgdHJ5IHtcbiAgICByZXF1ZXN0T2JqZWN0ID0gbmV3IFJlcXVlc3QoaW5wdXQsIGluaXQpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBwLnJlamVjdChlKVxuICAgIHJldHVybiBwLnByb21pc2VcbiAgfVxuXG4gIC8vIDMuIExldCByZXF1ZXN0IGJlIHJlcXVlc3RPYmplY3TigJlzIHJlcXVlc3QuXG4gIGNvbnN0IHJlcXVlc3QgPSByZXF1ZXN0T2JqZWN0W2tTdGF0ZV1cblxuICAvLyA0LiBJZiByZXF1ZXN0T2JqZWN04oCZcyBzaWduYWzigJlzIGFib3J0ZWQgZmxhZyBpcyBzZXQsIHRoZW46XG4gIGlmIChyZXF1ZXN0T2JqZWN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgLy8gMS4gQWJvcnQgdGhlIGZldGNoKCkgY2FsbCB3aXRoIHAsIHJlcXVlc3QsIG51bGwsIGFuZFxuICAgIC8vICAgIHJlcXVlc3RPYmplY3TigJlzIHNpZ25hbOKAmXMgYWJvcnQgcmVhc29uLlxuICAgIGFib3J0RmV0Y2gocCwgcmVxdWVzdCwgbnVsbCwgcmVxdWVzdE9iamVjdC5zaWduYWwucmVhc29uKVxuXG4gICAgLy8gMi4gUmV0dXJuIHAuXG4gICAgcmV0dXJuIHAucHJvbWlzZVxuICB9XG5cbiAgLy8gNS4gTGV0IGdsb2JhbE9iamVjdCBiZSByZXF1ZXN04oCZcyBjbGllbnTigJlzIGdsb2JhbCBvYmplY3QuXG4gIGNvbnN0IGdsb2JhbE9iamVjdCA9IHJlcXVlc3QuY2xpZW50Lmdsb2JhbE9iamVjdFxuXG4gIC8vIDYuIElmIGdsb2JhbE9iamVjdCBpcyBhIFNlcnZpY2VXb3JrZXJHbG9iYWxTY29wZSBvYmplY3QsIHRoZW4gc2V0XG4gIC8vIHJlcXVlc3TigJlzIHNlcnZpY2Utd29ya2VycyBtb2RlIHRvIFwibm9uZVwiLlxuICBpZiAoZ2xvYmFsT2JqZWN0Py5jb25zdHJ1Y3Rvcj8ubmFtZSA9PT0gJ1NlcnZpY2VXb3JrZXJHbG9iYWxTY29wZScpIHtcbiAgICByZXF1ZXN0LnNlcnZpY2VXb3JrZXJzID0gJ25vbmUnXG4gIH1cblxuICAvLyA3LiBMZXQgcmVzcG9uc2VPYmplY3QgYmUgbnVsbC5cbiAgbGV0IHJlc3BvbnNlT2JqZWN0ID0gbnVsbFxuXG4gIC8vIDguIExldCByZWxldmFudFJlYWxtIGJlIHRoaXPigJlzIHJlbGV2YW50IFJlYWxtLlxuICBjb25zdCByZWxldmFudFJlYWxtID0gbnVsbFxuXG4gIC8vIDkuIExldCBsb2NhbGx5QWJvcnRlZCBiZSBmYWxzZS5cbiAgbGV0IGxvY2FsbHlBYm9ydGVkID0gZmFsc2VcblxuICAvLyAxMC4gTGV0IGNvbnRyb2xsZXIgYmUgbnVsbC5cbiAgbGV0IGNvbnRyb2xsZXIgPSBudWxsXG5cbiAgLy8gMTEuIEFkZCB0aGUgZm9sbG93aW5nIGFib3J0IHN0ZXBzIHRvIHJlcXVlc3RPYmplY3TigJlzIHNpZ25hbDpcbiAgYWRkQWJvcnRMaXN0ZW5lcihcbiAgICByZXF1ZXN0T2JqZWN0LnNpZ25hbCxcbiAgICAoKSA9PiB7XG4gICAgICAvLyAxLiBTZXQgbG9jYWxseUFib3J0ZWQgdG8gdHJ1ZS5cbiAgICAgIGxvY2FsbHlBYm9ydGVkID0gdHJ1ZVxuXG4gICAgICAvLyAyLiBBc3NlcnQ6IGNvbnRyb2xsZXIgaXMgbm9uLW51bGwuXG4gICAgICBhc3NlcnQoY29udHJvbGxlciAhPSBudWxsKVxuXG4gICAgICAvLyAzLiBBYm9ydCBjb250cm9sbGVyIHdpdGggcmVxdWVzdE9iamVjdOKAmXMgc2lnbmFs4oCZcyBhYm9ydCByZWFzb24uXG4gICAgICBjb250cm9sbGVyLmFib3J0KHJlcXVlc3RPYmplY3Quc2lnbmFsLnJlYXNvbilcblxuICAgICAgLy8gNC4gQWJvcnQgdGhlIGZldGNoKCkgY2FsbCB3aXRoIHAsIHJlcXVlc3QsIHJlc3BvbnNlT2JqZWN0LFxuICAgICAgLy8gICAgYW5kIHJlcXVlc3RPYmplY3TigJlzIHNpZ25hbOKAmXMgYWJvcnQgcmVhc29uLlxuICAgICAgYWJvcnRGZXRjaChwLCByZXF1ZXN0LCByZXNwb25zZU9iamVjdCwgcmVxdWVzdE9iamVjdC5zaWduYWwucmVhc29uKVxuICAgIH1cbiAgKVxuXG4gIC8vIDEyLiBMZXQgaGFuZGxlRmV0Y2hEb25lIGdpdmVuIHJlc3BvbnNlIHJlc3BvbnNlIGJlIHRvIGZpbmFsaXplIGFuZFxuICAvLyByZXBvcnQgdGltaW5nIHdpdGggcmVzcG9uc2UsIGdsb2JhbE9iamVjdCwgYW5kIFwiZmV0Y2hcIi5cbiAgY29uc3QgaGFuZGxlRmV0Y2hEb25lID0gKHJlc3BvbnNlKSA9PlxuICAgIGZpbmFsaXplQW5kUmVwb3J0VGltaW5nKHJlc3BvbnNlLCAnZmV0Y2gnKVxuXG4gIC8vIDEzLiBTZXQgY29udHJvbGxlciB0byB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgZmV0Y2ggZ2l2ZW4gcmVxdWVzdCxcbiAgLy8gd2l0aCBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHkgc2V0IHRvIGhhbmRsZUZldGNoRG9uZSwgYW5kIHByb2Nlc3NSZXNwb25zZVxuICAvLyBnaXZlbiByZXNwb25zZSBiZWluZyB0aGVzZSBzdWJzdGVwczpcblxuICBjb25zdCBwcm9jZXNzUmVzcG9uc2UgPSAocmVzcG9uc2UpID0+IHtcbiAgICAvLyAxLiBJZiBsb2NhbGx5QWJvcnRlZCBpcyB0cnVlLCB0ZXJtaW5hdGUgdGhlc2Ugc3Vic3RlcHMuXG4gICAgaWYgKGxvY2FsbHlBYm9ydGVkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICB9XG5cbiAgICAvLyAyLiBJZiByZXNwb25zZeKAmXMgYWJvcnRlZCBmbGFnIGlzIHNldCwgdGhlbjpcbiAgICBpZiAocmVzcG9uc2UuYWJvcnRlZCkge1xuICAgICAgLy8gMS4gTGV0IGRlc2VyaWFsaXplZEVycm9yIGJlIHRoZSByZXN1bHQgb2YgZGVzZXJpYWxpemUgYSBzZXJpYWxpemVkXG4gICAgICAvLyAgICBhYm9ydCByZWFzb24gZ2l2ZW4gY29udHJvbGxlcuKAmXMgc2VyaWFsaXplZCBhYm9ydCByZWFzb24gYW5kXG4gICAgICAvLyAgICByZWxldmFudFJlYWxtLlxuXG4gICAgICAvLyAyLiBBYm9ydCB0aGUgZmV0Y2goKSBjYWxsIHdpdGggcCwgcmVxdWVzdCwgcmVzcG9uc2VPYmplY3QsIGFuZFxuICAgICAgLy8gICAgZGVzZXJpYWxpemVkRXJyb3IuXG5cbiAgICAgIGFib3J0RmV0Y2gocCwgcmVxdWVzdCwgcmVzcG9uc2VPYmplY3QsIGNvbnRyb2xsZXIuc2VyaWFsaXplZEFib3J0UmVhc29uKVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgfVxuXG4gICAgLy8gMy4gSWYgcmVzcG9uc2UgaXMgYSBuZXR3b3JrIGVycm9yLCB0aGVuIHJlamVjdCBwIHdpdGggYSBUeXBlRXJyb3JcbiAgICAvLyBhbmQgdGVybWluYXRlIHRoZXNlIHN1YnN0ZXBzLlxuICAgIGlmIChyZXNwb25zZS50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICBwLnJlamVjdChcbiAgICAgICAgT2JqZWN0LmFzc2lnbihuZXcgVHlwZUVycm9yKCdmZXRjaCBmYWlsZWQnKSwgeyBjYXVzZTogcmVzcG9uc2UuZXJyb3IgfSlcbiAgICAgIClcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIH1cblxuICAgIC8vIDQuIFNldCByZXNwb25zZU9iamVjdCB0byB0aGUgcmVzdWx0IG9mIGNyZWF0aW5nIGEgUmVzcG9uc2Ugb2JqZWN0LFxuICAgIC8vIGdpdmVuIHJlc3BvbnNlLCBcImltbXV0YWJsZVwiLCBhbmQgcmVsZXZhbnRSZWFsbS5cbiAgICByZXNwb25zZU9iamVjdCA9IG5ldyBSZXNwb25zZSgpXG4gICAgcmVzcG9uc2VPYmplY3Rba1N0YXRlXSA9IHJlc3BvbnNlXG4gICAgcmVzcG9uc2VPYmplY3Rba1JlYWxtXSA9IHJlbGV2YW50UmVhbG1cbiAgICByZXNwb25zZU9iamVjdFtrSGVhZGVyc11ba0hlYWRlcnNMaXN0XSA9IHJlc3BvbnNlLmhlYWRlcnNMaXN0XG4gICAgcmVzcG9uc2VPYmplY3Rba0hlYWRlcnNdW2tHdWFyZF0gPSAnaW1tdXRhYmxlJ1xuICAgIHJlc3BvbnNlT2JqZWN0W2tIZWFkZXJzXVtrUmVhbG1dID0gcmVsZXZhbnRSZWFsbVxuXG4gICAgLy8gNS4gUmVzb2x2ZSBwIHdpdGggcmVzcG9uc2VPYmplY3QuXG4gICAgcC5yZXNvbHZlKHJlc3BvbnNlT2JqZWN0KVxuICB9XG5cbiAgY29udHJvbGxlciA9IGZldGNoaW5nKHtcbiAgICByZXF1ZXN0LFxuICAgIHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keTogaGFuZGxlRmV0Y2hEb25lLFxuICAgIHByb2Nlc3NSZXNwb25zZSxcbiAgICBkaXNwYXRjaGVyOiBpbml0LmRpc3BhdGNoZXIgPz8gZ2V0R2xvYmFsRGlzcGF0Y2hlcigpIC8vIHVuZGljaVxuICB9KVxuXG4gIC8vIDE0LiBSZXR1cm4gcC5cbiAgcmV0dXJuIHAucHJvbWlzZVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZmluYWxpemUtYW5kLXJlcG9ydC10aW1pbmdcbmZ1bmN0aW9uIGZpbmFsaXplQW5kUmVwb3J0VGltaW5nIChyZXNwb25zZSwgaW5pdGlhdG9yVHlwZSA9ICdvdGhlcicpIHtcbiAgLy8gMS4gSWYgcmVzcG9uc2UgaXMgYW4gYWJvcnRlZCBuZXR3b3JrIGVycm9yLCB0aGVuIHJldHVybi5cbiAgaWYgKHJlc3BvbnNlLnR5cGUgPT09ICdlcnJvcicgJiYgcmVzcG9uc2UuYWJvcnRlZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gMi4gSWYgcmVzcG9uc2XigJlzIFVSTCBsaXN0IGlzIG51bGwgb3IgZW1wdHksIHRoZW4gcmV0dXJuLlxuICBpZiAoIXJlc3BvbnNlLnVybExpc3Q/Lmxlbmd0aCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gMy4gTGV0IG9yaWdpbmFsVVJMIGJlIHJlc3BvbnNl4oCZcyBVUkwgbGlzdFswXS5cbiAgY29uc3Qgb3JpZ2luYWxVUkwgPSByZXNwb25zZS51cmxMaXN0WzBdXG5cbiAgLy8gNC4gTGV0IHRpbWluZ0luZm8gYmUgcmVzcG9uc2XigJlzIHRpbWluZyBpbmZvLlxuICBsZXQgdGltaW5nSW5mbyA9IHJlc3BvbnNlLnRpbWluZ0luZm9cblxuICAvLyA1LiBMZXQgY2FjaGVTdGF0ZSBiZSByZXNwb25zZeKAmXMgY2FjaGUgc3RhdGUuXG4gIGxldCBjYWNoZVN0YXRlID0gcmVzcG9uc2UuY2FjaGVTdGF0ZVxuXG4gIC8vIDYuIElmIG9yaWdpbmFsVVJM4oCZcyBzY2hlbWUgaXMgbm90IGFuIEhUVFAoUykgc2NoZW1lLCB0aGVuIHJldHVybi5cbiAgaWYgKCF1cmxJc0h0dHBIdHRwc1NjaGVtZShvcmlnaW5hbFVSTCkpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIDcuIElmIHRpbWluZ0luZm8gaXMgbnVsbCwgdGhlbiByZXR1cm4uXG4gIGlmICh0aW1pbmdJbmZvID09PSBudWxsKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyA4LiBJZiByZXNwb25zZeKAmXMgdGltaW5nIGFsbG93IHBhc3NlZCBmbGFnIGlzIG5vdCBzZXQsIHRoZW46XG4gIGlmICghcmVzcG9uc2UudGltaW5nQWxsb3dQYXNzZWQpIHtcbiAgICAvLyAgMS4gU2V0IHRpbWluZ0luZm8gdG8gYSB0aGUgcmVzdWx0IG9mIGNyZWF0aW5nIGFuIG9wYXF1ZSB0aW1pbmcgaW5mbyBmb3IgdGltaW5nSW5mby5cbiAgICB0aW1pbmdJbmZvID0gY3JlYXRlT3BhcXVlVGltaW5nSW5mbyh7XG4gICAgICBzdGFydFRpbWU6IHRpbWluZ0luZm8uc3RhcnRUaW1lXG4gICAgfSlcblxuICAgIC8vICAyLiBTZXQgY2FjaGVTdGF0ZSB0byB0aGUgZW1wdHkgc3RyaW5nLlxuICAgIGNhY2hlU3RhdGUgPSAnJ1xuICB9XG5cbiAgLy8gOS4gU2V0IHRpbWluZ0luZm/igJlzIGVuZCB0aW1lIHRvIHRoZSBjb2Fyc2VuZWQgc2hhcmVkIGN1cnJlbnQgdGltZVxuICAvLyBnaXZlbiBnbG9iYWzigJlzIHJlbGV2YW50IHNldHRpbmdzIG9iamVjdOKAmXMgY3Jvc3Mtb3JpZ2luIGlzb2xhdGVkXG4gIC8vIGNhcGFiaWxpdHkuXG4gIC8vIFRPRE86IGdpdmVuIGdsb2JhbOKAmXMgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN04oCZcyBjcm9zcy1vcmlnaW4gaXNvbGF0ZWRcbiAgLy8gY2FwYWJpbGl0eT9cbiAgdGltaW5nSW5mby5lbmRUaW1lID0gY29hcnNlbmVkU2hhcmVkQ3VycmVudFRpbWUoKVxuXG4gIC8vIDEwLiBTZXQgcmVzcG9uc2XigJlzIHRpbWluZyBpbmZvIHRvIHRpbWluZ0luZm8uXG4gIHJlc3BvbnNlLnRpbWluZ0luZm8gPSB0aW1pbmdJbmZvXG5cbiAgLy8gMTEuIE1hcmsgcmVzb3VyY2UgdGltaW5nIGZvciB0aW1pbmdJbmZvLCBvcmlnaW5hbFVSTCwgaW5pdGlhdG9yVHlwZSxcbiAgLy8gZ2xvYmFsLCBhbmQgY2FjaGVTdGF0ZS5cbiAgbWFya1Jlc291cmNlVGltaW5nKFxuICAgIHRpbWluZ0luZm8sXG4gICAgb3JpZ2luYWxVUkwsXG4gICAgaW5pdGlhdG9yVHlwZSxcbiAgICBnbG9iYWxUaGlzLFxuICAgIGNhY2hlU3RhdGVcbiAgKVxufVxuXG4vLyBodHRwczovL3czYy5naXRodWIuaW8vcmVzb3VyY2UtdGltaW5nLyNkZm4tbWFyay1yZXNvdXJjZS10aW1pbmdcbmZ1bmN0aW9uIG1hcmtSZXNvdXJjZVRpbWluZyAodGltaW5nSW5mbywgb3JpZ2luYWxVUkwsIGluaXRpYXRvclR5cGUsIGdsb2JhbFRoaXMsIGNhY2hlU3RhdGUpIHtcbiAgaWYgKG5vZGVNYWpvciA+IDE4IHx8IChub2RlTWFqb3IgPT09IDE4ICYmIG5vZGVNaW5vciA+PSAyKSkge1xuICAgIHBlcmZvcm1hbmNlLm1hcmtSZXNvdXJjZVRpbWluZyh0aW1pbmdJbmZvLCBvcmlnaW5hbFVSTC5ocmVmLCBpbml0aWF0b3JUeXBlLCBnbG9iYWxUaGlzLCBjYWNoZVN0YXRlKVxuICB9XG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNhYm9ydC1mZXRjaFxuZnVuY3Rpb24gYWJvcnRGZXRjaCAocCwgcmVxdWVzdCwgcmVzcG9uc2VPYmplY3QsIGVycm9yKSB7XG4gIC8vIE5vdGU6IEFib3J0U2lnbmFsLnJlYXNvbiB3YXMgYWRkZWQgaW4gbm9kZSB2MTcuMi4wXG4gIC8vIHdoaWNoIHdvdWxkIGdpdmUgdXMgYW4gdW5kZWZpbmVkIGVycm9yIHRvIHJlamVjdCB3aXRoLlxuICAvLyBSZW1vdmUgdGhpcyBvbmNlIG5vZGUgdjE2IGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuXG4gIGlmICghZXJyb3IpIHtcbiAgICBlcnJvciA9IG5ldyBET01FeGNlcHRpb24oJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuJywgJ0Fib3J0RXJyb3InKVxuICB9XG5cbiAgLy8gMS4gUmVqZWN0IHByb21pc2Ugd2l0aCBlcnJvci5cbiAgcC5yZWplY3QoZXJyb3IpXG5cbiAgLy8gMi4gSWYgcmVxdWVzdOKAmXMgYm9keSBpcyBub3QgbnVsbCBhbmQgaXMgcmVhZGFibGUsIHRoZW4gY2FuY2VsIHJlcXVlc3TigJlzXG4gIC8vIGJvZHkgd2l0aCBlcnJvci5cbiAgaWYgKHJlcXVlc3QuYm9keSAhPSBudWxsICYmIGlzUmVhZGFibGUocmVxdWVzdC5ib2R5Py5zdHJlYW0pKSB7XG4gICAgcmVxdWVzdC5ib2R5LnN0cmVhbS5jYW5jZWwoZXJyb3IpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VSUl9JTlZBTElEX1NUQVRFJykge1xuICAgICAgICAvLyBOb2RlIGJ1Zz9cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJcbiAgICB9KVxuICB9XG5cbiAgLy8gMy4gSWYgcmVzcG9uc2VPYmplY3QgaXMgbnVsbCwgdGhlbiByZXR1cm4uXG4gIGlmIChyZXNwb25zZU9iamVjdCA9PSBudWxsKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyA0LiBMZXQgcmVzcG9uc2UgYmUgcmVzcG9uc2VPYmplY3TigJlzIHJlc3BvbnNlLlxuICBjb25zdCByZXNwb25zZSA9IHJlc3BvbnNlT2JqZWN0W2tTdGF0ZV1cblxuICAvLyA1LiBJZiByZXNwb25zZeKAmXMgYm9keSBpcyBub3QgbnVsbCBhbmQgaXMgcmVhZGFibGUsIHRoZW4gZXJyb3IgcmVzcG9uc2XigJlzXG4gIC8vIGJvZHkgd2l0aCBlcnJvci5cbiAgaWYgKHJlc3BvbnNlLmJvZHkgIT0gbnVsbCAmJiBpc1JlYWRhYmxlKHJlc3BvbnNlLmJvZHk/LnN0cmVhbSkpIHtcbiAgICByZXNwb25zZS5ib2R5LnN0cmVhbS5jYW5jZWwoZXJyb3IpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VSUl9JTlZBTElEX1NUQVRFJykge1xuICAgICAgICAvLyBOb2RlIGJ1Zz9cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJcbiAgICB9KVxuICB9XG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNmZXRjaGluZ1xuZnVuY3Rpb24gZmV0Y2hpbmcgKHtcbiAgcmVxdWVzdCxcbiAgcHJvY2Vzc1JlcXVlc3RCb2R5Q2h1bmtMZW5ndGgsXG4gIHByb2Nlc3NSZXF1ZXN0RW5kT2ZCb2R5LFxuICBwcm9jZXNzUmVzcG9uc2UsXG4gIHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keSxcbiAgcHJvY2Vzc1Jlc3BvbnNlQ29uc3VtZUJvZHksXG4gIHVzZVBhcmFsbGVsUXVldWUgPSBmYWxzZSxcbiAgZGlzcGF0Y2hlciAvLyB1bmRpY2lcbn0pIHtcbiAgLy8gMS4gTGV0IHRhc2tEZXN0aW5hdGlvbiBiZSBudWxsLlxuICBsZXQgdGFza0Rlc3RpbmF0aW9uID0gbnVsbFxuXG4gIC8vIDIuIExldCBjcm9zc09yaWdpbklzb2xhdGVkQ2FwYWJpbGl0eSBiZSBmYWxzZS5cbiAgbGV0IGNyb3NzT3JpZ2luSXNvbGF0ZWRDYXBhYmlsaXR5ID0gZmFsc2VcblxuICAvLyAzLiBJZiByZXF1ZXN04oCZcyBjbGllbnQgaXMgbm9uLW51bGwsIHRoZW46XG4gIGlmIChyZXF1ZXN0LmNsaWVudCAhPSBudWxsKSB7XG4gICAgLy8gMS4gU2V0IHRhc2tEZXN0aW5hdGlvbiB0byByZXF1ZXN04oCZcyBjbGllbnTigJlzIGdsb2JhbCBvYmplY3QuXG4gICAgdGFza0Rlc3RpbmF0aW9uID0gcmVxdWVzdC5jbGllbnQuZ2xvYmFsT2JqZWN0XG5cbiAgICAvLyAyLiBTZXQgY3Jvc3NPcmlnaW5Jc29sYXRlZENhcGFiaWxpdHkgdG8gcmVxdWVzdOKAmXMgY2xpZW504oCZcyBjcm9zcy1vcmlnaW5cbiAgICAvLyBpc29sYXRlZCBjYXBhYmlsaXR5LlxuICAgIGNyb3NzT3JpZ2luSXNvbGF0ZWRDYXBhYmlsaXR5ID1cbiAgICAgIHJlcXVlc3QuY2xpZW50LmNyb3NzT3JpZ2luSXNvbGF0ZWRDYXBhYmlsaXR5XG4gIH1cblxuICAvLyA0LiBJZiB1c2VQYXJhbGxlbFF1ZXVlIGlzIHRydWUsIHRoZW4gc2V0IHRhc2tEZXN0aW5hdGlvbiB0byB0aGUgcmVzdWx0IG9mXG4gIC8vIHN0YXJ0aW5nIGEgbmV3IHBhcmFsbGVsIHF1ZXVlLlxuICAvLyBUT0RPXG5cbiAgLy8gNS4gTGV0IHRpbWluZ0luZm8gYmUgYSBuZXcgZmV0Y2ggdGltaW5nIGluZm8gd2hvc2Ugc3RhcnQgdGltZSBhbmRcbiAgLy8gcG9zdC1yZWRpcmVjdCBzdGFydCB0aW1lIGFyZSB0aGUgY29hcnNlbmVkIHNoYXJlZCBjdXJyZW50IHRpbWUgZ2l2ZW5cbiAgLy8gY3Jvc3NPcmlnaW5Jc29sYXRlZENhcGFiaWxpdHkuXG4gIGNvbnN0IGN1cnJlblRpbWUgPSBjb2Fyc2VuZWRTaGFyZWRDdXJyZW50VGltZShjcm9zc09yaWdpbklzb2xhdGVkQ2FwYWJpbGl0eSlcbiAgY29uc3QgdGltaW5nSW5mbyA9IGNyZWF0ZU9wYXF1ZVRpbWluZ0luZm8oe1xuICAgIHN0YXJ0VGltZTogY3VycmVuVGltZVxuICB9KVxuXG4gIC8vIDYuIExldCBmZXRjaFBhcmFtcyBiZSBhIG5ldyBmZXRjaCBwYXJhbXMgd2hvc2VcbiAgLy8gcmVxdWVzdCBpcyByZXF1ZXN0LFxuICAvLyB0aW1pbmcgaW5mbyBpcyB0aW1pbmdJbmZvLFxuICAvLyBwcm9jZXNzIHJlcXVlc3QgYm9keSBjaHVuayBsZW5ndGggaXMgcHJvY2Vzc1JlcXVlc3RCb2R5Q2h1bmtMZW5ndGgsXG4gIC8vIHByb2Nlc3MgcmVxdWVzdCBlbmQtb2YtYm9keSBpcyBwcm9jZXNzUmVxdWVzdEVuZE9mQm9keSxcbiAgLy8gcHJvY2VzcyByZXNwb25zZSBpcyBwcm9jZXNzUmVzcG9uc2UsXG4gIC8vIHByb2Nlc3MgcmVzcG9uc2UgY29uc3VtZSBib2R5IGlzIHByb2Nlc3NSZXNwb25zZUNvbnN1bWVCb2R5LFxuICAvLyBwcm9jZXNzIHJlc3BvbnNlIGVuZC1vZi1ib2R5IGlzIHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keSxcbiAgLy8gdGFzayBkZXN0aW5hdGlvbiBpcyB0YXNrRGVzdGluYXRpb24sXG4gIC8vIGFuZCBjcm9zcy1vcmlnaW4gaXNvbGF0ZWQgY2FwYWJpbGl0eSBpcyBjcm9zc09yaWdpbklzb2xhdGVkQ2FwYWJpbGl0eS5cbiAgY29uc3QgZmV0Y2hQYXJhbXMgPSB7XG4gICAgY29udHJvbGxlcjogbmV3IEZldGNoKGRpc3BhdGNoZXIpLFxuICAgIHJlcXVlc3QsXG4gICAgdGltaW5nSW5mbyxcbiAgICBwcm9jZXNzUmVxdWVzdEJvZHlDaHVua0xlbmd0aCxcbiAgICBwcm9jZXNzUmVxdWVzdEVuZE9mQm9keSxcbiAgICBwcm9jZXNzUmVzcG9uc2UsXG4gICAgcHJvY2Vzc1Jlc3BvbnNlQ29uc3VtZUJvZHksXG4gICAgcHJvY2Vzc1Jlc3BvbnNlRW5kT2ZCb2R5LFxuICAgIHRhc2tEZXN0aW5hdGlvbixcbiAgICBjcm9zc09yaWdpbklzb2xhdGVkQ2FwYWJpbGl0eVxuICB9XG5cbiAgLy8gNy4gSWYgcmVxdWVzdOKAmXMgYm9keSBpcyBhIGJ5dGUgc2VxdWVuY2UsIHRoZW4gc2V0IHJlcXVlc3TigJlzIGJvZHkgdG9cbiAgLy8gICAgcmVxdWVzdOKAmXMgYm9keSBhcyBhIGJvZHkuXG4gIC8vIE5PVEU6IFNpbmNlIGZldGNoaW5nIGlzIG9ubHkgY2FsbGVkIGZyb20gZmV0Y2gsIGJvZHkgc2hvdWxkIGFscmVhZHkgYmVcbiAgLy8gZXh0cmFjdGVkLlxuICBhc3NlcnQoIXJlcXVlc3QuYm9keSB8fCByZXF1ZXN0LmJvZHkuc3RyZWFtKVxuXG4gIC8vIDguIElmIHJlcXVlc3TigJlzIHdpbmRvdyBpcyBcImNsaWVudFwiLCB0aGVuIHNldCByZXF1ZXN04oCZcyB3aW5kb3cgdG8gcmVxdWVzdOKAmXNcbiAgLy8gY2xpZW50LCBpZiByZXF1ZXN04oCZcyBjbGllbnTigJlzIGdsb2JhbCBvYmplY3QgaXMgYSBXaW5kb3cgb2JqZWN0OyBvdGhlcndpc2VcbiAgLy8gXCJuby13aW5kb3dcIi5cbiAgaWYgKHJlcXVlc3Qud2luZG93ID09PSAnY2xpZW50Jykge1xuICAgIC8vIFRPRE86IFdoYXQgaWYgcmVxdWVzdC5jbGllbnQgaXMgbnVsbD9cbiAgICByZXF1ZXN0LndpbmRvdyA9XG4gICAgICByZXF1ZXN0LmNsaWVudD8uZ2xvYmFsT2JqZWN0Py5jb25zdHJ1Y3Rvcj8ubmFtZSA9PT0gJ1dpbmRvdydcbiAgICAgICAgPyByZXF1ZXN0LmNsaWVudFxuICAgICAgICA6ICduby13aW5kb3cnXG4gIH1cblxuICAvLyA5LiBJZiByZXF1ZXN04oCZcyBvcmlnaW4gaXMgXCJjbGllbnRcIiwgdGhlbiBzZXQgcmVxdWVzdOKAmXMgb3JpZ2luIHRvIHJlcXVlc3TigJlzXG4gIC8vIGNsaWVudOKAmXMgb3JpZ2luLlxuICBpZiAocmVxdWVzdC5vcmlnaW4gPT09ICdjbGllbnQnKSB7XG4gICAgLy8gVE9ETzogV2hhdCBpZiByZXF1ZXN0LmNsaWVudCBpcyBudWxsP1xuICAgIHJlcXVlc3Qub3JpZ2luID0gcmVxdWVzdC5jbGllbnQ/Lm9yaWdpblxuICB9XG5cbiAgLy8gMTAuIElmIGFsbCBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIHRydWU6XG4gIC8vIFRPRE9cblxuICAvLyAxMS4gSWYgcmVxdWVzdOKAmXMgcG9saWN5IGNvbnRhaW5lciBpcyBcImNsaWVudFwiLCB0aGVuOlxuICBpZiAocmVxdWVzdC5wb2xpY3lDb250YWluZXIgPT09ICdjbGllbnQnKSB7XG4gICAgLy8gMS4gSWYgcmVxdWVzdOKAmXMgY2xpZW50IGlzIG5vbi1udWxsLCB0aGVuIHNldCByZXF1ZXN04oCZcyBwb2xpY3lcbiAgICAvLyBjb250YWluZXIgdG8gYSBjbG9uZSBvZiByZXF1ZXN04oCZcyBjbGllbnTigJlzIHBvbGljeSBjb250YWluZXIuIFtIVE1MXVxuICAgIGlmIChyZXF1ZXN0LmNsaWVudCAhPSBudWxsKSB7XG4gICAgICByZXF1ZXN0LnBvbGljeUNvbnRhaW5lciA9IGNsb25lUG9saWN5Q29udGFpbmVyKFxuICAgICAgICByZXF1ZXN0LmNsaWVudC5wb2xpY3lDb250YWluZXJcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gMi4gT3RoZXJ3aXNlLCBzZXQgcmVxdWVzdOKAmXMgcG9saWN5IGNvbnRhaW5lciB0byBhIG5ldyBwb2xpY3lcbiAgICAgIC8vIGNvbnRhaW5lci5cbiAgICAgIHJlcXVlc3QucG9saWN5Q29udGFpbmVyID0gbWFrZVBvbGljeUNvbnRhaW5lcigpXG4gICAgfVxuICB9XG5cbiAgLy8gMTIuIElmIHJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGRvZXMgbm90IGNvbnRhaW4gYEFjY2VwdGAsIHRoZW46XG4gIGlmICghcmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygnYWNjZXB0JykpIHtcbiAgICAvLyAxLiBMZXQgdmFsdWUgYmUgYCovKmAuXG4gICAgY29uc3QgdmFsdWUgPSAnKi8qJ1xuXG4gICAgLy8gMi4gQSB1c2VyIGFnZW50IHNob3VsZCBzZXQgdmFsdWUgdG8gdGhlIGZpcnN0IG1hdGNoaW5nIHN0YXRlbWVudCwgaWZcbiAgICAvLyBhbnksIHN3aXRjaGluZyBvbiByZXF1ZXN04oCZcyBkZXN0aW5hdGlvbjpcbiAgICAvLyBcImRvY3VtZW50XCJcbiAgICAvLyBcImZyYW1lXCJcbiAgICAvLyBcImlmcmFtZVwiXG4gICAgLy8gYHRleHQvaHRtbCxhcHBsaWNhdGlvbi94aHRtbCt4bWwsYXBwbGljYXRpb24veG1sO3E9MC45LCovKjtxPTAuOGBcbiAgICAvLyBcImltYWdlXCJcbiAgICAvLyBgaW1hZ2UvcG5nLGltYWdlL3N2Zyt4bWwsaW1hZ2UvKjtxPTAuOCwqLyo7cT0wLjVgXG4gICAgLy8gXCJzdHlsZVwiXG4gICAgLy8gYHRleHQvY3NzLCovKjtxPTAuMWBcbiAgICAvLyBUT0RPXG5cbiAgICAvLyAzLiBBcHBlbmQgYEFjY2VwdGAvdmFsdWUgdG8gcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gICAgcmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ2FjY2VwdCcsIHZhbHVlKVxuICB9XG5cbiAgLy8gMTMuIElmIHJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGRvZXMgbm90IGNvbnRhaW4gYEFjY2VwdC1MYW5ndWFnZWAsIHRoZW5cbiAgLy8gdXNlciBhZ2VudHMgc2hvdWxkIGFwcGVuZCBgQWNjZXB0LUxhbmd1YWdlYC9hbiBhcHByb3ByaWF0ZSB2YWx1ZSB0b1xuICAvLyByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgaWYgKCFyZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCdhY2NlcHQtbGFuZ3VhZ2UnKSkge1xuICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdhY2NlcHQtbGFuZ3VhZ2UnLCAnKicpXG4gIH1cblxuICAvLyAxNC4gSWYgcmVxdWVzdOKAmXMgcHJpb3JpdHkgaXMgbnVsbCwgdGhlbiB1c2UgcmVxdWVzdOKAmXMgaW5pdGlhdG9yIGFuZFxuICAvLyBkZXN0aW5hdGlvbiBhcHByb3ByaWF0ZWx5IGluIHNldHRpbmcgcmVxdWVzdOKAmXMgcHJpb3JpdHkgdG8gYVxuICAvLyB1c2VyLWFnZW50LWRlZmluZWQgb2JqZWN0LlxuICBpZiAocmVxdWVzdC5wcmlvcml0eSA9PT0gbnVsbCkge1xuICAgIC8vIFRPRE9cbiAgfVxuXG4gIC8vIDE1LiBJZiByZXF1ZXN0IGlzIGEgc3VicmVzb3VyY2UgcmVxdWVzdCwgdGhlbjpcbiAgaWYgKHN1YnJlc291cmNlU2V0LmhhcyhyZXF1ZXN0LmRlc3RpbmF0aW9uKSkge1xuICAgIC8vIFRPRE9cbiAgfVxuXG4gIC8vIDE2LiBSdW4gbWFpbiBmZXRjaCBnaXZlbiBmZXRjaFBhcmFtcy5cbiAgbWFpbkZldGNoKGZldGNoUGFyYW1zKVxuICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci50ZXJtaW5hdGUoZXJyKVxuICAgIH0pXG5cbiAgLy8gMTcuIFJldHVybiBmZXRjaFBhcmFtJ3MgY29udHJvbGxlclxuICByZXR1cm4gZmV0Y2hQYXJhbXMuY29udHJvbGxlclxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1tYWluLWZldGNoXG5hc3luYyBmdW5jdGlvbiBtYWluRmV0Y2ggKGZldGNoUGFyYW1zLCByZWN1cnNpdmUgPSBmYWxzZSkge1xuICAvLyAxLiBMZXQgcmVxdWVzdCBiZSBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdC5cbiAgY29uc3QgcmVxdWVzdCA9IGZldGNoUGFyYW1zLnJlcXVlc3RcblxuICAvLyAyLiBMZXQgcmVzcG9uc2UgYmUgbnVsbC5cbiAgbGV0IHJlc3BvbnNlID0gbnVsbFxuXG4gIC8vIDMuIElmIHJlcXVlc3TigJlzIGxvY2FsLVVSTHMtb25seSBmbGFnIGlzIHNldCBhbmQgcmVxdWVzdOKAmXMgY3VycmVudCBVUkwgaXNcbiAgLy8gbm90IGxvY2FsLCB0aGVuIHNldCByZXNwb25zZSB0byBhIG5ldHdvcmsgZXJyb3IuXG4gIGlmIChyZXF1ZXN0LmxvY2FsVVJMc09ubHkgJiYgIXVybElzTG9jYWwocmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdCkpKSB7XG4gICAgcmVzcG9uc2UgPSBtYWtlTmV0d29ya0Vycm9yKCdsb2NhbCBVUkxzIG9ubHknKVxuICB9XG5cbiAgLy8gNC4gUnVuIHJlcG9ydCBDb250ZW50IFNlY3VyaXR5IFBvbGljeSB2aW9sYXRpb25zIGZvciByZXF1ZXN0LlxuICAvLyBUT0RPXG5cbiAgLy8gNS4gVXBncmFkZSByZXF1ZXN0IHRvIGEgcG90ZW50aWFsbHkgdHJ1c3R3b3J0aHkgVVJMLCBpZiBhcHByb3ByaWF0ZS5cbiAgdHJ5VXBncmFkZVJlcXVlc3RUb0FQb3RlbnRpYWxseVRydXN0d29ydGh5VVJMKHJlcXVlc3QpXG5cbiAgLy8gNi4gSWYgc2hvdWxkIHJlcXVlc3QgYmUgYmxvY2tlZCBkdWUgdG8gYSBiYWQgcG9ydCwgc2hvdWxkIGZldGNoaW5nIHJlcXVlc3RcbiAgLy8gYmUgYmxvY2tlZCBhcyBtaXhlZCBjb250ZW50LCBvciBzaG91bGQgcmVxdWVzdCBiZSBibG9ja2VkIGJ5IENvbnRlbnRcbiAgLy8gU2VjdXJpdHkgUG9saWN5IHJldHVybnMgYmxvY2tlZCwgdGhlbiBzZXQgcmVzcG9uc2UgdG8gYSBuZXR3b3JrIGVycm9yLlxuICBpZiAocmVxdWVzdEJhZFBvcnQocmVxdWVzdCkgPT09ICdibG9ja2VkJykge1xuICAgIHJlc3BvbnNlID0gbWFrZU5ldHdvcmtFcnJvcignYmFkIHBvcnQnKVxuICB9XG4gIC8vIFRPRE86IHNob3VsZCBmZXRjaGluZyByZXF1ZXN0IGJlIGJsb2NrZWQgYXMgbWl4ZWQgY29udGVudD9cbiAgLy8gVE9ETzogc2hvdWxkIHJlcXVlc3QgYmUgYmxvY2tlZCBieSBDb250ZW50IFNlY3VyaXR5IFBvbGljeT9cblxuICAvLyA3LiBJZiByZXF1ZXN04oCZcyByZWZlcnJlciBwb2xpY3kgaXMgdGhlIGVtcHR5IHN0cmluZywgdGhlbiBzZXQgcmVxdWVzdOKAmXNcbiAgLy8gcmVmZXJyZXIgcG9saWN5IHRvIHJlcXVlc3TigJlzIHBvbGljeSBjb250YWluZXLigJlzIHJlZmVycmVyIHBvbGljeS5cbiAgaWYgKHJlcXVlc3QucmVmZXJyZXJQb2xpY3kgPT09ICcnKSB7XG4gICAgcmVxdWVzdC5yZWZlcnJlclBvbGljeSA9IHJlcXVlc3QucG9saWN5Q29udGFpbmVyLnJlZmVycmVyUG9saWN5XG4gIH1cblxuICAvLyA4LiBJZiByZXF1ZXN04oCZcyByZWZlcnJlciBpcyBub3QgXCJuby1yZWZlcnJlclwiLCB0aGVuIHNldCByZXF1ZXN04oCZc1xuICAvLyByZWZlcnJlciB0byB0aGUgcmVzdWx0IG9mIGludm9raW5nIGRldGVybWluZSByZXF1ZXN04oCZcyByZWZlcnJlci5cbiAgaWYgKHJlcXVlc3QucmVmZXJyZXIgIT09ICduby1yZWZlcnJlcicpIHtcbiAgICByZXF1ZXN0LnJlZmVycmVyID0gZGV0ZXJtaW5lUmVxdWVzdHNSZWZlcnJlcihyZXF1ZXN0KVxuICB9XG5cbiAgLy8gOS4gU2V0IHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBzY2hlbWUgdG8gXCJodHRwc1wiIGlmIGFsbCBvZiB0aGUgZm9sbG93aW5nXG4gIC8vIGNvbmRpdGlvbnMgYXJlIHRydWU6XG4gIC8vIC0gcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIHNjaGVtZSBpcyBcImh0dHBcIlxuICAvLyAtIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBob3N0IGlzIGEgZG9tYWluXG4gIC8vIC0gTWF0Y2hpbmcgcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIGhvc3QgcGVyIEtub3duIEhTVFMgSG9zdCBEb21haW4gTmFtZVxuICAvLyAgIE1hdGNoaW5nIHJlc3VsdHMgaW4gZWl0aGVyIGEgc3VwZXJkb21haW4gbWF0Y2ggd2l0aCBhbiBhc3NlcnRlZFxuICAvLyAgIGluY2x1ZGVTdWJEb21haW5zIGRpcmVjdGl2ZSBvciBhIGNvbmdydWVudCBtYXRjaCAod2l0aCBvciB3aXRob3V0IGFuXG4gIC8vICAgYXNzZXJ0ZWQgaW5jbHVkZVN1YkRvbWFpbnMgZGlyZWN0aXZlKS4gW0hTVFNdXG4gIC8vIFRPRE9cblxuICAvLyAxMC4gSWYgcmVjdXJzaXZlIGlzIGZhbHNlLCB0aGVuIHJ1biB0aGUgcmVtYWluaW5nIHN0ZXBzIGluIHBhcmFsbGVsLlxuICAvLyBUT0RPXG5cbiAgLy8gMTEuIElmIHJlc3BvbnNlIGlzIG51bGwsIHRoZW4gc2V0IHJlc3BvbnNlIHRvIHRoZSByZXN1bHQgb2YgcnVubmluZ1xuICAvLyB0aGUgc3RlcHMgY29ycmVzcG9uZGluZyB0byB0aGUgZmlyc3QgbWF0Y2hpbmcgc3RhdGVtZW50OlxuICBpZiAocmVzcG9uc2UgPT09IG51bGwpIHtcbiAgICByZXNwb25zZSA9IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50VVJMID0gcmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdClcblxuICAgICAgaWYgKFxuICAgICAgICAvLyAtIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBvcmlnaW4gaXMgc2FtZSBvcmlnaW4gd2l0aCByZXF1ZXN04oCZcyBvcmlnaW4sXG4gICAgICAgIC8vICAgYW5kIHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nIGlzIFwiYmFzaWNcIlxuICAgICAgICAoc2FtZU9yaWdpbihjdXJyZW50VVJMLCByZXF1ZXN0LnVybCkgJiYgcmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnYmFzaWMnKSB8fFxuICAgICAgICAvLyByZXF1ZXN04oCZcyBjdXJyZW50IFVSTOKAmXMgc2NoZW1lIGlzIFwiZGF0YVwiXG4gICAgICAgIChjdXJyZW50VVJMLnByb3RvY29sID09PSAnZGF0YTonKSB8fFxuICAgICAgICAvLyAtIHJlcXVlc3TigJlzIG1vZGUgaXMgXCJuYXZpZ2F0ZVwiIG9yIFwid2Vic29ja2V0XCJcbiAgICAgICAgKHJlcXVlc3QubW9kZSA9PT0gJ25hdmlnYXRlJyB8fCByZXF1ZXN0Lm1vZGUgPT09ICd3ZWJzb2NrZXQnKVxuICAgICAgKSB7XG4gICAgICAgIC8vIDEuIFNldCByZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZyB0byBcImJhc2ljXCIuXG4gICAgICAgIHJlcXVlc3QucmVzcG9uc2VUYWludGluZyA9ICdiYXNpYydcblxuICAgICAgICAvLyAyLiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBydW5uaW5nIHNjaGVtZSBmZXRjaCBnaXZlbiBmZXRjaFBhcmFtcy5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHNjaGVtZUZldGNoKGZldGNoUGFyYW1zKVxuICAgICAgfVxuXG4gICAgICAvLyByZXF1ZXN04oCZcyBtb2RlIGlzIFwic2FtZS1vcmlnaW5cIlxuICAgICAgaWYgKHJlcXVlc3QubW9kZSA9PT0gJ3NhbWUtb3JpZ2luJykge1xuICAgICAgICAvLyAxLiBSZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICAgICAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcigncmVxdWVzdCBtb2RlIGNhbm5vdCBiZSBcInNhbWUtb3JpZ2luXCInKVxuICAgICAgfVxuXG4gICAgICAvLyByZXF1ZXN04oCZcyBtb2RlIGlzIFwibm8tY29yc1wiXG4gICAgICBpZiAocmVxdWVzdC5tb2RlID09PSAnbm8tY29ycycpIHtcbiAgICAgICAgLy8gMS4gSWYgcmVxdWVzdOKAmXMgcmVkaXJlY3QgbW9kZSBpcyBub3QgXCJmb2xsb3dcIiwgdGhlbiByZXR1cm4gYSBuZXR3b3JrXG4gICAgICAgIC8vIGVycm9yLlxuICAgICAgICBpZiAocmVxdWVzdC5yZWRpcmVjdCAhPT0gJ2ZvbGxvdycpIHtcbiAgICAgICAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcihcbiAgICAgICAgICAgICdyZWRpcmVjdCBtb2RlIGNhbm5vdCBiZSBcImZvbGxvd1wiIGZvciBcIm5vLWNvcnNcIiByZXF1ZXN0J1xuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDIuIFNldCByZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZyB0byBcIm9wYXF1ZVwiLlxuICAgICAgICByZXF1ZXN0LnJlc3BvbnNlVGFpbnRpbmcgPSAnb3BhcXVlJ1xuXG4gICAgICAgIC8vIDMuIFJldHVybiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgc2NoZW1lIGZldGNoIGdpdmVuIGZldGNoUGFyYW1zLlxuICAgICAgICByZXR1cm4gYXdhaXQgc2NoZW1lRmV0Y2goZmV0Y2hQYXJhbXMpXG4gICAgICB9XG5cbiAgICAgIC8vIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBzY2hlbWUgaXMgbm90IGFuIEhUVFAoUykgc2NoZW1lXG4gICAgICBpZiAoIXVybElzSHR0cEh0dHBzU2NoZW1lKHJlcXVlc3RDdXJyZW50VVJMKHJlcXVlc3QpKSkge1xuICAgICAgICAvLyBSZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICAgICAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcignVVJMIHNjaGVtZSBtdXN0IGJlIGEgSFRUUChTKSBzY2hlbWUnKVxuICAgICAgfVxuXG4gICAgICAvLyAtIHJlcXVlc3TigJlzIHVzZS1DT1JTLXByZWZsaWdodCBmbGFnIGlzIHNldFxuICAgICAgLy8gLSByZXF1ZXN04oCZcyB1bnNhZmUtcmVxdWVzdCBmbGFnIGlzIHNldCBhbmQgZWl0aGVyIHJlcXVlc3TigJlzIG1ldGhvZCBpc1xuICAgICAgLy8gICBub3QgYSBDT1JTLXNhZmVsaXN0ZWQgbWV0aG9kIG9yIENPUlMtdW5zYWZlIHJlcXVlc3QtaGVhZGVyIG5hbWVzIHdpdGhcbiAgICAgIC8vICAgcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgaXMgbm90IGVtcHR5XG4gICAgICAvLyAgICAxLiBTZXQgcmVxdWVzdOKAmXMgcmVzcG9uc2UgdGFpbnRpbmcgdG8gXCJjb3JzXCIuXG4gICAgICAvLyAgICAyLiBMZXQgY29yc1dpdGhQcmVmbGlnaHRSZXNwb25zZSBiZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgSFRUUCBmZXRjaFxuICAgICAgLy8gICAgZ2l2ZW4gZmV0Y2hQYXJhbXMgYW5kIHRydWUuXG4gICAgICAvLyAgICAzLiBJZiBjb3JzV2l0aFByZWZsaWdodFJlc3BvbnNlIGlzIGEgbmV0d29yayBlcnJvciwgdGhlbiBjbGVhciBjYWNoZVxuICAgICAgLy8gICAgZW50cmllcyB1c2luZyByZXF1ZXN0LlxuICAgICAgLy8gICAgNC4gUmV0dXJuIGNvcnNXaXRoUHJlZmxpZ2h0UmVzcG9uc2UuXG4gICAgICAvLyBUT0RPXG5cbiAgICAgIC8vIE90aGVyd2lzZVxuICAgICAgLy8gICAgMS4gU2V0IHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nIHRvIFwiY29yc1wiLlxuICAgICAgcmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID0gJ2NvcnMnXG5cbiAgICAgIC8vICAgIDIuIFJldHVybiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgSFRUUCBmZXRjaCBnaXZlbiBmZXRjaFBhcmFtcy5cbiAgICAgIHJldHVybiBhd2FpdCBodHRwRmV0Y2goZmV0Y2hQYXJhbXMpXG4gICAgfSkoKVxuICB9XG5cbiAgLy8gMTIuIElmIHJlY3Vyc2l2ZSBpcyB0cnVlLCB0aGVuIHJldHVybiByZXNwb25zZS5cbiAgaWYgKHJlY3Vyc2l2ZSkge1xuICAgIHJldHVybiByZXNwb25zZVxuICB9XG5cbiAgLy8gMTMuIElmIHJlc3BvbnNlIGlzIG5vdCBhIG5ldHdvcmsgZXJyb3IgYW5kIHJlc3BvbnNlIGlzIG5vdCBhIGZpbHRlcmVkXG4gIC8vIHJlc3BvbnNlLCB0aGVuOlxuICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAwICYmICFyZXNwb25zZS5pbnRlcm5hbFJlc3BvbnNlKSB7XG4gICAgLy8gSWYgcmVxdWVzdOKAmXMgcmVzcG9uc2UgdGFpbnRpbmcgaXMgXCJjb3JzXCIsIHRoZW46XG4gICAgaWYgKHJlcXVlc3QucmVzcG9uc2VUYWludGluZyA9PT0gJ2NvcnMnKSB7XG4gICAgICAvLyAxLiBMZXQgaGVhZGVyTmFtZXMgYmUgdGhlIHJlc3VsdCBvZiBleHRyYWN0aW5nIGhlYWRlciBsaXN0IHZhbHVlc1xuICAgICAgLy8gZ2l2ZW4gYEFjY2Vzcy1Db250cm9sLUV4cG9zZS1IZWFkZXJzYCBhbmQgcmVzcG9uc2XigJlzIGhlYWRlciBsaXN0LlxuICAgICAgLy8gVE9ET1xuICAgICAgLy8gMi4gSWYgcmVxdWVzdOKAmXMgY3JlZGVudGlhbHMgbW9kZSBpcyBub3QgXCJpbmNsdWRlXCIgYW5kIGhlYWRlck5hbWVzXG4gICAgICAvLyBjb250YWlucyBgKmAsIHRoZW4gc2V0IHJlc3BvbnNl4oCZcyBDT1JTLWV4cG9zZWQgaGVhZGVyLW5hbWUgbGlzdCB0b1xuICAgICAgLy8gYWxsIHVuaXF1ZSBoZWFkZXIgbmFtZXMgaW4gcmVzcG9uc2XigJlzIGhlYWRlciBsaXN0LlxuICAgICAgLy8gVE9ET1xuICAgICAgLy8gMy4gT3RoZXJ3aXNlLCBpZiBoZWFkZXJOYW1lcyBpcyBub3QgbnVsbCBvciBmYWlsdXJlLCB0aGVuIHNldFxuICAgICAgLy8gcmVzcG9uc2XigJlzIENPUlMtZXhwb3NlZCBoZWFkZXItbmFtZSBsaXN0IHRvIGhlYWRlck5hbWVzLlxuICAgICAgLy8gVE9ET1xuICAgIH1cblxuICAgIC8vIFNldCByZXNwb25zZSB0byB0aGUgZm9sbG93aW5nIGZpbHRlcmVkIHJlc3BvbnNlIHdpdGggcmVzcG9uc2UgYXMgaXRzXG4gICAgLy8gaW50ZXJuYWwgcmVzcG9uc2UsIGRlcGVuZGluZyBvbiByZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZzpcbiAgICBpZiAocmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnYmFzaWMnKSB7XG4gICAgICByZXNwb25zZSA9IGZpbHRlclJlc3BvbnNlKHJlc3BvbnNlLCAnYmFzaWMnKVxuICAgIH0gZWxzZSBpZiAocmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnY29ycycpIHtcbiAgICAgIHJlc3BvbnNlID0gZmlsdGVyUmVzcG9uc2UocmVzcG9uc2UsICdjb3JzJylcbiAgICB9IGVsc2UgaWYgKHJlcXVlc3QucmVzcG9uc2VUYWludGluZyA9PT0gJ29wYXF1ZScpIHtcbiAgICAgIHJlc3BvbnNlID0gZmlsdGVyUmVzcG9uc2UocmVzcG9uc2UsICdvcGFxdWUnKVxuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgLy8gMTQuIExldCBpbnRlcm5hbFJlc3BvbnNlIGJlIHJlc3BvbnNlLCBpZiByZXNwb25zZSBpcyBhIG5ldHdvcmsgZXJyb3IsXG4gIC8vIGFuZCByZXNwb25zZeKAmXMgaW50ZXJuYWwgcmVzcG9uc2Ugb3RoZXJ3aXNlLlxuICBsZXQgaW50ZXJuYWxSZXNwb25zZSA9XG4gICAgcmVzcG9uc2Uuc3RhdHVzID09PSAwID8gcmVzcG9uc2UgOiByZXNwb25zZS5pbnRlcm5hbFJlc3BvbnNlXG5cbiAgLy8gMTUuIElmIGludGVybmFsUmVzcG9uc2XigJlzIFVSTCBsaXN0IGlzIGVtcHR5LCB0aGVuIHNldCBpdCB0byBhIGNsb25lIG9mXG4gIC8vIHJlcXVlc3TigJlzIFVSTCBsaXN0LlxuICBpZiAoaW50ZXJuYWxSZXNwb25zZS51cmxMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIGludGVybmFsUmVzcG9uc2UudXJsTGlzdC5wdXNoKC4uLnJlcXVlc3QudXJsTGlzdClcbiAgfVxuXG4gIC8vIDE2LiBJZiByZXF1ZXN04oCZcyB0aW1pbmcgYWxsb3cgZmFpbGVkIGZsYWcgaXMgdW5zZXQsIHRoZW4gc2V0XG4gIC8vIGludGVybmFsUmVzcG9uc2XigJlzIHRpbWluZyBhbGxvdyBwYXNzZWQgZmxhZy5cbiAgaWYgKCFyZXF1ZXN0LnRpbWluZ0FsbG93RmFpbGVkKSB7XG4gICAgcmVzcG9uc2UudGltaW5nQWxsb3dQYXNzZWQgPSB0cnVlXG4gIH1cblxuICAvLyAxNy4gSWYgcmVzcG9uc2UgaXMgbm90IGEgbmV0d29yayBlcnJvciBhbmQgYW55IG9mIHRoZSBmb2xsb3dpbmcgcmV0dXJuc1xuICAvLyBibG9ja2VkXG4gIC8vIC0gc2hvdWxkIGludGVybmFsUmVzcG9uc2UgdG8gcmVxdWVzdCBiZSBibG9ja2VkIGFzIG1peGVkIGNvbnRlbnRcbiAgLy8gLSBzaG91bGQgaW50ZXJuYWxSZXNwb25zZSB0byByZXF1ZXN0IGJlIGJsb2NrZWQgYnkgQ29udGVudCBTZWN1cml0eSBQb2xpY3lcbiAgLy8gLSBzaG91bGQgaW50ZXJuYWxSZXNwb25zZSB0byByZXF1ZXN0IGJlIGJsb2NrZWQgZHVlIHRvIGl0cyBNSU1FIHR5cGVcbiAgLy8gLSBzaG91bGQgaW50ZXJuYWxSZXNwb25zZSB0byByZXF1ZXN0IGJlIGJsb2NrZWQgZHVlIHRvIG5vc25pZmZcbiAgLy8gVE9ET1xuXG4gIC8vIDE4LiBJZiByZXNwb25zZeKAmXMgdHlwZSBpcyBcIm9wYXF1ZVwiLCBpbnRlcm5hbFJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgMjA2LFxuICAvLyBpbnRlcm5hbFJlc3BvbnNl4oCZcyByYW5nZS1yZXF1ZXN0ZWQgZmxhZyBpcyBzZXQsIGFuZCByZXF1ZXN04oCZcyBoZWFkZXJcbiAgLy8gbGlzdCBkb2VzIG5vdCBjb250YWluIGBSYW5nZWAsIHRoZW4gc2V0IHJlc3BvbnNlIGFuZCBpbnRlcm5hbFJlc3BvbnNlXG4gIC8vIHRvIGEgbmV0d29yayBlcnJvci5cbiAgaWYgKFxuICAgIHJlc3BvbnNlLnR5cGUgPT09ICdvcGFxdWUnICYmXG4gICAgaW50ZXJuYWxSZXNwb25zZS5zdGF0dXMgPT09IDIwNiAmJlxuICAgIGludGVybmFsUmVzcG9uc2UucmFuZ2VSZXF1ZXN0ZWQgJiZcbiAgICAhcmVxdWVzdC5oZWFkZXJzLmNvbnRhaW5zKCdyYW5nZScpXG4gICkge1xuICAgIHJlc3BvbnNlID0gaW50ZXJuYWxSZXNwb25zZSA9IG1ha2VOZXR3b3JrRXJyb3IoKVxuICB9XG5cbiAgLy8gMTkuIElmIHJlc3BvbnNlIGlzIG5vdCBhIG5ldHdvcmsgZXJyb3IgYW5kIGVpdGhlciByZXF1ZXN04oCZcyBtZXRob2QgaXNcbiAgLy8gYEhFQURgIG9yIGBDT05ORUNUYCwgb3IgaW50ZXJuYWxSZXNwb25zZeKAmXMgc3RhdHVzIGlzIGEgbnVsbCBib2R5IHN0YXR1cyxcbiAgLy8gc2V0IGludGVybmFsUmVzcG9uc2XigJlzIGJvZHkgdG8gbnVsbCBhbmQgZGlzcmVnYXJkIGFueSBlbnF1ZXVpbmcgdG93YXJkXG4gIC8vIGl0IChpZiBhbnkpLlxuICBpZiAoXG4gICAgcmVzcG9uc2Uuc3RhdHVzICE9PSAwICYmXG4gICAgKHJlcXVlc3QubWV0aG9kID09PSAnSEVBRCcgfHxcbiAgICAgIHJlcXVlc3QubWV0aG9kID09PSAnQ09OTkVDVCcgfHxcbiAgICAgIG51bGxCb2R5U3RhdHVzLmluY2x1ZGVzKGludGVybmFsUmVzcG9uc2Uuc3RhdHVzKSlcbiAgKSB7XG4gICAgaW50ZXJuYWxSZXNwb25zZS5ib2R5ID0gbnVsbFxuICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuZHVtcCA9IHRydWVcbiAgfVxuXG4gIC8vIDIwLiBJZiByZXF1ZXN04oCZcyBpbnRlZ3JpdHkgbWV0YWRhdGEgaXMgbm90IHRoZSBlbXB0eSBzdHJpbmcsIHRoZW46XG4gIGlmIChyZXF1ZXN0LmludGVncml0eSkge1xuICAgIC8vIDEuIExldCBwcm9jZXNzQm9keUVycm9yIGJlIHRoaXMgc3RlcDogcnVuIGZldGNoIGZpbmFsZSBnaXZlbiBmZXRjaFBhcmFtc1xuICAgIC8vIGFuZCBhIG5ldHdvcmsgZXJyb3IuXG4gICAgY29uc3QgcHJvY2Vzc0JvZHlFcnJvciA9IChyZWFzb24pID0+XG4gICAgICBmZXRjaEZpbmFsZShmZXRjaFBhcmFtcywgbWFrZU5ldHdvcmtFcnJvcihyZWFzb24pKVxuXG4gICAgLy8gMi4gSWYgcmVxdWVzdOKAmXMgcmVzcG9uc2UgdGFpbnRpbmcgaXMgXCJvcGFxdWVcIiwgb3IgcmVzcG9uc2XigJlzIGJvZHkgaXMgbnVsbCxcbiAgICAvLyB0aGVuIHJ1biBwcm9jZXNzQm9keUVycm9yIGFuZCBhYm9ydCB0aGVzZSBzdGVwcy5cbiAgICBpZiAocmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnb3BhcXVlJyB8fCByZXNwb25zZS5ib2R5ID09IG51bGwpIHtcbiAgICAgIHByb2Nlc3NCb2R5RXJyb3IocmVzcG9uc2UuZXJyb3IpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyAzLiBMZXQgcHJvY2Vzc0JvZHkgZ2l2ZW4gYnl0ZXMgYmUgdGhlc2Ugc3RlcHM6XG4gICAgY29uc3QgcHJvY2Vzc0JvZHkgPSAoYnl0ZXMpID0+IHtcbiAgICAgIC8vIDEuIElmIGJ5dGVzIGRvIG5vdCBtYXRjaCByZXF1ZXN04oCZcyBpbnRlZ3JpdHkgbWV0YWRhdGEsXG4gICAgICAvLyB0aGVuIHJ1biBwcm9jZXNzQm9keUVycm9yIGFuZCBhYm9ydCB0aGVzZSBzdGVwcy4gW1NSSV1cbiAgICAgIGlmICghYnl0ZXNNYXRjaChieXRlcywgcmVxdWVzdC5pbnRlZ3JpdHkpKSB7XG4gICAgICAgIHByb2Nlc3NCb2R5RXJyb3IoJ2ludGVncml0eSBtaXNtYXRjaCcpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyAyLiBTZXQgcmVzcG9uc2XigJlzIGJvZHkgdG8gYnl0ZXMgYXMgYSBib2R5LlxuICAgICAgcmVzcG9uc2UuYm9keSA9IHNhZmVseUV4dHJhY3RCb2R5KGJ5dGVzKVswXVxuXG4gICAgICAvLyAzLiBSdW4gZmV0Y2ggZmluYWxlIGdpdmVuIGZldGNoUGFyYW1zIGFuZCByZXNwb25zZS5cbiAgICAgIGZldGNoRmluYWxlKGZldGNoUGFyYW1zLCByZXNwb25zZSlcbiAgICB9XG5cbiAgICAvLyA0LiBGdWxseSByZWFkIHJlc3BvbnNl4oCZcyBib2R5IGdpdmVuIHByb2Nlc3NCb2R5IGFuZCBwcm9jZXNzQm9keUVycm9yLlxuICAgIGF3YWl0IGZ1bGx5UmVhZEJvZHkocmVzcG9uc2UuYm9keSwgcHJvY2Vzc0JvZHksIHByb2Nlc3NCb2R5RXJyb3IpXG4gIH0gZWxzZSB7XG4gICAgLy8gMjEuIE90aGVyd2lzZSwgcnVuIGZldGNoIGZpbmFsZSBnaXZlbiBmZXRjaFBhcmFtcyBhbmQgcmVzcG9uc2UuXG4gICAgZmV0Y2hGaW5hbGUoZmV0Y2hQYXJhbXMsIHJlc3BvbnNlKVxuICB9XG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LXNjaGVtZS1mZXRjaFxuLy8gZ2l2ZW4gYSBmZXRjaCBwYXJhbXMgZmV0Y2hQYXJhbXNcbmZ1bmN0aW9uIHNjaGVtZUZldGNoIChmZXRjaFBhcmFtcykge1xuICAvLyBOb3RlOiBzaW5jZSB0aGUgY29ubmVjdGlvbiBpcyBkZXN0cm95ZWQgb24gcmVkaXJlY3QsIHdoaWNoIHNldHMgZmV0Y2hQYXJhbXMgdG8gYVxuICAvLyBjYW5jZWxsZWQgc3RhdGUsIHdlIGRvIG5vdCB3YW50IHRoaXMgY29uZGl0aW9uIHRvIHRyaWdnZXIgKnVubGVzcyogdGhlcmUgaGF2ZSBiZWVuXG4gIC8vIG5vIHJlZGlyZWN0cy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2lzc3Vlcy8xNzc2XG4gIC8vIDEuIElmIGZldGNoUGFyYW1zIGlzIGNhbmNlbGVkLCB0aGVuIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgbmV0d29yayBlcnJvciBmb3IgZmV0Y2hQYXJhbXMuXG4gIGlmIChpc0NhbmNlbGxlZChmZXRjaFBhcmFtcykgJiYgZmV0Y2hQYXJhbXMucmVxdWVzdC5yZWRpcmVjdENvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlQXBwcm9wcmlhdGVOZXR3b3JrRXJyb3IoZmV0Y2hQYXJhbXMpKVxuICB9XG5cbiAgLy8gMi4gTGV0IHJlcXVlc3QgYmUgZmV0Y2hQYXJhbXPigJlzIHJlcXVlc3QuXG4gIGNvbnN0IHsgcmVxdWVzdCB9ID0gZmV0Y2hQYXJhbXNcblxuICBjb25zdCB7IHByb3RvY29sOiBzY2hlbWUgfSA9IHJlcXVlc3RDdXJyZW50VVJMKHJlcXVlc3QpXG5cbiAgLy8gMy4gU3dpdGNoIG9uIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBzY2hlbWUgYW5kIHJ1biB0aGUgYXNzb2NpYXRlZCBzdGVwczpcbiAgc3dpdGNoIChzY2hlbWUpIHtcbiAgICBjYXNlICdhYm91dDonOiB7XG4gICAgICAvLyBJZiByZXF1ZXN04oCZcyBjdXJyZW50IFVSTOKAmXMgcGF0aCBpcyB0aGUgc3RyaW5nIFwiYmxhbmtcIiwgdGhlbiByZXR1cm4gYSBuZXcgcmVzcG9uc2VcbiAgICAgIC8vIHdob3NlIHN0YXR1cyBtZXNzYWdlIGlzIGBPS2AsIGhlYWRlciBsaXN0IGlzIMKrIChgQ29udGVudC1UeXBlYCwgYHRleHQvaHRtbDtjaGFyc2V0PXV0Zi04YCkgwrssXG4gICAgICAvLyBhbmQgYm9keSBpcyB0aGUgZW1wdHkgYnl0ZSBzZXF1ZW5jZSBhcyBhIGJvZHkuXG5cbiAgICAgIC8vIE90aGVyd2lzZSwgcmV0dXJuIGEgbmV0d29yayBlcnJvci5cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFrZU5ldHdvcmtFcnJvcignYWJvdXQgc2NoZW1lIGlzIG5vdCBzdXBwb3J0ZWQnKSlcbiAgICB9XG4gICAgY2FzZSAnYmxvYjonOiB7XG4gICAgICBpZiAoIXJlc29sdmVPYmplY3RVUkwpIHtcbiAgICAgICAgcmVzb2x2ZU9iamVjdFVSTCA9IHJlcXVpcmUoJ2J1ZmZlcicpLnJlc29sdmVPYmplY3RVUkxcbiAgICAgIH1cblxuICAgICAgLy8gMS4gTGV0IGJsb2JVUkxFbnRyeSBiZSByZXF1ZXN04oCZcyBjdXJyZW50IFVSTOKAmXMgYmxvYiBVUkwgZW50cnkuXG4gICAgICBjb25zdCBibG9iVVJMRW50cnkgPSByZXF1ZXN0Q3VycmVudFVSTChyZXF1ZXN0KVxuXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vd2ViLXBsYXRmb3JtLXRlc3RzL3dwdC9ibG9iLzdiMGViYWNjYzYyYjU2NmExOTY1Mzk2ZTViZTdiYjJiYzA2Zjg0MWYvRmlsZUFQSS91cmwvcmVzb3VyY2VzL2ZldGNoLXRlc3RzLmpzI0w1Mi1MNTZcbiAgICAgIC8vIEJ1ZmZlci5yZXNvbHZlT2JqZWN0VVJMIGRvZXMgbm90IGlnbm9yZSBVUkwgcXVlcmllcy5cbiAgICAgIGlmIChibG9iVVJMRW50cnkuc2VhcmNoLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VOZXR3b3JrRXJyb3IoJ05ldHdvcmtFcnJvciB3aGVuIGF0dGVtcHRpbmcgdG8gZmV0Y2ggcmVzb3VyY2UuJykpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJsb2JVUkxFbnRyeU9iamVjdCA9IHJlc29sdmVPYmplY3RVUkwoYmxvYlVSTEVudHJ5LnRvU3RyaW5nKCkpXG5cbiAgICAgIC8vIDIuIElmIHJlcXVlc3TigJlzIG1ldGhvZCBpcyBub3QgYEdFVGAsIGJsb2JVUkxFbnRyeSBpcyBudWxsLCBvciBibG9iVVJMRW50cnnigJlzXG4gICAgICAvLyAgICBvYmplY3QgaXMgbm90IGEgQmxvYiBvYmplY3QsIHRoZW4gcmV0dXJuIGEgbmV0d29yayBlcnJvci5cbiAgICAgIGlmIChyZXF1ZXN0Lm1ldGhvZCAhPT0gJ0dFVCcgfHwgIWlzQmxvYkxpa2UoYmxvYlVSTEVudHJ5T2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VOZXR3b3JrRXJyb3IoJ2ludmFsaWQgbWV0aG9kJykpXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIExldCBib2R5V2l0aFR5cGUgYmUgdGhlIHJlc3VsdCBvZiBzYWZlbHkgZXh0cmFjdGluZyBibG9iVVJMRW50cnnigJlzIG9iamVjdC5cbiAgICAgIGNvbnN0IGJvZHlXaXRoVHlwZSA9IHNhZmVseUV4dHJhY3RCb2R5KGJsb2JVUkxFbnRyeU9iamVjdClcblxuICAgICAgLy8gNC4gTGV0IGJvZHkgYmUgYm9keVdpdGhUeXBl4oCZcyBib2R5LlxuICAgICAgY29uc3QgYm9keSA9IGJvZHlXaXRoVHlwZVswXVxuXG4gICAgICAvLyA1LiBMZXQgbGVuZ3RoIGJlIGJvZHnigJlzIGxlbmd0aCwgc2VyaWFsaXplZCBhbmQgaXNvbW9ycGhpYyBlbmNvZGVkLlxuICAgICAgY29uc3QgbGVuZ3RoID0gaXNvbW9ycGhpY0VuY29kZShgJHtib2R5Lmxlbmd0aH1gKVxuXG4gICAgICAvLyA2LiBMZXQgdHlwZSBiZSBib2R5V2l0aFR5cGXigJlzIHR5cGUgaWYgaXQgaXMgbm9uLW51bGw7IG90aGVyd2lzZSB0aGUgZW1wdHkgYnl0ZSBzZXF1ZW5jZS5cbiAgICAgIGNvbnN0IHR5cGUgPSBib2R5V2l0aFR5cGVbMV0gPz8gJydcblxuICAgICAgLy8gNy4gUmV0dXJuIGEgbmV3IHJlc3BvbnNlIHdob3NlIHN0YXR1cyBtZXNzYWdlIGlzIGBPS2AsIGhlYWRlciBsaXN0IGlzXG4gICAgICAvLyAgICDCqyAoYENvbnRlbnQtTGVuZ3RoYCwgbGVuZ3RoKSwgKGBDb250ZW50LVR5cGVgLCB0eXBlKSDCuywgYW5kIGJvZHkgaXMgYm9keS5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gbWFrZVJlc3BvbnNlKHtcbiAgICAgICAgc3RhdHVzVGV4dDogJ09LJyxcbiAgICAgICAgaGVhZGVyc0xpc3Q6IFtcbiAgICAgICAgICBbJ2NvbnRlbnQtbGVuZ3RoJywgeyBuYW1lOiAnQ29udGVudC1MZW5ndGgnLCB2YWx1ZTogbGVuZ3RoIH1dLFxuICAgICAgICAgIFsnY29udGVudC10eXBlJywgeyBuYW1lOiAnQ29udGVudC1UeXBlJywgdmFsdWU6IHR5cGUgfV1cbiAgICAgICAgXVxuICAgICAgfSlcblxuICAgICAgcmVzcG9uc2UuYm9keSA9IGJvZHlcblxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSlcbiAgICB9XG4gICAgY2FzZSAnZGF0YTonOiB7XG4gICAgICAvLyAxLiBMZXQgZGF0YVVSTFN0cnVjdCBiZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgdGhlXG4gICAgICAvLyAgICBkYXRhOiBVUkwgcHJvY2Vzc29yIG9uIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJMLlxuICAgICAgY29uc3QgY3VycmVudFVSTCA9IHJlcXVlc3RDdXJyZW50VVJMKHJlcXVlc3QpXG4gICAgICBjb25zdCBkYXRhVVJMU3RydWN0ID0gZGF0YVVSTFByb2Nlc3NvcihjdXJyZW50VVJMKVxuXG4gICAgICAvLyAyLiBJZiBkYXRhVVJMU3RydWN0IGlzIGZhaWx1cmUsIHRoZW4gcmV0dXJuIGFcbiAgICAgIC8vICAgIG5ldHdvcmsgZXJyb3IuXG4gICAgICBpZiAoZGF0YVVSTFN0cnVjdCA9PT0gJ2ZhaWx1cmUnKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFrZU5ldHdvcmtFcnJvcignZmFpbGVkIHRvIGZldGNoIHRoZSBkYXRhIFVSTCcpKVxuICAgICAgfVxuXG4gICAgICAvLyAzLiBMZXQgbWltZVR5cGUgYmUgZGF0YVVSTFN0cnVjdOKAmXMgTUlNRSB0eXBlLCBzZXJpYWxpemVkLlxuICAgICAgY29uc3QgbWltZVR5cGUgPSBzZXJpYWxpemVBTWltZVR5cGUoZGF0YVVSTFN0cnVjdC5taW1lVHlwZSlcblxuICAgICAgLy8gNC4gUmV0dXJuIGEgcmVzcG9uc2Ugd2hvc2Ugc3RhdHVzIG1lc3NhZ2UgaXMgYE9LYCxcbiAgICAgIC8vICAgIGhlYWRlciBsaXN0IGlzIMKrIChgQ29udGVudC1UeXBlYCwgbWltZVR5cGUpIMK7LFxuICAgICAgLy8gICAgYW5kIGJvZHkgaXMgZGF0YVVSTFN0cnVjdOKAmXMgYm9keSBhcyBhIGJvZHkuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VSZXNwb25zZSh7XG4gICAgICAgIHN0YXR1c1RleHQ6ICdPSycsXG4gICAgICAgIGhlYWRlcnNMaXN0OiBbXG4gICAgICAgICAgWydjb250ZW50LXR5cGUnLCB7IG5hbWU6ICdDb250ZW50LVR5cGUnLCB2YWx1ZTogbWltZVR5cGUgfV1cbiAgICAgICAgXSxcbiAgICAgICAgYm9keTogc2FmZWx5RXh0cmFjdEJvZHkoZGF0YVVSTFN0cnVjdC5ib2R5KVswXVxuICAgICAgfSkpXG4gICAgfVxuICAgIGNhc2UgJ2ZpbGU6Jzoge1xuICAgICAgLy8gRm9yIG5vdywgdW5mb3J0dW5hdGUgYXMgaXQgaXMsIGZpbGUgVVJMcyBhcmUgbGVmdCBhcyBhbiBleGVyY2lzZSBmb3IgdGhlIHJlYWRlci5cbiAgICAgIC8vIFdoZW4gaW4gZG91YnQsIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VOZXR3b3JrRXJyb3IoJ25vdCBpbXBsZW1lbnRlZC4uLiB5ZXQuLi4nKSlcbiAgICB9XG4gICAgY2FzZSAnaHR0cDonOlxuICAgIGNhc2UgJ2h0dHBzOic6IHtcbiAgICAgIC8vIFJldHVybiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgSFRUUCBmZXRjaCBnaXZlbiBmZXRjaFBhcmFtcy5cblxuICAgICAgcmV0dXJuIGh0dHBGZXRjaChmZXRjaFBhcmFtcylcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IG1ha2VOZXR3b3JrRXJyb3IoZXJyKSlcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlTmV0d29ya0Vycm9yKCd1bmtub3duIHNjaGVtZScpKVxuICAgIH1cbiAgfVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZmluYWxpemUtcmVzcG9uc2VcbmZ1bmN0aW9uIGZpbmFsaXplUmVzcG9uc2UgKGZldGNoUGFyYW1zLCByZXNwb25zZSkge1xuICAvLyAxLiBTZXQgZmV0Y2hQYXJhbXPigJlzIHJlcXVlc3TigJlzIGRvbmUgZmxhZy5cbiAgZmV0Y2hQYXJhbXMucmVxdWVzdC5kb25lID0gdHJ1ZVxuXG4gIC8vIDIsIElmIGZldGNoUGFyYW1z4oCZcyBwcm9jZXNzIHJlc3BvbnNlIGRvbmUgaXMgbm90IG51bGwsIHRoZW4gcXVldWUgYSBmZXRjaFxuICAvLyB0YXNrIHRvIHJ1biBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXNwb25zZSBkb25lIGdpdmVuIHJlc3BvbnNlLCB3aXRoXG4gIC8vIGZldGNoUGFyYW1z4oCZcyB0YXNrIGRlc3RpbmF0aW9uLlxuICBpZiAoZmV0Y2hQYXJhbXMucHJvY2Vzc1Jlc3BvbnNlRG9uZSAhPSBudWxsKSB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gZmV0Y2hQYXJhbXMucHJvY2Vzc1Jlc3BvbnNlRG9uZShyZXNwb25zZSkpXG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2ZldGNoLWZpbmFsZVxuZnVuY3Rpb24gZmV0Y2hGaW5hbGUgKGZldGNoUGFyYW1zLCByZXNwb25zZSkge1xuICAvLyAxLiBJZiByZXNwb25zZSBpcyBhIG5ldHdvcmsgZXJyb3IsIHRoZW46XG4gIGlmIChyZXNwb25zZS50eXBlID09PSAnZXJyb3InKSB7XG4gICAgLy8gMS4gU2V0IHJlc3BvbnNl4oCZcyBVUkwgbGlzdCB0byDCqyBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdOKAmXMgVVJMIGxpc3RbMF0gwrsuXG4gICAgcmVzcG9uc2UudXJsTGlzdCA9IFtmZXRjaFBhcmFtcy5yZXF1ZXN0LnVybExpc3RbMF1dXG5cbiAgICAvLyAyLiBTZXQgcmVzcG9uc2XigJlzIHRpbWluZyBpbmZvIHRvIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYW4gb3BhcXVlIHRpbWluZ1xuICAgIC8vIGluZm8gZm9yIGZldGNoUGFyYW1z4oCZcyB0aW1pbmcgaW5mby5cbiAgICByZXNwb25zZS50aW1pbmdJbmZvID0gY3JlYXRlT3BhcXVlVGltaW5nSW5mbyh7XG4gICAgICBzdGFydFRpbWU6IGZldGNoUGFyYW1zLnRpbWluZ0luZm8uc3RhcnRUaW1lXG4gICAgfSlcbiAgfVxuXG4gIC8vIDIuIExldCBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHkgYmUgdGhlIGZvbGxvd2luZyBzdGVwczpcbiAgY29uc3QgcHJvY2Vzc1Jlc3BvbnNlRW5kT2ZCb2R5ID0gKCkgPT4ge1xuICAgIC8vIDEuIFNldCBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdOKAmXMgZG9uZSBmbGFnLlxuICAgIGZldGNoUGFyYW1zLnJlcXVlc3QuZG9uZSA9IHRydWVcblxuICAgIC8vIElmIGZldGNoUGFyYW1z4oCZcyBwcm9jZXNzIHJlc3BvbnNlIGVuZC1vZi1ib2R5IGlzIG5vdCBudWxsLFxuICAgIC8vIHRoZW4gcXVldWUgYSBmZXRjaCB0YXNrIHRvIHJ1biBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXNwb25zZVxuICAgIC8vIGVuZC1vZi1ib2R5IGdpdmVuIHJlc3BvbnNlIHdpdGggZmV0Y2hQYXJhbXPigJlzIHRhc2sgZGVzdGluYXRpb24uXG4gICAgaWYgKGZldGNoUGFyYW1zLnByb2Nlc3NSZXNwb25zZUVuZE9mQm9keSAhPSBudWxsKSB7XG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBmZXRjaFBhcmFtcy5wcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHkocmVzcG9uc2UpKVxuICAgIH1cbiAgfVxuXG4gIC8vIDMuIElmIGZldGNoUGFyYW1z4oCZcyBwcm9jZXNzIHJlc3BvbnNlIGlzIG5vbi1udWxsLCB0aGVuIHF1ZXVlIGEgZmV0Y2ggdGFza1xuICAvLyB0byBydW4gZmV0Y2hQYXJhbXPigJlzIHByb2Nlc3MgcmVzcG9uc2UgZ2l2ZW4gcmVzcG9uc2UsIHdpdGggZmV0Y2hQYXJhbXPigJlzXG4gIC8vIHRhc2sgZGVzdGluYXRpb24uXG4gIGlmIChmZXRjaFBhcmFtcy5wcm9jZXNzUmVzcG9uc2UgIT0gbnVsbCkge1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IGZldGNoUGFyYW1zLnByb2Nlc3NSZXNwb25zZShyZXNwb25zZSkpXG4gIH1cblxuICAvLyA0LiBJZiByZXNwb25zZeKAmXMgYm9keSBpcyBudWxsLCB0aGVuIHJ1biBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHkuXG4gIGlmIChyZXNwb25zZS5ib2R5ID09IG51bGwpIHtcbiAgICBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHkoKVxuICB9IGVsc2Uge1xuICAvLyA1LiBPdGhlcndpc2U6XG5cbiAgICAvLyAxLiBMZXQgdHJhbnNmb3JtU3RyZWFtIGJlIGEgbmV3IGEgVHJhbnNmb3JtU3RyZWFtLlxuXG4gICAgLy8gMi4gTGV0IGlkZW50aXR5VHJhbnNmb3JtQWxnb3JpdGhtIGJlIGFuIGFsZ29yaXRobSB3aGljaCwgZ2l2ZW4gY2h1bmssXG4gICAgLy8gZW5xdWV1ZXMgY2h1bmsgaW4gdHJhbnNmb3JtU3RyZWFtLlxuICAgIGNvbnN0IGlkZW50aXR5VHJhbnNmb3JtQWxnb3JpdGhtID0gKGNodW5rLCBjb250cm9sbGVyKSA9PiB7XG4gICAgICBjb250cm9sbGVyLmVucXVldWUoY2h1bmspXG4gICAgfVxuXG4gICAgLy8gMy4gU2V0IHVwIHRyYW5zZm9ybVN0cmVhbSB3aXRoIHRyYW5zZm9ybUFsZ29yaXRobSBzZXQgdG8gaWRlbnRpdHlUcmFuc2Zvcm1BbGdvcml0aG1cbiAgICAvLyBhbmQgZmx1c2hBbGdvcml0aG0gc2V0IHRvIHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keS5cbiAgICBjb25zdCB0cmFuc2Zvcm1TdHJlYW0gPSBuZXcgVHJhbnNmb3JtU3RyZWFtKHtcbiAgICAgIHN0YXJ0ICgpIHt9LFxuICAgICAgdHJhbnNmb3JtOiBpZGVudGl0eVRyYW5zZm9ybUFsZ29yaXRobSxcbiAgICAgIGZsdXNoOiBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHlcbiAgICB9LCB7XG4gICAgICBzaXplICgpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBzaXplICgpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gNC4gU2V0IHJlc3BvbnNl4oCZcyBib2R5IHRvIHRoZSByZXN1bHQgb2YgcGlwaW5nIHJlc3BvbnNl4oCZcyBib2R5IHRocm91Z2ggdHJhbnNmb3JtU3RyZWFtLlxuICAgIHJlc3BvbnNlLmJvZHkgPSB7IHN0cmVhbTogcmVzcG9uc2UuYm9keS5zdHJlYW0ucGlwZVRocm91Z2godHJhbnNmb3JtU3RyZWFtKSB9XG4gIH1cblxuICAvLyA2LiBJZiBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXNwb25zZSBjb25zdW1lIGJvZHkgaXMgbm9uLW51bGwsIHRoZW46XG4gIGlmIChmZXRjaFBhcmFtcy5wcm9jZXNzUmVzcG9uc2VDb25zdW1lQm9keSAhPSBudWxsKSB7XG4gICAgLy8gMS4gTGV0IHByb2Nlc3NCb2R5IGdpdmVuIG51bGxPckJ5dGVzIGJlIHRoaXMgc3RlcDogcnVuIGZldGNoUGFyYW1z4oCZc1xuICAgIC8vIHByb2Nlc3MgcmVzcG9uc2UgY29uc3VtZSBib2R5IGdpdmVuIHJlc3BvbnNlIGFuZCBudWxsT3JCeXRlcy5cbiAgICBjb25zdCBwcm9jZXNzQm9keSA9IChudWxsT3JCeXRlcykgPT4gZmV0Y2hQYXJhbXMucHJvY2Vzc1Jlc3BvbnNlQ29uc3VtZUJvZHkocmVzcG9uc2UsIG51bGxPckJ5dGVzKVxuXG4gICAgLy8gMi4gTGV0IHByb2Nlc3NCb2R5RXJyb3IgYmUgdGhpcyBzdGVwOiBydW4gZmV0Y2hQYXJhbXPigJlzIHByb2Nlc3NcbiAgICAvLyByZXNwb25zZSBjb25zdW1lIGJvZHkgZ2l2ZW4gcmVzcG9uc2UgYW5kIGZhaWx1cmUuXG4gICAgY29uc3QgcHJvY2Vzc0JvZHlFcnJvciA9IChmYWlsdXJlKSA9PiBmZXRjaFBhcmFtcy5wcm9jZXNzUmVzcG9uc2VDb25zdW1lQm9keShyZXNwb25zZSwgZmFpbHVyZSlcblxuICAgIC8vIDMuIElmIHJlc3BvbnNl4oCZcyBib2R5IGlzIG51bGwsIHRoZW4gcXVldWUgYSBmZXRjaCB0YXNrIHRvIHJ1biBwcm9jZXNzQm9keVxuICAgIC8vIGdpdmVuIG51bGwsIHdpdGggZmV0Y2hQYXJhbXPigJlzIHRhc2sgZGVzdGluYXRpb24uXG4gICAgaWYgKHJlc3BvbnNlLmJvZHkgPT0gbnVsbCkge1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gcHJvY2Vzc0JvZHkobnVsbCkpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDQuIE90aGVyd2lzZSwgZnVsbHkgcmVhZCByZXNwb25zZeKAmXMgYm9keSBnaXZlbiBwcm9jZXNzQm9keSwgcHJvY2Vzc0JvZHlFcnJvcixcbiAgICAgIC8vIGFuZCBmZXRjaFBhcmFtc+KAmXMgdGFzayBkZXN0aW5hdGlvbi5cbiAgICAgIHJldHVybiBmdWxseVJlYWRCb2R5KHJlc3BvbnNlLmJvZHksIHByb2Nlc3NCb2R5LCBwcm9jZXNzQm9keUVycm9yKVxuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgfVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaHR0cC1mZXRjaFxuYXN5bmMgZnVuY3Rpb24gaHR0cEZldGNoIChmZXRjaFBhcmFtcykge1xuICAvLyAxLiBMZXQgcmVxdWVzdCBiZSBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdC5cbiAgY29uc3QgcmVxdWVzdCA9IGZldGNoUGFyYW1zLnJlcXVlc3RcblxuICAvLyAyLiBMZXQgcmVzcG9uc2UgYmUgbnVsbC5cbiAgbGV0IHJlc3BvbnNlID0gbnVsbFxuXG4gIC8vIDMuIExldCBhY3R1YWxSZXNwb25zZSBiZSBudWxsLlxuICBsZXQgYWN0dWFsUmVzcG9uc2UgPSBudWxsXG5cbiAgLy8gNC4gTGV0IHRpbWluZ0luZm8gYmUgZmV0Y2hQYXJhbXPigJlzIHRpbWluZyBpbmZvLlxuICBjb25zdCB0aW1pbmdJbmZvID0gZmV0Y2hQYXJhbXMudGltaW5nSW5mb1xuXG4gIC8vIDUuIElmIHJlcXVlc3TigJlzIHNlcnZpY2Utd29ya2VycyBtb2RlIGlzIFwiYWxsXCIsIHRoZW46XG4gIGlmIChyZXF1ZXN0LnNlcnZpY2VXb3JrZXJzID09PSAnYWxsJykge1xuICAgIC8vIFRPRE9cbiAgfVxuXG4gIC8vIDYuIElmIHJlc3BvbnNlIGlzIG51bGwsIHRoZW46XG4gIGlmIChyZXNwb25zZSA9PT0gbnVsbCkge1xuICAgIC8vIDEuIElmIG1ha2VDT1JTUHJlZmxpZ2h0IGlzIHRydWUgYW5kIG9uZSBvZiB0aGVzZSBjb25kaXRpb25zIGlzIHRydWU6XG4gICAgLy8gVE9ET1xuXG4gICAgLy8gMi4gSWYgcmVxdWVzdOKAmXMgcmVkaXJlY3QgbW9kZSBpcyBcImZvbGxvd1wiLCB0aGVuIHNldCByZXF1ZXN04oCZc1xuICAgIC8vIHNlcnZpY2Utd29ya2VycyBtb2RlIHRvIFwibm9uZVwiLlxuICAgIGlmIChyZXF1ZXN0LnJlZGlyZWN0ID09PSAnZm9sbG93Jykge1xuICAgICAgcmVxdWVzdC5zZXJ2aWNlV29ya2VycyA9ICdub25lJ1xuICAgIH1cblxuICAgIC8vIDMuIFNldCByZXNwb25zZSBhbmQgYWN0dWFsUmVzcG9uc2UgdG8gdGhlIHJlc3VsdCBvZiBydW5uaW5nXG4gICAgLy8gSFRUUC1uZXR3b3JrLW9yLWNhY2hlIGZldGNoIGdpdmVuIGZldGNoUGFyYW1zLlxuICAgIGFjdHVhbFJlc3BvbnNlID0gcmVzcG9uc2UgPSBhd2FpdCBodHRwTmV0d29ya09yQ2FjaGVGZXRjaChmZXRjaFBhcmFtcylcblxuICAgIC8vIDQuIElmIHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nIGlzIFwiY29yc1wiIGFuZCBhIENPUlMgY2hlY2tcbiAgICAvLyBmb3IgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcmV0dXJucyBmYWlsdXJlLCB0aGVuIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG4gICAgaWYgKFxuICAgICAgcmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnY29ycycgJiZcbiAgICAgIGNvcnNDaGVjayhyZXF1ZXN0LCByZXNwb25zZSkgPT09ICdmYWlsdXJlJ1xuICAgICkge1xuICAgICAgcmV0dXJuIG1ha2VOZXR3b3JrRXJyb3IoJ2NvcnMgZmFpbHVyZScpXG4gICAgfVxuXG4gICAgLy8gNS4gSWYgdGhlIFRBTyBjaGVjayBmb3IgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcmV0dXJucyBmYWlsdXJlLCB0aGVuIHNldFxuICAgIC8vIHJlcXVlc3TigJlzIHRpbWluZyBhbGxvdyBmYWlsZWQgZmxhZy5cbiAgICBpZiAoVEFPQ2hlY2socmVxdWVzdCwgcmVzcG9uc2UpID09PSAnZmFpbHVyZScpIHtcbiAgICAgIHJlcXVlc3QudGltaW5nQWxsb3dGYWlsZWQgPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgLy8gNy4gSWYgZWl0aGVyIHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nIG9yIHJlc3BvbnNl4oCZcyB0eXBlXG4gIC8vIGlzIFwib3BhcXVlXCIsIGFuZCB0aGUgY3Jvc3Mtb3JpZ2luIHJlc291cmNlIHBvbGljeSBjaGVjayB3aXRoXG4gIC8vIHJlcXVlc3TigJlzIG9yaWdpbiwgcmVxdWVzdOKAmXMgY2xpZW50LCByZXF1ZXN04oCZcyBkZXN0aW5hdGlvbixcbiAgLy8gYW5kIGFjdHVhbFJlc3BvbnNlIHJldHVybnMgYmxvY2tlZCwgdGhlbiByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICBpZiAoXG4gICAgKHJlcXVlc3QucmVzcG9uc2VUYWludGluZyA9PT0gJ29wYXF1ZScgfHwgcmVzcG9uc2UudHlwZSA9PT0gJ29wYXF1ZScpICYmXG4gICAgY3Jvc3NPcmlnaW5SZXNvdXJjZVBvbGljeUNoZWNrKFxuICAgICAgcmVxdWVzdC5vcmlnaW4sXG4gICAgICByZXF1ZXN0LmNsaWVudCxcbiAgICAgIHJlcXVlc3QuZGVzdGluYXRpb24sXG4gICAgICBhY3R1YWxSZXNwb25zZVxuICAgICkgPT09ICdibG9ja2VkJ1xuICApIHtcbiAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcignYmxvY2tlZCcpXG4gIH1cblxuICAvLyA4LiBJZiBhY3R1YWxSZXNwb25zZeKAmXMgc3RhdHVzIGlzIGEgcmVkaXJlY3Qgc3RhdHVzLCB0aGVuOlxuICBpZiAocmVkaXJlY3RTdGF0dXNTZXQuaGFzKGFjdHVhbFJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICAvLyAxLiBJZiBhY3R1YWxSZXNwb25zZeKAmXMgc3RhdHVzIGlzIG5vdCAzMDMsIHJlcXVlc3TigJlzIGJvZHkgaXMgbm90IG51bGwsXG4gICAgLy8gYW5kIHRoZSBjb25uZWN0aW9uIHVzZXMgSFRUUC8yLCB0aGVuIHVzZXIgYWdlbnRzIG1heSwgYW5kIGFyZSBldmVuXG4gICAgLy8gZW5jb3VyYWdlZCB0bywgdHJhbnNtaXQgYW4gUlNUX1NUUkVBTSBmcmFtZS5cbiAgICAvLyBTZWUsIGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvZmV0Y2gvaXNzdWVzLzEyODhcbiAgICBpZiAocmVxdWVzdC5yZWRpcmVjdCAhPT0gJ21hbnVhbCcpIHtcbiAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29ubmVjdGlvbi5kZXN0cm95KClcbiAgICB9XG5cbiAgICAvLyAyLiBTd2l0Y2ggb24gcmVxdWVzdOKAmXMgcmVkaXJlY3QgbW9kZTpcbiAgICBpZiAocmVxdWVzdC5yZWRpcmVjdCA9PT0gJ2Vycm9yJykge1xuICAgICAgLy8gU2V0IHJlc3BvbnNlIHRvIGEgbmV0d29yayBlcnJvci5cbiAgICAgIHJlc3BvbnNlID0gbWFrZU5ldHdvcmtFcnJvcigndW5leHBlY3RlZCByZWRpcmVjdCcpXG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0LnJlZGlyZWN0ID09PSAnbWFudWFsJykge1xuICAgICAgLy8gU2V0IHJlc3BvbnNlIHRvIGFuIG9wYXF1ZS1yZWRpcmVjdCBmaWx0ZXJlZCByZXNwb25zZSB3aG9zZSBpbnRlcm5hbFxuICAgICAgLy8gcmVzcG9uc2UgaXMgYWN0dWFsUmVzcG9uc2UuXG4gICAgICAvLyBOT1RFKHNwZWMpOiBPbiB0aGUgd2ViIHRoaXMgd291bGQgcmV0dXJuIGFuIGBvcGFxdWVyZWRpcmVjdGAgcmVzcG9uc2UsXG4gICAgICAvLyBidXQgdGhhdCBkb2Vzbid0IG1ha2Ugc2Vuc2Ugc2VydmVyIHNpZGUuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzExOTMuXG4gICAgICByZXNwb25zZSA9IGFjdHVhbFJlc3BvbnNlXG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0LnJlZGlyZWN0ID09PSAnZm9sbG93Jykge1xuICAgICAgLy8gU2V0IHJlc3BvbnNlIHRvIHRoZSByZXN1bHQgb2YgcnVubmluZyBIVFRQLXJlZGlyZWN0IGZldGNoIGdpdmVuXG4gICAgICAvLyBmZXRjaFBhcmFtcyBhbmQgcmVzcG9uc2UuXG4gICAgICByZXNwb25zZSA9IGF3YWl0IGh0dHBSZWRpcmVjdEZldGNoKGZldGNoUGFyYW1zLCByZXNwb25zZSlcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGZhbHNlKVxuICAgIH1cbiAgfVxuXG4gIC8vIDkuIFNldCByZXNwb25zZeKAmXMgdGltaW5nIGluZm8gdG8gdGltaW5nSW5mby5cbiAgcmVzcG9uc2UudGltaW5nSW5mbyA9IHRpbWluZ0luZm9cblxuICAvLyAxMC4gUmV0dXJuIHJlc3BvbnNlLlxuICByZXR1cm4gcmVzcG9uc2Vcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtcmVkaXJlY3QtZmV0Y2hcbmZ1bmN0aW9uIGh0dHBSZWRpcmVjdEZldGNoIChmZXRjaFBhcmFtcywgcmVzcG9uc2UpIHtcbiAgLy8gMS4gTGV0IHJlcXVlc3QgYmUgZmV0Y2hQYXJhbXPigJlzIHJlcXVlc3QuXG4gIGNvbnN0IHJlcXVlc3QgPSBmZXRjaFBhcmFtcy5yZXF1ZXN0XG5cbiAgLy8gMi4gTGV0IGFjdHVhbFJlc3BvbnNlIGJlIHJlc3BvbnNlLCBpZiByZXNwb25zZSBpcyBub3QgYSBmaWx0ZXJlZCByZXNwb25zZSxcbiAgLy8gYW5kIHJlc3BvbnNl4oCZcyBpbnRlcm5hbCByZXNwb25zZSBvdGhlcndpc2UuXG4gIGNvbnN0IGFjdHVhbFJlc3BvbnNlID0gcmVzcG9uc2UuaW50ZXJuYWxSZXNwb25zZVxuICAgID8gcmVzcG9uc2UuaW50ZXJuYWxSZXNwb25zZVxuICAgIDogcmVzcG9uc2VcblxuICAvLyAzLiBMZXQgbG9jYXRpb25VUkwgYmUgYWN0dWFsUmVzcG9uc2XigJlzIGxvY2F0aW9uIFVSTCBnaXZlbiByZXF1ZXN04oCZcyBjdXJyZW50XG4gIC8vIFVSTOKAmXMgZnJhZ21lbnQuXG4gIGxldCBsb2NhdGlvblVSTFxuXG4gIHRyeSB7XG4gICAgbG9jYXRpb25VUkwgPSByZXNwb25zZUxvY2F0aW9uVVJMKFxuICAgICAgYWN0dWFsUmVzcG9uc2UsXG4gICAgICByZXF1ZXN0Q3VycmVudFVSTChyZXF1ZXN0KS5oYXNoXG4gICAgKVxuXG4gICAgLy8gNC4gSWYgbG9jYXRpb25VUkwgaXMgbnVsbCwgdGhlbiByZXR1cm4gcmVzcG9uc2UuXG4gICAgaWYgKGxvY2F0aW9uVVJMID09IG51bGwpIHtcbiAgICAgIHJldHVybiByZXNwb25zZVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gNS4gSWYgbG9jYXRpb25VUkwgaXMgZmFpbHVyZSwgdGhlbiByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFrZU5ldHdvcmtFcnJvcihlcnIpKVxuICB9XG5cbiAgLy8gNi4gSWYgbG9jYXRpb25VUkzigJlzIHNjaGVtZSBpcyBub3QgYW4gSFRUUChTKSBzY2hlbWUsIHRoZW4gcmV0dXJuIGEgbmV0d29ya1xuICAvLyBlcnJvci5cbiAgaWYgKCF1cmxJc0h0dHBIdHRwc1NjaGVtZShsb2NhdGlvblVSTCkpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VOZXR3b3JrRXJyb3IoJ1VSTCBzY2hlbWUgbXVzdCBiZSBhIEhUVFAoUykgc2NoZW1lJykpXG4gIH1cblxuICAvLyA3LiBJZiByZXF1ZXN04oCZcyByZWRpcmVjdCBjb3VudCBpcyAyMCwgdGhlbiByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICBpZiAocmVxdWVzdC5yZWRpcmVjdENvdW50ID09PSAyMCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFrZU5ldHdvcmtFcnJvcigncmVkaXJlY3QgY291bnQgZXhjZWVkZWQnKSlcbiAgfVxuXG4gIC8vIDguIEluY3JlYXNlIHJlcXVlc3TigJlzIHJlZGlyZWN0IGNvdW50IGJ5IDEuXG4gIHJlcXVlc3QucmVkaXJlY3RDb3VudCArPSAxXG5cbiAgLy8gOS4gSWYgcmVxdWVzdOKAmXMgbW9kZSBpcyBcImNvcnNcIiwgbG9jYXRpb25VUkwgaW5jbHVkZXMgY3JlZGVudGlhbHMsIGFuZFxuICAvLyByZXF1ZXN04oCZcyBvcmlnaW4gaXMgbm90IHNhbWUgb3JpZ2luIHdpdGggbG9jYXRpb25VUkzigJlzIG9yaWdpbiwgdGhlbiByZXR1cm5cbiAgLy8gIGEgbmV0d29yayBlcnJvci5cbiAgaWYgKFxuICAgIHJlcXVlc3QubW9kZSA9PT0gJ2NvcnMnICYmXG4gICAgKGxvY2F0aW9uVVJMLnVzZXJuYW1lIHx8IGxvY2F0aW9uVVJMLnBhc3N3b3JkKSAmJlxuICAgICFzYW1lT3JpZ2luKHJlcXVlc3QsIGxvY2F0aW9uVVJMKVxuICApIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VOZXR3b3JrRXJyb3IoJ2Nyb3NzIG9yaWdpbiBub3QgYWxsb3dlZCBmb3IgcmVxdWVzdCBtb2RlIFwiY29yc1wiJykpXG4gIH1cblxuICAvLyAxMC4gSWYgcmVxdWVzdOKAmXMgcmVzcG9uc2UgdGFpbnRpbmcgaXMgXCJjb3JzXCIgYW5kIGxvY2F0aW9uVVJMIGluY2x1ZGVzXG4gIC8vIGNyZWRlbnRpYWxzLCB0aGVuIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG4gIGlmIChcbiAgICByZXF1ZXN0LnJlc3BvbnNlVGFpbnRpbmcgPT09ICdjb3JzJyAmJlxuICAgIChsb2NhdGlvblVSTC51c2VybmFtZSB8fCBsb2NhdGlvblVSTC5wYXNzd29yZClcbiAgKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlTmV0d29ya0Vycm9yKFxuICAgICAgJ1VSTCBjYW5ub3QgY29udGFpbiBjcmVkZW50aWFscyBmb3IgcmVxdWVzdCBtb2RlIFwiY29yc1wiJ1xuICAgICkpXG4gIH1cblxuICAvLyAxMS4gSWYgYWN0dWFsUmVzcG9uc2XigJlzIHN0YXR1cyBpcyBub3QgMzAzLCByZXF1ZXN04oCZcyBib2R5IGlzIG5vbi1udWxsLFxuICAvLyBhbmQgcmVxdWVzdOKAmXMgYm9keeKAmXMgc291cmNlIGlzIG51bGwsIHRoZW4gcmV0dXJuIGEgbmV0d29yayBlcnJvci5cbiAgaWYgKFxuICAgIGFjdHVhbFJlc3BvbnNlLnN0YXR1cyAhPT0gMzAzICYmXG4gICAgcmVxdWVzdC5ib2R5ICE9IG51bGwgJiZcbiAgICByZXF1ZXN0LmJvZHkuc291cmNlID09IG51bGxcbiAgKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlTmV0d29ya0Vycm9yKCkpXG4gIH1cblxuICAvLyAxMi4gSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZVxuICAvLyAtIGFjdHVhbFJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgMzAxIG9yIDMwMiBhbmQgcmVxdWVzdOKAmXMgbWV0aG9kIGlzIGBQT1NUYFxuICAvLyAtIGFjdHVhbFJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgMzAzIGFuZCByZXF1ZXN04oCZcyBtZXRob2QgaXMgbm90IGBHRVRgIG9yIGBIRUFEYFxuICBpZiAoXG4gICAgKFszMDEsIDMwMl0uaW5jbHVkZXMoYWN0dWFsUmVzcG9uc2Uuc3RhdHVzKSAmJiByZXF1ZXN0Lm1ldGhvZCA9PT0gJ1BPU1QnKSB8fFxuICAgIChhY3R1YWxSZXNwb25zZS5zdGF0dXMgPT09IDMwMyAmJlxuICAgICAgIUdFVF9PUl9IRUFELmluY2x1ZGVzKHJlcXVlc3QubWV0aG9kKSlcbiAgKSB7XG4gICAgLy8gdGhlbjpcbiAgICAvLyAxLiBTZXQgcmVxdWVzdOKAmXMgbWV0aG9kIHRvIGBHRVRgIGFuZCByZXF1ZXN04oCZcyBib2R5IHRvIG51bGwuXG4gICAgcmVxdWVzdC5tZXRob2QgPSAnR0VUJ1xuICAgIHJlcXVlc3QuYm9keSA9IG51bGxcblxuICAgIC8vIDIuIEZvciBlYWNoIGhlYWRlck5hbWUgb2YgcmVxdWVzdC1ib2R5LWhlYWRlciBuYW1lLCBkZWxldGUgaGVhZGVyTmFtZSBmcm9tXG4gICAgLy8gcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gICAgZm9yIChjb25zdCBoZWFkZXJOYW1lIG9mIHJlcXVlc3RCb2R5SGVhZGVyKSB7XG4gICAgICByZXF1ZXN0LmhlYWRlcnNMaXN0LmRlbGV0ZShoZWFkZXJOYW1lKVxuICAgIH1cbiAgfVxuXG4gIC8vIDEzLiBJZiByZXF1ZXN04oCZcyBjdXJyZW50IFVSTOKAmXMgb3JpZ2luIGlzIG5vdCBzYW1lIG9yaWdpbiB3aXRoIGxvY2F0aW9uVVJM4oCZc1xuICAvLyAgICAgb3JpZ2luLCB0aGVuIGZvciBlYWNoIGhlYWRlck5hbWUgb2YgQ09SUyBub24td2lsZGNhcmQgcmVxdWVzdC1oZWFkZXIgbmFtZSxcbiAgLy8gICAgIGRlbGV0ZSBoZWFkZXJOYW1lIGZyb20gcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gIGlmICghc2FtZU9yaWdpbihyZXF1ZXN0Q3VycmVudFVSTChyZXF1ZXN0KSwgbG9jYXRpb25VUkwpKSB7XG4gICAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvcnMtbm9uLXdpbGRjYXJkLXJlcXVlc3QtaGVhZGVyLW5hbWVcbiAgICByZXF1ZXN0LmhlYWRlcnNMaXN0LmRlbGV0ZSgnYXV0aG9yaXphdGlvbicpXG5cbiAgICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jYXV0aGVudGljYXRpb24tZW50cmllc1xuICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QuZGVsZXRlKCdwcm94eS1hdXRob3JpemF0aW9uJywgdHJ1ZSlcblxuICAgIC8vIFwiQ29va2llXCIgYW5kIFwiSG9zdFwiIGFyZSBmb3JiaWRkZW4gcmVxdWVzdC1oZWFkZXJzLCB3aGljaCB1bmRpY2kgZG9lc24ndCBpbXBsZW1lbnQuXG4gICAgcmVxdWVzdC5oZWFkZXJzTGlzdC5kZWxldGUoJ2Nvb2tpZScpXG4gICAgcmVxdWVzdC5oZWFkZXJzTGlzdC5kZWxldGUoJ2hvc3QnKVxuICB9XG5cbiAgLy8gMTQuIElmIHJlcXVlc3TigJlzIGJvZHkgaXMgbm9uLW51bGwsIHRoZW4gc2V0IHJlcXVlc3TigJlzIGJvZHkgdG8gdGhlIGZpcnN0IHJldHVyblxuICAvLyB2YWx1ZSBvZiBzYWZlbHkgZXh0cmFjdGluZyByZXF1ZXN04oCZcyBib2R54oCZcyBzb3VyY2UuXG4gIGlmIChyZXF1ZXN0LmJvZHkgIT0gbnVsbCkge1xuICAgIGFzc2VydChyZXF1ZXN0LmJvZHkuc291cmNlICE9IG51bGwpXG4gICAgcmVxdWVzdC5ib2R5ID0gc2FmZWx5RXh0cmFjdEJvZHkocmVxdWVzdC5ib2R5LnNvdXJjZSlbMF1cbiAgfVxuXG4gIC8vIDE1LiBMZXQgdGltaW5nSW5mbyBiZSBmZXRjaFBhcmFtc+KAmXMgdGltaW5nIGluZm8uXG4gIGNvbnN0IHRpbWluZ0luZm8gPSBmZXRjaFBhcmFtcy50aW1pbmdJbmZvXG5cbiAgLy8gMTYuIFNldCB0aW1pbmdJbmZv4oCZcyByZWRpcmVjdCBlbmQgdGltZSBhbmQgcG9zdC1yZWRpcmVjdCBzdGFydCB0aW1lIHRvIHRoZVxuICAvLyBjb2Fyc2VuZWQgc2hhcmVkIGN1cnJlbnQgdGltZSBnaXZlbiBmZXRjaFBhcmFtc+KAmXMgY3Jvc3Mtb3JpZ2luIGlzb2xhdGVkXG4gIC8vIGNhcGFiaWxpdHkuXG4gIHRpbWluZ0luZm8ucmVkaXJlY3RFbmRUaW1lID0gdGltaW5nSW5mby5wb3N0UmVkaXJlY3RTdGFydFRpbWUgPVxuICAgIGNvYXJzZW5lZFNoYXJlZEN1cnJlbnRUaW1lKGZldGNoUGFyYW1zLmNyb3NzT3JpZ2luSXNvbGF0ZWRDYXBhYmlsaXR5KVxuXG4gIC8vIDE3LiBJZiB0aW1pbmdJbmZv4oCZcyByZWRpcmVjdCBzdGFydCB0aW1lIGlzIDAsIHRoZW4gc2V0IHRpbWluZ0luZm/igJlzXG4gIC8vICByZWRpcmVjdCBzdGFydCB0aW1lIHRvIHRpbWluZ0luZm/igJlzIHN0YXJ0IHRpbWUuXG4gIGlmICh0aW1pbmdJbmZvLnJlZGlyZWN0U3RhcnRUaW1lID09PSAwKSB7XG4gICAgdGltaW5nSW5mby5yZWRpcmVjdFN0YXJ0VGltZSA9IHRpbWluZ0luZm8uc3RhcnRUaW1lXG4gIH1cblxuICAvLyAxOC4gQXBwZW5kIGxvY2F0aW9uVVJMIHRvIHJlcXVlc3TigJlzIFVSTCBsaXN0LlxuICByZXF1ZXN0LnVybExpc3QucHVzaChsb2NhdGlvblVSTClcblxuICAvLyAxOS4gSW52b2tlIHNldCByZXF1ZXN04oCZcyByZWZlcnJlciBwb2xpY3kgb24gcmVkaXJlY3Qgb24gcmVxdWVzdCBhbmRcbiAgLy8gYWN0dWFsUmVzcG9uc2UuXG4gIHNldFJlcXVlc3RSZWZlcnJlclBvbGljeU9uUmVkaXJlY3QocmVxdWVzdCwgYWN0dWFsUmVzcG9uc2UpXG5cbiAgLy8gMjAuIFJldHVybiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgbWFpbiBmZXRjaCBnaXZlbiBmZXRjaFBhcmFtcyBhbmQgdHJ1ZS5cbiAgcmV0dXJuIG1haW5GZXRjaChmZXRjaFBhcmFtcywgdHJ1ZSlcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtbmV0d29yay1vci1jYWNoZS1mZXRjaFxuYXN5bmMgZnVuY3Rpb24gaHR0cE5ldHdvcmtPckNhY2hlRmV0Y2ggKFxuICBmZXRjaFBhcmFtcyxcbiAgaXNBdXRoZW50aWNhdGlvbkZldGNoID0gZmFsc2UsXG4gIGlzTmV3Q29ubmVjdGlvbkZldGNoID0gZmFsc2Vcbikge1xuICAvLyAxLiBMZXQgcmVxdWVzdCBiZSBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdC5cbiAgY29uc3QgcmVxdWVzdCA9IGZldGNoUGFyYW1zLnJlcXVlc3RcblxuICAvLyAyLiBMZXQgaHR0cEZldGNoUGFyYW1zIGJlIG51bGwuXG4gIGxldCBodHRwRmV0Y2hQYXJhbXMgPSBudWxsXG5cbiAgLy8gMy4gTGV0IGh0dHBSZXF1ZXN0IGJlIG51bGwuXG4gIGxldCBodHRwUmVxdWVzdCA9IG51bGxcblxuICAvLyA0LiBMZXQgcmVzcG9uc2UgYmUgbnVsbC5cbiAgbGV0IHJlc3BvbnNlID0gbnVsbFxuXG4gIC8vIDUuIExldCBzdG9yZWRSZXNwb25zZSBiZSBudWxsLlxuICAvLyBUT0RPOiBjYWNoZVxuXG4gIC8vIDYuIExldCBodHRwQ2FjaGUgYmUgbnVsbC5cbiAgY29uc3QgaHR0cENhY2hlID0gbnVsbFxuXG4gIC8vIDcuIExldCB0aGUgcmV2YWxpZGF0aW5nRmxhZyBiZSB1bnNldC5cbiAgY29uc3QgcmV2YWxpZGF0aW5nRmxhZyA9IGZhbHNlXG5cbiAgLy8gOC4gUnVuIHRoZXNlIHN0ZXBzLCBidXQgYWJvcnQgd2hlbiB0aGUgb25nb2luZyBmZXRjaCBpcyB0ZXJtaW5hdGVkOlxuXG4gIC8vICAgIDEuIElmIHJlcXVlc3TigJlzIHdpbmRvdyBpcyBcIm5vLXdpbmRvd1wiIGFuZCByZXF1ZXN04oCZcyByZWRpcmVjdCBtb2RlIGlzXG4gIC8vICAgIFwiZXJyb3JcIiwgdGhlbiBzZXQgaHR0cEZldGNoUGFyYW1zIHRvIGZldGNoUGFyYW1zIGFuZCBodHRwUmVxdWVzdCB0b1xuICAvLyAgICByZXF1ZXN0LlxuICBpZiAocmVxdWVzdC53aW5kb3cgPT09ICduby13aW5kb3cnICYmIHJlcXVlc3QucmVkaXJlY3QgPT09ICdlcnJvcicpIHtcbiAgICBodHRwRmV0Y2hQYXJhbXMgPSBmZXRjaFBhcmFtc1xuICAgIGh0dHBSZXF1ZXN0ID0gcmVxdWVzdFxuICB9IGVsc2Uge1xuICAgIC8vIE90aGVyd2lzZTpcblxuICAgIC8vIDEuIFNldCBodHRwUmVxdWVzdCB0byBhIGNsb25lIG9mIHJlcXVlc3QuXG4gICAgaHR0cFJlcXVlc3QgPSBtYWtlUmVxdWVzdChyZXF1ZXN0KVxuXG4gICAgLy8gMi4gU2V0IGh0dHBGZXRjaFBhcmFtcyB0byBhIGNvcHkgb2YgZmV0Y2hQYXJhbXMuXG4gICAgaHR0cEZldGNoUGFyYW1zID0geyAuLi5mZXRjaFBhcmFtcyB9XG5cbiAgICAvLyAzLiBTZXQgaHR0cEZldGNoUGFyYW1z4oCZcyByZXF1ZXN0IHRvIGh0dHBSZXF1ZXN0LlxuICAgIGh0dHBGZXRjaFBhcmFtcy5yZXF1ZXN0ID0gaHR0cFJlcXVlc3RcbiAgfVxuXG4gIC8vICAgIDMuIExldCBpbmNsdWRlQ3JlZGVudGlhbHMgYmUgdHJ1ZSBpZiBvbmUgb2ZcbiAgY29uc3QgaW5jbHVkZUNyZWRlbnRpYWxzID1cbiAgICByZXF1ZXN0LmNyZWRlbnRpYWxzID09PSAnaW5jbHVkZScgfHxcbiAgICAocmVxdWVzdC5jcmVkZW50aWFscyA9PT0gJ3NhbWUtb3JpZ2luJyAmJlxuICAgICAgcmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnYmFzaWMnKVxuXG4gIC8vICAgIDQuIExldCBjb250ZW50TGVuZ3RoIGJlIGh0dHBSZXF1ZXN04oCZcyBib2R54oCZcyBsZW5ndGgsIGlmIGh0dHBSZXF1ZXN04oCZc1xuICAvLyAgICBib2R5IGlzIG5vbi1udWxsOyBvdGhlcndpc2UgbnVsbC5cbiAgY29uc3QgY29udGVudExlbmd0aCA9IGh0dHBSZXF1ZXN0LmJvZHkgPyBodHRwUmVxdWVzdC5ib2R5Lmxlbmd0aCA6IG51bGxcblxuICAvLyAgICA1LiBMZXQgY29udGVudExlbmd0aEhlYWRlclZhbHVlIGJlIG51bGwuXG4gIGxldCBjb250ZW50TGVuZ3RoSGVhZGVyVmFsdWUgPSBudWxsXG5cbiAgLy8gICAgNi4gSWYgaHR0cFJlcXVlc3TigJlzIGJvZHkgaXMgbnVsbCBhbmQgaHR0cFJlcXVlc3TigJlzIG1ldGhvZCBpcyBgUE9TVGAgb3JcbiAgLy8gICAgYFBVVGAsIHRoZW4gc2V0IGNvbnRlbnRMZW5ndGhIZWFkZXJWYWx1ZSB0byBgMGAuXG4gIGlmIChcbiAgICBodHRwUmVxdWVzdC5ib2R5ID09IG51bGwgJiZcbiAgICBbJ1BPU1QnLCAnUFVUJ10uaW5jbHVkZXMoaHR0cFJlcXVlc3QubWV0aG9kKVxuICApIHtcbiAgICBjb250ZW50TGVuZ3RoSGVhZGVyVmFsdWUgPSAnMCdcbiAgfVxuXG4gIC8vICAgIDcuIElmIGNvbnRlbnRMZW5ndGggaXMgbm9uLW51bGwsIHRoZW4gc2V0IGNvbnRlbnRMZW5ndGhIZWFkZXJWYWx1ZSB0b1xuICAvLyAgICBjb250ZW50TGVuZ3RoLCBzZXJpYWxpemVkIGFuZCBpc29tb3JwaGljIGVuY29kZWQuXG4gIGlmIChjb250ZW50TGVuZ3RoICE9IG51bGwpIHtcbiAgICBjb250ZW50TGVuZ3RoSGVhZGVyVmFsdWUgPSBpc29tb3JwaGljRW5jb2RlKGAke2NvbnRlbnRMZW5ndGh9YClcbiAgfVxuXG4gIC8vICAgIDguIElmIGNvbnRlbnRMZW5ndGhIZWFkZXJWYWx1ZSBpcyBub24tbnVsbCwgdGhlbiBhcHBlbmRcbiAgLy8gICAgYENvbnRlbnQtTGVuZ3RoYC9jb250ZW50TGVuZ3RoSGVhZGVyVmFsdWUgdG8gaHR0cFJlcXVlc3TigJlzIGhlYWRlclxuICAvLyAgICBsaXN0LlxuICBpZiAoY29udGVudExlbmd0aEhlYWRlclZhbHVlICE9IG51bGwpIHtcbiAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ2NvbnRlbnQtbGVuZ3RoJywgY29udGVudExlbmd0aEhlYWRlclZhbHVlKVxuICB9XG5cbiAgLy8gICAgOS4gSWYgY29udGVudExlbmd0aEhlYWRlclZhbHVlIGlzIG5vbi1udWxsLCB0aGVuIGFwcGVuZCAoYENvbnRlbnQtTGVuZ3RoYCxcbiAgLy8gICAgY29udGVudExlbmd0aEhlYWRlclZhbHVlKSB0byBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG5cbiAgLy8gICAgMTAuIElmIGNvbnRlbnRMZW5ndGggaXMgbm9uLW51bGwgYW5kIGh0dHBSZXF1ZXN04oCZcyBrZWVwYWxpdmUgaXMgdHJ1ZSxcbiAgLy8gICAgdGhlbjpcbiAgaWYgKGNvbnRlbnRMZW5ndGggIT0gbnVsbCAmJiBodHRwUmVxdWVzdC5rZWVwYWxpdmUpIHtcbiAgICAvLyBOT1RFOiBrZWVwYWxpdmUgaXMgYSBub29wIG91dHNpZGUgb2YgYnJvd3NlciBjb250ZXh0LlxuICB9XG5cbiAgLy8gICAgMTEuIElmIGh0dHBSZXF1ZXN04oCZcyByZWZlcnJlciBpcyBhIFVSTCwgdGhlbiBhcHBlbmRcbiAgLy8gICAgYFJlZmVyZXJgL2h0dHBSZXF1ZXN04oCZcyByZWZlcnJlciwgc2VyaWFsaXplZCBhbmQgaXNvbW9ycGhpYyBlbmNvZGVkLFxuICAvLyAgICAgdG8gaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICBpZiAoaHR0cFJlcXVlc3QucmVmZXJyZXIgaW5zdGFuY2VvZiBVUkwpIHtcbiAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ3JlZmVyZXInLCBpc29tb3JwaGljRW5jb2RlKGh0dHBSZXF1ZXN0LnJlZmVycmVyLmhyZWYpKVxuICB9XG5cbiAgLy8gICAgMTIuIEFwcGVuZCBhIHJlcXVlc3QgYE9yaWdpbmAgaGVhZGVyIGZvciBodHRwUmVxdWVzdC5cbiAgYXBwZW5kUmVxdWVzdE9yaWdpbkhlYWRlcihodHRwUmVxdWVzdClcblxuICAvLyAgICAxMy4gQXBwZW5kIHRoZSBGZXRjaCBtZXRhZGF0YSBoZWFkZXJzIGZvciBodHRwUmVxdWVzdC4gW0ZFVENILU1FVEFEQVRBXVxuICBhcHBlbmRGZXRjaE1ldGFkYXRhKGh0dHBSZXF1ZXN0KVxuXG4gIC8vICAgIDE0LiBJZiBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgZG9lcyBub3QgY29udGFpbiBgVXNlci1BZ2VudGAsIHRoZW5cbiAgLy8gICAgdXNlciBhZ2VudHMgc2hvdWxkIGFwcGVuZCBgVXNlci1BZ2VudGAvZGVmYXVsdCBgVXNlci1BZ2VudGAgdmFsdWUgdG9cbiAgLy8gICAgaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICBpZiAoIWh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCd1c2VyLWFnZW50JykpIHtcbiAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ3VzZXItYWdlbnQnLCB0eXBlb2YgZXNidWlsZERldGVjdGlvbiA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kaWNpJyA6ICdub2RlJylcbiAgfVxuXG4gIC8vICAgIDE1LiBJZiBodHRwUmVxdWVzdOKAmXMgY2FjaGUgbW9kZSBpcyBcImRlZmF1bHRcIiBhbmQgaHR0cFJlcXVlc3TigJlzIGhlYWRlclxuICAvLyAgICBsaXN0IGNvbnRhaW5zIGBJZi1Nb2RpZmllZC1TaW5jZWAsIGBJZi1Ob25lLU1hdGNoYCxcbiAgLy8gICAgYElmLVVubW9kaWZpZWQtU2luY2VgLCBgSWYtTWF0Y2hgLCBvciBgSWYtUmFuZ2VgLCB0aGVuIHNldFxuICAvLyAgICBodHRwUmVxdWVzdOKAmXMgY2FjaGUgbW9kZSB0byBcIm5vLXN0b3JlXCIuXG4gIGlmIChcbiAgICBodHRwUmVxdWVzdC5jYWNoZSA9PT0gJ2RlZmF1bHQnICYmXG4gICAgKGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCdpZi1tb2RpZmllZC1zaW5jZScpIHx8XG4gICAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygnaWYtbm9uZS1tYXRjaCcpIHx8XG4gICAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygnaWYtdW5tb2RpZmllZC1zaW5jZScpIHx8XG4gICAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygnaWYtbWF0Y2gnKSB8fFxuICAgICAgaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuY29udGFpbnMoJ2lmLXJhbmdlJykpXG4gICkge1xuICAgIGh0dHBSZXF1ZXN0LmNhY2hlID0gJ25vLXN0b3JlJ1xuICB9XG5cbiAgLy8gICAgMTYuIElmIGh0dHBSZXF1ZXN04oCZcyBjYWNoZSBtb2RlIGlzIFwibm8tY2FjaGVcIiwgaHR0cFJlcXVlc3TigJlzIHByZXZlbnRcbiAgLy8gICAgbm8tY2FjaGUgY2FjaGUtY29udHJvbCBoZWFkZXIgbW9kaWZpY2F0aW9uIGZsYWcgaXMgdW5zZXQsIGFuZFxuICAvLyAgICBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgZG9lcyBub3QgY29udGFpbiBgQ2FjaGUtQ29udHJvbGAsIHRoZW4gYXBwZW5kXG4gIC8vICAgIGBDYWNoZS1Db250cm9sYC9gbWF4LWFnZT0wYCB0byBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gIGlmIChcbiAgICBodHRwUmVxdWVzdC5jYWNoZSA9PT0gJ25vLWNhY2hlJyAmJlxuICAgICFodHRwUmVxdWVzdC5wcmV2ZW50Tm9DYWNoZUNhY2hlQ29udHJvbEhlYWRlck1vZGlmaWNhdGlvbiAmJlxuICAgICFodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygnY2FjaGUtY29udHJvbCcpXG4gICkge1xuICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgnY2FjaGUtY29udHJvbCcsICdtYXgtYWdlPTAnKVxuICB9XG5cbiAgLy8gICAgMTcuIElmIGh0dHBSZXF1ZXN04oCZcyBjYWNoZSBtb2RlIGlzIFwibm8tc3RvcmVcIiBvciBcInJlbG9hZFwiLCB0aGVuOlxuICBpZiAoaHR0cFJlcXVlc3QuY2FjaGUgPT09ICduby1zdG9yZScgfHwgaHR0cFJlcXVlc3QuY2FjaGUgPT09ICdyZWxvYWQnKSB7XG4gICAgLy8gMS4gSWYgaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGRvZXMgbm90IGNvbnRhaW4gYFByYWdtYWAsIHRoZW4gYXBwZW5kXG4gICAgLy8gYFByYWdtYWAvYG5vLWNhY2hlYCB0byBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gICAgaWYgKCFodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygncHJhZ21hJykpIHtcbiAgICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgncHJhZ21hJywgJ25vLWNhY2hlJylcbiAgICB9XG5cbiAgICAvLyAyLiBJZiBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgZG9lcyBub3QgY29udGFpbiBgQ2FjaGUtQ29udHJvbGAsXG4gICAgLy8gdGhlbiBhcHBlbmQgYENhY2hlLUNvbnRyb2xgL2Buby1jYWNoZWAgdG8gaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICAgIGlmICghaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuY29udGFpbnMoJ2NhY2hlLWNvbnRyb2wnKSkge1xuICAgICAgaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdjYWNoZS1jb250cm9sJywgJ25vLWNhY2hlJylcbiAgICB9XG4gIH1cblxuICAvLyAgICAxOC4gSWYgaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGNvbnRhaW5zIGBSYW5nZWAsIHRoZW4gYXBwZW5kXG4gIC8vICAgIGBBY2NlcHQtRW5jb2RpbmdgL2BpZGVudGl0eWAgdG8gaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICBpZiAoaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuY29udGFpbnMoJ3JhbmdlJykpIHtcbiAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ2FjY2VwdC1lbmNvZGluZycsICdpZGVudGl0eScpXG4gIH1cblxuICAvLyAgICAxOS4gTW9kaWZ5IGh0dHBSZXF1ZXN04oCZcyBoZWFkZXIgbGlzdCBwZXIgSFRUUC4gRG8gbm90IGFwcGVuZCBhIGdpdmVuXG4gIC8vICAgIGhlYWRlciBpZiBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgY29udGFpbnMgdGhhdCBoZWFkZXLigJlzIG5hbWUuXG4gIC8vICAgIFRPRE86IGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvZmV0Y2gvaXNzdWVzLzEyODUjaXNzdWVjb21tZW50LTg5NjU2MDEyOVxuICBpZiAoIWh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCdhY2NlcHQtZW5jb2RpbmcnKSkge1xuICAgIGlmICh1cmxIYXNIdHRwc1NjaGVtZShyZXF1ZXN0Q3VycmVudFVSTChodHRwUmVxdWVzdCkpKSB7XG4gICAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ2FjY2VwdC1lbmNvZGluZycsICdiciwgZ3ppcCwgZGVmbGF0ZScpXG4gICAgfSBlbHNlIHtcbiAgICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgnYWNjZXB0LWVuY29kaW5nJywgJ2d6aXAsIGRlZmxhdGUnKVxuICAgIH1cbiAgfVxuXG4gIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmRlbGV0ZSgnaG9zdCcpXG5cbiAgLy8gICAgMjAuIElmIGluY2x1ZGVDcmVkZW50aWFscyBpcyB0cnVlLCB0aGVuOlxuICBpZiAoaW5jbHVkZUNyZWRlbnRpYWxzKSB7XG4gICAgLy8gMS4gSWYgdGhlIHVzZXIgYWdlbnQgaXMgbm90IGNvbmZpZ3VyZWQgdG8gYmxvY2sgY29va2llcyBmb3IgaHR0cFJlcXVlc3RcbiAgICAvLyAoc2VlIHNlY3Rpb24gNyBvZiBbQ09PS0lFU10pLCB0aGVuOlxuICAgIC8vIFRPRE86IGNyZWRlbnRpYWxzXG4gICAgLy8gMi4gSWYgaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGRvZXMgbm90IGNvbnRhaW4gYEF1dGhvcml6YXRpb25gLCB0aGVuOlxuICAgIC8vIFRPRE86IGNyZWRlbnRpYWxzXG4gIH1cblxuICAvLyAgICAyMS4gSWYgdGhlcmXigJlzIGEgcHJveHktYXV0aGVudGljYXRpb24gZW50cnksIHVzZSBpdCBhcyBhcHByb3ByaWF0ZS5cbiAgLy8gICAgVE9ETzogcHJveHktYXV0aGVudGljYXRpb25cblxuICAvLyAgICAyMi4gU2V0IGh0dHBDYWNoZSB0byB0aGUgcmVzdWx0IG9mIGRldGVybWluaW5nIHRoZSBIVFRQIGNhY2hlXG4gIC8vICAgIHBhcnRpdGlvbiwgZ2l2ZW4gaHR0cFJlcXVlc3QuXG4gIC8vICAgIFRPRE86IGNhY2hlXG5cbiAgLy8gICAgMjMuIElmIGh0dHBDYWNoZSBpcyBudWxsLCB0aGVuIHNldCBodHRwUmVxdWVzdOKAmXMgY2FjaGUgbW9kZSB0b1xuICAvLyAgICBcIm5vLXN0b3JlXCIuXG4gIGlmIChodHRwQ2FjaGUgPT0gbnVsbCkge1xuICAgIGh0dHBSZXF1ZXN0LmNhY2hlID0gJ25vLXN0b3JlJ1xuICB9XG5cbiAgLy8gICAgMjQuIElmIGh0dHBSZXF1ZXN04oCZcyBjYWNoZSBtb2RlIGlzIG5laXRoZXIgXCJuby1zdG9yZVwiIG5vciBcInJlbG9hZFwiLFxuICAvLyAgICB0aGVuOlxuICBpZiAoaHR0cFJlcXVlc3QubW9kZSAhPT0gJ25vLXN0b3JlJyAmJiBodHRwUmVxdWVzdC5tb2RlICE9PSAncmVsb2FkJykge1xuICAgIC8vIFRPRE86IGNhY2hlXG4gIH1cblxuICAvLyA5LiBJZiBhYm9ydGVkLCB0aGVuIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgbmV0d29yayBlcnJvciBmb3IgZmV0Y2hQYXJhbXMuXG4gIC8vIFRPRE9cblxuICAvLyAxMC4gSWYgcmVzcG9uc2UgaXMgbnVsbCwgdGhlbjpcbiAgaWYgKHJlc3BvbnNlID09IG51bGwpIHtcbiAgICAvLyAxLiBJZiBodHRwUmVxdWVzdOKAmXMgY2FjaGUgbW9kZSBpcyBcIm9ubHktaWYtY2FjaGVkXCIsIHRoZW4gcmV0dXJuIGFcbiAgICAvLyBuZXR3b3JrIGVycm9yLlxuICAgIGlmIChodHRwUmVxdWVzdC5tb2RlID09PSAnb25seS1pZi1jYWNoZWQnKSB7XG4gICAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcignb25seSBpZiBjYWNoZWQnKVxuICAgIH1cblxuICAgIC8vIDIuIExldCBmb3J3YXJkUmVzcG9uc2UgYmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nIEhUVFAtbmV0d29yayBmZXRjaFxuICAgIC8vIGdpdmVuIGh0dHBGZXRjaFBhcmFtcywgaW5jbHVkZUNyZWRlbnRpYWxzLCBhbmQgaXNOZXdDb25uZWN0aW9uRmV0Y2guXG4gICAgY29uc3QgZm9yd2FyZFJlc3BvbnNlID0gYXdhaXQgaHR0cE5ldHdvcmtGZXRjaChcbiAgICAgIGh0dHBGZXRjaFBhcmFtcyxcbiAgICAgIGluY2x1ZGVDcmVkZW50aWFscyxcbiAgICAgIGlzTmV3Q29ubmVjdGlvbkZldGNoXG4gICAgKVxuXG4gICAgLy8gMy4gSWYgaHR0cFJlcXVlc3TigJlzIG1ldGhvZCBpcyB1bnNhZmUgYW5kIGZvcndhcmRSZXNwb25zZeKAmXMgc3RhdHVzIGlzXG4gICAgLy8gaW4gdGhlIHJhbmdlIDIwMCB0byAzOTksIGluY2x1c2l2ZSwgaW52YWxpZGF0ZSBhcHByb3ByaWF0ZSBzdG9yZWRcbiAgICAvLyByZXNwb25zZXMgaW4gaHR0cENhY2hlLCBhcyBwZXIgdGhlIFwiSW52YWxpZGF0aW9uXCIgY2hhcHRlciBvZiBIVFRQXG4gICAgLy8gQ2FjaGluZywgYW5kIHNldCBzdG9yZWRSZXNwb25zZSB0byBudWxsLiBbSFRUUC1DQUNISU5HXVxuICAgIGlmIChcbiAgICAgICFzYWZlTWV0aG9kc1NldC5oYXMoaHR0cFJlcXVlc3QubWV0aG9kKSAmJlxuICAgICAgZm9yd2FyZFJlc3BvbnNlLnN0YXR1cyA+PSAyMDAgJiZcbiAgICAgIGZvcndhcmRSZXNwb25zZS5zdGF0dXMgPD0gMzk5XG4gICAgKSB7XG4gICAgICAvLyBUT0RPOiBjYWNoZVxuICAgIH1cblxuICAgIC8vIDQuIElmIHRoZSByZXZhbGlkYXRpbmdGbGFnIGlzIHNldCBhbmQgZm9yd2FyZFJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgMzA0LFxuICAgIC8vIHRoZW46XG4gICAgaWYgKHJldmFsaWRhdGluZ0ZsYWcgJiYgZm9yd2FyZFJlc3BvbnNlLnN0YXR1cyA9PT0gMzA0KSB7XG4gICAgICAvLyBUT0RPOiBjYWNoZVxuICAgIH1cblxuICAgIC8vIDUuIElmIHJlc3BvbnNlIGlzIG51bGwsIHRoZW46XG4gICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHtcbiAgICAgIC8vIDEuIFNldCByZXNwb25zZSB0byBmb3J3YXJkUmVzcG9uc2UuXG4gICAgICByZXNwb25zZSA9IGZvcndhcmRSZXNwb25zZVxuXG4gICAgICAvLyAyLiBTdG9yZSBodHRwUmVxdWVzdCBhbmQgZm9yd2FyZFJlc3BvbnNlIGluIGh0dHBDYWNoZSwgYXMgcGVyIHRoZVxuICAgICAgLy8gXCJTdG9yaW5nIFJlc3BvbnNlcyBpbiBDYWNoZXNcIiBjaGFwdGVyIG9mIEhUVFAgQ2FjaGluZy4gW0hUVFAtQ0FDSElOR11cbiAgICAgIC8vIFRPRE86IGNhY2hlXG4gICAgfVxuICB9XG5cbiAgLy8gMTEuIFNldCByZXNwb25zZeKAmXMgVVJMIGxpc3QgdG8gYSBjbG9uZSBvZiBodHRwUmVxdWVzdOKAmXMgVVJMIGxpc3QuXG4gIHJlc3BvbnNlLnVybExpc3QgPSBbLi4uaHR0cFJlcXVlc3QudXJsTGlzdF1cblxuICAvLyAxMi4gSWYgaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGNvbnRhaW5zIGBSYW5nZWAsIHRoZW4gc2V0IHJlc3BvbnNl4oCZc1xuICAvLyByYW5nZS1yZXF1ZXN0ZWQgZmxhZy5cbiAgaWYgKGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCdyYW5nZScpKSB7XG4gICAgcmVzcG9uc2UucmFuZ2VSZXF1ZXN0ZWQgPSB0cnVlXG4gIH1cblxuICAvLyAxMy4gU2V0IHJlc3BvbnNl4oCZcyByZXF1ZXN0LWluY2x1ZGVzLWNyZWRlbnRpYWxzIHRvIGluY2x1ZGVDcmVkZW50aWFscy5cbiAgcmVzcG9uc2UucmVxdWVzdEluY2x1ZGVzQ3JlZGVudGlhbHMgPSBpbmNsdWRlQ3JlZGVudGlhbHNcblxuICAvLyAxNC4gSWYgcmVzcG9uc2XigJlzIHN0YXR1cyBpcyA0MDEsIGh0dHBSZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZyBpcyBub3RcbiAgLy8gXCJjb3JzXCIsIGluY2x1ZGVDcmVkZW50aWFscyBpcyB0cnVlLCBhbmQgcmVxdWVzdOKAmXMgd2luZG93IGlzIGFuIGVudmlyb25tZW50XG4gIC8vIHNldHRpbmdzIG9iamVjdCwgdGhlbjpcbiAgLy8gVE9ET1xuXG4gIC8vIDE1LiBJZiByZXNwb25zZeKAmXMgc3RhdHVzIGlzIDQwNywgdGhlbjpcbiAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA3KSB7XG4gICAgLy8gMS4gSWYgcmVxdWVzdOKAmXMgd2luZG93IGlzIFwibm8td2luZG93XCIsIHRoZW4gcmV0dXJuIGEgbmV0d29yayBlcnJvci5cbiAgICBpZiAocmVxdWVzdC53aW5kb3cgPT09ICduby13aW5kb3cnKSB7XG4gICAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcigpXG4gICAgfVxuXG4gICAgLy8gMi4gPz8/XG5cbiAgICAvLyAzLiBJZiBmZXRjaFBhcmFtcyBpcyBjYW5jZWxlZCwgdGhlbiByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIG5ldHdvcmsgZXJyb3IgZm9yIGZldGNoUGFyYW1zLlxuICAgIGlmIChpc0NhbmNlbGxlZChmZXRjaFBhcmFtcykpIHtcbiAgICAgIHJldHVybiBtYWtlQXBwcm9wcmlhdGVOZXR3b3JrRXJyb3IoZmV0Y2hQYXJhbXMpXG4gICAgfVxuXG4gICAgLy8gNC4gUHJvbXB0IHRoZSBlbmQgdXNlciBhcyBhcHByb3ByaWF0ZSBpbiByZXF1ZXN04oCZcyB3aW5kb3cgYW5kIHN0b3JlXG4gICAgLy8gdGhlIHJlc3VsdCBhcyBhIHByb3h5LWF1dGhlbnRpY2F0aW9uIGVudHJ5LiBbSFRUUC1BVVRIXVxuICAgIC8vIFRPRE86IEludm9rZSBzb21lIGtpbmQgb2YgY2FsbGJhY2s/XG5cbiAgICAvLyA1LiBTZXQgcmVzcG9uc2UgdG8gdGhlIHJlc3VsdCBvZiBydW5uaW5nIEhUVFAtbmV0d29yay1vci1jYWNoZSBmZXRjaCBnaXZlblxuICAgIC8vIGZldGNoUGFyYW1zLlxuICAgIC8vIFRPRE9cbiAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcigncHJveHkgYXV0aGVudGljYXRpb24gcmVxdWlyZWQnKVxuICB9XG5cbiAgLy8gMTYuIElmIGFsbCBvZiB0aGUgZm9sbG93aW5nIGFyZSB0cnVlXG4gIGlmIChcbiAgICAvLyByZXNwb25zZeKAmXMgc3RhdHVzIGlzIDQyMVxuICAgIHJlc3BvbnNlLnN0YXR1cyA9PT0gNDIxICYmXG4gICAgLy8gaXNOZXdDb25uZWN0aW9uRmV0Y2ggaXMgZmFsc2VcbiAgICAhaXNOZXdDb25uZWN0aW9uRmV0Y2ggJiZcbiAgICAvLyByZXF1ZXN04oCZcyBib2R5IGlzIG51bGwsIG9yIHJlcXVlc3TigJlzIGJvZHkgaXMgbm9uLW51bGwgYW5kIHJlcXVlc3TigJlzIGJvZHnigJlzIHNvdXJjZSBpcyBub24tbnVsbFxuICAgIChyZXF1ZXN0LmJvZHkgPT0gbnVsbCB8fCByZXF1ZXN0LmJvZHkuc291cmNlICE9IG51bGwpXG4gICkge1xuICAgIC8vIHRoZW46XG5cbiAgICAvLyAxLiBJZiBmZXRjaFBhcmFtcyBpcyBjYW5jZWxlZCwgdGhlbiByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIG5ldHdvcmsgZXJyb3IgZm9yIGZldGNoUGFyYW1zLlxuICAgIGlmIChpc0NhbmNlbGxlZChmZXRjaFBhcmFtcykpIHtcbiAgICAgIHJldHVybiBtYWtlQXBwcm9wcmlhdGVOZXR3b3JrRXJyb3IoZmV0Y2hQYXJhbXMpXG4gICAgfVxuXG4gICAgLy8gMi4gU2V0IHJlc3BvbnNlIHRvIHRoZSByZXN1bHQgb2YgcnVubmluZyBIVFRQLW5ldHdvcmstb3ItY2FjaGVcbiAgICAvLyBmZXRjaCBnaXZlbiBmZXRjaFBhcmFtcywgaXNBdXRoZW50aWNhdGlvbkZldGNoLCBhbmQgdHJ1ZS5cblxuICAgIC8vIFRPRE8gKHNwZWMpOiBUaGUgc3BlYyBkb2Vzbid0IHNwZWNpZnkgdGhpcyBidXQgd2UgbmVlZCB0byBjYW5jZWxcbiAgICAvLyB0aGUgYWN0aXZlIHJlc3BvbnNlIGJlZm9yZSB3ZSBjYW4gc3RhcnQgYSBuZXcgb25lLlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvZmV0Y2gvaXNzdWVzLzEyOTNcbiAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLmNvbm5lY3Rpb24uZGVzdHJveSgpXG5cbiAgICByZXNwb25zZSA9IGF3YWl0IGh0dHBOZXR3b3JrT3JDYWNoZUZldGNoKFxuICAgICAgZmV0Y2hQYXJhbXMsXG4gICAgICBpc0F1dGhlbnRpY2F0aW9uRmV0Y2gsXG4gICAgICB0cnVlXG4gICAgKVxuICB9XG5cbiAgLy8gMTcuIElmIGlzQXV0aGVudGljYXRpb25GZXRjaCBpcyB0cnVlLCB0aGVuIGNyZWF0ZSBhbiBhdXRoZW50aWNhdGlvbiBlbnRyeVxuICBpZiAoaXNBdXRoZW50aWNhdGlvbkZldGNoKSB7XG4gICAgLy8gVE9ET1xuICB9XG5cbiAgLy8gMTguIFJldHVybiByZXNwb25zZS5cbiAgcmV0dXJuIHJlc3BvbnNlXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNodHRwLW5ldHdvcmstZmV0Y2hcbmFzeW5jIGZ1bmN0aW9uIGh0dHBOZXR3b3JrRmV0Y2ggKFxuICBmZXRjaFBhcmFtcyxcbiAgaW5jbHVkZUNyZWRlbnRpYWxzID0gZmFsc2UsXG4gIGZvcmNlTmV3Q29ubmVjdGlvbiA9IGZhbHNlXG4pIHtcbiAgYXNzZXJ0KCFmZXRjaFBhcmFtcy5jb250cm9sbGVyLmNvbm5lY3Rpb24gfHwgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb25uZWN0aW9uLmRlc3Ryb3llZClcblxuICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLmNvbm5lY3Rpb24gPSB7XG4gICAgYWJvcnQ6IG51bGwsXG4gICAgZGVzdHJveWVkOiBmYWxzZSxcbiAgICBkZXN0cm95IChlcnIpIHtcbiAgICAgIGlmICghdGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlXG4gICAgICAgIHRoaXMuYWJvcnQ/LihlcnIgPz8gbmV3IERPTUV4Y2VwdGlvbignVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZC4nLCAnQWJvcnRFcnJvcicpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIDEuIExldCByZXF1ZXN0IGJlIGZldGNoUGFyYW1z4oCZcyByZXF1ZXN0LlxuICBjb25zdCByZXF1ZXN0ID0gZmV0Y2hQYXJhbXMucmVxdWVzdFxuXG4gIC8vIDIuIExldCByZXNwb25zZSBiZSBudWxsLlxuICBsZXQgcmVzcG9uc2UgPSBudWxsXG5cbiAgLy8gMy4gTGV0IHRpbWluZ0luZm8gYmUgZmV0Y2hQYXJhbXPigJlzIHRpbWluZyBpbmZvLlxuICBjb25zdCB0aW1pbmdJbmZvID0gZmV0Y2hQYXJhbXMudGltaW5nSW5mb1xuXG4gIC8vIDQuIExldCBodHRwQ2FjaGUgYmUgdGhlIHJlc3VsdCBvZiBkZXRlcm1pbmluZyB0aGUgSFRUUCBjYWNoZSBwYXJ0aXRpb24sXG4gIC8vIGdpdmVuIHJlcXVlc3QuXG4gIC8vIFRPRE86IGNhY2hlXG4gIGNvbnN0IGh0dHBDYWNoZSA9IG51bGxcblxuICAvLyA1LiBJZiBodHRwQ2FjaGUgaXMgbnVsbCwgdGhlbiBzZXQgcmVxdWVzdOKAmXMgY2FjaGUgbW9kZSB0byBcIm5vLXN0b3JlXCIuXG4gIGlmIChodHRwQ2FjaGUgPT0gbnVsbCkge1xuICAgIHJlcXVlc3QuY2FjaGUgPSAnbm8tc3RvcmUnXG4gIH1cblxuICAvLyA2LiBMZXQgbmV0d29ya1BhcnRpdGlvbktleSBiZSB0aGUgcmVzdWx0IG9mIGRldGVybWluaW5nIHRoZSBuZXR3b3JrXG4gIC8vIHBhcnRpdGlvbiBrZXkgZ2l2ZW4gcmVxdWVzdC5cbiAgLy8gVE9ET1xuXG4gIC8vIDcuIExldCBuZXdDb25uZWN0aW9uIGJlIFwieWVzXCIgaWYgZm9yY2VOZXdDb25uZWN0aW9uIGlzIHRydWU7IG90aGVyd2lzZVxuICAvLyBcIm5vXCIuXG4gIGNvbnN0IG5ld0Nvbm5lY3Rpb24gPSBmb3JjZU5ld0Nvbm5lY3Rpb24gPyAneWVzJyA6ICdubycgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuXG4gIC8vIDguIFN3aXRjaCBvbiByZXF1ZXN04oCZcyBtb2RlOlxuICBpZiAocmVxdWVzdC5tb2RlID09PSAnd2Vic29ja2V0Jykge1xuICAgIC8vIExldCBjb25uZWN0aW9uIGJlIHRoZSByZXN1bHQgb2Ygb2J0YWluaW5nIGEgV2ViU29ja2V0IGNvbm5lY3Rpb24sXG4gICAgLy8gZ2l2ZW4gcmVxdWVzdOKAmXMgY3VycmVudCBVUkwuXG4gICAgLy8gVE9ET1xuICB9IGVsc2Uge1xuICAgIC8vIExldCBjb25uZWN0aW9uIGJlIHRoZSByZXN1bHQgb2Ygb2J0YWluaW5nIGEgY29ubmVjdGlvbiwgZ2l2ZW5cbiAgICAvLyBuZXR3b3JrUGFydGl0aW9uS2V5LCByZXF1ZXN04oCZcyBjdXJyZW50IFVSTOKAmXMgb3JpZ2luLFxuICAgIC8vIGluY2x1ZGVDcmVkZW50aWFscywgYW5kIGZvcmNlTmV3Q29ubmVjdGlvbi5cbiAgICAvLyBUT0RPXG4gIH1cblxuICAvLyA5LiBSdW4gdGhlc2Ugc3RlcHMsIGJ1dCBhYm9ydCB3aGVuIHRoZSBvbmdvaW5nIGZldGNoIGlzIHRlcm1pbmF0ZWQ6XG5cbiAgLy8gICAgMS4gSWYgY29ubmVjdGlvbiBpcyBmYWlsdXJlLCB0aGVuIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG5cbiAgLy8gICAgMi4gU2V0IHRpbWluZ0luZm/igJlzIGZpbmFsIGNvbm5lY3Rpb24gdGltaW5nIGluZm8gdG8gdGhlIHJlc3VsdCBvZlxuICAvLyAgICBjYWxsaW5nIGNsYW1wIGFuZCBjb2Fyc2VuIGNvbm5lY3Rpb24gdGltaW5nIGluZm8gd2l0aCBjb25uZWN0aW9u4oCZc1xuICAvLyAgICB0aW1pbmcgaW5mbywgdGltaW5nSW5mb+KAmXMgcG9zdC1yZWRpcmVjdCBzdGFydCB0aW1lLCBhbmQgZmV0Y2hQYXJhbXPigJlzXG4gIC8vICAgIGNyb3NzLW9yaWdpbiBpc29sYXRlZCBjYXBhYmlsaXR5LlxuXG4gIC8vICAgIDMuIElmIGNvbm5lY3Rpb24gaXMgbm90IGFuIEhUVFAvMiBjb25uZWN0aW9uLCByZXF1ZXN04oCZcyBib2R5IGlzIG5vbi1udWxsLFxuICAvLyAgICBhbmQgcmVxdWVzdOKAmXMgYm9keeKAmXMgc291cmNlIGlzIG51bGwsIHRoZW4gYXBwZW5kIChgVHJhbnNmZXItRW5jb2RpbmdgLFxuICAvLyAgICBgY2h1bmtlZGApIHRvIHJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuXG4gIC8vICAgIDQuIFNldCB0aW1pbmdJbmZv4oCZcyBmaW5hbCBuZXR3b3JrLXJlcXVlc3Qgc3RhcnQgdGltZSB0byB0aGUgY29hcnNlbmVkXG4gIC8vICAgIHNoYXJlZCBjdXJyZW50IHRpbWUgZ2l2ZW4gZmV0Y2hQYXJhbXPigJlzIGNyb3NzLW9yaWdpbiBpc29sYXRlZFxuICAvLyAgICBjYXBhYmlsaXR5LlxuXG4gIC8vICAgIDUuIFNldCByZXNwb25zZSB0byB0aGUgcmVzdWx0IG9mIG1ha2luZyBhbiBIVFRQIHJlcXVlc3Qgb3ZlciBjb25uZWN0aW9uXG4gIC8vICAgIHVzaW5nIHJlcXVlc3Qgd2l0aCB0aGUgZm9sbG93aW5nIGNhdmVhdHM6XG5cbiAgLy8gICAgICAgIC0gRm9sbG93IHRoZSByZWxldmFudCByZXF1aXJlbWVudHMgZnJvbSBIVFRQLiBbSFRUUF0gW0hUVFAtU0VNQU5USUNTXVxuICAvLyAgICAgICAgW0hUVFAtQ09ORF0gW0hUVFAtQ0FDSElOR10gW0hUVFAtQVVUSF1cblxuICAvLyAgICAgICAgLSBJZiByZXF1ZXN04oCZcyBib2R5IGlzIG5vbi1udWxsLCBhbmQgcmVxdWVzdOKAmXMgYm9keeKAmXMgc291cmNlIGlzIG51bGwsXG4gIC8vICAgICAgICB0aGVuIHRoZSB1c2VyIGFnZW50IG1heSBoYXZlIGEgYnVmZmVyIG9mIHVwIHRvIDY0IGtpYmlieXRlcyBhbmQgc3RvcmVcbiAgLy8gICAgICAgIGEgcGFydCBvZiByZXF1ZXN04oCZcyBib2R5IGluIHRoYXQgYnVmZmVyLiBJZiB0aGUgdXNlciBhZ2VudCByZWFkcyBmcm9tXG4gIC8vICAgICAgICByZXF1ZXN04oCZcyBib2R5IGJleW9uZCB0aGF0IGJ1ZmZlcuKAmXMgc2l6ZSBhbmQgdGhlIHVzZXIgYWdlbnQgbmVlZHMgdG9cbiAgLy8gICAgICAgIHJlc2VuZCByZXF1ZXN0LCB0aGVuIGluc3RlYWQgcmV0dXJuIGEgbmV0d29yayBlcnJvci5cblxuICAvLyAgICAgICAgLSBTZXQgdGltaW5nSW5mb+KAmXMgZmluYWwgbmV0d29yay1yZXNwb25zZSBzdGFydCB0aW1lIHRvIHRoZSBjb2Fyc2VuZWRcbiAgLy8gICAgICAgIHNoYXJlZCBjdXJyZW50IHRpbWUgZ2l2ZW4gZmV0Y2hQYXJhbXPigJlzIGNyb3NzLW9yaWdpbiBpc29sYXRlZCBjYXBhYmlsaXR5LFxuICAvLyAgICAgICAgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHVzZXIgYWdlbnTigJlzIEhUVFAgcGFyc2VyIHJlY2VpdmVzIHRoZSBmaXJzdCBieXRlXG4gIC8vICAgICAgICBvZiB0aGUgcmVzcG9uc2UgKGUuZy4sIGZyYW1lIGhlYWRlciBieXRlcyBmb3IgSFRUUC8yIG9yIHJlc3BvbnNlIHN0YXR1c1xuICAvLyAgICAgICAgbGluZSBmb3IgSFRUUC8xLngpLlxuXG4gIC8vICAgICAgICAtIFdhaXQgdW50aWwgYWxsIHRoZSBoZWFkZXJzIGFyZSB0cmFuc21pdHRlZC5cblxuICAvLyAgICAgICAgLSBBbnkgcmVzcG9uc2VzIHdob3NlIHN0YXR1cyBpcyBpbiB0aGUgcmFuZ2UgMTAwIHRvIDE5OSwgaW5jbHVzaXZlLFxuICAvLyAgICAgICAgYW5kIGlzIG5vdCAxMDEsIGFyZSB0byBiZSBpZ25vcmVkLCBleGNlcHQgZm9yIHRoZSBwdXJwb3NlcyBvZiBzZXR0aW5nXG4gIC8vICAgICAgICB0aW1pbmdJbmZv4oCZcyBmaW5hbCBuZXR3b3JrLXJlc3BvbnNlIHN0YXJ0IHRpbWUgYWJvdmUuXG5cbiAgLy8gICAgLSBJZiByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdCBjb250YWlucyBgVHJhbnNmZXItRW5jb2RpbmdgL2BjaHVua2VkYCBhbmRcbiAgLy8gICAgcmVzcG9uc2UgaXMgdHJhbnNmZXJyZWQgdmlhIEhUVFAvMS4wIG9yIG9sZGVyLCB0aGVuIHJldHVybiBhIG5ldHdvcmtcbiAgLy8gICAgZXJyb3IuXG5cbiAgLy8gICAgLSBJZiB0aGUgSFRUUCByZXF1ZXN0IHJlc3VsdHMgaW4gYSBUTFMgY2xpZW50IGNlcnRpZmljYXRlIGRpYWxvZywgdGhlbjpcblxuICAvLyAgICAgICAgMS4gSWYgcmVxdWVzdOKAmXMgd2luZG93IGlzIGFuIGVudmlyb25tZW50IHNldHRpbmdzIG9iamVjdCwgbWFrZSB0aGVcbiAgLy8gICAgICAgIGRpYWxvZyBhdmFpbGFibGUgaW4gcmVxdWVzdOKAmXMgd2luZG93LlxuXG4gIC8vICAgICAgICAyLiBPdGhlcndpc2UsIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG5cbiAgLy8gVG8gdHJhbnNtaXQgcmVxdWVzdOKAmXMgYm9keSBib2R5LCBydW4gdGhlc2Ugc3RlcHM6XG4gIGxldCByZXF1ZXN0Qm9keSA9IG51bGxcbiAgLy8gMS4gSWYgYm9keSBpcyBudWxsIGFuZCBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXF1ZXN0IGVuZC1vZi1ib2R5IGlzXG4gIC8vIG5vbi1udWxsLCB0aGVuIHF1ZXVlIGEgZmV0Y2ggdGFzayBnaXZlbiBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXF1ZXN0XG4gIC8vIGVuZC1vZi1ib2R5IGFuZCBmZXRjaFBhcmFtc+KAmXMgdGFzayBkZXN0aW5hdGlvbi5cbiAgaWYgKHJlcXVlc3QuYm9keSA9PSBudWxsICYmIGZldGNoUGFyYW1zLnByb2Nlc3NSZXF1ZXN0RW5kT2ZCb2R5KSB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gZmV0Y2hQYXJhbXMucHJvY2Vzc1JlcXVlc3RFbmRPZkJvZHkoKSlcbiAgfSBlbHNlIGlmIChyZXF1ZXN0LmJvZHkgIT0gbnVsbCkge1xuICAgIC8vIDIuIE90aGVyd2lzZSwgaWYgYm9keSBpcyBub24tbnVsbDpcblxuICAgIC8vICAgIDEuIExldCBwcm9jZXNzQm9keUNodW5rIGdpdmVuIGJ5dGVzIGJlIHRoZXNlIHN0ZXBzOlxuICAgIGNvbnN0IHByb2Nlc3NCb2R5Q2h1bmsgPSBhc3luYyBmdW5jdGlvbiAqIChieXRlcykge1xuICAgICAgLy8gMS4gSWYgdGhlIG9uZ29pbmcgZmV0Y2ggaXMgdGVybWluYXRlZCwgdGhlbiBhYm9ydCB0aGVzZSBzdGVwcy5cbiAgICAgIGlmIChpc0NhbmNlbGxlZChmZXRjaFBhcmFtcykpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIFJ1biB0aGlzIHN0ZXAgaW4gcGFyYWxsZWw6IHRyYW5zbWl0IGJ5dGVzLlxuICAgICAgeWllbGQgYnl0ZXNcblxuICAgICAgLy8gMy4gSWYgZmV0Y2hQYXJhbXPigJlzIHByb2Nlc3MgcmVxdWVzdCBib2R5IGlzIG5vbi1udWxsLCB0aGVuIHJ1blxuICAgICAgLy8gZmV0Y2hQYXJhbXPigJlzIHByb2Nlc3MgcmVxdWVzdCBib2R5IGdpdmVuIGJ5dGVz4oCZcyBsZW5ndGguXG4gICAgICBmZXRjaFBhcmFtcy5wcm9jZXNzUmVxdWVzdEJvZHlDaHVua0xlbmd0aD8uKGJ5dGVzLmJ5dGVMZW5ndGgpXG4gICAgfVxuXG4gICAgLy8gMi4gTGV0IHByb2Nlc3NFbmRPZkJvZHkgYmUgdGhlc2Ugc3RlcHM6XG4gICAgY29uc3QgcHJvY2Vzc0VuZE9mQm9keSA9ICgpID0+IHtcbiAgICAgIC8vIDEuIElmIGZldGNoUGFyYW1zIGlzIGNhbmNlbGVkLCB0aGVuIGFib3J0IHRoZXNlIHN0ZXBzLlxuICAgICAgaWYgKGlzQ2FuY2VsbGVkKGZldGNoUGFyYW1zKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gMi4gSWYgZmV0Y2hQYXJhbXPigJlzIHByb2Nlc3MgcmVxdWVzdCBlbmQtb2YtYm9keSBpcyBub24tbnVsbCxcbiAgICAgIC8vIHRoZW4gcnVuIGZldGNoUGFyYW1z4oCZcyBwcm9jZXNzIHJlcXVlc3QgZW5kLW9mLWJvZHkuXG4gICAgICBpZiAoZmV0Y2hQYXJhbXMucHJvY2Vzc1JlcXVlc3RFbmRPZkJvZHkpIHtcbiAgICAgICAgZmV0Y2hQYXJhbXMucHJvY2Vzc1JlcXVlc3RFbmRPZkJvZHkoKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDMuIExldCBwcm9jZXNzQm9keUVycm9yIGdpdmVuIGUgYmUgdGhlc2Ugc3RlcHM6XG4gICAgY29uc3QgcHJvY2Vzc0JvZHlFcnJvciA9IChlKSA9PiB7XG4gICAgICAvLyAxLiBJZiBmZXRjaFBhcmFtcyBpcyBjYW5jZWxlZCwgdGhlbiBhYm9ydCB0aGVzZSBzdGVwcy5cbiAgICAgIGlmIChpc0NhbmNlbGxlZChmZXRjaFBhcmFtcykpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIElmIGUgaXMgYW4gXCJBYm9ydEVycm9yXCIgRE9NRXhjZXB0aW9uLCB0aGVuIGFib3J0IGZldGNoUGFyYW1z4oCZcyBjb250cm9sbGVyLlxuICAgICAgaWYgKGUubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuYWJvcnQoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci50ZXJtaW5hdGUoZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA0LiBJbmNyZW1lbnRhbGx5IHJlYWQgcmVxdWVzdOKAmXMgYm9keSBnaXZlbiBwcm9jZXNzQm9keUNodW5rLCBwcm9jZXNzRW5kT2ZCb2R5LFxuICAgIC8vIHByb2Nlc3NCb2R5RXJyb3IsIGFuZCBmZXRjaFBhcmFtc+KAmXMgdGFzayBkZXN0aW5hdGlvbi5cbiAgICByZXF1ZXN0Qm9keSA9IChhc3luYyBmdW5jdGlvbiAqICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgYnl0ZXMgb2YgcmVxdWVzdC5ib2R5LnN0cmVhbSkge1xuICAgICAgICAgIHlpZWxkICogcHJvY2Vzc0JvZHlDaHVuayhieXRlcylcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzRW5kT2ZCb2R5KClcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBwcm9jZXNzQm9keUVycm9yKGVycilcbiAgICAgIH1cbiAgICB9KSgpXG4gIH1cblxuICB0cnkge1xuICAgIC8vIHNvY2tldCBpcyBvbmx5IHByb3ZpZGVkIGZvciB3ZWJzb2NrZXRzXG4gICAgY29uc3QgeyBib2R5LCBzdGF0dXMsIHN0YXR1c1RleHQsIGhlYWRlcnNMaXN0LCBzb2NrZXQgfSA9IGF3YWl0IGRpc3BhdGNoKHsgYm9keTogcmVxdWVzdEJvZHkgfSlcblxuICAgIGlmIChzb2NrZXQpIHtcbiAgICAgIHJlc3BvbnNlID0gbWFrZVJlc3BvbnNlKHsgc3RhdHVzLCBzdGF0dXNUZXh0LCBoZWFkZXJzTGlzdCwgc29ja2V0IH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGl0ZXJhdG9yID0gYm9keVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKVxuICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5uZXh0ID0gKCkgPT4gaXRlcmF0b3IubmV4dCgpXG5cbiAgICAgIHJlc3BvbnNlID0gbWFrZVJlc3BvbnNlKHsgc3RhdHVzLCBzdGF0dXNUZXh0LCBoZWFkZXJzTGlzdCB9KVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gMTAuIElmIGFib3J0ZWQsIHRoZW46XG4gICAgaWYgKGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgIC8vIDEuIElmIGNvbm5lY3Rpb24gdXNlcyBIVFRQLzIsIHRoZW4gdHJhbnNtaXQgYW4gUlNUX1NUUkVBTSBmcmFtZS5cbiAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29ubmVjdGlvbi5kZXN0cm95KClcblxuICAgICAgLy8gMi4gUmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBuZXR3b3JrIGVycm9yIGZvciBmZXRjaFBhcmFtcy5cbiAgICAgIHJldHVybiBtYWtlQXBwcm9wcmlhdGVOZXR3b3JrRXJyb3IoZmV0Y2hQYXJhbXMsIGVycilcbiAgICB9XG5cbiAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcihlcnIpXG4gIH1cblxuICAvLyAxMS4gTGV0IHB1bGxBbGdvcml0aG0gYmUgYW4gYWN0aW9uIHRoYXQgcmVzdW1lcyB0aGUgb25nb2luZyBmZXRjaFxuICAvLyBpZiBpdCBpcyBzdXNwZW5kZWQuXG4gIGNvbnN0IHB1bGxBbGdvcml0aG0gPSAoKSA9PiB7XG4gICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5yZXN1bWUoKVxuICB9XG5cbiAgLy8gMTIuIExldCBjYW5jZWxBbGdvcml0aG0gYmUgYW4gYWxnb3JpdGhtIHRoYXQgYWJvcnRzIGZldGNoUGFyYW1z4oCZc1xuICAvLyBjb250cm9sbGVyIHdpdGggcmVhc29uLCBnaXZlbiByZWFzb24uXG4gIGNvbnN0IGNhbmNlbEFsZ29yaXRobSA9IChyZWFzb24pID0+IHtcbiAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLmFib3J0KHJlYXNvbilcbiAgfVxuXG4gIC8vIDEzLiBMZXQgaGlnaFdhdGVyTWFyayBiZSBhIG5vbi1uZWdhdGl2ZSwgbm9uLU5hTiBudW1iZXIsIGNob3NlbiBieVxuICAvLyB0aGUgdXNlciBhZ2VudC5cbiAgLy8gVE9ET1xuXG4gIC8vIDE0LiBMZXQgc2l6ZUFsZ29yaXRobSBiZSBhbiBhbGdvcml0aG0gdGhhdCBhY2NlcHRzIGEgY2h1bmsgb2JqZWN0XG4gIC8vIGFuZCByZXR1cm5zIGEgbm9uLW5lZ2F0aXZlLCBub24tTmFOLCBub24taW5maW5pdGUgbnVtYmVyLCBjaG9zZW4gYnkgdGhlIHVzZXIgYWdlbnQuXG4gIC8vIFRPRE9cblxuICAvLyAxNS4gTGV0IHN0cmVhbSBiZSBhIG5ldyBSZWFkYWJsZVN0cmVhbS5cbiAgLy8gMTYuIFNldCB1cCBzdHJlYW0gd2l0aCBwdWxsQWxnb3JpdGhtIHNldCB0byBwdWxsQWxnb3JpdGhtLFxuICAvLyBjYW5jZWxBbGdvcml0aG0gc2V0IHRvIGNhbmNlbEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyayBzZXQgdG9cbiAgLy8gaGlnaFdhdGVyTWFyaywgYW5kIHNpemVBbGdvcml0aG0gc2V0IHRvIHNpemVBbGdvcml0aG0uXG4gIGlmICghUmVhZGFibGVTdHJlYW0pIHtcbiAgICBSZWFkYWJsZVN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbS93ZWInKS5SZWFkYWJsZVN0cmVhbVxuICB9XG5cbiAgY29uc3Qgc3RyZWFtID0gbmV3IFJlYWRhYmxlU3RyZWFtKFxuICAgIHtcbiAgICAgIGFzeW5jIHN0YXJ0IChjb250cm9sbGVyKSB7XG4gICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29udHJvbGxlciA9IGNvbnRyb2xsZXJcbiAgICAgIH0sXG4gICAgICBhc3luYyBwdWxsIChjb250cm9sbGVyKSB7XG4gICAgICAgIGF3YWl0IHB1bGxBbGdvcml0aG0oY29udHJvbGxlcilcbiAgICAgIH0sXG4gICAgICBhc3luYyBjYW5jZWwgKHJlYXNvbikge1xuICAgICAgICBhd2FpdCBjYW5jZWxBbGdvcml0aG0ocmVhc29uKVxuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgaGlnaFdhdGVyTWFyazogMCxcbiAgICAgIHNpemUgKCkge1xuICAgICAgICByZXR1cm4gMVxuICAgICAgfVxuICAgIH1cbiAgKVxuXG4gIC8vIDE3LiBSdW4gdGhlc2Ugc3RlcHMsIGJ1dCBhYm9ydCB3aGVuIHRoZSBvbmdvaW5nIGZldGNoIGlzIHRlcm1pbmF0ZWQ6XG5cbiAgLy8gICAgMS4gU2V0IHJlc3BvbnNl4oCZcyBib2R5IHRvIGEgbmV3IGJvZHkgd2hvc2Ugc3RyZWFtIGlzIHN0cmVhbS5cbiAgcmVzcG9uc2UuYm9keSA9IHsgc3RyZWFtIH1cblxuICAvLyAgICAyLiBJZiByZXNwb25zZSBpcyBub3QgYSBuZXR3b3JrIGVycm9yIGFuZCByZXF1ZXN04oCZcyBjYWNoZSBtb2RlIGlzXG4gIC8vICAgIG5vdCBcIm5vLXN0b3JlXCIsIHRoZW4gdXBkYXRlIHJlc3BvbnNlIGluIGh0dHBDYWNoZSBmb3IgcmVxdWVzdC5cbiAgLy8gICAgVE9ET1xuXG4gIC8vICAgIDMuIElmIGluY2x1ZGVDcmVkZW50aWFscyBpcyB0cnVlIGFuZCB0aGUgdXNlciBhZ2VudCBpcyBub3QgY29uZmlndXJlZFxuICAvLyAgICB0byBibG9jayBjb29raWVzIGZvciByZXF1ZXN0IChzZWUgc2VjdGlvbiA3IG9mIFtDT09LSUVTXSksIHRoZW4gcnVuIHRoZVxuICAvLyAgICBcInNldC1jb29raWUtc3RyaW5nXCIgcGFyc2luZyBhbGdvcml0aG0gKHNlZSBzZWN0aW9uIDUuMiBvZiBbQ09PS0lFU10pIG9uXG4gIC8vICAgIHRoZSB2YWx1ZSBvZiBlYWNoIGhlYWRlciB3aG9zZSBuYW1lIGlzIGEgYnl0ZS1jYXNlLWluc2Vuc2l0aXZlIG1hdGNoIGZvclxuICAvLyAgICBgU2V0LUNvb2tpZWAgaW4gcmVzcG9uc2XigJlzIGhlYWRlciBsaXN0LCBpZiBhbnksIGFuZCByZXF1ZXN04oCZcyBjdXJyZW50IFVSTC5cbiAgLy8gICAgVE9ET1xuXG4gIC8vIDE4LiBJZiBhYm9ydGVkLCB0aGVuOlxuICAvLyBUT0RPXG5cbiAgLy8gMTkuIFJ1biB0aGVzZSBzdGVwcyBpbiBwYXJhbGxlbDpcblxuICAvLyAgICAxLiBSdW4gdGhlc2Ugc3RlcHMsIGJ1dCBhYm9ydCB3aGVuIGZldGNoUGFyYW1zIGlzIGNhbmNlbGVkOlxuICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLm9uKCd0ZXJtaW5hdGVkJywgb25BYm9ydGVkKVxuICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLnJlc3VtZSA9IGFzeW5jICgpID0+IHtcbiAgICAvLyAxLiBXaGlsZSB0cnVlXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIC8vIDEtMy4gU2VlIG9uRGF0YS4uLlxuXG4gICAgICAvLyA0LiBTZXQgYnl0ZXMgdG8gdGhlIHJlc3VsdCBvZiBoYW5kbGluZyBjb250ZW50IGNvZGluZ3MgZ2l2ZW5cbiAgICAgIC8vIGNvZGluZ3MgYW5kIGJ5dGVzLlxuICAgICAgbGV0IGJ5dGVzXG4gICAgICBsZXQgaXNGYWlsdXJlXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCBmZXRjaFBhcmFtcy5jb250cm9sbGVyLm5leHQoKVxuXG4gICAgICAgIGlmIChpc0Fib3J0ZWQoZmV0Y2hQYXJhbXMpKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ5dGVzID0gZG9uZSA/IHVuZGVmaW5lZCA6IHZhbHVlXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuZW5kZWQgJiYgIXRpbWluZ0luZm8uZW5jb2RlZEJvZHlTaXplKSB7XG4gICAgICAgICAgLy8gemxpYiBkb2Vzbid0IGxpa2UgZW1wdHkgc3RyZWFtcy5cbiAgICAgICAgICBieXRlcyA9IHVuZGVmaW5lZFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ5dGVzID0gZXJyXG5cbiAgICAgICAgICAvLyBlcnIgbWF5IGJlIHByb3BhZ2F0ZWQgZnJvbSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgcmVhZGFibGVzdHJlYW0uY2FuY2VsLFxuICAgICAgICAgIC8vIHdoaWNoIG1pZ2h0IG5vdCBiZSBhbiBlcnJvci4gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzIwMDlcbiAgICAgICAgICBpc0ZhaWx1cmUgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGJ5dGVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gMi4gT3RoZXJ3aXNlLCBpZiB0aGUgYnl0ZXMgdHJhbnNtaXNzaW9uIGZvciByZXNwb25zZeKAmXMgbWVzc2FnZVxuICAgICAgICAvLyBib2R5IGlzIGRvbmUgbm9ybWFsbHkgYW5kIHN0cmVhbSBpcyByZWFkYWJsZSwgdGhlbiBjbG9zZVxuICAgICAgICAvLyBzdHJlYW0sIGZpbmFsaXplIHJlc3BvbnNlIGZvciBmZXRjaFBhcmFtcyBhbmQgcmVzcG9uc2UsIGFuZFxuICAgICAgICAvLyBhYm9ydCB0aGVzZSBpbi1wYXJhbGxlbCBzdGVwcy5cbiAgICAgICAgcmVhZGFibGVTdHJlYW1DbG9zZShmZXRjaFBhcmFtcy5jb250cm9sbGVyLmNvbnRyb2xsZXIpXG5cbiAgICAgICAgZmluYWxpemVSZXNwb25zZShmZXRjaFBhcmFtcywgcmVzcG9uc2UpXG5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDUuIEluY3JlYXNlIHRpbWluZ0luZm/igJlzIGRlY29kZWQgYm9keSBzaXplIGJ5IGJ5dGVz4oCZcyBsZW5ndGguXG4gICAgICB0aW1pbmdJbmZvLmRlY29kZWRCb2R5U2l6ZSArPSBieXRlcz8uYnl0ZUxlbmd0aCA/PyAwXG5cbiAgICAgIC8vIDYuIElmIGJ5dGVzIGlzIGZhaWx1cmUsIHRoZW4gdGVybWluYXRlIGZldGNoUGFyYW1z4oCZcyBjb250cm9sbGVyLlxuICAgICAgaWYgKGlzRmFpbHVyZSkge1xuICAgICAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLnRlcm1pbmF0ZShieXRlcylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDcuIEVucXVldWUgYSBVaW50OEFycmF5IHdyYXBwaW5nIGFuIEFycmF5QnVmZmVyIGNvbnRhaW5pbmcgYnl0ZXNcbiAgICAgIC8vIGludG8gc3RyZWFtLlxuICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb250cm9sbGVyLmVucXVldWUobmV3IFVpbnQ4QXJyYXkoYnl0ZXMpKVxuXG4gICAgICAvLyA4LiBJZiBzdHJlYW0gaXMgZXJyb3JlZCwgdGhlbiB0ZXJtaW5hdGUgdGhlIG9uZ29pbmcgZmV0Y2guXG4gICAgICBpZiAoaXNFcnJvcmVkKHN0cmVhbSkpIHtcbiAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci50ZXJtaW5hdGUoKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gOS4gSWYgc3RyZWFtIGRvZXNu4oCZdCBuZWVkIG1vcmUgZGF0YSBhc2sgdGhlIHVzZXIgYWdlbnQgdG8gc3VzcGVuZFxuICAgICAgLy8gdGhlIG9uZ29pbmcgZmV0Y2guXG4gICAgICBpZiAoIWZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29udHJvbGxlci5kZXNpcmVkU2l6ZSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyAgICAyLiBJZiBhYm9ydGVkLCB0aGVuOlxuICBmdW5jdGlvbiBvbkFib3J0ZWQgKHJlYXNvbikge1xuICAgIC8vIDIuIElmIGZldGNoUGFyYW1zIGlzIGFib3J0ZWQsIHRoZW46XG4gICAgaWYgKGlzQWJvcnRlZChmZXRjaFBhcmFtcykpIHtcbiAgICAgIC8vIDEuIFNldCByZXNwb25zZeKAmXMgYWJvcnRlZCBmbGFnLlxuICAgICAgcmVzcG9uc2UuYWJvcnRlZCA9IHRydWVcblxuICAgICAgLy8gMi4gSWYgc3RyZWFtIGlzIHJlYWRhYmxlLCB0aGVuIGVycm9yIHN0cmVhbSB3aXRoIHRoZSByZXN1bHQgb2ZcbiAgICAgIC8vICAgIGRlc2VyaWFsaXplIGEgc2VyaWFsaXplZCBhYm9ydCByZWFzb24gZ2l2ZW4gZmV0Y2hQYXJhbXPigJlzXG4gICAgICAvLyAgICBjb250cm9sbGVy4oCZcyBzZXJpYWxpemVkIGFib3J0IHJlYXNvbiBhbmQgYW5cbiAgICAgIC8vICAgIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmVhbG0uXG4gICAgICBpZiAoaXNSZWFkYWJsZShzdHJlYW0pKSB7XG4gICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29udHJvbGxlci5lcnJvcihcbiAgICAgICAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLnNlcmlhbGl6ZWRBYm9ydFJlYXNvblxuICAgICAgICApXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDMuIE90aGVyd2lzZSwgaWYgc3RyZWFtIGlzIHJlYWRhYmxlLCBlcnJvciBzdHJlYW0gd2l0aCBhIFR5cGVFcnJvci5cbiAgICAgIGlmIChpc1JlYWRhYmxlKHN0cmVhbSkpIHtcbiAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb250cm9sbGVyLmVycm9yKG5ldyBUeXBlRXJyb3IoJ3Rlcm1pbmF0ZWQnLCB7XG4gICAgICAgICAgY2F1c2U6IGlzRXJyb3JMaWtlKHJlYXNvbikgPyByZWFzb24gOiB1bmRlZmluZWRcbiAgICAgICAgfSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNC4gSWYgY29ubmVjdGlvbiB1c2VzIEhUVFAvMiwgdGhlbiB0cmFuc21pdCBhbiBSU1RfU1RSRUFNIGZyYW1lLlxuICAgIC8vIDUuIE90aGVyd2lzZSwgdGhlIHVzZXIgYWdlbnQgc2hvdWxkIGNsb3NlIGNvbm5lY3Rpb24gdW5sZXNzIGl0IHdvdWxkIGJlIGJhZCBmb3IgcGVyZm9ybWFuY2UgdG8gZG8gc28uXG4gICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb25uZWN0aW9uLmRlc3Ryb3koKVxuICB9XG5cbiAgLy8gMjAuIFJldHVybiByZXNwb25zZS5cbiAgcmV0dXJuIHJlc3BvbnNlXG5cbiAgYXN5bmMgZnVuY3Rpb24gZGlzcGF0Y2ggKHsgYm9keSB9KSB7XG4gICAgY29uc3QgdXJsID0gcmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdClcbiAgICAvKiogQHR5cGUge2ltcG9ydCgnLi4vLi4nKS5BZ2VudH0gKi9cbiAgICBjb25zdCBhZ2VudCA9IGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuZGlzcGF0Y2hlclxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IGFnZW50LmRpc3BhdGNoKFxuICAgICAge1xuICAgICAgICBwYXRoOiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoLFxuICAgICAgICBvcmlnaW46IHVybC5vcmlnaW4sXG4gICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgIGJvZHk6IGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuZGlzcGF0Y2hlci5pc01vY2tBY3RpdmUgPyByZXF1ZXN0LmJvZHkgJiYgKHJlcXVlc3QuYm9keS5zb3VyY2UgfHwgcmVxdWVzdC5ib2R5LnN0cmVhbSkgOiBib2R5LFxuICAgICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnNMaXN0LmVudHJpZXMsXG4gICAgICAgIG1heFJlZGlyZWN0aW9uczogMCxcbiAgICAgICAgdXBncmFkZTogcmVxdWVzdC5tb2RlID09PSAnd2Vic29ja2V0JyA/ICd3ZWJzb2NrZXQnIDogdW5kZWZpbmVkXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBib2R5OiBudWxsLFxuICAgICAgICBhYm9ydDogbnVsbCxcblxuICAgICAgICBvbkNvbm5lY3QgKGFib3J0KSB7XG4gICAgICAgICAgLy8gVE9ETyAoZml4KTogRG8gd2UgbmVlZCBjb25uZWN0aW9uIGhlcmU/XG4gICAgICAgICAgY29uc3QgeyBjb25uZWN0aW9uIH0gPSBmZXRjaFBhcmFtcy5jb250cm9sbGVyXG5cbiAgICAgICAgICBpZiAoY29ubmVjdGlvbi5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIGFib3J0KG5ldyBET01FeGNlcHRpb24oJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuJywgJ0Fib3J0RXJyb3InKSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5vbigndGVybWluYXRlZCcsIGFib3J0KVxuICAgICAgICAgICAgdGhpcy5hYm9ydCA9IGNvbm5lY3Rpb24uYWJvcnQgPSBhYm9ydFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBvbkhlYWRlcnMgKHN0YXR1cywgaGVhZGVyc0xpc3QsIHJlc3VtZSwgc3RhdHVzVGV4dCkge1xuICAgICAgICAgIGlmIChzdGF0dXMgPCAyMDApIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCBjb2RpbmdzID0gW11cbiAgICAgICAgICBsZXQgbG9jYXRpb24gPSAnJ1xuXG4gICAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKClcblxuICAgICAgICAgIC8vIEZvciBIMiwgdGhlIGhlYWRlcnMgYXJlIGEgcGxhaW4gSlMgb2JqZWN0XG4gICAgICAgICAgLy8gV2UgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGVtIGFuZCBpdGVyYXRlIGFjY29yZGluZ2x5XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaGVhZGVyc0xpc3QpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGhlYWRlcnNMaXN0Lmxlbmd0aDsgbiArPSAyKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlcnNMaXN0W24gKyAwXS50b1N0cmluZygnbGF0aW4xJylcbiAgICAgICAgICAgICAgY29uc3QgdmFsID0gaGVhZGVyc0xpc3RbbiArIDFdLnRvU3RyaW5nKCdsYXRpbjEnKVxuICAgICAgICAgICAgICBpZiAoa2V5LnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LWVuY29kaW5nJykge1xuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM3MjMxI3NlY3Rpb24tMy4xLjIuMVxuICAgICAgICAgICAgICAgIC8vIFwiQWxsIGNvbnRlbnQtY29kaW5nIHZhbHVlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZS4uLlwiXG4gICAgICAgICAgICAgICAgY29kaW5ncyA9IHZhbC50b0xvd2VyQ2FzZSgpLnNwbGl0KCcsJykubWFwKCh4KSA9PiB4LnRyaW0oKSlcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2xvY2F0aW9uJykge1xuICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gdmFsXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBoZWFkZXJzW2tIZWFkZXJzTGlzdF0uYXBwZW5kKGtleSwgdmFsKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaGVhZGVyc0xpc3QpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGhlYWRlcnNMaXN0W2tleV1cbiAgICAgICAgICAgICAgaWYgKGtleS50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC1lbmNvZGluZycpIHtcbiAgICAgICAgICAgICAgICAvLyBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNzIzMSNzZWN0aW9uLTMuMS4yLjFcbiAgICAgICAgICAgICAgICAvLyBcIkFsbCBjb250ZW50LWNvZGluZyB2YWx1ZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUuLi5cIlxuICAgICAgICAgICAgICAgIGNvZGluZ3MgPSB2YWwudG9Mb3dlckNhc2UoKS5zcGxpdCgnLCcpLm1hcCgoeCkgPT4geC50cmltKCkpLnJldmVyc2UoKVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS50b0xvd2VyQ2FzZSgpID09PSAnbG9jYXRpb24nKSB7XG4gICAgICAgICAgICAgICAgbG9jYXRpb24gPSB2YWxcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGhlYWRlcnNba0hlYWRlcnNMaXN0XS5hcHBlbmQoa2V5LCB2YWwpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5ib2R5ID0gbmV3IFJlYWRhYmxlKHsgcmVhZDogcmVzdW1lIH0pXG5cbiAgICAgICAgICBjb25zdCBkZWNvZGVycyA9IFtdXG5cbiAgICAgICAgICBjb25zdCB3aWxsRm9sbG93ID0gcmVxdWVzdC5yZWRpcmVjdCA9PT0gJ2ZvbGxvdycgJiZcbiAgICAgICAgICAgIGxvY2F0aW9uICYmXG4gICAgICAgICAgICByZWRpcmVjdFN0YXR1c1NldC5oYXMoc3RhdHVzKVxuXG4gICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9IZWFkZXJzL0NvbnRlbnQtRW5jb2RpbmdcbiAgICAgICAgICBpZiAocmVxdWVzdC5tZXRob2QgIT09ICdIRUFEJyAmJiByZXF1ZXN0Lm1ldGhvZCAhPT0gJ0NPTk5FQ1QnICYmICFudWxsQm9keVN0YXR1cy5pbmNsdWRlcyhzdGF0dXMpICYmICF3aWxsRm9sbG93KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvZGluZyBvZiBjb2RpbmdzKSB7XG4gICAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM5MTEyLmh0bWwjc2VjdGlvbi03LjJcbiAgICAgICAgICAgICAgaWYgKGNvZGluZyA9PT0gJ3gtZ3ppcCcgfHwgY29kaW5nID09PSAnZ3ppcCcpIHtcbiAgICAgICAgICAgICAgICBkZWNvZGVycy5wdXNoKHpsaWIuY3JlYXRlR3VuemlwKHtcbiAgICAgICAgICAgICAgICAgIC8vIEJlIGxlc3Mgc3RyaWN0IHdoZW4gZGVjb2RpbmcgY29tcHJlc3NlZCByZXNwb25zZXMsIHNpbmNlIHNvbWV0aW1lc1xuICAgICAgICAgICAgICAgICAgLy8gc2VydmVycyBzZW5kIHNsaWdodGx5IGludmFsaWQgcmVzcG9uc2VzIHRoYXQgYXJlIHN0aWxsIGFjY2VwdGVkXG4gICAgICAgICAgICAgICAgICAvLyBieSBjb21tb24gYnJvd3NlcnMuXG4gICAgICAgICAgICAgICAgICAvLyBBbHdheXMgdXNpbmcgWl9TWU5DX0ZMVVNIIGlzIHdoYXQgY1VSTCBkb2VzLlxuICAgICAgICAgICAgICAgICAgZmx1c2g6IHpsaWIuY29uc3RhbnRzLlpfU1lOQ19GTFVTSCxcbiAgICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoOiB6bGliLmNvbnN0YW50cy5aX1NZTkNfRkxVU0hcbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RpbmcgPT09ICdkZWZsYXRlJykge1xuICAgICAgICAgICAgICAgIGRlY29kZXJzLnB1c2goemxpYi5jcmVhdGVJbmZsYXRlKCkpXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kaW5nID09PSAnYnInKSB7XG4gICAgICAgICAgICAgICAgZGVjb2RlcnMucHVzaCh6bGliLmNyZWF0ZUJyb3RsaURlY29tcHJlc3MoKSlcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWNvZGVycy5sZW5ndGggPSAwXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgc3RhdHVzVGV4dCxcbiAgICAgICAgICAgIGhlYWRlcnNMaXN0OiBoZWFkZXJzW2tIZWFkZXJzTGlzdF0sXG4gICAgICAgICAgICBib2R5OiBkZWNvZGVycy5sZW5ndGhcbiAgICAgICAgICAgICAgPyBwaXBlbGluZSh0aGlzLmJvZHksIC4uLmRlY29kZXJzLCAoKSA9PiB7IH0pXG4gICAgICAgICAgICAgIDogdGhpcy5ib2R5Lm9uKCdlcnJvcicsICgpID0+IHt9KVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9LFxuXG4gICAgICAgIG9uRGF0YSAoY2h1bmspIHtcbiAgICAgICAgICBpZiAoZmV0Y2hQYXJhbXMuY29udHJvbGxlci5kdW1wKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyAxLiBJZiBvbmUgb3IgbW9yZSBieXRlcyBoYXZlIGJlZW4gdHJhbnNtaXR0ZWQgZnJvbSByZXNwb25zZeKAmXNcbiAgICAgICAgICAvLyBtZXNzYWdlIGJvZHksIHRoZW46XG5cbiAgICAgICAgICAvLyAgMS4gTGV0IGJ5dGVzIGJlIHRoZSB0cmFuc21pdHRlZCBieXRlcy5cbiAgICAgICAgICBjb25zdCBieXRlcyA9IGNodW5rXG5cbiAgICAgICAgICAvLyAgMi4gTGV0IGNvZGluZ3MgYmUgdGhlIHJlc3VsdCBvZiBleHRyYWN0aW5nIGhlYWRlciBsaXN0IHZhbHVlc1xuICAgICAgICAgIC8vICBnaXZlbiBgQ29udGVudC1FbmNvZGluZ2AgYW5kIHJlc3BvbnNl4oCZcyBoZWFkZXIgbGlzdC5cbiAgICAgICAgICAvLyAgU2VlIHB1bGxBbGdvcml0aG0uXG5cbiAgICAgICAgICAvLyAgMy4gSW5jcmVhc2UgdGltaW5nSW5mb+KAmXMgZW5jb2RlZCBib2R5IHNpemUgYnkgYnl0ZXPigJlzIGxlbmd0aC5cbiAgICAgICAgICB0aW1pbmdJbmZvLmVuY29kZWRCb2R5U2l6ZSArPSBieXRlcy5ieXRlTGVuZ3RoXG5cbiAgICAgICAgICAvLyAgNC4gU2VlIHB1bGxBbGdvcml0aG0uLi5cblxuICAgICAgICAgIHJldHVybiB0aGlzLmJvZHkucHVzaChieXRlcylcbiAgICAgICAgfSxcblxuICAgICAgICBvbkNvbXBsZXRlICgpIHtcbiAgICAgICAgICBpZiAodGhpcy5hYm9ydCkge1xuICAgICAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5vZmYoJ3Rlcm1pbmF0ZWQnLCB0aGlzLmFib3J0KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuZW5kZWQgPSB0cnVlXG5cbiAgICAgICAgICB0aGlzLmJvZHkucHVzaChudWxsKVxuICAgICAgICB9LFxuXG4gICAgICAgIG9uRXJyb3IgKGVycm9yKSB7XG4gICAgICAgICAgaWYgKHRoaXMuYWJvcnQpIHtcbiAgICAgICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIub2ZmKCd0ZXJtaW5hdGVkJywgdGhpcy5hYm9ydClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmJvZHk/LmRlc3Ryb3koZXJyb3IpXG5cbiAgICAgICAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLnRlcm1pbmF0ZShlcnJvcilcblxuICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgfSxcblxuICAgICAgICBvblVwZ3JhZGUgKHN0YXR1cywgaGVhZGVyc0xpc3QsIHNvY2tldCkge1xuICAgICAgICAgIGlmIChzdGF0dXMgIT09IDEwMSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKClcblxuICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgaGVhZGVyc0xpc3QubGVuZ3RoOyBuICs9IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlcnNMaXN0W24gKyAwXS50b1N0cmluZygnbGF0aW4xJylcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IGhlYWRlcnNMaXN0W24gKyAxXS50b1N0cmluZygnbGF0aW4xJylcblxuICAgICAgICAgICAgaGVhZGVyc1trSGVhZGVyc0xpc3RdLmFwcGVuZChrZXksIHZhbClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgIHN0YXR1c1RleHQ6IFNUQVRVU19DT0RFU1tzdGF0dXNdLFxuICAgICAgICAgICAgaGVhZGVyc0xpc3Q6IGhlYWRlcnNba0hlYWRlcnNMaXN0XSxcbiAgICAgICAgICAgIHNvY2tldFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgKSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZmV0Y2gsXG4gIEZldGNoLFxuICBmZXRjaGluZyxcbiAgZmluYWxpemVBbmRSZXBvcnRUaW1pbmdcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAga1N0YXRlOiBTeW1ib2woJ0ZpbGVSZWFkZXIgc3RhdGUnKSxcbiAga1Jlc3VsdDogU3ltYm9sKCdGaWxlUmVhZGVyIHJlc3VsdCcpLFxuICBrRXJyb3I6IFN5bWJvbCgnRmlsZVJlYWRlciBlcnJvcicpLFxuICBrTGFzdFByb2dyZXNzRXZlbnRGaXJlZDogU3ltYm9sKCdGaWxlUmVhZGVyIGxhc3QgcHJvZ3Jlc3MgZXZlbnQgZmlyZWQgdGltZXN0YW1wJyksXG4gIGtFdmVudHM6IFN5bWJvbCgnRmlsZVJlYWRlciBldmVudHMnKSxcbiAga0Fib3J0ZWQ6IFN5bWJvbCgnRmlsZVJlYWRlciBhYm9ydGVkJylcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IHdlYmlkbCB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvd2ViaWRsJylcblxuY29uc3Qga1N0YXRlID0gU3ltYm9sKCdQcm9ncmVzc0V2ZW50IHN0YXRlJylcblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8veGhyLnNwZWMud2hhdHdnLm9yZy8jcHJvZ3Jlc3NldmVudFxuICovXG5jbGFzcyBQcm9ncmVzc0V2ZW50IGV4dGVuZHMgRXZlbnQge1xuICBjb25zdHJ1Y3RvciAodHlwZSwgZXZlbnRJbml0RGljdCA9IHt9KSB7XG4gICAgdHlwZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyh0eXBlKVxuICAgIGV2ZW50SW5pdERpY3QgPSB3ZWJpZGwuY29udmVydGVycy5Qcm9ncmVzc0V2ZW50SW5pdChldmVudEluaXREaWN0ID8/IHt9KVxuXG4gICAgc3VwZXIodHlwZSwgZXZlbnRJbml0RGljdClcblxuICAgIHRoaXNba1N0YXRlXSA9IHtcbiAgICAgIGxlbmd0aENvbXB1dGFibGU6IGV2ZW50SW5pdERpY3QubGVuZ3RoQ29tcHV0YWJsZSxcbiAgICAgIGxvYWRlZDogZXZlbnRJbml0RGljdC5sb2FkZWQsXG4gICAgICB0b3RhbDogZXZlbnRJbml0RGljdC50b3RhbFxuICAgIH1cbiAgfVxuXG4gIGdldCBsZW5ndGhDb21wdXRhYmxlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBQcm9ncmVzc0V2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5sZW5ndGhDb21wdXRhYmxlXG4gIH1cblxuICBnZXQgbG9hZGVkICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBQcm9ncmVzc0V2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5sb2FkZWRcbiAgfVxuXG4gIGdldCB0b3RhbCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUHJvZ3Jlc3NFdmVudClcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0udG90YWxcbiAgfVxufVxuXG53ZWJpZGwuY29udmVydGVycy5Qcm9ncmVzc0V2ZW50SW5pdCA9IHdlYmlkbC5kaWN0aW9uYXJ5Q29udmVydGVyKFtcbiAge1xuICAgIGtleTogJ2xlbmd0aENvbXB1dGFibGUnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYm9vbGVhbixcbiAgICBkZWZhdWx0VmFsdWU6IGZhbHNlXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdsb2FkZWQnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIGxvbmcgbG9uZyddLFxuICAgIGRlZmF1bHRWYWx1ZTogMFxuICB9LFxuICB7XG4gICAga2V5OiAndG90YWwnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIGxvbmcgbG9uZyddLFxuICAgIGRlZmF1bHRWYWx1ZTogMFxuICB9LFxuICB7XG4gICAga2V5OiAnYnViYmxlcycsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ib29sZWFuLFxuICAgIGRlZmF1bHRWYWx1ZTogZmFsc2VcbiAgfSxcbiAge1xuICAgIGtleTogJ2NhbmNlbGFibGUnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYm9vbGVhbixcbiAgICBkZWZhdWx0VmFsdWU6IGZhbHNlXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdjb21wb3NlZCcsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ib29sZWFuLFxuICAgIGRlZmF1bHRWYWx1ZTogZmFsc2VcbiAgfVxuXSlcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIFByb2dyZXNzRXZlbnRcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtZW5jb2RpbmctZ2V0XG4gKiBAcGFyYW0ge3N0cmluZ3x1bmRlZmluZWR9IGxhYmVsXG4gKi9cbmZ1bmN0aW9uIGdldEVuY29kaW5nIChsYWJlbCkge1xuICBpZiAoIWxhYmVsKSB7XG4gICAgcmV0dXJuICdmYWlsdXJlJ1xuICB9XG5cbiAgLy8gMS4gUmVtb3ZlIGFueSBsZWFkaW5nIGFuZCB0cmFpbGluZyBBU0NJSSB3aGl0ZXNwYWNlIGZyb20gbGFiZWwuXG4gIC8vIDIuIElmIGxhYmVsIGlzIGFuIEFTQ0lJIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2ggZm9yIGFueSBvZiB0aGVcbiAgLy8gICAgbGFiZWxzIGxpc3RlZCBpbiB0aGUgdGFibGUgYmVsb3csIHRoZW4gcmV0dXJuIHRoZVxuICAvLyAgICBjb3JyZXNwb25kaW5nIGVuY29kaW5nOyBvdGhlcndpc2UgcmV0dXJuIGZhaWx1cmUuXG4gIHN3aXRjaCAobGFiZWwudHJpbSgpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICd1bmljb2RlLTEtMS11dGYtOCc6XG4gICAgY2FzZSAndW5pY29kZTExdXRmOCc6XG4gICAgY2FzZSAndW5pY29kZTIwdXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3gtdW5pY29kZTIwdXRmOCc6XG4gICAgICByZXR1cm4gJ1VURi04J1xuICAgIGNhc2UgJzg2Nic6XG4gICAgY2FzZSAnY3A4NjYnOlxuICAgIGNhc2UgJ2NzaWJtODY2JzpcbiAgICBjYXNlICdpYm04NjYnOlxuICAgICAgcmV0dXJuICdJQk04NjYnXG4gICAgY2FzZSAnY3Npc29sYXRpbjInOlxuICAgIGNhc2UgJ2lzby04ODU5LTInOlxuICAgIGNhc2UgJ2lzby1pci0xMDEnOlxuICAgIGNhc2UgJ2lzbzg4NTktMic6XG4gICAgY2FzZSAnaXNvODg1OTInOlxuICAgIGNhc2UgJ2lzb184ODU5LTInOlxuICAgIGNhc2UgJ2lzb184ODU5LTI6MTk4Nyc6XG4gICAgY2FzZSAnbDInOlxuICAgIGNhc2UgJ2xhdGluMic6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTInXG4gICAgY2FzZSAnY3Npc29sYXRpbjMnOlxuICAgIGNhc2UgJ2lzby04ODU5LTMnOlxuICAgIGNhc2UgJ2lzby1pci0xMDknOlxuICAgIGNhc2UgJ2lzbzg4NTktMyc6XG4gICAgY2FzZSAnaXNvODg1OTMnOlxuICAgIGNhc2UgJ2lzb184ODU5LTMnOlxuICAgIGNhc2UgJ2lzb184ODU5LTM6MTk4OCc6XG4gICAgY2FzZSAnbDMnOlxuICAgIGNhc2UgJ2xhdGluMyc6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTMnXG4gICAgY2FzZSAnY3Npc29sYXRpbjQnOlxuICAgIGNhc2UgJ2lzby04ODU5LTQnOlxuICAgIGNhc2UgJ2lzby1pci0xMTAnOlxuICAgIGNhc2UgJ2lzbzg4NTktNCc6XG4gICAgY2FzZSAnaXNvODg1OTQnOlxuICAgIGNhc2UgJ2lzb184ODU5LTQnOlxuICAgIGNhc2UgJ2lzb184ODU5LTQ6MTk4OCc6XG4gICAgY2FzZSAnbDQnOlxuICAgIGNhc2UgJ2xhdGluNCc6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTQnXG4gICAgY2FzZSAnY3Npc29sYXRpbmN5cmlsbGljJzpcbiAgICBjYXNlICdjeXJpbGxpYyc6XG4gICAgY2FzZSAnaXNvLTg4NTktNSc6XG4gICAgY2FzZSAnaXNvLWlyLTE0NCc6XG4gICAgY2FzZSAnaXNvODg1OS01JzpcbiAgICBjYXNlICdpc284ODU5NSc6XG4gICAgY2FzZSAnaXNvXzg4NTktNSc6XG4gICAgY2FzZSAnaXNvXzg4NTktNToxOTg4JzpcbiAgICAgIHJldHVybiAnSVNPLTg4NTktNSdcbiAgICBjYXNlICdhcmFiaWMnOlxuICAgIGNhc2UgJ2FzbW8tNzA4JzpcbiAgICBjYXNlICdjc2lzbzg4NTk2ZSc6XG4gICAgY2FzZSAnY3Npc284ODU5NmknOlxuICAgIGNhc2UgJ2NzaXNvbGF0aW5hcmFiaWMnOlxuICAgIGNhc2UgJ2VjbWEtMTE0JzpcbiAgICBjYXNlICdpc28tODg1OS02JzpcbiAgICBjYXNlICdpc28tODg1OS02LWUnOlxuICAgIGNhc2UgJ2lzby04ODU5LTYtaSc6XG4gICAgY2FzZSAnaXNvLWlyLTEyNyc6XG4gICAgY2FzZSAnaXNvODg1OS02JzpcbiAgICBjYXNlICdpc284ODU5Nic6XG4gICAgY2FzZSAnaXNvXzg4NTktNic6XG4gICAgY2FzZSAnaXNvXzg4NTktNjoxOTg3JzpcbiAgICAgIHJldHVybiAnSVNPLTg4NTktNidcbiAgICBjYXNlICdjc2lzb2xhdGluZ3JlZWsnOlxuICAgIGNhc2UgJ2VjbWEtMTE4JzpcbiAgICBjYXNlICdlbG90XzkyOCc6XG4gICAgY2FzZSAnZ3JlZWsnOlxuICAgIGNhc2UgJ2dyZWVrOCc6XG4gICAgY2FzZSAnaXNvLTg4NTktNyc6XG4gICAgY2FzZSAnaXNvLWlyLTEyNic6XG4gICAgY2FzZSAnaXNvODg1OS03JzpcbiAgICBjYXNlICdpc284ODU5Nyc6XG4gICAgY2FzZSAnaXNvXzg4NTktNyc6XG4gICAgY2FzZSAnaXNvXzg4NTktNzoxOTg3JzpcbiAgICBjYXNlICdzdW5fZXVfZ3JlZWsnOlxuICAgICAgcmV0dXJuICdJU08tODg1OS03J1xuICAgIGNhc2UgJ2NzaXNvODg1OThlJzpcbiAgICBjYXNlICdjc2lzb2xhdGluaGVicmV3JzpcbiAgICBjYXNlICdoZWJyZXcnOlxuICAgIGNhc2UgJ2lzby04ODU5LTgnOlxuICAgIGNhc2UgJ2lzby04ODU5LTgtZSc6XG4gICAgY2FzZSAnaXNvLWlyLTEzOCc6XG4gICAgY2FzZSAnaXNvODg1OS04JzpcbiAgICBjYXNlICdpc284ODU5OCc6XG4gICAgY2FzZSAnaXNvXzg4NTktOCc6XG4gICAgY2FzZSAnaXNvXzg4NTktODoxOTg4JzpcbiAgICBjYXNlICd2aXN1YWwnOlxuICAgICAgcmV0dXJuICdJU08tODg1OS04J1xuICAgIGNhc2UgJ2NzaXNvODg1OThpJzpcbiAgICBjYXNlICdpc28tODg1OS04LWknOlxuICAgIGNhc2UgJ2xvZ2ljYWwnOlxuICAgICAgcmV0dXJuICdJU08tODg1OS04LUknXG4gICAgY2FzZSAnY3Npc29sYXRpbjYnOlxuICAgIGNhc2UgJ2lzby04ODU5LTEwJzpcbiAgICBjYXNlICdpc28taXItMTU3JzpcbiAgICBjYXNlICdpc284ODU5LTEwJzpcbiAgICBjYXNlICdpc284ODU5MTAnOlxuICAgIGNhc2UgJ2w2JzpcbiAgICBjYXNlICdsYXRpbjYnOlxuICAgICAgcmV0dXJuICdJU08tODg1OS0xMCdcbiAgICBjYXNlICdpc28tODg1OS0xMyc6XG4gICAgY2FzZSAnaXNvODg1OS0xMyc6XG4gICAgY2FzZSAnaXNvODg1OTEzJzpcbiAgICAgIHJldHVybiAnSVNPLTg4NTktMTMnXG4gICAgY2FzZSAnaXNvLTg4NTktMTQnOlxuICAgIGNhc2UgJ2lzbzg4NTktMTQnOlxuICAgIGNhc2UgJ2lzbzg4NTkxNCc6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTE0J1xuICAgIGNhc2UgJ2NzaXNvbGF0aW45JzpcbiAgICBjYXNlICdpc28tODg1OS0xNSc6XG4gICAgY2FzZSAnaXNvODg1OS0xNSc6XG4gICAgY2FzZSAnaXNvODg1OTE1JzpcbiAgICBjYXNlICdpc29fODg1OS0xNSc6XG4gICAgY2FzZSAnbDknOlxuICAgICAgcmV0dXJuICdJU08tODg1OS0xNSdcbiAgICBjYXNlICdpc28tODg1OS0xNic6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTE2J1xuICAgIGNhc2UgJ2Nza29pOHInOlxuICAgIGNhc2UgJ2tvaSc6XG4gICAgY2FzZSAna29pOCc6XG4gICAgY2FzZSAna29pOC1yJzpcbiAgICBjYXNlICdrb2k4X3InOlxuICAgICAgcmV0dXJuICdLT0k4LVInXG4gICAgY2FzZSAna29pOC1ydSc6XG4gICAgY2FzZSAna29pOC11JzpcbiAgICAgIHJldHVybiAnS09JOC1VJ1xuICAgIGNhc2UgJ2NzbWFjaW50b3NoJzpcbiAgICBjYXNlICdtYWMnOlxuICAgIGNhc2UgJ21hY2ludG9zaCc6XG4gICAgY2FzZSAneC1tYWMtcm9tYW4nOlxuICAgICAgcmV0dXJuICdtYWNpbnRvc2gnXG4gICAgY2FzZSAnaXNvLTg4NTktMTEnOlxuICAgIGNhc2UgJ2lzbzg4NTktMTEnOlxuICAgIGNhc2UgJ2lzbzg4NTkxMSc6XG4gICAgY2FzZSAndGlzLTYyMCc6XG4gICAgY2FzZSAnd2luZG93cy04NzQnOlxuICAgICAgcmV0dXJuICd3aW5kb3dzLTg3NCdcbiAgICBjYXNlICdjcDEyNTAnOlxuICAgIGNhc2UgJ3dpbmRvd3MtMTI1MCc6XG4gICAgY2FzZSAneC1jcDEyNTAnOlxuICAgICAgcmV0dXJuICd3aW5kb3dzLTEyNTAnXG4gICAgY2FzZSAnY3AxMjUxJzpcbiAgICBjYXNlICd3aW5kb3dzLTEyNTEnOlxuICAgIGNhc2UgJ3gtY3AxMjUxJzpcbiAgICAgIHJldHVybiAnd2luZG93cy0xMjUxJ1xuICAgIGNhc2UgJ2Fuc2lfeDMuNC0xOTY4JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnY3AxMjUyJzpcbiAgICBjYXNlICdjcDgxOSc6XG4gICAgY2FzZSAnY3Npc29sYXRpbjEnOlxuICAgIGNhc2UgJ2libTgxOSc6XG4gICAgY2FzZSAnaXNvLTg4NTktMSc6XG4gICAgY2FzZSAnaXNvLWlyLTEwMCc6XG4gICAgY2FzZSAnaXNvODg1OS0xJzpcbiAgICBjYXNlICdpc284ODU5MSc6XG4gICAgY2FzZSAnaXNvXzg4NTktMSc6XG4gICAgY2FzZSAnaXNvXzg4NTktMToxOTg3JzpcbiAgICBjYXNlICdsMSc6XG4gICAgY2FzZSAnbGF0aW4xJzpcbiAgICBjYXNlICd1cy1hc2NpaSc6XG4gICAgY2FzZSAnd2luZG93cy0xMjUyJzpcbiAgICBjYXNlICd4LWNwMTI1Mic6XG4gICAgICByZXR1cm4gJ3dpbmRvd3MtMTI1MidcbiAgICBjYXNlICdjcDEyNTMnOlxuICAgIGNhc2UgJ3dpbmRvd3MtMTI1Myc6XG4gICAgY2FzZSAneC1jcDEyNTMnOlxuICAgICAgcmV0dXJuICd3aW5kb3dzLTEyNTMnXG4gICAgY2FzZSAnY3AxMjU0JzpcbiAgICBjYXNlICdjc2lzb2xhdGluNSc6XG4gICAgY2FzZSAnaXNvLTg4NTktOSc6XG4gICAgY2FzZSAnaXNvLWlyLTE0OCc6XG4gICAgY2FzZSAnaXNvODg1OS05JzpcbiAgICBjYXNlICdpc284ODU5OSc6XG4gICAgY2FzZSAnaXNvXzg4NTktOSc6XG4gICAgY2FzZSAnaXNvXzg4NTktOToxOTg5JzpcbiAgICBjYXNlICdsNSc6XG4gICAgY2FzZSAnbGF0aW41JzpcbiAgICBjYXNlICd3aW5kb3dzLTEyNTQnOlxuICAgIGNhc2UgJ3gtY3AxMjU0JzpcbiAgICAgIHJldHVybiAnd2luZG93cy0xMjU0J1xuICAgIGNhc2UgJ2NwMTI1NSc6XG4gICAgY2FzZSAnd2luZG93cy0xMjU1JzpcbiAgICBjYXNlICd4LWNwMTI1NSc6XG4gICAgICByZXR1cm4gJ3dpbmRvd3MtMTI1NSdcbiAgICBjYXNlICdjcDEyNTYnOlxuICAgIGNhc2UgJ3dpbmRvd3MtMTI1Nic6XG4gICAgY2FzZSAneC1jcDEyNTYnOlxuICAgICAgcmV0dXJuICd3aW5kb3dzLTEyNTYnXG4gICAgY2FzZSAnY3AxMjU3JzpcbiAgICBjYXNlICd3aW5kb3dzLTEyNTcnOlxuICAgIGNhc2UgJ3gtY3AxMjU3JzpcbiAgICAgIHJldHVybiAnd2luZG93cy0xMjU3J1xuICAgIGNhc2UgJ2NwMTI1OCc6XG4gICAgY2FzZSAnd2luZG93cy0xMjU4JzpcbiAgICBjYXNlICd4LWNwMTI1OCc6XG4gICAgICByZXR1cm4gJ3dpbmRvd3MtMTI1OCdcbiAgICBjYXNlICd4LW1hYy1jeXJpbGxpYyc6XG4gICAgY2FzZSAneC1tYWMtdWtyYWluaWFuJzpcbiAgICAgIHJldHVybiAneC1tYWMtY3lyaWxsaWMnXG4gICAgY2FzZSAnY2hpbmVzZSc6XG4gICAgY2FzZSAnY3NnYjIzMTInOlxuICAgIGNhc2UgJ2NzaXNvNThnYjIzMTI4MCc6XG4gICAgY2FzZSAnZ2IyMzEyJzpcbiAgICBjYXNlICdnYl8yMzEyJzpcbiAgICBjYXNlICdnYl8yMzEyLTgwJzpcbiAgICBjYXNlICdnYmsnOlxuICAgIGNhc2UgJ2lzby1pci01OCc6XG4gICAgY2FzZSAneC1nYmsnOlxuICAgICAgcmV0dXJuICdHQksnXG4gICAgY2FzZSAnZ2IxODAzMCc6XG4gICAgICByZXR1cm4gJ2diMTgwMzAnXG4gICAgY2FzZSAnYmlnNSc6XG4gICAgY2FzZSAnYmlnNS1oa3Njcyc6XG4gICAgY2FzZSAnY24tYmlnNSc6XG4gICAgY2FzZSAnY3NiaWc1JzpcbiAgICBjYXNlICd4LXgtYmlnNSc6XG4gICAgICByZXR1cm4gJ0JpZzUnXG4gICAgY2FzZSAnY3NldWNwa2RmbXRqYXBhbmVzZSc6XG4gICAgY2FzZSAnZXVjLWpwJzpcbiAgICBjYXNlICd4LWV1Yy1qcCc6XG4gICAgICByZXR1cm4gJ0VVQy1KUCdcbiAgICBjYXNlICdjc2lzbzIwMjJqcCc6XG4gICAgY2FzZSAnaXNvLTIwMjItanAnOlxuICAgICAgcmV0dXJuICdJU08tMjAyMi1KUCdcbiAgICBjYXNlICdjc3NoaWZ0amlzJzpcbiAgICBjYXNlICdtczkzMic6XG4gICAgY2FzZSAnbXNfa2FuamknOlxuICAgIGNhc2UgJ3NoaWZ0LWppcyc6XG4gICAgY2FzZSAnc2hpZnRfamlzJzpcbiAgICBjYXNlICdzamlzJzpcbiAgICBjYXNlICd3aW5kb3dzLTMxaic6XG4gICAgY2FzZSAneC1zamlzJzpcbiAgICAgIHJldHVybiAnU2hpZnRfSklTJ1xuICAgIGNhc2UgJ2NzZXVja3InOlxuICAgIGNhc2UgJ2Nza3NjNTYwMTE5ODcnOlxuICAgIGNhc2UgJ2V1Yy1rcic6XG4gICAgY2FzZSAnaXNvLWlyLTE0OSc6XG4gICAgY2FzZSAna29yZWFuJzpcbiAgICBjYXNlICdrc19jXzU2MDEtMTk4Nyc6XG4gICAgY2FzZSAna3NfY181NjAxLTE5ODknOlxuICAgIGNhc2UgJ2tzYzU2MDEnOlxuICAgIGNhc2UgJ2tzY181NjAxJzpcbiAgICBjYXNlICd3aW5kb3dzLTk0OSc6XG4gICAgICByZXR1cm4gJ0VVQy1LUidcbiAgICBjYXNlICdjc2lzbzIwMjJrcic6XG4gICAgY2FzZSAnaHotZ2ItMjMxMic6XG4gICAgY2FzZSAnaXNvLTIwMjItY24nOlxuICAgIGNhc2UgJ2lzby0yMDIyLWNuLWV4dCc6XG4gICAgY2FzZSAnaXNvLTIwMjIta3InOlxuICAgIGNhc2UgJ3JlcGxhY2VtZW50JzpcbiAgICAgIHJldHVybiAncmVwbGFjZW1lbnQnXG4gICAgY2FzZSAndW5pY29kZWZmZmUnOlxuICAgIGNhc2UgJ3V0Zi0xNmJlJzpcbiAgICAgIHJldHVybiAnVVRGLTE2QkUnXG4gICAgY2FzZSAnY3N1bmljb2RlJzpcbiAgICBjYXNlICdpc28tMTA2NDYtdWNzLTInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1bmljb2RlJzpcbiAgICBjYXNlICd1bmljb2RlZmVmZic6XG4gICAgY2FzZSAndXRmLTE2JzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gJ1VURi0xNkxFJ1xuICAgIGNhc2UgJ3gtdXNlci1kZWZpbmVkJzpcbiAgICAgIHJldHVybiAneC11c2VyLWRlZmluZWQnXG4gICAgZGVmYXVsdDogcmV0dXJuICdmYWlsdXJlJ1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRFbmNvZGluZ1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHtcbiAga1N0YXRlLFxuICBrRXJyb3IsXG4gIGtSZXN1bHQsXG4gIGtBYm9ydGVkLFxuICBrTGFzdFByb2dyZXNzRXZlbnRGaXJlZFxufSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IFByb2dyZXNzRXZlbnQgfSA9IHJlcXVpcmUoJy4vcHJvZ3Jlc3NldmVudCcpXG5jb25zdCB7IGdldEVuY29kaW5nIH0gPSByZXF1aXJlKCcuL2VuY29kaW5nJylcbmNvbnN0IHsgRE9NRXhjZXB0aW9uIH0gPSByZXF1aXJlKCcuLi9mZXRjaC9jb25zdGFudHMnKVxuY29uc3QgeyBzZXJpYWxpemVBTWltZVR5cGUsIHBhcnNlTUlNRVR5cGUgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL2RhdGFVUkwnKVxuY29uc3QgeyB0eXBlcyB9ID0gcmVxdWlyZSgndXRpbCcpXG5jb25zdCB7IFN0cmluZ0RlY29kZXIgfSA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyJylcbmNvbnN0IHsgYnRvYSB9ID0gcmVxdWlyZSgnYnVmZmVyJylcblxuLyoqIEB0eXBlIHtQcm9wZXJ0eURlc2NyaXB0b3J9ICovXG5jb25zdCBzdGF0aWNQcm9wZXJ0eURlc2NyaXB0b3JzID0ge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogZmFsc2UsXG4gIGNvbmZpZ3VyYWJsZTogZmFsc2Vcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9GaWxlQVBJLyNyZWFkT3BlcmF0aW9uXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9maWxlcmVhZGVyJykuRmlsZVJlYWRlcn0gZnJcbiAqIEBwYXJhbSB7aW1wb3J0KCdidWZmZXInKS5CbG9ifSBibG9iXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtzdHJpbmc/fSBlbmNvZGluZ05hbWVcbiAqL1xuZnVuY3Rpb24gcmVhZE9wZXJhdGlvbiAoZnIsIGJsb2IsIHR5cGUsIGVuY29kaW5nTmFtZSkge1xuICAvLyAxLiBJZiBmcuKAmXMgc3RhdGUgaXMgXCJsb2FkaW5nXCIsIHRocm93IGFuIEludmFsaWRTdGF0ZUVycm9yXG4gIC8vICAgIERPTUV4Y2VwdGlvbi5cbiAgaWYgKGZyW2tTdGF0ZV0gPT09ICdsb2FkaW5nJykge1xuICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ludmFsaWQgc3RhdGUnLCAnSW52YWxpZFN0YXRlRXJyb3InKVxuICB9XG5cbiAgLy8gMi4gU2V0IGZy4oCZcyBzdGF0ZSB0byBcImxvYWRpbmdcIi5cbiAgZnJba1N0YXRlXSA9ICdsb2FkaW5nJ1xuXG4gIC8vIDMuIFNldCBmcuKAmXMgcmVzdWx0IHRvIG51bGwuXG4gIGZyW2tSZXN1bHRdID0gbnVsbFxuXG4gIC8vIDQuIFNldCBmcuKAmXMgZXJyb3IgdG8gbnVsbC5cbiAgZnJba0Vycm9yXSA9IG51bGxcblxuICAvLyA1LiBMZXQgc3RyZWFtIGJlIHRoZSByZXN1bHQgb2YgY2FsbGluZyBnZXQgc3RyZWFtIG9uIGJsb2IuXG4gIC8qKiBAdHlwZSB7aW1wb3J0KCdzdHJlYW0vd2ViJykuUmVhZGFibGVTdHJlYW19ICovXG4gIGNvbnN0IHN0cmVhbSA9IGJsb2Iuc3RyZWFtKClcblxuICAvLyA2LiBMZXQgcmVhZGVyIGJlIHRoZSByZXN1bHQgb2YgZ2V0dGluZyBhIHJlYWRlciBmcm9tIHN0cmVhbS5cbiAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpXG5cbiAgLy8gNy4gTGV0IGJ5dGVzIGJlIGFuIGVtcHR5IGJ5dGUgc2VxdWVuY2UuXG4gIC8qKiBAdHlwZSB7VWludDhBcnJheVtdfSAqL1xuICBjb25zdCBieXRlcyA9IFtdXG5cbiAgLy8gOC4gTGV0IGNodW5rUHJvbWlzZSBiZSB0aGUgcmVzdWx0IG9mIHJlYWRpbmcgYSBjaHVuayBmcm9tXG4gIC8vICAgIHN0cmVhbSB3aXRoIHJlYWRlci5cbiAgbGV0IGNodW5rUHJvbWlzZSA9IHJlYWRlci5yZWFkKClcblxuICAvLyA5LiBMZXQgaXNGaXJzdENodW5rIGJlIHRydWUuXG4gIGxldCBpc0ZpcnN0Q2h1bmsgPSB0cnVlXG5cbiAgLy8gMTAuIEluIHBhcmFsbGVsLCB3aGlsZSB0cnVlOlxuICAvLyBOb3RlOiBcIkluIHBhcmFsbGVsXCIganVzdCBtZWFucyBub24tYmxvY2tpbmdcbiAgLy8gTm90ZSAyOiByZWFkT3BlcmF0aW9uIGl0c2VsZiBjYW5ub3QgYmUgYXN5bmMgYXMgZG91YmxlXG4gIC8vIHJlYWRpbmcgdGhlIGJvZHkgd291bGQgdGhlbiByZWplY3QgdGhlIHByb21pc2UsIGluc3RlYWRcbiAgLy8gb2YgdGhyb3dpbmcgYW4gZXJyb3IuXG4gIDsoYXN5bmMgKCkgPT4ge1xuICAgIHdoaWxlICghZnJba0Fib3J0ZWRdKSB7XG4gICAgICAvLyAxLiBXYWl0IGZvciBjaHVua1Byb21pc2UgdG8gYmUgZnVsZmlsbGVkIG9yIHJlamVjdGVkLlxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgY2h1bmtQcm9taXNlXG5cbiAgICAgICAgLy8gMi4gSWYgY2h1bmtQcm9taXNlIGlzIGZ1bGZpbGxlZCwgYW5kIGlzRmlyc3RDaHVuayBpc1xuICAgICAgICAvLyAgICB0cnVlLCBxdWV1ZSBhIHRhc2sgdG8gZmlyZSBhIHByb2dyZXNzIGV2ZW50IGNhbGxlZFxuICAgICAgICAvLyAgICBsb2Fkc3RhcnQgYXQgZnIuXG4gICAgICAgIGlmIChpc0ZpcnN0Q2h1bmsgJiYgIWZyW2tBYm9ydGVkXSkge1xuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgIGZpcmVBUHJvZ3Jlc3NFdmVudCgnbG9hZHN0YXJ0JywgZnIpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDMuIFNldCBpc0ZpcnN0Q2h1bmsgdG8gZmFsc2UuXG4gICAgICAgIGlzRmlyc3RDaHVuayA9IGZhbHNlXG5cbiAgICAgICAgLy8gNC4gSWYgY2h1bmtQcm9taXNlIGlzIGZ1bGZpbGxlZCB3aXRoIGFuIG9iamVjdCB3aG9zZVxuICAgICAgICAvLyAgICBkb25lIHByb3BlcnR5IGlzIGZhbHNlIGFuZCB3aG9zZSB2YWx1ZSBwcm9wZXJ0eSBpc1xuICAgICAgICAvLyAgICBhIFVpbnQ4QXJyYXkgb2JqZWN0LCBydW4gdGhlc2Ugc3RlcHM6XG4gICAgICAgIGlmICghZG9uZSAmJiB0eXBlcy5pc1VpbnQ4QXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgLy8gMS4gTGV0IGJzIGJlIHRoZSBieXRlIHNlcXVlbmNlIHJlcHJlc2VudGVkIGJ5IHRoZVxuICAgICAgICAgIC8vICAgIFVpbnQ4QXJyYXkgb2JqZWN0LlxuXG4gICAgICAgICAgLy8gMi4gQXBwZW5kIGJzIHRvIGJ5dGVzLlxuICAgICAgICAgIGJ5dGVzLnB1c2godmFsdWUpXG5cbiAgICAgICAgICAvLyAzLiBJZiByb3VnaGx5IDUwbXMgaGF2ZSBwYXNzZWQgc2luY2UgdGhlc2Ugc3RlcHNcbiAgICAgICAgICAvLyAgICB3ZXJlIGxhc3QgaW52b2tlZCwgcXVldWUgYSB0YXNrIHRvIGZpcmUgYVxuICAgICAgICAgIC8vICAgIHByb2dyZXNzIGV2ZW50IGNhbGxlZCBwcm9ncmVzcyBhdCBmci5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAoXG4gICAgICAgICAgICAgIGZyW2tMYXN0UHJvZ3Jlc3NFdmVudEZpcmVkXSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgIERhdGUubm93KCkgLSBmcltrTGFzdFByb2dyZXNzRXZlbnRGaXJlZF0gPj0gNTBcbiAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgICFmcltrQWJvcnRlZF1cbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGZyW2tMYXN0UHJvZ3Jlc3NFdmVudEZpcmVkXSA9IERhdGUubm93KClcbiAgICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgICAgZmlyZUFQcm9ncmVzc0V2ZW50KCdwcm9ncmVzcycsIGZyKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyA0LiBTZXQgY2h1bmtQcm9taXNlIHRvIHRoZSByZXN1bHQgb2YgcmVhZGluZyBhXG4gICAgICAgICAgLy8gICAgY2h1bmsgZnJvbSBzdHJlYW0gd2l0aCByZWFkZXIuXG4gICAgICAgICAgY2h1bmtQcm9taXNlID0gcmVhZGVyLnJlYWQoKVxuICAgICAgICB9IGVsc2UgaWYgKGRvbmUpIHtcbiAgICAgICAgICAvLyA1LiBPdGhlcndpc2UsIGlmIGNodW5rUHJvbWlzZSBpcyBmdWxmaWxsZWQgd2l0aCBhblxuICAgICAgICAgIC8vICAgIG9iamVjdCB3aG9zZSBkb25lIHByb3BlcnR5IGlzIHRydWUsIHF1ZXVlIGEgdGFza1xuICAgICAgICAgIC8vICAgIHRvIHJ1biB0aGUgZm9sbG93aW5nIHN0ZXBzIGFuZCBhYm9ydCB0aGlzIGFsZ29yaXRobTpcbiAgICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgICAgICAvLyAxLiBTZXQgZnLigJlzIHN0YXRlIHRvIFwiZG9uZVwiLlxuICAgICAgICAgICAgZnJba1N0YXRlXSA9ICdkb25lJ1xuXG4gICAgICAgICAgICAvLyAyLiBMZXQgcmVzdWx0IGJlIHRoZSByZXN1bHQgb2YgcGFja2FnZSBkYXRhIGdpdmVuXG4gICAgICAgICAgICAvLyAgICBieXRlcywgdHlwZSwgYmxvYuKAmXMgdHlwZSwgYW5kIGVuY29kaW5nTmFtZS5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHBhY2thZ2VEYXRhKGJ5dGVzLCB0eXBlLCBibG9iLnR5cGUsIGVuY29kaW5nTmFtZSlcblxuICAgICAgICAgICAgICAvLyA0LiBFbHNlOlxuXG4gICAgICAgICAgICAgIGlmIChmcltrQWJvcnRlZF0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIDEuIFNldCBmcuKAmXMgcmVzdWx0IHRvIHJlc3VsdC5cbiAgICAgICAgICAgICAgZnJba1Jlc3VsdF0gPSByZXN1bHRcblxuICAgICAgICAgICAgICAvLyAyLiBGaXJlIGEgcHJvZ3Jlc3MgZXZlbnQgY2FsbGVkIGxvYWQgYXQgdGhlIGZyLlxuICAgICAgICAgICAgICBmaXJlQVByb2dyZXNzRXZlbnQoJ2xvYWQnLCBmcilcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIC8vIDMuIElmIHBhY2thZ2UgZGF0YSB0aHJldyBhbiBleGNlcHRpb24gZXJyb3I6XG5cbiAgICAgICAgICAgICAgLy8gMS4gU2V0IGZy4oCZcyBlcnJvciB0byBlcnJvci5cbiAgICAgICAgICAgICAgZnJba0Vycm9yXSA9IGVycm9yXG5cbiAgICAgICAgICAgICAgLy8gMi4gRmlyZSBhIHByb2dyZXNzIGV2ZW50IGNhbGxlZCBlcnJvciBhdCBmci5cbiAgICAgICAgICAgICAgZmlyZUFQcm9ncmVzc0V2ZW50KCdlcnJvcicsIGZyKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyA1LiBJZiBmcuKAmXMgc3RhdGUgaXMgbm90IFwibG9hZGluZ1wiLCBmaXJlIGEgcHJvZ3Jlc3NcbiAgICAgICAgICAgIC8vICAgIGV2ZW50IGNhbGxlZCBsb2FkZW5kIGF0IHRoZSBmci5cbiAgICAgICAgICAgIGlmIChmcltrU3RhdGVdICE9PSAnbG9hZGluZycpIHtcbiAgICAgICAgICAgICAgZmlyZUFQcm9ncmVzc0V2ZW50KCdsb2FkZW5kJywgZnIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChmcltrQWJvcnRlZF0pIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDYuIE90aGVyd2lzZSwgaWYgY2h1bmtQcm9taXNlIGlzIHJlamVjdGVkIHdpdGggYW5cbiAgICAgICAgLy8gICAgZXJyb3IgZXJyb3IsIHF1ZXVlIGEgdGFzayB0byBydW4gdGhlIGZvbGxvd2luZ1xuICAgICAgICAvLyAgICBzdGVwcyBhbmQgYWJvcnQgdGhpcyBhbGdvcml0aG06XG4gICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAvLyAxLiBTZXQgZnLigJlzIHN0YXRlIHRvIFwiZG9uZVwiLlxuICAgICAgICAgIGZyW2tTdGF0ZV0gPSAnZG9uZSdcblxuICAgICAgICAgIC8vIDIuIFNldCBmcuKAmXMgZXJyb3IgdG8gZXJyb3IuXG4gICAgICAgICAgZnJba0Vycm9yXSA9IGVycm9yXG5cbiAgICAgICAgICAvLyAzLiBGaXJlIGEgcHJvZ3Jlc3MgZXZlbnQgY2FsbGVkIGVycm9yIGF0IGZyLlxuICAgICAgICAgIGZpcmVBUHJvZ3Jlc3NFdmVudCgnZXJyb3InLCBmcilcblxuICAgICAgICAgIC8vIDQuIElmIGZy4oCZcyBzdGF0ZSBpcyBub3QgXCJsb2FkaW5nXCIsIGZpcmUgYSBwcm9ncmVzc1xuICAgICAgICAgIC8vICAgIGV2ZW50IGNhbGxlZCBsb2FkZW5kIGF0IGZyLlxuICAgICAgICAgIGlmIChmcltrU3RhdGVdICE9PSAnbG9hZGluZycpIHtcbiAgICAgICAgICAgIGZpcmVBUHJvZ3Jlc3NFdmVudCgnbG9hZGVuZCcsIGZyKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfSkoKVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI2ZpcmUtYS1wcm9ncmVzcy1ldmVudFxuICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtZXZlbnQtZmlyZVxuICogQHBhcmFtIHtzdHJpbmd9IGUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50XG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9maWxlcmVhZGVyJykuRmlsZVJlYWRlcn0gcmVhZGVyXG4gKi9cbmZ1bmN0aW9uIGZpcmVBUHJvZ3Jlc3NFdmVudCAoZSwgcmVhZGVyKSB7XG4gIC8vIFRoZSBwcm9ncmVzcyBldmVudCBlIGRvZXMgbm90IGJ1YmJsZS4gZS5idWJibGVzIG11c3QgYmUgZmFsc2VcbiAgLy8gVGhlIHByb2dyZXNzIGV2ZW50IGUgaXMgTk9UIGNhbmNlbGFibGUuIGUuY2FuY2VsYWJsZSBtdXN0IGJlIGZhbHNlXG4gIGNvbnN0IGV2ZW50ID0gbmV3IFByb2dyZXNzRXZlbnQoZSwge1xuICAgIGJ1YmJsZXM6IGZhbHNlLFxuICAgIGNhbmNlbGFibGU6IGZhbHNlXG4gIH0pXG5cbiAgcmVhZGVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jYmxvYi1wYWNrYWdlLWRhdGFcbiAqIEBwYXJhbSB7VWludDhBcnJheVtdfSBieXRlc1xuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7c3RyaW5nP30gbWltZVR5cGVcbiAqIEBwYXJhbSB7c3RyaW5nP30gZW5jb2RpbmdOYW1lXG4gKi9cbmZ1bmN0aW9uIHBhY2thZ2VEYXRhIChieXRlcywgdHlwZSwgbWltZVR5cGUsIGVuY29kaW5nTmFtZSkge1xuICAvLyAxLiBBIEJsb2IgaGFzIGFuIGFzc29jaWF0ZWQgcGFja2FnZSBkYXRhIGFsZ29yaXRobSwgZ2l2ZW5cbiAgLy8gICAgYnl0ZXMsIGEgdHlwZSwgYSBvcHRpb25hbCBtaW1lVHlwZSwgYW5kIGEgb3B0aW9uYWxcbiAgLy8gICAgZW5jb2RpbmdOYW1lLCB3aGljaCBzd2l0Y2hlcyBvbiB0eXBlIGFuZCBydW5zIHRoZVxuICAvLyAgICBhc3NvY2lhdGVkIHN0ZXBzOlxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ0RhdGFVUkwnOiB7XG4gICAgICAvLyAxLiBSZXR1cm4gYnl0ZXMgYXMgYSBEYXRhVVJMIFtSRkMyMzk3XSBzdWJqZWN0IHRvXG4gICAgICAvLyAgICB0aGUgY29uc2lkZXJhdGlvbnMgYmVsb3c6XG4gICAgICAvLyAgKiBVc2UgbWltZVR5cGUgYXMgcGFydCBvZiB0aGUgRGF0YSBVUkwgaWYgaXQgaXNcbiAgICAgIC8vICAgIGF2YWlsYWJsZSBpbiBrZWVwaW5nIHdpdGggdGhlIERhdGEgVVJMXG4gICAgICAvLyAgICBzcGVjaWZpY2F0aW9uIFtSRkMyMzk3XS5cbiAgICAgIC8vICAqIElmIG1pbWVUeXBlIGlzIG5vdCBhdmFpbGFibGUgcmV0dXJuIGEgRGF0YSBVUkxcbiAgICAgIC8vICAgIHdpdGhvdXQgYSBtZWRpYS10eXBlLiBbUkZDMjM5N10uXG5cbiAgICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMjM5NyNzZWN0aW9uLTNcbiAgICAgIC8vIGRhdGF1cmwgICAgOj0gXCJkYXRhOlwiIFsgbWVkaWF0eXBlIF0gWyBcIjtiYXNlNjRcIiBdIFwiLFwiIGRhdGFcbiAgICAgIC8vIG1lZGlhdHlwZSAgOj0gWyB0eXBlIFwiL1wiIHN1YnR5cGUgXSAqKCBcIjtcIiBwYXJhbWV0ZXIgKVxuICAgICAgLy8gZGF0YSAgICAgICA6PSAqdXJsY2hhclxuICAgICAgLy8gcGFyYW1ldGVyICA6PSBhdHRyaWJ1dGUgXCI9XCIgdmFsdWVcbiAgICAgIGxldCBkYXRhVVJMID0gJ2RhdGE6J1xuXG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZU1JTUVUeXBlKG1pbWVUeXBlIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKVxuXG4gICAgICBpZiAocGFyc2VkICE9PSAnZmFpbHVyZScpIHtcbiAgICAgICAgZGF0YVVSTCArPSBzZXJpYWxpemVBTWltZVR5cGUocGFyc2VkKVxuICAgICAgfVxuXG4gICAgICBkYXRhVVJMICs9ICc7YmFzZTY0LCdcblxuICAgICAgY29uc3QgZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKCdsYXRpbjEnKVxuXG4gICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGJ5dGVzKSB7XG4gICAgICAgIGRhdGFVUkwgKz0gYnRvYShkZWNvZGVyLndyaXRlKGNodW5rKSlcbiAgICAgIH1cblxuICAgICAgZGF0YVVSTCArPSBidG9hKGRlY29kZXIuZW5kKCkpXG5cbiAgICAgIHJldHVybiBkYXRhVVJMXG4gICAgfVxuICAgIGNhc2UgJ1RleHQnOiB7XG4gICAgICAvLyAxLiBMZXQgZW5jb2RpbmcgYmUgZmFpbHVyZVxuICAgICAgbGV0IGVuY29kaW5nID0gJ2ZhaWx1cmUnXG5cbiAgICAgIC8vIDIuIElmIHRoZSBlbmNvZGluZ05hbWUgaXMgcHJlc2VudCwgc2V0IGVuY29kaW5nIHRvIHRoZVxuICAgICAgLy8gICAgcmVzdWx0IG9mIGdldHRpbmcgYW4gZW5jb2RpbmcgZnJvbSBlbmNvZGluZ05hbWUuXG4gICAgICBpZiAoZW5jb2RpbmdOYW1lKSB7XG4gICAgICAgIGVuY29kaW5nID0gZ2V0RW5jb2RpbmcoZW5jb2RpbmdOYW1lKVxuICAgICAgfVxuXG4gICAgICAvLyAzLiBJZiBlbmNvZGluZyBpcyBmYWlsdXJlLCBhbmQgbWltZVR5cGUgaXMgcHJlc2VudDpcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gJ2ZhaWx1cmUnICYmIG1pbWVUeXBlKSB7XG4gICAgICAgIC8vIDEuIExldCB0eXBlIGJlIHRoZSByZXN1bHQgb2YgcGFyc2UgYSBNSU1FIHR5cGVcbiAgICAgICAgLy8gICAgZ2l2ZW4gbWltZVR5cGUuXG4gICAgICAgIGNvbnN0IHR5cGUgPSBwYXJzZU1JTUVUeXBlKG1pbWVUeXBlKVxuXG4gICAgICAgIC8vIDIuIElmIHR5cGUgaXMgbm90IGZhaWx1cmUsIHNldCBlbmNvZGluZyB0byB0aGUgcmVzdWx0XG4gICAgICAgIC8vICAgIG9mIGdldHRpbmcgYW4gZW5jb2RpbmcgZnJvbSB0eXBl4oCZcyBwYXJhbWV0ZXJzW1wiY2hhcnNldFwiXS5cbiAgICAgICAgaWYgKHR5cGUgIT09ICdmYWlsdXJlJykge1xuICAgICAgICAgIGVuY29kaW5nID0gZ2V0RW5jb2RpbmcodHlwZS5wYXJhbWV0ZXJzLmdldCgnY2hhcnNldCcpKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDQuIElmIGVuY29kaW5nIGlzIGZhaWx1cmUsIHRoZW4gc2V0IGVuY29kaW5nIHRvIFVURi04LlxuICAgICAgaWYgKGVuY29kaW5nID09PSAnZmFpbHVyZScpIHtcbiAgICAgICAgZW5jb2RpbmcgPSAnVVRGLTgnXG4gICAgICB9XG5cbiAgICAgIC8vIDUuIERlY29kZSBieXRlcyB1c2luZyBmYWxsYmFjayBlbmNvZGluZyBlbmNvZGluZywgYW5kXG4gICAgICAvLyAgICByZXR1cm4gdGhlIHJlc3VsdC5cbiAgICAgIHJldHVybiBkZWNvZGUoYnl0ZXMsIGVuY29kaW5nKVxuICAgIH1cbiAgICBjYXNlICdBcnJheUJ1ZmZlcic6IHtcbiAgICAgIC8vIFJldHVybiBhIG5ldyBBcnJheUJ1ZmZlciB3aG9zZSBjb250ZW50cyBhcmUgYnl0ZXMuXG4gICAgICBjb25zdCBzZXF1ZW5jZSA9IGNvbWJpbmVCeXRlU2VxdWVuY2VzKGJ5dGVzKVxuXG4gICAgICByZXR1cm4gc2VxdWVuY2UuYnVmZmVyXG4gICAgfVxuICAgIGNhc2UgJ0JpbmFyeVN0cmluZyc6IHtcbiAgICAgIC8vIFJldHVybiBieXRlcyBhcyBhIGJpbmFyeSBzdHJpbmcsIGluIHdoaWNoIGV2ZXJ5IGJ5dGVcbiAgICAgIC8vICBpcyByZXByZXNlbnRlZCBieSBhIGNvZGUgdW5pdCBvZiBlcXVhbCB2YWx1ZSBbMC4uMjU1XS5cbiAgICAgIGxldCBiaW5hcnlTdHJpbmcgPSAnJ1xuXG4gICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoJ2xhdGluMScpXG5cbiAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgYnl0ZXMpIHtcbiAgICAgICAgYmluYXJ5U3RyaW5nICs9IGRlY29kZXIud3JpdGUoY2h1bmspXG4gICAgICB9XG5cbiAgICAgIGJpbmFyeVN0cmluZyArPSBkZWNvZGVyLmVuZCgpXG5cbiAgICAgIHJldHVybiBiaW5hcnlTdHJpbmdcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZW5jb2Rpbmcuc3BlYy53aGF0d2cub3JnLyNkZWNvZGVcbiAqIEBwYXJhbSB7VWludDhBcnJheVtdfSBpb1F1ZXVlXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RpbmdcbiAqL1xuZnVuY3Rpb24gZGVjb2RlIChpb1F1ZXVlLCBlbmNvZGluZykge1xuICBjb25zdCBieXRlcyA9IGNvbWJpbmVCeXRlU2VxdWVuY2VzKGlvUXVldWUpXG5cbiAgLy8gMS4gTGV0IEJPTUVuY29kaW5nIGJlIHRoZSByZXN1bHQgb2YgQk9NIHNuaWZmaW5nIGlvUXVldWUuXG4gIGNvbnN0IEJPTUVuY29kaW5nID0gQk9NU25pZmZpbmcoYnl0ZXMpXG5cbiAgbGV0IHNsaWNlID0gMFxuXG4gIC8vIDIuIElmIEJPTUVuY29kaW5nIGlzIG5vbi1udWxsOlxuICBpZiAoQk9NRW5jb2RpbmcgIT09IG51bGwpIHtcbiAgICAvLyAxLiBTZXQgZW5jb2RpbmcgdG8gQk9NRW5jb2RpbmcuXG4gICAgZW5jb2RpbmcgPSBCT01FbmNvZGluZ1xuXG4gICAgLy8gMi4gUmVhZCB0aHJlZSBieXRlcyBmcm9tIGlvUXVldWUsIGlmIEJPTUVuY29kaW5nIGlzXG4gICAgLy8gICAgVVRGLTg7IG90aGVyd2lzZSByZWFkIHR3byBieXRlcy5cbiAgICAvLyAgICAoRG8gbm90aGluZyB3aXRoIHRob3NlIGJ5dGVzLilcbiAgICBzbGljZSA9IEJPTUVuY29kaW5nID09PSAnVVRGLTgnID8gMyA6IDJcbiAgfVxuXG4gIC8vIDMuIFByb2Nlc3MgYSBxdWV1ZSB3aXRoIGFuIGluc3RhbmNlIG9mIGVuY29kaW5n4oCZc1xuICAvLyAgICBkZWNvZGVyLCBpb1F1ZXVlLCBvdXRwdXQsIGFuZCBcInJlcGxhY2VtZW50XCIuXG5cbiAgLy8gNC4gUmV0dXJuIG91dHB1dC5cblxuICBjb25zdCBzbGljZWQgPSBieXRlcy5zbGljZShzbGljZSlcbiAgcmV0dXJuIG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZykuZGVjb2RlKHNsaWNlZClcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZW5jb2Rpbmcuc3BlYy53aGF0d2cub3JnLyNib20tc25pZmZcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gaW9RdWV1ZVxuICovXG5mdW5jdGlvbiBCT01TbmlmZmluZyAoaW9RdWV1ZSkge1xuICAvLyAxLiBMZXQgQk9NIGJlIHRoZSByZXN1bHQgb2YgcGVla2luZyAzIGJ5dGVzIGZyb20gaW9RdWV1ZSxcbiAgLy8gICAgY29udmVydGVkIHRvIGEgYnl0ZSBzZXF1ZW5jZS5cbiAgY29uc3QgW2EsIGIsIGNdID0gaW9RdWV1ZVxuXG4gIC8vIDIuIEZvciBlYWNoIG9mIHRoZSByb3dzIGluIHRoZSB0YWJsZSBiZWxvdywgc3RhcnRpbmcgd2l0aFxuICAvLyAgICB0aGUgZmlyc3Qgb25lIGFuZCBnb2luZyBkb3duLCBpZiBCT00gc3RhcnRzIHdpdGggdGhlXG4gIC8vICAgIGJ5dGVzIGdpdmVuIGluIHRoZSBmaXJzdCBjb2x1bW4sIHRoZW4gcmV0dXJuIHRoZVxuICAvLyAgICBlbmNvZGluZyBnaXZlbiBpbiB0aGUgY2VsbCBpbiB0aGUgc2Vjb25kIGNvbHVtbiBvZiB0aGF0XG4gIC8vICAgIHJvdy4gT3RoZXJ3aXNlLCByZXR1cm4gbnVsbC5cbiAgaWYgKGEgPT09IDB4RUYgJiYgYiA9PT0gMHhCQiAmJiBjID09PSAweEJGKSB7XG4gICAgcmV0dXJuICdVVEYtOCdcbiAgfSBlbHNlIGlmIChhID09PSAweEZFICYmIGIgPT09IDB4RkYpIHtcbiAgICByZXR1cm4gJ1VURi0xNkJFJ1xuICB9IGVsc2UgaWYgKGEgPT09IDB4RkYgJiYgYiA9PT0gMHhGRSkge1xuICAgIHJldHVybiAnVVRGLTE2TEUnXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheVtdfSBzZXF1ZW5jZXNcbiAqL1xuZnVuY3Rpb24gY29tYmluZUJ5dGVTZXF1ZW5jZXMgKHNlcXVlbmNlcykge1xuICBjb25zdCBzaXplID0gc2VxdWVuY2VzLnJlZHVjZSgoYSwgYikgPT4ge1xuICAgIHJldHVybiBhICsgYi5ieXRlTGVuZ3RoXG4gIH0sIDApXG5cbiAgbGV0IG9mZnNldCA9IDBcblxuICByZXR1cm4gc2VxdWVuY2VzLnJlZHVjZSgoYSwgYikgPT4ge1xuICAgIGEuc2V0KGIsIG9mZnNldClcbiAgICBvZmZzZXQgKz0gYi5ieXRlTGVuZ3RoXG4gICAgcmV0dXJuIGFcbiAgfSwgbmV3IFVpbnQ4QXJyYXkoc2l6ZSkpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzdGF0aWNQcm9wZXJ0eURlc2NyaXB0b3JzLFxuICByZWFkT3BlcmF0aW9uLFxuICBmaXJlQVByb2dyZXNzRXZlbnRcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7XG4gIHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIHJlYWRPcGVyYXRpb24sXG4gIGZpcmVBUHJvZ3Jlc3NFdmVudFxufSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7XG4gIGtTdGF0ZSxcbiAga0Vycm9yLFxuICBrUmVzdWx0LFxuICBrRXZlbnRzLFxuICBrQWJvcnRlZFxufSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IHdlYmlkbCB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvd2ViaWRsJylcbmNvbnN0IHsga0VudW1lcmFibGVQcm9wZXJ0eSB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcblxuY2xhc3MgRmlsZVJlYWRlciBleHRlbmRzIEV2ZW50VGFyZ2V0IHtcbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHN1cGVyKClcblxuICAgIHRoaXNba1N0YXRlXSA9ICdlbXB0eSdcbiAgICB0aGlzW2tSZXN1bHRdID0gbnVsbFxuICAgIHRoaXNba0Vycm9yXSA9IG51bGxcbiAgICB0aGlzW2tFdmVudHNdID0ge1xuICAgICAgbG9hZGVuZDogbnVsbCxcbiAgICAgIGVycm9yOiBudWxsLFxuICAgICAgYWJvcnQ6IG51bGwsXG4gICAgICBsb2FkOiBudWxsLFxuICAgICAgcHJvZ3Jlc3M6IG51bGwsXG4gICAgICBsb2Fkc3RhcnQ6IG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jZGZuLXJlYWRBc0FycmF5QnVmZmVyXG4gICAqIEBwYXJhbSB7aW1wb3J0KCdidWZmZXInKS5CbG9ifSBibG9iXG4gICAqL1xuICByZWFkQXNBcnJheUJ1ZmZlciAoYmxvYikge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnRmlsZVJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcicgfSlcblxuICAgIGJsb2IgPSB3ZWJpZGwuY29udmVydGVycy5CbG9iKGJsb2IsIHsgc3RyaWN0OiBmYWxzZSB9KVxuXG4gICAgLy8gVGhlIHJlYWRBc0FycmF5QnVmZmVyKGJsb2IpIG1ldGhvZCwgd2hlbiBpbnZva2VkLFxuICAgIC8vIG11c3QgaW5pdGlhdGUgYSByZWFkIG9wZXJhdGlvbiBmb3IgYmxvYiB3aXRoIEFycmF5QnVmZmVyLlxuICAgIHJlYWRPcGVyYXRpb24odGhpcywgYmxvYiwgJ0FycmF5QnVmZmVyJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9GaWxlQVBJLyNyZWFkQXNCaW5hcnlTdHJpbmdcbiAgICogQHBhcmFtIHtpbXBvcnQoJ2J1ZmZlcicpLkJsb2J9IGJsb2JcbiAgICovXG4gIHJlYWRBc0JpbmFyeVN0cmluZyAoYmxvYikge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnRmlsZVJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcnIH0pXG5cbiAgICBibG9iID0gd2ViaWRsLmNvbnZlcnRlcnMuQmxvYihibG9iLCB7IHN0cmljdDogZmFsc2UgfSlcblxuICAgIC8vIFRoZSByZWFkQXNCaW5hcnlTdHJpbmcoYmxvYikgbWV0aG9kLCB3aGVuIGludm9rZWQsXG4gICAgLy8gbXVzdCBpbml0aWF0ZSBhIHJlYWQgb3BlcmF0aW9uIGZvciBibG9iIHdpdGggQmluYXJ5U3RyaW5nLlxuICAgIHJlYWRPcGVyYXRpb24odGhpcywgYmxvYiwgJ0JpbmFyeVN0cmluZycpXG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jcmVhZEFzRGF0YVRleHRcbiAgICogQHBhcmFtIHtpbXBvcnQoJ2J1ZmZlcicpLkJsb2J9IGJsb2JcbiAgICogQHBhcmFtIHtzdHJpbmc/fSBlbmNvZGluZ1xuICAgKi9cbiAgcmVhZEFzVGV4dCAoYmxvYiwgZW5jb2RpbmcgPSB1bmRlZmluZWQpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0ZpbGVSZWFkZXIucmVhZEFzVGV4dCcgfSlcblxuICAgIGJsb2IgPSB3ZWJpZGwuY29udmVydGVycy5CbG9iKGJsb2IsIHsgc3RyaWN0OiBmYWxzZSB9KVxuXG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVuY29kaW5nID0gd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKGVuY29kaW5nKVxuICAgIH1cblxuICAgIC8vIFRoZSByZWFkQXNUZXh0KGJsb2IsIGVuY29kaW5nKSBtZXRob2QsIHdoZW4gaW52b2tlZCxcbiAgICAvLyBtdXN0IGluaXRpYXRlIGEgcmVhZCBvcGVyYXRpb24gZm9yIGJsb2Igd2l0aCBUZXh0IGFuZCBlbmNvZGluZy5cbiAgICByZWFkT3BlcmF0aW9uKHRoaXMsIGJsb2IsICdUZXh0JywgZW5jb2RpbmcpXG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jZGZuLXJlYWRBc0RhdGFVUkxcbiAgICogQHBhcmFtIHtpbXBvcnQoJ2J1ZmZlcicpLkJsb2J9IGJsb2JcbiAgICovXG4gIHJlYWRBc0RhdGFVUkwgKGJsb2IpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0ZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTCcgfSlcblxuICAgIGJsb2IgPSB3ZWJpZGwuY29udmVydGVycy5CbG9iKGJsb2IsIHsgc3RyaWN0OiBmYWxzZSB9KVxuXG4gICAgLy8gVGhlIHJlYWRBc0RhdGFVUkwoYmxvYikgbWV0aG9kLCB3aGVuIGludm9rZWQsIG11c3RcbiAgICAvLyBpbml0aWF0ZSBhIHJlYWQgb3BlcmF0aW9uIGZvciBibG9iIHdpdGggRGF0YVVSTC5cbiAgICByZWFkT3BlcmF0aW9uKHRoaXMsIGJsb2IsICdEYXRhVVJMJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9GaWxlQVBJLyNkZm4tYWJvcnRcbiAgICovXG4gIGFib3J0ICgpIHtcbiAgICAvLyAxLiBJZiB0aGlzJ3Mgc3RhdGUgaXMgXCJlbXB0eVwiIG9yIGlmIHRoaXMncyBzdGF0ZSBpc1xuICAgIC8vICAgIFwiZG9uZVwiIHNldCB0aGlzJ3MgcmVzdWx0IHRvIG51bGwgYW5kIHRlcm1pbmF0ZVxuICAgIC8vICAgIHRoaXMgYWxnb3JpdGhtLlxuICAgIGlmICh0aGlzW2tTdGF0ZV0gPT09ICdlbXB0eScgfHwgdGhpc1trU3RhdGVdID09PSAnZG9uZScpIHtcbiAgICAgIHRoaXNba1Jlc3VsdF0gPSBudWxsXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyAyLiBJZiB0aGlzJ3Mgc3RhdGUgaXMgXCJsb2FkaW5nXCIgc2V0IHRoaXMncyBzdGF0ZSB0b1xuICAgIC8vICAgIFwiZG9uZVwiIGFuZCBzZXQgdGhpcydzIHJlc3VsdCB0byBudWxsLlxuICAgIGlmICh0aGlzW2tTdGF0ZV0gPT09ICdsb2FkaW5nJykge1xuICAgICAgdGhpc1trU3RhdGVdID0gJ2RvbmUnXG4gICAgICB0aGlzW2tSZXN1bHRdID0gbnVsbFxuICAgIH1cblxuICAgIC8vIDMuIElmIHRoZXJlIGFyZSBhbnkgdGFza3MgZnJvbSB0aGlzIG9uIHRoZSBmaWxlIHJlYWRpbmdcbiAgICAvLyAgICB0YXNrIHNvdXJjZSBpbiBhbiBhZmZpbGlhdGVkIHRhc2sgcXVldWUsIHRoZW4gcmVtb3ZlXG4gICAgLy8gICAgdGhvc2UgdGFza3MgZnJvbSB0aGF0IHRhc2sgcXVldWUuXG4gICAgdGhpc1trQWJvcnRlZF0gPSB0cnVlXG5cbiAgICAvLyA0LiBUZXJtaW5hdGUgdGhlIGFsZ29yaXRobSBmb3IgdGhlIHJlYWQgbWV0aG9kIGJlaW5nIHByb2Nlc3NlZC5cbiAgICAvLyBUT0RPXG5cbiAgICAvLyA1LiBGaXJlIGEgcHJvZ3Jlc3MgZXZlbnQgY2FsbGVkIGFib3J0IGF0IHRoaXMuXG4gICAgZmlyZUFQcm9ncmVzc0V2ZW50KCdhYm9ydCcsIHRoaXMpXG5cbiAgICAvLyA2LiBJZiB0aGlzJ3Mgc3RhdGUgaXMgbm90IFwibG9hZGluZ1wiLCBmaXJlIGEgcHJvZ3Jlc3NcbiAgICAvLyAgICBldmVudCBjYWxsZWQgbG9hZGVuZCBhdCB0aGlzLlxuICAgIGlmICh0aGlzW2tTdGF0ZV0gIT09ICdsb2FkaW5nJykge1xuICAgICAgZmlyZUFQcm9ncmVzc0V2ZW50KCdsb2FkZW5kJywgdGhpcylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jZG9tLWZpbGVyZWFkZXItcmVhZHlzdGF0ZVxuICAgKi9cbiAgZ2V0IHJlYWR5U3RhdGUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICBzd2l0Y2ggKHRoaXNba1N0YXRlXSkge1xuICAgICAgY2FzZSAnZW1wdHknOiByZXR1cm4gdGhpcy5FTVBUWVxuICAgICAgY2FzZSAnbG9hZGluZyc6IHJldHVybiB0aGlzLkxPQURJTkdcbiAgICAgIGNhc2UgJ2RvbmUnOiByZXR1cm4gdGhpcy5ET05FXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI2RvbS1maWxlcmVhZGVyLXJlc3VsdFxuICAgKi9cbiAgZ2V0IHJlc3VsdCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIC8vIFRoZSByZXN1bHQgYXR0cmlidXRl4oCZcyBnZXR0ZXIsIHdoZW4gaW52b2tlZCwgbXVzdCByZXR1cm5cbiAgICAvLyB0aGlzJ3MgcmVzdWx0LlxuICAgIHJldHVybiB0aGlzW2tSZXN1bHRdXG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jZG9tLWZpbGVyZWFkZXItZXJyb3JcbiAgICovXG4gIGdldCBlcnJvciAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIC8vIFRoZSBlcnJvciBhdHRyaWJ1dGXigJlzIGdldHRlciwgd2hlbiBpbnZva2VkLCBtdXN0IHJldHVyblxuICAgIC8vIHRoaXMncyBlcnJvci5cbiAgICByZXR1cm4gdGhpc1trRXJyb3JdXG4gIH1cblxuICBnZXQgb25sb2FkZW5kICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgcmV0dXJuIHRoaXNba0V2ZW50c10ubG9hZGVuZFxuICB9XG5cbiAgc2V0IG9ubG9hZGVuZCAoZm4pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgaWYgKHRoaXNba0V2ZW50c10ubG9hZGVuZCkge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZW5kJywgdGhpc1trRXZlbnRzXS5sb2FkZW5kKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXNba0V2ZW50c10ubG9hZGVuZCA9IGZuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlbmQnLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1trRXZlbnRzXS5sb2FkZW5kID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGdldCBvbmVycm9yICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgcmV0dXJuIHRoaXNba0V2ZW50c10uZXJyb3JcbiAgfVxuXG4gIHNldCBvbmVycm9yIChmbikge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICBpZiAodGhpc1trRXZlbnRzXS5lcnJvcikge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIHRoaXNba0V2ZW50c10uZXJyb3IpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1trRXZlbnRzXS5lcnJvciA9IGZuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZm4pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNba0V2ZW50c10uZXJyb3IgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgZ2V0IG9ubG9hZHN0YXJ0ICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgcmV0dXJuIHRoaXNba0V2ZW50c10ubG9hZHN0YXJ0XG4gIH1cblxuICBzZXQgb25sb2Fkc3RhcnQgKGZuKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIGlmICh0aGlzW2tFdmVudHNdLmxvYWRzdGFydCkge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2Fkc3RhcnQnLCB0aGlzW2tFdmVudHNdLmxvYWRzdGFydClcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2tFdmVudHNdLmxvYWRzdGFydCA9IGZuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRzdGFydCcsIGZuKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzW2tFdmVudHNdLmxvYWRzdGFydCA9IG51bGxcbiAgICB9XG4gIH1cblxuICBnZXQgb25wcm9ncmVzcyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIHJldHVybiB0aGlzW2tFdmVudHNdLnByb2dyZXNzXG4gIH1cblxuICBzZXQgb25wcm9ncmVzcyAoZm4pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgaWYgKHRoaXNba0V2ZW50c10ucHJvZ3Jlc3MpIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCB0aGlzW2tFdmVudHNdLnByb2dyZXNzKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXNba0V2ZW50c10ucHJvZ3Jlc3MgPSBmblxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIGZuKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzW2tFdmVudHNdLnByb2dyZXNzID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGdldCBvbmxvYWQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICByZXR1cm4gdGhpc1trRXZlbnRzXS5sb2FkXG4gIH1cblxuICBzZXQgb25sb2FkIChmbikge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICBpZiAodGhpc1trRXZlbnRzXS5sb2FkKSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWQnLCB0aGlzW2tFdmVudHNdLmxvYWQpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1trRXZlbnRzXS5sb2FkID0gZm5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZuKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzW2tFdmVudHNdLmxvYWQgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgZ2V0IG9uYWJvcnQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICByZXR1cm4gdGhpc1trRXZlbnRzXS5hYm9ydFxuICB9XG5cbiAgc2V0IG9uYWJvcnQgKGZuKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIGlmICh0aGlzW2tFdmVudHNdLmFib3J0KSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgdGhpc1trRXZlbnRzXS5hYm9ydClcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2tFdmVudHNdLmFib3J0ID0gZm5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1trRXZlbnRzXS5hYm9ydCA9IG51bGxcbiAgICB9XG4gIH1cbn1cblxuLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI2RvbS1maWxlcmVhZGVyLWVtcHR5XG5GaWxlUmVhZGVyLkVNUFRZID0gRmlsZVJlYWRlci5wcm90b3R5cGUuRU1QVFkgPSAwXG4vLyBodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jZG9tLWZpbGVyZWFkZXItbG9hZGluZ1xuRmlsZVJlYWRlci5MT0FESU5HID0gRmlsZVJlYWRlci5wcm90b3R5cGUuTE9BRElORyA9IDFcbi8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9GaWxlQVBJLyNkb20tZmlsZXJlYWRlci1kb25lXG5GaWxlUmVhZGVyLkRPTkUgPSBGaWxlUmVhZGVyLnByb3RvdHlwZS5ET05FID0gMlxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhGaWxlUmVhZGVyLnByb3RvdHlwZSwge1xuICBFTVBUWTogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgTE9BRElORzogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgRE9ORTogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgcmVhZEFzQXJyYXlCdWZmZXI6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHJlYWRBc0JpbmFyeVN0cmluZzoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgcmVhZEFzVGV4dDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgcmVhZEFzRGF0YVVSTDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgYWJvcnQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHJlYWR5U3RhdGU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHJlc3VsdDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgZXJyb3I6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIG9ubG9hZHN0YXJ0OiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbnByb2dyZXNzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbmxvYWQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIG9uYWJvcnQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIG9uZXJyb3I6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIG9ubG9hZGVuZDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHtcbiAgICB2YWx1ZTogJ0ZpbGVSZWFkZXInLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfVxufSlcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRmlsZVJlYWRlciwge1xuICBFTVBUWTogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgTE9BRElORzogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgRE9ORTogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9yc1xufSlcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEZpbGVSZWFkZXJcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAga0NvbnN0cnVjdDogcmVxdWlyZSgnLi4vY29yZS9zeW1ib2xzJykua0NvbnN0cnVjdFxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5jb25zdCB7IFVSTFNlcmlhbGl6ZXIgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL2RhdGFVUkwnKVxuY29uc3QgeyBpc1ZhbGlkSGVhZGVyTmFtZSB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvdXRpbCcpXG5cbi8qKlxuICogQHNlZSBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtdXJsLWVxdWFsc1xuICogQHBhcmFtIHtVUkx9IEFcbiAqIEBwYXJhbSB7VVJMfSBCXG4gKiBAcGFyYW0ge2Jvb2xlYW4gfCB1bmRlZmluZWR9IGV4Y2x1ZGVGcmFnbWVudFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHVybEVxdWFscyAoQSwgQiwgZXhjbHVkZUZyYWdtZW50ID0gZmFsc2UpIHtcbiAgY29uc3Qgc2VyaWFsaXplZEEgPSBVUkxTZXJpYWxpemVyKEEsIGV4Y2x1ZGVGcmFnbWVudClcblxuICBjb25zdCBzZXJpYWxpemVkQiA9IFVSTFNlcmlhbGl6ZXIoQiwgZXhjbHVkZUZyYWdtZW50KVxuXG4gIHJldHVybiBzZXJpYWxpemVkQSA9PT0gc2VyaWFsaXplZEJcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJvbWl1bS9jaHJvbWl1bS9ibG9iLzY5NGQyMGQxMzRjYjU1M2Q4ZDg5ZTU1MDBiOTE0ODAxMmIxYmEyOTkvY29udGVudC9icm93c2VyL2NhY2hlX3N0b3JhZ2UvY2FjaGVfc3RvcmFnZV9jYWNoZS5jYyNMMjYwLUwyNjJcbiAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAqL1xuZnVuY3Rpb24gZmllbGRWYWx1ZXMgKGhlYWRlcikge1xuICBhc3NlcnQoaGVhZGVyICE9PSBudWxsKVxuXG4gIGNvbnN0IHZhbHVlcyA9IFtdXG5cbiAgZm9yIChsZXQgdmFsdWUgb2YgaGVhZGVyLnNwbGl0KCcsJykpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKVxuXG4gICAgaWYgKCF2YWx1ZS5sZW5ndGgpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfSBlbHNlIGlmICghaXNWYWxpZEhlYWRlck5hbWUodmFsdWUpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHZhbHVlcy5wdXNoKHZhbHVlKVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlc1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgdXJsRXF1YWxzLFxuICBmaWVsZFZhbHVlc1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsga0NvbnN0cnVjdCB9ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgdXJsRXF1YWxzLCBmaWVsZFZhbHVlczogZ2V0RmllbGRWYWx1ZXMgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IGtFbnVtZXJhYmxlUHJvcGVydHksIGlzRGlzdHVyYmVkIH0gPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBrSGVhZGVyc0xpc3QgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCB7IHdlYmlkbCB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvd2ViaWRsJylcbmNvbnN0IHsgUmVzcG9uc2UsIGNsb25lUmVzcG9uc2UgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3Jlc3BvbnNlJylcbmNvbnN0IHsgUmVxdWVzdCB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvcmVxdWVzdCcpXG5jb25zdCB7IGtTdGF0ZSwga0hlYWRlcnMsIGtHdWFyZCwga1JlYWxtIH0gPSByZXF1aXJlKCcuLi9mZXRjaC9zeW1ib2xzJylcbmNvbnN0IHsgZmV0Y2hpbmcgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL2luZGV4JylcbmNvbnN0IHsgdXJsSXNIdHRwSHR0cHNTY2hlbWUsIGNyZWF0ZURlZmVycmVkUHJvbWlzZSwgcmVhZEFsbEJ5dGVzIH0gPSByZXF1aXJlKCcuLi9mZXRjaC91dGlsJylcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5jb25zdCB7IGdldEdsb2JhbERpc3BhdGNoZXIgfSA9IHJlcXVpcmUoJy4uL2dsb2JhbCcpXG5cbi8qKlxuICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vU2VydmljZVdvcmtlci8jZGZuLWNhY2hlLWJhdGNoLW9wZXJhdGlvblxuICogQHR5cGVkZWYge09iamVjdH0gQ2FjaGVCYXRjaE9wZXJhdGlvblxuICogQHByb3BlcnR5IHsnZGVsZXRlJyB8ICdwdXQnfSB0eXBlXG4gKiBAcHJvcGVydHkge2FueX0gcmVxdWVzdFxuICogQHByb3BlcnR5IHthbnl9IHJlc3BvbnNlXG4gKiBAcHJvcGVydHkge2ltcG9ydCgnLi4vLi4vdHlwZXMvY2FjaGUnKS5DYWNoZVF1ZXJ5T3B0aW9uc30gb3B0aW9uc1xuICovXG5cbi8qKlxuICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vU2VydmljZVdvcmtlci8jZGZuLXJlcXVlc3QtcmVzcG9uc2UtbGlzdFxuICogQHR5cGVkZWYge1thbnksIGFueV1bXX0gcmVxdWVzdFJlc3BvbnNlTGlzdFxuICovXG5cbmNsYXNzIENhY2hlIHtcbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL1NlcnZpY2VXb3JrZXIvI2Rmbi1yZWxldmFudC1yZXF1ZXN0LXJlc3BvbnNlLWxpc3RcbiAgICogQHR5cGUge3JlcXVlc3RSZXNwb25zZUxpc3R9XG4gICAqL1xuICAjcmVsZXZhbnRSZXF1ZXN0UmVzcG9uc2VMaXN0XG5cbiAgY29uc3RydWN0b3IgKCkge1xuICAgIGlmIChhcmd1bWVudHNbMF0gIT09IGtDb25zdHJ1Y3QpIHtcbiAgICAgIHdlYmlkbC5pbGxlZ2FsQ29uc3RydWN0b3IoKVxuICAgIH1cblxuICAgIHRoaXMuI3JlbGV2YW50UmVxdWVzdFJlc3BvbnNlTGlzdCA9IGFyZ3VtZW50c1sxXVxuICB9XG5cbiAgYXN5bmMgbWF0Y2ggKHJlcXVlc3QsIG9wdGlvbnMgPSB7fSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIENhY2hlKVxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdDYWNoZS5tYXRjaCcgfSlcblxuICAgIHJlcXVlc3QgPSB3ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mbyhyZXF1ZXN0KVxuICAgIG9wdGlvbnMgPSB3ZWJpZGwuY29udmVydGVycy5DYWNoZVF1ZXJ5T3B0aW9ucyhvcHRpb25zKVxuXG4gICAgY29uc3QgcCA9IGF3YWl0IHRoaXMubWF0Y2hBbGwocmVxdWVzdCwgb3B0aW9ucylcblxuICAgIGlmIChwLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcmV0dXJuIHBbMF1cbiAgfVxuXG4gIGFzeW5jIG1hdGNoQWxsIChyZXF1ZXN0ID0gdW5kZWZpbmVkLCBvcHRpb25zID0ge30pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBDYWNoZSlcblxuICAgIGlmIChyZXF1ZXN0ICE9PSB1bmRlZmluZWQpIHJlcXVlc3QgPSB3ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mbyhyZXF1ZXN0KVxuICAgIG9wdGlvbnMgPSB3ZWJpZGwuY29udmVydGVycy5DYWNoZVF1ZXJ5T3B0aW9ucyhvcHRpb25zKVxuXG4gICAgLy8gMS5cbiAgICBsZXQgciA9IG51bGxcblxuICAgIC8vIDIuXG4gICAgaWYgKHJlcXVlc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7XG4gICAgICAgIC8vIDIuMS4xXG4gICAgICAgIHIgPSByZXF1ZXN0W2tTdGF0ZV1cblxuICAgICAgICAvLyAyLjEuMlxuICAgICAgICBpZiAoci5tZXRob2QgIT09ICdHRVQnICYmICFvcHRpb25zLmlnbm9yZU1ldGhvZCkge1xuICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXF1ZXN0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyAyLjIuMVxuICAgICAgICByID0gbmV3IFJlcXVlc3QocmVxdWVzdClba1N0YXRlXVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDUuXG4gICAgLy8gNS4xXG4gICAgY29uc3QgcmVzcG9uc2VzID0gW11cblxuICAgIC8vIDUuMlxuICAgIGlmIChyZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIDUuMi4xXG4gICAgICBmb3IgKGNvbnN0IHJlcXVlc3RSZXNwb25zZSBvZiB0aGlzLiNyZWxldmFudFJlcXVlc3RSZXNwb25zZUxpc3QpIHtcbiAgICAgICAgcmVzcG9uc2VzLnB1c2gocmVxdWVzdFJlc3BvbnNlWzFdKVxuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIDUuM1xuICAgICAgLy8gNS4zLjFcbiAgICAgIGNvbnN0IHJlcXVlc3RSZXNwb25zZXMgPSB0aGlzLiNxdWVyeUNhY2hlKHIsIG9wdGlvbnMpXG5cbiAgICAgIC8vIDUuMy4yXG4gICAgICBmb3IgKGNvbnN0IHJlcXVlc3RSZXNwb25zZSBvZiByZXF1ZXN0UmVzcG9uc2VzKSB7XG4gICAgICAgIHJlc3BvbnNlcy5wdXNoKHJlcXVlc3RSZXNwb25zZVsxXSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA1LjRcbiAgICAvLyBXZSBkb24ndCBpbXBsZW1lbnQgQ09ScyBzbyB3ZSBkb24ndCBuZWVkIHRvIGxvb3Agb3ZlciB0aGUgcmVzcG9uc2VzLCB5YXkhXG5cbiAgICAvLyA1LjUuMVxuICAgIGNvbnN0IHJlc3BvbnNlTGlzdCA9IFtdXG5cbiAgICAvLyA1LjUuMlxuICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgcmVzcG9uc2VzKSB7XG4gICAgICAvLyA1LjUuMi4xXG4gICAgICBjb25zdCByZXNwb25zZU9iamVjdCA9IG5ldyBSZXNwb25zZShyZXNwb25zZS5ib2R5Py5zb3VyY2UgPz8gbnVsbClcbiAgICAgIGNvbnN0IGJvZHkgPSByZXNwb25zZU9iamVjdFtrU3RhdGVdLmJvZHlcbiAgICAgIHJlc3BvbnNlT2JqZWN0W2tTdGF0ZV0gPSByZXNwb25zZVxuICAgICAgcmVzcG9uc2VPYmplY3Rba1N0YXRlXS5ib2R5ID0gYm9keVxuICAgICAgcmVzcG9uc2VPYmplY3Rba0hlYWRlcnNdW2tIZWFkZXJzTGlzdF0gPSByZXNwb25zZS5oZWFkZXJzTGlzdFxuICAgICAgcmVzcG9uc2VPYmplY3Rba0hlYWRlcnNdW2tHdWFyZF0gPSAnaW1tdXRhYmxlJ1xuXG4gICAgICByZXNwb25zZUxpc3QucHVzaChyZXNwb25zZU9iamVjdClcbiAgICB9XG5cbiAgICAvLyA2LlxuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHJlc3BvbnNlTGlzdClcbiAgfVxuXG4gIGFzeW5jIGFkZCAocmVxdWVzdCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIENhY2hlKVxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdDYWNoZS5hZGQnIH0pXG5cbiAgICByZXF1ZXN0ID0gd2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdEluZm8ocmVxdWVzdClcblxuICAgIC8vIDEuXG4gICAgY29uc3QgcmVxdWVzdHMgPSBbcmVxdWVzdF1cblxuICAgIC8vIDIuXG4gICAgY29uc3QgcmVzcG9uc2VBcnJheVByb21pc2UgPSB0aGlzLmFkZEFsbChyZXF1ZXN0cylcblxuICAgIC8vIDMuXG4gICAgcmV0dXJuIGF3YWl0IHJlc3BvbnNlQXJyYXlQcm9taXNlXG4gIH1cblxuICBhc3luYyBhZGRBbGwgKHJlcXVlc3RzKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGUpXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0NhY2hlLmFkZEFsbCcgfSlcblxuICAgIHJlcXVlc3RzID0gd2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPFJlcXVlc3RJbmZvPiddKHJlcXVlc3RzKVxuXG4gICAgLy8gMS5cbiAgICBjb25zdCByZXNwb25zZVByb21pc2VzID0gW11cblxuICAgIC8vIDIuXG4gICAgY29uc3QgcmVxdWVzdExpc3QgPSBbXVxuXG4gICAgLy8gMy5cbiAgICBmb3IgKGNvbnN0IHJlcXVlc3Qgb2YgcmVxdWVzdHMpIHtcbiAgICAgIGlmICh0eXBlb2YgcmVxdWVzdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMy4xXG4gICAgICBjb25zdCByID0gcmVxdWVzdFtrU3RhdGVdXG5cbiAgICAgIC8vIDMuMlxuICAgICAgaWYgKCF1cmxJc0h0dHBIdHRwc1NjaGVtZShyLnVybCkgfHwgci5tZXRob2QgIT09ICdHRVQnKSB7XG4gICAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICBoZWFkZXI6ICdDYWNoZS5hZGRBbGwnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdFeHBlY3RlZCBodHRwL3Mgc2NoZW1lIHdoZW4gbWV0aG9kIGlzIG5vdCBHRVQuJ1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDQuXG4gICAgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBmZXRjaGluZz5bXX0gKi9cbiAgICBjb25zdCBmZXRjaENvbnRyb2xsZXJzID0gW11cblxuICAgIC8vIDUuXG4gICAgZm9yIChjb25zdCByZXF1ZXN0IG9mIHJlcXVlc3RzKSB7XG4gICAgICAvLyA1LjFcbiAgICAgIGNvbnN0IHIgPSBuZXcgUmVxdWVzdChyZXF1ZXN0KVtrU3RhdGVdXG5cbiAgICAgIC8vIDUuMlxuICAgICAgaWYgKCF1cmxJc0h0dHBIdHRwc1NjaGVtZShyLnVybCkpIHtcbiAgICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICAgIGhlYWRlcjogJ0NhY2hlLmFkZEFsbCcsXG4gICAgICAgICAgbWVzc2FnZTogJ0V4cGVjdGVkIGh0dHAvcyBzY2hlbWUuJ1xuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyA1LjRcbiAgICAgIHIuaW5pdGlhdG9yID0gJ2ZldGNoJ1xuICAgICAgci5kZXN0aW5hdGlvbiA9ICdzdWJyZXNvdXJjZSdcblxuICAgICAgLy8gNS41XG4gICAgICByZXF1ZXN0TGlzdC5wdXNoKHIpXG5cbiAgICAgIC8vIDUuNlxuICAgICAgY29uc3QgcmVzcG9uc2VQcm9taXNlID0gY3JlYXRlRGVmZXJyZWRQcm9taXNlKClcblxuICAgICAgLy8gNS43XG4gICAgICBmZXRjaENvbnRyb2xsZXJzLnB1c2goZmV0Y2hpbmcoe1xuICAgICAgICByZXF1ZXN0OiByLFxuICAgICAgICBkaXNwYXRjaGVyOiBnZXRHbG9iYWxEaXNwYXRjaGVyKCksXG4gICAgICAgIHByb2Nlc3NSZXNwb25zZSAocmVzcG9uc2UpIHtcbiAgICAgICAgICAvLyAxLlxuICAgICAgICAgIGlmIChyZXNwb25zZS50eXBlID09PSAnZXJyb3InIHx8IHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA2IHx8IHJlc3BvbnNlLnN0YXR1cyA8IDIwMCB8fCByZXNwb25zZS5zdGF0dXMgPiAyOTkpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZWplY3Qod2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICAgICAgICBoZWFkZXI6ICdDYWNoZS5hZGRBbGwnLFxuICAgICAgICAgICAgICBtZXNzYWdlOiAnUmVjZWl2ZWQgYW4gaW52YWxpZCBzdGF0dXMgY29kZSBvciB0aGUgcmVxdWVzdCBmYWlsZWQuJ1xuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5oZWFkZXJzTGlzdC5jb250YWlucygndmFyeScpKSB7IC8vIDIuXG4gICAgICAgICAgICAvLyAyLjFcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkVmFsdWVzID0gZ2V0RmllbGRWYWx1ZXMocmVzcG9uc2UuaGVhZGVyc0xpc3QuZ2V0KCd2YXJ5JykpXG5cbiAgICAgICAgICAgIC8vIDIuMlxuICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZFZhbHVlIG9mIGZpZWxkVmFsdWVzKSB7XG4gICAgICAgICAgICAgIC8vIDIuMi4xXG4gICAgICAgICAgICAgIGlmIChmaWVsZFZhbHVlID09PSAnKicpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2UucmVqZWN0KHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICAgICAgICAgIGhlYWRlcjogJ0NhY2hlLmFkZEFsbCcsXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnaW52YWxpZCB2YXJ5IGZpZWxkIHZhbHVlJ1xuICAgICAgICAgICAgICAgIH0pKVxuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjb250cm9sbGVyIG9mIGZldGNoQ29udHJvbGxlcnMpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHkgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgLy8gMS5cbiAgICAgICAgICBpZiAocmVzcG9uc2UuYWJvcnRlZCkge1xuICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlamVjdChuZXcgRE9NRXhjZXB0aW9uKCdhYm9ydGVkJywgJ0Fib3J0RXJyb3InKSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIDIuXG4gICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlc29sdmUocmVzcG9uc2UpXG4gICAgICAgIH1cbiAgICAgIH0pKVxuXG4gICAgICAvLyA1LjhcbiAgICAgIHJlc3BvbnNlUHJvbWlzZXMucHVzaChyZXNwb25zZVByb21pc2UucHJvbWlzZSlcbiAgICB9XG5cbiAgICAvLyA2LlxuICAgIGNvbnN0IHAgPSBQcm9taXNlLmFsbChyZXNwb25zZVByb21pc2VzKVxuXG4gICAgLy8gNy5cbiAgICBjb25zdCByZXNwb25zZXMgPSBhd2FpdCBwXG5cbiAgICAvLyA3LjFcbiAgICBjb25zdCBvcGVyYXRpb25zID0gW11cblxuICAgIC8vIDcuMlxuICAgIGxldCBpbmRleCA9IDBcblxuICAgIC8vIDcuM1xuICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgcmVzcG9uc2VzKSB7XG4gICAgICAvLyA3LjMuMVxuICAgICAgLyoqIEB0eXBlIHtDYWNoZUJhdGNoT3BlcmF0aW9ufSAqL1xuICAgICAgY29uc3Qgb3BlcmF0aW9uID0ge1xuICAgICAgICB0eXBlOiAncHV0JywgLy8gNy4zLjJcbiAgICAgICAgcmVxdWVzdDogcmVxdWVzdExpc3RbaW5kZXhdLCAvLyA3LjMuM1xuICAgICAgICByZXNwb25zZSAvLyA3LjMuNFxuICAgICAgfVxuXG4gICAgICBvcGVyYXRpb25zLnB1c2gob3BlcmF0aW9uKSAvLyA3LjMuNVxuXG4gICAgICBpbmRleCsrIC8vIDcuMy42XG4gICAgfVxuXG4gICAgLy8gNy41XG4gICAgY29uc3QgY2FjaGVKb2JQcm9taXNlID0gY3JlYXRlRGVmZXJyZWRQcm9taXNlKClcblxuICAgIC8vIDcuNi4xXG4gICAgbGV0IGVycm9yRGF0YSA9IG51bGxcblxuICAgIC8vIDcuNi4yXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuI2JhdGNoQ2FjaGVPcGVyYXRpb25zKG9wZXJhdGlvbnMpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JEYXRhID0gZVxuICAgIH1cblxuICAgIC8vIDcuNi4zXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgLy8gNy42LjMuMVxuICAgICAgaWYgKGVycm9yRGF0YSA9PT0gbnVsbCkge1xuICAgICAgICBjYWNoZUpvYlByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyA3LjYuMy4yXG4gICAgICAgIGNhY2hlSm9iUHJvbWlzZS5yZWplY3QoZXJyb3JEYXRhKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyA3LjdcbiAgICByZXR1cm4gY2FjaGVKb2JQcm9taXNlLnByb21pc2VcbiAgfVxuXG4gIGFzeW5jIHB1dCAocmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBDYWNoZSlcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDIsIHsgaGVhZGVyOiAnQ2FjaGUucHV0JyB9KVxuXG4gICAgcmVxdWVzdCA9IHdlYmlkbC5jb252ZXJ0ZXJzLlJlcXVlc3RJbmZvKHJlcXVlc3QpXG4gICAgcmVzcG9uc2UgPSB3ZWJpZGwuY29udmVydGVycy5SZXNwb25zZShyZXNwb25zZSlcblxuICAgIC8vIDEuXG4gICAgbGV0IGlubmVyUmVxdWVzdCA9IG51bGxcblxuICAgIC8vIDIuXG4gICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7XG4gICAgICBpbm5lclJlcXVlc3QgPSByZXF1ZXN0W2tTdGF0ZV1cbiAgICB9IGVsc2UgeyAvLyAzLlxuICAgICAgaW5uZXJSZXF1ZXN0ID0gbmV3IFJlcXVlc3QocmVxdWVzdClba1N0YXRlXVxuICAgIH1cblxuICAgIC8vIDQuXG4gICAgaWYgKCF1cmxJc0h0dHBIdHRwc1NjaGVtZShpbm5lclJlcXVlc3QudXJsKSB8fCBpbm5lclJlcXVlc3QubWV0aG9kICE9PSAnR0VUJykge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6ICdDYWNoZS5wdXQnLFxuICAgICAgICBtZXNzYWdlOiAnRXhwZWN0ZWQgYW4gaHR0cC9zIHNjaGVtZSB3aGVuIG1ldGhvZCBpcyBub3QgR0VUJ1xuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyA1LlxuICAgIGNvbnN0IGlubmVyUmVzcG9uc2UgPSByZXNwb25zZVtrU3RhdGVdXG5cbiAgICAvLyA2LlxuICAgIGlmIChpbm5lclJlc3BvbnNlLnN0YXR1cyA9PT0gMjA2KSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgIGhlYWRlcjogJ0NhY2hlLnB1dCcsXG4gICAgICAgIG1lc3NhZ2U6ICdHb3QgMjA2IHN0YXR1cydcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gNy5cbiAgICBpZiAoaW5uZXJSZXNwb25zZS5oZWFkZXJzTGlzdC5jb250YWlucygndmFyeScpKSB7XG4gICAgICAvLyA3LjEuXG4gICAgICBjb25zdCBmaWVsZFZhbHVlcyA9IGdldEZpZWxkVmFsdWVzKGlubmVyUmVzcG9uc2UuaGVhZGVyc0xpc3QuZ2V0KCd2YXJ5JykpXG5cbiAgICAgIC8vIDcuMi5cbiAgICAgIGZvciAoY29uc3QgZmllbGRWYWx1ZSBvZiBmaWVsZFZhbHVlcykge1xuICAgICAgICAvLyA3LjIuMVxuICAgICAgICBpZiAoZmllbGRWYWx1ZSA9PT0gJyonKSB7XG4gICAgICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICAgICAgaGVhZGVyOiAnQ2FjaGUucHV0JyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdHb3QgKiB2YXJ5IGZpZWxkIHZhbHVlJ1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA4LlxuICAgIGlmIChpbm5lclJlc3BvbnNlLmJvZHkgJiYgKGlzRGlzdHVyYmVkKGlubmVyUmVzcG9uc2UuYm9keS5zdHJlYW0pIHx8IGlubmVyUmVzcG9uc2UuYm9keS5zdHJlYW0ubG9ja2VkKSkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6ICdDYWNoZS5wdXQnLFxuICAgICAgICBtZXNzYWdlOiAnUmVzcG9uc2UgYm9keSBpcyBsb2NrZWQgb3IgZGlzdHVyYmVkJ1xuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyA5LlxuICAgIGNvbnN0IGNsb25lZFJlc3BvbnNlID0gY2xvbmVSZXNwb25zZShpbm5lclJlc3BvbnNlKVxuXG4gICAgLy8gMTAuXG4gICAgY29uc3QgYm9keVJlYWRQcm9taXNlID0gY3JlYXRlRGVmZXJyZWRQcm9taXNlKClcblxuICAgIC8vIDExLlxuICAgIGlmIChpbm5lclJlc3BvbnNlLmJvZHkgIT0gbnVsbCkge1xuICAgICAgLy8gMTEuMVxuICAgICAgY29uc3Qgc3RyZWFtID0gaW5uZXJSZXNwb25zZS5ib2R5LnN0cmVhbVxuXG4gICAgICAvLyAxMS4yXG4gICAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKClcblxuICAgICAgLy8gMTEuM1xuICAgICAgcmVhZEFsbEJ5dGVzKHJlYWRlcikudGhlbihib2R5UmVhZFByb21pc2UucmVzb2x2ZSwgYm9keVJlYWRQcm9taXNlLnJlamVjdClcbiAgICB9IGVsc2Uge1xuICAgICAgYm9keVJlYWRQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKVxuICAgIH1cblxuICAgIC8vIDEyLlxuICAgIC8qKiBAdHlwZSB7Q2FjaGVCYXRjaE9wZXJhdGlvbltdfSAqL1xuICAgIGNvbnN0IG9wZXJhdGlvbnMgPSBbXVxuXG4gICAgLy8gMTMuXG4gICAgLyoqIEB0eXBlIHtDYWNoZUJhdGNoT3BlcmF0aW9ufSAqL1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IHtcbiAgICAgIHR5cGU6ICdwdXQnLCAvLyAxNC5cbiAgICAgIHJlcXVlc3Q6IGlubmVyUmVxdWVzdCwgLy8gMTUuXG4gICAgICByZXNwb25zZTogY2xvbmVkUmVzcG9uc2UgLy8gMTYuXG4gICAgfVxuXG4gICAgLy8gMTcuXG4gICAgb3BlcmF0aW9ucy5wdXNoKG9wZXJhdGlvbilcblxuICAgIC8vIDE5LlxuICAgIGNvbnN0IGJ5dGVzID0gYXdhaXQgYm9keVJlYWRQcm9taXNlLnByb21pc2VcblxuICAgIGlmIChjbG9uZWRSZXNwb25zZS5ib2R5ICE9IG51bGwpIHtcbiAgICAgIGNsb25lZFJlc3BvbnNlLmJvZHkuc291cmNlID0gYnl0ZXNcbiAgICB9XG5cbiAgICAvLyAxOS4xXG4gICAgY29uc3QgY2FjaGVKb2JQcm9taXNlID0gY3JlYXRlRGVmZXJyZWRQcm9taXNlKClcblxuICAgIC8vIDE5LjIuMVxuICAgIGxldCBlcnJvckRhdGEgPSBudWxsXG5cbiAgICAvLyAxOS4yLjJcbiAgICB0cnkge1xuICAgICAgdGhpcy4jYmF0Y2hDYWNoZU9wZXJhdGlvbnMob3BlcmF0aW9ucylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckRhdGEgPSBlXG4gICAgfVxuXG4gICAgLy8gMTkuMi4zXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgLy8gMTkuMi4zLjFcbiAgICAgIGlmIChlcnJvckRhdGEgPT09IG51bGwpIHtcbiAgICAgICAgY2FjaGVKb2JQcm9taXNlLnJlc29sdmUoKVxuICAgICAgfSBlbHNlIHsgLy8gMTkuMi4zLjJcbiAgICAgICAgY2FjaGVKb2JQcm9taXNlLnJlamVjdChlcnJvckRhdGEpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiBjYWNoZUpvYlByb21pc2UucHJvbWlzZVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlIChyZXF1ZXN0LCBvcHRpb25zID0ge30pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBDYWNoZSlcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnQ2FjaGUuZGVsZXRlJyB9KVxuXG4gICAgcmVxdWVzdCA9IHdlYmlkbC5jb252ZXJ0ZXJzLlJlcXVlc3RJbmZvKHJlcXVlc3QpXG4gICAgb3B0aW9ucyA9IHdlYmlkbC5jb252ZXJ0ZXJzLkNhY2hlUXVlcnlPcHRpb25zKG9wdGlvbnMpXG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7UmVxdWVzdH1cbiAgICAgKi9cbiAgICBsZXQgciA9IG51bGxcblxuICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVxdWVzdCkge1xuICAgICAgciA9IHJlcXVlc3Rba1N0YXRlXVxuXG4gICAgICBpZiAoci5tZXRob2QgIT09ICdHRVQnICYmICFvcHRpb25zLmlnbm9yZU1ldGhvZCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KHR5cGVvZiByZXF1ZXN0ID09PSAnc3RyaW5nJylcblxuICAgICAgciA9IG5ldyBSZXF1ZXN0KHJlcXVlc3QpW2tTdGF0ZV1cbiAgICB9XG5cbiAgICAvKiogQHR5cGUge0NhY2hlQmF0Y2hPcGVyYXRpb25bXX0gKi9cbiAgICBjb25zdCBvcGVyYXRpb25zID0gW11cblxuICAgIC8qKiBAdHlwZSB7Q2FjaGVCYXRjaE9wZXJhdGlvbn0gKi9cbiAgICBjb25zdCBvcGVyYXRpb24gPSB7XG4gICAgICB0eXBlOiAnZGVsZXRlJyxcbiAgICAgIHJlcXVlc3Q6IHIsXG4gICAgICBvcHRpb25zXG4gICAgfVxuXG4gICAgb3BlcmF0aW9ucy5wdXNoKG9wZXJhdGlvbilcblxuICAgIGNvbnN0IGNhY2hlSm9iUHJvbWlzZSA9IGNyZWF0ZURlZmVycmVkUHJvbWlzZSgpXG5cbiAgICBsZXQgZXJyb3JEYXRhID0gbnVsbFxuICAgIGxldCByZXF1ZXN0UmVzcG9uc2VzXG5cbiAgICB0cnkge1xuICAgICAgcmVxdWVzdFJlc3BvbnNlcyA9IHRoaXMuI2JhdGNoQ2FjaGVPcGVyYXRpb25zKG9wZXJhdGlvbnMpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JEYXRhID0gZVxuICAgIH1cblxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIGlmIChlcnJvckRhdGEgPT09IG51bGwpIHtcbiAgICAgICAgY2FjaGVKb2JQcm9taXNlLnJlc29sdmUoISFyZXF1ZXN0UmVzcG9uc2VzPy5sZW5ndGgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWNoZUpvYlByb21pc2UucmVqZWN0KGVycm9yRGF0YSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIGNhY2hlSm9iUHJvbWlzZS5wcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vU2VydmljZVdvcmtlci8jZG9tLWNhY2hlLWtleXNcbiAgICogQHBhcmFtIHthbnl9IHJlcXVlc3RcbiAgICogQHBhcmFtIHtpbXBvcnQoJy4uLy4uL3R5cGVzL2NhY2hlJykuQ2FjaGVRdWVyeU9wdGlvbnN9IG9wdGlvbnNcbiAgICogQHJldHVybnMge3JlYWRvbmx5IFJlcXVlc3RbXX1cbiAgICovXG4gIGFzeW5jIGtleXMgKHJlcXVlc3QgPSB1bmRlZmluZWQsIG9wdGlvbnMgPSB7fSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIENhY2hlKVxuXG4gICAgaWYgKHJlcXVlc3QgIT09IHVuZGVmaW5lZCkgcmVxdWVzdCA9IHdlYmlkbC5jb252ZXJ0ZXJzLlJlcXVlc3RJbmZvKHJlcXVlc3QpXG4gICAgb3B0aW9ucyA9IHdlYmlkbC5jb252ZXJ0ZXJzLkNhY2hlUXVlcnlPcHRpb25zKG9wdGlvbnMpXG5cbiAgICAvLyAxLlxuICAgIGxldCByID0gbnVsbFxuXG4gICAgLy8gMi5cbiAgICBpZiAocmVxdWVzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyAyLjFcbiAgICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVxdWVzdCkge1xuICAgICAgICAvLyAyLjEuMVxuICAgICAgICByID0gcmVxdWVzdFtrU3RhdGVdXG5cbiAgICAgICAgLy8gMi4xLjJcbiAgICAgICAgaWYgKHIubWV0aG9kICE9PSAnR0VUJyAmJiAhb3B0aW9ucy5pZ25vcmVNZXRob2QpIHtcbiAgICAgICAgICByZXR1cm4gW11cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmVxdWVzdCA9PT0gJ3N0cmluZycpIHsgLy8gMi4yXG4gICAgICAgIHIgPSBuZXcgUmVxdWVzdChyZXF1ZXN0KVtrU3RhdGVdXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNC5cbiAgICBjb25zdCBwcm9taXNlID0gY3JlYXRlRGVmZXJyZWRQcm9taXNlKClcblxuICAgIC8vIDUuXG4gICAgLy8gNS4xXG4gICAgY29uc3QgcmVxdWVzdHMgPSBbXVxuXG4gICAgLy8gNS4yXG4gICAgaWYgKHJlcXVlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gNS4yLjFcbiAgICAgIGZvciAoY29uc3QgcmVxdWVzdFJlc3BvbnNlIG9mIHRoaXMuI3JlbGV2YW50UmVxdWVzdFJlc3BvbnNlTGlzdCkge1xuICAgICAgICAvLyA1LjIuMS4xXG4gICAgICAgIHJlcXVlc3RzLnB1c2gocmVxdWVzdFJlc3BvbnNlWzBdKVxuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIDUuM1xuICAgICAgLy8gNS4zLjFcbiAgICAgIGNvbnN0IHJlcXVlc3RSZXNwb25zZXMgPSB0aGlzLiNxdWVyeUNhY2hlKHIsIG9wdGlvbnMpXG5cbiAgICAgIC8vIDUuMy4yXG4gICAgICBmb3IgKGNvbnN0IHJlcXVlc3RSZXNwb25zZSBvZiByZXF1ZXN0UmVzcG9uc2VzKSB7XG4gICAgICAgIC8vIDUuMy4yLjFcbiAgICAgICAgcmVxdWVzdHMucHVzaChyZXF1ZXN0UmVzcG9uc2VbMF0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNS40XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgLy8gNS40LjFcbiAgICAgIGNvbnN0IHJlcXVlc3RMaXN0ID0gW11cblxuICAgICAgLy8gNS40LjJcbiAgICAgIGZvciAoY29uc3QgcmVxdWVzdCBvZiByZXF1ZXN0cykge1xuICAgICAgICBjb25zdCByZXF1ZXN0T2JqZWN0ID0gbmV3IFJlcXVlc3QoJ2h0dHBzOi8vYScpXG4gICAgICAgIHJlcXVlc3RPYmplY3Rba1N0YXRlXSA9IHJlcXVlc3RcbiAgICAgICAgcmVxdWVzdE9iamVjdFtrSGVhZGVyc11ba0hlYWRlcnNMaXN0XSA9IHJlcXVlc3QuaGVhZGVyc0xpc3RcbiAgICAgICAgcmVxdWVzdE9iamVjdFtrSGVhZGVyc11ba0d1YXJkXSA9ICdpbW11dGFibGUnXG4gICAgICAgIHJlcXVlc3RPYmplY3Rba1JlYWxtXSA9IHJlcXVlc3QuY2xpZW50XG5cbiAgICAgICAgLy8gNS40LjIuMVxuICAgICAgICByZXF1ZXN0TGlzdC5wdXNoKHJlcXVlc3RPYmplY3QpXG4gICAgICB9XG5cbiAgICAgIC8vIDUuNC4zXG4gICAgICBwcm9taXNlLnJlc29sdmUoT2JqZWN0LmZyZWV6ZShyZXF1ZXN0TGlzdCkpXG4gICAgfSlcblxuICAgIHJldHVybiBwcm9taXNlLnByb21pc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9TZXJ2aWNlV29ya2VyLyNiYXRjaC1jYWNoZS1vcGVyYXRpb25zLWFsZ29yaXRobVxuICAgKiBAcGFyYW0ge0NhY2hlQmF0Y2hPcGVyYXRpb25bXX0gb3BlcmF0aW9uc1xuICAgKiBAcmV0dXJucyB7cmVxdWVzdFJlc3BvbnNlTGlzdH1cbiAgICovXG4gICNiYXRjaENhY2hlT3BlcmF0aW9ucyAob3BlcmF0aW9ucykge1xuICAgIC8vIDEuXG4gICAgY29uc3QgY2FjaGUgPSB0aGlzLiNyZWxldmFudFJlcXVlc3RSZXNwb25zZUxpc3RcblxuICAgIC8vIDIuXG4gICAgY29uc3QgYmFja3VwQ2FjaGUgPSBbLi4uY2FjaGVdXG5cbiAgICAvLyAzLlxuICAgIGNvbnN0IGFkZGVkSXRlbXMgPSBbXVxuXG4gICAgLy8gNC4xXG4gICAgY29uc3QgcmVzdWx0TGlzdCA9IFtdXG5cbiAgICB0cnkge1xuICAgICAgLy8gNC4yXG4gICAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBvcGVyYXRpb25zKSB7XG4gICAgICAgIC8vIDQuMi4xXG4gICAgICAgIGlmIChvcGVyYXRpb24udHlwZSAhPT0gJ2RlbGV0ZScgJiYgb3BlcmF0aW9uLnR5cGUgIT09ICdwdXQnKSB7XG4gICAgICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICAgICAgaGVhZGVyOiAnQ2FjaGUuI2JhdGNoQ2FjaGVPcGVyYXRpb25zJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdvcGVyYXRpb24gdHlwZSBkb2VzIG5vdCBtYXRjaCBcImRlbGV0ZVwiIG9yIFwicHV0XCInXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDQuMi4yXG4gICAgICAgIGlmIChvcGVyYXRpb24udHlwZSA9PT0gJ2RlbGV0ZScgJiYgb3BlcmF0aW9uLnJlc3BvbnNlICE9IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgICBoZWFkZXI6ICdDYWNoZS4jYmF0Y2hDYWNoZU9wZXJhdGlvbnMnLFxuICAgICAgICAgICAgbWVzc2FnZTogJ2RlbGV0ZSBvcGVyYXRpb24gc2hvdWxkIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgcmVzcG9uc2UnXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDQuMi4zXG4gICAgICAgIGlmICh0aGlzLiNxdWVyeUNhY2hlKG9wZXJhdGlvbi5yZXF1ZXN0LCBvcGVyYXRpb24ub3B0aW9ucywgYWRkZWRJdGVtcykubGVuZ3RoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignPz8/JywgJ0ludmFsaWRTdGF0ZUVycm9yJylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDQuMi40XG4gICAgICAgIGxldCByZXF1ZXN0UmVzcG9uc2VzXG5cbiAgICAgICAgLy8gNC4yLjVcbiAgICAgICAgaWYgKG9wZXJhdGlvbi50eXBlID09PSAnZGVsZXRlJykge1xuICAgICAgICAgIC8vIDQuMi41LjFcbiAgICAgICAgICByZXF1ZXN0UmVzcG9uc2VzID0gdGhpcy4jcXVlcnlDYWNoZShvcGVyYXRpb24ucmVxdWVzdCwgb3BlcmF0aW9uLm9wdGlvbnMpXG5cbiAgICAgICAgICAvLyBUT0RPOiB0aGUgc3BlYyBpcyB3cm9uZywgdGhpcyBpcyBuZWVkZWQgdG8gcGFzcyBXUFRzXG4gICAgICAgICAgaWYgKHJlcXVlc3RSZXNwb25zZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gW11cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyA0LjIuNS4yXG4gICAgICAgICAgZm9yIChjb25zdCByZXF1ZXN0UmVzcG9uc2Ugb2YgcmVxdWVzdFJlc3BvbnNlcykge1xuICAgICAgICAgICAgY29uc3QgaWR4ID0gY2FjaGUuaW5kZXhPZihyZXF1ZXN0UmVzcG9uc2UpXG4gICAgICAgICAgICBhc3NlcnQoaWR4ICE9PSAtMSlcblxuICAgICAgICAgICAgLy8gNC4yLjUuMi4xXG4gICAgICAgICAgICBjYWNoZS5zcGxpY2UoaWR4LCAxKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24udHlwZSA9PT0gJ3B1dCcpIHsgLy8gNC4yLjZcbiAgICAgICAgICAvLyA0LjIuNi4xXG4gICAgICAgICAgaWYgKG9wZXJhdGlvbi5yZXNwb25zZSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgICAgIGhlYWRlcjogJ0NhY2hlLiNiYXRjaENhY2hlT3BlcmF0aW9ucycsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdwdXQgb3BlcmF0aW9uIHNob3VsZCBoYXZlIGFuIGFzc29jaWF0ZWQgcmVzcG9uc2UnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIDQuMi42LjJcbiAgICAgICAgICBjb25zdCByID0gb3BlcmF0aW9uLnJlcXVlc3RcblxuICAgICAgICAgIC8vIDQuMi42LjNcbiAgICAgICAgICBpZiAoIXVybElzSHR0cEh0dHBzU2NoZW1lKHIudXJsKSkge1xuICAgICAgICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICAgICAgICBoZWFkZXI6ICdDYWNoZS4jYmF0Y2hDYWNoZU9wZXJhdGlvbnMnLFxuICAgICAgICAgICAgICBtZXNzYWdlOiAnZXhwZWN0ZWQgaHR0cCBvciBodHRwcyBzY2hlbWUnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIDQuMi42LjRcbiAgICAgICAgICBpZiAoci5tZXRob2QgIT09ICdHRVQnKSB7XG4gICAgICAgICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgICAgIGhlYWRlcjogJ0NhY2hlLiNiYXRjaENhY2hlT3BlcmF0aW9ucycsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdub3QgZ2V0IG1ldGhvZCdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gNC4yLjYuNVxuICAgICAgICAgIGlmIChvcGVyYXRpb24ub3B0aW9ucyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgICAgIGhlYWRlcjogJ0NhY2hlLiNiYXRjaENhY2hlT3BlcmF0aW9ucycsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdvcHRpb25zIG11c3Qgbm90IGJlIGRlZmluZWQnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIDQuMi42LjZcbiAgICAgICAgICByZXF1ZXN0UmVzcG9uc2VzID0gdGhpcy4jcXVlcnlDYWNoZShvcGVyYXRpb24ucmVxdWVzdClcblxuICAgICAgICAgIC8vIDQuMi42LjdcbiAgICAgICAgICBmb3IgKGNvbnN0IHJlcXVlc3RSZXNwb25zZSBvZiByZXF1ZXN0UmVzcG9uc2VzKSB7XG4gICAgICAgICAgICBjb25zdCBpZHggPSBjYWNoZS5pbmRleE9mKHJlcXVlc3RSZXNwb25zZSlcbiAgICAgICAgICAgIGFzc2VydChpZHggIT09IC0xKVxuXG4gICAgICAgICAgICAvLyA0LjIuNi43LjFcbiAgICAgICAgICAgIGNhY2hlLnNwbGljZShpZHgsIDEpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gNC4yLjYuOFxuICAgICAgICAgIGNhY2hlLnB1c2goW29wZXJhdGlvbi5yZXF1ZXN0LCBvcGVyYXRpb24ucmVzcG9uc2VdKVxuXG4gICAgICAgICAgLy8gNC4yLjYuMTBcbiAgICAgICAgICBhZGRlZEl0ZW1zLnB1c2goW29wZXJhdGlvbi5yZXF1ZXN0LCBvcGVyYXRpb24ucmVzcG9uc2VdKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNC4yLjdcbiAgICAgICAgcmVzdWx0TGlzdC5wdXNoKFtvcGVyYXRpb24ucmVxdWVzdCwgb3BlcmF0aW9uLnJlc3BvbnNlXSlcbiAgICAgIH1cblxuICAgICAgLy8gNC4zXG4gICAgICByZXR1cm4gcmVzdWx0TGlzdFxuICAgIH0gY2F0Y2ggKGUpIHsgLy8gNS5cbiAgICAgIC8vIDUuMVxuICAgICAgdGhpcy4jcmVsZXZhbnRSZXF1ZXN0UmVzcG9uc2VMaXN0Lmxlbmd0aCA9IDBcblxuICAgICAgLy8gNS4yXG4gICAgICB0aGlzLiNyZWxldmFudFJlcXVlc3RSZXNwb25zZUxpc3QgPSBiYWNrdXBDYWNoZVxuXG4gICAgICAvLyA1LjNcbiAgICAgIHRocm93IGVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vU2VydmljZVdvcmtlci8jcXVlcnktY2FjaGVcbiAgICogQHBhcmFtIHthbnl9IHJlcXVlc3RRdWVyeVxuICAgKiBAcGFyYW0ge2ltcG9ydCgnLi4vLi4vdHlwZXMvY2FjaGUnKS5DYWNoZVF1ZXJ5T3B0aW9uc30gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3JlcXVlc3RSZXNwb25zZUxpc3R9IHRhcmdldFN0b3JhZ2VcbiAgICogQHJldHVybnMge3JlcXVlc3RSZXNwb25zZUxpc3R9XG4gICAqL1xuICAjcXVlcnlDYWNoZSAocmVxdWVzdFF1ZXJ5LCBvcHRpb25zLCB0YXJnZXRTdG9yYWdlKSB7XG4gICAgLyoqIEB0eXBlIHtyZXF1ZXN0UmVzcG9uc2VMaXN0fSAqL1xuICAgIGNvbnN0IHJlc3VsdExpc3QgPSBbXVxuXG4gICAgY29uc3Qgc3RvcmFnZSA9IHRhcmdldFN0b3JhZ2UgPz8gdGhpcy4jcmVsZXZhbnRSZXF1ZXN0UmVzcG9uc2VMaXN0XG5cbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RSZXNwb25zZSBvZiBzdG9yYWdlKSB7XG4gICAgICBjb25zdCBbY2FjaGVkUmVxdWVzdCwgY2FjaGVkUmVzcG9uc2VdID0gcmVxdWVzdFJlc3BvbnNlXG4gICAgICBpZiAodGhpcy4jcmVxdWVzdE1hdGNoZXNDYWNoZWRJdGVtKHJlcXVlc3RRdWVyeSwgY2FjaGVkUmVxdWVzdCwgY2FjaGVkUmVzcG9uc2UsIG9wdGlvbnMpKSB7XG4gICAgICAgIHJlc3VsdExpc3QucHVzaChyZXF1ZXN0UmVzcG9uc2UpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdExpc3RcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9TZXJ2aWNlV29ya2VyLyNyZXF1ZXN0LW1hdGNoZXMtY2FjaGVkLWl0ZW0tYWxnb3JpdGhtXG4gICAqIEBwYXJhbSB7YW55fSByZXF1ZXN0UXVlcnlcbiAgICogQHBhcmFtIHthbnl9IHJlcXVlc3RcbiAgICogQHBhcmFtIHthbnkgfCBudWxsfSByZXNwb25zZVxuICAgKiBAcGFyYW0ge2ltcG9ydCgnLi4vLi4vdHlwZXMvY2FjaGUnKS5DYWNoZVF1ZXJ5T3B0aW9ucyB8IHVuZGVmaW5lZH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gICNyZXF1ZXN0TWF0Y2hlc0NhY2hlZEl0ZW0gKHJlcXVlc3RRdWVyeSwgcmVxdWVzdCwgcmVzcG9uc2UgPSBudWxsLCBvcHRpb25zKSB7XG4gICAgLy8gaWYgKG9wdGlvbnM/Lmlnbm9yZU1ldGhvZCA9PT0gZmFsc2UgJiYgcmVxdWVzdC5tZXRob2QgPT09ICdHRVQnKSB7XG4gICAgLy8gICByZXR1cm4gZmFsc2VcbiAgICAvLyB9XG5cbiAgICBjb25zdCBxdWVyeVVSTCA9IG5ldyBVUkwocmVxdWVzdFF1ZXJ5LnVybClcblxuICAgIGNvbnN0IGNhY2hlZFVSTCA9IG5ldyBVUkwocmVxdWVzdC51cmwpXG5cbiAgICBpZiAob3B0aW9ucz8uaWdub3JlU2VhcmNoKSB7XG4gICAgICBjYWNoZWRVUkwuc2VhcmNoID0gJydcblxuICAgICAgcXVlcnlVUkwuc2VhcmNoID0gJydcbiAgICB9XG5cbiAgICBpZiAoIXVybEVxdWFscyhxdWVyeVVSTCwgY2FjaGVkVVJMLCB0cnVlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgcmVzcG9uc2UgPT0gbnVsbCB8fFxuICAgICAgb3B0aW9ucz8uaWdub3JlVmFyeSB8fFxuICAgICAgIXJlc3BvbnNlLmhlYWRlcnNMaXN0LmNvbnRhaW5zKCd2YXJ5JylcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgY29uc3QgZmllbGRWYWx1ZXMgPSBnZXRGaWVsZFZhbHVlcyhyZXNwb25zZS5oZWFkZXJzTGlzdC5nZXQoJ3ZhcnknKSlcblxuICAgIGZvciAoY29uc3QgZmllbGRWYWx1ZSBvZiBmaWVsZFZhbHVlcykge1xuICAgICAgaWYgKGZpZWxkVmFsdWUgPT09ICcqJykge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVxdWVzdFZhbHVlID0gcmVxdWVzdC5oZWFkZXJzTGlzdC5nZXQoZmllbGRWYWx1ZSlcbiAgICAgIGNvbnN0IHF1ZXJ5VmFsdWUgPSByZXF1ZXN0UXVlcnkuaGVhZGVyc0xpc3QuZ2V0KGZpZWxkVmFsdWUpXG5cbiAgICAgIC8vIElmIG9uZSBoYXMgdGhlIGhlYWRlciBhbmQgdGhlIG90aGVyIGRvZXNuJ3QsIG9yIG9uZSBoYXNcbiAgICAgIC8vIGEgZGlmZmVyZW50IHZhbHVlIHRoYW4gdGhlIG90aGVyLCByZXR1cm4gZmFsc2VcbiAgICAgIGlmIChyZXF1ZXN0VmFsdWUgIT09IHF1ZXJ5VmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhDYWNoZS5wcm90b3R5cGUsIHtcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHtcbiAgICB2YWx1ZTogJ0NhY2hlJyxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSxcbiAgbWF0Y2g6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIG1hdGNoQWxsOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBhZGQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGFkZEFsbDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgcHV0OiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBkZWxldGU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGtleXM6IGtFbnVtZXJhYmxlUHJvcGVydHlcbn0pXG5cbmNvbnN0IGNhY2hlUXVlcnlPcHRpb25Db252ZXJ0ZXJzID0gW1xuICB7XG4gICAga2V5OiAnaWdub3JlU2VhcmNoJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4sXG4gICAgZGVmYXVsdFZhbHVlOiBmYWxzZVxuICB9LFxuICB7XG4gICAga2V5OiAnaWdub3JlTWV0aG9kJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4sXG4gICAgZGVmYXVsdFZhbHVlOiBmYWxzZVxuICB9LFxuICB7XG4gICAga2V5OiAnaWdub3JlVmFyeScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ib29sZWFuLFxuICAgIGRlZmF1bHRWYWx1ZTogZmFsc2VcbiAgfVxuXVxuXG53ZWJpZGwuY29udmVydGVycy5DYWNoZVF1ZXJ5T3B0aW9ucyA9IHdlYmlkbC5kaWN0aW9uYXJ5Q29udmVydGVyKGNhY2hlUXVlcnlPcHRpb25Db252ZXJ0ZXJzKVxuXG53ZWJpZGwuY29udmVydGVycy5NdWx0aUNhY2hlUXVlcnlPcHRpb25zID0gd2ViaWRsLmRpY3Rpb25hcnlDb252ZXJ0ZXIoW1xuICAuLi5jYWNoZVF1ZXJ5T3B0aW9uQ29udmVydGVycyxcbiAge1xuICAgIGtleTogJ2NhY2hlTmFtZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmdcbiAgfVxuXSlcblxud2ViaWRsLmNvbnZlcnRlcnMuUmVzcG9uc2UgPSB3ZWJpZGwuaW50ZXJmYWNlQ29udmVydGVyKFJlc3BvbnNlKVxuXG53ZWJpZGwuY29udmVydGVyc1snc2VxdWVuY2U8UmVxdWVzdEluZm8+J10gPSB3ZWJpZGwuc2VxdWVuY2VDb252ZXJ0ZXIoXG4gIHdlYmlkbC5jb252ZXJ0ZXJzLlJlcXVlc3RJbmZvXG4pXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBDYWNoZVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsga0NvbnN0cnVjdCB9ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgQ2FjaGUgfSA9IHJlcXVpcmUoJy4vY2FjaGUnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3dlYmlkbCcpXG5jb25zdCB7IGtFbnVtZXJhYmxlUHJvcGVydHkgfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5cbmNsYXNzIENhY2hlU3RvcmFnZSB7XG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9TZXJ2aWNlV29ya2VyLyNkZm4tcmVsZXZhbnQtbmFtZS10by1jYWNoZS1tYXBcbiAgICogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydCgnLi9jYWNoZScpLnJlcXVlc3RSZXNwb25zZUxpc3R9XG4gICAqL1xuICAjY2FjaGVzID0gbmV3IE1hcCgpXG5cbiAgY29uc3RydWN0b3IgKCkge1xuICAgIGlmIChhcmd1bWVudHNbMF0gIT09IGtDb25zdHJ1Y3QpIHtcbiAgICAgIHdlYmlkbC5pbGxlZ2FsQ29uc3RydWN0b3IoKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG1hdGNoIChyZXF1ZXN0LCBvcHRpb25zID0ge30pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBDYWNoZVN0b3JhZ2UpXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0NhY2hlU3RvcmFnZS5tYXRjaCcgfSlcblxuICAgIHJlcXVlc3QgPSB3ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mbyhyZXF1ZXN0KVxuICAgIG9wdGlvbnMgPSB3ZWJpZGwuY29udmVydGVycy5NdWx0aUNhY2hlUXVlcnlPcHRpb25zKG9wdGlvbnMpXG5cbiAgICAvLyAxLlxuICAgIGlmIChvcHRpb25zLmNhY2hlTmFtZSAhPSBudWxsKSB7XG4gICAgICAvLyAxLjEuMS4xXG4gICAgICBpZiAodGhpcy4jY2FjaGVzLmhhcyhvcHRpb25zLmNhY2hlTmFtZSkpIHtcbiAgICAgICAgLy8gMS4xLjEuMS4xXG4gICAgICAgIGNvbnN0IGNhY2hlTGlzdCA9IHRoaXMuI2NhY2hlcy5nZXQob3B0aW9ucy5jYWNoZU5hbWUpXG4gICAgICAgIGNvbnN0IGNhY2hlID0gbmV3IENhY2hlKGtDb25zdHJ1Y3QsIGNhY2hlTGlzdClcblxuICAgICAgICByZXR1cm4gYXdhaXQgY2FjaGUubWF0Y2gocmVxdWVzdCwgb3B0aW9ucylcbiAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyAyLlxuICAgICAgLy8gMi4yXG4gICAgICBmb3IgKGNvbnN0IGNhY2hlTGlzdCBvZiB0aGlzLiNjYWNoZXMudmFsdWVzKCkpIHtcbiAgICAgICAgY29uc3QgY2FjaGUgPSBuZXcgQ2FjaGUoa0NvbnN0cnVjdCwgY2FjaGVMaXN0KVxuXG4gICAgICAgIC8vIDIuMi4xLjJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjYWNoZS5tYXRjaChyZXF1ZXN0LCBvcHRpb25zKVxuXG4gICAgICAgIGlmIChyZXNwb25zZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vU2VydmljZVdvcmtlci8jY2FjaGUtc3RvcmFnZS1oYXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhY2hlTmFtZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGhhcyAoY2FjaGVOYW1lKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGVTdG9yYWdlKVxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdDYWNoZVN0b3JhZ2UuaGFzJyB9KVxuXG4gICAgY2FjaGVOYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKGNhY2hlTmFtZSlcblxuICAgIC8vIDIuMS4xXG4gICAgLy8gMi4yXG4gICAgcmV0dXJuIHRoaXMuI2NhY2hlcy5oYXMoY2FjaGVOYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL1NlcnZpY2VXb3JrZXIvI2RvbS1jYWNoZXN0b3JhZ2Utb3BlblxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FjaGVOYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENhY2hlPn1cbiAgICovXG4gIGFzeW5jIG9wZW4gKGNhY2hlTmFtZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIENhY2hlU3RvcmFnZSlcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnQ2FjaGVTdG9yYWdlLm9wZW4nIH0pXG5cbiAgICBjYWNoZU5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcoY2FjaGVOYW1lKVxuXG4gICAgLy8gMi4xXG4gICAgaWYgKHRoaXMuI2NhY2hlcy5oYXMoY2FjaGVOYW1lKSkge1xuICAgICAgLy8gYXdhaXQgY2FjaGVzLm9wZW4oJ3YxJykgIT09IGF3YWl0IGNhY2hlcy5vcGVuKCd2MScpXG5cbiAgICAgIC8vIDIuMS4xXG4gICAgICBjb25zdCBjYWNoZSA9IHRoaXMuI2NhY2hlcy5nZXQoY2FjaGVOYW1lKVxuXG4gICAgICAvLyAyLjEuMS4xXG4gICAgICByZXR1cm4gbmV3IENhY2hlKGtDb25zdHJ1Y3QsIGNhY2hlKVxuICAgIH1cblxuICAgIC8vIDIuMlxuICAgIGNvbnN0IGNhY2hlID0gW11cblxuICAgIC8vIDIuM1xuICAgIHRoaXMuI2NhY2hlcy5zZXQoY2FjaGVOYW1lLCBjYWNoZSlcblxuICAgIC8vIDIuNFxuICAgIHJldHVybiBuZXcgQ2FjaGUoa0NvbnN0cnVjdCwgY2FjaGUpXG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vU2VydmljZVdvcmtlci8jY2FjaGUtc3RvcmFnZS1kZWxldGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhY2hlTmFtZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGRlbGV0ZSAoY2FjaGVOYW1lKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGVTdG9yYWdlKVxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdDYWNoZVN0b3JhZ2UuZGVsZXRlJyB9KVxuXG4gICAgY2FjaGVOYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKGNhY2hlTmFtZSlcblxuICAgIHJldHVybiB0aGlzLiNjYWNoZXMuZGVsZXRlKGNhY2hlTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9TZXJ2aWNlV29ya2VyLyNjYWNoZS1zdG9yYWdlLWtleXNcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgYXN5bmMga2V5cyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGVTdG9yYWdlKVxuXG4gICAgLy8gMi4xXG4gICAgY29uc3Qga2V5cyA9IHRoaXMuI2NhY2hlcy5rZXlzKClcblxuICAgIC8vIDIuMlxuICAgIHJldHVybiBbLi4ua2V5c11cbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhDYWNoZVN0b3JhZ2UucHJvdG90eXBlLCB7XG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7XG4gICAgdmFsdWU6ICdDYWNoZVN0b3JhZ2UnLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9LFxuICBtYXRjaDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgaGFzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvcGVuOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBkZWxldGU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGtleXM6IGtFbnVtZXJhYmxlUHJvcGVydHlcbn0pXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBDYWNoZVN0b3JhZ2Vcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG4vLyBodHRwczovL3dpY2cuZ2l0aHViLmlvL2Nvb2tpZS1zdG9yZS8jY29va2llLW1heGltdW0tYXR0cmlidXRlLXZhbHVlLXNpemVcbmNvbnN0IG1heEF0dHJpYnV0ZVZhbHVlU2l6ZSA9IDEwMjRcblxuLy8gaHR0cHM6Ly93aWNnLmdpdGh1Yi5pby9jb29raWUtc3RvcmUvI2Nvb2tpZS1tYXhpbXVtLW5hbWUtdmFsdWUtcGFpci1zaXplXG5jb25zdCBtYXhOYW1lVmFsdWVQYWlyU2l6ZSA9IDQwOTZcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1heEF0dHJpYnV0ZVZhbHVlU2l6ZSxcbiAgbWF4TmFtZVZhbHVlUGFpclNpemVcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzQ1RMRXhjbHVkaW5nSHRhYiAodmFsdWUpIHtcbiAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZm9yIChjb25zdCBjaGFyIG9mIHZhbHVlKSB7XG4gICAgY29uc3QgY29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKVxuXG4gICAgaWYgKFxuICAgICAgKGNvZGUgPj0gMHgwMCB8fCBjb2RlIDw9IDB4MDgpIHx8XG4gICAgICAoY29kZSA+PSAweDBBIHx8IGNvZGUgPD0gMHgxRikgfHxcbiAgICAgIGNvZGUgPT09IDB4N0ZcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiBDSEFSICAgICAgICAgICA9IDxhbnkgVVMtQVNDSUkgY2hhcmFjdGVyIChvY3RldHMgMCAtIDEyNyk+XG4gdG9rZW4gICAgICAgICAgPSAxKjxhbnkgQ0hBUiBleGNlcHQgQ1RMcyBvciBzZXBhcmF0b3JzPlxuIHNlcGFyYXRvcnMgICAgID0gXCIoXCIgfCBcIilcIiB8IFwiPFwiIHwgXCI+XCIgfCBcIkBcIlxuICAgICAgICAgICAgICAgIHwgXCIsXCIgfCBcIjtcIiB8IFwiOlwiIHwgXCJcXFwiIHwgPFwiPlxuICAgICAgICAgICAgICAgIHwgXCIvXCIgfCBcIltcIiB8IFwiXVwiIHwgXCI/XCIgfCBcIj1cIlxuICAgICAgICAgICAgICAgIHwgXCJ7XCIgfCBcIn1cIiB8IFNQIHwgSFRcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ29va2llTmFtZSAobmFtZSkge1xuICBmb3IgKGNvbnN0IGNoYXIgb2YgbmFtZSkge1xuICAgIGNvbnN0IGNvZGUgPSBjaGFyLmNoYXJDb2RlQXQoMClcblxuICAgIGlmIChcbiAgICAgIChjb2RlIDw9IDB4MjAgfHwgY29kZSA+IDB4N0YpIHx8XG4gICAgICBjaGFyID09PSAnKCcgfHxcbiAgICAgIGNoYXIgPT09ICcpJyB8fFxuICAgICAgY2hhciA9PT0gJz4nIHx8XG4gICAgICBjaGFyID09PSAnPCcgfHxcbiAgICAgIGNoYXIgPT09ICdAJyB8fFxuICAgICAgY2hhciA9PT0gJywnIHx8XG4gICAgICBjaGFyID09PSAnOycgfHxcbiAgICAgIGNoYXIgPT09ICc6JyB8fFxuICAgICAgY2hhciA9PT0gJ1xcXFwnIHx8XG4gICAgICBjaGFyID09PSAnXCInIHx8XG4gICAgICBjaGFyID09PSAnLycgfHxcbiAgICAgIGNoYXIgPT09ICdbJyB8fFxuICAgICAgY2hhciA9PT0gJ10nIHx8XG4gICAgICBjaGFyID09PSAnPycgfHxcbiAgICAgIGNoYXIgPT09ICc9JyB8fFxuICAgICAgY2hhciA9PT0gJ3snIHx8XG4gICAgICBjaGFyID09PSAnfSdcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb29raWUgbmFtZScpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuIGNvb2tpZS12YWx1ZSAgICAgID0gKmNvb2tpZS1vY3RldCAvICggRFFVT1RFICpjb29raWUtb2N0ZXQgRFFVT1RFIClcbiBjb29raWUtb2N0ZXQgICAgICA9ICV4MjEgLyAleDIzLTJCIC8gJXgyRC0zQSAvICV4M0MtNUIgLyAleDVELTdFXG4gICAgICAgICAgICAgICAgICAgICAgIDsgVVMtQVNDSUkgY2hhcmFjdGVycyBleGNsdWRpbmcgQ1RMcyxcbiAgICAgICAgICAgICAgICAgICAgICAgOyB3aGl0ZXNwYWNlIERRVU9URSwgY29tbWEsIHNlbWljb2xvbixcbiAgICAgICAgICAgICAgICAgICAgICAgOyBhbmQgYmFja3NsYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVDb29raWVWYWx1ZSAodmFsdWUpIHtcbiAgZm9yIChjb25zdCBjaGFyIG9mIHZhbHVlKSB7XG4gICAgY29uc3QgY29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKVxuXG4gICAgaWYgKFxuICAgICAgY29kZSA8IDB4MjEgfHwgLy8gZXhjbHVkZSBDVExzICgwLTMxKVxuICAgICAgY29kZSA9PT0gMHgyMiB8fFxuICAgICAgY29kZSA9PT0gMHgyQyB8fFxuICAgICAgY29kZSA9PT0gMHgzQiB8fFxuICAgICAgY29kZSA9PT0gMHg1QyB8fFxuICAgICAgY29kZSA+IDB4N0UgLy8gbm9uLWFzY2lpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaGVhZGVyIHZhbHVlJylcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBwYXRoLXZhbHVlICAgICAgICA9IDxhbnkgQ0hBUiBleGNlcHQgQ1RMcyBvciBcIjtcIj5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ29va2llUGF0aCAocGF0aCkge1xuICBmb3IgKGNvbnN0IGNoYXIgb2YgcGF0aCkge1xuICAgIGNvbnN0IGNvZGUgPSBjaGFyLmNoYXJDb2RlQXQoMClcblxuICAgIGlmIChjb2RlIDwgMHgyMSB8fCBjaGFyID09PSAnOycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb29raWUgcGF0aCcpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogSSBoYXZlIG5vIGlkZWEgd2h5IHRoZXNlIHZhbHVlcyBhcmVuJ3QgYWxsb3dlZCB0byBiZSBob25lc3QsXG4gKiBidXQgRGVubyB0ZXN0cyB0aGVzZS4gLSBLaGFmcmFcbiAqIEBwYXJhbSB7c3RyaW5nfSBkb21haW5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVDb29raWVEb21haW4gKGRvbWFpbikge1xuICBpZiAoXG4gICAgZG9tYWluLnN0YXJ0c1dpdGgoJy0nKSB8fFxuICAgIGRvbWFpbi5lbmRzV2l0aCgnLicpIHx8XG4gICAgZG9tYWluLmVuZHNXaXRoKCctJylcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvb2tpZSBkb21haW4nKVxuICB9XG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNzIzMSNzZWN0aW9uLTcuMS4xLjFcbiAqIEBwYXJhbSB7bnVtYmVyfERhdGV9IGRhdGVcbiAgSU1GLWZpeGRhdGUgID0gZGF5LW5hbWUgXCIsXCIgU1AgZGF0ZTEgU1AgdGltZS1vZi1kYXkgU1AgR01UXG4gIDsgZml4ZWQgbGVuZ3RoL3pvbmUvY2FwaXRhbGl6YXRpb24gc3Vic2V0IG9mIHRoZSBmb3JtYXRcbiAgOyBzZWUgU2VjdGlvbiAzLjMgb2YgW1JGQzUzMjJdXG5cbiAgZGF5LW5hbWUgICAgID0gJXg0RC42Ri42RSA7IFwiTW9uXCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg1NC43NS42NSA7IFwiVHVlXCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg1Ny42NS42NCA7IFwiV2VkXCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg1NC42OC43NSA7IFwiVGh1XCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg0Ni43Mi42OSA7IFwiRnJpXCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg1My42MS43NCA7IFwiU2F0XCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg1My43NS42RSA7IFwiU3VuXCIsIGNhc2Utc2Vuc2l0aXZlXG4gIGRhdGUxICAgICAgICA9IGRheSBTUCBtb250aCBTUCB5ZWFyXG4gICAgICAgICAgICAgICAgICA7IGUuZy4sIDAyIEp1biAxOTgyXG5cbiAgZGF5ICAgICAgICAgID0gMkRJR0lUXG4gIG1vbnRoICAgICAgICA9ICV4NEEuNjEuNkUgOyBcIkphblwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NDYuNjUuNjIgOyBcIkZlYlwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NEQuNjEuNzIgOyBcIk1hclwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NDEuNzAuNzIgOyBcIkFwclwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NEQuNjEuNzkgOyBcIk1heVwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NEEuNzUuNkUgOyBcIkp1blwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NEEuNzUuNkMgOyBcIkp1bFwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NDEuNzUuNjcgOyBcIkF1Z1wiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NTMuNjUuNzAgOyBcIlNlcFwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NEYuNjMuNzQgOyBcIk9jdFwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NEUuNkYuNzYgOyBcIk5vdlwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NDQuNjUuNjMgOyBcIkRlY1wiLCBjYXNlLXNlbnNpdGl2ZVxuICB5ZWFyICAgICAgICAgPSA0RElHSVRcblxuICBHTVQgICAgICAgICAgPSAleDQ3LjRELjU0IDsgXCJHTVRcIiwgY2FzZS1zZW5zaXRpdmVcblxuICB0aW1lLW9mLWRheSAgPSBob3VyIFwiOlwiIG1pbnV0ZSBcIjpcIiBzZWNvbmRcbiAgICAgICAgICAgICAgOyAwMDowMDowMCAtIDIzOjU5OjYwIChsZWFwIHNlY29uZClcblxuICBob3VyICAgICAgICAgPSAyRElHSVRcbiAgbWludXRlICAgICAgID0gMkRJR0lUXG4gIHNlY29uZCAgICAgICA9IDJESUdJVFxuICovXG5mdW5jdGlvbiB0b0lNRkRhdGUgKGRhdGUpIHtcbiAgaWYgKHR5cGVvZiBkYXRlID09PSAnbnVtYmVyJykge1xuICAgIGRhdGUgPSBuZXcgRGF0ZShkYXRlKVxuICB9XG5cbiAgY29uc3QgZGF5cyA9IFtcbiAgICAnU3VuJywgJ01vbicsICdUdWUnLCAnV2VkJyxcbiAgICAnVGh1JywgJ0ZyaScsICdTYXQnXG4gIF1cblxuICBjb25zdCBtb250aHMgPSBbXG4gICAgJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJyxcbiAgICAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXG4gIF1cblxuICBjb25zdCBkYXlOYW1lID0gZGF5c1tkYXRlLmdldFVUQ0RheSgpXVxuICBjb25zdCBkYXkgPSBkYXRlLmdldFVUQ0RhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJylcbiAgY29uc3QgbW9udGggPSBtb250aHNbZGF0ZS5nZXRVVENNb250aCgpXVxuICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRVVENGdWxsWWVhcigpXG4gIGNvbnN0IGhvdXIgPSBkYXRlLmdldFVUQ0hvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpXG4gIGNvbnN0IG1pbnV0ZSA9IGRhdGUuZ2V0VVRDTWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKVxuICBjb25zdCBzZWNvbmQgPSBkYXRlLmdldFVUQ1NlY29uZHMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJylcblxuICByZXR1cm4gYCR7ZGF5TmFtZX0sICR7ZGF5fSAke21vbnRofSAke3llYXJ9ICR7aG91cn06JHttaW51dGV9OiR7c2Vjb25kfSBHTVRgXG59XG5cbi8qKlxuIG1heC1hZ2UtYXYgICAgICAgID0gXCJNYXgtQWdlPVwiIG5vbi16ZXJvLWRpZ2l0ICpESUdJVFxuICAgICAgICAgICAgICAgICAgICAgICA7IEluIHByYWN0aWNlLCBib3RoIGV4cGlyZXMtYXYgYW5kIG1heC1hZ2UtYXZcbiAgICAgICAgICAgICAgICAgICAgICAgOyBhcmUgbGltaXRlZCB0byBkYXRlcyByZXByZXNlbnRhYmxlIGJ5IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICA7IHVzZXIgYWdlbnQuXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4QWdlXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ29va2llTWF4QWdlIChtYXhBZ2UpIHtcbiAgaWYgKG1heEFnZSA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29va2llIG1heC1hZ2UnKVxuICB9XG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNjI2NSNzZWN0aW9uLTQuMS4xXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbmRleCcpLkNvb2tpZX0gY29va2llXG4gKi9cbmZ1bmN0aW9uIHN0cmluZ2lmeSAoY29va2llKSB7XG4gIGlmIChjb29raWUubmFtZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgdmFsaWRhdGVDb29raWVOYW1lKGNvb2tpZS5uYW1lKVxuICB2YWxpZGF0ZUNvb2tpZVZhbHVlKGNvb2tpZS52YWx1ZSlcblxuICBjb25zdCBvdXQgPSBbYCR7Y29va2llLm5hbWV9PSR7Y29va2llLnZhbHVlfWBdXG5cbiAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9kcmFmdC1pZXRmLWh0dHBiaXMtY29va2llLXByZWZpeGVzLTAwI3NlY3Rpb24tMy4xXG4gIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtaWV0Zi1odHRwYmlzLWNvb2tpZS1wcmVmaXhlcy0wMCNzZWN0aW9uLTMuMlxuICBpZiAoY29va2llLm5hbWUuc3RhcnRzV2l0aCgnX19TZWN1cmUtJykpIHtcbiAgICBjb29raWUuc2VjdXJlID0gdHJ1ZVxuICB9XG5cbiAgaWYgKGNvb2tpZS5uYW1lLnN0YXJ0c1dpdGgoJ19fSG9zdC0nKSkge1xuICAgIGNvb2tpZS5zZWN1cmUgPSB0cnVlXG4gICAgY29va2llLmRvbWFpbiA9IG51bGxcbiAgICBjb29raWUucGF0aCA9ICcvJ1xuICB9XG5cbiAgaWYgKGNvb2tpZS5zZWN1cmUpIHtcbiAgICBvdXQucHVzaCgnU2VjdXJlJylcbiAgfVxuXG4gIGlmIChjb29raWUuaHR0cE9ubHkpIHtcbiAgICBvdXQucHVzaCgnSHR0cE9ubHknKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBjb29raWUubWF4QWdlID09PSAnbnVtYmVyJykge1xuICAgIHZhbGlkYXRlQ29va2llTWF4QWdlKGNvb2tpZS5tYXhBZ2UpXG4gICAgb3V0LnB1c2goYE1heC1BZ2U9JHtjb29raWUubWF4QWdlfWApXG4gIH1cblxuICBpZiAoY29va2llLmRvbWFpbikge1xuICAgIHZhbGlkYXRlQ29va2llRG9tYWluKGNvb2tpZS5kb21haW4pXG4gICAgb3V0LnB1c2goYERvbWFpbj0ke2Nvb2tpZS5kb21haW59YClcbiAgfVxuXG4gIGlmIChjb29raWUucGF0aCkge1xuICAgIHZhbGlkYXRlQ29va2llUGF0aChjb29raWUucGF0aClcbiAgICBvdXQucHVzaChgUGF0aD0ke2Nvb2tpZS5wYXRofWApXG4gIH1cblxuICBpZiAoY29va2llLmV4cGlyZXMgJiYgY29va2llLmV4cGlyZXMudG9TdHJpbmcoKSAhPT0gJ0ludmFsaWQgRGF0ZScpIHtcbiAgICBvdXQucHVzaChgRXhwaXJlcz0ke3RvSU1GRGF0ZShjb29raWUuZXhwaXJlcyl9YClcbiAgfVxuXG4gIGlmIChjb29raWUuc2FtZVNpdGUpIHtcbiAgICBvdXQucHVzaChgU2FtZVNpdGU9JHtjb29raWUuc2FtZVNpdGV9YClcbiAgfVxuXG4gIGZvciAoY29uc3QgcGFydCBvZiBjb29raWUudW5wYXJzZWQpIHtcbiAgICBpZiAoIXBhcnQuaW5jbHVkZXMoJz0nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHVucGFyc2VkJylcbiAgICB9XG5cbiAgICBjb25zdCBba2V5LCAuLi52YWx1ZV0gPSBwYXJ0LnNwbGl0KCc9JylcblxuICAgIG91dC5wdXNoKGAke2tleS50cmltKCl9PSR7dmFsdWUuam9pbignPScpfWApXG4gIH1cblxuICByZXR1cm4gb3V0LmpvaW4oJzsgJylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzQ1RMRXhjbHVkaW5nSHRhYixcbiAgdmFsaWRhdGVDb29raWVOYW1lLFxuICB2YWxpZGF0ZUNvb2tpZVBhdGgsXG4gIHZhbGlkYXRlQ29va2llVmFsdWUsXG4gIHRvSU1GRGF0ZSxcbiAgc3RyaW5naWZ5XG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBtYXhOYW1lVmFsdWVQYWlyU2l6ZSwgbWF4QXR0cmlidXRlVmFsdWVTaXplIH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5jb25zdCB7IGlzQ1RMRXhjbHVkaW5nSHRhYiB9ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHsgY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50c0Zhc3QgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL2RhdGFVUkwnKVxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUGFyc2VzIHRoZSBmaWVsZC12YWx1ZSBhdHRyaWJ1dGVzIG9mIGEgc2V0LWNvb2tpZSBoZWFkZXIgc3RyaW5nLlxuICogQHNlZSBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1yZmM2MjY1YmlzI3NlY3Rpb24tNS40XG4gKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyXG4gKiBAcmV0dXJucyBpZiB0aGUgaGVhZGVyIGlzIGludmFsaWQsIG51bGwgd2lsbCBiZSByZXR1cm5lZFxuICovXG5mdW5jdGlvbiBwYXJzZVNldENvb2tpZSAoaGVhZGVyKSB7XG4gIC8vIDEuIElmIHRoZSBzZXQtY29va2llLXN0cmluZyBjb250YWlucyBhICV4MDAtMDggLyAleDBBLTFGIC8gJXg3RlxuICAvLyAgICBjaGFyYWN0ZXIgKENUTCBjaGFyYWN0ZXJzIGV4Y2x1ZGluZyBIVEFCKTogQWJvcnQgdGhlc2Ugc3RlcHMgYW5kXG4gIC8vICAgIGlnbm9yZSB0aGUgc2V0LWNvb2tpZS1zdHJpbmcgZW50aXJlbHkuXG4gIGlmIChpc0NUTEV4Y2x1ZGluZ0h0YWIoaGVhZGVyKSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBsZXQgbmFtZVZhbHVlUGFpciA9ICcnXG4gIGxldCB1bnBhcnNlZEF0dHJpYnV0ZXMgPSAnJ1xuICBsZXQgbmFtZSA9ICcnXG4gIGxldCB2YWx1ZSA9ICcnXG5cbiAgLy8gMi4gSWYgdGhlIHNldC1jb29raWUtc3RyaW5nIGNvbnRhaW5zIGEgJXgzQiAoXCI7XCIpIGNoYXJhY3RlcjpcbiAgaWYgKGhlYWRlci5pbmNsdWRlcygnOycpKSB7XG4gICAgLy8gMS4gVGhlIG5hbWUtdmFsdWUtcGFpciBzdHJpbmcgY29uc2lzdHMgb2YgdGhlIGNoYXJhY3RlcnMgdXAgdG8sXG4gICAgLy8gICAgYnV0IG5vdCBpbmNsdWRpbmcsIHRoZSBmaXJzdCAleDNCIChcIjtcIiksIGFuZCB0aGUgdW5wYXJzZWQtXG4gICAgLy8gICAgYXR0cmlidXRlcyBjb25zaXN0IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHNldC1jb29raWUtc3RyaW5nXG4gICAgLy8gICAgKGluY2x1ZGluZyB0aGUgJXgzQiAoXCI7XCIpIGluIHF1ZXN0aW9uKS5cbiAgICBjb25zdCBwb3NpdGlvbiA9IHsgcG9zaXRpb246IDAgfVxuXG4gICAgbmFtZVZhbHVlUGFpciA9IGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0KCc7JywgaGVhZGVyLCBwb3NpdGlvbilcbiAgICB1bnBhcnNlZEF0dHJpYnV0ZXMgPSBoZWFkZXIuc2xpY2UocG9zaXRpb24ucG9zaXRpb24pXG4gIH0gZWxzZSB7XG4gICAgLy8gT3RoZXJ3aXNlOlxuXG4gICAgLy8gMS4gVGhlIG5hbWUtdmFsdWUtcGFpciBzdHJpbmcgY29uc2lzdHMgb2YgYWxsIHRoZSBjaGFyYWN0ZXJzXG4gICAgLy8gICAgY29udGFpbmVkIGluIHRoZSBzZXQtY29va2llLXN0cmluZywgYW5kIHRoZSB1bnBhcnNlZC1cbiAgICAvLyAgICBhdHRyaWJ1dGVzIGlzIHRoZSBlbXB0eSBzdHJpbmcuXG4gICAgbmFtZVZhbHVlUGFpciA9IGhlYWRlclxuICB9XG5cbiAgLy8gMy4gSWYgdGhlIG5hbWUtdmFsdWUtcGFpciBzdHJpbmcgbGFja3MgYSAleDNEIChcIj1cIikgY2hhcmFjdGVyLCB0aGVuXG4gIC8vICAgIHRoZSBuYW1lIHN0cmluZyBpcyBlbXB0eSwgYW5kIHRoZSB2YWx1ZSBzdHJpbmcgaXMgdGhlIHZhbHVlIG9mXG4gIC8vICAgIG5hbWUtdmFsdWUtcGFpci5cbiAgaWYgKCFuYW1lVmFsdWVQYWlyLmluY2x1ZGVzKCc9JykpIHtcbiAgICB2YWx1ZSA9IG5hbWVWYWx1ZVBhaXJcbiAgfSBlbHNlIHtcbiAgICAvLyAgICBPdGhlcndpc2UsIHRoZSBuYW1lIHN0cmluZyBjb25zaXN0cyBvZiB0aGUgY2hhcmFjdGVycyB1cCB0bywgYnV0XG4gICAgLy8gICAgbm90IGluY2x1ZGluZywgdGhlIGZpcnN0ICV4M0QgKFwiPVwiKSBjaGFyYWN0ZXIsIGFuZCB0aGUgKHBvc3NpYmx5XG4gICAgLy8gICAgZW1wdHkpIHZhbHVlIHN0cmluZyBjb25zaXN0cyBvZiB0aGUgY2hhcmFjdGVycyBhZnRlciB0aGUgZmlyc3RcbiAgICAvLyAgICAleDNEIChcIj1cIikgY2hhcmFjdGVyLlxuICAgIGNvbnN0IHBvc2l0aW9uID0geyBwb3NpdGlvbjogMCB9XG4gICAgbmFtZSA9IGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0KFxuICAgICAgJz0nLFxuICAgICAgbmFtZVZhbHVlUGFpcixcbiAgICAgIHBvc2l0aW9uXG4gICAgKVxuICAgIHZhbHVlID0gbmFtZVZhbHVlUGFpci5zbGljZShwb3NpdGlvbi5wb3NpdGlvbiArIDEpXG4gIH1cblxuICAvLyA0LiBSZW1vdmUgYW55IGxlYWRpbmcgb3IgdHJhaWxpbmcgV1NQIGNoYXJhY3RlcnMgZnJvbSB0aGUgbmFtZVxuICAvLyAgICBzdHJpbmcgYW5kIHRoZSB2YWx1ZSBzdHJpbmcuXG4gIG5hbWUgPSBuYW1lLnRyaW0oKVxuICB2YWx1ZSA9IHZhbHVlLnRyaW0oKVxuXG4gIC8vIDUuIElmIHRoZSBzdW0gb2YgdGhlIGxlbmd0aHMgb2YgdGhlIG5hbWUgc3RyaW5nIGFuZCB0aGUgdmFsdWUgc3RyaW5nXG4gIC8vICAgIGlzIG1vcmUgdGhhbiA0MDk2IG9jdGV0cywgYWJvcnQgdGhlc2Ugc3RlcHMgYW5kIGlnbm9yZSB0aGUgc2V0LVxuICAvLyAgICBjb29raWUtc3RyaW5nIGVudGlyZWx5LlxuICBpZiAobmFtZS5sZW5ndGggKyB2YWx1ZS5sZW5ndGggPiBtYXhOYW1lVmFsdWVQYWlyU2l6ZSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvLyA2LiBUaGUgY29va2llLW5hbWUgaXMgdGhlIG5hbWUgc3RyaW5nLCBhbmQgdGhlIGNvb2tpZS12YWx1ZSBpcyB0aGVcbiAgLy8gICAgdmFsdWUgc3RyaW5nLlxuICByZXR1cm4ge1xuICAgIG5hbWUsIHZhbHVlLCAuLi5wYXJzZVVucGFyc2VkQXR0cmlidXRlcyh1bnBhcnNlZEF0dHJpYnV0ZXMpXG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIHJlbWFpbmluZyBhdHRyaWJ1dGVzIG9mIGEgc2V0LWNvb2tpZSBoZWFkZXJcbiAqIEBzZWUgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9kcmFmdC1pZXRmLWh0dHBiaXMtcmZjNjI2NWJpcyNzZWN0aW9uLTUuNFxuICogQHBhcmFtIHtzdHJpbmd9IHVucGFyc2VkQXR0cmlidXRlc1xuICogQHBhcmFtIHtbT2JqZWN0LjxzdHJpbmcsIHVua25vd24+XT17fX0gY29va2llQXR0cmlidXRlTGlzdFxuICovXG5mdW5jdGlvbiBwYXJzZVVucGFyc2VkQXR0cmlidXRlcyAodW5wYXJzZWRBdHRyaWJ1dGVzLCBjb29raWVBdHRyaWJ1dGVMaXN0ID0ge30pIHtcbiAgLy8gMS4gSWYgdGhlIHVucGFyc2VkLWF0dHJpYnV0ZXMgc3RyaW5nIGlzIGVtcHR5LCBza2lwIHRoZSByZXN0IG9mXG4gIC8vICAgIHRoZXNlIHN0ZXBzLlxuICBpZiAodW5wYXJzZWRBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBjb29raWVBdHRyaWJ1dGVMaXN0XG4gIH1cblxuICAvLyAyLiBEaXNjYXJkIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHVucGFyc2VkLWF0dHJpYnV0ZXMgKHdoaWNoXG4gIC8vICAgIHdpbGwgYmUgYSAleDNCIChcIjtcIikgY2hhcmFjdGVyKS5cbiAgYXNzZXJ0KHVucGFyc2VkQXR0cmlidXRlc1swXSA9PT0gJzsnKVxuICB1bnBhcnNlZEF0dHJpYnV0ZXMgPSB1bnBhcnNlZEF0dHJpYnV0ZXMuc2xpY2UoMSlcblxuICBsZXQgY29va2llQXYgPSAnJ1xuXG4gIC8vIDMuIElmIHRoZSByZW1haW5pbmcgdW5wYXJzZWQtYXR0cmlidXRlcyBjb250YWlucyBhICV4M0IgKFwiO1wiKVxuICAvLyAgICBjaGFyYWN0ZXI6XG4gIGlmICh1bnBhcnNlZEF0dHJpYnV0ZXMuaW5jbHVkZXMoJzsnKSkge1xuICAgIC8vIDEuIENvbnN1bWUgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHVucGFyc2VkLWF0dHJpYnV0ZXMgdXAgdG8sIGJ1dFxuICAgIC8vICAgIG5vdCBpbmNsdWRpbmcsIHRoZSBmaXJzdCAleDNCIChcIjtcIikgY2hhcmFjdGVyLlxuICAgIGNvb2tpZUF2ID0gY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50c0Zhc3QoXG4gICAgICAnOycsXG4gICAgICB1bnBhcnNlZEF0dHJpYnV0ZXMsXG4gICAgICB7IHBvc2l0aW9uOiAwIH1cbiAgICApXG4gICAgdW5wYXJzZWRBdHRyaWJ1dGVzID0gdW5wYXJzZWRBdHRyaWJ1dGVzLnNsaWNlKGNvb2tpZUF2Lmxlbmd0aClcbiAgfSBlbHNlIHtcbiAgICAvLyBPdGhlcndpc2U6XG5cbiAgICAvLyAxLiBDb25zdW1lIHRoZSByZW1haW5kZXIgb2YgdGhlIHVucGFyc2VkLWF0dHJpYnV0ZXMuXG4gICAgY29va2llQXYgPSB1bnBhcnNlZEF0dHJpYnV0ZXNcbiAgICB1bnBhcnNlZEF0dHJpYnV0ZXMgPSAnJ1xuICB9XG5cbiAgLy8gTGV0IHRoZSBjb29raWUtYXYgc3RyaW5nIGJlIHRoZSBjaGFyYWN0ZXJzIGNvbnN1bWVkIGluIHRoaXMgc3RlcC5cblxuICBsZXQgYXR0cmlidXRlTmFtZSA9ICcnXG4gIGxldCBhdHRyaWJ1dGVWYWx1ZSA9ICcnXG5cbiAgLy8gNC4gSWYgdGhlIGNvb2tpZS1hdiBzdHJpbmcgY29udGFpbnMgYSAleDNEIChcIj1cIikgY2hhcmFjdGVyOlxuICBpZiAoY29va2llQXYuaW5jbHVkZXMoJz0nKSkge1xuICAgIC8vIDEuIFRoZSAocG9zc2libHkgZW1wdHkpIGF0dHJpYnV0ZS1uYW1lIHN0cmluZyBjb25zaXN0cyBvZiB0aGVcbiAgICAvLyAgICBjaGFyYWN0ZXJzIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgdGhlIGZpcnN0ICV4M0QgKFwiPVwiKVxuICAgIC8vICAgIGNoYXJhY3RlciwgYW5kIHRoZSAocG9zc2libHkgZW1wdHkpIGF0dHJpYnV0ZS12YWx1ZSBzdHJpbmdcbiAgICAvLyAgICBjb25zaXN0cyBvZiB0aGUgY2hhcmFjdGVycyBhZnRlciB0aGUgZmlyc3QgJXgzRCAoXCI9XCIpXG4gICAgLy8gICAgY2hhcmFjdGVyLlxuICAgIGNvbnN0IHBvc2l0aW9uID0geyBwb3NpdGlvbjogMCB9XG5cbiAgICBhdHRyaWJ1dGVOYW1lID0gY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50c0Zhc3QoXG4gICAgICAnPScsXG4gICAgICBjb29raWVBdixcbiAgICAgIHBvc2l0aW9uXG4gICAgKVxuICAgIGF0dHJpYnV0ZVZhbHVlID0gY29va2llQXYuc2xpY2UocG9zaXRpb24ucG9zaXRpb24gKyAxKVxuICB9IGVsc2Uge1xuICAgIC8vIE90aGVyd2lzZTpcblxuICAgIC8vIDEuIFRoZSBhdHRyaWJ1dGUtbmFtZSBzdHJpbmcgY29uc2lzdHMgb2YgdGhlIGVudGlyZSBjb29raWUtYXZcbiAgICAvLyAgICBzdHJpbmcsIGFuZCB0aGUgYXR0cmlidXRlLXZhbHVlIHN0cmluZyBpcyBlbXB0eS5cbiAgICBhdHRyaWJ1dGVOYW1lID0gY29va2llQXZcbiAgfVxuXG4gIC8vIDUuIFJlbW92ZSBhbnkgbGVhZGluZyBvciB0cmFpbGluZyBXU1AgY2hhcmFjdGVycyBmcm9tIHRoZSBhdHRyaWJ1dGUtXG4gIC8vICAgIG5hbWUgc3RyaW5nIGFuZCB0aGUgYXR0cmlidXRlLXZhbHVlIHN0cmluZy5cbiAgYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5hbWUudHJpbSgpXG4gIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlVmFsdWUudHJpbSgpXG5cbiAgLy8gNi4gSWYgdGhlIGF0dHJpYnV0ZS12YWx1ZSBpcyBsb25nZXIgdGhhbiAxMDI0IG9jdGV0cywgaWdub3JlIHRoZVxuICAvLyAgICBjb29raWUtYXYgc3RyaW5nIGFuZCByZXR1cm4gdG8gU3RlcCAxIG9mIHRoaXMgYWxnb3JpdGhtLlxuICBpZiAoYXR0cmlidXRlVmFsdWUubGVuZ3RoID4gbWF4QXR0cmlidXRlVmFsdWVTaXplKSB7XG4gICAgcmV0dXJuIHBhcnNlVW5wYXJzZWRBdHRyaWJ1dGVzKHVucGFyc2VkQXR0cmlidXRlcywgY29va2llQXR0cmlidXRlTGlzdClcbiAgfVxuXG4gIC8vIDcuIFByb2Nlc3MgdGhlIGF0dHJpYnV0ZS1uYW1lIGFuZCBhdHRyaWJ1dGUtdmFsdWUgYWNjb3JkaW5nIHRvIHRoZVxuICAvLyAgICByZXF1aXJlbWVudHMgaW4gdGhlIGZvbGxvd2luZyBzdWJzZWN0aW9ucy4gIChOb3RpY2UgdGhhdFxuICAvLyAgICBhdHRyaWJ1dGVzIHdpdGggdW5yZWNvZ25pemVkIGF0dHJpYnV0ZS1uYW1lcyBhcmUgaWdub3JlZC4pXG4gIGNvbnN0IGF0dHJpYnV0ZU5hbWVMb3dlcmNhc2UgPSBhdHRyaWJ1dGVOYW1lLnRvTG93ZXJDYXNlKClcblxuICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1yZmM2MjY1YmlzI3NlY3Rpb24tNS40LjFcbiAgLy8gSWYgdGhlIGF0dHJpYnV0ZS1uYW1lIGNhc2UtaW5zZW5zaXRpdmVseSBtYXRjaGVzIHRoZSBzdHJpbmdcbiAgLy8gXCJFeHBpcmVzXCIsIHRoZSB1c2VyIGFnZW50IE1VU1QgcHJvY2VzcyB0aGUgY29va2llLWF2IGFzIGZvbGxvd3MuXG4gIGlmIChhdHRyaWJ1dGVOYW1lTG93ZXJjYXNlID09PSAnZXhwaXJlcycpIHtcbiAgICAvLyAxLiBMZXQgdGhlIGV4cGlyeS10aW1lIGJlIHRoZSByZXN1bHQgb2YgcGFyc2luZyB0aGUgYXR0cmlidXRlLXZhbHVlXG4gICAgLy8gICAgYXMgY29va2llLWRhdGUgKHNlZSBTZWN0aW9uIDUuMS4xKS5cbiAgICBjb25zdCBleHBpcnlUaW1lID0gbmV3IERhdGUoYXR0cmlidXRlVmFsdWUpXG5cbiAgICAvLyAyLiBJZiB0aGUgYXR0cmlidXRlLXZhbHVlIGZhaWxlZCB0byBwYXJzZSBhcyBhIGNvb2tpZSBkYXRlLCBpZ25vcmVcbiAgICAvLyAgICB0aGUgY29va2llLWF2LlxuXG4gICAgY29va2llQXR0cmlidXRlTGlzdC5leHBpcmVzID0gZXhwaXJ5VGltZVxuICB9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWVMb3dlcmNhc2UgPT09ICdtYXgtYWdlJykge1xuICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtaWV0Zi1odHRwYmlzLXJmYzYyNjViaXMjc2VjdGlvbi01LjQuMlxuICAgIC8vIElmIHRoZSBhdHRyaWJ1dGUtbmFtZSBjYXNlLWluc2Vuc2l0aXZlbHkgbWF0Y2hlcyB0aGUgc3RyaW5nIFwiTWF4LVxuICAgIC8vIEFnZVwiLCB0aGUgdXNlciBhZ2VudCBNVVNUIHByb2Nlc3MgdGhlIGNvb2tpZS1hdiBhcyBmb2xsb3dzLlxuXG4gICAgLy8gMS4gSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgYXR0cmlidXRlLXZhbHVlIGlzIG5vdCBhIERJR0lUIG9yIGFcbiAgICAvLyAgICBcIi1cIiBjaGFyYWN0ZXIsIGlnbm9yZSB0aGUgY29va2llLWF2LlxuICAgIGNvbnN0IGNoYXJDb2RlID0gYXR0cmlidXRlVmFsdWUuY2hhckNvZGVBdCgwKVxuXG4gICAgaWYgKChjaGFyQ29kZSA8IDQ4IHx8IGNoYXJDb2RlID4gNTcpICYmIGF0dHJpYnV0ZVZhbHVlWzBdICE9PSAnLScpIHtcbiAgICAgIHJldHVybiBwYXJzZVVucGFyc2VkQXR0cmlidXRlcyh1bnBhcnNlZEF0dHJpYnV0ZXMsIGNvb2tpZUF0dHJpYnV0ZUxpc3QpXG4gICAgfVxuXG4gICAgLy8gMi4gSWYgdGhlIHJlbWFpbmRlciBvZiBhdHRyaWJ1dGUtdmFsdWUgY29udGFpbnMgYSBub24tRElHSVRcbiAgICAvLyAgICBjaGFyYWN0ZXIsIGlnbm9yZSB0aGUgY29va2llLWF2LlxuICAgIGlmICghL15cXGQrJC8udGVzdChhdHRyaWJ1dGVWYWx1ZSkpIHtcbiAgICAgIHJldHVybiBwYXJzZVVucGFyc2VkQXR0cmlidXRlcyh1bnBhcnNlZEF0dHJpYnV0ZXMsIGNvb2tpZUF0dHJpYnV0ZUxpc3QpXG4gICAgfVxuXG4gICAgLy8gMy4gTGV0IGRlbHRhLXNlY29uZHMgYmUgdGhlIGF0dHJpYnV0ZS12YWx1ZSBjb252ZXJ0ZWQgdG8gYW4gaW50ZWdlci5cbiAgICBjb25zdCBkZWx0YVNlY29uZHMgPSBOdW1iZXIoYXR0cmlidXRlVmFsdWUpXG5cbiAgICAvLyA0LiBMZXQgY29va2llLWFnZS1saW1pdCBiZSB0aGUgbWF4aW11bSBhZ2Ugb2YgdGhlIGNvb2tpZSAod2hpY2hcbiAgICAvLyAgICBTSE9VTEQgYmUgNDAwIGRheXMgb3IgbGVzcywgc2VlIFNlY3Rpb24gNC4xLjIuMikuXG5cbiAgICAvLyA1LiBTZXQgZGVsdGEtc2Vjb25kcyB0byB0aGUgc21hbGxlciBvZiBpdHMgcHJlc2VudCB2YWx1ZSBhbmQgY29va2llLVxuICAgIC8vICAgIGFnZS1saW1pdC5cbiAgICAvLyBkZWx0YVNlY29uZHMgPSBNYXRoLm1pbihkZWx0YVNlY29uZHMgKiAxMDAwLCBtYXhFeHBpcmVzTXMpXG5cbiAgICAvLyA2LiBJZiBkZWx0YS1zZWNvbmRzIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB6ZXJvICgwKSwgbGV0IGV4cGlyeS1cbiAgICAvLyAgICB0aW1lIGJlIHRoZSBlYXJsaWVzdCByZXByZXNlbnRhYmxlIGRhdGUgYW5kIHRpbWUuICBPdGhlcndpc2UsIGxldFxuICAgIC8vICAgIHRoZSBleHBpcnktdGltZSBiZSB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lIHBsdXMgZGVsdGEtc2Vjb25kc1xuICAgIC8vICAgIHNlY29uZHMuXG4gICAgLy8gY29uc3QgZXhwaXJ5VGltZSA9IGRlbHRhU2Vjb25kcyA8PSAwID8gRGF0ZS5ub3coKSA6IERhdGUubm93KCkgKyBkZWx0YVNlY29uZHNcblxuICAgIC8vIDcuIEFwcGVuZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIGNvb2tpZS1hdHRyaWJ1dGUtbGlzdCB3aXRoIGFuXG4gICAgLy8gICAgYXR0cmlidXRlLW5hbWUgb2YgTWF4LUFnZSBhbmQgYW4gYXR0cmlidXRlLXZhbHVlIG9mIGV4cGlyeS10aW1lLlxuICAgIGNvb2tpZUF0dHJpYnV0ZUxpc3QubWF4QWdlID0gZGVsdGFTZWNvbmRzXG4gIH0gZWxzZSBpZiAoYXR0cmlidXRlTmFtZUxvd2VyY2FzZSA9PT0gJ2RvbWFpbicpIHtcbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1yZmM2MjY1YmlzI3NlY3Rpb24tNS40LjNcbiAgICAvLyBJZiB0aGUgYXR0cmlidXRlLW5hbWUgY2FzZS1pbnNlbnNpdGl2ZWx5IG1hdGNoZXMgdGhlIHN0cmluZyBcIkRvbWFpblwiLFxuICAgIC8vIHRoZSB1c2VyIGFnZW50IE1VU1QgcHJvY2VzcyB0aGUgY29va2llLWF2IGFzIGZvbGxvd3MuXG5cbiAgICAvLyAxLiBMZXQgY29va2llLWRvbWFpbiBiZSB0aGUgYXR0cmlidXRlLXZhbHVlLlxuICAgIGxldCBjb29raWVEb21haW4gPSBhdHRyaWJ1dGVWYWx1ZVxuXG4gICAgLy8gMi4gSWYgY29va2llLWRvbWFpbiBzdGFydHMgd2l0aCAleDJFIChcIi5cIiksIGxldCBjb29raWUtZG9tYWluIGJlXG4gICAgLy8gICAgY29va2llLWRvbWFpbiB3aXRob3V0IGl0cyBsZWFkaW5nICV4MkUgKFwiLlwiKS5cbiAgICBpZiAoY29va2llRG9tYWluWzBdID09PSAnLicpIHtcbiAgICAgIGNvb2tpZURvbWFpbiA9IGNvb2tpZURvbWFpbi5zbGljZSgxKVxuICAgIH1cblxuICAgIC8vIDMuIENvbnZlcnQgdGhlIGNvb2tpZS1kb21haW4gdG8gbG93ZXIgY2FzZS5cbiAgICBjb29raWVEb21haW4gPSBjb29raWVEb21haW4udG9Mb3dlckNhc2UoKVxuXG4gICAgLy8gNC4gQXBwZW5kIGFuIGF0dHJpYnV0ZSB0byB0aGUgY29va2llLWF0dHJpYnV0ZS1saXN0IHdpdGggYW5cbiAgICAvLyAgICBhdHRyaWJ1dGUtbmFtZSBvZiBEb21haW4gYW5kIGFuIGF0dHJpYnV0ZS12YWx1ZSBvZiBjb29raWUtZG9tYWluLlxuICAgIGNvb2tpZUF0dHJpYnV0ZUxpc3QuZG9tYWluID0gY29va2llRG9tYWluXG4gIH0gZWxzZSBpZiAoYXR0cmlidXRlTmFtZUxvd2VyY2FzZSA9PT0gJ3BhdGgnKSB7XG4gICAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9kcmFmdC1pZXRmLWh0dHBiaXMtcmZjNjI2NWJpcyNzZWN0aW9uLTUuNC40XG4gICAgLy8gSWYgdGhlIGF0dHJpYnV0ZS1uYW1lIGNhc2UtaW5zZW5zaXRpdmVseSBtYXRjaGVzIHRoZSBzdHJpbmcgXCJQYXRoXCIsXG4gICAgLy8gdGhlIHVzZXIgYWdlbnQgTVVTVCBwcm9jZXNzIHRoZSBjb29raWUtYXYgYXMgZm9sbG93cy5cblxuICAgIC8vIDEuIElmIHRoZSBhdHRyaWJ1dGUtdmFsdWUgaXMgZW1wdHkgb3IgaWYgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGVcbiAgICAvLyAgICBhdHRyaWJ1dGUtdmFsdWUgaXMgbm90ICV4MkYgKFwiL1wiKTpcbiAgICBsZXQgY29va2llUGF0aCA9ICcnXG4gICAgaWYgKGF0dHJpYnV0ZVZhbHVlLmxlbmd0aCA9PT0gMCB8fCBhdHRyaWJ1dGVWYWx1ZVswXSAhPT0gJy8nKSB7XG4gICAgICAvLyAxLiBMZXQgY29va2llLXBhdGggYmUgdGhlIGRlZmF1bHQtcGF0aC5cbiAgICAgIGNvb2tpZVBhdGggPSAnLydcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3RoZXJ3aXNlOlxuXG4gICAgICAvLyAxLiBMZXQgY29va2llLXBhdGggYmUgdGhlIGF0dHJpYnV0ZS12YWx1ZS5cbiAgICAgIGNvb2tpZVBhdGggPSBhdHRyaWJ1dGVWYWx1ZVxuICAgIH1cblxuICAgIC8vIDIuIEFwcGVuZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIGNvb2tpZS1hdHRyaWJ1dGUtbGlzdCB3aXRoIGFuXG4gICAgLy8gICAgYXR0cmlidXRlLW5hbWUgb2YgUGF0aCBhbmQgYW4gYXR0cmlidXRlLXZhbHVlIG9mIGNvb2tpZS1wYXRoLlxuICAgIGNvb2tpZUF0dHJpYnV0ZUxpc3QucGF0aCA9IGNvb2tpZVBhdGhcbiAgfSBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lTG93ZXJjYXNlID09PSAnc2VjdXJlJykge1xuICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtaWV0Zi1odHRwYmlzLXJmYzYyNjViaXMjc2VjdGlvbi01LjQuNVxuICAgIC8vIElmIHRoZSBhdHRyaWJ1dGUtbmFtZSBjYXNlLWluc2Vuc2l0aXZlbHkgbWF0Y2hlcyB0aGUgc3RyaW5nIFwiU2VjdXJlXCIsXG4gICAgLy8gdGhlIHVzZXIgYWdlbnQgTVVTVCBhcHBlbmQgYW4gYXR0cmlidXRlIHRvIHRoZSBjb29raWUtYXR0cmlidXRlLWxpc3RcbiAgICAvLyB3aXRoIGFuIGF0dHJpYnV0ZS1uYW1lIG9mIFNlY3VyZSBhbmQgYW4gZW1wdHkgYXR0cmlidXRlLXZhbHVlLlxuXG4gICAgY29va2llQXR0cmlidXRlTGlzdC5zZWN1cmUgPSB0cnVlXG4gIH0gZWxzZSBpZiAoYXR0cmlidXRlTmFtZUxvd2VyY2FzZSA9PT0gJ2h0dHBvbmx5Jykge1xuICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtaWV0Zi1odHRwYmlzLXJmYzYyNjViaXMjc2VjdGlvbi01LjQuNlxuICAgIC8vIElmIHRoZSBhdHRyaWJ1dGUtbmFtZSBjYXNlLWluc2Vuc2l0aXZlbHkgbWF0Y2hlcyB0aGUgc3RyaW5nXG4gICAgLy8gXCJIdHRwT25seVwiLCB0aGUgdXNlciBhZ2VudCBNVVNUIGFwcGVuZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIGNvb2tpZS1cbiAgICAvLyBhdHRyaWJ1dGUtbGlzdCB3aXRoIGFuIGF0dHJpYnV0ZS1uYW1lIG9mIEh0dHBPbmx5IGFuZCBhbiBlbXB0eVxuICAgIC8vIGF0dHJpYnV0ZS12YWx1ZS5cblxuICAgIGNvb2tpZUF0dHJpYnV0ZUxpc3QuaHR0cE9ubHkgPSB0cnVlXG4gIH0gZWxzZSBpZiAoYXR0cmlidXRlTmFtZUxvd2VyY2FzZSA9PT0gJ3NhbWVzaXRlJykge1xuICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtaWV0Zi1odHRwYmlzLXJmYzYyNjViaXMjc2VjdGlvbi01LjQuN1xuICAgIC8vIElmIHRoZSBhdHRyaWJ1dGUtbmFtZSBjYXNlLWluc2Vuc2l0aXZlbHkgbWF0Y2hlcyB0aGUgc3RyaW5nXG4gICAgLy8gXCJTYW1lU2l0ZVwiLCB0aGUgdXNlciBhZ2VudCBNVVNUIHByb2Nlc3MgdGhlIGNvb2tpZS1hdiBhcyBmb2xsb3dzOlxuXG4gICAgLy8gMS4gTGV0IGVuZm9yY2VtZW50IGJlIFwiRGVmYXVsdFwiLlxuICAgIGxldCBlbmZvcmNlbWVudCA9ICdEZWZhdWx0J1xuXG4gICAgY29uc3QgYXR0cmlidXRlVmFsdWVMb3dlcmNhc2UgPSBhdHRyaWJ1dGVWYWx1ZS50b0xvd2VyQ2FzZSgpXG4gICAgLy8gMi4gSWYgY29va2llLWF2J3MgYXR0cmlidXRlLXZhbHVlIGlzIGEgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBmb3JcbiAgICAvLyAgICBcIk5vbmVcIiwgc2V0IGVuZm9yY2VtZW50IHRvIFwiTm9uZVwiLlxuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZUxvd2VyY2FzZS5pbmNsdWRlcygnbm9uZScpKSB7XG4gICAgICBlbmZvcmNlbWVudCA9ICdOb25lJ1xuICAgIH1cblxuICAgIC8vIDMuIElmIGNvb2tpZS1hdidzIGF0dHJpYnV0ZS12YWx1ZSBpcyBhIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2ggZm9yXG4gICAgLy8gICAgXCJTdHJpY3RcIiwgc2V0IGVuZm9yY2VtZW50IHRvIFwiU3RyaWN0XCIuXG4gICAgaWYgKGF0dHJpYnV0ZVZhbHVlTG93ZXJjYXNlLmluY2x1ZGVzKCdzdHJpY3QnKSkge1xuICAgICAgZW5mb3JjZW1lbnQgPSAnU3RyaWN0J1xuICAgIH1cblxuICAgIC8vIDQuIElmIGNvb2tpZS1hdidzIGF0dHJpYnV0ZS12YWx1ZSBpcyBhIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2ggZm9yXG4gICAgLy8gICAgXCJMYXhcIiwgc2V0IGVuZm9yY2VtZW50IHRvIFwiTGF4XCIuXG4gICAgaWYgKGF0dHJpYnV0ZVZhbHVlTG93ZXJjYXNlLmluY2x1ZGVzKCdsYXgnKSkge1xuICAgICAgZW5mb3JjZW1lbnQgPSAnTGF4J1xuICAgIH1cblxuICAgIC8vIDUuIEFwcGVuZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIGNvb2tpZS1hdHRyaWJ1dGUtbGlzdCB3aXRoIGFuXG4gICAgLy8gICAgYXR0cmlidXRlLW5hbWUgb2YgXCJTYW1lU2l0ZVwiIGFuZCBhbiBhdHRyaWJ1dGUtdmFsdWUgb2ZcbiAgICAvLyAgICBlbmZvcmNlbWVudC5cbiAgICBjb29raWVBdHRyaWJ1dGVMaXN0LnNhbWVTaXRlID0gZW5mb3JjZW1lbnRcbiAgfSBlbHNlIHtcbiAgICBjb29raWVBdHRyaWJ1dGVMaXN0LnVucGFyc2VkID8/PSBbXVxuXG4gICAgY29va2llQXR0cmlidXRlTGlzdC51bnBhcnNlZC5wdXNoKGAke2F0dHJpYnV0ZU5hbWV9PSR7YXR0cmlidXRlVmFsdWV9YClcbiAgfVxuXG4gIC8vIDguIFJldHVybiB0byBTdGVwIDEgb2YgdGhpcyBhbGdvcml0aG0uXG4gIHJldHVybiBwYXJzZVVucGFyc2VkQXR0cmlidXRlcyh1bnBhcnNlZEF0dHJpYnV0ZXMsIGNvb2tpZUF0dHJpYnV0ZUxpc3QpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBwYXJzZVNldENvb2tpZSxcbiAgcGFyc2VVbnBhcnNlZEF0dHJpYnV0ZXNcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IHBhcnNlU2V0Q29va2llIH0gPSByZXF1aXJlKCcuL3BhcnNlJylcbmNvbnN0IHsgc3RyaW5naWZ5IH0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3dlYmlkbCcpXG5jb25zdCB7IEhlYWRlcnMgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL2hlYWRlcnMnKVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENvb2tpZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2YWx1ZVxuICogQHByb3BlcnR5IHtEYXRlfG51bWJlcnx1bmRlZmluZWR9IGV4cGlyZXNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfHVuZGVmaW5lZH0gbWF4QWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ3x1bmRlZmluZWR9IGRvbWFpblxuICogQHByb3BlcnR5IHtzdHJpbmd8dW5kZWZpbmVkfSBwYXRoXG4gKiBAcHJvcGVydHkge2Jvb2xlYW58dW5kZWZpbmVkfSBzZWN1cmVcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbnx1bmRlZmluZWR9IGh0dHBPbmx5XG4gKiBAcHJvcGVydHkgeydTdHJpY3QnfCdMYXgnfCdOb25lJ30gc2FtZVNpdGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IHVucGFyc2VkXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge0hlYWRlcnN9IGhlYWRlcnNcbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fVxuICovXG5mdW5jdGlvbiBnZXRDb29raWVzIChoZWFkZXJzKSB7XG4gIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdnZXRDb29raWVzJyB9KVxuXG4gIHdlYmlkbC5icmFuZENoZWNrKGhlYWRlcnMsIEhlYWRlcnMsIHsgc3RyaWN0OiBmYWxzZSB9KVxuXG4gIGNvbnN0IGNvb2tpZSA9IGhlYWRlcnMuZ2V0KCdjb29raWUnKVxuICBjb25zdCBvdXQgPSB7fVxuXG4gIGlmICghY29va2llKSB7XG4gICAgcmV0dXJuIG91dFxuICB9XG5cbiAgZm9yIChjb25zdCBwaWVjZSBvZiBjb29raWUuc3BsaXQoJzsnKSkge1xuICAgIGNvbnN0IFtuYW1lLCAuLi52YWx1ZV0gPSBwaWVjZS5zcGxpdCgnPScpXG5cbiAgICBvdXRbbmFtZS50cmltKCldID0gdmFsdWUuam9pbignPScpXG4gIH1cblxuICByZXR1cm4gb3V0XG59XG5cbi8qKlxuICogQHBhcmFtIHtIZWFkZXJzfSBoZWFkZXJzXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHt7IHBhdGg/OiBzdHJpbmcsIGRvbWFpbj86IHN0cmluZyB9fHVuZGVmaW5lZH0gYXR0cmlidXRlc1xuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZUNvb2tpZSAoaGVhZGVycywgbmFtZSwgYXR0cmlidXRlcykge1xuICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDIsIHsgaGVhZGVyOiAnZGVsZXRlQ29va2llJyB9KVxuXG4gIHdlYmlkbC5icmFuZENoZWNrKGhlYWRlcnMsIEhlYWRlcnMsIHsgc3RyaWN0OiBmYWxzZSB9KVxuXG4gIG5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcobmFtZSlcbiAgYXR0cmlidXRlcyA9IHdlYmlkbC5jb252ZXJ0ZXJzLkRlbGV0ZUNvb2tpZUF0dHJpYnV0ZXMoYXR0cmlidXRlcylcblxuICAvLyBNYXRjaGVzIGJlaGF2aW9yIG9mXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kZW5vbGFuZC9kZW5vX3N0ZC9ibG9iLzYzODI3YjE2MzMwYjgyNDg5YTA0NjE0MDI3YzMzYjc5MDRlMDhiZTUvaHR0cC9jb29raWUudHMjTDI3OFxuICBzZXRDb29raWUoaGVhZGVycywge1xuICAgIG5hbWUsXG4gICAgdmFsdWU6ICcnLFxuICAgIGV4cGlyZXM6IG5ldyBEYXRlKDApLFxuICAgIC4uLmF0dHJpYnV0ZXNcbiAgfSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0hlYWRlcnN9IGhlYWRlcnNcbiAqIEByZXR1cm5zIHtDb29raWVbXX1cbiAqL1xuZnVuY3Rpb24gZ2V0U2V0Q29va2llcyAoaGVhZGVycykge1xuICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnZ2V0U2V0Q29va2llcycgfSlcblxuICB3ZWJpZGwuYnJhbmRDaGVjayhoZWFkZXJzLCBIZWFkZXJzLCB7IHN0cmljdDogZmFsc2UgfSlcblxuICBjb25zdCBjb29raWVzID0gaGVhZGVycy5nZXRTZXRDb29raWUoKVxuXG4gIGlmICghY29va2llcykge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgcmV0dXJuIGNvb2tpZXMubWFwKChwYWlyKSA9PiBwYXJzZVNldENvb2tpZShwYWlyKSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0hlYWRlcnN9IGhlYWRlcnNcbiAqIEBwYXJhbSB7Q29va2llfSBjb29raWVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBzZXRDb29raWUgKGhlYWRlcnMsIGNvb2tpZSkge1xuICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDIsIHsgaGVhZGVyOiAnc2V0Q29va2llJyB9KVxuXG4gIHdlYmlkbC5icmFuZENoZWNrKGhlYWRlcnMsIEhlYWRlcnMsIHsgc3RyaWN0OiBmYWxzZSB9KVxuXG4gIGNvb2tpZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkNvb2tpZShjb29raWUpXG5cbiAgY29uc3Qgc3RyID0gc3RyaW5naWZ5KGNvb2tpZSlcblxuICBpZiAoc3RyKSB7XG4gICAgaGVhZGVycy5hcHBlbmQoJ1NldC1Db29raWUnLCBzdHJpbmdpZnkoY29va2llKSlcbiAgfVxufVxuXG53ZWJpZGwuY29udmVydGVycy5EZWxldGVDb29raWVBdHRyaWJ1dGVzID0gd2ViaWRsLmRpY3Rpb25hcnlDb252ZXJ0ZXIoW1xuICB7XG4gICAgY29udmVydGVyOiB3ZWJpZGwubnVsbGFibGVDb252ZXJ0ZXIod2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKSxcbiAgICBrZXk6ICdwYXRoJyxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGxcbiAgfSxcbiAge1xuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyksXG4gICAga2V5OiAnZG9tYWluJyxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGxcbiAgfVxuXSlcblxud2ViaWRsLmNvbnZlcnRlcnMuQ29va2llID0gd2ViaWRsLmRpY3Rpb25hcnlDb252ZXJ0ZXIoW1xuICB7XG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAga2V5OiAnbmFtZSdcbiAgfSxcbiAge1xuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nLFxuICAgIGtleTogJ3ZhbHVlJ1xuICB9LFxuICB7XG4gICAgY29udmVydGVyOiB3ZWJpZGwubnVsbGFibGVDb252ZXJ0ZXIoKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIGxvbmcgbG9uZyddKHZhbHVlKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpXG4gICAgfSksXG4gICAga2V5OiAnZXhwaXJlcycsXG4gICAgZGVmYXVsdFZhbHVlOiBudWxsXG4gIH0sXG4gIHtcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5udWxsYWJsZUNvbnZlcnRlcih3ZWJpZGwuY29udmVydGVyc1snbG9uZyBsb25nJ10pLFxuICAgIGtleTogJ21heEFnZScsXG4gICAgZGVmYXVsdFZhbHVlOiBudWxsXG4gIH0sXG4gIHtcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5udWxsYWJsZUNvbnZlcnRlcih3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcpLFxuICAgIGtleTogJ2RvbWFpbicsXG4gICAgZGVmYXVsdFZhbHVlOiBudWxsXG4gIH0sXG4gIHtcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5udWxsYWJsZUNvbnZlcnRlcih3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcpLFxuICAgIGtleTogJ3BhdGgnLFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbFxuICB9LFxuICB7XG4gICAgY29udmVydGVyOiB3ZWJpZGwubnVsbGFibGVDb252ZXJ0ZXIod2ViaWRsLmNvbnZlcnRlcnMuYm9vbGVhbiksXG4gICAga2V5OiAnc2VjdXJlJyxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGxcbiAgfSxcbiAge1xuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4pLFxuICAgIGtleTogJ2h0dHBPbmx5JyxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGxcbiAgfSxcbiAge1xuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nLFxuICAgIGtleTogJ3NhbWVTaXRlJyxcbiAgICBhbGxvd2VkVmFsdWVzOiBbJ1N0cmljdCcsICdMYXgnLCAnTm9uZSddXG4gIH0sXG4gIHtcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5zZXF1ZW5jZUNvbnZlcnRlcih3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcpLFxuICAgIGtleTogJ3VucGFyc2VkJyxcbiAgICBkZWZhdWx0VmFsdWU6IFtdXG4gIH1cbl0pXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRDb29raWVzLFxuICBkZWxldGVDb29raWUsXG4gIGdldFNldENvb2tpZXMsXG4gIHNldENvb2tpZVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbi8vIFRoaXMgaXMgYSBHbG9iYWxseSBVbmlxdWUgSWRlbnRpZmllciB1bmlxdWUgdXNlZFxuLy8gdG8gdmFsaWRhdGUgdGhhdCB0aGUgZW5kcG9pbnQgYWNjZXB0cyB3ZWJzb2NrZXRcbi8vIGNvbm5lY3Rpb25zLlxuLy8gU2VlIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM2NDU1Lmh0bWwjc2VjdGlvbi0xLjNcbmNvbnN0IHVpZCA9ICcyNThFQUZBNS1FOTE0LTQ3REEtOTVDQS1DNUFCMERDODVCMTEnXG5cbi8qKiBAdHlwZSB7UHJvcGVydHlEZXNjcmlwdG9yfSAqL1xuY29uc3Qgc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyA9IHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IGZhbHNlLFxuICBjb25maWd1cmFibGU6IGZhbHNlXG59XG5cbmNvbnN0IHN0YXRlcyA9IHtcbiAgQ09OTkVDVElORzogMCxcbiAgT1BFTjogMSxcbiAgQ0xPU0lORzogMixcbiAgQ0xPU0VEOiAzXG59XG5cbmNvbnN0IG9wY29kZXMgPSB7XG4gIENPTlRJTlVBVElPTjogMHgwLFxuICBURVhUOiAweDEsXG4gIEJJTkFSWTogMHgyLFxuICBDTE9TRTogMHg4LFxuICBQSU5HOiAweDksXG4gIFBPTkc6IDB4QVxufVxuXG5jb25zdCBtYXhVbnNpZ25lZDE2Qml0ID0gMiAqKiAxNiAtIDEgLy8gNjU1MzVcblxuY29uc3QgcGFyc2VyU3RhdGVzID0ge1xuICBJTkZPOiAwLFxuICBQQVlMT0FETEVOR1RIXzE2OiAyLFxuICBQQVlMT0FETEVOR1RIXzY0OiAzLFxuICBSRUFEX0RBVEE6IDRcbn1cblxuY29uc3QgZW1wdHlCdWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUoMClcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHVpZCxcbiAgc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgc3RhdGVzLFxuICBvcGNvZGVzLFxuICBtYXhVbnNpZ25lZDE2Qml0LFxuICBwYXJzZXJTdGF0ZXMsXG4gIGVtcHR5QnVmZmVyXG59XG4iLCIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGtXZWJTb2NrZXRVUkw6IFN5bWJvbCgndXJsJyksXG4gIGtSZWFkeVN0YXRlOiBTeW1ib2woJ3JlYWR5IHN0YXRlJyksXG4gIGtDb250cm9sbGVyOiBTeW1ib2woJ2NvbnRyb2xsZXInKSxcbiAga1Jlc3BvbnNlOiBTeW1ib2woJ3Jlc3BvbnNlJyksXG4gIGtCaW5hcnlUeXBlOiBTeW1ib2woJ2JpbmFyeSB0eXBlJyksXG4gIGtTZW50Q2xvc2U6IFN5bWJvbCgnc2VudCBjbG9zZScpLFxuICBrUmVjZWl2ZWRDbG9zZTogU3ltYm9sKCdyZWNlaXZlZCBjbG9zZScpLFxuICBrQnl0ZVBhcnNlcjogU3ltYm9sKCdieXRlIHBhcnNlcicpXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3dlYmlkbCcpXG5jb25zdCB7IGtFbnVtZXJhYmxlUHJvcGVydHkgfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5jb25zdCB7IE1lc3NhZ2VQb3J0IH0gPSByZXF1aXJlKCd3b3JrZXJfdGhyZWFkcycpXG5cbi8qKlxuICogQHNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9jb21tcy5odG1sI21lc3NhZ2VldmVudFxuICovXG5jbGFzcyBNZXNzYWdlRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICNldmVudEluaXRcblxuICBjb25zdHJ1Y3RvciAodHlwZSwgZXZlbnRJbml0RGljdCA9IHt9KSB7XG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ01lc3NhZ2VFdmVudCBjb25zdHJ1Y3RvcicgfSlcblxuICAgIHR5cGUgPSB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcodHlwZSlcbiAgICBldmVudEluaXREaWN0ID0gd2ViaWRsLmNvbnZlcnRlcnMuTWVzc2FnZUV2ZW50SW5pdChldmVudEluaXREaWN0KVxuXG4gICAgc3VwZXIodHlwZSwgZXZlbnRJbml0RGljdClcblxuICAgIHRoaXMuI2V2ZW50SW5pdCA9IGV2ZW50SW5pdERpY3RcbiAgfVxuXG4gIGdldCBkYXRhICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBNZXNzYWdlRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRJbml0LmRhdGFcbiAgfVxuXG4gIGdldCBvcmlnaW4gKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIE1lc3NhZ2VFdmVudClcblxuICAgIHJldHVybiB0aGlzLiNldmVudEluaXQub3JpZ2luXG4gIH1cblxuICBnZXQgbGFzdEV2ZW50SWQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIE1lc3NhZ2VFdmVudClcblxuICAgIHJldHVybiB0aGlzLiNldmVudEluaXQubGFzdEV2ZW50SWRcbiAgfVxuXG4gIGdldCBzb3VyY2UgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIE1lc3NhZ2VFdmVudClcblxuICAgIHJldHVybiB0aGlzLiNldmVudEluaXQuc291cmNlXG4gIH1cblxuICBnZXQgcG9ydHMgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIE1lc3NhZ2VFdmVudClcblxuICAgIGlmICghT2JqZWN0LmlzRnJvemVuKHRoaXMuI2V2ZW50SW5pdC5wb3J0cykpIHtcbiAgICAgIE9iamVjdC5mcmVlemUodGhpcy4jZXZlbnRJbml0LnBvcnRzKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLiNldmVudEluaXQucG9ydHNcbiAgfVxuXG4gIGluaXRNZXNzYWdlRXZlbnQgKFxuICAgIHR5cGUsXG4gICAgYnViYmxlcyA9IGZhbHNlLFxuICAgIGNhbmNlbGFibGUgPSBmYWxzZSxcbiAgICBkYXRhID0gbnVsbCxcbiAgICBvcmlnaW4gPSAnJyxcbiAgICBsYXN0RXZlbnRJZCA9ICcnLFxuICAgIHNvdXJjZSA9IG51bGwsXG4gICAgcG9ydHMgPSBbXVxuICApIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBNZXNzYWdlRXZlbnQpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnTWVzc2FnZUV2ZW50LmluaXRNZXNzYWdlRXZlbnQnIH0pXG5cbiAgICByZXR1cm4gbmV3IE1lc3NhZ2VFdmVudCh0eXBlLCB7XG4gICAgICBidWJibGVzLCBjYW5jZWxhYmxlLCBkYXRhLCBvcmlnaW4sIGxhc3RFdmVudElkLCBzb3VyY2UsIHBvcnRzXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93ZWJzb2NrZXRzLnNwZWMud2hhdHdnLm9yZy8jdGhlLWNsb3NlZXZlbnQtaW50ZXJmYWNlXG4gKi9cbmNsYXNzIENsb3NlRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICNldmVudEluaXRcblxuICBjb25zdHJ1Y3RvciAodHlwZSwgZXZlbnRJbml0RGljdCA9IHt9KSB7XG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0Nsb3NlRXZlbnQgY29uc3RydWN0b3InIH0pXG5cbiAgICB0eXBlID0gd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKHR5cGUpXG4gICAgZXZlbnRJbml0RGljdCA9IHdlYmlkbC5jb252ZXJ0ZXJzLkNsb3NlRXZlbnRJbml0KGV2ZW50SW5pdERpY3QpXG5cbiAgICBzdXBlcih0eXBlLCBldmVudEluaXREaWN0KVxuXG4gICAgdGhpcy4jZXZlbnRJbml0ID0gZXZlbnRJbml0RGljdFxuICB9XG5cbiAgZ2V0IHdhc0NsZWFuICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBDbG9zZUV2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC53YXNDbGVhblxuICB9XG5cbiAgZ2V0IGNvZGUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIENsb3NlRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRJbml0LmNvZGVcbiAgfVxuXG4gIGdldCByZWFzb24gKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIENsb3NlRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRJbml0LnJlYXNvblxuICB9XG59XG5cbi8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3dlYmFwcGFwaXMuaHRtbCN0aGUtZXJyb3JldmVudC1pbnRlcmZhY2VcbmNsYXNzIEVycm9yRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICNldmVudEluaXRcblxuICBjb25zdHJ1Y3RvciAodHlwZSwgZXZlbnRJbml0RGljdCkge1xuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdFcnJvckV2ZW50IGNvbnN0cnVjdG9yJyB9KVxuXG4gICAgc3VwZXIodHlwZSwgZXZlbnRJbml0RGljdClcblxuICAgIHR5cGUgPSB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcodHlwZSlcbiAgICBldmVudEluaXREaWN0ID0gd2ViaWRsLmNvbnZlcnRlcnMuRXJyb3JFdmVudEluaXQoZXZlbnRJbml0RGljdCA/PyB7fSlcblxuICAgIHRoaXMuI2V2ZW50SW5pdCA9IGV2ZW50SW5pdERpY3RcbiAgfVxuXG4gIGdldCBtZXNzYWdlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBFcnJvckV2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5tZXNzYWdlXG4gIH1cblxuICBnZXQgZmlsZW5hbWUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEVycm9yRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRJbml0LmZpbGVuYW1lXG4gIH1cblxuICBnZXQgbGluZW5vICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBFcnJvckV2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5saW5lbm9cbiAgfVxuXG4gIGdldCBjb2xubyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRXJyb3JFdmVudClcblxuICAgIHJldHVybiB0aGlzLiNldmVudEluaXQuY29sbm9cbiAgfVxuXG4gIGdldCBlcnJvciAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRXJyb3JFdmVudClcblxuICAgIHJldHVybiB0aGlzLiNldmVudEluaXQuZXJyb3JcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhNZXNzYWdlRXZlbnQucHJvdG90eXBlLCB7XG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7XG4gICAgdmFsdWU6ICdNZXNzYWdlRXZlbnQnLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9LFxuICBkYXRhOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvcmlnaW46IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGxhc3RFdmVudElkOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBzb3VyY2U6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHBvcnRzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBpbml0TWVzc2FnZUV2ZW50OiBrRW51bWVyYWJsZVByb3BlcnR5XG59KVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhDbG9zZUV2ZW50LnByb3RvdHlwZSwge1xuICBbU3ltYm9sLnRvU3RyaW5nVGFnXToge1xuICAgIHZhbHVlOiAnQ2xvc2VFdmVudCcsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0sXG4gIHJlYXNvbjoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgY29kZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgd2FzQ2xlYW46IGtFbnVtZXJhYmxlUHJvcGVydHlcbn0pXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEVycm9yRXZlbnQucHJvdG90eXBlLCB7XG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7XG4gICAgdmFsdWU6ICdFcnJvckV2ZW50JyxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSxcbiAgbWVzc2FnZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgZmlsZW5hbWU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGxpbmVubzoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgY29sbm86IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGVycm9yOiBrRW51bWVyYWJsZVByb3BlcnR5XG59KVxuXG53ZWJpZGwuY29udmVydGVycy5NZXNzYWdlUG9ydCA9IHdlYmlkbC5pbnRlcmZhY2VDb252ZXJ0ZXIoTWVzc2FnZVBvcnQpXG5cbndlYmlkbC5jb252ZXJ0ZXJzWydzZXF1ZW5jZTxNZXNzYWdlUG9ydD4nXSA9IHdlYmlkbC5zZXF1ZW5jZUNvbnZlcnRlcihcbiAgd2ViaWRsLmNvbnZlcnRlcnMuTWVzc2FnZVBvcnRcbilcblxuY29uc3QgZXZlbnRJbml0ID0gW1xuICB7XG4gICAga2V5OiAnYnViYmxlcycsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ib29sZWFuLFxuICAgIGRlZmF1bHRWYWx1ZTogZmFsc2VcbiAgfSxcbiAge1xuICAgIGtleTogJ2NhbmNlbGFibGUnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYm9vbGVhbixcbiAgICBkZWZhdWx0VmFsdWU6IGZhbHNlXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdjb21wb3NlZCcsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ib29sZWFuLFxuICAgIGRlZmF1bHRWYWx1ZTogZmFsc2VcbiAgfVxuXVxuXG53ZWJpZGwuY29udmVydGVycy5NZXNzYWdlRXZlbnRJbml0ID0gd2ViaWRsLmRpY3Rpb25hcnlDb252ZXJ0ZXIoW1xuICAuLi5ldmVudEluaXQsXG4gIHtcbiAgICBrZXk6ICdkYXRhJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmFueSxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGxcbiAgfSxcbiAge1xuICAgIGtleTogJ29yaWdpbicsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiAnJ1xuICB9LFxuICB7XG4gICAga2V5OiAnbGFzdEV2ZW50SWQnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZTogJydcbiAgfSxcbiAge1xuICAgIGtleTogJ3NvdXJjZScsXG4gICAgLy8gTm9kZSBkb2Vzbid0IGltcGxlbWVudCBXaW5kb3dQcm94eSBvciBTZXJ2aWNlV29ya2VyLCBzbyB0aGUgb25seVxuICAgIC8vIHZhbGlkIHZhbHVlIGZvciBzb3VyY2UgaXMgYSBNZXNzYWdlUG9ydC5cbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5udWxsYWJsZUNvbnZlcnRlcih3ZWJpZGwuY29udmVydGVycy5NZXNzYWdlUG9ydCksXG4gICAgZGVmYXVsdFZhbHVlOiBudWxsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdwb3J0cycsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVyc1snc2VxdWVuY2U8TWVzc2FnZVBvcnQ+J10sXG4gICAgZ2V0IGRlZmF1bHRWYWx1ZSAoKSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gIH1cbl0pXG5cbndlYmlkbC5jb252ZXJ0ZXJzLkNsb3NlRXZlbnRJbml0ID0gd2ViaWRsLmRpY3Rpb25hcnlDb252ZXJ0ZXIoW1xuICAuLi5ldmVudEluaXQsXG4gIHtcbiAgICBrZXk6ICd3YXNDbGVhbicsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ib29sZWFuLFxuICAgIGRlZmF1bHRWYWx1ZTogZmFsc2VcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvZGUnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIHNob3J0J10sXG4gICAgZGVmYXVsdFZhbHVlOiAwXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdyZWFzb24nLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZTogJydcbiAgfVxuXSlcblxud2ViaWRsLmNvbnZlcnRlcnMuRXJyb3JFdmVudEluaXQgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIC4uLmV2ZW50SW5pdCxcbiAge1xuICAgIGtleTogJ21lc3NhZ2UnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZTogJydcbiAgfSxcbiAge1xuICAgIGtleTogJ2ZpbGVuYW1lJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6ICcnXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdsaW5lbm8nLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIGxvbmcnXSxcbiAgICBkZWZhdWx0VmFsdWU6IDBcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbG5vJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzWyd1bnNpZ25lZCBsb25nJ10sXG4gICAgZGVmYXVsdFZhbHVlOiAwXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdlcnJvcicsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5hbnlcbiAgfVxuXSlcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIE1lc3NhZ2VFdmVudCxcbiAgQ2xvc2VFdmVudCxcbiAgRXJyb3JFdmVudFxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsga1JlYWR5U3RhdGUsIGtDb250cm9sbGVyLCBrUmVzcG9uc2UsIGtCaW5hcnlUeXBlLCBrV2ViU29ja2V0VVJMIH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgeyBzdGF0ZXMsIG9wY29kZXMgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IHsgTWVzc2FnZUV2ZW50LCBFcnJvckV2ZW50IH0gPSByZXF1aXJlKCcuL2V2ZW50cycpXG5cbi8qIGdsb2JhbHMgQmxvYiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL3dlYnNvY2tldCcpLldlYlNvY2tldH0gd3NcbiAqL1xuZnVuY3Rpb24gaXNFc3RhYmxpc2hlZCAod3MpIHtcbiAgLy8gSWYgdGhlIHNlcnZlcidzIHJlc3BvbnNlIGlzIHZhbGlkYXRlZCBhcyBwcm92aWRlZCBmb3IgYWJvdmUsIGl0IGlzXG4gIC8vIHNhaWQgdGhhdCBfVGhlIFdlYlNvY2tldCBDb25uZWN0aW9uIGlzIEVzdGFibGlzaGVkXyBhbmQgdGhhdCB0aGVcbiAgLy8gV2ViU29ja2V0IENvbm5lY3Rpb24gaXMgaW4gdGhlIE9QRU4gc3RhdGUuXG4gIHJldHVybiB3c1trUmVhZHlTdGF0ZV0gPT09IHN0YXRlcy5PUEVOXG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vd2Vic29ja2V0JykuV2ViU29ja2V0fSB3c1xuICovXG5mdW5jdGlvbiBpc0Nsb3NpbmcgKHdzKSB7XG4gIC8vIFVwb24gZWl0aGVyIHNlbmRpbmcgb3IgcmVjZWl2aW5nIGEgQ2xvc2UgY29udHJvbCBmcmFtZSwgaXQgaXMgc2FpZFxuICAvLyB0aGF0IF9UaGUgV2ViU29ja2V0IENsb3NpbmcgSGFuZHNoYWtlIGlzIFN0YXJ0ZWRfIGFuZCB0aGF0IHRoZVxuICAvLyBXZWJTb2NrZXQgY29ubmVjdGlvbiBpcyBpbiB0aGUgQ0xPU0lORyBzdGF0ZS5cbiAgcmV0dXJuIHdzW2tSZWFkeVN0YXRlXSA9PT0gc3RhdGVzLkNMT1NJTkdcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi93ZWJzb2NrZXQnKS5XZWJTb2NrZXR9IHdzXG4gKi9cbmZ1bmN0aW9uIGlzQ2xvc2VkICh3cykge1xuICByZXR1cm4gd3Nba1JlYWR5U3RhdGVdID09PSBzdGF0ZXMuQ0xPU0VEXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtZXZlbnQtZmlyZVxuICogQHBhcmFtIHtzdHJpbmd9IGVcbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IHRhcmdldFxuICogQHBhcmFtIHtFdmVudEluaXQgfCB1bmRlZmluZWR9IGV2ZW50SW5pdERpY3RcbiAqL1xuZnVuY3Rpb24gZmlyZUV2ZW50IChlLCB0YXJnZXQsIGV2ZW50Q29uc3RydWN0b3IgPSBFdmVudCwgZXZlbnRJbml0RGljdCkge1xuICAvLyAxLiBJZiBldmVudENvbnN0cnVjdG9yIGlzIG5vdCBnaXZlbiwgdGhlbiBsZXQgZXZlbnRDb25zdHJ1Y3RvciBiZSBFdmVudC5cblxuICAvLyAyLiBMZXQgZXZlbnQgYmUgdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhbiBldmVudCBnaXZlbiBldmVudENvbnN0cnVjdG9yLFxuICAvLyAgICBpbiB0aGUgcmVsZXZhbnQgcmVhbG0gb2YgdGFyZ2V0LlxuICAvLyAzLiBJbml0aWFsaXplIGV2ZW504oCZcyB0eXBlIGF0dHJpYnV0ZSB0byBlLlxuICBjb25zdCBldmVudCA9IG5ldyBldmVudENvbnN0cnVjdG9yKGUsIGV2ZW50SW5pdERpY3QpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcFxuXG4gIC8vIDQuIEluaXRpYWxpemUgYW55IG90aGVyIElETCBhdHRyaWJ1dGVzIG9mIGV2ZW50IGFzIGRlc2NyaWJlZCBpbiB0aGVcbiAgLy8gICAgaW52b2NhdGlvbiBvZiB0aGlzIGFsZ29yaXRobS5cblxuICAvLyA1LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBkaXNwYXRjaGluZyBldmVudCBhdCB0YXJnZXQsIHdpdGggbGVnYWN5IHRhcmdldFxuICAvLyAgICBvdmVycmlkZSBmbGFnIHNldCBpZiBzZXQuXG4gIHRhcmdldC5kaXNwYXRjaEV2ZW50KGV2ZW50KVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93ZWJzb2NrZXRzLnNwZWMud2hhdHdnLm9yZy8jZmVlZGJhY2stZnJvbS10aGUtcHJvdG9jb2xcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL3dlYnNvY2tldCcpLldlYlNvY2tldH0gd3NcbiAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlIE9wY29kZVxuICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgYXBwbGljYXRpb24gZGF0YVxuICovXG5mdW5jdGlvbiB3ZWJzb2NrZXRNZXNzYWdlUmVjZWl2ZWQgKHdzLCB0eXBlLCBkYXRhKSB7XG4gIC8vIDEuIElmIHJlYWR5IHN0YXRlIGlzIG5vdCBPUEVOICgxKSwgdGhlbiByZXR1cm4uXG4gIGlmICh3c1trUmVhZHlTdGF0ZV0gIT09IHN0YXRlcy5PUEVOKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyAyLiBMZXQgZGF0YUZvckV2ZW50IGJlIGRldGVybWluZWQgYnkgc3dpdGNoaW5nIG9uIHR5cGUgYW5kIGJpbmFyeSB0eXBlOlxuICBsZXQgZGF0YUZvckV2ZW50XG5cbiAgaWYgKHR5cGUgPT09IG9wY29kZXMuVEVYVCkge1xuICAgIC8vIC0+IHR5cGUgaW5kaWNhdGVzIHRoYXQgdGhlIGRhdGEgaXMgVGV4dFxuICAgIC8vICAgICAgYSBuZXcgRE9NU3RyaW5nIGNvbnRhaW5pbmcgZGF0YVxuICAgIHRyeSB7XG4gICAgICBkYXRhRm9yRXZlbnQgPSBuZXcgVGV4dERlY29kZXIoJ3V0Zi04JywgeyBmYXRhbDogdHJ1ZSB9KS5kZWNvZGUoZGF0YSlcbiAgICB9IGNhdGNoIHtcbiAgICAgIGZhaWxXZWJzb2NrZXRDb25uZWN0aW9uKHdzLCAnUmVjZWl2ZWQgaW52YWxpZCBVVEYtOCBpbiB0ZXh0IGZyYW1lLicpXG4gICAgICByZXR1cm5cbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gb3Bjb2Rlcy5CSU5BUlkpIHtcbiAgICBpZiAod3Nba0JpbmFyeVR5cGVdID09PSAnYmxvYicpIHtcbiAgICAgIC8vIC0+IHR5cGUgaW5kaWNhdGVzIHRoYXQgdGhlIGRhdGEgaXMgQmluYXJ5IGFuZCBiaW5hcnkgdHlwZSBpcyBcImJsb2JcIlxuICAgICAgLy8gICAgICBhIG5ldyBCbG9iIG9iamVjdCwgY3JlYXRlZCBpbiB0aGUgcmVsZXZhbnQgUmVhbG0gb2YgdGhlIFdlYlNvY2tldFxuICAgICAgLy8gICAgICBvYmplY3QsIHRoYXQgcmVwcmVzZW50cyBkYXRhIGFzIGl0cyByYXcgZGF0YVxuICAgICAgZGF0YUZvckV2ZW50ID0gbmV3IEJsb2IoW2RhdGFdKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyAtPiB0eXBlIGluZGljYXRlcyB0aGF0IHRoZSBkYXRhIGlzIEJpbmFyeSBhbmQgYmluYXJ5IHR5cGUgaXMgXCJhcnJheWJ1ZmZlclwiXG4gICAgICAvLyAgICAgIGEgbmV3IEFycmF5QnVmZmVyIG9iamVjdCwgY3JlYXRlZCBpbiB0aGUgcmVsZXZhbnQgUmVhbG0gb2YgdGhlXG4gICAgICAvLyAgICAgIFdlYlNvY2tldCBvYmplY3QsIHdob3NlIGNvbnRlbnRzIGFyZSBkYXRhXG4gICAgICBkYXRhRm9yRXZlbnQgPSBuZXcgVWludDhBcnJheShkYXRhKS5idWZmZXJcbiAgICB9XG4gIH1cblxuICAvLyAzLiBGaXJlIGFuIGV2ZW50IG5hbWVkIG1lc3NhZ2UgYXQgdGhlIFdlYlNvY2tldCBvYmplY3QsIHVzaW5nIE1lc3NhZ2VFdmVudCxcbiAgLy8gICAgd2l0aCB0aGUgb3JpZ2luIGF0dHJpYnV0ZSBpbml0aWFsaXplZCB0byB0aGUgc2VyaWFsaXphdGlvbiBvZiB0aGUgV2ViU29ja2V0XG4gIC8vICAgIG9iamVjdOKAmXMgdXJsJ3Mgb3JpZ2luLCBhbmQgdGhlIGRhdGEgYXR0cmlidXRlIGluaXRpYWxpemVkIHRvIGRhdGFGb3JFdmVudC5cbiAgZmlyZUV2ZW50KCdtZXNzYWdlJywgd3MsIE1lc3NhZ2VFdmVudCwge1xuICAgIG9yaWdpbjogd3Nba1dlYlNvY2tldFVSTF0ub3JpZ2luLFxuICAgIGRhdGE6IGRhdGFGb3JFdmVudFxuICB9KVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM2NDU1XG4gKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMjYxNlxuICogQHNlZSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zOTg0MDdcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm90b2NvbFxuICovXG5mdW5jdGlvbiBpc1ZhbGlkU3VicHJvdG9jb2wgKHByb3RvY29sKSB7XG4gIC8vIElmIHByZXNlbnQsIHRoaXMgdmFsdWUgaW5kaWNhdGVzIG9uZVxuICAvLyBvciBtb3JlIGNvbW1hLXNlcGFyYXRlZCBzdWJwcm90b2NvbCB0aGUgY2xpZW50IHdpc2hlcyB0byBzcGVhayxcbiAgLy8gb3JkZXJlZCBieSBwcmVmZXJlbmNlLiAgVGhlIGVsZW1lbnRzIHRoYXQgY29tcHJpc2UgdGhpcyB2YWx1ZVxuICAvLyBNVVNUIGJlIG5vbi1lbXB0eSBzdHJpbmdzIHdpdGggY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgVSswMDIxIHRvXG4gIC8vIFUrMDA3RSBub3QgaW5jbHVkaW5nIHNlcGFyYXRvciBjaGFyYWN0ZXJzIGFzIGRlZmluZWQgaW5cbiAgLy8gW1JGQzI2MTZdIGFuZCBNVVNUIGFsbCBiZSB1bmlxdWUgc3RyaW5ncy5cbiAgaWYgKHByb3RvY29sLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZm9yIChjb25zdCBjaGFyIG9mIHByb3RvY29sKSB7XG4gICAgY29uc3QgY29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKVxuXG4gICAgaWYgKFxuICAgICAgY29kZSA8IDB4MjEgfHxcbiAgICAgIGNvZGUgPiAweDdFIHx8XG4gICAgICBjaGFyID09PSAnKCcgfHxcbiAgICAgIGNoYXIgPT09ICcpJyB8fFxuICAgICAgY2hhciA9PT0gJzwnIHx8XG4gICAgICBjaGFyID09PSAnPicgfHxcbiAgICAgIGNoYXIgPT09ICdAJyB8fFxuICAgICAgY2hhciA9PT0gJywnIHx8XG4gICAgICBjaGFyID09PSAnOycgfHxcbiAgICAgIGNoYXIgPT09ICc6JyB8fFxuICAgICAgY2hhciA9PT0gJ1xcXFwnIHx8XG4gICAgICBjaGFyID09PSAnXCInIHx8XG4gICAgICBjaGFyID09PSAnLycgfHxcbiAgICAgIGNoYXIgPT09ICdbJyB8fFxuICAgICAgY2hhciA9PT0gJ10nIHx8XG4gICAgICBjaGFyID09PSAnPycgfHxcbiAgICAgIGNoYXIgPT09ICc9JyB8fFxuICAgICAgY2hhciA9PT0gJ3snIHx8XG4gICAgICBjaGFyID09PSAnfScgfHxcbiAgICAgIGNvZGUgPT09IDMyIHx8IC8vIFNQXG4gICAgICBjb2RlID09PSA5IC8vIEhUXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM2NDU1I3NlY3Rpb24tNy00XG4gKiBAcGFyYW0ge251bWJlcn0gY29kZVxuICovXG5mdW5jdGlvbiBpc1ZhbGlkU3RhdHVzQ29kZSAoY29kZSkge1xuICBpZiAoY29kZSA+PSAxMDAwICYmIGNvZGUgPCAxMDE1KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNvZGUgIT09IDEwMDQgJiYgLy8gcmVzZXJ2ZWRcbiAgICAgIGNvZGUgIT09IDEwMDUgJiYgLy8gXCJNVVNUIE5PVCBiZSBzZXQgYXMgYSBzdGF0dXMgY29kZVwiXG4gICAgICBjb2RlICE9PSAxMDA2IC8vIFwiTVVTVCBOT1QgYmUgc2V0IGFzIGEgc3RhdHVzIGNvZGVcIlxuICAgIClcbiAgfVxuXG4gIHJldHVybiBjb2RlID49IDMwMDAgJiYgY29kZSA8PSA0OTk5XG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vd2Vic29ja2V0JykuV2ViU29ja2V0fSB3c1xuICogQHBhcmFtIHtzdHJpbmd8dW5kZWZpbmVkfSByZWFzb25cbiAqL1xuZnVuY3Rpb24gZmFpbFdlYnNvY2tldENvbm5lY3Rpb24gKHdzLCByZWFzb24pIHtcbiAgY29uc3QgeyBba0NvbnRyb2xsZXJdOiBjb250cm9sbGVyLCBba1Jlc3BvbnNlXTogcmVzcG9uc2UgfSA9IHdzXG5cbiAgY29udHJvbGxlci5hYm9ydCgpXG5cbiAgaWYgKHJlc3BvbnNlPy5zb2NrZXQgJiYgIXJlc3BvbnNlLnNvY2tldC5kZXN0cm95ZWQpIHtcbiAgICByZXNwb25zZS5zb2NrZXQuZGVzdHJveSgpXG4gIH1cblxuICBpZiAocmVhc29uKSB7XG4gICAgZmlyZUV2ZW50KCdlcnJvcicsIHdzLCBFcnJvckV2ZW50LCB7XG4gICAgICBlcnJvcjogbmV3IEVycm9yKHJlYXNvbilcbiAgICB9KVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc0VzdGFibGlzaGVkLFxuICBpc0Nsb3NpbmcsXG4gIGlzQ2xvc2VkLFxuICBmaXJlRXZlbnQsXG4gIGlzVmFsaWRTdWJwcm90b2NvbCxcbiAgaXNWYWxpZFN0YXR1c0NvZGUsXG4gIGZhaWxXZWJzb2NrZXRDb25uZWN0aW9uLFxuICB3ZWJzb2NrZXRNZXNzYWdlUmVjZWl2ZWRcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBkaWFnbm9zdGljc0NoYW5uZWwgPSByZXF1aXJlKCdkaWFnbm9zdGljc19jaGFubmVsJylcbmNvbnN0IHsgdWlkLCBzdGF0ZXMgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IHtcbiAga1JlYWR5U3RhdGUsXG4gIGtTZW50Q2xvc2UsXG4gIGtCeXRlUGFyc2VyLFxuICBrUmVjZWl2ZWRDbG9zZVxufSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IGZpcmVFdmVudCwgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24gfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IENsb3NlRXZlbnQgfSA9IHJlcXVpcmUoJy4vZXZlbnRzJylcbmNvbnN0IHsgbWFrZVJlcXVlc3QgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3JlcXVlc3QnKVxuY29uc3QgeyBmZXRjaGluZyB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvaW5kZXgnKVxuY29uc3QgeyBIZWFkZXJzIH0gPSByZXF1aXJlKCcuLi9mZXRjaC9oZWFkZXJzJylcbmNvbnN0IHsgZ2V0R2xvYmFsRGlzcGF0Y2hlciB9ID0gcmVxdWlyZSgnLi4vZ2xvYmFsJylcbmNvbnN0IHsga0hlYWRlcnNMaXN0IH0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuXG5jb25zdCBjaGFubmVscyA9IHt9XG5jaGFubmVscy5vcGVuID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTp3ZWJzb2NrZXQ6b3BlbicpXG5jaGFubmVscy5jbG9zZSA9IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6d2Vic29ja2V0OmNsb3NlJylcbmNoYW5uZWxzLnNvY2tldEVycm9yID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTp3ZWJzb2NrZXQ6c29ja2V0X2Vycm9yJylcblxuLyoqIEB0eXBlIHtpbXBvcnQoJ2NyeXB0bycpfSAqL1xubGV0IGNyeXB0b1xudHJ5IHtcbiAgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJylcbn0gY2F0Y2gge1xuXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3dlYnNvY2tldHMuc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LXdlYnNvY2tldC1lc3RhYmxpc2hcbiAqIEBwYXJhbSB7VVJMfSB1cmxcbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBwcm90b2NvbHNcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL3dlYnNvY2tldCcpLldlYlNvY2tldH0gd3NcbiAqIEBwYXJhbSB7KHJlc3BvbnNlOiBhbnkpID0+IHZvaWR9IG9uRXN0YWJsaXNoXG4gKiBAcGFyYW0ge1BhcnRpYWw8aW1wb3J0KCcuLi8uLi90eXBlcy93ZWJzb2NrZXQnKS5XZWJTb2NrZXRJbml0Pn0gb3B0aW9uc1xuICovXG5mdW5jdGlvbiBlc3RhYmxpc2hXZWJTb2NrZXRDb25uZWN0aW9uICh1cmwsIHByb3RvY29scywgd3MsIG9uRXN0YWJsaXNoLCBvcHRpb25zKSB7XG4gIC8vIDEuIExldCByZXF1ZXN0VVJMIGJlIGEgY29weSBvZiB1cmwsIHdpdGggaXRzIHNjaGVtZSBzZXQgdG8gXCJodHRwXCIsIGlmIHVybOKAmXNcbiAgLy8gICAgc2NoZW1lIGlzIFwid3NcIiwgYW5kIHRvIFwiaHR0cHNcIiBvdGhlcndpc2UuXG4gIGNvbnN0IHJlcXVlc3RVUkwgPSB1cmxcblxuICByZXF1ZXN0VVJMLnByb3RvY29sID0gdXJsLnByb3RvY29sID09PSAnd3M6JyA/ICdodHRwOicgOiAnaHR0cHM6J1xuXG4gIC8vIDIuIExldCByZXF1ZXN0IGJlIGEgbmV3IHJlcXVlc3QsIHdob3NlIFVSTCBpcyByZXF1ZXN0VVJMLCBjbGllbnQgaXMgY2xpZW50LFxuICAvLyAgICBzZXJ2aWNlLXdvcmtlcnMgbW9kZSBpcyBcIm5vbmVcIiwgcmVmZXJyZXIgaXMgXCJuby1yZWZlcnJlclwiLCBtb2RlIGlzXG4gIC8vICAgIFwid2Vic29ja2V0XCIsIGNyZWRlbnRpYWxzIG1vZGUgaXMgXCJpbmNsdWRlXCIsIGNhY2hlIG1vZGUgaXMgXCJuby1zdG9yZVwiICxcbiAgLy8gICAgYW5kIHJlZGlyZWN0IG1vZGUgaXMgXCJlcnJvclwiLlxuICBjb25zdCByZXF1ZXN0ID0gbWFrZVJlcXVlc3Qoe1xuICAgIHVybExpc3Q6IFtyZXF1ZXN0VVJMXSxcbiAgICBzZXJ2aWNlV29ya2VyczogJ25vbmUnLFxuICAgIHJlZmVycmVyOiAnbm8tcmVmZXJyZXInLFxuICAgIG1vZGU6ICd3ZWJzb2NrZXQnLFxuICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgY2FjaGU6ICduby1zdG9yZScsXG4gICAgcmVkaXJlY3Q6ICdlcnJvcidcbiAgfSlcblxuICAvLyBOb3RlOiB1bmRpY2kgZXh0ZW5zaW9uLCBhbGxvdyBzZXR0aW5nIGN1c3RvbSBoZWFkZXJzLlxuICBpZiAob3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgY29uc3QgaGVhZGVyc0xpc3QgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpW2tIZWFkZXJzTGlzdF1cblxuICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QgPSBoZWFkZXJzTGlzdFxuICB9XG5cbiAgLy8gMy4gQXBwZW5kIChgVXBncmFkZWAsIGB3ZWJzb2NrZXRgKSB0byByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgLy8gNC4gQXBwZW5kIChgQ29ubmVjdGlvbmAsIGBVcGdyYWRlYCkgdG8gcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gIC8vIE5vdGU6IGJvdGggb2YgdGhlc2UgYXJlIGhhbmRsZWQgYnkgdW5kaWNpIGN1cnJlbnRseS5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvYmxvYi82OGMyNjljNDE0NGM0NDZmM2YxMjIwOTUxMzM4ZGFlZjRhNmI1ZWM0L2xpYi9jbGllbnQuanMjTDEzOTdcblxuICAvLyA1LiBMZXQga2V5VmFsdWUgYmUgYSBub25jZSBjb25zaXN0aW5nIG9mIGEgcmFuZG9tbHkgc2VsZWN0ZWRcbiAgLy8gICAgMTYtYnl0ZSB2YWx1ZSB0aGF0IGhhcyBiZWVuIGZvcmdpdmluZy1iYXNlNjQtZW5jb2RlZCBhbmRcbiAgLy8gICAgaXNvbW9ycGhpYyBlbmNvZGVkLlxuICBjb25zdCBrZXlWYWx1ZSA9IGNyeXB0by5yYW5kb21CeXRlcygxNikudG9TdHJpbmcoJ2Jhc2U2NCcpXG5cbiAgLy8gNi4gQXBwZW5kIChgU2VjLVdlYlNvY2tldC1LZXlgLCBrZXlWYWx1ZSkgdG8gcmVxdWVzdOKAmXNcbiAgLy8gICAgaGVhZGVyIGxpc3QuXG4gIHJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdzZWMtd2Vic29ja2V0LWtleScsIGtleVZhbHVlKVxuXG4gIC8vIDcuIEFwcGVuZCAoYFNlYy1XZWJTb2NrZXQtVmVyc2lvbmAsIGAxM2ApIHRvIHJlcXVlc3TigJlzXG4gIC8vICAgIGhlYWRlciBsaXN0LlxuICByZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgnc2VjLXdlYnNvY2tldC12ZXJzaW9uJywgJzEzJylcblxuICAvLyA4LiBGb3IgZWFjaCBwcm90b2NvbCBpbiBwcm90b2NvbHMsIGNvbWJpbmVcbiAgLy8gICAgKGBTZWMtV2ViU29ja2V0LVByb3RvY29sYCwgcHJvdG9jb2wpIGluIHJlcXVlc3TigJlzIGhlYWRlclxuICAvLyAgICBsaXN0LlxuICBmb3IgKGNvbnN0IHByb3RvY29sIG9mIHByb3RvY29scykge1xuICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdzZWMtd2Vic29ja2V0LXByb3RvY29sJywgcHJvdG9jb2wpXG4gIH1cblxuICAvLyA5LiBMZXQgcGVybWVzc2FnZURlZmxhdGUgYmUgYSB1c2VyLWFnZW50IGRlZmluZWRcbiAgLy8gICAgXCJwZXJtZXNzYWdlLWRlZmxhdGVcIiBleHRlbnNpb24gaGVhZGVyIHZhbHVlLlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9nZWNrby1kZXYvYmxvYi9jZTc4MjM0ZjVlNjUzYTVkMzkxNjgxM2ZmOTkwZjA1MzUxMDIyN2JjL25ldHdlcmsvcHJvdG9jb2wvd2Vic29ja2V0L1dlYlNvY2tldENoYW5uZWwuY3BwI0wyNjczXG4gIC8vIFRPRE86IGVuYWJsZSBvbmNlIHBlcm1lc3NhZ2UtZGVmbGF0ZSBpcyBzdXBwb3J0ZWRcbiAgY29uc3QgcGVybWVzc2FnZURlZmxhdGUgPSAnJyAvLyAncGVybWVzc2FnZS1kZWZsYXRlOyAxNSdcblxuICAvLyAxMC4gQXBwZW5kIChgU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zYCwgcGVybWVzc2FnZURlZmxhdGUpIHRvXG4gIC8vICAgICByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgLy8gcmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ3NlYy13ZWJzb2NrZXQtZXh0ZW5zaW9ucycsIHBlcm1lc3NhZ2VEZWZsYXRlKVxuXG4gIC8vIDExLiBGZXRjaCByZXF1ZXN0IHdpdGggdXNlUGFyYWxsZWxRdWV1ZSBzZXQgdG8gdHJ1ZSwgYW5kXG4gIC8vICAgICBwcm9jZXNzUmVzcG9uc2UgZ2l2ZW4gcmVzcG9uc2UgYmVpbmcgdGhlc2Ugc3RlcHM6XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBmZXRjaGluZyh7XG4gICAgcmVxdWVzdCxcbiAgICB1c2VQYXJhbGxlbFF1ZXVlOiB0cnVlLFxuICAgIGRpc3BhdGNoZXI6IG9wdGlvbnMuZGlzcGF0Y2hlciA/PyBnZXRHbG9iYWxEaXNwYXRjaGVyKCksXG4gICAgcHJvY2Vzc1Jlc3BvbnNlIChyZXNwb25zZSkge1xuICAgICAgLy8gMS4gSWYgcmVzcG9uc2UgaXMgYSBuZXR3b3JrIGVycm9yIG9yIGl0cyBzdGF0dXMgaXMgbm90IDEwMSxcbiAgICAgIC8vICAgIGZhaWwgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uLlxuICAgICAgaWYgKHJlc3BvbnNlLnR5cGUgPT09ICdlcnJvcicgfHwgcmVzcG9uc2Uuc3RhdHVzICE9PSAxMDEpIHtcbiAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24od3MsICdSZWNlaXZlZCBuZXR3b3JrIGVycm9yIG9yIG5vbi0xMDEgc3RhdHVzIGNvZGUuJylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIElmIHByb3RvY29scyBpcyBub3QgdGhlIGVtcHR5IGxpc3QgYW5kIGV4dHJhY3RpbmcgaGVhZGVyXG4gICAgICAvLyAgICBsaXN0IHZhbHVlcyBnaXZlbiBgU2VjLVdlYlNvY2tldC1Qcm90b2NvbGAgYW5kIHJlc3BvbnNl4oCZc1xuICAgICAgLy8gICAgaGVhZGVyIGxpc3QgcmVzdWx0cyBpbiBudWxsLCBmYWlsdXJlLCBvciB0aGUgZW1wdHkgYnl0ZVxuICAgICAgLy8gICAgc2VxdWVuY2UsIHRoZW4gZmFpbCB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gICAgICBpZiAocHJvdG9jb2xzLmxlbmd0aCAhPT0gMCAmJiAhcmVzcG9uc2UuaGVhZGVyc0xpc3QuZ2V0KCdTZWMtV2ViU29ja2V0LVByb3RvY29sJykpIHtcbiAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24od3MsICdTZXJ2ZXIgZGlkIG5vdCByZXNwb25kIHdpdGggc2VudCBwcm90b2NvbHMuJylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIEZvbGxvdyB0aGUgcmVxdWlyZW1lbnRzIHN0YXRlZCBzdGVwIDIgdG8gc3RlcCA2LCBpbmNsdXNpdmUsXG4gICAgICAvLyAgICBvZiB0aGUgbGFzdCBzZXQgb2Ygc3RlcHMgaW4gc2VjdGlvbiA0LjEgb2YgVGhlIFdlYlNvY2tldFxuICAgICAgLy8gICAgUHJvdG9jb2wgdG8gdmFsaWRhdGUgcmVzcG9uc2UuIFRoaXMgZWl0aGVyIHJlc3VsdHMgaW4gZmFpbFxuICAgICAgLy8gICAgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIG9yIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBpc1xuICAgICAgLy8gICAgZXN0YWJsaXNoZWQuXG5cbiAgICAgIC8vIDIuIElmIHRoZSByZXNwb25zZSBsYWNrcyBhbiB8VXBncmFkZXwgaGVhZGVyIGZpZWxkIG9yIHRoZSB8VXBncmFkZXxcbiAgICAgIC8vICAgIGhlYWRlciBmaWVsZCBjb250YWlucyBhIHZhbHVlIHRoYXQgaXMgbm90IGFuIEFTQ0lJIGNhc2UtXG4gICAgICAvLyAgICBpbnNlbnNpdGl2ZSBtYXRjaCBmb3IgdGhlIHZhbHVlIFwid2Vic29ja2V0XCIsIHRoZSBjbGllbnQgTVVTVFxuICAgICAgLy8gICAgX0ZhaWwgdGhlIFdlYlNvY2tldCBDb25uZWN0aW9uXy5cbiAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzTGlzdC5nZXQoJ1VwZ3JhZGUnKT8udG9Mb3dlckNhc2UoKSAhPT0gJ3dlYnNvY2tldCcpIHtcbiAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24od3MsICdTZXJ2ZXIgZGlkIG5vdCBzZXQgVXBncmFkZSBoZWFkZXIgdG8gXCJ3ZWJzb2NrZXRcIi4nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gMy4gSWYgdGhlIHJlc3BvbnNlIGxhY2tzIGEgfENvbm5lY3Rpb258IGhlYWRlciBmaWVsZCBvciB0aGVcbiAgICAgIC8vICAgIHxDb25uZWN0aW9ufCBoZWFkZXIgZmllbGQgZG9lc24ndCBjb250YWluIGEgdG9rZW4gdGhhdCBpcyBhblxuICAgICAgLy8gICAgQVNDSUkgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBmb3IgdGhlIHZhbHVlIFwiVXBncmFkZVwiLCB0aGUgY2xpZW50XG4gICAgICAvLyAgICBNVVNUIF9GYWlsIHRoZSBXZWJTb2NrZXQgQ29ubmVjdGlvbl8uXG4gICAgICBpZiAocmVzcG9uc2UuaGVhZGVyc0xpc3QuZ2V0KCdDb25uZWN0aW9uJyk/LnRvTG93ZXJDYXNlKCkgIT09ICd1cGdyYWRlJykge1xuICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih3cywgJ1NlcnZlciBkaWQgbm90IHNldCBDb25uZWN0aW9uIGhlYWRlciB0byBcInVwZ3JhZGVcIi4nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gNC4gSWYgdGhlIHJlc3BvbnNlIGxhY2tzIGEgfFNlYy1XZWJTb2NrZXQtQWNjZXB0fCBoZWFkZXIgZmllbGQgb3JcbiAgICAgIC8vICAgIHRoZSB8U2VjLVdlYlNvY2tldC1BY2NlcHR8IGNvbnRhaW5zIGEgdmFsdWUgb3RoZXIgdGhhbiB0aGVcbiAgICAgIC8vICAgIGJhc2U2NC1lbmNvZGVkIFNIQS0xIG9mIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSB8U2VjLVdlYlNvY2tldC1cbiAgICAgIC8vICAgIEtleXwgKGFzIGEgc3RyaW5nLCBub3QgYmFzZTY0LWRlY29kZWQpIHdpdGggdGhlIHN0cmluZyBcIjI1OEVBRkE1LVxuICAgICAgLy8gICAgRTkxNC00N0RBLTk1Q0EtQzVBQjBEQzg1QjExXCIgYnV0IGlnbm9yaW5nIGFueSBsZWFkaW5nIGFuZFxuICAgICAgLy8gICAgdHJhaWxpbmcgd2hpdGVzcGFjZSwgdGhlIGNsaWVudCBNVVNUIF9GYWlsIHRoZSBXZWJTb2NrZXRcbiAgICAgIC8vICAgIENvbm5lY3Rpb25fLlxuICAgICAgY29uc3Qgc2VjV1NBY2NlcHQgPSByZXNwb25zZS5oZWFkZXJzTGlzdC5nZXQoJ1NlYy1XZWJTb2NrZXQtQWNjZXB0JylcbiAgICAgIGNvbnN0IGRpZ2VzdCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGExJykudXBkYXRlKGtleVZhbHVlICsgdWlkKS5kaWdlc3QoJ2Jhc2U2NCcpXG4gICAgICBpZiAoc2VjV1NBY2NlcHQgIT09IGRpZ2VzdCkge1xuICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih3cywgJ0luY29ycmVjdCBoYXNoIHJlY2VpdmVkIGluIFNlYy1XZWJTb2NrZXQtQWNjZXB0IGhlYWRlci4nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gNS4gSWYgdGhlIHJlc3BvbnNlIGluY2x1ZGVzIGEgfFNlYy1XZWJTb2NrZXQtRXh0ZW5zaW9uc3wgaGVhZGVyXG4gICAgICAvLyAgICBmaWVsZCBhbmQgdGhpcyBoZWFkZXIgZmllbGQgaW5kaWNhdGVzIHRoZSB1c2Ugb2YgYW4gZXh0ZW5zaW9uXG4gICAgICAvLyAgICB0aGF0IHdhcyBub3QgcHJlc2VudCBpbiB0aGUgY2xpZW50J3MgaGFuZHNoYWtlICh0aGUgc2VydmVyIGhhc1xuICAgICAgLy8gICAgaW5kaWNhdGVkIGFuIGV4dGVuc2lvbiBub3QgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQpLCB0aGUgY2xpZW50XG4gICAgICAvLyAgICBNVVNUIF9GYWlsIHRoZSBXZWJTb2NrZXQgQ29ubmVjdGlvbl8uICAoVGhlIHBhcnNpbmcgb2YgdGhpc1xuICAgICAgLy8gICAgaGVhZGVyIGZpZWxkIHRvIGRldGVybWluZSB3aGljaCBleHRlbnNpb25zIGFyZSByZXF1ZXN0ZWQgaXNcbiAgICAgIC8vICAgIGRpc2N1c3NlZCBpbiBTZWN0aW9uIDkuMS4pXG4gICAgICBjb25zdCBzZWNFeHRlbnNpb24gPSByZXNwb25zZS5oZWFkZXJzTGlzdC5nZXQoJ1NlYy1XZWJTb2NrZXQtRXh0ZW5zaW9ucycpXG5cbiAgICAgIGlmIChzZWNFeHRlbnNpb24gIT09IG51bGwgJiYgc2VjRXh0ZW5zaW9uICE9PSBwZXJtZXNzYWdlRGVmbGF0ZSkge1xuICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih3cywgJ1JlY2VpdmVkIGRpZmZlcmVudCBwZXJtZXNzYWdlLWRlZmxhdGUgdGhhbiB0aGUgb25lIHNldC4nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gNi4gSWYgdGhlIHJlc3BvbnNlIGluY2x1ZGVzIGEgfFNlYy1XZWJTb2NrZXQtUHJvdG9jb2x8IGhlYWRlciBmaWVsZFxuICAgICAgLy8gICAgYW5kIHRoaXMgaGVhZGVyIGZpZWxkIGluZGljYXRlcyB0aGUgdXNlIG9mIGEgc3VicHJvdG9jb2wgdGhhdCB3YXNcbiAgICAgIC8vICAgIG5vdCBwcmVzZW50IGluIHRoZSBjbGllbnQncyBoYW5kc2hha2UgKHRoZSBzZXJ2ZXIgaGFzIGluZGljYXRlZCBhXG4gICAgICAvLyAgICBzdWJwcm90b2NvbCBub3QgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQpLCB0aGUgY2xpZW50IE1VU1QgX0ZhaWxcbiAgICAgIC8vICAgIHRoZSBXZWJTb2NrZXQgQ29ubmVjdGlvbl8uXG4gICAgICBjb25zdCBzZWNQcm90b2NvbCA9IHJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgnU2VjLVdlYlNvY2tldC1Qcm90b2NvbCcpXG5cbiAgICAgIGlmIChzZWNQcm90b2NvbCAhPT0gbnVsbCAmJiBzZWNQcm90b2NvbCAhPT0gcmVxdWVzdC5oZWFkZXJzTGlzdC5nZXQoJ1NlYy1XZWJTb2NrZXQtUHJvdG9jb2wnKSkge1xuICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih3cywgJ1Byb3RvY29sIHdhcyBub3Qgc2V0IGluIHRoZSBvcGVuaW5nIGhhbmRzaGFrZS4nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgcmVzcG9uc2Uuc29ja2V0Lm9uKCdkYXRhJywgb25Tb2NrZXREYXRhKVxuICAgICAgcmVzcG9uc2Uuc29ja2V0Lm9uKCdjbG9zZScsIG9uU29ja2V0Q2xvc2UpXG4gICAgICByZXNwb25zZS5zb2NrZXQub24oJ2Vycm9yJywgb25Tb2NrZXRFcnJvcilcblxuICAgICAgaWYgKGNoYW5uZWxzLm9wZW4uaGFzU3Vic2NyaWJlcnMpIHtcbiAgICAgICAgY2hhbm5lbHMub3Blbi5wdWJsaXNoKHtcbiAgICAgICAgICBhZGRyZXNzOiByZXNwb25zZS5zb2NrZXQuYWRkcmVzcygpLFxuICAgICAgICAgIHByb3RvY29sOiBzZWNQcm90b2NvbCxcbiAgICAgICAgICBleHRlbnNpb25zOiBzZWNFeHRlbnNpb25cbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgb25Fc3RhYmxpc2gocmVzcG9uc2UpXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBjb250cm9sbGVyXG59XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJ9IGNodW5rXG4gKi9cbmZ1bmN0aW9uIG9uU29ja2V0RGF0YSAoY2h1bmspIHtcbiAgaWYgKCF0aGlzLndzW2tCeXRlUGFyc2VyXS53cml0ZShjaHVuaykpIHtcbiAgICB0aGlzLnBhdXNlKClcbiAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93ZWJzb2NrZXRzLnNwZWMud2hhdHdnLm9yZy8jZmVlZGJhY2stZnJvbS10aGUtcHJvdG9jb2xcbiAqIEBzZWUgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM2NDU1I3NlY3Rpb24tNy4xLjRcbiAqL1xuZnVuY3Rpb24gb25Tb2NrZXRDbG9zZSAoKSB7XG4gIGNvbnN0IHsgd3MgfSA9IHRoaXNcblxuICAvLyBJZiB0aGUgVENQIGNvbm5lY3Rpb24gd2FzIGNsb3NlZCBhZnRlciB0aGVcbiAgLy8gV2ViU29ja2V0IGNsb3NpbmcgaGFuZHNoYWtlIHdhcyBjb21wbGV0ZWQsIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICAvLyBpcyBzYWlkIHRvIGhhdmUgYmVlbiBjbG9zZWQgX2NsZWFubHlfLlxuICBjb25zdCB3YXNDbGVhbiA9IHdzW2tTZW50Q2xvc2VdICYmIHdzW2tSZWNlaXZlZENsb3NlXVxuXG4gIGxldCBjb2RlID0gMTAwNVxuICBsZXQgcmVhc29uID0gJydcblxuICBjb25zdCByZXN1bHQgPSB3c1trQnl0ZVBhcnNlcl0uY2xvc2luZ0luZm9cblxuICBpZiAocmVzdWx0KSB7XG4gICAgY29kZSA9IHJlc3VsdC5jb2RlID8/IDEwMDVcbiAgICByZWFzb24gPSByZXN1bHQucmVhc29uXG4gIH0gZWxzZSBpZiAoIXdzW2tTZW50Q2xvc2VdKSB7XG4gICAgLy8gSWYgX1RoZSBXZWJTb2NrZXRcbiAgICAvLyBDb25uZWN0aW9uIGlzIENsb3NlZF8gYW5kIG5vIENsb3NlIGNvbnRyb2wgZnJhbWUgd2FzIHJlY2VpdmVkIGJ5IHRoZVxuICAgIC8vIGVuZHBvaW50IChzdWNoIGFzIGNvdWxkIG9jY3VyIGlmIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBjb25uZWN0aW9uXG4gICAgLy8gaXMgbG9zdCksIF9UaGUgV2ViU29ja2V0IENvbm5lY3Rpb24gQ2xvc2UgQ29kZV8gaXMgY29uc2lkZXJlZCB0byBiZVxuICAgIC8vIDEwMDYuXG4gICAgY29kZSA9IDEwMDZcbiAgfVxuXG4gIC8vIDEuIENoYW5nZSB0aGUgcmVhZHkgc3RhdGUgdG8gQ0xPU0VEICgzKS5cbiAgd3Nba1JlYWR5U3RhdGVdID0gc3RhdGVzLkNMT1NFRFxuXG4gIC8vIDIuIElmIHRoZSB1c2VyIGFnZW50IHdhcyByZXF1aXJlZCB0byBmYWlsIHRoZSBXZWJTb2NrZXRcbiAgLy8gICAgY29ubmVjdGlvbiwgb3IgaWYgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIHdhcyBjbG9zZWRcbiAgLy8gICAgYWZ0ZXIgYmVpbmcgZmxhZ2dlZCBhcyBmdWxsLCBmaXJlIGFuIGV2ZW50IG5hbWVkIGVycm9yXG4gIC8vICAgIGF0IHRoZSBXZWJTb2NrZXQgb2JqZWN0LlxuICAvLyBUT0RPXG5cbiAgLy8gMy4gRmlyZSBhbiBldmVudCBuYW1lZCBjbG9zZSBhdCB0aGUgV2ViU29ja2V0IG9iamVjdCxcbiAgLy8gICAgdXNpbmcgQ2xvc2VFdmVudCwgd2l0aCB0aGUgd2FzQ2xlYW4gYXR0cmlidXRlXG4gIC8vICAgIGluaXRpYWxpemVkIHRvIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gY2xvc2VkIGNsZWFubHlcbiAgLy8gICAgYW5kIGZhbHNlIG90aGVyd2lzZSwgdGhlIGNvZGUgYXR0cmlidXRlIGluaXRpYWxpemVkIHRvXG4gIC8vICAgIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBjbG9zZSBjb2RlLCBhbmQgdGhlIHJlYXNvblxuICAvLyAgICBhdHRyaWJ1dGUgaW5pdGlhbGl6ZWQgdG8gdGhlIHJlc3VsdCBvZiBhcHBseWluZyBVVEYtOFxuICAvLyAgICBkZWNvZGUgd2l0aG91dCBCT00gdG8gdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIGNsb3NlXG4gIC8vICAgIHJlYXNvbi5cbiAgZmlyZUV2ZW50KCdjbG9zZScsIHdzLCBDbG9zZUV2ZW50LCB7XG4gICAgd2FzQ2xlYW4sIGNvZGUsIHJlYXNvblxuICB9KVxuXG4gIGlmIChjaGFubmVscy5jbG9zZS5oYXNTdWJzY3JpYmVycykge1xuICAgIGNoYW5uZWxzLmNsb3NlLnB1Ymxpc2goe1xuICAgICAgd2Vic29ja2V0OiB3cyxcbiAgICAgIGNvZGUsXG4gICAgICByZWFzb25cbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIG9uU29ja2V0RXJyb3IgKGVycm9yKSB7XG4gIGNvbnN0IHsgd3MgfSA9IHRoaXNcblxuICB3c1trUmVhZHlTdGF0ZV0gPSBzdGF0ZXMuQ0xPU0lOR1xuXG4gIGlmIChjaGFubmVscy5zb2NrZXRFcnJvci5oYXNTdWJzY3JpYmVycykge1xuICAgIGNoYW5uZWxzLnNvY2tldEVycm9yLnB1Ymxpc2goZXJyb3IpXG4gIH1cblxuICB0aGlzLmRlc3Ryb3koKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZXN0YWJsaXNoV2ViU29ja2V0Q29ubmVjdGlvblxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgbWF4VW5zaWduZWQxNkJpdCB9ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuXG4vKiogQHR5cGUge2ltcG9ydCgnY3J5cHRvJyl9ICovXG5sZXQgY3J5cHRvXG50cnkge1xuICBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKVxufSBjYXRjaCB7XG5cbn1cblxuY2xhc3MgV2Vic29ja2V0RnJhbWVTZW5kIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7QnVmZmVyfHVuZGVmaW5lZH0gZGF0YVxuICAgKi9cbiAgY29uc3RydWN0b3IgKGRhdGEpIHtcbiAgICB0aGlzLmZyYW1lRGF0YSA9IGRhdGFcbiAgICB0aGlzLm1hc2tLZXkgPSBjcnlwdG8ucmFuZG9tQnl0ZXMoNClcbiAgfVxuXG4gIGNyZWF0ZUZyYW1lIChvcGNvZGUpIHtcbiAgICBjb25zdCBib2R5TGVuZ3RoID0gdGhpcy5mcmFtZURhdGE/LmJ5dGVMZW5ndGggPz8gMFxuXG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgbGV0IHBheWxvYWRMZW5ndGggPSBib2R5TGVuZ3RoIC8vIDAtMTI1XG4gICAgbGV0IG9mZnNldCA9IDZcblxuICAgIGlmIChib2R5TGVuZ3RoID4gbWF4VW5zaWduZWQxNkJpdCkge1xuICAgICAgb2Zmc2V0ICs9IDggLy8gcGF5bG9hZCBsZW5ndGggaXMgbmV4dCA4IGJ5dGVzXG4gICAgICBwYXlsb2FkTGVuZ3RoID0gMTI3XG4gICAgfSBlbHNlIGlmIChib2R5TGVuZ3RoID4gMTI1KSB7XG4gICAgICBvZmZzZXQgKz0gMiAvLyBwYXlsb2FkIGxlbmd0aCBpcyBuZXh0IDIgYnl0ZXNcbiAgICAgIHBheWxvYWRMZW5ndGggPSAxMjZcbiAgICB9XG5cbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUoYm9keUxlbmd0aCArIG9mZnNldClcblxuICAgIC8vIENsZWFyIGZpcnN0IDIgYnl0ZXMsIGV2ZXJ5dGhpbmcgZWxzZSBpcyBvdmVyd3JpdHRlblxuICAgIGJ1ZmZlclswXSA9IGJ1ZmZlclsxXSA9IDBcbiAgICBidWZmZXJbMF0gfD0gMHg4MCAvLyBGSU5cbiAgICBidWZmZXJbMF0gPSAoYnVmZmVyWzBdICYgMHhGMCkgKyBvcGNvZGUgLy8gb3Bjb2RlXG5cbiAgICAvKiEgd3MuIE1JVCBMaWNlbnNlLiBFaW5hciBPdHRvIFN0YW5ndmlrIDxlaW5hcm9zQGdtYWlsLmNvbT4gKi9cbiAgICBidWZmZXJbb2Zmc2V0IC0gNF0gPSB0aGlzLm1hc2tLZXlbMF1cbiAgICBidWZmZXJbb2Zmc2V0IC0gM10gPSB0aGlzLm1hc2tLZXlbMV1cbiAgICBidWZmZXJbb2Zmc2V0IC0gMl0gPSB0aGlzLm1hc2tLZXlbMl1cbiAgICBidWZmZXJbb2Zmc2V0IC0gMV0gPSB0aGlzLm1hc2tLZXlbM11cblxuICAgIGJ1ZmZlclsxXSA9IHBheWxvYWRMZW5ndGhcblxuICAgIGlmIChwYXlsb2FkTGVuZ3RoID09PSAxMjYpIHtcbiAgICAgIGJ1ZmZlci53cml0ZVVJbnQxNkJFKGJvZHlMZW5ndGgsIDIpXG4gICAgfSBlbHNlIGlmIChwYXlsb2FkTGVuZ3RoID09PSAxMjcpIHtcbiAgICAgIC8vIENsZWFyIGV4dGVuZGVkIHBheWxvYWQgbGVuZ3RoXG4gICAgICBidWZmZXJbMl0gPSBidWZmZXJbM10gPSAwXG4gICAgICBidWZmZXIud3JpdGVVSW50QkUoYm9keUxlbmd0aCwgNCwgNilcbiAgICB9XG5cbiAgICBidWZmZXJbMV0gfD0gMHg4MCAvLyBNQVNLXG5cbiAgICAvLyBtYXNrIGJvZHlcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJvZHlMZW5ndGg7IGkrKykge1xuICAgICAgYnVmZmVyW29mZnNldCArIGldID0gdGhpcy5mcmFtZURhdGFbaV0gXiB0aGlzLm1hc2tLZXlbaSAlIDRdXG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZmZlclxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBXZWJzb2NrZXRGcmFtZVNlbmRcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IFdyaXRhYmxlIH0gPSByZXF1aXJlKCdzdHJlYW0nKVxuY29uc3QgZGlhZ25vc3RpY3NDaGFubmVsID0gcmVxdWlyZSgnZGlhZ25vc3RpY3NfY2hhbm5lbCcpXG5jb25zdCB7IHBhcnNlclN0YXRlcywgb3Bjb2Rlcywgc3RhdGVzLCBlbXB0eUJ1ZmZlciB9ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3QgeyBrUmVhZHlTdGF0ZSwga1NlbnRDbG9zZSwga1Jlc3BvbnNlLCBrUmVjZWl2ZWRDbG9zZSB9ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgaXNWYWxpZFN0YXR1c0NvZGUsIGZhaWxXZWJzb2NrZXRDb25uZWN0aW9uLCB3ZWJzb2NrZXRNZXNzYWdlUmVjZWl2ZWQgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IFdlYnNvY2tldEZyYW1lU2VuZCB9ID0gcmVxdWlyZSgnLi9mcmFtZScpXG5cbi8vIFRoaXMgY29kZSB3YXMgaW5mbHVlbmNlZCBieSB3cyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTEgRWluYXIgT3R0byBTdGFuZ3ZpayA8ZWluYXJvc0BnbWFpbC5jb20+XG4vLyBDb3B5cmlnaHQgKGMpIDIwMTMgQXJub3V0IEthemVtaWVyIGFuZCBjb250cmlidXRvcnNcbi8vIENvcHlyaWdodCAoYykgMjAxNiBMdWlnaSBQaW5jYSBhbmQgY29udHJpYnV0b3JzXG5cbmNvbnN0IGNoYW5uZWxzID0ge31cbmNoYW5uZWxzLnBpbmcgPSBkaWFnbm9zdGljc0NoYW5uZWwuY2hhbm5lbCgndW5kaWNpOndlYnNvY2tldDpwaW5nJylcbmNoYW5uZWxzLnBvbmcgPSBkaWFnbm9zdGljc0NoYW5uZWwuY2hhbm5lbCgndW5kaWNpOndlYnNvY2tldDpwb25nJylcblxuY2xhc3MgQnl0ZVBhcnNlciBleHRlbmRzIFdyaXRhYmxlIHtcbiAgI2J1ZmZlcnMgPSBbXVxuICAjYnl0ZU9mZnNldCA9IDBcblxuICAjc3RhdGUgPSBwYXJzZXJTdGF0ZXMuSU5GT1xuXG4gICNpbmZvID0ge31cbiAgI2ZyYWdtZW50cyA9IFtdXG5cbiAgY29uc3RydWN0b3IgKHdzKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgdGhpcy53cyA9IHdzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtCdWZmZXJ9IGNodW5rXG4gICAqIEBwYXJhbSB7KCkgPT4gdm9pZH0gY2FsbGJhY2tcbiAgICovXG4gIF93cml0ZSAoY2h1bmssIF8sIGNhbGxiYWNrKSB7XG4gICAgdGhpcy4jYnVmZmVycy5wdXNoKGNodW5rKVxuICAgIHRoaXMuI2J5dGVPZmZzZXQgKz0gY2h1bmsubGVuZ3RoXG5cbiAgICB0aGlzLnJ1bihjYWxsYmFjaylcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdoZW5ldmVyIGEgbmV3IGNodW5rIGlzIHJlY2VpdmVkLlxuICAgKiBDYWxsYmFjayBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlcmUgYXJlIG5vIG1vcmUgY2h1bmtzIGJ1ZmZlcmluZyxcbiAgICogb3Igbm90IGVub3VnaCBieXRlcyBhcmUgYnVmZmVyZWQgdG8gcGFyc2UuXG4gICAqL1xuICBydW4gKGNhbGxiYWNrKSB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmICh0aGlzLiNzdGF0ZSA9PT0gcGFyc2VyU3RhdGVzLklORk8pIHtcbiAgICAgICAgLy8gSWYgdGhlcmUgYXJlbid0IGVub3VnaCBieXRlcyB0byBwYXJzZSB0aGUgcGF5bG9hZCBsZW5ndGgsIGV0Yy5cbiAgICAgICAgaWYgKHRoaXMuI2J5dGVPZmZzZXQgPCAyKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuY29uc3VtZSgyKVxuXG4gICAgICAgIHRoaXMuI2luZm8uZmluID0gKGJ1ZmZlclswXSAmIDB4ODApICE9PSAwXG4gICAgICAgIHRoaXMuI2luZm8ub3Bjb2RlID0gYnVmZmVyWzBdICYgMHgwRlxuXG4gICAgICAgIC8vIElmIHdlIHJlY2VpdmUgYSBmcmFnbWVudGVkIG1lc3NhZ2UsIHdlIHVzZSB0aGUgdHlwZSBvZiB0aGUgZmlyc3RcbiAgICAgICAgLy8gZnJhbWUgdG8gcGFyc2UgdGhlIGZ1bGwgbWVzc2FnZSBhcyBiaW5hcnkvdGV4dCwgd2hlbiBpdCdzIHRlcm1pbmF0ZWRcbiAgICAgICAgdGhpcy4jaW5mby5vcmlnaW5hbE9wY29kZSA/Pz0gdGhpcy4jaW5mby5vcGNvZGVcblxuICAgICAgICB0aGlzLiNpbmZvLmZyYWdtZW50ZWQgPSAhdGhpcy4jaW5mby5maW4gJiYgdGhpcy4jaW5mby5vcGNvZGUgIT09IG9wY29kZXMuQ09OVElOVUFUSU9OXG5cbiAgICAgICAgaWYgKHRoaXMuI2luZm8uZnJhZ21lbnRlZCAmJiB0aGlzLiNpbmZvLm9wY29kZSAhPT0gb3Bjb2Rlcy5CSU5BUlkgJiYgdGhpcy4jaW5mby5vcGNvZGUgIT09IG9wY29kZXMuVEVYVCkge1xuICAgICAgICAgIC8vIE9ubHkgdGV4dCBhbmQgYmluYXJ5IGZyYW1lcyBjYW4gYmUgZnJhZ21lbnRlZFxuICAgICAgICAgIGZhaWxXZWJzb2NrZXRDb25uZWN0aW9uKHRoaXMud3MsICdJbnZhbGlkIGZyYW1lIHR5cGUgd2FzIGZyYWdtZW50ZWQuJylcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBheWxvYWRMZW5ndGggPSBidWZmZXJbMV0gJiAweDdGXG5cbiAgICAgICAgaWYgKHBheWxvYWRMZW5ndGggPD0gMTI1KSB7XG4gICAgICAgICAgdGhpcy4jaW5mby5wYXlsb2FkTGVuZ3RoID0gcGF5bG9hZExlbmd0aFxuICAgICAgICAgIHRoaXMuI3N0YXRlID0gcGFyc2VyU3RhdGVzLlJFQURfREFUQVxuICAgICAgICB9IGVsc2UgaWYgKHBheWxvYWRMZW5ndGggPT09IDEyNikge1xuICAgICAgICAgIHRoaXMuI3N0YXRlID0gcGFyc2VyU3RhdGVzLlBBWUxPQURMRU5HVEhfMTZcbiAgICAgICAgfSBlbHNlIGlmIChwYXlsb2FkTGVuZ3RoID09PSAxMjcpIHtcbiAgICAgICAgICB0aGlzLiNzdGF0ZSA9IHBhcnNlclN0YXRlcy5QQVlMT0FETEVOR1RIXzY0XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy4jaW5mby5mcmFnbWVudGVkICYmIHBheWxvYWRMZW5ndGggPiAxMjUpIHtcbiAgICAgICAgICAvLyBBIGZyYWdtZW50ZWQgZnJhbWUgY2FuJ3QgYmUgZnJhZ21lbnRlZCBpdHNlbGZcbiAgICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih0aGlzLndzLCAnRnJhZ21lbnRlZCBmcmFtZSBleGNlZWRlZCAxMjUgYnl0ZXMuJylcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAodGhpcy4jaW5mby5vcGNvZGUgPT09IG9wY29kZXMuUElORyB8fFxuICAgICAgICAgICAgdGhpcy4jaW5mby5vcGNvZGUgPT09IG9wY29kZXMuUE9ORyB8fFxuICAgICAgICAgICAgdGhpcy4jaW5mby5vcGNvZGUgPT09IG9wY29kZXMuQ0xPU0UpICYmXG4gICAgICAgICAgcGF5bG9hZExlbmd0aCA+IDEyNVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBDb250cm9sIGZyYW1lcyBjYW4gaGF2ZSBhIHBheWxvYWQgbGVuZ3RoIG9mIDEyNSBieXRlcyBNQVhcbiAgICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih0aGlzLndzLCAnUGF5bG9hZCBsZW5ndGggZm9yIGNvbnRyb2wgZnJhbWUgZXhjZWVkZWQgMTI1IGJ5dGVzLicpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy4jaW5mby5vcGNvZGUgPT09IG9wY29kZXMuQ0xPU0UpIHtcbiAgICAgICAgICBpZiAocGF5bG9hZExlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24odGhpcy53cywgJ1JlY2VpdmVkIGNsb3NlIGZyYW1lIHdpdGggYSAxLWJ5dGUgYm9keS4nKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuY29uc3VtZShwYXlsb2FkTGVuZ3RoKVxuXG4gICAgICAgICAgdGhpcy4jaW5mby5jbG9zZUluZm8gPSB0aGlzLnBhcnNlQ2xvc2VCb2R5KGZhbHNlLCBib2R5KVxuXG4gICAgICAgICAgaWYgKCF0aGlzLndzW2tTZW50Q2xvc2VdKSB7XG4gICAgICAgICAgICAvLyBJZiBhbiBlbmRwb2ludCByZWNlaXZlcyBhIENsb3NlIGZyYW1lIGFuZCBkaWQgbm90IHByZXZpb3VzbHkgc2VuZCBhXG4gICAgICAgICAgICAvLyBDbG9zZSBmcmFtZSwgdGhlIGVuZHBvaW50IE1VU1Qgc2VuZCBhIENsb3NlIGZyYW1lIGluIHJlc3BvbnNlLiAgKFdoZW5cbiAgICAgICAgICAgIC8vIHNlbmRpbmcgYSBDbG9zZSBmcmFtZSBpbiByZXNwb25zZSwgdGhlIGVuZHBvaW50IHR5cGljYWxseSBlY2hvcyB0aGVcbiAgICAgICAgICAgIC8vIHN0YXR1cyBjb2RlIGl0IHJlY2VpdmVkLilcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBCdWZmZXIuYWxsb2NVbnNhZmUoMilcbiAgICAgICAgICAgIGJvZHkud3JpdGVVSW50MTZCRSh0aGlzLiNpbmZvLmNsb3NlSW5mby5jb2RlLCAwKVxuICAgICAgICAgICAgY29uc3QgY2xvc2VGcmFtZSA9IG5ldyBXZWJzb2NrZXRGcmFtZVNlbmQoYm9keSlcblxuICAgICAgICAgICAgdGhpcy53c1trUmVzcG9uc2VdLnNvY2tldC53cml0ZShcbiAgICAgICAgICAgICAgY2xvc2VGcmFtZS5jcmVhdGVGcmFtZShvcGNvZGVzLkNMT1NFKSxcbiAgICAgICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZXJyKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLndzW2tTZW50Q2xvc2VdID0gdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFVwb24gZWl0aGVyIHNlbmRpbmcgb3IgcmVjZWl2aW5nIGEgQ2xvc2UgY29udHJvbCBmcmFtZSwgaXQgaXMgc2FpZFxuICAgICAgICAgIC8vIHRoYXQgX1RoZSBXZWJTb2NrZXQgQ2xvc2luZyBIYW5kc2hha2UgaXMgU3RhcnRlZF8gYW5kIHRoYXQgdGhlXG4gICAgICAgICAgLy8gV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgaW4gdGhlIENMT1NJTkcgc3RhdGUuXG4gICAgICAgICAgdGhpcy53c1trUmVhZHlTdGF0ZV0gPSBzdGF0ZXMuQ0xPU0lOR1xuICAgICAgICAgIHRoaXMud3Nba1JlY2VpdmVkQ2xvc2VdID0gdHJ1ZVxuXG4gICAgICAgICAgdGhpcy5lbmQoKVxuXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy4jaW5mby5vcGNvZGUgPT09IG9wY29kZXMuUElORykge1xuICAgICAgICAgIC8vIFVwb24gcmVjZWlwdCBvZiBhIFBpbmcgZnJhbWUsIGFuIGVuZHBvaW50IE1VU1Qgc2VuZCBhIFBvbmcgZnJhbWUgaW5cbiAgICAgICAgICAvLyByZXNwb25zZSwgdW5sZXNzIGl0IGFscmVhZHkgcmVjZWl2ZWQgYSBDbG9zZSBmcmFtZS5cbiAgICAgICAgICAvLyBBIFBvbmcgZnJhbWUgc2VudCBpbiByZXNwb25zZSB0byBhIFBpbmcgZnJhbWUgbXVzdCBoYXZlIGlkZW50aWNhbFxuICAgICAgICAgIC8vIFwiQXBwbGljYXRpb24gZGF0YVwiXG5cbiAgICAgICAgICBjb25zdCBib2R5ID0gdGhpcy5jb25zdW1lKHBheWxvYWRMZW5ndGgpXG5cbiAgICAgICAgICBpZiAoIXRoaXMud3Nba1JlY2VpdmVkQ2xvc2VdKSB7XG4gICAgICAgICAgICBjb25zdCBmcmFtZSA9IG5ldyBXZWJzb2NrZXRGcmFtZVNlbmQoYm9keSlcblxuICAgICAgICAgICAgdGhpcy53c1trUmVzcG9uc2VdLnNvY2tldC53cml0ZShmcmFtZS5jcmVhdGVGcmFtZShvcGNvZGVzLlBPTkcpKVxuXG4gICAgICAgICAgICBpZiAoY2hhbm5lbHMucGluZy5oYXNTdWJzY3JpYmVycykge1xuICAgICAgICAgICAgICBjaGFubmVscy5waW5nLnB1Ymxpc2goe1xuICAgICAgICAgICAgICAgIHBheWxvYWQ6IGJvZHlcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLiNzdGF0ZSA9IHBhcnNlclN0YXRlcy5JTkZPXG5cbiAgICAgICAgICBpZiAodGhpcy4jYnl0ZU9mZnNldCA+IDApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLiNpbmZvLm9wY29kZSA9PT0gb3Bjb2Rlcy5QT05HKSB7XG4gICAgICAgICAgLy8gQSBQb25nIGZyYW1lIE1BWSBiZSBzZW50IHVuc29saWNpdGVkLiAgVGhpcyBzZXJ2ZXMgYXMgYVxuICAgICAgICAgIC8vIHVuaWRpcmVjdGlvbmFsIGhlYXJ0YmVhdC4gIEEgcmVzcG9uc2UgdG8gYW4gdW5zb2xpY2l0ZWQgUG9uZyBmcmFtZSBpc1xuICAgICAgICAgIC8vIG5vdCBleHBlY3RlZC5cblxuICAgICAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLmNvbnN1bWUocGF5bG9hZExlbmd0aClcblxuICAgICAgICAgIGlmIChjaGFubmVscy5wb25nLmhhc1N1YnNjcmliZXJzKSB7XG4gICAgICAgICAgICBjaGFubmVscy5wb25nLnB1Ymxpc2goe1xuICAgICAgICAgICAgICBwYXlsb2FkOiBib2R5XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0aGlzLiNieXRlT2Zmc2V0ID4gMCkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FsbGJhY2soKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuI3N0YXRlID09PSBwYXJzZXJTdGF0ZXMuUEFZTE9BRExFTkdUSF8xNikge1xuICAgICAgICBpZiAodGhpcy4jYnl0ZU9mZnNldCA8IDIpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5jb25zdW1lKDIpXG5cbiAgICAgICAgdGhpcy4jaW5mby5wYXlsb2FkTGVuZ3RoID0gYnVmZmVyLnJlYWRVSW50MTZCRSgwKVxuICAgICAgICB0aGlzLiNzdGF0ZSA9IHBhcnNlclN0YXRlcy5SRUFEX0RBVEFcbiAgICAgIH0gZWxzZSBpZiAodGhpcy4jc3RhdGUgPT09IHBhcnNlclN0YXRlcy5QQVlMT0FETEVOR1RIXzY0KSB7XG4gICAgICAgIGlmICh0aGlzLiNieXRlT2Zmc2V0IDwgOCkge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmNvbnN1bWUoOClcbiAgICAgICAgY29uc3QgdXBwZXIgPSBidWZmZXIucmVhZFVJbnQzMkJFKDApXG5cbiAgICAgICAgLy8gMl4zMSBpcyB0aGUgbWF4aW5pbXVtIGJ5dGVzIGFuIGFycmF5YnVmZmVyIGNhbiBjb250YWluXG4gICAgICAgIC8vIG9uIDMyLWJpdCBzeXN0ZW1zLiBBbHRob3VnaCwgb24gNjQtYml0IHN5c3RlbXMsIHRoaXMgaXNcbiAgICAgICAgLy8gMl41My0xIGJ5dGVzLlxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9FcnJvcnMvSW52YWxpZF9hcnJheV9sZW5ndGhcbiAgICAgICAgLy8gaHR0cHM6Ly9zb3VyY2UuY2hyb21pdW0ub3JnL2Nocm9taXVtL2Nocm9taXVtL3NyYy8rL21haW46djgvc3JjL2NvbW1vbi9nbG9iYWxzLmg7ZHJjPTE5NDYyMTJhYzAxMDA2NjhmMTRlYjllMjg0M2JkZDg0NmU1MTBhMWU7YnB2PTE7YnB0PTE7bD0xMjc1XG4gICAgICAgIC8vIGh0dHBzOi8vc291cmNlLmNocm9taXVtLm9yZy9jaHJvbWl1bS9jaHJvbWl1bS9zcmMvKy9tYWluOnY4L3NyYy9vYmplY3RzL2pzLWFycmF5LWJ1ZmZlci5oO2w9MzQ7ZHJjPTE5NDYyMTJhYzAxMDA2NjhmMTRlYjllMjg0M2JkZDg0NmU1MTBhMWVcbiAgICAgICAgaWYgKHVwcGVyID4gMiAqKiAzMSAtIDEpIHtcbiAgICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih0aGlzLndzLCAnUmVjZWl2ZWQgcGF5bG9hZCBsZW5ndGggPiAyXjMxIGJ5dGVzLicpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb3dlciA9IGJ1ZmZlci5yZWFkVUludDMyQkUoNClcblxuICAgICAgICB0aGlzLiNpbmZvLnBheWxvYWRMZW5ndGggPSAodXBwZXIgPDwgOCkgKyBsb3dlclxuICAgICAgICB0aGlzLiNzdGF0ZSA9IHBhcnNlclN0YXRlcy5SRUFEX0RBVEFcbiAgICAgIH0gZWxzZSBpZiAodGhpcy4jc3RhdGUgPT09IHBhcnNlclN0YXRlcy5SRUFEX0RBVEEpIHtcbiAgICAgICAgaWYgKHRoaXMuI2J5dGVPZmZzZXQgPCB0aGlzLiNpbmZvLnBheWxvYWRMZW5ndGgpIHtcbiAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBzdGlsbCBtb3JlIGRhdGEgaW4gdGhpcyBjaHVuayB0aGF0IG5lZWRzIHRvIGJlIHJlYWRcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuI2J5dGVPZmZzZXQgPj0gdGhpcy4jaW5mby5wYXlsb2FkTGVuZ3RoKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIHNlcnZlciBzZW50IG11bHRpcGxlIGZyYW1lcyBpbiBhIHNpbmdsZSBjaHVua1xuXG4gICAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuY29uc3VtZSh0aGlzLiNpbmZvLnBheWxvYWRMZW5ndGgpXG5cbiAgICAgICAgICB0aGlzLiNmcmFnbWVudHMucHVzaChib2R5KVxuXG4gICAgICAgICAgLy8gSWYgdGhlIGZyYW1lIGlzIHVuZnJhZ21lbnRlZCwgb3IgYSBmcmFnbWVudGVkIGZyYW1lIHdhcyB0ZXJtaW5hdGVkLFxuICAgICAgICAgIC8vIGEgbWVzc2FnZSB3YXMgcmVjZWl2ZWRcbiAgICAgICAgICBpZiAoIXRoaXMuI2luZm8uZnJhZ21lbnRlZCB8fCAodGhpcy4jaW5mby5maW4gJiYgdGhpcy4jaW5mby5vcGNvZGUgPT09IG9wY29kZXMuQ09OVElOVUFUSU9OKSkge1xuICAgICAgICAgICAgY29uc3QgZnVsbE1lc3NhZ2UgPSBCdWZmZXIuY29uY2F0KHRoaXMuI2ZyYWdtZW50cylcblxuICAgICAgICAgICAgd2Vic29ja2V0TWVzc2FnZVJlY2VpdmVkKHRoaXMud3MsIHRoaXMuI2luZm8ub3JpZ2luYWxPcGNvZGUsIGZ1bGxNZXNzYWdlKVxuXG4gICAgICAgICAgICB0aGlzLiNpbmZvID0ge31cbiAgICAgICAgICAgIHRoaXMuI2ZyYWdtZW50cy5sZW5ndGggPSAwXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy4jc3RhdGUgPSBwYXJzZXJTdGF0ZXMuSU5GT1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLiNieXRlT2Zmc2V0ID4gMCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2soKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIG4gYnl0ZXMgZnJvbSB0aGUgYnVmZmVyZWQgQnVmZmVyc1xuICAgKiBAcGFyYW0ge251bWJlcn0gblxuICAgKiBAcmV0dXJucyB7QnVmZmVyfG51bGx9XG4gICAqL1xuICBjb25zdW1lIChuKSB7XG4gICAgaWYgKG4gPiB0aGlzLiNieXRlT2Zmc2V0KSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH0gZWxzZSBpZiAobiA9PT0gMCkge1xuICAgICAgcmV0dXJuIGVtcHR5QnVmZmVyXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuI2J1ZmZlcnNbMF0ubGVuZ3RoID09PSBuKSB7XG4gICAgICB0aGlzLiNieXRlT2Zmc2V0IC09IHRoaXMuI2J1ZmZlcnNbMF0ubGVuZ3RoXG4gICAgICByZXR1cm4gdGhpcy4jYnVmZmVycy5zaGlmdCgpXG4gICAgfVxuXG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKG4pXG4gICAgbGV0IG9mZnNldCA9IDBcblxuICAgIHdoaWxlIChvZmZzZXQgIT09IG4pIHtcbiAgICAgIGNvbnN0IG5leHQgPSB0aGlzLiNidWZmZXJzWzBdXG4gICAgICBjb25zdCB7IGxlbmd0aCB9ID0gbmV4dFxuXG4gICAgICBpZiAobGVuZ3RoICsgb2Zmc2V0ID09PSBuKSB7XG4gICAgICAgIGJ1ZmZlci5zZXQodGhpcy4jYnVmZmVycy5zaGlmdCgpLCBvZmZzZXQpXG4gICAgICAgIGJyZWFrXG4gICAgICB9IGVsc2UgaWYgKGxlbmd0aCArIG9mZnNldCA+IG4pIHtcbiAgICAgICAgYnVmZmVyLnNldChuZXh0LnN1YmFycmF5KDAsIG4gLSBvZmZzZXQpLCBvZmZzZXQpXG4gICAgICAgIHRoaXMuI2J1ZmZlcnNbMF0gPSBuZXh0LnN1YmFycmF5KG4gLSBvZmZzZXQpXG4gICAgICAgIGJyZWFrXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBidWZmZXIuc2V0KHRoaXMuI2J1ZmZlcnMuc2hpZnQoKSwgb2Zmc2V0KVxuICAgICAgICBvZmZzZXQgKz0gbmV4dC5sZW5ndGhcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLiNieXRlT2Zmc2V0IC09IG5cblxuICAgIHJldHVybiBidWZmZXJcbiAgfVxuXG4gIHBhcnNlQ2xvc2VCb2R5IChvbmx5Q29kZSwgZGF0YSkge1xuICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjQ1NSNzZWN0aW9uLTcuMS41XG4gICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgIGxldCBjb2RlXG5cbiAgICBpZiAoZGF0YS5sZW5ndGggPj0gMikge1xuICAgICAgLy8gX1RoZSBXZWJTb2NrZXQgQ29ubmVjdGlvbiBDbG9zZSBDb2RlXyBpc1xuICAgICAgLy8gZGVmaW5lZCBhcyB0aGUgc3RhdHVzIGNvZGUgKFNlY3Rpb24gNy40KSBjb250YWluZWQgaW4gdGhlIGZpcnN0IENsb3NlXG4gICAgICAvLyBjb250cm9sIGZyYW1lIHJlY2VpdmVkIGJ5IHRoZSBhcHBsaWNhdGlvblxuICAgICAgY29kZSA9IGRhdGEucmVhZFVJbnQxNkJFKDApXG4gICAgfVxuXG4gICAgaWYgKG9ubHlDb2RlKSB7XG4gICAgICBpZiAoIWlzVmFsaWRTdGF0dXNDb2RlKGNvZGUpKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGNvZGUgfVxuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjQ1NSNzZWN0aW9uLTcuMS42XG4gICAgLyoqIEB0eXBlIHtCdWZmZXJ9ICovXG4gICAgbGV0IHJlYXNvbiA9IGRhdGEuc3ViYXJyYXkoMilcblxuICAgIC8vIFJlbW92ZSBCT01cbiAgICBpZiAocmVhc29uWzBdID09PSAweEVGICYmIHJlYXNvblsxXSA9PT0gMHhCQiAmJiByZWFzb25bMl0gPT09IDB4QkYpIHtcbiAgICAgIHJlYXNvbiA9IHJlYXNvbi5zdWJhcnJheSgzKVxuICAgIH1cblxuICAgIGlmIChjb2RlICE9PSB1bmRlZmluZWQgJiYgIWlzVmFsaWRTdGF0dXNDb2RlKGNvZGUpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBUT0RPOiBvcHRpbWl6ZSB0aGlzXG4gICAgICByZWFzb24gPSBuZXcgVGV4dERlY29kZXIoJ3V0Zi04JywgeyBmYXRhbDogdHJ1ZSB9KS5kZWNvZGUocmVhc29uKVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlLCByZWFzb24gfVxuICB9XG5cbiAgZ2V0IGNsb3NpbmdJbmZvICgpIHtcbiAgICByZXR1cm4gdGhpcy4jaW5mby5jbG9zZUluZm9cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQnl0ZVBhcnNlclxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgd2ViaWRsIH0gPSByZXF1aXJlKCcuLi9mZXRjaC93ZWJpZGwnKVxuY29uc3QgeyBET01FeGNlcHRpb24gfSA9IHJlcXVpcmUoJy4uL2ZldGNoL2NvbnN0YW50cycpXG5jb25zdCB7IFVSTFNlcmlhbGl6ZXIgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL2RhdGFVUkwnKVxuY29uc3QgeyBnZXRHbG9iYWxPcmlnaW4gfSA9IHJlcXVpcmUoJy4uL2ZldGNoL2dsb2JhbCcpXG5jb25zdCB7IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsIHN0YXRlcywgb3Bjb2RlcywgZW1wdHlCdWZmZXIgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IHtcbiAga1dlYlNvY2tldFVSTCxcbiAga1JlYWR5U3RhdGUsXG4gIGtDb250cm9sbGVyLFxuICBrQmluYXJ5VHlwZSxcbiAga1Jlc3BvbnNlLFxuICBrU2VudENsb3NlLFxuICBrQnl0ZVBhcnNlclxufSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IGlzRXN0YWJsaXNoZWQsIGlzQ2xvc2luZywgaXNWYWxpZFN1YnByb3RvY29sLCBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbiwgZmlyZUV2ZW50IH0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3QgeyBlc3RhYmxpc2hXZWJTb2NrZXRDb25uZWN0aW9uIH0gPSByZXF1aXJlKCcuL2Nvbm5lY3Rpb24nKVxuY29uc3QgeyBXZWJzb2NrZXRGcmFtZVNlbmQgfSA9IHJlcXVpcmUoJy4vZnJhbWUnKVxuY29uc3QgeyBCeXRlUGFyc2VyIH0gPSByZXF1aXJlKCcuL3JlY2VpdmVyJylcbmNvbnN0IHsga0VudW1lcmFibGVQcm9wZXJ0eSwgaXNCbG9iTGlrZSB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgZ2V0R2xvYmFsRGlzcGF0Y2hlciB9ID0gcmVxdWlyZSgnLi4vZ2xvYmFsJylcbmNvbnN0IHsgdHlwZXMgfSA9IHJlcXVpcmUoJ3V0aWwnKVxuXG5sZXQgZXhwZXJpbWVudGFsV2FybmVkID0gZmFsc2VcblxuLy8gaHR0cHM6Ly93ZWJzb2NrZXRzLnNwZWMud2hhdHdnLm9yZy8jaW50ZXJmYWNlLWRlZmluaXRpb25cbmNsYXNzIFdlYlNvY2tldCBleHRlbmRzIEV2ZW50VGFyZ2V0IHtcbiAgI2V2ZW50cyA9IHtcbiAgICBvcGVuOiBudWxsLFxuICAgIGVycm9yOiBudWxsLFxuICAgIGNsb3NlOiBudWxsLFxuICAgIG1lc3NhZ2U6IG51bGxcbiAgfVxuXG4gICNidWZmZXJlZEFtb3VudCA9IDBcbiAgI3Byb3RvY29sID0gJydcbiAgI2V4dGVuc2lvbnMgPSAnJ1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBwcm90b2NvbHNcbiAgICovXG4gIGNvbnN0cnVjdG9yICh1cmwsIHByb3RvY29scyA9IFtdKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ1dlYlNvY2tldCBjb25zdHJ1Y3RvcicgfSlcblxuICAgIGlmICghZXhwZXJpbWVudGFsV2FybmVkKSB7XG4gICAgICBleHBlcmltZW50YWxXYXJuZWQgPSB0cnVlXG4gICAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKCdXZWJTb2NrZXRzIGFyZSBleHBlcmltZW50YWwsIGV4cGVjdCB0aGVtIHRvIGNoYW5nZSBhdCBhbnkgdGltZS4nLCB7XG4gICAgICAgIGNvZGU6ICdVTkRJQ0ktV1MnXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnMgPSB3ZWJpZGwuY29udmVydGVyc1snRE9NU3RyaW5nIG9yIHNlcXVlbmNlPERPTVN0cmluZz4gb3IgV2ViU29ja2V0SW5pdCddKHByb3RvY29scylcblxuICAgIHVybCA9IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyh1cmwpXG4gICAgcHJvdG9jb2xzID0gb3B0aW9ucy5wcm90b2NvbHNcblxuICAgIC8vIDEuIExldCBiYXNlVVJMIGJlIHRoaXMncyByZWxldmFudCBzZXR0aW5ncyBvYmplY3QncyBBUEkgYmFzZSBVUkwuXG4gICAgY29uc3QgYmFzZVVSTCA9IGdldEdsb2JhbE9yaWdpbigpXG5cbiAgICAvLyAxLiBMZXQgdXJsUmVjb3JkIGJlIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIFVSTCBwYXJzZXIgdG8gdXJsIHdpdGggYmFzZVVSTC5cbiAgICBsZXQgdXJsUmVjb3JkXG5cbiAgICB0cnkge1xuICAgICAgdXJsUmVjb3JkID0gbmV3IFVSTCh1cmwsIGJhc2VVUkwpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gMy4gSWYgdXJsUmVjb3JkIGlzIGZhaWx1cmUsIHRoZW4gdGhyb3cgYSBcIlN5bnRheEVycm9yXCIgRE9NRXhjZXB0aW9uLlxuICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihlLCAnU3ludGF4RXJyb3InKVxuICAgIH1cblxuICAgIC8vIDQuIElmIHVybFJlY29yZOKAmXMgc2NoZW1lIGlzIFwiaHR0cFwiLCB0aGVuIHNldCB1cmxSZWNvcmTigJlzIHNjaGVtZSB0byBcIndzXCIuXG4gICAgaWYgKHVybFJlY29yZC5wcm90b2NvbCA9PT0gJ2h0dHA6Jykge1xuICAgICAgdXJsUmVjb3JkLnByb3RvY29sID0gJ3dzOidcbiAgICB9IGVsc2UgaWYgKHVybFJlY29yZC5wcm90b2NvbCA9PT0gJ2h0dHBzOicpIHtcbiAgICAgIC8vIDUuIE90aGVyd2lzZSwgaWYgdXJsUmVjb3Jk4oCZcyBzY2hlbWUgaXMgXCJodHRwc1wiLCBzZXQgdXJsUmVjb3Jk4oCZcyBzY2hlbWUgdG8gXCJ3c3NcIi5cbiAgICAgIHVybFJlY29yZC5wcm90b2NvbCA9ICd3c3M6J1xuICAgIH1cblxuICAgIC8vIDYuIElmIHVybFJlY29yZOKAmXMgc2NoZW1lIGlzIG5vdCBcIndzXCIgb3IgXCJ3c3NcIiwgdGhlbiB0aHJvdyBhIFwiU3ludGF4RXJyb3JcIiBET01FeGNlcHRpb24uXG4gICAgaWYgKHVybFJlY29yZC5wcm90b2NvbCAhPT0gJ3dzOicgJiYgdXJsUmVjb3JkLnByb3RvY29sICE9PSAnd3NzOicpIHtcbiAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oXG4gICAgICAgIGBFeHBlY3RlZCBhIHdzOiBvciB3c3M6IHByb3RvY29sLCBnb3QgJHt1cmxSZWNvcmQucHJvdG9jb2x9YCxcbiAgICAgICAgJ1N5bnRheEVycm9yJ1xuICAgICAgKVxuICAgIH1cblxuICAgIC8vIDcuIElmIHVybFJlY29yZOKAmXMgZnJhZ21lbnQgaXMgbm9uLW51bGwsIHRoZW4gdGhyb3cgYSBcIlN5bnRheEVycm9yXCJcbiAgICAvLyAgICBET01FeGNlcHRpb24uXG4gICAgaWYgKHVybFJlY29yZC5oYXNoIHx8IHVybFJlY29yZC5ocmVmLmVuZHNXaXRoKCcjJykpIHtcbiAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0dvdCBmcmFnbWVudCcsICdTeW50YXhFcnJvcicpXG4gICAgfVxuXG4gICAgLy8gOC4gSWYgcHJvdG9jb2xzIGlzIGEgc3RyaW5nLCBzZXQgcHJvdG9jb2xzIHRvIGEgc2VxdWVuY2UgY29uc2lzdGluZ1xuICAgIC8vICAgIG9mIGp1c3QgdGhhdCBzdHJpbmcuXG4gICAgaWYgKHR5cGVvZiBwcm90b2NvbHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwcm90b2NvbHMgPSBbcHJvdG9jb2xzXVxuICAgIH1cblxuICAgIC8vIDkuIElmIGFueSBvZiB0aGUgdmFsdWVzIGluIHByb3RvY29scyBvY2N1ciBtb3JlIHRoYW4gb25jZSBvciBvdGhlcndpc2VcbiAgICAvLyAgICBmYWlsIHRvIG1hdGNoIHRoZSByZXF1aXJlbWVudHMgZm9yIGVsZW1lbnRzIHRoYXQgY29tcHJpc2UgdGhlIHZhbHVlXG4gICAgLy8gICAgb2YgYFNlYy1XZWJTb2NrZXQtUHJvdG9jb2xgIGZpZWxkcyBhcyBkZWZpbmVkIGJ5IFRoZSBXZWJTb2NrZXRcbiAgICAvLyAgICBwcm90b2NvbCwgdGhlbiB0aHJvdyBhIFwiU3ludGF4RXJyb3JcIiBET01FeGNlcHRpb24uXG4gICAgaWYgKHByb3RvY29scy5sZW5ndGggIT09IG5ldyBTZXQocHJvdG9jb2xzLm1hcChwID0+IHAudG9Mb3dlckNhc2UoKSkpLnNpemUpIHtcbiAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ludmFsaWQgU2VjLVdlYlNvY2tldC1Qcm90b2NvbCB2YWx1ZScsICdTeW50YXhFcnJvcicpXG4gICAgfVxuXG4gICAgaWYgKHByb3RvY29scy5sZW5ndGggPiAwICYmICFwcm90b2NvbHMuZXZlcnkocCA9PiBpc1ZhbGlkU3VicHJvdG9jb2wocCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdJbnZhbGlkIFNlYy1XZWJTb2NrZXQtUHJvdG9jb2wgdmFsdWUnLCAnU3ludGF4RXJyb3InKVxuICAgIH1cblxuICAgIC8vIDEwLiBTZXQgdGhpcydzIHVybCB0byB1cmxSZWNvcmQuXG4gICAgdGhpc1trV2ViU29ja2V0VVJMXSA9IG5ldyBVUkwodXJsUmVjb3JkLmhyZWYpXG5cbiAgICAvLyAxMS4gTGV0IGNsaWVudCBiZSB0aGlzJ3MgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN0LlxuXG4gICAgLy8gMTIuIFJ1biB0aGlzIHN0ZXAgaW4gcGFyYWxsZWw6XG5cbiAgICAvLyAgICAxLiBFc3RhYmxpc2ggYSBXZWJTb2NrZXQgY29ubmVjdGlvbiBnaXZlbiB1cmxSZWNvcmQsIHByb3RvY29scyxcbiAgICAvLyAgICAgICBhbmQgY2xpZW50LlxuICAgIHRoaXNba0NvbnRyb2xsZXJdID0gZXN0YWJsaXNoV2ViU29ja2V0Q29ubmVjdGlvbihcbiAgICAgIHVybFJlY29yZCxcbiAgICAgIHByb3RvY29scyxcbiAgICAgIHRoaXMsXG4gICAgICAocmVzcG9uc2UpID0+IHRoaXMuI29uQ29ubmVjdGlvbkVzdGFibGlzaGVkKHJlc3BvbnNlKSxcbiAgICAgIG9wdGlvbnNcbiAgICApXG5cbiAgICAvLyBFYWNoIFdlYlNvY2tldCBvYmplY3QgaGFzIGFuIGFzc29jaWF0ZWQgcmVhZHkgc3RhdGUsIHdoaWNoIGlzIGFcbiAgICAvLyBudW1iZXIgcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSBvZiB0aGUgY29ubmVjdGlvbi4gSW5pdGlhbGx5IGl0IG11c3RcbiAgICAvLyBiZSBDT05ORUNUSU5HICgwKS5cbiAgICB0aGlzW2tSZWFkeVN0YXRlXSA9IFdlYlNvY2tldC5DT05ORUNUSU5HXG5cbiAgICAvLyBUaGUgZXh0ZW5zaW9ucyBhdHRyaWJ1dGUgbXVzdCBpbml0aWFsbHkgcmV0dXJuIHRoZSBlbXB0eSBzdHJpbmcuXG5cbiAgICAvLyBUaGUgcHJvdG9jb2wgYXR0cmlidXRlIG11c3QgaW5pdGlhbGx5IHJldHVybiB0aGUgZW1wdHkgc3RyaW5nLlxuXG4gICAgLy8gRWFjaCBXZWJTb2NrZXQgb2JqZWN0IGhhcyBhbiBhc3NvY2lhdGVkIGJpbmFyeSB0eXBlLCB3aGljaCBpcyBhXG4gICAgLy8gQmluYXJ5VHlwZS4gSW5pdGlhbGx5IGl0IG11c3QgYmUgXCJibG9iXCIuXG4gICAgdGhpc1trQmluYXJ5VHlwZV0gPSAnYmxvYidcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vd2Vic29ja2V0cy5zcGVjLndoYXR3Zy5vcmcvI2RvbS13ZWJzb2NrZXQtY2xvc2VcbiAgICogQHBhcmFtIHtudW1iZXJ8dW5kZWZpbmVkfSBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gcmVhc29uXG4gICAqL1xuICBjbG9zZSAoY29kZSA9IHVuZGVmaW5lZCwgcmVhc29uID0gdW5kZWZpbmVkKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgaWYgKGNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29kZSA9IHdlYmlkbC5jb252ZXJ0ZXJzWyd1bnNpZ25lZCBzaG9ydCddKGNvZGUsIHsgY2xhbXA6IHRydWUgfSlcbiAgICB9XG5cbiAgICBpZiAocmVhc29uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlYXNvbiA9IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhyZWFzb24pXG4gICAgfVxuXG4gICAgLy8gMS4gSWYgY29kZSBpcyBwcmVzZW50LCBidXQgaXMgbmVpdGhlciBhbiBpbnRlZ2VyIGVxdWFsIHRvIDEwMDAgbm9yIGFuXG4gICAgLy8gICAgaW50ZWdlciBpbiB0aGUgcmFuZ2UgMzAwMCB0byA0OTk5LCBpbmNsdXNpdmUsIHRocm93IGFuXG4gICAgLy8gICAgXCJJbnZhbGlkQWNjZXNzRXJyb3JcIiBET01FeGNlcHRpb24uXG4gICAgaWYgKGNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGNvZGUgIT09IDEwMDAgJiYgKGNvZGUgPCAzMDAwIHx8IGNvZGUgPiA0OTk5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdpbnZhbGlkIGNvZGUnLCAnSW52YWxpZEFjY2Vzc0Vycm9yJylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgcmVhc29uQnl0ZUxlbmd0aCA9IDBcblxuICAgIC8vIDIuIElmIHJlYXNvbiBpcyBwcmVzZW50LCB0aGVuIHJ1biB0aGVzZSBzdWJzdGVwczpcbiAgICBpZiAocmVhc29uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIDEuIExldCByZWFzb25CeXRlcyBiZSB0aGUgcmVzdWx0IG9mIGVuY29kaW5nIHJlYXNvbi5cbiAgICAgIC8vIDIuIElmIHJlYXNvbkJ5dGVzIGlzIGxvbmdlciB0aGFuIDEyMyBieXRlcywgdGhlbiB0aHJvdyBhXG4gICAgICAvLyAgICBcIlN5bnRheEVycm9yXCIgRE9NRXhjZXB0aW9uLlxuICAgICAgcmVhc29uQnl0ZUxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHJlYXNvbilcblxuICAgICAgaWYgKHJlYXNvbkJ5dGVMZW5ndGggPiAxMjMpIHtcbiAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihcbiAgICAgICAgICBgUmVhc29uIG11c3QgYmUgbGVzcyB0aGFuIDEyMyBieXRlczsgcmVjZWl2ZWQgJHtyZWFzb25CeXRlTGVuZ3RofWAsXG4gICAgICAgICAgJ1N5bnRheEVycm9yJ1xuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMy4gUnVuIHRoZSBmaXJzdCBtYXRjaGluZyBzdGVwcyBmcm9tIHRoZSBmb2xsb3dpbmcgbGlzdDpcbiAgICBpZiAodGhpc1trUmVhZHlTdGF0ZV0gPT09IFdlYlNvY2tldC5DTE9TSU5HIHx8IHRoaXNba1JlYWR5U3RhdGVdID09PSBXZWJTb2NrZXQuQ0xPU0VEKSB7XG4gICAgICAvLyBJZiB0aGlzJ3MgcmVhZHkgc3RhdGUgaXMgQ0xPU0lORyAoMikgb3IgQ0xPU0VEICgzKVxuICAgICAgLy8gRG8gbm90aGluZy5cbiAgICB9IGVsc2UgaWYgKCFpc0VzdGFibGlzaGVkKHRoaXMpKSB7XG4gICAgICAvLyBJZiB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgbm90IHlldCBlc3RhYmxpc2hlZFxuICAgICAgLy8gRmFpbCB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gYW5kIHNldCB0aGlzJ3MgcmVhZHkgc3RhdGVcbiAgICAgIC8vIHRvIENMT1NJTkcgKDIpLlxuICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24odGhpcywgJ0Nvbm5lY3Rpb24gd2FzIGNsb3NlZCBiZWZvcmUgaXQgd2FzIGVzdGFibGlzaGVkLicpXG4gICAgICB0aGlzW2tSZWFkeVN0YXRlXSA9IFdlYlNvY2tldC5DTE9TSU5HXG4gICAgfSBlbHNlIGlmICghaXNDbG9zaW5nKHRoaXMpKSB7XG4gICAgICAvLyBJZiB0aGUgV2ViU29ja2V0IGNsb3NpbmcgaGFuZHNoYWtlIGhhcyBub3QgeWV0IGJlZW4gc3RhcnRlZFxuICAgICAgLy8gU3RhcnQgdGhlIFdlYlNvY2tldCBjbG9zaW5nIGhhbmRzaGFrZSBhbmQgc2V0IHRoaXMncyByZWFkeVxuICAgICAgLy8gc3RhdGUgdG8gQ0xPU0lORyAoMikuXG4gICAgICAvLyAtIElmIG5laXRoZXIgY29kZSBub3IgcmVhc29uIGlzIHByZXNlbnQsIHRoZSBXZWJTb2NrZXQgQ2xvc2VcbiAgICAgIC8vICAgbWVzc2FnZSBtdXN0IG5vdCBoYXZlIGEgYm9keS5cbiAgICAgIC8vIC0gSWYgY29kZSBpcyBwcmVzZW50LCB0aGVuIHRoZSBzdGF0dXMgY29kZSB0byB1c2UgaW4gdGhlXG4gICAgICAvLyAgIFdlYlNvY2tldCBDbG9zZSBtZXNzYWdlIG11c3QgYmUgdGhlIGludGVnZXIgZ2l2ZW4gYnkgY29kZS5cbiAgICAgIC8vIC0gSWYgcmVhc29uIGlzIGFsc28gcHJlc2VudCwgdGhlbiByZWFzb25CeXRlcyBtdXN0IGJlXG4gICAgICAvLyAgIHByb3ZpZGVkIGluIHRoZSBDbG9zZSBtZXNzYWdlIGFmdGVyIHRoZSBzdGF0dXMgY29kZS5cblxuICAgICAgY29uc3QgZnJhbWUgPSBuZXcgV2Vic29ja2V0RnJhbWVTZW5kKClcblxuICAgICAgLy8gSWYgbmVpdGhlciBjb2RlIG5vciByZWFzb24gaXMgcHJlc2VudCwgdGhlIFdlYlNvY2tldCBDbG9zZVxuICAgICAgLy8gbWVzc2FnZSBtdXN0IG5vdCBoYXZlIGEgYm9keS5cblxuICAgICAgLy8gSWYgY29kZSBpcyBwcmVzZW50LCB0aGVuIHRoZSBzdGF0dXMgY29kZSB0byB1c2UgaW4gdGhlXG4gICAgICAvLyBXZWJTb2NrZXQgQ2xvc2UgbWVzc2FnZSBtdXN0IGJlIHRoZSBpbnRlZ2VyIGdpdmVuIGJ5IGNvZGUuXG4gICAgICBpZiAoY29kZSAhPT0gdW5kZWZpbmVkICYmIHJlYXNvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZyYW1lLmZyYW1lRGF0YSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgyKVxuICAgICAgICBmcmFtZS5mcmFtZURhdGEud3JpdGVVSW50MTZCRShjb2RlLCAwKVxuICAgICAgfSBlbHNlIGlmIChjb2RlICE9PSB1bmRlZmluZWQgJiYgcmVhc29uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gSWYgcmVhc29uIGlzIGFsc28gcHJlc2VudCwgdGhlbiByZWFzb25CeXRlcyBtdXN0IGJlXG4gICAgICAgIC8vIHByb3ZpZGVkIGluIHRoZSBDbG9zZSBtZXNzYWdlIGFmdGVyIHRoZSBzdGF0dXMgY29kZS5cbiAgICAgICAgZnJhbWUuZnJhbWVEYXRhID0gQnVmZmVyLmFsbG9jVW5zYWZlKDIgKyByZWFzb25CeXRlTGVuZ3RoKVxuICAgICAgICBmcmFtZS5mcmFtZURhdGEud3JpdGVVSW50MTZCRShjb2RlLCAwKVxuICAgICAgICAvLyB0aGUgYm9keSBNQVkgY29udGFpbiBVVEYtOC1lbmNvZGVkIGRhdGEgd2l0aCB2YWx1ZSAvcmVhc29uL1xuICAgICAgICBmcmFtZS5mcmFtZURhdGEud3JpdGUocmVhc29uLCAyLCAndXRmLTgnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZnJhbWUuZnJhbWVEYXRhID0gZW1wdHlCdWZmZXJcbiAgICAgIH1cblxuICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoJ3N0cmVhbScpLkR1cGxleH0gKi9cbiAgICAgIGNvbnN0IHNvY2tldCA9IHRoaXNba1Jlc3BvbnNlXS5zb2NrZXRcblxuICAgICAgc29ja2V0LndyaXRlKGZyYW1lLmNyZWF0ZUZyYW1lKG9wY29kZXMuQ0xPU0UpLCAoZXJyKSA9PiB7XG4gICAgICAgIGlmICghZXJyKSB7XG4gICAgICAgICAgdGhpc1trU2VudENsb3NlXSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gVXBvbiBlaXRoZXIgc2VuZGluZyBvciByZWNlaXZpbmcgYSBDbG9zZSBjb250cm9sIGZyYW1lLCBpdCBpcyBzYWlkXG4gICAgICAvLyB0aGF0IF9UaGUgV2ViU29ja2V0IENsb3NpbmcgSGFuZHNoYWtlIGlzIFN0YXJ0ZWRfIGFuZCB0aGF0IHRoZVxuICAgICAgLy8gV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgaW4gdGhlIENMT1NJTkcgc3RhdGUuXG4gICAgICB0aGlzW2tSZWFkeVN0YXRlXSA9IHN0YXRlcy5DTE9TSU5HXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE90aGVyd2lzZVxuICAgICAgLy8gU2V0IHRoaXMncyByZWFkeSBzdGF0ZSB0byBDTE9TSU5HICgyKS5cbiAgICAgIHRoaXNba1JlYWR5U3RhdGVdID0gV2ViU29ja2V0LkNMT1NJTkdcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3dlYnNvY2tldHMuc3BlYy53aGF0d2cub3JnLyNkb20td2Vic29ja2V0LXNlbmRcbiAgICogQHBhcmFtIHtOb2RlSlMuVHlwZWRBcnJheXxBcnJheUJ1ZmZlcnxCbG9ifHN0cmluZ30gZGF0YVxuICAgKi9cbiAgc2VuZCAoZGF0YSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdXZWJTb2NrZXQuc2VuZCcgfSlcblxuICAgIGRhdGEgPSB3ZWJpZGwuY29udmVydGVycy5XZWJTb2NrZXRTZW5kRGF0YShkYXRhKVxuXG4gICAgLy8gMS4gSWYgdGhpcydzIHJlYWR5IHN0YXRlIGlzIENPTk5FQ1RJTkcsIHRoZW4gdGhyb3cgYW5cbiAgICAvLyAgICBcIkludmFsaWRTdGF0ZUVycm9yXCIgRE9NRXhjZXB0aW9uLlxuICAgIGlmICh0aGlzW2tSZWFkeVN0YXRlXSA9PT0gV2ViU29ja2V0LkNPTk5FQ1RJTkcpIHtcbiAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ1NlbnQgYmVmb3JlIGNvbm5lY3RlZC4nLCAnSW52YWxpZFN0YXRlRXJyb3InKVxuICAgIH1cblxuICAgIC8vIDIuIFJ1biB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHN0ZXBzIGZyb20gdGhlIGZvbGxvd2luZyBsaXN0OlxuICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjQ1NSNzZWN0aW9uLTYuMVxuICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjQ1NSNzZWN0aW9uLTUuMlxuXG4gICAgaWYgKCFpc0VzdGFibGlzaGVkKHRoaXMpIHx8IGlzQ2xvc2luZyh0aGlzKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoJ3N0cmVhbScpLkR1cGxleH0gKi9cbiAgICBjb25zdCBzb2NrZXQgPSB0aGlzW2tSZXNwb25zZV0uc29ja2V0XG5cbiAgICAvLyBJZiBkYXRhIGlzIGEgc3RyaW5nXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gSWYgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIGFuZCB0aGUgV2ViU29ja2V0XG4gICAgICAvLyBjbG9zaW5nIGhhbmRzaGFrZSBoYXMgbm90IHlldCBzdGFydGVkLCB0aGVuIHRoZSB1c2VyIGFnZW50XG4gICAgICAvLyBtdXN0IHNlbmQgYSBXZWJTb2NrZXQgTWVzc2FnZSBjb21wcmlzZWQgb2YgdGhlIGRhdGEgYXJndW1lbnRcbiAgICAgIC8vIHVzaW5nIGEgdGV4dCBmcmFtZSBvcGNvZGU7IGlmIHRoZSBkYXRhIGNhbm5vdCBiZSBzZW50LCBlLmcuXG4gICAgICAvLyBiZWNhdXNlIGl0IHdvdWxkIG5lZWQgdG8gYmUgYnVmZmVyZWQgYnV0IHRoZSBidWZmZXIgaXMgZnVsbCxcbiAgICAgIC8vIHRoZSB1c2VyIGFnZW50IG11c3QgZmxhZyB0aGUgV2ViU29ja2V0IGFzIGZ1bGwgYW5kIHRoZW4gY2xvc2VcbiAgICAgIC8vIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbi4gQW55IGludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2l0aCBhXG4gICAgICAvLyBzdHJpbmcgYXJndW1lbnQgdGhhdCBkb2VzIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gbXVzdCBpbmNyZWFzZVxuICAgICAgLy8gdGhlIGJ1ZmZlcmVkQW1vdW50IGF0dHJpYnV0ZSBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0b1xuICAgICAgLy8gZXhwcmVzcyB0aGUgYXJndW1lbnQgYXMgVVRGLTguXG5cbiAgICAgIGNvbnN0IHZhbHVlID0gQnVmZmVyLmZyb20oZGF0YSlcbiAgICAgIGNvbnN0IGZyYW1lID0gbmV3IFdlYnNvY2tldEZyYW1lU2VuZCh2YWx1ZSlcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IGZyYW1lLmNyZWF0ZUZyYW1lKG9wY29kZXMuVEVYVClcblxuICAgICAgdGhpcy4jYnVmZmVyZWRBbW91bnQgKz0gdmFsdWUuYnl0ZUxlbmd0aFxuICAgICAgc29ja2V0LndyaXRlKGJ1ZmZlciwgKCkgPT4ge1xuICAgICAgICB0aGlzLiNidWZmZXJlZEFtb3VudCAtPSB2YWx1ZS5ieXRlTGVuZ3RoXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAodHlwZXMuaXNBcnJheUJ1ZmZlcihkYXRhKSkge1xuICAgICAgLy8gSWYgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLCBhbmQgdGhlIFdlYlNvY2tldFxuICAgICAgLy8gY2xvc2luZyBoYW5kc2hha2UgaGFzIG5vdCB5ZXQgc3RhcnRlZCwgdGhlbiB0aGUgdXNlciBhZ2VudCBtdXN0XG4gICAgICAvLyBzZW5kIGEgV2ViU29ja2V0IE1lc3NhZ2UgY29tcHJpc2VkIG9mIGRhdGEgdXNpbmcgYSBiaW5hcnkgZnJhbWVcbiAgICAgIC8vIG9wY29kZTsgaWYgdGhlIGRhdGEgY2Fubm90IGJlIHNlbnQsIGUuZy4gYmVjYXVzZSBpdCB3b3VsZCBuZWVkXG4gICAgICAvLyB0byBiZSBidWZmZXJlZCBidXQgdGhlIGJ1ZmZlciBpcyBmdWxsLCB0aGUgdXNlciBhZ2VudCBtdXN0IGZsYWdcbiAgICAgIC8vIHRoZSBXZWJTb2NrZXQgYXMgZnVsbCBhbmQgdGhlbiBjbG9zZSB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gICAgICAvLyBUaGUgZGF0YSB0byBiZSBzZW50IGlzIHRoZSBkYXRhIHN0b3JlZCBpbiB0aGUgYnVmZmVyIGRlc2NyaWJlZFxuICAgICAgLy8gYnkgdGhlIEFycmF5QnVmZmVyIG9iamVjdC4gQW55IGludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2l0aCBhblxuICAgICAgLy8gQXJyYXlCdWZmZXIgYXJndW1lbnQgdGhhdCBkb2VzIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gbXVzdFxuICAgICAgLy8gaW5jcmVhc2UgdGhlIGJ1ZmZlcmVkQW1vdW50IGF0dHJpYnV0ZSBieSB0aGUgbGVuZ3RoIG9mIHRoZVxuICAgICAgLy8gQXJyYXlCdWZmZXIgaW4gYnl0ZXMuXG5cbiAgICAgIGNvbnN0IHZhbHVlID0gQnVmZmVyLmZyb20oZGF0YSlcbiAgICAgIGNvbnN0IGZyYW1lID0gbmV3IFdlYnNvY2tldEZyYW1lU2VuZCh2YWx1ZSlcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IGZyYW1lLmNyZWF0ZUZyYW1lKG9wY29kZXMuQklOQVJZKVxuXG4gICAgICB0aGlzLiNidWZmZXJlZEFtb3VudCArPSB2YWx1ZS5ieXRlTGVuZ3RoXG4gICAgICBzb2NrZXQud3JpdGUoYnVmZmVyLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuI2J1ZmZlcmVkQW1vdW50IC09IHZhbHVlLmJ5dGVMZW5ndGhcbiAgICAgIH0pXG4gICAgfSBlbHNlIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoZGF0YSkpIHtcbiAgICAgIC8vIElmIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCwgYW5kIHRoZSBXZWJTb2NrZXRcbiAgICAgIC8vIGNsb3NpbmcgaGFuZHNoYWtlIGhhcyBub3QgeWV0IHN0YXJ0ZWQsIHRoZW4gdGhlIHVzZXIgYWdlbnQgbXVzdFxuICAgICAgLy8gc2VuZCBhIFdlYlNvY2tldCBNZXNzYWdlIGNvbXByaXNlZCBvZiBkYXRhIHVzaW5nIGEgYmluYXJ5IGZyYW1lXG4gICAgICAvLyBvcGNvZGU7IGlmIHRoZSBkYXRhIGNhbm5vdCBiZSBzZW50LCBlLmcuIGJlY2F1c2UgaXQgd291bGQgbmVlZCB0b1xuICAgICAgLy8gYmUgYnVmZmVyZWQgYnV0IHRoZSBidWZmZXIgaXMgZnVsbCwgdGhlIHVzZXIgYWdlbnQgbXVzdCBmbGFnIHRoZVxuICAgICAgLy8gV2ViU29ja2V0IGFzIGZ1bGwgYW5kIHRoZW4gY2xvc2UgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uLiBUaGVcbiAgICAgIC8vIGRhdGEgdG8gYmUgc2VudCBpcyB0aGUgZGF0YSBzdG9yZWQgaW4gdGhlIHNlY3Rpb24gb2YgdGhlIGJ1ZmZlclxuICAgICAgLy8gZGVzY3JpYmVkIGJ5IHRoZSBBcnJheUJ1ZmZlciBvYmplY3QgdGhhdCBkYXRhIHJlZmVyZW5jZXMuIEFueVxuICAgICAgLy8gaW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aXRoIHRoaXMga2luZCBvZiBhcmd1bWVudCB0aGF0IGRvZXNcbiAgICAgIC8vIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gbXVzdCBpbmNyZWFzZSB0aGUgYnVmZmVyZWRBbW91bnQgYXR0cmlidXRlXG4gICAgICAvLyBieSB0aGUgbGVuZ3RoIG9mIGRhdGHigJlzIGJ1ZmZlciBpbiBieXRlcy5cblxuICAgICAgY29uc3QgYWIgPSBCdWZmZXIuZnJvbShkYXRhLCBkYXRhLmJ5dGVPZmZzZXQsIGRhdGEuYnl0ZUxlbmd0aClcblxuICAgICAgY29uc3QgZnJhbWUgPSBuZXcgV2Vic29ja2V0RnJhbWVTZW5kKGFiKVxuICAgICAgY29uc3QgYnVmZmVyID0gZnJhbWUuY3JlYXRlRnJhbWUob3Bjb2Rlcy5CSU5BUlkpXG5cbiAgICAgIHRoaXMuI2J1ZmZlcmVkQW1vdW50ICs9IGFiLmJ5dGVMZW5ndGhcbiAgICAgIHNvY2tldC53cml0ZShidWZmZXIsICgpID0+IHtcbiAgICAgICAgdGhpcy4jYnVmZmVyZWRBbW91bnQgLT0gYWIuYnl0ZUxlbmd0aFxuICAgICAgfSlcbiAgICB9IGVsc2UgaWYgKGlzQmxvYkxpa2UoZGF0YSkpIHtcbiAgICAgIC8vIElmIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCwgYW5kIHRoZSBXZWJTb2NrZXRcbiAgICAgIC8vIGNsb3NpbmcgaGFuZHNoYWtlIGhhcyBub3QgeWV0IHN0YXJ0ZWQsIHRoZW4gdGhlIHVzZXIgYWdlbnQgbXVzdFxuICAgICAgLy8gc2VuZCBhIFdlYlNvY2tldCBNZXNzYWdlIGNvbXByaXNlZCBvZiBkYXRhIHVzaW5nIGEgYmluYXJ5IGZyYW1lXG4gICAgICAvLyBvcGNvZGU7IGlmIHRoZSBkYXRhIGNhbm5vdCBiZSBzZW50LCBlLmcuIGJlY2F1c2UgaXQgd291bGQgbmVlZCB0b1xuICAgICAgLy8gYmUgYnVmZmVyZWQgYnV0IHRoZSBidWZmZXIgaXMgZnVsbCwgdGhlIHVzZXIgYWdlbnQgbXVzdCBmbGFnIHRoZVxuICAgICAgLy8gV2ViU29ja2V0IGFzIGZ1bGwgYW5kIHRoZW4gY2xvc2UgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uLiBUaGUgZGF0YVxuICAgICAgLy8gdG8gYmUgc2VudCBpcyB0aGUgcmF3IGRhdGEgcmVwcmVzZW50ZWQgYnkgdGhlIEJsb2Igb2JqZWN0LiBBbnlcbiAgICAgIC8vIGludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2l0aCBhIEJsb2IgYXJndW1lbnQgdGhhdCBkb2VzIG5vdCB0aHJvd1xuICAgICAgLy8gYW4gZXhjZXB0aW9uIG11c3QgaW5jcmVhc2UgdGhlIGJ1ZmZlcmVkQW1vdW50IGF0dHJpYnV0ZSBieSB0aGUgc2l6ZVxuICAgICAgLy8gb2YgdGhlIEJsb2Igb2JqZWN04oCZcyByYXcgZGF0YSwgaW4gYnl0ZXMuXG5cbiAgICAgIGNvbnN0IGZyYW1lID0gbmV3IFdlYnNvY2tldEZyYW1lU2VuZCgpXG5cbiAgICAgIGRhdGEuYXJyYXlCdWZmZXIoKS50aGVuKChhYikgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IEJ1ZmZlci5mcm9tKGFiKVxuICAgICAgICBmcmFtZS5mcmFtZURhdGEgPSB2YWx1ZVxuICAgICAgICBjb25zdCBidWZmZXIgPSBmcmFtZS5jcmVhdGVGcmFtZShvcGNvZGVzLkJJTkFSWSlcblxuICAgICAgICB0aGlzLiNidWZmZXJlZEFtb3VudCArPSB2YWx1ZS5ieXRlTGVuZ3RoXG4gICAgICAgIHNvY2tldC53cml0ZShidWZmZXIsICgpID0+IHtcbiAgICAgICAgICB0aGlzLiNidWZmZXJlZEFtb3VudCAtPSB2YWx1ZS5ieXRlTGVuZ3RoXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGdldCByZWFkeVN0YXRlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICAvLyBUaGUgcmVhZHlTdGF0ZSBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlzJ3MgcmVhZHkgc3RhdGUuXG4gICAgcmV0dXJuIHRoaXNba1JlYWR5U3RhdGVdXG4gIH1cblxuICBnZXQgYnVmZmVyZWRBbW91bnQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIHJldHVybiB0aGlzLiNidWZmZXJlZEFtb3VudFxuICB9XG5cbiAgZ2V0IHVybCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgLy8gVGhlIHVybCBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlzJ3MgdXJsLCBzZXJpYWxpemVkLlxuICAgIHJldHVybiBVUkxTZXJpYWxpemVyKHRoaXNba1dlYlNvY2tldFVSTF0pXG4gIH1cblxuICBnZXQgZXh0ZW5zaW9ucyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V4dGVuc2lvbnNcbiAgfVxuXG4gIGdldCBwcm90b2NvbCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgcmV0dXJuIHRoaXMuI3Byb3RvY29sXG4gIH1cblxuICBnZXQgb25vcGVuICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRzLm9wZW5cbiAgfVxuXG4gIHNldCBvbm9wZW4gKGZuKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgaWYgKHRoaXMuI2V2ZW50cy5vcGVuKSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29wZW4nLCB0aGlzLiNldmVudHMub3BlbilcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLiNldmVudHMub3BlbiA9IGZuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jZXZlbnRzLm9wZW4gPSBudWxsXG4gICAgfVxuICB9XG5cbiAgZ2V0IG9uZXJyb3IgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIHJldHVybiB0aGlzLiNldmVudHMuZXJyb3JcbiAgfVxuXG4gIHNldCBvbmVycm9yIChmbikge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIGlmICh0aGlzLiNldmVudHMuZXJyb3IpIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCB0aGlzLiNldmVudHMuZXJyb3IpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy4jZXZlbnRzLmVycm9yID0gZm5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jZXZlbnRzLmVycm9yID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGdldCBvbmNsb3NlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRzLmNsb3NlXG4gIH1cblxuICBzZXQgb25jbG9zZSAoZm4pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICBpZiAodGhpcy4jZXZlbnRzLmNsb3NlKSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgdGhpcy4jZXZlbnRzLmNsb3NlKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuI2V2ZW50cy5jbG9zZSA9IGZuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgZm4pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuI2V2ZW50cy5jbG9zZSA9IG51bGxcbiAgICB9XG4gIH1cblxuICBnZXQgb25tZXNzYWdlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRzLm1lc3NhZ2VcbiAgfVxuXG4gIHNldCBvbm1lc3NhZ2UgKGZuKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgaWYgKHRoaXMuI2V2ZW50cy5tZXNzYWdlKSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLiNldmVudHMubWVzc2FnZSlcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLiNldmVudHMubWVzc2FnZSA9IGZuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jZXZlbnRzLm1lc3NhZ2UgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgZ2V0IGJpbmFyeVR5cGUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIHJldHVybiB0aGlzW2tCaW5hcnlUeXBlXVxuICB9XG5cbiAgc2V0IGJpbmFyeVR5cGUgKHR5cGUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICBpZiAodHlwZSAhPT0gJ2Jsb2InICYmIHR5cGUgIT09ICdhcnJheWJ1ZmZlcicpIHtcbiAgICAgIHRoaXNba0JpbmFyeVR5cGVdID0gJ2Jsb2InXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNba0JpbmFyeVR5cGVdID0gdHlwZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vd2Vic29ja2V0cy5zcGVjLndoYXR3Zy5vcmcvI2ZlZWRiYWNrLWZyb20tdGhlLXByb3RvY29sXG4gICAqL1xuICAjb25Db25uZWN0aW9uRXN0YWJsaXNoZWQgKHJlc3BvbnNlKSB7XG4gICAgLy8gcHJvY2Vzc1Jlc3BvbnNlIGlzIGNhbGxlZCB3aGVuIHRoZSBcInJlc3BvbnNl4oCZcyBoZWFkZXIgbGlzdCBoYXMgYmVlbiByZWNlaXZlZCBhbmQgaW5pdGlhbGl6ZWQuXCJcbiAgICAvLyBvbmNlIHRoaXMgaGFwcGVucywgdGhlIGNvbm5lY3Rpb24gaXMgb3BlblxuICAgIHRoaXNba1Jlc3BvbnNlXSA9IHJlc3BvbnNlXG5cbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgQnl0ZVBhcnNlcih0aGlzKVxuICAgIHBhcnNlci5vbignZHJhaW4nLCBmdW5jdGlvbiBvblBhcnNlckRyYWluICgpIHtcbiAgICAgIHRoaXMud3Nba1Jlc3BvbnNlXS5zb2NrZXQucmVzdW1lKClcbiAgICB9KVxuXG4gICAgcmVzcG9uc2Uuc29ja2V0LndzID0gdGhpc1xuICAgIHRoaXNba0J5dGVQYXJzZXJdID0gcGFyc2VyXG5cbiAgICAvLyAxLiBDaGFuZ2UgdGhlIHJlYWR5IHN0YXRlIHRvIE9QRU4gKDEpLlxuICAgIHRoaXNba1JlYWR5U3RhdGVdID0gc3RhdGVzLk9QRU5cblxuICAgIC8vIDIuIENoYW5nZSB0aGUgZXh0ZW5zaW9ucyBhdHRyaWJ1dGXigJlzIHZhbHVlIHRvIHRoZSBleHRlbnNpb25zIGluIHVzZSwgaWZcbiAgICAvLyAgICBpdCBpcyBub3QgdGhlIG51bGwgdmFsdWUuXG4gICAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM2NDU1I3NlY3Rpb24tOS4xXG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IHJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgnc2VjLXdlYnNvY2tldC1leHRlbnNpb25zJylcblxuICAgIGlmIChleHRlbnNpb25zICE9PSBudWxsKSB7XG4gICAgICB0aGlzLiNleHRlbnNpb25zID0gZXh0ZW5zaW9uc1xuICAgIH1cblxuICAgIC8vIDMuIENoYW5nZSB0aGUgcHJvdG9jb2wgYXR0cmlidXRl4oCZcyB2YWx1ZSB0byB0aGUgc3VicHJvdG9jb2wgaW4gdXNlLCBpZlxuICAgIC8vICAgIGl0IGlzIG5vdCB0aGUgbnVsbCB2YWx1ZS5cbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzY0NTUjc2VjdGlvbi0xLjlcbiAgICBjb25zdCBwcm90b2NvbCA9IHJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgnc2VjLXdlYnNvY2tldC1wcm90b2NvbCcpXG5cbiAgICBpZiAocHJvdG9jb2wgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuI3Byb3RvY29sID0gcHJvdG9jb2xcbiAgICB9XG5cbiAgICAvLyA0LiBGaXJlIGFuIGV2ZW50IG5hbWVkIG9wZW4gYXQgdGhlIFdlYlNvY2tldCBvYmplY3QuXG4gICAgZmlyZUV2ZW50KCdvcGVuJywgdGhpcylcbiAgfVxufVxuXG4vLyBodHRwczovL3dlYnNvY2tldHMuc3BlYy53aGF0d2cub3JnLyNkb20td2Vic29ja2V0LWNvbm5lY3RpbmdcbldlYlNvY2tldC5DT05ORUNUSU5HID0gV2ViU29ja2V0LnByb3RvdHlwZS5DT05ORUNUSU5HID0gc3RhdGVzLkNPTk5FQ1RJTkdcbi8vIGh0dHBzOi8vd2Vic29ja2V0cy5zcGVjLndoYXR3Zy5vcmcvI2RvbS13ZWJzb2NrZXQtb3BlblxuV2ViU29ja2V0Lk9QRU4gPSBXZWJTb2NrZXQucHJvdG90eXBlLk9QRU4gPSBzdGF0ZXMuT1BFTlxuLy8gaHR0cHM6Ly93ZWJzb2NrZXRzLnNwZWMud2hhdHdnLm9yZy8jZG9tLXdlYnNvY2tldC1jbG9zaW5nXG5XZWJTb2NrZXQuQ0xPU0lORyA9IFdlYlNvY2tldC5wcm90b3R5cGUuQ0xPU0lORyA9IHN0YXRlcy5DTE9TSU5HXG4vLyBodHRwczovL3dlYnNvY2tldHMuc3BlYy53aGF0d2cub3JnLyNkb20td2Vic29ja2V0LWNsb3NlZFxuV2ViU29ja2V0LkNMT1NFRCA9IFdlYlNvY2tldC5wcm90b3R5cGUuQ0xPU0VEID0gc3RhdGVzLkNMT1NFRFxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhXZWJTb2NrZXQucHJvdG90eXBlLCB7XG4gIENPTk5FQ1RJTkc6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIE9QRU46IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIENMT1NJTkc6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIENMT1NFRDogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgdXJsOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZWFkeVN0YXRlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBidWZmZXJlZEFtb3VudDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgb25vcGVuOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbmVycm9yOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbmNsb3NlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBjbG9zZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgb25tZXNzYWdlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBiaW5hcnlUeXBlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBzZW5kOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBleHRlbnNpb25zOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBwcm90b2NvbDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHtcbiAgICB2YWx1ZTogJ1dlYlNvY2tldCcsXG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9XG59KVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhXZWJTb2NrZXQsIHtcbiAgQ09OTkVDVElORzogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgT1BFTjogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgQ0xPU0lORzogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgQ0xPU0VEOiBzdGF0aWNQcm9wZXJ0eURlc2NyaXB0b3JzXG59KVxuXG53ZWJpZGwuY29udmVydGVyc1snc2VxdWVuY2U8RE9NU3RyaW5nPiddID0gd2ViaWRsLnNlcXVlbmNlQ29udmVydGVyKFxuICB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmdcbilcblxud2ViaWRsLmNvbnZlcnRlcnNbJ0RPTVN0cmluZyBvciBzZXF1ZW5jZTxET01TdHJpbmc+J10gPSBmdW5jdGlvbiAoVikge1xuICBpZiAod2ViaWRsLnV0aWwuVHlwZShWKSA9PT0gJ09iamVjdCcgJiYgU3ltYm9sLml0ZXJhdG9yIGluIFYpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPERPTVN0cmluZz4nXShWKVxuICB9XG5cbiAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyhWKVxufVxuXG4vLyBUaGlzIGltcGxlbWVudHMgdGhlIHByb3BzYWwgbWFkZSBpbiBodHRwczovL2dpdGh1Yi5jb20vd2hhdHdnL3dlYnNvY2tldHMvaXNzdWVzLzQyXG53ZWJpZGwuY29udmVydGVycy5XZWJTb2NrZXRJbml0ID0gd2ViaWRsLmRpY3Rpb25hcnlDb252ZXJ0ZXIoW1xuICB7XG4gICAga2V5OiAncHJvdG9jb2xzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzWydET01TdHJpbmcgb3Igc2VxdWVuY2U8RE9NU3RyaW5nPiddLFxuICAgIGdldCBkZWZhdWx0VmFsdWUgKCkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICB9LFxuICB7XG4gICAga2V5OiAnZGlzcGF0Y2hlcicsXG4gICAgY29udmVydGVyOiAoVikgPT4gVixcbiAgICBnZXQgZGVmYXVsdFZhbHVlICgpIHtcbiAgICAgIHJldHVybiBnZXRHbG9iYWxEaXNwYXRjaGVyKClcbiAgICB9XG4gIH0sXG4gIHtcbiAgICBrZXk6ICdoZWFkZXJzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5udWxsYWJsZUNvbnZlcnRlcih3ZWJpZGwuY29udmVydGVycy5IZWFkZXJzSW5pdClcbiAgfVxuXSlcblxud2ViaWRsLmNvbnZlcnRlcnNbJ0RPTVN0cmluZyBvciBzZXF1ZW5jZTxET01TdHJpbmc+IG9yIFdlYlNvY2tldEluaXQnXSA9IGZ1bmN0aW9uIChWKSB7XG4gIGlmICh3ZWJpZGwudXRpbC5UeXBlKFYpID09PSAnT2JqZWN0JyAmJiAhKFN5bWJvbC5pdGVyYXRvciBpbiBWKSkge1xuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5XZWJTb2NrZXRJbml0KFYpXG4gIH1cblxuICByZXR1cm4geyBwcm90b2NvbHM6IHdlYmlkbC5jb252ZXJ0ZXJzWydET01TdHJpbmcgb3Igc2VxdWVuY2U8RE9NU3RyaW5nPiddKFYpIH1cbn1cblxud2ViaWRsLmNvbnZlcnRlcnMuV2ViU29ja2V0U2VuZERhdGEgPSBmdW5jdGlvbiAoVikge1xuICBpZiAod2ViaWRsLnV0aWwuVHlwZShWKSA9PT0gJ09iamVjdCcpIHtcbiAgICBpZiAoaXNCbG9iTGlrZShWKSkge1xuICAgICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLkJsb2IoViwgeyBzdHJpY3Q6IGZhbHNlIH0pXG4gICAgfVxuXG4gICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhWKSB8fCB0eXBlcy5pc0FueUFycmF5QnVmZmVyKFYpKSB7XG4gICAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuQnVmZmVyU291cmNlKFYpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhWKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgV2ViU29ja2V0XG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgQ2xpZW50ID0gcmVxdWlyZSgnLi9saWIvY2xpZW50JylcbmNvbnN0IERpc3BhdGNoZXIgPSByZXF1aXJlKCcuL2xpYi9kaXNwYXRjaGVyJylcbmNvbnN0IGVycm9ycyA9IHJlcXVpcmUoJy4vbGliL2NvcmUvZXJyb3JzJylcbmNvbnN0IFBvb2wgPSByZXF1aXJlKCcuL2xpYi9wb29sJylcbmNvbnN0IEJhbGFuY2VkUG9vbCA9IHJlcXVpcmUoJy4vbGliL2JhbGFuY2VkLXBvb2wnKVxuY29uc3QgQWdlbnQgPSByZXF1aXJlKCcuL2xpYi9hZ2VudCcpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi9saWIvY29yZS91dGlsJylcbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IGVycm9yc1xuY29uc3QgYXBpID0gcmVxdWlyZSgnLi9saWIvYXBpJylcbmNvbnN0IGJ1aWxkQ29ubmVjdG9yID0gcmVxdWlyZSgnLi9saWIvY29yZS9jb25uZWN0JylcbmNvbnN0IE1vY2tDbGllbnQgPSByZXF1aXJlKCcuL2xpYi9tb2NrL21vY2stY2xpZW50JylcbmNvbnN0IE1vY2tBZ2VudCA9IHJlcXVpcmUoJy4vbGliL21vY2svbW9jay1hZ2VudCcpXG5jb25zdCBNb2NrUG9vbCA9IHJlcXVpcmUoJy4vbGliL21vY2svbW9jay1wb29sJylcbmNvbnN0IG1vY2tFcnJvcnMgPSByZXF1aXJlKCcuL2xpYi9tb2NrL21vY2stZXJyb3JzJylcbmNvbnN0IFByb3h5QWdlbnQgPSByZXF1aXJlKCcuL2xpYi9wcm94eS1hZ2VudCcpXG5jb25zdCBSZXRyeUhhbmRsZXIgPSByZXF1aXJlKCcuL2xpYi9oYW5kbGVyL1JldHJ5SGFuZGxlcicpXG5jb25zdCB7IGdldEdsb2JhbERpc3BhdGNoZXIsIHNldEdsb2JhbERpc3BhdGNoZXIgfSA9IHJlcXVpcmUoJy4vbGliL2dsb2JhbCcpXG5jb25zdCBEZWNvcmF0b3JIYW5kbGVyID0gcmVxdWlyZSgnLi9saWIvaGFuZGxlci9EZWNvcmF0b3JIYW5kbGVyJylcbmNvbnN0IFJlZGlyZWN0SGFuZGxlciA9IHJlcXVpcmUoJy4vbGliL2hhbmRsZXIvUmVkaXJlY3RIYW5kbGVyJylcbmNvbnN0IGNyZWF0ZVJlZGlyZWN0SW50ZXJjZXB0b3IgPSByZXF1aXJlKCcuL2xpYi9pbnRlcmNlcHRvci9yZWRpcmVjdEludGVyY2VwdG9yJylcblxubGV0IGhhc0NyeXB0b1xudHJ5IHtcbiAgcmVxdWlyZSgnY3J5cHRvJylcbiAgaGFzQ3J5cHRvID0gdHJ1ZVxufSBjYXRjaCB7XG4gIGhhc0NyeXB0byA9IGZhbHNlXG59XG5cbk9iamVjdC5hc3NpZ24oRGlzcGF0Y2hlci5wcm90b3R5cGUsIGFwaSlcblxubW9kdWxlLmV4cG9ydHMuRGlzcGF0Y2hlciA9IERpc3BhdGNoZXJcbm1vZHVsZS5leHBvcnRzLkNsaWVudCA9IENsaWVudFxubW9kdWxlLmV4cG9ydHMuUG9vbCA9IFBvb2xcbm1vZHVsZS5leHBvcnRzLkJhbGFuY2VkUG9vbCA9IEJhbGFuY2VkUG9vbFxubW9kdWxlLmV4cG9ydHMuQWdlbnQgPSBBZ2VudFxubW9kdWxlLmV4cG9ydHMuUHJveHlBZ2VudCA9IFByb3h5QWdlbnRcbm1vZHVsZS5leHBvcnRzLlJldHJ5SGFuZGxlciA9IFJldHJ5SGFuZGxlclxuXG5tb2R1bGUuZXhwb3J0cy5EZWNvcmF0b3JIYW5kbGVyID0gRGVjb3JhdG9ySGFuZGxlclxubW9kdWxlLmV4cG9ydHMuUmVkaXJlY3RIYW5kbGVyID0gUmVkaXJlY3RIYW5kbGVyXG5tb2R1bGUuZXhwb3J0cy5jcmVhdGVSZWRpcmVjdEludGVyY2VwdG9yID0gY3JlYXRlUmVkaXJlY3RJbnRlcmNlcHRvclxuXG5tb2R1bGUuZXhwb3J0cy5idWlsZENvbm5lY3RvciA9IGJ1aWxkQ29ubmVjdG9yXG5tb2R1bGUuZXhwb3J0cy5lcnJvcnMgPSBlcnJvcnNcblxuZnVuY3Rpb24gbWFrZURpc3BhdGNoZXIgKGZuKSB7XG4gIHJldHVybiAodXJsLCBvcHRzLCBoYW5kbGVyKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBoYW5kbGVyID0gb3B0c1xuICAgICAgb3B0cyA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAoIXVybCB8fCAodHlwZW9mIHVybCAhPT0gJ3N0cmluZycgJiYgdHlwZW9mIHVybCAhPT0gJ29iamVjdCcgJiYgISh1cmwgaW5zdGFuY2VvZiBVUkwpKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIHVybCcpXG4gICAgfVxuXG4gICAgaWYgKG9wdHMgIT0gbnVsbCAmJiB0eXBlb2Ygb3B0cyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvcHRzJylcbiAgICB9XG5cbiAgICBpZiAob3B0cyAmJiBvcHRzLnBhdGggIT0gbnVsbCkge1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLnBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvcHRzLnBhdGgnKVxuICAgICAgfVxuXG4gICAgICBsZXQgcGF0aCA9IG9wdHMucGF0aFxuICAgICAgaWYgKCFvcHRzLnBhdGguc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgICAgIHBhdGggPSBgLyR7cGF0aH1gXG4gICAgICB9XG5cbiAgICAgIHVybCA9IG5ldyBVUkwodXRpbC5wYXJzZU9yaWdpbih1cmwpLm9yaWdpbiArIHBhdGgpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghb3B0cykge1xuICAgICAgICBvcHRzID0gdHlwZW9mIHVybCA9PT0gJ29iamVjdCcgPyB1cmwgOiB7fVxuICAgICAgfVxuXG4gICAgICB1cmwgPSB1dGlsLnBhcnNlVVJMKHVybClcbiAgICB9XG5cbiAgICBjb25zdCB7IGFnZW50LCBkaXNwYXRjaGVyID0gZ2V0R2xvYmFsRGlzcGF0Y2hlcigpIH0gPSBvcHRzXG5cbiAgICBpZiAoYWdlbnQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcigndW5zdXBwb3J0ZWQgb3B0cy5hZ2VudC4gRGlkIHlvdSBtZWFuIG9wdHMuY2xpZW50PycpXG4gICAgfVxuXG4gICAgcmV0dXJuIGZuLmNhbGwoZGlzcGF0Y2hlciwge1xuICAgICAgLi4ub3B0cyxcbiAgICAgIG9yaWdpbjogdXJsLm9yaWdpbixcbiAgICAgIHBhdGg6IHVybC5zZWFyY2ggPyBgJHt1cmwucGF0aG5hbWV9JHt1cmwuc2VhcmNofWAgOiB1cmwucGF0aG5hbWUsXG4gICAgICBtZXRob2Q6IG9wdHMubWV0aG9kIHx8IChvcHRzLmJvZHkgPyAnUFVUJyA6ICdHRVQnKVxuICAgIH0sIGhhbmRsZXIpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMuc2V0R2xvYmFsRGlzcGF0Y2hlciA9IHNldEdsb2JhbERpc3BhdGNoZXJcbm1vZHVsZS5leHBvcnRzLmdldEdsb2JhbERpc3BhdGNoZXIgPSBnZXRHbG9iYWxEaXNwYXRjaGVyXG5cbmlmICh1dGlsLm5vZGVNYWpvciA+IDE2IHx8ICh1dGlsLm5vZGVNYWpvciA9PT0gMTYgJiYgdXRpbC5ub2RlTWlub3IgPj0gOCkpIHtcbiAgbGV0IGZldGNoSW1wbCA9IG51bGxcbiAgbW9kdWxlLmV4cG9ydHMuZmV0Y2ggPSBhc3luYyBmdW5jdGlvbiBmZXRjaCAocmVzb3VyY2UpIHtcbiAgICBpZiAoIWZldGNoSW1wbCkge1xuICAgICAgZmV0Y2hJbXBsID0gcmVxdWlyZSgnLi9saWIvZmV0Y2gnKS5mZXRjaFxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZmV0Y2hJbXBsKC4uLmFyZ3VtZW50cylcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmICh0eXBlb2YgZXJyID09PSAnb2JqZWN0Jykge1xuICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnIsIHRoaXMpXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgfVxuICBtb2R1bGUuZXhwb3J0cy5IZWFkZXJzID0gcmVxdWlyZSgnLi9saWIvZmV0Y2gvaGVhZGVycycpLkhlYWRlcnNcbiAgbW9kdWxlLmV4cG9ydHMuUmVzcG9uc2UgPSByZXF1aXJlKCcuL2xpYi9mZXRjaC9yZXNwb25zZScpLlJlc3BvbnNlXG4gIG1vZHVsZS5leHBvcnRzLlJlcXVlc3QgPSByZXF1aXJlKCcuL2xpYi9mZXRjaC9yZXF1ZXN0JykuUmVxdWVzdFxuICBtb2R1bGUuZXhwb3J0cy5Gb3JtRGF0YSA9IHJlcXVpcmUoJy4vbGliL2ZldGNoL2Zvcm1kYXRhJykuRm9ybURhdGFcbiAgbW9kdWxlLmV4cG9ydHMuRmlsZSA9IHJlcXVpcmUoJy4vbGliL2ZldGNoL2ZpbGUnKS5GaWxlXG4gIG1vZHVsZS5leHBvcnRzLkZpbGVSZWFkZXIgPSByZXF1aXJlKCcuL2xpYi9maWxlYXBpL2ZpbGVyZWFkZXInKS5GaWxlUmVhZGVyXG5cbiAgY29uc3QgeyBzZXRHbG9iYWxPcmlnaW4sIGdldEdsb2JhbE9yaWdpbiB9ID0gcmVxdWlyZSgnLi9saWIvZmV0Y2gvZ2xvYmFsJylcblxuICBtb2R1bGUuZXhwb3J0cy5zZXRHbG9iYWxPcmlnaW4gPSBzZXRHbG9iYWxPcmlnaW5cbiAgbW9kdWxlLmV4cG9ydHMuZ2V0R2xvYmFsT3JpZ2luID0gZ2V0R2xvYmFsT3JpZ2luXG5cbiAgY29uc3QgeyBDYWNoZVN0b3JhZ2UgfSA9IHJlcXVpcmUoJy4vbGliL2NhY2hlL2NhY2hlc3RvcmFnZScpXG4gIGNvbnN0IHsga0NvbnN0cnVjdCB9ID0gcmVxdWlyZSgnLi9saWIvY2FjaGUvc3ltYm9scycpXG5cbiAgLy8gQ2FjaGUgJiBDYWNoZVN0b3JhZ2UgYXJlIHRpZ2h0bHkgY291cGxlZCB3aXRoIGZldGNoLiBFdmVuIGlmIGl0IG1heSBydW5cbiAgLy8gaW4gYW4gb2xkZXIgdmVyc2lvbiBvZiBOb2RlLCBpdCBkb2Vzbid0IGhhdmUgYW55IHVzZSB3aXRob3V0IGZldGNoLlxuICBtb2R1bGUuZXhwb3J0cy5jYWNoZXMgPSBuZXcgQ2FjaGVTdG9yYWdlKGtDb25zdHJ1Y3QpXG59XG5cbmlmICh1dGlsLm5vZGVNYWpvciA+PSAxNikge1xuICBjb25zdCB7IGRlbGV0ZUNvb2tpZSwgZ2V0Q29va2llcywgZ2V0U2V0Q29va2llcywgc2V0Q29va2llIH0gPSByZXF1aXJlKCcuL2xpYi9jb29raWVzJylcblxuICBtb2R1bGUuZXhwb3J0cy5kZWxldGVDb29raWUgPSBkZWxldGVDb29raWVcbiAgbW9kdWxlLmV4cG9ydHMuZ2V0Q29va2llcyA9IGdldENvb2tpZXNcbiAgbW9kdWxlLmV4cG9ydHMuZ2V0U2V0Q29va2llcyA9IGdldFNldENvb2tpZXNcbiAgbW9kdWxlLmV4cG9ydHMuc2V0Q29va2llID0gc2V0Q29va2llXG5cbiAgY29uc3QgeyBwYXJzZU1JTUVUeXBlLCBzZXJpYWxpemVBTWltZVR5cGUgfSA9IHJlcXVpcmUoJy4vbGliL2ZldGNoL2RhdGFVUkwnKVxuXG4gIG1vZHVsZS5leHBvcnRzLnBhcnNlTUlNRVR5cGUgPSBwYXJzZU1JTUVUeXBlXG4gIG1vZHVsZS5leHBvcnRzLnNlcmlhbGl6ZUFNaW1lVHlwZSA9IHNlcmlhbGl6ZUFNaW1lVHlwZVxufVxuXG5pZiAodXRpbC5ub2RlTWFqb3IgPj0gMTggJiYgaGFzQ3J5cHRvKSB7XG4gIGNvbnN0IHsgV2ViU29ja2V0IH0gPSByZXF1aXJlKCcuL2xpYi93ZWJzb2NrZXQvd2Vic29ja2V0JylcblxuICBtb2R1bGUuZXhwb3J0cy5XZWJTb2NrZXQgPSBXZWJTb2NrZXRcbn1cblxubW9kdWxlLmV4cG9ydHMucmVxdWVzdCA9IG1ha2VEaXNwYXRjaGVyKGFwaS5yZXF1ZXN0KVxubW9kdWxlLmV4cG9ydHMuc3RyZWFtID0gbWFrZURpc3BhdGNoZXIoYXBpLnN0cmVhbSlcbm1vZHVsZS5leHBvcnRzLnBpcGVsaW5lID0gbWFrZURpc3BhdGNoZXIoYXBpLnBpcGVsaW5lKVxubW9kdWxlLmV4cG9ydHMuY29ubmVjdCA9IG1ha2VEaXNwYXRjaGVyKGFwaS5jb25uZWN0KVxubW9kdWxlLmV4cG9ydHMudXBncmFkZSA9IG1ha2VEaXNwYXRjaGVyKGFwaS51cGdyYWRlKVxuXG5tb2R1bGUuZXhwb3J0cy5Nb2NrQ2xpZW50ID0gTW9ja0NsaWVudFxubW9kdWxlLmV4cG9ydHMuTW9ja1Bvb2wgPSBNb2NrUG9vbFxubW9kdWxlLmV4cG9ydHMuTW9ja0FnZW50ID0gTW9ja0FnZW50XG5tb2R1bGUuZXhwb3J0cy5tb2NrRXJyb3JzID0gbW9ja0Vycm9yc1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5IdHRwQ2xpZW50ID0gZXhwb3J0cy5pc0h0dHBzID0gZXhwb3J0cy5IdHRwQ2xpZW50UmVzcG9uc2UgPSBleHBvcnRzLkh0dHBDbGllbnRFcnJvciA9IGV4cG9ydHMuZ2V0UHJveHlVcmwgPSBleHBvcnRzLk1lZGlhVHlwZXMgPSBleHBvcnRzLkhlYWRlcnMgPSBleHBvcnRzLkh0dHBDb2RlcyA9IHZvaWQgMDtcbmNvbnN0IGh0dHAgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcImh0dHBcIikpO1xuY29uc3QgaHR0cHMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcImh0dHBzXCIpKTtcbmNvbnN0IHBtID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL3Byb3h5XCIpKTtcbmNvbnN0IHR1bm5lbCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwidHVubmVsXCIpKTtcbmNvbnN0IHVuZGljaV8xID0gcmVxdWlyZShcInVuZGljaVwiKTtcbnZhciBIdHRwQ29kZXM7XG4oZnVuY3Rpb24gKEh0dHBDb2Rlcykge1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJPS1wiXSA9IDIwMF0gPSBcIk9LXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIk11bHRpcGxlQ2hvaWNlc1wiXSA9IDMwMF0gPSBcIk11bHRpcGxlQ2hvaWNlc1wiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJNb3ZlZFBlcm1hbmVudGx5XCJdID0gMzAxXSA9IFwiTW92ZWRQZXJtYW5lbnRseVwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJSZXNvdXJjZU1vdmVkXCJdID0gMzAyXSA9IFwiUmVzb3VyY2VNb3ZlZFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJTZWVPdGhlclwiXSA9IDMwM10gPSBcIlNlZU90aGVyXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIk5vdE1vZGlmaWVkXCJdID0gMzA0XSA9IFwiTm90TW9kaWZpZWRcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiVXNlUHJveHlcIl0gPSAzMDVdID0gXCJVc2VQcm94eVwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJTd2l0Y2hQcm94eVwiXSA9IDMwNl0gPSBcIlN3aXRjaFByb3h5XCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIlRlbXBvcmFyeVJlZGlyZWN0XCJdID0gMzA3XSA9IFwiVGVtcG9yYXJ5UmVkaXJlY3RcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiUGVybWFuZW50UmVkaXJlY3RcIl0gPSAzMDhdID0gXCJQZXJtYW5lbnRSZWRpcmVjdFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJCYWRSZXF1ZXN0XCJdID0gNDAwXSA9IFwiQmFkUmVxdWVzdFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJVbmF1dGhvcml6ZWRcIl0gPSA0MDFdID0gXCJVbmF1dGhvcml6ZWRcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiUGF5bWVudFJlcXVpcmVkXCJdID0gNDAyXSA9IFwiUGF5bWVudFJlcXVpcmVkXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIkZvcmJpZGRlblwiXSA9IDQwM10gPSBcIkZvcmJpZGRlblwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJOb3RGb3VuZFwiXSA9IDQwNF0gPSBcIk5vdEZvdW5kXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIk1ldGhvZE5vdEFsbG93ZWRcIl0gPSA0MDVdID0gXCJNZXRob2ROb3RBbGxvd2VkXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIk5vdEFjY2VwdGFibGVcIl0gPSA0MDZdID0gXCJOb3RBY2NlcHRhYmxlXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIlByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZFwiXSA9IDQwN10gPSBcIlByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJSZXF1ZXN0VGltZW91dFwiXSA9IDQwOF0gPSBcIlJlcXVlc3RUaW1lb3V0XCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIkNvbmZsaWN0XCJdID0gNDA5XSA9IFwiQ29uZmxpY3RcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiR29uZVwiXSA9IDQxMF0gPSBcIkdvbmVcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiVG9vTWFueVJlcXVlc3RzXCJdID0gNDI5XSA9IFwiVG9vTWFueVJlcXVlc3RzXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIkludGVybmFsU2VydmVyRXJyb3JcIl0gPSA1MDBdID0gXCJJbnRlcm5hbFNlcnZlckVycm9yXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIk5vdEltcGxlbWVudGVkXCJdID0gNTAxXSA9IFwiTm90SW1wbGVtZW50ZWRcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiQmFkR2F0ZXdheVwiXSA9IDUwMl0gPSBcIkJhZEdhdGV3YXlcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiU2VydmljZVVuYXZhaWxhYmxlXCJdID0gNTAzXSA9IFwiU2VydmljZVVuYXZhaWxhYmxlXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIkdhdGV3YXlUaW1lb3V0XCJdID0gNTA0XSA9IFwiR2F0ZXdheVRpbWVvdXRcIjtcbn0pKEh0dHBDb2RlcyB8fCAoZXhwb3J0cy5IdHRwQ29kZXMgPSBIdHRwQ29kZXMgPSB7fSkpO1xudmFyIEhlYWRlcnM7XG4oZnVuY3Rpb24gKEhlYWRlcnMpIHtcbiAgICBIZWFkZXJzW1wiQWNjZXB0XCJdID0gXCJhY2NlcHRcIjtcbiAgICBIZWFkZXJzW1wiQ29udGVudFR5cGVcIl0gPSBcImNvbnRlbnQtdHlwZVwiO1xufSkoSGVhZGVycyB8fCAoZXhwb3J0cy5IZWFkZXJzID0gSGVhZGVycyA9IHt9KSk7XG52YXIgTWVkaWFUeXBlcztcbihmdW5jdGlvbiAoTWVkaWFUeXBlcykge1xuICAgIE1lZGlhVHlwZXNbXCJBcHBsaWNhdGlvbkpzb25cIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbn0pKE1lZGlhVHlwZXMgfHwgKGV4cG9ydHMuTWVkaWFUeXBlcyA9IE1lZGlhVHlwZXMgPSB7fSkpO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBwcm94eSBVUkwsIGRlcGVuZGluZyB1cG9uIHRoZSBzdXBwbGllZCB1cmwgYW5kIHByb3h5IGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqIEBwYXJhbSBzZXJ2ZXJVcmwgIFRoZSBzZXJ2ZXIgVVJMIHdoZXJlIHRoZSByZXF1ZXN0IHdpbGwgYmUgc2VudC4gRm9yIGV4YW1wbGUsIGh0dHBzOi8vYXBpLmdpdGh1Yi5jb21cbiAqL1xuZnVuY3Rpb24gZ2V0UHJveHlVcmwoc2VydmVyVXJsKSB7XG4gICAgY29uc3QgcHJveHlVcmwgPSBwbS5nZXRQcm94eVVybChuZXcgVVJMKHNlcnZlclVybCkpO1xuICAgIHJldHVybiBwcm94eVVybCA/IHByb3h5VXJsLmhyZWYgOiAnJztcbn1cbmV4cG9ydHMuZ2V0UHJveHlVcmwgPSBnZXRQcm94eVVybDtcbmNvbnN0IEh0dHBSZWRpcmVjdENvZGVzID0gW1xuICAgIEh0dHBDb2Rlcy5Nb3ZlZFBlcm1hbmVudGx5LFxuICAgIEh0dHBDb2Rlcy5SZXNvdXJjZU1vdmVkLFxuICAgIEh0dHBDb2Rlcy5TZWVPdGhlcixcbiAgICBIdHRwQ29kZXMuVGVtcG9yYXJ5UmVkaXJlY3QsXG4gICAgSHR0cENvZGVzLlBlcm1hbmVudFJlZGlyZWN0XG5dO1xuY29uc3QgSHR0cFJlc3BvbnNlUmV0cnlDb2RlcyA9IFtcbiAgICBIdHRwQ29kZXMuQmFkR2F0ZXdheSxcbiAgICBIdHRwQ29kZXMuU2VydmljZVVuYXZhaWxhYmxlLFxuICAgIEh0dHBDb2Rlcy5HYXRld2F5VGltZW91dFxuXTtcbmNvbnN0IFJldHJ5YWJsZUh0dHBWZXJicyA9IFsnT1BUSU9OUycsICdHRVQnLCAnREVMRVRFJywgJ0hFQUQnXTtcbmNvbnN0IEV4cG9uZW50aWFsQmFja29mZkNlaWxpbmcgPSAxMDtcbmNvbnN0IEV4cG9uZW50aWFsQmFja29mZlRpbWVTbGljZSA9IDU7XG5jbGFzcyBIdHRwQ2xpZW50RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgc3RhdHVzQ29kZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5uYW1lID0gJ0h0dHBDbGllbnRFcnJvcic7XG4gICAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBIdHRwQ2xpZW50RXJyb3IucHJvdG90eXBlKTtcbiAgICB9XG59XG5leHBvcnRzLkh0dHBDbGllbnRFcnJvciA9IEh0dHBDbGllbnRFcnJvcjtcbmNsYXNzIEh0dHBDbGllbnRSZXNwb25zZSB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIH1cbiAgICByZWFkQm9keSgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGxldCBvdXRwdXQgPSBCdWZmZXIuYWxsb2MoMCk7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlLm9uKCdkYXRhJywgKGNodW5rKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEJ1ZmZlci5jb25jYXQoW291dHB1dCwgY2h1bmtdKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2Uub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShvdXRwdXQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZWFkQm9keUJ1ZmZlcigpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rcyA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZS5vbignZGF0YScsIChjaHVuaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoQnVmZmVyLmNvbmNhdChjaHVua3MpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5IdHRwQ2xpZW50UmVzcG9uc2UgPSBIdHRwQ2xpZW50UmVzcG9uc2U7XG5mdW5jdGlvbiBpc0h0dHBzKHJlcXVlc3RVcmwpIHtcbiAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHJlcXVlc3RVcmwpO1xuICAgIHJldHVybiBwYXJzZWRVcmwucHJvdG9jb2wgPT09ICdodHRwczonO1xufVxuZXhwb3J0cy5pc0h0dHBzID0gaXNIdHRwcztcbmNsYXNzIEh0dHBDbGllbnQge1xuICAgIGNvbnN0cnVjdG9yKHVzZXJBZ2VudCwgaGFuZGxlcnMsIHJlcXVlc3RPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX2lnbm9yZVNzbEVycm9yID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2FsbG93UmVkaXJlY3RzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fYWxsb3dSZWRpcmVjdERvd25ncmFkZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9tYXhSZWRpcmVjdHMgPSA1MDtcbiAgICAgICAgdGhpcy5fYWxsb3dSZXRyaWVzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX21heFJldHJpZXMgPSAxO1xuICAgICAgICB0aGlzLl9rZWVwQWxpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZGlzcG9zZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy51c2VyQWdlbnQgPSB1c2VyQWdlbnQ7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSBoYW5kbGVycyB8fCBbXTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0T3B0aW9ucyA9IHJlcXVlc3RPcHRpb25zO1xuICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5pZ25vcmVTc2xFcnJvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faWdub3JlU3NsRXJyb3IgPSByZXF1ZXN0T3B0aW9ucy5pZ25vcmVTc2xFcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3NvY2tldFRpbWVvdXQgPSByZXF1ZXN0T3B0aW9ucy5zb2NrZXRUaW1lb3V0O1xuICAgICAgICAgICAgaWYgKHJlcXVlc3RPcHRpb25zLmFsbG93UmVkaXJlY3RzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hbGxvd1JlZGlyZWN0cyA9IHJlcXVlc3RPcHRpb25zLmFsbG93UmVkaXJlY3RzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlcXVlc3RPcHRpb25zLmFsbG93UmVkaXJlY3REb3duZ3JhZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FsbG93UmVkaXJlY3REb3duZ3JhZGUgPSByZXF1ZXN0T3B0aW9ucy5hbGxvd1JlZGlyZWN0RG93bmdyYWRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlcXVlc3RPcHRpb25zLm1heFJlZGlyZWN0cyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4UmVkaXJlY3RzID0gTWF0aC5tYXgocmVxdWVzdE9wdGlvbnMubWF4UmVkaXJlY3RzLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5rZWVwQWxpdmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2tlZXBBbGl2ZSA9IHJlcXVlc3RPcHRpb25zLmtlZXBBbGl2ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5hbGxvd1JldHJpZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FsbG93UmV0cmllcyA9IHJlcXVlc3RPcHRpb25zLmFsbG93UmV0cmllcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5tYXhSZXRyaWVzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhSZXRyaWVzID0gcmVxdWVzdE9wdGlvbnMubWF4UmV0cmllcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBvcHRpb25zKHJlcXVlc3RVcmwsIGFkZGl0aW9uYWxIZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdPUFRJT05TJywgcmVxdWVzdFVybCwgbnVsbCwgYWRkaXRpb25hbEhlYWRlcnMgfHwge30pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0KHJlcXVlc3RVcmwsIGFkZGl0aW9uYWxIZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdHRVQnLCByZXF1ZXN0VXJsLCBudWxsLCBhZGRpdGlvbmFsSGVhZGVycyB8fCB7fSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkZWwocmVxdWVzdFVybCwgYWRkaXRpb25hbEhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0RFTEVURScsIHJlcXVlc3RVcmwsIG51bGwsIGFkZGl0aW9uYWxIZWFkZXJzIHx8IHt9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBvc3QocmVxdWVzdFVybCwgZGF0YSwgYWRkaXRpb25hbEhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ1BPU1QnLCByZXF1ZXN0VXJsLCBkYXRhLCBhZGRpdGlvbmFsSGVhZGVycyB8fCB7fSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwYXRjaChyZXF1ZXN0VXJsLCBkYXRhLCBhZGRpdGlvbmFsSGVhZGVycykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnUEFUQ0gnLCByZXF1ZXN0VXJsLCBkYXRhLCBhZGRpdGlvbmFsSGVhZGVycyB8fCB7fSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdXQocmVxdWVzdFVybCwgZGF0YSwgYWRkaXRpb25hbEhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ1BVVCcsIHJlcXVlc3RVcmwsIGRhdGEsIGFkZGl0aW9uYWxIZWFkZXJzIHx8IHt9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGhlYWQocmVxdWVzdFVybCwgYWRkaXRpb25hbEhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0hFQUQnLCByZXF1ZXN0VXJsLCBudWxsLCBhZGRpdGlvbmFsSGVhZGVycyB8fCB7fSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzZW5kU3RyZWFtKHZlcmIsIHJlcXVlc3RVcmwsIHN0cmVhbSwgYWRkaXRpb25hbEhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QodmVyYiwgcmVxdWVzdFVybCwgc3RyZWFtLCBhZGRpdGlvbmFsSGVhZGVycyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgdHlwZWQgb2JqZWN0IGZyb20gYW4gZW5kcG9pbnRcbiAgICAgKiBCZSBhd2FyZSB0aGF0IG5vdCBmb3VuZCByZXR1cm5zIGEgbnVsbC4gIE90aGVyIGVycm9ycyAoNHh4LCA1eHgpIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAqL1xuICAgIGdldEpzb24ocmVxdWVzdFVybCwgYWRkaXRpb25hbEhlYWRlcnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgYWRkaXRpb25hbEhlYWRlcnNbSGVhZGVycy5BY2NlcHRdID0gdGhpcy5fZ2V0RXhpc3RpbmdPckRlZmF1bHRIZWFkZXIoYWRkaXRpb25hbEhlYWRlcnMsIEhlYWRlcnMuQWNjZXB0LCBNZWRpYVR5cGVzLkFwcGxpY2F0aW9uSnNvbik7XG4gICAgICAgICAgICBjb25zdCByZXMgPSB5aWVsZCB0aGlzLmdldChyZXF1ZXN0VXJsLCBhZGRpdGlvbmFsSGVhZGVycyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1Jlc3BvbnNlKHJlcywgdGhpcy5yZXF1ZXN0T3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwb3N0SnNvbihyZXF1ZXN0VXJsLCBvYmosIGFkZGl0aW9uYWxIZWFkZXJzID0ge30pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnN0cmluZ2lmeShvYmosIG51bGwsIDIpO1xuICAgICAgICAgICAgYWRkaXRpb25hbEhlYWRlcnNbSGVhZGVycy5BY2NlcHRdID0gdGhpcy5fZ2V0RXhpc3RpbmdPckRlZmF1bHRIZWFkZXIoYWRkaXRpb25hbEhlYWRlcnMsIEhlYWRlcnMuQWNjZXB0LCBNZWRpYVR5cGVzLkFwcGxpY2F0aW9uSnNvbik7XG4gICAgICAgICAgICBhZGRpdGlvbmFsSGVhZGVyc1tIZWFkZXJzLkNvbnRlbnRUeXBlXSA9IHRoaXMuX2dldEV4aXN0aW5nT3JEZWZhdWx0SGVhZGVyKGFkZGl0aW9uYWxIZWFkZXJzLCBIZWFkZXJzLkNvbnRlbnRUeXBlLCBNZWRpYVR5cGVzLkFwcGxpY2F0aW9uSnNvbik7XG4gICAgICAgICAgICBjb25zdCByZXMgPSB5aWVsZCB0aGlzLnBvc3QocmVxdWVzdFVybCwgZGF0YSwgYWRkaXRpb25hbEhlYWRlcnMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NSZXNwb25zZShyZXMsIHRoaXMucmVxdWVzdE9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHV0SnNvbihyZXF1ZXN0VXJsLCBvYmosIGFkZGl0aW9uYWxIZWFkZXJzID0ge30pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnN0cmluZ2lmeShvYmosIG51bGwsIDIpO1xuICAgICAgICAgICAgYWRkaXRpb25hbEhlYWRlcnNbSGVhZGVycy5BY2NlcHRdID0gdGhpcy5fZ2V0RXhpc3RpbmdPckRlZmF1bHRIZWFkZXIoYWRkaXRpb25hbEhlYWRlcnMsIEhlYWRlcnMuQWNjZXB0LCBNZWRpYVR5cGVzLkFwcGxpY2F0aW9uSnNvbik7XG4gICAgICAgICAgICBhZGRpdGlvbmFsSGVhZGVyc1tIZWFkZXJzLkNvbnRlbnRUeXBlXSA9IHRoaXMuX2dldEV4aXN0aW5nT3JEZWZhdWx0SGVhZGVyKGFkZGl0aW9uYWxIZWFkZXJzLCBIZWFkZXJzLkNvbnRlbnRUeXBlLCBNZWRpYVR5cGVzLkFwcGxpY2F0aW9uSnNvbik7XG4gICAgICAgICAgICBjb25zdCByZXMgPSB5aWVsZCB0aGlzLnB1dChyZXF1ZXN0VXJsLCBkYXRhLCBhZGRpdGlvbmFsSGVhZGVycyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1Jlc3BvbnNlKHJlcywgdGhpcy5yZXF1ZXN0T3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwYXRjaEpzb24ocmVxdWVzdFVybCwgb2JqLCBhZGRpdGlvbmFsSGVhZGVycyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkob2JqLCBudWxsLCAyKTtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxIZWFkZXJzW0hlYWRlcnMuQWNjZXB0XSA9IHRoaXMuX2dldEV4aXN0aW5nT3JEZWZhdWx0SGVhZGVyKGFkZGl0aW9uYWxIZWFkZXJzLCBIZWFkZXJzLkFjY2VwdCwgTWVkaWFUeXBlcy5BcHBsaWNhdGlvbkpzb24pO1xuICAgICAgICAgICAgYWRkaXRpb25hbEhlYWRlcnNbSGVhZGVycy5Db250ZW50VHlwZV0gPSB0aGlzLl9nZXRFeGlzdGluZ09yRGVmYXVsdEhlYWRlcihhZGRpdGlvbmFsSGVhZGVycywgSGVhZGVycy5Db250ZW50VHlwZSwgTWVkaWFUeXBlcy5BcHBsaWNhdGlvbkpzb24pO1xuICAgICAgICAgICAgY29uc3QgcmVzID0geWllbGQgdGhpcy5wYXRjaChyZXF1ZXN0VXJsLCBkYXRhLCBhZGRpdGlvbmFsSGVhZGVycyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1Jlc3BvbnNlKHJlcywgdGhpcy5yZXF1ZXN0T3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYWtlcyBhIHJhdyBodHRwIHJlcXVlc3QuXG4gICAgICogQWxsIG90aGVyIG1ldGhvZHMgc3VjaCBhcyBnZXQsIHBvc3QsIHBhdGNoLCBhbmQgcmVxdWVzdCB1bHRpbWF0ZWx5IGNhbGwgdGhpcy5cbiAgICAgKiBQcmVmZXIgZ2V0LCBkZWwsIHBvc3QgYW5kIHBhdGNoXG4gICAgICovXG4gICAgcmVxdWVzdCh2ZXJiLCByZXF1ZXN0VXJsLCBkYXRhLCBoZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fZGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NsaWVudCBoYXMgYWxyZWFkeSBiZWVuIGRpc3Bvc2VkLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTChyZXF1ZXN0VXJsKTtcbiAgICAgICAgICAgIGxldCBpbmZvID0gdGhpcy5fcHJlcGFyZVJlcXVlc3QodmVyYiwgcGFyc2VkVXJsLCBoZWFkZXJzKTtcbiAgICAgICAgICAgIC8vIE9ubHkgcGVyZm9ybSByZXRyaWVzIG9uIHJlYWRzIHNpbmNlIHdyaXRlcyBtYXkgbm90IGJlIGlkZW1wb3RlbnQuXG4gICAgICAgICAgICBjb25zdCBtYXhUcmllcyA9IHRoaXMuX2FsbG93UmV0cmllcyAmJiBSZXRyeWFibGVIdHRwVmVyYnMuaW5jbHVkZXModmVyYilcbiAgICAgICAgICAgICAgICA/IHRoaXMuX21heFJldHJpZXMgKyAxXG4gICAgICAgICAgICAgICAgOiAxO1xuICAgICAgICAgICAgbGV0IG51bVRyaWVzID0gMDtcbiAgICAgICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIHRoaXMucmVxdWVzdFJhdyhpbmZvLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGFuIGF1dGhlbnRpY2F0aW9uIGNoYWxsZW5nZVxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAmJlxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlICYmXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1lc3NhZ2Uuc3RhdHVzQ29kZSA9PT0gSHR0cENvZGVzLlVuYXV0aG9yaXplZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYXV0aGVudGljYXRpb25IYW5kbGVyO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5oYW5kbGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIuY2FuSGFuZGxlQXV0aGVudGljYXRpb24ocmVzcG9uc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb25IYW5kbGVyID0gaGFuZGxlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoYXV0aGVudGljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXV0aGVudGljYXRpb25IYW5kbGVyLmhhbmRsZUF1dGhlbnRpY2F0aW9uKHRoaXMsIGluZm8sIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSByZWNlaXZlZCBhbiB1bmF1dGhvcml6ZWQgcmVzcG9uc2UgYnV0IGhhdmUgbm8gaGFuZGxlcnMgdG8gaGFuZGxlIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0IHRoZSByZXNwb25zZSByZXR1cm4gdG8gdGhlIGNhbGxlci5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgcmVkaXJlY3RzUmVtYWluaW5nID0gdGhpcy5fbWF4UmVkaXJlY3RzO1xuICAgICAgICAgICAgICAgIHdoaWxlIChyZXNwb25zZS5tZXNzYWdlLnN0YXR1c0NvZGUgJiZcbiAgICAgICAgICAgICAgICAgICAgSHR0cFJlZGlyZWN0Q29kZXMuaW5jbHVkZXMocmVzcG9uc2UubWVzc2FnZS5zdGF0dXNDb2RlKSAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hbGxvd1JlZGlyZWN0cyAmJlxuICAgICAgICAgICAgICAgICAgICByZWRpcmVjdHNSZW1haW5pbmcgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZGlyZWN0VXJsID0gcmVzcG9uc2UubWVzc2FnZS5oZWFkZXJzWydsb2NhdGlvbiddO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZGlyZWN0VXJsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSdzIG5vIGxvY2F0aW9uIHRvIHJlZGlyZWN0IHRvLCB3ZSB3b24ndFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkUmVkaXJlY3RVcmwgPSBuZXcgVVJMKHJlZGlyZWN0VXJsKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZFVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOicgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZFVybC5wcm90b2NvbCAhPT0gcGFyc2VkUmVkaXJlY3RVcmwucHJvdG9jb2wgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLl9hbGxvd1JlZGlyZWN0RG93bmdyYWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlZGlyZWN0IGZyb20gSFRUUFMgdG8gSFRUUCBwcm90b2NvbC4gVGhpcyBkb3duZ3JhZGUgaXMgbm90IGFsbG93ZWQgZm9yIHNlY3VyaXR5IHJlYXNvbnMuIElmIHlvdSB3YW50IHRvIGFsbG93IHRoaXMgYmVoYXZpb3IsIHNldCB0aGUgYWxsb3dSZWRpcmVjdERvd25ncmFkZSBvcHRpb24gdG8gdHJ1ZS4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGZpbmlzaCByZWFkaW5nIHRoZSByZXNwb25zZSBiZWZvcmUgcmVhc3NpZ25pbmcgcmVzcG9uc2VcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggd2lsbCBsZWFrIHRoZSBvcGVuIHNvY2tldC5cbiAgICAgICAgICAgICAgICAgICAgeWllbGQgcmVzcG9uc2UucmVhZEJvZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RyaXAgYXV0aG9yaXphdGlvbiBoZWFkZXIgaWYgcmVkaXJlY3RlZCB0byBhIGRpZmZlcmVudCBob3N0bmFtZVxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VkUmVkaXJlY3RVcmwuaG9zdG5hbWUgIT09IHBhcnNlZFVybC5ob3N0bmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBoZWFkZXIgaW4gaGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlYWRlciBuYW1lcyBhcmUgY2FzZSBpbnNlbnNpdGl2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXIudG9Mb3dlckNhc2UoKSA9PT0gJ2F1dGhvcml6YXRpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBoZWFkZXJzW2hlYWRlcl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGxldCdzIG1ha2UgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgbmV3IHJlZGlyZWN0VXJsXG4gICAgICAgICAgICAgICAgICAgIGluZm8gPSB0aGlzLl9wcmVwYXJlUmVxdWVzdCh2ZXJiLCBwYXJzZWRSZWRpcmVjdFVybCwgaGVhZGVycyk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0geWllbGQgdGhpcy5yZXF1ZXN0UmF3KGluZm8sIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICByZWRpcmVjdHNSZW1haW5pbmctLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5tZXNzYWdlLnN0YXR1c0NvZGUgfHxcbiAgICAgICAgICAgICAgICAgICAgIUh0dHBSZXNwb25zZVJldHJ5Q29kZXMuaW5jbHVkZXMocmVzcG9uc2UubWVzc2FnZS5zdGF0dXNDb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBub3QgYSByZXRyeSBjb2RlLCByZXR1cm4gaW1tZWRpYXRlbHkgaW5zdGVhZCBvZiByZXRyeWluZ1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG51bVRyaWVzICs9IDE7XG4gICAgICAgICAgICAgICAgaWYgKG51bVRyaWVzIDwgbWF4VHJpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgcmVzcG9uc2UucmVhZEJvZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgdGhpcy5fcGVyZm9ybUV4cG9uZW50aWFsQmFja29mZihudW1Ucmllcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAobnVtVHJpZXMgPCBtYXhUcmllcyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOZWVkcyB0byBiZSBjYWxsZWQgaWYga2VlcEFsaXZlIGlzIHNldCB0byB0cnVlIGluIHJlcXVlc3Qgb3B0aW9ucy5cbiAgICAgKi9cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5fYWdlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2FnZW50LmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kaXNwb3NlZCA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJhdyByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBpbmZvXG4gICAgICogQHBhcmFtIGRhdGFcbiAgICAgKi9cbiAgICByZXF1ZXN0UmF3KGluZm8sIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gY2FsbGJhY2tGb3JSZXN1bHQoZXJyLCByZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgYGVycmAgaXMgbm90IHBhc3NlZCwgdGhlbiBgcmVzYCBtdXN0IGJlIHBhc3NlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1Vua25vd24gZXJyb3InKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0UmF3V2l0aENhbGxiYWNrKGluZm8sIGRhdGEsIGNhbGxiYWNrRm9yUmVzdWx0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmF3IHJlcXVlc3Qgd2l0aCBjYWxsYmFjay5cbiAgICAgKiBAcGFyYW0gaW5mb1xuICAgICAqIEBwYXJhbSBkYXRhXG4gICAgICogQHBhcmFtIG9uUmVzdWx0XG4gICAgICovXG4gICAgcmVxdWVzdFJhd1dpdGhDYWxsYmFjayhpbmZvLCBkYXRhLCBvblJlc3VsdCkge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAoIWluZm8ub3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgaW5mby5vcHRpb25zLmhlYWRlcnMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluZm8ub3B0aW9ucy5oZWFkZXJzWydDb250ZW50LUxlbmd0aCddID0gQnVmZmVyLmJ5dGVMZW5ndGgoZGF0YSwgJ3V0ZjgnKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2FsbGJhY2tDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlUmVzdWx0KGVyciwgcmVzKSB7XG4gICAgICAgICAgICBpZiAoIWNhbGxiYWNrQ2FsbGVkKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2tDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIG9uUmVzdWx0KGVyciwgcmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXEgPSBpbmZvLmh0dHBNb2R1bGUucmVxdWVzdChpbmZvLm9wdGlvbnMsIChtc2cpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IG5ldyBIdHRwQ2xpZW50UmVzcG9uc2UobXNnKTtcbiAgICAgICAgICAgIGhhbmRsZVJlc3VsdCh1bmRlZmluZWQsIHJlcyk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgc29ja2V0O1xuICAgICAgICByZXEub24oJ3NvY2tldCcsIHNvY2sgPT4ge1xuICAgICAgICAgICAgc29ja2V0ID0gc29jaztcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIElmIHdlIGV2ZXIgZ2V0IGRpc2Nvbm5lY3RlZCwgd2Ugd2FudCB0aGUgc29ja2V0IHRvIHRpbWVvdXQgZXZlbnR1YWxseVxuICAgICAgICByZXEuc2V0VGltZW91dCh0aGlzLl9zb2NrZXRUaW1lb3V0IHx8IDMgKiA2MDAwMCwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHNvY2tldCkge1xuICAgICAgICAgICAgICAgIHNvY2tldC5lbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZVJlc3VsdChuZXcgRXJyb3IoYFJlcXVlc3QgdGltZW91dDogJHtpbmZvLm9wdGlvbnMucGF0aH1gKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXEub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgLy8gZXJyIGhhcyBzdGF0dXNDb2RlIHByb3BlcnR5XG4gICAgICAgICAgICAvLyByZXMgc2hvdWxkIGhhdmUgaGVhZGVyc1xuICAgICAgICAgICAgaGFuZGxlUmVzdWx0KGVycik7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJlcS53cml0ZShkYXRhLCAndXRmOCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhICYmIHR5cGVvZiBkYXRhICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZGF0YS5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVxLmVuZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkYXRhLnBpcGUocmVxKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcS5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuIGh0dHAgYWdlbnQuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIHdoZW4geW91IG5lZWQgYW4gaHR0cCBhZ2VudCB0aGF0IGhhbmRsZXNcbiAgICAgKiByb3V0aW5nIHRocm91Z2ggYSBwcm94eSBzZXJ2ZXIgLSBkZXBlbmRpbmcgdXBvbiB0aGUgdXJsIGFuZCBwcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gICAgICogQHBhcmFtIHNlcnZlclVybCAgVGhlIHNlcnZlciBVUkwgd2hlcmUgdGhlIHJlcXVlc3Qgd2lsbCBiZSBzZW50LiBGb3IgZXhhbXBsZSwgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbVxuICAgICAqL1xuICAgIGdldEFnZW50KHNlcnZlclVybCkge1xuICAgICAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHNlcnZlclVybCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRBZ2VudChwYXJzZWRVcmwpO1xuICAgIH1cbiAgICBnZXRBZ2VudERpc3BhdGNoZXIoc2VydmVyVXJsKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwoc2VydmVyVXJsKTtcbiAgICAgICAgY29uc3QgcHJveHlVcmwgPSBwbS5nZXRQcm94eVVybChwYXJzZWRVcmwpO1xuICAgICAgICBjb25zdCB1c2VQcm94eSA9IHByb3h5VXJsICYmIHByb3h5VXJsLmhvc3RuYW1lO1xuICAgICAgICBpZiAoIXVzZVByb3h5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFByb3h5QWdlbnREaXNwYXRjaGVyKHBhcnNlZFVybCwgcHJveHlVcmwpO1xuICAgIH1cbiAgICBfcHJlcGFyZVJlcXVlc3QobWV0aG9kLCByZXF1ZXN0VXJsLCBoZWFkZXJzKSB7XG4gICAgICAgIGNvbnN0IGluZm8gPSB7fTtcbiAgICAgICAgaW5mby5wYXJzZWRVcmwgPSByZXF1ZXN0VXJsO1xuICAgICAgICBjb25zdCB1c2luZ1NzbCA9IGluZm8ucGFyc2VkVXJsLnByb3RvY29sID09PSAnaHR0cHM6JztcbiAgICAgICAgaW5mby5odHRwTW9kdWxlID0gdXNpbmdTc2wgPyBodHRwcyA6IGh0dHA7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRQb3J0ID0gdXNpbmdTc2wgPyA0NDMgOiA4MDtcbiAgICAgICAgaW5mby5vcHRpb25zID0ge307XG4gICAgICAgIGluZm8ub3B0aW9ucy5ob3N0ID0gaW5mby5wYXJzZWRVcmwuaG9zdG5hbWU7XG4gICAgICAgIGluZm8ub3B0aW9ucy5wb3J0ID0gaW5mby5wYXJzZWRVcmwucG9ydFxuICAgICAgICAgICAgPyBwYXJzZUludChpbmZvLnBhcnNlZFVybC5wb3J0KVxuICAgICAgICAgICAgOiBkZWZhdWx0UG9ydDtcbiAgICAgICAgaW5mby5vcHRpb25zLnBhdGggPVxuICAgICAgICAgICAgKGluZm8ucGFyc2VkVXJsLnBhdGhuYW1lIHx8ICcnKSArIChpbmZvLnBhcnNlZFVybC5zZWFyY2ggfHwgJycpO1xuICAgICAgICBpbmZvLm9wdGlvbnMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICBpbmZvLm9wdGlvbnMuaGVhZGVycyA9IHRoaXMuX21lcmdlSGVhZGVycyhoZWFkZXJzKTtcbiAgICAgICAgaWYgKHRoaXMudXNlckFnZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGluZm8ub3B0aW9ucy5oZWFkZXJzWyd1c2VyLWFnZW50J10gPSB0aGlzLnVzZXJBZ2VudDtcbiAgICAgICAgfVxuICAgICAgICBpbmZvLm9wdGlvbnMuYWdlbnQgPSB0aGlzLl9nZXRBZ2VudChpbmZvLnBhcnNlZFVybCk7XG4gICAgICAgIC8vIGdpdmVzIGhhbmRsZXJzIGFuIG9wcG9ydHVuaXR5IHRvIHBhcnRpY2lwYXRlXG4gICAgICAgIGlmICh0aGlzLmhhbmRsZXJzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5oYW5kbGVycykge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIucHJlcGFyZVJlcXVlc3QoaW5mby5vcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5mbztcbiAgICB9XG4gICAgX21lcmdlSGVhZGVycyhoZWFkZXJzKSB7XG4gICAgICAgIGlmICh0aGlzLnJlcXVlc3RPcHRpb25zICYmIHRoaXMucmVxdWVzdE9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGxvd2VyY2FzZUtleXModGhpcy5yZXF1ZXN0T3B0aW9ucy5oZWFkZXJzKSwgbG93ZXJjYXNlS2V5cyhoZWFkZXJzIHx8IHt9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvd2VyY2FzZUtleXMoaGVhZGVycyB8fCB7fSk7XG4gICAgfVxuICAgIF9nZXRFeGlzdGluZ09yRGVmYXVsdEhlYWRlcihhZGRpdGlvbmFsSGVhZGVycywgaGVhZGVyLCBfZGVmYXVsdCkge1xuICAgICAgICBsZXQgY2xpZW50SGVhZGVyO1xuICAgICAgICBpZiAodGhpcy5yZXF1ZXN0T3B0aW9ucyAmJiB0aGlzLnJlcXVlc3RPcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgICAgICAgIGNsaWVudEhlYWRlciA9IGxvd2VyY2FzZUtleXModGhpcy5yZXF1ZXN0T3B0aW9ucy5oZWFkZXJzKVtoZWFkZXJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZGRpdGlvbmFsSGVhZGVyc1toZWFkZXJdIHx8IGNsaWVudEhlYWRlciB8fCBfZGVmYXVsdDtcbiAgICB9XG4gICAgX2dldEFnZW50KHBhcnNlZFVybCkge1xuICAgICAgICBsZXQgYWdlbnQ7XG4gICAgICAgIGNvbnN0IHByb3h5VXJsID0gcG0uZ2V0UHJveHlVcmwocGFyc2VkVXJsKTtcbiAgICAgICAgY29uc3QgdXNlUHJveHkgPSBwcm94eVVybCAmJiBwcm94eVVybC5ob3N0bmFtZTtcbiAgICAgICAgaWYgKHRoaXMuX2tlZXBBbGl2ZSAmJiB1c2VQcm94eSkge1xuICAgICAgICAgICAgYWdlbnQgPSB0aGlzLl9wcm94eUFnZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdXNlUHJveHkpIHtcbiAgICAgICAgICAgIGFnZW50ID0gdGhpcy5fYWdlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgYWdlbnQgaXMgYWxyZWFkeSBhc3NpZ25lZCB1c2UgdGhhdCBhZ2VudC5cbiAgICAgICAgaWYgKGFnZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gYWdlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXNpbmdTc2wgPSBwYXJzZWRVcmwucHJvdG9jb2wgPT09ICdodHRwczonO1xuICAgICAgICBsZXQgbWF4U29ja2V0cyA9IDEwMDtcbiAgICAgICAgaWYgKHRoaXMucmVxdWVzdE9wdGlvbnMpIHtcbiAgICAgICAgICAgIG1heFNvY2tldHMgPSB0aGlzLnJlcXVlc3RPcHRpb25zLm1heFNvY2tldHMgfHwgaHR0cC5nbG9iYWxBZ2VudC5tYXhTb2NrZXRzO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoaXMgaXMgYHVzZVByb3h5YCBhZ2FpbiwgYnV0IHdlIG5lZWQgdG8gY2hlY2sgYHByb3h5VVJsYCBkaXJlY3RseSBmb3IgVHlwZVNjcmlwdHMncyBmbG93IGFuYWx5c2lzLlxuICAgICAgICBpZiAocHJveHlVcmwgJiYgcHJveHlVcmwuaG9zdG5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGFnZW50T3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICBtYXhTb2NrZXRzLFxuICAgICAgICAgICAgICAgIGtlZXBBbGl2ZTogdGhpcy5fa2VlcEFsaXZlLFxuICAgICAgICAgICAgICAgIHByb3h5OiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sICgocHJveHlVcmwudXNlcm5hbWUgfHwgcHJveHlVcmwucGFzc3dvcmQpICYmIHtcbiAgICAgICAgICAgICAgICAgICAgcHJveHlBdXRoOiBgJHtwcm94eVVybC51c2VybmFtZX06JHtwcm94eVVybC5wYXNzd29yZH1gXG4gICAgICAgICAgICAgICAgfSkpLCB7IGhvc3Q6IHByb3h5VXJsLmhvc3RuYW1lLCBwb3J0OiBwcm94eVVybC5wb3J0IH0pXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IHR1bm5lbEFnZW50O1xuICAgICAgICAgICAgY29uc3Qgb3Zlckh0dHBzID0gcHJveHlVcmwucHJvdG9jb2wgPT09ICdodHRwczonO1xuICAgICAgICAgICAgaWYgKHVzaW5nU3NsKSB7XG4gICAgICAgICAgICAgICAgdHVubmVsQWdlbnQgPSBvdmVySHR0cHMgPyB0dW5uZWwuaHR0cHNPdmVySHR0cHMgOiB0dW5uZWwuaHR0cHNPdmVySHR0cDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHR1bm5lbEFnZW50ID0gb3Zlckh0dHBzID8gdHVubmVsLmh0dHBPdmVySHR0cHMgOiB0dW5uZWwuaHR0cE92ZXJIdHRwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWdlbnQgPSB0dW5uZWxBZ2VudChhZ2VudE9wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5fcHJveHlBZ2VudCA9IGFnZW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIHR1bm5lbGluZyBhZ2VudCBpc24ndCBhc3NpZ25lZCBjcmVhdGUgYSBuZXcgYWdlbnRcbiAgICAgICAgaWYgKCFhZ2VudCkge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHsga2VlcEFsaXZlOiB0aGlzLl9rZWVwQWxpdmUsIG1heFNvY2tldHMgfTtcbiAgICAgICAgICAgIGFnZW50ID0gdXNpbmdTc2wgPyBuZXcgaHR0cHMuQWdlbnQob3B0aW9ucykgOiBuZXcgaHR0cC5BZ2VudChvcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuX2FnZW50ID0gYWdlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVzaW5nU3NsICYmIHRoaXMuX2lnbm9yZVNzbEVycm9yKSB7XG4gICAgICAgICAgICAvLyB3ZSBkb24ndCB3YW50IHRvIHNldCBOT0RFX1RMU19SRUpFQ1RfVU5BVVRIT1JJWkVEPTAgc2luY2UgdGhhdCB3aWxsIGFmZmVjdCByZXF1ZXN0IGZvciBlbnRpcmUgcHJvY2Vzc1xuICAgICAgICAgICAgLy8gaHR0cC5SZXF1ZXN0T3B0aW9ucyBkb2Vzbid0IGV4cG9zZSBhIHdheSB0byBtb2RpZnkgUmVxdWVzdE9wdGlvbnMuYWdlbnQub3B0aW9uc1xuICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBjYXN0IGl0IHRvIGFueSBhbmQgY2hhbmdlIGl0IGRpcmVjdGx5XG4gICAgICAgICAgICBhZ2VudC5vcHRpb25zID0gT2JqZWN0LmFzc2lnbihhZ2VudC5vcHRpb25zIHx8IHt9LCB7XG4gICAgICAgICAgICAgICAgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFnZW50O1xuICAgIH1cbiAgICBfZ2V0UHJveHlBZ2VudERpc3BhdGNoZXIocGFyc2VkVXJsLCBwcm94eVVybCkge1xuICAgICAgICBsZXQgcHJveHlBZ2VudDtcbiAgICAgICAgaWYgKHRoaXMuX2tlZXBBbGl2ZSkge1xuICAgICAgICAgICAgcHJveHlBZ2VudCA9IHRoaXMuX3Byb3h5QWdlbnREaXNwYXRjaGVyO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGFnZW50IGlzIGFscmVhZHkgYXNzaWduZWQgdXNlIHRoYXQgYWdlbnQuXG4gICAgICAgIGlmIChwcm94eUFnZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gcHJveHlBZ2VudDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1c2luZ1NzbCA9IHBhcnNlZFVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOic7XG4gICAgICAgIHByb3h5QWdlbnQgPSBuZXcgdW5kaWNpXzEuUHJveHlBZ2VudChPYmplY3QuYXNzaWduKHsgdXJpOiBwcm94eVVybC5ocmVmLCBwaXBlbGluaW5nOiAhdGhpcy5fa2VlcEFsaXZlID8gMCA6IDEgfSwgKChwcm94eVVybC51c2VybmFtZSB8fCBwcm94eVVybC5wYXNzd29yZCkgJiYge1xuICAgICAgICAgICAgdG9rZW46IGBCYXNpYyAke0J1ZmZlci5mcm9tKGAke3Byb3h5VXJsLnVzZXJuYW1lfToke3Byb3h5VXJsLnBhc3N3b3JkfWApLnRvU3RyaW5nKCdiYXNlNjQnKX1gXG4gICAgICAgIH0pKSk7XG4gICAgICAgIHRoaXMuX3Byb3h5QWdlbnREaXNwYXRjaGVyID0gcHJveHlBZ2VudDtcbiAgICAgICAgaWYgKHVzaW5nU3NsICYmIHRoaXMuX2lnbm9yZVNzbEVycm9yKSB7XG4gICAgICAgICAgICAvLyB3ZSBkb24ndCB3YW50IHRvIHNldCBOT0RFX1RMU19SRUpFQ1RfVU5BVVRIT1JJWkVEPTAgc2luY2UgdGhhdCB3aWxsIGFmZmVjdCByZXF1ZXN0IGZvciBlbnRpcmUgcHJvY2Vzc1xuICAgICAgICAgICAgLy8gaHR0cC5SZXF1ZXN0T3B0aW9ucyBkb2Vzbid0IGV4cG9zZSBhIHdheSB0byBtb2RpZnkgUmVxdWVzdE9wdGlvbnMuYWdlbnQub3B0aW9uc1xuICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBjYXN0IGl0IHRvIGFueSBhbmQgY2hhbmdlIGl0IGRpcmVjdGx5XG4gICAgICAgICAgICBwcm94eUFnZW50Lm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHByb3h5QWdlbnQub3B0aW9ucy5yZXF1ZXN0VGxzIHx8IHt9LCB7XG4gICAgICAgICAgICAgICAgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3h5QWdlbnQ7XG4gICAgfVxuICAgIF9wZXJmb3JtRXhwb25lbnRpYWxCYWNrb2ZmKHJldHJ5TnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXRyeU51bWJlciA9IE1hdGgubWluKEV4cG9uZW50aWFsQmFja29mZkNlaWxpbmcsIHJldHJ5TnVtYmVyKTtcbiAgICAgICAgICAgIGNvbnN0IG1zID0gRXhwb25lbnRpYWxCYWNrb2ZmVGltZVNsaWNlICogTWF0aC5wb3coMiwgcmV0cnlOdW1iZXIpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfcHJvY2Vzc1Jlc3BvbnNlKHJlcywgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGF0dXNDb2RlID0gcmVzLm1lc3NhZ2Uuc3RhdHVzQ29kZSB8fCAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlLFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHt9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvLyBub3QgZm91bmQgbGVhZHMgdG8gbnVsbCBvYmogcmV0dXJuZWRcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzQ29kZSA9PT0gSHR0cENvZGVzLk5vdEZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHJlc3VsdCBmcm9tIHRoZSBib2R5XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gZGF0ZVRpbWVEZXNlcmlhbGl6ZXIoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4oYS52YWx1ZU9mKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgb2JqO1xuICAgICAgICAgICAgICAgIGxldCBjb250ZW50cztcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50cyA9IHlpZWxkIHJlcy5yZWFkQm9keSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudHMgJiYgY29udGVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5kZXNlcmlhbGl6ZURhdGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gSlNPTi5wYXJzZShjb250ZW50cywgZGF0ZVRpbWVEZXNlcmlhbGl6ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gSlNPTi5wYXJzZShjb250ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5yZXN1bHQgPSBvYmo7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuaGVhZGVycyA9IHJlcy5tZXNzYWdlLmhlYWRlcnM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW52YWxpZCByZXNvdXJjZSAoY29udGVudHMgbm90IGpzb24pOyAgbGVhdmluZyByZXN1bHQgb2JqIG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gbm90ZSB0aGF0IDN4eCByZWRpcmVjdHMgYXJlIGhhbmRsZWQgYnkgdGhlIGh0dHAgbGF5ZXIuXG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1c0NvZGUgPiAyOTkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1zZztcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgZXhjZXB0aW9uL2Vycm9yIGluIGJvZHksIGF0dGVtcHQgdG8gZ2V0IGJldHRlciBlcnJvclxuICAgICAgICAgICAgICAgICAgICBpZiAob2JqICYmIG9iai5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBvYmoubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb250ZW50cyAmJiBjb250ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCBtYXkgYmUgdGhlIGNhc2UgdGhhdCB0aGUgZXhjZXB0aW9uIGlzIGluIHRoZSBib2R5IG1lc3NhZ2UgYXMgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBjb250ZW50cztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IGBGYWlsZWQgcmVxdWVzdDogKCR7c3RhdHVzQ29kZX0pYDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgSHR0cENsaWVudEVycm9yKG1zZywgc3RhdHVzQ29kZSk7XG4gICAgICAgICAgICAgICAgICAgIGVyci5yZXN1bHQgPSByZXNwb25zZS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLkh0dHBDbGllbnQgPSBIdHRwQ2xpZW50O1xuY29uc3QgbG93ZXJjYXNlS2V5cyA9IChvYmopID0+IE9iamVjdC5rZXlzKG9iaikucmVkdWNlKChjLCBrKSA9PiAoKGNbay50b0xvd2VyQ2FzZSgpXSA9IG9ialtrXSksIGMpLCB7fSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5QZXJzb25hbEFjY2Vzc1Rva2VuQ3JlZGVudGlhbEhhbmRsZXIgPSBleHBvcnRzLkJlYXJlckNyZWRlbnRpYWxIYW5kbGVyID0gZXhwb3J0cy5CYXNpY0NyZWRlbnRpYWxIYW5kbGVyID0gdm9pZCAwO1xuY2xhc3MgQmFzaWNDcmVkZW50aWFsSGFuZGxlciB7XG4gICAgY29uc3RydWN0b3IodXNlcm5hbWUsIHBhc3N3b3JkKSB7XG4gICAgICAgIHRoaXMudXNlcm5hbWUgPSB1c2VybmFtZTtcbiAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkO1xuICAgIH1cbiAgICBwcmVwYXJlUmVxdWVzdChvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignVGhlIHJlcXVlc3QgaGFzIG5vIGhlYWRlcnMnKTtcbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IGBCYXNpYyAke0J1ZmZlci5mcm9tKGAke3RoaXMudXNlcm5hbWV9OiR7dGhpcy5wYXNzd29yZH1gKS50b1N0cmluZygnYmFzZTY0Jyl9YDtcbiAgICB9XG4gICAgLy8gVGhpcyBoYW5kbGVyIGNhbm5vdCBoYW5kbGUgNDAxXG4gICAgY2FuSGFuZGxlQXV0aGVudGljYXRpb24oKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaGFuZGxlQXV0aGVudGljYXRpb24oKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLkJhc2ljQ3JlZGVudGlhbEhhbmRsZXIgPSBCYXNpY0NyZWRlbnRpYWxIYW5kbGVyO1xuY2xhc3MgQmVhcmVyQ3JlZGVudGlhbEhhbmRsZXIge1xuICAgIGNvbnN0cnVjdG9yKHRva2VuKSB7XG4gICAgICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcbiAgICB9XG4gICAgLy8gY3VycmVudGx5IGltcGxlbWVudHMgcHJlLWF1dGhvcml6YXRpb25cbiAgICAvLyBUT0RPOiBzdXBwb3J0IHByZUF1dGggPSBmYWxzZSB3aGVyZSBpdCBob29rcyBvbiA0MDFcbiAgICBwcmVwYXJlUmVxdWVzdChvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignVGhlIHJlcXVlc3QgaGFzIG5vIGhlYWRlcnMnKTtcbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHt0aGlzLnRva2VufWA7XG4gICAgfVxuICAgIC8vIFRoaXMgaGFuZGxlciBjYW5ub3QgaGFuZGxlIDQwMVxuICAgIGNhbkhhbmRsZUF1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGhhbmRsZUF1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5CZWFyZXJDcmVkZW50aWFsSGFuZGxlciA9IEJlYXJlckNyZWRlbnRpYWxIYW5kbGVyO1xuY2xhc3MgUGVyc29uYWxBY2Nlc3NUb2tlbkNyZWRlbnRpYWxIYW5kbGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih0b2tlbikge1xuICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gICAgfVxuICAgIC8vIGN1cnJlbnRseSBpbXBsZW1lbnRzIHByZS1hdXRob3JpemF0aW9uXG4gICAgLy8gVE9ETzogc3VwcG9ydCBwcmVBdXRoID0gZmFsc2Ugd2hlcmUgaXQgaG9va3Mgb24gNDAxXG4gICAgcHJlcGFyZVJlcXVlc3Qob3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1RoZSByZXF1ZXN0IGhhcyBubyBoZWFkZXJzJyk7XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBgQmFzaWMgJHtCdWZmZXIuZnJvbShgUEFUOiR7dGhpcy50b2tlbn1gKS50b1N0cmluZygnYmFzZTY0Jyl9YDtcbiAgICB9XG4gICAgLy8gVGhpcyBoYW5kbGVyIGNhbm5vdCBoYW5kbGUgNDAxXG4gICAgY2FuSGFuZGxlQXV0aGVudGljYXRpb24oKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaGFuZGxlQXV0aGVudGljYXRpb24oKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLlBlcnNvbmFsQWNjZXNzVG9rZW5DcmVkZW50aWFsSGFuZGxlciA9IFBlcnNvbmFsQWNjZXNzVG9rZW5DcmVkZW50aWFsSGFuZGxlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWF1dGguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuT2lkY0NsaWVudCA9IHZvaWQgMDtcbmNvbnN0IGh0dHBfY2xpZW50XzEgPSByZXF1aXJlKFwiQGFjdGlvbnMvaHR0cC1jbGllbnRcIik7XG5jb25zdCBhdXRoXzEgPSByZXF1aXJlKFwiQGFjdGlvbnMvaHR0cC1jbGllbnQvbGliL2F1dGhcIik7XG5jb25zdCBjb3JlXzEgPSByZXF1aXJlKFwiLi9jb3JlXCIpO1xuY2xhc3MgT2lkY0NsaWVudCB7XG4gICAgc3RhdGljIGNyZWF0ZUh0dHBDbGllbnQoYWxsb3dSZXRyeSA9IHRydWUsIG1heFJldHJ5ID0gMTApIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICAgICAgICBhbGxvd1JldHJpZXM6IGFsbG93UmV0cnksXG4gICAgICAgICAgICBtYXhSZXRyaWVzOiBtYXhSZXRyeVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmV3IGh0dHBfY2xpZW50XzEuSHR0cENsaWVudCgnYWN0aW9ucy9vaWRjLWNsaWVudCcsIFtuZXcgYXV0aF8xLkJlYXJlckNyZWRlbnRpYWxIYW5kbGVyKE9pZGNDbGllbnQuZ2V0UmVxdWVzdFRva2VuKCkpXSwgcmVxdWVzdE9wdGlvbnMpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0UmVxdWVzdFRva2VuKCkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHByb2Nlc3MuZW52WydBQ1RJT05TX0lEX1RPS0VOX1JFUVVFU1RfVE9LRU4nXTtcbiAgICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZ2V0IEFDVElPTlNfSURfVE9LRU5fUkVRVUVTVF9UT0tFTiBlbnYgdmFyaWFibGUnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgfVxuICAgIHN0YXRpYyBnZXRJRFRva2VuVXJsKCkge1xuICAgICAgICBjb25zdCBydW50aW1lVXJsID0gcHJvY2Vzcy5lbnZbJ0FDVElPTlNfSURfVE9LRU5fUkVRVUVTVF9VUkwnXTtcbiAgICAgICAgaWYgKCFydW50aW1lVXJsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBnZXQgQUNUSU9OU19JRF9UT0tFTl9SRVFVRVNUX1VSTCBlbnYgdmFyaWFibGUnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcnVudGltZVVybDtcbiAgICB9XG4gICAgc3RhdGljIGdldENhbGwoaWRfdG9rZW5fdXJsKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGh0dHBjbGllbnQgPSBPaWRjQ2xpZW50LmNyZWF0ZUh0dHBDbGllbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IHlpZWxkIGh0dHBjbGllbnRcbiAgICAgICAgICAgICAgICAuZ2V0SnNvbihpZF90b2tlbl91cmwpXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBnZXQgSUQgVG9rZW4uIFxcbiBcbiAgICAgICAgRXJyb3IgQ29kZSA6ICR7ZXJyb3Iuc3RhdHVzQ29kZX1cXG4gXG4gICAgICAgIEVycm9yIE1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgaWRfdG9rZW4gPSAoX2EgPSByZXMucmVzdWx0KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWU7XG4gICAgICAgICAgICBpZiAoIWlkX3Rva2VuKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXNwb25zZSBqc29uIGJvZHkgZG8gbm90IGhhdmUgSUQgVG9rZW4gZmllbGQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpZF90b2tlbjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRJRFRva2VuKGF1ZGllbmNlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIE5ldyBJRCBUb2tlbiBpcyByZXF1ZXN0ZWQgZnJvbSBhY3Rpb24gc2VydmljZVxuICAgICAgICAgICAgICAgIGxldCBpZF90b2tlbl91cmwgPSBPaWRjQ2xpZW50LmdldElEVG9rZW5VcmwoKTtcbiAgICAgICAgICAgICAgICBpZiAoYXVkaWVuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5jb2RlZEF1ZGllbmNlID0gZW5jb2RlVVJJQ29tcG9uZW50KGF1ZGllbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgaWRfdG9rZW5fdXJsID0gYCR7aWRfdG9rZW5fdXJsfSZhdWRpZW5jZT0ke2VuY29kZWRBdWRpZW5jZX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAoMCwgY29yZV8xLmRlYnVnKShgSUQgdG9rZW4gdXJsIGlzICR7aWRfdG9rZW5fdXJsfWApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkX3Rva2VuID0geWllbGQgT2lkY0NsaWVudC5nZXRDYWxsKGlkX3Rva2VuX3VybCk7XG4gICAgICAgICAgICAgICAgKDAsIGNvcmVfMS5zZXRTZWNyZXQpKGlkX3Rva2VuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWRfdG9rZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5PaWRjQ2xpZW50ID0gT2lkY0NsaWVudDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9pZGMtdXRpbHMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3VtbWFyeSA9IGV4cG9ydHMubWFya2Rvd25TdW1tYXJ5ID0gZXhwb3J0cy5TVU1NQVJZX0RPQ1NfVVJMID0gZXhwb3J0cy5TVU1NQVJZX0VOVl9WQVIgPSB2b2lkIDA7XG5jb25zdCBvc18xID0gcmVxdWlyZShcIm9zXCIpO1xuY29uc3QgZnNfMSA9IHJlcXVpcmUoXCJmc1wiKTtcbmNvbnN0IHsgYWNjZXNzLCBhcHBlbmRGaWxlLCB3cml0ZUZpbGUgfSA9IGZzXzEucHJvbWlzZXM7XG5leHBvcnRzLlNVTU1BUllfRU5WX1ZBUiA9ICdHSVRIVUJfU1RFUF9TVU1NQVJZJztcbmV4cG9ydHMuU1VNTUFSWV9ET0NTX1VSTCA9ICdodHRwczovL2RvY3MuZ2l0aHViLmNvbS9hY3Rpb25zL3VzaW5nLXdvcmtmbG93cy93b3JrZmxvdy1jb21tYW5kcy1mb3ItZ2l0aHViLWFjdGlvbnMjYWRkaW5nLWEtam9iLXN1bW1hcnknO1xuY2xhc3MgU3VtbWFyeSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2J1ZmZlciA9ICcnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGaW5kcyB0aGUgc3VtbWFyeSBmaWxlIHBhdGggZnJvbSB0aGUgZW52aXJvbm1lbnQsIHJlamVjdHMgaWYgZW52IHZhciBpcyBub3QgZm91bmQgb3IgZmlsZSBkb2VzIG5vdCBleGlzdFxuICAgICAqIEFsc28gY2hlY2tzIHIvdyBwZXJtaXNzaW9ucy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHN0ZXAgc3VtbWFyeSBmaWxlIHBhdGhcbiAgICAgKi9cbiAgICBmaWxlUGF0aCgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9maWxlUGF0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9maWxlUGF0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBhdGhGcm9tRW52ID0gcHJvY2Vzcy5lbnZbZXhwb3J0cy5TVU1NQVJZX0VOVl9WQVJdO1xuICAgICAgICAgICAgaWYgKCFwYXRoRnJvbUVudikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGZpbmQgZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yICQke2V4cG9ydHMuU1VNTUFSWV9FTlZfVkFSfS4gQ2hlY2sgaWYgeW91ciBydW50aW1lIGVudmlyb25tZW50IHN1cHBvcnRzIGpvYiBzdW1tYXJpZXMuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGFjY2VzcyhwYXRoRnJvbUVudiwgZnNfMS5jb25zdGFudHMuUl9PSyB8IGZzXzEuY29uc3RhbnRzLldfT0spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gYWNjZXNzIHN1bW1hcnkgZmlsZTogJyR7cGF0aEZyb21FbnZ9Jy4gQ2hlY2sgaWYgdGhlIGZpbGUgaGFzIGNvcnJlY3QgcmVhZC93cml0ZSBwZXJtaXNzaW9ucy5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2ZpbGVQYXRoID0gcGF0aEZyb21FbnY7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZmlsZVBhdGg7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcmFwcyBjb250ZW50IGluIGFuIEhUTUwgdGFnLCBhZGRpbmcgYW55IEhUTUwgYXR0cmlidXRlc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRhZyBIVE1MIHRhZyB0byB3cmFwXG4gICAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSBjb250ZW50IGNvbnRlbnQgd2l0aGluIHRoZSB0YWdcbiAgICAgKiBAcGFyYW0ge1thdHRyaWJ1dGU6IHN0cmluZ106IHN0cmluZ30gYXR0cnMga2V5LXZhbHVlIGxpc3Qgb2YgSFRNTCBhdHRyaWJ1dGVzIHRvIGFkZFxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ30gY29udGVudCB3cmFwcGVkIGluIEhUTUwgZWxlbWVudFxuICAgICAqL1xuICAgIHdyYXAodGFnLCBjb250ZW50LCBhdHRycyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGh0bWxBdHRycyA9IE9iamVjdC5lbnRyaWVzKGF0dHJzKVxuICAgICAgICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgICR7a2V5fT1cIiR7dmFsdWV9XCJgKVxuICAgICAgICAgICAgLmpvaW4oJycpO1xuICAgICAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBgPCR7dGFnfSR7aHRtbEF0dHJzfT5gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgPCR7dGFnfSR7aHRtbEF0dHJzfT4ke2NvbnRlbnR9PC8ke3RhZ30+YDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIHRleHQgaW4gdGhlIGJ1ZmZlciB0byB0aGUgc3VtbWFyeSBidWZmZXIgZmlsZSBhbmQgZW1wdGllcyBidWZmZXIuIFdpbGwgYXBwZW5kIGJ5IGRlZmF1bHQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N1bW1hcnlXcml0ZU9wdGlvbnN9IFtvcHRpb25zXSAob3B0aW9uYWwpIG9wdGlvbnMgZm9yIHdyaXRlIG9wZXJhdGlvblxuICAgICAqXG4gICAgICogQHJldHVybnMge1Byb21pc2U8U3VtbWFyeT59IHN1bW1hcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICB3cml0ZShvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBvdmVyd3JpdGUgPSAhIShvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMub3ZlcndyaXRlKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0geWllbGQgdGhpcy5maWxlUGF0aCgpO1xuICAgICAgICAgICAgY29uc3Qgd3JpdGVGdW5jID0gb3ZlcndyaXRlID8gd3JpdGVGaWxlIDogYXBwZW5kRmlsZTtcbiAgICAgICAgICAgIHlpZWxkIHdyaXRlRnVuYyhmaWxlUGF0aCwgdGhpcy5fYnVmZmVyLCB7IGVuY29kaW5nOiAndXRmOCcgfSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUJ1ZmZlcigpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBzdW1tYXJ5IGJ1ZmZlciBhbmQgd2lwZXMgdGhlIHN1bW1hcnkgZmlsZVxuICAgICAqXG4gICAgICogQHJldHVybnMge1N1bW1hcnl9IHN1bW1hcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBjbGVhcigpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtcHR5QnVmZmVyKCkud3JpdGUoeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN1bW1hcnkgYnVmZmVyIGFzIGEgc3RyaW5nXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBzdHJpbmcgb2Ygc3VtbWFyeSBidWZmZXJcbiAgICAgKi9cbiAgICBzdHJpbmdpZnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9idWZmZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIHRoZSBzdW1tYXJ5IGJ1ZmZlciBpcyBlbXB0eVxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlbn0gdHJ1ZSBpZiB0aGUgYnVmZmVyIGlzIGVtcHR5XG4gICAgICovXG4gICAgaXNFbXB0eUJ1ZmZlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2J1ZmZlci5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgc3VtbWFyeSBidWZmZXIgd2l0aG91dCB3cml0aW5nIHRvIHN1bW1hcnkgZmlsZVxuICAgICAqXG4gICAgICogQHJldHVybnMge1N1bW1hcnl9IHN1bW1hcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBlbXB0eUJ1ZmZlcigpIHtcbiAgICAgICAgdGhpcy5fYnVmZmVyID0gJyc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHJhdyB0ZXh0IHRvIHRoZSBzdW1tYXJ5IGJ1ZmZlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgY29udGVudCB0byBhZGRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthZGRFT0w9ZmFsc2VdIChvcHRpb25hbCkgYXBwZW5kIGFuIEVPTCB0byB0aGUgcmF3IHRleHQgKGRlZmF1bHQ6IGZhbHNlKVxuICAgICAqXG4gICAgICogQHJldHVybnMge1N1bW1hcnl9IHN1bW1hcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGRSYXcodGV4dCwgYWRkRU9MID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5fYnVmZmVyICs9IHRleHQ7XG4gICAgICAgIHJldHVybiBhZGRFT0wgPyB0aGlzLmFkZEVPTCgpIDogdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgb3BlcmF0aW5nIHN5c3RlbS1zcGVjaWZpYyBlbmQtb2YtbGluZSBtYXJrZXIgdG8gdGhlIGJ1ZmZlclxuICAgICAqXG4gICAgICogQHJldHVybnMge1N1bW1hcnl9IHN1bW1hcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGRFT0woKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFJhdyhvc18xLkVPTCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gSFRNTCBjb2RlYmxvY2sgdG8gdGhlIHN1bW1hcnkgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29kZSBjb250ZW50IHRvIHJlbmRlciB3aXRoaW4gZmVuY2VkIGNvZGUgYmxvY2tcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZyAob3B0aW9uYWwpIGxhbmd1YWdlIHRvIHN5bnRheCBoaWdobGlnaHQgY29kZVxuICAgICAqXG4gICAgICogQHJldHVybnMge1N1bW1hcnl9IHN1bW1hcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGRDb2RlQmxvY2soY29kZSwgbGFuZykge1xuICAgICAgICBjb25zdCBhdHRycyA9IE9iamVjdC5hc3NpZ24oe30sIChsYW5nICYmIHsgbGFuZyB9KSk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLndyYXAoJ3ByZScsIHRoaXMud3JhcCgnY29kZScsIGNvZGUpLCBhdHRycyk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFJhdyhlbGVtZW50KS5hZGRFT0woKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBIVE1MIGxpc3QgdG8gdGhlIHN1bW1hcnkgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBpdGVtcyBsaXN0IG9mIGl0ZW1zIHRvIHJlbmRlclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29yZGVyZWQ9ZmFsc2VdIChvcHRpb25hbCkgaWYgdGhlIHJlbmRlcmVkIGxpc3Qgc2hvdWxkIGJlIG9yZGVyZWQgb3Igbm90IChkZWZhdWx0OiBmYWxzZSlcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkTGlzdChpdGVtcywgb3JkZXJlZCA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHRhZyA9IG9yZGVyZWQgPyAnb2wnIDogJ3VsJztcbiAgICAgICAgY29uc3QgbGlzdEl0ZW1zID0gaXRlbXMubWFwKGl0ZW0gPT4gdGhpcy53cmFwKCdsaScsIGl0ZW0pKS5qb2luKCcnKTtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMud3JhcCh0YWcsIGxpc3RJdGVtcyk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFJhdyhlbGVtZW50KS5hZGRFT0woKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBIVE1MIHRhYmxlIHRvIHRoZSBzdW1tYXJ5IGJ1ZmZlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdW1tYXJ5VGFibGVDZWxsW119IHJvd3MgdGFibGUgcm93c1xuICAgICAqXG4gICAgICogQHJldHVybnMge1N1bW1hcnl9IHN1bW1hcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGRUYWJsZShyb3dzKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlQm9keSA9IHJvd3NcbiAgICAgICAgICAgIC5tYXAocm93ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNlbGxzID0gcm93XG4gICAgICAgICAgICAgICAgLm1hcChjZWxsID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNlbGwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXAoJ3RkJywgY2VsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHsgaGVhZGVyLCBkYXRhLCBjb2xzcGFuLCByb3dzcGFuIH0gPSBjZWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhZyA9IGhlYWRlciA/ICd0aCcgOiAndGQnO1xuICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCAoY29sc3BhbiAmJiB7IGNvbHNwYW4gfSkpLCAocm93c3BhbiAmJiB7IHJvd3NwYW4gfSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXAodGFnLCBkYXRhLCBhdHRycyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5qb2luKCcnKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXAoJ3RyJywgY2VsbHMpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oJycpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy53cmFwKCd0YWJsZScsIHRhYmxlQm9keSk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFJhdyhlbGVtZW50KS5hZGRFT0woKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNvbGxhcHNhYmxlIEhUTUwgZGV0YWlscyBlbGVtZW50IHRvIHRoZSBzdW1tYXJ5IGJ1ZmZlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsIHRleHQgZm9yIHRoZSBjbG9zZWQgc3RhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCBjb2xsYXBzYWJsZSBjb250ZW50XG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZERldGFpbHMobGFiZWwsIGNvbnRlbnQpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMud3JhcCgnZGV0YWlscycsIHRoaXMud3JhcCgnc3VtbWFyeScsIGxhYmVsKSArIGNvbnRlbnQpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSYXcoZWxlbWVudCkuYWRkRU9MKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gSFRNTCBpbWFnZSB0YWcgdG8gdGhlIHN1bW1hcnkgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3JjIHBhdGggdG8gdGhlIGltYWdlIHlvdSB0byBlbWJlZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhbHQgdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGUgaW1hZ2VcbiAgICAgKiBAcGFyYW0ge1N1bW1hcnlJbWFnZU9wdGlvbnN9IG9wdGlvbnMgKG9wdGlvbmFsKSBhZGRpdGlvbiBpbWFnZSBhdHRyaWJ1dGVzXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZEltYWdlKHNyYywgYWx0LCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgY29uc3QgYXR0cnMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sICh3aWR0aCAmJiB7IHdpZHRoIH0pKSwgKGhlaWdodCAmJiB7IGhlaWdodCB9KSk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLndyYXAoJ2ltZycsIG51bGwsIE9iamVjdC5hc3NpZ24oeyBzcmMsIGFsdCB9LCBhdHRycykpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSYXcoZWxlbWVudCkuYWRkRU9MKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gSFRNTCBzZWN0aW9uIGhlYWRpbmcgZWxlbWVudFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgaGVhZGluZyB0ZXh0XG4gICAgICogQHBhcmFtIHtudW1iZXIgfCBzdHJpbmd9IFtsZXZlbD0xXSAob3B0aW9uYWwpIHRoZSBoZWFkaW5nIGxldmVsLCBkZWZhdWx0OiAxXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZEhlYWRpbmcodGV4dCwgbGV2ZWwpIHtcbiAgICAgICAgY29uc3QgdGFnID0gYGgke2xldmVsfWA7XG4gICAgICAgIGNvbnN0IGFsbG93ZWRUYWcgPSBbJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2J10uaW5jbHVkZXModGFnKVxuICAgICAgICAgICAgPyB0YWdcbiAgICAgICAgICAgIDogJ2gxJztcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMud3JhcChhbGxvd2VkVGFnLCB0ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmF3KGVsZW1lbnQpLmFkZEVPTCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIEhUTUwgdGhlbWF0aWMgYnJlYWsgKDxocj4pIHRvIHRoZSBzdW1tYXJ5IGJ1ZmZlclxuICAgICAqXG4gICAgICogQHJldHVybnMge1N1bW1hcnl9IHN1bW1hcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGRTZXBhcmF0b3IoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLndyYXAoJ2hyJywgbnVsbCk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFJhdyhlbGVtZW50KS5hZGRFT0woKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBIVE1MIGxpbmUgYnJlYWsgKDxicj4pIHRvIHRoZSBzdW1tYXJ5IGJ1ZmZlclxuICAgICAqXG4gICAgICogQHJldHVybnMge1N1bW1hcnl9IHN1bW1hcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGRCcmVhaygpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMud3JhcCgnYnInLCBudWxsKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmF3KGVsZW1lbnQpLmFkZEVPTCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIEhUTUwgYmxvY2txdW90ZSB0byB0aGUgc3VtbWFyeSBidWZmZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IHF1b3RlIHRleHRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2l0ZSAob3B0aW9uYWwpIGNpdGF0aW9uIHVybFxuICAgICAqXG4gICAgICogQHJldHVybnMge1N1bW1hcnl9IHN1bW1hcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGRRdW90ZSh0ZXh0LCBjaXRlKSB7XG4gICAgICAgIGNvbnN0IGF0dHJzID0gT2JqZWN0LmFzc2lnbih7fSwgKGNpdGUgJiYgeyBjaXRlIH0pKTtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMud3JhcCgnYmxvY2txdW90ZScsIHRleHQsIGF0dHJzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmF3KGVsZW1lbnQpLmFkZEVPTCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIEhUTUwgYW5jaG9yIHRhZyB0byB0aGUgc3VtbWFyeSBidWZmZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IGxpbmsgdGV4dC9jb250ZW50XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGhyZWYgaHlwZXJsaW5rXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZExpbmsodGV4dCwgaHJlZikge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy53cmFwKCdhJywgdGV4dCwgeyBocmVmIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSYXcoZWxlbWVudCkuYWRkRU9MKCk7XG4gICAgfVxufVxuY29uc3QgX3N1bW1hcnkgPSBuZXcgU3VtbWFyeSgpO1xuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgYGNvcmUuc3VtbWFyeWBcbiAqL1xuZXhwb3J0cy5tYXJrZG93blN1bW1hcnkgPSBfc3VtbWFyeTtcbmV4cG9ydHMuc3VtbWFyeSA9IF9zdW1tYXJ5O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3VtbWFyeS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy50b1BsYXRmb3JtUGF0aCA9IGV4cG9ydHMudG9XaW4zMlBhdGggPSBleHBvcnRzLnRvUG9zaXhQYXRoID0gdm9pZCAwO1xuY29uc3QgcGF0aCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwicGF0aFwiKSk7XG4vKipcbiAqIHRvUG9zaXhQYXRoIGNvbnZlcnRzIHRoZSBnaXZlbiBwYXRoIHRvIHRoZSBwb3NpeCBmb3JtLiBPbiBXaW5kb3dzLCBcXFxcIHdpbGwgYmVcbiAqIHJlcGxhY2VkIHdpdGggLy5cbiAqXG4gKiBAcGFyYW0gcHRoLiBQYXRoIHRvIHRyYW5zZm9ybS5cbiAqIEByZXR1cm4gc3RyaW5nIFBvc2l4IHBhdGguXG4gKi9cbmZ1bmN0aW9uIHRvUG9zaXhQYXRoKHB0aCkge1xuICAgIHJldHVybiBwdGgucmVwbGFjZSgvW1xcXFxdL2csICcvJyk7XG59XG5leHBvcnRzLnRvUG9zaXhQYXRoID0gdG9Qb3NpeFBhdGg7XG4vKipcbiAqIHRvV2luMzJQYXRoIGNvbnZlcnRzIHRoZSBnaXZlbiBwYXRoIHRvIHRoZSB3aW4zMiBmb3JtLiBPbiBMaW51eCwgLyB3aWxsIGJlXG4gKiByZXBsYWNlZCB3aXRoIFxcXFwuXG4gKlxuICogQHBhcmFtIHB0aC4gUGF0aCB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJuIHN0cmluZyBXaW4zMiBwYXRoLlxuICovXG5mdW5jdGlvbiB0b1dpbjMyUGF0aChwdGgpIHtcbiAgICByZXR1cm4gcHRoLnJlcGxhY2UoL1svXS9nLCAnXFxcXCcpO1xufVxuZXhwb3J0cy50b1dpbjMyUGF0aCA9IHRvV2luMzJQYXRoO1xuLyoqXG4gKiB0b1BsYXRmb3JtUGF0aCBjb252ZXJ0cyB0aGUgZ2l2ZW4gcGF0aCB0byBhIHBsYXRmb3JtLXNwZWNpZmljIHBhdGguIEl0IGRvZXNcbiAqIHRoaXMgYnkgcmVwbGFjaW5nIGluc3RhbmNlcyBvZiAvIGFuZCBcXCB3aXRoIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoXG4gKiBzZXBhcmF0b3IuXG4gKlxuICogQHBhcmFtIHB0aCBUaGUgcGF0aCB0byBwbGF0Zm9ybWl6ZS5cbiAqIEByZXR1cm4gc3RyaW5nIFRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoLlxuICovXG5mdW5jdGlvbiB0b1BsYXRmb3JtUGF0aChwdGgpIHtcbiAgICByZXR1cm4gcHRoLnJlcGxhY2UoL1svXFxcXF0vZywgcGF0aC5zZXApO1xufVxuZXhwb3J0cy50b1BsYXRmb3JtUGF0aCA9IHRvUGxhdGZvcm1QYXRoO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGF0aC11dGlscy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfYTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0Q21kUGF0aCA9IGV4cG9ydHMudHJ5R2V0RXhlY3V0YWJsZVBhdGggPSBleHBvcnRzLmlzUm9vdGVkID0gZXhwb3J0cy5pc0RpcmVjdG9yeSA9IGV4cG9ydHMuZXhpc3RzID0gZXhwb3J0cy5SRUFET05MWSA9IGV4cG9ydHMuVVZfRlNfT19FWExPQ0sgPSBleHBvcnRzLklTX1dJTkRPV1MgPSBleHBvcnRzLnVubGluayA9IGV4cG9ydHMuc3ltbGluayA9IGV4cG9ydHMuc3RhdCA9IGV4cG9ydHMucm1kaXIgPSBleHBvcnRzLnJtID0gZXhwb3J0cy5yZW5hbWUgPSBleHBvcnRzLnJlYWRsaW5rID0gZXhwb3J0cy5yZWFkZGlyID0gZXhwb3J0cy5vcGVuID0gZXhwb3J0cy5ta2RpciA9IGV4cG9ydHMubHN0YXQgPSBleHBvcnRzLmNvcHlGaWxlID0gZXhwb3J0cy5jaG1vZCA9IHZvaWQgMDtcbmNvbnN0IGZzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJmc1wiKSk7XG5jb25zdCBwYXRoID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJwYXRoXCIpKTtcbl9hID0gZnMucHJvbWlzZXNcbi8vIGV4cG9ydCBjb25zdCB7b3Blbn0gPSAnZnMnXG4sIGV4cG9ydHMuY2htb2QgPSBfYS5jaG1vZCwgZXhwb3J0cy5jb3B5RmlsZSA9IF9hLmNvcHlGaWxlLCBleHBvcnRzLmxzdGF0ID0gX2EubHN0YXQsIGV4cG9ydHMubWtkaXIgPSBfYS5ta2RpciwgZXhwb3J0cy5vcGVuID0gX2Eub3BlbiwgZXhwb3J0cy5yZWFkZGlyID0gX2EucmVhZGRpciwgZXhwb3J0cy5yZWFkbGluayA9IF9hLnJlYWRsaW5rLCBleHBvcnRzLnJlbmFtZSA9IF9hLnJlbmFtZSwgZXhwb3J0cy5ybSA9IF9hLnJtLCBleHBvcnRzLnJtZGlyID0gX2Eucm1kaXIsIGV4cG9ydHMuc3RhdCA9IF9hLnN0YXQsIGV4cG9ydHMuc3ltbGluayA9IF9hLnN5bWxpbmssIGV4cG9ydHMudW5saW5rID0gX2EudW5saW5rO1xuLy8gZXhwb3J0IGNvbnN0IHtvcGVufSA9ICdmcydcbmV4cG9ydHMuSVNfV0lORE9XUyA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMic7XG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvZDAxNTNhZWUzNjc0MjJkMDg1ODEwNWFiZWMxODZkYTRkZmYwYTBjNS9kZXBzL3V2L2luY2x1ZGUvdXYvd2luLmgjTDY5MVxuZXhwb3J0cy5VVl9GU19PX0VYTE9DSyA9IDB4MTAwMDAwMDA7XG5leHBvcnRzLlJFQURPTkxZID0gZnMuY29uc3RhbnRzLk9fUkRPTkxZO1xuZnVuY3Rpb24gZXhpc3RzKGZzUGF0aCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB5aWVsZCBleHBvcnRzLnN0YXQoZnNQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xufVxuZXhwb3J0cy5leGlzdHMgPSBleGlzdHM7XG5mdW5jdGlvbiBpc0RpcmVjdG9yeShmc1BhdGgsIHVzZVN0YXQgPSBmYWxzZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRzID0gdXNlU3RhdCA/IHlpZWxkIGV4cG9ydHMuc3RhdChmc1BhdGgpIDogeWllbGQgZXhwb3J0cy5sc3RhdChmc1BhdGgpO1xuICAgICAgICByZXR1cm4gc3RhdHMuaXNEaXJlY3RvcnkoKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuaXNEaXJlY3RvcnkgPSBpc0RpcmVjdG9yeTtcbi8qKlxuICogT24gT1NYL0xpbnV4LCB0cnVlIGlmIHBhdGggc3RhcnRzIHdpdGggJy8nLiBPbiBXaW5kb3dzLCB0cnVlIGZvciBwYXRocyBsaWtlOlxuICogXFwsIFxcaGVsbG8sIFxcXFxoZWxsb1xcc2hhcmUsIEM6LCBhbmQgQzpcXGhlbGxvIChhbmQgY29ycmVzcG9uZGluZyBhbHRlcm5hdGUgc2VwYXJhdG9yIGNhc2VzKS5cbiAqL1xuZnVuY3Rpb24gaXNSb290ZWQocCkge1xuICAgIHAgPSBub3JtYWxpemVTZXBhcmF0b3JzKHApO1xuICAgIGlmICghcCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lzUm9vdGVkKCkgcGFyYW1ldGVyIFwicFwiIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgIH1cbiAgICBpZiAoZXhwb3J0cy5JU19XSU5ET1dTKSB7XG4gICAgICAgIHJldHVybiAocC5zdGFydHNXaXRoKCdcXFxcJykgfHwgL15bQS1aXTovaS50ZXN0KHApIC8vIGUuZy4gXFwgb3IgXFxoZWxsbyBvciBcXFxcaGVsbG9cbiAgICAgICAgKTsgLy8gZS5nLiBDOiBvciBDOlxcaGVsbG9cbiAgICB9XG4gICAgcmV0dXJuIHAuc3RhcnRzV2l0aCgnLycpO1xufVxuZXhwb3J0cy5pc1Jvb3RlZCA9IGlzUm9vdGVkO1xuLyoqXG4gKiBCZXN0IGVmZm9ydCBhdHRlbXB0IHRvIGRldGVybWluZSB3aGV0aGVyIGEgZmlsZSBleGlzdHMgYW5kIGlzIGV4ZWN1dGFibGUuXG4gKiBAcGFyYW0gZmlsZVBhdGggICAgZmlsZSBwYXRoIHRvIGNoZWNrXG4gKiBAcGFyYW0gZXh0ZW5zaW9ucyAgYWRkaXRpb25hbCBmaWxlIGV4dGVuc2lvbnMgdG8gdHJ5XG4gKiBAcmV0dXJuIGlmIGZpbGUgZXhpc3RzIGFuZCBpcyBleGVjdXRhYmxlLCByZXR1cm5zIHRoZSBmaWxlIHBhdGguIG90aGVyd2lzZSBlbXB0eSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIHRyeUdldEV4ZWN1dGFibGVQYXRoKGZpbGVQYXRoLCBleHRlbnNpb25zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHN0YXRzID0gdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gdGVzdCBmaWxlIGV4aXN0c1xuICAgICAgICAgICAgc3RhdHMgPSB5aWVsZCBleHBvcnRzLnN0YXQoZmlsZVBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChlcnIuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBVbmV4cGVjdGVkIGVycm9yIGF0dGVtcHRpbmcgdG8gZGV0ZXJtaW5lIGlmIGV4ZWN1dGFibGUgZmlsZSBleGlzdHMgJyR7ZmlsZVBhdGh9JzogJHtlcnJ9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRzICYmIHN0YXRzLmlzRmlsZSgpKSB7XG4gICAgICAgICAgICBpZiAoZXhwb3J0cy5JU19XSU5ET1dTKSB7XG4gICAgICAgICAgICAgICAgLy8gb24gV2luZG93cywgdGVzdCBmb3IgdmFsaWQgZXh0ZW5zaW9uXG4gICAgICAgICAgICAgICAgY29uc3QgdXBwZXJFeHQgPSBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGV4dGVuc2lvbnMuc29tZSh2YWxpZEV4dCA9PiB2YWxpZEV4dC50b1VwcGVyQ2FzZSgpID09PSB1cHBlckV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVQYXRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChpc1VuaXhFeGVjdXRhYmxlKHN0YXRzKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZVBhdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHRyeSBlYWNoIGV4dGVuc2lvblxuICAgICAgICBjb25zdCBvcmlnaW5hbEZpbGVQYXRoID0gZmlsZVBhdGg7XG4gICAgICAgIGZvciAoY29uc3QgZXh0ZW5zaW9uIG9mIGV4dGVuc2lvbnMpIHtcbiAgICAgICAgICAgIGZpbGVQYXRoID0gb3JpZ2luYWxGaWxlUGF0aCArIGV4dGVuc2lvbjtcbiAgICAgICAgICAgIHN0YXRzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBzdGF0cyA9IHlpZWxkIGV4cG9ydHMuc3RhdChmaWxlUGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVyci5jb2RlICE9PSAnRU5PRU5UJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgVW5leHBlY3RlZCBlcnJvciBhdHRlbXB0aW5nIHRvIGRldGVybWluZSBpZiBleGVjdXRhYmxlIGZpbGUgZXhpc3RzICcke2ZpbGVQYXRofSc6ICR7ZXJyfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGF0cyAmJiBzdGF0cy5pc0ZpbGUoKSkge1xuICAgICAgICAgICAgICAgIGlmIChleHBvcnRzLklTX1dJTkRPV1MpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJlc2VydmUgdGhlIGNhc2Ugb2YgdGhlIGFjdHVhbCBmaWxlIChzaW5jZSBhbiBleHRlbnNpb24gd2FzIGFwcGVuZGVkKVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0b3J5ID0gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwcGVyTmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFjdHVhbE5hbWUgb2YgeWllbGQgZXhwb3J0cy5yZWFkZGlyKGRpcmVjdG9yeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBwZXJOYW1lID09PSBhY3R1YWxOYW1lLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyZWN0b3J5LCBhY3R1YWxOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgVW5leHBlY3RlZCBlcnJvciBhdHRlbXB0aW5nIHRvIGRldGVybWluZSB0aGUgYWN0dWFsIGNhc2Ugb2YgdGhlIGZpbGUgJyR7ZmlsZVBhdGh9JzogJHtlcnJ9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVQYXRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVW5peEV4ZWN1dGFibGUoc3RhdHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZVBhdGg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH0pO1xufVxuZXhwb3J0cy50cnlHZXRFeGVjdXRhYmxlUGF0aCA9IHRyeUdldEV4ZWN1dGFibGVQYXRoO1xuZnVuY3Rpb24gbm9ybWFsaXplU2VwYXJhdG9ycyhwKSB7XG4gICAgcCA9IHAgfHwgJyc7XG4gICAgaWYgKGV4cG9ydHMuSVNfV0lORE9XUykge1xuICAgICAgICAvLyBjb252ZXJ0IHNsYXNoZXMgb24gV2luZG93c1xuICAgICAgICBwID0gcC5yZXBsYWNlKC9cXC8vZywgJ1xcXFwnKTtcbiAgICAgICAgLy8gcmVtb3ZlIHJlZHVuZGFudCBzbGFzaGVzXG4gICAgICAgIHJldHVybiBwLnJlcGxhY2UoL1xcXFxcXFxcKy9nLCAnXFxcXCcpO1xuICAgIH1cbiAgICAvLyByZW1vdmUgcmVkdW5kYW50IHNsYXNoZXNcbiAgICByZXR1cm4gcC5yZXBsYWNlKC9cXC9cXC8rL2csICcvJyk7XG59XG4vLyBvbiBNYWMvTGludXgsIHRlc3QgdGhlIGV4ZWN1dGUgYml0XG4vLyAgICAgUiAgIFcgIFggIFIgIFcgWCBSIFcgWFxuLy8gICAyNTYgMTI4IDY0IDMyIDE2IDggNCAyIDFcbmZ1bmN0aW9uIGlzVW5peEV4ZWN1dGFibGUoc3RhdHMpIHtcbiAgICByZXR1cm4gKChzdGF0cy5tb2RlICYgMSkgPiAwIHx8XG4gICAgICAgICgoc3RhdHMubW9kZSAmIDgpID4gMCAmJiBzdGF0cy5naWQgPT09IHByb2Nlc3MuZ2V0Z2lkKCkpIHx8XG4gICAgICAgICgoc3RhdHMubW9kZSAmIDY0KSA+IDAgJiYgc3RhdHMudWlkID09PSBwcm9jZXNzLmdldHVpZCgpKSk7XG59XG4vLyBHZXQgdGhlIHBhdGggb2YgY21kLmV4ZSBpbiB3aW5kb3dzXG5mdW5jdGlvbiBnZXRDbWRQYXRoKCkge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gKF9hID0gcHJvY2Vzcy5lbnZbJ0NPTVNQRUMnXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogYGNtZC5leGVgO1xufVxuZXhwb3J0cy5nZXRDbWRQYXRoID0gZ2V0Q21kUGF0aDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlvLXV0aWwuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmZpbmRJblBhdGggPSBleHBvcnRzLndoaWNoID0gZXhwb3J0cy5ta2RpclAgPSBleHBvcnRzLnJtUkYgPSBleHBvcnRzLm12ID0gZXhwb3J0cy5jcCA9IHZvaWQgMDtcbmNvbnN0IGFzc2VydF8xID0gcmVxdWlyZShcImFzc2VydFwiKTtcbmNvbnN0IHBhdGggPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInBhdGhcIikpO1xuY29uc3QgaW9VdGlsID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL2lvLXV0aWxcIikpO1xuLyoqXG4gKiBDb3BpZXMgYSBmaWxlIG9yIGZvbGRlci5cbiAqIEJhc2VkIG9mZiBvZiBzaGVsbGpzIC0gaHR0cHM6Ly9naXRodWIuY29tL3NoZWxsanMvc2hlbGxqcy9ibG9iLzkyMzdmNjZjNTJlNWRhYTQwNDU4Zjk0Zjk1NjVlMThlODEzMmY1YTYvc3JjL2NwLmpzXG4gKlxuICogQHBhcmFtICAgICBzb3VyY2UgICAgc291cmNlIHBhdGhcbiAqIEBwYXJhbSAgICAgZGVzdCAgICAgIGRlc3RpbmF0aW9uIHBhdGhcbiAqIEBwYXJhbSAgICAgb3B0aW9ucyAgIG9wdGlvbmFsLiBTZWUgQ29weU9wdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGNwKHNvdXJjZSwgZGVzdCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgeyBmb3JjZSwgcmVjdXJzaXZlLCBjb3B5U291cmNlRGlyZWN0b3J5IH0gPSByZWFkQ29weU9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGRlc3RTdGF0ID0gKHlpZWxkIGlvVXRpbC5leGlzdHMoZGVzdCkpID8geWllbGQgaW9VdGlsLnN0YXQoZGVzdCkgOiBudWxsO1xuICAgICAgICAvLyBEZXN0IGlzIGFuIGV4aXN0aW5nIGZpbGUsIGJ1dCBub3QgZm9yY2luZ1xuICAgICAgICBpZiAoZGVzdFN0YXQgJiYgZGVzdFN0YXQuaXNGaWxlKCkgJiYgIWZvcmNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgZGVzdCBpcyBhbiBleGlzdGluZyBkaXJlY3RvcnksIHNob3VsZCBjb3B5IGluc2lkZS5cbiAgICAgICAgY29uc3QgbmV3RGVzdCA9IGRlc3RTdGF0ICYmIGRlc3RTdGF0LmlzRGlyZWN0b3J5KCkgJiYgY29weVNvdXJjZURpcmVjdG9yeVxuICAgICAgICAgICAgPyBwYXRoLmpvaW4oZGVzdCwgcGF0aC5iYXNlbmFtZShzb3VyY2UpKVxuICAgICAgICAgICAgOiBkZXN0O1xuICAgICAgICBpZiAoISh5aWVsZCBpb1V0aWwuZXhpc3RzKHNvdXJjZSkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIHN1Y2ggZmlsZSBvciBkaXJlY3Rvcnk6ICR7c291cmNlfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZVN0YXQgPSB5aWVsZCBpb1V0aWwuc3RhdChzb3VyY2UpO1xuICAgICAgICBpZiAoc291cmNlU3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICBpZiAoIXJlY3Vyc2l2ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNvcHkuICR7c291cmNlfSBpcyBhIGRpcmVjdG9yeSwgYnV0IHRyaWVkIHRvIGNvcHkgd2l0aG91dCByZWN1cnNpdmUgZmxhZy5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHlpZWxkIGNwRGlyUmVjdXJzaXZlKHNvdXJjZSwgbmV3RGVzdCwgMCwgZm9yY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHBhdGgucmVsYXRpdmUoc291cmNlLCBuZXdEZXN0KSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAvLyBhIGZpbGUgY2Fubm90IGJlIGNvcGllZCB0byBpdHNlbGZcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke25ld0Rlc3R9JyBhbmQgJyR7c291cmNlfScgYXJlIHRoZSBzYW1lIGZpbGVgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkIGNvcHlGaWxlKHNvdXJjZSwgbmV3RGVzdCwgZm9yY2UpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnRzLmNwID0gY3A7XG4vKipcbiAqIE1vdmVzIGEgcGF0aC5cbiAqXG4gKiBAcGFyYW0gICAgIHNvdXJjZSAgICBzb3VyY2UgcGF0aFxuICogQHBhcmFtICAgICBkZXN0ICAgICAgZGVzdGluYXRpb24gcGF0aFxuICogQHBhcmFtICAgICBvcHRpb25zICAgb3B0aW9uYWwuIFNlZSBNb3ZlT3B0aW9ucy5cbiAqL1xuZnVuY3Rpb24gbXYoc291cmNlLCBkZXN0LCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBpZiAoeWllbGQgaW9VdGlsLmV4aXN0cyhkZXN0KSkge1xuICAgICAgICAgICAgbGV0IGRlc3RFeGlzdHMgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHlpZWxkIGlvVXRpbC5pc0RpcmVjdG9yeShkZXN0KSkge1xuICAgICAgICAgICAgICAgIC8vIElmIGRlc3QgaXMgZGlyZWN0b3J5IGNvcHkgc3JjIGludG8gZGVzdFxuICAgICAgICAgICAgICAgIGRlc3QgPSBwYXRoLmpvaW4oZGVzdCwgcGF0aC5iYXNlbmFtZShzb3VyY2UpKTtcbiAgICAgICAgICAgICAgICBkZXN0RXhpc3RzID0geWllbGQgaW9VdGlsLmV4aXN0cyhkZXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkZXN0RXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZm9yY2UgPT0gbnVsbCB8fCBvcHRpb25zLmZvcmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHJtUkYoZGVzdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Rlc3RpbmF0aW9uIGFscmVhZHkgZXhpc3RzJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHlpZWxkIG1rZGlyUChwYXRoLmRpcm5hbWUoZGVzdCkpO1xuICAgICAgICB5aWVsZCBpb1V0aWwucmVuYW1lKHNvdXJjZSwgZGVzdCk7XG4gICAgfSk7XG59XG5leHBvcnRzLm12ID0gbXY7XG4vKipcbiAqIFJlbW92ZSBhIHBhdGggcmVjdXJzaXZlbHkgd2l0aCBmb3JjZVxuICpcbiAqIEBwYXJhbSBpbnB1dFBhdGggcGF0aCB0byByZW1vdmVcbiAqL1xuZnVuY3Rpb24gcm1SRihpbnB1dFBhdGgpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBpZiAoaW9VdGlsLklTX1dJTkRPV1MpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGZvciBpbnZhbGlkIGNoYXJhY3RlcnNcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3dpbmRvd3Mvd2luMzIvZmlsZWlvL25hbWluZy1hLWZpbGVcbiAgICAgICAgICAgIGlmICgvWypcIjw+fF0vLnRlc3QoaW5wdXRQYXRoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmlsZSBwYXRoIG11c3Qgbm90IGNvbnRhaW4gYCpgLCBgXCJgLCBgPGAsIGA+YCBvciBgfGAgb24gV2luZG93cycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBub3RlIGlmIHBhdGggZG9lcyBub3QgZXhpc3QsIGVycm9yIGlzIHNpbGVudFxuICAgICAgICAgICAgeWllbGQgaW9VdGlsLnJtKGlucHV0UGF0aCwge1xuICAgICAgICAgICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgICAgICAgICAgIG1heFJldHJpZXM6IDMsXG4gICAgICAgICAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHJldHJ5RGVsYXk6IDMwMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIHdhcyB1bmFibGUgdG8gYmUgcmVtb3ZlZCAke2Vycn1gKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuZXhwb3J0cy5ybVJGID0gcm1SRjtcbi8qKlxuICogTWFrZSBhIGRpcmVjdG9yeS4gIENyZWF0ZXMgdGhlIGZ1bGwgcGF0aCB3aXRoIGZvbGRlcnMgaW4gYmV0d2VlblxuICogV2lsbCB0aHJvdyBpZiBpdCBmYWlsc1xuICpcbiAqIEBwYXJhbSAgIGZzUGF0aCAgICAgICAgcGF0aCB0byBjcmVhdGVcbiAqIEByZXR1cm5zIFByb21pc2U8dm9pZD5cbiAqL1xuZnVuY3Rpb24gbWtkaXJQKGZzUGF0aCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGFzc2VydF8xLm9rKGZzUGF0aCwgJ2EgcGF0aCBhcmd1bWVudCBtdXN0IGJlIHByb3ZpZGVkJyk7XG4gICAgICAgIHlpZWxkIGlvVXRpbC5ta2Rpcihmc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0cy5ta2RpclAgPSBta2RpclA7XG4vKipcbiAqIFJldHVybnMgcGF0aCBvZiBhIHRvb2wgaGFkIHRoZSB0b29sIGFjdHVhbGx5IGJlZW4gaW52b2tlZC4gIFJlc29sdmVzIHZpYSBwYXRocy5cbiAqIElmIHlvdSBjaGVjayBhbmQgdGhlIHRvb2wgZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgdGhyb3cuXG4gKlxuICogQHBhcmFtICAgICB0b29sICAgICAgICAgICAgICBuYW1lIG9mIHRoZSB0b29sXG4gKiBAcGFyYW0gICAgIGNoZWNrICAgICAgICAgICAgIHdoZXRoZXIgdG8gY2hlY2sgaWYgdG9vbCBleGlzdHNcbiAqIEByZXR1cm5zICAgUHJvbWlzZTxzdHJpbmc+ICAgcGF0aCB0byB0b29sXG4gKi9cbmZ1bmN0aW9uIHdoaWNoKHRvb2wsIGNoZWNrKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgaWYgKCF0b29sKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwYXJhbWV0ZXIgJ3Rvb2wnIGlzIHJlcXVpcmVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJlY3Vyc2l2ZSB3aGVuIGNoZWNrPXRydWVcbiAgICAgICAgaWYgKGNoZWNrKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCB3aGljaCh0b29sLCBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGlmIChpb1V0aWwuSVNfV0lORE9XUykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2NhdGUgZXhlY3V0YWJsZSBmaWxlOiAke3Rvb2x9LiBQbGVhc2UgdmVyaWZ5IGVpdGhlciB0aGUgZmlsZSBwYXRoIGV4aXN0cyBvciB0aGUgZmlsZSBjYW4gYmUgZm91bmQgd2l0aGluIGEgZGlyZWN0b3J5IHNwZWNpZmllZCBieSB0aGUgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gQWxzbyB2ZXJpZnkgdGhlIGZpbGUgaGFzIGEgdmFsaWQgZXh0ZW5zaW9uIGZvciBhbiBleGVjdXRhYmxlIGZpbGUuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2NhdGUgZXhlY3V0YWJsZSBmaWxlOiAke3Rvb2x9LiBQbGVhc2UgdmVyaWZ5IGVpdGhlciB0aGUgZmlsZSBwYXRoIGV4aXN0cyBvciB0aGUgZmlsZSBjYW4gYmUgZm91bmQgd2l0aGluIGEgZGlyZWN0b3J5IHNwZWNpZmllZCBieSB0aGUgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gQWxzbyBjaGVjayB0aGUgZmlsZSBtb2RlIHRvIHZlcmlmeSB0aGUgZmlsZSBpcyBleGVjdXRhYmxlLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IHlpZWxkIGZpbmRJblBhdGgodG9vbCk7XG4gICAgICAgIGlmIChtYXRjaGVzICYmIG1hdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXNbMF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH0pO1xufVxuZXhwb3J0cy53aGljaCA9IHdoaWNoO1xuLyoqXG4gKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIGdpdmVuIHRvb2wgb24gdGhlIHN5c3RlbSBwYXRoLlxuICpcbiAqIEByZXR1cm5zICAgUHJvbWlzZTxzdHJpbmdbXT4gIHRoZSBwYXRocyBvZiB0aGUgdG9vbFxuICovXG5mdW5jdGlvbiBmaW5kSW5QYXRoKHRvb2wpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBpZiAoIXRvb2wpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInBhcmFtZXRlciAndG9vbCcgaXMgcmVxdWlyZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYnVpbGQgdGhlIGxpc3Qgb2YgZXh0ZW5zaW9ucyB0byB0cnlcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9ucyA9IFtdO1xuICAgICAgICBpZiAoaW9VdGlsLklTX1dJTkRPV1MgJiYgcHJvY2Vzcy5lbnZbJ1BBVEhFWFQnXSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBleHRlbnNpb24gb2YgcHJvY2Vzcy5lbnZbJ1BBVEhFWFQnXS5zcGxpdChwYXRoLmRlbGltaXRlcikpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMucHVzaChleHRlbnNpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBpdCdzIHJvb3RlZCwgcmV0dXJuIGl0IGlmIGV4aXN0cy4gb3RoZXJ3aXNlIHJldHVybiBlbXB0eS5cbiAgICAgICAgaWYgKGlvVXRpbC5pc1Jvb3RlZCh0b29sKSkge1xuICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSB5aWVsZCBpb1V0aWwudHJ5R2V0RXhlY3V0YWJsZVBhdGgodG9vbCwgZXh0ZW5zaW9ucyk7XG4gICAgICAgICAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2ZpbGVQYXRoXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBhbnkgcGF0aCBzZXBhcmF0b3JzLCByZXR1cm4gZW1wdHlcbiAgICAgICAgaWYgKHRvb2wuaW5jbHVkZXMocGF0aC5zZXApKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgLy8gYnVpbGQgdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXNcbiAgICAgICAgLy9cbiAgICAgICAgLy8gTm90ZSwgdGVjaG5pY2FsbHkgXCJ3aGVyZVwiIGNoZWNrcyB0aGUgY3VycmVudCBkaXJlY3Rvcnkgb24gV2luZG93cy4gRnJvbSBhIHRvb2xraXQgcGVyc3BlY3RpdmUsXG4gICAgICAgIC8vIGl0IGZlZWxzIGxpa2Ugd2Ugc2hvdWxkIG5vdCBkbyB0aGlzLiBDaGVja2luZyB0aGUgY3VycmVudCBkaXJlY3Rvcnkgc2VlbXMgbGlrZSBtb3JlIG9mIGEgdXNlXG4gICAgICAgIC8vIGNhc2Ugb2YgYSBzaGVsbCwgYW5kIHRoZSB3aGljaCgpIGZ1bmN0aW9uIGV4cG9zZWQgYnkgdGhlIHRvb2xraXQgc2hvdWxkIHN0cml2ZSBmb3IgY29uc2lzdGVuY3lcbiAgICAgICAgLy8gYWNyb3NzIHBsYXRmb3Jtcy5cbiAgICAgICAgY29uc3QgZGlyZWN0b3JpZXMgPSBbXTtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LlBBVEgpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcCBvZiBwcm9jZXNzLmVudi5QQVRILnNwbGl0KHBhdGguZGVsaW1pdGVyKSkge1xuICAgICAgICAgICAgICAgIGlmIChwKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzLnB1c2gocCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGZpbmQgYWxsIG1hdGNoZXNcbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGRpcmVjdG9yeSBvZiBkaXJlY3Rvcmllcykge1xuICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSB5aWVsZCBpb1V0aWwudHJ5R2V0RXhlY3V0YWJsZVBhdGgocGF0aC5qb2luKGRpcmVjdG9yeSwgdG9vbCksIGV4dGVuc2lvbnMpO1xuICAgICAgICAgICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF0Y2hlcztcbiAgICB9KTtcbn1cbmV4cG9ydHMuZmluZEluUGF0aCA9IGZpbmRJblBhdGg7XG5mdW5jdGlvbiByZWFkQ29weU9wdGlvbnMob3B0aW9ucykge1xuICAgIGNvbnN0IGZvcmNlID0gb3B0aW9ucy5mb3JjZSA9PSBudWxsID8gdHJ1ZSA6IG9wdGlvbnMuZm9yY2U7XG4gICAgY29uc3QgcmVjdXJzaXZlID0gQm9vbGVhbihvcHRpb25zLnJlY3Vyc2l2ZSk7XG4gICAgY29uc3QgY29weVNvdXJjZURpcmVjdG9yeSA9IG9wdGlvbnMuY29weVNvdXJjZURpcmVjdG9yeSA9PSBudWxsXG4gICAgICAgID8gdHJ1ZVxuICAgICAgICA6IEJvb2xlYW4ob3B0aW9ucy5jb3B5U291cmNlRGlyZWN0b3J5KTtcbiAgICByZXR1cm4geyBmb3JjZSwgcmVjdXJzaXZlLCBjb3B5U291cmNlRGlyZWN0b3J5IH07XG59XG5mdW5jdGlvbiBjcERpclJlY3Vyc2l2ZShzb3VyY2VEaXIsIGRlc3REaXIsIGN1cnJlbnREZXB0aCwgZm9yY2UpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAvLyBFbnN1cmUgdGhlcmUgaXMgbm90IGEgcnVuIGF3YXkgcmVjdXJzaXZlIGNvcHlcbiAgICAgICAgaWYgKGN1cnJlbnREZXB0aCA+PSAyNTUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGN1cnJlbnREZXB0aCsrO1xuICAgICAgICB5aWVsZCBta2RpclAoZGVzdERpcik7XG4gICAgICAgIGNvbnN0IGZpbGVzID0geWllbGQgaW9VdGlsLnJlYWRkaXIoc291cmNlRGlyKTtcbiAgICAgICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgY29uc3Qgc3JjRmlsZSA9IGAke3NvdXJjZURpcn0vJHtmaWxlTmFtZX1gO1xuICAgICAgICAgICAgY29uc3QgZGVzdEZpbGUgPSBgJHtkZXN0RGlyfS8ke2ZpbGVOYW1lfWA7XG4gICAgICAgICAgICBjb25zdCBzcmNGaWxlU3RhdCA9IHlpZWxkIGlvVXRpbC5sc3RhdChzcmNGaWxlKTtcbiAgICAgICAgICAgIGlmIChzcmNGaWxlU3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVjdXJzZVxuICAgICAgICAgICAgICAgIHlpZWxkIGNwRGlyUmVjdXJzaXZlKHNyY0ZpbGUsIGRlc3RGaWxlLCBjdXJyZW50RGVwdGgsIGZvcmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHlpZWxkIGNvcHlGaWxlKHNyY0ZpbGUsIGRlc3RGaWxlLCBmb3JjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hhbmdlIHRoZSBtb2RlIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBkaXJlY3RvcnlcbiAgICAgICAgeWllbGQgaW9VdGlsLmNobW9kKGRlc3REaXIsICh5aWVsZCBpb1V0aWwuc3RhdChzb3VyY2VEaXIpKS5tb2RlKTtcbiAgICB9KTtcbn1cbi8vIEJ1ZmZlcmVkIGZpbGUgY29weVxuZnVuY3Rpb24gY29weUZpbGUoc3JjRmlsZSwgZGVzdEZpbGUsIGZvcmNlKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgaWYgKCh5aWVsZCBpb1V0aWwubHN0YXQoc3JjRmlsZSkpLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgICAgICAgIC8vIHVubGluay9yZS1saW5rIGl0XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGlvVXRpbC5sc3RhdChkZXN0RmlsZSk7XG4gICAgICAgICAgICAgICAgeWllbGQgaW9VdGlsLnVubGluayhkZXN0RmlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIFRyeSB0byBvdmVycmlkZSBmaWxlIHBlcm1pc3Npb25cbiAgICAgICAgICAgICAgICBpZiAoZS5jb2RlID09PSAnRVBFUk0nKSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGlvVXRpbC5jaG1vZChkZXN0RmlsZSwgJzA2NjYnKTtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgaW9VdGlsLnVubGluayhkZXN0RmlsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIG90aGVyIGVycm9ycyA9IGl0IGRvZXNuJ3QgZXhpc3QsIG5vIHdvcmsgdG8gZG9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENvcHkgb3ZlciBzeW1saW5rXG4gICAgICAgICAgICBjb25zdCBzeW1saW5rRnVsbCA9IHlpZWxkIGlvVXRpbC5yZWFkbGluayhzcmNGaWxlKTtcbiAgICAgICAgICAgIHlpZWxkIGlvVXRpbC5zeW1saW5rKHN5bWxpbmtGdWxsLCBkZXN0RmlsZSwgaW9VdGlsLklTX1dJTkRPV1MgPyAnanVuY3Rpb24nIDogbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoISh5aWVsZCBpb1V0aWwuZXhpc3RzKGRlc3RGaWxlKSkgfHwgZm9yY2UpIHtcbiAgICAgICAgICAgIHlpZWxkIGlvVXRpbC5jb3B5RmlsZShzcmNGaWxlLCBkZXN0RmlsZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlvLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5hcmdTdHJpbmdUb0FycmF5ID0gZXhwb3J0cy5Ub29sUnVubmVyID0gdm9pZCAwO1xuY29uc3Qgb3MgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIm9zXCIpKTtcbmNvbnN0IGV2ZW50cyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiZXZlbnRzXCIpKTtcbmNvbnN0IGNoaWxkID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJjaGlsZF9wcm9jZXNzXCIpKTtcbmNvbnN0IHBhdGggPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInBhdGhcIikpO1xuY29uc3QgaW8gPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIkBhY3Rpb25zL2lvXCIpKTtcbmNvbnN0IGlvVXRpbCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiQGFjdGlvbnMvaW8vbGliL2lvLXV0aWxcIikpO1xuY29uc3QgdGltZXJzXzEgPSByZXF1aXJlKFwidGltZXJzXCIpO1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kICovXG5jb25zdCBJU19XSU5ET1dTID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcbi8qXG4gKiBDbGFzcyBmb3IgcnVubmluZyBjb21tYW5kIGxpbmUgdG9vbHMuIEhhbmRsZXMgcXVvdGluZyBhbmQgYXJnIHBhcnNpbmcgaW4gYSBwbGF0Zm9ybSBhZ25vc3RpYyB3YXkuXG4gKi9cbmNsYXNzIFRvb2xSdW5uZXIgZXh0ZW5kcyBldmVudHMuRXZlbnRFbWl0dGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih0b29sUGF0aCwgYXJncywgb3B0aW9ucykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBpZiAoIXRvb2xQYXRoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXJhbWV0ZXIgJ3Rvb2xQYXRoJyBjYW5ub3QgYmUgbnVsbCBvciBlbXB0eS5cIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50b29sUGF0aCA9IHRvb2xQYXRoO1xuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzIHx8IFtdO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIH1cbiAgICBfZGVidWcobWVzc2FnZSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxpc3RlbmVycyAmJiB0aGlzLm9wdGlvbnMubGlzdGVuZXJzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMubGlzdGVuZXJzLmRlYnVnKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9nZXRDb21tYW5kU3RyaW5nKG9wdGlvbnMsIG5vUHJlZml4KSB7XG4gICAgICAgIGNvbnN0IHRvb2xQYXRoID0gdGhpcy5fZ2V0U3Bhd25GaWxlTmFtZSgpO1xuICAgICAgICBjb25zdCBhcmdzID0gdGhpcy5fZ2V0U3Bhd25BcmdzKG9wdGlvbnMpO1xuICAgICAgICBsZXQgY21kID0gbm9QcmVmaXggPyAnJyA6ICdbY29tbWFuZF0nOyAvLyBvbWl0IHByZWZpeCB3aGVuIHBpcGVkIHRvIGEgc2Vjb25kIHRvb2xcbiAgICAgICAgaWYgKElTX1dJTkRPV1MpIHtcbiAgICAgICAgICAgIC8vIFdpbmRvd3MgKyBjbWQgZmlsZVxuICAgICAgICAgICAgaWYgKHRoaXMuX2lzQ21kRmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgY21kICs9IHRvb2xQYXRoO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYSBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNtZCArPSBgICR7YX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdpbmRvd3MgKyB2ZXJiYXRpbVxuICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9ucy53aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHMpIHtcbiAgICAgICAgICAgICAgICBjbWQgKz0gYFwiJHt0b29sUGF0aH1cImA7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBhIG9mIGFyZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgY21kICs9IGAgJHthfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gV2luZG93cyAocmVndWxhcilcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNtZCArPSB0aGlzLl93aW5kb3dzUXVvdGVDbWRBcmcodG9vbFBhdGgpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYSBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNtZCArPSBgICR7dGhpcy5fd2luZG93c1F1b3RlQ21kQXJnKGEpfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gT1NYL0xpbnV4IC0gdGhpcyBjYW4gbGlrZWx5IGJlIGltcHJvdmVkIHdpdGggc29tZSBmb3JtIG9mIHF1b3RpbmcuXG4gICAgICAgICAgICAvLyBjcmVhdGluZyBwcm9jZXNzZXMgb24gVW5peCBpcyBmdW5kYW1lbnRhbGx5IGRpZmZlcmVudCB0aGFuIFdpbmRvd3MuXG4gICAgICAgICAgICAvLyBvbiBVbml4LCBleGVjdnAoKSB0YWtlcyBhbiBhcmcgYXJyYXkuXG4gICAgICAgICAgICBjbWQgKz0gdG9vbFBhdGg7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGEgb2YgYXJncykge1xuICAgICAgICAgICAgICAgIGNtZCArPSBgICR7YX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbWQ7XG4gICAgfVxuICAgIF9wcm9jZXNzTGluZUJ1ZmZlcihkYXRhLCBzdHJCdWZmZXIsIG9uTGluZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHMgPSBzdHJCdWZmZXIgKyBkYXRhLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBsZXQgbiA9IHMuaW5kZXhPZihvcy5FT0wpO1xuICAgICAgICAgICAgd2hpbGUgKG4gPiAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBzLnN1YnN0cmluZygwLCBuKTtcbiAgICAgICAgICAgICAgICBvbkxpbmUobGluZSk7XG4gICAgICAgICAgICAgICAgLy8gdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyAuLi5cbiAgICAgICAgICAgICAgICBzID0gcy5zdWJzdHJpbmcobiArIG9zLkVPTC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIG4gPSBzLmluZGV4T2Yob3MuRU9MKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIHN0cmVhbWluZyBsaW5lcyB0byBjb25zb2xlIGlzIGJlc3QgZWZmb3J0LiAgRG9uJ3QgZmFpbCBhIGJ1aWxkLlxuICAgICAgICAgICAgdGhpcy5fZGVidWcoYGVycm9yIHByb2Nlc3NpbmcgbGluZS4gRmFpbGVkIHdpdGggZXJyb3IgJHtlcnJ9YCk7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2dldFNwYXduRmlsZU5hbWUoKSB7XG4gICAgICAgIGlmIChJU19XSU5ET1dTKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5faXNDbWRGaWxlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnZbJ0NPTVNQRUMnXSB8fCAnY21kLmV4ZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudG9vbFBhdGg7XG4gICAgfVxuICAgIF9nZXRTcGF3bkFyZ3Mob3B0aW9ucykge1xuICAgICAgICBpZiAoSVNfV0lORE9XUykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2lzQ21kRmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGFyZ2xpbmUgPSBgL0QgL1MgL0MgXCIke3RoaXMuX3dpbmRvd3NRdW90ZUNtZEFyZyh0aGlzLnRvb2xQYXRoKX1gO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYSBvZiB0aGlzLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnbGluZSArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgIGFyZ2xpbmUgKz0gb3B0aW9ucy53aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl93aW5kb3dzUXVvdGVDbWRBcmcoYSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFyZ2xpbmUgKz0gJ1wiJztcbiAgICAgICAgICAgICAgICByZXR1cm4gW2FyZ2xpbmVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmFyZ3M7XG4gICAgfVxuICAgIF9lbmRzV2l0aChzdHIsIGVuZCkge1xuICAgICAgICByZXR1cm4gc3RyLmVuZHNXaXRoKGVuZCk7XG4gICAgfVxuICAgIF9pc0NtZEZpbGUoKSB7XG4gICAgICAgIGNvbnN0IHVwcGVyVG9vbFBhdGggPSB0aGlzLnRvb2xQYXRoLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiAodGhpcy5fZW5kc1dpdGgodXBwZXJUb29sUGF0aCwgJy5DTUQnKSB8fFxuICAgICAgICAgICAgdGhpcy5fZW5kc1dpdGgodXBwZXJUb29sUGF0aCwgJy5CQVQnKSk7XG4gICAgfVxuICAgIF93aW5kb3dzUXVvdGVDbWRBcmcoYXJnKSB7XG4gICAgICAgIC8vIGZvciAuZXhlLCBhcHBseSB0aGUgbm9ybWFsIHF1b3RpbmcgcnVsZXMgdGhhdCBsaWJ1diBhcHBsaWVzXG4gICAgICAgIGlmICghdGhpcy5faXNDbWRGaWxlKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91dlF1b3RlQ21kQXJnKGFyZyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlIGFwcGx5IHF1b3RpbmcgcnVsZXMgc3BlY2lmaWMgdG8gdGhlIGNtZC5leGUgY29tbWFuZCBsaW5lIHBhcnNlci5cbiAgICAgICAgLy8gdGhlIGxpYnV2IHJ1bGVzIGFyZSBnZW5lcmljIGFuZCBhcmUgbm90IGRlc2lnbmVkIHNwZWNpZmljYWxseSBmb3IgY21kLmV4ZVxuICAgICAgICAvLyBjb21tYW5kIGxpbmUgcGFyc2VyLlxuICAgICAgICAvL1xuICAgICAgICAvLyBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgY21kLmV4ZSBjb21tYW5kIGxpbmUgcGFyc2VyLCByZWZlciB0b1xuICAgICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQwOTQ2OTkvaG93LWRvZXMtdGhlLXdpbmRvd3MtY29tbWFuZC1pbnRlcnByZXRlci1jbWQtZXhlLXBhcnNlLXNjcmlwdHMvNzk3MDkxMiM3OTcwOTEyXG4gICAgICAgIC8vIG5lZWQgcXVvdGVzIGZvciBlbXB0eSBhcmdcbiAgICAgICAgaWYgKCFhcmcpIHtcbiAgICAgICAgICAgIHJldHVybiAnXCJcIic7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFyZyBuZWVkcyB0byBiZSBxdW90ZWRcbiAgICAgICAgY29uc3QgY21kU3BlY2lhbENoYXJzID0gW1xuICAgICAgICAgICAgJyAnLFxuICAgICAgICAgICAgJ1xcdCcsXG4gICAgICAgICAgICAnJicsXG4gICAgICAgICAgICAnKCcsXG4gICAgICAgICAgICAnKScsXG4gICAgICAgICAgICAnWycsXG4gICAgICAgICAgICAnXScsXG4gICAgICAgICAgICAneycsXG4gICAgICAgICAgICAnfScsXG4gICAgICAgICAgICAnXicsXG4gICAgICAgICAgICAnPScsXG4gICAgICAgICAgICAnOycsXG4gICAgICAgICAgICAnIScsXG4gICAgICAgICAgICBcIidcIixcbiAgICAgICAgICAgICcrJyxcbiAgICAgICAgICAgICcsJyxcbiAgICAgICAgICAgICdgJyxcbiAgICAgICAgICAgICd+JyxcbiAgICAgICAgICAgICd8JyxcbiAgICAgICAgICAgICc8JyxcbiAgICAgICAgICAgICc+JyxcbiAgICAgICAgICAgICdcIidcbiAgICAgICAgXTtcbiAgICAgICAgbGV0IG5lZWRzUXVvdGVzID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgY2hhciBvZiBhcmcpIHtcbiAgICAgICAgICAgIGlmIChjbWRTcGVjaWFsQ2hhcnMuc29tZSh4ID0+IHggPT09IGNoYXIpKSB7XG4gICAgICAgICAgICAgICAgbmVlZHNRdW90ZXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHNob3J0LWNpcmN1aXQgaWYgcXVvdGVzIG5vdCBuZWVkZWRcbiAgICAgICAgaWYgKCFuZWVkc1F1b3Rlcykge1xuICAgICAgICAgICAgcmV0dXJuIGFyZztcbiAgICAgICAgfVxuICAgICAgICAvLyB0aGUgZm9sbG93aW5nIHF1b3RpbmcgcnVsZXMgYXJlIHZlcnkgc2ltaWxhciB0byB0aGUgcnVsZXMgdGhhdCBieSBsaWJ1diBhcHBsaWVzLlxuICAgICAgICAvL1xuICAgICAgICAvLyAxKSB3cmFwIHRoZSBzdHJpbmcgaW4gcXVvdGVzXG4gICAgICAgIC8vXG4gICAgICAgIC8vIDIpIGRvdWJsZS11cCBxdW90ZXMgLSBpLmUuIFwiID0+IFwiXCJcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgbGlidXYgcXVvdGluZyBydWxlcy4gbGlidXYgcmVwbGFjZXMgXCIgd2l0aCBcXFwiLCB3aGljaCB1bmZvcnR1bmF0ZWx5XG4gICAgICAgIC8vICAgIGRvZXNuJ3Qgd29yayB3ZWxsIHdpdGggYSBjbWQuZXhlIGNvbW1hbmQgbGluZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgbm90ZSwgcmVwbGFjaW5nIFwiIHdpdGggXCJcIiBhbHNvIHdvcmtzIHdlbGwgaWYgdGhlIGFyZyBpcyBwYXNzZWQgdG8gYSBkb3duc3RyZWFtIC5ORVQgY29uc29sZSBhcHAuXG4gICAgICAgIC8vICAgIGZvciBleGFtcGxlLCB0aGUgY29tbWFuZCBsaW5lOlxuICAgICAgICAvLyAgICAgICAgICBmb28uZXhlIFwibXlhcmc6XCJcIm15IHZhbFwiXCJcIlxuICAgICAgICAvLyAgICBpcyBwYXJzZWQgYnkgYSAuTkVUIGNvbnNvbGUgYXBwIGludG8gYW4gYXJnIGFycmF5OlxuICAgICAgICAvLyAgICAgICAgICBbIFwibXlhcmc6XFxcIm15IHZhbFxcXCJcIiBdXG4gICAgICAgIC8vICAgIHdoaWNoIGlzIHRoZSBzYW1lIGVuZCByZXN1bHQgd2hlbiBhcHBseWluZyBsaWJ1diBxdW90aW5nIHJ1bGVzLiBhbHRob3VnaCB0aGUgYWN0dWFsXG4gICAgICAgIC8vICAgIGNvbW1hbmQgbGluZSBmcm9tIGxpYnV2IHF1b3RpbmcgcnVsZXMgd291bGQgbG9vayBsaWtlOlxuICAgICAgICAvLyAgICAgICAgICBmb28uZXhlIFwibXlhcmc6XFxcIm15IHZhbFxcXCJcIlxuICAgICAgICAvL1xuICAgICAgICAvLyAzKSBkb3VibGUtdXAgc2xhc2hlcyB0aGF0IHByZWNlZGUgYSBxdW90ZSxcbiAgICAgICAgLy8gICAgZS5nLiAgaGVsbG8gXFx3b3JsZCAgICA9PiBcImhlbGxvIFxcd29ybGRcIlxuICAgICAgICAvLyAgICAgICAgICBoZWxsb1xcXCJ3b3JsZCAgICA9PiBcImhlbGxvXFxcXFwiXCJ3b3JsZFwiXG4gICAgICAgIC8vICAgICAgICAgIGhlbGxvXFxcXFwid29ybGQgICA9PiBcImhlbGxvXFxcXFxcXFxcIlwid29ybGRcIlxuICAgICAgICAvLyAgICAgICAgICBoZWxsbyB3b3JsZFxcICAgID0+IFwiaGVsbG8gd29ybGRcXFxcXCJcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgdGVjaG5pY2FsbHkgdGhpcyBpcyBub3QgcmVxdWlyZWQgZm9yIGEgY21kLmV4ZSBjb21tYW5kIGxpbmUsIG9yIHRoZSBiYXRjaCBhcmd1bWVudCBwYXJzZXIuXG4gICAgICAgIC8vICAgIHRoZSByZWFzb25zIGZvciBpbmNsdWRpbmcgdGhpcyBhcyBhIC5jbWQgcXVvdGluZyBydWxlIGFyZTpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgYSkgdGhpcyBpcyBvcHRpbWl6ZWQgZm9yIHRoZSBzY2VuYXJpbyB3aGVyZSB0aGUgYXJndW1lbnQgaXMgcGFzc2VkIGZyb20gdGhlIC5jbWQgZmlsZSB0byBhblxuICAgICAgICAvLyAgICAgICBleHRlcm5hbCBwcm9ncmFtLiBtYW55IHByb2dyYW1zIChlLmcuIC5ORVQgY29uc29sZSBhcHBzKSByZWx5IG9uIHRoZSBzbGFzaC1kb3VibGluZyBydWxlLlxuICAgICAgICAvL1xuICAgICAgICAvLyAgICBiKSBpdCdzIHdoYXQgd2UndmUgYmVlbiBkb2luZyBwcmV2aW91c2x5IChieSBkZWZlcnJpbmcgdG8gbm9kZSBkZWZhdWx0IGJlaGF2aW9yKSBhbmQgd2VcbiAgICAgICAgLy8gICAgICAgaGF2ZW4ndCBoZWFyZCBhbnkgY29tcGxhaW50cyBhYm91dCB0aGF0IGFzcGVjdC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gbm90ZSwgYSB3ZWFrbmVzcyBvZiB0aGUgcXVvdGluZyBydWxlcyBjaG9zZW4gaGVyZSwgaXMgdGhhdCAlIGlzIG5vdCBlc2NhcGVkLiBpbiBmYWN0LCAlIGNhbm5vdCBiZVxuICAgICAgICAvLyBlc2NhcGVkIHdoZW4gdXNlZCBvbiB0aGUgY29tbWFuZCBsaW5lIGRpcmVjdGx5IC0gZXZlbiB0aG91Z2ggd2l0aGluIGEgLmNtZCBmaWxlICUgY2FuIGJlIGVzY2FwZWRcbiAgICAgICAgLy8gYnkgdXNpbmcgJSUuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIHRoZSBzYXZpbmcgZ3JhY2UgaXMsIG9uIHRoZSBjb21tYW5kIGxpbmUsICV2YXIlIGlzIGxlZnQgYXMtaXMgaWYgdmFyIGlzIG5vdCBkZWZpbmVkLiB0aGlzIGNvbnRyYXN0c1xuICAgICAgICAvLyB0aGUgbGluZSBwYXJzaW5nIHJ1bGVzIHdpdGhpbiBhIC5jbWQgZmlsZSwgd2hlcmUgaWYgdmFyIGlzIG5vdCBkZWZpbmVkIGl0IGlzIHJlcGxhY2VkIHdpdGggbm90aGluZy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gb25lIG9wdGlvbiB0aGF0IHdhcyBleHBsb3JlZCB3YXMgcmVwbGFjaW5nICUgd2l0aCBeJSAtIGkuZS4gJXZhciUgPT4gXiV2YXJeJS4gdGhpcyBoYWNrIHdvdWxkXG4gICAgICAgIC8vIG9mdGVuIHdvcmssIHNpbmNlIGl0IGlzIHVubGlrZWx5IHRoYXQgdmFyXiB3b3VsZCBleGlzdCwgYW5kIHRoZSBeIGNoYXJhY3RlciBpcyByZW1vdmVkIHdoZW4gdGhlXG4gICAgICAgIC8vIHZhcmlhYmxlIGlzIHVzZWQuIHRoZSBwcm9ibGVtLCBob3dldmVyLCBpcyB0aGF0IF4gaXMgbm90IHJlbW92ZWQgd2hlbiAlKiBpcyB1c2VkIHRvIHBhc3MgdGhlIGFyZ3NcbiAgICAgICAgLy8gdG8gYW4gZXh0ZXJuYWwgcHJvZ3JhbS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gYW4gdW5leHBsb3JlZCBwb3RlbnRpYWwgc29sdXRpb24gZm9yIHRoZSAlIGVzY2FwaW5nIHByb2JsZW0sIGlzIHRvIGNyZWF0ZSBhIHdyYXBwZXIgLmNtZCBmaWxlLlxuICAgICAgICAvLyAlIGNhbiBiZSBlc2NhcGVkIHdpdGhpbiBhIC5jbWQgZmlsZS5cbiAgICAgICAgbGV0IHJldmVyc2UgPSAnXCInO1xuICAgICAgICBsZXQgcXVvdGVIaXQgPSB0cnVlO1xuICAgICAgICBmb3IgKGxldCBpID0gYXJnLmxlbmd0aDsgaSA+IDA7IGktLSkge1xuICAgICAgICAgICAgLy8gd2FsayB0aGUgc3RyaW5nIGluIHJldmVyc2VcbiAgICAgICAgICAgIHJldmVyc2UgKz0gYXJnW2kgLSAxXTtcbiAgICAgICAgICAgIGlmIChxdW90ZUhpdCAmJiBhcmdbaSAtIDFdID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgICAgICByZXZlcnNlICs9ICdcXFxcJzsgLy8gZG91YmxlIHRoZSBzbGFzaFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnW2kgLSAxXSA9PT0gJ1wiJykge1xuICAgICAgICAgICAgICAgIHF1b3RlSGl0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXZlcnNlICs9ICdcIic7IC8vIGRvdWJsZSB0aGUgcXVvdGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHF1b3RlSGl0ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV2ZXJzZSArPSAnXCInO1xuICAgICAgICByZXR1cm4gcmV2ZXJzZVxuICAgICAgICAgICAgLnNwbGl0KCcnKVxuICAgICAgICAgICAgLnJldmVyc2UoKVxuICAgICAgICAgICAgLmpvaW4oJycpO1xuICAgIH1cbiAgICBfdXZRdW90ZUNtZEFyZyhhcmcpIHtcbiAgICAgICAgLy8gVG9vbCBydW5uZXIgd3JhcHMgY2hpbGRfcHJvY2Vzcy5zcGF3bigpIGFuZCBuZWVkcyB0byBhcHBseSB0aGUgc2FtZSBxdW90aW5nIGFzXG4gICAgICAgIC8vIE5vZGUgaW4gY2VydGFpbiBjYXNlcyB3aGVyZSB0aGUgdW5kb2N1bWVudGVkIHNwYXduIG9wdGlvbiB3aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHNcbiAgICAgICAgLy8gaXMgdXNlZC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gU2luY2UgdGhpcyBmdW5jdGlvbiBpcyBhIHBvcnQgb2YgcXVvdGVfY21kX2FyZyBmcm9tIE5vZGUgNC54ICh0ZWNobmljYWxseSwgbGliIFVWLFxuICAgICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvdjQueC9kZXBzL3V2L3NyYy93aW4vcHJvY2Vzcy5jIGZvciBkZXRhaWxzKSxcbiAgICAgICAgLy8gcGFzdGluZyBjb3B5cmlnaHQgbm90aWNlIGZyb20gTm9kZSB3aXRoaW4gdGhpcyBmdW5jdGlvbjpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gICAgICAgIC8vICAgICAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbiAgICAgICAgLy8gICAgICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuICAgICAgICAvLyAgICAgIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuICAgICAgICAvLyAgICAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gICAgICAgIC8vICAgICAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICAgICAgICAvLyAgICAgIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAgICAgICAgLy8gICAgICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAgICAgICAgLy8gICAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAgICAgICAgLy8gICAgICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gICAgICAgIC8vICAgICAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkdcbiAgICAgICAgLy8gICAgICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTXG4gICAgICAgIC8vICAgICAgSU4gVEhFIFNPRlRXQVJFLlxuICAgICAgICBpZiAoIWFyZykge1xuICAgICAgICAgICAgLy8gTmVlZCBkb3VibGUgcXVvdGF0aW9uIGZvciBlbXB0eSBhcmd1bWVudFxuICAgICAgICAgICAgcmV0dXJuICdcIlwiJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFyZy5pbmNsdWRlcygnICcpICYmICFhcmcuaW5jbHVkZXMoJ1xcdCcpICYmICFhcmcuaW5jbHVkZXMoJ1wiJykpIHtcbiAgICAgICAgICAgIC8vIE5vIHF1b3RhdGlvbiBuZWVkZWRcbiAgICAgICAgICAgIHJldHVybiBhcmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhcmcuaW5jbHVkZXMoJ1wiJykgJiYgIWFyZy5pbmNsdWRlcygnXFxcXCcpKSB7XG4gICAgICAgICAgICAvLyBObyBlbWJlZGRlZCBkb3VibGUgcXVvdGVzIG9yIGJhY2tzbGFzaGVzLCBzbyBJIGNhbiBqdXN0IHdyYXBcbiAgICAgICAgICAgIC8vIHF1b3RlIG1hcmtzIGFyb3VuZCB0aGUgd2hvbGUgdGhpbmcuXG4gICAgICAgICAgICByZXR1cm4gYFwiJHthcmd9XCJgO1xuICAgICAgICB9XG4gICAgICAgIC8vIEV4cGVjdGVkIGlucHV0L291dHB1dDpcbiAgICAgICAgLy8gICBpbnB1dCA6IGhlbGxvXCJ3b3JsZFxuICAgICAgICAvLyAgIG91dHB1dDogXCJoZWxsb1xcXCJ3b3JsZFwiXG4gICAgICAgIC8vICAgaW5wdXQgOiBoZWxsb1wiXCJ3b3JsZFxuICAgICAgICAvLyAgIG91dHB1dDogXCJoZWxsb1xcXCJcXFwid29ybGRcIlxuICAgICAgICAvLyAgIGlucHV0IDogaGVsbG9cXHdvcmxkXG4gICAgICAgIC8vICAgb3V0cHV0OiBoZWxsb1xcd29ybGRcbiAgICAgICAgLy8gICBpbnB1dCA6IGhlbGxvXFxcXHdvcmxkXG4gICAgICAgIC8vICAgb3V0cHV0OiBoZWxsb1xcXFx3b3JsZFxuICAgICAgICAvLyAgIGlucHV0IDogaGVsbG9cXFwid29ybGRcbiAgICAgICAgLy8gICBvdXRwdXQ6IFwiaGVsbG9cXFxcXFxcIndvcmxkXCJcbiAgICAgICAgLy8gICBpbnB1dCA6IGhlbGxvXFxcXFwid29ybGRcbiAgICAgICAgLy8gICBvdXRwdXQ6IFwiaGVsbG9cXFxcXFxcXFxcXCJ3b3JsZFwiXG4gICAgICAgIC8vICAgaW5wdXQgOiBoZWxsbyB3b3JsZFxcXG4gICAgICAgIC8vICAgb3V0cHV0OiBcImhlbGxvIHdvcmxkXFxcXFwiIC0gbm90ZSB0aGUgY29tbWVudCBpbiBsaWJ1diBhY3R1YWxseSByZWFkcyBcImhlbGxvIHdvcmxkXFxcIlxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGl0IGFwcGVhcnMgdGhlIGNvbW1lbnQgaXMgd3JvbmcsIGl0IHNob3VsZCBiZSBcImhlbGxvIHdvcmxkXFxcXFwiXG4gICAgICAgIGxldCByZXZlcnNlID0gJ1wiJztcbiAgICAgICAgbGV0IHF1b3RlSGl0ID0gdHJ1ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGFyZy5sZW5ndGg7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICAgIC8vIHdhbGsgdGhlIHN0cmluZyBpbiByZXZlcnNlXG4gICAgICAgICAgICByZXZlcnNlICs9IGFyZ1tpIC0gMV07XG4gICAgICAgICAgICBpZiAocXVvdGVIaXQgJiYgYXJnW2kgLSAxXSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICAgICAgcmV2ZXJzZSArPSAnXFxcXCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhcmdbaSAtIDFdID09PSAnXCInKSB7XG4gICAgICAgICAgICAgICAgcXVvdGVIaXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldmVyc2UgKz0gJ1xcXFwnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcXVvdGVIaXQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXZlcnNlICs9ICdcIic7XG4gICAgICAgIHJldHVybiByZXZlcnNlXG4gICAgICAgICAgICAuc3BsaXQoJycpXG4gICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAuam9pbignJyk7XG4gICAgfVxuICAgIF9jbG9uZUV4ZWNPcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGN3ZDogb3B0aW9ucy5jd2QgfHwgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgIGVudjogb3B0aW9ucy5lbnYgfHwgcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgICBzaWxlbnQ6IG9wdGlvbnMuc2lsZW50IHx8IGZhbHNlLFxuICAgICAgICAgICAgd2luZG93c1ZlcmJhdGltQXJndW1lbnRzOiBvcHRpb25zLndpbmRvd3NWZXJiYXRpbUFyZ3VtZW50cyB8fCBmYWxzZSxcbiAgICAgICAgICAgIGZhaWxPblN0ZEVycjogb3B0aW9ucy5mYWlsT25TdGRFcnIgfHwgZmFsc2UsXG4gICAgICAgICAgICBpZ25vcmVSZXR1cm5Db2RlOiBvcHRpb25zLmlnbm9yZVJldHVybkNvZGUgfHwgZmFsc2UsXG4gICAgICAgICAgICBkZWxheTogb3B0aW9ucy5kZWxheSB8fCAxMDAwMFxuICAgICAgICB9O1xuICAgICAgICByZXN1bHQub3V0U3RyZWFtID0gb3B0aW9ucy5vdXRTdHJlYW0gfHwgcHJvY2Vzcy5zdGRvdXQ7XG4gICAgICAgIHJlc3VsdC5lcnJTdHJlYW0gPSBvcHRpb25zLmVyclN0cmVhbSB8fCBwcm9jZXNzLnN0ZGVycjtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgX2dldFNwYXduT3B0aW9ucyhvcHRpb25zLCB0b29sUGF0aCkge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICAgIHJlc3VsdC5jd2QgPSBvcHRpb25zLmN3ZDtcbiAgICAgICAgcmVzdWx0LmVudiA9IG9wdGlvbnMuZW52O1xuICAgICAgICByZXN1bHRbJ3dpbmRvd3NWZXJiYXRpbUFyZ3VtZW50cyddID1cbiAgICAgICAgICAgIG9wdGlvbnMud2luZG93c1ZlcmJhdGltQXJndW1lbnRzIHx8IHRoaXMuX2lzQ21kRmlsZSgpO1xuICAgICAgICBpZiAob3B0aW9ucy53aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHMpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hcmd2MCA9IGBcIiR7dG9vbFBhdGh9XCJgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWMgYSB0b29sLlxuICAgICAqIE91dHB1dCB3aWxsIGJlIHN0cmVhbWVkIHRvIHRoZSBsaXZlIGNvbnNvbGUuXG4gICAgICogUmV0dXJucyBwcm9taXNlIHdpdGggcmV0dXJuIGNvZGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSAgICAgdG9vbCAgICAgcGF0aCB0byB0b29sIHRvIGV4ZWNcbiAgICAgKiBAcGFyYW0gICAgIG9wdGlvbnMgIG9wdGlvbmFsIGV4ZWMgb3B0aW9ucy4gIFNlZSBFeGVjT3B0aW9uc1xuICAgICAqIEByZXR1cm5zICAgbnVtYmVyXG4gICAgICovXG4gICAgZXhlYygpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIC8vIHJvb3QgdGhlIHRvb2wgcGF0aCBpZiBpdCBpcyB1bnJvb3RlZCBhbmQgY29udGFpbnMgcmVsYXRpdmUgcGF0aGluZ1xuICAgICAgICAgICAgaWYgKCFpb1V0aWwuaXNSb290ZWQodGhpcy50b29sUGF0aCkgJiZcbiAgICAgICAgICAgICAgICAodGhpcy50b29sUGF0aC5pbmNsdWRlcygnLycpIHx8XG4gICAgICAgICAgICAgICAgICAgIChJU19XSU5ET1dTICYmIHRoaXMudG9vbFBhdGguaW5jbHVkZXMoJ1xcXFwnKSkpKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJlZmVyIG9wdGlvbnMuY3dkIGlmIGl0IGlzIHNwZWNpZmllZCwgaG93ZXZlciBvcHRpb25zLmN3ZCBtYXkgYWxzbyBuZWVkIHRvIGJlIHJvb3RlZFxuICAgICAgICAgICAgICAgIHRoaXMudG9vbFBhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgdGhpcy5vcHRpb25zLmN3ZCB8fCBwcm9jZXNzLmN3ZCgpLCB0aGlzLnRvb2xQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmIHRoZSB0b29sIGlzIG9ubHkgYSBmaWxlIG5hbWUsIHRoZW4gcmVzb2x2ZSBpdCBmcm9tIHRoZSBQQVRIXG4gICAgICAgICAgICAvLyBvdGhlcndpc2UgdmVyaWZ5IGl0IGV4aXN0cyAoYWRkIGV4dGVuc2lvbiBvbiBXaW5kb3dzIGlmIG5lY2Vzc2FyeSlcbiAgICAgICAgICAgIHRoaXMudG9vbFBhdGggPSB5aWVsZCBpby53aGljaCh0aGlzLnRvb2xQYXRoLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoYGV4ZWMgdG9vbDogJHt0aGlzLnRvb2xQYXRofWApO1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKCdhcmd1bWVudHM6Jyk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgdGhpcy5hcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKGAgICAke2FyZ31gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uc05vbk51bGwgPSB0aGlzLl9jbG9uZUV4ZWNPcHRpb25zKHRoaXMub3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zTm9uTnVsbC5zaWxlbnQgJiYgb3B0aW9uc05vbk51bGwub3V0U3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnNOb25OdWxsLm91dFN0cmVhbS53cml0ZSh0aGlzLl9nZXRDb21tYW5kU3RyaW5nKG9wdGlvbnNOb25OdWxsKSArIG9zLkVPTCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gbmV3IEV4ZWNTdGF0ZShvcHRpb25zTm9uTnVsbCwgdGhpcy50b29sUGF0aCk7XG4gICAgICAgICAgICAgICAgc3RhdGUub24oJ2RlYnVnJywgKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVidWcobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jd2QgJiYgISh5aWVsZCBpb1V0aWwuZXhpc3RzKHRoaXMub3B0aW9ucy5jd2QpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgVGhlIGN3ZDogJHt0aGlzLm9wdGlvbnMuY3dkfSBkb2VzIG5vdCBleGlzdCFgKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gdGhpcy5fZ2V0U3Bhd25GaWxlTmFtZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNwID0gY2hpbGQuc3Bhd24oZmlsZU5hbWUsIHRoaXMuX2dldFNwYXduQXJncyhvcHRpb25zTm9uTnVsbCksIHRoaXMuX2dldFNwYXduT3B0aW9ucyh0aGlzLm9wdGlvbnMsIGZpbGVOYW1lKSk7XG4gICAgICAgICAgICAgICAgbGV0IHN0ZGJ1ZmZlciA9ICcnO1xuICAgICAgICAgICAgICAgIGlmIChjcC5zdGRvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY3Auc3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubGlzdGVuZXJzICYmIHRoaXMub3B0aW9ucy5saXN0ZW5lcnMuc3Rkb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxpc3RlbmVycy5zdGRvdXQoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnNOb25OdWxsLnNpbGVudCAmJiBvcHRpb25zTm9uTnVsbC5vdXRTdHJlYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zTm9uTnVsbC5vdXRTdHJlYW0ud3JpdGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGRidWZmZXIgPSB0aGlzLl9wcm9jZXNzTGluZUJ1ZmZlcihkYXRhLCBzdGRidWZmZXIsIChsaW5lKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5saXN0ZW5lcnMgJiYgdGhpcy5vcHRpb25zLmxpc3RlbmVycy5zdGRsaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5saXN0ZW5lcnMuc3RkbGluZShsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBlcnJidWZmZXIgPSAnJztcbiAgICAgICAgICAgICAgICBpZiAoY3Auc3RkZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNwLnN0ZGVyci5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wcm9jZXNzU3RkZXJyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubGlzdGVuZXJzICYmIHRoaXMub3B0aW9ucy5saXN0ZW5lcnMuc3RkZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxpc3RlbmVycy5zdGRlcnIoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnNOb25OdWxsLnNpbGVudCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNOb25OdWxsLmVyclN0cmVhbSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNOb25OdWxsLm91dFN0cmVhbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBvcHRpb25zTm9uTnVsbC5mYWlsT25TdGRFcnJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBvcHRpb25zTm9uTnVsbC5lcnJTdHJlYW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBvcHRpb25zTm9uTnVsbC5vdXRTdHJlYW07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcy53cml0ZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVycmJ1ZmZlciA9IHRoaXMuX3Byb2Nlc3NMaW5lQnVmZmVyKGRhdGEsIGVycmJ1ZmZlciwgKGxpbmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxpc3RlbmVycyAmJiB0aGlzLm9wdGlvbnMubGlzdGVuZXJzLmVycmxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxpc3RlbmVycy5lcnJsaW5lKGxpbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3Aub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wcm9jZXNzRXJyb3IgPSBlcnIubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUucHJvY2Vzc0V4aXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnByb2Nlc3NDbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5DaGVja0NvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY3Aub24oJ2V4aXQnLCAoY29kZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wcm9jZXNzRXhpdENvZGUgPSBjb2RlO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wcm9jZXNzRXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoYEV4aXQgY29kZSAke2NvZGV9IHJlY2VpdmVkIGZyb20gdG9vbCAnJHt0aGlzLnRvb2xQYXRofSdgKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUuQ2hlY2tDb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNwLm9uKCdjbG9zZScsIChjb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnByb2Nlc3NFeGl0Q29kZSA9IGNvZGU7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnByb2Nlc3NFeGl0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wcm9jZXNzQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoYFNURElPIHN0cmVhbXMgaGF2ZSBjbG9zZWQgZm9yIHRvb2wgJyR7dGhpcy50b29sUGF0aH0nYCk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLkNoZWNrQ29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzdGF0ZS5vbignZG9uZScsIChlcnJvciwgZXhpdENvZGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZGJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3N0ZGxpbmUnLCBzdGRidWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJidWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJsaW5lJywgZXJyYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjcC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShleGl0Q29kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmlucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3Auc3RkaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2hpbGQgcHJvY2VzcyBtaXNzaW5nIHN0ZGluJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3Auc3RkaW4uZW5kKHRoaXMub3B0aW9ucy5pbnB1dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLlRvb2xSdW5uZXIgPSBUb29sUnVubmVyO1xuLyoqXG4gKiBDb252ZXJ0IGFuIGFyZyBzdHJpbmcgdG8gYW4gYXJyYXkgb2YgYXJncy4gSGFuZGxlcyBlc2NhcGluZ1xuICpcbiAqIEBwYXJhbSAgICBhcmdTdHJpbmcgICBzdHJpbmcgb2YgYXJndW1lbnRzXG4gKiBAcmV0dXJucyAgc3RyaW5nW10gICAgYXJyYXkgb2YgYXJndW1lbnRzXG4gKi9cbmZ1bmN0aW9uIGFyZ1N0cmluZ1RvQXJyYXkoYXJnU3RyaW5nKSB7XG4gICAgY29uc3QgYXJncyA9IFtdO1xuICAgIGxldCBpblF1b3RlcyA9IGZhbHNlO1xuICAgIGxldCBlc2NhcGVkID0gZmFsc2U7XG4gICAgbGV0IGFyZyA9ICcnO1xuICAgIGZ1bmN0aW9uIGFwcGVuZChjKSB7XG4gICAgICAgIC8vIHdlIG9ubHkgZXNjYXBlIGRvdWJsZSBxdW90ZXMuXG4gICAgICAgIGlmIChlc2NhcGVkICYmIGMgIT09ICdcIicpIHtcbiAgICAgICAgICAgIGFyZyArPSAnXFxcXCc7XG4gICAgICAgIH1cbiAgICAgICAgYXJnICs9IGM7XG4gICAgICAgIGVzY2FwZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdTdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYyA9IGFyZ1N0cmluZy5jaGFyQXQoaSk7XG4gICAgICAgIGlmIChjID09PSAnXCInKSB7XG4gICAgICAgICAgICBpZiAoIWVzY2FwZWQpIHtcbiAgICAgICAgICAgICAgICBpblF1b3RlcyA9ICFpblF1b3RlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFwcGVuZChjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjID09PSAnXFxcXCcgJiYgZXNjYXBlZCkge1xuICAgICAgICAgICAgYXBwZW5kKGMpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGMgPT09ICdcXFxcJyAmJiBpblF1b3Rlcykge1xuICAgICAgICAgICAgZXNjYXBlZCA9IHRydWU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYyA9PT0gJyAnICYmICFpblF1b3Rlcykge1xuICAgICAgICAgICAgaWYgKGFyZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgYXJncy5wdXNoKGFyZyk7XG4gICAgICAgICAgICAgICAgYXJnID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBhcHBlbmQoYyk7XG4gICAgfVxuICAgIGlmIChhcmcubGVuZ3RoID4gMCkge1xuICAgICAgICBhcmdzLnB1c2goYXJnLnRyaW0oKSk7XG4gICAgfVxuICAgIHJldHVybiBhcmdzO1xufVxuZXhwb3J0cy5hcmdTdHJpbmdUb0FycmF5ID0gYXJnU3RyaW5nVG9BcnJheTtcbmNsYXNzIEV4ZWNTdGF0ZSBleHRlbmRzIGV2ZW50cy5FdmVudEVtaXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIHRvb2xQYXRoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucHJvY2Vzc0Nsb3NlZCA9IGZhbHNlOyAvLyB0cmFja3Mgd2hldGhlciB0aGUgcHJvY2VzcyBoYXMgZXhpdGVkIGFuZCBzdGRpbyBpcyBjbG9zZWRcbiAgICAgICAgdGhpcy5wcm9jZXNzRXJyb3IgPSAnJztcbiAgICAgICAgdGhpcy5wcm9jZXNzRXhpdENvZGUgPSAwO1xuICAgICAgICB0aGlzLnByb2Nlc3NFeGl0ZWQgPSBmYWxzZTsgLy8gdHJhY2tzIHdoZXRoZXIgdGhlIHByb2Nlc3MgaGFzIGV4aXRlZFxuICAgICAgICB0aGlzLnByb2Nlc3NTdGRlcnIgPSBmYWxzZTsgLy8gdHJhY2tzIHdoZXRoZXIgc3RkZXJyIHdhcyB3cml0dGVuIHRvXG4gICAgICAgIHRoaXMuZGVsYXkgPSAxMDAwMDsgLy8gMTAgc2Vjb25kc1xuICAgICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgaWYgKCF0b29sUGF0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0b29sUGF0aCBtdXN0IG5vdCBiZSBlbXB0eScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMudG9vbFBhdGggPSB0b29sUGF0aDtcbiAgICAgICAgaWYgKG9wdGlvbnMuZGVsYXkpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsYXkgPSBvcHRpb25zLmRlbGF5O1xuICAgICAgICB9XG4gICAgfVxuICAgIENoZWNrQ29tcGxldGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcm9jZXNzQ2xvc2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRSZXN1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnByb2Nlc3NFeGl0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMudGltZW91dCA9IHRpbWVyc18xLnNldFRpbWVvdXQoRXhlY1N0YXRlLkhhbmRsZVRpbWVvdXQsIHRoaXMuZGVsYXksIHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9kZWJ1ZyhtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuZW1pdCgnZGVidWcnLCBtZXNzYWdlKTtcbiAgICB9XG4gICAgX3NldFJlc3VsdCgpIHtcbiAgICAgICAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlcmUgaXMgYW4gZXJyb3JcbiAgICAgICAgbGV0IGVycm9yO1xuICAgICAgICBpZiAodGhpcy5wcm9jZXNzRXhpdGVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9jZXNzRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihgVGhlcmUgd2FzIGFuIGVycm9yIHdoZW4gYXR0ZW1wdGluZyB0byBleGVjdXRlIHRoZSBwcm9jZXNzICcke3RoaXMudG9vbFBhdGh9Jy4gVGhpcyBtYXkgaW5kaWNhdGUgdGhlIHByb2Nlc3MgZmFpbGVkIHRvIHN0YXJ0LiBFcnJvcjogJHt0aGlzLnByb2Nlc3NFcnJvcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMucHJvY2Vzc0V4aXRDb2RlICE9PSAwICYmICF0aGlzLm9wdGlvbnMuaWdub3JlUmV0dXJuQ29kZSkge1xuICAgICAgICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKGBUaGUgcHJvY2VzcyAnJHt0aGlzLnRvb2xQYXRofScgZmFpbGVkIHdpdGggZXhpdCBjb2RlICR7dGhpcy5wcm9jZXNzRXhpdENvZGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnByb2Nlc3NTdGRlcnIgJiYgdGhpcy5vcHRpb25zLmZhaWxPblN0ZEVycikge1xuICAgICAgICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKGBUaGUgcHJvY2VzcyAnJHt0aGlzLnRvb2xQYXRofScgZmFpbGVkIGJlY2F1c2Ugb25lIG9yIG1vcmUgbGluZXMgd2VyZSB3cml0dGVuIHRvIHRoZSBTVERFUlIgc3RyZWFtYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2xlYXIgdGhlIHRpbWVvdXRcbiAgICAgICAgaWYgKHRoaXMudGltZW91dCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG4gICAgICAgICAgICB0aGlzLnRpbWVvdXQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZW1pdCgnZG9uZScsIGVycm9yLCB0aGlzLnByb2Nlc3NFeGl0Q29kZSk7XG4gICAgfVxuICAgIHN0YXRpYyBIYW5kbGVUaW1lb3V0KHN0YXRlKSB7XG4gICAgICAgIGlmIChzdGF0ZS5kb25lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdGF0ZS5wcm9jZXNzQ2xvc2VkICYmIHN0YXRlLnByb2Nlc3NFeGl0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgVGhlIFNURElPIHN0cmVhbXMgZGlkIG5vdCBjbG9zZSB3aXRoaW4gJHtzdGF0ZS5kZWxheSAvXG4gICAgICAgICAgICAgICAgMTAwMH0gc2Vjb25kcyBvZiB0aGUgZXhpdCBldmVudCBmcm9tIHByb2Nlc3MgJyR7c3RhdGUudG9vbFBhdGh9Jy4gVGhpcyBtYXkgaW5kaWNhdGUgYSBjaGlsZCBwcm9jZXNzIGluaGVyaXRlZCB0aGUgU1RESU8gc3RyZWFtcyBhbmQgaGFzIG5vdCB5ZXQgZXhpdGVkLmA7XG4gICAgICAgICAgICBzdGF0ZS5fZGVidWcobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuX3NldFJlc3VsdCgpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRvb2xydW5uZXIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldEV4ZWNPdXRwdXQgPSBleHBvcnRzLmV4ZWMgPSB2b2lkIDA7XG5jb25zdCBzdHJpbmdfZGVjb2Rlcl8xID0gcmVxdWlyZShcInN0cmluZ19kZWNvZGVyXCIpO1xuY29uc3QgdHIgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vdG9vbHJ1bm5lclwiKSk7XG4vKipcbiAqIEV4ZWMgYSBjb21tYW5kLlxuICogT3V0cHV0IHdpbGwgYmUgc3RyZWFtZWQgdG8gdGhlIGxpdmUgY29uc29sZS5cbiAqIFJldHVybnMgcHJvbWlzZSB3aXRoIHJldHVybiBjb2RlXG4gKlxuICogQHBhcmFtICAgICBjb21tYW5kTGluZSAgICAgICAgY29tbWFuZCB0byBleGVjdXRlIChjYW4gaW5jbHVkZSBhZGRpdGlvbmFsIGFyZ3MpLiBNdXN0IGJlIGNvcnJlY3RseSBlc2NhcGVkLlxuICogQHBhcmFtICAgICBhcmdzICAgICAgICAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzIGZvciB0b29sLiBFc2NhcGluZyBpcyBoYW5kbGVkIGJ5IHRoZSBsaWIuXG4gKiBAcGFyYW0gICAgIG9wdGlvbnMgICAgICAgICAgICBvcHRpb25hbCBleGVjIG9wdGlvbnMuICBTZWUgRXhlY09wdGlvbnNcbiAqIEByZXR1cm5zICAgUHJvbWlzZTxudW1iZXI+ICAgIGV4aXQgY29kZVxuICovXG5mdW5jdGlvbiBleGVjKGNvbW1hbmRMaW5lLCBhcmdzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgY29tbWFuZEFyZ3MgPSB0ci5hcmdTdHJpbmdUb0FycmF5KGNvbW1hbmRMaW5lKTtcbiAgICAgICAgaWYgKGNvbW1hbmRBcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXJhbWV0ZXIgJ2NvbW1hbmRMaW5lJyBjYW5ub3QgYmUgbnVsbCBvciBlbXB0eS5gKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQYXRoIHRvIHRvb2wgdG8gZXhlY3V0ZSBzaG91bGQgYmUgZmlyc3QgYXJnXG4gICAgICAgIGNvbnN0IHRvb2xQYXRoID0gY29tbWFuZEFyZ3NbMF07XG4gICAgICAgIGFyZ3MgPSBjb21tYW5kQXJncy5zbGljZSgxKS5jb25jYXQoYXJncyB8fCBbXSk7XG4gICAgICAgIGNvbnN0IHJ1bm5lciA9IG5ldyB0ci5Ub29sUnVubmVyKHRvb2xQYXRoLCBhcmdzLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHJ1bm5lci5leGVjKCk7XG4gICAgfSk7XG59XG5leHBvcnRzLmV4ZWMgPSBleGVjO1xuLyoqXG4gKiBFeGVjIGEgY29tbWFuZCBhbmQgZ2V0IHRoZSBvdXRwdXQuXG4gKiBPdXRwdXQgd2lsbCBiZSBzdHJlYW1lZCB0byB0aGUgbGl2ZSBjb25zb2xlLlxuICogUmV0dXJucyBwcm9taXNlIHdpdGggdGhlIGV4aXQgY29kZSBhbmQgY29sbGVjdGVkIHN0ZG91dCBhbmQgc3RkZXJyXG4gKlxuICogQHBhcmFtICAgICBjb21tYW5kTGluZSAgICAgICAgICAgY29tbWFuZCB0byBleGVjdXRlIChjYW4gaW5jbHVkZSBhZGRpdGlvbmFsIGFyZ3MpLiBNdXN0IGJlIGNvcnJlY3RseSBlc2NhcGVkLlxuICogQHBhcmFtICAgICBhcmdzICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzIGZvciB0b29sLiBFc2NhcGluZyBpcyBoYW5kbGVkIGJ5IHRoZSBsaWIuXG4gKiBAcGFyYW0gICAgIG9wdGlvbnMgICAgICAgICAgICAgICBvcHRpb25hbCBleGVjIG9wdGlvbnMuICBTZWUgRXhlY09wdGlvbnNcbiAqIEByZXR1cm5zICAgUHJvbWlzZTxFeGVjT3V0cHV0PiAgIGV4aXQgY29kZSwgc3Rkb3V0LCBhbmQgc3RkZXJyXG4gKi9cbmZ1bmN0aW9uIGdldEV4ZWNPdXRwdXQoY29tbWFuZExpbmUsIGFyZ3MsIG9wdGlvbnMpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICAgICAgbGV0IHN0ZGVyciA9ICcnO1xuICAgICAgICAvL1VzaW5nIHN0cmluZyBkZWNvZGVyIGNvdmVycyB0aGUgY2FzZSB3aGVyZSBhIG11bHQtYnl0ZSBjaGFyYWN0ZXIgaXMgc3BsaXRcbiAgICAgICAgY29uc3Qgc3Rkb3V0RGVjb2RlciA9IG5ldyBzdHJpbmdfZGVjb2Rlcl8xLlN0cmluZ0RlY29kZXIoJ3V0ZjgnKTtcbiAgICAgICAgY29uc3Qgc3RkZXJyRGVjb2RlciA9IG5ldyBzdHJpbmdfZGVjb2Rlcl8xLlN0cmluZ0RlY29kZXIoJ3V0ZjgnKTtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxTdGRvdXRMaXN0ZW5lciA9IChfYSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5saXN0ZW5lcnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zdGRvdXQ7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsU3RkRXJyTGlzdGVuZXIgPSAoX2IgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubGlzdGVuZXJzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Iuc3RkZXJyO1xuICAgICAgICBjb25zdCBzdGRFcnJMaXN0ZW5lciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICBzdGRlcnIgKz0gc3RkZXJyRGVjb2Rlci53cml0ZShkYXRhKTtcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbFN0ZEVyckxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxTdGRFcnJMaXN0ZW5lcihkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgc3RkT3V0TGlzdGVuZXIgPSAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgc3Rkb3V0ICs9IHN0ZG91dERlY29kZXIud3JpdGUoZGF0YSk7XG4gICAgICAgICAgICBpZiAob3JpZ2luYWxTdGRvdXRMaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsU3Rkb3V0TGlzdGVuZXIoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmxpc3RlbmVycyksIHsgc3Rkb3V0OiBzdGRPdXRMaXN0ZW5lciwgc3RkZXJyOiBzdGRFcnJMaXN0ZW5lciB9KTtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSB5aWVsZCBleGVjKGNvbW1hbmRMaW5lLCBhcmdzLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCB7IGxpc3RlbmVycyB9KSk7XG4gICAgICAgIC8vZmx1c2ggYW55IHJlbWFpbmluZyBjaGFyYWN0ZXJzXG4gICAgICAgIHN0ZG91dCArPSBzdGRvdXREZWNvZGVyLmVuZCgpO1xuICAgICAgICBzdGRlcnIgKz0gc3RkZXJyRGVjb2Rlci5lbmQoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGV4aXRDb2RlLFxuICAgICAgICAgICAgc3Rkb3V0LFxuICAgICAgICAgICAgc3RkZXJyXG4gICAgICAgIH07XG4gICAgfSk7XG59XG5leHBvcnRzLmdldEV4ZWNPdXRwdXQgPSBnZXRFeGVjT3V0cHV0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXhlYy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldERldGFpbHMgPSBleHBvcnRzLmlzTGludXggPSBleHBvcnRzLmlzTWFjT1MgPSBleHBvcnRzLmlzV2luZG93cyA9IGV4cG9ydHMuYXJjaCA9IGV4cG9ydHMucGxhdGZvcm0gPSB2b2lkIDA7XG5jb25zdCBvc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJvc1wiKSk7XG5jb25zdCBleGVjID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJAYWN0aW9ucy9leGVjXCIpKTtcbmNvbnN0IGdldFdpbmRvd3NJbmZvID0gKCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgY29uc3QgeyBzdGRvdXQ6IHZlcnNpb24gfSA9IHlpZWxkIGV4ZWMuZ2V0RXhlY091dHB1dCgncG93ZXJzaGVsbCAtY29tbWFuZCBcIihHZXQtQ2ltSW5zdGFuY2UgLUNsYXNzTmFtZSBXaW4zMl9PcGVyYXRpbmdTeXN0ZW0pLlZlcnNpb25cIicsIHVuZGVmaW5lZCwge1xuICAgICAgICBzaWxlbnQ6IHRydWVcbiAgICB9KTtcbiAgICBjb25zdCB7IHN0ZG91dDogbmFtZSB9ID0geWllbGQgZXhlYy5nZXRFeGVjT3V0cHV0KCdwb3dlcnNoZWxsIC1jb21tYW5kIFwiKEdldC1DaW1JbnN0YW5jZSAtQ2xhc3NOYW1lIFdpbjMyX09wZXJhdGluZ1N5c3RlbSkuQ2FwdGlvblwiJywgdW5kZWZpbmVkLCB7XG4gICAgICAgIHNpbGVudDogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IG5hbWUudHJpbSgpLFxuICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uLnRyaW0oKVxuICAgIH07XG59KTtcbmNvbnN0IGdldE1hY09zSW5mbyA9ICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICBjb25zdCB7IHN0ZG91dCB9ID0geWllbGQgZXhlYy5nZXRFeGVjT3V0cHV0KCdzd192ZXJzJywgdW5kZWZpbmVkLCB7XG4gICAgICAgIHNpbGVudDogdHJ1ZVxuICAgIH0pO1xuICAgIGNvbnN0IHZlcnNpb24gPSAoX2IgPSAoX2EgPSBzdGRvdXQubWF0Y2goL1Byb2R1Y3RWZXJzaW9uOlxccyooLispLykpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYVsxXSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XG4gICAgY29uc3QgbmFtZSA9IChfZCA9IChfYyA9IHN0ZG91dC5tYXRjaCgvUHJvZHVjdE5hbWU6XFxzKiguKykvKSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jWzFdKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAnJztcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lLFxuICAgICAgICB2ZXJzaW9uXG4gICAgfTtcbn0pO1xuY29uc3QgZ2V0TGludXhJbmZvID0gKCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgY29uc3QgeyBzdGRvdXQgfSA9IHlpZWxkIGV4ZWMuZ2V0RXhlY091dHB1dCgnbHNiX3JlbGVhc2UnLCBbJy1pJywgJy1yJywgJy1zJ10sIHtcbiAgICAgICAgc2lsZW50OiB0cnVlXG4gICAgfSk7XG4gICAgY29uc3QgW25hbWUsIHZlcnNpb25dID0gc3Rkb3V0LnRyaW0oKS5zcGxpdCgnXFxuJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgdmVyc2lvblxuICAgIH07XG59KTtcbmV4cG9ydHMucGxhdGZvcm0gPSBvc18xLmRlZmF1bHQucGxhdGZvcm0oKTtcbmV4cG9ydHMuYXJjaCA9IG9zXzEuZGVmYXVsdC5hcmNoKCk7XG5leHBvcnRzLmlzV2luZG93cyA9IGV4cG9ydHMucGxhdGZvcm0gPT09ICd3aW4zMic7XG5leHBvcnRzLmlzTWFjT1MgPSBleHBvcnRzLnBsYXRmb3JtID09PSAnZGFyd2luJztcbmV4cG9ydHMuaXNMaW51eCA9IGV4cG9ydHMucGxhdGZvcm0gPT09ICdsaW51eCc7XG5mdW5jdGlvbiBnZXREZXRhaWxzKCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sICh5aWVsZCAoZXhwb3J0cy5pc1dpbmRvd3NcbiAgICAgICAgICAgID8gZ2V0V2luZG93c0luZm8oKVxuICAgICAgICAgICAgOiBleHBvcnRzLmlzTWFjT1NcbiAgICAgICAgICAgICAgICA/IGdldE1hY09zSW5mbygpXG4gICAgICAgICAgICAgICAgOiBnZXRMaW51eEluZm8oKSkpKSwgeyBwbGF0Zm9ybTogZXhwb3J0cy5wbGF0Zm9ybSxcbiAgICAgICAgICAgIGFyY2g6IGV4cG9ydHMuYXJjaCxcbiAgICAgICAgICAgIGlzV2luZG93czogZXhwb3J0cy5pc1dpbmRvd3MsXG4gICAgICAgICAgICBpc01hY09TOiBleHBvcnRzLmlzTWFjT1MsXG4gICAgICAgICAgICBpc0xpbnV4OiBleHBvcnRzLmlzTGludXggfSk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldERldGFpbHMgPSBnZXREZXRhaWxzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGxhdGZvcm0uanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wbGF0Zm9ybSA9IGV4cG9ydHMudG9QbGF0Zm9ybVBhdGggPSBleHBvcnRzLnRvV2luMzJQYXRoID0gZXhwb3J0cy50b1Bvc2l4UGF0aCA9IGV4cG9ydHMubWFya2Rvd25TdW1tYXJ5ID0gZXhwb3J0cy5zdW1tYXJ5ID0gZXhwb3J0cy5nZXRJRFRva2VuID0gZXhwb3J0cy5nZXRTdGF0ZSA9IGV4cG9ydHMuc2F2ZVN0YXRlID0gZXhwb3J0cy5ncm91cCA9IGV4cG9ydHMuZW5kR3JvdXAgPSBleHBvcnRzLnN0YXJ0R3JvdXAgPSBleHBvcnRzLmluZm8gPSBleHBvcnRzLm5vdGljZSA9IGV4cG9ydHMud2FybmluZyA9IGV4cG9ydHMuZXJyb3IgPSBleHBvcnRzLmRlYnVnID0gZXhwb3J0cy5pc0RlYnVnID0gZXhwb3J0cy5zZXRGYWlsZWQgPSBleHBvcnRzLnNldENvbW1hbmRFY2hvID0gZXhwb3J0cy5zZXRPdXRwdXQgPSBleHBvcnRzLmdldEJvb2xlYW5JbnB1dCA9IGV4cG9ydHMuZ2V0TXVsdGlsaW5lSW5wdXQgPSBleHBvcnRzLmdldElucHV0ID0gZXhwb3J0cy5hZGRQYXRoID0gZXhwb3J0cy5zZXRTZWNyZXQgPSBleHBvcnRzLmV4cG9ydFZhcmlhYmxlID0gZXhwb3J0cy5FeGl0Q29kZSA9IHZvaWQgMDtcbmNvbnN0IGNvbW1hbmRfMSA9IHJlcXVpcmUoXCIuL2NvbW1hbmRcIik7XG5jb25zdCBmaWxlX2NvbW1hbmRfMSA9IHJlcXVpcmUoXCIuL2ZpbGUtY29tbWFuZFwiKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbmNvbnN0IG9zID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJvc1wiKSk7XG5jb25zdCBwYXRoID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJwYXRoXCIpKTtcbmNvbnN0IG9pZGNfdXRpbHNfMSA9IHJlcXVpcmUoXCIuL29pZGMtdXRpbHNcIik7XG4vKipcbiAqIFRoZSBjb2RlIHRvIGV4aXQgYW4gYWN0aW9uXG4gKi9cbnZhciBFeGl0Q29kZTtcbihmdW5jdGlvbiAoRXhpdENvZGUpIHtcbiAgICAvKipcbiAgICAgKiBBIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBhY3Rpb24gd2FzIHN1Y2Nlc3NmdWxcbiAgICAgKi9cbiAgICBFeGl0Q29kZVtFeGl0Q29kZVtcIlN1Y2Nlc3NcIl0gPSAwXSA9IFwiU3VjY2Vzc1wiO1xuICAgIC8qKlxuICAgICAqIEEgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGFjdGlvbiB3YXMgYSBmYWlsdXJlXG4gICAgICovXG4gICAgRXhpdENvZGVbRXhpdENvZGVbXCJGYWlsdXJlXCJdID0gMV0gPSBcIkZhaWx1cmVcIjtcbn0pKEV4aXRDb2RlIHx8IChleHBvcnRzLkV4aXRDb2RlID0gRXhpdENvZGUgPSB7fSkpO1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVmFyaWFibGVzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vKipcbiAqIFNldHMgZW52IHZhcmlhYmxlIGZvciB0aGlzIGFjdGlvbiBhbmQgZnV0dXJlIGFjdGlvbnMgaW4gdGhlIGpvYlxuICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHNldFxuICogQHBhcmFtIHZhbCB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlLiBOb24tc3RyaW5nIHZhbHVlcyB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIHN0cmluZyB2aWEgSlNPTi5zdHJpbmdpZnlcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmZ1bmN0aW9uIGV4cG9ydFZhcmlhYmxlKG5hbWUsIHZhbCkge1xuICAgIGNvbnN0IGNvbnZlcnRlZFZhbCA9ICgwLCB1dGlsc18xLnRvQ29tbWFuZFZhbHVlKSh2YWwpO1xuICAgIHByb2Nlc3MuZW52W25hbWVdID0gY29udmVydGVkVmFsO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcHJvY2Vzcy5lbnZbJ0dJVEhVQl9FTlYnXSB8fCAnJztcbiAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgICAgcmV0dXJuICgwLCBmaWxlX2NvbW1hbmRfMS5pc3N1ZUZpbGVDb21tYW5kKSgnRU5WJywgKDAsIGZpbGVfY29tbWFuZF8xLnByZXBhcmVLZXlWYWx1ZU1lc3NhZ2UpKG5hbWUsIHZhbCkpO1xuICAgIH1cbiAgICAoMCwgY29tbWFuZF8xLmlzc3VlQ29tbWFuZCkoJ3NldC1lbnYnLCB7IG5hbWUgfSwgY29udmVydGVkVmFsKTtcbn1cbmV4cG9ydHMuZXhwb3J0VmFyaWFibGUgPSBleHBvcnRWYXJpYWJsZTtcbi8qKlxuICogUmVnaXN0ZXJzIGEgc2VjcmV0IHdoaWNoIHdpbGwgZ2V0IG1hc2tlZCBmcm9tIGxvZ3NcbiAqIEBwYXJhbSBzZWNyZXQgdmFsdWUgb2YgdGhlIHNlY3JldFxuICovXG5mdW5jdGlvbiBzZXRTZWNyZXQoc2VjcmV0KSB7XG4gICAgKDAsIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQpKCdhZGQtbWFzaycsIHt9LCBzZWNyZXQpO1xufVxuZXhwb3J0cy5zZXRTZWNyZXQgPSBzZXRTZWNyZXQ7XG4vKipcbiAqIFByZXBlbmRzIGlucHV0UGF0aCB0byB0aGUgUEFUSCAoZm9yIHRoaXMgYWN0aW9uIGFuZCBmdXR1cmUgYWN0aW9ucylcbiAqIEBwYXJhbSBpbnB1dFBhdGhcbiAqL1xuZnVuY3Rpb24gYWRkUGF0aChpbnB1dFBhdGgpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHByb2Nlc3MuZW52WydHSVRIVUJfUEFUSCddIHx8ICcnO1xuICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgICAoMCwgZmlsZV9jb21tYW5kXzEuaXNzdWVGaWxlQ29tbWFuZCkoJ1BBVEgnLCBpbnB1dFBhdGgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgKDAsIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQpKCdhZGQtcGF0aCcsIHt9LCBpbnB1dFBhdGgpO1xuICAgIH1cbiAgICBwcm9jZXNzLmVudlsnUEFUSCddID0gYCR7aW5wdXRQYXRofSR7cGF0aC5kZWxpbWl0ZXJ9JHtwcm9jZXNzLmVudlsnUEFUSCddfWA7XG59XG5leHBvcnRzLmFkZFBhdGggPSBhZGRQYXRoO1xuLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBvZiBhbiBpbnB1dC5cbiAqIFVubGVzcyB0cmltV2hpdGVzcGFjZSBpcyBzZXQgdG8gZmFsc2UgaW4gSW5wdXRPcHRpb25zLCB0aGUgdmFsdWUgaXMgYWxzbyB0cmltbWVkLlxuICogUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIHZhbHVlIGlzIG5vdCBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSAgICAgbmFtZSAgICAgbmFtZSBvZiB0aGUgaW5wdXQgdG8gZ2V0XG4gKiBAcGFyYW0gICAgIG9wdGlvbnMgIG9wdGlvbmFsLiBTZWUgSW5wdXRPcHRpb25zLlxuICogQHJldHVybnMgICBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZ2V0SW5wdXQobmFtZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IHZhbCA9IHByb2Nlc3MuZW52W2BJTlBVVF8ke25hbWUucmVwbGFjZSgvIC9nLCAnXycpLnRvVXBwZXJDYXNlKCl9YF0gfHwgJyc7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZXF1aXJlZCAmJiAhdmFsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5wdXQgcmVxdWlyZWQgYW5kIG5vdCBzdXBwbGllZDogJHtuYW1lfWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnRyaW1XaGl0ZXNwYWNlID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gdmFsLnRyaW0oKTtcbn1cbmV4cG9ydHMuZ2V0SW5wdXQgPSBnZXRJbnB1dDtcbi8qKlxuICogR2V0cyB0aGUgdmFsdWVzIG9mIGFuIG11bHRpbGluZSBpbnB1dC4gIEVhY2ggdmFsdWUgaXMgYWxzbyB0cmltbWVkLlxuICpcbiAqIEBwYXJhbSAgICAgbmFtZSAgICAgbmFtZSBvZiB0aGUgaW5wdXQgdG8gZ2V0XG4gKiBAcGFyYW0gICAgIG9wdGlvbnMgIG9wdGlvbmFsLiBTZWUgSW5wdXRPcHRpb25zLlxuICogQHJldHVybnMgICBzdHJpbmdbXVxuICpcbiAqL1xuZnVuY3Rpb24gZ2V0TXVsdGlsaW5lSW5wdXQobmFtZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IGlucHV0cyA9IGdldElucHV0KG5hbWUsIG9wdGlvbnMpXG4gICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgLmZpbHRlcih4ID0+IHggIT09ICcnKTtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnRyaW1XaGl0ZXNwYWNlID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gaW5wdXRzO1xuICAgIH1cbiAgICByZXR1cm4gaW5wdXRzLm1hcChpbnB1dCA9PiBpbnB1dC50cmltKCkpO1xufVxuZXhwb3J0cy5nZXRNdWx0aWxpbmVJbnB1dCA9IGdldE11bHRpbGluZUlucHV0O1xuLyoqXG4gKiBHZXRzIHRoZSBpbnB1dCB2YWx1ZSBvZiB0aGUgYm9vbGVhbiB0eXBlIGluIHRoZSBZQU1MIDEuMiBcImNvcmUgc2NoZW1hXCIgc3BlY2lmaWNhdGlvbi5cbiAqIFN1cHBvcnQgYm9vbGVhbiBpbnB1dCBsaXN0OiBgdHJ1ZSB8IFRydWUgfCBUUlVFIHwgZmFsc2UgfCBGYWxzZSB8IEZBTFNFYCAuXG4gKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGFsc28gaW4gYm9vbGVhbiB0eXBlLlxuICogcmVmOiBodHRwczovL3lhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCNpZDI4MDQ5MjNcbiAqXG4gKiBAcGFyYW0gICAgIG5hbWUgICAgIG5hbWUgb2YgdGhlIGlucHV0IHRvIGdldFxuICogQHBhcmFtICAgICBvcHRpb25zICBvcHRpb25hbC4gU2VlIElucHV0T3B0aW9ucy5cbiAqIEByZXR1cm5zICAgYm9vbGVhblxuICovXG5mdW5jdGlvbiBnZXRCb29sZWFuSW5wdXQobmFtZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IHRydWVWYWx1ZSA9IFsndHJ1ZScsICdUcnVlJywgJ1RSVUUnXTtcbiAgICBjb25zdCBmYWxzZVZhbHVlID0gWydmYWxzZScsICdGYWxzZScsICdGQUxTRSddO1xuICAgIGNvbnN0IHZhbCA9IGdldElucHV0KG5hbWUsIG9wdGlvbnMpO1xuICAgIGlmICh0cnVlVmFsdWUuaW5jbHVkZXModmFsKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKGZhbHNlVmFsdWUuaW5jbHVkZXModmFsKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYElucHV0IGRvZXMgbm90IG1lZXQgWUFNTCAxLjIgXCJDb3JlIFNjaGVtYVwiIHNwZWNpZmljYXRpb246ICR7bmFtZX1cXG5gICtcbiAgICAgICAgYFN1cHBvcnQgYm9vbGVhbiBpbnB1dCBsaXN0OiBcXGB0cnVlIHwgVHJ1ZSB8IFRSVUUgfCBmYWxzZSB8IEZhbHNlIHwgRkFMU0VcXGBgKTtcbn1cbmV4cG9ydHMuZ2V0Qm9vbGVhbklucHV0ID0gZ2V0Qm9vbGVhbklucHV0O1xuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBvZiBhbiBvdXRwdXQuXG4gKlxuICogQHBhcmFtICAgICBuYW1lICAgICBuYW1lIG9mIHRoZSBvdXRwdXQgdG8gc2V0XG4gKiBAcGFyYW0gICAgIHZhbHVlICAgIHZhbHVlIHRvIHN0b3JlLiBOb24tc3RyaW5nIHZhbHVlcyB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIHN0cmluZyB2aWEgSlNPTi5zdHJpbmdpZnlcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmZ1bmN0aW9uIHNldE91dHB1dChuYW1lLCB2YWx1ZSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcHJvY2Vzcy5lbnZbJ0dJVEhVQl9PVVRQVVQnXSB8fCAnJztcbiAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgICAgcmV0dXJuICgwLCBmaWxlX2NvbW1hbmRfMS5pc3N1ZUZpbGVDb21tYW5kKSgnT1VUUFVUJywgKDAsIGZpbGVfY29tbWFuZF8xLnByZXBhcmVLZXlWYWx1ZU1lc3NhZ2UpKG5hbWUsIHZhbHVlKSk7XG4gICAgfVxuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG9zLkVPTCk7XG4gICAgKDAsIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQpKCdzZXQtb3V0cHV0JywgeyBuYW1lIH0sICgwLCB1dGlsc18xLnRvQ29tbWFuZFZhbHVlKSh2YWx1ZSkpO1xufVxuZXhwb3J0cy5zZXRPdXRwdXQgPSBzZXRPdXRwdXQ7XG4vKipcbiAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGVjaG9pbmcgb2YgY29tbWFuZHMgaW50byBzdGRvdXQgZm9yIHRoZSByZXN0IG9mIHRoZSBzdGVwLlxuICogRWNob2luZyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGlmIEFDVElPTlNfU1RFUF9ERUJVRyBpcyBub3Qgc2V0LlxuICpcbiAqL1xuZnVuY3Rpb24gc2V0Q29tbWFuZEVjaG8oZW5hYmxlZCkge1xuICAgICgwLCBjb21tYW5kXzEuaXNzdWUpKCdlY2hvJywgZW5hYmxlZCA/ICdvbicgOiAnb2ZmJyk7XG59XG5leHBvcnRzLnNldENvbW1hbmRFY2hvID0gc2V0Q29tbWFuZEVjaG87XG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZXN1bHRzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vKipcbiAqIFNldHMgdGhlIGFjdGlvbiBzdGF0dXMgdG8gZmFpbGVkLlxuICogV2hlbiB0aGUgYWN0aW9uIGV4aXRzIGl0IHdpbGwgYmUgd2l0aCBhbiBleGl0IGNvZGUgb2YgMVxuICogQHBhcmFtIG1lc3NhZ2UgYWRkIGVycm9yIGlzc3VlIG1lc3NhZ2VcbiAqL1xuZnVuY3Rpb24gc2V0RmFpbGVkKG1lc3NhZ2UpIHtcbiAgICBwcm9jZXNzLmV4aXRDb2RlID0gRXhpdENvZGUuRmFpbHVyZTtcbiAgICBlcnJvcihtZXNzYWdlKTtcbn1cbmV4cG9ydHMuc2V0RmFpbGVkID0gc2V0RmFpbGVkO1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTG9nZ2luZyBDb21tYW5kc1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLyoqXG4gKiBHZXRzIHdoZXRoZXIgQWN0aW9ucyBTdGVwIERlYnVnIGlzIG9uIG9yIG5vdFxuICovXG5mdW5jdGlvbiBpc0RlYnVnKCkge1xuICAgIHJldHVybiBwcm9jZXNzLmVudlsnUlVOTkVSX0RFQlVHJ10gPT09ICcxJztcbn1cbmV4cG9ydHMuaXNEZWJ1ZyA9IGlzRGVidWc7XG4vKipcbiAqIFdyaXRlcyBkZWJ1ZyBtZXNzYWdlIHRvIHVzZXIgbG9nXG4gKiBAcGFyYW0gbWVzc2FnZSBkZWJ1ZyBtZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIGRlYnVnKG1lc3NhZ2UpIHtcbiAgICAoMCwgY29tbWFuZF8xLmlzc3VlQ29tbWFuZCkoJ2RlYnVnJywge30sIG1lc3NhZ2UpO1xufVxuZXhwb3J0cy5kZWJ1ZyA9IGRlYnVnO1xuLyoqXG4gKiBBZGRzIGFuIGVycm9yIGlzc3VlXG4gKiBAcGFyYW0gbWVzc2FnZSBlcnJvciBpc3N1ZSBtZXNzYWdlLiBFcnJvcnMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gc3RyaW5nIHZpYSB0b1N0cmluZygpXG4gKiBAcGFyYW0gcHJvcGVydGllcyBvcHRpb25hbCBwcm9wZXJ0aWVzIHRvIGFkZCB0byB0aGUgYW5ub3RhdGlvbi5cbiAqL1xuZnVuY3Rpb24gZXJyb3IobWVzc2FnZSwgcHJvcGVydGllcyA9IHt9KSB7XG4gICAgKDAsIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQpKCdlcnJvcicsICgwLCB1dGlsc18xLnRvQ29tbWFuZFByb3BlcnRpZXMpKHByb3BlcnRpZXMpLCBtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IgPyBtZXNzYWdlLnRvU3RyaW5nKCkgOiBtZXNzYWdlKTtcbn1cbmV4cG9ydHMuZXJyb3IgPSBlcnJvcjtcbi8qKlxuICogQWRkcyBhIHdhcm5pbmcgaXNzdWVcbiAqIEBwYXJhbSBtZXNzYWdlIHdhcm5pbmcgaXNzdWUgbWVzc2FnZS4gRXJyb3JzIHdpbGwgYmUgY29udmVydGVkIHRvIHN0cmluZyB2aWEgdG9TdHJpbmcoKVxuICogQHBhcmFtIHByb3BlcnRpZXMgb3B0aW9uYWwgcHJvcGVydGllcyB0byBhZGQgdG8gdGhlIGFubm90YXRpb24uXG4gKi9cbmZ1bmN0aW9uIHdhcm5pbmcobWVzc2FnZSwgcHJvcGVydGllcyA9IHt9KSB7XG4gICAgKDAsIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQpKCd3YXJuaW5nJywgKDAsIHV0aWxzXzEudG9Db21tYW5kUHJvcGVydGllcykocHJvcGVydGllcyksIG1lc3NhZ2UgaW5zdGFuY2VvZiBFcnJvciA/IG1lc3NhZ2UudG9TdHJpbmcoKSA6IG1lc3NhZ2UpO1xufVxuZXhwb3J0cy53YXJuaW5nID0gd2FybmluZztcbi8qKlxuICogQWRkcyBhIG5vdGljZSBpc3N1ZVxuICogQHBhcmFtIG1lc3NhZ2Ugbm90aWNlIGlzc3VlIG1lc3NhZ2UuIEVycm9ycyB3aWxsIGJlIGNvbnZlcnRlZCB0byBzdHJpbmcgdmlhIHRvU3RyaW5nKClcbiAqIEBwYXJhbSBwcm9wZXJ0aWVzIG9wdGlvbmFsIHByb3BlcnRpZXMgdG8gYWRkIHRvIHRoZSBhbm5vdGF0aW9uLlxuICovXG5mdW5jdGlvbiBub3RpY2UobWVzc2FnZSwgcHJvcGVydGllcyA9IHt9KSB7XG4gICAgKDAsIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQpKCdub3RpY2UnLCAoMCwgdXRpbHNfMS50b0NvbW1hbmRQcm9wZXJ0aWVzKShwcm9wZXJ0aWVzKSwgbWVzc2FnZSBpbnN0YW5jZW9mIEVycm9yID8gbWVzc2FnZS50b1N0cmluZygpIDogbWVzc2FnZSk7XG59XG5leHBvcnRzLm5vdGljZSA9IG5vdGljZTtcbi8qKlxuICogV3JpdGVzIGluZm8gdG8gbG9nIHdpdGggY29uc29sZS5sb2cuXG4gKiBAcGFyYW0gbWVzc2FnZSBpbmZvIG1lc3NhZ2VcbiAqL1xuZnVuY3Rpb24gaW5mbyhtZXNzYWdlKSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUobWVzc2FnZSArIG9zLkVPTCk7XG59XG5leHBvcnRzLmluZm8gPSBpbmZvO1xuLyoqXG4gKiBCZWdpbiBhbiBvdXRwdXQgZ3JvdXAuXG4gKlxuICogT3V0cHV0IHVudGlsIHRoZSBuZXh0IGBncm91cEVuZGAgd2lsbCBiZSBmb2xkYWJsZSBpbiB0aGlzIGdyb3VwXG4gKlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIG91dHB1dCBncm91cFxuICovXG5mdW5jdGlvbiBzdGFydEdyb3VwKG5hbWUpIHtcbiAgICAoMCwgY29tbWFuZF8xLmlzc3VlKSgnZ3JvdXAnLCBuYW1lKTtcbn1cbmV4cG9ydHMuc3RhcnRHcm91cCA9IHN0YXJ0R3JvdXA7XG4vKipcbiAqIEVuZCBhbiBvdXRwdXQgZ3JvdXAuXG4gKi9cbmZ1bmN0aW9uIGVuZEdyb3VwKCkge1xuICAgICgwLCBjb21tYW5kXzEuaXNzdWUpKCdlbmRncm91cCcpO1xufVxuZXhwb3J0cy5lbmRHcm91cCA9IGVuZEdyb3VwO1xuLyoqXG4gKiBXcmFwIGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBjYWxsIGluIGEgZ3JvdXAuXG4gKlxuICogUmV0dXJucyB0aGUgc2FtZSB0eXBlIGFzIHRoZSBmdW5jdGlvbiBpdHNlbGYuXG4gKlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGdyb3VwXG4gKiBAcGFyYW0gZm4gVGhlIGZ1bmN0aW9uIHRvIHdyYXAgaW4gdGhlIGdyb3VwXG4gKi9cbmZ1bmN0aW9uIGdyb3VwKG5hbWUsIGZuKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgc3RhcnRHcm91cChuYW1lKTtcbiAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHlpZWxkIGZuKCk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBlbmRHcm91cCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG59XG5leHBvcnRzLmdyb3VwID0gZ3JvdXA7XG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBXcmFwcGVyIGFjdGlvbiBzdGF0ZVxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLyoqXG4gKiBTYXZlcyBzdGF0ZSBmb3IgY3VycmVudCBhY3Rpb24sIHRoZSBzdGF0ZSBjYW4gb25seSBiZSByZXRyaWV2ZWQgYnkgdGhpcyBhY3Rpb24ncyBwb3N0IGpvYiBleGVjdXRpb24uXG4gKlxuICogQHBhcmFtICAgICBuYW1lICAgICBuYW1lIG9mIHRoZSBzdGF0ZSB0byBzdG9yZVxuICogQHBhcmFtICAgICB2YWx1ZSAgICB2YWx1ZSB0byBzdG9yZS4gTm9uLXN0cmluZyB2YWx1ZXMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgdmlhIEpTT04uc3RyaW5naWZ5XG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5mdW5jdGlvbiBzYXZlU3RhdGUobmFtZSwgdmFsdWUpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHByb2Nlc3MuZW52WydHSVRIVUJfU1RBVEUnXSB8fCAnJztcbiAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgICAgcmV0dXJuICgwLCBmaWxlX2NvbW1hbmRfMS5pc3N1ZUZpbGVDb21tYW5kKSgnU1RBVEUnLCAoMCwgZmlsZV9jb21tYW5kXzEucHJlcGFyZUtleVZhbHVlTWVzc2FnZSkobmFtZSwgdmFsdWUpKTtcbiAgICB9XG4gICAgKDAsIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQpKCdzYXZlLXN0YXRlJywgeyBuYW1lIH0sICgwLCB1dGlsc18xLnRvQ29tbWFuZFZhbHVlKSh2YWx1ZSkpO1xufVxuZXhwb3J0cy5zYXZlU3RhdGUgPSBzYXZlU3RhdGU7XG4vKipcbiAqIEdldHMgdGhlIHZhbHVlIG9mIGFuIHN0YXRlIHNldCBieSB0aGlzIGFjdGlvbidzIG1haW4gZXhlY3V0aW9uLlxuICpcbiAqIEBwYXJhbSAgICAgbmFtZSAgICAgbmFtZSBvZiB0aGUgc3RhdGUgdG8gZ2V0XG4gKiBAcmV0dXJucyAgIHN0cmluZ1xuICovXG5mdW5jdGlvbiBnZXRTdGF0ZShuYW1lKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52W2BTVEFURV8ke25hbWV9YF0gfHwgJyc7XG59XG5leHBvcnRzLmdldFN0YXRlID0gZ2V0U3RhdGU7XG5mdW5jdGlvbiBnZXRJRFRva2VuKGF1ZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHJldHVybiB5aWVsZCBvaWRjX3V0aWxzXzEuT2lkY0NsaWVudC5nZXRJRFRva2VuKGF1ZCk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldElEVG9rZW4gPSBnZXRJRFRva2VuO1xuLyoqXG4gKiBTdW1tYXJ5IGV4cG9ydHNcbiAqL1xudmFyIHN1bW1hcnlfMSA9IHJlcXVpcmUoXCIuL3N1bW1hcnlcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJzdW1tYXJ5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBzdW1tYXJ5XzEuc3VtbWFyeTsgfSB9KTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIGNvcmUuc3VtbWFyeVxuICovXG52YXIgc3VtbWFyeV8yID0gcmVxdWlyZShcIi4vc3VtbWFyeVwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIm1hcmtkb3duU3VtbWFyeVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc3VtbWFyeV8yLm1hcmtkb3duU3VtbWFyeTsgfSB9KTtcbi8qKlxuICogUGF0aCBleHBvcnRzXG4gKi9cbnZhciBwYXRoX3V0aWxzXzEgPSByZXF1aXJlKFwiLi9wYXRoLXV0aWxzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidG9Qb3NpeFBhdGhcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHBhdGhfdXRpbHNfMS50b1Bvc2l4UGF0aDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInRvV2luMzJQYXRoXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBwYXRoX3V0aWxzXzEudG9XaW4zMlBhdGg7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ0b1BsYXRmb3JtUGF0aFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcGF0aF91dGlsc18xLnRvUGxhdGZvcm1QYXRoOyB9IH0pO1xuLyoqXG4gKiBQbGF0Zm9ybSB1dGlsaXRpZXMgZXhwb3J0c1xuICovXG5leHBvcnRzLnBsYXRmb3JtID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL3BsYXRmb3JtXCIpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvcmUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkNvbnRleHQgPSB2b2lkIDA7XG5jb25zdCBmc18xID0gcmVxdWlyZShcImZzXCIpO1xuY29uc3Qgb3NfMSA9IHJlcXVpcmUoXCJvc1wiKTtcbmNsYXNzIENvbnRleHQge1xuICAgIC8qKlxuICAgICAqIEh5ZHJhdGUgdGhlIGNvbnRleHQgZnJvbSB0aGUgZW52aXJvbm1lbnRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIHRoaXMucGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuR0lUSFVCX0VWRU5UX1BBVEgpIHtcbiAgICAgICAgICAgIGlmICgoMCwgZnNfMS5leGlzdHNTeW5jKShwcm9jZXNzLmVudi5HSVRIVUJfRVZFTlRfUEFUSCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBheWxvYWQgPSBKU09OLnBhcnNlKCgwLCBmc18xLnJlYWRGaWxlU3luYykocHJvY2Vzcy5lbnYuR0lUSFVCX0VWRU5UX1BBVEgsIHsgZW5jb2Rpbmc6ICd1dGY4JyB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gcHJvY2Vzcy5lbnYuR0lUSFVCX0VWRU5UX1BBVEg7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoYEdJVEhVQl9FVkVOVF9QQVRIICR7cGF0aH0gZG9lcyBub3QgZXhpc3Qke29zXzEuRU9MfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXZlbnROYW1lID0gcHJvY2Vzcy5lbnYuR0lUSFVCX0VWRU5UX05BTUU7XG4gICAgICAgIHRoaXMuc2hhID0gcHJvY2Vzcy5lbnYuR0lUSFVCX1NIQTtcbiAgICAgICAgdGhpcy5yZWYgPSBwcm9jZXNzLmVudi5HSVRIVUJfUkVGO1xuICAgICAgICB0aGlzLndvcmtmbG93ID0gcHJvY2Vzcy5lbnYuR0lUSFVCX1dPUktGTE9XO1xuICAgICAgICB0aGlzLmFjdGlvbiA9IHByb2Nlc3MuZW52LkdJVEhVQl9BQ1RJT047XG4gICAgICAgIHRoaXMuYWN0b3IgPSBwcm9jZXNzLmVudi5HSVRIVUJfQUNUT1I7XG4gICAgICAgIHRoaXMuam9iID0gcHJvY2Vzcy5lbnYuR0lUSFVCX0pPQjtcbiAgICAgICAgdGhpcy5ydW5BdHRlbXB0ID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuR0lUSFVCX1JVTl9BVFRFTVBULCAxMCk7XG4gICAgICAgIHRoaXMucnVuTnVtYmVyID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuR0lUSFVCX1JVTl9OVU1CRVIsIDEwKTtcbiAgICAgICAgdGhpcy5ydW5JZCA9IHBhcnNlSW50KHByb2Nlc3MuZW52LkdJVEhVQl9SVU5fSUQsIDEwKTtcbiAgICAgICAgdGhpcy5hcGlVcmwgPSAoX2EgPSBwcm9jZXNzLmVudi5HSVRIVUJfQVBJX1VSTCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb21gO1xuICAgICAgICB0aGlzLnNlcnZlclVybCA9IChfYiA9IHByb2Nlc3MuZW52LkdJVEhVQl9TRVJWRVJfVVJMKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBgaHR0cHM6Ly9naXRodWIuY29tYDtcbiAgICAgICAgdGhpcy5ncmFwaHFsVXJsID1cbiAgICAgICAgICAgIChfYyA9IHByb2Nlc3MuZW52LkdJVEhVQl9HUkFQSFFMX1VSTCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vZ3JhcGhxbGA7XG4gICAgfVxuICAgIGdldCBpc3N1ZSgpIHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMucGF5bG9hZDtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5yZXBvKSwgeyBudW1iZXI6IChwYXlsb2FkLmlzc3VlIHx8IHBheWxvYWQucHVsbF9yZXF1ZXN0IHx8IHBheWxvYWQpLm51bWJlciB9KTtcbiAgICB9XG4gICAgZ2V0IHJlcG8oKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5HSVRIVUJfUkVQT1NJVE9SWSkge1xuICAgICAgICAgICAgY29uc3QgW293bmVyLCByZXBvXSA9IHByb2Nlc3MuZW52LkdJVEhVQl9SRVBPU0lUT1JZLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICByZXR1cm4geyBvd25lciwgcmVwbyB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBheWxvYWQucmVwb3NpdG9yeSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBvd25lcjogdGhpcy5wYXlsb2FkLnJlcG9zaXRvcnkub3duZXIubG9naW4sXG4gICAgICAgICAgICAgICAgcmVwbzogdGhpcy5wYXlsb2FkLnJlcG9zaXRvcnkubmFtZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb250ZXh0LnJlcG8gcmVxdWlyZXMgYSBHSVRIVUJfUkVQT1NJVE9SWSBlbnZpcm9ubWVudCB2YXJpYWJsZSBsaWtlICdvd25lci9yZXBvJ1wiKTtcbiAgICB9XG59XG5leHBvcnRzLkNvbnRleHQgPSBDb250ZXh0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udGV4dC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldEFwaUJhc2VVcmwgPSBleHBvcnRzLmdldFByb3h5RmV0Y2ggPSBleHBvcnRzLmdldFByb3h5QWdlbnREaXNwYXRjaGVyID0gZXhwb3J0cy5nZXRQcm94eUFnZW50ID0gZXhwb3J0cy5nZXRBdXRoU3RyaW5nID0gdm9pZCAwO1xuY29uc3QgaHR0cENsaWVudCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiQGFjdGlvbnMvaHR0cC1jbGllbnRcIikpO1xuY29uc3QgdW5kaWNpXzEgPSByZXF1aXJlKFwidW5kaWNpXCIpO1xuZnVuY3Rpb24gZ2V0QXV0aFN0cmluZyh0b2tlbiwgb3B0aW9ucykge1xuICAgIGlmICghdG9rZW4gJiYgIW9wdGlvbnMuYXV0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmFtZXRlciB0b2tlbiBvciBvcHRzLmF1dGggaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodG9rZW4gJiYgb3B0aW9ucy5hdXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyYW1ldGVycyB0b2tlbiBhbmQgb3B0cy5hdXRoIG1heSBub3QgYm90aCBiZSBzcGVjaWZpZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiBvcHRpb25zLmF1dGggPT09ICdzdHJpbmcnID8gb3B0aW9ucy5hdXRoIDogYHRva2VuICR7dG9rZW59YDtcbn1cbmV4cG9ydHMuZ2V0QXV0aFN0cmluZyA9IGdldEF1dGhTdHJpbmc7XG5mdW5jdGlvbiBnZXRQcm94eUFnZW50KGRlc3RpbmF0aW9uVXJsKSB7XG4gICAgY29uc3QgaGMgPSBuZXcgaHR0cENsaWVudC5IdHRwQ2xpZW50KCk7XG4gICAgcmV0dXJuIGhjLmdldEFnZW50KGRlc3RpbmF0aW9uVXJsKTtcbn1cbmV4cG9ydHMuZ2V0UHJveHlBZ2VudCA9IGdldFByb3h5QWdlbnQ7XG5mdW5jdGlvbiBnZXRQcm94eUFnZW50RGlzcGF0Y2hlcihkZXN0aW5hdGlvblVybCkge1xuICAgIGNvbnN0IGhjID0gbmV3IGh0dHBDbGllbnQuSHR0cENsaWVudCgpO1xuICAgIHJldHVybiBoYy5nZXRBZ2VudERpc3BhdGNoZXIoZGVzdGluYXRpb25VcmwpO1xufVxuZXhwb3J0cy5nZXRQcm94eUFnZW50RGlzcGF0Y2hlciA9IGdldFByb3h5QWdlbnREaXNwYXRjaGVyO1xuZnVuY3Rpb24gZ2V0UHJveHlGZXRjaChkZXN0aW5hdGlvblVybCkge1xuICAgIGNvbnN0IGh0dHBEaXNwYXRjaGVyID0gZ2V0UHJveHlBZ2VudERpc3BhdGNoZXIoZGVzdGluYXRpb25VcmwpO1xuICAgIGNvbnN0IHByb3h5RmV0Y2ggPSAodXJsLCBvcHRzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHJldHVybiAoMCwgdW5kaWNpXzEuZmV0Y2gpKHVybCwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRzKSwgeyBkaXNwYXRjaGVyOiBodHRwRGlzcGF0Y2hlciB9KSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHByb3h5RmV0Y2g7XG59XG5leHBvcnRzLmdldFByb3h5RmV0Y2ggPSBnZXRQcm94eUZldGNoO1xuZnVuY3Rpb24gZ2V0QXBpQmFzZVVybCgpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnZbJ0dJVEhVQl9BUElfVVJMJ10gfHwgJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20nO1xufVxuZXhwb3J0cy5nZXRBcGlCYXNlVXJsID0gZ2V0QXBpQmFzZVVybDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsImZ1bmN0aW9uIGdldFVzZXJBZ2VudCgpIHtcbiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciA9PT0gXCJvYmplY3RcIiAmJiBcInVzZXJBZ2VudFwiIGluIG5hdmlnYXRvcikge1xuICAgICAgICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSBcIm9iamVjdFwiICYmIHByb2Nlc3MudmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBgTm9kZS5qcy8ke3Byb2Nlc3MudmVyc2lvbi5zdWJzdHIoMSl9ICgke3Byb2Nlc3MucGxhdGZvcm19OyAke3Byb2Nlc3MuYXJjaH0pYDtcbiAgICB9XG4gICAgcmV0dXJuIFwiPGVudmlyb25tZW50IHVuZGV0ZWN0YWJsZT5cIjtcbn1cblxuZXhwb3J0IHsgZ2V0VXNlckFnZW50IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVnaXN0ZXI7XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyKHN0YXRlLCBuYW1lLCBtZXRob2QsIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBtZXRob2QgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IG5ldyBFcnJvcihcIm1ldGhvZCBmb3IgYmVmb3JlIGhvb2sgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO1xuICB9XG5cbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkobmFtZSkpIHtcbiAgICByZXR1cm4gbmFtZS5yZXZlcnNlKCkucmVkdWNlKGZ1bmN0aW9uIChjYWxsYmFjaywgbmFtZSkge1xuICAgICAgcmV0dXJuIHJlZ2lzdGVyLmJpbmQobnVsbCwgc3RhdGUsIG5hbWUsIGNhbGxiYWNrLCBvcHRpb25zKTtcbiAgICB9LCBtZXRob2QpKCk7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFzdGF0ZS5yZWdpc3RyeVtuYW1lXSkge1xuICAgICAgcmV0dXJuIG1ldGhvZChvcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGUucmVnaXN0cnlbbmFtZV0ucmVkdWNlKGZ1bmN0aW9uIChtZXRob2QsIHJlZ2lzdGVyZWQpIHtcbiAgICAgIHJldHVybiByZWdpc3RlcmVkLmhvb2suYmluZChudWxsLCBtZXRob2QsIG9wdGlvbnMpO1xuICAgIH0sIG1ldGhvZCkoKTtcbiAgfSk7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGFkZEhvb2s7XG5cbmZ1bmN0aW9uIGFkZEhvb2soc3RhdGUsIGtpbmQsIG5hbWUsIGhvb2spIHtcbiAgdmFyIG9yaWcgPSBob29rO1xuICBpZiAoIXN0YXRlLnJlZ2lzdHJ5W25hbWVdKSB7XG4gICAgc3RhdGUucmVnaXN0cnlbbmFtZV0gPSBbXTtcbiAgfVxuXG4gIGlmIChraW5kID09PSBcImJlZm9yZVwiKSB7XG4gICAgaG9vayA9IGZ1bmN0aW9uIChtZXRob2QsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAudGhlbihvcmlnLmJpbmQobnVsbCwgb3B0aW9ucykpXG4gICAgICAgIC50aGVuKG1ldGhvZC5iaW5kKG51bGwsIG9wdGlvbnMpKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKGtpbmQgPT09IFwiYWZ0ZXJcIikge1xuICAgIGhvb2sgPSBmdW5jdGlvbiAobWV0aG9kLCBvcHRpb25zKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgIC50aGVuKG1ldGhvZC5iaW5kKG51bGwsIG9wdGlvbnMpKVxuICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0Xykge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdF87XG4gICAgICAgICAgcmV0dXJuIG9yaWcocmVzdWx0LCBvcHRpb25zKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICBpZiAoa2luZCA9PT0gXCJlcnJvclwiKSB7XG4gICAgaG9vayA9IGZ1bmN0aW9uIChtZXRob2QsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAudGhlbihtZXRob2QuYmluZChudWxsLCBvcHRpb25zKSlcbiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBvcmlnKGVycm9yLCBvcHRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRlLnJlZ2lzdHJ5W25hbWVdLnB1c2goe1xuICAgIGhvb2s6IGhvb2ssXG4gICAgb3JpZzogb3JpZyxcbiAgfSk7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlbW92ZUhvb2s7XG5cbmZ1bmN0aW9uIHJlbW92ZUhvb2soc3RhdGUsIG5hbWUsIG1ldGhvZCkge1xuICBpZiAoIXN0YXRlLnJlZ2lzdHJ5W25hbWVdKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGluZGV4ID0gc3RhdGUucmVnaXN0cnlbbmFtZV1cbiAgICAubWFwKGZ1bmN0aW9uIChyZWdpc3RlcmVkKSB7XG4gICAgICByZXR1cm4gcmVnaXN0ZXJlZC5vcmlnO1xuICAgIH0pXG4gICAgLmluZGV4T2YobWV0aG9kKTtcblxuICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3RhdGUucmVnaXN0cnlbbmFtZV0uc3BsaWNlKGluZGV4LCAxKTtcbn1cbiIsInZhciByZWdpc3RlciA9IHJlcXVpcmUoXCIuL2xpYi9yZWdpc3RlclwiKTtcbnZhciBhZGRIb29rID0gcmVxdWlyZShcIi4vbGliL2FkZFwiKTtcbnZhciByZW1vdmVIb29rID0gcmVxdWlyZShcIi4vbGliL3JlbW92ZVwiKTtcblxuLy8gYmluZCB3aXRoIGFycmF5IG9mIGFyZ3VtZW50czogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIxNzkyOTEzXG52YXIgYmluZCA9IEZ1bmN0aW9uLmJpbmQ7XG52YXIgYmluZGFibGUgPSBiaW5kLmJpbmQoYmluZCk7XG5cbmZ1bmN0aW9uIGJpbmRBcGkoaG9vaywgc3RhdGUsIG5hbWUpIHtcbiAgdmFyIHJlbW92ZUhvb2tSZWYgPSBiaW5kYWJsZShyZW1vdmVIb29rLCBudWxsKS5hcHBseShcbiAgICBudWxsLFxuICAgIG5hbWUgPyBbc3RhdGUsIG5hbWVdIDogW3N0YXRlXVxuICApO1xuICBob29rLmFwaSA9IHsgcmVtb3ZlOiByZW1vdmVIb29rUmVmIH07XG4gIGhvb2sucmVtb3ZlID0gcmVtb3ZlSG9va1JlZjtcbiAgW1wiYmVmb3JlXCIsIFwiZXJyb3JcIiwgXCJhZnRlclwiLCBcIndyYXBcIl0uZm9yRWFjaChmdW5jdGlvbiAoa2luZCkge1xuICAgIHZhciBhcmdzID0gbmFtZSA/IFtzdGF0ZSwga2luZCwgbmFtZV0gOiBbc3RhdGUsIGtpbmRdO1xuICAgIGhvb2tba2luZF0gPSBob29rLmFwaVtraW5kXSA9IGJpbmRhYmxlKGFkZEhvb2ssIG51bGwpLmFwcGx5KG51bGwsIGFyZ3MpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gSG9va1Npbmd1bGFyKCkge1xuICB2YXIgc2luZ3VsYXJIb29rTmFtZSA9IFwiaFwiO1xuICB2YXIgc2luZ3VsYXJIb29rU3RhdGUgPSB7XG4gICAgcmVnaXN0cnk6IHt9LFxuICB9O1xuICB2YXIgc2luZ3VsYXJIb29rID0gcmVnaXN0ZXIuYmluZChudWxsLCBzaW5ndWxhckhvb2tTdGF0ZSwgc2luZ3VsYXJIb29rTmFtZSk7XG4gIGJpbmRBcGkoc2luZ3VsYXJIb29rLCBzaW5ndWxhckhvb2tTdGF0ZSwgc2luZ3VsYXJIb29rTmFtZSk7XG4gIHJldHVybiBzaW5ndWxhckhvb2s7XG59XG5cbmZ1bmN0aW9uIEhvb2tDb2xsZWN0aW9uKCkge1xuICB2YXIgc3RhdGUgPSB7XG4gICAgcmVnaXN0cnk6IHt9LFxuICB9O1xuXG4gIHZhciBob29rID0gcmVnaXN0ZXIuYmluZChudWxsLCBzdGF0ZSk7XG4gIGJpbmRBcGkoaG9vaywgc3RhdGUpO1xuXG4gIHJldHVybiBob29rO1xufVxuXG52YXIgY29sbGVjdGlvbkhvb2tEZXByZWNhdGlvbk1lc3NhZ2VEaXNwbGF5ZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIEhvb2soKSB7XG4gIGlmICghY29sbGVjdGlvbkhvb2tEZXByZWNhdGlvbk1lc3NhZ2VEaXNwbGF5ZWQpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnW2JlZm9yZS1hZnRlci1ob29rXTogXCJIb29rKClcIiByZXB1cnBvc2luZyB3YXJuaW5nLCB1c2UgXCJIb29rLkNvbGxlY3Rpb24oKVwiLiBSZWFkIG1vcmU6IGh0dHBzOi8vZ2l0LmlvL3VwZ3JhZGUtYmVmb3JlLWFmdGVyLWhvb2stdG8tMS40J1xuICAgICk7XG4gICAgY29sbGVjdGlvbkhvb2tEZXByZWNhdGlvbk1lc3NhZ2VEaXNwbGF5ZWQgPSB0cnVlO1xuICB9XG4gIHJldHVybiBIb29rQ29sbGVjdGlvbigpO1xufVxuXG5Ib29rLlNpbmd1bGFyID0gSG9va1Npbmd1bGFyLmJpbmQoKTtcbkhvb2suQ29sbGVjdGlvbiA9IEhvb2tDb2xsZWN0aW9uLmJpbmQoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBIb29rO1xuLy8gZXhwb3NlIGNvbnN0cnVjdG9ycyBhcyBhIG5hbWVkIHByb3BlcnR5IGZvciBUeXBlU2NyaXB0XG5tb2R1bGUuZXhwb3J0cy5Ib29rID0gSG9vaztcbm1vZHVsZS5leHBvcnRzLlNpbmd1bGFyID0gSG9vay5TaW5ndWxhcjtcbm1vZHVsZS5leHBvcnRzLkNvbGxlY3Rpb24gPSBIb29rLkNvbGxlY3Rpb247XG4iLCJjb25zdCBWRVJTSU9OID0gXCI5LjAuNlwiO1xuZXhwb3J0IHtcbiAgVkVSU0lPTlxufTtcbiIsImltcG9ydCB7IGdldFVzZXJBZ2VudCB9IGZyb20gXCJ1bml2ZXJzYWwtdXNlci1hZ2VudFwiO1xuaW1wb3J0IHsgVkVSU0lPTiB9IGZyb20gXCIuL3ZlcnNpb25cIjtcbmNvbnN0IHVzZXJBZ2VudCA9IGBvY3Rva2l0LWVuZHBvaW50LmpzLyR7VkVSU0lPTn0gJHtnZXRVc2VyQWdlbnQoKX1gO1xuY29uc3QgREVGQVVMVFMgPSB7XG4gIG1ldGhvZDogXCJHRVRcIixcbiAgYmFzZVVybDogXCJodHRwczovL2FwaS5naXRodWIuY29tXCIsXG4gIGhlYWRlcnM6IHtcbiAgICBhY2NlcHQ6IFwiYXBwbGljYXRpb24vdm5kLmdpdGh1Yi52Mytqc29uXCIsXG4gICAgXCJ1c2VyLWFnZW50XCI6IHVzZXJBZ2VudFxuICB9LFxuICBtZWRpYVR5cGU6IHtcbiAgICBmb3JtYXQ6IFwiXCJcbiAgfVxufTtcbmV4cG9ydCB7XG4gIERFRkFVTFRTXG59O1xuIiwiZnVuY3Rpb24gbG93ZXJjYXNlS2V5cyhvYmplY3QpIHtcbiAgaWYgKCFvYmplY3QpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCkucmVkdWNlKChuZXdPYmosIGtleSkgPT4ge1xuICAgIG5ld09ialtrZXkudG9Mb3dlckNhc2UoKV0gPSBvYmplY3Rba2V5XTtcbiAgICByZXR1cm4gbmV3T2JqO1xuICB9LCB7fSk7XG59XG5leHBvcnQge1xuICBsb3dlcmNhc2VLZXlzXG59O1xuIiwiZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IHZhbHVlID09PSBudWxsKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgIT09IFwiW29iamVjdCBPYmplY3RdXCIpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gIGlmIChwcm90byA9PT0gbnVsbClcbiAgICByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgQ3RvciA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgXCJjb25zdHJ1Y3RvclwiKSAmJiBwcm90by5jb25zdHJ1Y3RvcjtcbiAgcmV0dXJuIHR5cGVvZiBDdG9yID09PSBcImZ1bmN0aW9uXCIgJiYgQ3RvciBpbnN0YW5jZW9mIEN0b3IgJiYgRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwoQ3RvcikgPT09IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsKHZhbHVlKTtcbn1cbmV4cG9ydCB7XG4gIGlzUGxhaW5PYmplY3Rcbn07XG4iLCJpbXBvcnQgeyBpc1BsYWluT2JqZWN0IH0gZnJvbSBcIi4vaXMtcGxhaW4tb2JqZWN0XCI7XG5mdW5jdGlvbiBtZXJnZURlZXAoZGVmYXVsdHMsIG9wdGlvbnMpIHtcbiAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHMpO1xuICBPYmplY3Qua2V5cyhvcHRpb25zKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChvcHRpb25zW2tleV0pKSB7XG4gICAgICBpZiAoIShrZXkgaW4gZGVmYXVsdHMpKVxuICAgICAgICBPYmplY3QuYXNzaWduKHJlc3VsdCwgeyBba2V5XTogb3B0aW9uc1trZXldIH0pO1xuICAgICAgZWxzZVxuICAgICAgICByZXN1bHRba2V5XSA9IG1lcmdlRGVlcChkZWZhdWx0c1trZXldLCBvcHRpb25zW2tleV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBPYmplY3QuYXNzaWduKHJlc3VsdCwgeyBba2V5XTogb3B0aW9uc1trZXldIH0pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQge1xuICBtZXJnZURlZXBcbn07XG4iLCJmdW5jdGlvbiByZW1vdmVVbmRlZmluZWRQcm9wZXJ0aWVzKG9iaikge1xuICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICBpZiAob2JqW2tleV0gPT09IHZvaWQgMCkge1xuICAgICAgZGVsZXRlIG9ialtrZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqO1xufVxuZXhwb3J0IHtcbiAgcmVtb3ZlVW5kZWZpbmVkUHJvcGVydGllc1xufTtcbiIsImltcG9ydCB7IGxvd2VyY2FzZUtleXMgfSBmcm9tIFwiLi91dGlsL2xvd2VyY2FzZS1rZXlzXCI7XG5pbXBvcnQgeyBtZXJnZURlZXAgfSBmcm9tIFwiLi91dGlsL21lcmdlLWRlZXBcIjtcbmltcG9ydCB7IHJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXMgfSBmcm9tIFwiLi91dGlsL3JlbW92ZS11bmRlZmluZWQtcHJvcGVydGllc1wiO1xuZnVuY3Rpb24gbWVyZ2UoZGVmYXVsdHMsIHJvdXRlLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2Ygcm91dGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICBsZXQgW21ldGhvZCwgdXJsXSA9IHJvdXRlLnNwbGl0KFwiIFwiKTtcbiAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih1cmwgPyB7IG1ldGhvZCwgdXJsIH0gOiB7IHVybDogbWV0aG9kIH0sIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCByb3V0ZSk7XG4gIH1cbiAgb3B0aW9ucy5oZWFkZXJzID0gbG93ZXJjYXNlS2V5cyhvcHRpb25zLmhlYWRlcnMpO1xuICByZW1vdmVVbmRlZmluZWRQcm9wZXJ0aWVzKG9wdGlvbnMpO1xuICByZW1vdmVVbmRlZmluZWRQcm9wZXJ0aWVzKG9wdGlvbnMuaGVhZGVycyk7XG4gIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSBtZXJnZURlZXAoZGVmYXVsdHMgfHwge30sIG9wdGlvbnMpO1xuICBpZiAob3B0aW9ucy51cmwgPT09IFwiL2dyYXBocWxcIikge1xuICAgIGlmIChkZWZhdWx0cyAmJiBkZWZhdWx0cy5tZWRpYVR5cGUucHJldmlld3M/Lmxlbmd0aCkge1xuICAgICAgbWVyZ2VkT3B0aW9ucy5tZWRpYVR5cGUucHJldmlld3MgPSBkZWZhdWx0cy5tZWRpYVR5cGUucHJldmlld3MuZmlsdGVyKFxuICAgICAgICAocHJldmlldykgPT4gIW1lcmdlZE9wdGlvbnMubWVkaWFUeXBlLnByZXZpZXdzLmluY2x1ZGVzKHByZXZpZXcpXG4gICAgICApLmNvbmNhdChtZXJnZWRPcHRpb25zLm1lZGlhVHlwZS5wcmV2aWV3cyk7XG4gICAgfVxuICAgIG1lcmdlZE9wdGlvbnMubWVkaWFUeXBlLnByZXZpZXdzID0gKG1lcmdlZE9wdGlvbnMubWVkaWFUeXBlLnByZXZpZXdzIHx8IFtdKS5tYXAoKHByZXZpZXcpID0+IHByZXZpZXcucmVwbGFjZSgvLXByZXZpZXcvLCBcIlwiKSk7XG4gIH1cbiAgcmV0dXJuIG1lcmdlZE9wdGlvbnM7XG59XG5leHBvcnQge1xuICBtZXJnZVxufTtcbiIsImZ1bmN0aW9uIGFkZFF1ZXJ5UGFyYW1ldGVycyh1cmwsIHBhcmFtZXRlcnMpIHtcbiAgY29uc3Qgc2VwYXJhdG9yID0gL1xcPy8udGVzdCh1cmwpID8gXCImXCIgOiBcIj9cIjtcbiAgY29uc3QgbmFtZXMgPSBPYmplY3Qua2V5cyhwYXJhbWV0ZXJzKTtcbiAgaWYgKG5hbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgcmV0dXJuIHVybCArIHNlcGFyYXRvciArIG5hbWVzLm1hcCgobmFtZSkgPT4ge1xuICAgIGlmIChuYW1lID09PSBcInFcIikge1xuICAgICAgcmV0dXJuIFwicT1cIiArIHBhcmFtZXRlcnMucS5zcGxpdChcIitcIikubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbihcIitcIik7XG4gICAgfVxuICAgIHJldHVybiBgJHtuYW1lfT0ke2VuY29kZVVSSUNvbXBvbmVudChwYXJhbWV0ZXJzW25hbWVdKX1gO1xuICB9KS5qb2luKFwiJlwiKTtcbn1cbmV4cG9ydCB7XG4gIGFkZFF1ZXJ5UGFyYW1ldGVyc1xufTtcbiIsImNvbnN0IHVybFZhcmlhYmxlUmVnZXggPSAvXFx7W157fX1dK1xcfS9nO1xuZnVuY3Rpb24gcmVtb3ZlTm9uQ2hhcnModmFyaWFibGVOYW1lKSB7XG4gIHJldHVybiB2YXJpYWJsZU5hbWUucmVwbGFjZSgvKD86XlxcVyspfCg/Oig/PCFcXFcpXFxXKyQpL2csIFwiXCIpLnNwbGl0KC8sLyk7XG59XG5mdW5jdGlvbiBleHRyYWN0VXJsVmFyaWFibGVOYW1lcyh1cmwpIHtcbiAgY29uc3QgbWF0Y2hlcyA9IHVybC5tYXRjaCh1cmxWYXJpYWJsZVJlZ2V4KTtcbiAgaWYgKCFtYXRjaGVzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBtYXRjaGVzLm1hcChyZW1vdmVOb25DaGFycykucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgW10pO1xufVxuZXhwb3J0IHtcbiAgZXh0cmFjdFVybFZhcmlhYmxlTmFtZXNcbn07XG4iLCJmdW5jdGlvbiBvbWl0KG9iamVjdCwga2V5c1RvT21pdCkge1xuICBjb25zdCByZXN1bHQgPSB7IF9fcHJvdG9fXzogbnVsbCB9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvYmplY3QpKSB7XG4gICAgaWYgKGtleXNUb09taXQuaW5kZXhPZihrZXkpID09PSAtMSkge1xuICAgICAgcmVzdWx0W2tleV0gPSBvYmplY3Rba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCB7XG4gIG9taXRcbn07XG4iLCJmdW5jdGlvbiBlbmNvZGVSZXNlcnZlZChzdHIpIHtcbiAgcmV0dXJuIHN0ci5zcGxpdCgvKCVbMC05QS1GYS1mXXsyfSkvZykubWFwKGZ1bmN0aW9uKHBhcnQpIHtcbiAgICBpZiAoIS8lWzAtOUEtRmEtZl0vLnRlc3QocGFydCkpIHtcbiAgICAgIHBhcnQgPSBlbmNvZGVVUkkocGFydCkucmVwbGFjZSgvJTVCL2csIFwiW1wiKS5yZXBsYWNlKC8lNUQvZywgXCJdXCIpO1xuICAgIH1cbiAgICByZXR1cm4gcGFydDtcbiAgfSkuam9pbihcIlwiKTtcbn1cbmZ1bmN0aW9uIGVuY29kZVVucmVzZXJ2ZWQoc3RyKSB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyKS5yZXBsYWNlKC9bIScoKSpdL2csIGZ1bmN0aW9uKGMpIHtcbiAgICByZXR1cm4gXCIlXCIgKyBjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG4gIH0pO1xufVxuZnVuY3Rpb24gZW5jb2RlVmFsdWUob3BlcmF0b3IsIHZhbHVlLCBrZXkpIHtcbiAgdmFsdWUgPSBvcGVyYXRvciA9PT0gXCIrXCIgfHwgb3BlcmF0b3IgPT09IFwiI1wiID8gZW5jb2RlUmVzZXJ2ZWQodmFsdWUpIDogZW5jb2RlVW5yZXNlcnZlZCh2YWx1ZSk7XG4gIGlmIChrZXkpIHtcbiAgICByZXR1cm4gZW5jb2RlVW5yZXNlcnZlZChrZXkpICsgXCI9XCIgKyB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzRGVmaW5lZCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHZvaWQgMCAmJiB2YWx1ZSAhPT0gbnVsbDtcbn1cbmZ1bmN0aW9uIGlzS2V5T3BlcmF0b3Iob3BlcmF0b3IpIHtcbiAgcmV0dXJuIG9wZXJhdG9yID09PSBcIjtcIiB8fCBvcGVyYXRvciA9PT0gXCImXCIgfHwgb3BlcmF0b3IgPT09IFwiP1wiO1xufVxuZnVuY3Rpb24gZ2V0VmFsdWVzKGNvbnRleHQsIG9wZXJhdG9yLCBrZXksIG1vZGlmaWVyKSB7XG4gIHZhciB2YWx1ZSA9IGNvbnRleHRba2V5XSwgcmVzdWx0ID0gW107XG4gIGlmIChpc0RlZmluZWQodmFsdWUpICYmIHZhbHVlICE9PSBcIlwiKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgaWYgKG1vZGlmaWVyICYmIG1vZGlmaWVyICE9PSBcIipcIikge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCBwYXJzZUludChtb2RpZmllciwgMTApKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICBlbmNvZGVWYWx1ZShvcGVyYXRvciwgdmFsdWUsIGlzS2V5T3BlcmF0b3Iob3BlcmF0b3IpID8ga2V5IDogXCJcIilcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChtb2RpZmllciA9PT0gXCIqXCIpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgdmFsdWUuZmlsdGVyKGlzRGVmaW5lZCkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZTIpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICAgICAgICBlbmNvZGVWYWx1ZShvcGVyYXRvciwgdmFsdWUyLCBpc0tleU9wZXJhdG9yKG9wZXJhdG9yKSA/IGtleSA6IFwiXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5mb3JFYWNoKGZ1bmN0aW9uKGspIHtcbiAgICAgICAgICAgIGlmIChpc0RlZmluZWQodmFsdWVba10pKSB7XG4gICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGVuY29kZVZhbHVlKG9wZXJhdG9yLCB2YWx1ZVtrXSwgaykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0bXAgPSBbXTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgdmFsdWUuZmlsdGVyKGlzRGVmaW5lZCkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZTIpIHtcbiAgICAgICAgICAgIHRtcC5wdXNoKGVuY29kZVZhbHVlKG9wZXJhdG9yLCB2YWx1ZTIpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkuZm9yRWFjaChmdW5jdGlvbihrKSB7XG4gICAgICAgICAgICBpZiAoaXNEZWZpbmVkKHZhbHVlW2tdKSkge1xuICAgICAgICAgICAgICB0bXAucHVzaChlbmNvZGVVbnJlc2VydmVkKGspKTtcbiAgICAgICAgICAgICAgdG1wLnB1c2goZW5jb2RlVmFsdWUob3BlcmF0b3IsIHZhbHVlW2tdLnRvU3RyaW5nKCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNLZXlPcGVyYXRvcihvcGVyYXRvcikpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChlbmNvZGVVbnJlc2VydmVkKGtleSkgKyBcIj1cIiArIHRtcC5qb2luKFwiLFwiKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodG1wLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHRtcC5qb2luKFwiLFwiKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKG9wZXJhdG9yID09PSBcIjtcIikge1xuICAgICAgaWYgKGlzRGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goZW5jb2RlVW5yZXNlcnZlZChrZXkpKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSBcIlwiICYmIChvcGVyYXRvciA9PT0gXCImXCIgfHwgb3BlcmF0b3IgPT09IFwiP1wiKSkge1xuICAgICAgcmVzdWx0LnB1c2goZW5jb2RlVW5yZXNlcnZlZChrZXkpICsgXCI9XCIpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IFwiXCIpIHtcbiAgICAgIHJlc3VsdC5wdXNoKFwiXCIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gcGFyc2VVcmwodGVtcGxhdGUpIHtcbiAgcmV0dXJuIHtcbiAgICBleHBhbmQ6IGV4cGFuZC5iaW5kKG51bGwsIHRlbXBsYXRlKVxuICB9O1xufVxuZnVuY3Rpb24gZXhwYW5kKHRlbXBsYXRlLCBjb250ZXh0KSB7XG4gIHZhciBvcGVyYXRvcnMgPSBbXCIrXCIsIFwiI1wiLCBcIi5cIiwgXCIvXCIsIFwiO1wiLCBcIj9cIiwgXCImXCJdO1xuICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxhY2UoXG4gICAgL1xceyhbXlxce1xcfV0rKVxcfXwoW15cXHtcXH1dKykvZyxcbiAgICBmdW5jdGlvbihfLCBleHByZXNzaW9uLCBsaXRlcmFsKSB7XG4gICAgICBpZiAoZXhwcmVzc2lvbikge1xuICAgICAgICBsZXQgb3BlcmF0b3IgPSBcIlwiO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBbXTtcbiAgICAgICAgaWYgKG9wZXJhdG9ycy5pbmRleE9mKGV4cHJlc3Npb24uY2hhckF0KDApKSAhPT0gLTEpIHtcbiAgICAgICAgICBvcGVyYXRvciA9IGV4cHJlc3Npb24uY2hhckF0KDApO1xuICAgICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLnN1YnN0cigxKTtcbiAgICAgICAgfVxuICAgICAgICBleHByZXNzaW9uLnNwbGl0KC8sL2cpLmZvckVhY2goZnVuY3Rpb24odmFyaWFibGUpIHtcbiAgICAgICAgICB2YXIgdG1wID0gLyhbXjpcXCpdKikoPzo6KFxcZCspfChcXCopKT8vLmV4ZWModmFyaWFibGUpO1xuICAgICAgICAgIHZhbHVlcy5wdXNoKGdldFZhbHVlcyhjb250ZXh0LCBvcGVyYXRvciwgdG1wWzFdLCB0bXBbMl0gfHwgdG1wWzNdKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob3BlcmF0b3IgJiYgb3BlcmF0b3IgIT09IFwiK1wiKSB7XG4gICAgICAgICAgdmFyIHNlcGFyYXRvciA9IFwiLFwiO1xuICAgICAgICAgIGlmIChvcGVyYXRvciA9PT0gXCI/XCIpIHtcbiAgICAgICAgICAgIHNlcGFyYXRvciA9IFwiJlwiO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3BlcmF0b3IgIT09IFwiI1wiKSB7XG4gICAgICAgICAgICBzZXBhcmF0b3IgPSBvcGVyYXRvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuICh2YWx1ZXMubGVuZ3RoICE9PSAwID8gb3BlcmF0b3IgOiBcIlwiKSArIHZhbHVlcy5qb2luKHNlcGFyYXRvcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlcy5qb2luKFwiLFwiKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVJlc2VydmVkKGxpdGVyYWwpO1xuICAgICAgfVxuICAgIH1cbiAgKTtcbiAgaWYgKHRlbXBsYXRlID09PSBcIi9cIikge1xuICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZSgvXFwvJC8sIFwiXCIpO1xuICB9XG59XG5leHBvcnQge1xuICBwYXJzZVVybFxufTtcbiIsImltcG9ydCB7IGFkZFF1ZXJ5UGFyYW1ldGVycyB9IGZyb20gXCIuL3V0aWwvYWRkLXF1ZXJ5LXBhcmFtZXRlcnNcIjtcbmltcG9ydCB7IGV4dHJhY3RVcmxWYXJpYWJsZU5hbWVzIH0gZnJvbSBcIi4vdXRpbC9leHRyYWN0LXVybC12YXJpYWJsZS1uYW1lc1wiO1xuaW1wb3J0IHsgb21pdCB9IGZyb20gXCIuL3V0aWwvb21pdFwiO1xuaW1wb3J0IHsgcGFyc2VVcmwgfSBmcm9tIFwiLi91dGlsL3VybC10ZW1wbGF0ZVwiO1xuZnVuY3Rpb24gcGFyc2Uob3B0aW9ucykge1xuICBsZXQgbWV0aG9kID0gb3B0aW9ucy5tZXRob2QudG9VcHBlckNhc2UoKTtcbiAgbGV0IHVybCA9IChvcHRpb25zLnVybCB8fCBcIi9cIikucmVwbGFjZSgvOihbYS16XVxcdyspL2csIFwieyQxfVwiKTtcbiAgbGV0IGhlYWRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmhlYWRlcnMpO1xuICBsZXQgYm9keTtcbiAgbGV0IHBhcmFtZXRlcnMgPSBvbWl0KG9wdGlvbnMsIFtcbiAgICBcIm1ldGhvZFwiLFxuICAgIFwiYmFzZVVybFwiLFxuICAgIFwidXJsXCIsXG4gICAgXCJoZWFkZXJzXCIsXG4gICAgXCJyZXF1ZXN0XCIsXG4gICAgXCJtZWRpYVR5cGVcIlxuICBdKTtcbiAgY29uc3QgdXJsVmFyaWFibGVOYW1lcyA9IGV4dHJhY3RVcmxWYXJpYWJsZU5hbWVzKHVybCk7XG4gIHVybCA9IHBhcnNlVXJsKHVybCkuZXhwYW5kKHBhcmFtZXRlcnMpO1xuICBpZiAoIS9eaHR0cC8udGVzdCh1cmwpKSB7XG4gICAgdXJsID0gb3B0aW9ucy5iYXNlVXJsICsgdXJsO1xuICB9XG4gIGNvbnN0IG9taXR0ZWRQYXJhbWV0ZXJzID0gT2JqZWN0LmtleXMob3B0aW9ucykuZmlsdGVyKChvcHRpb24pID0+IHVybFZhcmlhYmxlTmFtZXMuaW5jbHVkZXMob3B0aW9uKSkuY29uY2F0KFwiYmFzZVVybFwiKTtcbiAgY29uc3QgcmVtYWluaW5nUGFyYW1ldGVycyA9IG9taXQocGFyYW1ldGVycywgb21pdHRlZFBhcmFtZXRlcnMpO1xuICBjb25zdCBpc0JpbmFyeVJlcXVlc3QgPSAvYXBwbGljYXRpb25cXC9vY3RldC1zdHJlYW0vaS50ZXN0KGhlYWRlcnMuYWNjZXB0KTtcbiAgaWYgKCFpc0JpbmFyeVJlcXVlc3QpIHtcbiAgICBpZiAob3B0aW9ucy5tZWRpYVR5cGUuZm9ybWF0KSB7XG4gICAgICBoZWFkZXJzLmFjY2VwdCA9IGhlYWRlcnMuYWNjZXB0LnNwbGl0KC8sLykubWFwKFxuICAgICAgICAoZm9ybWF0KSA9PiBmb3JtYXQucmVwbGFjZShcbiAgICAgICAgICAvYXBwbGljYXRpb25cXC92bmQoXFwuXFx3KykoXFwudjMpPyhcXC5cXHcrKT8oXFwranNvbik/JC8sXG4gICAgICAgICAgYGFwcGxpY2F0aW9uL3ZuZCQxJDIuJHtvcHRpb25zLm1lZGlhVHlwZS5mb3JtYXR9YFxuICAgICAgICApXG4gICAgICApLmpvaW4oXCIsXCIpO1xuICAgIH1cbiAgICBpZiAodXJsLmVuZHNXaXRoKFwiL2dyYXBocWxcIikpIHtcbiAgICAgIGlmIChvcHRpb25zLm1lZGlhVHlwZS5wcmV2aWV3cz8ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHByZXZpZXdzRnJvbUFjY2VwdEhlYWRlciA9IGhlYWRlcnMuYWNjZXB0Lm1hdGNoKC8oPzwhW1xcdy1dKVtcXHctXSsoPz0tcHJldmlldykvZykgfHwgW107XG4gICAgICAgIGhlYWRlcnMuYWNjZXB0ID0gcHJldmlld3NGcm9tQWNjZXB0SGVhZGVyLmNvbmNhdChvcHRpb25zLm1lZGlhVHlwZS5wcmV2aWV3cykubWFwKChwcmV2aWV3KSA9PiB7XG4gICAgICAgICAgY29uc3QgZm9ybWF0ID0gb3B0aW9ucy5tZWRpYVR5cGUuZm9ybWF0ID8gYC4ke29wdGlvbnMubWVkaWFUeXBlLmZvcm1hdH1gIDogXCIranNvblwiO1xuICAgICAgICAgIHJldHVybiBgYXBwbGljYXRpb24vdm5kLmdpdGh1Yi4ke3ByZXZpZXd9LXByZXZpZXcke2Zvcm1hdH1gO1xuICAgICAgICB9KS5qb2luKFwiLFwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKFtcIkdFVFwiLCBcIkhFQURcIl0uaW5jbHVkZXMobWV0aG9kKSkge1xuICAgIHVybCA9IGFkZFF1ZXJ5UGFyYW1ldGVycyh1cmwsIHJlbWFpbmluZ1BhcmFtZXRlcnMpO1xuICB9IGVsc2Uge1xuICAgIGlmIChcImRhdGFcIiBpbiByZW1haW5pbmdQYXJhbWV0ZXJzKSB7XG4gICAgICBib2R5ID0gcmVtYWluaW5nUGFyYW1ldGVycy5kYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXMocmVtYWluaW5nUGFyYW1ldGVycykubGVuZ3RoKSB7XG4gICAgICAgIGJvZHkgPSByZW1haW5pbmdQYXJhbWV0ZXJzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoIWhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0gJiYgdHlwZW9mIGJvZHkgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBoZWFkZXJzW1wiY29udGVudC10eXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCI7XG4gIH1cbiAgaWYgKFtcIlBBVENIXCIsIFwiUFVUXCJdLmluY2x1ZGVzKG1ldGhvZCkgJiYgdHlwZW9mIGJvZHkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBib2R5ID0gXCJcIjtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmFzc2lnbihcbiAgICB7IG1ldGhvZCwgdXJsLCBoZWFkZXJzIH0sXG4gICAgdHlwZW9mIGJvZHkgIT09IFwidW5kZWZpbmVkXCIgPyB7IGJvZHkgfSA6IG51bGwsXG4gICAgb3B0aW9ucy5yZXF1ZXN0ID8geyByZXF1ZXN0OiBvcHRpb25zLnJlcXVlc3QgfSA6IG51bGxcbiAgKTtcbn1cbmV4cG9ydCB7XG4gIHBhcnNlXG59O1xuIiwiaW1wb3J0IHsgREVGQVVMVFMgfSBmcm9tIFwiLi9kZWZhdWx0c1wiO1xuaW1wb3J0IHsgbWVyZ2UgfSBmcm9tIFwiLi9tZXJnZVwiO1xuaW1wb3J0IHsgcGFyc2UgfSBmcm9tIFwiLi9wYXJzZVwiO1xuZnVuY3Rpb24gZW5kcG9pbnRXaXRoRGVmYXVsdHMoZGVmYXVsdHMsIHJvdXRlLCBvcHRpb25zKSB7XG4gIHJldHVybiBwYXJzZShtZXJnZShkZWZhdWx0cywgcm91dGUsIG9wdGlvbnMpKTtcbn1cbmV4cG9ydCB7XG4gIGVuZHBvaW50V2l0aERlZmF1bHRzXG59O1xuIiwiaW1wb3J0IHsgZW5kcG9pbnRXaXRoRGVmYXVsdHMgfSBmcm9tIFwiLi9lbmRwb2ludC13aXRoLWRlZmF1bHRzXCI7XG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gXCIuL21lcmdlXCI7XG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gXCIuL3BhcnNlXCI7XG5mdW5jdGlvbiB3aXRoRGVmYXVsdHMob2xkRGVmYXVsdHMsIG5ld0RlZmF1bHRzKSB7XG4gIGNvbnN0IERFRkFVTFRTID0gbWVyZ2Uob2xkRGVmYXVsdHMsIG5ld0RlZmF1bHRzKTtcbiAgY29uc3QgZW5kcG9pbnQgPSBlbmRwb2ludFdpdGhEZWZhdWx0cy5iaW5kKG51bGwsIERFRkFVTFRTKTtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oZW5kcG9pbnQsIHtcbiAgICBERUZBVUxUUyxcbiAgICBkZWZhdWx0czogd2l0aERlZmF1bHRzLmJpbmQobnVsbCwgREVGQVVMVFMpLFxuICAgIG1lcmdlOiBtZXJnZS5iaW5kKG51bGwsIERFRkFVTFRTKSxcbiAgICBwYXJzZVxuICB9KTtcbn1cbmV4cG9ydCB7XG4gIHdpdGhEZWZhdWx0c1xufTtcbiIsImltcG9ydCB7IHdpdGhEZWZhdWx0cyB9IGZyb20gXCIuL3dpdGgtZGVmYXVsdHNcIjtcbmltcG9ydCB7IERFRkFVTFRTIH0gZnJvbSBcIi4vZGVmYXVsdHNcIjtcbmNvbnN0IGVuZHBvaW50ID0gd2l0aERlZmF1bHRzKG51bGwsIERFRkFVTFRTKTtcbmV4cG9ydCB7XG4gIGVuZHBvaW50XG59O1xuIiwiY29uc3QgVkVSU0lPTiA9IFwiOC40LjFcIjtcbmV4cG9ydCB7XG4gIFZFUlNJT05cbn07XG4iLCJmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSAhPT0gXCJbb2JqZWN0IE9iamVjdF1cIilcbiAgICByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgaWYgKHByb3RvID09PSBudWxsKVxuICAgIHJldHVybiB0cnVlO1xuICBjb25zdCBDdG9yID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCBcImNvbnN0cnVjdG9yXCIpICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuICByZXR1cm4gdHlwZW9mIEN0b3IgPT09IFwiZnVuY3Rpb25cIiAmJiBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJiBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbChDdG9yKSA9PT0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwodmFsdWUpO1xufVxuZXhwb3J0IHtcbiAgaXNQbGFpbk9iamVjdFxufTtcbiIsImNsYXNzIERlcHJlY2F0aW9uIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7IC8vIE1haW50YWlucyBwcm9wZXIgc3RhY2sgdHJhY2UgKG9ubHkgYXZhaWxhYmxlIG9uIFY4KVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgfVxuXG4gICAgdGhpcy5uYW1lID0gJ0RlcHJlY2F0aW9uJztcbiAgfVxuXG59XG5cbmV4cG9ydCB7IERlcHJlY2F0aW9uIH07XG4iLCIvLyBSZXR1cm5zIGEgd3JhcHBlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSB3cmFwcGVkIGNhbGxiYWNrXG4vLyBUaGUgd3JhcHBlciBmdW5jdGlvbiBzaG91bGQgZG8gc29tZSBzdHVmZiwgYW5kIHJldHVybiBhXG4vLyBwcmVzdW1hYmx5IGRpZmZlcmVudCBjYWxsYmFjayBmdW5jdGlvbi5cbi8vIFRoaXMgbWFrZXMgc3VyZSB0aGF0IG93biBwcm9wZXJ0aWVzIGFyZSByZXRhaW5lZCwgc28gdGhhdFxuLy8gZGVjb3JhdGlvbnMgYW5kIHN1Y2ggYXJlIG5vdCBsb3N0IGFsb25nIHRoZSB3YXkuXG5tb2R1bGUuZXhwb3J0cyA9IHdyYXBweVxuZnVuY3Rpb24gd3JhcHB5IChmbiwgY2IpIHtcbiAgaWYgKGZuICYmIGNiKSByZXR1cm4gd3JhcHB5KGZuKShjYilcblxuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ25lZWQgd3JhcHBlciBmdW5jdGlvbicpXG5cbiAgT2JqZWN0LmtleXMoZm4pLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICB3cmFwcGVyW2tdID0gZm5ba11cbiAgfSlcblxuICByZXR1cm4gd3JhcHBlclxuXG4gIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV1cbiAgICB9XG4gICAgdmFyIHJldCA9IGZuLmFwcGx5KHRoaXMsIGFyZ3MpXG4gICAgdmFyIGNiID0gYXJnc1thcmdzLmxlbmd0aC0xXVxuICAgIGlmICh0eXBlb2YgcmV0ID09PSAnZnVuY3Rpb24nICYmIHJldCAhPT0gY2IpIHtcbiAgICAgIE9iamVjdC5rZXlzKGNiKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgIHJldFtrXSA9IGNiW2tdXG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gcmV0XG4gIH1cbn1cbiIsInZhciB3cmFwcHkgPSByZXF1aXJlKCd3cmFwcHknKVxubW9kdWxlLmV4cG9ydHMgPSB3cmFwcHkob25jZSlcbm1vZHVsZS5leHBvcnRzLnN0cmljdCA9IHdyYXBweShvbmNlU3RyaWN0KVxuXG5vbmNlLnByb3RvID0gb25jZShmdW5jdGlvbiAoKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGdW5jdGlvbi5wcm90b3R5cGUsICdvbmNlJywge1xuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gb25jZSh0aGlzKVxuICAgIH0sXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZ1bmN0aW9uLnByb3RvdHlwZSwgJ29uY2VTdHJpY3QnLCB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBvbmNlU3RyaWN0KHRoaXMpXG4gICAgfSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSlcbn0pXG5cbmZ1bmN0aW9uIG9uY2UgKGZuKSB7XG4gIHZhciBmID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChmLmNhbGxlZCkgcmV0dXJuIGYudmFsdWVcbiAgICBmLmNhbGxlZCA9IHRydWVcbiAgICByZXR1cm4gZi52YWx1ZSA9IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgfVxuICBmLmNhbGxlZCA9IGZhbHNlXG4gIHJldHVybiBmXG59XG5cbmZ1bmN0aW9uIG9uY2VTdHJpY3QgKGZuKSB7XG4gIHZhciBmID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChmLmNhbGxlZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihmLm9uY2VFcnJvcilcbiAgICBmLmNhbGxlZCA9IHRydWVcbiAgICByZXR1cm4gZi52YWx1ZSA9IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgfVxuICB2YXIgbmFtZSA9IGZuLm5hbWUgfHwgJ0Z1bmN0aW9uIHdyYXBwZWQgd2l0aCBgb25jZWAnXG4gIGYub25jZUVycm9yID0gbmFtZSArIFwiIHNob3VsZG4ndCBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2VcIlxuICBmLmNhbGxlZCA9IGZhbHNlXG4gIHJldHVybiBmXG59XG4iLCJpbXBvcnQgeyBEZXByZWNhdGlvbiB9IGZyb20gXCJkZXByZWNhdGlvblwiO1xuaW1wb3J0IG9uY2UgZnJvbSBcIm9uY2VcIjtcbmNvbnN0IGxvZ09uY2VDb2RlID0gb25jZSgoZGVwcmVjYXRpb24pID0+IGNvbnNvbGUud2FybihkZXByZWNhdGlvbikpO1xuY29uc3QgbG9nT25jZUhlYWRlcnMgPSBvbmNlKChkZXByZWNhdGlvbikgPT4gY29uc29sZS53YXJuKGRlcHJlY2F0aW9uKSk7XG5jbGFzcyBSZXF1ZXN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHN0YXR1c0NvZGUsIG9wdGlvbnMpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICAgIH1cbiAgICB0aGlzLm5hbWUgPSBcIkh0dHBFcnJvclwiO1xuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzQ29kZTtcbiAgICBsZXQgaGVhZGVycztcbiAgICBpZiAoXCJoZWFkZXJzXCIgaW4gb3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5oZWFkZXJzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBoZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzO1xuICAgIH1cbiAgICBpZiAoXCJyZXNwb25zZVwiIGluIG9wdGlvbnMpIHtcbiAgICAgIHRoaXMucmVzcG9uc2UgPSBvcHRpb25zLnJlc3BvbnNlO1xuICAgICAgaGVhZGVycyA9IG9wdGlvbnMucmVzcG9uc2UuaGVhZGVycztcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdENvcHkgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLnJlcXVlc3QpO1xuICAgIGlmIChvcHRpb25zLnJlcXVlc3QuaGVhZGVycy5hdXRob3JpemF0aW9uKSB7XG4gICAgICByZXF1ZXN0Q29weS5oZWFkZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMsIHtcbiAgICAgICAgYXV0aG9yaXphdGlvbjogb3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMuYXV0aG9yaXphdGlvbi5yZXBsYWNlKFxuICAgICAgICAgIC8oPzwhICkgLiokLyxcbiAgICAgICAgICBcIiBbUkVEQUNURURdXCJcbiAgICAgICAgKVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJlcXVlc3RDb3B5LnVybCA9IHJlcXVlc3RDb3B5LnVybC5yZXBsYWNlKC9cXGJjbGllbnRfc2VjcmV0PVxcdysvZywgXCJjbGllbnRfc2VjcmV0PVtSRURBQ1RFRF1cIikucmVwbGFjZSgvXFxiYWNjZXNzX3Rva2VuPVxcdysvZywgXCJhY2Nlc3NfdG9rZW49W1JFREFDVEVEXVwiKTtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0Q29weTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJjb2RlXCIsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgbG9nT25jZUNvZGUoXG4gICAgICAgICAgbmV3IERlcHJlY2F0aW9uKFxuICAgICAgICAgICAgXCJbQG9jdG9raXQvcmVxdWVzdC1lcnJvcl0gYGVycm9yLmNvZGVgIGlzIGRlcHJlY2F0ZWQsIHVzZSBgZXJyb3Iuc3RhdHVzYC5cIlxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHN0YXR1c0NvZGU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiaGVhZGVyc1wiLCB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIGxvZ09uY2VIZWFkZXJzKFxuICAgICAgICAgIG5ldyBEZXByZWNhdGlvbihcbiAgICAgICAgICAgIFwiW0BvY3Rva2l0L3JlcXVlc3QtZXJyb3JdIGBlcnJvci5oZWFkZXJzYCBpcyBkZXByZWNhdGVkLCB1c2UgYGVycm9yLnJlc3BvbnNlLmhlYWRlcnNgLlwiXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gaGVhZGVycyB8fCB7fTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgUmVxdWVzdEVycm9yXG59O1xuIiwiZnVuY3Rpb24gZ2V0QnVmZmVyUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgcmV0dXJuIHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7XG59XG5leHBvcnQge1xuICBnZXRCdWZmZXJSZXNwb25zZSBhcyBkZWZhdWx0XG59O1xuIiwiaW1wb3J0IHsgaXNQbGFpbk9iamVjdCB9IGZyb20gXCIuL2lzLXBsYWluLW9iamVjdC5qc1wiO1xuaW1wb3J0IHsgUmVxdWVzdEVycm9yIH0gZnJvbSBcIkBvY3Rva2l0L3JlcXVlc3QtZXJyb3JcIjtcbmltcG9ydCBnZXRCdWZmZXIgZnJvbSBcIi4vZ2V0LWJ1ZmZlci1yZXNwb25zZS5qc1wiO1xuZnVuY3Rpb24gZmV0Y2hXcmFwcGVyKHJlcXVlc3RPcHRpb25zKSB7XG4gIGNvbnN0IGxvZyA9IHJlcXVlc3RPcHRpb25zLnJlcXVlc3QgJiYgcmVxdWVzdE9wdGlvbnMucmVxdWVzdC5sb2cgPyByZXF1ZXN0T3B0aW9ucy5yZXF1ZXN0LmxvZyA6IGNvbnNvbGU7XG4gIGNvbnN0IHBhcnNlU3VjY2Vzc1Jlc3BvbnNlQm9keSA9IHJlcXVlc3RPcHRpb25zLnJlcXVlc3Q/LnBhcnNlU3VjY2Vzc1Jlc3BvbnNlQm9keSAhPT0gZmFsc2U7XG4gIGlmIChpc1BsYWluT2JqZWN0KHJlcXVlc3RPcHRpb25zLmJvZHkpIHx8IEFycmF5LmlzQXJyYXkocmVxdWVzdE9wdGlvbnMuYm9keSkpIHtcbiAgICByZXF1ZXN0T3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocmVxdWVzdE9wdGlvbnMuYm9keSk7XG4gIH1cbiAgbGV0IGhlYWRlcnMgPSB7fTtcbiAgbGV0IHN0YXR1cztcbiAgbGV0IHVybDtcbiAgbGV0IHsgZmV0Y2ggfSA9IGdsb2JhbFRoaXM7XG4gIGlmIChyZXF1ZXN0T3B0aW9ucy5yZXF1ZXN0Py5mZXRjaCkge1xuICAgIGZldGNoID0gcmVxdWVzdE9wdGlvbnMucmVxdWVzdC5mZXRjaDtcbiAgfVxuICBpZiAoIWZldGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJmZXRjaCBpcyBub3Qgc2V0LiBQbGVhc2UgcGFzcyBhIGZldGNoIGltcGxlbWVudGF0aW9uIGFzIG5ldyBPY3Rva2l0KHsgcmVxdWVzdDogeyBmZXRjaCB9fSkuIExlYXJuIG1vcmUgYXQgaHR0cHM6Ly9naXRodWIuY29tL29jdG9raXQvb2N0b2tpdC5qcy8jZmV0Y2gtbWlzc2luZ1wiXG4gICAgKTtcbiAgfVxuICByZXR1cm4gZmV0Y2gocmVxdWVzdE9wdGlvbnMudXJsLCB7XG4gICAgbWV0aG9kOiByZXF1ZXN0T3B0aW9ucy5tZXRob2QsXG4gICAgYm9keTogcmVxdWVzdE9wdGlvbnMuYm9keSxcbiAgICByZWRpcmVjdDogcmVxdWVzdE9wdGlvbnMucmVxdWVzdD8ucmVkaXJlY3QsXG4gICAgaGVhZGVyczogcmVxdWVzdE9wdGlvbnMuaGVhZGVycyxcbiAgICBzaWduYWw6IHJlcXVlc3RPcHRpb25zLnJlcXVlc3Q/LnNpZ25hbCxcbiAgICAvLyBkdXBsZXggbXVzdCBiZSBzZXQgaWYgcmVxdWVzdC5ib2R5IGlzIFJlYWRhYmxlU3RyZWFtIG9yIEFzeW5jIEl0ZXJhYmxlcy5cbiAgICAvLyBTZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1yZXF1ZXN0aW5pdC1kdXBsZXguXG4gICAgLi4ucmVxdWVzdE9wdGlvbnMuYm9keSAmJiB7IGR1cGxleDogXCJoYWxmXCIgfVxuICB9KS50aGVuKGFzeW5jIChyZXNwb25zZSkgPT4ge1xuICAgIHVybCA9IHJlc3BvbnNlLnVybDtcbiAgICBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgZm9yIChjb25zdCBrZXlBbmRWYWx1ZSBvZiByZXNwb25zZS5oZWFkZXJzKSB7XG4gICAgICBoZWFkZXJzW2tleUFuZFZhbHVlWzBdXSA9IGtleUFuZFZhbHVlWzFdO1xuICAgIH1cbiAgICBpZiAoXCJkZXByZWNhdGlvblwiIGluIGhlYWRlcnMpIHtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBoZWFkZXJzLmxpbmsgJiYgaGVhZGVycy5saW5rLm1hdGNoKC88KFtePD5dKyk+OyByZWw9XCJkZXByZWNhdGlvblwiLyk7XG4gICAgICBjb25zdCBkZXByZWNhdGlvbkxpbmsgPSBtYXRjaGVzICYmIG1hdGNoZXMucG9wKCk7XG4gICAgICBsb2cud2FybihcbiAgICAgICAgYFtAb2N0b2tpdC9yZXF1ZXN0XSBcIiR7cmVxdWVzdE9wdGlvbnMubWV0aG9kfSAke3JlcXVlc3RPcHRpb25zLnVybH1cIiBpcyBkZXByZWNhdGVkLiBJdCBpcyBzY2hlZHVsZWQgdG8gYmUgcmVtb3ZlZCBvbiAke2hlYWRlcnMuc3Vuc2V0fSR7ZGVwcmVjYXRpb25MaW5rID8gYC4gU2VlICR7ZGVwcmVjYXRpb25MaW5rfWAgOiBcIlwifWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChzdGF0dXMgPT09IDIwNCB8fCBzdGF0dXMgPT09IDIwNSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocmVxdWVzdE9wdGlvbnMubWV0aG9kID09PSBcIkhFQURcIikge1xuICAgICAgaWYgKHN0YXR1cyA8IDQwMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgUmVxdWVzdEVycm9yKHJlc3BvbnNlLnN0YXR1c1RleHQsIHN0YXR1cywge1xuICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgIHVybCxcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICBkYXRhOiB2b2lkIDBcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWVzdDogcmVxdWVzdE9wdGlvbnNcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzID09PSAzMDQpIHtcbiAgICAgIHRocm93IG5ldyBSZXF1ZXN0RXJyb3IoXCJOb3QgbW9kaWZpZWRcIiwgc3RhdHVzLCB7XG4gICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgIGRhdGE6IGF3YWl0IGdldFJlc3BvbnNlRGF0YShyZXNwb25zZSlcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWVzdDogcmVxdWVzdE9wdGlvbnNcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzID49IDQwMCkge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGdldFJlc3BvbnNlRGF0YShyZXNwb25zZSk7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBSZXF1ZXN0RXJyb3IodG9FcnJvck1lc3NhZ2UoZGF0YSksIHN0YXR1cywge1xuICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgIHVybCxcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICBkYXRhXG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RPcHRpb25zXG4gICAgICB9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VTdWNjZXNzUmVzcG9uc2VCb2R5ID8gYXdhaXQgZ2V0UmVzcG9uc2VEYXRhKHJlc3BvbnNlKSA6IHJlc3BvbnNlLmJvZHk7XG4gIH0pLnRoZW4oKGRhdGEpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzLFxuICAgICAgdXJsLFxuICAgICAgaGVhZGVycyxcbiAgICAgIGRhdGFcbiAgICB9O1xuICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBSZXF1ZXN0RXJyb3IpXG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICBlbHNlIGlmIChlcnJvci5uYW1lID09PSBcIkFib3J0RXJyb3JcIilcbiAgICAgIHRocm93IGVycm9yO1xuICAgIGxldCBtZXNzYWdlID0gZXJyb3IubWVzc2FnZTtcbiAgICBpZiAoZXJyb3IubmFtZSA9PT0gXCJUeXBlRXJyb3JcIiAmJiBcImNhdXNlXCIgaW4gZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvci5jYXVzZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBlcnJvci5jYXVzZS5tZXNzYWdlO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXJyb3IuY2F1c2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgbWVzc2FnZSA9IGVycm9yLmNhdXNlO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgUmVxdWVzdEVycm9yKG1lc3NhZ2UsIDUwMCwge1xuICAgICAgcmVxdWVzdDogcmVxdWVzdE9wdGlvbnNcbiAgICB9KTtcbiAgfSk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRSZXNwb25zZURhdGEocmVzcG9uc2UpIHtcbiAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKTtcbiAgaWYgKC9hcHBsaWNhdGlvblxcL2pzb24vLnRlc3QoY29udGVudFR5cGUpKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiByZXNwb25zZS50ZXh0KCkpLmNhdGNoKCgpID0+IFwiXCIpO1xuICB9XG4gIGlmICghY29udGVudFR5cGUgfHwgL150ZXh0XFwvfGNoYXJzZXQ9dXRmLTgkLy50ZXN0KGNvbnRlbnRUeXBlKSkge1xuICAgIHJldHVybiByZXNwb25zZS50ZXh0KCk7XG4gIH1cbiAgcmV0dXJuIGdldEJ1ZmZlcihyZXNwb25zZSk7XG59XG5mdW5jdGlvbiB0b0Vycm9yTWVzc2FnZShkYXRhKSB7XG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIilcbiAgICByZXR1cm4gZGF0YTtcbiAgbGV0IHN1ZmZpeDtcbiAgaWYgKFwiZG9jdW1lbnRhdGlvbl91cmxcIiBpbiBkYXRhKSB7XG4gICAgc3VmZml4ID0gYCAtICR7ZGF0YS5kb2N1bWVudGF0aW9uX3VybH1gO1xuICB9IGVsc2Uge1xuICAgIHN1ZmZpeCA9IFwiXCI7XG4gIH1cbiAgaWYgKFwibWVzc2FnZVwiIGluIGRhdGEpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhLmVycm9ycykpIHtcbiAgICAgIHJldHVybiBgJHtkYXRhLm1lc3NhZ2V9OiAke2RhdGEuZXJyb3JzLm1hcChKU09OLnN0cmluZ2lmeSkuam9pbihcIiwgXCIpfSR7c3VmZml4fWA7XG4gICAgfVxuICAgIHJldHVybiBgJHtkYXRhLm1lc3NhZ2V9JHtzdWZmaXh9YDtcbiAgfVxuICByZXR1cm4gYFVua25vd24gZXJyb3I6ICR7SlNPTi5zdHJpbmdpZnkoZGF0YSl9YDtcbn1cbmV4cG9ydCB7XG4gIGZldGNoV3JhcHBlciBhcyBkZWZhdWx0XG59O1xuIiwiaW1wb3J0IGZldGNoV3JhcHBlciBmcm9tIFwiLi9mZXRjaC13cmFwcGVyLmpzXCI7XG5mdW5jdGlvbiB3aXRoRGVmYXVsdHMob2xkRW5kcG9pbnQsIG5ld0RlZmF1bHRzKSB7XG4gIGNvbnN0IGVuZHBvaW50ID0gb2xkRW5kcG9pbnQuZGVmYXVsdHMobmV3RGVmYXVsdHMpO1xuICBjb25zdCBuZXdBcGkgPSBmdW5jdGlvbihyb3V0ZSwgcGFyYW1ldGVycykge1xuICAgIGNvbnN0IGVuZHBvaW50T3B0aW9ucyA9IGVuZHBvaW50Lm1lcmdlKHJvdXRlLCBwYXJhbWV0ZXJzKTtcbiAgICBpZiAoIWVuZHBvaW50T3B0aW9ucy5yZXF1ZXN0IHx8ICFlbmRwb2ludE9wdGlvbnMucmVxdWVzdC5ob29rKSB7XG4gICAgICByZXR1cm4gZmV0Y2hXcmFwcGVyKGVuZHBvaW50LnBhcnNlKGVuZHBvaW50T3B0aW9ucykpO1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0ID0gKHJvdXRlMiwgcGFyYW1ldGVyczIpID0+IHtcbiAgICAgIHJldHVybiBmZXRjaFdyYXBwZXIoXG4gICAgICAgIGVuZHBvaW50LnBhcnNlKGVuZHBvaW50Lm1lcmdlKHJvdXRlMiwgcGFyYW1ldGVyczIpKVxuICAgICAgKTtcbiAgICB9O1xuICAgIE9iamVjdC5hc3NpZ24ocmVxdWVzdCwge1xuICAgICAgZW5kcG9pbnQsXG4gICAgICBkZWZhdWx0czogd2l0aERlZmF1bHRzLmJpbmQobnVsbCwgZW5kcG9pbnQpXG4gICAgfSk7XG4gICAgcmV0dXJuIGVuZHBvaW50T3B0aW9ucy5yZXF1ZXN0Lmhvb2socmVxdWVzdCwgZW5kcG9pbnRPcHRpb25zKTtcbiAgfTtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3QXBpLCB7XG4gICAgZW5kcG9pbnQsXG4gICAgZGVmYXVsdHM6IHdpdGhEZWZhdWx0cy5iaW5kKG51bGwsIGVuZHBvaW50KVxuICB9KTtcbn1cbmV4cG9ydCB7XG4gIHdpdGhEZWZhdWx0cyBhcyBkZWZhdWx0XG59O1xuIiwiaW1wb3J0IHsgZW5kcG9pbnQgfSBmcm9tIFwiQG9jdG9raXQvZW5kcG9pbnRcIjtcbmltcG9ydCB7IGdldFVzZXJBZ2VudCB9IGZyb20gXCJ1bml2ZXJzYWwtdXNlci1hZ2VudFwiO1xuaW1wb3J0IHsgVkVSU0lPTiB9IGZyb20gXCIuL3ZlcnNpb24uanNcIjtcbmltcG9ydCB3aXRoRGVmYXVsdHMgZnJvbSBcIi4vd2l0aC1kZWZhdWx0cy5qc1wiO1xuY29uc3QgcmVxdWVzdCA9IHdpdGhEZWZhdWx0cyhlbmRwb2ludCwge1xuICBoZWFkZXJzOiB7XG4gICAgXCJ1c2VyLWFnZW50XCI6IGBvY3Rva2l0LXJlcXVlc3QuanMvJHtWRVJTSU9OfSAke2dldFVzZXJBZ2VudCgpfWBcbiAgfVxufSk7XG5leHBvcnQge1xuICByZXF1ZXN0XG59O1xuIiwiLy8gcGtnL2Rpc3Qtc3JjL2luZGV4LmpzXG5pbXBvcnQgeyByZXF1ZXN0IH0gZnJvbSBcIkBvY3Rva2l0L3JlcXVlc3RcIjtcbmltcG9ydCB7IGdldFVzZXJBZ2VudCB9IGZyb20gXCJ1bml2ZXJzYWwtdXNlci1hZ2VudFwiO1xuXG4vLyBwa2cvZGlzdC1zcmMvdmVyc2lvbi5qc1xudmFyIFZFUlNJT04gPSBcIjcuMS4xXCI7XG5cbi8vIHBrZy9kaXN0LXNyYy93aXRoLWRlZmF1bHRzLmpzXG5pbXBvcnQgeyByZXF1ZXN0IGFzIFJlcXVlc3QyIH0gZnJvbSBcIkBvY3Rva2l0L3JlcXVlc3RcIjtcblxuLy8gcGtnL2Rpc3Qtc3JjL2dyYXBocWwuanNcbmltcG9ydCB7IHJlcXVlc3QgYXMgUmVxdWVzdCB9IGZyb20gXCJAb2N0b2tpdC9yZXF1ZXN0XCI7XG5cbi8vIHBrZy9kaXN0LXNyYy9lcnJvci5qc1xuZnVuY3Rpb24gX2J1aWxkTWVzc2FnZUZvclJlc3BvbnNlRXJyb3JzKGRhdGEpIHtcbiAgcmV0dXJuIGBSZXF1ZXN0IGZhaWxlZCBkdWUgdG8gZm9sbG93aW5nIHJlc3BvbnNlIGVycm9yczpcbmAgKyBkYXRhLmVycm9ycy5tYXAoKGUpID0+IGAgLSAke2UubWVzc2FnZX1gKS5qb2luKFwiXFxuXCIpO1xufVxudmFyIEdyYXBocWxSZXNwb25zZUVycm9yID0gY2xhc3MgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHJlcXVlc3QyLCBoZWFkZXJzLCByZXNwb25zZSkge1xuICAgIHN1cGVyKF9idWlsZE1lc3NhZ2VGb3JSZXNwb25zZUVycm9ycyhyZXNwb25zZSkpO1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3QyO1xuICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgIHRoaXMubmFtZSA9IFwiR3JhcGhxbFJlc3BvbnNlRXJyb3JcIjtcbiAgICB0aGlzLmVycm9ycyA9IHJlc3BvbnNlLmVycm9ycztcbiAgICB0aGlzLmRhdGEgPSByZXNwb25zZS5kYXRhO1xuICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgfVxuICB9XG59O1xuXG4vLyBwa2cvZGlzdC1zcmMvZ3JhcGhxbC5qc1xudmFyIE5PTl9WQVJJQUJMRV9PUFRJT05TID0gW1xuICBcIm1ldGhvZFwiLFxuICBcImJhc2VVcmxcIixcbiAgXCJ1cmxcIixcbiAgXCJoZWFkZXJzXCIsXG4gIFwicmVxdWVzdFwiLFxuICBcInF1ZXJ5XCIsXG4gIFwibWVkaWFUeXBlXCJcbl07XG52YXIgRk9SQklEREVOX1ZBUklBQkxFX09QVElPTlMgPSBbXCJxdWVyeVwiLCBcIm1ldGhvZFwiLCBcInVybFwiXTtcbnZhciBHSEVTX1YzX1NVRkZJWF9SRUdFWCA9IC9cXC9hcGlcXC92M1xcLz8kLztcbmZ1bmN0aW9uIGdyYXBocWwocmVxdWVzdDIsIHF1ZXJ5LCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBxdWVyeSA9PT0gXCJzdHJpbmdcIiAmJiBcInF1ZXJ5XCIgaW4gb3B0aW9ucykge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgRXJyb3IoYFtAb2N0b2tpdC9ncmFwaHFsXSBcInF1ZXJ5XCIgY2Fubm90IGJlIHVzZWQgYXMgdmFyaWFibGUgbmFtZWApXG4gICAgICApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvcHRpb25zKSB7XG4gICAgICBpZiAoIUZPUkJJRERFTl9WQVJJQUJMRV9PUFRJT05TLmluY2x1ZGVzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgYFtAb2N0b2tpdC9ncmFwaHFsXSBcIiR7a2V5fVwiIGNhbm5vdCBiZSB1c2VkIGFzIHZhcmlhYmxlIG5hbWVgXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHBhcnNlZE9wdGlvbnMgPSB0eXBlb2YgcXVlcnkgPT09IFwic3RyaW5nXCIgPyBPYmplY3QuYXNzaWduKHsgcXVlcnkgfSwgb3B0aW9ucykgOiBxdWVyeTtcbiAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSBPYmplY3Qua2V5cyhcbiAgICBwYXJzZWRPcHRpb25zXG4gICkucmVkdWNlKChyZXN1bHQsIGtleSkgPT4ge1xuICAgIGlmIChOT05fVkFSSUFCTEVfT1BUSU9OUy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IHBhcnNlZE9wdGlvbnNba2V5XTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGlmICghcmVzdWx0LnZhcmlhYmxlcykge1xuICAgICAgcmVzdWx0LnZhcmlhYmxlcyA9IHt9O1xuICAgIH1cbiAgICByZXN1bHQudmFyaWFibGVzW2tleV0gPSBwYXJzZWRPcHRpb25zW2tleV07XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSwge30pO1xuICBjb25zdCBiYXNlVXJsID0gcGFyc2VkT3B0aW9ucy5iYXNlVXJsIHx8IHJlcXVlc3QyLmVuZHBvaW50LkRFRkFVTFRTLmJhc2VVcmw7XG4gIGlmIChHSEVTX1YzX1NVRkZJWF9SRUdFWC50ZXN0KGJhc2VVcmwpKSB7XG4gICAgcmVxdWVzdE9wdGlvbnMudXJsID0gYmFzZVVybC5yZXBsYWNlKEdIRVNfVjNfU1VGRklYX1JFR0VYLCBcIi9hcGkvZ3JhcGhxbFwiKTtcbiAgfVxuICByZXR1cm4gcmVxdWVzdDIocmVxdWVzdE9wdGlvbnMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKHJlc3BvbnNlLmRhdGEuZXJyb3JzKSB7XG4gICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyZXNwb25zZS5oZWFkZXJzKSkge1xuICAgICAgICBoZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzW2tleV07XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgR3JhcGhxbFJlc3BvbnNlRXJyb3IoXG4gICAgICAgIHJlcXVlc3RPcHRpb25zLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICByZXNwb25zZS5kYXRhXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YS5kYXRhO1xuICB9KTtcbn1cblxuLy8gcGtnL2Rpc3Qtc3JjL3dpdGgtZGVmYXVsdHMuanNcbmZ1bmN0aW9uIHdpdGhEZWZhdWx0cyhyZXF1ZXN0MiwgbmV3RGVmYXVsdHMpIHtcbiAgY29uc3QgbmV3UmVxdWVzdCA9IHJlcXVlc3QyLmRlZmF1bHRzKG5ld0RlZmF1bHRzKTtcbiAgY29uc3QgbmV3QXBpID0gKHF1ZXJ5LCBvcHRpb25zKSA9PiB7XG4gICAgcmV0dXJuIGdyYXBocWwobmV3UmVxdWVzdCwgcXVlcnksIG9wdGlvbnMpO1xuICB9O1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXdBcGksIHtcbiAgICBkZWZhdWx0czogd2l0aERlZmF1bHRzLmJpbmQobnVsbCwgbmV3UmVxdWVzdCksXG4gICAgZW5kcG9pbnQ6IG5ld1JlcXVlc3QuZW5kcG9pbnRcbiAgfSk7XG59XG5cbi8vIHBrZy9kaXN0LXNyYy9pbmRleC5qc1xudmFyIGdyYXBocWwyID0gd2l0aERlZmF1bHRzKHJlcXVlc3QsIHtcbiAgaGVhZGVyczoge1xuICAgIFwidXNlci1hZ2VudFwiOiBgb2N0b2tpdC1ncmFwaHFsLmpzLyR7VkVSU0lPTn0gJHtnZXRVc2VyQWdlbnQoKX1gXG4gIH0sXG4gIG1ldGhvZDogXCJQT1NUXCIsXG4gIHVybDogXCIvZ3JhcGhxbFwiXG59KTtcbmZ1bmN0aW9uIHdpdGhDdXN0b21SZXF1ZXN0KGN1c3RvbVJlcXVlc3QpIHtcbiAgcmV0dXJuIHdpdGhEZWZhdWx0cyhjdXN0b21SZXF1ZXN0LCB7XG4gICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICB1cmw6IFwiL2dyYXBocWxcIlxuICB9KTtcbn1cbmV4cG9ydCB7XG4gIEdyYXBocWxSZXNwb25zZUVycm9yLFxuICBncmFwaHFsMiBhcyBncmFwaHFsLFxuICB3aXRoQ3VzdG9tUmVxdWVzdFxufTtcbiIsImNvbnN0IFJFR0VYX0lTX0lOU1RBTExBVElPTl9MRUdBQ1kgPSAvXnYxXFwuLztcbmNvbnN0IFJFR0VYX0lTX0lOU1RBTExBVElPTiA9IC9eZ2hzXy87XG5jb25zdCBSRUdFWF9JU19VU0VSX1RPX1NFUlZFUiA9IC9eZ2h1Xy87XG5hc3luYyBmdW5jdGlvbiBhdXRoKHRva2VuKSB7XG4gIGNvbnN0IGlzQXBwID0gdG9rZW4uc3BsaXQoL1xcLi8pLmxlbmd0aCA9PT0gMztcbiAgY29uc3QgaXNJbnN0YWxsYXRpb24gPSBSRUdFWF9JU19JTlNUQUxMQVRJT05fTEVHQUNZLnRlc3QodG9rZW4pIHx8IFJFR0VYX0lTX0lOU1RBTExBVElPTi50ZXN0KHRva2VuKTtcbiAgY29uc3QgaXNVc2VyVG9TZXJ2ZXIgPSBSRUdFWF9JU19VU0VSX1RPX1NFUlZFUi50ZXN0KHRva2VuKTtcbiAgY29uc3QgdG9rZW5UeXBlID0gaXNBcHAgPyBcImFwcFwiIDogaXNJbnN0YWxsYXRpb24gPyBcImluc3RhbGxhdGlvblwiIDogaXNVc2VyVG9TZXJ2ZXIgPyBcInVzZXItdG8tc2VydmVyXCIgOiBcIm9hdXRoXCI7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJ0b2tlblwiLFxuICAgIHRva2VuLFxuICAgIHRva2VuVHlwZVxuICB9O1xufVxuZXhwb3J0IHtcbiAgYXV0aFxufTtcbiIsImZ1bmN0aW9uIHdpdGhBdXRob3JpemF0aW9uUHJlZml4KHRva2VuKSB7XG4gIGlmICh0b2tlbi5zcGxpdCgvXFwuLykubGVuZ3RoID09PSAzKSB7XG4gICAgcmV0dXJuIGBiZWFyZXIgJHt0b2tlbn1gO1xuICB9XG4gIHJldHVybiBgdG9rZW4gJHt0b2tlbn1gO1xufVxuZXhwb3J0IHtcbiAgd2l0aEF1dGhvcml6YXRpb25QcmVmaXhcbn07XG4iLCJpbXBvcnQgeyB3aXRoQXV0aG9yaXphdGlvblByZWZpeCB9IGZyb20gXCIuL3dpdGgtYXV0aG9yaXphdGlvbi1wcmVmaXhcIjtcbmFzeW5jIGZ1bmN0aW9uIGhvb2sodG9rZW4sIHJlcXVlc3QsIHJvdXRlLCBwYXJhbWV0ZXJzKSB7XG4gIGNvbnN0IGVuZHBvaW50ID0gcmVxdWVzdC5lbmRwb2ludC5tZXJnZShcbiAgICByb3V0ZSxcbiAgICBwYXJhbWV0ZXJzXG4gICk7XG4gIGVuZHBvaW50LmhlYWRlcnMuYXV0aG9yaXphdGlvbiA9IHdpdGhBdXRob3JpemF0aW9uUHJlZml4KHRva2VuKTtcbiAgcmV0dXJuIHJlcXVlc3QoZW5kcG9pbnQpO1xufVxuZXhwb3J0IHtcbiAgaG9va1xufTtcbiIsImltcG9ydCB7IGF1dGggfSBmcm9tIFwiLi9hdXRoXCI7XG5pbXBvcnQgeyBob29rIH0gZnJvbSBcIi4vaG9va1wiO1xuY29uc3QgY3JlYXRlVG9rZW5BdXRoID0gZnVuY3Rpb24gY3JlYXRlVG9rZW5BdXRoMih0b2tlbikge1xuICBpZiAoIXRva2VuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiW0BvY3Rva2l0L2F1dGgtdG9rZW5dIE5vIHRva2VuIHBhc3NlZCB0byBjcmVhdGVUb2tlbkF1dGhcIik7XG4gIH1cbiAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gXCJzdHJpbmdcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiW0BvY3Rva2l0L2F1dGgtdG9rZW5dIFRva2VuIHBhc3NlZCB0byBjcmVhdGVUb2tlbkF1dGggaXMgbm90IGEgc3RyaW5nXCJcbiAgICApO1xuICB9XG4gIHRva2VuID0gdG9rZW4ucmVwbGFjZSgvXih0b2tlbnxiZWFyZXIpICsvaSwgXCJcIik7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKGF1dGguYmluZChudWxsLCB0b2tlbiksIHtcbiAgICBob29rOiBob29rLmJpbmQobnVsbCwgdG9rZW4pXG4gIH0pO1xufTtcbmV4cG9ydCB7XG4gIGNyZWF0ZVRva2VuQXV0aFxufTtcbiIsIi8vIHBrZy9kaXN0LXNyYy9pbmRleC5qc1xuaW1wb3J0IHsgZ2V0VXNlckFnZW50IH0gZnJvbSBcInVuaXZlcnNhbC11c2VyLWFnZW50XCI7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSBcImJlZm9yZS1hZnRlci1ob29rXCI7XG5pbXBvcnQgeyByZXF1ZXN0IH0gZnJvbSBcIkBvY3Rva2l0L3JlcXVlc3RcIjtcbmltcG9ydCB7IGdyYXBocWwsIHdpdGhDdXN0b21SZXF1ZXN0IH0gZnJvbSBcIkBvY3Rva2l0L2dyYXBocWxcIjtcbmltcG9ydCB7IGNyZWF0ZVRva2VuQXV0aCB9IGZyb20gXCJAb2N0b2tpdC9hdXRoLXRva2VuXCI7XG5cbi8vIHBrZy9kaXN0LXNyYy92ZXJzaW9uLmpzXG52YXIgVkVSU0lPTiA9IFwiNS4yLjJcIjtcblxuLy8gcGtnL2Rpc3Qtc3JjL2luZGV4LmpzXG52YXIgbm9vcCA9ICgpID0+IHtcbn07XG52YXIgY29uc29sZVdhcm4gPSBjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTtcbnZhciBjb25zb2xlRXJyb3IgPSBjb25zb2xlLmVycm9yLmJpbmQoY29uc29sZSk7XG5mdW5jdGlvbiBjcmVhdGVMb2dnZXIobG9nZ2VyID0ge30pIHtcbiAgaWYgKHR5cGVvZiBsb2dnZXIuZGVidWcgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIGxvZ2dlci5kZWJ1ZyA9IG5vb3A7XG4gIH1cbiAgaWYgKHR5cGVvZiBsb2dnZXIuaW5mbyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgbG9nZ2VyLmluZm8gPSBub29wO1xuICB9XG4gIGlmICh0eXBlb2YgbG9nZ2VyLndhcm4gIT09IFwiZnVuY3Rpb25cIikge1xuICAgIGxvZ2dlci53YXJuID0gY29uc29sZVdhcm47XG4gIH1cbiAgaWYgKHR5cGVvZiBsb2dnZXIuZXJyb3IgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIGxvZ2dlci5lcnJvciA9IGNvbnNvbGVFcnJvcjtcbiAgfVxuICByZXR1cm4gbG9nZ2VyO1xufVxudmFyIHVzZXJBZ2VudFRyYWlsID0gYG9jdG9raXQtY29yZS5qcy8ke1ZFUlNJT059ICR7Z2V0VXNlckFnZW50KCl9YDtcbnZhciBPY3Rva2l0ID0gY2xhc3Mge1xuICBzdGF0aWMge1xuICAgIHRoaXMuVkVSU0lPTiA9IFZFUlNJT047XG4gIH1cbiAgc3RhdGljIGRlZmF1bHRzKGRlZmF1bHRzKSB7XG4gICAgY29uc3QgT2N0b2tpdFdpdGhEZWZhdWx0cyA9IGNsYXNzIGV4dGVuZHMgdGhpcyB7XG4gICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBhcmdzWzBdIHx8IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGRlZmF1bHRzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBzdXBlcihkZWZhdWx0cyhvcHRpb25zKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKFxuICAgICAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIGRlZmF1bHRzLFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIG9wdGlvbnMudXNlckFnZW50ICYmIGRlZmF1bHRzLnVzZXJBZ2VudCA/IHtcbiAgICAgICAgICAgICAgdXNlckFnZW50OiBgJHtvcHRpb25zLnVzZXJBZ2VudH0gJHtkZWZhdWx0cy51c2VyQWdlbnR9YFxuICAgICAgICAgICAgfSA6IG51bGxcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gT2N0b2tpdFdpdGhEZWZhdWx0cztcbiAgfVxuICBzdGF0aWMge1xuICAgIHRoaXMucGx1Z2lucyA9IFtdO1xuICB9XG4gIC8qKlxuICAgKiBBdHRhY2ggYSBwbHVnaW4gKG9yIG1hbnkpIHRvIHlvdXIgT2N0b2tpdCBpbnN0YW5jZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgQVBJID0gT2N0b2tpdC5wbHVnaW4ocGx1Z2luMSwgcGx1Z2luMiwgcGx1Z2luMywgLi4uKVxuICAgKi9cbiAgc3RhdGljIHBsdWdpbiguLi5uZXdQbHVnaW5zKSB7XG4gICAgY29uc3QgY3VycmVudFBsdWdpbnMgPSB0aGlzLnBsdWdpbnM7XG4gICAgY29uc3QgTmV3T2N0b2tpdCA9IGNsYXNzIGV4dGVuZHMgdGhpcyB7XG4gICAgICBzdGF0aWMge1xuICAgICAgICB0aGlzLnBsdWdpbnMgPSBjdXJyZW50UGx1Z2lucy5jb25jYXQoXG4gICAgICAgICAgbmV3UGx1Z2lucy5maWx0ZXIoKHBsdWdpbikgPT4gIWN1cnJlbnRQbHVnaW5zLmluY2x1ZGVzKHBsdWdpbikpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gTmV3T2N0b2tpdDtcbiAgfVxuICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBob29rID0gbmV3IENvbGxlY3Rpb24oKTtcbiAgICBjb25zdCByZXF1ZXN0RGVmYXVsdHMgPSB7XG4gICAgICBiYXNlVXJsOiByZXF1ZXN0LmVuZHBvaW50LkRFRkFVTFRTLmJhc2VVcmwsXG4gICAgICBoZWFkZXJzOiB7fSxcbiAgICAgIHJlcXVlc3Q6IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMucmVxdWVzdCwge1xuICAgICAgICAvLyBAdHMtaWdub3JlIGludGVybmFsIHVzYWdlIG9ubHksIG5vIG5lZWQgdG8gdHlwZVxuICAgICAgICBob29rOiBob29rLmJpbmQobnVsbCwgXCJyZXF1ZXN0XCIpXG4gICAgICB9KSxcbiAgICAgIG1lZGlhVHlwZToge1xuICAgICAgICBwcmV2aWV3czogW10sXG4gICAgICAgIGZvcm1hdDogXCJcIlxuICAgICAgfVxuICAgIH07XG4gICAgcmVxdWVzdERlZmF1bHRzLmhlYWRlcnNbXCJ1c2VyLWFnZW50XCJdID0gb3B0aW9ucy51c2VyQWdlbnQgPyBgJHtvcHRpb25zLnVzZXJBZ2VudH0gJHt1c2VyQWdlbnRUcmFpbH1gIDogdXNlckFnZW50VHJhaWw7XG4gICAgaWYgKG9wdGlvbnMuYmFzZVVybCkge1xuICAgICAgcmVxdWVzdERlZmF1bHRzLmJhc2VVcmwgPSBvcHRpb25zLmJhc2VVcmw7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnByZXZpZXdzKSB7XG4gICAgICByZXF1ZXN0RGVmYXVsdHMubWVkaWFUeXBlLnByZXZpZXdzID0gb3B0aW9ucy5wcmV2aWV3cztcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudGltZVpvbmUpIHtcbiAgICAgIHJlcXVlc3REZWZhdWx0cy5oZWFkZXJzW1widGltZS16b25lXCJdID0gb3B0aW9ucy50aW1lWm9uZTtcbiAgICB9XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdC5kZWZhdWx0cyhyZXF1ZXN0RGVmYXVsdHMpO1xuICAgIHRoaXMuZ3JhcGhxbCA9IHdpdGhDdXN0b21SZXF1ZXN0KHRoaXMucmVxdWVzdCkuZGVmYXVsdHMocmVxdWVzdERlZmF1bHRzKTtcbiAgICB0aGlzLmxvZyA9IGNyZWF0ZUxvZ2dlcihvcHRpb25zLmxvZyk7XG4gICAgdGhpcy5ob29rID0gaG9vaztcbiAgICBpZiAoIW9wdGlvbnMuYXV0aFN0cmF0ZWd5KSB7XG4gICAgICBpZiAoIW9wdGlvbnMuYXV0aCkge1xuICAgICAgICB0aGlzLmF1dGggPSBhc3luYyAoKSA9PiAoe1xuICAgICAgICAgIHR5cGU6IFwidW5hdXRoZW50aWNhdGVkXCJcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBhdXRoID0gY3JlYXRlVG9rZW5BdXRoKG9wdGlvbnMuYXV0aCk7XG4gICAgICAgIGhvb2sud3JhcChcInJlcXVlc3RcIiwgYXV0aC5ob29rKTtcbiAgICAgICAgdGhpcy5hdXRoID0gYXV0aDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgeyBhdXRoU3RyYXRlZ3ksIC4uLm90aGVyT3B0aW9ucyB9ID0gb3B0aW9ucztcbiAgICAgIGNvbnN0IGF1dGggPSBhdXRoU3RyYXRlZ3koXG4gICAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxdWVzdDogdGhpcy5yZXF1ZXN0LFxuICAgICAgICAgICAgbG9nOiB0aGlzLmxvZyxcbiAgICAgICAgICAgIC8vIHdlIHBhc3MgdGhlIGN1cnJlbnQgb2N0b2tpdCBpbnN0YW5jZSBhcyB3ZWxsIGFzIGl0cyBjb25zdHJ1Y3RvciBvcHRpb25zXG4gICAgICAgICAgICAvLyB0byBhbGxvdyBmb3IgYXV0aGVudGljYXRpb24gc3RyYXRlZ2llcyB0aGF0IHJldHVybiBhIG5ldyBvY3Rva2l0IGluc3RhbmNlXG4gICAgICAgICAgICAvLyB0aGF0IHNoYXJlcyB0aGUgc2FtZSBpbnRlcm5hbCBzdGF0ZSBhcyB0aGUgY3VycmVudCBvbmUuIFRoZSBvcmlnaW5hbFxuICAgICAgICAgICAgLy8gcmVxdWlyZW1lbnQgZm9yIHRoaXMgd2FzIHRoZSBcImV2ZW50LW9jdG9raXRcIiBhdXRoZW50aWNhdGlvbiBzdHJhdGVneVxuICAgICAgICAgICAgLy8gb2YgaHR0cHM6Ly9naXRodWIuY29tL3Byb2JvdC9vY3Rva2l0LWF1dGgtcHJvYm90LlxuICAgICAgICAgICAgb2N0b2tpdDogdGhpcyxcbiAgICAgICAgICAgIG9jdG9raXRPcHRpb25zOiBvdGhlck9wdGlvbnNcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9wdGlvbnMuYXV0aFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgaG9vay53cmFwKFwicmVxdWVzdFwiLCBhdXRoLmhvb2spO1xuICAgICAgdGhpcy5hdXRoID0gYXV0aDtcbiAgICB9XG4gICAgY29uc3QgY2xhc3NDb25zdHJ1Y3RvciA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbGFzc0NvbnN0cnVjdG9yLnBsdWdpbnMubGVuZ3RoOyArK2kpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgY2xhc3NDb25zdHJ1Y3Rvci5wbHVnaW5zW2ldKHRoaXMsIG9wdGlvbnMpKTtcbiAgICB9XG4gIH1cbn07XG5leHBvcnQge1xuICBPY3Rva2l0XG59O1xuIiwiY29uc3QgVkVSU0lPTiA9IFwiMTAuNC4xXCI7XG5leHBvcnQge1xuICBWRVJTSU9OXG59O1xuIiwiY29uc3QgRW5kcG9pbnRzID0ge1xuICBhY3Rpb25zOiB7XG4gICAgYWRkQ3VzdG9tTGFiZWxzVG9TZWxmSG9zdGVkUnVubmVyRm9yT3JnOiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9L2xhYmVsc1wiXG4gICAgXSxcbiAgICBhZGRDdXN0b21MYWJlbHNUb1NlbGZIb3N0ZWRSdW5uZXJGb3JSZXBvOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHNcIlxuICAgIF0sXG4gICAgYWRkU2VsZWN0ZWRSZXBvVG9PcmdTZWNyZXQ6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIlxuICAgIF0sXG4gICAgYWRkU2VsZWN0ZWRSZXBvVG9PcmdWYXJpYWJsZTogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vYWN0aW9ucy92YXJpYWJsZXMve25hbWV9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIlxuICAgIF0sXG4gICAgYXBwcm92ZVdvcmtmbG93UnVuOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9hcHByb3ZlXCJcbiAgICBdLFxuICAgIGNhbmNlbFdvcmtmbG93UnVuOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9jYW5jZWxcIlxuICAgIF0sXG4gICAgY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZTogW1xuICAgICAgXCJQT1NUIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vdmFyaWFibGVzXCJcbiAgICBdLFxuICAgIGNyZWF0ZU9yVXBkYXRlRW52aXJvbm1lbnRTZWNyZXQ6IFtcbiAgICAgIFwiUFVUIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vc2VjcmV0cy97c2VjcmV0X25hbWV9XCJcbiAgICBdLFxuICAgIGNyZWF0ZU9yVXBkYXRlT3JnU2VjcmV0OiBbXCJQVVQgL29yZ3Mve29yZ30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIl0sXG4gICAgY3JlYXRlT3JVcGRhdGVSZXBvU2VjcmV0OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgY3JlYXRlT3JnVmFyaWFibGU6IFtcIlBPU1QgL29yZ3Mve29yZ30vYWN0aW9ucy92YXJpYWJsZXNcIl0sXG4gICAgY3JlYXRlUmVnaXN0cmF0aW9uVG9rZW5Gb3JPcmc6IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMvcmVnaXN0cmF0aW9uLXRva2VuXCJcbiAgICBdLFxuICAgIGNyZWF0ZVJlZ2lzdHJhdGlvblRva2VuRm9yUmVwbzogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnMvcmVnaXN0cmF0aW9uLXRva2VuXCJcbiAgICBdLFxuICAgIGNyZWF0ZVJlbW92ZVRva2VuRm9yT3JnOiBbXCJQT1NUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy9yZW1vdmUtdG9rZW5cIl0sXG4gICAgY3JlYXRlUmVtb3ZlVG9rZW5Gb3JSZXBvOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy9yZW1vdmUtdG9rZW5cIlxuICAgIF0sXG4gICAgY3JlYXRlUmVwb1ZhcmlhYmxlOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3ZhcmlhYmxlc1wiXSxcbiAgICBjcmVhdGVXb3JrZmxvd0Rpc3BhdGNoOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzL3t3b3JrZmxvd19pZH0vZGlzcGF0Y2hlc1wiXG4gICAgXSxcbiAgICBkZWxldGVBY3Rpb25zQ2FjaGVCeUlkOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9jYWNoZXMve2NhY2hlX2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVBY3Rpb25zQ2FjaGVCeUtleTogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvY2FjaGVzez9rZXkscmVmfVwiXG4gICAgXSxcbiAgICBkZWxldGVBcnRpZmFjdDogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvYXJ0aWZhY3RzL3thcnRpZmFjdF9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlRW52aXJvbm1lbnRTZWNyZXQ6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vc2VjcmV0cy97c2VjcmV0X25hbWV9XCJcbiAgICBdLFxuICAgIGRlbGV0ZUVudmlyb25tZW50VmFyaWFibGU6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vdmFyaWFibGVzL3tuYW1lfVwiXG4gICAgXSxcbiAgICBkZWxldGVPcmdTZWNyZXQ6IFtcIkRFTEVURSAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXSxcbiAgICBkZWxldGVPcmdWYXJpYWJsZTogW1wiREVMRVRFIC9vcmdzL3tvcmd9L2FjdGlvbnMvdmFyaWFibGVzL3tuYW1lfVwiXSxcbiAgICBkZWxldGVSZXBvU2VjcmV0OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgZGVsZXRlUmVwb1ZhcmlhYmxlOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy92YXJpYWJsZXMve25hbWV9XCJcbiAgICBdLFxuICAgIGRlbGV0ZVNlbGZIb3N0ZWRSdW5uZXJGcm9tT3JnOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlU2VsZkhvc3RlZFJ1bm5lckZyb21SZXBvOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZVdvcmtmbG93UnVuOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfVwiXSxcbiAgICBkZWxldGVXb3JrZmxvd1J1bkxvZ3M6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vbG9nc1wiXG4gICAgXSxcbiAgICBkaXNhYmxlU2VsZWN0ZWRSZXBvc2l0b3J5R2l0aHViQWN0aW9uc09yZ2FuaXphdGlvbjogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9ucy9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCJcbiAgICBdLFxuICAgIGRpc2FibGVXb3JrZmxvdzogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzL3t3b3JrZmxvd19pZH0vZGlzYWJsZVwiXG4gICAgXSxcbiAgICBkb3dubG9hZEFydGlmYWN0OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9hcnRpZmFjdHMve2FydGlmYWN0X2lkfS97YXJjaGl2ZV9mb3JtYXR9XCJcbiAgICBdLFxuICAgIGRvd25sb2FkSm9iTG9nc0ZvcldvcmtmbG93UnVuOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9qb2JzL3tqb2JfaWR9L2xvZ3NcIlxuICAgIF0sXG4gICAgZG93bmxvYWRXb3JrZmxvd1J1bkF0dGVtcHRMb2dzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2F0dGVtcHRzL3thdHRlbXB0X251bWJlcn0vbG9nc1wiXG4gICAgXSxcbiAgICBkb3dubG9hZFdvcmtmbG93UnVuTG9nczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9sb2dzXCJcbiAgICBdLFxuICAgIGVuYWJsZVNlbGVjdGVkUmVwb3NpdG9yeUdpdGh1YkFjdGlvbnNPcmdhbml6YXRpb246IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnMvcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiXG4gICAgXSxcbiAgICBlbmFibGVXb3JrZmxvdzogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzL3t3b3JrZmxvd19pZH0vZW5hYmxlXCJcbiAgICBdLFxuICAgIGZvcmNlQ2FuY2VsV29ya2Zsb3dSdW46IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2ZvcmNlLWNhbmNlbFwiXG4gICAgXSxcbiAgICBnZW5lcmF0ZVJ1bm5lckppdGNvbmZpZ0Zvck9yZzogW1xuICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy9nZW5lcmF0ZS1qaXRjb25maWdcIlxuICAgIF0sXG4gICAgZ2VuZXJhdGVSdW5uZXJKaXRjb25maWdGb3JSZXBvOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy9nZW5lcmF0ZS1qaXRjb25maWdcIlxuICAgIF0sXG4gICAgZ2V0QWN0aW9uc0NhY2hlTGlzdDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2NhY2hlc1wiXSxcbiAgICBnZXRBY3Rpb25zQ2FjaGVVc2FnZTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2NhY2hlL3VzYWdlXCJdLFxuICAgIGdldEFjdGlvbnNDYWNoZVVzYWdlQnlSZXBvRm9yT3JnOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL2NhY2hlL3VzYWdlLWJ5LXJlcG9zaXRvcnlcIlxuICAgIF0sXG4gICAgZ2V0QWN0aW9uc0NhY2hlVXNhZ2VGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL2NhY2hlL3VzYWdlXCJdLFxuICAgIGdldEFsbG93ZWRBY3Rpb25zT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zL3NlbGVjdGVkLWFjdGlvbnNcIlxuICAgIF0sXG4gICAgZ2V0QWxsb3dlZEFjdGlvbnNSZXBvc2l0b3J5OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9wZXJtaXNzaW9ucy9zZWxlY3RlZC1hY3Rpb25zXCJcbiAgICBdLFxuICAgIGdldEFydGlmYWN0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvYXJ0aWZhY3RzL3thcnRpZmFjdF9pZH1cIl0sXG4gICAgZ2V0Q3VzdG9tT2lkY1N1YkNsYWltRm9yUmVwbzogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvb2lkYy9jdXN0b21pemF0aW9uL3N1YlwiXG4gICAgXSxcbiAgICBnZXRFbnZpcm9ubWVudFB1YmxpY0tleTogW1xuICAgICAgXCJHRVQgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9zZWNyZXRzL3B1YmxpYy1rZXlcIlxuICAgIF0sXG4gICAgZ2V0RW52aXJvbm1lbnRTZWNyZXQ6IFtcbiAgICAgIFwiR0VUIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vc2VjcmV0cy97c2VjcmV0X25hbWV9XCJcbiAgICBdLFxuICAgIGdldEVudmlyb25tZW50VmFyaWFibGU6IFtcbiAgICAgIFwiR0VUIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vdmFyaWFibGVzL3tuYW1lfVwiXG4gICAgXSxcbiAgICBnZXRHaXRodWJBY3Rpb25zRGVmYXVsdFdvcmtmbG93UGVybWlzc2lvbnNPcmdhbml6YXRpb246IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnMvd29ya2Zsb3dcIlxuICAgIF0sXG4gICAgZ2V0R2l0aHViQWN0aW9uc0RlZmF1bHRXb3JrZmxvd1Blcm1pc3Npb25zUmVwb3NpdG9yeTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcGVybWlzc2lvbnMvd29ya2Zsb3dcIlxuICAgIF0sXG4gICAgZ2V0R2l0aHViQWN0aW9uc1Blcm1pc3Npb25zT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zXCJcbiAgICBdLFxuICAgIGdldEdpdGh1YkFjdGlvbnNQZXJtaXNzaW9uc1JlcG9zaXRvcnk6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zXCJcbiAgICBdLFxuICAgIGdldEpvYkZvcldvcmtmbG93UnVuOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvam9icy97am9iX2lkfVwiXSxcbiAgICBnZXRPcmdQdWJsaWNLZXk6IFtcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHMvcHVibGljLWtleVwiXSxcbiAgICBnZXRPcmdTZWNyZXQ6IFtcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXSxcbiAgICBnZXRPcmdWYXJpYWJsZTogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvdmFyaWFibGVzL3tuYW1lfVwiXSxcbiAgICBnZXRQZW5kaW5nRGVwbG95bWVudHNGb3JSdW46IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vcGVuZGluZ19kZXBsb3ltZW50c1wiXG4gICAgXSxcbiAgICBnZXRSZXBvUGVybWlzc2lvbnM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1wiYWN0aW9uc1wiLCBcImdldEdpdGh1YkFjdGlvbnNQZXJtaXNzaW9uc1JlcG9zaXRvcnlcIl0gfVxuICAgIF0sXG4gICAgZ2V0UmVwb1B1YmxpY0tleTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMvcHVibGljLWtleVwiXSxcbiAgICBnZXRSZXBvU2VjcmV0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgIGdldFJlcG9WYXJpYWJsZTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3ZhcmlhYmxlcy97bmFtZX1cIl0sXG4gICAgZ2V0UmV2aWV3c0ZvclJ1bjogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9hcHByb3ZhbHNcIlxuICAgIF0sXG4gICAgZ2V0U2VsZkhvc3RlZFJ1bm5lckZvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfVwiXSxcbiAgICBnZXRTZWxmSG9zdGVkUnVubmVyRm9yUmVwbzogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfVwiXG4gICAgXSxcbiAgICBnZXRXb3JrZmxvdzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3dvcmtmbG93cy97d29ya2Zsb3dfaWR9XCJdLFxuICAgIGdldFdvcmtmbG93QWNjZXNzVG9SZXBvc2l0b3J5OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9wZXJtaXNzaW9ucy9hY2Nlc3NcIlxuICAgIF0sXG4gICAgZ2V0V29ya2Zsb3dSdW46IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9XCJdLFxuICAgIGdldFdvcmtmbG93UnVuQXR0ZW1wdDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9hdHRlbXB0cy97YXR0ZW1wdF9udW1iZXJ9XCJcbiAgICBdLFxuICAgIGdldFdvcmtmbG93UnVuVXNhZ2U6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vdGltaW5nXCJcbiAgICBdLFxuICAgIGdldFdvcmtmbG93VXNhZ2U6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3dvcmtmbG93cy97d29ya2Zsb3dfaWR9L3RpbWluZ1wiXG4gICAgXSxcbiAgICBsaXN0QXJ0aWZhY3RzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2FydGlmYWN0c1wiXSxcbiAgICBsaXN0RW52aXJvbm1lbnRTZWNyZXRzOiBbXG4gICAgICBcIkdFVCAvcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L3NlY3JldHNcIlxuICAgIF0sXG4gICAgbGlzdEVudmlyb25tZW50VmFyaWFibGVzOiBbXG4gICAgICBcIkdFVCAvcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L3ZhcmlhYmxlc1wiXG4gICAgXSxcbiAgICBsaXN0Sm9ic0ZvcldvcmtmbG93UnVuOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2pvYnNcIlxuICAgIF0sXG4gICAgbGlzdEpvYnNGb3JXb3JrZmxvd1J1bkF0dGVtcHQ6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vYXR0ZW1wdHMve2F0dGVtcHRfbnVtYmVyfS9qb2JzXCJcbiAgICBdLFxuICAgIGxpc3RMYWJlbHNGb3JTZWxmSG9zdGVkUnVubmVyRm9yT3JnOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzXCJcbiAgICBdLFxuICAgIGxpc3RMYWJlbHNGb3JTZWxmSG9zdGVkUnVubmVyRm9yUmVwbzogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHNcIlxuICAgIF0sXG4gICAgbGlzdE9yZ1NlY3JldHM6IFtcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHNcIl0sXG4gICAgbGlzdE9yZ1ZhcmlhYmxlczogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvdmFyaWFibGVzXCJdLFxuICAgIGxpc3RSZXBvT3JnYW5pemF0aW9uU2VjcmV0czogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvb3JnYW5pemF0aW9uLXNlY3JldHNcIlxuICAgIF0sXG4gICAgbGlzdFJlcG9Pcmdhbml6YXRpb25WYXJpYWJsZXM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL29yZ2FuaXphdGlvbi12YXJpYWJsZXNcIlxuICAgIF0sXG4gICAgbGlzdFJlcG9TZWNyZXRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0c1wiXSxcbiAgICBsaXN0UmVwb1ZhcmlhYmxlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3ZhcmlhYmxlc1wiXSxcbiAgICBsaXN0UmVwb1dvcmtmbG93czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3dvcmtmbG93c1wiXSxcbiAgICBsaXN0UnVubmVyQXBwbGljYXRpb25zRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXJzL2Rvd25sb2Fkc1wiXSxcbiAgICBsaXN0UnVubmVyQXBwbGljYXRpb25zRm9yUmVwbzogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy9kb3dubG9hZHNcIlxuICAgIF0sXG4gICAgbGlzdFNlbGVjdGVkUmVwb3NGb3JPcmdTZWNyZXQ6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICBsaXN0U2VsZWN0ZWRSZXBvc0Zvck9yZ1ZhcmlhYmxlOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3ZhcmlhYmxlcy97bmFtZX0vcmVwb3NpdG9yaWVzXCJcbiAgICBdLFxuICAgIGxpc3RTZWxlY3RlZFJlcG9zaXRvcmllc0VuYWJsZWRHaXRodWJBY3Rpb25zT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zL3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICBsaXN0U2VsZkhvc3RlZFJ1bm5lcnNGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnNcIl0sXG4gICAgbGlzdFNlbGZIb3N0ZWRSdW5uZXJzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnNcIl0sXG4gICAgbGlzdFdvcmtmbG93UnVuQXJ0aWZhY3RzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2FydGlmYWN0c1wiXG4gICAgXSxcbiAgICBsaXN0V29ya2Zsb3dSdW5zOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfS9ydW5zXCJcbiAgICBdLFxuICAgIGxpc3RXb3JrZmxvd1J1bnNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVuc1wiXSxcbiAgICByZVJ1bkpvYkZvcldvcmtmbG93UnVuOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvam9icy97am9iX2lkfS9yZXJ1blwiXG4gICAgXSxcbiAgICByZVJ1bldvcmtmbG93OiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vcmVydW5cIl0sXG4gICAgcmVSdW5Xb3JrZmxvd0ZhaWxlZEpvYnM6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L3JlcnVuLWZhaWxlZC1qb2JzXCJcbiAgICBdLFxuICAgIHJlbW92ZUFsbEN1c3RvbUxhYmVsc0Zyb21TZWxmSG9zdGVkUnVubmVyRm9yT3JnOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzXCJcbiAgICBdLFxuICAgIHJlbW92ZUFsbEN1c3RvbUxhYmVsc0Zyb21TZWxmSG9zdGVkUnVubmVyRm9yUmVwbzogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHNcIlxuICAgIF0sXG4gICAgcmVtb3ZlQ3VzdG9tTGFiZWxGcm9tU2VsZkhvc3RlZFJ1bm5lckZvck9yZzogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9L2xhYmVscy97bmFtZX1cIlxuICAgIF0sXG4gICAgcmVtb3ZlQ3VzdG9tTGFiZWxGcm9tU2VsZkhvc3RlZFJ1bm5lckZvclJlcG86IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzL3tuYW1lfVwiXG4gICAgXSxcbiAgICByZW1vdmVTZWxlY3RlZFJlcG9Gcm9tT3JnU2VjcmV0OiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCJcbiAgICBdLFxuICAgIHJlbW92ZVNlbGVjdGVkUmVwb0Zyb21PcmdWYXJpYWJsZTogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vYWN0aW9ucy92YXJpYWJsZXMve25hbWV9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIlxuICAgIF0sXG4gICAgcmV2aWV3Q3VzdG9tR2F0ZXNGb3JSdW46IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2RlcGxveW1lbnRfcHJvdGVjdGlvbl9ydWxlXCJcbiAgICBdLFxuICAgIHJldmlld1BlbmRpbmdEZXBsb3ltZW50c0ZvclJ1bjogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vcGVuZGluZ19kZXBsb3ltZW50c1wiXG4gICAgXSxcbiAgICBzZXRBbGxvd2VkQWN0aW9uc09yZ2FuaXphdGlvbjogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9ucy9zZWxlY3RlZC1hY3Rpb25zXCJcbiAgICBdLFxuICAgIHNldEFsbG93ZWRBY3Rpb25zUmVwb3NpdG9yeTogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcGVybWlzc2lvbnMvc2VsZWN0ZWQtYWN0aW9uc1wiXG4gICAgXSxcbiAgICBzZXRDdXN0b21MYWJlbHNGb3JTZWxmSG9zdGVkUnVubmVyRm9yT3JnOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzXCJcbiAgICBdLFxuICAgIHNldEN1c3RvbUxhYmVsc0ZvclNlbGZIb3N0ZWRSdW5uZXJGb3JSZXBvOiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9L2xhYmVsc1wiXG4gICAgXSxcbiAgICBzZXRDdXN0b21PaWRjU3ViQ2xhaW1Gb3JSZXBvOiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9vaWRjL2N1c3RvbWl6YXRpb24vc3ViXCJcbiAgICBdLFxuICAgIHNldEdpdGh1YkFjdGlvbnNEZWZhdWx0V29ya2Zsb3dQZXJtaXNzaW9uc09yZ2FuaXphdGlvbjogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9ucy93b3JrZmxvd1wiXG4gICAgXSxcbiAgICBzZXRHaXRodWJBY3Rpb25zRGVmYXVsdFdvcmtmbG93UGVybWlzc2lvbnNSZXBvc2l0b3J5OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9wZXJtaXNzaW9ucy93b3JrZmxvd1wiXG4gICAgXSxcbiAgICBzZXRHaXRodWJBY3Rpb25zUGVybWlzc2lvbnNPcmdhbml6YXRpb246IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnNcIlxuICAgIF0sXG4gICAgc2V0R2l0aHViQWN0aW9uc1Blcm1pc3Npb25zUmVwb3NpdG9yeTogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcGVybWlzc2lvbnNcIlxuICAgIF0sXG4gICAgc2V0U2VsZWN0ZWRSZXBvc0Zvck9yZ1NlY3JldDogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzXCJcbiAgICBdLFxuICAgIHNldFNlbGVjdGVkUmVwb3NGb3JPcmdWYXJpYWJsZTogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vYWN0aW9ucy92YXJpYWJsZXMve25hbWV9L3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICBzZXRTZWxlY3RlZFJlcG9zaXRvcmllc0VuYWJsZWRHaXRodWJBY3Rpb25zT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zL3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICBzZXRXb3JrZmxvd0FjY2Vzc1RvUmVwb3NpdG9yeTogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcGVybWlzc2lvbnMvYWNjZXNzXCJcbiAgICBdLFxuICAgIHVwZGF0ZUVudmlyb25tZW50VmFyaWFibGU6IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS92YXJpYWJsZXMve25hbWV9XCJcbiAgICBdLFxuICAgIHVwZGF0ZU9yZ1ZhcmlhYmxlOiBbXCJQQVRDSCAvb3Jncy97b3JnfS9hY3Rpb25zL3ZhcmlhYmxlcy97bmFtZX1cIl0sXG4gICAgdXBkYXRlUmVwb1ZhcmlhYmxlOiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3ZhcmlhYmxlcy97bmFtZX1cIlxuICAgIF1cbiAgfSxcbiAgYWN0aXZpdHk6IHtcbiAgICBjaGVja1JlcG9Jc1N0YXJyZWRCeUF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvc3RhcnJlZC97b3duZXJ9L3tyZXBvfVwiXSxcbiAgICBkZWxldGVSZXBvU3Vic2NyaXB0aW9uOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N1YnNjcmlwdGlvblwiXSxcbiAgICBkZWxldGVUaHJlYWRTdWJzY3JpcHRpb246IFtcbiAgICAgIFwiREVMRVRFIC9ub3RpZmljYXRpb25zL3RocmVhZHMve3RocmVhZF9pZH0vc3Vic2NyaXB0aW9uXCJcbiAgICBdLFxuICAgIGdldEZlZWRzOiBbXCJHRVQgL2ZlZWRzXCJdLFxuICAgIGdldFJlcG9TdWJzY3JpcHRpb246IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3Vic2NyaXB0aW9uXCJdLFxuICAgIGdldFRocmVhZDogW1wiR0VUIC9ub3RpZmljYXRpb25zL3RocmVhZHMve3RocmVhZF9pZH1cIl0sXG4gICAgZ2V0VGhyZWFkU3Vic2NyaXB0aW9uRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC9ub3RpZmljYXRpb25zL3RocmVhZHMve3RocmVhZF9pZH0vc3Vic2NyaXB0aW9uXCJcbiAgICBdLFxuICAgIGxpc3RFdmVudHNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L2V2ZW50c1wiXSxcbiAgICBsaXN0Tm90aWZpY2F0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL25vdGlmaWNhdGlvbnNcIl0sXG4gICAgbGlzdE9yZ0V2ZW50c0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9ldmVudHMvb3Jncy97b3JnfVwiXG4gICAgXSxcbiAgICBsaXN0UHVibGljRXZlbnRzOiBbXCJHRVQgL2V2ZW50c1wiXSxcbiAgICBsaXN0UHVibGljRXZlbnRzRm9yUmVwb05ldHdvcms6IFtcIkdFVCAvbmV0d29ya3Mve293bmVyfS97cmVwb30vZXZlbnRzXCJdLFxuICAgIGxpc3RQdWJsaWNFdmVudHNGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZXZlbnRzL3B1YmxpY1wiXSxcbiAgICBsaXN0UHVibGljT3JnRXZlbnRzOiBbXCJHRVQgL29yZ3Mve29yZ30vZXZlbnRzXCJdLFxuICAgIGxpc3RSZWNlaXZlZEV2ZW50c0ZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9yZWNlaXZlZF9ldmVudHNcIl0sXG4gICAgbGlzdFJlY2VpdmVkUHVibGljRXZlbnRzRm9yVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcmVjZWl2ZWRfZXZlbnRzL3B1YmxpY1wiXG4gICAgXSxcbiAgICBsaXN0UmVwb0V2ZW50czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ldmVudHNcIl0sXG4gICAgbGlzdFJlcG9Ob3RpZmljYXRpb25zRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ub3RpZmljYXRpb25zXCJcbiAgICBdLFxuICAgIGxpc3RSZXBvc1N0YXJyZWRCeUF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvc3RhcnJlZFwiXSxcbiAgICBsaXN0UmVwb3NTdGFycmVkQnlVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc3RhcnJlZFwiXSxcbiAgICBsaXN0UmVwb3NXYXRjaGVkQnlVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc3Vic2NyaXB0aW9uc1wiXSxcbiAgICBsaXN0U3RhcmdhemVyc0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3RhcmdhemVyc1wiXSxcbiAgICBsaXN0V2F0Y2hlZFJlcG9zRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9zdWJzY3JpcHRpb25zXCJdLFxuICAgIGxpc3RXYXRjaGVyc0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3Vic2NyaWJlcnNcIl0sXG4gICAgbWFya05vdGlmaWNhdGlvbnNBc1JlYWQ6IFtcIlBVVCAvbm90aWZpY2F0aW9uc1wiXSxcbiAgICBtYXJrUmVwb05vdGlmaWNhdGlvbnNBc1JlYWQ6IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vbm90aWZpY2F0aW9uc1wiXSxcbiAgICBtYXJrVGhyZWFkQXNEb25lOiBbXCJERUxFVEUgL25vdGlmaWNhdGlvbnMvdGhyZWFkcy97dGhyZWFkX2lkfVwiXSxcbiAgICBtYXJrVGhyZWFkQXNSZWFkOiBbXCJQQVRDSCAvbm90aWZpY2F0aW9ucy90aHJlYWRzL3t0aHJlYWRfaWR9XCJdLFxuICAgIHNldFJlcG9TdWJzY3JpcHRpb246IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3Vic2NyaXB0aW9uXCJdLFxuICAgIHNldFRocmVhZFN1YnNjcmlwdGlvbjogW1xuICAgICAgXCJQVVQgL25vdGlmaWNhdGlvbnMvdGhyZWFkcy97dGhyZWFkX2lkfS9zdWJzY3JpcHRpb25cIlxuICAgIF0sXG4gICAgc3RhclJlcG9Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUFVUIC91c2VyL3N0YXJyZWQve293bmVyfS97cmVwb31cIl0sXG4gICAgdW5zdGFyUmVwb0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJERUxFVEUgL3VzZXIvc3RhcnJlZC97b3duZXJ9L3tyZXBvfVwiXVxuICB9LFxuICBhcHBzOiB7XG4gICAgYWRkUmVwb1RvSW5zdGFsbGF0aW9uOiBbXG4gICAgICBcIlBVVCAvdXNlci9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJhcHBzXCIsIFwiYWRkUmVwb1RvSW5zdGFsbGF0aW9uRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgYWRkUmVwb1RvSW5zdGFsbGF0aW9uRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiUFVUIC91c2VyL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiXG4gICAgXSxcbiAgICBjaGVja1Rva2VuOiBbXCJQT1NUIC9hcHBsaWNhdGlvbnMve2NsaWVudF9pZH0vdG9rZW5cIl0sXG4gICAgY3JlYXRlRnJvbU1hbmlmZXN0OiBbXCJQT1NUIC9hcHAtbWFuaWZlc3RzL3tjb2RlfS9jb252ZXJzaW9uc1wiXSxcbiAgICBjcmVhdGVJbnN0YWxsYXRpb25BY2Nlc3NUb2tlbjogW1xuICAgICAgXCJQT1NUIC9hcHAvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfS9hY2Nlc3NfdG9rZW5zXCJcbiAgICBdLFxuICAgIGRlbGV0ZUF1dGhvcml6YXRpb246IFtcIkRFTEVURSAvYXBwbGljYXRpb25zL3tjbGllbnRfaWR9L2dyYW50XCJdLFxuICAgIGRlbGV0ZUluc3RhbGxhdGlvbjogW1wiREVMRVRFIC9hcHAvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfVwiXSxcbiAgICBkZWxldGVUb2tlbjogW1wiREVMRVRFIC9hcHBsaWNhdGlvbnMve2NsaWVudF9pZH0vdG9rZW5cIl0sXG4gICAgZ2V0QXV0aGVudGljYXRlZDogW1wiR0VUIC9hcHBcIl0sXG4gICAgZ2V0QnlTbHVnOiBbXCJHRVQgL2FwcHMve2FwcF9zbHVnfVwiXSxcbiAgICBnZXRJbnN0YWxsYXRpb246IFtcIkdFVCAvYXBwL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH1cIl0sXG4gICAgZ2V0T3JnSW5zdGFsbGF0aW9uOiBbXCJHRVQgL29yZ3Mve29yZ30vaW5zdGFsbGF0aW9uXCJdLFxuICAgIGdldFJlcG9JbnN0YWxsYXRpb246IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaW5zdGFsbGF0aW9uXCJdLFxuICAgIGdldFN1YnNjcmlwdGlvblBsYW5Gb3JBY2NvdW50OiBbXG4gICAgICBcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9hY2NvdW50cy97YWNjb3VudF9pZH1cIlxuICAgIF0sXG4gICAgZ2V0U3Vic2NyaXB0aW9uUGxhbkZvckFjY291bnRTdHViYmVkOiBbXG4gICAgICBcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9zdHViYmVkL2FjY291bnRzL3thY2NvdW50X2lkfVwiXG4gICAgXSxcbiAgICBnZXRVc2VySW5zdGFsbGF0aW9uOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vaW5zdGFsbGF0aW9uXCJdLFxuICAgIGdldFdlYmhvb2tDb25maWdGb3JBcHA6IFtcIkdFVCAvYXBwL2hvb2svY29uZmlnXCJdLFxuICAgIGdldFdlYmhvb2tEZWxpdmVyeTogW1wiR0VUIC9hcHAvaG9vay9kZWxpdmVyaWVzL3tkZWxpdmVyeV9pZH1cIl0sXG4gICAgbGlzdEFjY291bnRzRm9yUGxhbjogW1wiR0VUIC9tYXJrZXRwbGFjZV9saXN0aW5nL3BsYW5zL3twbGFuX2lkfS9hY2NvdW50c1wiXSxcbiAgICBsaXN0QWNjb3VudHNGb3JQbGFuU3R1YmJlZDogW1xuICAgICAgXCJHRVQgL21hcmtldHBsYWNlX2xpc3Rpbmcvc3R1YmJlZC9wbGFucy97cGxhbl9pZH0vYWNjb3VudHNcIlxuICAgIF0sXG4gICAgbGlzdEluc3RhbGxhdGlvblJlcG9zRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2VyL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH0vcmVwb3NpdG9yaWVzXCJcbiAgICBdLFxuICAgIGxpc3RJbnN0YWxsYXRpb25SZXF1ZXN0c0ZvckF1dGhlbnRpY2F0ZWRBcHA6IFtcbiAgICAgIFwiR0VUIC9hcHAvaW5zdGFsbGF0aW9uLXJlcXVlc3RzXCJcbiAgICBdLFxuICAgIGxpc3RJbnN0YWxsYXRpb25zOiBbXCJHRVQgL2FwcC9pbnN0YWxsYXRpb25zXCJdLFxuICAgIGxpc3RJbnN0YWxsYXRpb25zRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9pbnN0YWxsYXRpb25zXCJdLFxuICAgIGxpc3RQbGFuczogW1wiR0VUIC9tYXJrZXRwbGFjZV9saXN0aW5nL3BsYW5zXCJdLFxuICAgIGxpc3RQbGFuc1N0dWJiZWQ6IFtcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9zdHViYmVkL3BsYW5zXCJdLFxuICAgIGxpc3RSZXBvc0FjY2Vzc2libGVUb0luc3RhbGxhdGlvbjogW1wiR0VUIC9pbnN0YWxsYXRpb24vcmVwb3NpdG9yaWVzXCJdLFxuICAgIGxpc3RTdWJzY3JpcHRpb25zRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9tYXJrZXRwbGFjZV9wdXJjaGFzZXNcIl0sXG4gICAgbGlzdFN1YnNjcmlwdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlclN0dWJiZWQ6IFtcbiAgICAgIFwiR0VUIC91c2VyL21hcmtldHBsYWNlX3B1cmNoYXNlcy9zdHViYmVkXCJcbiAgICBdLFxuICAgIGxpc3RXZWJob29rRGVsaXZlcmllczogW1wiR0VUIC9hcHAvaG9vay9kZWxpdmVyaWVzXCJdLFxuICAgIHJlZGVsaXZlcldlYmhvb2tEZWxpdmVyeTogW1xuICAgICAgXCJQT1NUIC9hcHAvaG9vay9kZWxpdmVyaWVzL3tkZWxpdmVyeV9pZH0vYXR0ZW1wdHNcIlxuICAgIF0sXG4gICAgcmVtb3ZlUmVwb0Zyb21JbnN0YWxsYXRpb246IFtcbiAgICAgIFwiREVMRVRFIC91c2VyL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcImFwcHNcIiwgXCJyZW1vdmVSZXBvRnJvbUluc3RhbGxhdGlvbkZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIHJlbW92ZVJlcG9Gcm9tSW5zdGFsbGF0aW9uRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiREVMRVRFIC91c2VyL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiXG4gICAgXSxcbiAgICByZXNldFRva2VuOiBbXCJQQVRDSCAvYXBwbGljYXRpb25zL3tjbGllbnRfaWR9L3Rva2VuXCJdLFxuICAgIHJldm9rZUluc3RhbGxhdGlvbkFjY2Vzc1Rva2VuOiBbXCJERUxFVEUgL2luc3RhbGxhdGlvbi90b2tlblwiXSxcbiAgICBzY29wZVRva2VuOiBbXCJQT1NUIC9hcHBsaWNhdGlvbnMve2NsaWVudF9pZH0vdG9rZW4vc2NvcGVkXCJdLFxuICAgIHN1c3BlbmRJbnN0YWxsYXRpb246IFtcIlBVVCAvYXBwL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH0vc3VzcGVuZGVkXCJdLFxuICAgIHVuc3VzcGVuZEluc3RhbGxhdGlvbjogW1xuICAgICAgXCJERUxFVEUgL2FwcC9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9L3N1c3BlbmRlZFwiXG4gICAgXSxcbiAgICB1cGRhdGVXZWJob29rQ29uZmlnRm9yQXBwOiBbXCJQQVRDSCAvYXBwL2hvb2svY29uZmlnXCJdXG4gIH0sXG4gIGJpbGxpbmc6IHtcbiAgICBnZXRHaXRodWJBY3Rpb25zQmlsbGluZ09yZzogW1wiR0VUIC9vcmdzL3tvcmd9L3NldHRpbmdzL2JpbGxpbmcvYWN0aW9uc1wiXSxcbiAgICBnZXRHaXRodWJBY3Rpb25zQmlsbGluZ1VzZXI6IFtcbiAgICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3NldHRpbmdzL2JpbGxpbmcvYWN0aW9uc1wiXG4gICAgXSxcbiAgICBnZXRHaXRodWJQYWNrYWdlc0JpbGxpbmdPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9zZXR0aW5ncy9iaWxsaW5nL3BhY2thZ2VzXCJdLFxuICAgIGdldEdpdGh1YlBhY2thZ2VzQmlsbGluZ1VzZXI6IFtcbiAgICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3NldHRpbmdzL2JpbGxpbmcvcGFja2FnZXNcIlxuICAgIF0sXG4gICAgZ2V0U2hhcmVkU3RvcmFnZUJpbGxpbmdPcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3NldHRpbmdzL2JpbGxpbmcvc2hhcmVkLXN0b3JhZ2VcIlxuICAgIF0sXG4gICAgZ2V0U2hhcmVkU3RvcmFnZUJpbGxpbmdVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9zZXR0aW5ncy9iaWxsaW5nL3NoYXJlZC1zdG9yYWdlXCJcbiAgICBdXG4gIH0sXG4gIGNoZWNrczoge1xuICAgIGNyZWF0ZTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stcnVuc1wiXSxcbiAgICBjcmVhdGVTdWl0ZTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stc3VpdGVzXCJdLFxuICAgIGdldDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1ydW5zL3tjaGVja19ydW5faWR9XCJdLFxuICAgIGdldFN1aXRlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NoZWNrLXN1aXRlcy97Y2hlY2tfc3VpdGVfaWR9XCJdLFxuICAgIGxpc3RBbm5vdGF0aW9uczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NoZWNrLXJ1bnMve2NoZWNrX3J1bl9pZH0vYW5ub3RhdGlvbnNcIlxuICAgIF0sXG4gICAgbGlzdEZvclJlZjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tyZWZ9L2NoZWNrLXJ1bnNcIl0sXG4gICAgbGlzdEZvclN1aXRlOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stc3VpdGVzL3tjaGVja19zdWl0ZV9pZH0vY2hlY2stcnVuc1wiXG4gICAgXSxcbiAgICBsaXN0U3VpdGVzRm9yUmVmOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve3JlZn0vY2hlY2stc3VpdGVzXCJdLFxuICAgIHJlcmVxdWVzdFJ1bjogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1ydW5zL3tjaGVja19ydW5faWR9L3JlcmVxdWVzdFwiXG4gICAgXSxcbiAgICByZXJlcXVlc3RTdWl0ZTogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1zdWl0ZXMve2NoZWNrX3N1aXRlX2lkfS9yZXJlcXVlc3RcIlxuICAgIF0sXG4gICAgc2V0U3VpdGVzUHJlZmVyZW5jZXM6IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2NoZWNrLXN1aXRlcy9wcmVmZXJlbmNlc1wiXG4gICAgXSxcbiAgICB1cGRhdGU6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1ydW5zL3tjaGVja19ydW5faWR9XCJdXG4gIH0sXG4gIGNvZGVTY2FubmluZzoge1xuICAgIGRlbGV0ZUFuYWx5c2lzOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbmFseXNlcy97YW5hbHlzaXNfaWR9ez9jb25maXJtX2RlbGV0ZX1cIlxuICAgIF0sXG4gICAgZ2V0QWxlcnQ6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2FsZXJ0cy97YWxlcnRfbnVtYmVyfVwiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWRQYXJhbWV0ZXJzOiB7IGFsZXJ0X2lkOiBcImFsZXJ0X251bWJlclwiIH0gfVxuICAgIF0sXG4gICAgZ2V0QW5hbHlzaXM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2FuYWx5c2VzL3thbmFseXNpc19pZH1cIlxuICAgIF0sXG4gICAgZ2V0Q29kZXFsRGF0YWJhc2U6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2NvZGVxbC9kYXRhYmFzZXMve2xhbmd1YWdlfVwiXG4gICAgXSxcbiAgICBnZXREZWZhdWx0U2V0dXA6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9kZWZhdWx0LXNldHVwXCJdLFxuICAgIGdldFNhcmlmOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvc2FyaWZzL3tzYXJpZl9pZH1cIl0sXG4gICAgbGlzdEFsZXJ0SW5zdGFuY2VzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn0vaW5zdGFuY2VzXCJcbiAgICBdLFxuICAgIGxpc3RBbGVydHNGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9jb2RlLXNjYW5uaW5nL2FsZXJ0c1wiXSxcbiAgICBsaXN0QWxlcnRzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2FsZXJ0c1wiXSxcbiAgICBsaXN0QWxlcnRzSW5zdGFuY2VzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn0vaW5zdGFuY2VzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1wiY29kZVNjYW5uaW5nXCIsIFwibGlzdEFsZXJ0SW5zdGFuY2VzXCJdIH1cbiAgICBdLFxuICAgIGxpc3RDb2RlcWxEYXRhYmFzZXM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2NvZGVxbC9kYXRhYmFzZXNcIlxuICAgIF0sXG4gICAgbGlzdFJlY2VudEFuYWx5c2VzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYW5hbHlzZXNcIl0sXG4gICAgdXBkYXRlQWxlcnQ6IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYWxlcnRzL3thbGVydF9udW1iZXJ9XCJcbiAgICBdLFxuICAgIHVwZGF0ZURlZmF1bHRTZXR1cDogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9kZWZhdWx0LXNldHVwXCJcbiAgICBdLFxuICAgIHVwbG9hZFNhcmlmOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL3Nhcmlmc1wiXVxuICB9LFxuICBjb2Rlc09mQ29uZHVjdDoge1xuICAgIGdldEFsbENvZGVzT2ZDb25kdWN0OiBbXCJHRVQgL2NvZGVzX29mX2NvbmR1Y3RcIl0sXG4gICAgZ2V0Q29uZHVjdENvZGU6IFtcIkdFVCAvY29kZXNfb2ZfY29uZHVjdC97a2V5fVwiXVxuICB9LFxuICBjb2Rlc3BhY2VzOiB7XG4gICAgYWRkUmVwb3NpdG9yeUZvclNlY3JldEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIlBVVCAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCJcbiAgICBdLFxuICAgIGFkZFNlbGVjdGVkUmVwb1RvT3JnU2VjcmV0OiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCJcbiAgICBdLFxuICAgIGNoZWNrUGVybWlzc2lvbnNGb3JEZXZjb250YWluZXI6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL3Blcm1pc3Npb25zX2NoZWNrXCJcbiAgICBdLFxuICAgIGNvZGVzcGFjZU1hY2hpbmVzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfS9tYWNoaW5lc1wiXG4gICAgXSxcbiAgICBjcmVhdGVGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9jb2Rlc3BhY2VzXCJdLFxuICAgIGNyZWF0ZU9yVXBkYXRlT3JnU2VjcmV0OiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXG4gICAgXSxcbiAgICBjcmVhdGVPclVwZGF0ZVJlcG9TZWNyZXQ6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXG4gICAgXSxcbiAgICBjcmVhdGVPclVwZGF0ZVNlY3JldEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIlBVVCAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXG4gICAgXSxcbiAgICBjcmVhdGVXaXRoUHJGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvZGVzcGFjZXNcIlxuICAgIF0sXG4gICAgY3JlYXRlV2l0aFJlcG9Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzXCJcbiAgICBdLFxuICAgIGRlbGV0ZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJERUxFVEUgL3VzZXIvY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9XCJdLFxuICAgIGRlbGV0ZUZyb21Pcmdhbml6YXRpb246IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L21lbWJlcnMve3VzZXJuYW1lfS9jb2Rlc3BhY2VzL3tjb2Rlc3BhY2VfbmFtZX1cIlxuICAgIF0sXG4gICAgZGVsZXRlT3JnU2VjcmV0OiBbXCJERUxFVEUgL29yZ3Mve29yZ30vY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIl0sXG4gICAgZGVsZXRlUmVwb1NlY3JldDogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJcbiAgICBdLFxuICAgIGRlbGV0ZVNlY3JldEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXG4gICAgXSxcbiAgICBleHBvcnRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJQT1NUIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfS9leHBvcnRzXCJcbiAgICBdLFxuICAgIGdldENvZGVzcGFjZXNGb3JVc2VySW5Pcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L21lbWJlcnMve3VzZXJuYW1lfS9jb2Rlc3BhY2VzXCJcbiAgICBdLFxuICAgIGdldEV4cG9ydERldGFpbHNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9L2V4cG9ydHMve2V4cG9ydF9pZH1cIlxuICAgIF0sXG4gICAgZ2V0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9jb2Rlc3BhY2VzL3tjb2Rlc3BhY2VfbmFtZX1cIl0sXG4gICAgZ2V0T3JnUHVibGljS2V5OiBbXCJHRVQgL29yZ3Mve29yZ30vY29kZXNwYWNlcy9zZWNyZXRzL3B1YmxpYy1rZXlcIl0sXG4gICAgZ2V0T3JnU2VjcmV0OiBbXCJHRVQgL29yZ3Mve29yZ30vY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIl0sXG4gICAgZ2V0UHVibGljS2V5Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2VyL2NvZGVzcGFjZXMvc2VjcmV0cy9wdWJsaWMta2V5XCJcbiAgICBdLFxuICAgIGdldFJlcG9QdWJsaWNLZXk6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL3NlY3JldHMvcHVibGljLWtleVwiXG4gICAgXSxcbiAgICBnZXRSZXBvU2VjcmV0OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgZ2V0U2VjcmV0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2VyL2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJcbiAgICBdLFxuICAgIGxpc3REZXZjb250YWluZXJzSW5SZXBvc2l0b3J5Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL2RldmNvbnRhaW5lcnNcIlxuICAgIF0sXG4gICAgbGlzdEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvY29kZXNwYWNlc1wiXSxcbiAgICBsaXN0SW5Pcmdhbml6YXRpb246IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkUGFyYW1ldGVyczogeyBvcmdfaWQ6IFwib3JnXCIgfSB9XG4gICAgXSxcbiAgICBsaXN0SW5SZXBvc2l0b3J5Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzXCJcbiAgICBdLFxuICAgIGxpc3RPcmdTZWNyZXRzOiBbXCJHRVQgL29yZ3Mve29yZ30vY29kZXNwYWNlcy9zZWNyZXRzXCJdLFxuICAgIGxpc3RSZXBvU2VjcmV0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL3NlY3JldHNcIl0sXG4gICAgbGlzdFJlcG9zaXRvcmllc0ZvclNlY3JldEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXNcIlxuICAgIF0sXG4gICAgbGlzdFNlY3JldHNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2NvZGVzcGFjZXMvc2VjcmV0c1wiXSxcbiAgICBsaXN0U2VsZWN0ZWRSZXBvc0Zvck9yZ1NlY3JldDogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzXCJcbiAgICBdLFxuICAgIHByZUZsaWdodFdpdGhSZXBvRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL25ld1wiXG4gICAgXSxcbiAgICBwdWJsaXNoRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiUE9TVCAvdXNlci9jb2Rlc3BhY2VzL3tjb2Rlc3BhY2VfbmFtZX0vcHVibGlzaFwiXG4gICAgXSxcbiAgICByZW1vdmVSZXBvc2l0b3J5Rm9yU2VjcmV0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiREVMRVRFIC91c2VyL2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIlxuICAgIF0sXG4gICAgcmVtb3ZlU2VsZWN0ZWRSZXBvRnJvbU9yZ1NlY3JldDogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiXG4gICAgXSxcbiAgICByZXBvTWFjaGluZXNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvbWFjaGluZXNcIlxuICAgIF0sXG4gICAgc2V0UmVwb3NpdG9yaWVzRm9yU2VjcmV0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiUFVUIC91c2VyL2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICBzZXRTZWxlY3RlZFJlcG9zRm9yT3JnU2VjcmV0OiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXNcIlxuICAgIF0sXG4gICAgc3RhcnRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9jb2Rlc3BhY2VzL3tjb2Rlc3BhY2VfbmFtZX0vc3RhcnRcIl0sXG4gICAgc3RvcEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQT1NUIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfS9zdG9wXCJdLFxuICAgIHN0b3BJbk9yZ2FuaXphdGlvbjogW1xuICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L21lbWJlcnMve3VzZXJuYW1lfS9jb2Rlc3BhY2VzL3tjb2Rlc3BhY2VfbmFtZX0vc3RvcFwiXG4gICAgXSxcbiAgICB1cGRhdGVGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUEFUQ0ggL3VzZXIvY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9XCJdXG4gIH0sXG4gIGNvcGlsb3Q6IHtcbiAgICBhZGRDb3BpbG90U2VhdHNGb3JUZWFtczogW1xuICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L2NvcGlsb3QvYmlsbGluZy9zZWxlY3RlZF90ZWFtc1wiXG4gICAgXSxcbiAgICBhZGRDb3BpbG90U2VhdHNGb3JVc2VyczogW1xuICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L2NvcGlsb3QvYmlsbGluZy9zZWxlY3RlZF91c2Vyc1wiXG4gICAgXSxcbiAgICBjYW5jZWxDb3BpbG90U2VhdEFzc2lnbm1lbnRGb3JUZWFtczogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vY29waWxvdC9iaWxsaW5nL3NlbGVjdGVkX3RlYW1zXCJcbiAgICBdLFxuICAgIGNhbmNlbENvcGlsb3RTZWF0QXNzaWdubWVudEZvclVzZXJzOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9jb3BpbG90L2JpbGxpbmcvc2VsZWN0ZWRfdXNlcnNcIlxuICAgIF0sXG4gICAgZ2V0Q29waWxvdE9yZ2FuaXphdGlvbkRldGFpbHM6IFtcIkdFVCAvb3Jncy97b3JnfS9jb3BpbG90L2JpbGxpbmdcIl0sXG4gICAgZ2V0Q29waWxvdFNlYXREZXRhaWxzRm9yVXNlcjogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vbWVtYmVycy97dXNlcm5hbWV9L2NvcGlsb3RcIlxuICAgIF0sXG4gICAgbGlzdENvcGlsb3RTZWF0czogW1wiR0VUIC9vcmdzL3tvcmd9L2NvcGlsb3QvYmlsbGluZy9zZWF0c1wiXVxuICB9LFxuICBkZXBlbmRhYm90OiB7XG4gICAgYWRkU2VsZWN0ZWRSZXBvVG9PcmdTZWNyZXQ6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIlxuICAgIF0sXG4gICAgY3JlYXRlT3JVcGRhdGVPcmdTZWNyZXQ6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJcbiAgICBdLFxuICAgIGNyZWF0ZU9yVXBkYXRlUmVwb1NlY3JldDogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJcbiAgICBdLFxuICAgIGRlbGV0ZU9yZ1NlY3JldDogW1wiREVMRVRFIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgIGRlbGV0ZVJlcG9TZWNyZXQ6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBlbmRhYm90L3NlY3JldHMve3NlY3JldF9uYW1lfVwiXG4gICAgXSxcbiAgICBnZXRBbGVydDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBlbmRhYm90L2FsZXJ0cy97YWxlcnRfbnVtYmVyfVwiXSxcbiAgICBnZXRPcmdQdWJsaWNLZXk6IFtcIkdFVCAvb3Jncy97b3JnfS9kZXBlbmRhYm90L3NlY3JldHMvcHVibGljLWtleVwiXSxcbiAgICBnZXRPcmdTZWNyZXQ6IFtcIkdFVCAvb3Jncy97b3JnfS9kZXBlbmRhYm90L3NlY3JldHMve3NlY3JldF9uYW1lfVwiXSxcbiAgICBnZXRSZXBvUHVibGljS2V5OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kYWJvdC9zZWNyZXRzL3B1YmxpYy1rZXlcIlxuICAgIF0sXG4gICAgZ2V0UmVwb1NlY3JldDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJcbiAgICBdLFxuICAgIGxpc3RBbGVydHNGb3JFbnRlcnByaXNlOiBbXG4gICAgICBcIkdFVCAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L2RlcGVuZGFib3QvYWxlcnRzXCJcbiAgICBdLFxuICAgIGxpc3RBbGVydHNGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9kZXBlbmRhYm90L2FsZXJ0c1wiXSxcbiAgICBsaXN0QWxlcnRzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBlbmRhYm90L2FsZXJ0c1wiXSxcbiAgICBsaXN0T3JnU2VjcmV0czogW1wiR0VUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0c1wiXSxcbiAgICBsaXN0UmVwb1NlY3JldHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kYWJvdC9zZWNyZXRzXCJdLFxuICAgIGxpc3RTZWxlY3RlZFJlcG9zRm9yT3JnU2VjcmV0OiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9kZXBlbmRhYm90L3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXNcIlxuICAgIF0sXG4gICAgcmVtb3ZlU2VsZWN0ZWRSZXBvRnJvbU9yZ1NlY3JldDogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiXG4gICAgXSxcbiAgICBzZXRTZWxlY3RlZFJlcG9zRm9yT3JnU2VjcmV0OiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9kZXBlbmRhYm90L3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXNcIlxuICAgIF0sXG4gICAgdXBkYXRlQWxlcnQ6IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGFib3QvYWxlcnRzL3thbGVydF9udW1iZXJ9XCJcbiAgICBdXG4gIH0sXG4gIGRlcGVuZGVuY3lHcmFwaDoge1xuICAgIGNyZWF0ZVJlcG9zaXRvcnlTbmFwc2hvdDogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBlbmRlbmN5LWdyYXBoL3NuYXBzaG90c1wiXG4gICAgXSxcbiAgICBkaWZmUmFuZ2U6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBlbmRlbmN5LWdyYXBoL2NvbXBhcmUve2Jhc2VoZWFkfVwiXG4gICAgXSxcbiAgICBleHBvcnRTYm9tOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGVuY3ktZ3JhcGgvc2JvbVwiXVxuICB9LFxuICBlbW9qaXM6IHsgZ2V0OiBbXCJHRVQgL2Vtb2ppc1wiXSB9LFxuICBnaXN0czoge1xuICAgIGNoZWNrSXNTdGFycmVkOiBbXCJHRVQgL2dpc3RzL3tnaXN0X2lkfS9zdGFyXCJdLFxuICAgIGNyZWF0ZTogW1wiUE9TVCAvZ2lzdHNcIl0sXG4gICAgY3JlYXRlQ29tbWVudDogW1wiUE9TVCAvZ2lzdHMve2dpc3RfaWR9L2NvbW1lbnRzXCJdLFxuICAgIGRlbGV0ZTogW1wiREVMRVRFIC9naXN0cy97Z2lzdF9pZH1cIl0sXG4gICAgZGVsZXRlQ29tbWVudDogW1wiREVMRVRFIC9naXN0cy97Z2lzdF9pZH0vY29tbWVudHMve2NvbW1lbnRfaWR9XCJdLFxuICAgIGZvcms6IFtcIlBPU1QgL2dpc3RzL3tnaXN0X2lkfS9mb3Jrc1wiXSxcbiAgICBnZXQ6IFtcIkdFVCAvZ2lzdHMve2dpc3RfaWR9XCJdLFxuICAgIGdldENvbW1lbnQ6IFtcIkdFVCAvZ2lzdHMve2dpc3RfaWR9L2NvbW1lbnRzL3tjb21tZW50X2lkfVwiXSxcbiAgICBnZXRSZXZpc2lvbjogW1wiR0VUIC9naXN0cy97Z2lzdF9pZH0ve3NoYX1cIl0sXG4gICAgbGlzdDogW1wiR0VUIC9naXN0c1wiXSxcbiAgICBsaXN0Q29tbWVudHM6IFtcIkdFVCAvZ2lzdHMve2dpc3RfaWR9L2NvbW1lbnRzXCJdLFxuICAgIGxpc3RDb21taXRzOiBbXCJHRVQgL2dpc3RzL3tnaXN0X2lkfS9jb21taXRzXCJdLFxuICAgIGxpc3RGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZ2lzdHNcIl0sXG4gICAgbGlzdEZvcmtzOiBbXCJHRVQgL2dpc3RzL3tnaXN0X2lkfS9mb3Jrc1wiXSxcbiAgICBsaXN0UHVibGljOiBbXCJHRVQgL2dpc3RzL3B1YmxpY1wiXSxcbiAgICBsaXN0U3RhcnJlZDogW1wiR0VUIC9naXN0cy9zdGFycmVkXCJdLFxuICAgIHN0YXI6IFtcIlBVVCAvZ2lzdHMve2dpc3RfaWR9L3N0YXJcIl0sXG4gICAgdW5zdGFyOiBbXCJERUxFVEUgL2dpc3RzL3tnaXN0X2lkfS9zdGFyXCJdLFxuICAgIHVwZGF0ZTogW1wiUEFUQ0ggL2dpc3RzL3tnaXN0X2lkfVwiXSxcbiAgICB1cGRhdGVDb21tZW50OiBbXCJQQVRDSCAvZ2lzdHMve2dpc3RfaWR9L2NvbW1lbnRzL3tjb21tZW50X2lkfVwiXVxuICB9LFxuICBnaXQ6IHtcbiAgICBjcmVhdGVCbG9iOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvYmxvYnNcIl0sXG4gICAgY3JlYXRlQ29tbWl0OiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvY29tbWl0c1wiXSxcbiAgICBjcmVhdGVSZWY6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9yZWZzXCJdLFxuICAgIGNyZWF0ZVRhZzogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L3RhZ3NcIl0sXG4gICAgY3JlYXRlVHJlZTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L3RyZWVzXCJdLFxuICAgIGRlbGV0ZVJlZjogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvcmVmcy97cmVmfVwiXSxcbiAgICBnZXRCbG9iOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9ibG9icy97ZmlsZV9zaGF9XCJdLFxuICAgIGdldENvbW1pdDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvY29tbWl0cy97Y29tbWl0X3NoYX1cIl0sXG4gICAgZ2V0UmVmOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9yZWYve3JlZn1cIl0sXG4gICAgZ2V0VGFnOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC90YWdzL3t0YWdfc2hhfVwiXSxcbiAgICBnZXRUcmVlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC90cmVlcy97dHJlZV9zaGF9XCJdLFxuICAgIGxpc3RNYXRjaGluZ1JlZnM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L21hdGNoaW5nLXJlZnMve3JlZn1cIl0sXG4gICAgdXBkYXRlUmVmOiBbXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L3JlZnMve3JlZn1cIl1cbiAgfSxcbiAgZ2l0aWdub3JlOiB7XG4gICAgZ2V0QWxsVGVtcGxhdGVzOiBbXCJHRVQgL2dpdGlnbm9yZS90ZW1wbGF0ZXNcIl0sXG4gICAgZ2V0VGVtcGxhdGU6IFtcIkdFVCAvZ2l0aWdub3JlL3RlbXBsYXRlcy97bmFtZX1cIl1cbiAgfSxcbiAgaW50ZXJhY3Rpb25zOiB7XG4gICAgZ2V0UmVzdHJpY3Rpb25zRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9pbnRlcmFjdGlvbi1saW1pdHNcIl0sXG4gICAgZ2V0UmVzdHJpY3Rpb25zRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vaW50ZXJhY3Rpb24tbGltaXRzXCJdLFxuICAgIGdldFJlc3RyaWN0aW9uc0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaW50ZXJhY3Rpb24tbGltaXRzXCJdLFxuICAgIGdldFJlc3RyaWN0aW9uc0ZvcllvdXJQdWJsaWNSZXBvczogW1xuICAgICAgXCJHRVQgL3VzZXIvaW50ZXJhY3Rpb24tbGltaXRzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1wiaW50ZXJhY3Rpb25zXCIsIFwiZ2V0UmVzdHJpY3Rpb25zRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgcmVtb3ZlUmVzdHJpY3Rpb25zRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkRFTEVURSAvdXNlci9pbnRlcmFjdGlvbi1saW1pdHNcIl0sXG4gICAgcmVtb3ZlUmVzdHJpY3Rpb25zRm9yT3JnOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vaW50ZXJhY3Rpb24tbGltaXRzXCJdLFxuICAgIHJlbW92ZVJlc3RyaWN0aW9uc0ZvclJlcG86IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbnRlcmFjdGlvbi1saW1pdHNcIlxuICAgIF0sXG4gICAgcmVtb3ZlUmVzdHJpY3Rpb25zRm9yWW91clB1YmxpY1JlcG9zOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9pbnRlcmFjdGlvbi1saW1pdHNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJpbnRlcmFjdGlvbnNcIiwgXCJyZW1vdmVSZXN0cmljdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBzZXRSZXN0cmljdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUFVUIC91c2VyL2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICBzZXRSZXN0cmljdGlvbnNGb3JPcmc6IFtcIlBVVCAvb3Jncy97b3JnfS9pbnRlcmFjdGlvbi1saW1pdHNcIl0sXG4gICAgc2V0UmVzdHJpY3Rpb25zRm9yUmVwbzogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbnRlcmFjdGlvbi1saW1pdHNcIl0sXG4gICAgc2V0UmVzdHJpY3Rpb25zRm9yWW91clB1YmxpY1JlcG9zOiBbXG4gICAgICBcIlBVVCAvdXNlci9pbnRlcmFjdGlvbi1saW1pdHNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJpbnRlcmFjdGlvbnNcIiwgXCJzZXRSZXN0cmljdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXVxuICB9LFxuICBpc3N1ZXM6IHtcbiAgICBhZGRBc3NpZ25lZXM6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2Fzc2lnbmVlc1wiXG4gICAgXSxcbiAgICBhZGRMYWJlbHM6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sYWJlbHNcIl0sXG4gICAgY2hlY2tVc2VyQ2FuQmVBc3NpZ25lZDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hc3NpZ25lZXMve2Fzc2lnbmVlfVwiXSxcbiAgICBjaGVja1VzZXJDYW5CZUFzc2lnbmVkVG9Jc3N1ZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9hc3NpZ25lZXMve2Fzc2lnbmVlfVwiXG4gICAgXSxcbiAgICBjcmVhdGU6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlc1wiXSxcbiAgICBjcmVhdGVDb21tZW50OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9jb21tZW50c1wiXG4gICAgXSxcbiAgICBjcmVhdGVMYWJlbDogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzXCJdLFxuICAgIGNyZWF0ZU1pbGVzdG9uZTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbWlsZXN0b25lc1wiXSxcbiAgICBkZWxldGVDb21tZW50OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL2NvbW1lbnRzL3tjb21tZW50X2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVMYWJlbDogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9XCJdLFxuICAgIGRlbGV0ZU1pbGVzdG9uZTogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L21pbGVzdG9uZXMve21pbGVzdG9uZV9udW1iZXJ9XCJcbiAgICBdLFxuICAgIGdldDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn1cIl0sXG4gICAgZ2V0Q29tbWVudDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvY29tbWVudHMve2NvbW1lbnRfaWR9XCJdLFxuICAgIGdldEV2ZW50OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9ldmVudHMve2V2ZW50X2lkfVwiXSxcbiAgICBnZXRMYWJlbDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9XCJdLFxuICAgIGdldE1pbGVzdG9uZTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9taWxlc3RvbmVzL3ttaWxlc3RvbmVfbnVtYmVyfVwiXSxcbiAgICBsaXN0OiBbXCJHRVQgL2lzc3Vlc1wiXSxcbiAgICBsaXN0QXNzaWduZWVzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Fzc2lnbmVlc1wiXSxcbiAgICBsaXN0Q29tbWVudHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2NvbW1lbnRzXCJdLFxuICAgIGxpc3RDb21tZW50c0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL2NvbW1lbnRzXCJdLFxuICAgIGxpc3RFdmVudHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2V2ZW50c1wiXSxcbiAgICBsaXN0RXZlbnRzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvZXZlbnRzXCJdLFxuICAgIGxpc3RFdmVudHNGb3JUaW1lbGluZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS90aW1lbGluZVwiXG4gICAgXSxcbiAgICBsaXN0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9pc3N1ZXNcIl0sXG4gICAgbGlzdEZvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L2lzc3Vlc1wiXSxcbiAgICBsaXN0Rm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXNcIl0sXG4gICAgbGlzdExhYmVsc0Zvck1pbGVzdG9uZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L21pbGVzdG9uZXMve21pbGVzdG9uZV9udW1iZXJ9L2xhYmVsc1wiXG4gICAgXSxcbiAgICBsaXN0TGFiZWxzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHNcIl0sXG4gICAgbGlzdExhYmVsc09uSXNzdWU6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vbGFiZWxzXCJcbiAgICBdLFxuICAgIGxpc3RNaWxlc3RvbmVzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L21pbGVzdG9uZXNcIl0sXG4gICAgbG9jazogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vbG9ja1wiXSxcbiAgICByZW1vdmVBbGxMYWJlbHM6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vbGFiZWxzXCJcbiAgICBdLFxuICAgIHJlbW92ZUFzc2lnbmVlczogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9hc3NpZ25lZXNcIlxuICAgIF0sXG4gICAgcmVtb3ZlTGFiZWw6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vbGFiZWxzL3tuYW1lfVwiXG4gICAgXSxcbiAgICBzZXRMYWJlbHM6IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2xhYmVsc1wiXSxcbiAgICB1bmxvY2s6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2xvY2tcIl0sXG4gICAgdXBkYXRlOiBbXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9XCJdLFxuICAgIHVwZGF0ZUNvbW1lbnQ6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvY29tbWVudHMve2NvbW1lbnRfaWR9XCJdLFxuICAgIHVwZGF0ZUxhYmVsOiBbXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfVwiXSxcbiAgICB1cGRhdGVNaWxlc3RvbmU6IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L21pbGVzdG9uZXMve21pbGVzdG9uZV9udW1iZXJ9XCJcbiAgICBdXG4gIH0sXG4gIGxpY2Vuc2VzOiB7XG4gICAgZ2V0OiBbXCJHRVQgL2xpY2Vuc2VzL3tsaWNlbnNlfVwiXSxcbiAgICBnZXRBbGxDb21tb25seVVzZWQ6IFtcIkdFVCAvbGljZW5zZXNcIl0sXG4gICAgZ2V0Rm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9saWNlbnNlXCJdXG4gIH0sXG4gIG1hcmtkb3duOiB7XG4gICAgcmVuZGVyOiBbXCJQT1NUIC9tYXJrZG93blwiXSxcbiAgICByZW5kZXJSYXc6IFtcbiAgICAgIFwiUE9TVCAvbWFya2Rvd24vcmF3XCIsXG4gICAgICB7IGhlYWRlcnM6IHsgXCJjb250ZW50LXR5cGVcIjogXCJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04XCIgfSB9XG4gICAgXVxuICB9LFxuICBtZXRhOiB7XG4gICAgZ2V0OiBbXCJHRVQgL21ldGFcIl0sXG4gICAgZ2V0QWxsVmVyc2lvbnM6IFtcIkdFVCAvdmVyc2lvbnNcIl0sXG4gICAgZ2V0T2N0b2NhdDogW1wiR0VUIC9vY3RvY2F0XCJdLFxuICAgIGdldFplbjogW1wiR0VUIC96ZW5cIl0sXG4gICAgcm9vdDogW1wiR0VUIC9cIl1cbiAgfSxcbiAgbWlncmF0aW9uczoge1xuICAgIGNhbmNlbEltcG9ydDogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ltcG9ydFwiLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGRlcHJlY2F0ZWQ6IFwib2N0b2tpdC5yZXN0Lm1pZ3JhdGlvbnMuY2FuY2VsSW1wb3J0KCkgaXMgZGVwcmVjYXRlZCwgc2VlIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL3Jlc3QvbWlncmF0aW9ucy9zb3VyY2UtaW1wb3J0cyNjYW5jZWwtYW4taW1wb3J0XCJcbiAgICAgIH1cbiAgICBdLFxuICAgIGRlbGV0ZUFyY2hpdmVGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9hcmNoaXZlXCJcbiAgICBdLFxuICAgIGRlbGV0ZUFyY2hpdmVGb3JPcmc6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH0vYXJjaGl2ZVwiXG4gICAgXSxcbiAgICBkb3dubG9hZEFyY2hpdmVGb3JPcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH0vYXJjaGl2ZVwiXG4gICAgXSxcbiAgICBnZXRBcmNoaXZlRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2VyL21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH0vYXJjaGl2ZVwiXG4gICAgXSxcbiAgICBnZXRDb21taXRBdXRob3JzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaW1wb3J0L2F1dGhvcnNcIixcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBkZXByZWNhdGVkOiBcIm9jdG9raXQucmVzdC5taWdyYXRpb25zLmdldENvbW1pdEF1dGhvcnMoKSBpcyBkZXByZWNhdGVkLCBzZWUgaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vcmVzdC9taWdyYXRpb25zL3NvdXJjZS1pbXBvcnRzI2dldC1jb21taXQtYXV0aG9yc1wiXG4gICAgICB9XG4gICAgXSxcbiAgICBnZXRJbXBvcnRTdGF0dXM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbXBvcnRcIixcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBkZXByZWNhdGVkOiBcIm9jdG9raXQucmVzdC5taWdyYXRpb25zLmdldEltcG9ydFN0YXR1cygpIGlzIGRlcHJlY2F0ZWQsIHNlZSBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9yZXN0L21pZ3JhdGlvbnMvc291cmNlLWltcG9ydHMjZ2V0LWFuLWltcG9ydC1zdGF0dXNcIlxuICAgICAgfVxuICAgIF0sXG4gICAgZ2V0TGFyZ2VGaWxlczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ltcG9ydC9sYXJnZV9maWxlc1wiLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGRlcHJlY2F0ZWQ6IFwib2N0b2tpdC5yZXN0Lm1pZ3JhdGlvbnMuZ2V0TGFyZ2VGaWxlcygpIGlzIGRlcHJlY2F0ZWQsIHNlZSBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9yZXN0L21pZ3JhdGlvbnMvc291cmNlLWltcG9ydHMjZ2V0LWxhcmdlLWZpbGVzXCJcbiAgICAgIH1cbiAgICBdLFxuICAgIGdldFN0YXR1c0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfVwiXSxcbiAgICBnZXRTdGF0dXNGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9taWdyYXRpb25zL3ttaWdyYXRpb25faWR9XCJdLFxuICAgIGxpc3RGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL21pZ3JhdGlvbnNcIl0sXG4gICAgbGlzdEZvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L21pZ3JhdGlvbnNcIl0sXG4gICAgbGlzdFJlcG9zRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2VyL21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH0vcmVwb3NpdG9yaWVzXCJcbiAgICBdLFxuICAgIGxpc3RSZXBvc0Zvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH0vcmVwb3NpdG9yaWVzXCJdLFxuICAgIGxpc3RSZXBvc0ZvclVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2VyL21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH0vcmVwb3NpdG9yaWVzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1wibWlncmF0aW9uc1wiLCBcImxpc3RSZXBvc0ZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIG1hcENvbW1pdEF1dGhvcjogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vaW1wb3J0L2F1dGhvcnMve2F1dGhvcl9pZH1cIixcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBkZXByZWNhdGVkOiBcIm9jdG9raXQucmVzdC5taWdyYXRpb25zLm1hcENvbW1pdEF1dGhvcigpIGlzIGRlcHJlY2F0ZWQsIHNlZSBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9yZXN0L21pZ3JhdGlvbnMvc291cmNlLWltcG9ydHMjbWFwLWEtY29tbWl0LWF1dGhvclwiXG4gICAgICB9XG4gICAgXSxcbiAgICBzZXRMZnNQcmVmZXJlbmNlOiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbXBvcnQvbGZzXCIsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgZGVwcmVjYXRlZDogXCJvY3Rva2l0LnJlc3QubWlncmF0aW9ucy5zZXRMZnNQcmVmZXJlbmNlKCkgaXMgZGVwcmVjYXRlZCwgc2VlIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL3Jlc3QvbWlncmF0aW9ucy9zb3VyY2UtaW1wb3J0cyN1cGRhdGUtZ2l0LWxmcy1wcmVmZXJlbmNlXCJcbiAgICAgIH1cbiAgICBdLFxuICAgIHN0YXJ0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBPU1QgL3VzZXIvbWlncmF0aW9uc1wiXSxcbiAgICBzdGFydEZvck9yZzogW1wiUE9TVCAvb3Jncy97b3JnfS9taWdyYXRpb25zXCJdLFxuICAgIHN0YXJ0SW1wb3J0OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vaW1wb3J0XCIsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgZGVwcmVjYXRlZDogXCJvY3Rva2l0LnJlc3QubWlncmF0aW9ucy5zdGFydEltcG9ydCgpIGlzIGRlcHJlY2F0ZWQsIHNlZSBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9yZXN0L21pZ3JhdGlvbnMvc291cmNlLWltcG9ydHMjc3RhcnQtYW4taW1wb3J0XCJcbiAgICAgIH1cbiAgICBdLFxuICAgIHVubG9ja1JlcG9Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvcy97cmVwb19uYW1lfS9sb2NrXCJcbiAgICBdLFxuICAgIHVubG9ja1JlcG9Gb3JPcmc6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH0vcmVwb3Mve3JlcG9fbmFtZX0vbG9ja1wiXG4gICAgXSxcbiAgICB1cGRhdGVJbXBvcnQ6IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2ltcG9ydFwiLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGRlcHJlY2F0ZWQ6IFwib2N0b2tpdC5yZXN0Lm1pZ3JhdGlvbnMudXBkYXRlSW1wb3J0KCkgaXMgZGVwcmVjYXRlZCwgc2VlIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL3Jlc3QvbWlncmF0aW9ucy9zb3VyY2UtaW1wb3J0cyN1cGRhdGUtYW4taW1wb3J0XCJcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIG9pZGM6IHtcbiAgICBnZXRPaWRjQ3VzdG9tU3ViVGVtcGxhdGVGb3JPcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvb2lkYy9jdXN0b21pemF0aW9uL3N1YlwiXG4gICAgXSxcbiAgICB1cGRhdGVPaWRjQ3VzdG9tU3ViVGVtcGxhdGVGb3JPcmc6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvb2lkYy9jdXN0b21pemF0aW9uL3N1YlwiXG4gICAgXVxuICB9LFxuICBvcmdzOiB7XG4gICAgYWRkU2VjdXJpdHlNYW5hZ2VyVGVhbTogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vc2VjdXJpdHktbWFuYWdlcnMvdGVhbXMve3RlYW1fc2x1Z31cIlxuICAgIF0sXG4gICAgYXNzaWduVGVhbVRvT3JnUm9sZTogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vb3JnYW5pemF0aW9uLXJvbGVzL3RlYW1zL3t0ZWFtX3NsdWd9L3tyb2xlX2lkfVwiXG4gICAgXSxcbiAgICBhc3NpZ25Vc2VyVG9PcmdSb2xlOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9vcmdhbml6YXRpb24tcm9sZXMvdXNlcnMve3VzZXJuYW1lfS97cm9sZV9pZH1cIlxuICAgIF0sXG4gICAgYmxvY2tVc2VyOiBbXCJQVVQgL29yZ3Mve29yZ30vYmxvY2tzL3t1c2VybmFtZX1cIl0sXG4gICAgY2FuY2VsSW52aXRhdGlvbjogW1wiREVMRVRFIC9vcmdzL3tvcmd9L2ludml0YXRpb25zL3tpbnZpdGF0aW9uX2lkfVwiXSxcbiAgICBjaGVja0Jsb2NrZWRVc2VyOiBbXCJHRVQgL29yZ3Mve29yZ30vYmxvY2tzL3t1c2VybmFtZX1cIl0sXG4gICAgY2hlY2tNZW1iZXJzaGlwRm9yVXNlcjogW1wiR0VUIC9vcmdzL3tvcmd9L21lbWJlcnMve3VzZXJuYW1lfVwiXSxcbiAgICBjaGVja1B1YmxpY01lbWJlcnNoaXBGb3JVc2VyOiBbXCJHRVQgL29yZ3Mve29yZ30vcHVibGljX21lbWJlcnMve3VzZXJuYW1lfVwiXSxcbiAgICBjb252ZXJ0TWVtYmVyVG9PdXRzaWRlQ29sbGFib3JhdG9yOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9vdXRzaWRlX2NvbGxhYm9yYXRvcnMve3VzZXJuYW1lfVwiXG4gICAgXSxcbiAgICBjcmVhdGVDdXN0b21Pcmdhbml6YXRpb25Sb2xlOiBbXCJQT1NUIC9vcmdzL3tvcmd9L29yZ2FuaXphdGlvbi1yb2xlc1wiXSxcbiAgICBjcmVhdGVJbnZpdGF0aW9uOiBbXCJQT1NUIC9vcmdzL3tvcmd9L2ludml0YXRpb25zXCJdLFxuICAgIGNyZWF0ZU9yVXBkYXRlQ3VzdG9tUHJvcGVydGllczogW1wiUEFUQ0ggL29yZ3Mve29yZ30vcHJvcGVydGllcy9zY2hlbWFcIl0sXG4gICAgY3JlYXRlT3JVcGRhdGVDdXN0b21Qcm9wZXJ0aWVzVmFsdWVzRm9yUmVwb3M6IFtcbiAgICAgIFwiUEFUQ0ggL29yZ3Mve29yZ30vcHJvcGVydGllcy92YWx1ZXNcIlxuICAgIF0sXG4gICAgY3JlYXRlT3JVcGRhdGVDdXN0b21Qcm9wZXJ0eTogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vcHJvcGVydGllcy9zY2hlbWEve2N1c3RvbV9wcm9wZXJ0eV9uYW1lfVwiXG4gICAgXSxcbiAgICBjcmVhdGVXZWJob29rOiBbXCJQT1NUIC9vcmdzL3tvcmd9L2hvb2tzXCJdLFxuICAgIGRlbGV0ZTogW1wiREVMRVRFIC9vcmdzL3tvcmd9XCJdLFxuICAgIGRlbGV0ZUN1c3RvbU9yZ2FuaXphdGlvblJvbGU6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L29yZ2FuaXphdGlvbi1yb2xlcy97cm9sZV9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlV2ViaG9vazogW1wiREVMRVRFIC9vcmdzL3tvcmd9L2hvb2tzL3tob29rX2lkfVwiXSxcbiAgICBlbmFibGVPckRpc2FibGVTZWN1cml0eVByb2R1Y3RPbkFsbE9yZ1JlcG9zOiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30ve3NlY3VyaXR5X3Byb2R1Y3R9L3tlbmFibGVtZW50fVwiXG4gICAgXSxcbiAgICBnZXQ6IFtcIkdFVCAvb3Jncy97b3JnfVwiXSxcbiAgICBnZXRBbGxDdXN0b21Qcm9wZXJ0aWVzOiBbXCJHRVQgL29yZ3Mve29yZ30vcHJvcGVydGllcy9zY2hlbWFcIl0sXG4gICAgZ2V0Q3VzdG9tUHJvcGVydHk6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3Byb3BlcnRpZXMvc2NoZW1hL3tjdXN0b21fcHJvcGVydHlfbmFtZX1cIlxuICAgIF0sXG4gICAgZ2V0TWVtYmVyc2hpcEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvbWVtYmVyc2hpcHMvb3Jncy97b3JnfVwiXSxcbiAgICBnZXRNZW1iZXJzaGlwRm9yVXNlcjogW1wiR0VUIC9vcmdzL3tvcmd9L21lbWJlcnNoaXBzL3t1c2VybmFtZX1cIl0sXG4gICAgZ2V0T3JnUm9sZTogW1wiR0VUIC9vcmdzL3tvcmd9L29yZ2FuaXphdGlvbi1yb2xlcy97cm9sZV9pZH1cIl0sXG4gICAgZ2V0V2ViaG9vazogW1wiR0VUIC9vcmdzL3tvcmd9L2hvb2tzL3tob29rX2lkfVwiXSxcbiAgICBnZXRXZWJob29rQ29uZmlnRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9L2NvbmZpZ1wiXSxcbiAgICBnZXRXZWJob29rRGVsaXZlcnk6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2hvb2tzL3tob29rX2lkfS9kZWxpdmVyaWVzL3tkZWxpdmVyeV9pZH1cIlxuICAgIF0sXG4gICAgbGlzdDogW1wiR0VUIC9vcmdhbml6YXRpb25zXCJdLFxuICAgIGxpc3RBcHBJbnN0YWxsYXRpb25zOiBbXCJHRVQgL29yZ3Mve29yZ30vaW5zdGFsbGF0aW9uc1wiXSxcbiAgICBsaXN0QmxvY2tlZFVzZXJzOiBbXCJHRVQgL29yZ3Mve29yZ30vYmxvY2tzXCJdLFxuICAgIGxpc3RDdXN0b21Qcm9wZXJ0aWVzVmFsdWVzRm9yUmVwb3M6IFtcIkdFVCAvb3Jncy97b3JnfS9wcm9wZXJ0aWVzL3ZhbHVlc1wiXSxcbiAgICBsaXN0RmFpbGVkSW52aXRhdGlvbnM6IFtcIkdFVCAvb3Jncy97b3JnfS9mYWlsZWRfaW52aXRhdGlvbnNcIl0sXG4gICAgbGlzdEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvb3Jnc1wiXSxcbiAgICBsaXN0Rm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L29yZ3NcIl0sXG4gICAgbGlzdEludml0YXRpb25UZWFtczogW1wiR0VUIC9vcmdzL3tvcmd9L2ludml0YXRpb25zL3tpbnZpdGF0aW9uX2lkfS90ZWFtc1wiXSxcbiAgICBsaXN0TWVtYmVyczogW1wiR0VUIC9vcmdzL3tvcmd9L21lbWJlcnNcIl0sXG4gICAgbGlzdE1lbWJlcnNoaXBzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9tZW1iZXJzaGlwcy9vcmdzXCJdLFxuICAgIGxpc3RPcmdSb2xlVGVhbXM6IFtcIkdFVCAvb3Jncy97b3JnfS9vcmdhbml6YXRpb24tcm9sZXMve3JvbGVfaWR9L3RlYW1zXCJdLFxuICAgIGxpc3RPcmdSb2xlVXNlcnM6IFtcIkdFVCAvb3Jncy97b3JnfS9vcmdhbml6YXRpb24tcm9sZXMve3JvbGVfaWR9L3VzZXJzXCJdLFxuICAgIGxpc3RPcmdSb2xlczogW1wiR0VUIC9vcmdzL3tvcmd9L29yZ2FuaXphdGlvbi1yb2xlc1wiXSxcbiAgICBsaXN0T3JnYW5pemF0aW9uRmluZUdyYWluZWRQZXJtaXNzaW9uczogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vb3JnYW5pemF0aW9uLWZpbmUtZ3JhaW5lZC1wZXJtaXNzaW9uc1wiXG4gICAgXSxcbiAgICBsaXN0T3V0c2lkZUNvbGxhYm9yYXRvcnM6IFtcIkdFVCAvb3Jncy97b3JnfS9vdXRzaWRlX2NvbGxhYm9yYXRvcnNcIl0sXG4gICAgbGlzdFBhdEdyYW50UmVwb3NpdG9yaWVzOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9wZXJzb25hbC1hY2Nlc3MtdG9rZW5zL3twYXRfaWR9L3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICBsaXN0UGF0R3JhbnRSZXF1ZXN0UmVwb3NpdG9yaWVzOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9wZXJzb25hbC1hY2Nlc3MtdG9rZW4tcmVxdWVzdHMve3BhdF9yZXF1ZXN0X2lkfS9yZXBvc2l0b3JpZXNcIlxuICAgIF0sXG4gICAgbGlzdFBhdEdyYW50UmVxdWVzdHM6IFtcIkdFVCAvb3Jncy97b3JnfS9wZXJzb25hbC1hY2Nlc3MtdG9rZW4tcmVxdWVzdHNcIl0sXG4gICAgbGlzdFBhdEdyYW50czogW1wiR0VUIC9vcmdzL3tvcmd9L3BlcnNvbmFsLWFjY2Vzcy10b2tlbnNcIl0sXG4gICAgbGlzdFBlbmRpbmdJbnZpdGF0aW9uczogW1wiR0VUIC9vcmdzL3tvcmd9L2ludml0YXRpb25zXCJdLFxuICAgIGxpc3RQdWJsaWNNZW1iZXJzOiBbXCJHRVQgL29yZ3Mve29yZ30vcHVibGljX21lbWJlcnNcIl0sXG4gICAgbGlzdFNlY3VyaXR5TWFuYWdlclRlYW1zOiBbXCJHRVQgL29yZ3Mve29yZ30vc2VjdXJpdHktbWFuYWdlcnNcIl0sXG4gICAgbGlzdFdlYmhvb2tEZWxpdmVyaWVzOiBbXCJHRVQgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9L2RlbGl2ZXJpZXNcIl0sXG4gICAgbGlzdFdlYmhvb2tzOiBbXCJHRVQgL29yZ3Mve29yZ30vaG9va3NcIl0sXG4gICAgcGF0Y2hDdXN0b21Pcmdhbml6YXRpb25Sb2xlOiBbXG4gICAgICBcIlBBVENIIC9vcmdzL3tvcmd9L29yZ2FuaXphdGlvbi1yb2xlcy97cm9sZV9pZH1cIlxuICAgIF0sXG4gICAgcGluZ1dlYmhvb2s6IFtcIlBPU1QgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9L3BpbmdzXCJdLFxuICAgIHJlZGVsaXZlcldlYmhvb2tEZWxpdmVyeTogW1xuICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L2hvb2tzL3tob29rX2lkfS9kZWxpdmVyaWVzL3tkZWxpdmVyeV9pZH0vYXR0ZW1wdHNcIlxuICAgIF0sXG4gICAgcmVtb3ZlQ3VzdG9tUHJvcGVydHk6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L3Byb3BlcnRpZXMvc2NoZW1hL3tjdXN0b21fcHJvcGVydHlfbmFtZX1cIlxuICAgIF0sXG4gICAgcmVtb3ZlTWVtYmVyOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vbWVtYmVycy97dXNlcm5hbWV9XCJdLFxuICAgIHJlbW92ZU1lbWJlcnNoaXBGb3JVc2VyOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vbWVtYmVyc2hpcHMve3VzZXJuYW1lfVwiXSxcbiAgICByZW1vdmVPdXRzaWRlQ29sbGFib3JhdG9yOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9vdXRzaWRlX2NvbGxhYm9yYXRvcnMve3VzZXJuYW1lfVwiXG4gICAgXSxcbiAgICByZW1vdmVQdWJsaWNNZW1iZXJzaGlwRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L3B1YmxpY19tZW1iZXJzL3t1c2VybmFtZX1cIlxuICAgIF0sXG4gICAgcmVtb3ZlU2VjdXJpdHlNYW5hZ2VyVGVhbTogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vc2VjdXJpdHktbWFuYWdlcnMvdGVhbXMve3RlYW1fc2x1Z31cIlxuICAgIF0sXG4gICAgcmV2aWV3UGF0R3JhbnRSZXF1ZXN0OiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30vcGVyc29uYWwtYWNjZXNzLXRva2VuLXJlcXVlc3RzL3twYXRfcmVxdWVzdF9pZH1cIlxuICAgIF0sXG4gICAgcmV2aWV3UGF0R3JhbnRSZXF1ZXN0c0luQnVsazogW1xuICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L3BlcnNvbmFsLWFjY2Vzcy10b2tlbi1yZXF1ZXN0c1wiXG4gICAgXSxcbiAgICByZXZva2VBbGxPcmdSb2xlc1RlYW06IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L29yZ2FuaXphdGlvbi1yb2xlcy90ZWFtcy97dGVhbV9zbHVnfVwiXG4gICAgXSxcbiAgICByZXZva2VBbGxPcmdSb2xlc1VzZXI6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L29yZ2FuaXphdGlvbi1yb2xlcy91c2Vycy97dXNlcm5hbWV9XCJcbiAgICBdLFxuICAgIHJldm9rZU9yZ1JvbGVUZWFtOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9vcmdhbml6YXRpb24tcm9sZXMvdGVhbXMve3RlYW1fc2x1Z30ve3JvbGVfaWR9XCJcbiAgICBdLFxuICAgIHJldm9rZU9yZ1JvbGVVc2VyOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9vcmdhbml6YXRpb24tcm9sZXMvdXNlcnMve3VzZXJuYW1lfS97cm9sZV9pZH1cIlxuICAgIF0sXG4gICAgc2V0TWVtYmVyc2hpcEZvclVzZXI6IFtcIlBVVCAvb3Jncy97b3JnfS9tZW1iZXJzaGlwcy97dXNlcm5hbWV9XCJdLFxuICAgIHNldFB1YmxpY01lbWJlcnNoaXBGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vcHVibGljX21lbWJlcnMve3VzZXJuYW1lfVwiXG4gICAgXSxcbiAgICB1bmJsb2NrVXNlcjogW1wiREVMRVRFIC9vcmdzL3tvcmd9L2Jsb2Nrcy97dXNlcm5hbWV9XCJdLFxuICAgIHVwZGF0ZTogW1wiUEFUQ0ggL29yZ3Mve29yZ31cIl0sXG4gICAgdXBkYXRlTWVtYmVyc2hpcEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIlBBVENIIC91c2VyL21lbWJlcnNoaXBzL29yZ3Mve29yZ31cIlxuICAgIF0sXG4gICAgdXBkYXRlUGF0QWNjZXNzOiBbXCJQT1NUIC9vcmdzL3tvcmd9L3BlcnNvbmFsLWFjY2Vzcy10b2tlbnMve3BhdF9pZH1cIl0sXG4gICAgdXBkYXRlUGF0QWNjZXNzZXM6IFtcIlBPU1QgL29yZ3Mve29yZ30vcGVyc29uYWwtYWNjZXNzLXRva2Vuc1wiXSxcbiAgICB1cGRhdGVXZWJob29rOiBbXCJQQVRDSCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH1cIl0sXG4gICAgdXBkYXRlV2ViaG9va0NvbmZpZ0Zvck9yZzogW1wiUEFUQ0ggL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9L2NvbmZpZ1wiXVxuICB9LFxuICBwYWNrYWdlczoge1xuICAgIGRlbGV0ZVBhY2thZ2VGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX1cIlxuICAgIF0sXG4gICAgZGVsZXRlUGFja2FnZUZvck9yZzogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX1cIlxuICAgIF0sXG4gICAgZGVsZXRlUGFja2FnZUZvclVzZXI6IFtcbiAgICAgIFwiREVMRVRFIC91c2Vycy97dXNlcm5hbWV9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9XCJcbiAgICBdLFxuICAgIGRlbGV0ZVBhY2thZ2VWZXJzaW9uRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiREVMRVRFIC91c2VyL3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zL3twYWNrYWdlX3ZlcnNpb25faWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZVBhY2thZ2VWZXJzaW9uRm9yT3JnOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9ucy97cGFja2FnZV92ZXJzaW9uX2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVQYWNrYWdlVmVyc2lvbkZvclVzZXI6IFtcbiAgICAgIFwiREVMRVRFIC91c2Vycy97dXNlcm5hbWV9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zL3twYWNrYWdlX3ZlcnNpb25faWR9XCJcbiAgICBdLFxuICAgIGdldEFsbFBhY2thZ2VWZXJzaW9uc0ZvckFQYWNrYWdlT3duZWRCeUFuT3JnOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9uc1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInBhY2thZ2VzXCIsIFwiZ2V0QWxsUGFja2FnZVZlcnNpb25zRm9yUGFja2FnZU93bmVkQnlPcmdcIl0gfVxuICAgIF0sXG4gICAgZ2V0QWxsUGFja2FnZVZlcnNpb25zRm9yQVBhY2thZ2VPd25lZEJ5VGhlQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2VyL3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zXCIsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgcmVuYW1lZDogW1xuICAgICAgICAgIFwicGFja2FnZXNcIixcbiAgICAgICAgICBcImdldEFsbFBhY2thZ2VWZXJzaW9uc0ZvclBhY2thZ2VPd25lZEJ5QXV0aGVudGljYXRlZFVzZXJcIlxuICAgICAgICBdXG4gICAgICB9XG4gICAgXSxcbiAgICBnZXRBbGxQYWNrYWdlVmVyc2lvbnNGb3JQYWNrYWdlT3duZWRCeUF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlci9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9uc1wiXG4gICAgXSxcbiAgICBnZXRBbGxQYWNrYWdlVmVyc2lvbnNGb3JQYWNrYWdlT3duZWRCeU9yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnNcIlxuICAgIF0sXG4gICAgZ2V0QWxsUGFja2FnZVZlcnNpb25zRm9yUGFja2FnZU93bmVkQnlVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9uc1wiXG4gICAgXSxcbiAgICBnZXRQYWNrYWdlRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2VyL3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9XCJcbiAgICBdLFxuICAgIGdldFBhY2thZ2VGb3JPcmdhbml6YXRpb246IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9XCJcbiAgICBdLFxuICAgIGdldFBhY2thZ2VGb3JVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfVwiXG4gICAgXSxcbiAgICBnZXRQYWNrYWdlVmVyc2lvbkZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlci9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9ucy97cGFja2FnZV92ZXJzaW9uX2lkfVwiXG4gICAgXSxcbiAgICBnZXRQYWNrYWdlVmVyc2lvbkZvck9yZ2FuaXphdGlvbjogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnMve3BhY2thZ2VfdmVyc2lvbl9pZH1cIlxuICAgIF0sXG4gICAgZ2V0UGFja2FnZVZlcnNpb25Gb3JVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9ucy97cGFja2FnZV92ZXJzaW9uX2lkfVwiXG4gICAgXSxcbiAgICBsaXN0RG9ja2VyTWlncmF0aW9uQ29uZmxpY3RpbmdQYWNrYWdlc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlci9kb2NrZXIvY29uZmxpY3RzXCJcbiAgICBdLFxuICAgIGxpc3REb2NrZXJNaWdyYXRpb25Db25mbGljdGluZ1BhY2thZ2VzRm9yT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9kb2NrZXIvY29uZmxpY3RzXCJcbiAgICBdLFxuICAgIGxpc3REb2NrZXJNaWdyYXRpb25Db25mbGljdGluZ1BhY2thZ2VzRm9yVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZG9ja2VyL2NvbmZsaWN0c1wiXG4gICAgXSxcbiAgICBsaXN0UGFja2FnZXNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3BhY2thZ2VzXCJdLFxuICAgIGxpc3RQYWNrYWdlc0Zvck9yZ2FuaXphdGlvbjogW1wiR0VUIC9vcmdzL3tvcmd9L3BhY2thZ2VzXCJdLFxuICAgIGxpc3RQYWNrYWdlc0ZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9wYWNrYWdlc1wiXSxcbiAgICByZXN0b3JlUGFja2FnZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIlBPU1QgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vcmVzdG9yZXs/dG9rZW59XCJcbiAgICBdLFxuICAgIHJlc3RvcmVQYWNrYWdlRm9yT3JnOiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vcmVzdG9yZXs/dG9rZW59XCJcbiAgICBdLFxuICAgIHJlc3RvcmVQYWNrYWdlRm9yVXNlcjogW1xuICAgICAgXCJQT1NUIC91c2Vycy97dXNlcm5hbWV9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3Jlc3RvcmV7P3Rva2VufVwiXG4gICAgXSxcbiAgICByZXN0b3JlUGFja2FnZVZlcnNpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJQT1NUIC91c2VyL3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zL3twYWNrYWdlX3ZlcnNpb25faWR9L3Jlc3RvcmVcIlxuICAgIF0sXG4gICAgcmVzdG9yZVBhY2thZ2VWZXJzaW9uRm9yT3JnOiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnMve3BhY2thZ2VfdmVyc2lvbl9pZH0vcmVzdG9yZVwiXG4gICAgXSxcbiAgICByZXN0b3JlUGFja2FnZVZlcnNpb25Gb3JVc2VyOiBbXG4gICAgICBcIlBPU1QgL3VzZXJzL3t1c2VybmFtZX0vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnMve3BhY2thZ2VfdmVyc2lvbl9pZH0vcmVzdG9yZVwiXG4gICAgXVxuICB9LFxuICBwcm9qZWN0czoge1xuICAgIGFkZENvbGxhYm9yYXRvcjogW1wiUFVUIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sbGFib3JhdG9ycy97dXNlcm5hbWV9XCJdLFxuICAgIGNyZWF0ZUNhcmQ6IFtcIlBPU1QgL3Byb2plY3RzL2NvbHVtbnMve2NvbHVtbl9pZH0vY2FyZHNcIl0sXG4gICAgY3JlYXRlQ29sdW1uOiBbXCJQT1NUIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sdW1uc1wiXSxcbiAgICBjcmVhdGVGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9wcm9qZWN0c1wiXSxcbiAgICBjcmVhdGVGb3JPcmc6IFtcIlBPU1QgL29yZ3Mve29yZ30vcHJvamVjdHNcIl0sXG4gICAgY3JlYXRlRm9yUmVwbzogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHJvamVjdHNcIl0sXG4gICAgZGVsZXRlOiBbXCJERUxFVEUgL3Byb2plY3RzL3twcm9qZWN0X2lkfVwiXSxcbiAgICBkZWxldGVDYXJkOiBbXCJERUxFVEUgL3Byb2plY3RzL2NvbHVtbnMvY2FyZHMve2NhcmRfaWR9XCJdLFxuICAgIGRlbGV0ZUNvbHVtbjogW1wiREVMRVRFIC9wcm9qZWN0cy9jb2x1bW5zL3tjb2x1bW5faWR9XCJdLFxuICAgIGdldDogW1wiR0VUIC9wcm9qZWN0cy97cHJvamVjdF9pZH1cIl0sXG4gICAgZ2V0Q2FyZDogW1wiR0VUIC9wcm9qZWN0cy9jb2x1bW5zL2NhcmRzL3tjYXJkX2lkfVwiXSxcbiAgICBnZXRDb2x1bW46IFtcIkdFVCAvcHJvamVjdHMvY29sdW1ucy97Y29sdW1uX2lkfVwiXSxcbiAgICBnZXRQZXJtaXNzaW9uRm9yVXNlcjogW1xuICAgICAgXCJHRVQgL3Byb2plY3RzL3twcm9qZWN0X2lkfS9jb2xsYWJvcmF0b3JzL3t1c2VybmFtZX0vcGVybWlzc2lvblwiXG4gICAgXSxcbiAgICBsaXN0Q2FyZHM6IFtcIkdFVCAvcHJvamVjdHMvY29sdW1ucy97Y29sdW1uX2lkfS9jYXJkc1wiXSxcbiAgICBsaXN0Q29sbGFib3JhdG9yczogW1wiR0VUIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sbGFib3JhdG9yc1wiXSxcbiAgICBsaXN0Q29sdW1uczogW1wiR0VUIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sdW1uc1wiXSxcbiAgICBsaXN0Rm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vcHJvamVjdHNcIl0sXG4gICAgbGlzdEZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHJvamVjdHNcIl0sXG4gICAgbGlzdEZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9wcm9qZWN0c1wiXSxcbiAgICBtb3ZlQ2FyZDogW1wiUE9TVCAvcHJvamVjdHMvY29sdW1ucy9jYXJkcy97Y2FyZF9pZH0vbW92ZXNcIl0sXG4gICAgbW92ZUNvbHVtbjogW1wiUE9TVCAvcHJvamVjdHMvY29sdW1ucy97Y29sdW1uX2lkfS9tb3Zlc1wiXSxcbiAgICByZW1vdmVDb2xsYWJvcmF0b3I6IFtcbiAgICAgIFwiREVMRVRFIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sbGFib3JhdG9ycy97dXNlcm5hbWV9XCJcbiAgICBdLFxuICAgIHVwZGF0ZTogW1wiUEFUQ0ggL3Byb2plY3RzL3twcm9qZWN0X2lkfVwiXSxcbiAgICB1cGRhdGVDYXJkOiBbXCJQQVRDSCAvcHJvamVjdHMvY29sdW1ucy9jYXJkcy97Y2FyZF9pZH1cIl0sXG4gICAgdXBkYXRlQ29sdW1uOiBbXCJQQVRDSCAvcHJvamVjdHMvY29sdW1ucy97Y29sdW1uX2lkfVwiXVxuICB9LFxuICBwdWxsczoge1xuICAgIGNoZWNrSWZNZXJnZWQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9tZXJnZVwiXSxcbiAgICBjcmVhdGU6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzXCJdLFxuICAgIGNyZWF0ZVJlcGx5Rm9yUmV2aWV3Q29tbWVudDogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X2lkfS9yZXBsaWVzXCJcbiAgICBdLFxuICAgIGNyZWF0ZVJldmlldzogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzXCJdLFxuICAgIGNyZWF0ZVJldmlld0NvbW1lbnQ6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9jb21tZW50c1wiXG4gICAgXSxcbiAgICBkZWxldGVQZW5kaW5nUmV2aWV3OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzL3tyZXZpZXdfaWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZVJldmlld0NvbW1lbnQ6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy9jb21tZW50cy97Y29tbWVudF9pZH1cIlxuICAgIF0sXG4gICAgZGlzbWlzc1JldmlldzogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmV2aWV3cy97cmV2aWV3X2lkfS9kaXNtaXNzYWxzXCJcbiAgICBdLFxuICAgIGdldDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9XCJdLFxuICAgIGdldFJldmlldzogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmV2aWV3cy97cmV2aWV3X2lkfVwiXG4gICAgXSxcbiAgICBnZXRSZXZpZXdDb21tZW50OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL2NvbW1lbnRzL3tjb21tZW50X2lkfVwiXSxcbiAgICBsaXN0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzXCJdLFxuICAgIGxpc3RDb21tZW50c0ZvclJldmlldzogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmV2aWV3cy97cmV2aWV3X2lkfS9jb21tZW50c1wiXG4gICAgXSxcbiAgICBsaXN0Q29tbWl0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvbW1pdHNcIl0sXG4gICAgbGlzdEZpbGVzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vZmlsZXNcIl0sXG4gICAgbGlzdFJlcXVlc3RlZFJldmlld2VyczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmVxdWVzdGVkX3Jldmlld2Vyc1wiXG4gICAgXSxcbiAgICBsaXN0UmV2aWV3Q29tbWVudHM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvbW1lbnRzXCJcbiAgICBdLFxuICAgIGxpc3RSZXZpZXdDb21tZW50c0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHNcIl0sXG4gICAgbGlzdFJldmlld3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzXCJdLFxuICAgIG1lcmdlOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vbWVyZ2VcIl0sXG4gICAgcmVtb3ZlUmVxdWVzdGVkUmV2aWV3ZXJzOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXF1ZXN0ZWRfcmV2aWV3ZXJzXCJcbiAgICBdLFxuICAgIHJlcXVlc3RSZXZpZXdlcnM6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXF1ZXN0ZWRfcmV2aWV3ZXJzXCJcbiAgICBdLFxuICAgIHN1Ym1pdFJldmlldzogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3Jldmlld3Mve3Jldmlld19pZH0vZXZlbnRzXCJcbiAgICBdLFxuICAgIHVwZGF0ZTogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn1cIl0sXG4gICAgdXBkYXRlQnJhbmNoOiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS91cGRhdGUtYnJhbmNoXCJcbiAgICBdLFxuICAgIHVwZGF0ZVJldmlldzogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmV2aWV3cy97cmV2aWV3X2lkfVwiXG4gICAgXSxcbiAgICB1cGRhdGVSZXZpZXdDb21tZW50OiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy9jb21tZW50cy97Y29tbWVudF9pZH1cIlxuICAgIF1cbiAgfSxcbiAgcmF0ZUxpbWl0OiB7IGdldDogW1wiR0VUIC9yYXRlX2xpbWl0XCJdIH0sXG4gIHJlYWN0aW9uczoge1xuICAgIGNyZWF0ZUZvckNvbW1pdENvbW1lbnQ6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiXG4gICAgXSxcbiAgICBjcmVhdGVGb3JJc3N1ZTogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vcmVhY3Rpb25zXCJcbiAgICBdLFxuICAgIGNyZWF0ZUZvcklzc3VlQ29tbWVudDogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiXG4gICAgXSxcbiAgICBjcmVhdGVGb3JQdWxsUmVxdWVzdFJldmlld0NvbW1lbnQ6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiXG4gICAgXSxcbiAgICBjcmVhdGVGb3JSZWxlYXNlOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfS9yZWFjdGlvbnNcIlxuICAgIF0sXG4gICAgY3JlYXRlRm9yVGVhbURpc2N1c3Npb25Db21tZW50SW5Pcmc6IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X251bWJlcn0vcmVhY3Rpb25zXCJcbiAgICBdLFxuICAgIGNyZWF0ZUZvclRlYW1EaXNjdXNzaW9uSW5Pcmc6IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L3JlYWN0aW9uc1wiXG4gICAgXSxcbiAgICBkZWxldGVGb3JDb21taXRDb21tZW50OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9ucy97cmVhY3Rpb25faWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZUZvcklzc3VlOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L3JlYWN0aW9ucy97cmVhY3Rpb25faWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZUZvcklzc3VlQ29tbWVudDogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zL3tyZWFjdGlvbl9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlRm9yUHVsbFJlcXVlc3RDb21tZW50OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9ucy97cmVhY3Rpb25faWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZUZvclJlbGVhc2U6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy97cmVsZWFzZV9pZH0vcmVhY3Rpb25zL3tyZWFjdGlvbl9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlRm9yVGVhbURpc2N1c3Npb246IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vcmVhY3Rpb25zL3tyZWFjdGlvbl9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlRm9yVGVhbURpc2N1c3Npb25Db21tZW50OiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X251bWJlcn0vcmVhY3Rpb25zL3tyZWFjdGlvbl9pZH1cIlxuICAgIF0sXG4gICAgbGlzdEZvckNvbW1pdENvbW1lbnQ6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCJcbiAgICBdLFxuICAgIGxpc3RGb3JJc3N1ZTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vcmVhY3Rpb25zXCJdLFxuICAgIGxpc3RGb3JJc3N1ZUNvbW1lbnQ6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiXG4gICAgXSxcbiAgICBsaXN0Rm9yUHVsbFJlcXVlc3RSZXZpZXdDb21tZW50OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiXG4gICAgXSxcbiAgICBsaXN0Rm9yUmVsZWFzZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfS9yZWFjdGlvbnNcIlxuICAgIF0sXG4gICAgbGlzdEZvclRlYW1EaXNjdXNzaW9uQ29tbWVudEluT3JnOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X251bWJlcn0vcmVhY3Rpb25zXCJcbiAgICBdLFxuICAgIGxpc3RGb3JUZWFtRGlzY3Vzc2lvbkluT3JnOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L3JlYWN0aW9uc1wiXG4gICAgXVxuICB9LFxuICByZXBvczoge1xuICAgIGFjY2VwdEludml0YXRpb246IFtcbiAgICAgIFwiUEFUQ0ggL3VzZXIvcmVwb3NpdG9yeV9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH1cIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJyZXBvc1wiLCBcImFjY2VwdEludml0YXRpb25Gb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBhY2NlcHRJbnZpdGF0aW9uRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiUEFUQ0ggL3VzZXIvcmVwb3NpdG9yeV9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH1cIlxuICAgIF0sXG4gICAgYWRkQXBwQWNjZXNzUmVzdHJpY3Rpb25zOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL2FwcHNcIixcbiAgICAgIHt9LFxuICAgICAgeyBtYXBUb0RhdGE6IFwiYXBwc1wiIH1cbiAgICBdLFxuICAgIGFkZENvbGxhYm9yYXRvcjogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2xsYWJvcmF0b3JzL3t1c2VybmFtZX1cIl0sXG4gICAgYWRkU3RhdHVzQ2hlY2tDb250ZXh0czogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3N0YXR1c19jaGVja3MvY29udGV4dHNcIixcbiAgICAgIHt9LFxuICAgICAgeyBtYXBUb0RhdGE6IFwiY29udGV4dHNcIiB9XG4gICAgXSxcbiAgICBhZGRUZWFtQWNjZXNzUmVzdHJpY3Rpb25zOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL3RlYW1zXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcInRlYW1zXCIgfVxuICAgIF0sXG4gICAgYWRkVXNlckFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy91c2Vyc1wiLFxuICAgICAge30sXG4gICAgICB7IG1hcFRvRGF0YTogXCJ1c2Vyc1wiIH1cbiAgICBdLFxuICAgIGNhbmNlbFBhZ2VzRGVwbG95bWVudDogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wYWdlcy9kZXBsb3ltZW50cy97cGFnZXNfZGVwbG95bWVudF9pZH0vY2FuY2VsXCJcbiAgICBdLFxuICAgIGNoZWNrQXV0b21hdGVkU2VjdXJpdHlGaXhlczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2F1dG9tYXRlZC1zZWN1cml0eS1maXhlc1wiXG4gICAgXSxcbiAgICBjaGVja0NvbGxhYm9yYXRvcjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2xsYWJvcmF0b3JzL3t1c2VybmFtZX1cIl0sXG4gICAgY2hlY2tWdWxuZXJhYmlsaXR5QWxlcnRzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdnVsbmVyYWJpbGl0eS1hbGVydHNcIlxuICAgIF0sXG4gICAgY29kZW93bmVyc0Vycm9yczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlb3duZXJzL2Vycm9yc1wiXSxcbiAgICBjb21wYXJlQ29tbWl0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21wYXJlL3tiYXNlfS4uLntoZWFkfVwiXSxcbiAgICBjb21wYXJlQ29tbWl0c1dpdGhCYXNlaGVhZDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbXBhcmUve2Jhc2VoZWFkfVwiXG4gICAgXSxcbiAgICBjcmVhdGVBdXRvbGluazogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYXV0b2xpbmtzXCJdLFxuICAgIGNyZWF0ZUNvbW1pdENvbW1lbnQ6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97Y29tbWl0X3NoYX0vY29tbWVudHNcIlxuICAgIF0sXG4gICAgY3JlYXRlQ29tbWl0U2lnbmF0dXJlUHJvdGVjdGlvbjogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3NpZ25hdHVyZXNcIlxuICAgIF0sXG4gICAgY3JlYXRlQ29tbWl0U3RhdHVzOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdGF0dXNlcy97c2hhfVwiXSxcbiAgICBjcmVhdGVEZXBsb3lLZXk6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2tleXNcIl0sXG4gICAgY3JlYXRlRGVwbG95bWVudDogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwbG95bWVudHNcIl0sXG4gICAgY3JlYXRlRGVwbG95bWVudEJyYW5jaFBvbGljeTogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L2RlcGxveW1lbnQtYnJhbmNoLXBvbGljaWVzXCJcbiAgICBdLFxuICAgIGNyZWF0ZURlcGxveW1lbnRQcm90ZWN0aW9uUnVsZTogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L2RlcGxveW1lbnRfcHJvdGVjdGlvbl9ydWxlc1wiXG4gICAgXSxcbiAgICBjcmVhdGVEZXBsb3ltZW50U3RhdHVzOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGxveW1lbnRzL3tkZXBsb3ltZW50X2lkfS9zdGF0dXNlc1wiXG4gICAgXSxcbiAgICBjcmVhdGVEaXNwYXRjaEV2ZW50OiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kaXNwYXRjaGVzXCJdLFxuICAgIGNyZWF0ZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQT1NUIC91c2VyL3JlcG9zXCJdLFxuICAgIGNyZWF0ZUZvcms6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ZvcmtzXCJdLFxuICAgIGNyZWF0ZUluT3JnOiBbXCJQT1NUIC9vcmdzL3tvcmd9L3JlcG9zXCJdLFxuICAgIGNyZWF0ZU9yVXBkYXRlQ3VzdG9tUHJvcGVydGllc1ZhbHVlczogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vcHJvcGVydGllcy92YWx1ZXNcIlxuICAgIF0sXG4gICAgY3JlYXRlT3JVcGRhdGVFbnZpcm9ubWVudDogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX1cIlxuICAgIF0sXG4gICAgY3JlYXRlT3JVcGRhdGVGaWxlQ29udGVudHM6IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29udGVudHMve3BhdGh9XCJdLFxuICAgIGNyZWF0ZU9yZ1J1bGVzZXQ6IFtcIlBPU1QgL29yZ3Mve29yZ30vcnVsZXNldHNcIl0sXG4gICAgY3JlYXRlUGFnZXNEZXBsb3ltZW50OiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wYWdlcy9kZXBsb3ltZW50c1wiXSxcbiAgICBjcmVhdGVQYWdlc1NpdGU6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzXCJdLFxuICAgIGNyZWF0ZVJlbGVhc2U6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzXCJdLFxuICAgIGNyZWF0ZVJlcG9SdWxlc2V0OiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0c1wiXSxcbiAgICBjcmVhdGVUYWdQcm90ZWN0aW9uOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90YWdzL3Byb3RlY3Rpb25cIl0sXG4gICAgY3JlYXRlVXNpbmdUZW1wbGF0ZTogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97dGVtcGxhdGVfb3duZXJ9L3t0ZW1wbGF0ZV9yZXBvfS9nZW5lcmF0ZVwiXG4gICAgXSxcbiAgICBjcmVhdGVXZWJob29rOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rc1wiXSxcbiAgICBkZWNsaW5lSW52aXRhdGlvbjogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvcmVwb3NpdG9yeV9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH1cIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJyZXBvc1wiLCBcImRlY2xpbmVJbnZpdGF0aW9uRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgZGVjbGluZUludml0YXRpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvcmVwb3NpdG9yeV9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99XCJdLFxuICAgIGRlbGV0ZUFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zXCJcbiAgICBdLFxuICAgIGRlbGV0ZUFkbWluQnJhbmNoUHJvdGVjdGlvbjogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vZW5mb3JjZV9hZG1pbnNcIlxuICAgIF0sXG4gICAgZGVsZXRlQW5FbnZpcm9ubWVudDogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX1cIlxuICAgIF0sXG4gICAgZGVsZXRlQXV0b2xpbms6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYXV0b2xpbmtzL3thdXRvbGlua19pZH1cIl0sXG4gICAgZGVsZXRlQnJhbmNoUHJvdGVjdGlvbjogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb25cIlxuICAgIF0sXG4gICAgZGVsZXRlQ29tbWl0Q29tbWVudDogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgZGVsZXRlQ29tbWl0U2lnbmF0dXJlUHJvdGVjdGlvbjogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc2lnbmF0dXJlc1wiXG4gICAgXSxcbiAgICBkZWxldGVEZXBsb3lLZXk6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30va2V5cy97a2V5X2lkfVwiXSxcbiAgICBkZWxldGVEZXBsb3ltZW50OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwbG95bWVudHMve2RlcGxveW1lbnRfaWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZURlcGxveW1lbnRCcmFuY2hQb2xpY3k6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L2RlcGxveW1lbnQtYnJhbmNoLXBvbGljaWVzL3ticmFuY2hfcG9saWN5X2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVGaWxlOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbnRlbnRzL3twYXRofVwiXSxcbiAgICBkZWxldGVJbnZpdGF0aW9uOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaW52aXRhdGlvbnMve2ludml0YXRpb25faWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZU9yZ1J1bGVzZXQ6IFtcIkRFTEVURSAvb3Jncy97b3JnfS9ydWxlc2V0cy97cnVsZXNldF9pZH1cIl0sXG4gICAgZGVsZXRlUGFnZXNTaXRlOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzXCJdLFxuICAgIGRlbGV0ZVB1bGxSZXF1ZXN0UmV2aWV3UHJvdGVjdGlvbjogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfcHVsbF9yZXF1ZXN0X3Jldmlld3NcIlxuICAgIF0sXG4gICAgZGVsZXRlUmVsZWFzZTogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy97cmVsZWFzZV9pZH1cIl0sXG4gICAgZGVsZXRlUmVsZWFzZUFzc2V0OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvYXNzZXRzL3thc3NldF9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlUmVwb1J1bGVzZXQ6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMve3J1bGVzZXRfaWR9XCJdLFxuICAgIGRlbGV0ZVRhZ1Byb3RlY3Rpb246IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90YWdzL3Byb3RlY3Rpb24ve3RhZ19wcm90ZWN0aW9uX2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVXZWJob29rOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfVwiXSxcbiAgICBkaXNhYmxlQXV0b21hdGVkU2VjdXJpdHlGaXhlczogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2F1dG9tYXRlZC1zZWN1cml0eS1maXhlc1wiXG4gICAgXSxcbiAgICBkaXNhYmxlRGVwbG95bWVudFByb3RlY3Rpb25SdWxlOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9kZXBsb3ltZW50X3Byb3RlY3Rpb25fcnVsZXMve3Byb3RlY3Rpb25fcnVsZV9pZH1cIlxuICAgIF0sXG4gICAgZGlzYWJsZVByaXZhdGVWdWxuZXJhYmlsaXR5UmVwb3J0aW5nOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcHJpdmF0ZS12dWxuZXJhYmlsaXR5LXJlcG9ydGluZ1wiXG4gICAgXSxcbiAgICBkaXNhYmxlVnVsbmVyYWJpbGl0eUFsZXJ0czogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L3Z1bG5lcmFiaWxpdHktYWxlcnRzXCJcbiAgICBdLFxuICAgIGRvd25sb2FkQXJjaGl2ZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3ppcGJhbGwve3JlZn1cIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJyZXBvc1wiLCBcImRvd25sb2FkWmlwYmFsbEFyY2hpdmVcIl0gfVxuICAgIF0sXG4gICAgZG93bmxvYWRUYXJiYWxsQXJjaGl2ZTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90YXJiYWxsL3tyZWZ9XCJdLFxuICAgIGRvd25sb2FkWmlwYmFsbEFyY2hpdmU6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vemlwYmFsbC97cmVmfVwiXSxcbiAgICBlbmFibGVBdXRvbWF0ZWRTZWN1cml0eUZpeGVzOiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYXV0b21hdGVkLXNlY3VyaXR5LWZpeGVzXCJcbiAgICBdLFxuICAgIGVuYWJsZVByaXZhdGVWdWxuZXJhYmlsaXR5UmVwb3J0aW5nOiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHJpdmF0ZS12dWxuZXJhYmlsaXR5LXJlcG9ydGluZ1wiXG4gICAgXSxcbiAgICBlbmFibGVWdWxuZXJhYmlsaXR5QWxlcnRzOiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vdnVsbmVyYWJpbGl0eS1hbGVydHNcIlxuICAgIF0sXG4gICAgZ2VuZXJhdGVSZWxlYXNlTm90ZXM6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvZ2VuZXJhdGUtbm90ZXNcIlxuICAgIF0sXG4gICAgZ2V0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99XCJdLFxuICAgIGdldEFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zXCJcbiAgICBdLFxuICAgIGdldEFkbWluQnJhbmNoUHJvdGVjdGlvbjogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vZW5mb3JjZV9hZG1pbnNcIlxuICAgIF0sXG4gICAgZ2V0QWxsRGVwbG95bWVudFByb3RlY3Rpb25SdWxlczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vZGVwbG95bWVudF9wcm90ZWN0aW9uX3J1bGVzXCJcbiAgICBdLFxuICAgIGdldEFsbEVudmlyb25tZW50czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHNcIl0sXG4gICAgZ2V0QWxsU3RhdHVzQ2hlY2tDb250ZXh0czogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc3RhdHVzX2NoZWNrcy9jb250ZXh0c1wiXG4gICAgXSxcbiAgICBnZXRBbGxUb3BpY3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdG9waWNzXCJdLFxuICAgIGdldEFwcHNXaXRoQWNjZXNzVG9Qcm90ZWN0ZWRCcmFuY2g6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy9hcHBzXCJcbiAgICBdLFxuICAgIGdldEF1dG9saW5rOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2F1dG9saW5rcy97YXV0b2xpbmtfaWR9XCJdLFxuICAgIGdldEJyYW5jaDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofVwiXSxcbiAgICBnZXRCcmFuY2hQcm90ZWN0aW9uOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvblwiXG4gICAgXSxcbiAgICBnZXRCcmFuY2hSdWxlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlcy9icmFuY2hlcy97YnJhbmNofVwiXSxcbiAgICBnZXRDbG9uZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdHJhZmZpYy9jbG9uZXNcIl0sXG4gICAgZ2V0Q29kZUZyZXF1ZW5jeVN0YXRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N0YXRzL2NvZGVfZnJlcXVlbmN5XCJdLFxuICAgIGdldENvbGxhYm9yYXRvclBlcm1pc3Npb25MZXZlbDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbGxhYm9yYXRvcnMve3VzZXJuYW1lfS9wZXJtaXNzaW9uXCJcbiAgICBdLFxuICAgIGdldENvbWJpbmVkU3RhdHVzRm9yUmVmOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve3JlZn0vc3RhdHVzXCJdLFxuICAgIGdldENvbW1pdDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tyZWZ9XCJdLFxuICAgIGdldENvbW1pdEFjdGl2aXR5U3RhdHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3RhdHMvY29tbWl0X2FjdGl2aXR5XCJdLFxuICAgIGdldENvbW1pdENvbW1lbnQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWVudHMve2NvbW1lbnRfaWR9XCJdLFxuICAgIGdldENvbW1pdFNpZ25hdHVyZVByb3RlY3Rpb246IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3NpZ25hdHVyZXNcIlxuICAgIF0sXG4gICAgZ2V0Q29tbXVuaXR5UHJvZmlsZU1ldHJpY3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbXVuaXR5L3Byb2ZpbGVcIl0sXG4gICAgZ2V0Q29udGVudDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb250ZW50cy97cGF0aH1cIl0sXG4gICAgZ2V0Q29udHJpYnV0b3JzU3RhdHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3RhdHMvY29udHJpYnV0b3JzXCJdLFxuICAgIGdldEN1c3RvbURlcGxveW1lbnRQcm90ZWN0aW9uUnVsZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vZGVwbG95bWVudF9wcm90ZWN0aW9uX3J1bGVzL3twcm90ZWN0aW9uX3J1bGVfaWR9XCJcbiAgICBdLFxuICAgIGdldEN1c3RvbVByb3BlcnRpZXNWYWx1ZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHJvcGVydGllcy92YWx1ZXNcIl0sXG4gICAgZ2V0RGVwbG95S2V5OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2tleXMve2tleV9pZH1cIl0sXG4gICAgZ2V0RGVwbG95bWVudDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBsb3ltZW50cy97ZGVwbG95bWVudF9pZH1cIl0sXG4gICAgZ2V0RGVwbG95bWVudEJyYW5jaFBvbGljeTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vZGVwbG95bWVudC1icmFuY2gtcG9saWNpZXMve2JyYW5jaF9wb2xpY3lfaWR9XCJcbiAgICBdLFxuICAgIGdldERlcGxveW1lbnRTdGF0dXM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBsb3ltZW50cy97ZGVwbG95bWVudF9pZH0vc3RhdHVzZXMve3N0YXR1c19pZH1cIlxuICAgIF0sXG4gICAgZ2V0RW52aXJvbm1lbnQ6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9XCJcbiAgICBdLFxuICAgIGdldExhdGVzdFBhZ2VzQnVpbGQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvYnVpbGRzL2xhdGVzdFwiXSxcbiAgICBnZXRMYXRlc3RSZWxlYXNlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL2xhdGVzdFwiXSxcbiAgICBnZXRPcmdSdWxlU3VpdGU6IFtcIkdFVCAvb3Jncy97b3JnfS9ydWxlc2V0cy9ydWxlLXN1aXRlcy97cnVsZV9zdWl0ZV9pZH1cIl0sXG4gICAgZ2V0T3JnUnVsZVN1aXRlczogW1wiR0VUIC9vcmdzL3tvcmd9L3J1bGVzZXRzL3J1bGUtc3VpdGVzXCJdLFxuICAgIGdldE9yZ1J1bGVzZXQ6IFtcIkdFVCAvb3Jncy97b3JnfS9ydWxlc2V0cy97cnVsZXNldF9pZH1cIl0sXG4gICAgZ2V0T3JnUnVsZXNldHM6IFtcIkdFVCAvb3Jncy97b3JnfS9ydWxlc2V0c1wiXSxcbiAgICBnZXRQYWdlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wYWdlc1wiXSxcbiAgICBnZXRQYWdlc0J1aWxkOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzL2J1aWxkcy97YnVpbGRfaWR9XCJdLFxuICAgIGdldFBhZ2VzRGVwbG95bWVudDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzL2RlcGxveW1lbnRzL3twYWdlc19kZXBsb3ltZW50X2lkfVwiXG4gICAgXSxcbiAgICBnZXRQYWdlc0hlYWx0aENoZWNrOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzL2hlYWx0aFwiXSxcbiAgICBnZXRQYXJ0aWNpcGF0aW9uU3RhdHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3RhdHMvcGFydGljaXBhdGlvblwiXSxcbiAgICBnZXRQdWxsUmVxdWVzdFJldmlld1Byb3RlY3Rpb246IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3B1bGxfcmVxdWVzdF9yZXZpZXdzXCJcbiAgICBdLFxuICAgIGdldFB1bmNoQ2FyZFN0YXRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N0YXRzL3B1bmNoX2NhcmRcIl0sXG4gICAgZ2V0UmVhZG1lOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlYWRtZVwiXSxcbiAgICBnZXRSZWFkbWVJbkRpcmVjdG9yeTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWFkbWUve2Rpcn1cIl0sXG4gICAgZ2V0UmVsZWFzZTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy97cmVsZWFzZV9pZH1cIl0sXG4gICAgZ2V0UmVsZWFzZUFzc2V0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL2Fzc2V0cy97YXNzZXRfaWR9XCJdLFxuICAgIGdldFJlbGVhc2VCeVRhZzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy90YWdzL3t0YWd9XCJdLFxuICAgIGdldFJlcG9SdWxlU3VpdGU6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cy9ydWxlLXN1aXRlcy97cnVsZV9zdWl0ZV9pZH1cIlxuICAgIF0sXG4gICAgZ2V0UmVwb1J1bGVTdWl0ZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMvcnVsZS1zdWl0ZXNcIl0sXG4gICAgZ2V0UmVwb1J1bGVzZXQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMve3J1bGVzZXRfaWR9XCJdLFxuICAgIGdldFJlcG9SdWxlc2V0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0c1wiXSxcbiAgICBnZXRTdGF0dXNDaGVja3NQcm90ZWN0aW9uOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzXCJcbiAgICBdLFxuICAgIGdldFRlYW1zV2l0aEFjY2Vzc1RvUHJvdGVjdGVkQnJhbmNoOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnMvdGVhbXNcIlxuICAgIF0sXG4gICAgZ2V0VG9wUGF0aHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdHJhZmZpYy9wb3B1bGFyL3BhdGhzXCJdLFxuICAgIGdldFRvcFJlZmVycmVyczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90cmFmZmljL3BvcHVsYXIvcmVmZXJyZXJzXCJdLFxuICAgIGdldFVzZXJzV2l0aEFjY2Vzc1RvUHJvdGVjdGVkQnJhbmNoOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnMvdXNlcnNcIlxuICAgIF0sXG4gICAgZ2V0Vmlld3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdHJhZmZpYy92aWV3c1wiXSxcbiAgICBnZXRXZWJob29rOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfVwiXSxcbiAgICBnZXRXZWJob29rQ29uZmlnRm9yUmVwbzogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfS9jb25maWdcIlxuICAgIF0sXG4gICAgZ2V0V2ViaG9va0RlbGl2ZXJ5OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3Mve2hvb2tfaWR9L2RlbGl2ZXJpZXMve2RlbGl2ZXJ5X2lkfVwiXG4gICAgXSxcbiAgICBsaXN0QWN0aXZpdGllczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpdml0eVwiXSxcbiAgICBsaXN0QXV0b2xpbmtzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2F1dG9saW5rc1wiXSxcbiAgICBsaXN0QnJhbmNoZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXNcIl0sXG4gICAgbGlzdEJyYW5jaGVzRm9ySGVhZENvbW1pdDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve2NvbW1pdF9zaGF9L2JyYW5jaGVzLXdoZXJlLWhlYWRcIlxuICAgIF0sXG4gICAgbGlzdENvbGxhYm9yYXRvcnM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29sbGFib3JhdG9yc1wiXSxcbiAgICBsaXN0Q29tbWVudHNGb3JDb21taXQ6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tjb21taXRfc2hhfS9jb21tZW50c1wiXG4gICAgXSxcbiAgICBsaXN0Q29tbWl0Q29tbWVudHNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1lbnRzXCJdLFxuICAgIGxpc3RDb21taXRTdGF0dXNlc0ZvclJlZjogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve3JlZn0vc3RhdHVzZXNcIlxuICAgIF0sXG4gICAgbGlzdENvbW1pdHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0c1wiXSxcbiAgICBsaXN0Q29udHJpYnV0b3JzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbnRyaWJ1dG9yc1wiXSxcbiAgICBsaXN0Q3VzdG9tRGVwbG95bWVudFJ1bGVJbnRlZ3JhdGlvbnM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L2RlcGxveW1lbnRfcHJvdGVjdGlvbl9ydWxlcy9hcHBzXCJcbiAgICBdLFxuICAgIGxpc3REZXBsb3lLZXlzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2tleXNcIl0sXG4gICAgbGlzdERlcGxveW1lbnRCcmFuY2hQb2xpY2llczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vZGVwbG95bWVudC1icmFuY2gtcG9saWNpZXNcIlxuICAgIF0sXG4gICAgbGlzdERlcGxveW1lbnRTdGF0dXNlczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGxveW1lbnRzL3tkZXBsb3ltZW50X2lkfS9zdGF0dXNlc1wiXG4gICAgXSxcbiAgICBsaXN0RGVwbG95bWVudHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwbG95bWVudHNcIl0sXG4gICAgbGlzdEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvcmVwb3NcIl0sXG4gICAgbGlzdEZvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L3JlcG9zXCJdLFxuICAgIGxpc3RGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcmVwb3NcIl0sXG4gICAgbGlzdEZvcmtzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ZvcmtzXCJdLFxuICAgIGxpc3RJbnZpdGF0aW9uczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbnZpdGF0aW9uc1wiXSxcbiAgICBsaXN0SW52aXRhdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3JlcG9zaXRvcnlfaW52aXRhdGlvbnNcIl0sXG4gICAgbGlzdExhbmd1YWdlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYW5ndWFnZXNcIl0sXG4gICAgbGlzdFBhZ2VzQnVpbGRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzL2J1aWxkc1wiXSxcbiAgICBsaXN0UHVibGljOiBbXCJHRVQgL3JlcG9zaXRvcmllc1wiXSxcbiAgICBsaXN0UHVsbFJlcXVlc3RzQXNzb2NpYXRlZFdpdGhDb21taXQ6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tjb21taXRfc2hhfS9wdWxsc1wiXG4gICAgXSxcbiAgICBsaXN0UmVsZWFzZUFzc2V0czogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfS9hc3NldHNcIlxuICAgIF0sXG4gICAgbGlzdFJlbGVhc2VzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzXCJdLFxuICAgIGxpc3RUYWdQcm90ZWN0aW9uOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RhZ3MvcHJvdGVjdGlvblwiXSxcbiAgICBsaXN0VGFnczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90YWdzXCJdLFxuICAgIGxpc3RUZWFtczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90ZWFtc1wiXSxcbiAgICBsaXN0V2ViaG9va0RlbGl2ZXJpZXM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH0vZGVsaXZlcmllc1wiXG4gICAgXSxcbiAgICBsaXN0V2ViaG9va3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3NcIl0sXG4gICAgbWVyZ2U6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L21lcmdlc1wiXSxcbiAgICBtZXJnZVVwc3RyZWFtOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9tZXJnZS11cHN0cmVhbVwiXSxcbiAgICBwaW5nV2ViaG9vazogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3Mve2hvb2tfaWR9L3BpbmdzXCJdLFxuICAgIHJlZGVsaXZlcldlYmhvb2tEZWxpdmVyeTogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH0vZGVsaXZlcmllcy97ZGVsaXZlcnlfaWR9L2F0dGVtcHRzXCJcbiAgICBdLFxuICAgIHJlbW92ZUFwcEFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL2FwcHNcIixcbiAgICAgIHt9LFxuICAgICAgeyBtYXBUb0RhdGE6IFwiYXBwc1wiIH1cbiAgICBdLFxuICAgIHJlbW92ZUNvbGxhYm9yYXRvcjogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbGxhYm9yYXRvcnMve3VzZXJuYW1lfVwiXG4gICAgXSxcbiAgICByZW1vdmVTdGF0dXNDaGVja0NvbnRleHRzOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzL2NvbnRleHRzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcImNvbnRleHRzXCIgfVxuICAgIF0sXG4gICAgcmVtb3ZlU3RhdHVzQ2hlY2tQcm90ZWN0aW9uOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzXCJcbiAgICBdLFxuICAgIHJlbW92ZVRlYW1BY2Nlc3NSZXN0cmljdGlvbnM6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy90ZWFtc1wiLFxuICAgICAge30sXG4gICAgICB7IG1hcFRvRGF0YTogXCJ0ZWFtc1wiIH1cbiAgICBdLFxuICAgIHJlbW92ZVVzZXJBY2Nlc3NSZXN0cmljdGlvbnM6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy91c2Vyc1wiLFxuICAgICAge30sXG4gICAgICB7IG1hcFRvRGF0YTogXCJ1c2Vyc1wiIH1cbiAgICBdLFxuICAgIHJlbmFtZUJyYW5jaDogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcmVuYW1lXCJdLFxuICAgIHJlcGxhY2VBbGxUb3BpY3M6IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vdG9waWNzXCJdLFxuICAgIHJlcXVlc3RQYWdlc0J1aWxkOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wYWdlcy9idWlsZHNcIl0sXG4gICAgc2V0QWRtaW5CcmFuY2hQcm90ZWN0aW9uOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vZW5mb3JjZV9hZG1pbnNcIlxuICAgIF0sXG4gICAgc2V0QXBwQWNjZXNzUmVzdHJpY3Rpb25zOiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnMvYXBwc1wiLFxuICAgICAge30sXG4gICAgICB7IG1hcFRvRGF0YTogXCJhcHBzXCIgfVxuICAgIF0sXG4gICAgc2V0U3RhdHVzQ2hlY2tDb250ZXh0czogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc3RhdHVzX2NoZWNrcy9jb250ZXh0c1wiLFxuICAgICAge30sXG4gICAgICB7IG1hcFRvRGF0YTogXCJjb250ZXh0c1wiIH1cbiAgICBdLFxuICAgIHNldFRlYW1BY2Nlc3NSZXN0cmljdGlvbnM6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy90ZWFtc1wiLFxuICAgICAge30sXG4gICAgICB7IG1hcFRvRGF0YTogXCJ0ZWFtc1wiIH1cbiAgICBdLFxuICAgIHNldFVzZXJBY2Nlc3NSZXN0cmljdGlvbnM6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy91c2Vyc1wiLFxuICAgICAge30sXG4gICAgICB7IG1hcFRvRGF0YTogXCJ1c2Vyc1wiIH1cbiAgICBdLFxuICAgIHRlc3RQdXNoV2ViaG9vazogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3Mve2hvb2tfaWR9L3Rlc3RzXCJdLFxuICAgIHRyYW5zZmVyOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90cmFuc2ZlclwiXSxcbiAgICB1cGRhdGU6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfVwiXSxcbiAgICB1cGRhdGVCcmFuY2hQcm90ZWN0aW9uOiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvblwiXG4gICAgXSxcbiAgICB1cGRhdGVDb21taXRDb21tZW50OiBbXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWVudHMve2NvbW1lbnRfaWR9XCJdLFxuICAgIHVwZGF0ZURlcGxveW1lbnRCcmFuY2hQb2xpY3k6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L2RlcGxveW1lbnQtYnJhbmNoLXBvbGljaWVzL3ticmFuY2hfcG9saWN5X2lkfVwiXG4gICAgXSxcbiAgICB1cGRhdGVJbmZvcm1hdGlvbkFib3V0UGFnZXNTaXRlOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzXCJdLFxuICAgIHVwZGF0ZUludml0YXRpb246IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2ludml0YXRpb25zL3tpbnZpdGF0aW9uX2lkfVwiXG4gICAgXSxcbiAgICB1cGRhdGVPcmdSdWxlc2V0OiBbXCJQVVQgL29yZ3Mve29yZ30vcnVsZXNldHMve3J1bGVzZXRfaWR9XCJdLFxuICAgIHVwZGF0ZVB1bGxSZXF1ZXN0UmV2aWV3UHJvdGVjdGlvbjogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9wdWxsX3JlcXVlc3RfcmV2aWV3c1wiXG4gICAgXSxcbiAgICB1cGRhdGVSZWxlYXNlOiBbXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMve3JlbGVhc2VfaWR9XCJdLFxuICAgIHVwZGF0ZVJlbGVhc2VBc3NldDogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvYXNzZXRzL3thc3NldF9pZH1cIlxuICAgIF0sXG4gICAgdXBkYXRlUmVwb1J1bGVzZXQ6IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMve3J1bGVzZXRfaWR9XCJdLFxuICAgIHVwZGF0ZVN0YXR1c0NoZWNrUG90ZWN0aW9uOiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3N0YXR1c19jaGVja3NcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJyZXBvc1wiLCBcInVwZGF0ZVN0YXR1c0NoZWNrUHJvdGVjdGlvblwiXSB9XG4gICAgXSxcbiAgICB1cGRhdGVTdGF0dXNDaGVja1Byb3RlY3Rpb246IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc3RhdHVzX2NoZWNrc1wiXG4gICAgXSxcbiAgICB1cGRhdGVXZWJob29rOiBbXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3Mve2hvb2tfaWR9XCJdLFxuICAgIHVwZGF0ZVdlYmhvb2tDb25maWdGb3JSZXBvOiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH0vY29uZmlnXCJcbiAgICBdLFxuICAgIHVwbG9hZFJlbGVhc2VBc3NldDogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy97cmVsZWFzZV9pZH0vYXNzZXRzez9uYW1lLGxhYmVsfVwiLFxuICAgICAgeyBiYXNlVXJsOiBcImh0dHBzOi8vdXBsb2Fkcy5naXRodWIuY29tXCIgfVxuICAgIF1cbiAgfSxcbiAgc2VhcmNoOiB7XG4gICAgY29kZTogW1wiR0VUIC9zZWFyY2gvY29kZVwiXSxcbiAgICBjb21taXRzOiBbXCJHRVQgL3NlYXJjaC9jb21taXRzXCJdLFxuICAgIGlzc3Vlc0FuZFB1bGxSZXF1ZXN0czogW1wiR0VUIC9zZWFyY2gvaXNzdWVzXCJdLFxuICAgIGxhYmVsczogW1wiR0VUIC9zZWFyY2gvbGFiZWxzXCJdLFxuICAgIHJlcG9zOiBbXCJHRVQgL3NlYXJjaC9yZXBvc2l0b3JpZXNcIl0sXG4gICAgdG9waWNzOiBbXCJHRVQgL3NlYXJjaC90b3BpY3NcIl0sXG4gICAgdXNlcnM6IFtcIkdFVCAvc2VhcmNoL3VzZXJzXCJdXG4gIH0sXG4gIHNlY3JldFNjYW5uaW5nOiB7XG4gICAgZ2V0QWxlcnQ6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zZWNyZXQtc2Nhbm5pbmcvYWxlcnRzL3thbGVydF9udW1iZXJ9XCJcbiAgICBdLFxuICAgIGxpc3RBbGVydHNGb3JFbnRlcnByaXNlOiBbXG4gICAgICBcIkdFVCAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L3NlY3JldC1zY2FubmluZy9hbGVydHNcIlxuICAgIF0sXG4gICAgbGlzdEFsZXJ0c0Zvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L3NlY3JldC1zY2FubmluZy9hbGVydHNcIl0sXG4gICAgbGlzdEFsZXJ0c0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0c1wiXSxcbiAgICBsaXN0TG9jYXRpb25zRm9yQWxlcnQ6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zZWNyZXQtc2Nhbm5pbmcvYWxlcnRzL3thbGVydF9udW1iZXJ9L2xvY2F0aW9uc1wiXG4gICAgXSxcbiAgICB1cGRhdGVBbGVydDogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0cy97YWxlcnRfbnVtYmVyfVwiXG4gICAgXVxuICB9LFxuICBzZWN1cml0eUFkdmlzb3JpZXM6IHtcbiAgICBjcmVhdGVGb3JrOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3VyaXR5LWFkdmlzb3JpZXMve2doc2FfaWR9L2ZvcmtzXCJcbiAgICBdLFxuICAgIGNyZWF0ZVByaXZhdGVWdWxuZXJhYmlsaXR5UmVwb3J0OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3VyaXR5LWFkdmlzb3JpZXMvcmVwb3J0c1wiXG4gICAgXSxcbiAgICBjcmVhdGVSZXBvc2l0b3J5QWR2aXNvcnk6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vc2VjdXJpdHktYWR2aXNvcmllc1wiXG4gICAgXSxcbiAgICBjcmVhdGVSZXBvc2l0b3J5QWR2aXNvcnlDdmVSZXF1ZXN0OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3VyaXR5LWFkdmlzb3JpZXMve2doc2FfaWR9L2N2ZVwiXG4gICAgXSxcbiAgICBnZXRHbG9iYWxBZHZpc29yeTogW1wiR0VUIC9hZHZpc29yaWVzL3tnaHNhX2lkfVwiXSxcbiAgICBnZXRSZXBvc2l0b3J5QWR2aXNvcnk6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zZWN1cml0eS1hZHZpc29yaWVzL3tnaHNhX2lkfVwiXG4gICAgXSxcbiAgICBsaXN0R2xvYmFsQWR2aXNvcmllczogW1wiR0VUIC9hZHZpc29yaWVzXCJdLFxuICAgIGxpc3RPcmdSZXBvc2l0b3J5QWR2aXNvcmllczogW1wiR0VUIC9vcmdzL3tvcmd9L3NlY3VyaXR5LWFkdmlzb3JpZXNcIl0sXG4gICAgbGlzdFJlcG9zaXRvcnlBZHZpc29yaWVzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3VyaXR5LWFkdmlzb3JpZXNcIl0sXG4gICAgdXBkYXRlUmVwb3NpdG9yeUFkdmlzb3J5OiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zZWN1cml0eS1hZHZpc29yaWVzL3tnaHNhX2lkfVwiXG4gICAgXVxuICB9LFxuICB0ZWFtczoge1xuICAgIGFkZE9yVXBkYXRlTWVtYmVyc2hpcEZvclVzZXJJbk9yZzogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vbWVtYmVyc2hpcHMve3VzZXJuYW1lfVwiXG4gICAgXSxcbiAgICBhZGRPclVwZGF0ZVByb2plY3RQZXJtaXNzaW9uc0luT3JnOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9wcm9qZWN0cy97cHJvamVjdF9pZH1cIlxuICAgIF0sXG4gICAgYWRkT3JVcGRhdGVSZXBvUGVybWlzc2lvbnNJbk9yZzogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcmVwb3Mve293bmVyfS97cmVwb31cIlxuICAgIF0sXG4gICAgY2hlY2tQZXJtaXNzaW9uc0ZvclByb2plY3RJbk9yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcHJvamVjdHMve3Byb2plY3RfaWR9XCJcbiAgICBdLFxuICAgIGNoZWNrUGVybWlzc2lvbnNGb3JSZXBvSW5Pcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3JlcG9zL3tvd25lcn0ve3JlcG99XCJcbiAgICBdLFxuICAgIGNyZWF0ZTogW1wiUE9TVCAvb3Jncy97b3JnfS90ZWFtc1wiXSxcbiAgICBjcmVhdGVEaXNjdXNzaW9uQ29tbWVudEluT3JnOiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9jb21tZW50c1wiXG4gICAgXSxcbiAgICBjcmVhdGVEaXNjdXNzaW9uSW5Pcmc6IFtcIlBPU1QgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnNcIl0sXG4gICAgZGVsZXRlRGlzY3Vzc2lvbkNvbW1lbnRJbk9yZzogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9jb21tZW50cy97Y29tbWVudF9udW1iZXJ9XCJcbiAgICBdLFxuICAgIGRlbGV0ZURpc2N1c3Npb25Jbk9yZzogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfVwiXG4gICAgXSxcbiAgICBkZWxldGVJbk9yZzogW1wiREVMRVRFIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9XCJdLFxuICAgIGdldEJ5TmFtZTogW1wiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9XCJdLFxuICAgIGdldERpc2N1c3Npb25Db21tZW50SW5Pcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfbnVtYmVyfVwiXG4gICAgXSxcbiAgICBnZXREaXNjdXNzaW9uSW5Pcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn1cIlxuICAgIF0sXG4gICAgZ2V0TWVtYmVyc2hpcEZvclVzZXJJbk9yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vbWVtYmVyc2hpcHMve3VzZXJuYW1lfVwiXG4gICAgXSxcbiAgICBsaXN0OiBbXCJHRVQgL29yZ3Mve29yZ30vdGVhbXNcIl0sXG4gICAgbGlzdENoaWxkSW5Pcmc6IFtcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS90ZWFtc1wiXSxcbiAgICBsaXN0RGlzY3Vzc2lvbkNvbW1lbnRzSW5Pcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHNcIlxuICAgIF0sXG4gICAgbGlzdERpc2N1c3Npb25zSW5Pcmc6IFtcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9uc1wiXSxcbiAgICBsaXN0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci90ZWFtc1wiXSxcbiAgICBsaXN0TWVtYmVyc0luT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vbWVtYmVyc1wiXSxcbiAgICBsaXN0UGVuZGluZ0ludml0YXRpb25zSW5Pcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2ludml0YXRpb25zXCJcbiAgICBdLFxuICAgIGxpc3RQcm9qZWN0c0luT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcHJvamVjdHNcIl0sXG4gICAgbGlzdFJlcG9zSW5Pcmc6IFtcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9yZXBvc1wiXSxcbiAgICByZW1vdmVNZW1iZXJzaGlwRm9yVXNlckluT3JnOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9tZW1iZXJzaGlwcy97dXNlcm5hbWV9XCJcbiAgICBdLFxuICAgIHJlbW92ZVByb2plY3RJbk9yZzogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcHJvamVjdHMve3Byb2plY3RfaWR9XCJcbiAgICBdLFxuICAgIHJlbW92ZVJlcG9Jbk9yZzogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcmVwb3Mve293bmVyfS97cmVwb31cIlxuICAgIF0sXG4gICAgdXBkYXRlRGlzY3Vzc2lvbkNvbW1lbnRJbk9yZzogW1xuICAgICAgXCJQQVRDSCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X251bWJlcn1cIlxuICAgIF0sXG4gICAgdXBkYXRlRGlzY3Vzc2lvbkluT3JnOiBbXG4gICAgICBcIlBBVENIIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn1cIlxuICAgIF0sXG4gICAgdXBkYXRlSW5Pcmc6IFtcIlBBVENIIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9XCJdXG4gIH0sXG4gIHVzZXJzOiB7XG4gICAgYWRkRW1haWxGb3JBdXRoZW50aWNhdGVkOiBbXG4gICAgICBcIlBPU1QgL3VzZXIvZW1haWxzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJhZGRFbWFpbEZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGFkZEVtYWlsRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBPU1QgL3VzZXIvZW1haWxzXCJdLFxuICAgIGFkZFNvY2lhbEFjY291bnRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9zb2NpYWxfYWNjb3VudHNcIl0sXG4gICAgYmxvY2s6IFtcIlBVVCAvdXNlci9ibG9ja3Mve3VzZXJuYW1lfVwiXSxcbiAgICBjaGVja0Jsb2NrZWQ6IFtcIkdFVCAvdXNlci9ibG9ja3Mve3VzZXJuYW1lfVwiXSxcbiAgICBjaGVja0ZvbGxvd2luZ0ZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9mb2xsb3dpbmcve3RhcmdldF91c2VyfVwiXSxcbiAgICBjaGVja1BlcnNvbklzRm9sbG93ZWRCeUF1dGhlbnRpY2F0ZWQ6IFtcIkdFVCAvdXNlci9mb2xsb3dpbmcve3VzZXJuYW1lfVwiXSxcbiAgICBjcmVhdGVHcGdLZXlGb3JBdXRoZW50aWNhdGVkOiBbXG4gICAgICBcIlBPU1QgL3VzZXIvZ3BnX2tleXNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImNyZWF0ZUdwZ0tleUZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGNyZWF0ZUdwZ0tleUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQT1NUIC91c2VyL2dwZ19rZXlzXCJdLFxuICAgIGNyZWF0ZVB1YmxpY1NzaEtleUZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiUE9TVCAvdXNlci9rZXlzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJjcmVhdGVQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBjcmVhdGVQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9rZXlzXCJdLFxuICAgIGNyZWF0ZVNzaFNpZ25pbmdLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9zc2hfc2lnbmluZ19rZXlzXCJdLFxuICAgIGRlbGV0ZUVtYWlsRm9yQXV0aGVudGljYXRlZDogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvZW1haWxzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJkZWxldGVFbWFpbEZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGRlbGV0ZUVtYWlsRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkRFTEVURSAvdXNlci9lbWFpbHNcIl0sXG4gICAgZGVsZXRlR3BnS2V5Rm9yQXV0aGVudGljYXRlZDogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvZ3BnX2tleXMve2dwZ19rZXlfaWR9XCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJkZWxldGVHcGdLZXlGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBkZWxldGVHcGdLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiREVMRVRFIC91c2VyL2dwZ19rZXlzL3tncGdfa2V5X2lkfVwiXSxcbiAgICBkZWxldGVQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9rZXlzL3trZXlfaWR9XCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJkZWxldGVQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBkZWxldGVQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiREVMRVRFIC91c2VyL2tleXMve2tleV9pZH1cIl0sXG4gICAgZGVsZXRlU29jaWFsQWNjb3VudEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJERUxFVEUgL3VzZXIvc29jaWFsX2FjY291bnRzXCJdLFxuICAgIGRlbGV0ZVNzaFNpZ25pbmdLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvc3NoX3NpZ25pbmdfa2V5cy97c3NoX3NpZ25pbmdfa2V5X2lkfVwiXG4gICAgXSxcbiAgICBmb2xsb3c6IFtcIlBVVCAvdXNlci9mb2xsb3dpbmcve3VzZXJuYW1lfVwiXSxcbiAgICBnZXRBdXRoZW50aWNhdGVkOiBbXCJHRVQgL3VzZXJcIl0sXG4gICAgZ2V0QnlVc2VybmFtZTogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9XCJdLFxuICAgIGdldENvbnRleHRGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vaG92ZXJjYXJkXCJdLFxuICAgIGdldEdwZ0tleUZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiR0VUIC91c2VyL2dwZ19rZXlzL3tncGdfa2V5X2lkfVwiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwiZ2V0R3BnS2V5Rm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgZ2V0R3BnS2V5Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9ncGdfa2V5cy97Z3BnX2tleV9pZH1cIl0sXG4gICAgZ2V0UHVibGljU3NoS2V5Rm9yQXV0aGVudGljYXRlZDogW1xuICAgICAgXCJHRVQgL3VzZXIva2V5cy97a2V5X2lkfVwiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwiZ2V0UHVibGljU3NoS2V5Rm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgZ2V0UHVibGljU3NoS2V5Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9rZXlzL3trZXlfaWR9XCJdLFxuICAgIGdldFNzaFNpZ25pbmdLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvc3NoX3NpZ25pbmdfa2V5cy97c3NoX3NpZ25pbmdfa2V5X2lkfVwiXG4gICAgXSxcbiAgICBsaXN0OiBbXCJHRVQgL3VzZXJzXCJdLFxuICAgIGxpc3RCbG9ja2VkQnlBdXRoZW50aWNhdGVkOiBbXG4gICAgICBcIkdFVCAvdXNlci9ibG9ja3NcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImxpc3RCbG9ja2VkQnlBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBsaXN0QmxvY2tlZEJ5QXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9ibG9ja3NcIl0sXG4gICAgbGlzdEVtYWlsc0ZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiR0VUIC91c2VyL2VtYWlsc1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwibGlzdEVtYWlsc0ZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGxpc3RFbWFpbHNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2VtYWlsc1wiXSxcbiAgICBsaXN0Rm9sbG93ZWRCeUF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiR0VUIC91c2VyL2ZvbGxvd2luZ1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwibGlzdEZvbGxvd2VkQnlBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBsaXN0Rm9sbG93ZWRCeUF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvZm9sbG93aW5nXCJdLFxuICAgIGxpc3RGb2xsb3dlcnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2ZvbGxvd2Vyc1wiXSxcbiAgICBsaXN0Rm9sbG93ZXJzRm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L2ZvbGxvd2Vyc1wiXSxcbiAgICBsaXN0Rm9sbG93aW5nRm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L2ZvbGxvd2luZ1wiXSxcbiAgICBsaXN0R3BnS2V5c0ZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiR0VUIC91c2VyL2dwZ19rZXlzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJsaXN0R3BnS2V5c0ZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGxpc3RHcGdLZXlzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9ncGdfa2V5c1wiXSxcbiAgICBsaXN0R3BnS2V5c0ZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9ncGdfa2V5c1wiXSxcbiAgICBsaXN0UHVibGljRW1haWxzRm9yQXV0aGVudGljYXRlZDogW1xuICAgICAgXCJHRVQgL3VzZXIvcHVibGljX2VtYWlsc1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwibGlzdFB1YmxpY0VtYWlsc0ZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGxpc3RQdWJsaWNFbWFpbHNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3B1YmxpY19lbWFpbHNcIl0sXG4gICAgbGlzdFB1YmxpY0tleXNGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0va2V5c1wiXSxcbiAgICBsaXN0UHVibGljU3NoS2V5c0ZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiR0VUIC91c2VyL2tleXNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImxpc3RQdWJsaWNTc2hLZXlzRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgbGlzdFB1YmxpY1NzaEtleXNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2tleXNcIl0sXG4gICAgbGlzdFNvY2lhbEFjY291bnRzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9zb2NpYWxfYWNjb3VudHNcIl0sXG4gICAgbGlzdFNvY2lhbEFjY291bnRzRm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L3NvY2lhbF9hY2NvdW50c1wiXSxcbiAgICBsaXN0U3NoU2lnbmluZ0tleXNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3NzaF9zaWduaW5nX2tleXNcIl0sXG4gICAgbGlzdFNzaFNpZ25pbmdLZXlzRm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L3NzaF9zaWduaW5nX2tleXNcIl0sXG4gICAgc2V0UHJpbWFyeUVtYWlsVmlzaWJpbGl0eUZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiUEFUQ0ggL3VzZXIvZW1haWwvdmlzaWJpbGl0eVwiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwic2V0UHJpbWFyeUVtYWlsVmlzaWJpbGl0eUZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIHNldFByaW1hcnlFbWFpbFZpc2liaWxpdHlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJQQVRDSCAvdXNlci9lbWFpbC92aXNpYmlsaXR5XCJcbiAgICBdLFxuICAgIHVuYmxvY2s6IFtcIkRFTEVURSAvdXNlci9ibG9ja3Mve3VzZXJuYW1lfVwiXSxcbiAgICB1bmZvbGxvdzogW1wiREVMRVRFIC91c2VyL2ZvbGxvd2luZy97dXNlcm5hbWV9XCJdLFxuICAgIHVwZGF0ZUF1dGhlbnRpY2F0ZWQ6IFtcIlBBVENIIC91c2VyXCJdXG4gIH1cbn07XG52YXIgZW5kcG9pbnRzX2RlZmF1bHQgPSBFbmRwb2ludHM7XG5leHBvcnQge1xuICBlbmRwb2ludHNfZGVmYXVsdCBhcyBkZWZhdWx0XG59O1xuIiwiaW1wb3J0IEVORFBPSU5UUyBmcm9tIFwiLi9nZW5lcmF0ZWQvZW5kcG9pbnRzLmpzXCI7XG5jb25zdCBlbmRwb2ludE1ldGhvZHNNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuZm9yIChjb25zdCBbc2NvcGUsIGVuZHBvaW50c10gb2YgT2JqZWN0LmVudHJpZXMoRU5EUE9JTlRTKSkge1xuICBmb3IgKGNvbnN0IFttZXRob2ROYW1lLCBlbmRwb2ludF0gb2YgT2JqZWN0LmVudHJpZXMoZW5kcG9pbnRzKSkge1xuICAgIGNvbnN0IFtyb3V0ZSwgZGVmYXVsdHMsIGRlY29yYXRpb25zXSA9IGVuZHBvaW50O1xuICAgIGNvbnN0IFttZXRob2QsIHVybF0gPSByb3V0ZS5zcGxpdCgvIC8pO1xuICAgIGNvbnN0IGVuZHBvaW50RGVmYXVsdHMgPSBPYmplY3QuYXNzaWduKFxuICAgICAge1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIHVybFxuICAgICAgfSxcbiAgICAgIGRlZmF1bHRzXG4gICAgKTtcbiAgICBpZiAoIWVuZHBvaW50TWV0aG9kc01hcC5oYXMoc2NvcGUpKSB7XG4gICAgICBlbmRwb2ludE1ldGhvZHNNYXAuc2V0KHNjb3BlLCAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpKTtcbiAgICB9XG4gICAgZW5kcG9pbnRNZXRob2RzTWFwLmdldChzY29wZSkuc2V0KG1ldGhvZE5hbWUsIHtcbiAgICAgIHNjb3BlLFxuICAgICAgbWV0aG9kTmFtZSxcbiAgICAgIGVuZHBvaW50RGVmYXVsdHMsXG4gICAgICBkZWNvcmF0aW9uc1xuICAgIH0pO1xuICB9XG59XG5jb25zdCBoYW5kbGVyID0ge1xuICBoYXMoeyBzY29wZSB9LCBtZXRob2ROYW1lKSB7XG4gICAgcmV0dXJuIGVuZHBvaW50TWV0aG9kc01hcC5nZXQoc2NvcGUpLmhhcyhtZXRob2ROYW1lKTtcbiAgfSxcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgbWV0aG9kTmFtZSkge1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogdGhpcy5nZXQodGFyZ2V0LCBtZXRob2ROYW1lKSxcbiAgICAgIC8vIGVuc3VyZXMgbWV0aG9kIGlzIGluIHRoZSBjYWNoZVxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgfTtcbiAgfSxcbiAgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBtZXRob2ROYW1lLCBkZXNjcmlwdG9yKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldC5jYWNoZSwgbWV0aG9kTmFtZSwgZGVzY3JpcHRvcik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGRlbGV0ZVByb3BlcnR5KHRhcmdldCwgbWV0aG9kTmFtZSkge1xuICAgIGRlbGV0ZSB0YXJnZXQuY2FjaGVbbWV0aG9kTmFtZV07XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIG93bktleXMoeyBzY29wZSB9KSB7XG4gICAgcmV0dXJuIFsuLi5lbmRwb2ludE1ldGhvZHNNYXAuZ2V0KHNjb3BlKS5rZXlzKCldO1xuICB9LFxuICBzZXQodGFyZ2V0LCBtZXRob2ROYW1lLCB2YWx1ZSkge1xuICAgIHJldHVybiB0YXJnZXQuY2FjaGVbbWV0aG9kTmFtZV0gPSB2YWx1ZTtcbiAgfSxcbiAgZ2V0KHsgb2N0b2tpdCwgc2NvcGUsIGNhY2hlIH0sIG1ldGhvZE5hbWUpIHtcbiAgICBpZiAoY2FjaGVbbWV0aG9kTmFtZV0pIHtcbiAgICAgIHJldHVybiBjYWNoZVttZXRob2ROYW1lXTtcbiAgICB9XG4gICAgY29uc3QgbWV0aG9kID0gZW5kcG9pbnRNZXRob2RzTWFwLmdldChzY29wZSkuZ2V0KG1ldGhvZE5hbWUpO1xuICAgIGlmICghbWV0aG9kKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICBjb25zdCB7IGVuZHBvaW50RGVmYXVsdHMsIGRlY29yYXRpb25zIH0gPSBtZXRob2Q7XG4gICAgaWYgKGRlY29yYXRpb25zKSB7XG4gICAgICBjYWNoZVttZXRob2ROYW1lXSA9IGRlY29yYXRlKFxuICAgICAgICBvY3Rva2l0LFxuICAgICAgICBzY29wZSxcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgZW5kcG9pbnREZWZhdWx0cyxcbiAgICAgICAgZGVjb3JhdGlvbnNcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhY2hlW21ldGhvZE5hbWVdID0gb2N0b2tpdC5yZXF1ZXN0LmRlZmF1bHRzKGVuZHBvaW50RGVmYXVsdHMpO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVbbWV0aG9kTmFtZV07XG4gIH1cbn07XG5mdW5jdGlvbiBlbmRwb2ludHNUb01ldGhvZHMob2N0b2tpdCkge1xuICBjb25zdCBuZXdNZXRob2RzID0ge307XG4gIGZvciAoY29uc3Qgc2NvcGUgb2YgZW5kcG9pbnRNZXRob2RzTWFwLmtleXMoKSkge1xuICAgIG5ld01ldGhvZHNbc2NvcGVdID0gbmV3IFByb3h5KHsgb2N0b2tpdCwgc2NvcGUsIGNhY2hlOiB7fSB9LCBoYW5kbGVyKTtcbiAgfVxuICByZXR1cm4gbmV3TWV0aG9kcztcbn1cbmZ1bmN0aW9uIGRlY29yYXRlKG9jdG9raXQsIHNjb3BlLCBtZXRob2ROYW1lLCBkZWZhdWx0cywgZGVjb3JhdGlvbnMpIHtcbiAgY29uc3QgcmVxdWVzdFdpdGhEZWZhdWx0cyA9IG9jdG9raXQucmVxdWVzdC5kZWZhdWx0cyhkZWZhdWx0cyk7XG4gIGZ1bmN0aW9uIHdpdGhEZWNvcmF0aW9ucyguLi5hcmdzKSB7XG4gICAgbGV0IG9wdGlvbnMgPSByZXF1ZXN0V2l0aERlZmF1bHRzLmVuZHBvaW50Lm1lcmdlKC4uLmFyZ3MpO1xuICAgIGlmIChkZWNvcmF0aW9ucy5tYXBUb0RhdGEpIHtcbiAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7XG4gICAgICAgIGRhdGE6IG9wdGlvbnNbZGVjb3JhdGlvbnMubWFwVG9EYXRhXSxcbiAgICAgICAgW2RlY29yYXRpb25zLm1hcFRvRGF0YV06IHZvaWQgMFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVxdWVzdFdpdGhEZWZhdWx0cyhvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKGRlY29yYXRpb25zLnJlbmFtZWQpIHtcbiAgICAgIGNvbnN0IFtuZXdTY29wZSwgbmV3TWV0aG9kTmFtZV0gPSBkZWNvcmF0aW9ucy5yZW5hbWVkO1xuICAgICAgb2N0b2tpdC5sb2cud2FybihcbiAgICAgICAgYG9jdG9raXQuJHtzY29wZX0uJHttZXRob2ROYW1lfSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gb2N0b2tpdC4ke25ld1Njb3BlfS4ke25ld01ldGhvZE5hbWV9KClgXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZGVjb3JhdGlvbnMuZGVwcmVjYXRlZCkge1xuICAgICAgb2N0b2tpdC5sb2cud2FybihkZWNvcmF0aW9ucy5kZXByZWNhdGVkKTtcbiAgICB9XG4gICAgaWYgKGRlY29yYXRpb25zLnJlbmFtZWRQYXJhbWV0ZXJzKSB7XG4gICAgICBjb25zdCBvcHRpb25zMiA9IHJlcXVlc3RXaXRoRGVmYXVsdHMuZW5kcG9pbnQubWVyZ2UoLi4uYXJncyk7XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBhbGlhc10gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICAgIGRlY29yYXRpb25zLnJlbmFtZWRQYXJhbWV0ZXJzXG4gICAgICApKSB7XG4gICAgICAgIGlmIChuYW1lIGluIG9wdGlvbnMyKSB7XG4gICAgICAgICAgb2N0b2tpdC5sb2cud2FybihcbiAgICAgICAgICAgIGBcIiR7bmFtZX1cIiBwYXJhbWV0ZXIgaXMgZGVwcmVjYXRlZCBmb3IgXCJvY3Rva2l0LiR7c2NvcGV9LiR7bWV0aG9kTmFtZX0oKVwiLiBVc2UgXCIke2FsaWFzfVwiIGluc3RlYWRgXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIShhbGlhcyBpbiBvcHRpb25zMikpIHtcbiAgICAgICAgICAgIG9wdGlvbnMyW2FsaWFzXSA9IG9wdGlvbnMyW25hbWVdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWxldGUgb3B0aW9uczJbbmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXF1ZXN0V2l0aERlZmF1bHRzKG9wdGlvbnMyKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcXVlc3RXaXRoRGVmYXVsdHMoLi4uYXJncyk7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24od2l0aERlY29yYXRpb25zLCByZXF1ZXN0V2l0aERlZmF1bHRzKTtcbn1cbmV4cG9ydCB7XG4gIGVuZHBvaW50c1RvTWV0aG9kc1xufTtcbiIsImltcG9ydCB7IFZFUlNJT04gfSBmcm9tIFwiLi92ZXJzaW9uLmpzXCI7XG5pbXBvcnQgeyBlbmRwb2ludHNUb01ldGhvZHMgfSBmcm9tIFwiLi9lbmRwb2ludHMtdG8tbWV0aG9kcy5qc1wiO1xuZnVuY3Rpb24gcmVzdEVuZHBvaW50TWV0aG9kcyhvY3Rva2l0KSB7XG4gIGNvbnN0IGFwaSA9IGVuZHBvaW50c1RvTWV0aG9kcyhvY3Rva2l0KTtcbiAgcmV0dXJuIHtcbiAgICByZXN0OiBhcGlcbiAgfTtcbn1cbnJlc3RFbmRwb2ludE1ldGhvZHMuVkVSU0lPTiA9IFZFUlNJT047XG5mdW5jdGlvbiBsZWdhY3lSZXN0RW5kcG9pbnRNZXRob2RzKG9jdG9raXQpIHtcbiAgY29uc3QgYXBpID0gZW5kcG9pbnRzVG9NZXRob2RzKG9jdG9raXQpO1xuICByZXR1cm4ge1xuICAgIC4uLmFwaSxcbiAgICByZXN0OiBhcGlcbiAgfTtcbn1cbmxlZ2FjeVJlc3RFbmRwb2ludE1ldGhvZHMuVkVSU0lPTiA9IFZFUlNJT047XG5leHBvcnQge1xuICBsZWdhY3lSZXN0RW5kcG9pbnRNZXRob2RzLFxuICByZXN0RW5kcG9pbnRNZXRob2RzXG59O1xuIiwiLy8gcGtnL2Rpc3Qtc3JjL3ZlcnNpb24uanNcbnZhciBWRVJTSU9OID0gXCI5LjIuMlwiO1xuXG4vLyBwa2cvZGlzdC1zcmMvbm9ybWFsaXplLXBhZ2luYXRlZC1saXN0LXJlc3BvbnNlLmpzXG5mdW5jdGlvbiBub3JtYWxpemVQYWdpbmF0ZWRMaXN0UmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgaWYgKCFyZXNwb25zZS5kYXRhKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJlc3BvbnNlLFxuICAgICAgZGF0YTogW11cbiAgICB9O1xuICB9XG4gIGNvbnN0IHJlc3BvbnNlTmVlZHNOb3JtYWxpemF0aW9uID0gXCJ0b3RhbF9jb3VudFwiIGluIHJlc3BvbnNlLmRhdGEgJiYgIShcInVybFwiIGluIHJlc3BvbnNlLmRhdGEpO1xuICBpZiAoIXJlc3BvbnNlTmVlZHNOb3JtYWxpemF0aW9uKVxuICAgIHJldHVybiByZXNwb25zZTtcbiAgY29uc3QgaW5jb21wbGV0ZVJlc3VsdHMgPSByZXNwb25zZS5kYXRhLmluY29tcGxldGVfcmVzdWx0cztcbiAgY29uc3QgcmVwb3NpdG9yeVNlbGVjdGlvbiA9IHJlc3BvbnNlLmRhdGEucmVwb3NpdG9yeV9zZWxlY3Rpb247XG4gIGNvbnN0IHRvdGFsQ291bnQgPSByZXNwb25zZS5kYXRhLnRvdGFsX2NvdW50O1xuICBkZWxldGUgcmVzcG9uc2UuZGF0YS5pbmNvbXBsZXRlX3Jlc3VsdHM7XG4gIGRlbGV0ZSByZXNwb25zZS5kYXRhLnJlcG9zaXRvcnlfc2VsZWN0aW9uO1xuICBkZWxldGUgcmVzcG9uc2UuZGF0YS50b3RhbF9jb3VudDtcbiAgY29uc3QgbmFtZXNwYWNlS2V5ID0gT2JqZWN0LmtleXMocmVzcG9uc2UuZGF0YSlbMF07XG4gIGNvbnN0IGRhdGEgPSByZXNwb25zZS5kYXRhW25hbWVzcGFjZUtleV07XG4gIHJlc3BvbnNlLmRhdGEgPSBkYXRhO1xuICBpZiAodHlwZW9mIGluY29tcGxldGVSZXN1bHRzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmVzcG9uc2UuZGF0YS5pbmNvbXBsZXRlX3Jlc3VsdHMgPSBpbmNvbXBsZXRlUmVzdWx0cztcbiAgfVxuICBpZiAodHlwZW9mIHJlcG9zaXRvcnlTZWxlY3Rpb24gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXNwb25zZS5kYXRhLnJlcG9zaXRvcnlfc2VsZWN0aW9uID0gcmVwb3NpdG9yeVNlbGVjdGlvbjtcbiAgfVxuICByZXNwb25zZS5kYXRhLnRvdGFsX2NvdW50ID0gdG90YWxDb3VudDtcbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG4vLyBwa2cvZGlzdC1zcmMvaXRlcmF0b3IuanNcbmZ1bmN0aW9uIGl0ZXJhdG9yKG9jdG9raXQsIHJvdXRlLCBwYXJhbWV0ZXJzKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSB0eXBlb2Ygcm91dGUgPT09IFwiZnVuY3Rpb25cIiA/IHJvdXRlLmVuZHBvaW50KHBhcmFtZXRlcnMpIDogb2N0b2tpdC5yZXF1ZXN0LmVuZHBvaW50KHJvdXRlLCBwYXJhbWV0ZXJzKTtcbiAgY29uc3QgcmVxdWVzdE1ldGhvZCA9IHR5cGVvZiByb3V0ZSA9PT0gXCJmdW5jdGlvblwiID8gcm91dGUgOiBvY3Rva2l0LnJlcXVlc3Q7XG4gIGNvbnN0IG1ldGhvZCA9IG9wdGlvbnMubWV0aG9kO1xuICBjb25zdCBoZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzO1xuICBsZXQgdXJsID0gb3B0aW9ucy51cmw7XG4gIHJldHVybiB7XG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gKHtcbiAgICAgIGFzeW5jIG5leHQoKSB7XG4gICAgICAgIGlmICghdXJsKVxuICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3RNZXRob2QoeyBtZXRob2QsIHVybCwgaGVhZGVycyB9KTtcbiAgICAgICAgICBjb25zdCBub3JtYWxpemVkUmVzcG9uc2UgPSBub3JtYWxpemVQYWdpbmF0ZWRMaXN0UmVzcG9uc2UocmVzcG9uc2UpO1xuICAgICAgICAgIHVybCA9ICgobm9ybWFsaXplZFJlc3BvbnNlLmhlYWRlcnMubGluayB8fCBcIlwiKS5tYXRjaChcbiAgICAgICAgICAgIC88KFtePD5dKyk+O1xccypyZWw9XCJuZXh0XCIvXG4gICAgICAgICAgKSB8fCBbXSlbMV07XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG5vcm1hbGl6ZWRSZXNwb25zZSB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgIT09IDQwOSlcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIHVybCA9IFwiXCI7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgICAgICAgZGF0YTogW11cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfTtcbn1cblxuLy8gcGtnL2Rpc3Qtc3JjL3BhZ2luYXRlLmpzXG5mdW5jdGlvbiBwYWdpbmF0ZShvY3Rva2l0LCByb3V0ZSwgcGFyYW1ldGVycywgbWFwRm4pIHtcbiAgaWYgKHR5cGVvZiBwYXJhbWV0ZXJzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBtYXBGbiA9IHBhcmFtZXRlcnM7XG4gICAgcGFyYW1ldGVycyA9IHZvaWQgMDtcbiAgfVxuICByZXR1cm4gZ2F0aGVyKFxuICAgIG9jdG9raXQsXG4gICAgW10sXG4gICAgaXRlcmF0b3Iob2N0b2tpdCwgcm91dGUsIHBhcmFtZXRlcnMpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpLFxuICAgIG1hcEZuXG4gICk7XG59XG5mdW5jdGlvbiBnYXRoZXIob2N0b2tpdCwgcmVzdWx0cywgaXRlcmF0b3IyLCBtYXBGbikge1xuICByZXR1cm4gaXRlcmF0b3IyLm5leHQoKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cbiAgICBsZXQgZWFybHlFeGl0ID0gZmFsc2U7XG4gICAgZnVuY3Rpb24gZG9uZSgpIHtcbiAgICAgIGVhcmx5RXhpdCA9IHRydWU7XG4gICAgfVxuICAgIHJlc3VsdHMgPSByZXN1bHRzLmNvbmNhdChcbiAgICAgIG1hcEZuID8gbWFwRm4ocmVzdWx0LnZhbHVlLCBkb25lKSA6IHJlc3VsdC52YWx1ZS5kYXRhXG4gICAgKTtcbiAgICBpZiAoZWFybHlFeGl0KSB7XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG4gICAgcmV0dXJuIGdhdGhlcihvY3Rva2l0LCByZXN1bHRzLCBpdGVyYXRvcjIsIG1hcEZuKTtcbiAgfSk7XG59XG5cbi8vIHBrZy9kaXN0LXNyYy9jb21wb3NlLXBhZ2luYXRlLmpzXG52YXIgY29tcG9zZVBhZ2luYXRlUmVzdCA9IE9iamVjdC5hc3NpZ24ocGFnaW5hdGUsIHtcbiAgaXRlcmF0b3Jcbn0pO1xuXG4vLyBwa2cvZGlzdC1zcmMvZ2VuZXJhdGVkL3BhZ2luYXRpbmctZW5kcG9pbnRzLmpzXG52YXIgcGFnaW5hdGluZ0VuZHBvaW50cyA9IFtcbiAgXCJHRVQgL2Fkdmlzb3JpZXNcIixcbiAgXCJHRVQgL2FwcC9ob29rL2RlbGl2ZXJpZXNcIixcbiAgXCJHRVQgL2FwcC9pbnN0YWxsYXRpb24tcmVxdWVzdHNcIixcbiAgXCJHRVQgL2FwcC9pbnN0YWxsYXRpb25zXCIsXG4gIFwiR0VUIC9hc3NpZ25tZW50cy97YXNzaWdubWVudF9pZH0vYWNjZXB0ZWRfYXNzaWdubWVudHNcIixcbiAgXCJHRVQgL2NsYXNzcm9vbXNcIixcbiAgXCJHRVQgL2NsYXNzcm9vbXMve2NsYXNzcm9vbV9pZH0vYXNzaWdubWVudHNcIixcbiAgXCJHRVQgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9kZXBlbmRhYm90L2FsZXJ0c1wiLFxuICBcIkdFVCAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L3NlY3JldC1zY2FubmluZy9hbGVydHNcIixcbiAgXCJHRVQgL2V2ZW50c1wiLFxuICBcIkdFVCAvZ2lzdHNcIixcbiAgXCJHRVQgL2dpc3RzL3B1YmxpY1wiLFxuICBcIkdFVCAvZ2lzdHMvc3RhcnJlZFwiLFxuICBcIkdFVCAvZ2lzdHMve2dpc3RfaWR9L2NvbW1lbnRzXCIsXG4gIFwiR0VUIC9naXN0cy97Z2lzdF9pZH0vY29tbWl0c1wiLFxuICBcIkdFVCAvZ2lzdHMve2dpc3RfaWR9L2ZvcmtzXCIsXG4gIFwiR0VUIC9pbnN0YWxsYXRpb24vcmVwb3NpdG9yaWVzXCIsXG4gIFwiR0VUIC9pc3N1ZXNcIixcbiAgXCJHRVQgL2xpY2Vuc2VzXCIsXG4gIFwiR0VUIC9tYXJrZXRwbGFjZV9saXN0aW5nL3BsYW5zXCIsXG4gIFwiR0VUIC9tYXJrZXRwbGFjZV9saXN0aW5nL3BsYW5zL3twbGFuX2lkfS9hY2NvdW50c1wiLFxuICBcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9zdHViYmVkL3BsYW5zXCIsXG4gIFwiR0VUIC9tYXJrZXRwbGFjZV9saXN0aW5nL3N0dWJiZWQvcGxhbnMve3BsYW5faWR9L2FjY291bnRzXCIsXG4gIFwiR0VUIC9uZXR3b3Jrcy97b3duZXJ9L3tyZXBvfS9ldmVudHNcIixcbiAgXCJHRVQgL25vdGlmaWNhdGlvbnNcIixcbiAgXCJHRVQgL29yZ2FuaXphdGlvbnNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9jYWNoZS91c2FnZS1ieS1yZXBvc2l0b3J5XCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnMvcmVwb3NpdG9yaWVzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVyc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvdmFyaWFibGVzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvdmFyaWFibGVzL3tuYW1lfS9yZXBvc2l0b3JpZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vYmxvY2tzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2NvZGUtc2Nhbm5pbmcvYWxlcnRzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vY29kZXNwYWNlcy9zZWNyZXRzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9jb3BpbG90L2JpbGxpbmcvc2VhdHNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9hbGVydHNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9ldmVudHNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vZmFpbGVkX2ludml0YXRpb25zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2hvb2tzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2hvb2tzL3tob29rX2lkfS9kZWxpdmVyaWVzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2luc3RhbGxhdGlvbnNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vaW52aXRhdGlvbnNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vaW52aXRhdGlvbnMve2ludml0YXRpb25faWR9L3RlYW1zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2lzc3Vlc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9tZW1iZXJzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L21lbWJlcnMve3VzZXJuYW1lfS9jb2Rlc3BhY2VzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L21pZ3JhdGlvbnNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvc2l0b3JpZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vb3JnYW5pemF0aW9uLXJvbGVzL3tyb2xlX2lkfS90ZWFtc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9vcmdhbml6YXRpb24tcm9sZXMve3JvbGVfaWR9L3VzZXJzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L291dHNpZGVfY29sbGFib3JhdG9yc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9wYWNrYWdlc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9uc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9wZXJzb25hbC1hY2Nlc3MtdG9rZW4tcmVxdWVzdHNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcGVyc29uYWwtYWNjZXNzLXRva2VuLXJlcXVlc3RzL3twYXRfcmVxdWVzdF9pZH0vcmVwb3NpdG9yaWVzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3BlcnNvbmFsLWFjY2Vzcy10b2tlbnNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcGVyc29uYWwtYWNjZXNzLXRva2Vucy97cGF0X2lkfS9yZXBvc2l0b3JpZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcHJvamVjdHNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcHJvcGVydGllcy92YWx1ZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcHVibGljX21lbWJlcnNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcmVwb3NcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcnVsZXNldHNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcnVsZXNldHMvcnVsZS1zdWl0ZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0c1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9zZWN1cml0eS1hZHZpc29yaWVzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9jb21tZW50cy97Y29tbWVudF9udW1iZXJ9L3JlYWN0aW9uc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L3JlYWN0aW9uc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9pbnZpdGF0aW9uc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9tZW1iZXJzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3Byb2plY3RzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3JlcG9zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3RlYW1zXCIsXG4gIFwiR0VUIC9wcm9qZWN0cy9jb2x1bW5zL3tjb2x1bW5faWR9L2NhcmRzXCIsXG4gIFwiR0VUIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sbGFib3JhdG9yc1wiLFxuICBcIkdFVCAvcHJvamVjdHMve3Byb2plY3RfaWR9L2NvbHVtbnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvYXJ0aWZhY3RzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2NhY2hlc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9vcmdhbml6YXRpb24tc2VjcmV0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9vcmdhbml6YXRpb24tdmFyaWFibGVzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVuc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2FydGlmYWN0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2F0dGVtcHRzL3thdHRlbXB0X251bWJlcn0vam9ic1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2pvYnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy92YXJpYWJsZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3dvcmtmbG93cy97d29ya2Zsb3dfaWR9L3J1bnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGl2aXR5XCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hc3NpZ25lZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1ydW5zL3tjaGVja19ydW5faWR9L2Fubm90YXRpb25zXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1zdWl0ZXMve2NoZWNrX3N1aXRlX2lkfS9jaGVjay1ydW5zXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2FsZXJ0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn0vaW5zdGFuY2VzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2FuYWx5c2VzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL2RldmNvbnRhaW5lcnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvc2VjcmV0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29sbGFib3JhdG9yc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWVudHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1lbnRzL3tjb21tZW50X2lkfS9yZWFjdGlvbnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve2NvbW1pdF9zaGF9L2NvbW1lbnRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tjb21taXRfc2hhfS9wdWxsc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97cmVmfS9jaGVjay1ydW5zXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tyZWZ9L2NoZWNrLXN1aXRlc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97cmVmfS9zdGF0dXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve3JlZn0vc3RhdHVzZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbnRyaWJ1dG9yc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kYWJvdC9hbGVydHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGFib3Qvc2VjcmV0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwbG95bWVudHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGxveW1lbnRzL3tkZXBsb3ltZW50X2lkfS9zdGF0dXNlc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZW52aXJvbm1lbnRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L2RlcGxveW1lbnQtYnJhbmNoLXBvbGljaWVzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L2RlcGxveW1lbnRfcHJvdGVjdGlvbl9ydWxlcy9hcHBzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ldmVudHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ZvcmtzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3Mve2hvb2tfaWR9L2RlbGl2ZXJpZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ludml0YXRpb25zXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL2NvbW1lbnRzL3tjb21tZW50X2lkfS9yZWFjdGlvbnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9ldmVudHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9jb21tZW50c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2V2ZW50c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2xhYmVsc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L3JlYWN0aW9uc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L3RpbWVsaW5lXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9rZXlzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L21pbGVzdG9uZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L21pbGVzdG9uZXMve21pbGVzdG9uZV9udW1iZXJ9L2xhYmVsc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbm90aWZpY2F0aW9uc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvYnVpbGRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wcm9qZWN0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL2NvbW1lbnRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvbW1lbnRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvbW1pdHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vZmlsZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmV2aWV3c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzL3tyZXZpZXdfaWR9L2NvbW1lbnRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMve3JlbGVhc2VfaWR9L2Fzc2V0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMve3JlbGVhc2VfaWR9L3JlYWN0aW9uc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXMvYnJhbmNoZXMve2JyYW5jaH1cIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cy9ydWxlLXN1aXRlc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0cy97YWxlcnRfbnVtYmVyfS9sb2NhdGlvbnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3VyaXR5LWFkdmlzb3JpZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N0YXJnYXplcnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N1YnNjcmliZXJzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90YWdzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90ZWFtc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdG9waWNzXCIsXG4gIFwiR0VUIC9yZXBvc2l0b3JpZXNcIixcbiAgXCJHRVQgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9zZWNyZXRzXCIsXG4gIFwiR0VUIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vdmFyaWFibGVzXCIsXG4gIFwiR0VUIC9zZWFyY2gvY29kZVwiLFxuICBcIkdFVCAvc2VhcmNoL2NvbW1pdHNcIixcbiAgXCJHRVQgL3NlYXJjaC9pc3N1ZXNcIixcbiAgXCJHRVQgL3NlYXJjaC9sYWJlbHNcIixcbiAgXCJHRVQgL3NlYXJjaC9yZXBvc2l0b3JpZXNcIixcbiAgXCJHRVQgL3NlYXJjaC90b3BpY3NcIixcbiAgXCJHRVQgL3NlYXJjaC91c2Vyc1wiLFxuICBcIkdFVCAvdGVhbXMve3RlYW1faWR9L2Rpc2N1c3Npb25zXCIsXG4gIFwiR0VUIC90ZWFtcy97dGVhbV9pZH0vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9jb21tZW50c1wiLFxuICBcIkdFVCAvdGVhbXMve3RlYW1faWR9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfbnVtYmVyfS9yZWFjdGlvbnNcIixcbiAgXCJHRVQgL3RlYW1zL3t0ZWFtX2lkfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L3JlYWN0aW9uc1wiLFxuICBcIkdFVCAvdGVhbXMve3RlYW1faWR9L2ludml0YXRpb25zXCIsXG4gIFwiR0VUIC90ZWFtcy97dGVhbV9pZH0vbWVtYmVyc1wiLFxuICBcIkdFVCAvdGVhbXMve3RlYW1faWR9L3Byb2plY3RzXCIsXG4gIFwiR0VUIC90ZWFtcy97dGVhbV9pZH0vcmVwb3NcIixcbiAgXCJHRVQgL3RlYW1zL3t0ZWFtX2lkfS90ZWFtc1wiLFxuICBcIkdFVCAvdXNlci9ibG9ja3NcIixcbiAgXCJHRVQgL3VzZXIvY29kZXNwYWNlc1wiLFxuICBcIkdFVCAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHNcIixcbiAgXCJHRVQgL3VzZXIvZW1haWxzXCIsXG4gIFwiR0VUIC91c2VyL2ZvbGxvd2Vyc1wiLFxuICBcIkdFVCAvdXNlci9mb2xsb3dpbmdcIixcbiAgXCJHRVQgL3VzZXIvZ3BnX2tleXNcIixcbiAgXCJHRVQgL3VzZXIvaW5zdGFsbGF0aW9uc1wiLFxuICBcIkdFVCAvdXNlci9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9L3JlcG9zaXRvcmllc1wiLFxuICBcIkdFVCAvdXNlci9pc3N1ZXNcIixcbiAgXCJHRVQgL3VzZXIva2V5c1wiLFxuICBcIkdFVCAvdXNlci9tYXJrZXRwbGFjZV9wdXJjaGFzZXNcIixcbiAgXCJHRVQgL3VzZXIvbWFya2V0cGxhY2VfcHVyY2hhc2VzL3N0dWJiZWRcIixcbiAgXCJHRVQgL3VzZXIvbWVtYmVyc2hpcHMvb3Jnc1wiLFxuICBcIkdFVCAvdXNlci9taWdyYXRpb25zXCIsXG4gIFwiR0VUIC91c2VyL21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH0vcmVwb3NpdG9yaWVzXCIsXG4gIFwiR0VUIC91c2VyL29yZ3NcIixcbiAgXCJHRVQgL3VzZXIvcGFja2FnZXNcIixcbiAgXCJHRVQgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnNcIixcbiAgXCJHRVQgL3VzZXIvcHVibGljX2VtYWlsc1wiLFxuICBcIkdFVCAvdXNlci9yZXBvc1wiLFxuICBcIkdFVCAvdXNlci9yZXBvc2l0b3J5X2ludml0YXRpb25zXCIsXG4gIFwiR0VUIC91c2VyL3NvY2lhbF9hY2NvdW50c1wiLFxuICBcIkdFVCAvdXNlci9zc2hfc2lnbmluZ19rZXlzXCIsXG4gIFwiR0VUIC91c2VyL3N0YXJyZWRcIixcbiAgXCJHRVQgL3VzZXIvc3Vic2NyaXB0aW9uc1wiLFxuICBcIkdFVCAvdXNlci90ZWFtc1wiLFxuICBcIkdFVCAvdXNlcnNcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZXZlbnRzXCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L2V2ZW50cy9vcmdzL3tvcmd9XCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L2V2ZW50cy9wdWJsaWNcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZm9sbG93ZXJzXCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L2ZvbGxvd2luZ1wiLFxuICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9naXN0c1wiLFxuICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9ncGdfa2V5c1wiLFxuICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9rZXlzXCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L29yZ3NcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcGFja2FnZXNcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcHJvamVjdHNcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcmVjZWl2ZWRfZXZlbnRzXCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3JlY2VpdmVkX2V2ZW50cy9wdWJsaWNcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcmVwb3NcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc29jaWFsX2FjY291bnRzXCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3NzaF9zaWduaW5nX2tleXNcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc3RhcnJlZFwiLFxuICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9zdWJzY3JpcHRpb25zXCJcbl07XG5cbi8vIHBrZy9kaXN0LXNyYy9wYWdpbmF0aW5nLWVuZHBvaW50cy5qc1xuZnVuY3Rpb24gaXNQYWdpbmF0aW5nRW5kcG9pbnQoYXJnKSB7XG4gIGlmICh0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHBhZ2luYXRpbmdFbmRwb2ludHMuaW5jbHVkZXMoYXJnKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLy8gcGtnL2Rpc3Qtc3JjL2luZGV4LmpzXG5mdW5jdGlvbiBwYWdpbmF0ZVJlc3Qob2N0b2tpdCkge1xuICByZXR1cm4ge1xuICAgIHBhZ2luYXRlOiBPYmplY3QuYXNzaWduKHBhZ2luYXRlLmJpbmQobnVsbCwgb2N0b2tpdCksIHtcbiAgICAgIGl0ZXJhdG9yOiBpdGVyYXRvci5iaW5kKG51bGwsIG9jdG9raXQpXG4gICAgfSlcbiAgfTtcbn1cbnBhZ2luYXRlUmVzdC5WRVJTSU9OID0gVkVSU0lPTjtcbmV4cG9ydCB7XG4gIGNvbXBvc2VQYWdpbmF0ZVJlc3QsXG4gIGlzUGFnaW5hdGluZ0VuZHBvaW50LFxuICBwYWdpbmF0ZVJlc3QsXG4gIHBhZ2luYXRpbmdFbmRwb2ludHNcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRPY3Rva2l0T3B0aW9ucyA9IGV4cG9ydHMuR2l0SHViID0gZXhwb3J0cy5kZWZhdWx0cyA9IGV4cG9ydHMuY29udGV4dCA9IHZvaWQgMDtcbmNvbnN0IENvbnRleHQgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vY29udGV4dFwiKSk7XG5jb25zdCBVdGlscyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9pbnRlcm5hbC91dGlsc1wiKSk7XG4vLyBvY3Rva2l0ICsgcGx1Z2luc1xuY29uc3QgY29yZV8xID0gcmVxdWlyZShcIkBvY3Rva2l0L2NvcmVcIik7XG5jb25zdCBwbHVnaW5fcmVzdF9lbmRwb2ludF9tZXRob2RzXzEgPSByZXF1aXJlKFwiQG9jdG9raXQvcGx1Z2luLXJlc3QtZW5kcG9pbnQtbWV0aG9kc1wiKTtcbmNvbnN0IHBsdWdpbl9wYWdpbmF0ZV9yZXN0XzEgPSByZXF1aXJlKFwiQG9jdG9raXQvcGx1Z2luLXBhZ2luYXRlLXJlc3RcIik7XG5leHBvcnRzLmNvbnRleHQgPSBuZXcgQ29udGV4dC5Db250ZXh0KCk7XG5jb25zdCBiYXNlVXJsID0gVXRpbHMuZ2V0QXBpQmFzZVVybCgpO1xuZXhwb3J0cy5kZWZhdWx0cyA9IHtcbiAgICBiYXNlVXJsLFxuICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgYWdlbnQ6IFV0aWxzLmdldFByb3h5QWdlbnQoYmFzZVVybCksXG4gICAgICAgIGZldGNoOiBVdGlscy5nZXRQcm94eUZldGNoKGJhc2VVcmwpXG4gICAgfVxufTtcbmV4cG9ydHMuR2l0SHViID0gY29yZV8xLk9jdG9raXQucGx1Z2luKHBsdWdpbl9yZXN0X2VuZHBvaW50X21ldGhvZHNfMS5yZXN0RW5kcG9pbnRNZXRob2RzLCBwbHVnaW5fcGFnaW5hdGVfcmVzdF8xLnBhZ2luYXRlUmVzdCkuZGVmYXVsdHMoZXhwb3J0cy5kZWZhdWx0cyk7XG4vKipcbiAqIENvbnZpZW5jZSBmdW5jdGlvbiB0byBjb3JyZWN0bHkgZm9ybWF0IE9jdG9raXQgT3B0aW9ucyB0byBwYXNzIGludG8gdGhlIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBwYXJhbSAgICAgdG9rZW4gICAgdGhlIHJlcG8gUEFUIG9yIEdJVEhVQl9UT0tFTlxuICogQHBhcmFtICAgICBvcHRpb25zICBvdGhlciBvcHRpb25zIHRvIHNldFxuICovXG5mdW5jdGlvbiBnZXRPY3Rva2l0T3B0aW9ucyh0b2tlbiwgb3B0aW9ucykge1xuICAgIGNvbnN0IG9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zIHx8IHt9KTsgLy8gU2hhbGxvdyBjbG9uZSAtIGRvbid0IG11dGF0ZSB0aGUgb2JqZWN0IHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXJcbiAgICAvLyBBdXRoXG4gICAgY29uc3QgYXV0aCA9IFV0aWxzLmdldEF1dGhTdHJpbmcodG9rZW4sIG9wdHMpO1xuICAgIGlmIChhdXRoKSB7XG4gICAgICAgIG9wdHMuYXV0aCA9IGF1dGg7XG4gICAgfVxuICAgIHJldHVybiBvcHRzO1xufVxuZXhwb3J0cy5nZXRPY3Rva2l0T3B0aW9ucyA9IGdldE9jdG9raXRPcHRpb25zO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0T2N0b2tpdCA9IGV4cG9ydHMuY29udGV4dCA9IHZvaWQgMDtcbmNvbnN0IENvbnRleHQgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vY29udGV4dFwiKSk7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG5leHBvcnRzLmNvbnRleHQgPSBuZXcgQ29udGV4dC5Db250ZXh0KCk7XG4vKipcbiAqIFJldHVybnMgYSBoeWRyYXRlZCBvY3Rva2l0IHJlYWR5IHRvIHVzZSBmb3IgR2l0SHViIEFjdGlvbnNcbiAqXG4gKiBAcGFyYW0gICAgIHRva2VuICAgIHRoZSByZXBvIFBBVCBvciBHSVRIVUJfVE9LRU5cbiAqIEBwYXJhbSAgICAgb3B0aW9ucyAgb3RoZXIgb3B0aW9ucyB0byBzZXRcbiAqL1xuZnVuY3Rpb24gZ2V0T2N0b2tpdCh0b2tlbiwgb3B0aW9ucywgLi4uYWRkaXRpb25hbFBsdWdpbnMpIHtcbiAgICBjb25zdCBHaXRIdWJXaXRoUGx1Z2lucyA9IHV0aWxzXzEuR2l0SHViLnBsdWdpbiguLi5hZGRpdGlvbmFsUGx1Z2lucyk7XG4gICAgcmV0dXJuIG5ldyBHaXRIdWJXaXRoUGx1Z2lucygoMCwgdXRpbHNfMS5nZXRPY3Rva2l0T3B0aW9ucykodG9rZW4sIG9wdGlvbnMpKTtcbn1cbmV4cG9ydHMuZ2V0T2N0b2tpdCA9IGdldE9jdG9raXQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1naXRodWIuanMubWFwIiwiaW1wb3J0IHt0eXBlIEV4ZWNTeW5jT3B0aW9ucywgZXhlY1N5bmN9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmZ1bmN0aW9uIGVzY2FwZUNvbW1hbmQoY29tbWFuZDogc3RyaW5nKSB7XG4gIHJldHVybiBjb21tYW5kLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKTtcbn1cblxuZXhwb3J0IGNvbnN0IG5peEV4ZWNTeW5jID0gKGNvbW1hbmQ6IHN0cmluZywgb3B0aW9ucz86IEV4ZWNTeW5jT3B0aW9ucykgPT5cbiAgZXhlY1N5bmMoYG5peCBkZXZlbG9wIC1jIGJhc2ggLWMgXCIke2VzY2FwZUNvbW1hbmQoY29tbWFuZCl9XCJgLCB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBlbmNvZGluZzogJ3V0Zi04JyxcbiAgfSk7XG4iLCJpbXBvcnQge3JlYWRGaWxlU3luY30gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgY29yZSBmcm9tICdAYWN0aW9ucy9jb3JlJztcbmltcG9ydCBnaXRodWIgZnJvbSAnQGFjdGlvbnMvZ2l0aHViJztcbmltcG9ydCB0eXBlIHtjb21wb25lbnRzfSBmcm9tICdAb2N0b2tpdC9vcGVuYXBpLXdlYmhvb2tzLXR5cGVzJztcbmltcG9ydCB7bml4RXhlY1N5bmN9IGZyb20gJy4vdXRpbHMnO1xuXG50eXBlIFB1bGxSZXF1ZXN0RXZlbnQgPSBjb21wb25lbnRzWydzY2hlbWFzJ11bJ3dlYmhvb2stcHVsbC1yZXF1ZXN0LW9wZW5lZCddO1xudHlwZSBQdXNoRXZlbnQgPSBjb21wb25lbnRzWydzY2hlbWFzJ11bJ3dlYmhvb2stcHVzaCddO1xudHlwZSBXb3JrZmxvd0Rpc3BhdGNoRXZlbnQgPSBjb21wb25lbnRzWydzY2hlbWFzJ11bJ3dlYmhvb2std29ya2Zsb3ctZGlzcGF0Y2gnXTtcblxudHlwZSBFdmVudCA9IFB1bGxSZXF1ZXN0RXZlbnQgfCBQdXNoRXZlbnQgfCBXb3JrZmxvd0Rpc3BhdGNoRXZlbnQ7XG5cbmxldCBfZXZlbnQ6IEV2ZW50IHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBnZXRFdmVudCgpOiBFdmVudCB7XG4gIGlmIChfZXZlbnQpIHJldHVybiBfZXZlbnQ7XG4gIGNvbnN0IGV2ZW50UGF0aCA9IHByb2Nlc3MuZW52LkdJVEhVQl9FVkVOVF9QQVRIO1xuICBpZiAoIWV2ZW50UGF0aCkgdGhyb3cgbmV3IEVycm9yKCdHSVRIVUJfRVZFTlRfUEFUSCBpcyBub3Qgc2V0Jyk7XG4gIGNvbnN0IHJhd0V2ZW50ID0gcmVhZEZpbGVTeW5jKGV2ZW50UGF0aCwgJ3V0ZjgnKTtcbiAgY29yZS5kZWJ1ZyhyYXdFdmVudCk7XG4gIF9ldmVudCA9IEpTT04ucGFyc2UocmF3RXZlbnQpIGFzIEV2ZW50O1xuICByZXR1cm4gX2V2ZW50O1xufVxuXG5jb25zdCBib3RBY2NvdW50cyA9IFsnc2hpcGZveC1kZXBsb3ktYm90J107XG5cbmludGVyZmFjZSBFdmVudERldGFpbHMge1xuICBhY3Rvcjogc3RyaW5nO1xuICBpc0JvdEFjdG9yOiBib29sZWFuO1xuICBldmVudDogRXZlbnQ7XG4gIGV2ZW50TmFtZTogc3RyaW5nO1xuICBpc09uTWFpbjogYm9vbGVhbjtcbn1cblxubGV0IF9ldmVudERldGFpbHM6IEV2ZW50RGV0YWlscyB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gZ2V0RXZlbnREZXRhaWxzKCk6IEV2ZW50RGV0YWlscyB7XG4gIGlmIChfZXZlbnREZXRhaWxzKSByZXR1cm4gX2V2ZW50RGV0YWlscztcbiAgY29uc3QgZXZlbnROYW1lID0gZ2l0aHViLmNvbnRleHQuZXZlbnROYW1lO1xuICBjb3JlLmRlYnVnKGBFdmVudCBuYW1lOiAke2V2ZW50TmFtZX1gKTtcbiAgY29uc3QgYWN0b3IgPSBnaXRodWIuY29udGV4dC5hY3RvcjtcbiAgY29yZS5kZWJ1ZyhgQWN0b3I6ICR7YWN0b3J9YCk7XG4gIGNvbnN0IGlzQm90QWN0b3IgPSBib3RBY2NvdW50cy5pbmNsdWRlcyhhY3Rvcik7XG4gIGNvcmUuZGVidWcoYElzIGJvdCBhY3RvcjogJHtpc0JvdEFjdG9yfWApO1xuICBjb25zdCBldmVudCA9IGdldEV2ZW50KCk7XG4gIGNvbnN0IGlzT25NYWluID0gJ3JlZicgaW4gZXZlbnQgJiYgZXZlbnQucmVmID09PSAncmVmcy9oZWFkcy9tYWluJztcbiAgY29yZS5kZWJ1ZyhgSXMgb24gbWFpbjogJHtpc09uTWFpbn1gKTtcbiAgX2V2ZW50RGV0YWlscyA9IHtcbiAgICBhY3RvcixcbiAgICBpc0JvdEFjdG9yLFxuICAgIGV2ZW50LFxuICAgIGV2ZW50TmFtZSxcbiAgICBpc09uTWFpbixcbiAgfTtcbiAgcmV0dXJuIF9ldmVudERldGFpbHM7XG59XG5cbmZ1bmN0aW9uIGdldFR1cmJvQmFzZSgpOiBzdHJpbmcge1xuICBjb25zdCB7ZXZlbnR9ID0gZ2V0RXZlbnREZXRhaWxzKCk7XG4gIGlmICgncHVsbF9yZXF1ZXN0JyBpbiBldmVudCkgcmV0dXJuIGV2ZW50LnB1bGxfcmVxdWVzdC5iYXNlLnNoYTtcbiAgaWYgKCdiZWZvcmUnIGluIGV2ZW50KSByZXR1cm4gZXZlbnQuYmVmb3JlO1xuICByZXR1cm4gJ29yaWdpbi9tYWluJztcbn1cblxuZnVuY3Rpb24gZ2V0Tm9kZVZlcnNpb24oKTogc3RyaW5nIHtcbiAgY29uc3Qgb3V0cHV0ID0gbml4RXhlY1N5bmMoJ25vZGUgLS12ZXJzaW9uJyk7XG4gIHJldHVybiBvdXRwdXQudHJpbSgpLnNsaWNlKDEpO1xufVxuXG5mdW5jdGlvbiBnZXRQbnBtVmVyc2lvbigpOiBzdHJpbmcge1xuICBjb25zdCBvdXRwdXQgPSBuaXhFeGVjU3luYygncG5wbSAtLXZlcnNpb24nKTtcbiAgcmV0dXJuIG91dHB1dC50cmltKCk7XG59XG5cbmludGVyZmFjZSBDb250ZXh0IHtcbiAgdHVyYm9CYXNlOiBzdHJpbmc7XG4gIHZlcnNpb25zOiB7XG4gICAgbm9kZTogc3RyaW5nO1xuICAgIHBucG06IHN0cmluZztcbiAgfTtcbn1cblxubGV0IF9jb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29udGV4dCgpOiBDb250ZXh0IHtcbiAgaWYgKCFfY29udGV4dClcbiAgICBfY29udGV4dCA9IHtcbiAgICAgIHR1cmJvQmFzZTogZ2V0VHVyYm9CYXNlKCksXG4gICAgICB2ZXJzaW9uczoge1xuICAgICAgICBub2RlOiBnZXROb2RlVmVyc2lvbigpLFxuICAgICAgICBwbnBtOiBnZXRQbnBtVmVyc2lvbigpLFxuICAgICAgfSxcbiAgICB9O1xuICBjb3JlLmRlYnVnKGBDb250ZXh0OiAke0pTT04uc3RyaW5naWZ5KF9jb250ZXh0KX1gKTtcbiAgcmV0dXJuIF9jb250ZXh0O1xufVxuIiwiaW1wb3J0IGNvcmUgZnJvbSAnQGFjdGlvbnMvY29yZSc7XG5pbXBvcnQge2dldENvbnRleHR9IGZyb20gJy4vY29udGV4dCc7XG5pbXBvcnQge25peEV4ZWNTeW5jfSBmcm9tICcuL3V0aWxzJztcblxuZnVuY3Rpb24gZ2V0VHVyYm9UYXNrcygpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHRhc2tzOiBzdHJpbmdbXSA9IFsnY2hlY2snLCAndHlwZScsICdidWlsZCcsICd0ZXN0J107XG4gIHJldHVybiB0YXNrcztcbn1cblxuZnVuY3Rpb24gcnVuVHVyYm8oKSB7XG4gIGNvbnN0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7XG4gIGNvbnN0IHRhc2tzID0gZ2V0VHVyYm9UYXNrcygpO1xuICBjb3JlLmluZm8oYFJ1bm5pbmcgdGFza3M6ICR7dGFza3Muam9pbignLCAnKX1gKTtcbiAgY29uc3QgY29tbWFuZCA9IGBwbnBtIHR1cmJvICR7dGFza3Muam9pbignICcpfSAtLWFmZmVjdGVkIC0tY29uY3VycmVuY3kgMTAwJWA7XG4gIGNvcmUuaW5mbyhgUnVubmluZyB0dXJibyBjb21tYW5kOiAke2NvbW1hbmR9YCk7XG4gIG5peEV4ZWNTeW5jKGNvbW1hbmQsIHtcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIGVudjoge1xuICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICBOT0RFX1ZFUlNJT046IGNvbnRleHQudmVyc2lvbnMubm9kZSxcbiAgICAgIFBOUE1fVkVSU0lPTjogY29udGV4dC52ZXJzaW9ucy5wbnBtLFxuICAgICAgVFVSQk9fU0NNX0JBU0U6IGNvbnRleHQudHVyYm9CYXNlLFxuICAgIH0sXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBydW4oKSB7XG4gIHJ1blR1cmJvKCk7XG59XG5cbnRyeSB7XG4gIHJ1bigpO1xufSBjYXRjaCAoZXJyb3IpIHtcbiAgY29uc3QgZGlzcGxheWVkRXJyb3IgPVxuICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgfHwgdHlwZW9mIGVycm9yID09PSAnc3RyaW5nJyA/IGVycm9yIDogSlNPTi5zdHJpbmdpZnkoZXJyb3IpO1xuICBjb3JlLnNldEZhaWxlZChkaXNwbGF5ZWRFcnJvcik7XG59XG4iXSwibmFtZXMiOlsidXRpbHMiLCJ0aGlzIiwicmVxdWlyZSQkMSIsImNvbW1hbmQiLCJyZXF1aXJlJCQwIiwicmVxdWlyZSQkMiIsInJlcXVpcmUkJDMiLCJfYSIsImV2ZW50cyIsInJlcXVpcmUkJDQiLCJ1dGlsIiwicmVxdWlyZSQkNiIsInR1bm5lbCIsImFnZW50Iiwic2VsZiIsIm9wdGlvbnMiLCJzb2NrZXQiLCJzeW1ib2xzIiwiaGVhZGVycyIsImJvZHkiLCJjb25zdGFudHMiLCJyZXF1aXJlJCQ1IiwiQmxvYiIsInJlcXVpcmUkJDciLCJyZXF1aXJlJCQ5IiwiaWR4Iiwic3RyZWFtIiwiZXJyIiwiaGFuZGxlciIsInJlcXVpcmUkJDEwIiwiaXRlcmF0b3IiLCJnZXRMaW1pdCIsImVuY29kaW5nIiwiYmFzZW5hbWUiLCJmaWxlIiwibWFpbk1vZHVsZSIsIkRPTUV4Y2VwdGlvbiIsInN0cnVjdHVyZWRDbG9uZSIsImdsb2JhbCIsInBlcmZvcm1hbmNlIiwicmVzcG9uc2UiLCJyZXF1ZXN0Iiwia2luZCIsImNvbnRleHQiLCJrZXlzIiwiYXRvYiIsImRhdGFVUkwiLCJlbnRyeSIsInJlcXVpcmUkJDgiLCJyZXF1aXJlJCQxMSIsInJlcXVpcmUkJDEyIiwiY2h1bmsiLCJjb25uZWN0Iiwic2Vzc2lvbiIsIm9uQ29ubmVjdFRpbWVvdXQiLCJleHBvcnRzIiwiTUVUSE9EUyIsIkhFQURFUl9TVEFURSIsInRpbWVycyIsImNsaWVudCIsInJlcXVpcmUkJDEzIiwicmVxdWlyZSQkMTQiLCJyZXF1aXJlJCQxNSIsInJlcXVpcmUkJDE2IiwicG9vbCIsImRpc3BhdGNoZXIiLCJvcmlnaW4iLCJXZWFrUmVmIiwibm9vcCIsImNvbnN1bWUiLCJhcGlSZXF1ZXN0TW9kdWxlIiwiY2FsbGJhY2siLCJyZXMiLCJvcGFxdWUiLCJtb2NrRGlzcGF0Y2giLCJnZXRSZXNwb25zZURhdGEiLCJzdGF0dXNDb2RlIiwiZGF0YSIsInJlc3BvbnNlT3B0aW9ucyIsIm5ld01vY2tEaXNwYXRjaCIsInBlbmRpbmdJbnRlcmNlcHRvcnNGb3JtYXR0ZXIiLCJwbHVyYWxpemVyIiwiVVJMIiwib3B0cyIsImNvb2tpZXMiLCJ3aW5kb3ciLCJhYyIsInJlcXVpcmUkJDE3IiwiZ2xvYmFsVGhpcyIsInJlcXVpcmUkJDE4IiwiY29ubmVjdGlvbiIsInR5cGUiLCJjYWNoZSIsInBhcnNlIiwiZnJhbWUiLCJlcnJvcnMiLCJhcGkiLCJtb2NrRXJyb3JzIiwicmVxdWlyZSQkMjAiLCJyZXF1aXJlJCQyMSIsInJlcXVpcmUkJDIyIiwicmVxdWlyZSQkMjMiLCJyZXF1aXJlJCQyNCIsInJlcXVpcmUkJDI1IiwicmVxdWlyZSQkMjYiLCJyZXF1aXJlJCQyNyIsInJlcXVpcmUkJDI4IiwicmVxdWlyZSQkMjkiLCJyZXF1aXJlJCQzMCIsInJlcXVpcmUkJDMxIiwicmVxdWlyZSQkMzIiLCJIdHRwQ29kZXMiLCJIZWFkZXJzIiwiTWVkaWFUeXBlcyIsInVzZXJBZ2VudCIsImxvd2VyY2FzZUtleXMiLCJwcm94eUFnZW50IiwiYXV0aCIsImlvVXRpbCIsImlvIiwiZXhlY18xIiwiZXhlYyIsIkV4aXRDb2RlIiwibmFtZSIsIm1ldGhvZCIsImhvb2siLCJiZWZvcmVBZnRlckhvb2tNb2R1bGUiLCJWRVJTSU9OIiwiaXNQbGFpbk9iamVjdCIsIndpdGhEZWZhdWx0cyIsIkRFRkFVTFRTIiwiZW5kcG9pbnQiLCJjYiIsIm9uY2VNb2R1bGUiLCJvbmNlIiwiZ2V0QnVmZmVyIiwiQ29sbGVjdGlvbiIsIkVORFBPSU5UUyIsImdpdGh1YiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsU0FBTyxlQUFlQSxTQUFTLGNBQWMsRUFBRSxPQUFPLE1BQU07QUFDNURBLFVBQUEsc0JBQThCQSxRQUFBLGlCQUF5QjtBQUt2RCxXQUFTLGVBQWUsT0FBTztBQUMzQixRQUFJLFVBQVUsUUFBUSxVQUFVLFFBQVc7QUFDdkMsYUFBTztBQUFBLElBQ2YsV0FDYSxPQUFPLFVBQVUsWUFBWSxpQkFBaUIsUUFBUTtBQUMzRCxhQUFPO0FBQUEsSUFDZjtBQUNJLFdBQU8sS0FBSyxVQUFVLEtBQUs7QUFBQSxFQUMvQjtBQUNBQSxVQUFBLGlCQUF5QjtBQU96QixXQUFTLG9CQUFvQixzQkFBc0I7QUFDL0MsUUFBSSxDQUFDLE9BQU8sS0FBSyxvQkFBb0IsRUFBRSxRQUFRO0FBQzNDLGFBQU8sQ0FBQTtBQUFBLElBQ2Y7QUFDSSxXQUFPO0FBQUEsTUFDSCxPQUFPLHFCQUFxQjtBQUFBLE1BQzVCLE1BQU0scUJBQXFCO0FBQUEsTUFDM0IsTUFBTSxxQkFBcUI7QUFBQSxNQUMzQixTQUFTLHFCQUFxQjtBQUFBLE1BQzlCLEtBQUsscUJBQXFCO0FBQUEsTUFDMUIsV0FBVyxxQkFBcUI7QUFBQTtFQUV4QztBQUNBQSxVQUFBLHNCQUE4Qjs7Ozs7OztBQ3JDOUIsTUFBSSxrQkFBbUJDLFdBQVFBLFFBQUssb0JBQXFCLE9BQU8sVUFBVSxTQUFTLEdBQUcsR0FBRyxHQUFHLElBQUk7QUFDNUYsUUFBSSxPQUFPLE9BQVcsTUFBSztBQUMzQixRQUFJLE9BQU8sT0FBTyx5QkFBeUIsR0FBRyxDQUFDO0FBQy9DLFFBQUksQ0FBQyxTQUFTLFNBQVMsT0FBTyxD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QTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFFQSxXQUFTLElBQUksR0FBRyxJQUFJLHFCQUFxQixRQUFRLEVBQUUsR0FBRztBQUNwRCxVQUFNLE1BQU0scUJBQXFCLENBQUM7QUFD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O0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25F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Q1Y7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUM3QztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQzdDO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFDN0M7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUM3QztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQzdDO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FB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QVc7QUFBQSxJQUNmO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBTTtBQUFBLElBQU07QUFBQSxJQUFNO0FBQUEsSUFBTTtBQUFBLElBQU07QUFBQSxJQUFNO0FBQUEsSUFBTTtBQUFBLElBQU07QUFBQSxJQUFNO0FBQUEsSUFBTTtBQUFBLElBQU07QUFBQSxJQUFNO0FBQUEsSUFBTTtBQUFBLElBQU07QUFBQSxJQUFNO0FBQUEsSUFBTTtBQUFBLElBQy9HO0FBQUEsSUFBTTtBQUFBLElBQU07QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFDdkc7QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQ2xHO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFBUTtBQUFBLElBQVE7QUFBQSxJQUNwRztBQUFBLElBQVE7QUFBQSxJQUFRO0FBQUEsSUFBUTtBQUFBLElBQVE7QUFBQSxJQUFRO0FBQUEsSUFBUTtBQUFBLElBQVE7QUFBQSxJQUFRO0FBQUEsSUFBUTtBQUFBLElBQVE7QUFBQSxJQUFRO0FBQUEsSUFBUTtBQUFBLElBQ2hHO0FBQUEsRUFDRjtBQUVBLFFBQU0sY0FBYyxJQUFJLElBQUksUUFBUTtBQUdwQyxRQUFNLGlCQUFpQjtBQUFBLElBQ3JCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFB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TUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEs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LEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFB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U0FBTyxPQUFPLEtBQUE7QUFDaEI7QUFVQSxJQUFJO0FBRUcsU0FBUyxhQUFzQjtBQUNwQyxNQUFJLENBQUM7QUFDSCxlQUFXO0FBQUEsTUFDVCxXQUFXLGFBQUE7QUFBQSxNQUNYLFVBQVU7QUFBQSxRQUNSLE1BQU0sZUFBQTtBQUFBLFFBQ04sTUFBTSxlQUFBO0FBQUEsTUFBZTtBQUFBLElBQ3ZCO0FBRUosT0FBSyxNQUFNLFlBQVksS0FBSyxVQUFVLFFBQVEsQ0FBQyxFQUFFO0FBQ2pELFNBQU87QUFDVDtBQzNGQSxTQUFTLGdCQUEwQjtBQUNqQyxRQUFNLFFBQWtCLENBQUMsU0FBUyxRQUFRLFNBQVMsTUFBTTtBQUN6RCxTQUFPO0FBQ1Q7QUFFQSxTQUFTLFdBQVc7QUFDbEIsUUFBTXdDLFdBQVUsV0FBQTtBQUNoQixRQUFNLFFBQVEsY0FBQTtBQUNkLE9BQUssS0FBSyxrQkFBa0IsTUFBTSxLQUFLLElBQUksQ0FBQyxFQUFFO0FBQzlDLFFBQU14QyxXQUFVLGNBQWMsTUFBTSxLQUFLLEdBQUcsQ0FBQztBQUM3QyxPQUFLLEtBQUssMEJBQTBCQSxRQUFPLEVBQUU7QUFDN0MsY0FBWUEsVUFBUztBQUFBLElBQ25CLE9BQU87QUFBQSxJQUNQLEtBQUs7QUFBQSxNQUNILEdBQUcsUUFBUTtBQUFBLE1BQ1gsY0FBY3dDLFNBQVEsU0FBUztBQUFBLE1BQy9CLGNBQWNBLFNBQVEsU0FBUztBQUFBLE1BQy9CLGdCQUFnQkEsU0FBUTtBQUFBLElBQUE7QUFBQSxFQUMxQixDQUNEO0FBQ0g7QUFFQSxTQUFTLE1BQU07QUFDYixXQUFBO0FBQ0Y7QUFFQSxJQUFJO0FBQ0YsTUFBQTtBQUNGLFNBQVMsT0FBTztBQUNkLFFBQU0saUJBQ0osaUJBQWlCLFNBQVMsT0FBTyxVQUFVLFdBQVcsUUFBUSxLQUFLLFVBQVUsS0FBSztBQUNwRixPQUFLLFVBQVUsY0FBYztBQUMvQjsiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCw0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSw2Miw2Myw2NCw2NSw2Niw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw3NSw3Niw3Nyw3OCw3OSw4MCw4MSw4Miw4Myw4NCw4NSw4Niw4Nyw4OCw4OSw5MCw5MSw5Miw5Myw5NCw5NSw5Niw5Nyw5OCw5OSwxMDAsMTAxLDEwMiwxMDMsMTA0LDEwNSwxMDYsMTA3LDEwOCwxMDksMTEwLDExMSwxMTIsMTEzLDExNCwxMTUsMTE2LDExNywxMTgsMTE5LDEyMCwxMjEsMTIyLDEyMywxMjQsMTI1LDEyNiwxMjcsMTI4LDEyOSwxMzAsMTMxLDEzMiwxMzMsMTM0LDEzNSwxMzYsMTM3LDEzOCwxMzksMTQwLDE0MSwxNDIsMTQzLDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLDE1M119 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AYWN0aW9ucytjb3JlQDIuMC4zL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9jb3JlL2xpYi91dGlscy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AYWN0aW9ucytjb3JlQDIuMC4zL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9jb3JlL2xpYi9jb21tYW5kLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BhY3Rpb25zK2NvcmVAMi4wLjMvbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2NvcmUvbGliL2ZpbGUtY29tbWFuZC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AYWN0aW9ucytodHRwLWNsaWVudEAzLjAuMi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvaHR0cC1jbGllbnQvbGliL3Byb3h5LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3R1bm5lbEAwLjAuNi9ub2RlX21vZHVsZXMvdHVubmVsL2xpYi90dW5uZWwuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdHVubmVsQDAuMC42L25vZGVfbW9kdWxlcy90dW5uZWwvaW5kZXguanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jb3JlL3N5bWJvbHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jb3JlL2Vycm9ycy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2NvcmUvY29uc3RhbnRzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA2LjIzLjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY29yZS90cmVlLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA2LjIzLjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY29yZS91dGlsLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA2LjIzLjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY29yZS9kaWFnbm9zdGljcy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2NvcmUvcmVxdWVzdC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2Rpc3BhdGNoZXIvZGlzcGF0Y2hlci5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2Rpc3BhdGNoZXIvZGlzcGF0Y2hlci1iYXNlLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA2LjIzLjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvdXRpbC90aW1lcnMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jb3JlL2Nvbm5lY3QuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9sbGh0dHAvdXRpbHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9sbGh0dHAvY29uc3RhbnRzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA2LjIzLjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvbGxodHRwL2xsaHR0cC13YXNtLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA2LjIzLjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvbGxodHRwL2xsaHR0cF9zaW1kLXdhc20uanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWIvZmV0Y2gvY29uc3RhbnRzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA2LjIzLjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2ViL2ZldGNoL2dsb2JhbC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3dlYi9mZXRjaC9kYXRhLXVybC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3dlYi9mZXRjaC93ZWJpZGwuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWIvZmV0Y2gvdXRpbC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3dlYi9mZXRjaC9zeW1ib2xzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA2LjIzLjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2ViL2ZldGNoL2ZpbGUuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWIvZmV0Y2gvZm9ybWRhdGEuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWIvZmV0Y2gvZm9ybWRhdGEtcGFyc2VyLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA2LjIzLjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2ViL2ZldGNoL2JvZHkuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9kaXNwYXRjaGVyL2NsaWVudC1oMS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2Rpc3BhdGNoZXIvY2xpZW50LWgyLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA2LjIzLjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvaGFuZGxlci9yZWRpcmVjdC1oYW5kbGVyLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA2LjIzLjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvaW50ZXJjZXB0b3IvcmVkaXJlY3QtaW50ZXJjZXB0b3IuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9kaXNwYXRjaGVyL2NsaWVudC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2Rpc3BhdGNoZXIvZml4ZWQtcXVldWUuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9kaXNwYXRjaGVyL3Bvb2wtc3RhdHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9kaXNwYXRjaGVyL3Bvb2wtYmFzZS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2Rpc3BhdGNoZXIvcG9vbC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2Rpc3BhdGNoZXIvYmFsYW5jZWQtcG9vbC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2Rpc3BhdGNoZXIvYWdlbnQuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9kaXNwYXRjaGVyL3Byb3h5LWFnZW50LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA2LjIzLjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZGlzcGF0Y2hlci9lbnYtaHR0cC1wcm94eS1hZ2VudC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2hhbmRsZXIvcmV0cnktaGFuZGxlci5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2Rpc3BhdGNoZXIvcmV0cnktYWdlbnQuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9hcGkvcmVhZGFibGUuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9hcGkvdXRpbC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS9hcGktcmVxdWVzdC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS9hYm9ydC1zaWduYWwuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9hcGkvYXBpLXN0cmVhbS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS9hcGktcGlwZWxpbmUuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9hcGkvYXBpLXVwZ3JhZGUuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9hcGkvYXBpLWNvbm5lY3QuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9hcGkvaW5kZXguanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9tb2NrL21vY2stZXJyb3JzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA2LjIzLjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvbW9jay9tb2NrLXN5bWJvbHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9tb2NrL21vY2stdXRpbHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9tb2NrL21vY2staW50ZXJjZXB0b3IuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9tb2NrL21vY2stY2xpZW50LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA2LjIzLjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvbW9jay9tb2NrLXBvb2wuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9tb2NrL3BsdXJhbGl6ZXIuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9tb2NrL3BlbmRpbmctaW50ZXJjZXB0b3JzLWZvcm1hdHRlci5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL21vY2svbW9jay1hZ2VudC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2dsb2JhbC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2hhbmRsZXIvZGVjb3JhdG9yLWhhbmRsZXIuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9pbnRlcmNlcHRvci9yZWRpcmVjdC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ludGVyY2VwdG9yL3JldHJ5LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA2LjIzLjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvaW50ZXJjZXB0b3IvZHVtcC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ludGVyY2VwdG9yL2Rucy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3dlYi9mZXRjaC9oZWFkZXJzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA2LjIzLjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2ViL2ZldGNoL3Jlc3BvbnNlLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA2LjIzLjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2ViL2ZldGNoL2Rpc3BhdGNoZXItd2Vha3JlZi5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3dlYi9mZXRjaC9yZXF1ZXN0LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA2LjIzLjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2ViL2ZldGNoL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA2LjIzLjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2ViL2ZpbGVhcGkvc3ltYm9scy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3dlYi9maWxlYXBpL3Byb2dyZXNzZXZlbnQuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWIvZmlsZWFwaS9lbmNvZGluZy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3dlYi9maWxlYXBpL3V0aWwuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWIvZmlsZWFwaS9maWxlcmVhZGVyLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA2LjIzLjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2ViL2NhY2hlL3N5bWJvbHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWIvY2FjaGUvdXRpbC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3dlYi9jYWNoZS9jYWNoZS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3dlYi9jYWNoZS9jYWNoZXN0b3JhZ2UuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWIvY29va2llcy9jb25zdGFudHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWIvY29va2llcy91dGlsLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA2LjIzLjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2ViL2Nvb2tpZXMvcGFyc2UuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWIvY29va2llcy9pbmRleC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3dlYi93ZWJzb2NrZXQvZXZlbnRzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA2LjIzLjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2ViL3dlYnNvY2tldC9jb25zdGFudHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWIvd2Vic29ja2V0L3N5bWJvbHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWIvd2Vic29ja2V0L3V0aWwuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWIvd2Vic29ja2V0L2ZyYW1lLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA2LjIzLjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2ViL3dlYnNvY2tldC9jb25uZWN0aW9uLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA2LjIzLjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2ViL3dlYnNvY2tldC9wZXJtZXNzYWdlLWRlZmxhdGUuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWIvd2Vic29ja2V0L3JlY2VpdmVyLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA2LjIzLjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2ViL3dlYnNvY2tldC9zZW5kZXIuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDYuMjMuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWIvd2Vic29ja2V0L3dlYnNvY2tldC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3dlYi9ldmVudHNvdXJjZS91dGlsLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA2LjIzLjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2ViL2V2ZW50c291cmNlL2V2ZW50c291cmNlLXN0cmVhbS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3dlYi9ldmVudHNvdXJjZS9ldmVudHNvdXJjZS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANi4yMy4wL25vZGVfbW9kdWxlcy91bmRpY2kvaW5kZXguanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGFjdGlvbnMraHR0cC1jbGllbnRAMy4wLjIvbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2h0dHAtY2xpZW50L2xpYi9pbmRleC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AYWN0aW9ucytodHRwLWNsaWVudEAzLjAuMi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvaHR0cC1jbGllbnQvbGliL2F1dGguanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGFjdGlvbnMrY29yZUAyLjAuMy9ub2RlX21vZHVsZXMvQGFjdGlvbnMvY29yZS9saWIvb2lkYy11dGlscy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AYWN0aW9ucytjb3JlQDIuMC4zL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9jb3JlL2xpYi9zdW1tYXJ5LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BhY3Rpb25zK2NvcmVAMi4wLjMvbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2NvcmUvbGliL3BhdGgtdXRpbHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGFjdGlvbnMraW9AMi4wLjAvbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2lvL2xpYi9pby11dGlsLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BhY3Rpb25zK2lvQDIuMC4wL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9pby9saWIvaW8uanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGFjdGlvbnMrZXhlY0AyLjAuMC9ub2RlX21vZHVsZXMvQGFjdGlvbnMvZXhlYy9saWIvdG9vbHJ1bm5lci5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AYWN0aW9ucytleGVjQDIuMC4wL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9leGVjL2xpYi9leGVjLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BhY3Rpb25zK2NvcmVAMi4wLjMvbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2NvcmUvbGliL3BsYXRmb3JtLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BhY3Rpb25zK2NvcmVAMi4wLjMvbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2NvcmUvbGliL2NvcmUuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGFjdGlvbnMrZ2l0aHViQDcuMC4wL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9naXRodWIvbGliL2NvbnRleHQuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jb3JlL3N5bWJvbHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jb3JlL2Vycm9ycy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2NvcmUvY29uc3RhbnRzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY29yZS91dGlsLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvdGltZXJzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmYXN0aWZ5K2J1c2JveUAyLjEuMS9ub2RlX21vZHVsZXMvQGZhc3RpZnkvYnVzYm95L2RlcHMvc3RyZWFtc2VhcmNoL3NibWguanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZhc3RpZnkrYnVzYm95QDIuMS4xL25vZGVfbW9kdWxlcy9AZmFzdGlmeS9idXNib3kvZGVwcy9kaWNlci9saWIvUGFydFN0cmVhbS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmFzdGlmeStidXNib3lAMi4xLjEvbm9kZV9tb2R1bGVzL0BmYXN0aWZ5L2J1c2JveS9saWIvdXRpbHMvZ2V0TGltaXQuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZhc3RpZnkrYnVzYm95QDIuMS4xL25vZGVfbW9kdWxlcy9AZmFzdGlmeS9idXNib3kvZGVwcy9kaWNlci9saWIvSGVhZGVyUGFyc2VyLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmYXN0aWZ5K2J1c2JveUAyLjEuMS9ub2RlX21vZHVsZXMvQGZhc3RpZnkvYnVzYm95L2RlcHMvZGljZXIvbGliL0RpY2VyLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmYXN0aWZ5K2J1c2JveUAyLjEuMS9ub2RlX21vZHVsZXMvQGZhc3RpZnkvYnVzYm95L2xpYi91dGlscy9kZWNvZGVUZXh0LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmYXN0aWZ5K2J1c2JveUAyLjEuMS9ub2RlX21vZHVsZXMvQGZhc3RpZnkvYnVzYm95L2xpYi91dGlscy9wYXJzZVBhcmFtcy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmFzdGlmeStidXNib3lAMi4xLjEvbm9kZV9tb2R1bGVzL0BmYXN0aWZ5L2J1c2JveS9saWIvdXRpbHMvYmFzZW5hbWUuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZhc3RpZnkrYnVzYm95QDIuMS4xL25vZGVfbW9kdWxlcy9AZmFzdGlmeS9idXNib3kvbGliL3R5cGVzL211bHRpcGFydC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmFzdGlmeStidXNib3lAMi4xLjEvbm9kZV9tb2R1bGVzL0BmYXN0aWZ5L2J1c2JveS9saWIvdXRpbHMvRGVjb2Rlci5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmFzdGlmeStidXNib3lAMi4xLjEvbm9kZV9tb2R1bGVzL0BmYXN0aWZ5L2J1c2JveS9saWIvdHlwZXMvdXJsZW5jb2RlZC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmFzdGlmeStidXNib3lAMi4xLjEvbm9kZV9tb2R1bGVzL0BmYXN0aWZ5L2J1c2JveS9saWIvbWFpbi5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL2NvbnN0YW50cy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL2dsb2JhbC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL3V0aWwuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9mZXRjaC9zeW1ib2xzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZmV0Y2gvd2ViaWRsLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZmV0Y2gvZGF0YVVSTC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL2ZpbGUuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9mZXRjaC9mb3JtZGF0YS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL2JvZHkuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jb3JlL3JlcXVlc3QuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9kaXNwYXRjaGVyLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZGlzcGF0Y2hlci1iYXNlLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY29yZS9jb25uZWN0LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvbGxodHRwL3V0aWxzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvbGxodHRwL2NvbnN0YW50cy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2hhbmRsZXIvUmVkaXJlY3RIYW5kbGVyLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvaW50ZXJjZXB0b3IvcmVkaXJlY3RJbnRlcmNlcHRvci5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2xsaHR0cC9sbGh0dHAtd2FzbS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2xsaHR0cC9sbGh0dHBfc2ltZC13YXNtLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY2xpZW50LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvbm9kZS9maXhlZC1xdWV1ZS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3Bvb2wtc3RhdHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9wb29sLWJhc2UuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9wb29sLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvYmFsYW5jZWQtcG9vbC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2NvbXBhdC9kaXNwYXRjaGVyLXdlYWtyZWYuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9hZ2VudC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS9yZWFkYWJsZS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS91dGlsLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvYXBpL2Fib3J0LXNpZ25hbC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS9hcGktcmVxdWVzdC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS9hcGktc3RyZWFtLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvYXBpL2FwaS1waXBlbGluZS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS9hcGktdXBncmFkZS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS9hcGktY29ubmVjdC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS9pbmRleC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL21vY2svbW9jay1lcnJvcnMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9tb2NrL21vY2stc3ltYm9scy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL21vY2svbW9jay11dGlscy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL21vY2svbW9jay1pbnRlcmNlcHRvci5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL21vY2svbW9jay1jbGllbnQuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9tb2NrL21vY2stcG9vbC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL21vY2svcGx1cmFsaXplci5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL21vY2svcGVuZGluZy1pbnRlcmNlcHRvcnMtZm9ybWF0dGVyLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvbW9jay9tb2NrLWFnZW50LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvcHJveHktYWdlbnQuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9oYW5kbGVyL1JldHJ5SGFuZGxlci5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2dsb2JhbC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2hhbmRsZXIvRGVjb3JhdG9ySGFuZGxlci5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL2hlYWRlcnMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9mZXRjaC9yZXNwb25zZS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL3JlcXVlc3QuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9mZXRjaC9pbmRleC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZpbGVhcGkvc3ltYm9scy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZpbGVhcGkvcHJvZ3Jlc3NldmVudC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZpbGVhcGkvZW5jb2RpbmcuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9maWxlYXBpL3V0aWwuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9maWxlYXBpL2ZpbGVyZWFkZXIuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jYWNoZS9zeW1ib2xzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY2FjaGUvdXRpbC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2NhY2hlL2NhY2hlLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY2FjaGUvY2FjaGVzdG9yYWdlLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY29va2llcy9jb25zdGFudHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jb29raWVzL3V0aWwuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jb29raWVzL3BhcnNlLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY29va2llcy9pbmRleC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3dlYnNvY2tldC9jb25zdGFudHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWJzb2NrZXQvc3ltYm9scy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3dlYnNvY2tldC9ldmVudHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5kaWNpQDUuMjkuMC9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWJzb2NrZXQvdXRpbC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3dlYnNvY2tldC9jb25uZWN0aW9uLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2Vic29ja2V0L2ZyYW1lLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2Vic29ja2V0L3JlY2VpdmVyLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuZGljaUA1LjI5LjAvbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2Vic29ja2V0L3dlYnNvY2tldC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmRpY2lANS4yOS4wL25vZGVfbW9kdWxlcy91bmRpY2kvaW5kZXguanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGFjdGlvbnMrZ2l0aHViQDcuMC4wL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9naXRodWIvbGliL2ludGVybmFsL3V0aWxzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuaXZlcnNhbC11c2VyLWFnZW50QDYuMC4xL25vZGVfbW9kdWxlcy91bml2ZXJzYWwtdXNlci1hZ2VudC9kaXN0LXdlYi9pbmRleC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9iZWZvcmUtYWZ0ZXItaG9va0AyLjIuMy9ub2RlX21vZHVsZXMvYmVmb3JlLWFmdGVyLWhvb2svbGliL3JlZ2lzdGVyLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2JlZm9yZS1hZnRlci1ob29rQDIuMi4zL25vZGVfbW9kdWxlcy9iZWZvcmUtYWZ0ZXItaG9vay9saWIvYWRkLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2JlZm9yZS1hZnRlci1ob29rQDIuMi4zL25vZGVfbW9kdWxlcy9iZWZvcmUtYWZ0ZXItaG9vay9saWIvcmVtb3ZlLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2JlZm9yZS1hZnRlci1ob29rQDIuMi4zL25vZGVfbW9kdWxlcy9iZWZvcmUtYWZ0ZXItaG9vay9pbmRleC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab2N0b2tpdCtlbmRwb2ludEA5LjAuNi9ub2RlX21vZHVsZXMvQG9jdG9raXQvZW5kcG9pbnQvZGlzdC1zcmMvdmVyc2lvbi5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab2N0b2tpdCtlbmRwb2ludEA5LjAuNi9ub2RlX21vZHVsZXMvQG9jdG9raXQvZW5kcG9pbnQvZGlzdC1zcmMvZGVmYXVsdHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQG9jdG9raXQrZW5kcG9pbnRAOS4wLjYvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2VuZHBvaW50L2Rpc3Qtc3JjL3V0aWwvbG93ZXJjYXNlLWtleXMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQG9jdG9raXQrZW5kcG9pbnRAOS4wLjYvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2VuZHBvaW50L2Rpc3Qtc3JjL3V0aWwvaXMtcGxhaW4tb2JqZWN0LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BvY3Rva2l0K2VuZHBvaW50QDkuMC42L25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9lbmRwb2ludC9kaXN0LXNyYy91dGlsL21lcmdlLWRlZXAuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQG9jdG9raXQrZW5kcG9pbnRAOS4wLjYvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2VuZHBvaW50L2Rpc3Qtc3JjL3V0aWwvcmVtb3ZlLXVuZGVmaW5lZC1wcm9wZXJ0aWVzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BvY3Rva2l0K2VuZHBvaW50QDkuMC42L25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9lbmRwb2ludC9kaXN0LXNyYy9tZXJnZS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab2N0b2tpdCtlbmRwb2ludEA5LjAuNi9ub2RlX21vZHVsZXMvQG9jdG9raXQvZW5kcG9pbnQvZGlzdC1zcmMvdXRpbC9hZGQtcXVlcnktcGFyYW1ldGVycy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab2N0b2tpdCtlbmRwb2ludEA5LjAuNi9ub2RlX21vZHVsZXMvQG9jdG9raXQvZW5kcG9pbnQvZGlzdC1zcmMvdXRpbC9leHRyYWN0LXVybC12YXJpYWJsZS1uYW1lcy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab2N0b2tpdCtlbmRwb2ludEA5LjAuNi9ub2RlX21vZHVsZXMvQG9jdG9raXQvZW5kcG9pbnQvZGlzdC1zcmMvdXRpbC9vbWl0LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BvY3Rva2l0K2VuZHBvaW50QDkuMC42L25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9lbmRwb2ludC9kaXN0LXNyYy91dGlsL3VybC10ZW1wbGF0ZS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab2N0b2tpdCtlbmRwb2ludEA5LjAuNi9ub2RlX21vZHVsZXMvQG9jdG9raXQvZW5kcG9pbnQvZGlzdC1zcmMvcGFyc2UuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQG9jdG9raXQrZW5kcG9pbnRAOS4wLjYvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2VuZHBvaW50L2Rpc3Qtc3JjL2VuZHBvaW50LXdpdGgtZGVmYXVsdHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQG9jdG9raXQrZW5kcG9pbnRAOS4wLjYvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2VuZHBvaW50L2Rpc3Qtc3JjL3dpdGgtZGVmYXVsdHMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQG9jdG9raXQrZW5kcG9pbnRAOS4wLjYvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2VuZHBvaW50L2Rpc3Qtc3JjL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BvY3Rva2l0K3JlcXVlc3RAOC40LjEvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3JlcXVlc3QvZGlzdC1zcmMvdmVyc2lvbi5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab2N0b2tpdCtyZXF1ZXN0QDguNC4xL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9yZXF1ZXN0L2Rpc3Qtc3JjL2lzLXBsYWluLW9iamVjdC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9kZXByZWNhdGlvbkAyLjMuMS9ub2RlX21vZHVsZXMvZGVwcmVjYXRpb24vZGlzdC13ZWIvaW5kZXguanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vd3JhcHB5QDEuMC4yL25vZGVfbW9kdWxlcy93cmFwcHkvd3JhcHB5LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL29uY2VAMS40LjAvbm9kZV9tb2R1bGVzL29uY2Uvb25jZS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab2N0b2tpdCtyZXF1ZXN0LWVycm9yQDUuMS4xL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9yZXF1ZXN0LWVycm9yL2Rpc3Qtc3JjL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BvY3Rva2l0K3JlcXVlc3RAOC40LjEvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3JlcXVlc3QvZGlzdC1zcmMvZ2V0LWJ1ZmZlci1yZXNwb25zZS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab2N0b2tpdCtyZXF1ZXN0QDguNC4xL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9yZXF1ZXN0L2Rpc3Qtc3JjL2ZldGNoLXdyYXBwZXIuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQG9jdG9raXQrcmVxdWVzdEA4LjQuMS9ub2RlX21vZHVsZXMvQG9jdG9raXQvcmVxdWVzdC9kaXN0LXNyYy93aXRoLWRlZmF1bHRzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BvY3Rva2l0K3JlcXVlc3RAOC40LjEvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3JlcXVlc3QvZGlzdC1zcmMvaW5kZXguanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQG9jdG9raXQrZ3JhcGhxbEA3LjEuMS9ub2RlX21vZHVsZXMvQG9jdG9raXQvZ3JhcGhxbC9kaXN0LXdlYi9pbmRleC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab2N0b2tpdCthdXRoLXRva2VuQDQuMC4wL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9hdXRoLXRva2VuL2Rpc3Qtc3JjL2F1dGguanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQG9jdG9raXQrYXV0aC10b2tlbkA0LjAuMC9ub2RlX21vZHVsZXMvQG9jdG9raXQvYXV0aC10b2tlbi9kaXN0LXNyYy93aXRoLWF1dGhvcml6YXRpb24tcHJlZml4LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BvY3Rva2l0K2F1dGgtdG9rZW5ANC4wLjAvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2F1dGgtdG9rZW4vZGlzdC1zcmMvaG9vay5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab2N0b2tpdCthdXRoLXRva2VuQDQuMC4wL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9hdXRoLXRva2VuL2Rpc3Qtc3JjL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BvY3Rva2l0K2NvcmVANS4yLjIvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2NvcmUvZGlzdC13ZWIvaW5kZXguanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQG9jdG9raXQrcGx1Z2luLXJlc3QtZW5kcG9pbnQtbWV0aG9kc0AxMC40LjFfQG9jdG9raXQrY29yZUA1LjIuMi9ub2RlX21vZHVsZXMvQG9jdG9raXQvcGx1Z2luLXJlc3QtZW5kcG9pbnQtbWV0aG9kcy9kaXN0LXNyYy92ZXJzaW9uLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BvY3Rva2l0K3BsdWdpbi1yZXN0LWVuZHBvaW50LW1ldGhvZHNAMTAuNC4xX0BvY3Rva2l0K2NvcmVANS4yLjIvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3BsdWdpbi1yZXN0LWVuZHBvaW50LW1ldGhvZHMvZGlzdC1zcmMvZ2VuZXJhdGVkL2VuZHBvaW50cy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab2N0b2tpdCtwbHVnaW4tcmVzdC1lbmRwb2ludC1tZXRob2RzQDEwLjQuMV9Ab2N0b2tpdCtjb3JlQDUuMi4yL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9wbHVnaW4tcmVzdC1lbmRwb2ludC1tZXRob2RzL2Rpc3Qtc3JjL2VuZHBvaW50cy10by1tZXRob2RzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BvY3Rva2l0K3BsdWdpbi1yZXN0LWVuZHBvaW50LW1ldGhvZHNAMTAuNC4xX0BvY3Rva2l0K2NvcmVANS4yLjIvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3BsdWdpbi1yZXN0LWVuZHBvaW50LW1ldGhvZHMvZGlzdC1zcmMvaW5kZXguanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQG9jdG9raXQrcGx1Z2luLXBhZ2luYXRlLXJlc3RAOS4yLjJfQG9jdG9raXQrY29yZUA1LjIuMi9ub2RlX21vZHVsZXMvQG9jdG9raXQvcGx1Z2luLXBhZ2luYXRlLXJlc3QvZGlzdC13ZWIvaW5kZXguanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGFjdGlvbnMrZ2l0aHViQDcuMC4wL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9naXRodWIvbGliL3V0aWxzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BhY3Rpb25zK2dpdGh1YkA3LjAuMC9ub2RlX21vZHVsZXMvQGFjdGlvbnMvZ2l0aHViL2xpYi9naXRodWIuanMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvY29udGV4dC50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbi8vIFdlIHVzZSBhbnkgYXMgYSB2YWxpZCBpbnB1dCB0eXBlXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnRvQ29tbWFuZFZhbHVlID0gdG9Db21tYW5kVmFsdWU7XG5leHBvcnRzLnRvQ29tbWFuZFByb3BlcnRpZXMgPSB0b0NvbW1hbmRQcm9wZXJ0aWVzO1xuLyoqXG4gKiBTYW5pdGl6ZXMgYW4gaW5wdXQgaW50byBhIHN0cmluZyBzbyBpdCBjYW4gYmUgcGFzc2VkIGludG8gaXNzdWVDb21tYW5kIHNhZmVseVxuICogQHBhcmFtIGlucHV0IGlucHV0IHRvIHNhbml0aXplIGludG8gYSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gdG9Db21tYW5kVmFsdWUoaW5wdXQpIHtcbiAgICBpZiAoaW5wdXQgPT09IG51bGwgfHwgaW5wdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgfHwgaW5wdXQgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoaW5wdXQpO1xufVxuLyoqXG4gKlxuICogQHBhcmFtIGFubm90YXRpb25Qcm9wZXJ0aWVzXG4gKiBAcmV0dXJucyBUaGUgY29tbWFuZCBwcm9wZXJ0aWVzIHRvIHNlbmQgd2l0aCB0aGUgYWN0dWFsIGFubm90YXRpb24gY29tbWFuZFxuICogU2VlIElzc3VlQ29tbWFuZFByb3BlcnRpZXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9hY3Rpb25zL3J1bm5lci9ibG9iL21haW4vc3JjL1J1bm5lci5Xb3JrZXIvQWN0aW9uQ29tbWFuZE1hbmFnZXIuY3MjTDY0NlxuICovXG5mdW5jdGlvbiB0b0NvbW1hbmRQcm9wZXJ0aWVzKGFubm90YXRpb25Qcm9wZXJ0aWVzKSB7XG4gICAgaWYgKCFPYmplY3Qua2V5cyhhbm5vdGF0aW9uUHJvcGVydGllcykubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGl0bGU6IGFubm90YXRpb25Qcm9wZXJ0aWVzLnRpdGxlLFxuICAgICAgICBmaWxlOiBhbm5vdGF0aW9uUHJvcGVydGllcy5maWxlLFxuICAgICAgICBsaW5lOiBhbm5vdGF0aW9uUHJvcGVydGllcy5zdGFydExpbmUsXG4gICAgICAgIGVuZExpbmU6IGFubm90YXRpb25Qcm9wZXJ0aWVzLmVuZExpbmUsXG4gICAgICAgIGNvbDogYW5ub3RhdGlvblByb3BlcnRpZXMuc3RhcnRDb2x1bW4sXG4gICAgICAgIGVuZENvbHVtbjogYW5ub3RhdGlvblByb3BlcnRpZXMuZW5kQ29sdW1uXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBvd25LZXlzID0gZnVuY3Rpb24obykge1xuICAgICAgICBvd25LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgIHZhciBhciA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgayBpbiBvKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIGspKSBhclthci5sZW5ndGhdID0gaztcbiAgICAgICAgICAgIHJldHVybiBhcjtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG93bktleXMobyk7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1vZCkge1xuICAgICAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayA9IG93bktleXMobW9kKSwgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSBpZiAoa1tpXSAhPT0gXCJkZWZhdWx0XCIpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwga1tpXSk7XG4gICAgICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbn0pKCk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmlzc3VlQ29tbWFuZCA9IGlzc3VlQ29tbWFuZDtcbmV4cG9ydHMuaXNzdWUgPSBpc3N1ZTtcbmNvbnN0IG9zID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJvc1wiKSk7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG4vKipcbiAqIElzc3VlcyBhIGNvbW1hbmQgdG8gdGhlIEdpdEh1YiBBY3Rpb25zIHJ1bm5lclxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgbmFtZSB0byBpc3N1ZVxuICogQHBhcmFtIHByb3BlcnRpZXMgLSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgZm9yIHRoZSBjb21tYW5kIChrZXktdmFsdWUgcGFpcnMpXG4gKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgd2l0aCB0aGUgY29tbWFuZFxuICogQHJlbWFya3NcbiAqIFRoaXMgZnVuY3Rpb24gb3V0cHV0cyBhIHNwZWNpYWxseSBmb3JtYXR0ZWQgc3RyaW5nIHRvIHN0ZG91dCB0aGF0IHRoZSBBY3Rpb25zXG4gKiBydW5uZXIgaW50ZXJwcmV0cyBhcyBhIGNvbW1hbmQuIFRoZXNlIGNvbW1hbmRzIGNhbiBjb250cm9sIHdvcmtmbG93IGJlaGF2aW9yLFxuICogc2V0IG91dHB1dHMsIGNyZWF0ZSBhbm5vdGF0aW9ucywgbWFzayB2YWx1ZXMsIGFuZCBtb3JlLlxuICpcbiAqIENvbW1hbmQgRm9ybWF0OlxuICogICA6Om5hbWUga2V5PXZhbHVlLGtleT12YWx1ZTo6bWVzc2FnZVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBJc3N1ZSBhIHdhcm5pbmcgYW5ub3RhdGlvblxuICogaXNzdWVDb21tYW5kKCd3YXJuaW5nJywge30sICdUaGlzIGlzIGEgd2FybmluZyBtZXNzYWdlJyk7XG4gKiAvLyBPdXRwdXQ6IDo6d2FybmluZzo6VGhpcyBpcyBhIHdhcm5pbmcgbWVzc2FnZVxuICpcbiAqIC8vIFNldCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZVxuICogaXNzdWVDb21tYW5kKCdzZXQtZW52JywgeyBuYW1lOiAnTVlfVkFSJyB9LCAnc29tZSB2YWx1ZScpO1xuICogLy8gT3V0cHV0OiA6OnNldC1lbnYgbmFtZT1NWV9WQVI6OnNvbWUgdmFsdWVcbiAqXG4gKiAvLyBBZGQgYSBzZWNyZXQgbWFza1xuICogaXNzdWVDb21tYW5kKCdhZGQtbWFzaycsIHt9LCAnc2VjcmV0VmFsdWUxMjMnKTtcbiAqIC8vIE91dHB1dDogOjphZGQtbWFzazo6c2VjcmV0VmFsdWUxMjNcbiAqIGBgYFxuICpcbiAqIEBpbnRlcm5hbFxuICogVGhpcyBpcyBhbiBpbnRlcm5hbCB1dGlsaXR5IGZ1bmN0aW9uIHRoYXQgcG93ZXJzIHRoZSBwdWJsaWMgQVBJIGZ1bmN0aW9uc1xuICogc3VjaCBhcyBzZXRTZWNyZXQsIHdhcm5pbmcsIGVycm9yLCBhbmQgZXhwb3J0VmFyaWFibGUuXG4gKi9cbmZ1bmN0aW9uIGlzc3VlQ29tbWFuZChjb21tYW5kLCBwcm9wZXJ0aWVzLCBtZXNzYWdlKSB7XG4gICAgY29uc3QgY21kID0gbmV3IENvbW1hbmQoY29tbWFuZCwgcHJvcGVydGllcywgbWVzc2FnZSk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoY21kLnRvU3RyaW5nKCkgKyBvcy5FT0wpO1xufVxuZnVuY3Rpb24gaXNzdWUobmFtZSwgbWVzc2FnZSA9ICcnKSB7XG4gICAgaXNzdWVDb21tYW5kKG5hbWUsIHt9LCBtZXNzYWdlKTtcbn1cbmNvbnN0IENNRF9TVFJJTkcgPSAnOjonO1xuY2xhc3MgQ29tbWFuZCB7XG4gICAgY29uc3RydWN0b3IoY29tbWFuZCwgcHJvcGVydGllcywgbWVzc2FnZSkge1xuICAgICAgICBpZiAoIWNvbW1hbmQpIHtcbiAgICAgICAgICAgIGNvbW1hbmQgPSAnbWlzc2luZy5jb21tYW5kJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kO1xuICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgbGV0IGNtZFN0ciA9IENNRF9TVFJJTkcgKyB0aGlzLmNvbW1hbmQ7XG4gICAgICAgIGlmICh0aGlzLnByb3BlcnRpZXMgJiYgT2JqZWN0LmtleXModGhpcy5wcm9wZXJ0aWVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjbWRTdHIgKz0gJyAnO1xuICAgICAgICAgICAgbGV0IGZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMucHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLnByb3BlcnRpZXNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZFN0ciArPSAnLCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjbWRTdHIgKz0gYCR7a2V5fT0ke2VzY2FwZVByb3BlcnR5KHZhbCl9YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjbWRTdHIgKz0gYCR7Q01EX1NUUklOR30ke2VzY2FwZURhdGEodGhpcy5tZXNzYWdlKX1gO1xuICAgICAgICByZXR1cm4gY21kU3RyO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGVzY2FwZURhdGEocykge1xuICAgIHJldHVybiAoMCwgdXRpbHNfMS50b0NvbW1hbmRWYWx1ZSkocylcbiAgICAgICAgLnJlcGxhY2UoLyUvZywgJyUyNScpXG4gICAgICAgIC5yZXBsYWNlKC9cXHIvZywgJyUwRCcpXG4gICAgICAgIC5yZXBsYWNlKC9cXG4vZywgJyUwQScpO1xufVxuZnVuY3Rpb24gZXNjYXBlUHJvcGVydHkocykge1xuICAgIHJldHVybiAoMCwgdXRpbHNfMS50b0NvbW1hbmRWYWx1ZSkocylcbiAgICAgICAgLnJlcGxhY2UoLyUvZywgJyUyNScpXG4gICAgICAgIC5yZXBsYWNlKC9cXHIvZywgJyUwRCcpXG4gICAgICAgIC5yZXBsYWNlKC9cXG4vZywgJyUwQScpXG4gICAgICAgIC5yZXBsYWNlKC86L2csICclM0EnKVxuICAgICAgICAucmVwbGFjZSgvLC9nLCAnJTJDJyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21tYW5kLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuLy8gRm9yIGludGVybmFsIHVzZSwgc3ViamVjdCB0byBjaGFuZ2UuXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG93bktleXMgPSBmdW5jdGlvbihvKSB7XG4gICAgICAgIG93bktleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiAobykge1xuICAgICAgICAgICAgdmFyIGFyID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBrIGluIG8pIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgaykpIGFyW2FyLmxlbmd0aF0gPSBrO1xuICAgICAgICAgICAgcmV0dXJuIGFyO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gb3duS2V5cyhvKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAobW9kKSB7XG4gICAgICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrID0gb3duS2V5cyhtb2QpLCBpID0gMDsgaSA8IGsubGVuZ3RoOyBpKyspIGlmIChrW2ldICE9PSBcImRlZmF1bHRcIikgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrW2ldKTtcbiAgICAgICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xufSkoKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaXNzdWVGaWxlQ29tbWFuZCA9IGlzc3VlRmlsZUNvbW1hbmQ7XG5leHBvcnRzLnByZXBhcmVLZXlWYWx1ZU1lc3NhZ2UgPSBwcmVwYXJlS2V5VmFsdWVNZXNzYWdlO1xuLy8gV2UgdXNlIGFueSBhcyBhIHZhbGlkIGlucHV0IHR5cGVcbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmNvbnN0IGNyeXB0byA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiY3J5cHRvXCIpKTtcbmNvbnN0IGZzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJmc1wiKSk7XG5jb25zdCBvcyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwib3NcIikpO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuZnVuY3Rpb24gaXNzdWVGaWxlQ29tbWFuZChjb21tYW5kLCBtZXNzYWdlKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwcm9jZXNzLmVudltgR0lUSFVCXyR7Y29tbWFuZH1gXTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGZpbmQgZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yIGZpbGUgY29tbWFuZCAke2NvbW1hbmR9YCk7XG4gICAgfVxuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGZpbGUgYXQgcGF0aDogJHtmaWxlUGF0aH1gKTtcbiAgICB9XG4gICAgZnMuYXBwZW5kRmlsZVN5bmMoZmlsZVBhdGgsIGAkeygwLCB1dGlsc18xLnRvQ29tbWFuZFZhbHVlKShtZXNzYWdlKX0ke29zLkVPTH1gLCB7XG4gICAgICAgIGVuY29kaW5nOiAndXRmOCdcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHByZXBhcmVLZXlWYWx1ZU1lc3NhZ2Uoa2V5LCB2YWx1ZSkge1xuICAgIGNvbnN0IGRlbGltaXRlciA9IGBnaGFkZWxpbWl0ZXJfJHtjcnlwdG8ucmFuZG9tVVVJRCgpfWA7XG4gICAgY29uc3QgY29udmVydGVkVmFsdWUgPSAoMCwgdXRpbHNfMS50b0NvbW1hbmRWYWx1ZSkodmFsdWUpO1xuICAgIC8vIFRoZXNlIHNob3VsZCByZWFsaXN0aWNhbGx5IG5ldmVyIGhhcHBlbiwgYnV0IGp1c3QgaW4gY2FzZSBzb21lb25lIGZpbmRzIGFcbiAgICAvLyB3YXkgdG8gZXhwbG9pdCB1dWlkIGdlbmVyYXRpb24gbGV0J3Mgbm90IGFsbG93IGtleXMgb3IgdmFsdWVzIHRoYXQgY29udGFpblxuICAgIC8vIHRoZSBkZWxpbWl0ZXIuXG4gICAgaWYgKGtleS5pbmNsdWRlcyhkZWxpbWl0ZXIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBpbnB1dDogbmFtZSBzaG91bGQgbm90IGNvbnRhaW4gdGhlIGRlbGltaXRlciBcIiR7ZGVsaW1pdGVyfVwiYCk7XG4gICAgfVxuICAgIGlmIChjb252ZXJ0ZWRWYWx1ZS5pbmNsdWRlcyhkZWxpbWl0ZXIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBpbnB1dDogdmFsdWUgc2hvdWxkIG5vdCBjb250YWluIHRoZSBkZWxpbWl0ZXIgXCIke2RlbGltaXRlcn1cImApO1xuICAgIH1cbiAgICByZXR1cm4gYCR7a2V5fTw8JHtkZWxpbWl0ZXJ9JHtvcy5FT0x9JHtjb252ZXJ0ZWRWYWx1ZX0ke29zLkVPTH0ke2RlbGltaXRlcn1gO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmlsZS1jb21tYW5kLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRQcm94eVVybCA9IGdldFByb3h5VXJsO1xuZXhwb3J0cy5jaGVja0J5cGFzcyA9IGNoZWNrQnlwYXNzO1xuZnVuY3Rpb24gZ2V0UHJveHlVcmwocmVxVXJsKSB7XG4gICAgY29uc3QgdXNpbmdTc2wgPSByZXFVcmwucHJvdG9jb2wgPT09ICdodHRwczonO1xuICAgIGlmIChjaGVja0J5cGFzcyhyZXFVcmwpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHByb3h5VmFyID0gKCgpID0+IHtcbiAgICAgICAgaWYgKHVzaW5nU3NsKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnZbJ2h0dHBzX3Byb3h5J10gfHwgcHJvY2Vzcy5lbnZbJ0hUVFBTX1BST1hZJ107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnZbJ2h0dHBfcHJveHknXSB8fCBwcm9jZXNzLmVudlsnSFRUUF9QUk9YWSddO1xuICAgICAgICB9XG4gICAgfSkoKTtcbiAgICBpZiAocHJveHlWYXIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGVjb2RlZFVSTChwcm94eVZhcik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICBpZiAoIXByb3h5VmFyLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSAmJiAhcHJveHlWYXIuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERlY29kZWRVUkwoYGh0dHA6Ly8ke3Byb3h5VmFyfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNoZWNrQnlwYXNzKHJlcVVybCkge1xuICAgIGlmICghcmVxVXJsLmhvc3RuYW1lKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgcmVxSG9zdCA9IHJlcVVybC5ob3N0bmFtZTtcbiAgICBpZiAoaXNMb29wYmFja0FkZHJlc3MocmVxSG9zdCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IG5vUHJveHkgPSBwcm9jZXNzLmVudlsnbm9fcHJveHknXSB8fCBwcm9jZXNzLmVudlsnTk9fUFJPWFknXSB8fCAnJztcbiAgICBpZiAoIW5vUHJveHkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBEZXRlcm1pbmUgdGhlIHJlcXVlc3QgcG9ydFxuICAgIGxldCByZXFQb3J0O1xuICAgIGlmIChyZXFVcmwucG9ydCkge1xuICAgICAgICByZXFQb3J0ID0gTnVtYmVyKHJlcVVybC5wb3J0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAocmVxVXJsLnByb3RvY29sID09PSAnaHR0cDonKSB7XG4gICAgICAgIHJlcVBvcnQgPSA4MDtcbiAgICB9XG4gICAgZWxzZSBpZiAocmVxVXJsLnByb3RvY29sID09PSAnaHR0cHM6Jykge1xuICAgICAgICByZXFQb3J0ID0gNDQzO1xuICAgIH1cbiAgICAvLyBGb3JtYXQgdGhlIHJlcXVlc3QgaG9zdG5hbWUgYW5kIGhvc3RuYW1lIHdpdGggcG9ydFxuICAgIGNvbnN0IHVwcGVyUmVxSG9zdHMgPSBbcmVxVXJsLmhvc3RuYW1lLnRvVXBwZXJDYXNlKCldO1xuICAgIGlmICh0eXBlb2YgcmVxUG9ydCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdXBwZXJSZXFIb3N0cy5wdXNoKGAke3VwcGVyUmVxSG9zdHNbMF19OiR7cmVxUG9ydH1gKTtcbiAgICB9XG4gICAgLy8gQ29tcGFyZSByZXF1ZXN0IGhvc3QgYWdhaW5zdCBub3Byb3h5XG4gICAgZm9yIChjb25zdCB1cHBlck5vUHJveHlJdGVtIG9mIG5vUHJveHlcbiAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgLm1hcCh4ID0+IHgudHJpbSgpLnRvVXBwZXJDYXNlKCkpXG4gICAgICAgIC5maWx0ZXIoeCA9PiB4KSkge1xuICAgICAgICBpZiAodXBwZXJOb1Byb3h5SXRlbSA9PT0gJyonIHx8XG4gICAgICAgICAgICB1cHBlclJlcUhvc3RzLnNvbWUoeCA9PiB4ID09PSB1cHBlck5vUHJveHlJdGVtIHx8XG4gICAgICAgICAgICAgICAgeC5lbmRzV2l0aChgLiR7dXBwZXJOb1Byb3h5SXRlbX1gKSB8fFxuICAgICAgICAgICAgICAgICh1cHBlck5vUHJveHlJdGVtLnN0YXJ0c1dpdGgoJy4nKSAmJlxuICAgICAgICAgICAgICAgICAgICB4LmVuZHNXaXRoKGAke3VwcGVyTm9Qcm94eUl0ZW19YCkpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNMb29wYmFja0FkZHJlc3MoaG9zdCkge1xuICAgIGNvbnN0IGhvc3RMb3dlciA9IGhvc3QudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gKGhvc3RMb3dlciA9PT0gJ2xvY2FsaG9zdCcgfHxcbiAgICAgICAgaG9zdExvd2VyLnN0YXJ0c1dpdGgoJzEyNy4nKSB8fFxuICAgICAgICBob3N0TG93ZXIuc3RhcnRzV2l0aCgnWzo6MV0nKSB8fFxuICAgICAgICBob3N0TG93ZXIuc3RhcnRzV2l0aCgnWzA6MDowOjA6MDowOjA6MV0nKSk7XG59XG5jbGFzcyBEZWNvZGVkVVJMIGV4dGVuZHMgVVJMIHtcbiAgICBjb25zdHJ1Y3Rvcih1cmwsIGJhc2UpIHtcbiAgICAgICAgc3VwZXIodXJsLCBiYXNlKTtcbiAgICAgICAgdGhpcy5fZGVjb2RlZFVzZXJuYW1lID0gZGVjb2RlVVJJQ29tcG9uZW50KHN1cGVyLnVzZXJuYW1lKTtcbiAgICAgICAgdGhpcy5fZGVjb2RlZFBhc3N3b3JkID0gZGVjb2RlVVJJQ29tcG9uZW50KHN1cGVyLnBhc3N3b3JkKTtcbiAgICB9XG4gICAgZ2V0IHVzZXJuYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVjb2RlZFVzZXJuYW1lO1xuICAgIH1cbiAgICBnZXQgcGFzc3dvcmQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWNvZGVkUGFzc3dvcmQ7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJveHkuanMubWFwIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbmV0ID0gcmVxdWlyZSgnbmV0Jyk7XG52YXIgdGxzID0gcmVxdWlyZSgndGxzJyk7XG52YXIgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKTtcbnZhciBodHRwcyA9IHJlcXVpcmUoJ2h0dHBzJyk7XG52YXIgZXZlbnRzID0gcmVxdWlyZSgnZXZlbnRzJyk7XG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuXG5leHBvcnRzLmh0dHBPdmVySHR0cCA9IGh0dHBPdmVySHR0cDtcbmV4cG9ydHMuaHR0cHNPdmVySHR0cCA9IGh0dHBzT3Zlckh0dHA7XG5leHBvcnRzLmh0dHBPdmVySHR0cHMgPSBodHRwT3Zlckh0dHBzO1xuZXhwb3J0cy5odHRwc092ZXJIdHRwcyA9IGh0dHBzT3Zlckh0dHBzO1xuXG5cbmZ1bmN0aW9uIGh0dHBPdmVySHR0cChvcHRpb25zKSB7XG4gIHZhciBhZ2VudCA9IG5ldyBUdW5uZWxpbmdBZ2VudChvcHRpb25zKTtcbiAgYWdlbnQucmVxdWVzdCA9IGh0dHAucmVxdWVzdDtcbiAgcmV0dXJuIGFnZW50O1xufVxuXG5mdW5jdGlvbiBodHRwc092ZXJIdHRwKG9wdGlvbnMpIHtcbiAgdmFyIGFnZW50ID0gbmV3IFR1bm5lbGluZ0FnZW50KG9wdGlvbnMpO1xuICBhZ2VudC5yZXF1ZXN0ID0gaHR0cC5yZXF1ZXN0O1xuICBhZ2VudC5jcmVhdGVTb2NrZXQgPSBjcmVhdGVTZWN1cmVTb2NrZXQ7XG4gIGFnZW50LmRlZmF1bHRQb3J0ID0gNDQzO1xuICByZXR1cm4gYWdlbnQ7XG59XG5cbmZ1bmN0aW9uIGh0dHBPdmVySHR0cHMob3B0aW9ucykge1xuICB2YXIgYWdlbnQgPSBuZXcgVHVubmVsaW5nQWdlbnQob3B0aW9ucyk7XG4gIGFnZW50LnJlcXVlc3QgPSBodHRwcy5yZXF1ZXN0O1xuICByZXR1cm4gYWdlbnQ7XG59XG5cbmZ1bmN0aW9uIGh0dHBzT3Zlckh0dHBzKG9wdGlvbnMpIHtcbiAgdmFyIGFnZW50ID0gbmV3IFR1bm5lbGluZ0FnZW50KG9wdGlvbnMpO1xuICBhZ2VudC5yZXF1ZXN0ID0gaHR0cHMucmVxdWVzdDtcbiAgYWdlbnQuY3JlYXRlU29ja2V0ID0gY3JlYXRlU2VjdXJlU29ja2V0O1xuICBhZ2VudC5kZWZhdWx0UG9ydCA9IDQ0MztcbiAgcmV0dXJuIGFnZW50O1xufVxuXG5cbmZ1bmN0aW9uIFR1bm5lbGluZ0FnZW50KG9wdGlvbnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBzZWxmLnByb3h5T3B0aW9ucyA9IHNlbGYub3B0aW9ucy5wcm94eSB8fCB7fTtcbiAgc2VsZi5tYXhTb2NrZXRzID0gc2VsZi5vcHRpb25zLm1heFNvY2tldHMgfHwgaHR0cC5BZ2VudC5kZWZhdWx0TWF4U29ja2V0cztcbiAgc2VsZi5yZXF1ZXN0cyA9IFtdO1xuICBzZWxmLnNvY2tldHMgPSBbXTtcblxuICBzZWxmLm9uKCdmcmVlJywgZnVuY3Rpb24gb25GcmVlKHNvY2tldCwgaG9zdCwgcG9ydCwgbG9jYWxBZGRyZXNzKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB0b09wdGlvbnMoaG9zdCwgcG9ydCwgbG9jYWxBZGRyZXNzKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc2VsZi5yZXF1ZXN0cy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgdmFyIHBlbmRpbmcgPSBzZWxmLnJlcXVlc3RzW2ldO1xuICAgICAgaWYgKHBlbmRpbmcuaG9zdCA9PT0gb3B0aW9ucy5ob3N0ICYmIHBlbmRpbmcucG9ydCA9PT0gb3B0aW9ucy5wb3J0KSB7XG4gICAgICAgIC8vIERldGVjdCB0aGUgcmVxdWVzdCB0byBjb25uZWN0IHNhbWUgb3JpZ2luIHNlcnZlcixcbiAgICAgICAgLy8gcmV1c2UgdGhlIGNvbm5lY3Rpb24uXG4gICAgICAgIHNlbGYucmVxdWVzdHMuc3BsaWNlKGksIDEpO1xuICAgICAgICBwZW5kaW5nLnJlcXVlc3Qub25Tb2NrZXQoc29ja2V0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgIHNlbGYucmVtb3ZlU29ja2V0KHNvY2tldCk7XG4gIH0pO1xufVxudXRpbC5pbmhlcml0cyhUdW5uZWxpbmdBZ2VudCwgZXZlbnRzLkV2ZW50RW1pdHRlcik7XG5cblR1bm5lbGluZ0FnZW50LnByb3RvdHlwZS5hZGRSZXF1ZXN0ID0gZnVuY3Rpb24gYWRkUmVxdWVzdChyZXEsIGhvc3QsIHBvcnQsIGxvY2FsQWRkcmVzcykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBvcHRpb25zID0gbWVyZ2VPcHRpb25zKHtyZXF1ZXN0OiByZXF9LCBzZWxmLm9wdGlvbnMsIHRvT3B0aW9ucyhob3N0LCBwb3J0LCBsb2NhbEFkZHJlc3MpKTtcblxuICBpZiAoc2VsZi5zb2NrZXRzLmxlbmd0aCA+PSB0aGlzLm1heFNvY2tldHMpIHtcbiAgICAvLyBXZSBhcmUgb3ZlciBsaW1pdCBzbyB3ZSdsbCBhZGQgaXQgdG8gdGhlIHF1ZXVlLlxuICAgIHNlbGYucmVxdWVzdHMucHVzaChvcHRpb25zKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBJZiB3ZSBhcmUgdW5kZXIgbWF4U29ja2V0cyBjcmVhdGUgYSBuZXcgb25lLlxuICBzZWxmLmNyZWF0ZVNvY2tldChvcHRpb25zLCBmdW5jdGlvbihzb2NrZXQpIHtcbiAgICBzb2NrZXQub24oJ2ZyZWUnLCBvbkZyZWUpO1xuICAgIHNvY2tldC5vbignY2xvc2UnLCBvbkNsb3NlT3JSZW1vdmUpO1xuICAgIHNvY2tldC5vbignYWdlbnRSZW1vdmUnLCBvbkNsb3NlT3JSZW1vdmUpO1xuICAgIHJlcS5vblNvY2tldChzb2NrZXQpO1xuXG4gICAgZnVuY3Rpb24gb25GcmVlKCkge1xuICAgICAgc2VsZi5lbWl0KCdmcmVlJywgc29ja2V0LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbkNsb3NlT3JSZW1vdmUoZXJyKSB7XG4gICAgICBzZWxmLnJlbW92ZVNvY2tldChzb2NrZXQpO1xuICAgICAgc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdmcmVlJywgb25GcmVlKTtcbiAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbkNsb3NlT3JSZW1vdmUpO1xuICAgICAgc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdhZ2VudFJlbW92ZScsIG9uQ2xvc2VPclJlbW92ZSk7XG4gICAgfVxuICB9KTtcbn07XG5cblR1bm5lbGluZ0FnZW50LnByb3RvdHlwZS5jcmVhdGVTb2NrZXQgPSBmdW5jdGlvbiBjcmVhdGVTb2NrZXQob3B0aW9ucywgY2IpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcGxhY2Vob2xkZXIgPSB7fTtcbiAgc2VsZi5zb2NrZXRzLnB1c2gocGxhY2Vob2xkZXIpO1xuXG4gIHZhciBjb25uZWN0T3B0aW9ucyA9IG1lcmdlT3B0aW9ucyh7fSwgc2VsZi5wcm94eU9wdGlvbnMsIHtcbiAgICBtZXRob2Q6ICdDT05ORUNUJyxcbiAgICBwYXRoOiBvcHRpb25zLmhvc3QgKyAnOicgKyBvcHRpb25zLnBvcnQsXG4gICAgYWdlbnQ6IGZhbHNlLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIGhvc3Q6IG9wdGlvbnMuaG9zdCArICc6JyArIG9wdGlvbnMucG9ydFxuICAgIH1cbiAgfSk7XG4gIGlmIChvcHRpb25zLmxvY2FsQWRkcmVzcykge1xuICAgIGNvbm5lY3RPcHRpb25zLmxvY2FsQWRkcmVzcyA9IG9wdGlvbnMubG9jYWxBZGRyZXNzO1xuICB9XG4gIGlmIChjb25uZWN0T3B0aW9ucy5wcm94eUF1dGgpIHtcbiAgICBjb25uZWN0T3B0aW9ucy5oZWFkZXJzID0gY29ubmVjdE9wdGlvbnMuaGVhZGVycyB8fCB7fTtcbiAgICBjb25uZWN0T3B0aW9ucy5oZWFkZXJzWydQcm94eS1BdXRob3JpemF0aW9uJ10gPSAnQmFzaWMgJyArXG4gICAgICAgIG5ldyBCdWZmZXIoY29ubmVjdE9wdGlvbnMucHJveHlBdXRoKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIH1cblxuICBkZWJ1ZygnbWFraW5nIENPTk5FQ1QgcmVxdWVzdCcpO1xuICB2YXIgY29ubmVjdFJlcSA9IHNlbGYucmVxdWVzdChjb25uZWN0T3B0aW9ucyk7XG4gIGNvbm5lY3RSZXEudXNlQ2h1bmtlZEVuY29kaW5nQnlEZWZhdWx0ID0gZmFsc2U7IC8vIGZvciB2MC42XG4gIGNvbm5lY3RSZXEub25jZSgncmVzcG9uc2UnLCBvblJlc3BvbnNlKTsgLy8gZm9yIHYwLjZcbiAgY29ubmVjdFJlcS5vbmNlKCd1cGdyYWRlJywgb25VcGdyYWRlKTsgICAvLyBmb3IgdjAuNlxuICBjb25uZWN0UmVxLm9uY2UoJ2Nvbm5lY3QnLCBvbkNvbm5lY3QpOyAgIC8vIGZvciB2MC43IG9yIGxhdGVyXG4gIGNvbm5lY3RSZXEub25jZSgnZXJyb3InLCBvbkVycm9yKTtcbiAgY29ubmVjdFJlcS5lbmQoKTtcblxuICBmdW5jdGlvbiBvblJlc3BvbnNlKHJlcykge1xuICAgIC8vIFZlcnkgaGFja3kuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGh0dHAtcGFyc2VyIGxlYWtzLlxuICAgIHJlcy51cGdyYWRlID0gdHJ1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uVXBncmFkZShyZXMsIHNvY2tldCwgaGVhZCkge1xuICAgIC8vIEhhY2t5LlxuICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICBvbkNvbm5lY3QocmVzLCBzb2NrZXQsIGhlYWQpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gb25Db25uZWN0KHJlcywgc29ja2V0LCBoZWFkKSB7XG4gICAgY29ubmVjdFJlcS5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBzb2NrZXQucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG5cbiAgICBpZiAocmVzLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgICAgZGVidWcoJ3R1bm5lbGluZyBzb2NrZXQgY291bGQgbm90IGJlIGVzdGFibGlzaGVkLCBzdGF0dXNDb2RlPSVkJyxcbiAgICAgICAgcmVzLnN0YXR1c0NvZGUpO1xuICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcigndHVubmVsaW5nIHNvY2tldCBjb3VsZCBub3QgYmUgZXN0YWJsaXNoZWQsICcgK1xuICAgICAgICAnc3RhdHVzQ29kZT0nICsgcmVzLnN0YXR1c0NvZGUpO1xuICAgICAgZXJyb3IuY29kZSA9ICdFQ09OTlJFU0VUJztcbiAgICAgIG9wdGlvbnMucmVxdWVzdC5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgICAgIHNlbGYucmVtb3ZlU29ja2V0KHBsYWNlaG9sZGVyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGhlYWQubGVuZ3RoID4gMCkge1xuICAgICAgZGVidWcoJ2dvdCBpbGxlZ2FsIHJlc3BvbnNlIGJvZHkgZnJvbSBwcm94eScpO1xuICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcignZ290IGlsbGVnYWwgcmVzcG9uc2UgYm9keSBmcm9tIHByb3h5Jyk7XG4gICAgICBlcnJvci5jb2RlID0gJ0VDT05OUkVTRVQnO1xuICAgICAgb3B0aW9ucy5yZXF1ZXN0LmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgc2VsZi5yZW1vdmVTb2NrZXQocGxhY2Vob2xkZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkZWJ1ZygndHVubmVsaW5nIGNvbm5lY3Rpb24gaGFzIGVzdGFibGlzaGVkJyk7XG4gICAgc2VsZi5zb2NrZXRzW3NlbGYuc29ja2V0cy5pbmRleE9mKHBsYWNlaG9sZGVyKV0gPSBzb2NrZXQ7XG4gICAgcmV0dXJuIGNiKHNvY2tldCk7XG4gIH1cblxuICBmdW5jdGlvbiBvbkVycm9yKGNhdXNlKSB7XG4gICAgY29ubmVjdFJlcS5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcblxuICAgIGRlYnVnKCd0dW5uZWxpbmcgc29ja2V0IGNvdWxkIG5vdCBiZSBlc3RhYmxpc2hlZCwgY2F1c2U9JXNcXG4nLFxuICAgICAgICAgIGNhdXNlLm1lc3NhZ2UsIGNhdXNlLnN0YWNrKTtcbiAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ3R1bm5lbGluZyBzb2NrZXQgY291bGQgbm90IGJlIGVzdGFibGlzaGVkLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NhdXNlPScgKyBjYXVzZS5tZXNzYWdlKTtcbiAgICBlcnJvci5jb2RlID0gJ0VDT05OUkVTRVQnO1xuICAgIG9wdGlvbnMucmVxdWVzdC5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgICBzZWxmLnJlbW92ZVNvY2tldChwbGFjZWhvbGRlcik7XG4gIH1cbn07XG5cblR1bm5lbGluZ0FnZW50LnByb3RvdHlwZS5yZW1vdmVTb2NrZXQgPSBmdW5jdGlvbiByZW1vdmVTb2NrZXQoc29ja2V0KSB7XG4gIHZhciBwb3MgPSB0aGlzLnNvY2tldHMuaW5kZXhPZihzb2NrZXQpXG4gIGlmIChwb3MgPT09IC0xKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuc29ja2V0cy5zcGxpY2UocG9zLCAxKTtcblxuICB2YXIgcGVuZGluZyA9IHRoaXMucmVxdWVzdHMuc2hpZnQoKTtcbiAgaWYgKHBlbmRpbmcpIHtcbiAgICAvLyBJZiB3ZSBoYXZlIHBlbmRpbmcgcmVxdWVzdHMgYW5kIGEgc29ja2V0IGdldHMgY2xvc2VkIGEgbmV3IG9uZVxuICAgIC8vIG5lZWRzIHRvIGJlIGNyZWF0ZWQgdG8gdGFrZSBvdmVyIGluIHRoZSBwb29sIGZvciB0aGUgb25lIHRoYXQgY2xvc2VkLlxuICAgIHRoaXMuY3JlYXRlU29ja2V0KHBlbmRpbmcsIGZ1bmN0aW9uKHNvY2tldCkge1xuICAgICAgcGVuZGluZy5yZXF1ZXN0Lm9uU29ja2V0KHNvY2tldCk7XG4gICAgfSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZVNlY3VyZVNvY2tldChvcHRpb25zLCBjYikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIFR1bm5lbGluZ0FnZW50LnByb3RvdHlwZS5jcmVhdGVTb2NrZXQuY2FsbChzZWxmLCBvcHRpb25zLCBmdW5jdGlvbihzb2NrZXQpIHtcbiAgICB2YXIgaG9zdEhlYWRlciA9IG9wdGlvbnMucmVxdWVzdC5nZXRIZWFkZXIoJ2hvc3QnKTtcbiAgICB2YXIgdGxzT3B0aW9ucyA9IG1lcmdlT3B0aW9ucyh7fSwgc2VsZi5vcHRpb25zLCB7XG4gICAgICBzb2NrZXQ6IHNvY2tldCxcbiAgICAgIHNlcnZlcm5hbWU6IGhvc3RIZWFkZXIgPyBob3N0SGVhZGVyLnJlcGxhY2UoLzouKiQvLCAnJykgOiBvcHRpb25zLmhvc3RcbiAgICB9KTtcblxuICAgIC8vIDAgaXMgZHVtbXkgcG9ydCBmb3IgdjAuNlxuICAgIHZhciBzZWN1cmVTb2NrZXQgPSB0bHMuY29ubmVjdCgwLCB0bHNPcHRpb25zKTtcbiAgICBzZWxmLnNvY2tldHNbc2VsZi5zb2NrZXRzLmluZGV4T2Yoc29ja2V0KV0gPSBzZWN1cmVTb2NrZXQ7XG4gICAgY2Ioc2VjdXJlU29ja2V0KTtcbiAgfSk7XG59XG5cblxuZnVuY3Rpb24gdG9PcHRpb25zKGhvc3QsIHBvcnQsIGxvY2FsQWRkcmVzcykge1xuICBpZiAodHlwZW9mIGhvc3QgPT09ICdzdHJpbmcnKSB7IC8vIHNpbmNlIHYwLjEwXG4gICAgcmV0dXJuIHtcbiAgICAgIGhvc3Q6IGhvc3QsXG4gICAgICBwb3J0OiBwb3J0LFxuICAgICAgbG9jYWxBZGRyZXNzOiBsb2NhbEFkZHJlc3NcbiAgICB9O1xuICB9XG4gIHJldHVybiBob3N0OyAvLyBmb3IgdjAuMTEgb3IgbGF0ZXJcbn1cblxuZnVuY3Rpb24gbWVyZ2VPcHRpb25zKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgdmFyIG92ZXJyaWRlcyA9IGFyZ3VtZW50c1tpXTtcbiAgICBpZiAodHlwZW9mIG92ZXJyaWRlcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob3ZlcnJpZGVzKTtcbiAgICAgIGZvciAodmFyIGogPSAwLCBrZXlMZW4gPSBrZXlzLmxlbmd0aDsgaiA8IGtleUxlbjsgKytqKSB7XG4gICAgICAgIHZhciBrID0ga2V5c1tqXTtcbiAgICAgICAgaWYgKG92ZXJyaWRlc1trXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGFyZ2V0W2tdID0gb3ZlcnJpZGVzW2tdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cblxudmFyIGRlYnVnO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfREVCVUcgJiYgL1xcYnR1bm5lbFxcYi8udGVzdChwcm9jZXNzLmVudi5OT0RFX0RFQlVHKSkge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICBhcmdzWzBdID0gJ1RVTk5FTDogJyArIGFyZ3NbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3MudW5zaGlmdCgnVFVOTkVMOicpO1xuICAgIH1cbiAgICBjb25zb2xlLmVycm9yLmFwcGx5KGNvbnNvbGUsIGFyZ3MpO1xuICB9XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uKCkge307XG59XG5leHBvcnRzLmRlYnVnID0gZGVidWc7IC8vIGZvciB0ZXN0XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL3R1bm5lbCcpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIGtDbG9zZTogU3ltYm9sKCdjbG9zZScpLFxuICBrRGVzdHJveTogU3ltYm9sKCdkZXN0cm95JyksXG4gIGtEaXNwYXRjaDogU3ltYm9sKCdkaXNwYXRjaCcpLFxuICBrVXJsOiBTeW1ib2woJ3VybCcpLFxuICBrV3JpdGluZzogU3ltYm9sKCd3cml0aW5nJyksXG4gIGtSZXN1bWluZzogU3ltYm9sKCdyZXN1bWluZycpLFxuICBrUXVldWU6IFN5bWJvbCgncXVldWUnKSxcbiAga0Nvbm5lY3Q6IFN5bWJvbCgnY29ubmVjdCcpLFxuICBrQ29ubmVjdGluZzogU3ltYm9sKCdjb25uZWN0aW5nJyksXG4gIGtLZWVwQWxpdmVEZWZhdWx0VGltZW91dDogU3ltYm9sKCdkZWZhdWx0IGtlZXAgYWxpdmUgdGltZW91dCcpLFxuICBrS2VlcEFsaXZlTWF4VGltZW91dDogU3ltYm9sKCdtYXgga2VlcCBhbGl2ZSB0aW1lb3V0JyksXG4gIGtLZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkOiBTeW1ib2woJ2tlZXAgYWxpdmUgdGltZW91dCB0aHJlc2hvbGQnKSxcbiAga0tlZXBBbGl2ZVRpbWVvdXRWYWx1ZTogU3ltYm9sKCdrZWVwIGFsaXZlIHRpbWVvdXQnKSxcbiAga0tlZXBBbGl2ZTogU3ltYm9sKCdrZWVwIGFsaXZlJyksXG4gIGtIZWFkZXJzVGltZW91dDogU3ltYm9sKCdoZWFkZXJzIHRpbWVvdXQnKSxcbiAga0JvZHlUaW1lb3V0OiBTeW1ib2woJ2JvZHkgdGltZW91dCcpLFxuICBrU2VydmVyTmFtZTogU3ltYm9sKCdzZXJ2ZXIgbmFtZScpLFxuICBrTG9jYWxBZGRyZXNzOiBTeW1ib2woJ2xvY2FsIGFkZHJlc3MnKSxcbiAga0hvc3Q6IFN5bWJvbCgnaG9zdCcpLFxuICBrTm9SZWY6IFN5bWJvbCgnbm8gcmVmJyksXG4gIGtCb2R5VXNlZDogU3ltYm9sKCd1c2VkJyksXG4gIGtCb2R5OiBTeW1ib2woJ2Fic3RyYWN0ZWQgcmVxdWVzdCBib2R5JyksXG4gIGtSdW5uaW5nOiBTeW1ib2woJ3J1bm5pbmcnKSxcbiAga0Jsb2NraW5nOiBTeW1ib2woJ2Jsb2NraW5nJyksXG4gIGtQZW5kaW5nOiBTeW1ib2woJ3BlbmRpbmcnKSxcbiAga1NpemU6IFN5bWJvbCgnc2l6ZScpLFxuICBrQnVzeTogU3ltYm9sKCdidXN5JyksXG4gIGtRdWV1ZWQ6IFN5bWJvbCgncXVldWVkJyksXG4gIGtGcmVlOiBTeW1ib2woJ2ZyZWUnKSxcbiAga0Nvbm5lY3RlZDogU3ltYm9sKCdjb25uZWN0ZWQnKSxcbiAga0Nsb3NlZDogU3ltYm9sKCdjbG9zZWQnKSxcbiAga05lZWREcmFpbjogU3ltYm9sKCduZWVkIGRyYWluJyksXG4gIGtSZXNldDogU3ltYm9sKCdyZXNldCcpLFxuICBrRGVzdHJveWVkOiBTeW1ib2wuZm9yKCdub2RlanMuc3RyZWFtLmRlc3Ryb3llZCcpLFxuICBrUmVzdW1lOiBTeW1ib2woJ3Jlc3VtZScpLFxuICBrT25FcnJvcjogU3ltYm9sKCdvbiBlcnJvcicpLFxuICBrTWF4SGVhZGVyc1NpemU6IFN5bWJvbCgnbWF4IGhlYWRlcnMgc2l6ZScpLFxuICBrUnVubmluZ0lkeDogU3ltYm9sKCdydW5uaW5nIGluZGV4JyksXG4gIGtQZW5kaW5nSWR4OiBTeW1ib2woJ3BlbmRpbmcgaW5kZXgnKSxcbiAga0Vycm9yOiBTeW1ib2woJ2Vycm9yJyksXG4gIGtDbGllbnRzOiBTeW1ib2woJ2NsaWVudHMnKSxcbiAga0NsaWVudDogU3ltYm9sKCdjbGllbnQnKSxcbiAga1BhcnNlcjogU3ltYm9sKCdwYXJzZXInKSxcbiAga09uRGVzdHJveWVkOiBTeW1ib2woJ2Rlc3Ryb3kgY2FsbGJhY2tzJyksXG4gIGtQaXBlbGluaW5nOiBTeW1ib2woJ3BpcGVsaW5pbmcnKSxcbiAga1NvY2tldDogU3ltYm9sKCdzb2NrZXQnKSxcbiAga0hvc3RIZWFkZXI6IFN5bWJvbCgnaG9zdCBoZWFkZXInKSxcbiAga0Nvbm5lY3RvcjogU3ltYm9sKCdjb25uZWN0b3InKSxcbiAga1N0cmljdENvbnRlbnRMZW5ndGg6IFN5bWJvbCgnc3RyaWN0IGNvbnRlbnQgbGVuZ3RoJyksXG4gIGtNYXhSZWRpcmVjdGlvbnM6IFN5bWJvbCgnbWF4UmVkaXJlY3Rpb25zJyksXG4gIGtNYXhSZXF1ZXN0czogU3ltYm9sKCdtYXhSZXF1ZXN0c1BlckNsaWVudCcpLFxuICBrUHJveHk6IFN5bWJvbCgncHJveHkgYWdlbnQgb3B0aW9ucycpLFxuICBrQ291bnRlcjogU3ltYm9sKCdzb2NrZXQgcmVxdWVzdCBjb3VudGVyJyksXG4gIGtJbnRlcmNlcHRvcnM6IFN5bWJvbCgnZGlzcGF0Y2ggaW50ZXJjZXB0b3JzJyksXG4gIGtNYXhSZXNwb25zZVNpemU6IFN5bWJvbCgnbWF4IHJlc3BvbnNlIHNpemUnKSxcbiAga0hUVFAyU2Vzc2lvbjogU3ltYm9sKCdodHRwMlNlc3Npb24nKSxcbiAga0hUVFAyU2Vzc2lvblN0YXRlOiBTeW1ib2woJ2h0dHAyU2Vzc2lvbiBzdGF0ZScpLFxuICBrUmV0cnlIYW5kbGVyRGVmYXVsdFJldHJ5OiBTeW1ib2woJ3JldHJ5IGFnZW50IGRlZmF1bHQgcmV0cnknKSxcbiAga0NvbnN0cnVjdDogU3ltYm9sKCdjb25zdHJ1Y3RhYmxlJyksXG4gIGtMaXN0ZW5lcnM6IFN5bWJvbCgnbGlzdGVuZXJzJyksXG4gIGtIVFRQQ29udGV4dDogU3ltYm9sKCdodHRwIGNvbnRleHQnKSxcbiAga01heENvbmN1cnJlbnRTdHJlYW1zOiBTeW1ib2woJ21heCBjb25jdXJyZW50IHN0cmVhbXMnKSxcbiAga05vUHJveHlBZ2VudDogU3ltYm9sKCdubyBwcm94eSBhZ2VudCcpLFxuICBrSHR0cFByb3h5QWdlbnQ6IFN5bWJvbCgnaHR0cCBwcm94eSBhZ2VudCcpLFxuICBrSHR0cHNQcm94eUFnZW50OiBTeW1ib2woJ2h0dHBzIHByb3h5IGFnZW50Jylcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBrVW5kaWNpRXJyb3IgPSBTeW1ib2wuZm9yKCd1bmRpY2kuZXJyb3IuVU5EX0VSUicpXG5jbGFzcyBVbmRpY2lFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIHRoaXMubmFtZSA9ICdVbmRpY2lFcnJvcidcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUidcbiAgfVxuXG4gIHN0YXRpYyBbU3ltYm9sLmhhc0luc3RhbmNlXSAoaW5zdGFuY2UpIHtcbiAgICByZXR1cm4gaW5zdGFuY2UgJiYgaW5zdGFuY2Vba1VuZGljaUVycm9yXSA9PT0gdHJ1ZVxuICB9XG5cbiAgW2tVbmRpY2lFcnJvcl0gPSB0cnVlXG59XG5cbmNvbnN0IGtDb25uZWN0VGltZW91dEVycm9yID0gU3ltYm9sLmZvcigndW5kaWNpLmVycm9yLlVORF9FUlJfQ09OTkVDVF9USU1FT1VUJylcbmNsYXNzIENvbm5lY3RUaW1lb3V0RXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICB0aGlzLm5hbWUgPSAnQ29ubmVjdFRpbWVvdXRFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdDb25uZWN0IFRpbWVvdXQgRXJyb3InXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfQ09OTkVDVF9USU1FT1VUJ1xuICB9XG5cbiAgc3RhdGljIFtTeW1ib2wuaGFzSW5zdGFuY2VdIChpbnN0YW5jZSkge1xuICAgIHJldHVybiBpbnN0YW5jZSAmJiBpbnN0YW5jZVtrQ29ubmVjdFRpbWVvdXRFcnJvcl0gPT09IHRydWVcbiAgfVxuXG4gIFtrQ29ubmVjdFRpbWVvdXRFcnJvcl0gPSB0cnVlXG59XG5cbmNvbnN0IGtIZWFkZXJzVGltZW91dEVycm9yID0gU3ltYm9sLmZvcigndW5kaWNpLmVycm9yLlVORF9FUlJfSEVBREVSU19USU1FT1VUJylcbmNsYXNzIEhlYWRlcnNUaW1lb3V0RXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICB0aGlzLm5hbWUgPSAnSGVhZGVyc1RpbWVvdXRFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdIZWFkZXJzIFRpbWVvdXQgRXJyb3InXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfSEVBREVSU19USU1FT1VUJ1xuICB9XG5cbiAgc3RhdGljIFtTeW1ib2wuaGFzSW5zdGFuY2VdIChpbnN0YW5jZSkge1xuICAgIHJldHVybiBpbnN0YW5jZSAmJiBpbnN0YW5jZVtrSGVhZGVyc1RpbWVvdXRFcnJvcl0gPT09IHRydWVcbiAgfVxuXG4gIFtrSGVhZGVyc1RpbWVvdXRFcnJvcl0gPSB0cnVlXG59XG5cbmNvbnN0IGtIZWFkZXJzT3ZlcmZsb3dFcnJvciA9IFN5bWJvbC5mb3IoJ3VuZGljaS5lcnJvci5VTkRfRVJSX0hFQURFUlNfT1ZFUkZMT1cnKVxuY2xhc3MgSGVhZGVyc092ZXJmbG93RXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICB0aGlzLm5hbWUgPSAnSGVhZGVyc092ZXJmbG93RXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnSGVhZGVycyBPdmVyZmxvdyBFcnJvcidcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9IRUFERVJTX09WRVJGTE9XJ1xuICB9XG5cbiAgc3RhdGljIFtTeW1ib2wuaGFzSW5zdGFuY2VdIChpbnN0YW5jZSkge1xuICAgIHJldHVybiBpbnN0YW5jZSAmJiBpbnN0YW5jZVtrSGVhZGVyc092ZXJmbG93RXJyb3JdID09PSB0cnVlXG4gIH1cblxuICBba0hlYWRlcnNPdmVyZmxvd0Vycm9yXSA9IHRydWVcbn1cblxuY29uc3Qga0JvZHlUaW1lb3V0RXJyb3IgPSBTeW1ib2wuZm9yKCd1bmRpY2kuZXJyb3IuVU5EX0VSUl9CT0RZX1RJTUVPVVQnKVxuY2xhc3MgQm9keVRpbWVvdXRFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIHRoaXMubmFtZSA9ICdCb2R5VGltZW91dEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ0JvZHkgVGltZW91dCBFcnJvcidcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9CT0RZX1RJTUVPVVQnXG4gIH1cblxuICBzdGF0aWMgW1N5bWJvbC5oYXNJbnN0YW5jZV0gKGluc3RhbmNlKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlICYmIGluc3RhbmNlW2tCb2R5VGltZW91dEVycm9yXSA9PT0gdHJ1ZVxuICB9XG5cbiAgW2tCb2R5VGltZW91dEVycm9yXSA9IHRydWVcbn1cblxuY29uc3Qga1Jlc3BvbnNlU3RhdHVzQ29kZUVycm9yID0gU3ltYm9sLmZvcigndW5kaWNpLmVycm9yLlVORF9FUlJfUkVTUE9OU0VfU1RBVFVTX0NPREUnKVxuY2xhc3MgUmVzcG9uc2VTdGF0dXNDb2RlRXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlLCBzdGF0dXNDb2RlLCBoZWFkZXJzLCBib2R5KSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICB0aGlzLm5hbWUgPSAnUmVzcG9uc2VTdGF0dXNDb2RlRXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnUmVzcG9uc2UgU3RhdHVzIENvZGUgRXJyb3InXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfUkVTUE9OU0VfU1RBVFVTX0NPREUnXG4gICAgdGhpcy5ib2R5ID0gYm9keVxuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzQ29kZVxuICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGVcbiAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzXG4gIH1cblxuICBzdGF0aWMgW1N5bWJvbC5oYXNJbnN0YW5jZV0gKGluc3RhbmNlKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlICYmIGluc3RhbmNlW2tSZXNwb25zZVN0YXR1c0NvZGVFcnJvcl0gPT09IHRydWVcbiAgfVxuXG4gIFtrUmVzcG9uc2VTdGF0dXNDb2RlRXJyb3JdID0gdHJ1ZVxufVxuXG5jb25zdCBrSW52YWxpZEFyZ3VtZW50RXJyb3IgPSBTeW1ib2wuZm9yKCd1bmRpY2kuZXJyb3IuVU5EX0VSUl9JTlZBTElEX0FSRycpXG5jbGFzcyBJbnZhbGlkQXJndW1lbnRFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIHRoaXMubmFtZSA9ICdJbnZhbGlkQXJndW1lbnRFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdJbnZhbGlkIEFyZ3VtZW50IEVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0lOVkFMSURfQVJHJ1xuICB9XG5cbiAgc3RhdGljIFtTeW1ib2wuaGFzSW5zdGFuY2VdIChpbnN0YW5jZSkge1xuICAgIHJldHVybiBpbnN0YW5jZSAmJiBpbnN0YW5jZVtrSW52YWxpZEFyZ3VtZW50RXJyb3JdID09PSB0cnVlXG4gIH1cblxuICBba0ludmFsaWRBcmd1bWVudEVycm9yXSA9IHRydWVcbn1cblxuY29uc3Qga0ludmFsaWRSZXR1cm5WYWx1ZUVycm9yID0gU3ltYm9sLmZvcigndW5kaWNpLmVycm9yLlVORF9FUlJfSU5WQUxJRF9SRVRVUk5fVkFMVUUnKVxuY2xhc3MgSW52YWxpZFJldHVyblZhbHVlRXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICB0aGlzLm5hbWUgPSAnSW52YWxpZFJldHVyblZhbHVlRXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnSW52YWxpZCBSZXR1cm4gVmFsdWUgRXJyb3InXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfSU5WQUxJRF9SRVRVUk5fVkFMVUUnXG4gIH1cblxuICBzdGF0aWMgW1N5bWJvbC5oYXNJbnN0YW5jZV0gKGluc3RhbmNlKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlICYmIGluc3RhbmNlW2tJbnZhbGlkUmV0dXJuVmFsdWVFcnJvcl0gPT09IHRydWVcbiAgfVxuXG4gIFtrSW52YWxpZFJldHVyblZhbHVlRXJyb3JdID0gdHJ1ZVxufVxuXG5jb25zdCBrQWJvcnRFcnJvciA9IFN5bWJvbC5mb3IoJ3VuZGljaS5lcnJvci5VTkRfRVJSX0FCT1JUJylcbmNsYXNzIEFib3J0RXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICB0aGlzLm5hbWUgPSAnQWJvcnRFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdUaGUgb3BlcmF0aW9uIHdhcyBhYm9ydGVkJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0FCT1JUJ1xuICB9XG5cbiAgc3RhdGljIFtTeW1ib2wuaGFzSW5zdGFuY2VdIChpbnN0YW5jZSkge1xuICAgIHJldHVybiBpbnN0YW5jZSAmJiBpbnN0YW5jZVtrQWJvcnRFcnJvcl0gPT09IHRydWVcbiAgfVxuXG4gIFtrQWJvcnRFcnJvcl0gPSB0cnVlXG59XG5cbmNvbnN0IGtSZXF1ZXN0QWJvcnRlZEVycm9yID0gU3ltYm9sLmZvcigndW5kaWNpLmVycm9yLlVORF9FUlJfQUJPUlRFRCcpXG5jbGFzcyBSZXF1ZXN0QWJvcnRlZEVycm9yIGV4dGVuZHMgQWJvcnRFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICB0aGlzLm5hbWUgPSAnQWJvcnRFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdSZXF1ZXN0IGFib3J0ZWQnXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfQUJPUlRFRCdcbiAgfVxuXG4gIHN0YXRpYyBbU3ltYm9sLmhhc0luc3RhbmNlXSAoaW5zdGFuY2UpIHtcbiAgICByZXR1cm4gaW5zdGFuY2UgJiYgaW5zdGFuY2Vba1JlcXVlc3RBYm9ydGVkRXJyb3JdID09PSB0cnVlXG4gIH1cblxuICBba1JlcXVlc3RBYm9ydGVkRXJyb3JdID0gdHJ1ZVxufVxuXG5jb25zdCBrSW5mb3JtYXRpb25hbEVycm9yID0gU3ltYm9sLmZvcigndW5kaWNpLmVycm9yLlVORF9FUlJfSU5GTycpXG5jbGFzcyBJbmZvcm1hdGlvbmFsRXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICB0aGlzLm5hbWUgPSAnSW5mb3JtYXRpb25hbEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1JlcXVlc3QgaW5mb3JtYXRpb24nXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfSU5GTydcbiAgfVxuXG4gIHN0YXRpYyBbU3ltYm9sLmhhc0luc3RhbmNlXSAoaW5zdGFuY2UpIHtcbiAgICByZXR1cm4gaW5zdGFuY2UgJiYgaW5zdGFuY2Vba0luZm9ybWF0aW9uYWxFcnJvcl0gPT09IHRydWVcbiAgfVxuXG4gIFtrSW5mb3JtYXRpb25hbEVycm9yXSA9IHRydWVcbn1cblxuY29uc3Qga1JlcXVlc3RDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvciA9IFN5bWJvbC5mb3IoJ3VuZGljaS5lcnJvci5VTkRfRVJSX1JFUV9DT05URU5UX0xFTkdUSF9NSVNNQVRDSCcpXG5jbGFzcyBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICB0aGlzLm5hbWUgPSAnUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1JlcXVlc3QgYm9keSBsZW5ndGggZG9lcyBub3QgbWF0Y2ggY29udGVudC1sZW5ndGggaGVhZGVyJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX1JFUV9DT05URU5UX0xFTkdUSF9NSVNNQVRDSCdcbiAgfVxuXG4gIHN0YXRpYyBbU3ltYm9sLmhhc0luc3RhbmNlXSAoaW5zdGFuY2UpIHtcbiAgICByZXR1cm4gaW5zdGFuY2UgJiYgaW5zdGFuY2Vba1JlcXVlc3RDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcl0gPT09IHRydWVcbiAgfVxuXG4gIFtrUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yXSA9IHRydWVcbn1cblxuY29uc3Qga1Jlc3BvbnNlQ29udGVudExlbmd0aE1pc21hdGNoRXJyb3IgPSBTeW1ib2wuZm9yKCd1bmRpY2kuZXJyb3IuVU5EX0VSUl9SRVNfQ09OVEVOVF9MRU5HVEhfTUlTTUFUQ0gnKVxuY2xhc3MgUmVzcG9uc2VDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIHRoaXMubmFtZSA9ICdSZXNwb25zZUNvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1Jlc3BvbnNlIGJvZHkgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGNvbnRlbnQtbGVuZ3RoIGhlYWRlcidcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9SRVNfQ09OVEVOVF9MRU5HVEhfTUlTTUFUQ0gnXG4gIH1cblxuICBzdGF0aWMgW1N5bWJvbC5oYXNJbnN0YW5jZV0gKGluc3RhbmNlKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlICYmIGluc3RhbmNlW2tSZXNwb25zZUNvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yXSA9PT0gdHJ1ZVxuICB9XG5cbiAgW2tSZXNwb25zZUNvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yXSA9IHRydWVcbn1cblxuY29uc3Qga0NsaWVudERlc3Ryb3llZEVycm9yID0gU3ltYm9sLmZvcigndW5kaWNpLmVycm9yLlVORF9FUlJfREVTVFJPWUVEJylcbmNsYXNzIENsaWVudERlc3Ryb3llZEVycm9yIGV4dGVuZHMgVW5kaWNpRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgdGhpcy5uYW1lID0gJ0NsaWVudERlc3Ryb3llZEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1RoZSBjbGllbnQgaXMgZGVzdHJveWVkJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0RFU1RST1lFRCdcbiAgfVxuXG4gIHN0YXRpYyBbU3ltYm9sLmhhc0luc3RhbmNlXSAoaW5zdGFuY2UpIHtcbiAgICByZXR1cm4gaW5zdGFuY2UgJiYgaW5zdGFuY2Vba0NsaWVudERlc3Ryb3llZEVycm9yXSA9PT0gdHJ1ZVxuICB9XG5cbiAgW2tDbGllbnREZXN0cm95ZWRFcnJvcl0gPSB0cnVlXG59XG5cbmNvbnN0IGtDbGllbnRDbG9zZWRFcnJvciA9IFN5bWJvbC5mb3IoJ3VuZGljaS5lcnJvci5VTkRfRVJSX0NMT1NFRCcpXG5jbGFzcyBDbGllbnRDbG9zZWRFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIHRoaXMubmFtZSA9ICdDbGllbnRDbG9zZWRFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdUaGUgY2xpZW50IGlzIGNsb3NlZCdcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9DTE9TRUQnXG4gIH1cblxuICBzdGF0aWMgW1N5bWJvbC5oYXNJbnN0YW5jZV0gKGluc3RhbmNlKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlICYmIGluc3RhbmNlW2tDbGllbnRDbG9zZWRFcnJvcl0gPT09IHRydWVcbiAgfVxuXG4gIFtrQ2xpZW50Q2xvc2VkRXJyb3JdID0gdHJ1ZVxufVxuXG5jb25zdCBrU29ja2V0RXJyb3IgPSBTeW1ib2wuZm9yKCd1bmRpY2kuZXJyb3IuVU5EX0VSUl9TT0NLRVQnKVxuY2xhc3MgU29ja2V0RXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlLCBzb2NrZXQpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIHRoaXMubmFtZSA9ICdTb2NrZXRFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdTb2NrZXQgZXJyb3InXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfU09DS0VUJ1xuICAgIHRoaXMuc29ja2V0ID0gc29ja2V0XG4gIH1cblxuICBzdGF0aWMgW1N5bWJvbC5oYXNJbnN0YW5jZV0gKGluc3RhbmNlKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlICYmIGluc3RhbmNlW2tTb2NrZXRFcnJvcl0gPT09IHRydWVcbiAgfVxuXG4gIFtrU29ja2V0RXJyb3JdID0gdHJ1ZVxufVxuXG5jb25zdCBrTm90U3VwcG9ydGVkRXJyb3IgPSBTeW1ib2wuZm9yKCd1bmRpY2kuZXJyb3IuVU5EX0VSUl9OT1RfU1VQUE9SVEVEJylcbmNsYXNzIE5vdFN1cHBvcnRlZEVycm9yIGV4dGVuZHMgVW5kaWNpRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgdGhpcy5uYW1lID0gJ05vdFN1cHBvcnRlZEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ05vdCBzdXBwb3J0ZWQgZXJyb3InXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfTk9UX1NVUFBPUlRFRCdcbiAgfVxuXG4gIHN0YXRpYyBbU3ltYm9sLmhhc0luc3RhbmNlXSAoaW5zdGFuY2UpIHtcbiAgICByZXR1cm4gaW5zdGFuY2UgJiYgaW5zdGFuY2Vba05vdFN1cHBvcnRlZEVycm9yXSA9PT0gdHJ1ZVxuICB9XG5cbiAgW2tOb3RTdXBwb3J0ZWRFcnJvcl0gPSB0cnVlXG59XG5cbmNvbnN0IGtCYWxhbmNlZFBvb2xNaXNzaW5nVXBzdHJlYW1FcnJvciA9IFN5bWJvbC5mb3IoJ3VuZGljaS5lcnJvci5VTkRfRVJSX0JQTF9NSVNTSU5HX1VQU1RSRUFNJylcbmNsYXNzIEJhbGFuY2VkUG9vbE1pc3NpbmdVcHN0cmVhbUVycm9yIGV4dGVuZHMgVW5kaWNpRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgdGhpcy5uYW1lID0gJ01pc3NpbmdVcHN0cmVhbUVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ05vIHVwc3RyZWFtIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBCYWxhbmNlZFBvb2wnXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfQlBMX01JU1NJTkdfVVBTVFJFQU0nXG4gIH1cblxuICBzdGF0aWMgW1N5bWJvbC5oYXNJbnN0YW5jZV0gKGluc3RhbmNlKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlICYmIGluc3RhbmNlW2tCYWxhbmNlZFBvb2xNaXNzaW5nVXBzdHJlYW1FcnJvcl0gPT09IHRydWVcbiAgfVxuXG4gIFtrQmFsYW5jZWRQb29sTWlzc2luZ1Vwc3RyZWFtRXJyb3JdID0gdHJ1ZVxufVxuXG5jb25zdCBrSFRUUFBhcnNlckVycm9yID0gU3ltYm9sLmZvcigndW5kaWNpLmVycm9yLlVORF9FUlJfSFRUUF9QQVJTRVInKVxuY2xhc3MgSFRUUFBhcnNlckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSwgY29kZSwgZGF0YSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgdGhpcy5uYW1lID0gJ0hUVFBQYXJzZXJFcnJvcidcbiAgICB0aGlzLmNvZGUgPSBjb2RlID8gYEhQRV8ke2NvZGV9YCA6IHVuZGVmaW5lZFxuICAgIHRoaXMuZGF0YSA9IGRhdGEgPyBkYXRhLnRvU3RyaW5nKCkgOiB1bmRlZmluZWRcbiAgfVxuXG4gIHN0YXRpYyBbU3ltYm9sLmhhc0luc3RhbmNlXSAoaW5zdGFuY2UpIHtcbiAgICByZXR1cm4gaW5zdGFuY2UgJiYgaW5zdGFuY2Vba0hUVFBQYXJzZXJFcnJvcl0gPT09IHRydWVcbiAgfVxuXG4gIFtrSFRUUFBhcnNlckVycm9yXSA9IHRydWVcbn1cblxuY29uc3Qga1Jlc3BvbnNlRXhjZWVkZWRNYXhTaXplRXJyb3IgPSBTeW1ib2wuZm9yKCd1bmRpY2kuZXJyb3IuVU5EX0VSUl9SRVNfRVhDRUVERURfTUFYX1NJWkUnKVxuY2xhc3MgUmVzcG9uc2VFeGNlZWRlZE1heFNpemVFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIHRoaXMubmFtZSA9ICdSZXNwb25zZUV4Y2VlZGVkTWF4U2l6ZUVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1Jlc3BvbnNlIGNvbnRlbnQgZXhjZWVkZWQgbWF4IHNpemUnXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfUkVTX0VYQ0VFREVEX01BWF9TSVpFJ1xuICB9XG5cbiAgc3RhdGljIFtTeW1ib2wuaGFzSW5zdGFuY2VdIChpbnN0YW5jZSkge1xuICAgIHJldHVybiBpbnN0YW5jZSAmJiBpbnN0YW5jZVtrUmVzcG9uc2VFeGNlZWRlZE1heFNpemVFcnJvcl0gPT09IHRydWVcbiAgfVxuXG4gIFtrUmVzcG9uc2VFeGNlZWRlZE1heFNpemVFcnJvcl0gPSB0cnVlXG59XG5cbmNvbnN0IGtSZXF1ZXN0UmV0cnlFcnJvciA9IFN5bWJvbC5mb3IoJ3VuZGljaS5lcnJvci5VTkRfRVJSX1JFUV9SRVRSWScpXG5jbGFzcyBSZXF1ZXN0UmV0cnlFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UsIGNvZGUsIHsgaGVhZGVycywgZGF0YSB9KSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICB0aGlzLm5hbWUgPSAnUmVxdWVzdFJldHJ5RXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnUmVxdWVzdCByZXRyeSBlcnJvcidcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9SRVFfUkVUUlknXG4gICAgdGhpcy5zdGF0dXNDb2RlID0gY29kZVxuICAgIHRoaXMuZGF0YSA9IGRhdGFcbiAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzXG4gIH1cblxuICBzdGF0aWMgW1N5bWJvbC5oYXNJbnN0YW5jZV0gKGluc3RhbmNlKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlICYmIGluc3RhbmNlW2tSZXF1ZXN0UmV0cnlFcnJvcl0gPT09IHRydWVcbiAgfVxuXG4gIFtrUmVxdWVzdFJldHJ5RXJyb3JdID0gdHJ1ZVxufVxuXG5jb25zdCBrUmVzcG9uc2VFcnJvciA9IFN5bWJvbC5mb3IoJ3VuZGljaS5lcnJvci5VTkRfRVJSX1JFU1BPTlNFJylcbmNsYXNzIFJlc3BvbnNlRXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlLCBjb2RlLCB7IGhlYWRlcnMsIGRhdGEgfSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgdGhpcy5uYW1lID0gJ1Jlc3BvbnNlRXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnUmVzcG9uc2UgZXJyb3InXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfUkVTUE9OU0UnXG4gICAgdGhpcy5zdGF0dXNDb2RlID0gY29kZVxuICAgIHRoaXMuZGF0YSA9IGRhdGFcbiAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzXG4gIH1cblxuICBzdGF0aWMgW1N5bWJvbC5oYXNJbnN0YW5jZV0gKGluc3RhbmNlKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlICYmIGluc3RhbmNlW2tSZXNwb25zZUVycm9yXSA9PT0gdHJ1ZVxuICB9XG5cbiAgW2tSZXNwb25zZUVycm9yXSA9IHRydWVcbn1cblxuY29uc3Qga1NlY3VyZVByb3h5Q29ubmVjdGlvbkVycm9yID0gU3ltYm9sLmZvcigndW5kaWNpLmVycm9yLlVORF9FUlJfUFJYX1RMUycpXG5jbGFzcyBTZWN1cmVQcm94eUNvbm5lY3Rpb25FcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKGNhdXNlLCBtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgeyBjYXVzZSwgLi4uKG9wdGlvbnMgPz8ge30pIH0pXG4gICAgdGhpcy5uYW1lID0gJ1NlY3VyZVByb3h5Q29ubmVjdGlvbkVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1NlY3VyZSBQcm94eSBDb25uZWN0aW9uIGZhaWxlZCdcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9QUlhfVExTJ1xuICAgIHRoaXMuY2F1c2UgPSBjYXVzZVxuICB9XG5cbiAgc3RhdGljIFtTeW1ib2wuaGFzSW5zdGFuY2VdIChpbnN0YW5jZSkge1xuICAgIHJldHVybiBpbnN0YW5jZSAmJiBpbnN0YW5jZVtrU2VjdXJlUHJveHlDb25uZWN0aW9uRXJyb3JdID09PSB0cnVlXG4gIH1cblxuICBba1NlY3VyZVByb3h5Q29ubmVjdGlvbkVycm9yXSA9IHRydWVcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEFib3J0RXJyb3IsXG4gIEhUVFBQYXJzZXJFcnJvcixcbiAgVW5kaWNpRXJyb3IsXG4gIEhlYWRlcnNUaW1lb3V0RXJyb3IsXG4gIEhlYWRlcnNPdmVyZmxvd0Vycm9yLFxuICBCb2R5VGltZW91dEVycm9yLFxuICBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IsXG4gIENvbm5lY3RUaW1lb3V0RXJyb3IsXG4gIFJlc3BvbnNlU3RhdHVzQ29kZUVycm9yLFxuICBJbnZhbGlkQXJndW1lbnRFcnJvcixcbiAgSW52YWxpZFJldHVyblZhbHVlRXJyb3IsXG4gIFJlcXVlc3RBYm9ydGVkRXJyb3IsXG4gIENsaWVudERlc3Ryb3llZEVycm9yLFxuICBDbGllbnRDbG9zZWRFcnJvcixcbiAgSW5mb3JtYXRpb25hbEVycm9yLFxuICBTb2NrZXRFcnJvcixcbiAgTm90U3VwcG9ydGVkRXJyb3IsXG4gIFJlc3BvbnNlQ29udGVudExlbmd0aE1pc21hdGNoRXJyb3IsXG4gIEJhbGFuY2VkUG9vbE1pc3NpbmdVcHN0cmVhbUVycm9yLFxuICBSZXNwb25zZUV4Y2VlZGVkTWF4U2l6ZUVycm9yLFxuICBSZXF1ZXN0UmV0cnlFcnJvcixcbiAgUmVzcG9uc2VFcnJvcixcbiAgU2VjdXJlUHJveHlDb25uZWN0aW9uRXJyb3Jcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD59ICovXG5jb25zdCBoZWFkZXJOYW1lTG93ZXJDYXNlZFJlY29yZCA9IHt9XG5cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0hUVFAvSGVhZGVyc1xuY29uc3Qgd2VsbGtub3duSGVhZGVyTmFtZXMgPSBbXG4gICdBY2NlcHQnLFxuICAnQWNjZXB0LUVuY29kaW5nJyxcbiAgJ0FjY2VwdC1MYW5ndWFnZScsXG4gICdBY2NlcHQtUmFuZ2VzJyxcbiAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LUNyZWRlbnRpYWxzJyxcbiAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMnLFxuICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kcycsXG4gICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nLFxuICAnQWNjZXNzLUNvbnRyb2wtRXhwb3NlLUhlYWRlcnMnLFxuICAnQWNjZXNzLUNvbnRyb2wtTWF4LUFnZScsXG4gICdBY2Nlc3MtQ29udHJvbC1SZXF1ZXN0LUhlYWRlcnMnLFxuICAnQWNjZXNzLUNvbnRyb2wtUmVxdWVzdC1NZXRob2QnLFxuICAnQWdlJyxcbiAgJ0FsbG93JyxcbiAgJ0FsdC1TdmMnLFxuICAnQWx0LVVzZWQnLFxuICAnQXV0aG9yaXphdGlvbicsXG4gICdDYWNoZS1Db250cm9sJyxcbiAgJ0NsZWFyLVNpdGUtRGF0YScsXG4gICdDb25uZWN0aW9uJyxcbiAgJ0NvbnRlbnQtRGlzcG9zaXRpb24nLFxuICAnQ29udGVudC1FbmNvZGluZycsXG4gICdDb250ZW50LUxhbmd1YWdlJyxcbiAgJ0NvbnRlbnQtTGVuZ3RoJyxcbiAgJ0NvbnRlbnQtTG9jYXRpb24nLFxuICAnQ29udGVudC1SYW5nZScsXG4gICdDb250ZW50LVNlY3VyaXR5LVBvbGljeScsXG4gICdDb250ZW50LVNlY3VyaXR5LVBvbGljeS1SZXBvcnQtT25seScsXG4gICdDb250ZW50LVR5cGUnLFxuICAnQ29va2llJyxcbiAgJ0Nyb3NzLU9yaWdpbi1FbWJlZGRlci1Qb2xpY3knLFxuICAnQ3Jvc3MtT3JpZ2luLU9wZW5lci1Qb2xpY3knLFxuICAnQ3Jvc3MtT3JpZ2luLVJlc291cmNlLVBvbGljeScsXG4gICdEYXRlJyxcbiAgJ0RldmljZS1NZW1vcnknLFxuICAnRG93bmxpbmsnLFxuICAnRUNUJyxcbiAgJ0VUYWcnLFxuICAnRXhwZWN0JyxcbiAgJ0V4cGVjdC1DVCcsXG4gICdFeHBpcmVzJyxcbiAgJ0ZvcndhcmRlZCcsXG4gICdGcm9tJyxcbiAgJ0hvc3QnLFxuICAnSWYtTWF0Y2gnLFxuICAnSWYtTW9kaWZpZWQtU2luY2UnLFxuICAnSWYtTm9uZS1NYXRjaCcsXG4gICdJZi1SYW5nZScsXG4gICdJZi1Vbm1vZGlmaWVkLVNpbmNlJyxcbiAgJ0tlZXAtQWxpdmUnLFxuICAnTGFzdC1Nb2RpZmllZCcsXG4gICdMaW5rJyxcbiAgJ0xvY2F0aW9uJyxcbiAgJ01heC1Gb3J3YXJkcycsXG4gICdPcmlnaW4nLFxuICAnUGVybWlzc2lvbnMtUG9saWN5JyxcbiAgJ1ByYWdtYScsXG4gICdQcm94eS1BdXRoZW50aWNhdGUnLFxuICAnUHJveHktQXV0aG9yaXphdGlvbicsXG4gICdSVFQnLFxuICAnUmFuZ2UnLFxuICAnUmVmZXJlcicsXG4gICdSZWZlcnJlci1Qb2xpY3knLFxuICAnUmVmcmVzaCcsXG4gICdSZXRyeS1BZnRlcicsXG4gICdTZWMtV2ViU29ja2V0LUFjY2VwdCcsXG4gICdTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnMnLFxuICAnU2VjLVdlYlNvY2tldC1LZXknLFxuICAnU2VjLVdlYlNvY2tldC1Qcm90b2NvbCcsXG4gICdTZWMtV2ViU29ja2V0LVZlcnNpb24nLFxuICAnU2VydmVyJyxcbiAgJ1NlcnZlci1UaW1pbmcnLFxuICAnU2VydmljZS1Xb3JrZXItQWxsb3dlZCcsXG4gICdTZXJ2aWNlLVdvcmtlci1OYXZpZ2F0aW9uLVByZWxvYWQnLFxuICAnU2V0LUNvb2tpZScsXG4gICdTb3VyY2VNYXAnLFxuICAnU3RyaWN0LVRyYW5zcG9ydC1TZWN1cml0eScsXG4gICdTdXBwb3J0cy1Mb2FkaW5nLU1vZGUnLFxuICAnVEUnLFxuICAnVGltaW5nLUFsbG93LU9yaWdpbicsXG4gICdUcmFpbGVyJyxcbiAgJ1RyYW5zZmVyLUVuY29kaW5nJyxcbiAgJ1VwZ3JhZGUnLFxuICAnVXBncmFkZS1JbnNlY3VyZS1SZXF1ZXN0cycsXG4gICdVc2VyLUFnZW50JyxcbiAgJ1ZhcnknLFxuICAnVmlhJyxcbiAgJ1dXVy1BdXRoZW50aWNhdGUnLFxuICAnWC1Db250ZW50LVR5cGUtT3B0aW9ucycsXG4gICdYLUROUy1QcmVmZXRjaC1Db250cm9sJyxcbiAgJ1gtRnJhbWUtT3B0aW9ucycsXG4gICdYLVBlcm1pdHRlZC1Dcm9zcy1Eb21haW4tUG9saWNpZXMnLFxuICAnWC1Qb3dlcmVkLUJ5JyxcbiAgJ1gtUmVxdWVzdGVkLVdpdGgnLFxuICAnWC1YU1MtUHJvdGVjdGlvbidcbl1cblxuZm9yIChsZXQgaSA9IDA7IGkgPCB3ZWxsa25vd25IZWFkZXJOYW1lcy5sZW5ndGg7ICsraSkge1xuICBjb25zdCBrZXkgPSB3ZWxsa25vd25IZWFkZXJOYW1lc1tpXVxuICBjb25zdCBsb3dlckNhc2VkS2V5ID0ga2V5LnRvTG93ZXJDYXNlKClcbiAgaGVhZGVyTmFtZUxvd2VyQ2FzZWRSZWNvcmRba2V5XSA9IGhlYWRlck5hbWVMb3dlckNhc2VkUmVjb3JkW2xvd2VyQ2FzZWRLZXldID1cbiAgICBsb3dlckNhc2VkS2V5XG59XG5cbi8vIE5vdGU6IG9iamVjdCBwcm90b3R5cGVzIHNob3VsZCBub3QgYmUgYWJsZSB0byBiZSByZWZlcmVuY2VkLiBlLmcuIGBPYmplY3QjaGFzT3duUHJvcGVydHlgLlxuT2JqZWN0LnNldFByb3RvdHlwZU9mKGhlYWRlck5hbWVMb3dlckNhc2VkUmVjb3JkLCBudWxsKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgd2VsbGtub3duSGVhZGVyTmFtZXMsXG4gIGhlYWRlck5hbWVMb3dlckNhc2VkUmVjb3JkXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICB3ZWxsa25vd25IZWFkZXJOYW1lcyxcbiAgaGVhZGVyTmFtZUxvd2VyQ2FzZWRSZWNvcmRcbn0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5cbmNsYXNzIFRzdE5vZGUge1xuICAvKiogQHR5cGUge2FueX0gKi9cbiAgdmFsdWUgPSBudWxsXG4gIC8qKiBAdHlwZSB7bnVsbCB8IFRzdE5vZGV9ICovXG4gIGxlZnQgPSBudWxsXG4gIC8qKiBAdHlwZSB7bnVsbCB8IFRzdE5vZGV9ICovXG4gIG1pZGRsZSA9IG51bGxcbiAgLyoqIEB0eXBlIHtudWxsIHwgVHN0Tm9kZX0gKi9cbiAgcmlnaHQgPSBudWxsXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICBjb2RlXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAgICovXG4gIGNvbnN0cnVjdG9yIChrZXksIHZhbHVlLCBpbmRleCkge1xuICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkIHx8IGluZGV4ID49IGtleS5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1VucmVhY2hhYmxlJylcbiAgICB9XG4gICAgY29uc3QgY29kZSA9IHRoaXMuY29kZSA9IGtleS5jaGFyQ29kZUF0KGluZGV4KVxuICAgIC8vIGNoZWNrIGNvZGUgaXMgYXNjaWkgc3RyaW5nXG4gICAgaWYgKGNvZGUgPiAweDdGKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdrZXkgbXVzdCBiZSBhc2NpaSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAoa2V5Lmxlbmd0aCAhPT0gKytpbmRleCkge1xuICAgICAgdGhpcy5taWRkbGUgPSBuZXcgVHN0Tm9kZShrZXksIHZhbHVlLCBpbmRleClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqL1xuICBhZGQgKGtleSwgdmFsdWUpIHtcbiAgICBjb25zdCBsZW5ndGggPSBrZXkubGVuZ3RoXG4gICAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5yZWFjaGFibGUnKVxuICAgIH1cbiAgICBsZXQgaW5kZXggPSAwXG4gICAgbGV0IG5vZGUgPSB0aGlzXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSBrZXkuY2hhckNvZGVBdChpbmRleClcbiAgICAgIC8vIGNoZWNrIGNvZGUgaXMgYXNjaWkgc3RyaW5nXG4gICAgICBpZiAoY29kZSA+IDB4N0YpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigna2V5IG11c3QgYmUgYXNjaWkgc3RyaW5nJylcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLmNvZGUgPT09IGNvZGUpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gKytpbmRleCkge1xuICAgICAgICAgIG5vZGUudmFsdWUgPSB2YWx1ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5taWRkbGUgIT09IG51bGwpIHtcbiAgICAgICAgICBub2RlID0gbm9kZS5taWRkbGVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBub2RlLm1pZGRsZSA9IG5ldyBUc3ROb2RlKGtleSwgdmFsdWUsIGluZGV4KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS5jb2RlIDwgY29kZSkge1xuICAgICAgICBpZiAobm9kZS5sZWZ0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbm9kZSA9IG5vZGUubGVmdFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5vZGUubGVmdCA9IG5ldyBUc3ROb2RlKGtleSwgdmFsdWUsIGluZGV4KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS5yaWdodCAhPT0gbnVsbCkge1xuICAgICAgICBub2RlID0gbm9kZS5yaWdodFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS5yaWdodCA9IG5ldyBUc3ROb2RlKGtleSwgdmFsdWUsIGluZGV4KVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGtleVxuICAgKiBAcmV0dXJuIHtUc3ROb2RlIHwgbnVsbH1cbiAgICovXG4gIHNlYXJjaCAoa2V5KSB7XG4gICAgY29uc3Qga2V5bGVuZ3RoID0ga2V5Lmxlbmd0aFxuICAgIGxldCBpbmRleCA9IDBcbiAgICBsZXQgbm9kZSA9IHRoaXNcbiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCAmJiBpbmRleCA8IGtleWxlbmd0aCkge1xuICAgICAgbGV0IGNvZGUgPSBrZXlbaW5kZXhdXG4gICAgICAvLyBBLVpcbiAgICAgIC8vIEZpcnN0IGNoZWNrIGlmIGl0IGlzIGJpZ2dlciB0aGFuIDB4NWEuXG4gICAgICAvLyBMb3dlcmNhc2UgbGV0dGVycyBoYXZlIGhpZ2hlciBjaGFyIGNvZGVzIHRoYW4gdXBwZXJjYXNlIG9uZXMuXG4gICAgICAvLyBBbHNvIHdlIGFzc3VtZSB0aGF0IGhlYWRlcnMgd2lsbCBtb3N0bHkgY29udGFpbiBsb3dlcmNhc2UgY2hhcmFjdGVycy5cbiAgICAgIGlmIChjb2RlIDw9IDB4NWEgJiYgY29kZSA+PSAweDQxKSB7XG4gICAgICAgIC8vIExvd2VyY2FzZSBmb3IgdXBwZXJjYXNlLlxuICAgICAgICBjb2RlIHw9IDMyXG4gICAgICB9XG4gICAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoY29kZSA9PT0gbm9kZS5jb2RlKSB7XG4gICAgICAgICAgaWYgKGtleWxlbmd0aCA9PT0gKytpbmRleCkge1xuICAgICAgICAgICAgLy8gUmV0dXJucyBOb2RlIHNpbmNlIGl0IGlzIHRoZSBsYXN0IGtleS5cbiAgICAgICAgICAgIHJldHVybiBub2RlXG4gICAgICAgICAgfVxuICAgICAgICAgIG5vZGUgPSBub2RlLm1pZGRsZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IG5vZGUuY29kZSA8IGNvZGUgPyBub2RlLmxlZnQgOiBub2RlLnJpZ2h0XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cbn1cblxuY2xhc3MgVGVybmFyeVNlYXJjaFRyZWUge1xuICAvKiogQHR5cGUge1RzdE5vZGUgfCBudWxsfSAqL1xuICBub2RlID0gbnVsbFxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKiAqL1xuICBpbnNlcnQgKGtleSwgdmFsdWUpIHtcbiAgICBpZiAodGhpcy5ub2RlID09PSBudWxsKSB7XG4gICAgICB0aGlzLm5vZGUgPSBuZXcgVHN0Tm9kZShrZXksIHZhbHVlLCAwKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5vZGUuYWRkKGtleSwgdmFsdWUpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0ga2V5XG4gICAqIEByZXR1cm4ge2FueX1cbiAgICovXG4gIGxvb2t1cCAoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZT8uc2VhcmNoKGtleSk/LnZhbHVlID8/IG51bGxcbiAgfVxufVxuXG5jb25zdCB0cmVlID0gbmV3IFRlcm5hcnlTZWFyY2hUcmVlKClcblxuZm9yIChsZXQgaSA9IDA7IGkgPCB3ZWxsa25vd25IZWFkZXJOYW1lcy5sZW5ndGg7ICsraSkge1xuICBjb25zdCBrZXkgPSBoZWFkZXJOYW1lTG93ZXJDYXNlZFJlY29yZFt3ZWxsa25vd25IZWFkZXJOYW1lc1tpXV1cbiAgdHJlZS5pbnNlcnQoa2V5LCBrZXkpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBUZXJuYXJ5U2VhcmNoVHJlZSxcbiAgdHJlZVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ25vZGU6YXNzZXJ0JylcbmNvbnN0IHsga0Rlc3Ryb3llZCwga0JvZHlVc2VkLCBrTGlzdGVuZXJzLCBrQm9keSB9ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgSW5jb21pbmdNZXNzYWdlIH0gPSByZXF1aXJlKCdub2RlOmh0dHAnKVxuY29uc3Qgc3RyZWFtID0gcmVxdWlyZSgnbm9kZTpzdHJlYW0nKVxuY29uc3QgbmV0ID0gcmVxdWlyZSgnbm9kZTpuZXQnKVxuY29uc3QgeyBCbG9iIH0gPSByZXF1aXJlKCdub2RlOmJ1ZmZlcicpXG5jb25zdCBub2RlVXRpbCA9IHJlcXVpcmUoJ25vZGU6dXRpbCcpXG5jb25zdCB7IHN0cmluZ2lmeSB9ID0gcmVxdWlyZSgnbm9kZTpxdWVyeXN0cmluZycpXG5jb25zdCB7IEV2ZW50RW1pdHRlcjogRUUgfSA9IHJlcXVpcmUoJ25vZGU6ZXZlbnRzJylcbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IHJlcXVpcmUoJy4vZXJyb3JzJylcbmNvbnN0IHsgaGVhZGVyTmFtZUxvd2VyQ2FzZWRSZWNvcmQgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IHsgdHJlZSB9ID0gcmVxdWlyZSgnLi90cmVlJylcblxuY29uc3QgW25vZGVNYWpvciwgbm9kZU1pbm9yXSA9IHByb2Nlc3MudmVyc2lvbnMubm9kZS5zcGxpdCgnLicpLm1hcCh2ID0+IE51bWJlcih2KSlcblxuY2xhc3MgQm9keUFzeW5jSXRlcmFibGUge1xuICBjb25zdHJ1Y3RvciAoYm9keSkge1xuICAgIHRoaXNba0JvZHldID0gYm9keVxuICAgIHRoaXNba0JvZHlVc2VkXSA9IGZhbHNlXG4gIH1cblxuICBhc3luYyAqIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gKCkge1xuICAgIGFzc2VydCghdGhpc1trQm9keVVzZWRdLCAnZGlzdHVyYmVkJylcbiAgICB0aGlzW2tCb2R5VXNlZF0gPSB0cnVlXG4gICAgeWllbGQgKiB0aGlzW2tCb2R5XVxuICB9XG59XG5cbmZ1bmN0aW9uIHdyYXBSZXF1ZXN0Qm9keSAoYm9keSkge1xuICBpZiAoaXNTdHJlYW0oYm9keSkpIHtcbiAgICAvLyBUT0RPIChmaXgpOiBQcm92aWRlIHNvbWUgd2F5IGZvciB0aGUgdXNlciB0byBjYWNoZSB0aGUgZmlsZSB0byBlLmcuIC90bXBcbiAgICAvLyBzbyB0aGF0IGl0IGNhbiBiZSBkaXNwYXRjaGVkIGFnYWluP1xuICAgIC8vIFRPRE8gKGZpeCk6IERvIHdlIG5lZWQgMTAwLWV4cGVjdCBzdXBwb3J0IHRvIHByb3ZpZGUgYSB3YXkgdG8gZG8gdGhpcyBwcm9wZXJseT9cbiAgICBpZiAoYm9keUxlbmd0aChib2R5KSA9PT0gMCkge1xuICAgICAgYm9keVxuICAgICAgICAub24oJ2RhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXNzZXJ0KGZhbHNlKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYm9keS5yZWFkYWJsZURpZFJlYWQgIT09ICdib29sZWFuJykge1xuICAgICAgYm9keVtrQm9keVVzZWRdID0gZmFsc2VcbiAgICAgIEVFLnByb3RvdHlwZS5vbi5jYWxsKGJvZHksICdkYXRhJywgZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzW2tCb2R5VXNlZF0gPSB0cnVlXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBib2R5XG4gIH0gZWxzZSBpZiAoYm9keSAmJiB0eXBlb2YgYm9keS5waXBlVG8gPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBUT0RPIChmaXgpOiBXZSBjYW4ndCBhY2Nlc3MgUmVhZGFibGVTdHJlYW0gaW50ZXJuYWwgc3RhdGVcbiAgICAvLyB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgaXQgaGFzIGJlZW4gZGlzdHVyYmVkLiBUaGlzIGlzIGp1c3RcbiAgICAvLyBhIHdvcmthcm91bmQuXG4gICAgcmV0dXJuIG5ldyBCb2R5QXN5bmNJdGVyYWJsZShib2R5KVxuICB9IGVsc2UgaWYgKFxuICAgIGJvZHkgJiZcbiAgICB0eXBlb2YgYm9keSAhPT0gJ3N0cmluZycgJiZcbiAgICAhQXJyYXlCdWZmZXIuaXNWaWV3KGJvZHkpICYmXG4gICAgaXNJdGVyYWJsZShib2R5KVxuICApIHtcbiAgICAvLyBUT0RPOiBTaG91bGQgd2UgYWxsb3cgcmUtdXNpbmcgaXRlcmFibGUgaWYgIXRoaXMub3B0cy5pZGVtcG90ZW50XG4gICAgLy8gb3IgdGhyb3VnaCBzb21lIG90aGVyIGZsYWc/XG4gICAgcmV0dXJuIG5ldyBCb2R5QXN5bmNJdGVyYWJsZShib2R5KVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBib2R5XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9wICgpIHt9XG5cbmZ1bmN0aW9uIGlzU3RyZWFtIChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb2JqLnBpcGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG9iai5vbiA9PT0gJ2Z1bmN0aW9uJ1xufVxuXG4vLyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vbm9kZS1mZXRjaC9mZXRjaC1ibG9iL2Jsb2IvOGFiNTg3ZDM0MDgwZGU5NDE0MGI1NGYwNzE2ODQ1MWU3ZDBiNjU1ZS9pbmRleC5qcyNMMjI5LUwyNDEgKE1JVCBMaWNlbnNlKVxuZnVuY3Rpb24gaXNCbG9iTGlrZSAob2JqZWN0KSB7XG4gIGlmIChvYmplY3QgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqZWN0ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IHNUYWcgPSBvYmplY3RbU3ltYm9sLnRvU3RyaW5nVGFnXVxuXG4gICAgcmV0dXJuIChzVGFnID09PSAnQmxvYicgfHwgc1RhZyA9PT0gJ0ZpbGUnKSAmJiAoXG4gICAgICAoJ3N0cmVhbScgaW4gb2JqZWN0ICYmIHR5cGVvZiBvYmplY3Quc3RyZWFtID09PSAnZnVuY3Rpb24nKSB8fFxuICAgICAgKCdhcnJheUJ1ZmZlcicgaW4gb2JqZWN0ICYmIHR5cGVvZiBvYmplY3QuYXJyYXlCdWZmZXIgPT09ICdmdW5jdGlvbicpXG4gICAgKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVVJMICh1cmwsIHF1ZXJ5UGFyYW1zKSB7XG4gIGlmICh1cmwuaW5jbHVkZXMoJz8nKSB8fCB1cmwuaW5jbHVkZXMoJyMnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUXVlcnkgcGFyYW1zIGNhbm5vdCBiZSBwYXNzZWQgd2hlbiB1cmwgYWxyZWFkeSBjb250YWlucyBcIj9cIiBvciBcIiNcIi4nKVxuICB9XG5cbiAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnkocXVlcnlQYXJhbXMpXG5cbiAgaWYgKHN0cmluZ2lmaWVkKSB7XG4gICAgdXJsICs9ICc/JyArIHN0cmluZ2lmaWVkXG4gIH1cblxuICByZXR1cm4gdXJsXG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRQb3J0IChwb3J0KSB7XG4gIGNvbnN0IHZhbHVlID0gcGFyc2VJbnQocG9ydCwgMTApXG4gIHJldHVybiAoXG4gICAgdmFsdWUgPT09IE51bWJlcihwb3J0KSAmJlxuICAgIHZhbHVlID49IDAgJiZcbiAgICB2YWx1ZSA8PSA2NTUzNVxuICApXG59XG5cbmZ1bmN0aW9uIGlzSHR0cE9ySHR0cHNQcmVmaXhlZCAodmFsdWUpIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAhPSBudWxsICYmXG4gICAgdmFsdWVbMF0gPT09ICdoJyAmJlxuICAgIHZhbHVlWzFdID09PSAndCcgJiZcbiAgICB2YWx1ZVsyXSA9PT0gJ3QnICYmXG4gICAgdmFsdWVbM10gPT09ICdwJyAmJlxuICAgIChcbiAgICAgIHZhbHVlWzRdID09PSAnOicgfHxcbiAgICAgIChcbiAgICAgICAgdmFsdWVbNF0gPT09ICdzJyAmJlxuICAgICAgICB2YWx1ZVs1XSA9PT0gJzonXG4gICAgICApXG4gICAgKVxuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlVVJMICh1cmwpIHtcbiAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgdXJsID0gbmV3IFVSTCh1cmwpXG5cbiAgICBpZiAoIWlzSHR0cE9ySHR0cHNQcmVmaXhlZCh1cmwub3JpZ2luIHx8IHVybC5wcm90b2NvbCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignSW52YWxpZCBVUkwgcHJvdG9jb2w6IHRoZSBVUkwgbXVzdCBzdGFydCB3aXRoIGBodHRwOmAgb3IgYGh0dHBzOmAuJylcbiAgICB9XG5cbiAgICByZXR1cm4gdXJsXG4gIH1cblxuICBpZiAoIXVybCB8fCB0eXBlb2YgdXJsICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignSW52YWxpZCBVUkw6IFRoZSBVUkwgYXJndW1lbnQgbXVzdCBiZSBhIG5vbi1udWxsIG9iamVjdC4nKVxuICB9XG5cbiAgaWYgKCEodXJsIGluc3RhbmNlb2YgVVJMKSkge1xuICAgIGlmICh1cmwucG9ydCAhPSBudWxsICYmIHVybC5wb3J0ICE9PSAnJyAmJiBpc1ZhbGlkUG9ydCh1cmwucG9ydCkgPT09IGZhbHNlKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMOiBwb3J0IG11c3QgYmUgYSB2YWxpZCBpbnRlZ2VyIG9yIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIuJylcbiAgICB9XG5cbiAgICBpZiAodXJsLnBhdGggIT0gbnVsbCAmJiB0eXBlb2YgdXJsLnBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMIHBhdGg6IHRoZSBwYXRoIG11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbC91bmRlZmluZWQuJylcbiAgICB9XG5cbiAgICBpZiAodXJsLnBhdGhuYW1lICE9IG51bGwgJiYgdHlwZW9mIHVybC5wYXRobmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignSW52YWxpZCBVUkwgcGF0aG5hbWU6IHRoZSBwYXRobmFtZSBtdXN0IGJlIGEgc3RyaW5nIG9yIG51bGwvdW5kZWZpbmVkLicpXG4gICAgfVxuXG4gICAgaWYgKHVybC5ob3N0bmFtZSAhPSBudWxsICYmIHR5cGVvZiB1cmwuaG9zdG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMIGhvc3RuYW1lOiB0aGUgaG9zdG5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciBudWxsL3VuZGVmaW5lZC4nKVxuICAgIH1cblxuICAgIGlmICh1cmwub3JpZ2luICE9IG51bGwgJiYgdHlwZW9mIHVybC5vcmlnaW4gIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMIG9yaWdpbjogdGhlIG9yaWdpbiBtdXN0IGJlIGEgc3RyaW5nIG9yIG51bGwvdW5kZWZpbmVkLicpXG4gICAgfVxuXG4gICAgaWYgKCFpc0h0dHBPckh0dHBzUHJlZml4ZWQodXJsLm9yaWdpbiB8fCB1cmwucHJvdG9jb2wpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMIHByb3RvY29sOiB0aGUgVVJMIG11c3Qgc3RhcnQgd2l0aCBgaHR0cDpgIG9yIGBodHRwczpgLicpXG4gICAgfVxuXG4gICAgY29uc3QgcG9ydCA9IHVybC5wb3J0ICE9IG51bGxcbiAgICAgID8gdXJsLnBvcnRcbiAgICAgIDogKHVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyA0NDMgOiA4MClcbiAgICBsZXQgb3JpZ2luID0gdXJsLm9yaWdpbiAhPSBudWxsXG4gICAgICA/IHVybC5vcmlnaW5cbiAgICAgIDogYCR7dXJsLnByb3RvY29sIHx8ICcnfS8vJHt1cmwuaG9zdG5hbWUgfHwgJyd9OiR7cG9ydH1gXG4gICAgbGV0IHBhdGggPSB1cmwucGF0aCAhPSBudWxsXG4gICAgICA/IHVybC5wYXRoXG4gICAgICA6IGAke3VybC5wYXRobmFtZSB8fCAnJ30ke3VybC5zZWFyY2ggfHwgJyd9YFxuXG4gICAgaWYgKG9yaWdpbltvcmlnaW4ubGVuZ3RoIC0gMV0gPT09ICcvJykge1xuICAgICAgb3JpZ2luID0gb3JpZ2luLnNsaWNlKDAsIG9yaWdpbi5sZW5ndGggLSAxKVxuICAgIH1cblxuICAgIGlmIChwYXRoICYmIHBhdGhbMF0gIT09ICcvJykge1xuICAgICAgcGF0aCA9IGAvJHtwYXRofWBcbiAgICB9XG4gICAgLy8gbmV3IFVSTChwYXRoLCBvcmlnaW4pIGlzIHVuc2FmZSB3aGVuIGBwYXRoYCBjb250YWlucyBhbiBhYnNvbHV0ZSBVUkxcbiAgICAvLyBGcm9tIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9VUkwvVVJMOlxuICAgIC8vIElmIGZpcnN0IHBhcmFtZXRlciBpcyBhIHJlbGF0aXZlIFVSTCwgc2Vjb25kIHBhcmFtIGlzIHJlcXVpcmVkLCBhbmQgd2lsbCBiZSB1c2VkIGFzIHRoZSBiYXNlIFVSTC5cbiAgICAvLyBJZiBmaXJzdCBwYXJhbWV0ZXIgaXMgYW4gYWJzb2x1dGUgVVJMLCBhIGdpdmVuIHNlY29uZCBwYXJhbSB3aWxsIGJlIGlnbm9yZWQuXG4gICAgcmV0dXJuIG5ldyBVUkwoYCR7b3JpZ2lufSR7cGF0aH1gKVxuICB9XG5cbiAgaWYgKCFpc0h0dHBPckh0dHBzUHJlZml4ZWQodXJsLm9yaWdpbiB8fCB1cmwucHJvdG9jb2wpKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdJbnZhbGlkIFVSTCBwcm90b2NvbDogdGhlIFVSTCBtdXN0IHN0YXJ0IHdpdGggYGh0dHA6YCBvciBgaHR0cHM6YC4nKVxuICB9XG5cbiAgcmV0dXJuIHVybFxufVxuXG5mdW5jdGlvbiBwYXJzZU9yaWdpbiAodXJsKSB7XG4gIHVybCA9IHBhcnNlVVJMKHVybClcblxuICBpZiAodXJsLnBhdGhuYW1lICE9PSAnLycgfHwgdXJsLnNlYXJjaCB8fCB1cmwuaGFzaCkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCB1cmwnKVxuICB9XG5cbiAgcmV0dXJuIHVybFxufVxuXG5mdW5jdGlvbiBnZXRIb3N0bmFtZSAoaG9zdCkge1xuICBpZiAoaG9zdFswXSA9PT0gJ1snKSB7XG4gICAgY29uc3QgaWR4ID0gaG9zdC5pbmRleE9mKCddJylcblxuICAgIGFzc2VydChpZHggIT09IC0xKVxuICAgIHJldHVybiBob3N0LnN1YnN0cmluZygxLCBpZHgpXG4gIH1cblxuICBjb25zdCBpZHggPSBob3N0LmluZGV4T2YoJzonKVxuICBpZiAoaWR4ID09PSAtMSkgcmV0dXJuIGhvc3RcblxuICByZXR1cm4gaG9zdC5zdWJzdHJpbmcoMCwgaWR4KVxufVxuXG4vLyBJUCBhZGRyZXNzZXMgYXJlIG5vdCB2YWxpZCBzZXJ2ZXIgbmFtZXMgcGVyIFJGQzYwNjZcbi8vID4gQ3VycmVudGx5LCB0aGUgb25seSBzZXJ2ZXIgbmFtZXMgc3VwcG9ydGVkIGFyZSBETlMgaG9zdG5hbWVzXG5mdW5jdGlvbiBnZXRTZXJ2ZXJOYW1lIChob3N0KSB7XG4gIGlmICghaG9zdCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBhc3NlcnQodHlwZW9mIGhvc3QgPT09ICdzdHJpbmcnKVxuXG4gIGNvbnN0IHNlcnZlcm5hbWUgPSBnZXRIb3N0bmFtZShob3N0KVxuICBpZiAobmV0LmlzSVAoc2VydmVybmFtZSkpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIHJldHVybiBzZXJ2ZXJuYW1lXG59XG5cbmZ1bmN0aW9uIGRlZXBDbG9uZSAob2JqKSB7XG4gIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpXG59XG5cbmZ1bmN0aW9uIGlzQXN5bmNJdGVyYWJsZSAob2JqKSB7XG4gIHJldHVybiAhIShvYmogIT0gbnVsbCAmJiB0eXBlb2Ygb2JqW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJylcbn1cblxuZnVuY3Rpb24gaXNJdGVyYWJsZSAob2JqKSB7XG4gIHJldHVybiAhIShvYmogIT0gbnVsbCAmJiAodHlwZW9mIG9ialtTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBvYmpbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nKSlcbn1cblxuZnVuY3Rpb24gYm9keUxlbmd0aCAoYm9keSkge1xuICBpZiAoYm9keSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIDBcbiAgfSBlbHNlIGlmIChpc1N0cmVhbShib2R5KSkge1xuICAgIGNvbnN0IHN0YXRlID0gYm9keS5fcmVhZGFibGVTdGF0ZVxuICAgIHJldHVybiBzdGF0ZSAmJiBzdGF0ZS5vYmplY3RNb2RlID09PSBmYWxzZSAmJiBzdGF0ZS5lbmRlZCA9PT0gdHJ1ZSAmJiBOdW1iZXIuaXNGaW5pdGUoc3RhdGUubGVuZ3RoKVxuICAgICAgPyBzdGF0ZS5sZW5ndGhcbiAgICAgIDogbnVsbFxuICB9IGVsc2UgaWYgKGlzQmxvYkxpa2UoYm9keSkpIHtcbiAgICByZXR1cm4gYm9keS5zaXplICE9IG51bGwgPyBib2R5LnNpemUgOiBudWxsXG4gIH0gZWxzZSBpZiAoaXNCdWZmZXIoYm9keSkpIHtcbiAgICByZXR1cm4gYm9keS5ieXRlTGVuZ3RoXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiBpc0Rlc3Ryb3llZCAoYm9keSkge1xuICByZXR1cm4gYm9keSAmJiAhIShib2R5LmRlc3Ryb3llZCB8fCBib2R5W2tEZXN0cm95ZWRdIHx8IChzdHJlYW0uaXNEZXN0cm95ZWQ/Lihib2R5KSkpXG59XG5cbmZ1bmN0aW9uIGRlc3Ryb3kgKHN0cmVhbSwgZXJyKSB7XG4gIGlmIChzdHJlYW0gPT0gbnVsbCB8fCAhaXNTdHJlYW0oc3RyZWFtKSB8fCBpc0Rlc3Ryb3llZChzdHJlYW0pKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAodHlwZW9mIHN0cmVhbS5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihzdHJlYW0pLmNvbnN0cnVjdG9yID09PSBJbmNvbWluZ01lc3NhZ2UpIHtcbiAgICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL3B1bGwvMzg1MDUvZmlsZXNcbiAgICAgIHN0cmVhbS5zb2NrZXQgPSBudWxsXG4gICAgfVxuXG4gICAgc3RyZWFtLmRlc3Ryb3koZXJyKVxuICB9IGVsc2UgaWYgKGVycikge1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVycilcbiAgICB9KVxuICB9XG5cbiAgaWYgKHN0cmVhbS5kZXN0cm95ZWQgIT09IHRydWUpIHtcbiAgICBzdHJlYW1ba0Rlc3Ryb3llZF0gPSB0cnVlXG4gIH1cbn1cblxuY29uc3QgS0VFUEFMSVZFX1RJTUVPVVRfRVhQUiA9IC90aW1lb3V0PShcXGQrKS9cbmZ1bmN0aW9uIHBhcnNlS2VlcEFsaXZlVGltZW91dCAodmFsKSB7XG4gIGNvbnN0IG0gPSB2YWwudG9TdHJpbmcoKS5tYXRjaChLRUVQQUxJVkVfVElNRU9VVF9FWFBSKVxuICByZXR1cm4gbSA/IHBhcnNlSW50KG1bMV0sIDEwKSAqIDEwMDAgOiBudWxsXG59XG5cbi8qKlxuICogUmV0cmlldmVzIGEgaGVhZGVyIG5hbWUgYW5kIHJldHVybnMgaXRzIGxvd2VyY2FzZSB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgQnVmZmVyfSB2YWx1ZSBIZWFkZXIgbmFtZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gaGVhZGVyTmFtZVRvU3RyaW5nICh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJ1xuICAgID8gaGVhZGVyTmFtZUxvd2VyQ2FzZWRSZWNvcmRbdmFsdWVdID8/IHZhbHVlLnRvTG93ZXJDYXNlKClcbiAgICA6IHRyZWUubG9va3VwKHZhbHVlKSA/PyB2YWx1ZS50b1N0cmluZygnbGF0aW4xJykudG9Mb3dlckNhc2UoKVxufVxuXG4vKipcbiAqIFJlY2VpdmUgdGhlIGJ1ZmZlciBhcyBhIHN0cmluZyBhbmQgcmV0dXJuIGl0cyBsb3dlcmNhc2UgdmFsdWUuXG4gKiBAcGFyYW0ge0J1ZmZlcn0gdmFsdWUgSGVhZGVyIG5hbWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGJ1ZmZlclRvTG93ZXJDYXNlZEhlYWRlck5hbWUgKHZhbHVlKSB7XG4gIHJldHVybiB0cmVlLmxvb2t1cCh2YWx1ZSkgPz8gdmFsdWUudG9TdHJpbmcoJ2xhdGluMScpLnRvTG93ZXJDYXNlKClcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdPiB8IChCdWZmZXIgfCBzdHJpbmcgfCAoQnVmZmVyIHwgc3RyaW5nKVtdKVtdfSBoZWFkZXJzXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdPn0gW29ial1cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT59XG4gKi9cbmZ1bmN0aW9uIHBhcnNlSGVhZGVycyAoaGVhZGVycywgb2JqKSB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgb2JqID0ge31cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgY29uc3Qga2V5ID0gaGVhZGVyTmFtZVRvU3RyaW5nKGhlYWRlcnNbaV0pXG4gICAgbGV0IHZhbCA9IG9ialtrZXldXG5cbiAgICBpZiAodmFsKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFsID0gW3ZhbF1cbiAgICAgICAgb2JqW2tleV0gPSB2YWxcbiAgICAgIH1cbiAgICAgIHZhbC5wdXNoKGhlYWRlcnNbaSArIDFdLnRvU3RyaW5nKCd1dGY4JykpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGhlYWRlcnNWYWx1ZSA9IGhlYWRlcnNbaSArIDFdXG4gICAgICBpZiAodHlwZW9mIGhlYWRlcnNWYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgb2JqW2tleV0gPSBoZWFkZXJzVmFsdWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9ialtrZXldID0gQXJyYXkuaXNBcnJheShoZWFkZXJzVmFsdWUpID8gaGVhZGVyc1ZhbHVlLm1hcCh4ID0+IHgudG9TdHJpbmcoJ3V0ZjgnKSkgOiBoZWFkZXJzVmFsdWUudG9TdHJpbmcoJ3V0ZjgnKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvcHVsbC80NjUyOFxuICBpZiAoJ2NvbnRlbnQtbGVuZ3RoJyBpbiBvYmogJiYgJ2NvbnRlbnQtZGlzcG9zaXRpb24nIGluIG9iaikge1xuICAgIG9ialsnY29udGVudC1kaXNwb3NpdGlvbiddID0gQnVmZmVyLmZyb20ob2JqWydjb250ZW50LWRpc3Bvc2l0aW9uJ10pLnRvU3RyaW5nKCdsYXRpbjEnKVxuICB9XG5cbiAgcmV0dXJuIG9ialxufVxuXG5mdW5jdGlvbiBwYXJzZVJhd0hlYWRlcnMgKGhlYWRlcnMpIHtcbiAgY29uc3QgbGVuID0gaGVhZGVycy5sZW5ndGhcbiAgY29uc3QgcmV0ID0gbmV3IEFycmF5KGxlbilcblxuICBsZXQgaGFzQ29udGVudExlbmd0aCA9IGZhbHNlXG4gIGxldCBjb250ZW50RGlzcG9zaXRpb25JZHggPSAtMVxuICBsZXQga2V5XG4gIGxldCB2YWxcbiAgbGV0IGtMZW4gPSAwXG5cbiAgZm9yIChsZXQgbiA9IDA7IG4gPCBoZWFkZXJzLmxlbmd0aDsgbiArPSAyKSB7XG4gICAga2V5ID0gaGVhZGVyc1tuXVxuICAgIHZhbCA9IGhlYWRlcnNbbiArIDFdXG5cbiAgICB0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJyAmJiAoa2V5ID0ga2V5LnRvU3RyaW5nKCkpXG4gICAgdHlwZW9mIHZhbCAhPT0gJ3N0cmluZycgJiYgKHZhbCA9IHZhbC50b1N0cmluZygndXRmOCcpKVxuXG4gICAga0xlbiA9IGtleS5sZW5ndGhcbiAgICBpZiAoa0xlbiA9PT0gMTQgJiYga2V5WzddID09PSAnLScgJiYgKGtleSA9PT0gJ2NvbnRlbnQtbGVuZ3RoJyB8fCBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtbGVuZ3RoJykpIHtcbiAgICAgIGhhc0NvbnRlbnRMZW5ndGggPSB0cnVlXG4gICAgfSBlbHNlIGlmIChrTGVuID09PSAxOSAmJiBrZXlbN10gPT09ICctJyAmJiAoa2V5ID09PSAnY29udGVudC1kaXNwb3NpdGlvbicgfHwga2V5LnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LWRpc3Bvc2l0aW9uJykpIHtcbiAgICAgIGNvbnRlbnREaXNwb3NpdGlvbklkeCA9IG4gKyAxXG4gICAgfVxuICAgIHJldFtuXSA9IGtleVxuICAgIHJldFtuICsgMV0gPSB2YWxcbiAgfVxuXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvcHVsbC80NjUyOFxuICBpZiAoaGFzQ29udGVudExlbmd0aCAmJiBjb250ZW50RGlzcG9zaXRpb25JZHggIT09IC0xKSB7XG4gICAgcmV0W2NvbnRlbnREaXNwb3NpdGlvbklkeF0gPSBCdWZmZXIuZnJvbShyZXRbY29udGVudERpc3Bvc2l0aW9uSWR4XSkudG9TdHJpbmcoJ2xhdGluMScpXG4gIH1cblxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGlzQnVmZmVyIChidWZmZXIpIHtcbiAgLy8gU2VlLCBodHRwczovL2dpdGh1Yi5jb20vbWNvbGxpbmEvdW5kaWNpL3B1bGwvMzE5XG4gIHJldHVybiBidWZmZXIgaW5zdGFuY2VvZiBVaW50OEFycmF5IHx8IEJ1ZmZlci5pc0J1ZmZlcihidWZmZXIpXG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlSGFuZGxlciAoaGFuZGxlciwgbWV0aG9kLCB1cGdyYWRlKSB7XG4gIGlmICghaGFuZGxlciB8fCB0eXBlb2YgaGFuZGxlciAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2hhbmRsZXIgbXVzdCBiZSBhbiBvYmplY3QnKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBoYW5kbGVyLm9uQ29ubmVjdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvbkNvbm5lY3QgbWV0aG9kJylcbiAgfVxuXG4gIGlmICh0eXBlb2YgaGFuZGxlci5vbkVycm9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9uRXJyb3IgbWV0aG9kJylcbiAgfVxuXG4gIGlmICh0eXBlb2YgaGFuZGxlci5vbkJvZHlTZW50ICE9PSAnZnVuY3Rpb24nICYmIGhhbmRsZXIub25Cb2R5U2VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9uQm9keVNlbnQgbWV0aG9kJylcbiAgfVxuXG4gIGlmICh1cGdyYWRlIHx8IG1ldGhvZCA9PT0gJ0NPTk5FQ1QnKSB7XG4gICAgaWYgKHR5cGVvZiBoYW5kbGVyLm9uVXBncmFkZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9uVXBncmFkZSBtZXRob2QnKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIGhhbmRsZXIub25IZWFkZXJzICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgb25IZWFkZXJzIG1ldGhvZCcpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBoYW5kbGVyLm9uRGF0YSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9uRGF0YSBtZXRob2QnKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaGFuZGxlci5vbkNvbXBsZXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgb25Db21wbGV0ZSBtZXRob2QnKVxuICAgIH1cbiAgfVxufVxuXG4vLyBBIGJvZHkgaXMgZGlzdHVyYmVkIGlmIGl0IGhhcyBiZWVuIHJlYWQgZnJvbSBhbmQgaXQgY2Fubm90XG4vLyBiZSByZS11c2VkIHdpdGhvdXQgbG9zaW5nIHN0YXRlIG9yIGRhdGEuXG5mdW5jdGlvbiBpc0Rpc3R1cmJlZCAoYm9keSkge1xuICAvLyBUT0RPIChmaXgpOiBXaHkgaXMgYm9keVtrQm9keVVzZWRdIG5lZWRlZD9cbiAgcmV0dXJuICEhKGJvZHkgJiYgKHN0cmVhbS5pc0Rpc3R1cmJlZChib2R5KSB8fCBib2R5W2tCb2R5VXNlZF0pKVxufVxuXG5mdW5jdGlvbiBpc0Vycm9yZWQgKGJvZHkpIHtcbiAgcmV0dXJuICEhKGJvZHkgJiYgc3RyZWFtLmlzRXJyb3JlZChib2R5KSlcbn1cblxuZnVuY3Rpb24gaXNSZWFkYWJsZSAoYm9keSkge1xuICByZXR1cm4gISEoYm9keSAmJiBzdHJlYW0uaXNSZWFkYWJsZShib2R5KSlcbn1cblxuZnVuY3Rpb24gZ2V0U29ja2V0SW5mbyAoc29ja2V0KSB7XG4gIHJldHVybiB7XG4gICAgbG9jYWxBZGRyZXNzOiBzb2NrZXQubG9jYWxBZGRyZXNzLFxuICAgIGxvY2FsUG9ydDogc29ja2V0LmxvY2FsUG9ydCxcbiAgICByZW1vdGVBZGRyZXNzOiBzb2NrZXQucmVtb3RlQWRkcmVzcyxcbiAgICByZW1vdGVQb3J0OiBzb2NrZXQucmVtb3RlUG9ydCxcbiAgICByZW1vdGVGYW1pbHk6IHNvY2tldC5yZW1vdGVGYW1pbHksXG4gICAgdGltZW91dDogc29ja2V0LnRpbWVvdXQsXG4gICAgYnl0ZXNXcml0dGVuOiBzb2NrZXQuYnl0ZXNXcml0dGVuLFxuICAgIGJ5dGVzUmVhZDogc29ja2V0LmJ5dGVzUmVhZFxuICB9XG59XG5cbi8qKiBAdHlwZSB7Z2xvYmFsVGhpc1snUmVhZGFibGVTdHJlYW0nXX0gKi9cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRnJvbSAoaXRlcmFibGUpIHtcbiAgLy8gV2UgY2Fubm90IHVzZSBSZWFkYWJsZVN0cmVhbS5mcm9tIGhlcmUgYmVjYXVzZSBpdCBkb2VzIG5vdCByZXR1cm4gYSBieXRlIHN0cmVhbS5cblxuICBsZXQgaXRlcmF0b3JcbiAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbShcbiAgICB7XG4gICAgICBhc3luYyBzdGFydCAoKSB7XG4gICAgICAgIGl0ZXJhdG9yID0gaXRlcmFibGVbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKClcbiAgICAgIH0sXG4gICAgICBhc3luYyBwdWxsIChjb250cm9sbGVyKSB7XG4gICAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IGl0ZXJhdG9yLm5leHQoKVxuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKVxuICAgICAgICAgICAgY29udHJvbGxlci5ieW9iUmVxdWVzdD8ucmVzcG9uZCgwKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgYnVmID0gQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSA/IHZhbHVlIDogQnVmZmVyLmZyb20odmFsdWUpXG4gICAgICAgICAgaWYgKGJ1Zi5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUobmV3IFVpbnQ4QXJyYXkoYnVmKSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuZGVzaXJlZFNpemUgPiAwXG4gICAgICB9LFxuICAgICAgYXN5bmMgY2FuY2VsIChyZWFzb24pIHtcbiAgICAgICAgYXdhaXQgaXRlcmF0b3IucmV0dXJuKClcbiAgICAgIH0sXG4gICAgICB0eXBlOiAnYnl0ZXMnXG4gICAgfVxuICApXG59XG5cbi8vIFRoZSBjaHVuayBzaG91bGQgYmUgYSBGb3JtRGF0YSBpbnN0YW5jZSBhbmQgY29udGFpbnNcbi8vIGFsbCB0aGUgcmVxdWlyZWQgbWV0aG9kcy5cbmZ1bmN0aW9uIGlzRm9ybURhdGFMaWtlIChvYmplY3QpIHtcbiAgcmV0dXJuIChcbiAgICBvYmplY3QgJiZcbiAgICB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJlxuICAgIHR5cGVvZiBvYmplY3QuYXBwZW5kID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIG9iamVjdC5kZWxldGUgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2Ygb2JqZWN0LmdldCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBvYmplY3QuZ2V0QWxsID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIG9iamVjdC5oYXMgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2Ygb2JqZWN0LnNldCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIG9iamVjdFtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnRm9ybURhdGEnXG4gIClcbn1cblxuZnVuY3Rpb24gYWRkQWJvcnRMaXN0ZW5lciAoc2lnbmFsLCBsaXN0ZW5lcikge1xuICBpZiAoJ2FkZEV2ZW50TGlzdGVuZXInIGluIHNpZ25hbCkge1xuICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGxpc3RlbmVyLCB7IG9uY2U6IHRydWUgfSlcbiAgICByZXR1cm4gKCkgPT4gc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgbGlzdGVuZXIpXG4gIH1cbiAgc2lnbmFsLmFkZExpc3RlbmVyKCdhYm9ydCcsIGxpc3RlbmVyKVxuICByZXR1cm4gKCkgPT4gc2lnbmFsLnJlbW92ZUxpc3RlbmVyKCdhYm9ydCcsIGxpc3RlbmVyKVxufVxuXG5jb25zdCBoYXNUb1dlbGxGb3JtZWQgPSB0eXBlb2YgU3RyaW5nLnByb3RvdHlwZS50b1dlbGxGb3JtZWQgPT09ICdmdW5jdGlvbidcbmNvbnN0IGhhc0lzV2VsbEZvcm1lZCA9IHR5cGVvZiBTdHJpbmcucHJvdG90eXBlLmlzV2VsbEZvcm1lZCA9PT0gJ2Z1bmN0aW9uJ1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWxcbiAqL1xuZnVuY3Rpb24gdG9VU1ZTdHJpbmcgKHZhbCkge1xuICByZXR1cm4gaGFzVG9XZWxsRm9ybWVkID8gYCR7dmFsfWAudG9XZWxsRm9ybWVkKCkgOiBub2RlVXRpbC50b1VTVlN0cmluZyh2YWwpXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbFxuICovXG4vLyBUT0RPOiBtb3ZlIHRoaXMgdG8gd2ViaWRsXG5mdW5jdGlvbiBpc1VTVlN0cmluZyAodmFsKSB7XG4gIHJldHVybiBoYXNJc1dlbGxGb3JtZWQgPyBgJHt2YWx9YC5pc1dlbGxGb3JtZWQoKSA6IHRvVVNWU3RyaW5nKHZhbCkgPT09IGAke3ZhbH1gXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMi42XG4gKiBAcGFyYW0ge251bWJlcn0gY1xuICovXG5mdW5jdGlvbiBpc1Rva2VuQ2hhckNvZGUgKGMpIHtcbiAgc3dpdGNoIChjKSB7XG4gICAgY2FzZSAweDIyOlxuICAgIGNhc2UgMHgyODpcbiAgICBjYXNlIDB4Mjk6XG4gICAgY2FzZSAweDJjOlxuICAgIGNhc2UgMHgyZjpcbiAgICBjYXNlIDB4M2E6XG4gICAgY2FzZSAweDNiOlxuICAgIGNhc2UgMHgzYzpcbiAgICBjYXNlIDB4M2Q6XG4gICAgY2FzZSAweDNlOlxuICAgIGNhc2UgMHgzZjpcbiAgICBjYXNlIDB4NDA6XG4gICAgY2FzZSAweDViOlxuICAgIGNhc2UgMHg1YzpcbiAgICBjYXNlIDB4NWQ6XG4gICAgY2FzZSAweDdiOlxuICAgIGNhc2UgMHg3ZDpcbiAgICAgIC8vIERRVU9URSBhbmQgXCIoKSwvOjs8PT4/QFtcXF17fVwiXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gVkNIQVIgJXgyMS03RVxuICAgICAgcmV0dXJuIGMgPj0gMHgyMSAmJiBjIDw9IDB4N2VcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGFyYWN0ZXJzXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRIVFRQVG9rZW4gKGNoYXJhY3RlcnMpIHtcbiAgaWYgKGNoYXJhY3RlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFyYWN0ZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCFpc1Rva2VuQ2hhckNvZGUoY2hhcmFjdGVycy5jaGFyQ29kZUF0KGkpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbi8vIGhlYWRlckNoYXJSZWdleCBoYXZlIGJlZW4gbGlmdGVkIGZyb21cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iL21haW4vbGliL19odHRwX2NvbW1vbi5qc1xuXG4vKipcbiAqIE1hdGNoZXMgaWYgdmFsIGNvbnRhaW5zIGFuIGludmFsaWQgZmllbGQtdmNoYXJcbiAqICBmaWVsZC12YWx1ZSAgICA9ICooIGZpZWxkLWNvbnRlbnQgLyBvYnMtZm9sZCApXG4gKiAgZmllbGQtY29udGVudCAgPSBmaWVsZC12Y2hhciBbIDEqKCBTUCAvIEhUQUIgKSBmaWVsZC12Y2hhciBdXG4gKiAgZmllbGQtdmNoYXIgICAgPSBWQ0hBUiAvIG9icy10ZXh0XG4gKi9cbmNvbnN0IGhlYWRlckNoYXJSZWdleCA9IC9bXlxcdFxceDIwLVxceDdlXFx4ODAtXFx4ZmZdL1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGFyYWN0ZXJzXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRIZWFkZXJWYWx1ZSAoY2hhcmFjdGVycykge1xuICByZXR1cm4gIWhlYWRlckNoYXJSZWdleC50ZXN0KGNoYXJhY3RlcnMpXG59XG5cbi8vIFBhcnNlZCBhY2NvcmRpbmdseSB0byBSRkMgOTExMFxuLy8gaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzkxMTAjZmllbGQuY29udGVudC1yYW5nZVxuZnVuY3Rpb24gcGFyc2VSYW5nZUhlYWRlciAocmFuZ2UpIHtcbiAgaWYgKHJhbmdlID09IG51bGwgfHwgcmFuZ2UgPT09ICcnKSByZXR1cm4geyBzdGFydDogMCwgZW5kOiBudWxsLCBzaXplOiBudWxsIH1cblxuICBjb25zdCBtID0gcmFuZ2UgPyByYW5nZS5tYXRjaCgvXmJ5dGVzIChcXGQrKS0oXFxkKylcXC8oXFxkKyk/JC8pIDogbnVsbFxuICByZXR1cm4gbVxuICAgID8ge1xuICAgICAgICBzdGFydDogcGFyc2VJbnQobVsxXSksXG4gICAgICAgIGVuZDogbVsyXSA/IHBhcnNlSW50KG1bMl0pIDogbnVsbCxcbiAgICAgICAgc2l6ZTogbVszXSA/IHBhcnNlSW50KG1bM10pIDogbnVsbFxuICAgICAgfVxuICAgIDogbnVsbFxufVxuXG5mdW5jdGlvbiBhZGRMaXN0ZW5lciAob2JqLCBuYW1lLCBsaXN0ZW5lcikge1xuICBjb25zdCBsaXN0ZW5lcnMgPSAob2JqW2tMaXN0ZW5lcnNdID8/PSBbXSlcbiAgbGlzdGVuZXJzLnB1c2goW25hbWUsIGxpc3RlbmVyXSlcbiAgb2JqLm9uKG5hbWUsIGxpc3RlbmVyKVxuICByZXR1cm4gb2JqXG59XG5cbmZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyAob2JqKSB7XG4gIGZvciAoY29uc3QgW25hbWUsIGxpc3RlbmVyXSBvZiBvYmpba0xpc3RlbmVyc10gPz8gW10pIHtcbiAgICBvYmoucmVtb3ZlTGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpXG4gIH1cbiAgb2JqW2tMaXN0ZW5lcnNdID0gbnVsbFxufVxuXG5mdW5jdGlvbiBlcnJvclJlcXVlc3QgKGNsaWVudCwgcmVxdWVzdCwgZXJyKSB7XG4gIHRyeSB7XG4gICAgcmVxdWVzdC5vbkVycm9yKGVycilcbiAgICBhc3NlcnQocmVxdWVzdC5hYm9ydGVkKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjbGllbnQuZW1pdCgnZXJyb3InLCBlcnIpXG4gIH1cbn1cblxuY29uc3Qga0VudW1lcmFibGVQcm9wZXJ0eSA9IE9iamVjdC5jcmVhdGUobnVsbClcbmtFbnVtZXJhYmxlUHJvcGVydHkuZW51bWVyYWJsZSA9IHRydWVcblxuY29uc3Qgbm9ybWFsaXplZE1ldGhvZFJlY29yZHNCYXNlID0ge1xuICBkZWxldGU6ICdERUxFVEUnLFxuICBERUxFVEU6ICdERUxFVEUnLFxuICBnZXQ6ICdHRVQnLFxuICBHRVQ6ICdHRVQnLFxuICBoZWFkOiAnSEVBRCcsXG4gIEhFQUQ6ICdIRUFEJyxcbiAgb3B0aW9uczogJ09QVElPTlMnLFxuICBPUFRJT05TOiAnT1BUSU9OUycsXG4gIHBvc3Q6ICdQT1NUJyxcbiAgUE9TVDogJ1BPU1QnLFxuICBwdXQ6ICdQVVQnLFxuICBQVVQ6ICdQVVQnXG59XG5cbmNvbnN0IG5vcm1hbGl6ZWRNZXRob2RSZWNvcmRzID0ge1xuICAuLi5ub3JtYWxpemVkTWV0aG9kUmVjb3Jkc0Jhc2UsXG4gIHBhdGNoOiAncGF0Y2gnLFxuICBQQVRDSDogJ1BBVENIJ1xufVxuXG4vLyBOb3RlOiBvYmplY3QgcHJvdG90eXBlcyBzaG91bGQgbm90IGJlIGFibGUgdG8gYmUgcmVmZXJlbmNlZC4gZS5nLiBgT2JqZWN0I2hhc093blByb3BlcnR5YC5cbk9iamVjdC5zZXRQcm90b3R5cGVPZihub3JtYWxpemVkTWV0aG9kUmVjb3Jkc0Jhc2UsIG51bGwpXG5PYmplY3Quc2V0UHJvdG90eXBlT2Yobm9ybWFsaXplZE1ldGhvZFJlY29yZHMsIG51bGwpXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBub3AsXG4gIGlzRGlzdHVyYmVkLFxuICBpc0Vycm9yZWQsXG4gIGlzUmVhZGFibGUsXG4gIHRvVVNWU3RyaW5nLFxuICBpc1VTVlN0cmluZyxcbiAgaXNCbG9iTGlrZSxcbiAgcGFyc2VPcmlnaW4sXG4gIHBhcnNlVVJMLFxuICBnZXRTZXJ2ZXJOYW1lLFxuICBpc1N0cmVhbSxcbiAgaXNJdGVyYWJsZSxcbiAgaXNBc3luY0l0ZXJhYmxlLFxuICBpc0Rlc3Ryb3llZCxcbiAgaGVhZGVyTmFtZVRvU3RyaW5nLFxuICBidWZmZXJUb0xvd2VyQ2FzZWRIZWFkZXJOYW1lLFxuICBhZGRMaXN0ZW5lcixcbiAgcmVtb3ZlQWxsTGlzdGVuZXJzLFxuICBlcnJvclJlcXVlc3QsXG4gIHBhcnNlUmF3SGVhZGVycyxcbiAgcGFyc2VIZWFkZXJzLFxuICBwYXJzZUtlZXBBbGl2ZVRpbWVvdXQsXG4gIGRlc3Ryb3ksXG4gIGJvZHlMZW5ndGgsXG4gIGRlZXBDbG9uZSxcbiAgUmVhZGFibGVTdHJlYW1Gcm9tLFxuICBpc0J1ZmZlcixcbiAgdmFsaWRhdGVIYW5kbGVyLFxuICBnZXRTb2NrZXRJbmZvLFxuICBpc0Zvcm1EYXRhTGlrZSxcbiAgYnVpbGRVUkwsXG4gIGFkZEFib3J0TGlzdGVuZXIsXG4gIGlzVmFsaWRIVFRQVG9rZW4sXG4gIGlzVmFsaWRIZWFkZXJWYWx1ZSxcbiAgaXNUb2tlbkNoYXJDb2RlLFxuICBwYXJzZVJhbmdlSGVhZGVyLFxuICBub3JtYWxpemVkTWV0aG9kUmVjb3Jkc0Jhc2UsXG4gIG5vcm1hbGl6ZWRNZXRob2RSZWNvcmRzLFxuICBpc1ZhbGlkUG9ydCxcbiAgaXNIdHRwT3JIdHRwc1ByZWZpeGVkLFxuICBub2RlTWFqb3IsXG4gIG5vZGVNaW5vcixcbiAgc2FmZUhUVFBNZXRob2RzOiBbJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnLCAnVFJBQ0UnXSxcbiAgd3JhcFJlcXVlc3RCb2R5XG59XG4iLCIndXNlIHN0cmljdCdcbmNvbnN0IGRpYWdub3N0aWNzQ2hhbm5lbCA9IHJlcXVpcmUoJ25vZGU6ZGlhZ25vc3RpY3NfY2hhbm5lbCcpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnbm9kZTp1dGlsJylcblxuY29uc3QgdW5kaWNpRGVidWdMb2cgPSB1dGlsLmRlYnVnbG9nKCd1bmRpY2knKVxuY29uc3QgZmV0Y2hEZWJ1Z2xvZyA9IHV0aWwuZGVidWdsb2coJ2ZldGNoJylcbmNvbnN0IHdlYnNvY2tldERlYnVnbG9nID0gdXRpbC5kZWJ1Z2xvZygnd2Vic29ja2V0JylcbmxldCBpc0NsaWVudFNldCA9IGZhbHNlXG5jb25zdCBjaGFubmVscyA9IHtcbiAgLy8gQ2xpZW50XG4gIGJlZm9yZUNvbm5lY3Q6IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6Y2xpZW50OmJlZm9yZUNvbm5lY3QnKSxcbiAgY29ubmVjdGVkOiBkaWFnbm9zdGljc0NoYW5uZWwuY2hhbm5lbCgndW5kaWNpOmNsaWVudDpjb25uZWN0ZWQnKSxcbiAgY29ubmVjdEVycm9yOiBkaWFnbm9zdGljc0NoYW5uZWwuY2hhbm5lbCgndW5kaWNpOmNsaWVudDpjb25uZWN0RXJyb3InKSxcbiAgc2VuZEhlYWRlcnM6IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6Y2xpZW50OnNlbmRIZWFkZXJzJyksXG4gIC8vIFJlcXVlc3RcbiAgY3JlYXRlOiBkaWFnbm9zdGljc0NoYW5uZWwuY2hhbm5lbCgndW5kaWNpOnJlcXVlc3Q6Y3JlYXRlJyksXG4gIGJvZHlTZW50OiBkaWFnbm9zdGljc0NoYW5uZWwuY2hhbm5lbCgndW5kaWNpOnJlcXVlc3Q6Ym9keVNlbnQnKSxcbiAgaGVhZGVyczogZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTpyZXF1ZXN0OmhlYWRlcnMnKSxcbiAgdHJhaWxlcnM6IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6cmVxdWVzdDp0cmFpbGVycycpLFxuICBlcnJvcjogZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTpyZXF1ZXN0OmVycm9yJyksXG4gIC8vIFdlYlNvY2tldFxuICBvcGVuOiBkaWFnbm9zdGljc0NoYW5uZWwuY2hhbm5lbCgndW5kaWNpOndlYnNvY2tldDpvcGVuJyksXG4gIGNsb3NlOiBkaWFnbm9zdGljc0NoYW5uZWwuY2hhbm5lbCgndW5kaWNpOndlYnNvY2tldDpjbG9zZScpLFxuICBzb2NrZXRFcnJvcjogZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTp3ZWJzb2NrZXQ6c29ja2V0X2Vycm9yJyksXG4gIHBpbmc6IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6d2Vic29ja2V0OnBpbmcnKSxcbiAgcG9uZzogZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTp3ZWJzb2NrZXQ6cG9uZycpXG59XG5cbmlmICh1bmRpY2lEZWJ1Z0xvZy5lbmFibGVkIHx8IGZldGNoRGVidWdsb2cuZW5hYmxlZCkge1xuICBjb25zdCBkZWJ1Z2xvZyA9IGZldGNoRGVidWdsb2cuZW5hYmxlZCA/IGZldGNoRGVidWdsb2cgOiB1bmRpY2lEZWJ1Z0xvZ1xuXG4gIC8vIFRyYWNrIGFsbCBDbGllbnQgZXZlbnRzXG4gIGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6Y2xpZW50OmJlZm9yZUNvbm5lY3QnKS5zdWJzY3JpYmUoZXZ0ID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBjb25uZWN0UGFyYW1zOiB7IHZlcnNpb24sIHByb3RvY29sLCBwb3J0LCBob3N0IH1cbiAgICB9ID0gZXZ0XG4gICAgZGVidWdsb2coXG4gICAgICAnY29ubmVjdGluZyB0byAlcyB1c2luZyAlcyVzJyxcbiAgICAgIGAke2hvc3R9JHtwb3J0ID8gYDoke3BvcnR9YCA6ICcnfWAsXG4gICAgICBwcm90b2NvbCxcbiAgICAgIHZlcnNpb25cbiAgICApXG4gIH0pXG5cbiAgZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTpjbGllbnQ6Y29ubmVjdGVkJykuc3Vic2NyaWJlKGV2dCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgY29ubmVjdFBhcmFtczogeyB2ZXJzaW9uLCBwcm90b2NvbCwgcG9ydCwgaG9zdCB9XG4gICAgfSA9IGV2dFxuICAgIGRlYnVnbG9nKFxuICAgICAgJ2Nvbm5lY3RlZCB0byAlcyB1c2luZyAlcyVzJyxcbiAgICAgIGAke2hvc3R9JHtwb3J0ID8gYDoke3BvcnR9YCA6ICcnfWAsXG4gICAgICBwcm90b2NvbCxcbiAgICAgIHZlcnNpb25cbiAgICApXG4gIH0pXG5cbiAgZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTpjbGllbnQ6Y29ubmVjdEVycm9yJykuc3Vic2NyaWJlKGV2dCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgY29ubmVjdFBhcmFtczogeyB2ZXJzaW9uLCBwcm90b2NvbCwgcG9ydCwgaG9zdCB9LFxuICAgICAgZXJyb3JcbiAgICB9ID0gZXZ0XG4gICAgZGVidWdsb2coXG4gICAgICAnY29ubmVjdGlvbiB0byAlcyB1c2luZyAlcyVzIGVycm9yZWQgLSAlcycsXG4gICAgICBgJHtob3N0fSR7cG9ydCA/IGA6JHtwb3J0fWAgOiAnJ31gLFxuICAgICAgcHJvdG9jb2wsXG4gICAgICB2ZXJzaW9uLFxuICAgICAgZXJyb3IubWVzc2FnZVxuICAgIClcbiAgfSlcblxuICBkaWFnbm9zdGljc0NoYW5uZWwuY2hhbm5lbCgndW5kaWNpOmNsaWVudDpzZW5kSGVhZGVycycpLnN1YnNjcmliZShldnQgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlcXVlc3Q6IHsgbWV0aG9kLCBwYXRoLCBvcmlnaW4gfVxuICAgIH0gPSBldnRcbiAgICBkZWJ1Z2xvZygnc2VuZGluZyByZXF1ZXN0IHRvICVzICVzLyVzJywgbWV0aG9kLCBvcmlnaW4sIHBhdGgpXG4gIH0pXG5cbiAgLy8gVHJhY2sgUmVxdWVzdCBldmVudHNcbiAgZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTpyZXF1ZXN0OmhlYWRlcnMnKS5zdWJzY3JpYmUoZXZ0ID0+IHtcbiAgICBjb25zdCB7XG4gICAgICByZXF1ZXN0OiB7IG1ldGhvZCwgcGF0aCwgb3JpZ2luIH0sXG4gICAgICByZXNwb25zZTogeyBzdGF0dXNDb2RlIH1cbiAgICB9ID0gZXZ0XG4gICAgZGVidWdsb2coXG4gICAgICAncmVjZWl2ZWQgcmVzcG9uc2UgdG8gJXMgJXMvJXMgLSBIVFRQICVkJyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIG9yaWdpbixcbiAgICAgIHBhdGgsXG4gICAgICBzdGF0dXNDb2RlXG4gICAgKVxuICB9KVxuXG4gIGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6cmVxdWVzdDp0cmFpbGVycycpLnN1YnNjcmliZShldnQgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlcXVlc3Q6IHsgbWV0aG9kLCBwYXRoLCBvcmlnaW4gfVxuICAgIH0gPSBldnRcbiAgICBkZWJ1Z2xvZygndHJhaWxlcnMgcmVjZWl2ZWQgZnJvbSAlcyAlcy8lcycsIG1ldGhvZCwgb3JpZ2luLCBwYXRoKVxuICB9KVxuXG4gIGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6cmVxdWVzdDplcnJvcicpLnN1YnNjcmliZShldnQgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlcXVlc3Q6IHsgbWV0aG9kLCBwYXRoLCBvcmlnaW4gfSxcbiAgICAgIGVycm9yXG4gICAgfSA9IGV2dFxuICAgIGRlYnVnbG9nKFxuICAgICAgJ3JlcXVlc3QgdG8gJXMgJXMvJXMgZXJyb3JlZCAtICVzJyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIG9yaWdpbixcbiAgICAgIHBhdGgsXG4gICAgICBlcnJvci5tZXNzYWdlXG4gICAgKVxuICB9KVxuXG4gIGlzQ2xpZW50U2V0ID0gdHJ1ZVxufVxuXG5pZiAod2Vic29ja2V0RGVidWdsb2cuZW5hYmxlZCkge1xuICBpZiAoIWlzQ2xpZW50U2V0KSB7XG4gICAgY29uc3QgZGVidWdsb2cgPSB1bmRpY2lEZWJ1Z0xvZy5lbmFibGVkID8gdW5kaWNpRGVidWdMb2cgOiB3ZWJzb2NrZXREZWJ1Z2xvZ1xuICAgIGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6Y2xpZW50OmJlZm9yZUNvbm5lY3QnKS5zdWJzY3JpYmUoZXZ0ID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY29ubmVjdFBhcmFtczogeyB2ZXJzaW9uLCBwcm90b2NvbCwgcG9ydCwgaG9zdCB9XG4gICAgICB9ID0gZXZ0XG4gICAgICBkZWJ1Z2xvZyhcbiAgICAgICAgJ2Nvbm5lY3RpbmcgdG8gJXMlcyB1c2luZyAlcyVzJyxcbiAgICAgICAgaG9zdCxcbiAgICAgICAgcG9ydCA/IGA6JHtwb3J0fWAgOiAnJyxcbiAgICAgICAgcHJvdG9jb2wsXG4gICAgICAgIHZlcnNpb25cbiAgICAgIClcbiAgICB9KVxuXG4gICAgZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTpjbGllbnQ6Y29ubmVjdGVkJykuc3Vic2NyaWJlKGV2dCA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGNvbm5lY3RQYXJhbXM6IHsgdmVyc2lvbiwgcHJvdG9jb2wsIHBvcnQsIGhvc3QgfVxuICAgICAgfSA9IGV2dFxuICAgICAgZGVidWdsb2coXG4gICAgICAgICdjb25uZWN0ZWQgdG8gJXMlcyB1c2luZyAlcyVzJyxcbiAgICAgICAgaG9zdCxcbiAgICAgICAgcG9ydCA/IGA6JHtwb3J0fWAgOiAnJyxcbiAgICAgICAgcHJvdG9jb2wsXG4gICAgICAgIHZlcnNpb25cbiAgICAgIClcbiAgICB9KVxuXG4gICAgZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTpjbGllbnQ6Y29ubmVjdEVycm9yJykuc3Vic2NyaWJlKGV2dCA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGNvbm5lY3RQYXJhbXM6IHsgdmVyc2lvbiwgcHJvdG9jb2wsIHBvcnQsIGhvc3QgfSxcbiAgICAgICAgZXJyb3JcbiAgICAgIH0gPSBldnRcbiAgICAgIGRlYnVnbG9nKFxuICAgICAgICAnY29ubmVjdGlvbiB0byAlcyVzIHVzaW5nICVzJXMgZXJyb3JlZCAtICVzJyxcbiAgICAgICAgaG9zdCxcbiAgICAgICAgcG9ydCA/IGA6JHtwb3J0fWAgOiAnJyxcbiAgICAgICAgcHJvdG9jb2wsXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIGVycm9yLm1lc3NhZ2VcbiAgICAgIClcbiAgICB9KVxuXG4gICAgZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTpjbGllbnQ6c2VuZEhlYWRlcnMnKS5zdWJzY3JpYmUoZXZ0ID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcmVxdWVzdDogeyBtZXRob2QsIHBhdGgsIG9yaWdpbiB9XG4gICAgICB9ID0gZXZ0XG4gICAgICBkZWJ1Z2xvZygnc2VuZGluZyByZXF1ZXN0IHRvICVzICVzLyVzJywgbWV0aG9kLCBvcmlnaW4sIHBhdGgpXG4gICAgfSlcbiAgfVxuXG4gIC8vIFRyYWNrIGFsbCBXZWJTb2NrZXQgZXZlbnRzXG4gIGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6d2Vic29ja2V0Om9wZW4nKS5zdWJzY3JpYmUoZXZ0ID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBhZGRyZXNzOiB7IGFkZHJlc3MsIHBvcnQgfVxuICAgIH0gPSBldnRcbiAgICB3ZWJzb2NrZXREZWJ1Z2xvZygnY29ubmVjdGlvbiBvcGVuZWQgJXMlcycsIGFkZHJlc3MsIHBvcnQgPyBgOiR7cG9ydH1gIDogJycpXG4gIH0pXG5cbiAgZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTp3ZWJzb2NrZXQ6Y2xvc2UnKS5zdWJzY3JpYmUoZXZ0ID0+IHtcbiAgICBjb25zdCB7IHdlYnNvY2tldCwgY29kZSwgcmVhc29uIH0gPSBldnRcbiAgICB3ZWJzb2NrZXREZWJ1Z2xvZyhcbiAgICAgICdjbG9zZWQgY29ubmVjdGlvbiB0byAlcyAtICVzICVzJyxcbiAgICAgIHdlYnNvY2tldC51cmwsXG4gICAgICBjb2RlLFxuICAgICAgcmVhc29uXG4gICAgKVxuICB9KVxuXG4gIGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6d2Vic29ja2V0OnNvY2tldF9lcnJvcicpLnN1YnNjcmliZShlcnIgPT4ge1xuICAgIHdlYnNvY2tldERlYnVnbG9nKCdjb25uZWN0aW9uIGVycm9yZWQgLSAlcycsIGVyci5tZXNzYWdlKVxuICB9KVxuXG4gIGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6d2Vic29ja2V0OnBpbmcnKS5zdWJzY3JpYmUoZXZ0ID0+IHtcbiAgICB3ZWJzb2NrZXREZWJ1Z2xvZygncGluZyByZWNlaXZlZCcpXG4gIH0pXG5cbiAgZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTp3ZWJzb2NrZXQ6cG9uZycpLnN1YnNjcmliZShldnQgPT4ge1xuICAgIHdlYnNvY2tldERlYnVnbG9nKCdwb25nIHJlY2VpdmVkJylcbiAgfSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNoYW5uZWxzXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBJbnZhbGlkQXJndW1lbnRFcnJvcixcbiAgTm90U3VwcG9ydGVkRXJyb3Jcbn0gPSByZXF1aXJlKCcuL2Vycm9ycycpXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdub2RlOmFzc2VydCcpXG5jb25zdCB7XG4gIGlzVmFsaWRIVFRQVG9rZW4sXG4gIGlzVmFsaWRIZWFkZXJWYWx1ZSxcbiAgaXNTdHJlYW0sXG4gIGRlc3Ryb3ksXG4gIGlzQnVmZmVyLFxuICBpc0Zvcm1EYXRhTGlrZSxcbiAgaXNJdGVyYWJsZSxcbiAgaXNCbG9iTGlrZSxcbiAgYnVpbGRVUkwsXG4gIHZhbGlkYXRlSGFuZGxlcixcbiAgZ2V0U2VydmVyTmFtZSxcbiAgbm9ybWFsaXplZE1ldGhvZFJlY29yZHNcbn0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3QgeyBjaGFubmVscyB9ID0gcmVxdWlyZSgnLi9kaWFnbm9zdGljcy5qcycpXG5jb25zdCB7IGhlYWRlck5hbWVMb3dlckNhc2VkUmVjb3JkIH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5cbi8vIFZlcmlmaWVzIHRoYXQgYSBnaXZlbiBwYXRoIGlzIHZhbGlkIGRvZXMgbm90IGNvbnRhaW4gY29udHJvbCBjaGFycyBcXHgwMCB0byBcXHgyMFxuY29uc3QgaW52YWxpZFBhdGhSZWdleCA9IC9bXlxcdTAwMjEtXFx1MDBmZl0vXG5cbmNvbnN0IGtIYW5kbGVyID0gU3ltYm9sKCdoYW5kbGVyJylcblxuY2xhc3MgUmVxdWVzdCB7XG4gIGNvbnN0cnVjdG9yIChvcmlnaW4sIHtcbiAgICBwYXRoLFxuICAgIG1ldGhvZCxcbiAgICBib2R5LFxuICAgIGhlYWRlcnMsXG4gICAgcXVlcnksXG4gICAgaWRlbXBvdGVudCxcbiAgICBibG9ja2luZyxcbiAgICB1cGdyYWRlLFxuICAgIGhlYWRlcnNUaW1lb3V0LFxuICAgIGJvZHlUaW1lb3V0LFxuICAgIHJlc2V0LFxuICAgIHRocm93T25FcnJvcixcbiAgICBleHBlY3RDb250aW51ZSxcbiAgICBzZXJ2ZXJuYW1lXG4gIH0sIGhhbmRsZXIpIHtcbiAgICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3BhdGggbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHBhdGhbMF0gIT09ICcvJyAmJlxuICAgICAgIShwYXRoLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSB8fCBwYXRoLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpICYmXG4gICAgICBtZXRob2QgIT09ICdDT05ORUNUJ1xuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdwYXRoIG11c3QgYmUgYW4gYWJzb2x1dGUgVVJMIG9yIHN0YXJ0IHdpdGggYSBzbGFzaCcpXG4gICAgfSBlbHNlIGlmIChpbnZhbGlkUGF0aFJlZ2V4LnRlc3QocGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCByZXF1ZXN0IHBhdGgnKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbWV0aG9kICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdtZXRob2QgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfSBlbHNlIGlmIChub3JtYWxpemVkTWV0aG9kUmVjb3Jkc1ttZXRob2RdID09PSB1bmRlZmluZWQgJiYgIWlzVmFsaWRIVFRQVG9rZW4obWV0aG9kKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIHJlcXVlc3QgbWV0aG9kJylcbiAgICB9XG5cbiAgICBpZiAodXBncmFkZSAmJiB0eXBlb2YgdXBncmFkZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcigndXBncmFkZSBtdXN0IGJlIGEgc3RyaW5nJylcbiAgICB9XG5cbiAgICBpZiAoaGVhZGVyc1RpbWVvdXQgIT0gbnVsbCAmJiAoIU51bWJlci5pc0Zpbml0ZShoZWFkZXJzVGltZW91dCkgfHwgaGVhZGVyc1RpbWVvdXQgPCAwKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGhlYWRlcnNUaW1lb3V0JylcbiAgICB9XG5cbiAgICBpZiAoYm9keVRpbWVvdXQgIT0gbnVsbCAmJiAoIU51bWJlci5pc0Zpbml0ZShib2R5VGltZW91dCkgfHwgYm9keVRpbWVvdXQgPCAwKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGJvZHlUaW1lb3V0JylcbiAgICB9XG5cbiAgICBpZiAocmVzZXQgIT0gbnVsbCAmJiB0eXBlb2YgcmVzZXQgIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIHJlc2V0JylcbiAgICB9XG5cbiAgICBpZiAoZXhwZWN0Q29udGludWUgIT0gbnVsbCAmJiB0eXBlb2YgZXhwZWN0Q29udGludWUgIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGV4cGVjdENvbnRpbnVlJylcbiAgICB9XG5cbiAgICB0aGlzLmhlYWRlcnNUaW1lb3V0ID0gaGVhZGVyc1RpbWVvdXRcblxuICAgIHRoaXMuYm9keVRpbWVvdXQgPSBib2R5VGltZW91dFxuXG4gICAgdGhpcy50aHJvd09uRXJyb3IgPSB0aHJvd09uRXJyb3IgPT09IHRydWVcblxuICAgIHRoaXMubWV0aG9kID0gbWV0aG9kXG5cbiAgICB0aGlzLmFib3J0ID0gbnVsbFxuXG4gICAgaWYgKGJvZHkgPT0gbnVsbCkge1xuICAgICAgdGhpcy5ib2R5ID0gbnVsbFxuICAgIH0gZWxzZSBpZiAoaXNTdHJlYW0oYm9keSkpIHtcbiAgICAgIHRoaXMuYm9keSA9IGJvZHlcblxuICAgICAgY29uc3QgclN0YXRlID0gdGhpcy5ib2R5Ll9yZWFkYWJsZVN0YXRlXG4gICAgICBpZiAoIXJTdGF0ZSB8fCAhclN0YXRlLmF1dG9EZXN0cm95KSB7XG4gICAgICAgIHRoaXMuZW5kSGFuZGxlciA9IGZ1bmN0aW9uIGF1dG9EZXN0cm95ICgpIHtcbiAgICAgICAgICBkZXN0cm95KHRoaXMpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ib2R5Lm9uKCdlbmQnLCB0aGlzLmVuZEhhbmRsZXIpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuZXJyb3JIYW5kbGVyID0gZXJyID0+IHtcbiAgICAgICAgaWYgKHRoaXMuYWJvcnQpIHtcbiAgICAgICAgICB0aGlzLmFib3J0KGVycilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVycm9yID0gZXJyXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuYm9keS5vbignZXJyb3InLCB0aGlzLmVycm9ySGFuZGxlcilcbiAgICB9IGVsc2UgaWYgKGlzQnVmZmVyKGJvZHkpKSB7XG4gICAgICB0aGlzLmJvZHkgPSBib2R5LmJ5dGVMZW5ndGggPyBib2R5IDogbnVsbFxuICAgIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGJvZHkpKSB7XG4gICAgICB0aGlzLmJvZHkgPSBib2R5LmJ1ZmZlci5ieXRlTGVuZ3RoID8gQnVmZmVyLmZyb20oYm9keS5idWZmZXIsIGJvZHkuYnl0ZU9mZnNldCwgYm9keS5ieXRlTGVuZ3RoKSA6IG51bGxcbiAgICB9IGVsc2UgaWYgKGJvZHkgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgdGhpcy5ib2R5ID0gYm9keS5ieXRlTGVuZ3RoID8gQnVmZmVyLmZyb20oYm9keSkgOiBudWxsXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuYm9keSA9IGJvZHkubGVuZ3RoID8gQnVmZmVyLmZyb20oYm9keSkgOiBudWxsXG4gICAgfSBlbHNlIGlmIChpc0Zvcm1EYXRhTGlrZShib2R5KSB8fCBpc0l0ZXJhYmxlKGJvZHkpIHx8IGlzQmxvYkxpa2UoYm9keSkpIHtcbiAgICAgIHRoaXMuYm9keSA9IGJvZHlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdib2R5IG11c3QgYmUgYSBzdHJpbmcsIGEgQnVmZmVyLCBhIFJlYWRhYmxlIHN0cmVhbSwgYW4gaXRlcmFibGUsIG9yIGFuIGFzeW5jIGl0ZXJhYmxlJylcbiAgICB9XG5cbiAgICB0aGlzLmNvbXBsZXRlZCA9IGZhbHNlXG5cbiAgICB0aGlzLmFib3J0ZWQgPSBmYWxzZVxuXG4gICAgdGhpcy51cGdyYWRlID0gdXBncmFkZSB8fCBudWxsXG5cbiAgICB0aGlzLnBhdGggPSBxdWVyeSA/IGJ1aWxkVVJMKHBhdGgsIHF1ZXJ5KSA6IHBhdGhcblxuICAgIHRoaXMub3JpZ2luID0gb3JpZ2luXG5cbiAgICB0aGlzLmlkZW1wb3RlbnQgPSBpZGVtcG90ZW50ID09IG51bGxcbiAgICAgID8gbWV0aG9kID09PSAnSEVBRCcgfHwgbWV0aG9kID09PSAnR0VUJ1xuICAgICAgOiBpZGVtcG90ZW50XG5cbiAgICB0aGlzLmJsb2NraW5nID0gYmxvY2tpbmcgPT0gbnVsbCA/IGZhbHNlIDogYmxvY2tpbmdcblxuICAgIHRoaXMucmVzZXQgPSByZXNldCA9PSBudWxsID8gbnVsbCA6IHJlc2V0XG5cbiAgICB0aGlzLmhvc3QgPSBudWxsXG5cbiAgICB0aGlzLmNvbnRlbnRMZW5ndGggPSBudWxsXG5cbiAgICB0aGlzLmNvbnRlbnRUeXBlID0gbnVsbFxuXG4gICAgdGhpcy5oZWFkZXJzID0gW11cblxuICAgIC8vIE9ubHkgZm9yIEgyXG4gICAgdGhpcy5leHBlY3RDb250aW51ZSA9IGV4cGVjdENvbnRpbnVlICE9IG51bGwgPyBleHBlY3RDb250aW51ZSA6IGZhbHNlXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgICAgaWYgKGhlYWRlcnMubGVuZ3RoICUgMiAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2hlYWRlcnMgYXJyYXkgbXVzdCBiZSBldmVuJylcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICBwcm9jZXNzSGVhZGVyKHRoaXMsIGhlYWRlcnNbaV0sIGhlYWRlcnNbaSArIDFdKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaGVhZGVycyAmJiB0eXBlb2YgaGVhZGVycyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChoZWFkZXJzW1N5bWJvbC5pdGVyYXRvcl0pIHtcbiAgICAgICAgZm9yIChjb25zdCBoZWFkZXIgb2YgaGVhZGVycykge1xuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShoZWFkZXIpIHx8IGhlYWRlci5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaGVhZGVycyBtdXN0IGJlIGluIGtleS12YWx1ZSBwYWlyIGZvcm1hdCcpXG4gICAgICAgICAgfVxuICAgICAgICAgIHByb2Nlc3NIZWFkZXIodGhpcywgaGVhZGVyWzBdLCBoZWFkZXJbMV0pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhoZWFkZXJzKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBwcm9jZXNzSGVhZGVyKHRoaXMsIGtleXNbaV0sIGhlYWRlcnNba2V5c1tpXV0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGhlYWRlcnMgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdoZWFkZXJzIG11c3QgYmUgYW4gb2JqZWN0IG9yIGFuIGFycmF5JylcbiAgICB9XG5cbiAgICB2YWxpZGF0ZUhhbmRsZXIoaGFuZGxlciwgbWV0aG9kLCB1cGdyYWRlKVxuXG4gICAgdGhpcy5zZXJ2ZXJuYW1lID0gc2VydmVybmFtZSB8fCBnZXRTZXJ2ZXJOYW1lKHRoaXMuaG9zdClcblxuICAgIHRoaXNba0hhbmRsZXJdID0gaGFuZGxlclxuXG4gICAgaWYgKGNoYW5uZWxzLmNyZWF0ZS5oYXNTdWJzY3JpYmVycykge1xuICAgICAgY2hhbm5lbHMuY3JlYXRlLnB1Ymxpc2goeyByZXF1ZXN0OiB0aGlzIH0pXG4gICAgfVxuICB9XG5cbiAgb25Cb2R5U2VudCAoY2h1bmspIHtcbiAgICBpZiAodGhpc1trSGFuZGxlcl0ub25Cb2R5U2VudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHRoaXNba0hhbmRsZXJdLm9uQm9keVNlbnQoY2h1bmspXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5hYm9ydChlcnIpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25SZXF1ZXN0U2VudCAoKSB7XG4gICAgaWYgKGNoYW5uZWxzLmJvZHlTZW50Lmhhc1N1YnNjcmliZXJzKSB7XG4gICAgICBjaGFubmVscy5ib2R5U2VudC5wdWJsaXNoKHsgcmVxdWVzdDogdGhpcyB9KVxuICAgIH1cblxuICAgIGlmICh0aGlzW2tIYW5kbGVyXS5vblJlcXVlc3RTZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdGhpc1trSGFuZGxlcl0ub25SZXF1ZXN0U2VudCgpXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5hYm9ydChlcnIpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCkge1xuICAgIGFzc2VydCghdGhpcy5hYm9ydGVkKVxuICAgIGFzc2VydCghdGhpcy5jb21wbGV0ZWQpXG5cbiAgICBpZiAodGhpcy5lcnJvcikge1xuICAgICAgYWJvcnQodGhpcy5lcnJvcilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hYm9ydCA9IGFib3J0XG4gICAgICByZXR1cm4gdGhpc1trSGFuZGxlcl0ub25Db25uZWN0KGFib3J0KVxuICAgIH1cbiAgfVxuXG4gIG9uUmVzcG9uc2VTdGFydGVkICgpIHtcbiAgICByZXR1cm4gdGhpc1trSGFuZGxlcl0ub25SZXNwb25zZVN0YXJ0ZWQ/LigpXG4gIH1cblxuICBvbkhlYWRlcnMgKHN0YXR1c0NvZGUsIGhlYWRlcnMsIHJlc3VtZSwgc3RhdHVzVGV4dCkge1xuICAgIGFzc2VydCghdGhpcy5hYm9ydGVkKVxuICAgIGFzc2VydCghdGhpcy5jb21wbGV0ZWQpXG5cbiAgICBpZiAoY2hhbm5lbHMuaGVhZGVycy5oYXNTdWJzY3JpYmVycykge1xuICAgICAgY2hhbm5lbHMuaGVhZGVycy5wdWJsaXNoKHsgcmVxdWVzdDogdGhpcywgcmVzcG9uc2U6IHsgc3RhdHVzQ29kZSwgaGVhZGVycywgc3RhdHVzVGV4dCB9IH0pXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzW2tIYW5kbGVyXS5vbkhlYWRlcnMoc3RhdHVzQ29kZSwgaGVhZGVycywgcmVzdW1lLCBzdGF0dXNUZXh0KVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5hYm9ydChlcnIpXG4gICAgfVxuICB9XG5cbiAgb25EYXRhIChjaHVuaykge1xuICAgIGFzc2VydCghdGhpcy5hYm9ydGVkKVxuICAgIGFzc2VydCghdGhpcy5jb21wbGV0ZWQpXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXNba0hhbmRsZXJdLm9uRGF0YShjaHVuaylcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuYWJvcnQoZXJyKVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgb25VcGdyYWRlIChzdGF0dXNDb2RlLCBoZWFkZXJzLCBzb2NrZXQpIHtcbiAgICBhc3NlcnQoIXRoaXMuYWJvcnRlZClcbiAgICBhc3NlcnQoIXRoaXMuY29tcGxldGVkKVxuXG4gICAgcmV0dXJuIHRoaXNba0hhbmRsZXJdLm9uVXBncmFkZShzdGF0dXNDb2RlLCBoZWFkZXJzLCBzb2NrZXQpXG4gIH1cblxuICBvbkNvbXBsZXRlICh0cmFpbGVycykge1xuICAgIHRoaXMub25GaW5hbGx5KClcblxuICAgIGFzc2VydCghdGhpcy5hYm9ydGVkKVxuXG4gICAgdGhpcy5jb21wbGV0ZWQgPSB0cnVlXG4gICAgaWYgKGNoYW5uZWxzLnRyYWlsZXJzLmhhc1N1YnNjcmliZXJzKSB7XG4gICAgICBjaGFubmVscy50cmFpbGVycy5wdWJsaXNoKHsgcmVxdWVzdDogdGhpcywgdHJhaWxlcnMgfSlcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXNba0hhbmRsZXJdLm9uQ29tcGxldGUodHJhaWxlcnMpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBUT0RPIChmaXgpOiBUaGlzIG1pZ2h0IGJlIGEgYmFkIGlkZWE/XG4gICAgICB0aGlzLm9uRXJyb3IoZXJyKVxuICAgIH1cbiAgfVxuXG4gIG9uRXJyb3IgKGVycm9yKSB7XG4gICAgdGhpcy5vbkZpbmFsbHkoKVxuXG4gICAgaWYgKGNoYW5uZWxzLmVycm9yLmhhc1N1YnNjcmliZXJzKSB7XG4gICAgICBjaGFubmVscy5lcnJvci5wdWJsaXNoKHsgcmVxdWVzdDogdGhpcywgZXJyb3IgfSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hYm9ydGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5hYm9ydGVkID0gdHJ1ZVxuXG4gICAgcmV0dXJuIHRoaXNba0hhbmRsZXJdLm9uRXJyb3IoZXJyb3IpXG4gIH1cblxuICBvbkZpbmFsbHkgKCkge1xuICAgIGlmICh0aGlzLmVycm9ySGFuZGxlcikge1xuICAgICAgdGhpcy5ib2R5Lm9mZignZXJyb3InLCB0aGlzLmVycm9ySGFuZGxlcilcbiAgICAgIHRoaXMuZXJyb3JIYW5kbGVyID0gbnVsbFxuICAgIH1cblxuICAgIGlmICh0aGlzLmVuZEhhbmRsZXIpIHtcbiAgICAgIHRoaXMuYm9keS5vZmYoJ2VuZCcsIHRoaXMuZW5kSGFuZGxlcilcbiAgICAgIHRoaXMuZW5kSGFuZGxlciA9IG51bGxcbiAgICB9XG4gIH1cblxuICBhZGRIZWFkZXIgKGtleSwgdmFsdWUpIHtcbiAgICBwcm9jZXNzSGVhZGVyKHRoaXMsIGtleSwgdmFsdWUpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzSGVhZGVyIChyZXF1ZXN0LCBrZXksIHZhbCkge1xuICBpZiAodmFsICYmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWwpKSkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihgaW52YWxpZCAke2tleX0gaGVhZGVyYClcbiAgfSBlbHNlIGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgbGV0IGhlYWRlck5hbWUgPSBoZWFkZXJOYW1lTG93ZXJDYXNlZFJlY29yZFtrZXldXG5cbiAgaWYgKGhlYWRlck5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIGhlYWRlck5hbWUgPSBrZXkudG9Mb3dlckNhc2UoKVxuICAgIGlmIChoZWFkZXJOYW1lTG93ZXJDYXNlZFJlY29yZFtoZWFkZXJOYW1lXSA9PT0gdW5kZWZpbmVkICYmICFpc1ZhbGlkSFRUUFRva2VuKGhlYWRlck5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgaGVhZGVyIGtleScpXG4gICAgfVxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgIGNvbnN0IGFyciA9IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsW2ldID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoIWlzVmFsaWRIZWFkZXJWYWx1ZSh2YWxbaV0pKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKGBpbnZhbGlkICR7a2V5fSBoZWFkZXJgKVxuICAgICAgICB9XG4gICAgICAgIGFyci5wdXNoKHZhbFtpXSlcbiAgICAgIH0gZWxzZSBpZiAodmFsW2ldID09PSBudWxsKSB7XG4gICAgICAgIGFyci5wdXNoKCcnKVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsW2ldID09PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoYGludmFsaWQgJHtrZXl9IGhlYWRlcmApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcnIucHVzaChgJHt2YWxbaV19YClcbiAgICAgIH1cbiAgICB9XG4gICAgdmFsID0gYXJyXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoIWlzVmFsaWRIZWFkZXJWYWx1ZSh2YWwpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoYGludmFsaWQgJHtrZXl9IGhlYWRlcmApXG4gICAgfVxuICB9IGVsc2UgaWYgKHZhbCA9PT0gbnVsbCkge1xuICAgIHZhbCA9ICcnXG4gIH0gZWxzZSB7XG4gICAgdmFsID0gYCR7dmFsfWBcbiAgfVxuXG4gIGlmIChyZXF1ZXN0Lmhvc3QgPT09IG51bGwgJiYgaGVhZGVyTmFtZSA9PT0gJ2hvc3QnKSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgaG9zdCBoZWFkZXInKVxuICAgIH1cbiAgICAvLyBDb25zdW1lZCBieSBDbGllbnRcbiAgICByZXF1ZXN0Lmhvc3QgPSB2YWxcbiAgfSBlbHNlIGlmIChyZXF1ZXN0LmNvbnRlbnRMZW5ndGggPT09IG51bGwgJiYgaGVhZGVyTmFtZSA9PT0gJ2NvbnRlbnQtbGVuZ3RoJykge1xuICAgIHJlcXVlc3QuY29udGVudExlbmd0aCA9IHBhcnNlSW50KHZhbCwgMTApXG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocmVxdWVzdC5jb250ZW50TGVuZ3RoKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGNvbnRlbnQtbGVuZ3RoIGhlYWRlcicpXG4gICAgfVxuICB9IGVsc2UgaWYgKHJlcXVlc3QuY29udGVudFR5cGUgPT09IG51bGwgJiYgaGVhZGVyTmFtZSA9PT0gJ2NvbnRlbnQtdHlwZScpIHtcbiAgICByZXF1ZXN0LmNvbnRlbnRUeXBlID0gdmFsXG4gICAgcmVxdWVzdC5oZWFkZXJzLnB1c2goa2V5LCB2YWwpXG4gIH0gZWxzZSBpZiAoaGVhZGVyTmFtZSA9PT0gJ3RyYW5zZmVyLWVuY29kaW5nJyB8fCBoZWFkZXJOYW1lID09PSAna2VlcC1hbGl2ZScgfHwgaGVhZGVyTmFtZSA9PT0gJ3VwZ3JhZGUnKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKGBpbnZhbGlkICR7aGVhZGVyTmFtZX0gaGVhZGVyYClcbiAgfSBlbHNlIGlmIChoZWFkZXJOYW1lID09PSAnY29ubmVjdGlvbicpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gdmFsLnRvTG93ZXJDYXNlKCkgOiBudWxsXG4gICAgaWYgKHZhbHVlICE9PSAnY2xvc2UnICYmIHZhbHVlICE9PSAna2VlcC1hbGl2ZScpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBjb25uZWN0aW9uIGhlYWRlcicpXG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSAnY2xvc2UnKSB7XG4gICAgICByZXF1ZXN0LnJlc2V0ID0gdHJ1ZVxuICAgIH1cbiAgfSBlbHNlIGlmIChoZWFkZXJOYW1lID09PSAnZXhwZWN0Jykge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFcnJvcignZXhwZWN0IGhlYWRlciBub3Qgc3VwcG9ydGVkJylcbiAgfSBlbHNlIHtcbiAgICByZXF1ZXN0LmhlYWRlcnMucHVzaChrZXksIHZhbClcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlcXVlc3RcbiIsIid1c2Ugc3RyaWN0J1xuY29uc3QgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnbm9kZTpldmVudHMnKVxuXG5jbGFzcyBEaXNwYXRjaGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgZGlzcGF0Y2ggKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJylcbiAgfVxuXG4gIGNsb3NlICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpXG4gIH1cblxuICBkZXN0cm95ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpXG4gIH1cblxuICBjb21wb3NlICguLi5hcmdzKSB7XG4gICAgLy8gU28gd2UgaGFuZGxlIFtpbnRlcmNlcHRvcjEsIGludGVyY2VwdG9yMl0gb3IgaW50ZXJjZXB0b3IxLCBpbnRlcmNlcHRvcjIsIC4uLlxuICAgIGNvbnN0IGludGVyY2VwdG9ycyA9IEFycmF5LmlzQXJyYXkoYXJnc1swXSkgPyBhcmdzWzBdIDogYXJnc1xuICAgIGxldCBkaXNwYXRjaCA9IHRoaXMuZGlzcGF0Y2guYmluZCh0aGlzKVxuXG4gICAgZm9yIChjb25zdCBpbnRlcmNlcHRvciBvZiBpbnRlcmNlcHRvcnMpIHtcbiAgICAgIGlmIChpbnRlcmNlcHRvciA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaW50ZXJjZXB0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgaW52YWxpZCBpbnRlcmNlcHRvciwgZXhwZWN0ZWQgZnVuY3Rpb24gcmVjZWl2ZWQgJHt0eXBlb2YgaW50ZXJjZXB0b3J9YClcbiAgICAgIH1cblxuICAgICAgZGlzcGF0Y2ggPSBpbnRlcmNlcHRvcihkaXNwYXRjaClcblxuICAgICAgaWYgKGRpc3BhdGNoID09IG51bGwgfHwgdHlwZW9mIGRpc3BhdGNoICE9PSAnZnVuY3Rpb24nIHx8IGRpc3BhdGNoLmxlbmd0aCAhPT0gMikge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIGludGVyY2VwdG9yJylcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IENvbXBvc2VkRGlzcGF0Y2hlcih0aGlzLCBkaXNwYXRjaClcbiAgfVxufVxuXG5jbGFzcyBDb21wb3NlZERpc3BhdGNoZXIgZXh0ZW5kcyBEaXNwYXRjaGVyIHtcbiAgI2Rpc3BhdGNoZXIgPSBudWxsXG4gICNkaXNwYXRjaCA9IG51bGxcblxuICBjb25zdHJ1Y3RvciAoZGlzcGF0Y2hlciwgZGlzcGF0Y2gpIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy4jZGlzcGF0Y2hlciA9IGRpc3BhdGNoZXJcbiAgICB0aGlzLiNkaXNwYXRjaCA9IGRpc3BhdGNoXG4gIH1cblxuICBkaXNwYXRjaCAoLi4uYXJncykge1xuICAgIHRoaXMuI2Rpc3BhdGNoKC4uLmFyZ3MpXG4gIH1cblxuICBjbG9zZSAoLi4uYXJncykge1xuICAgIHJldHVybiB0aGlzLiNkaXNwYXRjaGVyLmNsb3NlKC4uLmFyZ3MpXG4gIH1cblxuICBkZXN0cm95ICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuI2Rpc3BhdGNoZXIuZGVzdHJveSguLi5hcmdzKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRGlzcGF0Y2hlclxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IERpc3BhdGNoZXIgPSByZXF1aXJlKCcuL2Rpc3BhdGNoZXInKVxuY29uc3Qge1xuICBDbGllbnREZXN0cm95ZWRFcnJvcixcbiAgQ2xpZW50Q2xvc2VkRXJyb3IsXG4gIEludmFsaWRBcmd1bWVudEVycm9yXG59ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMnKVxuY29uc3QgeyBrRGVzdHJveSwga0Nsb3NlLCBrQ2xvc2VkLCBrRGVzdHJveWVkLCBrRGlzcGF0Y2gsIGtJbnRlcmNlcHRvcnMgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5cbmNvbnN0IGtPbkRlc3Ryb3llZCA9IFN5bWJvbCgnb25EZXN0cm95ZWQnKVxuY29uc3Qga09uQ2xvc2VkID0gU3ltYm9sKCdvbkNsb3NlZCcpXG5jb25zdCBrSW50ZXJjZXB0ZWREaXNwYXRjaCA9IFN5bWJvbCgnSW50ZXJjZXB0ZWQgRGlzcGF0Y2gnKVxuXG5jbGFzcyBEaXNwYXRjaGVyQmFzZSBleHRlbmRzIERpc3BhdGNoZXIge1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgdGhpc1trRGVzdHJveWVkXSA9IGZhbHNlXG4gICAgdGhpc1trT25EZXN0cm95ZWRdID0gbnVsbFxuICAgIHRoaXNba0Nsb3NlZF0gPSBmYWxzZVxuICAgIHRoaXNba09uQ2xvc2VkXSA9IFtdXG4gIH1cblxuICBnZXQgZGVzdHJveWVkICgpIHtcbiAgICByZXR1cm4gdGhpc1trRGVzdHJveWVkXVxuICB9XG5cbiAgZ2V0IGNsb3NlZCAoKSB7XG4gICAgcmV0dXJuIHRoaXNba0Nsb3NlZF1cbiAgfVxuXG4gIGdldCBpbnRlcmNlcHRvcnMgKCkge1xuICAgIHJldHVybiB0aGlzW2tJbnRlcmNlcHRvcnNdXG4gIH1cblxuICBzZXQgaW50ZXJjZXB0b3JzIChuZXdJbnRlcmNlcHRvcnMpIHtcbiAgICBpZiAobmV3SW50ZXJjZXB0b3JzKSB7XG4gICAgICBmb3IgKGxldCBpID0gbmV3SW50ZXJjZXB0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGNvbnN0IGludGVyY2VwdG9yID0gdGhpc1trSW50ZXJjZXB0b3JzXVtpXVxuICAgICAgICBpZiAodHlwZW9mIGludGVyY2VwdG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnRlcmNlcHRvciBtdXN0IGJlIGFuIGZ1bmN0aW9uJylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXNba0ludGVyY2VwdG9yc10gPSBuZXdJbnRlcmNlcHRvcnNcbiAgfVxuXG4gIGNsb3NlIChjYWxsYmFjaykge1xuICAgIGlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLmNsb3NlKChlcnIsIGRhdGEpID0+IHtcbiAgICAgICAgICByZXR1cm4gZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKGRhdGEpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBjYWxsYmFjaycpXG4gICAgfVxuXG4gICAgaWYgKHRoaXNba0Rlc3Ryb3llZF0pIHtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IGNhbGxiYWNrKG5ldyBDbGllbnREZXN0cm95ZWRFcnJvcigpLCBudWxsKSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzW2tDbG9zZWRdKSB7XG4gICAgICBpZiAodGhpc1trT25DbG9zZWRdKSB7XG4gICAgICAgIHRoaXNba09uQ2xvc2VkXS5wdXNoKGNhbGxiYWNrKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2FsbGJhY2sobnVsbCwgbnVsbCkpXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzW2tDbG9zZWRdID0gdHJ1ZVxuICAgIHRoaXNba09uQ2xvc2VkXS5wdXNoKGNhbGxiYWNrKVxuXG4gICAgY29uc3Qgb25DbG9zZWQgPSAoKSA9PiB7XG4gICAgICBjb25zdCBjYWxsYmFja3MgPSB0aGlzW2tPbkNsb3NlZF1cbiAgICAgIHRoaXNba09uQ2xvc2VkXSA9IG51bGxcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNhbGxiYWNrc1tpXShudWxsLCBudWxsKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNob3VsZCBub3QgZXJyb3IuXG4gICAgdGhpc1trQ2xvc2VdKClcbiAgICAgIC50aGVuKCgpID0+IHRoaXMuZGVzdHJveSgpKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBxdWV1ZU1pY3JvdGFzayhvbkNsb3NlZClcbiAgICAgIH0pXG4gIH1cblxuICBkZXN0cm95IChlcnIsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBlcnIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gZXJyXG4gICAgICBlcnIgPSBudWxsXG4gICAgfVxuXG4gICAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMuZGVzdHJveShlcnIsIChlcnIsIGRhdGEpID0+IHtcbiAgICAgICAgICByZXR1cm4gZXJyID8gLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IHNob3VsZCBuZXZlciBlcnJvciAqLyByZWplY3QoZXJyKSA6IHJlc29sdmUoZGF0YSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGNhbGxiYWNrJylcbiAgICB9XG5cbiAgICBpZiAodGhpc1trRGVzdHJveWVkXSkge1xuICAgICAgaWYgKHRoaXNba09uRGVzdHJveWVkXSkge1xuICAgICAgICB0aGlzW2tPbkRlc3Ryb3llZF0ucHVzaChjYWxsYmFjaylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IGNhbGxiYWNrKG51bGwsIG51bGwpKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFlcnIpIHtcbiAgICAgIGVyciA9IG5ldyBDbGllbnREZXN0cm95ZWRFcnJvcigpXG4gICAgfVxuXG4gICAgdGhpc1trRGVzdHJveWVkXSA9IHRydWVcbiAgICB0aGlzW2tPbkRlc3Ryb3llZF0gPSB0aGlzW2tPbkRlc3Ryb3llZF0gfHwgW11cbiAgICB0aGlzW2tPbkRlc3Ryb3llZF0ucHVzaChjYWxsYmFjaylcblxuICAgIGNvbnN0IG9uRGVzdHJveWVkID0gKCkgPT4ge1xuICAgICAgY29uc3QgY2FsbGJhY2tzID0gdGhpc1trT25EZXN0cm95ZWRdXG4gICAgICB0aGlzW2tPbkRlc3Ryb3llZF0gPSBudWxsXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjYWxsYmFja3NbaV0obnVsbCwgbnVsbClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTaG91bGQgbm90IGVycm9yLlxuICAgIHRoaXNba0Rlc3Ryb3ldKGVycikudGhlbigoKSA9PiB7XG4gICAgICBxdWV1ZU1pY3JvdGFzayhvbkRlc3Ryb3llZClcbiAgICB9KVxuICB9XG5cbiAgW2tJbnRlcmNlcHRlZERpc3BhdGNoXSAob3B0cywgaGFuZGxlcikge1xuICAgIGlmICghdGhpc1trSW50ZXJjZXB0b3JzXSB8fCB0aGlzW2tJbnRlcmNlcHRvcnNdLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpc1trSW50ZXJjZXB0ZWREaXNwYXRjaF0gPSB0aGlzW2tEaXNwYXRjaF1cbiAgICAgIHJldHVybiB0aGlzW2tEaXNwYXRjaF0ob3B0cywgaGFuZGxlcilcbiAgICB9XG5cbiAgICBsZXQgZGlzcGF0Y2ggPSB0aGlzW2tEaXNwYXRjaF0uYmluZCh0aGlzKVxuICAgIGZvciAobGV0IGkgPSB0aGlzW2tJbnRlcmNlcHRvcnNdLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBkaXNwYXRjaCA9IHRoaXNba0ludGVyY2VwdG9yc11baV0oZGlzcGF0Y2gpXG4gICAgfVxuICAgIHRoaXNba0ludGVyY2VwdGVkRGlzcGF0Y2hdID0gZGlzcGF0Y2hcbiAgICByZXR1cm4gZGlzcGF0Y2gob3B0cywgaGFuZGxlcilcbiAgfVxuXG4gIGRpc3BhdGNoIChvcHRzLCBoYW5kbGVyKSB7XG4gICAgaWYgKCFoYW5kbGVyIHx8IHR5cGVvZiBoYW5kbGVyICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdoYW5kbGVyIG11c3QgYmUgYW4gb2JqZWN0JylcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaWYgKCFvcHRzIHx8IHR5cGVvZiBvcHRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ29wdHMgbXVzdCBiZSBhbiBvYmplY3QuJylcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXNba0Rlc3Ryb3llZF0gfHwgdGhpc1trT25EZXN0cm95ZWRdKSB7XG4gICAgICAgIHRocm93IG5ldyBDbGllbnREZXN0cm95ZWRFcnJvcigpXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzW2tDbG9zZWRdKSB7XG4gICAgICAgIHRocm93IG5ldyBDbGllbnRDbG9zZWRFcnJvcigpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzW2tJbnRlcmNlcHRlZERpc3BhdGNoXShvcHRzLCBoYW5kbGVyKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyLm9uRXJyb3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9uRXJyb3IgbWV0aG9kJylcbiAgICAgIH1cblxuICAgICAgaGFuZGxlci5vbkVycm9yKGVycilcblxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRGlzcGF0Y2hlckJhc2VcbiIsIid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIFRoaXMgbW9kdWxlIG9mZmVycyBhbiBvcHRpbWl6ZWQgdGltZXIgaW1wbGVtZW50YXRpb24gZGVzaWduZWQgZm9yIHNjZW5hcmlvc1xuICogd2hlcmUgaGlnaCBwcmVjaXNpb24gaXMgbm90IGNyaXRpY2FsLlxuICpcbiAqIFRoZSB0aW1lciBhY2hpZXZlcyBmYXN0ZXIgcGVyZm9ybWFuY2UgYnkgdXNpbmcgYSBsb3ctcmVzb2x1dGlvbiBhcHByb2FjaCxcbiAqIHdpdGggYW4gYWNjdXJhY3kgdGFyZ2V0IG9mIHdpdGhpbiA1MDBtcy4gVGhpcyBtYWtlcyBpdCBwYXJ0aWN1bGFybHkgdXNlZnVsXG4gKiBmb3IgdGltZXJzIHdpdGggZGVsYXlzIG9mIDEgc2Vjb25kIG9yIG1vcmUsIHdoZXJlIGV4YWN0IHRpbWluZyBpcyBsZXNzXG4gKiBjcnVjaWFsLlxuICpcbiAqIEl0J3MgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBOb2RlLmpzIHRpbWVycyBhcmUgaW5oZXJlbnRseSBpbXByZWNpc2UsIGFzXG4gKiBkZWxheXMgY2FuIG9jY3VyIGR1ZSB0byB0aGUgZXZlbnQgbG9vcCBiZWluZyBibG9ja2VkIGJ5IG90aGVyIG9wZXJhdGlvbnMuXG4gKiBDb25zZXF1ZW50bHksIHRpbWVycyBtYXkgdHJpZ2dlciBsYXRlciB0aGFuIHRoZWlyIHNjaGVkdWxlZCB0aW1lLlxuICovXG5cbi8qKlxuICogVGhlIGZhc3ROb3cgdmFyaWFibGUgY29udGFpbnMgdGhlIGludGVybmFsIGZhc3QgdGltZXIgY2xvY2sgdmFsdWUuXG4gKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xubGV0IGZhc3ROb3cgPSAwXG5cbi8qKlxuICogUkVTT0xVVElPTl9NUyByZXByZXNlbnRzIHRoZSB0YXJnZXQgcmVzb2x1dGlvbiB0aW1lIGluIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQGRlZmF1bHQgMTAwMFxuICovXG5jb25zdCBSRVNPTFVUSU9OX01TID0gMWUzXG5cbi8qKlxuICogVElDS19NUyBkZWZpbmVzIHRoZSBkZXNpcmVkIGludGVydmFsIGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIGVhY2ggdGljay5cbiAqIFRoZSB0YXJnZXQgdmFsdWUgaXMgc2V0IHRvIGhhbGYgdGhlIHJlc29sdXRpb24gdGltZSwgbWludXMgMSBtcywgdG8gYWNjb3VudFxuICogZm9yIHBvdGVudGlhbCBldmVudCBsb29wIG92ZXJoZWFkLlxuICpcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKiBAZGVmYXVsdCA0OTlcbiAqL1xuY29uc3QgVElDS19NUyA9IChSRVNPTFVUSU9OX01TID4+IDEpIC0gMVxuXG4vKipcbiAqIGZhc3ROb3dUaW1lb3V0IGlzIGEgTm9kZS5qcyB0aW1lciB1c2VkIHRvIG1hbmFnZSBhbmQgcHJvY2Vzc1xuICogdGhlIEZhc3RUaW1lcnMgc3RvcmVkIGluIHRoZSBgZmFzdFRpbWVyc2AgYXJyYXkuXG4gKlxuICogQHR5cGUge05vZGVKUy5UaW1lb3V0fVxuICovXG5sZXQgZmFzdE5vd1RpbWVvdXRcblxuLyoqXG4gKiBUaGUga0Zhc3RUaW1lciBzeW1ib2wgaXMgdXNlZCB0byBpZGVudGlmeSBGYXN0VGltZXIgaW5zdGFuY2VzLlxuICpcbiAqIEB0eXBlIHtTeW1ib2x9XG4gKi9cbmNvbnN0IGtGYXN0VGltZXIgPSBTeW1ib2woJ2tGYXN0VGltZXInKVxuXG4vKipcbiAqIFRoZSBmYXN0VGltZXJzIGFycmF5IGNvbnRhaW5zIGFsbCBhY3RpdmUgRmFzdFRpbWVycy5cbiAqXG4gKiBAdHlwZSB7RmFzdFRpbWVyW119XG4gKi9cbmNvbnN0IGZhc3RUaW1lcnMgPSBbXVxuXG4vKipcbiAqIFRoZXNlIGNvbnN0YW50cyByZXByZXNlbnQgdGhlIHZhcmlvdXMgc3RhdGVzIG9mIGEgRmFzdFRpbWVyLlxuICovXG5cbi8qKlxuICogVGhlIGBOT1RfSU5fTElTVGAgY29uc3RhbnQgaW5kaWNhdGVzIHRoYXQgdGhlIEZhc3RUaW1lciBpcyBub3QgaW5jbHVkZWRcbiAqIGluIHRoZSBgZmFzdFRpbWVyc2AgYXJyYXkuIFRpbWVycyB3aXRoIHRoaXMgc3RhdHVzIHdpbGwgbm90IGJlIHByb2Nlc3NlZFxuICogZHVyaW5nIHRoZSBuZXh0IHRpY2sgYnkgdGhlIGBvblRpY2tgIGZ1bmN0aW9uLlxuICpcbiAqIEEgRmFzdFRpbWVyIGNhbiBiZSByZS1hZGRlZCB0byB0aGUgYGZhc3RUaW1lcnNgIGFycmF5IGJ5IGludm9raW5nIHRoZVxuICogYHJlZnJlc2hgIG1ldGhvZCBvbiB0aGUgRmFzdFRpbWVyIGluc3RhbmNlLlxuICpcbiAqIEB0eXBlIHstMn1cbiAqL1xuY29uc3QgTk9UX0lOX0xJU1QgPSAtMlxuXG4vKipcbiAqIFRoZSBgVE9fQkVfQ0xFQVJFRGAgY29uc3RhbnQgaW5kaWNhdGVzIHRoYXQgdGhlIEZhc3RUaW1lciBpcyBzY2hlZHVsZWRcbiAqIGZvciByZW1vdmFsIGZyb20gdGhlIGBmYXN0VGltZXJzYCBhcnJheS4gQSBGYXN0VGltZXIgaW4gdGhpcyBzdGF0ZSB3aWxsXG4gKiBiZSByZW1vdmVkIGluIHRoZSBuZXh0IHRpY2sgYnkgdGhlIGBvblRpY2tgIGZ1bmN0aW9uIGFuZCB3aWxsIG5vIGxvbmdlclxuICogYmUgcHJvY2Vzc2VkLlxuICpcbiAqIFRoaXMgc3RhdHVzIGlzIGFsc28gc2V0IHdoZW4gdGhlIGBjbGVhcmAgbWV0aG9kIGlzIGNhbGxlZCBvbiB0aGUgRmFzdFRpbWVyIGluc3RhbmNlLlxuICpcbiAqIEB0eXBlIHstMX1cbiAqL1xuY29uc3QgVE9fQkVfQ0xFQVJFRCA9IC0xXG5cbi8qKlxuICogVGhlIGBQRU5ESU5HYCBjb25zdGFudCBzaWduaWZpZXMgdGhhdCB0aGUgRmFzdFRpbWVyIGlzIGF3YWl0aW5nIHByb2Nlc3NpbmdcbiAqIGluIHRoZSBuZXh0IHRpY2sgYnkgdGhlIGBvblRpY2tgIGZ1bmN0aW9uLiBUaW1lcnMgd2l0aCB0aGlzIHN0YXR1cyB3aWxsIGhhdmVcbiAqIHRoZWlyIGBfaWRsZVN0YXJ0YCB2YWx1ZSBzZXQgYW5kIHRoZWlyIHN0YXR1cyB1cGRhdGVkIHRvIGBBQ1RJVkVgIGluIHRoZSBuZXh0IHRpY2suXG4gKlxuICogQHR5cGUgezB9XG4gKi9cbmNvbnN0IFBFTkRJTkcgPSAwXG5cbi8qKlxuICogVGhlIGBBQ1RJVkVgIGNvbnN0YW50IGluZGljYXRlcyB0aGF0IHRoZSBGYXN0VGltZXIgaXMgYWN0aXZlIGFuZCB3YWl0aW5nXG4gKiBmb3IgaXRzIHRpbWVyIHRvIGV4cGlyZS4gRHVyaW5nIHRoZSBuZXh0IHRpY2ssIHRoZSBgb25UaWNrYCBmdW5jdGlvbiB3aWxsXG4gKiBjaGVjayBpZiB0aGUgdGltZXIgaGFzIGV4cGlyZWQsIGFuZCBpZiBzbywgaXQgd2lsbCBleGVjdXRlIHRoZSBhc3NvY2lhdGVkIGNhbGxiYWNrLlxuICpcbiAqIEB0eXBlIHsxfVxuICovXG5jb25zdCBBQ1RJVkUgPSAxXG5cbi8qKlxuICogVGhlIG9uVGljayBmdW5jdGlvbiBwcm9jZXNzZXMgdGhlIGZhc3RUaW1lcnMgYXJyYXkuXG4gKlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIG9uVGljayAoKSB7XG4gIC8qKlxuICAgKiBJbmNyZW1lbnQgdGhlIGZhc3ROb3cgdmFsdWUgYnkgdGhlIFRJQ0tfTVMgdmFsdWUsIGRlc3BpdGUgdGhlIGFjdHVhbCB0aW1lXG4gICAqIHRoYXQgaGFzIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCB0aWNrLiBUaGlzIGFwcHJvYWNoIGVuc3VyZXMgaW5kZXBlbmRlbmNlXG4gICAqIGZyb20gdGhlIHN5c3RlbSBjbG9jayBhbmQgZGVsYXlzIGNhdXNlZCBieSBhIGJsb2NrZWQgZXZlbnQgbG9vcC5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGZhc3ROb3cgKz0gVElDS19NU1xuXG4gIC8qKlxuICAgKiBUaGUgYGlkeGAgdmFyaWFibGUgaXMgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGBmYXN0VGltZXJzYCBhcnJheS5cbiAgICogRXhwaXJlZCB0aW1lcnMgYXJlIHJlbW92ZWQgYnkgcmVwbGFjaW5nIHRoZW0gd2l0aCB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSBhcnJheS5cbiAgICogQ29uc2VxdWVudGx5LCBgaWR4YCBpcyBvbmx5IGluY3JlbWVudGVkIHdoZW4gdGhlIGN1cnJlbnQgZWxlbWVudCBpcyBub3QgcmVtb3ZlZC5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGxldCBpZHggPSAwXG5cbiAgLyoqXG4gICAqIFRoZSBsZW4gdmFyaWFibGUgd2lsbCBjb250YWluIHRoZSBsZW5ndGggb2YgdGhlIGZhc3RUaW1lcnMgYXJyYXlcbiAgICogYW5kIHdpbGwgYmUgZGVjcmVtZW50ZWQgd2hlbiBhIEZhc3RUaW1lciBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZVxuICAgKiBmYXN0VGltZXJzIGFycmF5LlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgbGV0IGxlbiA9IGZhc3RUaW1lcnMubGVuZ3RoXG5cbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtGYXN0VGltZXJ9XG4gICAgICovXG4gICAgY29uc3QgdGltZXIgPSBmYXN0VGltZXJzW2lkeF1cblxuICAgIC8vIElmIHRoZSB0aW1lciBpcyBpbiB0aGUgQUNUSVZFIHN0YXRlIGFuZCB0aGUgdGltZXIgaGFzIGV4cGlyZWQsIGl0IHdpbGxcbiAgICAvLyBiZSBwcm9jZXNzZWQgaW4gdGhlIG5leHQgdGljay5cbiAgICBpZiAodGltZXIuX3N0YXRlID09PSBQRU5ESU5HKSB7XG4gICAgICAvLyBTZXQgdGhlIF9pZGxlU3RhcnQgdmFsdWUgdG8gdGhlIGZhc3ROb3cgdmFsdWUgbWludXMgdGhlIFRJQ0tfTVMgdmFsdWVcbiAgICAgIC8vIHRvIGFjY291bnQgZm9yIHRoZSB0aW1lIHRoZSB0aW1lciB3YXMgaW4gdGhlIFBFTkRJTkcgc3RhdGUuXG4gICAgICB0aW1lci5faWRsZVN0YXJ0ID0gZmFzdE5vdyAtIFRJQ0tfTVNcbiAgICAgIHRpbWVyLl9zdGF0ZSA9IEFDVElWRVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aW1lci5fc3RhdGUgPT09IEFDVElWRSAmJlxuICAgICAgZmFzdE5vdyA+PSB0aW1lci5faWRsZVN0YXJ0ICsgdGltZXIuX2lkbGVUaW1lb3V0XG4gICAgKSB7XG4gICAgICB0aW1lci5fc3RhdGUgPSBUT19CRV9DTEVBUkVEXG4gICAgICB0aW1lci5faWRsZVN0YXJ0ID0gLTFcbiAgICAgIHRpbWVyLl9vblRpbWVvdXQodGltZXIuX3RpbWVyQXJnKVxuICAgIH1cblxuICAgIGlmICh0aW1lci5fc3RhdGUgPT09IFRPX0JFX0NMRUFSRUQpIHtcbiAgICAgIHRpbWVyLl9zdGF0ZSA9IE5PVF9JTl9MSVNUXG5cbiAgICAgIC8vIE1vdmUgdGhlIGxhc3QgZWxlbWVudCB0byB0aGUgY3VycmVudCBpbmRleCBhbmQgZGVjcmVtZW50IGxlbiBpZiBpdCBpc1xuICAgICAgLy8gbm90IHRoZSBvbmx5IGVsZW1lbnQgaW4gdGhlIGFycmF5LlxuICAgICAgaWYgKC0tbGVuICE9PSAwKSB7XG4gICAgICAgIGZhc3RUaW1lcnNbaWR4XSA9IGZhc3RUaW1lcnNbbGVuXVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICArK2lkeFxuICAgIH1cbiAgfVxuXG4gIC8vIFNldCB0aGUgbGVuZ3RoIG9mIHRoZSBmYXN0VGltZXJzIGFycmF5IHRvIHRoZSBuZXcgbGVuZ3RoIGFuZCB0aHVzXG4gIC8vIHJlbW92aW5nIHRoZSBleGNlc3MgRmFzdFRpbWVycyBlbGVtZW50cyBmcm9tIHRoZSBhcnJheS5cbiAgZmFzdFRpbWVycy5sZW5ndGggPSBsZW5cblxuICAvLyBJZiB0aGVyZSBhcmUgc3RpbGwgYWN0aXZlIEZhc3RUaW1lcnMgaW4gdGhlIGFycmF5LCByZWZyZXNoIHRoZSBUaW1lci5cbiAgLy8gSWYgdGhlcmUgYXJlIG5vIGFjdGl2ZSBGYXN0VGltZXJzLCB0aGUgdGltZXIgd2lsbCBiZSByZWZyZXNoZWQgYWdhaW5cbiAgLy8gd2hlbiBhIG5ldyBGYXN0VGltZXIgaXMgaW5zdGFudGlhdGVkLlxuICBpZiAoZmFzdFRpbWVycy5sZW5ndGggIT09IDApIHtcbiAgICByZWZyZXNoVGltZW91dCgpXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVmcmVzaFRpbWVvdXQgKCkge1xuICAvLyBJZiB0aGUgZmFzdE5vd1RpbWVvdXQgaXMgYWxyZWFkeSBzZXQsIHJlZnJlc2ggaXQuXG4gIGlmIChmYXN0Tm93VGltZW91dCkge1xuICAgIGZhc3ROb3dUaW1lb3V0LnJlZnJlc2goKVxuICAvLyBmYXN0Tm93VGltZW91dCBpcyBub3QgaW5zdGFudGlhdGVkIHlldCwgY3JlYXRlIGEgbmV3IFRpbWVyLlxuICB9IGVsc2Uge1xuICAgIGNsZWFyVGltZW91dChmYXN0Tm93VGltZW91dClcbiAgICBmYXN0Tm93VGltZW91dCA9IHNldFRpbWVvdXQob25UaWNrLCBUSUNLX01TKVxuXG4gICAgLy8gSWYgdGhlIFRpbWVyIGhhcyBhbiB1bnJlZiBtZXRob2QsIGNhbGwgaXQgdG8gYWxsb3cgdGhlIHByb2Nlc3MgdG8gZXhpdCBpZlxuICAgIC8vIHRoZXJlIGFyZSBubyBvdGhlciBhY3RpdmUgaGFuZGxlcy5cbiAgICBpZiAoZmFzdE5vd1RpbWVvdXQudW5yZWYpIHtcbiAgICAgIGZhc3ROb3dUaW1lb3V0LnVucmVmKClcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgYEZhc3RUaW1lcmAgY2xhc3MgaXMgYSBkYXRhIHN0cnVjdHVyZSBkZXNpZ25lZCB0byBzdG9yZSBhbmQgbWFuYWdlXG4gKiB0aW1lciBpbmZvcm1hdGlvbi5cbiAqL1xuY2xhc3MgRmFzdFRpbWVyIHtcbiAgW2tGYXN0VGltZXJdID0gdHJ1ZVxuXG4gIC8qKlxuICAgKiBUaGUgc3RhdGUgb2YgdGhlIHRpbWVyLCB3aGljaCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG4gICAqIC0gTk9UX0lOX0xJU1QgKC0yKVxuICAgKiAtIFRPX0JFX0NMRUFSRUQgKC0xKVxuICAgKiAtIFBFTkRJTkcgKDApXG4gICAqIC0gQUNUSVZFICgxKVxuICAgKlxuICAgKiBAdHlwZSB7LTJ8LTF8MHwxfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3N0YXRlID0gTk9UX0lOX0xJU1RcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgY2FsbGluZyB0aGUgY2FsbGJhY2suXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfaWRsZVRpbWVvdXQgPSAtMVxuXG4gIC8qKlxuICAgKiBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgd2hlbiB0aGUgdGltZXIgd2FzIHN0YXJ0ZWQuIFRoaXMgdmFsdWUgaXMgdXNlZCB0b1xuICAgKiBjYWxjdWxhdGUgd2hlbiB0aGUgdGltZXIgc2hvdWxkIGV4cGlyZS5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgLTFcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9pZGxlU3RhcnQgPSAtMVxuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiB0aGUgdGltZXIgZXhwaXJlcy5cbiAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29uVGltZW91dFxuXG4gIC8qKlxuICAgKiBUaGUgYXJndW1lbnQgdG8gYmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayB3aGVuIHRoZSB0aW1lciBleHBpcmVzLlxuICAgKlxuICAgKiBAdHlwZSB7Kn1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF90aW1lckFyZ1xuXG4gIC8qKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhZnRlciB0aGUgdGltZXJcbiAgICogZXhwaXJlcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGRlbGF5IFRoZSB0aW1lLCBpbiBtaWxsaXNlY29uZHMgdGhhdCB0aGUgdGltZXIgc2hvdWxkIHdhaXRcbiAgICogYmVmb3JlIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gb3IgY29kZSBpcyBleGVjdXRlZC5cbiAgICogQHBhcmFtIHsqfSBhcmdcbiAgICovXG4gIGNvbnN0cnVjdG9yIChjYWxsYmFjaywgZGVsYXksIGFyZykge1xuICAgIHRoaXMuX29uVGltZW91dCA9IGNhbGxiYWNrXG4gICAgdGhpcy5faWRsZVRpbWVvdXQgPSBkZWxheVxuICAgIHRoaXMuX3RpbWVyQXJnID0gYXJnXG5cbiAgICB0aGlzLnJlZnJlc2goKVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHRpbWVyJ3Mgc3RhcnQgdGltZSB0byB0aGUgY3VycmVudCB0aW1lLCBhbmQgcmVzY2hlZHVsZXMgdGhlIHRpbWVyXG4gICAqIHRvIGNhbGwgaXRzIGNhbGxiYWNrIGF0IHRoZSBwcmV2aW91c2x5IHNwZWNpZmllZCBkdXJhdGlvbiBhZGp1c3RlZCB0byB0aGVcbiAgICogY3VycmVudCB0aW1lLlxuICAgKiBVc2luZyB0aGlzIG9uIGEgdGltZXIgdGhhdCBoYXMgYWxyZWFkeSBjYWxsZWQgaXRzIGNhbGxiYWNrIHdpbGwgcmVhY3RpdmF0ZVxuICAgKiB0aGUgdGltZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcmVmcmVzaCAoKSB7XG4gICAgLy8gSW4gdGhlIHNwZWNpYWwgY2FzZSB0aGF0IHRoZSB0aW1lciBpcyBub3QgaW4gdGhlIGxpc3Qgb2YgYWN0aXZlIHRpbWVycyxcbiAgICAvLyBhZGQgaXQgYmFjayB0byB0aGUgYXJyYXkgdG8gYmUgcHJvY2Vzc2VkIGluIHRoZSBuZXh0IHRpY2sgYnkgdGhlIG9uVGlja1xuICAgIC8vIGZ1bmN0aW9uLlxuICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gTk9UX0lOX0xJU1QpIHtcbiAgICAgIGZhc3RUaW1lcnMucHVzaCh0aGlzKVxuICAgIH1cblxuICAgIC8vIElmIHRoZSB0aW1lciBpcyB0aGUgb25seSBhY3RpdmUgdGltZXIsIHJlZnJlc2ggdGhlIGZhc3ROb3dUaW1lb3V0IGZvclxuICAgIC8vIGJldHRlciByZXNvbHV0aW9uLlxuICAgIGlmICghZmFzdE5vd1RpbWVvdXQgfHwgZmFzdFRpbWVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJlZnJlc2hUaW1lb3V0KClcbiAgICB9XG5cbiAgICAvLyBTZXR0aW5nIHRoZSBzdGF0ZSB0byBQRU5ESU5HIHdpbGwgY2F1c2UgdGhlIHRpbWVyIHRvIGJlIHJlc2V0IGluIHRoZVxuICAgIC8vIG5leHQgdGljayBieSB0aGUgb25UaWNrIGZ1bmN0aW9uLlxuICAgIHRoaXMuX3N0YXRlID0gUEVORElOR1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBgY2xlYXJgIG1ldGhvZCBjYW5jZWxzIHRoZSB0aW1lciwgcHJldmVudGluZyBpdCBmcm9tIGV4ZWN1dGluZy5cbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjbGVhciAoKSB7XG4gICAgLy8gU2V0IHRoZSBzdGF0ZSB0byBUT19CRV9DTEVBUkVEIHRvIG1hcmsgdGhlIHRpbWVyIGZvciByZW1vdmFsIGluIHRoZSBuZXh0XG4gICAgLy8gdGljayBieSB0aGUgb25UaWNrIGZ1bmN0aW9uLlxuICAgIHRoaXMuX3N0YXRlID0gVE9fQkVfQ0xFQVJFRFxuXG4gICAgLy8gUmVzZXQgdGhlIF9pZGxlU3RhcnQgdmFsdWUgdG8gLTEgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdGltZXIgaXMgbm8gbG9uZ2VyXG4gICAgLy8gYWN0aXZlLlxuICAgIHRoaXMuX2lkbGVTdGFydCA9IC0xXG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIG1vZHVsZSBleHBvcnRzIGEgc2V0VGltZW91dCBhbmQgY2xlYXJUaW1lb3V0IGZ1bmN0aW9uIHRoYXQgY2FuIGJlXG4gKiB1c2VkIGFzIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgdGhlIG5hdGl2ZSBmdW5jdGlvbnMuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvKipcbiAgICogVGhlIHNldFRpbWVvdXQoKSBtZXRob2Qgc2V0cyBhIHRpbWVyIHdoaWNoIGV4ZWN1dGVzIGEgZnVuY3Rpb24gb25jZSB0aGVcbiAgICogdGltZXIgZXhwaXJlcy5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhZnRlciB0aGUgdGltZXJcbiAgICogZXhwaXJlcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGRlbGF5IFRoZSB0aW1lLCBpbiBtaWxsaXNlY29uZHMgdGhhdCB0aGUgdGltZXIgc2hvdWxkXG4gICAqIHdhaXQgYmVmb3JlIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gb3IgY29kZSBpcyBleGVjdXRlZC5cbiAgICogQHBhcmFtIHsqfSBbYXJnXSBBbiBvcHRpb25hbCBhcmd1bWVudCB0byBiZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqIHdoZW4gdGhlIHRpbWVyIGV4cGlyZXMuXG4gICAqIEByZXR1cm5zIHtOb2RlSlMuVGltZW91dHxGYXN0VGltZXJ9XG4gICAqL1xuICBzZXRUaW1lb3V0IChjYWxsYmFjaywgZGVsYXksIGFyZykge1xuICAgIC8vIElmIHRoZSBkZWxheSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIFJFU09MVVRJT05fTVMgdmFsdWUgcmV0dXJuIGFcbiAgICAvLyBuYXRpdmUgTm9kZS5qcyBUaW1lciBpbnN0YW5jZS5cbiAgICByZXR1cm4gZGVsYXkgPD0gUkVTT0xVVElPTl9NU1xuICAgICAgPyBzZXRUaW1lb3V0KGNhbGxiYWNrLCBkZWxheSwgYXJnKVxuICAgICAgOiBuZXcgRmFzdFRpbWVyKGNhbGxiYWNrLCBkZWxheSwgYXJnKVxuICB9LFxuICAvKipcbiAgICogVGhlIGNsZWFyVGltZW91dCBtZXRob2QgY2FuY2VscyBhbiBpbnN0YW50aWF0ZWQgVGltZXIgcHJldmlvdXNseSBjcmVhdGVkXG4gICAqIGJ5IGNhbGxpbmcgc2V0VGltZW91dC5cbiAgICpcbiAgICogQHBhcmFtIHtOb2RlSlMuVGltZW91dHxGYXN0VGltZXJ9IHRpbWVvdXRcbiAgICovXG4gIGNsZWFyVGltZW91dCAodGltZW91dCkge1xuICAgIC8vIElmIHRoZSB0aW1lb3V0IGlzIGEgRmFzdFRpbWVyLCBjYWxsIGl0cyBvd24gY2xlYXIgbWV0aG9kLlxuICAgIGlmICh0aW1lb3V0W2tGYXN0VGltZXJdKSB7XG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHtGYXN0VGltZXJ9XG4gICAgICAgKi9cbiAgICAgIHRpbWVvdXQuY2xlYXIoKVxuICAgICAgLy8gT3RoZXJ3aXNlIGl0IGlzIGFuIGluc3RhbmNlIG9mIGEgbmF0aXZlIE5vZGVKUy5UaW1lb3V0LCBzbyBjYWxsIHRoZVxuICAgICAgLy8gTm9kZS5qcyBuYXRpdmUgY2xlYXJUaW1lb3V0IGZ1bmN0aW9uLlxuICAgIH0gZWxzZSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dClcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBUaGUgc2V0RmFzdFRpbWVvdXQoKSBtZXRob2Qgc2V0cyBhIGZhc3RUaW1lciB3aGljaCBleGVjdXRlcyBhIGZ1bmN0aW9uIG9uY2VcbiAgICogdGhlIHRpbWVyIGV4cGlyZXMuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHRpbWVyXG4gICAqIGV4cGlyZXMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxheSBUaGUgdGltZSwgaW4gbWlsbGlzZWNvbmRzIHRoYXQgdGhlIHRpbWVyIHNob3VsZFxuICAgKiB3YWl0IGJlZm9yZSB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIG9yIGNvZGUgaXMgZXhlY3V0ZWQuXG4gICAqIEBwYXJhbSB7Kn0gW2FyZ10gQW4gb3B0aW9uYWwgYXJndW1lbnQgdG8gYmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvblxuICAgKiB3aGVuIHRoZSB0aW1lciBleHBpcmVzLlxuICAgKiBAcmV0dXJucyB7RmFzdFRpbWVyfVxuICAgKi9cbiAgc2V0RmFzdFRpbWVvdXQgKGNhbGxiYWNrLCBkZWxheSwgYXJnKSB7XG4gICAgcmV0dXJuIG5ldyBGYXN0VGltZXIoY2FsbGJhY2ssIGRlbGF5LCBhcmcpXG4gIH0sXG4gIC8qKlxuICAgKiBUaGUgY2xlYXJUaW1lb3V0IG1ldGhvZCBjYW5jZWxzIGFuIGluc3RhbnRpYXRlZCBGYXN0VGltZXIgcHJldmlvdXNseVxuICAgKiBjcmVhdGVkIGJ5IGNhbGxpbmcgc2V0RmFzdFRpbWVvdXQuXG4gICAqXG4gICAqIEBwYXJhbSB7RmFzdFRpbWVyfSB0aW1lb3V0XG4gICAqL1xuICBjbGVhckZhc3RUaW1lb3V0ICh0aW1lb3V0KSB7XG4gICAgdGltZW91dC5jbGVhcigpXG4gIH0sXG4gIC8qKlxuICAgKiBUaGUgbm93IG1ldGhvZCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgaW50ZXJuYWwgZmFzdCB0aW1lciBjbG9jay5cbiAgICpcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIG5vdyAoKSB7XG4gICAgcmV0dXJuIGZhc3ROb3dcbiAgfSxcbiAgLyoqXG4gICAqIFRyaWdnZXIgdGhlIG9uVGljayBmdW5jdGlvbiB0byBwcm9jZXNzIHRoZSBmYXN0VGltZXJzIGFycmF5LlxuICAgKiBFeHBvcnRlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LlxuICAgKiBNYXJraW5nIGFzIGRlcHJlY2F0ZWQgdG8gZGlzY291cmFnZSBhbnkgdXNlIG91dHNpZGUgb2YgdGVzdGluZy5cbiAgICogQGRlcHJlY2F0ZWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheT0wXSBUaGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzIHRvIGFkZCB0byB0aGUgbm93IHZhbHVlLlxuICAgKi9cbiAgdGljayAoZGVsYXkgPSAwKSB7XG4gICAgZmFzdE5vdyArPSBkZWxheSAtIFJFU09MVVRJT05fTVMgKyAxXG4gICAgb25UaWNrKClcbiAgICBvblRpY2soKVxuICB9LFxuICAvKipcbiAgICogUmVzZXQgRmFzdFRpbWVycy5cbiAgICogRXhwb3J0ZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS5cbiAgICogTWFya2luZyBhcyBkZXByZWNhdGVkIHRvIGRpc2NvdXJhZ2UgYW55IHVzZSBvdXRzaWRlIG9mIHRlc3RpbmcuXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICByZXNldCAoKSB7XG4gICAgZmFzdE5vdyA9IDBcbiAgICBmYXN0VGltZXJzLmxlbmd0aCA9IDBcbiAgICBjbGVhclRpbWVvdXQoZmFzdE5vd1RpbWVvdXQpXG4gICAgZmFzdE5vd1RpbWVvdXQgPSBudWxsXG4gIH0sXG4gIC8qKlxuICAgKiBFeHBvcnRpbmcgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS5cbiAgICogTWFya2luZyBhcyBkZXByZWNhdGVkIHRvIGRpc2NvdXJhZ2UgYW55IHVzZSBvdXRzaWRlIG9mIHRlc3RpbmcuXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBrRmFzdFRpbWVyXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgbmV0ID0gcmVxdWlyZSgnbm9kZTpuZXQnKVxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnbm9kZTphc3NlcnQnKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yLCBDb25uZWN0VGltZW91dEVycm9yIH0gPSByZXF1aXJlKCcuL2Vycm9ycycpXG5jb25zdCB0aW1lcnMgPSByZXF1aXJlKCcuLi91dGlsL3RpbWVycycpXG5cbmZ1bmN0aW9uIG5vb3AgKCkge31cblxubGV0IHRscyAvLyBpbmNsdWRlIHRscyBjb25kaXRpb25hbGx5IHNpbmNlIGl0IGlzIG5vdCBhbHdheXMgYXZhaWxhYmxlXG5cbi8vIFRPRE86IHNlc3Npb24gcmUtdXNlIGRvZXMgbm90IHdhaXQgZm9yIHRoZSBmaXJzdFxuLy8gY29ubmVjdGlvbiB0byByZXNvbHZlIHRoZSBzZXNzaW9uIGFuZCBtaWdodCB0aGVyZWZvcmVcbi8vIHJlc29sdmUgdGhlIHNhbWUgc2VydmVybmFtZSBtdWx0aXBsZSB0aW1lcyBldmVuIHdoZW5cbi8vIHJlLXVzZSBpcyBlbmFibGVkLlxuXG5sZXQgU2Vzc2lvbkNhY2hlXG4vLyBGSVhNRTogcmVtb3ZlIHdvcmthcm91bmQgd2hlbiB0aGUgTm9kZSBidWcgaXMgZml4ZWRcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvNDkzNDQjaXNzdWVjb21tZW50LTE3NDE3NzYzMDhcbmlmIChnbG9iYWwuRmluYWxpemF0aW9uUmVnaXN0cnkgJiYgIShwcm9jZXNzLmVudi5OT0RFX1Y4X0NPVkVSQUdFIHx8IHByb2Nlc3MuZW52LlVORElDSV9OT19GRykpIHtcbiAgU2Vzc2lvbkNhY2hlID0gY2xhc3MgV2Vha1Nlc3Npb25DYWNoZSB7XG4gICAgY29uc3RydWN0b3IgKG1heENhY2hlZFNlc3Npb25zKSB7XG4gICAgICB0aGlzLl9tYXhDYWNoZWRTZXNzaW9ucyA9IG1heENhY2hlZFNlc3Npb25zXG4gICAgICB0aGlzLl9zZXNzaW9uQ2FjaGUgPSBuZXcgTWFwKClcbiAgICAgIHRoaXMuX3Nlc3Npb25SZWdpc3RyeSA9IG5ldyBnbG9iYWwuRmluYWxpemF0aW9uUmVnaXN0cnkoKGtleSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fc2Vzc2lvbkNhY2hlLnNpemUgPCB0aGlzLl9tYXhDYWNoZWRTZXNzaW9ucykge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVmID0gdGhpcy5fc2Vzc2lvbkNhY2hlLmdldChrZXkpXG4gICAgICAgIGlmIChyZWYgIT09IHVuZGVmaW5lZCAmJiByZWYuZGVyZWYoKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5fc2Vzc2lvbkNhY2hlLmRlbGV0ZShrZXkpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZ2V0IChzZXNzaW9uS2V5KSB7XG4gICAgICBjb25zdCByZWYgPSB0aGlzLl9zZXNzaW9uQ2FjaGUuZ2V0KHNlc3Npb25LZXkpXG4gICAgICByZXR1cm4gcmVmID8gcmVmLmRlcmVmKCkgOiBudWxsXG4gICAgfVxuXG4gICAgc2V0IChzZXNzaW9uS2V5LCBzZXNzaW9uKSB7XG4gICAgICBpZiAodGhpcy5fbWF4Q2FjaGVkU2Vzc2lvbnMgPT09IDApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3Nlc3Npb25DYWNoZS5zZXQoc2Vzc2lvbktleSwgbmV3IFdlYWtSZWYoc2Vzc2lvbikpXG4gICAgICB0aGlzLl9zZXNzaW9uUmVnaXN0cnkucmVnaXN0ZXIoc2Vzc2lvbiwgc2Vzc2lvbktleSlcbiAgICB9XG4gIH1cbn0gZWxzZSB7XG4gIFNlc3Npb25DYWNoZSA9IGNsYXNzIFNpbXBsZVNlc3Npb25DYWNoZSB7XG4gICAgY29uc3RydWN0b3IgKG1heENhY2hlZFNlc3Npb25zKSB7XG4gICAgICB0aGlzLl9tYXhDYWNoZWRTZXNzaW9ucyA9IG1heENhY2hlZFNlc3Npb25zXG4gICAgICB0aGlzLl9zZXNzaW9uQ2FjaGUgPSBuZXcgTWFwKClcbiAgICB9XG5cbiAgICBnZXQgKHNlc3Npb25LZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXNzaW9uQ2FjaGUuZ2V0KHNlc3Npb25LZXkpXG4gICAgfVxuXG4gICAgc2V0IChzZXNzaW9uS2V5LCBzZXNzaW9uKSB7XG4gICAgICBpZiAodGhpcy5fbWF4Q2FjaGVkU2Vzc2lvbnMgPT09IDApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9zZXNzaW9uQ2FjaGUuc2l6ZSA+PSB0aGlzLl9tYXhDYWNoZWRTZXNzaW9ucykge1xuICAgICAgICAvLyByZW1vdmUgdGhlIG9sZGVzdCBzZXNzaW9uXG4gICAgICAgIGNvbnN0IHsgdmFsdWU6IG9sZGVzdEtleSB9ID0gdGhpcy5fc2Vzc2lvbkNhY2hlLmtleXMoKS5uZXh0KClcbiAgICAgICAgdGhpcy5fc2Vzc2lvbkNhY2hlLmRlbGV0ZShvbGRlc3RLZXkpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3Nlc3Npb25DYWNoZS5zZXQoc2Vzc2lvbktleSwgc2Vzc2lvbilcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRDb25uZWN0b3IgKHsgYWxsb3dIMiwgbWF4Q2FjaGVkU2Vzc2lvbnMsIHNvY2tldFBhdGgsIHRpbWVvdXQsIHNlc3Npb246IGN1c3RvbVNlc3Npb24sIC4uLm9wdHMgfSkge1xuICBpZiAobWF4Q2FjaGVkU2Vzc2lvbnMgIT0gbnVsbCAmJiAoIU51bWJlci5pc0ludGVnZXIobWF4Q2FjaGVkU2Vzc2lvbnMpIHx8IG1heENhY2hlZFNlc3Npb25zIDwgMCkpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ21heENhY2hlZFNlc3Npb25zIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIG9yIHplcm8nKVxuICB9XG5cbiAgY29uc3Qgb3B0aW9ucyA9IHsgcGF0aDogc29ja2V0UGF0aCwgLi4ub3B0cyB9XG4gIGNvbnN0IHNlc3Npb25DYWNoZSA9IG5ldyBTZXNzaW9uQ2FjaGUobWF4Q2FjaGVkU2Vzc2lvbnMgPT0gbnVsbCA/IDEwMCA6IG1heENhY2hlZFNlc3Npb25zKVxuICB0aW1lb3V0ID0gdGltZW91dCA9PSBudWxsID8gMTBlMyA6IHRpbWVvdXRcbiAgYWxsb3dIMiA9IGFsbG93SDIgIT0gbnVsbCA/IGFsbG93SDIgOiBmYWxzZVxuICByZXR1cm4gZnVuY3Rpb24gY29ubmVjdCAoeyBob3N0bmFtZSwgaG9zdCwgcHJvdG9jb2wsIHBvcnQsIHNlcnZlcm5hbWUsIGxvY2FsQWRkcmVzcywgaHR0cFNvY2tldCB9LCBjYWxsYmFjaykge1xuICAgIGxldCBzb2NrZXRcbiAgICBpZiAocHJvdG9jb2wgPT09ICdodHRwczonKSB7XG4gICAgICBpZiAoIXRscykge1xuICAgICAgICB0bHMgPSByZXF1aXJlKCdub2RlOnRscycpXG4gICAgICB9XG4gICAgICBzZXJ2ZXJuYW1lID0gc2VydmVybmFtZSB8fCBvcHRpb25zLnNlcnZlcm5hbWUgfHwgdXRpbC5nZXRTZXJ2ZXJOYW1lKGhvc3QpIHx8IG51bGxcblxuICAgICAgY29uc3Qgc2Vzc2lvbktleSA9IHNlcnZlcm5hbWUgfHwgaG9zdG5hbWVcbiAgICAgIGFzc2VydChzZXNzaW9uS2V5KVxuXG4gICAgICBjb25zdCBzZXNzaW9uID0gY3VzdG9tU2Vzc2lvbiB8fCBzZXNzaW9uQ2FjaGUuZ2V0KHNlc3Npb25LZXkpIHx8IG51bGxcblxuICAgICAgcG9ydCA9IHBvcnQgfHwgNDQzXG5cbiAgICAgIHNvY2tldCA9IHRscy5jb25uZWN0KHtcbiAgICAgICAgaGlnaFdhdGVyTWFyazogMTYzODQsIC8vIFRMUyBpbiBub2RlIGNhbid0IGhhdmUgYmlnZ2VyIEhXTSBhbnl3YXkuLi5cbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgc2VydmVybmFtZSxcbiAgICAgICAgc2Vzc2lvbixcbiAgICAgICAgbG9jYWxBZGRyZXNzLFxuICAgICAgICAvLyBUT0RPKEhUVFAvMik6IEFkZCBzdXBwb3J0IGZvciBoMmNcbiAgICAgICAgQUxQTlByb3RvY29sczogYWxsb3dIMiA/IFsnaHR0cC8xLjEnLCAnaDInXSA6IFsnaHR0cC8xLjEnXSxcbiAgICAgICAgc29ja2V0OiBodHRwU29ja2V0LCAvLyB1cGdyYWRlIHNvY2tldCBjb25uZWN0aW9uXG4gICAgICAgIHBvcnQsXG4gICAgICAgIGhvc3Q6IGhvc3RuYW1lXG4gICAgICB9KVxuXG4gICAgICBzb2NrZXRcbiAgICAgICAgLm9uKCdzZXNzaW9uJywgZnVuY3Rpb24gKHNlc3Npb24pIHtcbiAgICAgICAgICAvLyBUT0RPIChmaXgpOiBDYW4gYSBzZXNzaW9uIGJlY29tZSBpbnZhbGlkIG9uY2UgZXN0YWJsaXNoZWQ/IERvbid0IHRoaW5rIHNvP1xuICAgICAgICAgIHNlc3Npb25DYWNoZS5zZXQoc2Vzc2lvbktleSwgc2Vzc2lvbilcbiAgICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KCFodHRwU29ja2V0LCAnaHR0cFNvY2tldCBjYW4gb25seSBiZSBzZW50IG9uIFRMUyB1cGRhdGUnKVxuXG4gICAgICBwb3J0ID0gcG9ydCB8fCA4MFxuXG4gICAgICBzb2NrZXQgPSBuZXQuY29ubmVjdCh7XG4gICAgICAgIGhpZ2hXYXRlck1hcms6IDY0ICogMTAyNCwgLy8gU2FtZSBhcyBub2RlanMgZnMgc3RyZWFtcy5cbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgbG9jYWxBZGRyZXNzLFxuICAgICAgICBwb3J0LFxuICAgICAgICBob3N0OiBob3N0bmFtZVxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBTZXQgVENQIGtlZXAgYWxpdmUgb3B0aW9ucyBvbiB0aGUgc29ja2V0IGhlcmUgaW5zdGVhZCBvZiBpbiBjb25uZWN0KCkgZm9yIHRoZSBjYXNlIG9mIGFzc2lnbmluZyB0aGUgc29ja2V0XG4gICAgaWYgKG9wdGlvbnMua2VlcEFsaXZlID09IG51bGwgfHwgb3B0aW9ucy5rZWVwQWxpdmUpIHtcbiAgICAgIGNvbnN0IGtlZXBBbGl2ZUluaXRpYWxEZWxheSA9IG9wdGlvbnMua2VlcEFsaXZlSW5pdGlhbERlbGF5ID09PSB1bmRlZmluZWQgPyA2MGUzIDogb3B0aW9ucy5rZWVwQWxpdmVJbml0aWFsRGVsYXlcbiAgICAgIHNvY2tldC5zZXRLZWVwQWxpdmUodHJ1ZSwga2VlcEFsaXZlSW5pdGlhbERlbGF5KVxuICAgIH1cblxuICAgIGNvbnN0IGNsZWFyQ29ubmVjdFRpbWVvdXQgPSBzZXR1cENvbm5lY3RUaW1lb3V0KG5ldyBXZWFrUmVmKHNvY2tldCksIHsgdGltZW91dCwgaG9zdG5hbWUsIHBvcnQgfSlcblxuICAgIHNvY2tldFxuICAgICAgLnNldE5vRGVsYXkodHJ1ZSlcbiAgICAgIC5vbmNlKHByb3RvY29sID09PSAnaHR0cHM6JyA/ICdzZWN1cmVDb25uZWN0JyA6ICdjb25uZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBxdWV1ZU1pY3JvdGFzayhjbGVhckNvbm5lY3RUaW1lb3V0KVxuXG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgIGNvbnN0IGNiID0gY2FsbGJhY2tcbiAgICAgICAgICBjYWxsYmFjayA9IG51bGxcbiAgICAgICAgICBjYihudWxsLCB0aGlzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgcXVldWVNaWNyb3Rhc2soY2xlYXJDb25uZWN0VGltZW91dClcblxuICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICBjb25zdCBjYiA9IGNhbGxiYWNrXG4gICAgICAgICAgY2FsbGJhY2sgPSBudWxsXG4gICAgICAgICAgY2IoZXJyKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgcmV0dXJuIHNvY2tldFxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtXZWFrUmVmPG5ldC5Tb2NrZXQ+fSBzb2NrZXRXZWFrUmVmXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICogQHBhcmFtIHtudW1iZXJ9IG9wdHMudGltZW91dFxuICogQHBhcmFtIHtzdHJpbmd9IG9wdHMuaG9zdG5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBvcHRzLnBvcnRcbiAqIEByZXR1cm5zIHsoKSA9PiB2b2lkfVxuICovXG5jb25zdCBzZXR1cENvbm5lY3RUaW1lb3V0ID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJ1xuICA/IChzb2NrZXRXZWFrUmVmLCBvcHRzKSA9PiB7XG4gICAgICBpZiAoIW9wdHMudGltZW91dCkge1xuICAgICAgICByZXR1cm4gbm9vcFxuICAgICAgfVxuXG4gICAgICBsZXQgczEgPSBudWxsXG4gICAgICBsZXQgczIgPSBudWxsXG4gICAgICBjb25zdCBmYXN0VGltZXIgPSB0aW1lcnMuc2V0RmFzdFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gc2V0SW1tZWRpYXRlIGlzIGFkZGVkIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIHByaW9yaXRpemUgc29ja2V0IGVycm9yIGV2ZW50cyBvdmVyIHRpbWVvdXRzXG4gICAgICAgIHMxID0gc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgLy8gV2luZG93cyBuZWVkcyBhbiBleHRyYSBzZXRJbW1lZGlhdGUgcHJvYmFibHkgZHVlIHRvIGltcGxlbWVudGF0aW9uIGRpZmZlcmVuY2VzIGluIHRoZSBzb2NrZXQgbG9naWNcbiAgICAgICAgICBzMiA9IHNldEltbWVkaWF0ZSgoKSA9PiBvbkNvbm5lY3RUaW1lb3V0KHNvY2tldFdlYWtSZWYuZGVyZWYoKSwgb3B0cykpXG4gICAgICAgIH0pXG4gICAgICB9LCBvcHRzLnRpbWVvdXQpXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICB0aW1lcnMuY2xlYXJGYXN0VGltZW91dChmYXN0VGltZXIpXG4gICAgICAgIGNsZWFySW1tZWRpYXRlKHMxKVxuICAgICAgICBjbGVhckltbWVkaWF0ZShzMilcbiAgICAgIH1cbiAgICB9XG4gIDogKHNvY2tldFdlYWtSZWYsIG9wdHMpID0+IHtcbiAgICAgIGlmICghb3B0cy50aW1lb3V0KSB7XG4gICAgICAgIHJldHVybiBub29wXG4gICAgICB9XG5cbiAgICAgIGxldCBzMSA9IG51bGxcbiAgICAgIGNvbnN0IGZhc3RUaW1lciA9IHRpbWVycy5zZXRGYXN0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyBzZXRJbW1lZGlhdGUgaXMgYWRkZWQgdG8gbWFrZSBzdXJlIHRoYXQgd2UgcHJpb3JpdGl6ZSBzb2NrZXQgZXJyb3IgZXZlbnRzIG92ZXIgdGltZW91dHNcbiAgICAgICAgczEgPSBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICAgIG9uQ29ubmVjdFRpbWVvdXQoc29ja2V0V2Vha1JlZi5kZXJlZigpLCBvcHRzKVxuICAgICAgICB9KVxuICAgICAgfSwgb3B0cy50aW1lb3V0KVxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgdGltZXJzLmNsZWFyRmFzdFRpbWVvdXQoZmFzdFRpbWVyKVxuICAgICAgICBjbGVhckltbWVkaWF0ZShzMSlcbiAgICAgIH1cbiAgICB9XG5cbi8qKlxuICogQHBhcmFtIHtuZXQuU29ja2V0fSBzb2NrZXRcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge251bWJlcn0gb3B0cy50aW1lb3V0XG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5ob3N0bmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IG9wdHMucG9ydFxuICovXG5mdW5jdGlvbiBvbkNvbm5lY3RUaW1lb3V0IChzb2NrZXQsIG9wdHMpIHtcbiAgLy8gVGhlIHNvY2tldCBjb3VsZCBiZSBhbHJlYWR5IGdhcmJhZ2UgY29sbGVjdGVkXG4gIGlmIChzb2NrZXQgPT0gbnVsbCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgbGV0IG1lc3NhZ2UgPSAnQ29ubmVjdCBUaW1lb3V0IEVycm9yJ1xuICBpZiAoQXJyYXkuaXNBcnJheShzb2NrZXQuYXV0b1NlbGVjdEZhbWlseUF0dGVtcHRlZEFkZHJlc3NlcykpIHtcbiAgICBtZXNzYWdlICs9IGAgKGF0dGVtcHRlZCBhZGRyZXNzZXM6ICR7c29ja2V0LmF1dG9TZWxlY3RGYW1pbHlBdHRlbXB0ZWRBZGRyZXNzZXMuam9pbignLCAnKX0sYFxuICB9IGVsc2Uge1xuICAgIG1lc3NhZ2UgKz0gYCAoYXR0ZW1wdGVkIGFkZHJlc3M6ICR7b3B0cy5ob3N0bmFtZX06JHtvcHRzLnBvcnR9LGBcbiAgfVxuXG4gIG1lc3NhZ2UgKz0gYCB0aW1lb3V0OiAke29wdHMudGltZW91dH1tcylgXG5cbiAgdXRpbC5kZXN0cm95KHNvY2tldCwgbmV3IENvbm5lY3RUaW1lb3V0RXJyb3IobWVzc2FnZSkpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gYnVpbGRDb25uZWN0b3JcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5lbnVtVG9NYXAgPSB2b2lkIDA7XG5mdW5jdGlvbiBlbnVtVG9NYXAob2JqKSB7XG4gICAgY29uc3QgcmVzID0ge307XG4gICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJlc1trZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy5lbnVtVG9NYXAgPSBlbnVtVG9NYXA7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU1BFQ0lBTF9IRUFERVJTID0gZXhwb3J0cy5IRUFERVJfU1RBVEUgPSBleHBvcnRzLk1JTk9SID0gZXhwb3J0cy5NQUpPUiA9IGV4cG9ydHMuQ09OTkVDVElPTl9UT0tFTl9DSEFSUyA9IGV4cG9ydHMuSEVBREVSX0NIQVJTID0gZXhwb3J0cy5UT0tFTiA9IGV4cG9ydHMuU1RSSUNUX1RPS0VOID0gZXhwb3J0cy5IRVggPSBleHBvcnRzLlVSTF9DSEFSID0gZXhwb3J0cy5TVFJJQ1RfVVJMX0NIQVIgPSBleHBvcnRzLlVTRVJJTkZPX0NIQVJTID0gZXhwb3J0cy5NQVJLID0gZXhwb3J0cy5BTFBIQU5VTSA9IGV4cG9ydHMuTlVNID0gZXhwb3J0cy5IRVhfTUFQID0gZXhwb3J0cy5OVU1fTUFQID0gZXhwb3J0cy5BTFBIQSA9IGV4cG9ydHMuRklOSVNIID0gZXhwb3J0cy5IX01FVEhPRF9NQVAgPSBleHBvcnRzLk1FVEhPRF9NQVAgPSBleHBvcnRzLk1FVEhPRFNfUlRTUCA9IGV4cG9ydHMuTUVUSE9EU19JQ0UgPSBleHBvcnRzLk1FVEhPRFNfSFRUUCA9IGV4cG9ydHMuTUVUSE9EUyA9IGV4cG9ydHMuTEVOSUVOVF9GTEFHUyA9IGV4cG9ydHMuRkxBR1MgPSBleHBvcnRzLlRZUEUgPSBleHBvcnRzLkVSUk9SID0gdm9pZCAwO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuLy8gQyBoZWFkZXJzXG52YXIgRVJST1I7XG4oZnVuY3Rpb24gKEVSUk9SKSB7XG4gICAgRVJST1JbRVJST1JbXCJPS1wiXSA9IDBdID0gXCJPS1wiO1xuICAgIEVSUk9SW0VSUk9SW1wiSU5URVJOQUxcIl0gPSAxXSA9IFwiSU5URVJOQUxcIjtcbiAgICBFUlJPUltFUlJPUltcIlNUUklDVFwiXSA9IDJdID0gXCJTVFJJQ1RcIjtcbiAgICBFUlJPUltFUlJPUltcIkxGX0VYUEVDVEVEXCJdID0gM10gPSBcIkxGX0VYUEVDVEVEXCI7XG4gICAgRVJST1JbRVJST1JbXCJVTkVYUEVDVEVEX0NPTlRFTlRfTEVOR1RIXCJdID0gNF0gPSBcIlVORVhQRUNURURfQ09OVEVOVF9MRU5HVEhcIjtcbiAgICBFUlJPUltFUlJPUltcIkNMT1NFRF9DT05ORUNUSU9OXCJdID0gNV0gPSBcIkNMT1NFRF9DT05ORUNUSU9OXCI7XG4gICAgRVJST1JbRVJST1JbXCJJTlZBTElEX01FVEhPRFwiXSA9IDZdID0gXCJJTlZBTElEX01FVEhPRFwiO1xuICAgIEVSUk9SW0VSUk9SW1wiSU5WQUxJRF9VUkxcIl0gPSA3XSA9IFwiSU5WQUxJRF9VUkxcIjtcbiAgICBFUlJPUltFUlJPUltcIklOVkFMSURfQ09OU1RBTlRcIl0gPSA4XSA9IFwiSU5WQUxJRF9DT05TVEFOVFwiO1xuICAgIEVSUk9SW0VSUk9SW1wiSU5WQUxJRF9WRVJTSU9OXCJdID0gOV0gPSBcIklOVkFMSURfVkVSU0lPTlwiO1xuICAgIEVSUk9SW0VSUk9SW1wiSU5WQUxJRF9IRUFERVJfVE9LRU5cIl0gPSAxMF0gPSBcIklOVkFMSURfSEVBREVSX1RPS0VOXCI7XG4gICAgRVJST1JbRVJST1JbXCJJTlZBTElEX0NPTlRFTlRfTEVOR1RIXCJdID0gMTFdID0gXCJJTlZBTElEX0NPTlRFTlRfTEVOR1RIXCI7XG4gICAgRVJST1JbRVJST1JbXCJJTlZBTElEX0NIVU5LX1NJWkVcIl0gPSAxMl0gPSBcIklOVkFMSURfQ0hVTktfU0laRVwiO1xuICAgIEVSUk9SW0VSUk9SW1wiSU5WQUxJRF9TVEFUVVNcIl0gPSAxM10gPSBcIklOVkFMSURfU1RBVFVTXCI7XG4gICAgRVJST1JbRVJST1JbXCJJTlZBTElEX0VPRl9TVEFURVwiXSA9IDE0XSA9IFwiSU5WQUxJRF9FT0ZfU1RBVEVcIjtcbiAgICBFUlJPUltFUlJPUltcIklOVkFMSURfVFJBTlNGRVJfRU5DT0RJTkdcIl0gPSAxNV0gPSBcIklOVkFMSURfVFJBTlNGRVJfRU5DT0RJTkdcIjtcbiAgICBFUlJPUltFUlJPUltcIkNCX01FU1NBR0VfQkVHSU5cIl0gPSAxNl0gPSBcIkNCX01FU1NBR0VfQkVHSU5cIjtcbiAgICBFUlJPUltFUlJPUltcIkNCX0hFQURFUlNfQ09NUExFVEVcIl0gPSAxN10gPSBcIkNCX0hFQURFUlNfQ09NUExFVEVcIjtcbiAgICBFUlJPUltFUlJPUltcIkNCX01FU1NBR0VfQ09NUExFVEVcIl0gPSAxOF0gPSBcIkNCX01FU1NBR0VfQ09NUExFVEVcIjtcbiAgICBFUlJPUltFUlJPUltcIkNCX0NIVU5LX0hFQURFUlwiXSA9IDE5XSA9IFwiQ0JfQ0hVTktfSEVBREVSXCI7XG4gICAgRVJST1JbRVJST1JbXCJDQl9DSFVOS19DT01QTEVURVwiXSA9IDIwXSA9IFwiQ0JfQ0hVTktfQ09NUExFVEVcIjtcbiAgICBFUlJPUltFUlJPUltcIlBBVVNFRFwiXSA9IDIxXSA9IFwiUEFVU0VEXCI7XG4gICAgRVJST1JbRVJST1JbXCJQQVVTRURfVVBHUkFERVwiXSA9IDIyXSA9IFwiUEFVU0VEX1VQR1JBREVcIjtcbiAgICBFUlJPUltFUlJPUltcIlBBVVNFRF9IMl9VUEdSQURFXCJdID0gMjNdID0gXCJQQVVTRURfSDJfVVBHUkFERVwiO1xuICAgIEVSUk9SW0VSUk9SW1wiVVNFUlwiXSA9IDI0XSA9IFwiVVNFUlwiO1xufSkoRVJST1IgPSBleHBvcnRzLkVSUk9SIHx8IChleHBvcnRzLkVSUk9SID0ge30pKTtcbnZhciBUWVBFO1xuKGZ1bmN0aW9uIChUWVBFKSB7XG4gICAgVFlQRVtUWVBFW1wiQk9USFwiXSA9IDBdID0gXCJCT1RIXCI7XG4gICAgVFlQRVtUWVBFW1wiUkVRVUVTVFwiXSA9IDFdID0gXCJSRVFVRVNUXCI7XG4gICAgVFlQRVtUWVBFW1wiUkVTUE9OU0VcIl0gPSAyXSA9IFwiUkVTUE9OU0VcIjtcbn0pKFRZUEUgPSBleHBvcnRzLlRZUEUgfHwgKGV4cG9ydHMuVFlQRSA9IHt9KSk7XG52YXIgRkxBR1M7XG4oZnVuY3Rpb24gKEZMQUdTKSB7XG4gICAgRkxBR1NbRkxBR1NbXCJDT05ORUNUSU9OX0tFRVBfQUxJVkVcIl0gPSAxXSA9IFwiQ09OTkVDVElPTl9LRUVQX0FMSVZFXCI7XG4gICAgRkxBR1NbRkxBR1NbXCJDT05ORUNUSU9OX0NMT1NFXCJdID0gMl0gPSBcIkNPTk5FQ1RJT05fQ0xPU0VcIjtcbiAgICBGTEFHU1tGTEFHU1tcIkNPTk5FQ1RJT05fVVBHUkFERVwiXSA9IDRdID0gXCJDT05ORUNUSU9OX1VQR1JBREVcIjtcbiAgICBGTEFHU1tGTEFHU1tcIkNIVU5LRURcIl0gPSA4XSA9IFwiQ0hVTktFRFwiO1xuICAgIEZMQUdTW0ZMQUdTW1wiVVBHUkFERVwiXSA9IDE2XSA9IFwiVVBHUkFERVwiO1xuICAgIEZMQUdTW0ZMQUdTW1wiQ09OVEVOVF9MRU5HVEhcIl0gPSAzMl0gPSBcIkNPTlRFTlRfTEVOR1RIXCI7XG4gICAgRkxBR1NbRkxBR1NbXCJTS0lQQk9EWVwiXSA9IDY0XSA9IFwiU0tJUEJPRFlcIjtcbiAgICBGTEFHU1tGTEFHU1tcIlRSQUlMSU5HXCJdID0gMTI4XSA9IFwiVFJBSUxJTkdcIjtcbiAgICAvLyAxIDw8IDggaXMgdW51c2VkXG4gICAgRkxBR1NbRkxBR1NbXCJUUkFOU0ZFUl9FTkNPRElOR1wiXSA9IDUxMl0gPSBcIlRSQU5TRkVSX0VOQ09ESU5HXCI7XG59KShGTEFHUyA9IGV4cG9ydHMuRkxBR1MgfHwgKGV4cG9ydHMuRkxBR1MgPSB7fSkpO1xudmFyIExFTklFTlRfRkxBR1M7XG4oZnVuY3Rpb24gKExFTklFTlRfRkxBR1MpIHtcbiAgICBMRU5JRU5UX0ZMQUdTW0xFTklFTlRfRkxBR1NbXCJIRUFERVJTXCJdID0gMV0gPSBcIkhFQURFUlNcIjtcbiAgICBMRU5JRU5UX0ZMQUdTW0xFTklFTlRfRkxBR1NbXCJDSFVOS0VEX0xFTkdUSFwiXSA9IDJdID0gXCJDSFVOS0VEX0xFTkdUSFwiO1xuICAgIExFTklFTlRfRkxBR1NbTEVOSUVOVF9GTEFHU1tcIktFRVBfQUxJVkVcIl0gPSA0XSA9IFwiS0VFUF9BTElWRVwiO1xufSkoTEVOSUVOVF9GTEFHUyA9IGV4cG9ydHMuTEVOSUVOVF9GTEFHUyB8fCAoZXhwb3J0cy5MRU5JRU5UX0ZMQUdTID0ge30pKTtcbnZhciBNRVRIT0RTO1xuKGZ1bmN0aW9uIChNRVRIT0RTKSB7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiREVMRVRFXCJdID0gMF0gPSBcIkRFTEVURVwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkdFVFwiXSA9IDFdID0gXCJHRVRcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJIRUFEXCJdID0gMl0gPSBcIkhFQURcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJQT1NUXCJdID0gM10gPSBcIlBPU1RcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJQVVRcIl0gPSA0XSA9IFwiUFVUXCI7XG4gICAgLyogcGF0aG9sb2dpY2FsICovXG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiQ09OTkVDVFwiXSA9IDVdID0gXCJDT05ORUNUXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiT1BUSU9OU1wiXSA9IDZdID0gXCJPUFRJT05TXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiVFJBQ0VcIl0gPSA3XSA9IFwiVFJBQ0VcIjtcbiAgICAvKiBXZWJEQVYgKi9cbiAgICBNRVRIT0RTW01FVEhPRFNbXCJDT1BZXCJdID0gOF0gPSBcIkNPUFlcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJMT0NLXCJdID0gOV0gPSBcIkxPQ0tcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJNS0NPTFwiXSA9IDEwXSA9IFwiTUtDT0xcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJNT1ZFXCJdID0gMTFdID0gXCJNT1ZFXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUFJPUEZJTkRcIl0gPSAxMl0gPSBcIlBST1BGSU5EXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUFJPUFBBVENIXCJdID0gMTNdID0gXCJQUk9QUEFUQ0hcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJTRUFSQ0hcIl0gPSAxNF0gPSBcIlNFQVJDSFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlVOTE9DS1wiXSA9IDE1XSA9IFwiVU5MT0NLXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiQklORFwiXSA9IDE2XSA9IFwiQklORFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlJFQklORFwiXSA9IDE3XSA9IFwiUkVCSU5EXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiVU5CSU5EXCJdID0gMThdID0gXCJVTkJJTkRcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJBQ0xcIl0gPSAxOV0gPSBcIkFDTFwiO1xuICAgIC8qIHN1YnZlcnNpb24gKi9cbiAgICBNRVRIT0RTW01FVEhPRFNbXCJSRVBPUlRcIl0gPSAyMF0gPSBcIlJFUE9SVFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIk1LQUNUSVZJVFlcIl0gPSAyMV0gPSBcIk1LQUNUSVZJVFlcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJDSEVDS09VVFwiXSA9IDIyXSA9IFwiQ0hFQ0tPVVRcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJNRVJHRVwiXSA9IDIzXSA9IFwiTUVSR0VcIjtcbiAgICAvKiB1cG5wICovXG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiTS1TRUFSQ0hcIl0gPSAyNF0gPSBcIk0tU0VBUkNIXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiTk9USUZZXCJdID0gMjVdID0gXCJOT1RJRllcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJTVUJTQ1JJQkVcIl0gPSAyNl0gPSBcIlNVQlNDUklCRVwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlVOU1VCU0NSSUJFXCJdID0gMjddID0gXCJVTlNVQlNDUklCRVwiO1xuICAgIC8qIFJGQy01Nzg5ICovXG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUEFUQ0hcIl0gPSAyOF0gPSBcIlBBVENIXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUFVSR0VcIl0gPSAyOV0gPSBcIlBVUkdFXCI7XG4gICAgLyogQ2FsREFWICovXG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiTUtDQUxFTkRBUlwiXSA9IDMwXSA9IFwiTUtDQUxFTkRBUlwiO1xuICAgIC8qIFJGQy0yMDY4LCBzZWN0aW9uIDE5LjYuMS4yICovXG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiTElOS1wiXSA9IDMxXSA9IFwiTElOS1wiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlVOTElOS1wiXSA9IDMyXSA9IFwiVU5MSU5LXCI7XG4gICAgLyogaWNlY2FzdCAqL1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlNPVVJDRVwiXSA9IDMzXSA9IFwiU09VUkNFXCI7XG4gICAgLyogUkZDLTc1NDAsIHNlY3Rpb24gMTEuNiAqL1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlBSSVwiXSA9IDM0XSA9IFwiUFJJXCI7XG4gICAgLyogUkZDLTIzMjYgUlRTUCAqL1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkRFU0NSSUJFXCJdID0gMzVdID0gXCJERVNDUklCRVwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkFOTk9VTkNFXCJdID0gMzZdID0gXCJBTk5PVU5DRVwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlNFVFVQXCJdID0gMzddID0gXCJTRVRVUFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlBMQVlcIl0gPSAzOF0gPSBcIlBMQVlcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJQQVVTRVwiXSA9IDM5XSA9IFwiUEFVU0VcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJURUFSRE9XTlwiXSA9IDQwXSA9IFwiVEVBUkRPV05cIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJHRVRfUEFSQU1FVEVSXCJdID0gNDFdID0gXCJHRVRfUEFSQU1FVEVSXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiU0VUX1BBUkFNRVRFUlwiXSA9IDQyXSA9IFwiU0VUX1BBUkFNRVRFUlwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlJFRElSRUNUXCJdID0gNDNdID0gXCJSRURJUkVDVFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlJFQ09SRFwiXSA9IDQ0XSA9IFwiUkVDT1JEXCI7XG4gICAgLyogUkFPUCAqL1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkZMVVNIXCJdID0gNDVdID0gXCJGTFVTSFwiO1xufSkoTUVUSE9EUyA9IGV4cG9ydHMuTUVUSE9EUyB8fCAoZXhwb3J0cy5NRVRIT0RTID0ge30pKTtcbmV4cG9ydHMuTUVUSE9EU19IVFRQID0gW1xuICAgIE1FVEhPRFMuREVMRVRFLFxuICAgIE1FVEhPRFMuR0VULFxuICAgIE1FVEhPRFMuSEVBRCxcbiAgICBNRVRIT0RTLlBPU1QsXG4gICAgTUVUSE9EUy5QVVQsXG4gICAgTUVUSE9EUy5DT05ORUNULFxuICAgIE1FVEhPRFMuT1BUSU9OUyxcbiAgICBNRVRIT0RTLlRSQUNFLFxuICAgIE1FVEhPRFMuQ09QWSxcbiAgICBNRVRIT0RTLkxPQ0ssXG4gICAgTUVUSE9EUy5NS0NPTCxcbiAgICBNRVRIT0RTLk1PVkUsXG4gICAgTUVUSE9EUy5QUk9QRklORCxcbiAgICBNRVRIT0RTLlBST1BQQVRDSCxcbiAgICBNRVRIT0RTLlNFQVJDSCxcbiAgICBNRVRIT0RTLlVOTE9DSyxcbiAgICBNRVRIT0RTLkJJTkQsXG4gICAgTUVUSE9EUy5SRUJJTkQsXG4gICAgTUVUSE9EUy5VTkJJTkQsXG4gICAgTUVUSE9EUy5BQ0wsXG4gICAgTUVUSE9EUy5SRVBPUlQsXG4gICAgTUVUSE9EUy5NS0FDVElWSVRZLFxuICAgIE1FVEhPRFMuQ0hFQ0tPVVQsXG4gICAgTUVUSE9EUy5NRVJHRSxcbiAgICBNRVRIT0RTWydNLVNFQVJDSCddLFxuICAgIE1FVEhPRFMuTk9USUZZLFxuICAgIE1FVEhPRFMuU1VCU0NSSUJFLFxuICAgIE1FVEhPRFMuVU5TVUJTQ1JJQkUsXG4gICAgTUVUSE9EUy5QQVRDSCxcbiAgICBNRVRIT0RTLlBVUkdFLFxuICAgIE1FVEhPRFMuTUtDQUxFTkRBUixcbiAgICBNRVRIT0RTLkxJTkssXG4gICAgTUVUSE9EUy5VTkxJTkssXG4gICAgTUVUSE9EUy5QUkksXG4gICAgLy8gVE9ETyhpbmR1dG55KTogc2hvdWxkIHdlIGFsbG93IGl0IHdpdGggSFRUUD9cbiAgICBNRVRIT0RTLlNPVVJDRSxcbl07XG5leHBvcnRzLk1FVEhPRFNfSUNFID0gW1xuICAgIE1FVEhPRFMuU09VUkNFLFxuXTtcbmV4cG9ydHMuTUVUSE9EU19SVFNQID0gW1xuICAgIE1FVEhPRFMuT1BUSU9OUyxcbiAgICBNRVRIT0RTLkRFU0NSSUJFLFxuICAgIE1FVEhPRFMuQU5OT1VOQ0UsXG4gICAgTUVUSE9EUy5TRVRVUCxcbiAgICBNRVRIT0RTLlBMQVksXG4gICAgTUVUSE9EUy5QQVVTRSxcbiAgICBNRVRIT0RTLlRFQVJET1dOLFxuICAgIE1FVEhPRFMuR0VUX1BBUkFNRVRFUixcbiAgICBNRVRIT0RTLlNFVF9QQVJBTUVURVIsXG4gICAgTUVUSE9EUy5SRURJUkVDVCxcbiAgICBNRVRIT0RTLlJFQ09SRCxcbiAgICBNRVRIT0RTLkZMVVNILFxuICAgIC8vIEZvciBBaXJQbGF5XG4gICAgTUVUSE9EUy5HRVQsXG4gICAgTUVUSE9EUy5QT1NULFxuXTtcbmV4cG9ydHMuTUVUSE9EX01BUCA9IHV0aWxzXzEuZW51bVRvTWFwKE1FVEhPRFMpO1xuZXhwb3J0cy5IX01FVEhPRF9NQVAgPSB7fTtcbk9iamVjdC5rZXlzKGV4cG9ydHMuTUVUSE9EX01BUCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgaWYgKC9eSC8udGVzdChrZXkpKSB7XG4gICAgICAgIGV4cG9ydHMuSF9NRVRIT0RfTUFQW2tleV0gPSBleHBvcnRzLk1FVEhPRF9NQVBba2V5XTtcbiAgICB9XG59KTtcbnZhciBGSU5JU0g7XG4oZnVuY3Rpb24gKEZJTklTSCkge1xuICAgIEZJTklTSFtGSU5JU0hbXCJTQUZFXCJdID0gMF0gPSBcIlNBRkVcIjtcbiAgICBGSU5JU0hbRklOSVNIW1wiU0FGRV9XSVRIX0NCXCJdID0gMV0gPSBcIlNBRkVfV0lUSF9DQlwiO1xuICAgIEZJTklTSFtGSU5JU0hbXCJVTlNBRkVcIl0gPSAyXSA9IFwiVU5TQUZFXCI7XG59KShGSU5JU0ggPSBleHBvcnRzLkZJTklTSCB8fCAoZXhwb3J0cy5GSU5JU0ggPSB7fSkpO1xuZXhwb3J0cy5BTFBIQSA9IFtdO1xuZm9yIChsZXQgaSA9ICdBJy5jaGFyQ29kZUF0KDApOyBpIDw9ICdaJy5jaGFyQ29kZUF0KDApOyBpKyspIHtcbiAgICAvLyBVcHBlciBjYXNlXG4gICAgZXhwb3J0cy5BTFBIQS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoaSkpO1xuICAgIC8vIExvd2VyIGNhc2VcbiAgICBleHBvcnRzLkFMUEhBLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShpICsgMHgyMCkpO1xufVxuZXhwb3J0cy5OVU1fTUFQID0ge1xuICAgIDA6IDAsIDE6IDEsIDI6IDIsIDM6IDMsIDQ6IDQsXG4gICAgNTogNSwgNjogNiwgNzogNywgODogOCwgOTogOSxcbn07XG5leHBvcnRzLkhFWF9NQVAgPSB7XG4gICAgMDogMCwgMTogMSwgMjogMiwgMzogMywgNDogNCxcbiAgICA1OiA1LCA2OiA2LCA3OiA3LCA4OiA4LCA5OiA5LFxuICAgIEE6IDBYQSwgQjogMFhCLCBDOiAwWEMsIEQ6IDBYRCwgRTogMFhFLCBGOiAwWEYsXG4gICAgYTogMHhhLCBiOiAweGIsIGM6IDB4YywgZDogMHhkLCBlOiAweGUsIGY6IDB4Zixcbn07XG5leHBvcnRzLk5VTSA9IFtcbiAgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsXG5dO1xuZXhwb3J0cy5BTFBIQU5VTSA9IGV4cG9ydHMuQUxQSEEuY29uY2F0KGV4cG9ydHMuTlVNKTtcbmV4cG9ydHMuTUFSSyA9IFsnLScsICdfJywgJy4nLCAnIScsICd+JywgJyonLCAnXFwnJywgJygnLCAnKSddO1xuZXhwb3J0cy5VU0VSSU5GT19DSEFSUyA9IGV4cG9ydHMuQUxQSEFOVU1cbiAgICAuY29uY2F0KGV4cG9ydHMuTUFSSylcbiAgICAuY29uY2F0KFsnJScsICc7JywgJzonLCAnJicsICc9JywgJysnLCAnJCcsICcsJ10pO1xuLy8gVE9ETyhpbmR1dG55KTogdXNlIFJGQ1xuZXhwb3J0cy5TVFJJQ1RfVVJMX0NIQVIgPSBbXG4gICAgJyEnLCAnXCInLCAnJCcsICclJywgJyYnLCAnXFwnJyxcbiAgICAnKCcsICcpJywgJyonLCAnKycsICcsJywgJy0nLCAnLicsICcvJyxcbiAgICAnOicsICc7JywgJzwnLCAnPScsICc+JyxcbiAgICAnQCcsICdbJywgJ1xcXFwnLCAnXScsICdeJywgJ18nLFxuICAgICdgJyxcbiAgICAneycsICd8JywgJ30nLCAnficsXG5dLmNvbmNhdChleHBvcnRzLkFMUEhBTlVNKTtcbmV4cG9ydHMuVVJMX0NIQVIgPSBleHBvcnRzLlNUUklDVF9VUkxfQ0hBUlxuICAgIC5jb25jYXQoWydcXHQnLCAnXFxmJ10pO1xuLy8gQWxsIGNoYXJhY3RlcnMgd2l0aCAweDgwIGJpdCBzZXQgdG8gMVxuZm9yIChsZXQgaSA9IDB4ODA7IGkgPD0gMHhmZjsgaSsrKSB7XG4gICAgZXhwb3J0cy5VUkxfQ0hBUi5wdXNoKGkpO1xufVxuZXhwb3J0cy5IRVggPSBleHBvcnRzLk5VTS5jb25jYXQoWydhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRiddKTtcbi8qIFRva2VucyBhcyBkZWZpbmVkIGJ5IHJmYyAyNjE2LiBBbHNvIGxvd2VyY2FzZXMgdGhlbS5cbiAqICAgICAgICB0b2tlbiAgICAgICA9IDEqPGFueSBDSEFSIGV4Y2VwdCBDVExzIG9yIHNlcGFyYXRvcnM+XG4gKiAgICAgc2VwYXJhdG9ycyAgICAgPSBcIihcIiB8IFwiKVwiIHwgXCI8XCIgfCBcIj5cIiB8IFwiQFwiXG4gKiAgICAgICAgICAgICAgICAgICAgfCBcIixcIiB8IFwiO1wiIHwgXCI6XCIgfCBcIlxcXCIgfCA8XCI+XG4gKiAgICAgICAgICAgICAgICAgICAgfCBcIi9cIiB8IFwiW1wiIHwgXCJdXCIgfCBcIj9cIiB8IFwiPVwiXG4gKiAgICAgICAgICAgICAgICAgICAgfCBcIntcIiB8IFwifVwiIHwgU1AgfCBIVFxuICovXG5leHBvcnRzLlNUUklDVF9UT0tFTiA9IFtcbiAgICAnIScsICcjJywgJyQnLCAnJScsICcmJywgJ1xcJycsXG4gICAgJyonLCAnKycsICctJywgJy4nLFxuICAgICdeJywgJ18nLCAnYCcsXG4gICAgJ3wnLCAnficsXG5dLmNvbmNhdChleHBvcnRzLkFMUEhBTlVNKTtcbmV4cG9ydHMuVE9LRU4gPSBleHBvcnRzLlNUUklDVF9UT0tFTi5jb25jYXQoWycgJ10pO1xuLypcbiAqIFZlcmlmeSB0aGF0IGEgY2hhciBpcyBhIHZhbGlkIHZpc2libGUgKHByaW50YWJsZSkgVVMtQVNDSUlcbiAqIGNoYXJhY3RlciBvciAleDgwLUZGXG4gKi9cbmV4cG9ydHMuSEVBREVSX0NIQVJTID0gWydcXHQnXTtcbmZvciAobGV0IGkgPSAzMjsgaSA8PSAyNTU7IGkrKykge1xuICAgIGlmIChpICE9PSAxMjcpIHtcbiAgICAgICAgZXhwb3J0cy5IRUFERVJfQ0hBUlMucHVzaChpKTtcbiAgICB9XG59XG4vLyAnLCcgPSBcXHg0NFxuZXhwb3J0cy5DT05ORUNUSU9OX1RPS0VOX0NIQVJTID0gZXhwb3J0cy5IRUFERVJfQ0hBUlMuZmlsdGVyKChjKSA9PiBjICE9PSA0NCk7XG5leHBvcnRzLk1BSk9SID0gZXhwb3J0cy5OVU1fTUFQO1xuZXhwb3J0cy5NSU5PUiA9IGV4cG9ydHMuTUFKT1I7XG52YXIgSEVBREVSX1NUQVRFO1xuKGZ1bmN0aW9uIChIRUFERVJfU1RBVEUpIHtcbiAgICBIRUFERVJfU1RBVEVbSEVBREVSX1NUQVRFW1wiR0VORVJBTFwiXSA9IDBdID0gXCJHRU5FUkFMXCI7XG4gICAgSEVBREVSX1NUQVRFW0hFQURFUl9TVEFURVtcIkNPTk5FQ1RJT05cIl0gPSAxXSA9IFwiQ09OTkVDVElPTlwiO1xuICAgIEhFQURFUl9TVEFURVtIRUFERVJfU1RBVEVbXCJDT05URU5UX0xFTkdUSFwiXSA9IDJdID0gXCJDT05URU5UX0xFTkdUSFwiO1xuICAgIEhFQURFUl9TVEFURVtIRUFERVJfU1RBVEVbXCJUUkFOU0ZFUl9FTkNPRElOR1wiXSA9IDNdID0gXCJUUkFOU0ZFUl9FTkNPRElOR1wiO1xuICAgIEhFQURFUl9TVEFURVtIRUFERVJfU1RBVEVbXCJVUEdSQURFXCJdID0gNF0gPSBcIlVQR1JBREVcIjtcbiAgICBIRUFERVJfU1RBVEVbSEVBREVSX1NUQVRFW1wiQ09OTkVDVElPTl9LRUVQX0FMSVZFXCJdID0gNV0gPSBcIkNPTk5FQ1RJT05fS0VFUF9BTElWRVwiO1xuICAgIEhFQURFUl9TVEFURVtIRUFERVJfU1RBVEVbXCJDT05ORUNUSU9OX0NMT1NFXCJdID0gNl0gPSBcIkNPTk5FQ1RJT05fQ0xPU0VcIjtcbiAgICBIRUFERVJfU1RBVEVbSEVBREVSX1NUQVRFW1wiQ09OTkVDVElPTl9VUEdSQURFXCJdID0gN10gPSBcIkNPTk5FQ1RJT05fVVBHUkFERVwiO1xuICAgIEhFQURFUl9TVEFURVtIRUFERVJfU1RBVEVbXCJUUkFOU0ZFUl9FTkNPRElOR19DSFVOS0VEXCJdID0gOF0gPSBcIlRSQU5TRkVSX0VOQ09ESU5HX0NIVU5LRURcIjtcbn0pKEhFQURFUl9TVEFURSA9IGV4cG9ydHMuSEVBREVSX1NUQVRFIHx8IChleHBvcnRzLkhFQURFUl9TVEFURSA9IHt9KSk7XG5leHBvcnRzLlNQRUNJQUxfSEVBREVSUyA9IHtcbiAgICAnY29ubmVjdGlvbic6IEhFQURFUl9TVEFURS5DT05ORUNUSU9OLFxuICAgICdjb250ZW50LWxlbmd0aCc6IEhFQURFUl9TVEFURS5DT05URU5UX0xFTkdUSCxcbiAgICAncHJveHktY29ubmVjdGlvbic6IEhFQURFUl9TVEFURS5DT05ORUNUSU9OLFxuICAgICd0cmFuc2Zlci1lbmNvZGluZyc6IEhFQURFUl9TVEFURS5UUkFOU0ZFUl9FTkNPRElORyxcbiAgICAndXBncmFkZSc6IEhFQURFUl9TVEFURS5VUEdSQURFLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnN0YW50cy5qcy5tYXAiLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBCdWZmZXIgfSA9IHJlcXVpcmUoJ25vZGU6YnVmZmVyJylcblxubW9kdWxlLmV4cG9ydHMgPSBCdWZmZXIuZnJvbSgnQUdGemJRRUFBQUFCSndkZ0FYOEJmMkFEZjM5L0FYOWdBWDhBWUFKL2Z3QmdCSDkvZjM4QmYyQUFBR0FEZjM5L0FBTExBUWdEWlc1MkdIZGhjMjFmYjI1ZmFHVmhaR1Z5YzE5amIyMXdiR1YwWlFBRUEyVnVkaFYzWVhOdFgyOXVYMjFsYzNOaFoyVmZZbVZuYVc0QUFBTmxibllMZDJGemJWOXZibDkxY213QUFRTmxibllPZDJGemJWOXZibDl6ZEdGMGRYTUFBUU5sYm5ZVWQyRnpiVjl2Ymw5b1pXRmtaWEpmWm1sbGJHUUFBUU5sYm5ZVWQyRnpiVjl2Ymw5b1pXRmtaWEpmZG1Gc2RXVUFBUU5sYm5ZTWQyRnpiVjl2Ymw5aWIyUjVBQUVEWlc1MkdIZGhjMjFmYjI1ZmJXVnpjMkZuWlY5amIyMXdiR1YwWlFBQUF5MHNCUVlBQUFJQUFBQUFBQUFDQVFJQUFnSUNBQUFEQUFBQUFBTURBd01CQVFFQkFRRUJBUUVBQUFJQUFBQUVCUUZ3QVJJU0JRTUJBQUlHQ0FGL0FVR0ExQVFMQjlFRklnWnRaVzF2Y25rQ0FBdGZhVzVwZEdsaGJHbDZaUUFJR1Y5ZmFXNWthWEpsWTNSZlpuVnVZM1JwYjI1ZmRHRmliR1VCQUF0c2JHaDBkSEJmYVc1cGRBQUpHR3hzYUhSMGNGOXphRzkxYkdSZmEyVmxjRjloYkdsMlpRQXZER3hzYUhSMGNGOWhiR3h2WXdBTEJtMWhiR3h2WXdBeEMyeHNhSFIwY0Y5bWNtVmxBQXdFWm5KbFpRQU1EMnhzYUhSMGNGOW5aWFJmZEhsd1pRQU5GV3hzYUhSMGNGOW5aWFJmYUhSMGNGOXRZV3B2Y2dBT0ZXeHNhSFIwY0Y5blpYUmZhSFIwY0Y5dGFXNXZjZ0FQRVd4c2FIUjBjRjluWlhSZmJXVjBhRzlrQUJBV2JHeG9kSFJ3WDJkbGRGOXpkR0YwZFhOZlkyOWtaUUFSRW14c2FIUjBjRjluWlhSZmRYQm5jbUZrWlFBU0RHeHNhSFIwY0Y5eVpYTmxkQUFURG14c2FIUjBjRjlsZUdWamRYUmxBQlFVYkd4b2RIUndYM05sZEhScGJtZHpYMmx1YVhRQUZRMXNiR2gwZEhCZlptbHVhWE5vQUJZTWJHeG9kSFJ3WDNCaGRYTmxBQmNOYkd4b2RIUndYM0psYzNWdFpRQVlHMnhzYUhSMGNGOXlaWE4xYldWZllXWjBaWEpmZFhCbmNtRmtaUUFaRUd4c2FIUjBjRjluWlhSZlpYSnlibThBR2hkc2JHaDBkSEJmWjJWMFgyVnljbTl5WDNKbFlYTnZiZ0FiRjJ4c2FIUjBjRjl6WlhSZlpYSnliM0pmY21WaGMyOXVBQndVYkd4b2RIUndYMmRsZEY5bGNuSnZjbDl3YjNNQUhSRnNiR2gwZEhCZlpYSnlibTlmYm1GdFpRQWVFbXhzYUhSMGNGOXRaWFJvYjJSZmJtRnRaUUFmRW14c2FIUjBjRjl6ZEdGMGRYTmZibUZ0WlFBZ0dteHNhSFIwY0Y5elpYUmZiR1Z1YVdWdWRGOW9aV0ZrWlhKekFDRWhiR3hvZEhSd1gzTmxkRjlzWlc1cFpXNTBYMk5vZFc1clpXUmZiR1Z1WjNSb0FDSWRiR3hvZEhSd1gzTmxkRjlzWlc1cFpXNTBYMnRsWlhCZllXeHBkbVVBSXlSc2JHaDBkSEJmYzJWMFgyeGxibWxsYm5SZmRISmhibk5tWlhKZlpXNWpiMlJwYm1jQUpCaHNiR2gwZEhCZmJXVnpjMkZuWlY5dVpXVmtjMTlsYjJZQUxna1hBUUJCQVFzUkFRSURCQVVLQmdjckxTd3FLU2dsSnlZSzA3TUNMQllBUVlqUUFDZ0NBQVJBQUF0QmlOQUFRUUUyQWdBTEZBQWdBQkF3SUFBZ0FqWUNPQ0FBSUFFNkFDZ0xGQUFnQUNBQUx3RXlJQUF0QUM0Z0FCQXZFQUFMSGdFQmYwSEFBQkF5SWdFUU1DQUJRWUFJTmdJNElBRWdBRG9BS0NBQkM0OE1BUWQvQWtBZ0FFVU5BQ0FBUVFocklnRWdBRUVFYXlnQ0FDSUFRWGh4SWdScUlRVUNRQ0FBUVFGeERRQWdBRUVEY1VVTkFTQUJJQUVvQWdBaUFHc2lBVUdjMEFBb0FnQkpEUUVnQUNBRWFpRUVBa0FDUUVHZzBBQW9BZ0FnQVVjRVFDQUFRZjhCVFFSQUlBQkJBM1loQXlBQktBSUlJZ0FnQVNnQ0RDSUNSZ1JBUVl6UUFFR00wQUFvQWdCQmZpQURkM0UyQWdBTUJRc2dBaUFBTmdJSUlBQWdBallDREF3RUN5QUJLQUlZSVFZZ0FTQUJLQUlNSWdCSEJFQWdBQ0FCS0FJSUlnSTJBZ2dnQWlBQU5nSU1EQU1MSUFGQkZHb2lBeWdDQUNJQ1JRUkFJQUVvQWhBaUFrVU5BaUFCUVJCcUlRTUxBMEFnQXlFSElBSWlBRUVVYWlJREtBSUFJZ0lOQUNBQVFSQnFJUU1nQUNnQ0VDSUNEUUFMSUFkQkFEWUNBQXdDQ3lBRktBSUVJZ0JCQTNGQkEwY05BaUFGSUFCQmZuRTJBZ1JCbE5BQUlBUTJBZ0FnQlNBRU5nSUFJQUVnQkVFQmNqWUNCQXdEQzBFQUlRQUxJQVpGRFFBQ1FDQUJLQUljSWdKQkFuUkJ2TklBYWlJREtBSUFJQUZHQkVBZ0F5QUFOZ0lBSUFBTkFVR1EwQUJCa05BQUtBSUFRWDRnQW5keE5nSUFEQUlMSUFaQkVFRVVJQVlvQWhBZ0FVWWJhaUFBTmdJQUlBQkZEUUVMSUFBZ0JqWUNHQ0FCS0FJUUlnSUVRQ0FBSUFJMkFoQWdBaUFBTmdJWUN5QUJRUlJxS0FJQUlnSkZEUUFnQUVFVWFpQUNOZ0lBSUFJZ0FEWUNHQXNnQVNBRlR3MEFJQVVvQWdRaUFFRUJjVVVOQUFKQUFrQUNRQUpBSUFCQkFuRkZCRUJCcE5BQUtBSUFJQVZHQkVCQnBOQUFJQUUyQWdCQm1OQUFRWmpRQUNnQ0FDQUVhaUlBTmdJQUlBRWdBRUVCY2pZQ0JDQUJRYURRQUNnQ0FFY05Ca0dVMEFCQkFEWUNBRUdnMEFCQkFEWUNBQXdHQzBHZzBBQW9BZ0FnQlVZRVFFR2cwQUFnQVRZQ0FFR1UwQUJCbE5BQUtBSUFJQVJxSWdBMkFnQWdBU0FBUVFGeU5nSUVJQUFnQVdvZ0FEWUNBQXdHQ3lBQVFYaHhJQVJxSVFRZ0FFSC9BVTBFUUNBQVFRTjJJUU1nQlNnQ0NDSUFJQVVvQWd3aUFrWUVRRUdNMEFCQmpOQUFLQUlBUVg0Z0EzZHhOZ0lBREFVTElBSWdBRFlDQ0NBQUlBSTJBZ3dNQkFzZ0JTZ0NHQ0VHSUFVZ0JTZ0NEQ0lBUndSQVFaelFBQ2dDQUJvZ0FDQUZLQUlJSWdJMkFnZ2dBaUFBTmdJTURBTUxJQVZCRkdvaUF5Z0NBQ0lDUlFSQUlBVW9BaEFpQWtVTkFpQUZRUkJxSVFNTEEwQWdBeUVISUFJaUFFRVVhaUlES0FJQUlnSU5BQ0FBUVJCcUlRTWdBQ2dDRUNJQ0RRQUxJQWRCQURZQ0FBd0NDeUFGSUFCQmZuRTJBZ1FnQVNBRWFpQUVOZ0lBSUFFZ0JFRUJjallDQkF3REMwRUFJUUFMSUFaRkRRQUNRQ0FGS0FJY0lnSkJBblJCdk5JQWFpSURLQUlBSUFWR0JFQWdBeUFBTmdJQUlBQU5BVUdRMEFCQmtOQUFLQUlBUVg0Z0FuZHhOZ0lBREFJTElBWkJFRUVVSUFZb0FoQWdCVVliYWlBQU5nSUFJQUJGRFFFTElBQWdCallDR0NBRktBSVFJZ0lFUUNBQUlBSTJBaEFnQWlBQU5nSVlDeUFGUVJScUtBSUFJZ0pGRFFBZ0FFRVVhaUFDTmdJQUlBSWdBRFlDR0FzZ0FTQUVhaUFFTmdJQUlBRWdCRUVCY2pZQ0JDQUJRYURRQUNnQ0FFY05BRUdVMEFBZ0JEWUNBQXdCQ3lBRVFmOEJUUVJBSUFSQmVIRkJ0TkFBYWlFQUFuOUJqTkFBS0FJQUlnSkJBU0FFUVFOMmRDSURjVVVFUUVHTTBBQWdBaUFEY2pZQ0FDQUFEQUVMSUFBb0FnZ0xJZ0lnQVRZQ0RDQUFJQUUyQWdnZ0FTQUFOZ0lNSUFFZ0FqWUNDQXdCQzBFZklRSWdCRUgvLy84SFRRUkFJQVJCSmlBRVFRaDJaeUlBYTNaQkFYRWdBRUVCZEd0QlBtb2hBZ3NnQVNBQ05nSWNJQUZDQURjQ0VDQUNRUUowUWJ6U0FHb2hBQUpBUVpEUUFDZ0NBQ0lEUVFFZ0FuUWlCM0ZGQkVBZ0FDQUJOZ0lBUVpEUUFDQURJQWR5TmdJQUlBRWdBRFlDR0NBQklBRTJBZ2dnQVNBQk5nSU1EQUVMSUFSQkdTQUNRUUYyYTBFQUlBSkJIMGNiZENFQ0lBQW9BZ0FoQUFKQUEwQWdBQ0lES0FJRVFYaHhJQVJHRFFFZ0FrRWRkaUVBSUFKQkFYUWhBaUFESUFCQkJIRnFRUkJxSWdjb0FnQWlBQTBBQ3lBSElBRTJBZ0FnQVNBRE5nSVlJQUVnQVRZQ0RDQUJJQUUyQWdnTUFRc2dBeWdDQ0NJQUlBRTJBZ3dnQXlBQk5nSUlJQUZCQURZQ0dDQUJJQU0yQWd3Z0FTQUFOZ0lJQzBHczBBQkJyTkFBS0FJQVFRRnJJZ0JCZnlBQUd6WUNBQXNMQndBZ0FDMEFLQXNIQUNBQUxRQXFDd2NBSUFBdEFDc0xCd0FnQUMwQUtRc0hBQ0FBTHdFeUN3Y0FJQUF0QUM0TFFBRUVmeUFBS0FJWUlRRWdBQzBBTFNFQ0lBQXRBQ2doQXlBQUtBSTRJUVFnQUJBd0lBQWdCRFlDT0NBQUlBTTZBQ2dnQUNBQ09nQXRJQUFnQVRZQ0dBdTc0Z0VDQjM4RGZpQUJJQUpxSVFRQ1FDQUFJZ0lvQWd3aUFBMEFJQUlvQWdRRVFDQUNJQUUyQWdRTEl3QkJFR3NpQ0NRQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDZndKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBSW9BaHdpQTBFQmF3N2RBZG9CQWRrQkFnTUVCUVlIQ0FrS0N3d05EdGdCRHhEWEFSRVMxZ0VURkJVV0Z4Z1pHaHZnQWQ4QkhCMGUxUUVmSUNFaUl5UWwxQUVtSnlncEtpc3Mwd0hTQVMwdTBRSFFBUzh3TVRJek5EVTJOemc1T2pzOFBUNC9RRUZDUTBSRlJ0c0JSMGhKU3M4QnpnRkx6UUZNekFGTlRrOVFVVkpUVkZWV1YxaFpXbHRjWFY1ZllHRmlZMlJsWm1kb2FXcHJiRzF1YjNCeGNuTjBkWFozZUhsNmUzeDlmbitBQVlFQmdnR0RBWVFCaFFHR0FZY0JpQUdKQVlvQml3R01BWTBCamdHUEFaQUJrUUdTQVpNQmxBR1ZBWllCbHdHWUFaa0JtZ0diQVp3Qm5RR2VBWjhCb0FHaEFhSUJvd0drQWFVQnBnR25BYWdCcVFHcUFhc0JyQUd0QWE0QnJ3R3dBYkVCc2dHekFiUUJ0UUcyQWJjQnl3SEtBYmdCeVFHNUFjZ0J1Z0c3QWJ3QnZRRytBYjhCd0FIQkFjSUJ3d0hFQWNVQnhnRUEzQUVMUVFBTXhnRUxRUTRNeFFFTFFRME14QUVMUVE4TXd3RUxRUkFNd2dFTFFSTU13UUVMUVJRTXdBRUxRUlVNdndFTFFSWU12Z0VMUVJnTXZRRUxRUmtNdkFFTFFSb011d0VMUVJzTXVnRUxRUndNdVFFTFFSME11QUVMUVFnTXR3RUxRUjRNdGdFTFFTQU10UUVMUVI4TXRBRUxRUWNNc3dFTFFTRU1zZ0VMUVNJTXNRRUxRU01Nc0FFTFFTUU1yd0VMUVJJTXJnRUxRUkVNclFFTFFTVU1yQUVMUVNZTXF3RUxRU2NNcWdFTFFTZ01xUUVMUWNNQkRLZ0JDMEVxREtjQkMwRXJES1lCQzBFc0RLVUJDMEV0REtRQkMwRXVES01CQzBFdkRLSUJDMEhFQVF5aEFRdEJNQXlnQVF0Qk5BeWZBUXRCREF5ZUFRdEJNUXlkQVF0Qk1neWNBUXRCTXd5YkFRdEJPUXlhQVF0Qk5ReVpBUXRCeFFFTW1BRUxRUXNNbHdFTFFUb01sZ0VMUVRZTWxRRUxRUW9NbEFFTFFUY01rd0VMUVRnTWtnRUxRVHdNa1FFTFFUc01rQUVMUVQwTWp3RUxRUWtNamdFTFFTa01qUUVMUVQ0TWpBRUxRVDhNaXdFTFFjQUFESW9CQzBIQkFBeUpBUXRCd2dBTWlBRUxRY01BREljQkMwSEVBQXlHQVF0QnhRQU1oUUVMUWNZQURJUUJDMEVYRElNQkMwSEhBQXlDQVF0QnlBQU1nUUVMUWNrQURJQUJDMEhLQUF4L0MwSExBQXgrQzBITkFBeDlDMEhNQUF4OEMwSE9BQXg3QzBIUEFBeDZDMEhRQUF4NUMwSFJBQXg0QzBIU0FBeDNDMEhUQUF4MkMwSFVBQXgxQzBIV0FBeDBDMEhWQUF4ekMwRUdESElMUWRjQURIRUxRUVVNY0F0QjJBQU1id3RCQkF4dUMwSFpBQXh0QzBIYUFBeHNDMEhiQUF4ckMwSGNBQXhxQzBFRERHa0xRZDBBREdnTFFkNEFER2NMUWQ4QURHWUxRZUVBREdVTFFlQUFER1FMUWVJQURHTUxRZU1BREdJTFFRSU1ZUXRCNUFBTVlBdEI1UUFNWHd0QjVnQU1YZ3RCNXdBTVhRdEI2QUFNWEF0QjZRQU1Xd3RCNmdBTVdndEI2d0FNV1F0QjdBQU1XQXRCN1FBTVZ3dEI3Z0FNVmd0Qjd3QU1WUXRCOEFBTVZBdEI4UUFNVXd0QjhnQU1VZ3RCOHdBTVVRdEI5QUFNVUF0QjlRQU1Ud3RCOWdBTVRndEI5d0FNVFF0QitBQU1UQXRCK1FBTVN3dEIrZ0FNU2d0Qit3QU1TUXRCL0FBTVNBdEIvUUFNUnd0Qi9nQU1SZ3RCL3dBTVJRdEJnQUVNUkF0QmdRRU1Rd3RCZ2dFTVFndEJnd0VNUVF0QmhBRU1RQXRCaFFFTVB3dEJoZ0VNUGd0Qmh3RU1QUXRCaUFFTVBBdEJpUUVNT3d0QmlnRU1PZ3RCaXdFTU9RdEJqQUVNT0F0QmpRRU1Od3RCamdFTU5ndEJqd0VNTlF0QmtBRU1OQXRCa1FFTU13dEJrZ0VNTWd0Qmt3RU1NUXRCbEFFTU1BdEJsUUVNTHd0QmxnRU1MZ3RCbHdFTUxRdEJtQUVNTEF0Qm1RRU1Ld3RCbWdFTUtndEJtd0VNS1F0Qm5BRU1LQXRCblFFTUp3dEJuZ0VNSmd0Qm53RU1KUXRCb0FFTUpBdEJvUUVNSXd0Qm9nRU1JZ3RCb3dFTUlRdEJwQUVNSUF0QnBRRU1Id3RCcGdFTUhndEJwd0VNSFF0QnFBRU1IQXRCcVFFTUd3dEJxZ0VNR2d0QnF3RU1HUXRCckFFTUdBdEJyUUVNRnd0QnJnRU1GZ3RCQVF3VkMwR3ZBUXdVQzBHd0FRd1RDMEd4QVF3U0MwR3pBUXdSQzBHeUFRd1FDMEcwQVF3UEMwRzFBUXdPQzBHMkFRd05DMEczQVF3TUMwRzRBUXdMQzBHNUFRd0tDMEc2QVF3SkMwRzdBUXdJQzBIR0FRd0hDMEc4QVF3R0MwRzlBUXdGQzBHK0FRd0VDMEcvQVF3REMwSEFBUXdDQzBIQ0FRd0JDMEhCQVFzaEF3TkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQUlDZndKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUovQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQWdKL0FrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDZndKQUFrQUNmd0pBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDZndKQUFrQUNRQUpBQW44Q1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUREc1lCQUFFQ0F3UUZCZ2NJQ1FvTERBME9EeEFSRWhNVUZSWVhHQmthR3h3ZEh5QWhJeVVtS0NvckxDOHdNVEl6TkRVMk56azZPenc5bEFOQVFrUkZSa2xMVGs5UVVWSlRWRlZXV0ZwYlhGMWVYMkJoWW1Oa1pXWm5hR3BzYjNCeGMzVjJlSGw2ZTN4L2dBR0JBWUlCZ3dHRUFZVUJoZ0dIQVlnQmlRR0tBWXNCakFHTkFZNEJqd0dRQVpFQmtnR1RBWlFCbFFHV0FaY0JtQUdaQVpvQm13R2NBWjBCbmdHZkFhQUJvUUdpQWFNQnBBR2xBYVlCcHdHb0Fha0JxZ0dyQWF3QnJRR3VBYThCc0FHeEFiSUJzd0cwQWJVQnRnRzNBYmdCdVFHNkFic0J2QUc5QWI0QnZ3SEFBY0VCd2dIREFjUUJ4UUhHQWNjQnlBSEpBY3NCekFITkFjNEJ6d0dLQTRrRGlBT0hBNFFEZ3dPQUEvc0MrZ0w1QXZnQzl3TDBBdk1DOGdMTEFzRUNzQUxaQVFzZ0FTQUVSdzN3QWtIZEFTRURETE1EQ3lBQklBUkhEY2dCUWNNQklRTU1zZ01MSUFFZ0JFY05lMEgzQUNFRERMRURDeUFCSUFSSERYQkI3d0FoQXd5d0F3c2dBU0FFUncxcFFlb0FJUU1NcndNTElBRWdCRWNOWlVIb0FDRURESzREQ3lBQklBUkhEV0pCNWdBaEF3eXRBd3NnQVNBRVJ3MGFRUmdoQXd5c0F3c2dBU0FFUncwVlFSSWhBd3lyQXdzZ0FTQUVSdzFDUWNVQUlRTU1xZ01MSUFFZ0JFY05ORUUvSVFNTXFRTUxJQUVnQkVjTk1rRThJUU1NcUFNTElBRWdCRWNOSzBFeElRTU1wd01MSUFJdEFDNUJBVVlObndNTXdRSUxRUUFoQUFKQUFrQUNRQ0FDTFFBcVJRMEFJQUl0QUN0RkRRQWdBaThCTUNJRFFRSnhSUTBCREFJTElBSXZBVEFpQTBFQmNVVU5BUXRCQVNFQUlBSXRBQ2hCQVVZTkFDQUNMd0V5SWdWQjVBQnJRZVFBU1EwQUlBVkJ6QUZHRFFBZ0JVR3dBa1lOQUNBRFFjQUFjUTBBUVFBaEFDQURRWWdFY1VHQUJFWU5BQ0FEUVNoeFFRQkhJUUFMSUFKQkFEc0JNQ0FDUVFBNkFDOGdBRVVOM3dJZ0FrSUFOd01nRE9BQ0MwRUFJUUFDUUNBQ0tBSTRJZ05GRFFBZ0F5Z0NMQ0lEUlEwQUlBSWdBeEVBQUNFQUN5QUFSUTNNQVNBQVFSVkhEZDBDSUFKQkJEWUNIQ0FDSUFFMkFoUWdBa0d3R0RZQ0VDQUNRUlUyQWd4QkFDRURES1FEQ3lBQklBUkdCRUJCQmlFRERLUURDeUFCUVFGcUlRRkJBQ0VBQWtBZ0FpZ0NPQ0lEUlEwQUlBTW9BbFFpQTBVTkFDQUNJQU1SQUFBaEFBc2dBQTNaQWd3Y0N5QUNRZ0EzQXlCQkVpRURESWtEQ3lBQklBUkhEUlpCSFNFRERLRURDeUFCSUFSSEJFQWdBVUVCYWlFQlFSQWhBd3lJQXd0QkJ5RURES0FEQ3lBQ0lBSXBBeUFpQ2lBRUlBRnJyU0lMZlNJTVFnQWdDaUFNV2hzM0F5QWdDaUFMV0EzVUFrRUlJUU1NbndNTElBRWdCRWNFUUNBQ1FRazJBZ2dnQWlBQk5nSUVRUlFoQXd5R0F3dEJDU0VEREo0REN5QUNLUU1nUWdCU0RjY0JJQUlnQWk4Qk1FR0FBWEk3QVRBTVFnc2dBU0FFUncwL1FkQUFJUU1NbkFNTElBRWdCRVlFUUVFTElRTU1uQU1MSUFGQkFXb2hBVUVBSVFBQ1FDQUNLQUk0SWdORkRRQWdBeWdDVUNJRFJRMEFJQUlnQXhFQUFDRUFDeUFBRGM4Q0RNWUJDMEVBSVFBQ1FDQUNLQUk0SWdORkRRQWdBeWdDU0NJRFJRMEFJQUlnQXhFQUFDRUFDeUFBUlEzR0FTQUFRUlZIRGMwQ0lBSkJDellDSENBQ0lBRTJBaFFnQWtHQ0dUWUNFQ0FDUVJVMkFneEJBQ0VEREpvREMwRUFJUUFDUUNBQ0tBSTRJZ05GRFFBZ0F5Z0NTQ0lEUlEwQUlBSWdBeEVBQUNFQUN5QUFSUTBNSUFCQkZVY055Z0lnQWtFYU5nSWNJQUlnQVRZQ0ZDQUNRWUlaTmdJUUlBSkJGVFlDREVFQUlRTU1tUU1MUVFBaEFBSkFJQUlvQWpnaUEwVU5BQ0FES0FKTUlnTkZEUUFnQWlBREVRQUFJUUFMSUFCRkRjUUJJQUJCRlVjTnh3SWdBa0VMTmdJY0lBSWdBVFlDRkNBQ1FaRVhOZ0lRSUFKQkZUWUNERUVBSVFNTW1BTUxJQUVnQkVZRVFFRVBJUU1NbUFNTElBRXRBQUFpQUVFN1JnMEhJQUJCRFVjTnhBSWdBVUVCYWlFQkRNTUJDMEVBSVFBQ1FDQUNLQUk0SWdORkRRQWdBeWdDVENJRFJRMEFJQUlnQXhFQUFDRUFDeUFBUlEzREFTQUFRUlZIRGNJQ0lBSkJEellDSENBQ0lBRTJBaFFnQWtHUkZ6WUNFQ0FDUVJVMkFneEJBQ0VEREpZREN3TkFJQUV0QUFCQjhEVnFMUUFBSWdCQkFVY0VRQ0FBUVFKSERjRUNJQUlvQWdRaEFFRUFJUU1nQWtFQU5nSUVJQUlnQUNBQlFRRnFJZ0VRTFNJQURjSUNETVVCQ3lBRUlBRkJBV29pQVVjTkFBdEJFaUVEREpVREMwRUFJUUFDUUNBQ0tBSTRJZ05GRFFBZ0F5Z0NUQ0lEUlEwQUlBSWdBeEVBQUNFQUN5QUFSUTNGQVNBQVFSVkhEYjBDSUFKQkd6WUNIQ0FDSUFFMkFoUWdBa0dSRnpZQ0VDQUNRUlUyQWd4QkFDRURESlFEQ3lBQklBUkdCRUJCRmlFRERKUURDeUFDUVFvMkFnZ2dBaUFCTmdJRVFRQWhBQUpBSUFJb0FqZ2lBMFVOQUNBREtBSklJZ05GRFFBZ0FpQURFUUFBSVFBTElBQkZEY0lCSUFCQkZVY051UUlnQWtFVk5nSWNJQUlnQVRZQ0ZDQUNRWUlaTmdJUUlBSkJGVFlDREVFQUlRTU1rd01MSUFFZ0JFY0VRQU5BSUFFdEFBQkI4RGRxTFFBQUlnQkJBa2NFUUFKQUlBQkJBV3NPQk1RQ3ZRSUF2Z0s5QWdzZ0FVRUJhaUVCUVFnaEF3ejhBZ3NnQkNBQlFRRnFJZ0ZIRFFBTFFSVWhBd3lUQXd0QkZTRURESklEQ3dOQUlBRXRBQUJCOERscUxRQUFJZ0JCQWtjRVFDQUFRUUZyRGdURkFyY0N3d0s0QXJjQ0N5QUVJQUZCQVdvaUFVY05BQXRCR0NFRERKRURDeUFCSUFSSEJFQWdBa0VMTmdJSUlBSWdBVFlDQkVFSElRTU0rQUlMUVJraEF3eVFBd3NnQVVFQmFpRUJEQUlMSUFFZ0JFWUVRRUVhSVFNTWp3TUxBa0FnQVMwQUFFRU5hdzRVdFFHL0FiOEJ2d0cvQWI4QnZ3Ry9BYjhCdndHL0FiOEJ2d0cvQWI4QnZ3Ry9BYjhCdndFQXZ3RUxRUUFoQXlBQ1FRQTJBaHdnQWtHdkN6WUNFQ0FDUVFJMkFnd2dBaUFCUVFGcU5nSVVESTREQ3lBQklBUkdCRUJCR3lFRERJNERDeUFCTFFBQUlnQkJPMGNFUUNBQVFRMUhEYkVDSUFGQkFXb2hBUXk2QVFzZ0FVRUJhaUVCQzBFaUlRTU04d0lMSUFFZ0JFWUVRRUVjSVFNTWpBTUxRZ0FoQ2dKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBUzBBQUVFd2F3NDN3UUxBQWdBQkFnTUVCUVlIMEFIUUFkQUIwQUhRQWRBQjBBRUlDUW9MREEzUUFkQUIwQUhRQWRBQjBBSFFBZEFCMEFIUUFkQUIwQUhRQWRBQjBBSFFBZEFCMEFIUUFkQUIwQUhRQWRBQjBBSFFBZEFCRGc4UUVSSVQwQUVMUWdJaENnekFBZ3RDQXlFS0RMOENDMElFSVFvTXZnSUxRZ1VoQ2d5OUFndENCaUVLREx3Q0MwSUhJUW9NdXdJTFFnZ2hDZ3k2QWd0Q0NTRUtETGtDQzBJS0lRb011QUlMUWdzaENneTNBZ3RDRENFS0RMWUNDMElOSVFvTXRRSUxRZzRoQ2d5MEFndENEeUVLRExNQ0MwSUtJUW9Nc2dJTFFnc2hDZ3l4QWd0Q0RDRUtETEFDQzBJTklRb01yd0lMUWc0aENneXVBZ3RDRHlFS0RLMENDMElBSVFvQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQUV0QUFCQk1Hc09OOEFDdndJQUFRSURCQVVHQjc0Q3ZnSytBcjRDdmdLK0FyNENDQWtLQ3d3TnZnSytBcjRDdmdLK0FyNEN2Z0srQXI0Q3ZnSytBcjRDdmdLK0FyNEN2Z0srQXI0Q3ZnSytBcjRDdmdLK0FyNEN2Z0srQWc0UEVCRVNFNzRDQzBJQ0lRb012d0lMUWdNaENneStBZ3RDQkNFS0RMMENDMElGSVFvTXZBSUxRZ1loQ2d5N0FndENCeUVLRExvQ0MwSUlJUW9NdVFJTFFna2hDZ3k0QWd0Q0NpRUtETGNDQzBJTElRb010Z0lMUWd3aENneTFBZ3RDRFNFS0RMUUNDMElPSVFvTXN3SUxRZzhoQ2d5eUFndENDaUVLRExFQ0MwSUxJUW9Nc0FJTFFnd2hDZ3l2QWd0Q0RTRUtESzRDQzBJT0lRb01yUUlMUWc4aENneXNBZ3NnQWlBQ0tRTWdJZ29nQkNBQmE2MGlDMzBpREVJQUlBb2dERm9iTndNZ0lBb2dDMWdOcHdKQkh5RURESWtEQ3lBQklBUkhCRUFnQWtFSk5nSUlJQUlnQVRZQ0JFRWxJUU1NOEFJTFFTQWhBd3lJQXd0QkFTRUZJQUl2QVRBaUEwRUljVVVFUUNBQ0tRTWdRZ0JTSVFVTEFrQWdBaTBBTGdSQVFRRWhBQ0FDTFFBcFFRVkdEUUVnQTBIQUFIRkZJQVZ4UlEwQkMwRUFJUUFnQTBIQUFIRU5BRUVDSVFBZ0EwRUljUTBBSUFOQmdBUnhCRUFDUUNBQ0xRQW9RUUZIRFFBZ0FpMEFMVUVLY1EwQVFRVWhBQXdDQzBFRUlRQU1BUXNnQTBFZ2NVVUVRQUpBSUFJdEFDaEJBVVlOQUNBQ0x3RXlJZ0JCNUFCclFlUUFTUTBBSUFCQnpBRkdEUUFnQUVHd0FrWU5BRUVFSVFBZ0EwRW9jVVVOQWlBRFFZZ0VjVUdBQkVZTkFndEJBQ0VBREFFTFFRQkJBeUFDS1FNZ1VCc2hBQXNnQUVFQmF3NEZ2Z0lBc0FFQnBBS2hBZ3RCRVNFRERPMENDeUFDUVFFNkFDOE1oQU1MSUFFZ0JFY05uUUpCSkNFRERJUURDeUFCSUFSSERSeEJ4Z0FoQXd5REF3dEJBQ0VBQWtBZ0FpZ0NPQ0lEUlEwQUlBTW9Ba1FpQTBVTkFDQUNJQU1SQUFBaEFBc2dBRVVOSnlBQVFSVkhEWmdDSUFKQjBBQTJBaHdnQWlBQk5nSVVJQUpCa1JnMkFoQWdBa0VWTmdJTVFRQWhBd3lDQXdzZ0FTQUVSZ1JBUVNnaEF3eUNBd3RCQUNFRElBSkJBRFlDQkNBQ1FRdzJBZ2dnQWlBQklBRVFLaUlBUlEyVUFpQUNRU2MyQWh3Z0FpQUJOZ0lVSUFJZ0FEWUNEQXlCQXdzZ0FTQUVSZ1JBUVNraEF3eUJBd3NnQVMwQUFDSUFRU0JHRFJNZ0FFRUpSdzJWQWlBQlFRRnFJUUVNRkFzZ0FTQUVSd1JBSUFGQkFXb2hBUXdXQzBFcUlRTU0vd0lMSUFFZ0JFWUVRRUVySVFNTS93SUxJQUV0QUFBaUFFRUpSeUFBUVNCSGNRMlFBaUFDTFFBc1FRaEhEZDBDSUFKQkFEb0FMQXpkQWdzZ0FTQUVSZ1JBUVN3aEF3eitBZ3NnQVMwQUFFRUtSdzJPQWlBQlFRRnFJUUVNc0FFTElBRWdCRWNOaWdKQkx5RUREUHdDQ3dOQUlBRXRBQUFpQUVFZ1J3UkFJQUJCQ21zT0JJUUNpQUtJQW9RQ2hnSUxJQVFnQVVFQmFpSUJSdzBBQzBFeElRTU0rd0lMUVRJaEF5QUJJQVJHRGZvQ0lBSW9BZ0FpQUNBRUlBRnJhaUVISUFFZ0FHdEJBMm9oQmdKQUEwQWdBRUh3TzJvdEFBQWdBUzBBQUNJRlFTQnlJQVVnQlVIQkFHdEIvd0Z4UVJwSkcwSC9BWEZIRFFFZ0FFRURSZ1JBUVFZaEFRemlBZ3NnQUVFQmFpRUFJQVFnQVVFQmFpSUJSdzBBQ3lBQ0lBYzJBZ0FNK3dJTElBSkJBRFlDQUF5R0FndEJNeUVESUFRZ0FTSUFSZzM1QWlBRUlBRnJJQUlvQWdBaUFXb2hCeUFBSUFGclFRaHFJUVlDUUFOQUlBRkI5RHRxTFFBQUlBQXRBQUFpQlVFZ2NpQUZJQVZCd1FCclFmOEJjVUVhU1J0Qi93RnhSdzBCSUFGQkNFWUVRRUVGSVFFTTRRSUxJQUZCQVdvaEFTQUVJQUJCQVdvaUFFY05BQXNnQWlBSE5nSUFEUG9DQ3lBQ1FRQTJBZ0FnQUNFQkRJVUNDMEUwSVFNZ0JDQUJJZ0JHRGZnQ0lBUWdBV3NnQWlnQ0FDSUJhaUVISUFBZ0FXdEJCV29oQmdKQUEwQWdBVUhRd2dCcUxRQUFJQUF0QUFBaUJVRWdjaUFGSUFWQndRQnJRZjhCY1VFYVNSdEIvd0Z4UncwQklBRkJCVVlFUUVFSElRRU00QUlMSUFGQkFXb2hBU0FFSUFCQkFXb2lBRWNOQUFzZ0FpQUhOZ0lBRFBrQ0N5QUNRUUEyQWdBZ0FDRUJESVFDQ3lBQklBUkhCRUFEUUNBQkxRQUFRWUErYWkwQUFDSUFRUUZIQkVBZ0FFRUNSZzBKRElFQ0N5QUVJQUZCQVdvaUFVY05BQXRCTUNFRERQZ0NDMEV3SVFNTTl3SUxJQUVnQkVjRVFBTkFJQUV0QUFBaUFFRWdSd1JBSUFCQkNtc09CUDhCL2dIK0FmOEIvZ0VMSUFRZ0FVRUJhaUlCUncwQUMwRTRJUU1NOXdJTFFUZ2hBd3oyQWdzRFFDQUJMUUFBSWdCQklFY2dBRUVKUjNFTjlnRWdCQ0FCUVFGcUlnRkhEUUFMUVR3aEF3ejFBZ3NEUUNBQkxRQUFJZ0JCSUVjRVFBSkFJQUJCQ21zT0JQa0JCQVQ1QVFBTElBQkJMRVlOOVFFTUF3c2dCQ0FCUVFGcUlnRkhEUUFMUVQ4aEF3ejBBZ3RCd0FBaEF5QUJJQVJHRGZNQ0lBSW9BZ0FpQUNBRUlBRnJhaUVGSUFFZ0FHdEJCbW9oQmdKQUEwQWdBRUdBUUdzdEFBQWdBUzBBQUVFZ2NrY05BU0FBUVFaR0Rkc0NJQUJCQVdvaEFDQUVJQUZCQVdvaUFVY05BQXNnQWlBRk5nSUFEUFFDQ3lBQ1FRQTJBZ0FMUVRZaEF3elpBZ3NnQVNBRVJnUkFRY0VBSVFNTThnSUxJQUpCRERZQ0NDQUNJQUUyQWdRZ0FpMEFMRUVCYXc0RSt3SHVBZXdCNndIVUFnc2dBVUVCYWlFQkRQb0JDeUFCSUFSSEJFQURRQUpBSUFFdEFBQWlBRUVnY2lBQUlBQkJ3UUJyUWY4QmNVRWFTUnRCL3dGeElnQkJDVVlOQUNBQVFTQkdEUUFDUUFKQUFrQUNRQ0FBUWVNQWF3NFRBQU1EQXdNREF3TUJBd01EQXdNREF3TURBZ01MSUFGQkFXb2hBVUV4SVFNTTNBSUxJQUZCQVdvaEFVRXlJUU1NMndJTElBRkJBV29oQVVFeklRTU0yZ0lMRFA0QkN5QUVJQUZCQVdvaUFVY05BQXRCTlNFRERQQUNDMEUxSVFNTTd3SUxJQUVnQkVjRVFBTkFJQUV0QUFCQmdEeHFMUUFBUVFGSERmY0JJQVFnQVVFQmFpSUJSdzBBQzBFOUlRTU03d0lMUVQwaEF3enVBZ3RCQUNFQUFrQWdBaWdDT0NJRFJRMEFJQU1vQWtBaUEwVU5BQ0FDSUFNUkFBQWhBQXNnQUVVTkFTQUFRUlZIRGVZQklBSkJ3Z0EyQWh3Z0FpQUJOZ0lVSUFKQjR4ZzJBaEFnQWtFVk5nSU1RUUFoQXd6dEFnc2dBVUVCYWlFQkMwRThJUU1NMGdJTElBRWdCRVlFUUVIQ0FDRURET3NDQ3dKQUEwQUNRQ0FCTFFBQVFRbHJEaGdBQXN3Q3pBTFJBc3dDekFMTUFzd0N6QUxNQXN3Q3pBTE1Bc3dDekFMTUFzd0N6QUxNQXN3Q3pBTE1BZ0RNQWdzZ0JDQUJRUUZxSWdGSERRQUxRY0lBSVFNTTZ3SUxJQUZCQVdvaEFTQUNMUUF0UVFGeFJRMytBUXRCTENFREROQUNDeUFCSUFSSERkNEJRY1FBSVFNTTZBSUxBMEFnQVMwQUFFR1F3QUJxTFFBQVFRRkhEWndCSUFRZ0FVRUJhaUlCUncwQUMwSEZBQ0VERE9jQ0N5QUJMUUFBSWdCQklFWU4vZ0VnQUVFNlJ3M0FBaUFDS0FJRUlRQkJBQ0VESUFKQkFEWUNCQ0FDSUFBZ0FSQXBJZ0FOM2dFTTNRRUxRY2NBSVFNZ0JDQUJJZ0JHRGVVQ0lBUWdBV3NnQWlnQ0FDSUJhaUVISUFBZ0FXdEJCV29oQmdOQUlBRkJrTUlBYWkwQUFDQUFMUUFBSWdWQklISWdCU0FGUWNFQWEwSC9BWEZCR2trYlFmOEJjVWNOdndJZ0FVRUZSZzNDQWlBQlFRRnFJUUVnQkNBQVFRRnFJZ0JIRFFBTElBSWdCellDQUF6bEFndEJ5QUFoQXlBRUlBRWlBRVlONUFJZ0JDQUJheUFDS0FJQUlnRnFJUWNnQUNBQmEwRUphaUVHQTBBZ0FVR1d3Z0JxTFFBQUlBQXRBQUFpQlVFZ2NpQUZJQVZCd1FCclFmOEJjVUVhU1J0Qi93RnhSdzIrQWtFQ0lBRkJDVVlOd2dJYUlBRkJBV29oQVNBRUlBQkJBV29pQUVjTkFBc2dBaUFITmdJQURPUUNDeUFCSUFSR0JFQkJ5UUFoQXd6a0Fnc0NRQUpBSUFFdEFBQWlBRUVnY2lBQUlBQkJ3UUJyUWY4QmNVRWFTUnRCL3dGeFFlNEFhdzRIQUw4Q3Z3Sy9BcjhDdndJQnZ3SUxJQUZCQVdvaEFVRStJUU1NeXdJTElBRkJBV29oQVVFL0lRTU15Z0lMUWNvQUlRTWdCQ0FCSWdCR0RlSUNJQVFnQVdzZ0FpZ0NBQ0lCYWlFR0lBQWdBV3RCQVdvaEJ3TkFJQUZCb01JQWFpMEFBQ0FBTFFBQUlnVkJJSElnQlNBRlFjRUFhMEgvQVhGQkdra2JRZjhCY1VjTnZBSWdBVUVCUmcyK0FpQUJRUUZxSVFFZ0JDQUFRUUZxSWdCSERRQUxJQUlnQmpZQ0FBemlBZ3RCeXdBaEF5QUVJQUVpQUVZTjRRSWdCQ0FCYXlBQ0tBSUFJZ0ZxSVFjZ0FDQUJhMEVPYWlFR0EwQWdBVUdpd2dCcUxRQUFJQUF0QUFBaUJVRWdjaUFGSUFWQndRQnJRZjhCY1VFYVNSdEIvd0Z4UncyN0FpQUJRUTVHRGI0Q0lBRkJBV29oQVNBRUlBQkJBV29pQUVjTkFBc2dBaUFITmdJQURPRUNDMEhNQUNFRElBUWdBU0lBUmczZ0FpQUVJQUZySUFJb0FnQWlBV29oQnlBQUlBRnJRUTlxSVFZRFFDQUJRY0RDQUdvdEFBQWdBQzBBQUNJRlFTQnlJQVVnQlVIQkFHdEIvd0Z4UVJwSkcwSC9BWEZIRGJvQ1FRTWdBVUVQUmcyK0Fob2dBVUVCYWlFQklBUWdBRUVCYWlJQVJ3MEFDeUFDSUFjMkFnQU00QUlMUWMwQUlRTWdCQ0FCSWdCR0RkOENJQVFnQVdzZ0FpZ0NBQ0lCYWlFSElBQWdBV3RCQldvaEJnTkFJQUZCME1JQWFpMEFBQ0FBTFFBQUlnVkJJSElnQlNBRlFjRUFhMEgvQVhGQkdra2JRZjhCY1VjTnVRSkJCQ0FCUVFWR0RiMENHaUFCUVFGcUlRRWdCQ0FBUVFGcUlnQkhEUUFMSUFJZ0J6WUNBQXpmQWdzZ0FTQUVSZ1JBUWM0QUlRTU0zd0lMQWtBQ1FBSkFBa0FnQVMwQUFDSUFRU0J5SUFBZ0FFSEJBR3RCL3dGeFFScEpHMEgvQVhGQjR3QnJEaE1BdkFLOEFyd0N2QUs4QXJ3Q3ZBSzhBcndDdkFLOEFyd0NBYndDdkFLOEFnSUR2QUlMSUFGQkFXb2hBVUhCQUNFRERNZ0NDeUFCUVFGcUlRRkJ3Z0FoQXd6SEFnc2dBVUVCYWlFQlFjTUFJUU1NeGdJTElBRkJBV29oQVVIRUFDRURETVVDQ3lBQklBUkhCRUFnQWtFTk5nSUlJQUlnQVRZQ0JFSEZBQ0VERE1VQ0MwSFBBQ0VERE4wQ0N3SkFBa0FnQVMwQUFFRUthdzRFQVpBQmtBRUFrQUVMSUFGQkFXb2hBUXRCS0NFRERNTUNDeUFCSUFSR0JFQkIwUUFoQXd6Y0Fnc2dBUzBBQUVFZ1J3MEFJQUZCQVdvaEFTQUNMUUF0UVFGeFJRM1FBUXRCRnlFRERNRUNDeUFCSUFSSERjc0JRZElBSVFNTTJRSUxRZE1BSVFNZ0FTQUVSZzNZQWlBQ0tBSUFJZ0FnQkNBQmEyb2hCaUFCSUFCclFRRnFJUVVEUUNBQkxRQUFJQUJCMXNJQWFpMEFBRWNOeHdFZ0FFRUJSZzNLQVNBQVFRRnFJUUFnQkNBQlFRRnFJZ0ZIRFFBTElBSWdCallDQUF6WUFnc2dBU0FFUmdSQVFkVUFJUU1NMkFJTElBRXRBQUJCQ2tjTndnRWdBVUVCYWlFQkRNb0JDeUFCSUFSR0JFQkIxZ0FoQXd6WEFnc0NRQUpBSUFFdEFBQkJDbXNPQkFEREFjTUJBY01CQ3lBQlFRRnFJUUVNeWdFTElBRkJBV29oQVVIS0FDRURETDBDQzBFQUlRQUNRQ0FDS0FJNElnTkZEUUFnQXlnQ1BDSURSUTBBSUFJZ0F4RUFBQ0VBQ3lBQURiOEJRYzBBSVFNTXZBSUxJQUl0QUNsQklrWU56d0lNaVFFTElBUWdBU0lGUmdSQVFkc0FJUU1NMUFJTFFRQWhBRUVCSVFGQkFTRUdRUUFoQXdKQUFuOENRQUpBQWtBQ1FBSkFBa0FDUUNBRkxRQUFRVEJyRGdyRkFjUUJBQUVDQXdRRkJnakRBUXRCQWd3R0MwRUREQVVMUVFRTUJBdEJCUXdEQzBFR0RBSUxRUWNNQVF0QkNBc2hBMEVBSVFGQkFDRUdETDBCQzBFSklRTkJBU0VBUVFBaEFVRUFJUVlNdkFFTElBRWdCRVlFUUVIZEFDRURETk1DQ3lBQkxRQUFRUzVIRGJnQklBRkJBV29oQVF5SUFRc2dBU0FFUncyMkFVSGZBQ0VERE5FQ0N5QUJJQVJIQkVBZ0FrRU9OZ0lJSUFJZ0FUWUNCRUhRQUNFRERMZ0NDMEhnQUNFREROQUNDMEhoQUNFRElBRWdCRVlOendJZ0FpZ0NBQ0lBSUFRZ0FXdHFJUVVnQVNBQWEwRURhaUVHQTBBZ0FTMEFBQ0FBUWVMQ0FHb3RBQUJIRGJFQklBQkJBMFlOc3dFZ0FFRUJhaUVBSUFRZ0FVRUJhaUlCUncwQUN5QUNJQVUyQWdBTXp3SUxRZUlBSVFNZ0FTQUVSZzNPQWlBQ0tBSUFJZ0FnQkNBQmEyb2hCU0FCSUFCclFRSnFJUVlEUUNBQkxRQUFJQUJCNXNJQWFpMEFBRWNOc0FFZ0FFRUNSZzJ2QVNBQVFRRnFJUUFnQkNBQlFRRnFJZ0ZIRFFBTElBSWdCVFlDQUF6T0FndEI0d0FoQXlBQklBUkdEYzBDSUFJb0FnQWlBQ0FFSUFGcmFpRUZJQUVnQUd0QkEyb2hCZ05BSUFFdEFBQWdBRUhwd2dCcUxRQUFSdzJ2QVNBQVFRTkdEYTBCSUFCQkFXb2hBQ0FFSUFGQkFXb2lBVWNOQUFzZ0FpQUZOZ0lBRE0wQ0N5QUJJQVJHQkVCQjVRQWhBd3pOQWdzZ0FVRUJhaUVCUVFBaEFBSkFJQUlvQWpnaUEwVU5BQ0FES0FJd0lnTkZEUUFnQWlBREVRQUFJUUFMSUFBTnFnRkIxZ0FoQXd5ekFnc2dBU0FFUndSQUEwQWdBUzBBQUNJQVFTQkhCRUFDUUFKQUFrQWdBRUhJQUdzT0N3QUJzd0d6QWJNQnN3R3pBYk1Cc3dHekFRS3pBUXNnQVVFQmFpRUJRZElBSVFNTXR3SUxJQUZCQVdvaEFVSFRBQ0VERExZQ0N5QUJRUUZxSVFGQjFBQWhBd3kxQWdzZ0JDQUJRUUZxSWdGSERRQUxRZVFBSVFNTXpBSUxRZVFBSVFNTXl3SUxBMEFnQVMwQUFFSHd3Z0JxTFFBQUlnQkJBVWNFUUNBQVFRSnJEZ09uQWFZQnBRR2tBUXNnQkNBQlFRRnFJZ0ZIRFFBTFFlWUFJUU1NeWdJTElBRkJBV29nQVNBRVJ3MENHa0huQUNFRERNa0NDd05BSUFFdEFBQkI4TVFBYWkwQUFDSUFRUUZIQkVBQ1FDQUFRUUpyRGdTaUFhRUJvQUVBbndFTFFkY0FJUU1Nc1FJTElBUWdBVUVCYWlJQlJ3MEFDMEhvQUNFRERNZ0NDeUFCSUFSR0JFQkI2UUFoQXd6SUFnc0NRQ0FCTFFBQUlnQkJDbXNPR3JjQm13R2JBYlFCbXdHYkFac0Jtd0diQVpzQm13R2JBWnNCbXdHYkFac0Jtd0diQVpzQm13R2JBWnNCcEFHYkFac0JBSmtCQ3lBQlFRRnFDeUVCUVFZaEF3eXRBZ3NEUUNBQkxRQUFRZkRHQUdvdEFBQkJBVWNOZlNBRUlBRkJBV29pQVVjTkFBdEI2Z0FoQXd6RkFnc2dBVUVCYWlBQklBUkhEUUlhUWVzQUlRTU14QUlMSUFFZ0JFWUVRRUhzQUNFRERNUUNDeUFCUVFGcURBRUxJQUVnQkVZRVFFSHRBQ0VERE1NQ0N5QUJRUUZxQ3lFQlFRUWhBd3lvQWdzZ0FTQUVSZ1JBUWU0QUlRTU13UUlMQWtBQ1FBSkFJQUV0QUFCQjhNZ0FhaTBBQUVFQmF3NEhrQUdQQVk0QkFId0JBbzBCQ3lBQlFRRnFJUUVNQ3dzZ0FVRUJhZ3lUQVF0QkFDRURJQUpCQURZQ0hDQUNRWnNTTmdJUUlBSkJCellDRENBQ0lBRkJBV28yQWhRTXdBSUxBa0FEUUNBQkxRQUFRZkRJQUdvdEFBQWlBRUVFUndSQUFrQUNRQ0FBUVFGckRnZVVBWk1Ca2dHTkFRQUVBWTBCQzBIYUFDRURES29DQ3lBQlFRRnFJUUZCM0FBaEF3eXBBZ3NnQkNBQlFRRnFJZ0ZIRFFBTFFlOEFJUU1Nd0FJTElBRkJBV29Na1FFTElBUWdBU0lBUmdSQVFmQUFJUU1NdndJTElBQXRBQUJCTDBjTkFTQUFRUUZxSVFFTUJ3c2dCQ0FCSWdCR0JFQkI4UUFoQXd5K0Fnc2dBQzBBQUNJQlFTOUdCRUFnQUVFQmFpRUJRZDBBSVFNTXBRSUxJQUZCQ21zaUEwRVdTdzBBSUFBaEFVRUJJQU4wUVltQWdBSnhEZmtCQzBFQUlRTWdBa0VBTmdJY0lBSWdBRFlDRkNBQ1FZd2NOZ0lRSUFKQkJ6WUNEQXk4QWdzZ0FTQUVSd1JBSUFGQkFXb2hBVUhlQUNFRERLTUNDMEh5QUNFRERMc0NDeUFCSUFSR0JFQkI5QUFoQXd5N0Fnc0NRQ0FCTFFBQVFmRE1BR290QUFCQkFXc09BL2NCY3dDQ0FRdEI0UUFoQXd5aEFnc2dBU0FFUndSQUEwQWdBUzBBQUVId3lnQnFMUUFBSWdCQkEwY0VRQUpBSUFCQkFXc09BdmtCQUlVQkMwSGZBQ0VEREtNQ0N5QUVJQUZCQVdvaUFVY05BQXRCOHdBaEF3eTZBZ3RCOHdBaEF3eTVBZ3NnQVNBRVJ3UkFJQUpCRHpZQ0NDQUNJQUUyQWdSQjRBQWhBd3lnQWd0QjlRQWhBd3k0QWdzZ0FTQUVSZ1JBUWZZQUlRTU11QUlMSUFKQkR6WUNDQ0FDSUFFMkFnUUxRUU1oQXd5ZEFnc0RRQ0FCTFFBQVFTQkhEWTRDSUFRZ0FVRUJhaUlCUncwQUMwSDNBQ0VERExVQ0N5QUJJQVJHQkVCQitBQWhBd3kxQWdzZ0FTMEFBRUVnUncxNklBRkJBV29oQVF4YkMwRUFJUUFDUUNBQ0tBSTRJZ05GRFFBZ0F5Z0NPQ0lEUlEwQUlBSWdBeEVBQUNFQUN5QUFEWGdNZ0FJTElBRWdCRVlFUUVINkFDRURETE1DQ3lBQkxRQUFRY3dBUncxMElBRkJBV29oQVVFVERIWUxRZnNBSVFNZ0FTQUVSZzJ4QWlBQ0tBSUFJZ0FnQkNBQmEyb2hCU0FCSUFCclFRVnFJUVlEUUNBQkxRQUFJQUJCOE00QWFpMEFBRWNOY3lBQVFRVkdEWFVnQUVFQmFpRUFJQVFnQVVFQmFpSUJSdzBBQ3lBQ0lBVTJBZ0FNc1FJTElBRWdCRVlFUUVIOEFDRURETEVDQ3dKQUFrQWdBUzBBQUVIREFHc09EQUIwZEhSMGRIUjBkSFIwQVhRTElBRkJBV29oQVVIbUFDRURESmdDQ3lBQlFRRnFJUUZCNXdBaEF3eVhBZ3RCL1FBaEF5QUJJQVJHRGE4Q0lBSW9BZ0FpQUNBRUlBRnJhaUVGSUFFZ0FHdEJBbW9oQmdKQUEwQWdBUzBBQUNBQVFlM1BBR290QUFCSERYSWdBRUVDUmcwQklBQkJBV29oQUNBRUlBRkJBV29pQVVjTkFBc2dBaUFGTmdJQURMQUNDeUFDUVFBMkFnQWdCa0VCYWlFQlFSQU1jd3RCL2dBaEF5QUJJQVJHRGE0Q0lBSW9BZ0FpQUNBRUlBRnJhaUVGSUFFZ0FHdEJCV29oQmdKQUEwQWdBUzBBQUNBQVFmYk9BR290QUFCSERYRWdBRUVGUmcwQklBQkJBV29oQUNBRUlBRkJBV29pQVVjTkFBc2dBaUFGTmdJQURLOENDeUFDUVFBMkFnQWdCa0VCYWlFQlFSWU1jZ3RCL3dBaEF5QUJJQVJHRGEwQ0lBSW9BZ0FpQUNBRUlBRnJhaUVGSUFFZ0FHdEJBMm9oQmdKQUEwQWdBUzBBQUNBQVFmek9BR290QUFCSERYQWdBRUVEUmcwQklBQkJBV29oQUNBRUlBRkJBV29pQVVjTkFBc2dBaUFGTmdJQURLNENDeUFDUVFBMkFnQWdCa0VCYWlFQlFRVU1jUXNnQVNBRVJnUkFRWUFCSVFNTXJRSUxJQUV0QUFCQjJRQkhEVzRnQVVFQmFpRUJRUWdNY0FzZ0FTQUVSZ1JBUVlFQklRTU1yQUlMQWtBQ1FDQUJMUUFBUWM0QWF3NERBRzhCYndzZ0FVRUJhaUVCUWVzQUlRTU1rd0lMSUFGQkFXb2hBVUhzQUNFRERKSUNDeUFCSUFSR0JFQkJnZ0VoQXd5ckFnc0NRQUpBSUFFdEFBQkJ5QUJyRGdnQWJtNXVibTV1QVc0TElBRkJBV29oQVVIcUFDRURESklDQ3lBQlFRRnFJUUZCN1FBaEF3eVJBZ3RCZ3dFaEF5QUJJQVJHRGFrQ0lBSW9BZ0FpQUNBRUlBRnJhaUVGSUFFZ0FHdEJBbW9oQmdKQUEwQWdBUzBBQUNBQVFZRFBBR290QUFCSERXd2dBRUVDUmcwQklBQkJBV29oQUNBRUlBRkJBV29pQVVjTkFBc2dBaUFGTmdJQURLb0NDeUFDUVFBMkFnQWdCa0VCYWlFQlFRQU1iUXRCaEFFaEF5QUJJQVJHRGFnQ0lBSW9BZ0FpQUNBRUlBRnJhaUVGSUFFZ0FHdEJCR29oQmdKQUEwQWdBUzBBQUNBQVFZUFBBR290QUFCSERXc2dBRUVFUmcwQklBQkJBV29oQUNBRUlBRkJBV29pQVVjTkFBc2dBaUFGTmdJQURLa0NDeUFDUVFBMkFnQWdCa0VCYWlFQlFTTU1iQXNnQVNBRVJnUkFRWVVCSVFNTXFBSUxBa0FDUUNBQkxRQUFRY3dBYXc0SUFHdHJhMnRyYXdGckN5QUJRUUZxSVFGQjd3QWhBd3lQQWdzZ0FVRUJhaUVCUWZBQUlRTU1qZ0lMSUFFZ0JFWUVRRUdHQVNFRERLY0NDeUFCTFFBQVFjVUFSdzFvSUFGQkFXb2hBUXhnQzBHSEFTRURJQUVnQkVZTnBRSWdBaWdDQUNJQUlBUWdBV3RxSVFVZ0FTQUFhMEVEYWlFR0FrQURRQ0FCTFFBQUlBQkJpTThBYWkwQUFFY05hQ0FBUVFOR0RRRWdBRUVCYWlFQUlBUWdBVUVCYWlJQlJ3MEFDeUFDSUFVMkFnQU1wZ0lMSUFKQkFEWUNBQ0FHUVFGcUlRRkJMUXhwQzBHSUFTRURJQUVnQkVZTnBBSWdBaWdDQUNJQUlBUWdBV3RxSVFVZ0FTQUFhMEVJYWlFR0FrQURRQ0FCTFFBQUlBQkIwTThBYWkwQUFFY05aeUFBUVFoR0RRRWdBRUVCYWlFQUlBUWdBVUVCYWlJQlJ3MEFDeUFDSUFVMkFnQU1wUUlMSUFKQkFEWUNBQ0FHUVFGcUlRRkJLUXhvQ3lBQklBUkdCRUJCaVFFaEF3eWtBZ3RCQVNBQkxRQUFRZDhBUncxbkdpQUJRUUZxSVFFTVhndEJpZ0VoQXlBQklBUkdEYUlDSUFJb0FnQWlBQ0FFSUFGcmFpRUZJQUVnQUd0QkFXb2hCZ05BSUFFdEFBQWdBRUdNendCcUxRQUFSdzFrSUFCQkFVWU4rZ0VnQUVFQmFpRUFJQVFnQVVFQmFpSUJSdzBBQ3lBQ0lBVTJBZ0FNb2dJTFFZc0JJUU1nQVNBRVJnMmhBaUFDS0FJQUlnQWdCQ0FCYTJvaEJTQUJJQUJyUVFKcUlRWUNRQU5BSUFFdEFBQWdBRUdPendCcUxRQUFSdzFrSUFCQkFrWU5BU0FBUVFGcUlRQWdCQ0FCUVFGcUlnRkhEUUFMSUFJZ0JUWUNBQXlpQWdzZ0FrRUFOZ0lBSUFaQkFXb2hBVUVDREdVTFFZd0JJUU1nQVNBRVJnMmdBaUFDS0FJQUlnQWdCQ0FCYTJvaEJTQUJJQUJyUVFGcUlRWUNRQU5BSUFFdEFBQWdBRUh3endCcUxRQUFSdzFqSUFCQkFVWU5BU0FBUVFGcUlRQWdCQ0FCUVFGcUlnRkhEUUFMSUFJZ0JUWUNBQXloQWdzZ0FrRUFOZ0lBSUFaQkFXb2hBVUVmREdRTFFZMEJJUU1nQVNBRVJnMmZBaUFDS0FJQUlnQWdCQ0FCYTJvaEJTQUJJQUJyUVFGcUlRWUNRQU5BSUFFdEFBQWdBRUh5endCcUxRQUFSdzFpSUFCQkFVWU5BU0FBUVFGcUlRQWdCQ0FCUVFGcUlnRkhEUUFMSUFJZ0JUWUNBQXlnQWdzZ0FrRUFOZ0lBSUFaQkFXb2hBVUVKREdNTElBRWdCRVlFUUVHT0FTRURESjhDQ3dKQUFrQWdBUzBBQUVISkFHc09Cd0JpWW1KaVlnRmlDeUFCUVFGcUlRRkIrQUFoQXd5R0Fnc2dBVUVCYWlFQlFma0FJUU1NaFFJTFFZOEJJUU1nQVNBRVJnMmRBaUFDS0FJQUlnQWdCQ0FCYTJvaEJTQUJJQUJyUVFWcUlRWUNRQU5BSUFFdEFBQWdBRUdSendCcUxRQUFSdzFnSUFCQkJVWU5BU0FBUVFGcUlRQWdCQ0FCUVFGcUlnRkhEUUFMSUFJZ0JUWUNBQXllQWdzZ0FrRUFOZ0lBSUFaQkFXb2hBVUVZREdFTFFaQUJJUU1nQVNBRVJnMmNBaUFDS0FJQUlnQWdCQ0FCYTJvaEJTQUJJQUJyUVFKcUlRWUNRQU5BSUFFdEFBQWdBRUdYendCcUxRQUFSdzFmSUFCQkFrWU5BU0FBUVFGcUlRQWdCQ0FCUVFGcUlnRkhEUUFMSUFJZ0JUWUNBQXlkQWdzZ0FrRUFOZ0lBSUFaQkFXb2hBVUVYREdBTFFaRUJJUU1nQVNBRVJnMmJBaUFDS0FJQUlnQWdCQ0FCYTJvaEJTQUJJQUJyUVFacUlRWUNRQU5BSUFFdEFBQWdBRUdhendCcUxRQUFSdzFlSUFCQkJrWU5BU0FBUVFGcUlRQWdCQ0FCUVFGcUlnRkhEUUFMSUFJZ0JUWUNBQXljQWdzZ0FrRUFOZ0lBSUFaQkFXb2hBVUVWREY4TFFaSUJJUU1nQVNBRVJnMmFBaUFDS0FJQUlnQWdCQ0FCYTJvaEJTQUJJQUJyUVFWcUlRWUNRQU5BSUFFdEFBQWdBRUdoendCcUxRQUFSdzFkSUFCQkJVWU5BU0FBUVFGcUlRQWdCQ0FCUVFGcUlnRkhEUUFMSUFJZ0JUWUNBQXliQWdzZ0FrRUFOZ0lBSUFaQkFXb2hBVUVlREY0TElBRWdCRVlFUUVHVEFTRURESm9DQ3lBQkxRQUFRY3dBUncxYklBRkJBV29oQVVFS0RGMExJQUVnQkVZRVFFR1VBU0VEREprQ0N3SkFBa0FnQVMwQUFFSEJBR3NPRHdCY1hGeGNYRnhjWEZ4Y1hGeGNBVndMSUFGQkFXb2hBVUgrQUNFRERJQUNDeUFCUVFGcUlRRkIvd0FoQXd6L0FRc2dBU0FFUmdSQVFaVUJJUU1NbUFJTEFrQUNRQ0FCTFFBQVFjRUFhdzREQUZzQld3c2dBVUVCYWlFQlFmMEFJUU1NL3dFTElBRkJBV29oQVVHQUFTRUREUDRCQzBHV0FTRURJQUVnQkVZTmxnSWdBaWdDQUNJQUlBUWdBV3RxSVFVZ0FTQUFhMEVCYWlFR0FrQURRQ0FCTFFBQUlBQkJwODhBYWkwQUFFY05XU0FBUVFGR0RRRWdBRUVCYWlFQUlBUWdBVUVCYWlJQlJ3MEFDeUFDSUFVMkFnQU1sd0lMSUFKQkFEWUNBQ0FHUVFGcUlRRkJDd3hhQ3lBQklBUkdCRUJCbHdFaEF3eVdBZ3NDUUFKQUFrQUNRQ0FCTFFBQVFTMXJEaU1BVzF0YlcxdGJXMXRiVzF0YlcxdGJXMXRiVzF0Ylcxc0JXMXRiVzFzQ1cxdGJBMXNMSUFGQkFXb2hBVUg3QUNFRERQOEJDeUFCUVFGcUlRRkIvQUFoQXd6K0FRc2dBVUVCYWlFQlFZRUJJUU1NL1FFTElBRkJBV29oQVVHQ0FTRUREUHdCQzBHWUFTRURJQUVnQkVZTmxBSWdBaWdDQUNJQUlBUWdBV3RxSVFVZ0FTQUFhMEVFYWlFR0FrQURRQ0FCTFFBQUlBQkJxYzhBYWkwQUFFY05WeUFBUVFSR0RRRWdBRUVCYWlFQUlBUWdBVUVCYWlJQlJ3MEFDeUFDSUFVMkFnQU1sUUlMSUFKQkFEWUNBQ0FHUVFGcUlRRkJHUXhZQzBHWkFTRURJQUVnQkVZTmt3SWdBaWdDQUNJQUlBUWdBV3RxSVFVZ0FTQUFhMEVGYWlFR0FrQURRQ0FCTFFBQUlBQkJyczhBYWkwQUFFY05WaUFBUVFWR0RRRWdBRUVCYWlFQUlBUWdBVUVCYWlJQlJ3MEFDeUFDSUFVMkFnQU1sQUlMSUFKQkFEWUNBQ0FHUVFGcUlRRkJCZ3hYQzBHYUFTRURJQUVnQkVZTmtnSWdBaWdDQUNJQUlBUWdBV3RxSVFVZ0FTQUFhMEVCYWlFR0FrQURRQ0FCTFFBQUlBQkJ0TThBYWkwQUFFY05WU0FBUVFGR0RRRWdBRUVCYWlFQUlBUWdBVUVCYWlJQlJ3MEFDeUFDSUFVMkFnQU1rd0lMSUFKQkFEWUNBQ0FHUVFGcUlRRkJIQXhXQzBHYkFTRURJQUVnQkVZTmtRSWdBaWdDQUNJQUlBUWdBV3RxSVFVZ0FTQUFhMEVCYWlFR0FrQURRQ0FCTFFBQUlBQkJ0czhBYWkwQUFFY05WQ0FBUVFGR0RRRWdBRUVCYWlFQUlBUWdBVUVCYWlJQlJ3MEFDeUFDSUFVMkFnQU1rZ0lMSUFKQkFEWUNBQ0FHUVFGcUlRRkJKd3hWQ3lBQklBUkdCRUJCbkFFaEF3eVJBZ3NDUUFKQUlBRXRBQUJCMUFCckRnSUFBVlFMSUFGQkFXb2hBVUdHQVNFRERQZ0JDeUFCUVFGcUlRRkJod0VoQXd6M0FRdEJuUUVoQXlBQklBUkdEWThDSUFJb0FnQWlBQ0FFSUFGcmFpRUZJQUVnQUd0QkFXb2hCZ0pBQTBBZ0FTMEFBQ0FBUWJqUEFHb3RBQUJIRFZJZ0FFRUJSZzBCSUFCQkFXb2hBQ0FFSUFGQkFXb2lBVWNOQUFzZ0FpQUZOZ0lBREpBQ0N5QUNRUUEyQWdBZ0JrRUJhaUVCUVNZTVV3dEJuZ0VoQXlBQklBUkdEWTRDSUFJb0FnQWlBQ0FFSUFGcmFpRUZJQUVnQUd0QkFXb2hCZ0pBQTBBZ0FTMEFBQ0FBUWJyUEFHb3RBQUJIRFZFZ0FFRUJSZzBCSUFCQkFXb2hBQ0FFSUFGQkFXb2lBVWNOQUFzZ0FpQUZOZ0lBREk4Q0N5QUNRUUEyQWdBZ0JrRUJhaUVCUVFNTVVndEJud0VoQXlBQklBUkdEWTBDSUFJb0FnQWlBQ0FFSUFGcmFpRUZJQUVnQUd0QkFtb2hCZ0pBQTBBZ0FTMEFBQ0FBUWUzUEFHb3RBQUJIRFZBZ0FFRUNSZzBCSUFCQkFXb2hBQ0FFSUFGQkFXb2lBVWNOQUFzZ0FpQUZOZ0lBREk0Q0N5QUNRUUEyQWdBZ0JrRUJhaUVCUVF3TVVRdEJvQUVoQXlBQklBUkdEWXdDSUFJb0FnQWlBQ0FFSUFGcmFpRUZJQUVnQUd0QkEyb2hCZ0pBQTBBZ0FTMEFBQ0FBUWJ6UEFHb3RBQUJIRFU4Z0FFRURSZzBCSUFCQkFXb2hBQ0FFSUFGQkFXb2lBVWNOQUFzZ0FpQUZOZ0lBREkwQ0N5QUNRUUEyQWdBZ0JrRUJhaUVCUVEwTVVBc2dBU0FFUmdSQVFhRUJJUU1NakFJTEFrQUNRQ0FCTFFBQVFjWUFhdzRMQUU5UFQwOVBUMDlQVHdGUEN5QUJRUUZxSVFGQml3RWhBd3p6QVFzZ0FVRUJhaUVCUVl3QklRTU04Z0VMSUFFZ0JFWUVRRUdpQVNFRERJc0NDeUFCTFFBQVFkQUFSdzFNSUFGQkFXb2hBUXhHQ3lBQklBUkdCRUJCb3dFaEF3eUtBZ3NDUUFKQUlBRXRBQUJCeVFCckRnY0JUVTFOVFUwQVRRc2dBVUVCYWlFQlFZNEJJUU1NOFFFTElBRkJBV29oQVVFaURFMExRYVFCSVFNZ0FTQUVSZzJJQWlBQ0tBSUFJZ0FnQkNBQmEyb2hCU0FCSUFCclFRRnFJUVlDUUFOQUlBRXRBQUFnQUVIQXp3QnFMUUFBUncxTElBQkJBVVlOQVNBQVFRRnFJUUFnQkNBQlFRRnFJZ0ZIRFFBTElBSWdCVFlDQUF5SkFnc2dBa0VBTmdJQUlBWkJBV29oQVVFZERFd0xJQUVnQkVZRVFFR2xBU0VERElnQ0N3SkFBa0FnQVMwQUFFSFNBR3NPQXdCTEFVc0xJQUZCQVdvaEFVR1FBU0VERE84QkN5QUJRUUZxSVFGQkJBeExDeUFCSUFSR0JFQkJwZ0VoQXd5SEFnc0NRQUpBQWtBQ1FBSkFJQUV0QUFCQndRQnJEaFVBVFUxTlRVMU5UVTFOVFFGTlRRSk5UUU5OVFFSTkN5QUJRUUZxSVFGQmlBRWhBd3p4QVFzZ0FVRUJhaUVCUVlrQklRTU04QUVMSUFGQkFXb2hBVUdLQVNFRERPOEJDeUFCUVFGcUlRRkJqd0VoQXd6dUFRc2dBVUVCYWlFQlFaRUJJUU1NN1FFTFFhY0JJUU1nQVNBRVJnMkZBaUFDS0FJQUlnQWdCQ0FCYTJvaEJTQUJJQUJyUVFKcUlRWUNRQU5BSUFFdEFBQWdBRUh0endCcUxRQUFSdzFJSUFCQkFrWU5BU0FBUVFGcUlRQWdCQ0FCUVFGcUlnRkhEUUFMSUFJZ0JUWUNBQXlHQWdzZ0FrRUFOZ0lBSUFaQkFXb2hBVUVSREVrTFFhZ0JJUU1nQVNBRVJnMkVBaUFDS0FJQUlnQWdCQ0FCYTJvaEJTQUJJQUJyUVFKcUlRWUNRQU5BSUFFdEFBQWdBRUhDendCcUxRQUFSdzFISUFCQkFrWU5BU0FBUVFGcUlRQWdCQ0FCUVFGcUlnRkhEUUFMSUFJZ0JUWUNBQXlGQWdzZ0FrRUFOZ0lBSUFaQkFXb2hBVUVzREVnTFFha0JJUU1nQVNBRVJnMkRBaUFDS0FJQUlnQWdCQ0FCYTJvaEJTQUJJQUJyUVFScUlRWUNRQU5BSUFFdEFBQWdBRUhGendCcUxRQUFSdzFHSUFCQkJFWU5BU0FBUVFGcUlRQWdCQ0FCUVFGcUlnRkhEUUFMSUFJZ0JUWUNBQXlFQWdzZ0FrRUFOZ0lBSUFaQkFXb2hBVUVyREVjTFFhb0JJUU1nQVNBRVJnMkNBaUFDS0FJQUlnQWdCQ0FCYTJvaEJTQUJJQUJyUVFKcUlRWUNRQU5BSUFFdEFBQWdBRUhLendCcUxRQUFSdzFGSUFCQkFrWU5BU0FBUVFGcUlRQWdCQ0FCUVFGcUlnRkhEUUFMSUFJZ0JUWUNBQXlEQWdzZ0FrRUFOZ0lBSUFaQkFXb2hBVUVVREVZTElBRWdCRVlFUUVHckFTRURESUlDQ3dKQUFrQUNRQUpBSUFFdEFBQkJ3Z0JyRGc4QUFRSkhSMGRIUjBkSFIwZEhSd05IQ3lBQlFRRnFJUUZCa3dFaEF3enJBUXNnQVVFQmFpRUJRWlFCSVFNTTZnRUxJQUZCQVdvaEFVR1ZBU0VERE9rQkN5QUJRUUZxSVFGQmxnRWhBd3pvQVFzZ0FTQUVSZ1JBUWF3QklRTU1nUUlMSUFFdEFBQkJ4UUJIRFVJZ0FVRUJhaUVCREQwTFFhMEJJUU1nQVNBRVJnMy9BU0FDS0FJQUlnQWdCQ0FCYTJvaEJTQUJJQUJyUVFKcUlRWUNRQU5BSUFFdEFBQWdBRUhOendCcUxRQUFSdzFDSUFCQkFrWU5BU0FBUVFGcUlRQWdCQ0FCUVFGcUlnRkhEUUFMSUFJZ0JUWUNBQXlBQWdzZ0FrRUFOZ0lBSUFaQkFXb2hBVUVPREVNTElBRWdCRVlFUUVHdUFTRUREUDhCQ3lBQkxRQUFRZEFBUncxQUlBRkJBV29oQVVFbERFSUxRYThCSVFNZ0FTQUVSZzM5QVNBQ0tBSUFJZ0FnQkNBQmEyb2hCU0FCSUFCclFRaHFJUVlDUUFOQUlBRXRBQUFnQUVIUXp3QnFMUUFBUncxQUlBQkJDRVlOQVNBQVFRRnFJUUFnQkNBQlFRRnFJZ0ZIRFFBTElBSWdCVFlDQUF6K0FRc2dBa0VBTmdJQUlBWkJBV29oQVVFcURFRUxJQUVnQkVZRVFFR3dBU0VERFAwQkN3SkFBa0FnQVMwQUFFSFZBR3NPQ3dCQVFFQkFRRUJBUUVBQlFBc2dBVUVCYWlFQlFab0JJUU1NNUFFTElBRkJBV29oQVVHYkFTRURET01CQ3lBQklBUkdCRUJCc1FFaEF3ejhBUXNDUUFKQUlBRXRBQUJCd1FCckRoUUFQejgvUHo4L1B6OC9QejgvUHo4L1B6OC9BVDhMSUFGQkFXb2hBVUdaQVNFRERPTUJDeUFCUVFGcUlRRkJuQUVoQXd6aUFRdEJzZ0VoQXlBQklBUkdEZm9CSUFJb0FnQWlBQ0FFSUFGcmFpRUZJQUVnQUd0QkEyb2hCZ0pBQTBBZ0FTMEFBQ0FBUWRuUEFHb3RBQUJIRFQwZ0FFRURSZzBCSUFCQkFXb2hBQ0FFSUFGQkFXb2lBVWNOQUFzZ0FpQUZOZ0lBRFBzQkN5QUNRUUEyQWdBZ0JrRUJhaUVCUVNFTVBndEJzd0VoQXlBQklBUkdEZmtCSUFJb0FnQWlBQ0FFSUFGcmFpRUZJQUVnQUd0QkJtb2hCZ0pBQTBBZ0FTMEFBQ0FBUWQzUEFHb3RBQUJIRFR3Z0FFRUdSZzBCSUFCQkFXb2hBQ0FFSUFGQkFXb2lBVWNOQUFzZ0FpQUZOZ0lBRFBvQkN5QUNRUUEyQWdBZ0JrRUJhaUVCUVJvTVBRc2dBU0FFUmdSQVFiUUJJUU1NK1FFTEFrQUNRQUpBSUFFdEFBQkJ4UUJyRGhFQVBUMDlQVDA5UFQwOUFUMDlQVDA5QWowTElBRkJBV29oQVVHZEFTRURET0VCQ3lBQlFRRnFJUUZCbmdFaEF3emdBUXNnQVVFQmFpRUJRWjhCSVFNTTN3RUxRYlVCSVFNZ0FTQUVSZzMzQVNBQ0tBSUFJZ0FnQkNBQmEyb2hCU0FCSUFCclFRVnFJUVlDUUFOQUlBRXRBQUFnQUVIa3p3QnFMUUFBUncwNklBQkJCVVlOQVNBQVFRRnFJUUFnQkNBQlFRRnFJZ0ZIRFFBTElBSWdCVFlDQUF6NEFRc2dBa0VBTmdJQUlBWkJBV29oQVVFb0REc0xRYllCSVFNZ0FTQUVSZzMyQVNBQ0tBSUFJZ0FnQkNBQmEyb2hCU0FCSUFCclFRSnFJUVlDUUFOQUlBRXRBQUFnQUVIcXp3QnFMUUFBUncwNUlBQkJBa1lOQVNBQVFRRnFJUUFnQkNBQlFRRnFJZ0ZIRFFBTElBSWdCVFlDQUF6M0FRc2dBa0VBTmdJQUlBWkJBV29oQVVFSEREb0xJQUVnQkVZRVFFRzNBU0VERFBZQkN3SkFBa0FnQVMwQUFFSEZBR3NPRGdBNU9UazVPVGs1T1RrNU9Ua0JPUXNnQVVFQmFpRUJRYUVCSVFNTTNRRUxJQUZCQVdvaEFVR2lBU0VERE53QkMwRzRBU0VESUFFZ0JFWU45QUVnQWlnQ0FDSUFJQVFnQVd0cUlRVWdBU0FBYTBFQ2FpRUdBa0FEUUNBQkxRQUFJQUJCN2M4QWFpMEFBRWNOTnlBQVFRSkdEUUVnQUVFQmFpRUFJQVFnQVVFQmFpSUJSdzBBQ3lBQ0lBVTJBZ0FNOVFFTElBSkJBRFlDQUNBR1FRRnFJUUZCRWd3NEMwRzVBU0VESUFFZ0JFWU44d0VnQWlnQ0FDSUFJQVFnQVd0cUlRVWdBU0FBYTBFQmFpRUdBa0FEUUNBQkxRQUFJQUJCOE04QWFpMEFBRWNOTmlBQVFRRkdEUUVnQUVFQmFpRUFJQVFnQVVFQmFpSUJSdzBBQ3lBQ0lBVTJBZ0FNOUFFTElBSkJBRFlDQUNBR1FRRnFJUUZCSUF3M0MwRzZBU0VESUFFZ0JFWU44Z0VnQWlnQ0FDSUFJQVFnQVd0cUlRVWdBU0FBYTBFQmFpRUdBa0FEUUNBQkxRQUFJQUJCOHM4QWFpMEFBRWNOTlNBQVFRRkdEUUVnQUVFQmFpRUFJQVFnQVVFQmFpSUJSdzBBQ3lBQ0lBVTJBZ0FNOHdFTElBSkJBRFlDQUNBR1FRRnFJUUZCRHd3MkN5QUJJQVJHQkVCQnV3RWhBd3p5QVFzQ1FBSkFJQUV0QUFCQnlRQnJEZ2NBTlRVMU5UVUJOUXNnQVVFQmFpRUJRYVVCSVFNTTJRRUxJQUZCQVdvaEFVR21BU0VERE5nQkMwRzhBU0VESUFFZ0JFWU44QUVnQWlnQ0FDSUFJQVFnQVd0cUlRVWdBU0FBYTBFSGFpRUdBa0FEUUNBQkxRQUFJQUJCOU04QWFpMEFBRWNOTXlBQVFRZEdEUUVnQUVFQmFpRUFJQVFnQVVFQmFpSUJSdzBBQ3lBQ0lBVTJBZ0FNOFFFTElBSkJBRFlDQUNBR1FRRnFJUUZCR3d3MEN5QUJJQVJHQkVCQnZRRWhBd3p3QVFzQ1FBSkFBa0FnQVMwQUFFSENBR3NPRWdBME5EUTBORFEwTkRRQk5EUTBORFEwQWpRTElBRkJBV29oQVVHa0FTRURETmdCQ3lBQlFRRnFJUUZCcHdFaEF3elhBUXNnQVVFQmFpRUJRYWdCSVFNTTFnRUxJQUVnQkVZRVFFRytBU0VERE84QkN5QUJMUUFBUWM0QVJ3MHdJQUZCQVdvaEFRd3NDeUFCSUFSR0JFQkJ2d0VoQXd6dUFRc0NRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQkxRQUFRY0VBYXc0VkFBRUNBejhFQlFZL1B6OEhDQWtLQ3o4TURRNFBQd3NnQVVFQmFpRUJRZWdBSVFNTTR3RUxJQUZCQVdvaEFVSHBBQ0VERE9JQkN5QUJRUUZxSVFGQjdnQWhBd3poQVFzZ0FVRUJhaUVCUWZJQUlRTU00QUVMSUFGQkFXb2hBVUh6QUNFREROOEJDeUFCUVFGcUlRRkI5Z0FoQXd6ZUFRc2dBVUVCYWlFQlFmY0FJUU1NM1FFTElBRkJBV29oQVVINkFDRURETndCQ3lBQlFRRnFJUUZCZ3dFaEF3emJBUXNnQVVFQmFpRUJRWVFCSVFNTTJnRUxJQUZCQVdvaEFVR0ZBU0VERE5rQkN5QUJRUUZxSVFGQmtnRWhBd3pZQVFzZ0FVRUJhaUVCUVpnQklRTU0xd0VMSUFGQkFXb2hBVUdnQVNFREROWUJDeUFCUVFGcUlRRkJvd0VoQXd6VkFRc2dBVUVCYWlFQlFhb0JJUU1NMUFFTElBRWdCRWNFUUNBQ1FSQTJBZ2dnQWlBQk5nSUVRYXNCSVFNTTFBRUxRY0FCSVFNTTdBRUxRUUFoQUFKQUlBSW9BamdpQTBVTkFDQURLQUkwSWdORkRRQWdBaUFERVFBQUlRQUxJQUJGRFY0Z0FFRVZSdzBISUFKQjBRQTJBaHdnQWlBQk5nSVVJQUpCc0JjMkFoQWdBa0VWTmdJTVFRQWhBd3pyQVFzZ0FVRUJhaUFCSUFSSERRZ2FRY0lCSVFNTTZnRUxBMEFDUUNBQkxRQUFRUXByRGdRSUFBQUxBQXNnQkNBQlFRRnFJZ0ZIRFFBTFFjTUJJUU1NNlFFTElBRWdCRWNFUUNBQ1FSRTJBZ2dnQWlBQk5nSUVRUUVoQXd6UUFRdEJ4QUVoQXd6b0FRc2dBU0FFUmdSQVFjVUJJUU1NNkFFTEFrQUNRQ0FCTFFBQVFRcHJEZ1FCS0NnQUtBc2dBVUVCYWd3SkN5QUJRUUZxREFVTElBRWdCRVlFUUVIR0FTRURET2NCQ3dKQUFrQWdBUzBBQUVFS2F3NFhBUXNMQVFzTEN3c0xDd3NMQ3dzTEN3c0xDd3NMQ3dBTEN5QUJRUUZxSVFFTFFiQUJJUU1NelFFTElBRWdCRVlFUUVISUFTRURET1lCQ3lBQkxRQUFRU0JIRFFrZ0FrRUFPd0V5SUFGQkFXb2hBVUd6QVNFRERNd0JDd05BSUFFaEFBSkFJQUVnQkVjRVFDQUJMUUFBUVRCclFmOEJjU0lEUVFwSkRRRU1Kd3RCeHdFaEF3em1BUXNDUUNBQ0x3RXlJZ0ZCbVROTERRQWdBaUFCUVFwc0lnVTdBVElnQlVIKy93TnhJQU5CLy84RGMwc05BQ0FBUVFGcUlRRWdBaUFESUFWcUlnTTdBVElnQTBILy93TnhRZWdIU1EwQkN3dEJBQ0VESUFKQkFEWUNIQ0FDUWNFSk5nSVFJQUpCRFRZQ0RDQUNJQUJCQVdvMkFoUU01QUVMSUFKQkFEWUNIQ0FDSUFFMkFoUWdBa0h3RERZQ0VDQUNRUnMyQWd4QkFDRURET01CQ3lBQ0tBSUVJUUFnQWtFQU5nSUVJQUlnQUNBQkVDWWlBQTBCSUFGQkFXb0xJUUZCclFFaEF3eklBUXNnQWtIQkFUWUNIQ0FDSUFBMkFnd2dBaUFCUVFGcU5nSVVRUUFoQXd6Z0FRc2dBaWdDQkNFQUlBSkJBRFlDQkNBQ0lBQWdBUkFtSWdBTkFTQUJRUUZxQ3lFQlFhNEJJUU1NeFFFTElBSkJ3Z0UyQWh3Z0FpQUFOZ0lNSUFJZ0FVRUJhallDRkVFQUlRTU0zUUVMSUFKQkFEWUNIQ0FDSUFFMkFoUWdBa0dYQ3pZQ0VDQUNRUTAyQWd4QkFDRURETndCQ3lBQ1FRQTJBaHdnQWlBQk5nSVVJQUpCNHhBMkFoQWdBa0VKTmdJTVFRQWhBd3piQVFzZ0FrRUNPZ0FvREt3QkMwRUFJUU1nQWtFQU5nSWNJQUpCcndzMkFoQWdBa0VDTmdJTUlBSWdBVUVCYWpZQ0ZBelpBUXRCQWlFRERMOEJDMEVOSVFNTXZnRUxRU1loQXd5OUFRdEJGU0VEREx3QkMwRVdJUU1NdXdFTFFSZ2hBd3k2QVF0QkhDRURETGtCQzBFZElRTU11QUVMUVNBaEF3eTNBUXRCSVNFRERMWUJDMEVqSVFNTXRRRUxRY1lBSVFNTXRBRUxRUzRoQXd5ekFRdEJQU0VERExJQkMwSExBQ0VERExFQkMwSE9BQ0VERExBQkMwSFlBQ0VEREs4QkMwSFpBQ0VEREs0QkMwSGJBQ0VEREswQkMwSHhBQ0VEREt3QkMwSDBBQ0VEREtzQkMwR05BU0VEREtvQkMwR1hBU0VEREtrQkMwR3BBU0VEREtnQkMwR3ZBU0VEREtjQkMwR3hBU0VEREtZQkN5QUNRUUEyQWdBTFFRQWhBeUFDUVFBMkFod2dBaUFCTmdJVUlBSkI4UnMyQWhBZ0FrRUdOZ0lNREwwQkN5QUNRUUEyQWdBZ0JrRUJhaUVCUVNRTE9nQXBJQUlvQWdRaEFDQUNRUUEyQWdRZ0FpQUFJQUVRSnlJQVJRUkFRZVVBSVFNTW93RUxJQUpCK1FBMkFod2dBaUFCTmdJVUlBSWdBRFlDREVFQUlRTU11d0VMSUFCQkZVY0VRQ0FDUVFBMkFod2dBaUFCTmdJVUlBSkJ6QTQyQWhBZ0FrRWdOZ0lNUVFBaEF3eTdBUXNnQWtINEFEWUNIQ0FDSUFFMkFoUWdBa0hLR0RZQ0VDQUNRUlUyQWd4QkFDRURETG9CQ3lBQ1FRQTJBaHdnQWlBQk5nSVVJQUpCamhzMkFoQWdBa0VHTmdJTVFRQWhBd3k1QVFzZ0FrRUFOZ0ljSUFJZ0FUWUNGQ0FDUWY0Uk5nSVFJQUpCQnpZQ0RFRUFJUU1NdUFFTElBSkJBRFlDSENBQ0lBRTJBaFFnQWtHTUhEWUNFQ0FDUVFjMkFneEJBQ0VERExjQkN5QUNRUUEyQWh3Z0FpQUJOZ0lVSUFKQnd3ODJBaEFnQWtFSE5nSU1RUUFoQXd5MkFRc2dBa0VBTmdJY0lBSWdBVFlDRkNBQ1FjTVBOZ0lRSUFKQkJ6WUNERUVBSVFNTXRRRUxJQUlvQWdRaEFDQUNRUUEyQWdRZ0FpQUFJQUVRSlNJQVJRMFJJQUpCNVFBMkFod2dBaUFCTmdJVUlBSWdBRFlDREVFQUlRTU10QUVMSUFJb0FnUWhBQ0FDUVFBMkFnUWdBaUFBSUFFUUpTSUFSUTBnSUFKQjB3QTJBaHdnQWlBQk5nSVVJQUlnQURZQ0RFRUFJUU1Nc3dFTElBSW9BZ1FoQUNBQ1FRQTJBZ1FnQWlBQUlBRVFKU0lBUlEwaUlBSkIwZ0EyQWh3Z0FpQUJOZ0lVSUFJZ0FEWUNERUVBSVFNTXNnRUxJQUlvQWdRaEFDQUNRUUEyQWdRZ0FpQUFJQUVRSlNJQVJRME9JQUpCNVFBMkFod2dBaUFCTmdJVUlBSWdBRFlDREVFQUlRTU1zUUVMSUFJb0FnUWhBQ0FDUVFBMkFnUWdBaUFBSUFFUUpTSUFSUTBkSUFKQjB3QTJBaHdnQWlBQk5nSVVJQUlnQURZQ0RFRUFJUU1Nc0FFTElBSW9BZ1FoQUNBQ1FRQTJBZ1FnQWlBQUlBRVFKU0lBUlEwZklBSkIwZ0EyQWh3Z0FpQUJOZ0lVSUFJZ0FEWUNERUVBSVFNTXJ3RUxJQUJCUDBjTkFTQUJRUUZxQ3lFQlFRVWhBd3lVQVF0QkFDRURJQUpCQURZQ0hDQUNJQUUyQWhRZ0FrSDlFallDRUNBQ1FRYzJBZ3dNckFFTElBSkJBRFlDSENBQ0lBRTJBaFFnQWtIY0NEWUNFQ0FDUVFjMkFneEJBQ0VEREtzQkN5QUNLQUlFSVFBZ0FrRUFOZ0lFSUFJZ0FDQUJFQ1VpQUVVTkJ5QUNRZVVBTmdJY0lBSWdBVFlDRkNBQ0lBQTJBZ3hCQUNFRERLb0JDeUFDS0FJRUlRQWdBa0VBTmdJRUlBSWdBQ0FCRUNVaUFFVU5GaUFDUWRNQU5nSWNJQUlnQVRZQ0ZDQUNJQUEyQWd4QkFDRURES2tCQ3lBQ0tBSUVJUUFnQWtFQU5nSUVJQUlnQUNBQkVDVWlBRVVOR0NBQ1FkSUFOZ0ljSUFJZ0FUWUNGQ0FDSUFBMkFneEJBQ0VEREtnQkN5QUNRUUEyQWh3Z0FpQUJOZ0lVSUFKQnhnbzJBaEFnQWtFSE5nSU1RUUFoQXd5bkFRc2dBaWdDQkNFQUlBSkJBRFlDQkNBQ0lBQWdBUkFsSWdCRkRRTWdBa0hsQURZQ0hDQUNJQUUyQWhRZ0FpQUFOZ0lNUVFBaEF3eW1BUXNnQWlnQ0JDRUFJQUpCQURZQ0JDQUNJQUFnQVJBbElnQkZEUklnQWtIVEFEWUNIQ0FDSUFFMkFoUWdBaUFBTmdJTVFRQWhBd3lsQVFzZ0FpZ0NCQ0VBSUFKQkFEWUNCQ0FDSUFBZ0FSQWxJZ0JGRFJRZ0FrSFNBRFlDSENBQ0lBRTJBaFFnQWlBQU5nSU1RUUFoQXd5a0FRc2dBaWdDQkNFQUlBSkJBRFlDQkNBQ0lBQWdBUkFsSWdCRkRRQWdBa0hsQURZQ0hDQUNJQUUyQWhRZ0FpQUFOZ0lNUVFBaEF3eWpBUXRCMVFBaEF3eUpBUXNnQUVFVlJ3UkFJQUpCQURZQ0hDQUNJQUUyQWhRZ0FrRzVEVFlDRUNBQ1FSbzJBZ3hCQUNFRERLSUJDeUFDUWVRQU5nSWNJQUlnQVRZQ0ZDQUNRZU1YTmdJUUlBSkJGVFlDREVFQUlRTU1vUUVMSUFKQkFEWUNBQ0FHUVFGcUlRRWdBaTBBS1NJQVFTTnJRUXRKRFFRQ1FDQUFRUVpMRFFCQkFTQUFkRUhLQUhGRkRRQU1CUXRCQUNFRElBSkJBRFlDSENBQ0lBRTJBaFFnQWtIM0NUWUNFQ0FDUVFnMkFnd01vQUVMSUFKQkFEWUNBQ0FHUVFGcUlRRWdBaTBBS1VFaFJnMERJQUpCQURZQ0hDQUNJQUUyQWhRZ0FrR2JDallDRUNBQ1FRZzJBZ3hCQUNFRERKOEJDeUFDUVFBMkFnQUxRUUFoQXlBQ1FRQTJBaHdnQWlBQk5nSVVJQUpCa0RNMkFoQWdBa0VJTmdJTURKMEJDeUFDUVFBMkFnQWdCa0VCYWlFQklBSXRBQ2xCSTBrTkFDQUNRUUEyQWh3Z0FpQUJOZ0lVSUFKQjB3azJBaEFnQWtFSU5nSU1RUUFoQXd5Y0FRdEIwUUFoQXd5Q0FRc2dBUzBBQUVFd2F5SUFRZjhCY1VFS1NRUkFJQUlnQURvQUtpQUJRUUZxSVFGQnp3QWhBd3lDQVFzZ0FpZ0NCQ0VBSUFKQkFEWUNCQ0FDSUFBZ0FSQW9JZ0JGRFlZQklBSkIzZ0EyQWh3Z0FpQUJOZ0lVSUFJZ0FEWUNERUVBSVFNTW1nRUxJQUlvQWdRaEFDQUNRUUEyQWdRZ0FpQUFJQUVRS0NJQVJRMkdBU0FDUWR3QU5nSWNJQUlnQVRZQ0ZDQUNJQUEyQWd4QkFDRURESmtCQ3lBQ0tBSUVJUUFnQWtFQU5nSUVJQUlnQUNBRkVDZ2lBRVVFUUNBRklRRU1od0VMSUFKQjJnQTJBaHdnQWlBRk5nSVVJQUlnQURZQ0RBeVlBUXRCQUNFQlFRRWhBd3NnQWlBRE9nQXJJQVZCQVdvaEF3SkFBa0FDUUNBQ0xRQXRRUkJ4RFFBQ1FBSkFBa0FnQWkwQUtnNERBUUFDQkFzZ0JrVU5Bd3dDQ3lBQURRRU1BZ3NnQVVVTkFRc2dBaWdDQkNFQUlBSkJBRFlDQkNBQ0lBQWdBeEFvSWdCRkJFQWdBeUVCREFJTElBSkIyQUEyQWh3Z0FpQUROZ0lVSUFJZ0FEWUNERUVBSVFNTW1BRUxJQUlvQWdRaEFDQUNRUUEyQWdRZ0FpQUFJQU1RS0NJQVJRUkFJQU1oQVF5SEFRc2dBa0haQURZQ0hDQUNJQU0yQWhRZ0FpQUFOZ0lNUVFBaEF3eVhBUXRCekFBaEF3eDlDeUFBUVJWSEJFQWdBa0VBTmdJY0lBSWdBVFlDRkNBQ1FaUU5OZ0lRSUFKQklUWUNERUVBSVFNTWxnRUxJQUpCMXdBMkFod2dBaUFCTmdJVUlBSkJ5UmMyQWhBZ0FrRVZOZ0lNUVFBaEF3eVZBUXRCQUNFRElBSkJBRFlDSENBQ0lBRTJBaFFnQWtHQUVUWUNFQ0FDUVFrMkFnd01sQUVMSUFJb0FnUWhBQ0FDUVFBMkFnUWdBaUFBSUFFUUpTSUFSUTBBSUFKQjB3QTJBaHdnQWlBQk5nSVVJQUlnQURZQ0RFRUFJUU1Na3dFTFFja0FJUU1NZVFzZ0FrRUFOZ0ljSUFJZ0FUWUNGQ0FDUWNFb05nSVFJQUpCQnpZQ0RDQUNRUUEyQWdCQkFDRURESkVCQ3lBQ0tBSUVJUUJCQUNFRElBSkJBRFlDQkNBQ0lBQWdBUkFsSWdCRkRRQWdBa0hTQURZQ0hDQUNJQUUyQWhRZ0FpQUFOZ0lNREpBQkMwSElBQ0VEREhZTElBSkJBRFlDQUNBRklRRUxJQUpCZ0JJN0FTb2dBVUVCYWlFQlFRQWhBQUpBSUFJb0FqZ2lBMFVOQUNBREtBSXdJZ05GRFFBZ0FpQURFUUFBSVFBTElBQU5BUXRCeHdBaEF3eHpDeUFBUVJWR0JFQWdBa0hSQURZQ0hDQUNJQUUyQWhRZ0FrSGpGellDRUNBQ1FSVTJBZ3hCQUNFRERJd0JDMEVBSVFNZ0FrRUFOZ0ljSUFJZ0FUWUNGQ0FDUWJrTk5nSVFJQUpCR2pZQ0RBeUxBUXRCQUNFRElBSkJBRFlDSENBQ0lBRTJBaFFnQWtHZ0dUWUNFQ0FDUVI0MkFnd01pZ0VMSUFFdEFBQkJPa1lFUUNBQ0tBSUVJUUJCQUNFRElBSkJBRFlDQkNBQ0lBQWdBUkFwSWdCRkRRRWdBa0hEQURZQ0hDQUNJQUEyQWd3Z0FpQUJRUUZxTmdJVURJb0JDMEVBSVFNZ0FrRUFOZ0ljSUFJZ0FUWUNGQ0FDUWJFUk5nSVFJQUpCQ2pZQ0RBeUpBUXNnQVVFQmFpRUJRVHNoQXd4dkN5QUNRY01BTmdJY0lBSWdBRFlDRENBQ0lBRkJBV28yQWhRTWh3RUxRUUFoQXlBQ1FRQTJBaHdnQWlBQk5nSVVJQUpCOEE0MkFoQWdBa0VjTmdJTURJWUJDeUFDSUFJdkFUQkJFSEk3QVRBTVpnc0NRQ0FDTHdFd0lnQkJDSEZGRFFBZ0FpMEFLRUVCUncwQUlBSXRBQzFCQ0hGRkRRTUxJQUlnQUVIMyt3TnhRWUFFY2pzQk1Bd0VDeUFCSUFSSEJFQUNRQU5BSUFFdEFBQkJNR3NpQUVIL0FYRkJDazhFUUVFMUlRTU1iZ3NnQWlrRElDSUtRcG16NXN5WnMrYk1HVllOQVNBQ0lBcENDbjRpQ2pjRElDQUtJQUN0UXY4Qmd5SUxRbitGVmcwQklBSWdDaUFMZkRjRElDQUVJQUZCQVdvaUFVY05BQXRCT1NFRERJVUJDeUFDS0FJRUlRQkJBQ0VESUFKQkFEWUNCQ0FDSUFBZ0FVRUJhaUlCRUNvaUFBME1ESGNMUVRraEF3eURBUXNnQWkwQU1FRWdjUTBHUWNVQklRTU1hUXRCQUNFRElBSkJBRFlDQkNBQ0lBRWdBUkFxSWdCRkRRUWdBa0U2TmdJY0lBSWdBRFlDRENBQ0lBRkJBV28yQWhRTWdRRUxJQUl0QUNoQkFVY05BQ0FDTFFBdFFRaHhSUTBCQzBFM0lRTU1aZ3NnQWlnQ0JDRUFRUUFoQXlBQ1FRQTJBZ1FnQWlBQUlBRVFLaUlBQkVBZ0FrRTdOZ0ljSUFJZ0FEWUNEQ0FDSUFGQkFXbzJBaFFNZndzZ0FVRUJhaUVCREc0TElBSkJDRG9BTEF3RUN5QUJRUUZxSVFFTWJRdEJBQ0VESUFKQkFEWUNIQ0FDSUFFMkFoUWdBa0hrRWpZQ0VDQUNRUVEyQWd3TWV3c2dBaWdDQkNFQVFRQWhBeUFDUVFBMkFnUWdBaUFBSUFFUUtpSUFSUTFzSUFKQk56WUNIQ0FDSUFFMkFoUWdBaUFBTmdJTURIb0xJQUlnQWk4Qk1FRWdjanNCTUF0Qk1DRURERjhMSUFKQk5qWUNIQ0FDSUFFMkFoUWdBaUFBTmdJTURIY0xJQUJCTEVjTkFTQUJRUUZxSVFCQkFTRUJBa0FDUUFKQUFrQUNRQ0FDTFFBc1FRVnJEZ1FEQVFJRUFBc2dBQ0VCREFRTFFRSWhBUXdCQzBFRUlRRUxJQUpCQVRvQUxDQUNJQUl2QVRBZ0FYSTdBVEFnQUNFQkRBRUxJQUlnQWk4Qk1FRUljanNCTUNBQUlRRUxRVGtoQXd4Y0N5QUNRUUE2QUN3TFFUUWhBd3hhQ3lBQklBUkdCRUJCTFNFRERITUxBa0FDUUFOQUFrQWdBUzBBQUVFS2F3NEVBZ0FBQXdBTElBUWdBVUVCYWlJQlJ3MEFDMEV0SVFNTWRBc2dBaWdDQkNFQVFRQWhBeUFDUVFBMkFnUWdBaUFBSUFFUUtpSUFSUTBDSUFKQkxEWUNIQ0FDSUFFMkFoUWdBaUFBTmdJTURITUxJQUlvQWdRaEFFRUFJUU1nQWtFQU5nSUVJQUlnQUNBQkVDb2lBRVVFUUNBQlFRRnFJUUVNQWdzZ0FrRXNOZ0ljSUFJZ0FEWUNEQ0FDSUFGQkFXbzJBaFFNY2dzZ0FTMEFBRUVOUmdSQUlBSW9BZ1FoQUVFQUlRTWdBa0VBTmdJRUlBSWdBQ0FCRUNvaUFFVUVRQ0FCUVFGcUlRRU1BZ3NnQWtFc05nSWNJQUlnQURZQ0RDQUNJQUZCQVdvMkFoUU1jZ3NnQWkwQUxVRUJjUVJBUWNRQklRTU1XUXNnQWlnQ0JDRUFRUUFoQXlBQ1FRQTJBZ1FnQWlBQUlBRVFLaUlBRFFFTVpRdEJMeUVEREZjTElBSkJMallDSENBQ0lBRTJBaFFnQWlBQU5nSU1ERzhMUVFBaEF5QUNRUUEyQWh3Z0FpQUJOZ0lVSUFKQjhCUTJBaEFnQWtFRE5nSU1ERzRMUVFFaEF3SkFBa0FDUUFKQUlBSXRBQ3hCQldzT0JBTUJBZ0FFQ3lBQ0lBSXZBVEJCQ0hJN0FUQU1Bd3RCQWlFRERBRUxRUVFoQXdzZ0FrRUJPZ0FzSUFJZ0FpOEJNQ0FEY2pzQk1BdEJLaUVEREZNTFFRQWhBeUFDUVFBMkFod2dBaUFCTmdJVUlBSkI0UTgyQWhBZ0FrRUtOZ0lNREdzTFFRRWhBd0pBQWtBQ1FBSkFBa0FDUUNBQ0xRQXNRUUpyRGdjRkJBUURBUUlBQkFzZ0FpQUNMd0V3UVFoeU93RXdEQU1MUVFJaEF3d0JDMEVFSVFNTElBSkJBVG9BTENBQ0lBSXZBVEFnQTNJN0FUQUxRU3NoQXd4U0MwRUFJUU1nQWtFQU5nSWNJQUlnQVRZQ0ZDQUNRYXNTTmdJUUlBSkJDellDREF4cUMwRUFJUU1nQWtFQU5nSWNJQUlnQVRZQ0ZDQUNRZjBOTmdJUUlBSkJIVFlDREF4cEN5QUJJQVJIQkVBRFFDQUJMUUFBUVNCSERVZ2dCQ0FCUVFGcUlnRkhEUUFMUVNVaEF3eHBDMEVsSVFNTWFBc2dBaTBBTFVFQmNRUkFRY01CSVFNTVR3c2dBaWdDQkNFQVFRQWhBeUFDUVFBMkFnUWdBaUFBSUFFUUtTSUFCRUFnQWtFbU5nSWNJQUlnQURZQ0RDQUNJQUZCQVdvMkFoUU1hQXNnQVVFQmFpRUJERndMSUFGQkFXb2hBU0FDTHdFd0lnQkJnQUZ4QkVCQkFDRUFBa0FnQWlnQ09DSURSUTBBSUFNb0FsUWlBMFVOQUNBQ0lBTVJBQUFoQUFzZ0FFVU5CaUFBUVJWSERSOGdBa0VGTmdJY0lBSWdBVFlDRkNBQ1Fma1hOZ0lRSUFKQkZUWUNERUVBSVFNTVp3c0NRQ0FBUWFBRWNVR2dCRWNOQUNBQ0xRQXRRUUp4RFFCQkFDRURJQUpCQURZQ0hDQUNJQUUyQWhRZ0FrR1dFellDRUNBQ1FRUTJBZ3dNWndzZ0FnSi9JQUl2QVRCQkZIRkJGRVlFUUVFQklBSXRBQ2hCQVVZTkFSb2dBaThCTWtIbEFFWU1BUXNnQWkwQUtVRUZSZ3M2QUM1QkFDRUFBa0FnQWlnQ09DSURSUTBBSUFNb0FpUWlBMFVOQUNBQ0lBTVJBQUFoQUFzQ1FBSkFBa0FDUUFKQUlBQU9GZ0lCQUFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFNRUN5QUNRUUU2QUM0TElBSWdBaThCTUVIQUFISTdBVEFMUVNjaEF3eFBDeUFDUVNNMkFod2dBaUFCTmdJVUlBSkJwUlkyQWhBZ0FrRVZOZ0lNUVFBaEF3eG5DMEVBSVFNZ0FrRUFOZ0ljSUFJZ0FUWUNGQ0FDUWRVTE5nSVFJQUpCRVRZQ0RBeG1DMEVBSVFBQ1FDQUNLQUk0SWdORkRRQWdBeWdDTENJRFJRMEFJQUlnQXhFQUFDRUFDeUFBRFFFTFFRNGhBd3hMQ3lBQVFSVkdCRUFnQWtFQ05nSWNJQUlnQVRZQ0ZDQUNRYkFZTmdJUUlBSkJGVFlDREVFQUlRTU1aQXRCQUNFRElBSkJBRFlDSENBQ0lBRTJBaFFnQWtHbkRqWUNFQ0FDUVJJMkFnd01Zd3RCQUNFRElBSkJBRFlDSENBQ0lBRTJBaFFnQWtHcUhEWUNFQ0FDUVE4MkFnd01ZZ3NnQWlnQ0JDRUFRUUFoQXlBQ1FRQTJBZ1FnQWlBQUlBRWdDcWRxSWdFUUt5SUFSUTBBSUFKQkJUWUNIQ0FDSUFFMkFoUWdBaUFBTmdJTURHRUxRUThoQXd4SEMwRUFJUU1nQWtFQU5nSWNJQUlnQVRZQ0ZDQUNRYzBUTmdJUUlBSkJERFlDREF4ZkMwSUJJUW9MSUFGQkFXb2hBUUpBSUFJcEF5QWlDMEwvLy8vLy8vLy8vdzlZQkVBZ0FpQUxRZ1NHSUFxRU53TWdEQUVMUVFBaEF5QUNRUUEyQWh3Z0FpQUJOZ0lVSUFKQnJRazJBaEFnQWtFTU5nSU1ERjRMUVNRaEF3eEVDMEVBSVFNZ0FrRUFOZ0ljSUFJZ0FUWUNGQ0FDUWMwVE5nSVFJQUpCRERZQ0RBeGNDeUFDS0FJRUlRQkJBQ0VESUFKQkFEWUNCQ0FDSUFBZ0FSQXNJZ0JGQkVBZ0FVRUJhaUVCREZJTElBSkJGellDSENBQ0lBQTJBZ3dnQWlBQlFRRnFOZ0lVREZzTElBSW9BZ1FoQUVFQUlRTWdBa0VBTmdJRUFrQWdBaUFBSUFFUUxDSUFSUVJBSUFGQkFXb2hBUXdCQ3lBQ1FSWTJBaHdnQWlBQU5nSU1JQUlnQVVFQmFqWUNGQXhiQzBFZklRTU1RUXRCQUNFRElBSkJBRFlDSENBQ0lBRTJBaFFnQWtHYUR6WUNFQ0FDUVNJMkFnd01XUXNnQWlnQ0JDRUFRUUFoQXlBQ1FRQTJBZ1FnQWlBQUlBRVFMU0lBUlFSQUlBRkJBV29oQVF4UUN5QUNRUlEyQWh3Z0FpQUFOZ0lNSUFJZ0FVRUJhallDRkF4WUN5QUNLQUlFSVFCQkFDRURJQUpCQURZQ0JBSkFJQUlnQUNBQkVDMGlBRVVFUUNBQlFRRnFJUUVNQVFzZ0FrRVROZ0ljSUFJZ0FEWUNEQ0FDSUFGQkFXbzJBaFFNV0F0QkhpRURERDRMUVFBaEF5QUNRUUEyQWh3Z0FpQUJOZ0lVSUFKQnhndzJBaEFnQWtFak5nSU1ERllMSUFJb0FnUWhBRUVBSVFNZ0FrRUFOZ0lFSUFJZ0FDQUJFQzBpQUVVRVFDQUJRUUZxSVFFTVRnc2dBa0VSTmdJY0lBSWdBRFlDRENBQ0lBRkJBV28yQWhRTVZRc2dBa0VRTmdJY0lBSWdBVFlDRkNBQ0lBQTJBZ3dNVkF0QkFDRURJQUpCQURZQ0hDQUNJQUUyQWhRZ0FrSEdERFlDRUNBQ1FTTTJBZ3dNVXd0QkFDRURJQUpCQURZQ0hDQUNJQUUyQWhRZ0FrSEFGVFlDRUNBQ1FRSTJBZ3dNVWdzZ0FpZ0NCQ0VBUVFBaEF5QUNRUUEyQWdRQ1FDQUNJQUFnQVJBdElnQkZCRUFnQVVFQmFpRUJEQUVMSUFKQkRqWUNIQ0FDSUFBMkFnd2dBaUFCUVFGcU5nSVVERklMUVJzaEF3dzRDMEVBSVFNZ0FrRUFOZ0ljSUFJZ0FUWUNGQ0FDUWNZTU5nSVFJQUpCSXpZQ0RBeFFDeUFDS0FJRUlRQkJBQ0VESUFKQkFEWUNCQUpBSUFJZ0FDQUJFQ3dpQUVVRVFDQUJRUUZxSVFFTUFRc2dBa0VOTmdJY0lBSWdBRFlDRENBQ0lBRkJBV28yQWhRTVVBdEJHaUVERERZTFFRQWhBeUFDUVFBMkFod2dBaUFCTmdJVUlBSkJtZzgyQWhBZ0FrRWlOZ0lNREU0TElBSW9BZ1FoQUVFQUlRTWdBa0VBTmdJRUFrQWdBaUFBSUFFUUxDSUFSUVJBSUFGQkFXb2hBUXdCQ3lBQ1FRdzJBaHdnQWlBQU5nSU1JQUlnQVVFQmFqWUNGQXhPQzBFWklRTU1OQXRCQUNFRElBSkJBRFlDSENBQ0lBRTJBaFFnQWtHYUR6WUNFQ0FDUVNJMkFnd01UQXNnQUVFVlJ3UkFRUUFoQXlBQ1FRQTJBaHdnQWlBQk5nSVVJQUpCZ3d3MkFoQWdBa0VUTmdJTURFd0xJQUpCQ2pZQ0hDQUNJQUUyQWhRZ0FrSGtGallDRUNBQ1FSVTJBZ3hCQUNFRERFc0xJQUlvQWdRaEFFRUFJUU1nQWtFQU5nSUVJQUlnQUNBQklBcW5haUlCRUNzaUFBUkFJQUpCQnpZQ0hDQUNJQUUyQWhRZ0FpQUFOZ0lNREVzTFFSTWhBd3d4Q3lBQVFSVkhCRUJCQUNFRElBSkJBRFlDSENBQ0lBRTJBaFFnQWtIYURUWUNFQ0FDUVJRMkFnd01TZ3NnQWtFZU5nSWNJQUlnQVRZQ0ZDQUNRZmtYTmdJUUlBSkJGVFlDREVFQUlRTU1TUXRCQUNFQUFrQWdBaWdDT0NJRFJRMEFJQU1vQWl3aUEwVU5BQ0FDSUFNUkFBQWhBQXNnQUVVTlFTQUFRUlZHQkVBZ0FrRUROZ0ljSUFJZ0FUWUNGQ0FDUWJBWU5nSVFJQUpCRlRZQ0RFRUFJUU1NU1F0QkFDRURJQUpCQURZQ0hDQUNJQUUyQWhRZ0FrR25EallDRUNBQ1FSSTJBZ3dNU0F0QkFDRURJQUpCQURZQ0hDQUNJQUUyQWhRZ0FrSGFEVFlDRUNBQ1FSUTJBZ3dNUnd0QkFDRURJQUpCQURZQ0hDQUNJQUUyQWhRZ0FrR25EallDRUNBQ1FSSTJBZ3dNUmdzZ0FrRUFPZ0F2SUFJdEFDMUJCSEZGRFQ4TElBSkJBRG9BTHlBQ1FRRTZBRFJCQUNFRERDc0xRUUFoQXlBQ1FRQTJBaHdnQWtIa0VUWUNFQ0FDUVFjMkFnd2dBaUFCUVFGcU5nSVVERU1MQWtBRFFBSkFJQUV0QUFCQkNtc09CQUFDQWdBQ0N5QUVJQUZCQVdvaUFVY05BQXRCM1FFaEF3eERDd0pBQWtBZ0FpMEFORUVCUncwQVFRQWhBQUpBSUFJb0FqZ2lBMFVOQUNBREtBSllJZ05GRFFBZ0FpQURFUUFBSVFBTElBQkZEUUFnQUVFVlJ3MEJJQUpCM0FFMkFod2dBaUFCTmdJVUlBSkIxUlkyQWhBZ0FrRVZOZ0lNUVFBaEF3eEVDMEhCQVNFRERDb0xJQUpCQURZQ0hDQUNJQUUyQWhRZ0FrSHBDellDRUNBQ1FSODJBZ3hCQUNFRERFSUxBa0FDUUNBQ0xRQW9RUUZyRGdJRUFRQUxRY0FCSVFNTUtRdEJ1UUVoQXd3b0N5QUNRUUk2QUM5QkFDRUFBa0FnQWlnQ09DSURSUTBBSUFNb0FnQWlBMFVOQUNBQ0lBTVJBQUFoQUFzZ0FFVUVRRUhDQVNFRERDZ0xJQUJCRlVjRVFDQUNRUUEyQWh3Z0FpQUJOZ0lVSUFKQnBBdzJBaEFnQWtFUU5nSU1RUUFoQXd4QkN5QUNRZHNCTmdJY0lBSWdBVFlDRkNBQ1Fmb1dOZ0lRSUFKQkZUWUNERUVBSVFNTVFBc2dBU0FFUmdSQVFkb0JJUU1NUUFzZ0FTMEFBRUhJQUVZTkFTQUNRUUU2QUNnTFFhd0JJUU1NSlF0QnZ3RWhBd3drQ3lBQklBUkhCRUFnQWtFUU5nSUlJQUlnQVRZQ0JFRytBU0VERENRTFFka0JJUU1NUEFzZ0FTQUVSZ1JBUWRnQklRTU1QQXNnQVMwQUFFSElBRWNOQkNBQlFRRnFJUUZCdlFFaEF3d2lDeUFCSUFSR0JFQkIxd0VoQXd3N0N3SkFBa0FnQVMwQUFFSEZBR3NPRUFBRkJRVUZCUVVGQlFVRkJRVUZCUUVGQ3lBQlFRRnFJUUZCdXdFaEF3d2lDeUFCUVFGcUlRRkJ2QUVoQXd3aEMwSFdBU0VESUFFZ0JFWU5PU0FDS0FJQUlnQWdCQ0FCYTJvaEJTQUJJQUJyUVFKcUlRWUNRQU5BSUFFdEFBQWdBRUdEMEFCcUxRQUFSdzBESUFCQkFrWU5BU0FBUVFGcUlRQWdCQ0FCUVFGcUlnRkhEUUFMSUFJZ0JUWUNBQXc2Q3lBQ0tBSUVJUUFnQWtJQU53TUFJQUlnQUNBR1FRRnFJZ0VRSnlJQVJRUkFRY1lCSVFNTUlRc2dBa0hWQVRZQ0hDQUNJQUUyQWhRZ0FpQUFOZ0lNUVFBaEF3dzVDMEhVQVNFRElBRWdCRVlOT0NBQ0tBSUFJZ0FnQkNBQmEyb2hCU0FCSUFCclFRRnFJUVlDUUFOQUlBRXRBQUFnQUVHQjBBQnFMUUFBUncwQ0lBQkJBVVlOQVNBQVFRRnFJUUFnQkNBQlFRRnFJZ0ZIRFFBTElBSWdCVFlDQUF3NUN5QUNRWUVFT3dFb0lBSW9BZ1FoQUNBQ1FnQTNBd0FnQWlBQUlBWkJBV29pQVJBbklnQU5Bd3dDQ3lBQ1FRQTJBZ0FMUVFBaEF5QUNRUUEyQWh3Z0FpQUJOZ0lVSUFKQjJCczJBaEFnQWtFSU5nSU1ERFlMUWJvQklRTU1IQXNnQWtIVEFUWUNIQ0FDSUFFMkFoUWdBaUFBTmdJTVFRQWhBd3cwQzBFQUlRQUNRQ0FDS0FJNElnTkZEUUFnQXlnQ09DSURSUTBBSUFJZ0F4RUFBQ0VBQ3lBQVJRMEFJQUJCRlVZTkFTQUNRUUEyQWh3Z0FpQUJOZ0lVSUFKQnpBNDJBaEFnQWtFZ05nSU1RUUFoQXd3ekMwSGtBQ0VEREJrTElBSkIrQUEyQWh3Z0FpQUJOZ0lVSUFKQnloZzJBaEFnQWtFVk5nSU1RUUFoQXd3eEMwSFNBU0VESUFRZ0FTSUFSZzB3SUFRZ0FXc2dBaWdDQUNJQmFpRUZJQUFnQVd0QkJHb2hCZ0pBQTBBZ0FDMEFBQ0FCUWZ6UEFHb3RBQUJIRFFFZ0FVRUVSZzBESUFGQkFXb2hBU0FFSUFCQkFXb2lBRWNOQUFzZ0FpQUZOZ0lBRERFTElBSkJBRFlDSENBQ0lBQTJBaFFnQWtHUU16WUNFQ0FDUVFnMkFnd2dBa0VBTmdJQVFRQWhBd3d3Q3lBQklBUkhCRUFnQWtFT05nSUlJQUlnQVRZQ0JFRzNBU0VEREJjTFFkRUJJUU1NTHdzZ0FrRUFOZ0lBSUFaQkFXb2hBUXRCdUFFaEF3d1VDeUFCSUFSR0JFQkIwQUVoQXd3dEN5QUJMUUFBUVRCcklnQkIvd0Z4UVFwSkJFQWdBaUFBT2dBcUlBRkJBV29oQVVHMkFTRUREQlFMSUFJb0FnUWhBQ0FDUVFBMkFnUWdBaUFBSUFFUUtDSUFSUTBVSUFKQnp3RTJBaHdnQWlBQk5nSVVJQUlnQURZQ0RFRUFJUU1NTEFzZ0FTQUVSZ1JBUWM0QklRTU1MQXNDUUNBQkxRQUFRUzVHQkVBZ0FVRUJhaUVCREFFTElBSW9BZ1FoQUNBQ1FRQTJBZ1FnQWlBQUlBRVFLQ0lBUlEwVklBSkJ6UUUyQWh3Z0FpQUJOZ0lVSUFJZ0FEWUNERUVBSVFNTUxBdEJ0UUVoQXd3U0N5QUVJQUVpQlVZRVFFSE1BU0VERENzTFFRQWhBRUVCSVFGQkFTRUdRUUFoQXdKQUFrQUNRQUpBQWtBQ2Z3SkFBa0FDUUFKQUFrQUNRQUpBSUFVdEFBQkJNR3NPQ2dvSkFBRUNBd1FGQmdnTEMwRUNEQVlMUVFNTUJRdEJCQXdFQzBFRkRBTUxRUVlNQWd0QkJ3d0JDMEVJQ3lFRFFRQWhBVUVBSVFZTUFndEJDU0VEUVFFaEFFRUFJUUZCQUNFR0RBRUxRUUFoQVVFQklRTUxJQUlnQXpvQUt5QUZRUUZxSVFNQ1FBSkFJQUl0QUMxQkVIRU5BQUpBQWtBQ1FDQUNMUUFxRGdNQkFBSUVDeUFHUlEwRERBSUxJQUFOQVF3Q0N5QUJSUTBCQ3lBQ0tBSUVJUUFnQWtFQU5nSUVJQUlnQUNBREVDZ2lBRVVFUUNBRElRRU1Bd3NnQWtISkFUWUNIQ0FDSUFNMkFoUWdBaUFBTmdJTVFRQWhBd3d0Q3lBQ0tBSUVJUUFnQWtFQU5nSUVJQUlnQUNBREVDZ2lBRVVFUUNBRElRRU1HQXNnQWtIS0FUWUNIQ0FDSUFNMkFoUWdBaUFBTmdJTVFRQWhBd3dzQ3lBQ0tBSUVJUUFnQWtFQU5nSUVJQUlnQUNBRkVDZ2lBRVVFUUNBRklRRU1GZ3NnQWtITEFUWUNIQ0FDSUFVMkFoUWdBaUFBTmdJTURDc0xRYlFCSVFNTUVRdEJBQ0VBQWtBZ0FpZ0NPQ0lEUlEwQUlBTW9BandpQTBVTkFDQUNJQU1SQUFBaEFBc0NRQ0FBQkVBZ0FFRVZSZzBCSUFKQkFEWUNIQ0FDSUFFMkFoUWdBa0dVRFRZQ0VDQUNRU0UyQWd4QkFDRUREQ3NMUWJJQklRTU1FUXNnQWtISUFUWUNIQ0FDSUFFMkFoUWdBa0hKRnpZQ0VDQUNRUlUyQWd4QkFDRUREQ2tMSUFKQkFEWUNBQ0FHUVFGcUlRRkI5UUFoQXd3UEN5QUNMUUFwUVFWR0JFQkI0d0FoQXd3UEMwSGlBQ0VEREE0TElBQWhBU0FDUVFBMkFnQUxJQUpCQURvQUxFRUpJUU1NREFzZ0FrRUFOZ0lBSUFkQkFXb2hBVUhBQUNFRERBc0xRUUVMT2dBc0lBSkJBRFlDQUNBR1FRRnFJUUVMUVNraEF3d0lDMEU0SVFNTUJ3c0NRQ0FCSUFSSEJFQURRQ0FCTFFBQVFZQSthaTBBQUNJQVFRRkhCRUFnQUVFQ1J3MERJQUZCQVdvaEFRd0ZDeUFFSUFGQkFXb2lBVWNOQUF0QlBpRUREQ0VMUVQ0aEF3d2dDd3NnQWtFQU9nQXNEQUVMUVFzaEF3d0VDMEU2SVFNTUF3c2dBVUVCYWlFQlFTMGhBd3dDQ3lBQ0lBRTZBQ3dnQWtFQU5nSUFJQVpCQVdvaEFVRU1JUU1NQVFzZ0FrRUFOZ0lBSUFaQkFXb2hBVUVLSVFNTUFBc0FDMEVBSVFNZ0FrRUFOZ0ljSUFJZ0FUWUNGQ0FDUWMwUU5nSVFJQUpCQ1RZQ0RBd1hDMEVBSVFNZ0FrRUFOZ0ljSUFJZ0FUWUNGQ0FDUWVrS05nSVFJQUpCQ1RZQ0RBd1dDMEVBSVFNZ0FrRUFOZ0ljSUFJZ0FUWUNGQ0FDUWJjUU5nSVFJQUpCQ1RZQ0RBd1ZDMEVBSVFNZ0FrRUFOZ0ljSUFJZ0FUWUNGQ0FDUVp3Uk5nSVFJQUpCQ1RZQ0RBd1VDMEVBSVFNZ0FrRUFOZ0ljSUFJZ0FUWUNGQ0FDUWMwUU5nSVFJQUpCQ1RZQ0RBd1RDMEVBSVFNZ0FrRUFOZ0ljSUFJZ0FUWUNGQ0FDUWVrS05nSVFJQUpCQ1RZQ0RBd1NDMEVBSVFNZ0FrRUFOZ0ljSUFJZ0FUWUNGQ0FDUWJjUU5nSVFJQUpCQ1RZQ0RBd1JDMEVBSVFNZ0FrRUFOZ0ljSUFJZ0FUWUNGQ0FDUVp3Uk5nSVFJQUpCQ1RZQ0RBd1FDMEVBSVFNZ0FrRUFOZ0ljSUFJZ0FUWUNGQ0FDUVpjVk5nSVFJQUpCRHpZQ0RBd1BDMEVBSVFNZ0FrRUFOZ0ljSUFJZ0FUWUNGQ0FDUVpjVk5nSVFJQUpCRHpZQ0RBd09DMEVBSVFNZ0FrRUFOZ0ljSUFJZ0FUWUNGQ0FDUWNBU05nSVFJQUpCQ3pZQ0RBd05DMEVBSVFNZ0FrRUFOZ0ljSUFJZ0FUWUNGQ0FDUVpVSk5nSVFJQUpCQ3pZQ0RBd01DMEVBSVFNZ0FrRUFOZ0ljSUFJZ0FUWUNGQ0FDUWVFUE5nSVFJQUpCQ2pZQ0RBd0xDMEVBSVFNZ0FrRUFOZ0ljSUFJZ0FUWUNGQ0FDUWZzUE5nSVFJQUpCQ2pZQ0RBd0tDMEVBSVFNZ0FrRUFOZ0ljSUFJZ0FUWUNGQ0FDUWZFWk5nSVFJQUpCQWpZQ0RBd0pDMEVBSVFNZ0FrRUFOZ0ljSUFJZ0FUWUNGQ0FDUWNRVU5nSVFJQUpCQWpZQ0RBd0lDMEVBSVFNZ0FrRUFOZ0ljSUFJZ0FUWUNGQ0FDUWZJVk5nSVFJQUpCQWpZQ0RBd0hDeUFDUVFJMkFod2dBaUFCTmdJVUlBSkJuQm8yQWhBZ0FrRVdOZ0lNUVFBaEF3d0dDMEVCSVFNTUJRdEIxQUFoQXlBQklBUkdEUVFnQ0VFSWFpRUpJQUlvQWdBaEJRSkFBa0FnQVNBRVJ3UkFJQVZCMk1JQWFpRUhJQVFnQldvZ0FXc2hBQ0FGUVg5elFRcHFJZ1VnQVdvaEJnTkFJQUV0QUFBZ0J5MEFBRWNFUUVFQ0lRY01Bd3NnQlVVRVFFRUFJUWNnQmlFQkRBTUxJQVZCQVdzaEJTQUhRUUZxSVFjZ0JDQUJRUUZxSWdGSERRQUxJQUFoQlNBRUlRRUxJQWxCQVRZQ0FDQUNJQVUyQWdBTUFRc2dBa0VBTmdJQUlBa2dCellDQUFzZ0NTQUJOZ0lFSUFnb0Fnd2hBQ0FJS0FJSURnTUJCQUlBQ3dBTElBSkJBRFlDSENBQ1FiVWFOZ0lRSUFKQkZ6WUNEQ0FDSUFCQkFXbzJBaFJCQUNFRERBSUxJQUpCQURZQ0hDQUNJQUEyQWhRZ0FrSEtHallDRUNBQ1FRazJBZ3hCQUNFRERBRUxJQUVnQkVZRVFFRWlJUU1NQVFzZ0FrRUpOZ0lJSUFJZ0FUWUNCRUVoSVFNTElBaEJFR29rQUNBRFJRUkFJQUlvQWd3aEFBd0JDeUFDSUFNMkFoeEJBQ0VBSUFJb0FnUWlBVVVOQUNBQ0lBRWdCQ0FDS0FJSUVRRUFJZ0ZGRFFBZ0FpQUVOZ0lVSUFJZ0FUWUNEQ0FCSVFBTElBQUx2Z0lCQW44Z0FFRUFPZ0FBSUFCQjNBQnFJZ0ZCQVd0QkFEb0FBQ0FBUVFBNkFBSWdBRUVBT2dBQklBRkJBMnRCQURvQUFDQUJRUUpyUVFBNkFBQWdBRUVBT2dBRElBRkJCR3RCQURvQUFFRUFJQUJyUVFOeElnRWdBR29pQUVFQU5nSUFRZHdBSUFGclFYeHhJZ0lnQUdvaUFVRUVhMEVBTmdJQUFrQWdBa0VKU1EwQUlBQkJBRFlDQ0NBQVFRQTJBZ1FnQVVFSWEwRUFOZ0lBSUFGQkRHdEJBRFlDQUNBQ1FSbEpEUUFnQUVFQU5nSVlJQUJCQURZQ0ZDQUFRUUEyQWhBZ0FFRUFOZ0lNSUFGQkVHdEJBRFlDQUNBQlFSUnJRUUEyQWdBZ0FVRVlhMEVBTmdJQUlBRkJIR3RCQURZQ0FDQUNJQUJCQkhGQkdISWlBbXNpQVVFZ1NRMEFJQUFnQW1vaEFBTkFJQUJDQURjREdDQUFRZ0EzQXhBZ0FFSUFOd01JSUFCQ0FEY0RBQ0FBUVNCcUlRQWdBVUVnYXlJQlFSOUxEUUFMQ3d0V0FRRi9Ba0FnQUNnQ0RBMEFBa0FDUUFKQUFrQWdBQzBBTHc0REFRQURBZ3NnQUNnQ09DSUJSUTBBSUFFb0Fpd2lBVVVOQUNBQUlBRVJBQUFpQVEwREMwRUFEd3NBQ3lBQVFjTVdOZ0lRUVE0aEFRc2dBUXNhQUNBQUtBSU1SUVJBSUFCQjBSczJBaEFnQUVFVk5nSU1Dd3NVQUNBQUtBSU1RUlZHQkVBZ0FFRUFOZ0lNQ3dzVUFDQUFLQUlNUVJaR0JFQWdBRUVBTmdJTUN3c0hBQ0FBS0FJTUN3Y0FJQUFvQWhBTENRQWdBQ0FCTmdJUUN3Y0FJQUFvQWhRTEZ3QWdBRUVrVHdSQUFBc2dBRUVDZEVHZ00yb29BZ0FMRndBZ0FFRXVUd1JBQUFzZ0FFRUNkRUd3Tkdvb0FnQUx2d2tCQVg5QjZ5Z2hBUUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUFCQjVBQnJEdlFEWTJJQUFXRmhZV0ZoWVFJREJBVmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoQmdjSUNRb0xEQTBPRDJGaFlXRmhFR0ZoWVdGaFlXRmhZV0ZoRVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVJJVEZCVVdGeGdaR2h0aFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaEhCMGVIeUFoSWlNa0pTWW5LQ2txS3l3dExpOHdNVEl6TkRVMllUYzRPVHBoWVdGaFlXRmhZVHRoWVdFOFlXRmhZVDArUDJGaFlXRmhZV0ZoUUdGaFFXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZVUpEUkVWR1IwaEpTa3RNVFU1UFVGRlNVMkZoWVdGaFlXRmhWRlZXVjFoWldsdGhYRjFoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGZVlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFgyQmhDMEhoSnc4TFFhUWhEd3RCeXl3UEMwSCtNUThMUWNBa0R3dEJxeVFQQzBHTktBOExRZUltRHd0QmdEQVBDMEc1THc4TFFkY2tEd3RCN3g4UEMwSGhIdzhMUWZvZkR3dEI4aUFQQzBHb0x3OExRYTR5RHd0QmlEQVBDMEhzSnc4TFFZSWlEd3RCamgwUEMwSFFMZzhMUWNvakR3dEJ4VElQQzBIZkhBOExRZEljRHd0QnhDQVBDMEhYSUE4TFFhSWZEd3RCN1M0UEMwR3JNQThMUWRRbER3dEJ6QzRQQzBINkxnOExRZndyRHd0QjBqQVBDMEh4SFE4TFFic2dEd3RCOXlzUEMwR1FNUThMUWRjeER3dEJvaTBQQzBIVUp3OExRZUFyRHd0Qm55d1BDMEhyTVE4TFFkVWZEd3RCeWpFUEMwSGVKUThMUWRRZUR3dEI5QndQQzBHbk1nOExRYkVkRHd0Qm9CMFBDMEc1TVE4TFFid3dEd3RCa2lFUEMwR3pKZzhMUWVrc0R3dEJyQjRQQzBIVUt3OExRZmNtRHd0QmdDWVBDMEd3SVE4TFFmNGVEd3RCalNNUEMwR0pMUThMUWZjaUR3dEJvREVQQzBHdUh3OExRY1lsRHd0QjZCNFBDMEdUSWc4TFFjSXZEd3RCd3gwUEMwR0xMQThMUWVFZER3dEJqUzhQQzBIcUlROExRYlF0RHd0QjBpOFBDMEhmTWc4TFFkSXlEd3RCOERBUEMwR3BJZzhMUWZrakR3dEJtUjRQQzBHMUxBOExRWnN3RHd0QmtqSVBDMEcyS3c4TFFjSWlEd3RCK0RJUEMwR2VKUThMUWRBaUR3dEJ1aDRQQzBHQkhnOExBQXRCMWlFaEFRc2dBUXNXQUNBQUlBQXRBQzFCL2dGeElBRkJBRWR5T2dBdEN4a0FJQUFnQUMwQUxVSDlBWEVnQVVFQVIwRUJkSEk2QUMwTEdRQWdBQ0FBTFFBdFFmc0JjU0FCUVFCSFFRSjBjam9BTFFzWkFDQUFJQUF0QUMxQjl3RnhJQUZCQUVkQkEzUnlPZ0F0Q3o0QkFuOENRQ0FBS0FJNElnTkZEUUFnQXlnQ0JDSURSUTBBSUFBZ0FTQUNJQUZySUFNUkFRQWlCRUYvUncwQUlBQkJ4aEUyQWhCQkdDRUVDeUFFQ3o0QkFuOENRQ0FBS0FJNElnTkZEUUFnQXlnQ0NDSURSUTBBSUFBZ0FTQUNJQUZySUFNUkFRQWlCRUYvUncwQUlBQkI5Z28yQWhCQkdDRUVDeUFFQ3o0QkFuOENRQ0FBS0FJNElnTkZEUUFnQXlnQ0RDSURSUTBBSUFBZ0FTQUNJQUZySUFNUkFRQWlCRUYvUncwQUlBQkI3Um8yQWhCQkdDRUVDeUFFQ3o0QkFuOENRQ0FBS0FJNElnTkZEUUFnQXlnQ0VDSURSUTBBSUFBZ0FTQUNJQUZySUFNUkFRQWlCRUYvUncwQUlBQkJsUkEyQWhCQkdDRUVDeUFFQ3o0QkFuOENRQ0FBS0FJNElnTkZEUUFnQXlnQ0ZDSURSUTBBSUFBZ0FTQUNJQUZySUFNUkFRQWlCRUYvUncwQUlBQkJxaHMyQWhCQkdDRUVDeUFFQ3o0QkFuOENRQ0FBS0FJNElnTkZEUUFnQXlnQ0dDSURSUTBBSUFBZ0FTQUNJQUZySUFNUkFRQWlCRUYvUncwQUlBQkI3Uk0yQWhCQkdDRUVDeUFFQ3o0QkFuOENRQ0FBS0FJNElnTkZEUUFnQXlnQ0tDSURSUTBBSUFBZ0FTQUNJQUZySUFNUkFRQWlCRUYvUncwQUlBQkI5Z2cyQWhCQkdDRUVDeUFFQ3o0QkFuOENRQ0FBS0FJNElnTkZEUUFnQXlnQ0hDSURSUTBBSUFBZ0FTQUNJQUZySUFNUkFRQWlCRUYvUncwQUlBQkJ3aGsyQWhCQkdDRUVDeUFFQ3o0QkFuOENRQ0FBS0FJNElnTkZEUUFnQXlnQ0lDSURSUTBBSUFBZ0FTQUNJQUZySUFNUkFRQWlCRUYvUncwQUlBQkJsQlEyQWhCQkdDRUVDeUFFQzFrQkFuOENRQ0FBTFFBb1FRRkdEUUFnQUM4Qk1pSUJRZVFBYTBIa0FFa05BQ0FCUWN3QlJnMEFJQUZCc0FKR0RRQWdBQzhCTUNJQVFjQUFjUTBBUVFFaEFpQUFRWWdFY1VHQUJFWU5BQ0FBUVNoeFJTRUNDeUFDQzR3QkFRSi9Ba0FDUUFKQUlBQXRBQ3BGRFFBZ0FDMEFLMFVOQUNBQUx3RXdJZ0ZCQW5GRkRRRU1BZ3NnQUM4Qk1DSUJRUUZ4UlEwQkMwRUJJUUlnQUMwQUtFRUJSZzBBSUFBdkFUSWlBRUhrQUd0QjVBQkpEUUFnQUVITUFVWU5BQ0FBUWJBQ1JnMEFJQUZCd0FCeERRQkJBQ0VDSUFGQmlBUnhRWUFFUmcwQUlBRkJLSEZCQUVjaEFnc2dBZ3RYQUNBQVFSaHFRZ0EzQXdBZ0FFSUFOd01BSUFCQk9HcENBRGNEQUNBQVFUQnFRZ0EzQXdBZ0FFRW9ha0lBTndNQUlBQkJJR3BDQURjREFDQUFRUkJxUWdBM0F3QWdBRUVJYWtJQU53TUFJQUJCM1FFMkFod0xCZ0FnQUJBeUM1b3RBUXQvSXdCQkVHc2lDaVFBUWFUUUFDZ0NBQ0lKUlFSQVFlVFRBQ2dDQUNJRlJRUkFRZkRUQUVKL053SUFRZWpUQUVLQWdJU0FnSURBQURjQ0FFSGswd0FnQ2tFSWFrRndjVUhZcXRXcUJYTWlCVFlDQUVINDB3QkJBRFlDQUVISTB3QkJBRFlDQUF0QnpOTUFRWURVQkRZQ0FFR2MwQUJCZ05RRU5nSUFRYkRRQUNBRk5nSUFRYXpRQUVGL05nSUFRZERUQUVHQXJBTTJBZ0FEUUNBQlFjalFBR29nQVVHODBBQnFJZ0kyQWdBZ0FpQUJRYlRRQUdvaUF6WUNBQ0FCUWNEUUFHb2dBellDQUNBQlFkRFFBR29nQVVIRTBBQnFJZ00yQWdBZ0F5QUNOZ0lBSUFGQjJOQUFhaUFCUWN6UUFHb2lBallDQUNBQ0lBTTJBZ0FnQVVIVTBBQnFJQUkyQWdBZ0FVRWdhaUlCUVlBQ1J3MEFDMEdNMUFSQndhc0ROZ0lBUWFqUUFFSDAwd0FvQWdBMkFnQkJtTkFBUWNDckF6WUNBRUdrMEFCQmlOUUVOZ0lBUWN6L0IwRTROZ0lBUVlqVUJDRUpDd0pBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBQkI3QUZOQkVCQmpOQUFLQUlBSWdaQkVDQUFRUk5xUVhCeElBQkJDMGtiSWdSQkEzWWlBSFlpQVVFRGNRUkFBa0FnQVVFQmNTQUFja0VCY3lJQ1FRTjBJZ0JCdE5BQWFpSUJJQUJCdk5BQWFpZ0NBQ0lBS0FJSUlnTkdCRUJCak5BQUlBWkJmaUFDZDNFMkFnQU1BUXNnQVNBRE5nSUlJQU1nQVRZQ0RBc2dBRUVJYWlFQklBQWdBa0VEZENJQ1FRTnlOZ0lFSUFBZ0Ftb2lBQ0FBS0FJRVFRRnlOZ0lFREJFTFFaVFFBQ2dDQUNJSUlBUlBEUUVnQVFSQUFrQkJBaUFBZENJQ1FRQWdBbXR5SUFFZ0FIUnhhQ0lBUVFOMElnSkJ0TkFBYWlJQklBSkJ2TkFBYWlnQ0FDSUNLQUlJSWdOR0JFQkJqTkFBSUFaQmZpQUFkM0VpQmpZQ0FBd0JDeUFCSUFNMkFnZ2dBeUFCTmdJTUN5QUNJQVJCQTNJMkFnUWdBRUVEZENJQUlBUnJJUVVnQUNBQ2FpQUZOZ0lBSUFJZ0JHb2lCQ0FGUVFGeU5nSUVJQWdFUUNBSVFYaHhRYlRRQUdvaEFFR2cwQUFvQWdBaEF3Si9RUUVnQ0VFRGRuUWlBU0FHY1VVRVFFR00wQUFnQVNBR2NqWUNBQ0FBREFFTElBQW9BZ2dMSWdFZ0F6WUNEQ0FBSUFNMkFnZ2dBeUFBTmdJTUlBTWdBVFlDQ0FzZ0FrRUlhaUVCUWFEUUFDQUVOZ0lBUVpUUUFDQUZOZ0lBREJFTFFaRFFBQ2dDQUNJTFJRMEJJQXRvUVFKMFFielNBR29vQWdBaUFDZ0NCRUY0Y1NBRWF5RUZJQUFoQWdOQUFrQWdBaWdDRUNJQlJRUkFJQUpCRkdvb0FnQWlBVVVOQVFzZ0FTZ0NCRUY0Y1NBRWF5SURJQVZKSVFJZ0F5QUZJQUliSVFVZ0FTQUFJQUliSVFBZ0FTRUNEQUVMQ3lBQUtBSVlJUWtnQUNnQ0RDSURJQUJIQkVCQm5OQUFLQUlBR2lBRElBQW9BZ2dpQVRZQ0NDQUJJQU0yQWd3TUVBc2dBRUVVYWlJQ0tBSUFJZ0ZGQkVBZ0FDZ0NFQ0lCUlEwRElBQkJFR29oQWdzRFFDQUNJUWNnQVNJRFFSUnFJZ0lvQWdBaUFRMEFJQU5CRUdvaEFpQURLQUlRSWdFTkFBc2dCMEVBTmdJQURBOExRWDhoQkNBQVFiOS9TdzBBSUFCQkUyb2lBVUZ3Y1NFRVFaRFFBQ2dDQUNJSVJRMEFRUUFnQkdzaEJRSkFBa0FDUUFKL1FRQWdCRUdBQWtrTkFCcEJIeUFFUWYvLy93ZExEUUFhSUFSQkppQUJRUWgyWnlJQWEzWkJBWEVnQUVFQmRHdEJQbW9MSWdaQkFuUkJ2TklBYWlnQ0FDSUNSUVJBUVFBaEFVRUFJUU1NQVF0QkFDRUJJQVJCR1NBR1FRRjJhMEVBSUFaQkgwY2JkQ0VBUVFBaEF3TkFBa0FnQWlnQ0JFRjRjU0FFYXlJSElBVlBEUUFnQWlFRElBY2lCUTBBUVFBaEJTQUNJUUVNQXdzZ0FTQUNRUlJxS0FJQUlnY2dCeUFDSUFCQkhYWkJCSEZxUVJCcUtBSUFJZ0pHR3lBQklBY2JJUUVnQUVFQmRDRUFJQUlOQUFzTElBRWdBM0pGQkVCQkFDRURRUUlnQm5RaUFFRUFJQUJyY2lBSWNTSUFSUTBESUFCb1FRSjBRYnpTQUdvb0FnQWhBUXNnQVVVTkFRc0RRQ0FCS0FJRVFYaHhJQVJySWdJZ0JVa2hBQ0FDSUFVZ0FCc2hCU0FCSUFNZ0FCc2hBeUFCS0FJUUlnQUVmeUFBQlNBQlFSUnFLQUlBQ3lJQkRRQUxDeUFEUlEwQUlBVkJsTkFBS0FJQUlBUnJUdzBBSUFNb0FoZ2hCeUFESUFNb0Fnd2lBRWNFUUVHYzBBQW9BZ0FhSUFBZ0F5Z0NDQ0lCTmdJSUlBRWdBRFlDREF3T0N5QURRUlJxSWdJb0FnQWlBVVVFUUNBREtBSVFJZ0ZGRFFNZ0EwRVFhaUVDQ3dOQUlBSWhCaUFCSWdCQkZHb2lBaWdDQUNJQkRRQWdBRUVRYWlFQ0lBQW9BaEFpQVEwQUN5QUdRUUEyQWdBTURRdEJsTkFBS0FJQUlnTWdCRThFUUVHZzBBQW9BZ0FoQVFKQUlBTWdCR3NpQWtFUVR3UkFJQUVnQkdvaUFDQUNRUUZ5TmdJRUlBRWdBMm9nQWpZQ0FDQUJJQVJCQTNJMkFnUU1BUXNnQVNBRFFRTnlOZ0lFSUFFZ0Eyb2lBQ0FBS0FJRVFRRnlOZ0lFUVFBaEFFRUFJUUlMUVpUUUFDQUNOZ0lBUWFEUUFDQUFOZ0lBSUFGQkNHb2hBUXdQQzBHWTBBQW9BZ0FpQXlBRVN3UkFJQVFnQ1dvaUFDQURJQVJySWdGQkFYSTJBZ1JCcE5BQUlBQTJBZ0JCbU5BQUlBRTJBZ0FnQ1NBRVFRTnlOZ0lFSUFsQkNHb2hBUXdQQzBFQUlRRWdCQUovUWVUVEFDZ0NBQVJBUWV6VEFDZ0NBQXdCQzBIdzB3QkNmemNDQUVIbzB3QkNnSUNFZ0lDQXdBQTNBZ0JCNU5NQUlBcEJER3BCY0hGQjJLclZxZ1Z6TmdJQVFmalRBRUVBTmdJQVFjalRBRUVBTmdJQVFZQ0FCQXNpQUNBRVFjY0FhaUlGYWlJR1FRQWdBR3NpQjNFaUFrOEVRRUg4MHdCQk1EWUNBQXdQQ3dKQVFjVFRBQ2dDQUNJQlJRMEFRYnpUQUNnQ0FDSUlJQUpxSVFBZ0FDQUJUU0FBSUFoTGNRMEFRUUFoQVVIODB3QkJNRFlDQUF3UEMwSEkwd0F0QUFCQkJIRU5CQUpBQWtBZ0NRUkFRY3pUQUNFQkEwQWdBU2dDQUNJQUlBbE5CRUFnQUNBQktBSUVhaUFKU3cwREN5QUJLQUlJSWdFTkFBc0xRUUFRTXlJQVFYOUdEUVVnQWlFR1FlalRBQ2dDQUNJQlFRRnJJZ01nQUhFRVFDQUNJQUJySUFBZ0EycEJBQ0FCYTNGcUlRWUxJQVFnQms4TkJTQUdRZjcvLy84SFN3MEZRY1RUQUNnQ0FDSURCRUJCdk5NQUtBSUFJZ2NnQm1vaEFTQUJJQWRORFFZZ0FTQURTdzBHQ3lBR0VETWlBU0FBUncwQkRBY0xJQVlnQTJzZ0IzRWlCa0grLy8vL0Iwc05CQ0FHRURNaEFDQUFJQUVvQWdBZ0FTZ0NCR3BHRFFNZ0FDRUJDd0pBSUFZZ0JFSElBR3BQRFFBZ0FVRi9SZzBBUWV6VEFDZ0NBQ0lBSUFVZ0JtdHFRUUFnQUd0eElnQkIvdi8vL3dkTEJFQWdBU0VBREFjTElBQVFNMEYvUndSQUlBQWdCbW9oQmlBQklRQU1Cd3RCQUNBR2F4QXpHZ3dFQ3lBQklnQkJmMGNOQlF3REMwRUFJUU1NREF0QkFDRUFEQW9MSUFCQmYwY05BZ3RCeU5NQVFjalRBQ2dDQUVFRWNqWUNBQXNnQWtIKy8vLy9CMHNOQVNBQ0VETWhBRUVBRURNaEFTQUFRWDlHRFFFZ0FVRi9SZzBCSUFBZ0FVOE5BU0FCSUFCcklnWWdCRUU0YWswTkFRdEJ2Tk1BUWJ6VEFDZ0NBQ0FHYWlJQk5nSUFRY0RUQUNnQ0FDQUJTUVJBUWNEVEFDQUJOZ0lBQ3dKQUFrQUNRRUdrMEFBb0FnQWlBZ1JBUWN6VEFDRUJBMEFnQUNBQktBSUFJZ01nQVNnQ0JDSUZha1lOQWlBQktBSUlJZ0VOQUFzTUFndEJuTkFBS0FJQUlnRkJBRWNnQUNBQlQzRkZCRUJCbk5BQUlBQTJBZ0FMUVFBaEFVSFEwd0FnQmpZQ0FFSE0wd0FnQURZQ0FFR3MwQUJCZnpZQ0FFR3cwQUJCNU5NQUtBSUFOZ0lBUWRqVEFFRUFOZ0lBQTBBZ0FVSEkwQUJxSUFGQnZOQUFhaUlDTmdJQUlBSWdBVUcwMEFCcUlnTTJBZ0FnQVVIQTBBQnFJQU0yQWdBZ0FVSFEwQUJxSUFGQnhOQUFhaUlETmdJQUlBTWdBallDQUNBQlFkalFBR29nQVVITTBBQnFJZ0kyQWdBZ0FpQUROZ0lBSUFGQjFOQUFhaUFDTmdJQUlBRkJJR29pQVVHQUFrY05BQXRCZUNBQWEwRVBjU0lCSUFCcUlnSWdCa0U0YXlJRElBRnJJZ0ZCQVhJMkFnUkJxTkFBUWZUVEFDZ0NBRFlDQUVHWTBBQWdBVFlDQUVHazBBQWdBallDQUNBQUlBTnFRVGcyQWdRTUFnc2dBQ0FDVFEwQUlBSWdBMGtOQUNBQktBSU1RUWh4RFFCQmVDQUNhMEVQY1NJQUlBSnFJZ05CbU5BQUtBSUFJQVpxSWdjZ0FHc2lBRUVCY2pZQ0JDQUJJQVVnQm1vMkFnUkJxTkFBUWZUVEFDZ0NBRFlDQUVHWTBBQWdBRFlDQUVHazBBQWdBellDQUNBQ0lBZHFRVGcyQWdRTUFRc2dBRUdjMEFBb0FnQkpCRUJCbk5BQUlBQTJBZ0FMSUFBZ0Jtb2hBMEhNMHdBaEFRSkFBa0FDUUFOQUlBTWdBU2dDQUVjRVFDQUJLQUlJSWdFTkFRd0NDd3NnQVMwQURFRUljVVVOQVF0QnpOTUFJUUVEUUNBQktBSUFJZ01nQWswRVFDQURJQUVvQWdScUlnVWdBa3NOQXdzZ0FTZ0NDQ0VCREFBTEFBc2dBU0FBTmdJQUlBRWdBU2dDQkNBR2FqWUNCQ0FBUVhnZ0FHdEJEM0ZxSWdrZ0JFRURjallDQkNBRFFYZ2dBMnRCRDNGcUlnWWdCQ0FKYWlJRWF5RUJJQUlnQmtZRVFFR2swQUFnQkRZQ0FFR1kwQUJCbU5BQUtBSUFJQUZxSWdBMkFnQWdCQ0FBUVFGeU5nSUVEQWdMUWFEUUFDZ0NBQ0FHUmdSQVFhRFFBQ0FFTmdJQVFaVFFBRUdVMEFBb0FnQWdBV29pQURZQ0FDQUVJQUJCQVhJMkFnUWdBQ0FFYWlBQU5nSUFEQWdMSUFZb0FnUWlCVUVEY1VFQlJ3MEdJQVZCZUhFaENDQUZRZjhCVFFSQUlBVkJBM1loQXlBR0tBSUlJZ0FnQmlnQ0RDSUNSZ1JBUVl6UUFFR00wQUFvQWdCQmZpQURkM0UyQWdBTUJ3c2dBaUFBTmdJSUlBQWdBallDREF3R0N5QUdLQUlZSVFjZ0JpQUdLQUlNSWdCSEJFQWdBQ0FHS0FJSUlnSTJBZ2dnQWlBQU5nSU1EQVVMSUFaQkZHb2lBaWdDQUNJRlJRUkFJQVlvQWhBaUJVVU5CQ0FHUVJCcUlRSUxBMEFnQWlFRElBVWlBRUVVYWlJQ0tBSUFJZ1VOQUNBQVFSQnFJUUlnQUNnQ0VDSUZEUUFMSUFOQkFEWUNBQXdFQzBGNElBQnJRUTl4SWdFZ0FHb2lCeUFHUVRocklnTWdBV3NpQVVFQmNqWUNCQ0FBSUFOcVFUZzJBZ1FnQWlBRlFUY2dCV3RCRDNGcVFUOXJJZ01nQXlBQ1FSQnFTUnNpQTBFak5nSUVRYWpRQUVIMDB3QW9BZ0EyQWdCQm1OQUFJQUUyQWdCQnBOQUFJQWMyQWdBZ0EwRVFha0hVMHdBcEFnQTNBZ0FnQTBITTB3QXBBZ0EzQWdoQjFOTUFJQU5CQ0dvMkFnQkIwTk1BSUFZMkFnQkJ6Tk1BSUFBMkFnQkIyTk1BUVFBMkFnQWdBMEVrYWlFQkEwQWdBVUVITmdJQUlBVWdBVUVFYWlJQlN3MEFDeUFDSUFOR0RRQWdBeUFES0FJRVFYNXhOZ0lFSUFNZ0F5QUNheUlGTmdJQUlBSWdCVUVCY2pZQ0JDQUZRZjhCVFFSQUlBVkJlSEZCdE5BQWFpRUFBbjlCak5BQUtBSUFJZ0ZCQVNBRlFRTjJkQ0lEY1VVRVFFR00wQUFnQVNBRGNqWUNBQ0FBREFFTElBQW9BZ2dMSWdFZ0FqWUNEQ0FBSUFJMkFnZ2dBaUFBTmdJTUlBSWdBVFlDQ0F3QkMwRWZJUUVnQlVILy8vOEhUUVJBSUFWQkppQUZRUWgyWnlJQWEzWkJBWEVnQUVFQmRHdEJQbW9oQVFzZ0FpQUJOZ0ljSUFKQ0FEY0NFQ0FCUVFKMFFielNBR29oQUVHUTBBQW9BZ0FpQTBFQklBRjBJZ1p4UlFSQUlBQWdBallDQUVHUTBBQWdBeUFHY2pZQ0FDQUNJQUEyQWhnZ0FpQUNOZ0lJSUFJZ0FqWUNEQXdCQ3lBRlFSa2dBVUVCZG10QkFDQUJRUjlIRzNRaEFTQUFLQUlBSVFNQ1FBTkFJQU1pQUNnQ0JFRjRjU0FGUmcwQklBRkJIWFloQXlBQlFRRjBJUUVnQUNBRFFRUnhha0VRYWlJR0tBSUFJZ01OQUFzZ0JpQUNOZ0lBSUFJZ0FEWUNHQ0FDSUFJMkFnd2dBaUFDTmdJSURBRUxJQUFvQWdnaUFTQUNOZ0lNSUFBZ0FqWUNDQ0FDUVFBMkFoZ2dBaUFBTmdJTUlBSWdBVFlDQ0F0Qm1OQUFLQUlBSWdFZ0JFME5BRUdrMEFBb0FnQWlBQ0FFYWlJQ0lBRWdCR3NpQVVFQmNqWUNCRUdZMEFBZ0FUWUNBRUdrMEFBZ0FqWUNBQ0FBSUFSQkEzSTJBZ1FnQUVFSWFpRUJEQWdMUVFBaEFVSDgwd0JCTURZQ0FBd0hDMEVBSVFBTElBZEZEUUFDUUNBR0tBSWNJZ0pCQW5SQnZOSUFhaUlES0FJQUlBWkdCRUFnQXlBQU5nSUFJQUFOQVVHUTBBQkJrTkFBS0FJQVFYNGdBbmR4TmdJQURBSUxJQWRCRUVFVUlBY29BaEFnQmtZYmFpQUFOZ0lBSUFCRkRRRUxJQUFnQnpZQ0dDQUdLQUlRSWdJRVFDQUFJQUkyQWhBZ0FpQUFOZ0lZQ3lBR1FSUnFLQUlBSWdKRkRRQWdBRUVVYWlBQ05nSUFJQUlnQURZQ0dBc2dBU0FJYWlFQklBWWdDR29pQmlnQ0JDRUZDeUFHSUFWQmZuRTJBZ1FnQVNBRWFpQUJOZ0lBSUFRZ0FVRUJjallDQkNBQlFmOEJUUVJBSUFGQmVIRkJ0TkFBYWlFQUFuOUJqTkFBS0FJQUlnSkJBU0FCUVFOMmRDSUJjVVVFUUVHTTBBQWdBU0FDY2pZQ0FDQUFEQUVMSUFBb0FnZ0xJZ0VnQkRZQ0RDQUFJQVEyQWdnZ0JDQUFOZ0lNSUFRZ0FUWUNDQXdCQzBFZklRVWdBVUgvLy84SFRRUkFJQUZCSmlBQlFRaDJaeUlBYTNaQkFYRWdBRUVCZEd0QlBtb2hCUXNnQkNBRk5nSWNJQVJDQURjQ0VDQUZRUUowUWJ6U0FHb2hBRUdRMEFBb0FnQWlBa0VCSUFWMElnTnhSUVJBSUFBZ0JEWUNBRUdRMEFBZ0FpQURjallDQUNBRUlBQTJBaGdnQkNBRU5nSUlJQVFnQkRZQ0RBd0JDeUFCUVJrZ0JVRUJkbXRCQUNBRlFSOUhHM1FoQlNBQUtBSUFJUUFDUUFOQUlBQWlBaWdDQkVGNGNTQUJSZzBCSUFWQkhYWWhBQ0FGUVFGMElRVWdBaUFBUVFSeGFrRVFhaUlES0FJQUlnQU5BQXNnQXlBRU5nSUFJQVFnQWpZQ0dDQUVJQVEyQWd3Z0JDQUVOZ0lJREFFTElBSW9BZ2dpQUNBRU5nSU1JQUlnQkRZQ0NDQUVRUUEyQWhnZ0JDQUNOZ0lNSUFRZ0FEWUNDQXNnQ1VFSWFpRUJEQUlMQWtBZ0IwVU5BQUpBSUFNb0Fod2lBVUVDZEVHODBnQnFJZ0lvQWdBZ0EwWUVRQ0FDSUFBMkFnQWdBQTBCUVpEUUFDQUlRWDRnQVhkeElnZzJBZ0FNQWdzZ0IwRVFRUlFnQnlnQ0VDQURSaHRxSUFBMkFnQWdBRVVOQVFzZ0FDQUhOZ0lZSUFNb0FoQWlBUVJBSUFBZ0FUWUNFQ0FCSUFBMkFoZ0xJQU5CRkdvb0FnQWlBVVVOQUNBQVFSUnFJQUUyQWdBZ0FTQUFOZ0lZQ3dKQUlBVkJEMDBFUUNBRElBUWdCV29pQUVFRGNqWUNCQ0FBSUFOcUlnQWdBQ2dDQkVFQmNqWUNCQXdCQ3lBRElBUnFJZ0lnQlVFQmNqWUNCQ0FESUFSQkEzSTJBZ1FnQWlBRmFpQUZOZ0lBSUFWQi93Rk5CRUFnQlVGNGNVRzAwQUJxSVFBQ2YwR00wQUFvQWdBaUFVRUJJQVZCQTNaMElnVnhSUVJBUVl6UUFDQUJJQVZ5TmdJQUlBQU1BUXNnQUNnQ0NBc2lBU0FDTmdJTUlBQWdBallDQ0NBQ0lBQTJBZ3dnQWlBQk5nSUlEQUVMUVI4aEFTQUZRZi8vL3dkTkJFQWdCVUVtSUFWQkNIWm5JZ0JyZGtFQmNTQUFRUUYwYTBFK2FpRUJDeUFDSUFFMkFod2dBa0lBTndJUUlBRkJBblJCdk5JQWFpRUFRUUVnQVhRaUJDQUljVVVFUUNBQUlBSTJBZ0JCa05BQUlBUWdDSEkyQWdBZ0FpQUFOZ0lZSUFJZ0FqWUNDQ0FDSUFJMkFnd01BUXNnQlVFWklBRkJBWFpyUVFBZ0FVRWZSeHQwSVFFZ0FDZ0NBQ0VFQWtBRFFDQUVJZ0FvQWdSQmVIRWdCVVlOQVNBQlFSMTJJUVFnQVVFQmRDRUJJQUFnQkVFRWNXcEJFR29pQmlnQ0FDSUVEUUFMSUFZZ0FqWUNBQ0FDSUFBMkFoZ2dBaUFDTmdJTUlBSWdBallDQ0F3QkN5QUFLQUlJSWdFZ0FqWUNEQ0FBSUFJMkFnZ2dBa0VBTmdJWUlBSWdBRFlDRENBQ0lBRTJBZ2dMSUFOQkNHb2hBUXdCQ3dKQUlBbEZEUUFDUUNBQUtBSWNJZ0ZCQW5SQnZOSUFhaUlDS0FJQUlBQkdCRUFnQWlBRE5nSUFJQU1OQVVHUTBBQWdDMEYrSUFGM2NUWUNBQXdDQ3lBSlFSQkJGQ0FKS0FJUUlBQkdHMm9nQXpZQ0FDQURSUTBCQ3lBRElBazJBaGdnQUNnQ0VDSUJCRUFnQXlBQk5nSVFJQUVnQXpZQ0dBc2dBRUVVYWlnQ0FDSUJSUTBBSUFOQkZHb2dBVFlDQUNBQklBTTJBaGdMQWtBZ0JVRVBUUVJBSUFBZ0JDQUZhaUlCUVFOeU5nSUVJQUFnQVdvaUFTQUJLQUlFUVFGeU5nSUVEQUVMSUFBZ0JHb2lCeUFGUVFGeU5nSUVJQUFnQkVFRGNqWUNCQ0FGSUFkcUlBVTJBZ0FnQ0FSQUlBaEJlSEZCdE5BQWFpRUJRYURRQUNnQ0FDRURBbjlCQVNBSVFRTjJkQ0lDSUFaeFJRUkFRWXpRQUNBQ0lBWnlOZ0lBSUFFTUFRc2dBU2dDQ0FzaUFpQUROZ0lNSUFFZ0F6WUNDQ0FESUFFMkFnd2dBeUFDTmdJSUMwR2cwQUFnQnpZQ0FFR1UwQUFnQlRZQ0FBc2dBRUVJYWlFQkN5QUtRUkJxSkFBZ0FRdERBQ0FBUlFSQVB3QkJFSFFQQ3dKQUlBQkIvLzhEY1EwQUlBQkJBRWdOQUNBQVFSQjJRQUFpQUVGL1JnUkFRZnpUQUVFd05nSUFRWDhQQ3lBQVFSQjBEd3NBQ3d2Y1B5SUFRWUFJQ3drQkFBQUFBZ0FBQUFNQVFaUUlDd1VFQUFBQUJRQkJwQWdMQ1FZQUFBQUhBQUFBQ0FCQjNBZ0xpaTFKYm5aaGJHbGtJR05vWVhJZ2FXNGdkWEpzSUhGMVpYSjVBRk53WVc0Z1kyRnNiR0poWTJzZ1pYSnliM0lnYVc0Z2IyNWZZbTlrZVFCRGIyNTBaVzUwTFV4bGJtZDBhQ0J2ZG1WeVpteHZkd0JEYUhWdWF5QnphWHBsSUc5MlpYSm1iRzkzQUZKbGMzQnZibk5sSUc5MlpYSm1iRzkzQUVsdWRtRnNhV1FnYldWMGFHOWtJR1p2Y2lCSVZGUlFMM2d1ZUNCeVpYRjFaWE4wQUVsdWRtRnNhV1FnYldWMGFHOWtJR1p2Y2lCU1ZGTlFMM2d1ZUNCeVpYRjFaWE4wQUVWNGNHVmpkR1ZrSUZOUFZWSkRSU0J0WlhSb2IyUWdabTl5SUVsRFJTOTRMbmdnY21WeGRXVnpkQUJKYm5aaGJHbGtJR05vWVhJZ2FXNGdkWEpzSUdaeVlXZHRaVzUwSUhOMFlYSjBBRVY0Y0dWamRHVmtJR1J2ZEFCVGNHRnVJR05oYkd4aVlXTnJJR1Z5Y205eUlHbHVJRzl1WDNOMFlYUjFjd0JKYm5aaGJHbGtJSEpsYzNCdmJuTmxJSE4wWVhSMWN3QkpiblpoYkdsa0lHTm9ZWEpoWTNSbGNpQnBiaUJqYUhWdWF5QmxlSFJsYm5OcGIyNXpBRlZ6WlhJZ1kyRnNiR0poWTJzZ1pYSnliM0lBWUc5dVgzSmxjMlYwWUNCallXeHNZbUZqYXlCbGNuSnZjZ0JnYjI1ZlkyaDFibXRmYUdWaFpHVnlZQ0JqWVd4c1ltRmpheUJsY25KdmNnQmdiMjVmYldWemMyRm5aVjlpWldkcGJtQWdZMkZzYkdKaFkyc2daWEp5YjNJQVlHOXVYMk5vZFc1clgyVjRkR1Z1YzJsdmJsOTJZV3gxWldBZ1kyRnNiR0poWTJzZ1pYSnliM0lBWUc5dVgzTjBZWFIxYzE5amIyMXdiR1YwWldBZ1kyRnNiR0poWTJzZ1pYSnliM0lBWUc5dVgzWmxjbk5wYjI1ZlkyOXRjR3hsZEdWZ0lHTmhiR3hpWVdOcklHVnljbTl5QUdCdmJsOTFjbXhmWTI5dGNHeGxkR1ZnSUdOaGJHeGlZV05ySUdWeWNtOXlBR0J2Ymw5amFIVnVhMTlqYjIxd2JHVjBaV0FnWTJGc2JHSmhZMnNnWlhKeWIzSUFZRzl1WDJobFlXUmxjbDkyWVd4MVpWOWpiMjF3YkdWMFpXQWdZMkZzYkdKaFkyc2daWEp5YjNJQVlHOXVYMjFsYzNOaFoyVmZZMjl0Y0d4bGRHVmdJR05oYkd4aVlXTnJJR1Z5Y205eUFHQnZibDl0WlhSb2IyUmZZMjl0Y0d4bGRHVmdJR05oYkd4aVlXTnJJR1Z5Y205eUFHQnZibDlvWldGa1pYSmZabWxsYkdSZlkyOXRjR3hsZEdWZ0lHTmhiR3hpWVdOcklHVnljbTl5QUdCdmJsOWphSFZ1YTE5bGVIUmxibk5wYjI1ZmJtRnRaV0FnWTJGc2JHSmhZMnNnWlhKeWIzSUFWVzVsZUhCbFkzUmxaQ0JqYUdGeUlHbHVJSFZ5YkNCelpYSjJaWElBU1c1MllXeHBaQ0JvWldGa1pYSWdkbUZzZFdVZ1kyaGhjZ0JKYm5aaGJHbGtJR2hsWVdSbGNpQm1hV1ZzWkNCamFHRnlBRk53WVc0Z1kyRnNiR0poWTJzZ1pYSnliM0lnYVc0Z2IyNWZkbVZ5YzJsdmJnQkpiblpoYkdsa0lHMXBibTl5SUhabGNuTnBiMjRBU1c1MllXeHBaQ0J0WVdwdmNpQjJaWEp6YVc5dUFFVjRjR1ZqZEdWa0lITndZV05sSUdGbWRHVnlJSFpsY25OcGIyNEFSWGh3WldOMFpXUWdRMUpNUmlCaFpuUmxjaUIyWlhKemFXOXVBRWx1ZG1Gc2FXUWdTRlJVVUNCMlpYSnphVzl1QUVsdWRtRnNhV1FnYUdWaFpHVnlJSFJ2YTJWdUFGTndZVzRnWTJGc2JHSmhZMnNnWlhKeWIzSWdhVzRnYjI1ZmRYSnNBRWx1ZG1Gc2FXUWdZMmhoY21GamRHVnljeUJwYmlCMWNtd0FWVzVsZUhCbFkzUmxaQ0J6ZEdGeWRDQmphR0Z5SUdsdUlIVnliQUJFYjNWaWJHVWdRQ0JwYmlCMWNtd0FSVzF3ZEhrZ1EyOXVkR1Z1ZEMxTVpXNW5kR2dBU1c1MllXeHBaQ0JqYUdGeVlXTjBaWElnYVc0Z1EyOXVkR1Z1ZEMxTVpXNW5kR2dBUkhWd2JHbGpZWFJsSUVOdmJuUmxiblF0VEdWdVozUm9BRWx1ZG1Gc2FXUWdZMmhoY2lCcGJpQjFjbXdnY0dGMGFBQkRiMjUwWlc1MExVeGxibWQwYUNCallXNG5kQ0JpWlNCd2NtVnpaVzUwSUhkcGRHZ2dWSEpoYm5ObVpYSXRSVzVqYjJScGJtY0FTVzUyWVd4cFpDQmphR0Z5WVdOMFpYSWdhVzRnWTJoMWJtc2djMmw2WlFCVGNHRnVJR05oYkd4aVlXTnJJR1Z5Y205eUlHbHVJRzl1WDJobFlXUmxjbDkyWVd4MVpRQlRjR0Z1SUdOaGJHeGlZV05ySUdWeWNtOXlJR2x1SUc5dVgyTm9kVzVyWDJWNGRHVnVjMmx2Ymw5MllXeDFaUUJKYm5aaGJHbGtJR05vWVhKaFkzUmxjaUJwYmlCamFIVnVheUJsZUhSbGJuTnBiMjV6SUhaaGJIVmxBRTFwYzNOcGJtY2daWGh3WldOMFpXUWdURVlnWVdaMFpYSWdhR1ZoWkdWeUlIWmhiSFZsQUVsdWRtRnNhV1FnWUZSeVlXNXpabVZ5TFVWdVkyOWthVzVuWUNCb1pXRmtaWElnZG1Gc2RXVUFTVzUyWVd4cFpDQmphR0Z5WVdOMFpYSWdhVzRnWTJoMWJtc2daWGgwWlc1emFXOXVjeUJ4ZFc5MFpTQjJZV3gxWlFCSmJuWmhiR2xrSUdOb1lYSmhZM1JsY2lCcGJpQmphSFZ1YXlCbGVIUmxibk5wYjI1eklIRjFiM1JsWkNCMllXeDFaUUJRWVhWelpXUWdZbmtnYjI1ZmFHVmhaR1Z5YzE5amIyMXdiR1YwWlFCSmJuWmhiR2xrSUVWUFJpQnpkR0YwWlFCdmJsOXlaWE5sZENCd1lYVnpaUUJ2Ymw5amFIVnVhMTlvWldGa1pYSWdjR0YxYzJVQWIyNWZiV1Z6YzJGblpWOWlaV2RwYmlCd1lYVnpaUUJ2Ymw5amFIVnVhMTlsZUhSbGJuTnBiMjVmZG1Gc2RXVWdjR0YxYzJVQWIyNWZjM1JoZEhWelgyTnZiWEJzWlhSbElIQmhkWE5sQUc5dVgzWmxjbk5wYjI1ZlkyOXRjR3hsZEdVZ2NHRjFjMlVBYjI1ZmRYSnNYMk52YlhCc1pYUmxJSEJoZFhObEFHOXVYMk5vZFc1clgyTnZiWEJzWlhSbElIQmhkWE5sQUc5dVgyaGxZV1JsY2w5MllXeDFaVjlqYjIxd2JHVjBaU0J3WVhWelpRQnZibDl0WlhOellXZGxYMk52YlhCc1pYUmxJSEJoZFhObEFHOXVYMjFsZEdodlpGOWpiMjF3YkdWMFpTQndZWFZ6WlFCdmJsOW9aV0ZrWlhKZlptbGxiR1JmWTI5dGNHeGxkR1VnY0dGMWMyVUFiMjVmWTJoMWJtdGZaWGgwWlc1emFXOXVYMjVoYldVZ2NHRjFjMlVBVlc1bGVIQmxZM1JsWkNCemNHRmpaU0JoWm5SbGNpQnpkR0Z5ZENCc2FXNWxBRk53WVc0Z1kyRnNiR0poWTJzZ1pYSnliM0lnYVc0Z2IyNWZZMmgxYm10ZlpYaDBaVzV6YVc5dVgyNWhiV1VBU1c1MllXeHBaQ0JqYUdGeVlXTjBaWElnYVc0Z1kyaDFibXNnWlhoMFpXNXphVzl1Y3lCdVlXMWxBRkJoZFhObElHOXVJRU5QVGs1RlExUXZWWEJuY21Ga1pRQlFZWFZ6WlNCdmJpQlFVa2t2VlhCbmNtRmtaUUJGZUhCbFkzUmxaQ0JJVkZSUUx6SWdRMjl1Ym1WamRHbHZiaUJRY21WbVlXTmxBRk53WVc0Z1kyRnNiR0poWTJzZ1pYSnliM0lnYVc0Z2IyNWZiV1YwYUc5a0FFVjRjR1ZqZEdWa0lITndZV05sSUdGbWRHVnlJRzFsZEdodlpBQlRjR0Z1SUdOaGJHeGlZV05ySUdWeWNtOXlJR2x1SUc5dVgyaGxZV1JsY2w5bWFXVnNaQUJRWVhWelpXUUFTVzUyWVd4cFpDQjNiM0prSUdWdVkyOTFiblJsY21Wa0FFbHVkbUZzYVdRZ2JXVjBhRzlrSUdWdVkyOTFiblJsY21Wa0FGVnVaWGh3WldOMFpXUWdZMmhoY2lCcGJpQjFjbXdnYzJOb1pXMWhBRkpsY1hWbGMzUWdhR0Z6SUdsdWRtRnNhV1FnWUZSeVlXNXpabVZ5TFVWdVkyOWthVzVuWUFCVFYwbFVRMGhmVUZKUFdGa0FWVk5GWDFCU1QxaFpBRTFMUVVOVVNWWkpWRmtBVlU1UVVrOURSVk5UUVVKTVJWOUZUbFJKVkZrQVEwOVFXUUJOVDFaRlJGOVFSVkpOUVU1RlRsUk1XUUJVVDA5ZlJVRlNURmtBVGs5VVNVWlpBRVpCU1V4RlJGOUVSVkJGVGtSRlRrTlpBRUpCUkY5SFFWUkZWMEZaQUZCTVFWa0FVRlZVQUVOSVJVTkxUMVZVQUVkQlZFVlhRVmxmVkVsTlJVOVZWQUJTUlZGVlJWTlVYMVJKVFVWUFZWUUFUa1ZVVjA5U1MxOURUMDVPUlVOVVgxUkpUVVZQVlZRQVEwOU9Ua1ZEVkVsUFRsOVVTVTFGVDFWVUFFeFBSMGxPWDFSSlRVVlBWVlFBVGtWVVYwOVNTMTlTUlVGRVgxUkpUVVZQVlZRQVVFOVRWQUJOU1ZORVNWSkZRMVJGUkY5U1JWRlZSVk5VQUVOTVNVVk9WRjlEVEU5VFJVUmZVa1ZSVlVWVFZBQkRURWxGVGxSZlEweFBVMFZFWDB4UFFVUmZRa0ZNUVU1RFJVUmZVa1ZSVlVWVFZBQkNRVVJmVWtWUlZVVlRWQUJJVkZSUVgxSkZVVlZGVTFSZlUwVk9WRjlVVDE5SVZGUlFVMTlRVDFKVUFGSkZVRTlTVkFCSlRWOUJYMVJGUVZCUFZBQlNSVk5GVkY5RFQwNVVSVTVVQUU1UFgwTlBUbFJGVGxRQVVFRlNWRWxCVEY5RFQwNVVSVTVVQUVoUVJWOUpUbFpCVEVsRVgwTlBUbE5VUVU1VUFFaFFSVjlEUWw5U1JWTkZWQUJIUlZRQVNGQkZYMU5VVWtsRFZBQkRUMDVHVEVsRFZBQlVSVTFRVDFKQlVsbGZVa1ZFU1ZKRlExUUFVRVZTVFVGT1JVNVVYMUpGUkVsU1JVTlVBRU5QVGs1RlExUUFUVlZNVkVsZlUxUkJWRlZUQUVoUVJWOUpUbFpCVEVsRVgxTlVRVlJWVXdCVVQwOWZUVUZPV1Y5U1JWRlZSVk5VVXdCRlFWSk1XVjlJU1U1VVV3QlZUa0ZXUVVsTVFVSk1SVjlHVDFKZlRFVkhRVXhmVWtWQlUwOU9Vd0JQVUZSSlQwNVRBRk5YU1ZSRFNFbE9SMTlRVWs5VVQwTlBURk1BVmtGU1NVRk9WRjlCVEZOUFgwNUZSMDlVU1VGVVJWTUFUVlZNVkVsUVRFVmZRMGhQU1VORlV3QkpUbFJGVWs1QlRGOVRSVkpXUlZKZlJWSlNUMUlBVjBWQ1gxTkZVbFpGVWw5VlRrdE9UMWRPWDBWU1VrOVNBRkpCU1V4SFZVNWZSVkpTVDFJQVNVUkZUbFJKVkZsZlVGSlBWa2xFUlZKZlFWVlVTRVZPVkVsRFFWUkpUMDVmUlZKU1QxSUFVMU5NWDBORlVsUkpSa2xEUVZSRlgwVlNVazlTQUVsT1ZrRk1TVVJmV0Y5R1QxSlhRVkpFUlVSZlJrOVNBRk5GVkY5UVFWSkJUVVZVUlZJQVIwVlVYMUJCVWtGTlJWUkZVZ0JJVUVWZlZWTkZVZ0JUUlVWZlQxUklSVklBU0ZCRlgwTkNYME5JVlU1TFgwaEZRVVJGVWdCTlMwTkJURVZPUkVGU0FGTkZWRlZRQUZkRlFsOVRSVkpXUlZKZlNWTmZSRTlYVGdCVVJVRlNSRTlYVGdCSVVFVmZRMHhQVTBWRVgwTlBUazVGUTFSSlQwNEFTRVZWVWtsVFZFbERYMFZZVUVsU1FWUkpUMDRBUkVsVFEwOU9Ua1ZEVkVWRVgwOVFSVkpCVkVsUFRnQk9UMDVmUVZWVVNFOVNTVlJCVkVsV1JWOUpUa1pQVWsxQlZFbFBUZ0JJVUVWZlNVNVdRVXhKUkY5V1JWSlRTVTlPQUVoUVJWOURRbDlOUlZOVFFVZEZYMEpGUjBsT0FGTkpWRVZmU1ZOZlJsSlBXa1ZPQUVoUVJWOUpUbFpCVEVsRVgwaEZRVVJGVWw5VVQwdEZUZ0JKVGxaQlRFbEVYMVJQUzBWT0FFWlBVa0pKUkVSRlRnQkZUa2hCVGtORlgxbFBWVkpmUTBGTVRRQklVRVZmU1U1V1FVeEpSRjlWVWt3QVFreFBRMHRGUkY5Q1dWOVFRVkpGVGxSQlRGOURUMDVVVWs5TUFFMUxRMDlNQUVGRFRBQklVRVZmU1U1VVJWSk9RVXdBVWtWUlZVVlRWRjlJUlVGRVJWSmZSa2xGVEVSVFgxUlBUMTlNUVZKSFJWOVZUazlHUmtsRFNVRk1BRWhRUlY5UFN3QlZUa3hKVGtzQVZVNU1UME5MQUZCU1NRQlNSVlJTV1Y5WFNWUklBRWhRUlY5SlRsWkJURWxFWDBOUFRsUkZUbFJmVEVWT1IxUklBRWhRUlY5VlRrVllVRVZEVkVWRVgwTlBUbFJGVGxSZlRFVk9SMVJJQUVaTVZWTklBRkJTVDFCUVFWUkRTQUJOTFZORlFWSkRTQUJWVWtsZlZFOVBYMHhQVGtjQVVGSlBRMFZUVTBsT1J3Qk5TVk5EUlV4TVFVNUZUMVZUWDFCRlVsTkpVMVJGVGxSZlYwRlNUa2xPUndCTlNWTkRSVXhNUVU1RlQxVlRYMWRCVWs1SlRrY0FTRkJGWDBsT1ZrRk1TVVJmVkZKQlRsTkdSVkpmUlU1RFQwUkpUa2NBUlhod1pXTjBaV1FnUTFKTVJnQklVRVZmU1U1V1FVeEpSRjlEU0ZWT1MxOVRTVnBGQUUxUFZrVUFRMDlPVkVsT1ZVVUFTRkJGWDBOQ1gxTlVRVlJWVTE5RFQwMVFURVZVUlFCSVVFVmZRMEpmU0VWQlJFVlNVMTlEVDAxUVRFVlVSUUJJVUVWZlEwSmZWa1ZTVTBsUFRsOURUMDFRVEVWVVJRQklVRVZmUTBKZlZWSk1YME5QVFZCTVJWUkZBRWhRUlY5RFFsOURTRlZPUzE5RFQwMVFURVZVUlFCSVVFVmZRMEpmU0VWQlJFVlNYMVpCVEZWRlgwTlBUVkJNUlZSRkFFaFFSVjlEUWw5RFNGVk9TMTlGV0ZSRlRsTkpUMDVmVmtGTVZVVmZRMDlOVUV4RlZFVUFTRkJGWDBOQ1gwTklWVTVMWDBWWVZFVk9VMGxQVGw5T1FVMUZYME5QVFZCTVJWUkZBRWhRUlY5RFFsOU5SVk5UUVVkRlgwTlBUVkJNUlZSRkFFaFFSVjlEUWw5TlJWUklUMFJmUTA5TlVFeEZWRVVBU0ZCRlgwTkNYMGhGUVVSRlVsOUdTVVZNUkY5RFQwMVFURVZVUlFCRVJVeEZWRVVBU0ZCRlgwbE9Wa0ZNU1VSZlJVOUdYMU5VUVZSRkFFbE9Wa0ZNU1VSZlUxTk1YME5GVWxSSlJrbERRVlJGQUZCQlZWTkZBRTVQWDFKRlUxQlBUbE5GQUZWT1UxVlFVRTlTVkVWRVgwMUZSRWxCWDFSWlVFVUFSMDlPUlFCT1QxUmZRVU5EUlZCVVFVSk1SUUJUUlZKV1NVTkZYMVZPUVZaQlNVeEJRa3hGQUZKQlRrZEZYMDVQVkY5VFFWUkpVMFpKUVVKTVJRQlBVa2xIU1U1ZlNWTmZWVTVTUlVGRFNFRkNURVVBVWtWVFVFOU9VMFZmU1ZOZlUxUkJURVVBVUZWU1IwVUFUVVZTUjBVQVVrVlJWVVZUVkY5SVJVRkVSVkpmUmtsRlRFUlRYMVJQVDE5TVFWSkhSUUJTUlZGVlJWTlVYMGhGUVVSRlVsOVVUMDlmVEVGU1IwVUFVRUZaVEU5QlJGOVVUMDlmVEVGU1IwVUFTVTVUVlVaR1NVTkpSVTVVWDFOVVQxSkJSMFVBU0ZCRlgxQkJWVk5GUkY5VlVFZFNRVVJGQUVoUVJWOVFRVlZUUlVSZlNESmZWVkJIVWtGRVJRQlRUMVZTUTBVQVFVNU9UMVZPUTBVQVZGSkJRMFVBU0ZCRlgxVk9SVmhRUlVOVVJVUmZVMUJCUTBVQVJFVlRRMUpKUWtVQVZVNVRWVUpUUTFKSlFrVUFVa1ZEVDFKRUFFaFFSVjlKVGxaQlRFbEVYMDFGVkVoUFJBQk9UMVJmUms5VlRrUUFVRkpQVUVaSlRrUUFWVTVDU1U1RUFGSkZRa2xPUkFCVlRrRlZWRWhQVWtsYVJVUUFUVVZVU0U5RVgwNVBWRjlCVEV4UFYwVkVBRWhVVkZCZlZrVlNVMGxQVGw5T1QxUmZVMVZRVUU5U1ZFVkVBRUZNVWtWQlJGbGZVa1ZRVDFKVVJVUUFRVU5EUlZCVVJVUUFUazlVWDBsTlVFeEZUVVZPVkVWRUFFeFBUMUJmUkVWVVJVTlVSVVFBU0ZCRlgwTlNYMFZZVUVWRFZFVkVBRWhRUlY5TVJsOUZXRkJGUTFSRlJBQkRVa1ZCVkVWRUFFbE5YMVZUUlVRQVNGQkZYMUJCVlZORlJBQlVTVTFGVDFWVVgwOURRMVZTUlVRQVVFRlpUVVZPVkY5U1JWRlZTVkpGUkFCUVVrVkRUMDVFU1ZSSlQwNWZVa1ZSVlVsU1JVUUFVRkpQV0ZsZlFWVlVTRVZPVkVsRFFWUkpUMDVmVWtWUlZVbFNSVVFBVGtWVVYwOVNTMTlCVlZSSVJVNVVTVU5CVkVsUFRsOVNSVkZWU1ZKRlJBQk1SVTVIVkVoZlVrVlJWVWxTUlVRQVUxTk1YME5GVWxSSlJrbERRVlJGWDFKRlVWVkpVa1ZFQUZWUVIxSkJSRVZmVWtWUlZVbFNSVVFBVUVGSFJWOUZXRkJKVWtWRUFGQlNSVU5QVGtSSlZFbFBUbDlHUVVsTVJVUUFSVmhRUlVOVVFWUkpUMDVmUmtGSlRFVkVBRkpGVmtGTVNVUkJWRWxQVGw5R1FVbE1SVVFBVTFOTVgwaEJUa1JUU0VGTFJWOUdRVWxNUlVRQVRFOURTMFZFQUZSU1FVNVRSazlTVFVGVVNVOU9YMEZRVUV4SlJVUUFUazlVWDAxUFJFbEdTVVZFQUU1UFZGOUZXRlJGVGtSRlJBQkNRVTVFVjBsRVZFaGZURWxOU1ZSZlJWaERSVVZFUlVRQVUwbFVSVjlKVTE5UFZrVlNURTlCUkVWRUFFaEZRVVFBUlhod1pXTjBaV1FnU0ZSVVVDOEFBRjRUQUFBbUV3QUFNQkFBQVBBWEFBQ2RFd0FBRlJJQUFEa1hBQUR3RWdBQUNoQUFBSFVTQUFDdEVnQUFnaE1BQUU4VUFBQi9FQUFBb0JVQUFDTVVBQUNKRWdBQWl4UUFBRTBWQUFEVUVRQUF6eFFBQUJBWUFBREpGZ0FBM0JZQUFNRVJBQURnRndBQXV4UUFBSFFVQUFCOEZRQUE1UlFBQUFnWEFBQWZFQUFBWlJVQUFLTVVBQUFvRlFBQUFoVUFBSmtWQUFBc0VBQUFpeGtBQUU4UEFBRFVEZ0FBYWhBQUFNNFFBQUFDRndBQWlRNEFBRzRUQUFBY0V3QUFaaFFBQUZZWEFBREJFd0FBelJNQUFHd1RBQUJvRndBQVpoY0FBRjhYQUFBaUV3QUF6ZzhBQUdrT0FBRFlEZ0FBWXhZQUFNc1RBQUNxRGdBQUtCY0FBQ1lYQUFERkV3QUFYUllBQU9nUkFBQm5Fd0FBWlJNQUFQSVdBQUJ6RXdBQUhSY0FBUGtXQUFEekVRQUF6dzRBQU00VkFBQU1FZ0FBc3hFQUFLVVJBQUJoRUFBQU1oY0FBTHNUQUVINU5Rc0JBUUJCa0RZTDRBRUJBUUlCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQUFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRQkIvVGNMQVFFQVFaRTRDMTRDQXdJQ0FnSUNBQUFDQWdBQ0FnQUNBZ0lDQWdJQ0FnSUNBQVFBQUFBQUFBSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FBQUFBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lBQWdBQ0FFSDlPUXNCQVFCQmtUb0xYZ0lBQWdJQ0FnSUFBQUlDQUFJQ0FBSUNBZ0lDQWdJQ0FnSUFBd0FFQUFBQUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQUFBQUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0FDQUFJQVFmQTdDdzFzYjNObFpXVndMV0ZzYVhabEFFR0pQQXNCQVFCQm9Ed0w0QUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRQUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUJCaVQ0TEFRRUFRYUErQytjQkFRRUJBUUVCQVFFQkFRRUJBZ0VCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVBQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFGamFIVnVhMlZrQUVHd3dBQUxYd0VCQUFFQkFRRUJBQUFCQVFBQkFRQUJBUUVCQVFFQkFRRUJBQUFBQUFBQUFBRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFBQUFBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVBQVFBQkFFR1F3Z0FMSVdWamRHbHZibVZ1ZEMxc1pXNW5kR2h2Ym5KdmVIa3RZMjl1Ym1WamRHbHZiZ0JCd01JQUN5MXlZVzV6Wm1WeUxXVnVZMjlrYVc1bmNHZHlZV1JsRFFvTkNnMEtVMDBOQ2cwS1ZGUlFMME5GTDFSVFVDOEFRZm5DQUFzRkFRSUFBUU1BUVpEREFBdmdBUVFCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFBRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBRUg1eEFBTEJRRUNBQUVEQUVHUXhRQUw0QUVFQVFFRkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRQUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUJCK2NZQUN3UUJBQUFCQUVHUnh3QUwzd0VCQVFBQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQUFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFBRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBRUg2eUFBTEJBRUFBQUlBUVpESkFBdGZBd1FBQUFRRUJBUUVCQVFFQkFRRUJRUUVCQVFFQkFRRUJBUUVCQUFFQUFZSEJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUFBUUFCQUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQUFBQUFRQVFmcktBQXNFQVFBQUFRQkJrTXNBQ3dFQkFFR3F5d0FMUVFJQUFBQUFBQUFEQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd0FBQUFBQUFBTURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREFFSDZ6QUFMQkFFQUFBRUFRWkROQUFzQkFRQkJtczBBQ3dZQ0FBQUFBQUlBUWJITkFBczZBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TUFBQUFBQUFBREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdCQjhNNEFDNVlCVGs5VlRrTkZSVU5MVDFWVVRrVkRWRVZVUlVOU1NVSkZURlZUU0VWVVJVRkVVMFZCVWtOSVVrZEZRMVJKVmtsVVdVeEZUa1JCVWxaRlQxUkpSbGxRVkVsUFRsTkRTRk5GUVZsVFZFRlVRMGhIUlU5U1JFbFNSVU5VVDFKVVVrTklVRUZTUVUxRlZFVlNWVkpEUlVKVFExSkpRa1ZCVWtSUFYwNUJRMFZKVGtST1MwTkxWVUpUUTFKSlFrVklWRlJRTDBGRVZGQXYnLCAnYmFzZTY0JylcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IEJ1ZmZlciB9ID0gcmVxdWlyZSgnbm9kZTpidWZmZXInKVxuXG5tb2R1bGUuZXhwb3J0cyA9IEJ1ZmZlci5mcm9tKCdBR0Z6YlFFQUFBQUJKd2RnQVg4QmYyQURmMzkvQVg5Z0FYOEFZQUovZndCZ0JIOS9mMzhCZjJBQUFHQURmMzkvQUFMTEFRZ0RaVzUyR0hkaGMyMWZiMjVmYUdWaFpHVnljMTlqYjIxd2JHVjBaUUFFQTJWdWRoVjNZWE50WDI5dVgyMWxjM05oWjJWZlltVm5hVzRBQUFObGJuWUxkMkZ6YlY5dmJsOTFjbXdBQVFObGJuWU9kMkZ6YlY5dmJsOXpkR0YwZFhNQUFRTmxibllVZDJGemJWOXZibDlvWldGa1pYSmZabWxsYkdRQUFRTmxibllVZDJGemJWOXZibDlvWldGa1pYSmZkbUZzZFdVQUFRTmxibllNZDJGemJWOXZibDlpYjJSNUFBRURaVzUyR0hkaGMyMWZiMjVmYldWemMyRm5aVjlqYjIxd2JHVjBaUUFBQXkwc0JRWUFBQUlBQUFBQUFBQUNBUUlBQWdJQ0FBQURBQUFBQUFNREF3TUJBUUVCQVFFQkFRRUFBQUlBQUFBRUJRRndBUklTQlFNQkFBSUdDQUYvQVVHQTFBUUxCOUVGSWdadFpXMXZjbmtDQUF0ZmFXNXBkR2xoYkdsNlpRQUlHVjlmYVc1a2FYSmxZM1JmWm5WdVkzUnBiMjVmZEdGaWJHVUJBQXRzYkdoMGRIQmZhVzVwZEFBSkdHeHNhSFIwY0Y5emFHOTFiR1JmYTJWbGNGOWhiR2wyWlFBdkRHeHNhSFIwY0Y5aGJHeHZZd0FMQm0xaGJHeHZZd0F4QzJ4c2FIUjBjRjltY21WbEFBd0VabkpsWlFBTUQyeHNhSFIwY0Y5blpYUmZkSGx3WlFBTkZXeHNhSFIwY0Y5blpYUmZhSFIwY0Y5dFlXcHZjZ0FPRld4c2FIUjBjRjluWlhSZmFIUjBjRjl0YVc1dmNnQVBFV3hzYUhSMGNGOW5aWFJmYldWMGFHOWtBQkFXYkd4b2RIUndYMmRsZEY5emRHRjBkWE5mWTI5a1pRQVJFbXhzYUhSMGNGOW5aWFJmZFhCbmNtRmtaUUFTREd4c2FIUjBjRjl5WlhObGRBQVREbXhzYUhSMGNGOWxlR1ZqZFhSbEFCUVViR3hvZEhSd1gzTmxkSFJwYm1kelgybHVhWFFBRlExc2JHaDBkSEJmWm1sdWFYTm9BQllNYkd4b2RIUndYM0JoZFhObEFCY05iR3hvZEhSd1gzSmxjM1Z0WlFBWUcyeHNhSFIwY0Y5eVpYTjFiV1ZmWVdaMFpYSmZkWEJuY21Ga1pRQVpFR3hzYUhSMGNGOW5aWFJmWlhKeWJtOEFHaGRzYkdoMGRIQmZaMlYwWDJWeWNtOXlYM0psWVhOdmJnQWJGMnhzYUhSMGNGOXpaWFJmWlhKeWIzSmZjbVZoYzI5dUFCd1ViR3hvZEhSd1gyZGxkRjlsY25KdmNsOXdiM01BSFJGc2JHaDBkSEJmWlhKeWJtOWZibUZ0WlFBZUVteHNhSFIwY0Y5dFpYUm9iMlJmYm1GdFpRQWZFbXhzYUhSMGNGOXpkR0YwZFhOZmJtRnRaUUFnR214c2FIUjBjRjl6WlhSZmJHVnVhV1Z1ZEY5b1pXRmtaWEp6QUNFaGJHeG9kSFJ3WDNObGRGOXNaVzVwWlc1MFgyTm9kVzVyWldSZmJHVnVaM1JvQUNJZGJHeG9kSFJ3WDNObGRGOXNaVzVwWlc1MFgydGxaWEJmWVd4cGRtVUFJeVJzYkdoMGRIQmZjMlYwWDJ4bGJtbGxiblJmZEhKaGJuTm1aWEpmWlc1amIyUnBibWNBSkJoc2JHaDBkSEJmYldWemMyRm5aVjl1WldWa2MxOWxiMllBTGdrWEFRQkJBUXNSQVFJREJBVUtCZ2NyTFN3cUtTZ2xKeVlLNzdNQ0xCWUFRWWpRQUNnQ0FBUkFBQXRCaU5BQVFRRTJBZ0FMRkFBZ0FCQXdJQUFnQWpZQ09DQUFJQUU2QUNnTEZBQWdBQ0FBTHdFeUlBQXRBQzRnQUJBdkVBQUxIZ0VCZjBIQUFCQXlJZ0VRTUNBQlFZQUlOZ0k0SUFFZ0FEb0FLQ0FCQzQ4TUFRZC9Ba0FnQUVVTkFDQUFRUWhySWdFZ0FFRUVheWdDQUNJQVFYaHhJZ1JxSVFVQ1FDQUFRUUZ4RFFBZ0FFRURjVVVOQVNBQklBRW9BZ0FpQUdzaUFVR2MwQUFvQWdCSkRRRWdBQ0FFYWlFRUFrQUNRRUdnMEFBb0FnQWdBVWNFUUNBQVFmOEJUUVJBSUFCQkEzWWhBeUFCS0FJSUlnQWdBU2dDRENJQ1JnUkFRWXpRQUVHTTBBQW9BZ0JCZmlBRGQzRTJBZ0FNQlFzZ0FpQUFOZ0lJSUFBZ0FqWUNEQXdFQ3lBQktBSVlJUVlnQVNBQktBSU1JZ0JIQkVBZ0FDQUJLQUlJSWdJMkFnZ2dBaUFBTmdJTURBTUxJQUZCRkdvaUF5Z0NBQ0lDUlFSQUlBRW9BaEFpQWtVTkFpQUJRUkJxSVFNTEEwQWdBeUVISUFJaUFFRVVhaUlES0FJQUlnSU5BQ0FBUVJCcUlRTWdBQ2dDRUNJQ0RRQUxJQWRCQURZQ0FBd0NDeUFGS0FJRUlnQkJBM0ZCQTBjTkFpQUZJQUJCZm5FMkFnUkJsTkFBSUFRMkFnQWdCU0FFTmdJQUlBRWdCRUVCY2pZQ0JBd0RDMEVBSVFBTElBWkZEUUFDUUNBQktBSWNJZ0pCQW5SQnZOSUFhaUlES0FJQUlBRkdCRUFnQXlBQU5nSUFJQUFOQVVHUTBBQkJrTkFBS0FJQVFYNGdBbmR4TmdJQURBSUxJQVpCRUVFVUlBWW9BaEFnQVVZYmFpQUFOZ0lBSUFCRkRRRUxJQUFnQmpZQ0dDQUJLQUlRSWdJRVFDQUFJQUkyQWhBZ0FpQUFOZ0lZQ3lBQlFSUnFLQUlBSWdKRkRRQWdBRUVVYWlBQ05nSUFJQUlnQURZQ0dBc2dBU0FGVHcwQUlBVW9BZ1FpQUVFQmNVVU5BQUpBQWtBQ1FBSkFJQUJCQW5GRkJFQkJwTkFBS0FJQUlBVkdCRUJCcE5BQUlBRTJBZ0JCbU5BQVFaalFBQ2dDQUNBRWFpSUFOZ0lBSUFFZ0FFRUJjallDQkNBQlFhRFFBQ2dDQUVjTkJrR1UwQUJCQURZQ0FFR2cwQUJCQURZQ0FBd0dDMEdnMEFBb0FnQWdCVVlFUUVHZzBBQWdBVFlDQUVHVTBBQkJsTkFBS0FJQUlBUnFJZ0EyQWdBZ0FTQUFRUUZ5TmdJRUlBQWdBV29nQURZQ0FBd0dDeUFBUVhoeElBUnFJUVFnQUVIL0FVMEVRQ0FBUVFOMklRTWdCU2dDQ0NJQUlBVW9BZ3dpQWtZRVFFR00wQUJCak5BQUtBSUFRWDRnQTNkeE5nSUFEQVVMSUFJZ0FEWUNDQ0FBSUFJMkFnd01CQXNnQlNnQ0dDRUdJQVVnQlNnQ0RDSUFSd1JBUVp6UUFDZ0NBQm9nQUNBRktBSUlJZ0kyQWdnZ0FpQUFOZ0lNREFNTElBVkJGR29pQXlnQ0FDSUNSUVJBSUFVb0FoQWlBa1VOQWlBRlFSQnFJUU1MQTBBZ0F5RUhJQUlpQUVFVWFpSURLQUlBSWdJTkFDQUFRUkJxSVFNZ0FDZ0NFQ0lDRFFBTElBZEJBRFlDQUF3Q0N5QUZJQUJCZm5FMkFnUWdBU0FFYWlBRU5nSUFJQUVnQkVFQmNqWUNCQXdEQzBFQUlRQUxJQVpGRFFBQ1FDQUZLQUljSWdKQkFuUkJ2TklBYWlJREtBSUFJQVZHQkVBZ0F5QUFOZ0lBSUFBTkFVR1EwQUJCa05BQUtBSUFRWDRnQW5keE5nSUFEQUlMSUFaQkVFRVVJQVlvQWhBZ0JVWWJhaUFBTmdJQUlBQkZEUUVMSUFBZ0JqWUNHQ0FGS0FJUUlnSUVRQ0FBSUFJMkFoQWdBaUFBTmdJWUN5QUZRUlJxS0FJQUlnSkZEUUFnQUVFVWFpQUNOZ0lBSUFJZ0FEWUNHQXNnQVNBRWFpQUVOZ0lBSUFFZ0JFRUJjallDQkNBQlFhRFFBQ2dDQUVjTkFFR1UwQUFnQkRZQ0FBd0JDeUFFUWY4QlRRUkFJQVJCZUhGQnROQUFhaUVBQW45QmpOQUFLQUlBSWdKQkFTQUVRUU4yZENJRGNVVUVRRUdNMEFBZ0FpQURjallDQUNBQURBRUxJQUFvQWdnTElnSWdBVFlDRENBQUlBRTJBZ2dnQVNBQU5nSU1JQUVnQWpZQ0NBd0JDMEVmSVFJZ0JFSC8vLzhIVFFSQUlBUkJKaUFFUVFoMlp5SUFhM1pCQVhFZ0FFRUJkR3RCUG1vaEFnc2dBU0FDTmdJY0lBRkNBRGNDRUNBQ1FRSjBRYnpTQUdvaEFBSkFRWkRRQUNnQ0FDSURRUUVnQW5RaUIzRkZCRUFnQUNBQk5nSUFRWkRRQUNBRElBZHlOZ0lBSUFFZ0FEWUNHQ0FCSUFFMkFnZ2dBU0FCTmdJTURBRUxJQVJCR1NBQ1FRRjJhMEVBSUFKQkgwY2JkQ0VDSUFBb0FnQWhBQUpBQTBBZ0FDSURLQUlFUVhoeElBUkdEUUVnQWtFZGRpRUFJQUpCQVhRaEFpQURJQUJCQkhGcVFSQnFJZ2NvQWdBaUFBMEFDeUFISUFFMkFnQWdBU0FETmdJWUlBRWdBVFlDRENBQklBRTJBZ2dNQVFzZ0F5Z0NDQ0lBSUFFMkFnd2dBeUFCTmdJSUlBRkJBRFlDR0NBQklBTTJBZ3dnQVNBQU5nSUlDMEdzMEFCQnJOQUFLQUlBUVFGcklnQkJmeUFBR3pZQ0FBc0xCd0FnQUMwQUtBc0hBQ0FBTFFBcUN3Y0FJQUF0QUNzTEJ3QWdBQzBBS1FzSEFDQUFMd0V5Q3djQUlBQXRBQzRMUUFFRWZ5QUFLQUlZSVFFZ0FDMEFMU0VDSUFBdEFDZ2hBeUFBS0FJNElRUWdBQkF3SUFBZ0JEWUNPQ0FBSUFNNkFDZ2dBQ0FDT2dBdElBQWdBVFlDR0F1NzRnRUNCMzhEZmlBQklBSnFJUVFDUUNBQUlnSW9BZ3dpQUEwQUlBSW9BZ1FFUUNBQ0lBRTJBZ1FMSXdCQkVHc2lDQ1FBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNmd0pBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUFJb0Fod2lBMEVCYXc3ZEFkb0JBZGtCQWdNRUJRWUhDQWtLQ3d3TkR0Z0JEeERYQVJFUzFnRVRGQlVXRnhnWkdodmdBZDhCSEIwZTFRRWZJQ0VpSXlRbDFBRW1KeWdwS2lzczB3SFNBUzB1MFFIUUFTOHdNVEl6TkRVMk56ZzVPanM4UFQ0L1FFRkNRMFJGUnRzQlIwaEpTczhCemdGTHpRRk16QUZOVGs5UVVWSlRWRlZXVjFoWldsdGNYVjVmWUdGaVkyUmxabWRvYVdwcmJHMXViM0J4Y25OMGRYWjNlSGw2ZTN4OWZuK0FBWUVCZ2dHREFZUUJoUUdHQVljQmlBR0pBWW9CaXdHTUFZMEJqZ0dQQVpBQmtRR1NBWk1CbEFHVkFaWUJsd0dZQVprQm1nR2JBWndCblFHZUFaOEJvQUdoQWFJQm93R2tBYVVCcGdHbkFhZ0JxUUdxQWFzQnJBR3RBYTRCcndHd0FiRUJzZ0d6QWJRQnRRRzJBYmNCeXdIS0FiZ0J5UUc1QWNnQnVnRzdBYndCdlFHK0FiOEJ3QUhCQWNJQnd3SEVBY1VCeGdFQTNBRUxRUUFNeGdFTFFRNE14UUVMUVEwTXhBRUxRUThNd3dFTFFSQU13Z0VMUVJNTXdRRUxRUlFNd0FFTFFSVU12d0VMUVJZTXZnRUxRUmdNdlFFTFFSa012QUVMUVJvTXV3RUxRUnNNdWdFTFFSd011UUVMUVIwTXVBRUxRUWdNdHdFTFFSNE10Z0VMUVNBTXRRRUxRUjhNdEFFTFFRY01zd0VMUVNFTXNnRUxRU0lNc1FFTFFTTU1zQUVMUVNRTXJ3RUxRUklNcmdFTFFSRU1yUUVMUVNVTXJBRUxRU1lNcXdFTFFTY01xZ0VMUVNnTXFRRUxRY01CREtnQkMwRXFES2NCQzBFckRLWUJDMEVzREtVQkMwRXRES1FCQzBFdURLTUJDMEV2REtJQkMwSEVBUXloQVF0Qk1BeWdBUXRCTkF5ZkFRdEJEQXllQVF0Qk1ReWRBUXRCTWd5Y0FRdEJNd3liQVF0Qk9ReWFBUXRCTlF5WkFRdEJ4UUVNbUFFTFFRc01sd0VMUVRvTWxnRUxRVFlNbFFFTFFRb01sQUVMUVRjTWt3RUxRVGdNa2dFTFFUd01rUUVMUVRzTWtBRUxRVDBNandFTFFRa01qZ0VMUVNrTWpRRUxRVDRNakFFTFFUOE1pd0VMUWNBQURJb0JDMEhCQUF5SkFRdEJ3Z0FNaUFFTFFjTUFESWNCQzBIRUFBeUdBUXRCeFFBTWhRRUxRY1lBRElRQkMwRVhESU1CQzBISEFBeUNBUXRCeUFBTWdRRUxRY2tBRElBQkMwSEtBQXgvQzBITEFBeCtDMEhOQUF4OUMwSE1BQXg4QzBIT0FBeDdDMEhQQUF4NkMwSFFBQXg1QzBIUkFBeDRDMEhTQUF4M0MwSFRBQXgyQzBIVUFBeDFDMEhXQUF4MEMwSFZBQXh6QzBFR0RISUxRZGNBREhFTFFRVU1jQXRCMkFBTWJ3dEJCQXh1QzBIWkFBeHRDMEhhQUF4c0MwSGJBQXhyQzBIY0FBeHFDMEVEREdrTFFkMEFER2dMUWQ0QURHY0xRZDhBREdZTFFlRUFER1VMUWVBQURHUUxRZUlBREdNTFFlTUFER0lMUVFJTVlRdEI1QUFNWUF0QjVRQU1Yd3RCNWdBTVhndEI1d0FNWFF0QjZBQU1YQXRCNlFBTVd3dEI2Z0FNV2d0QjZ3QU1XUXRCN0FBTVdBdEI3UUFNVnd0QjdnQU1WZ3RCN3dBTVZRdEI4QUFNVkF0QjhRQU1Vd3RCOGdBTVVndEI4d0FNVVF0QjlBQU1VQXRCOVFBTVR3dEI5Z0FNVGd0Qjl3QU1UUXRCK0FBTVRBdEIrUUFNU3d0QitnQU1TZ3RCK3dBTVNRdEIvQUFNU0F0Qi9RQU1Sd3RCL2dBTVJndEIvd0FNUlF0QmdBRU1SQXRCZ1FFTVF3dEJnZ0VNUWd0Qmd3RU1RUXRCaEFFTVFBdEJoUUVNUHd0QmhnRU1QZ3RCaHdFTVBRdEJpQUVNUEF0QmlRRU1Pd3RCaWdFTU9ndEJpd0VNT1F0QmpBRU1PQXRCalFFTU53dEJqZ0VNTmd0Qmp3RU1OUXRCa0FFTU5BdEJrUUVNTXd0QmtnRU1NZ3RCa3dFTU1RdEJsQUVNTUF0QmxRRU1Md3RCbGdFTUxndEJsd0VNTFF0Qm1BRU1MQXRCbVFFTUt3dEJtZ0VNS2d0Qm13RU1LUXRCbkFFTUtBdEJuUUVNSnd0Qm5nRU1KZ3RCbndFTUpRdEJvQUVNSkF0Qm9RRU1Jd3RCb2dFTUlndEJvd0VNSVF0QnBBRU1JQXRCcFFFTUh3dEJwZ0VNSGd0QnB3RU1IUXRCcUFFTUhBdEJxUUVNR3d0QnFnRU1HZ3RCcXdFTUdRdEJyQUVNR0F0QnJRRU1Gd3RCcmdFTUZndEJBUXdWQzBHdkFRd1VDMEd3QVF3VEMwR3hBUXdTQzBHekFRd1JDMEd5QVF3UUMwRzBBUXdQQzBHMUFRd09DMEcyQVF3TkMwRzNBUXdNQzBHNEFRd0xDMEc1QVF3S0MwRzZBUXdKQzBHN0FRd0lDMEhHQVF3SEMwRzhBUXdHQzBHOUFRd0ZDMEcrQVF3RUMwRy9BUXdEQzBIQUFRd0NDMEhDQVF3QkMwSEJBUXNoQXdOQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBSUNmd0pBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSi9Ba0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBZ0ovQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNmd0pBQWtBQ2Z3SkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNmd0pBQWtBQ1FBSkFBbjhDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBRERzWUJBQUVDQXdRRkJnY0lDUW9MREEwT0R4QVJFaE1VRlJZWEdCa2FHeHdkSHlBaEl5VW1LQ29yTEM4d01USXpORFUyTnprNk96dzlsQU5BUWtSRlJrbExUazlRVVZKVFZGVldXRnBiWEYxZVgyQmhZbU5rWldabmFHcHNiM0J4YzNWMmVIbDZlM3gvZ0FHQkFZSUJnd0dFQVlVQmhnR0hBWWdCaVFHS0FZc0JqQUdOQVk0Qmp3R1FBWkVCa2dHVEFaUUJsUUdXQVpjQm1BR1pBWm9CbXdHY0FaMEJuZ0dmQWFBQm9RR2lBYU1CcEFHbEFhWUJwd0dvQWFrQnFnR3JBYXdCclFHdUFhOEJzQUd4QWJJQnN3RzBBYlVCdGdHM0FiZ0J1UUc2QWJzQnZBRzlBYjRCdndIQUFjRUJ3Z0hEQWNRQnhRSEdBY2NCeUFISkFjc0J6QUhOQWM0Qnp3R0tBNGtEaUFPSEE0UURnd09BQS9zQytnTDVBdmdDOXdMMEF2TUM4Z0xMQXNFQ3NBTFpBUXNnQVNBRVJ3M3dBa0hkQVNFRERMTURDeUFCSUFSSERjZ0JRY01CSVFNTXNnTUxJQUVnQkVjTmUwSDNBQ0VERExFREN5QUJJQVJIRFhCQjd3QWhBd3l3QXdzZ0FTQUVSdzFwUWVvQUlRTU1yd01MSUFFZ0JFY05aVUhvQUNFRERLNERDeUFCSUFSSERXSkI1Z0FoQXd5dEF3c2dBU0FFUncwYVFSZ2hBd3lzQXdzZ0FTQUVSdzBWUVJJaEF3eXJBd3NnQVNBRVJ3MUNRY1VBSVFNTXFnTUxJQUVnQkVjTk5FRS9JUU1NcVFNTElBRWdCRWNOTWtFOElRTU1xQU1MSUFFZ0JFY05LMEV4SVFNTXB3TUxJQUl0QUM1QkFVWU5ud01Nd1FJTFFRQWhBQUpBQWtBQ1FDQUNMUUFxUlEwQUlBSXRBQ3RGRFFBZ0FpOEJNQ0lEUVFKeFJRMEJEQUlMSUFJdkFUQWlBMEVCY1VVTkFRdEJBU0VBSUFJdEFDaEJBVVlOQUNBQ0x3RXlJZ1ZCNUFCclFlUUFTUTBBSUFWQnpBRkdEUUFnQlVHd0FrWU5BQ0FEUWNBQWNRMEFRUUFoQUNBRFFZZ0VjVUdBQkVZTkFDQURRU2h4UVFCSElRQUxJQUpCQURzQk1DQUNRUUE2QUM4Z0FFVU4zd0lnQWtJQU53TWdET0FDQzBFQUlRQUNRQ0FDS0FJNElnTkZEUUFnQXlnQ0xDSURSUTBBSUFJZ0F4RUFBQ0VBQ3lBQVJRM01BU0FBUVJWSERkMENJQUpCQkRZQ0hDQUNJQUUyQWhRZ0FrR3dHRFlDRUNBQ1FSVTJBZ3hCQUNFRERLUURDeUFCSUFSR0JFQkJCaUVEREtRREN5QUJRUUZxSVFGQkFDRUFBa0FnQWlnQ09DSURSUTBBSUFNb0FsUWlBMFVOQUNBQ0lBTVJBQUFoQUFzZ0FBM1pBZ3djQ3lBQ1FnQTNBeUJCRWlFRERJa0RDeUFCSUFSSERSWkJIU0VEREtFREN5QUJJQVJIQkVBZ0FVRUJhaUVCUVJBaEF3eUlBd3RCQnlFRERLQURDeUFDSUFJcEF5QWlDaUFFSUFGcnJTSUxmU0lNUWdBZ0NpQU1XaHMzQXlBZ0NpQUxXQTNVQWtFSUlRTU1ud01MSUFFZ0JFY0VRQ0FDUVFrMkFnZ2dBaUFCTmdJRVFSUWhBd3lHQXd0QkNTRURESjREQ3lBQ0tRTWdRZ0JTRGNjQklBSWdBaThCTUVHQUFYSTdBVEFNUWdzZ0FTQUVSdzAvUWRBQUlRTU1uQU1MSUFFZ0JFWUVRRUVMSVFNTW5BTUxJQUZCQVdvaEFVRUFJUUFDUUNBQ0tBSTRJZ05GRFFBZ0F5Z0NVQ0lEUlEwQUlBSWdBeEVBQUNFQUN5QUFEYzhDRE1ZQkMwRUFJUUFDUUNBQ0tBSTRJZ05GRFFBZ0F5Z0NTQ0lEUlEwQUlBSWdBeEVBQUNFQUN5QUFSUTNHQVNBQVFSVkhEYzBDSUFKQkN6WUNIQ0FDSUFFMkFoUWdBa0dDR1RZQ0VDQUNRUlUyQWd4QkFDRURESm9EQzBFQUlRQUNRQ0FDS0FJNElnTkZEUUFnQXlnQ1NDSURSUTBBSUFJZ0F4RUFBQ0VBQ3lBQVJRME1JQUJCRlVjTnlnSWdBa0VhTmdJY0lBSWdBVFlDRkNBQ1FZSVpOZ0lRSUFKQkZUWUNERUVBSVFNTW1RTUxRUUFoQUFKQUlBSW9BamdpQTBVTkFDQURLQUpNSWdORkRRQWdBaUFERVFBQUlRQUxJQUJGRGNRQklBQkJGVWNOeHdJZ0FrRUxOZ0ljSUFJZ0FUWUNGQ0FDUVpFWE5nSVFJQUpCRlRZQ0RFRUFJUU1NbUFNTElBRWdCRVlFUUVFUElRTU1tQU1MSUFFdEFBQWlBRUU3UmcwSElBQkJEVWNOeEFJZ0FVRUJhaUVCRE1NQkMwRUFJUUFDUUNBQ0tBSTRJZ05GRFFBZ0F5Z0NUQ0lEUlEwQUlBSWdBeEVBQUNFQUN5QUFSUTNEQVNBQVFSVkhEY0lDSUFKQkR6WUNIQ0FDSUFFMkFoUWdBa0dSRnpZQ0VDQUNRUlUyQWd4QkFDRURESllEQ3dOQUlBRXRBQUJCOERWcUxRQUFJZ0JCQVVjRVFDQUFRUUpIRGNFQ0lBSW9BZ1FoQUVFQUlRTWdBa0VBTmdJRUlBSWdBQ0FCUVFGcUlnRVFMU0lBRGNJQ0RNVUJDeUFFSUFGQkFXb2lBVWNOQUF0QkVpRURESlVEQzBFQUlRQUNRQ0FDS0FJNElnTkZEUUFnQXlnQ1RDSURSUTBBSUFJZ0F4RUFBQ0VBQ3lBQVJRM0ZBU0FBUVJWSERiMENJQUpCR3pZQ0hDQUNJQUUyQWhRZ0FrR1JGellDRUNBQ1FSVTJBZ3hCQUNFRERKUURDeUFCSUFSR0JFQkJGaUVEREpRREN5QUNRUW8yQWdnZ0FpQUJOZ0lFUVFBaEFBSkFJQUlvQWpnaUEwVU5BQ0FES0FKSUlnTkZEUUFnQWlBREVRQUFJUUFMSUFCRkRjSUJJQUJCRlVjTnVRSWdBa0VWTmdJY0lBSWdBVFlDRkNBQ1FZSVpOZ0lRSUFKQkZUWUNERUVBSVFNTWt3TUxJQUVnQkVjRVFBTkFJQUV0QUFCQjhEZHFMUUFBSWdCQkFrY0VRQUpBSUFCQkFXc09CTVFDdlFJQXZnSzlBZ3NnQVVFQmFpRUJRUWdoQXd6OEFnc2dCQ0FCUVFGcUlnRkhEUUFMUVJVaEF3eVRBd3RCRlNFRERKSURDd05BSUFFdEFBQkI4RGxxTFFBQUlnQkJBa2NFUUNBQVFRRnJEZ1RGQXJjQ3d3SzRBcmNDQ3lBRUlBRkJBV29pQVVjTkFBdEJHQ0VEREpFREN5QUJJQVJIQkVBZ0FrRUxOZ0lJSUFJZ0FUWUNCRUVISVFNTStBSUxRUmtoQXd5UUF3c2dBVUVCYWlFQkRBSUxJQUVnQkVZRVFFRWFJUU1NandNTEFrQWdBUzBBQUVFTmF3NFV0UUcvQWI4QnZ3Ry9BYjhCdndHL0FiOEJ2d0cvQWI4QnZ3Ry9BYjhCdndHL0FiOEJ2d0VBdndFTFFRQWhBeUFDUVFBMkFod2dBa0d2Q3pZQ0VDQUNRUUkyQWd3Z0FpQUJRUUZxTmdJVURJNERDeUFCSUFSR0JFQkJHeUVEREk0REN5QUJMUUFBSWdCQk8wY0VRQ0FBUVExSERiRUNJQUZCQVdvaEFReTZBUXNnQVVFQmFpRUJDMEVpSVFNTTh3SUxJQUVnQkVZRVFFRWNJUU1NakFNTFFnQWhDZ0pBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0FTMEFBRUV3YXc0M3dRTEFBZ0FCQWdNRUJRWUgwQUhRQWRBQjBBSFFBZEFCMEFFSUNRb0xEQTNRQWRBQjBBSFFBZEFCMEFIUUFkQUIwQUhRQWRBQjBBSFFBZEFCMEFIUUFkQUIwQUhRQWRBQjBBSFFBZEFCMEFIUUFkQUJEZzhRRVJJVDBBRUxRZ0loQ2d6QUFndENBeUVLREw4Q0MwSUVJUW9NdmdJTFFnVWhDZ3k5QWd0Q0JpRUtETHdDQzBJSElRb011d0lMUWdnaENneTZBZ3RDQ1NFS0RMa0NDMElLSVFvTXVBSUxRZ3NoQ2d5M0FndENEQ0VLRExZQ0MwSU5JUW9NdFFJTFFnNGhDZ3kwQWd0Q0R5RUtETE1DQzBJS0lRb01zZ0lMUWdzaENneXhBZ3RDRENFS0RMQUNDMElOSVFvTXJ3SUxRZzRoQ2d5dUFndENEeUVLREswQ0MwSUFJUW9DUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBRXRBQUJCTUdzT044QUN2d0lBQVFJREJBVUdCNzRDdmdLK0FyNEN2Z0srQXI0Q0NBa0tDd3dOdmdLK0FyNEN2Z0srQXI0Q3ZnSytBcjRDdmdLK0FyNEN2Z0srQXI0Q3ZnSytBcjRDdmdLK0FyNEN2Z0srQXI0Q3ZnSytBZzRQRUJFU0U3NENDMElDSVFvTXZ3SUxRZ01oQ2d5K0FndENCQ0VLREwwQ0MwSUZJUW9NdkFJTFFnWWhDZ3k3QWd0Q0J5RUtETG9DQzBJSUlRb011UUlMUWdraENneTRBZ3RDQ2lFS0RMY0NDMElMSVFvTXRnSUxRZ3doQ2d5MUFndENEU0VLRExRQ0MwSU9JUW9Nc3dJTFFnOGhDZ3l5QWd0Q0NpRUtETEVDQzBJTElRb01zQUlMUWd3aENneXZBZ3RDRFNFS0RLNENDMElPSVFvTXJRSUxRZzhoQ2d5c0Fnc2dBaUFDS1FNZ0lnb2dCQ0FCYTYwaUMzMGlERUlBSUFvZ0RGb2JOd01nSUFvZ0MxZ05wd0pCSHlFRERJa0RDeUFCSUFSSEJFQWdBa0VKTmdJSUlBSWdBVFlDQkVFbElRTU04QUlMUVNBaEF3eUlBd3RCQVNFRklBSXZBVEFpQTBFSWNVVUVRQ0FDS1FNZ1FnQlNJUVVMQWtBZ0FpMEFMZ1JBUVFFaEFDQUNMUUFwUVFWR0RRRWdBMEhBQUhGRklBVnhSUTBCQzBFQUlRQWdBMEhBQUhFTkFFRUNJUUFnQTBFSWNRMEFJQU5CZ0FSeEJFQUNRQ0FDTFFBb1FRRkhEUUFnQWkwQUxVRUtjUTBBUVFVaEFBd0NDMEVFSVFBTUFRc2dBMEVnY1VVRVFBSkFJQUl0QUNoQkFVWU5BQ0FDTHdFeUlnQkI1QUJyUWVRQVNRMEFJQUJCekFGR0RRQWdBRUd3QWtZTkFFRUVJUUFnQTBFb2NVVU5BaUFEUVlnRWNVR0FCRVlOQWd0QkFDRUFEQUVMUVFCQkF5QUNLUU1nVUJzaEFBc2dBRUVCYXc0RnZnSUFzQUVCcEFLaEFndEJFU0VERE8wQ0N5QUNRUUU2QUM4TWhBTUxJQUVnQkVjTm5RSkJKQ0VERElRREN5QUJJQVJIRFJ4QnhnQWhBd3lEQXd0QkFDRUFBa0FnQWlnQ09DSURSUTBBSUFNb0FrUWlBMFVOQUNBQ0lBTVJBQUFoQUFzZ0FFVU5KeUFBUVJWSERaZ0NJQUpCMEFBMkFod2dBaUFCTmdJVUlBSkJrUmcyQWhBZ0FrRVZOZ0lNUVFBaEF3eUNBd3NnQVNBRVJnUkFRU2doQXd5Q0F3dEJBQ0VESUFKQkFEWUNCQ0FDUVF3MkFnZ2dBaUFCSUFFUUtpSUFSUTJVQWlBQ1FTYzJBaHdnQWlBQk5nSVVJQUlnQURZQ0RBeUJBd3NnQVNBRVJnUkFRU2toQXd5QkF3c2dBUzBBQUNJQVFTQkdEUk1nQUVFSlJ3MlZBaUFCUVFGcUlRRU1GQXNnQVNBRVJ3UkFJQUZCQVdvaEFRd1dDMEVxSVFNTS93SUxJQUVnQkVZRVFFRXJJUU1NL3dJTElBRXRBQUFpQUVFSlJ5QUFRU0JIY1EyUUFpQUNMUUFzUVFoSERkMENJQUpCQURvQUxBemRBZ3NnQVNBRVJnUkFRU3doQXd6K0Fnc2dBUzBBQUVFS1J3Mk9BaUFCUVFGcUlRRU1zQUVMSUFFZ0JFY05pZ0pCTHlFRERQd0NDd05BSUFFdEFBQWlBRUVnUndSQUlBQkJDbXNPQklRQ2lBS0lBb1FDaGdJTElBUWdBVUVCYWlJQlJ3MEFDMEV4SVFNTSt3SUxRVEloQXlBQklBUkdEZm9DSUFJb0FnQWlBQ0FFSUFGcmFpRUhJQUVnQUd0QkEyb2hCZ0pBQTBBZ0FFSHdPMm90QUFBZ0FTMEFBQ0lGUVNCeUlBVWdCVUhCQUd0Qi93RnhRUnBKRzBIL0FYRkhEUUVnQUVFRFJnUkFRUVloQVF6aUFnc2dBRUVCYWlFQUlBUWdBVUVCYWlJQlJ3MEFDeUFDSUFjMkFnQU0rd0lMSUFKQkFEWUNBQXlHQWd0Qk15RURJQVFnQVNJQVJnMzVBaUFFSUFGcklBSW9BZ0FpQVdvaEJ5QUFJQUZyUVFocUlRWUNRQU5BSUFGQjlEdHFMUUFBSUFBdEFBQWlCVUVnY2lBRklBVkJ3UUJyUWY4QmNVRWFTUnRCL3dGeFJ3MEJJQUZCQ0VZRVFFRUZJUUVNNFFJTElBRkJBV29oQVNBRUlBQkJBV29pQUVjTkFBc2dBaUFITmdJQURQb0NDeUFDUVFBMkFnQWdBQ0VCRElVQ0MwRTBJUU1nQkNBQklnQkdEZmdDSUFRZ0FXc2dBaWdDQUNJQmFpRUhJQUFnQVd0QkJXb2hCZ0pBQTBBZ0FVSFF3Z0JxTFFBQUlBQXRBQUFpQlVFZ2NpQUZJQVZCd1FCclFmOEJjVUVhU1J0Qi93RnhSdzBCSUFGQkJVWUVRRUVISVFFTTRBSUxJQUZCQVdvaEFTQUVJQUJCQVdvaUFFY05BQXNnQWlBSE5nSUFEUGtDQ3lBQ1FRQTJBZ0FnQUNFQkRJUUNDeUFCSUFSSEJFQURRQ0FCTFFBQVFZQSthaTBBQUNJQVFRRkhCRUFnQUVFQ1JnMEpESUVDQ3lBRUlBRkJBV29pQVVjTkFBdEJNQ0VERFBnQ0MwRXdJUU1NOXdJTElBRWdCRWNFUUFOQUlBRXRBQUFpQUVFZ1J3UkFJQUJCQ21zT0JQOEIvZ0grQWY4Qi9nRUxJQVFnQVVFQmFpSUJSdzBBQzBFNElRTU05d0lMUVRnaEF3ejJBZ3NEUUNBQkxRQUFJZ0JCSUVjZ0FFRUpSM0VOOWdFZ0JDQUJRUUZxSWdGSERRQUxRVHdoQXd6MUFnc0RRQ0FCTFFBQUlnQkJJRWNFUUFKQUlBQkJDbXNPQlBrQkJBVDVBUUFMSUFCQkxFWU45UUVNQXdzZ0JDQUJRUUZxSWdGSERRQUxRVDhoQXd6MEFndEJ3QUFoQXlBQklBUkdEZk1DSUFJb0FnQWlBQ0FFSUFGcmFpRUZJQUVnQUd0QkJtb2hCZ0pBQTBBZ0FFR0FRR3N0QUFBZ0FTMEFBRUVnY2tjTkFTQUFRUVpHRGRzQ0lBQkJBV29oQUNBRUlBRkJBV29pQVVjTkFBc2dBaUFGTmdJQURQUUNDeUFDUVFBMkFnQUxRVFloQXd6WkFnc2dBU0FFUmdSQVFjRUFJUU1NOGdJTElBSkJERFlDQ0NBQ0lBRTJBZ1FnQWkwQUxFRUJhdzRFK3dIdUFld0I2d0hVQWdzZ0FVRUJhaUVCRFBvQkN5QUJJQVJIQkVBRFFBSkFJQUV0QUFBaUFFRWdjaUFBSUFCQndRQnJRZjhCY1VFYVNSdEIvd0Z4SWdCQkNVWU5BQ0FBUVNCR0RRQUNRQUpBQWtBQ1FDQUFRZU1BYXc0VEFBTURBd01EQXdNQkF3TURBd01EQXdNREFnTUxJQUZCQVdvaEFVRXhJUU1NM0FJTElBRkJBV29oQVVFeUlRTU0yd0lMSUFGQkFXb2hBVUV6SVFNTTJnSUxEUDRCQ3lBRUlBRkJBV29pQVVjTkFBdEJOU0VERFBBQ0MwRTFJUU1NN3dJTElBRWdCRWNFUUFOQUlBRXRBQUJCZ0R4cUxRQUFRUUZIRGZjQklBUWdBVUVCYWlJQlJ3MEFDMEU5SVFNTTd3SUxRVDBoQXd6dUFndEJBQ0VBQWtBZ0FpZ0NPQ0lEUlEwQUlBTW9Ba0FpQTBVTkFDQUNJQU1SQUFBaEFBc2dBRVVOQVNBQVFSVkhEZVlCSUFKQndnQTJBaHdnQWlBQk5nSVVJQUpCNHhnMkFoQWdBa0VWTmdJTVFRQWhBd3p0QWdzZ0FVRUJhaUVCQzBFOElRTU0wZ0lMSUFFZ0JFWUVRRUhDQUNFRERPc0NDd0pBQTBBQ1FDQUJMUUFBUVFsckRoZ0FBc3dDekFMUkFzd0N6QUxNQXN3Q3pBTE1Bc3dDekFMTUFzd0N6QUxNQXN3Q3pBTE1Bc3dDekFMTUFnRE1BZ3NnQkNBQlFRRnFJZ0ZIRFFBTFFjSUFJUU1NNndJTElBRkJBV29oQVNBQ0xRQXRRUUZ4UlEzK0FRdEJMQ0VERE5BQ0N5QUJJQVJIRGQ0QlFjUUFJUU1NNkFJTEEwQWdBUzBBQUVHUXdBQnFMUUFBUVFGSERad0JJQVFnQVVFQmFpSUJSdzBBQzBIRkFDRURET2NDQ3lBQkxRQUFJZ0JCSUVZTi9nRWdBRUU2UnczQUFpQUNLQUlFSVFCQkFDRURJQUpCQURZQ0JDQUNJQUFnQVJBcElnQU4zZ0VNM1FFTFFjY0FJUU1nQkNBQklnQkdEZVVDSUFRZ0FXc2dBaWdDQUNJQmFpRUhJQUFnQVd0QkJXb2hCZ05BSUFGQmtNSUFhaTBBQUNBQUxRQUFJZ1ZCSUhJZ0JTQUZRY0VBYTBIL0FYRkJHa2tiUWY4QmNVY052d0lnQVVFRlJnM0NBaUFCUVFGcUlRRWdCQ0FBUVFGcUlnQkhEUUFMSUFJZ0J6WUNBQXpsQWd0QnlBQWhBeUFFSUFFaUFFWU41QUlnQkNBQmF5QUNLQUlBSWdGcUlRY2dBQ0FCYTBFSmFpRUdBMEFnQVVHV3dnQnFMUUFBSUFBdEFBQWlCVUVnY2lBRklBVkJ3UUJyUWY4QmNVRWFTUnRCL3dGeFJ3MitBa0VDSUFGQkNVWU53Z0lhSUFGQkFXb2hBU0FFSUFCQkFXb2lBRWNOQUFzZ0FpQUhOZ0lBRE9RQ0N5QUJJQVJHQkVCQnlRQWhBd3prQWdzQ1FBSkFJQUV0QUFBaUFFRWdjaUFBSUFCQndRQnJRZjhCY1VFYVNSdEIvd0Z4UWU0QWF3NEhBTDhDdndLL0FyOEN2d0lCdndJTElBRkJBV29oQVVFK0lRTU15d0lMSUFGQkFXb2hBVUUvSVFNTXlnSUxRY29BSVFNZ0JDQUJJZ0JHRGVJQ0lBUWdBV3NnQWlnQ0FDSUJhaUVHSUFBZ0FXdEJBV29oQndOQUlBRkJvTUlBYWkwQUFDQUFMUUFBSWdWQklISWdCU0FGUWNFQWEwSC9BWEZCR2trYlFmOEJjVWNOdkFJZ0FVRUJSZzIrQWlBQlFRRnFJUUVnQkNBQVFRRnFJZ0JIRFFBTElBSWdCallDQUF6aUFndEJ5d0FoQXlBRUlBRWlBRVlONFFJZ0JDQUJheUFDS0FJQUlnRnFJUWNnQUNBQmEwRU9haUVHQTBBZ0FVR2l3Z0JxTFFBQUlBQXRBQUFpQlVFZ2NpQUZJQVZCd1FCclFmOEJjVUVhU1J0Qi93RnhSdzI3QWlBQlFRNUdEYjRDSUFGQkFXb2hBU0FFSUFCQkFXb2lBRWNOQUFzZ0FpQUhOZ0lBRE9FQ0MwSE1BQ0VESUFRZ0FTSUFSZzNnQWlBRUlBRnJJQUlvQWdBaUFXb2hCeUFBSUFGclFROXFJUVlEUUNBQlFjRENBR290QUFBZ0FDMEFBQ0lGUVNCeUlBVWdCVUhCQUd0Qi93RnhRUnBKRzBIL0FYRkhEYm9DUVFNZ0FVRVBSZzIrQWhvZ0FVRUJhaUVCSUFRZ0FFRUJhaUlBUncwQUN5QUNJQWMyQWdBTTRBSUxRYzBBSVFNZ0JDQUJJZ0JHRGQ4Q0lBUWdBV3NnQWlnQ0FDSUJhaUVISUFBZ0FXdEJCV29oQmdOQUlBRkIwTUlBYWkwQUFDQUFMUUFBSWdWQklISWdCU0FGUWNFQWEwSC9BWEZCR2trYlFmOEJjVWNOdVFKQkJDQUJRUVZHRGIwQ0dpQUJRUUZxSVFFZ0JDQUFRUUZxSWdCSERRQUxJQUlnQnpZQ0FBemZBZ3NnQVNBRVJnUkFRYzRBSVFNTTN3SUxBa0FDUUFKQUFrQWdBUzBBQUNJQVFTQnlJQUFnQUVIQkFHdEIvd0Z4UVJwSkcwSC9BWEZCNHdCckRoTUF2QUs4QXJ3Q3ZBSzhBcndDdkFLOEFyd0N2QUs4QXJ3Q0Fid0N2QUs4QWdJRHZBSUxJQUZCQVdvaEFVSEJBQ0VERE1nQ0N5QUJRUUZxSVFGQndnQWhBd3pIQWdzZ0FVRUJhaUVCUWNNQUlRTU14Z0lMSUFGQkFXb2hBVUhFQUNFRERNVUNDeUFCSUFSSEJFQWdBa0VOTmdJSUlBSWdBVFlDQkVIRkFDRURETVVDQzBIUEFDRURETjBDQ3dKQUFrQWdBUzBBQUVFS2F3NEVBWkFCa0FFQWtBRUxJQUZCQVdvaEFRdEJLQ0VERE1NQ0N5QUJJQVJHQkVCQjBRQWhBd3pjQWdzZ0FTMEFBRUVnUncwQUlBRkJBV29oQVNBQ0xRQXRRUUZ4UlEzUUFRdEJGeUVERE1FQ0N5QUJJQVJIRGNzQlFkSUFJUU1NMlFJTFFkTUFJUU1nQVNBRVJnM1lBaUFDS0FJQUlnQWdCQ0FCYTJvaEJpQUJJQUJyUVFGcUlRVURRQ0FCTFFBQUlBQkIxc0lBYWkwQUFFY054d0VnQUVFQlJnM0tBU0FBUVFGcUlRQWdCQ0FCUVFGcUlnRkhEUUFMSUFJZ0JqWUNBQXpZQWdzZ0FTQUVSZ1JBUWRVQUlRTU0yQUlMSUFFdEFBQkJDa2NOd2dFZ0FVRUJhaUVCRE1vQkN5QUJJQVJHQkVCQjFnQWhBd3pYQWdzQ1FBSkFJQUV0QUFCQkNtc09CQUREQWNNQkFjTUJDeUFCUVFGcUlRRU15Z0VMSUFGQkFXb2hBVUhLQUNFRERMMENDMEVBSVFBQ1FDQUNLQUk0SWdORkRRQWdBeWdDUENJRFJRMEFJQUlnQXhFQUFDRUFDeUFBRGI4QlFjMEFJUU1NdkFJTElBSXRBQ2xCSWtZTnp3SU1pUUVMSUFRZ0FTSUZSZ1JBUWRzQUlRTU0xQUlMUVFBaEFFRUJJUUZCQVNFR1FRQWhBd0pBQW44Q1FBSkFBa0FDUUFKQUFrQUNRQ0FGTFFBQVFUQnJEZ3JGQWNRQkFBRUNBd1FGQmdqREFRdEJBZ3dHQzBFRERBVUxRUVFNQkF0QkJRd0RDMEVHREFJTFFRY01BUXRCQ0FzaEEwRUFJUUZCQUNFR0RMMEJDMEVKSVFOQkFTRUFRUUFoQVVFQUlRWU12QUVMSUFFZ0JFWUVRRUhkQUNFREROTUNDeUFCTFFBQVFTNUhEYmdCSUFGQkFXb2hBUXlJQVFzZ0FTQUVSdzIyQVVIZkFDRURETkVDQ3lBQklBUkhCRUFnQWtFT05nSUlJQUlnQVRZQ0JFSFFBQ0VERExnQ0MwSGdBQ0VERE5BQ0MwSGhBQ0VESUFFZ0JFWU56d0lnQWlnQ0FDSUFJQVFnQVd0cUlRVWdBU0FBYTBFRGFpRUdBMEFnQVMwQUFDQUFRZUxDQUdvdEFBQkhEYkVCSUFCQkEwWU5zd0VnQUVFQmFpRUFJQVFnQVVFQmFpSUJSdzBBQ3lBQ0lBVTJBZ0FNendJTFFlSUFJUU1nQVNBRVJnM09BaUFDS0FJQUlnQWdCQ0FCYTJvaEJTQUJJQUJyUVFKcUlRWURRQ0FCTFFBQUlBQkI1c0lBYWkwQUFFY05zQUVnQUVFQ1JnMnZBU0FBUVFGcUlRQWdCQ0FCUVFGcUlnRkhEUUFMSUFJZ0JUWUNBQXpPQWd0QjR3QWhBeUFCSUFSR0RjMENJQUlvQWdBaUFDQUVJQUZyYWlFRklBRWdBR3RCQTJvaEJnTkFJQUV0QUFBZ0FFSHB3Z0JxTFFBQVJ3MnZBU0FBUVFOR0RhMEJJQUJCQVdvaEFDQUVJQUZCQVdvaUFVY05BQXNnQWlBRk5nSUFETTBDQ3lBQklBUkdCRUJCNVFBaEF3ek5BZ3NnQVVFQmFpRUJRUUFoQUFKQUlBSW9BamdpQTBVTkFDQURLQUl3SWdORkRRQWdBaUFERVFBQUlRQUxJQUFOcWdGQjFnQWhBd3l6QWdzZ0FTQUVSd1JBQTBBZ0FTMEFBQ0lBUVNCSEJFQUNRQUpBQWtBZ0FFSElBR3NPQ3dBQnN3R3pBYk1Cc3dHekFiTUJzd0d6QVFLekFRc2dBVUVCYWlFQlFkSUFJUU1NdHdJTElBRkJBV29oQVVIVEFDRURETFlDQ3lBQlFRRnFJUUZCMUFBaEF3eTFBZ3NnQkNBQlFRRnFJZ0ZIRFFBTFFlUUFJUU1NekFJTFFlUUFJUU1NeXdJTEEwQWdBUzBBQUVId3dnQnFMUUFBSWdCQkFVY0VRQ0FBUVFKckRnT25BYVlCcFFHa0FRc2dCQ0FCUVFGcUlnRkhEUUFMUWVZQUlRTU15Z0lMSUFGQkFXb2dBU0FFUncwQ0drSG5BQ0VERE1rQ0N3TkFJQUV0QUFCQjhNUUFhaTBBQUNJQVFRRkhCRUFDUUNBQVFRSnJEZ1NpQWFFQm9BRUFud0VMUWRjQUlRTU1zUUlMSUFRZ0FVRUJhaUlCUncwQUMwSG9BQ0VERE1nQ0N5QUJJQVJHQkVCQjZRQWhBd3pJQWdzQ1FDQUJMUUFBSWdCQkNtc09HcmNCbXdHYkFiUUJtd0diQVpzQm13R2JBWnNCbXdHYkFac0Jtd0diQVpzQm13R2JBWnNCbXdHYkFac0JwQUdiQVpzQkFKa0JDeUFCUVFGcUN5RUJRUVloQXd5dEFnc0RRQ0FCTFFBQVFmREdBR290QUFCQkFVY05mU0FFSUFGQkFXb2lBVWNOQUF0QjZnQWhBd3pGQWdzZ0FVRUJhaUFCSUFSSERRSWFRZXNBSVFNTXhBSUxJQUVnQkVZRVFFSHNBQ0VERE1RQ0N5QUJRUUZxREFFTElBRWdCRVlFUUVIdEFDRURETU1DQ3lBQlFRRnFDeUVCUVFRaEF3eW9BZ3NnQVNBRVJnUkFRZTRBSVFNTXdRSUxBa0FDUUFKQUlBRXRBQUJCOE1nQWFpMEFBRUVCYXc0SGtBR1BBWTRCQUh3QkFvMEJDeUFCUVFGcUlRRU1Dd3NnQVVFQmFneVRBUXRCQUNFRElBSkJBRFlDSENBQ1Fac1NOZ0lRSUFKQkJ6WUNEQ0FDSUFGQkFXbzJBaFFNd0FJTEFrQURRQ0FCTFFBQVFmRElBR290QUFBaUFFRUVSd1JBQWtBQ1FDQUFRUUZyRGdlVUFaTUJrZ0dOQVFBRUFZMEJDMEhhQUNFRERLb0NDeUFCUVFGcUlRRkIzQUFoQXd5cEFnc2dCQ0FCUVFGcUlnRkhEUUFMUWU4QUlRTU13QUlMSUFGQkFXb01rUUVMSUFRZ0FTSUFSZ1JBUWZBQUlRTU12d0lMSUFBdEFBQkJMMGNOQVNBQVFRRnFJUUVNQndzZ0JDQUJJZ0JHQkVCQjhRQWhBd3krQWdzZ0FDMEFBQ0lCUVM5R0JFQWdBRUVCYWlFQlFkMEFJUU1NcFFJTElBRkJDbXNpQTBFV1N3MEFJQUFoQVVFQklBTjBRWW1BZ0FKeERma0JDMEVBSVFNZ0FrRUFOZ0ljSUFJZ0FEWUNGQ0FDUVl3Y05nSVFJQUpCQnpZQ0RBeThBZ3NnQVNBRVJ3UkFJQUZCQVdvaEFVSGVBQ0VEREtNQ0MwSHlBQ0VERExzQ0N5QUJJQVJHQkVCQjlBQWhBd3k3QWdzQ1FDQUJMUUFBUWZETUFHb3RBQUJCQVdzT0EvY0Jjd0NDQVF0QjRRQWhBd3loQWdzZ0FTQUVSd1JBQTBBZ0FTMEFBRUh3eWdCcUxRQUFJZ0JCQTBjRVFBSkFJQUJCQVdzT0F2a0JBSVVCQzBIZkFDRURES01DQ3lBRUlBRkJBV29pQVVjTkFBdEI4d0FoQXd5NkFndEI4d0FoQXd5NUFnc2dBU0FFUndSQUlBSkJEellDQ0NBQ0lBRTJBZ1JCNEFBaEF3eWdBZ3RCOVFBaEF3eTRBZ3NnQVNBRVJnUkFRZllBSVFNTXVBSUxJQUpCRHpZQ0NDQUNJQUUyQWdRTFFRTWhBd3lkQWdzRFFDQUJMUUFBUVNCSERZNENJQVFnQVVFQmFpSUJSdzBBQzBIM0FDRURETFVDQ3lBQklBUkdCRUJCK0FBaEF3eTFBZ3NnQVMwQUFFRWdSdzE2SUFGQkFXb2hBUXhiQzBFQUlRQUNRQ0FDS0FJNElnTkZEUUFnQXlnQ09DSURSUTBBSUFJZ0F4RUFBQ0VBQ3lBQURYZ01nQUlMSUFFZ0JFWUVRRUg2QUNFRERMTUNDeUFCTFFBQVFjd0FSdzEwSUFGQkFXb2hBVUVUREhZTFFmc0FJUU1nQVNBRVJnMnhBaUFDS0FJQUlnQWdCQ0FCYTJvaEJTQUJJQUJyUVFWcUlRWURRQ0FCTFFBQUlBQkI4TTRBYWkwQUFFY05jeUFBUVFWR0RYVWdBRUVCYWlFQUlBUWdBVUVCYWlJQlJ3MEFDeUFDSUFVMkFnQU1zUUlMSUFFZ0JFWUVRRUg4QUNFRERMRUNDd0pBQWtBZ0FTMEFBRUhEQUdzT0RBQjBkSFIwZEhSMGRIUjBBWFFMSUFGQkFXb2hBVUhtQUNFRERKZ0NDeUFCUVFGcUlRRkI1d0FoQXd5WEFndEIvUUFoQXlBQklBUkdEYThDSUFJb0FnQWlBQ0FFSUFGcmFpRUZJQUVnQUd0QkFtb2hCZ0pBQTBBZ0FTMEFBQ0FBUWUzUEFHb3RBQUJIRFhJZ0FFRUNSZzBCSUFCQkFXb2hBQ0FFSUFGQkFXb2lBVWNOQUFzZ0FpQUZOZ0lBRExBQ0N5QUNRUUEyQWdBZ0JrRUJhaUVCUVJBTWN3dEIvZ0FoQXlBQklBUkdEYTRDSUFJb0FnQWlBQ0FFSUFGcmFpRUZJQUVnQUd0QkJXb2hCZ0pBQTBBZ0FTMEFBQ0FBUWZiT0FHb3RBQUJIRFhFZ0FFRUZSZzBCSUFCQkFXb2hBQ0FFSUFGQkFXb2lBVWNOQUFzZ0FpQUZOZ0lBREs4Q0N5QUNRUUEyQWdBZ0JrRUJhaUVCUVJZTWNndEIvd0FoQXlBQklBUkdEYTBDSUFJb0FnQWlBQ0FFSUFGcmFpRUZJQUVnQUd0QkEyb2hCZ0pBQTBBZ0FTMEFBQ0FBUWZ6T0FHb3RBQUJIRFhBZ0FFRURSZzBCSUFCQkFXb2hBQ0FFSUFGQkFXb2lBVWNOQUFzZ0FpQUZOZ0lBREs0Q0N5QUNRUUEyQWdBZ0JrRUJhaUVCUVFVTWNRc2dBU0FFUmdSQVFZQUJJUU1NclFJTElBRXRBQUJCMlFCSERXNGdBVUVCYWlFQlFRZ01jQXNnQVNBRVJnUkFRWUVCSVFNTXJBSUxBa0FDUUNBQkxRQUFRYzRBYXc0REFHOEJid3NnQVVFQmFpRUJRZXNBSVFNTWt3SUxJQUZCQVdvaEFVSHNBQ0VEREpJQ0N5QUJJQVJHQkVCQmdnRWhBd3lyQWdzQ1FBSkFJQUV0QUFCQnlBQnJEZ2dBYm01dWJtNXVBVzRMSUFGQkFXb2hBVUhxQUNFRERKSUNDeUFCUVFGcUlRRkI3UUFoQXd5UkFndEJnd0VoQXlBQklBUkdEYWtDSUFJb0FnQWlBQ0FFSUFGcmFpRUZJQUVnQUd0QkFtb2hCZ0pBQTBBZ0FTMEFBQ0FBUVlEUEFHb3RBQUJIRFd3Z0FFRUNSZzBCSUFCQkFXb2hBQ0FFSUFGQkFXb2lBVWNOQUFzZ0FpQUZOZ0lBREtvQ0N5QUNRUUEyQWdBZ0JrRUJhaUVCUVFBTWJRdEJoQUVoQXlBQklBUkdEYWdDSUFJb0FnQWlBQ0FFSUFGcmFpRUZJQUVnQUd0QkJHb2hCZ0pBQTBBZ0FTMEFBQ0FBUVlQUEFHb3RBQUJIRFdzZ0FFRUVSZzBCSUFCQkFXb2hBQ0FFSUFGQkFXb2lBVWNOQUFzZ0FpQUZOZ0lBREtrQ0N5QUNRUUEyQWdBZ0JrRUJhaUVCUVNNTWJBc2dBU0FFUmdSQVFZVUJJUU1NcUFJTEFrQUNRQ0FCTFFBQVFjd0FhdzRJQUd0cmEydHJhd0ZyQ3lBQlFRRnFJUUZCN3dBaEF3eVBBZ3NnQVVFQmFpRUJRZkFBSVFNTWpnSUxJQUVnQkVZRVFFR0dBU0VEREtjQ0N5QUJMUUFBUWNVQVJ3MW9JQUZCQVdvaEFReGdDMEdIQVNFRElBRWdCRVlOcFFJZ0FpZ0NBQ0lBSUFRZ0FXdHFJUVVnQVNBQWEwRURhaUVHQWtBRFFDQUJMUUFBSUFCQmlNOEFhaTBBQUVjTmFDQUFRUU5HRFFFZ0FFRUJhaUVBSUFRZ0FVRUJhaUlCUncwQUN5QUNJQVUyQWdBTXBnSUxJQUpCQURZQ0FDQUdRUUZxSVFGQkxReHBDMEdJQVNFRElBRWdCRVlOcEFJZ0FpZ0NBQ0lBSUFRZ0FXdHFJUVVnQVNBQWEwRUlhaUVHQWtBRFFDQUJMUUFBSUFCQjBNOEFhaTBBQUVjTlp5QUFRUWhHRFFFZ0FFRUJhaUVBSUFRZ0FVRUJhaUlCUncwQUN5QUNJQVUyQWdBTXBRSUxJQUpCQURZQ0FDQUdRUUZxSVFGQktReG9DeUFCSUFSR0JFQkJpUUVoQXd5a0FndEJBU0FCTFFBQVFkOEFSdzFuR2lBQlFRRnFJUUVNWGd0QmlnRWhBeUFCSUFSR0RhSUNJQUlvQWdBaUFDQUVJQUZyYWlFRklBRWdBR3RCQVdvaEJnTkFJQUV0QUFBZ0FFR016d0JxTFFBQVJ3MWtJQUJCQVVZTitnRWdBRUVCYWlFQUlBUWdBVUVCYWlJQlJ3MEFDeUFDSUFVMkFnQU1vZ0lMUVlzQklRTWdBU0FFUmcyaEFpQUNLQUlBSWdBZ0JDQUJhMm9oQlNBQklBQnJRUUpxSVFZQ1FBTkFJQUV0QUFBZ0FFR096d0JxTFFBQVJ3MWtJQUJCQWtZTkFTQUFRUUZxSVFBZ0JDQUJRUUZxSWdGSERRQUxJQUlnQlRZQ0FBeWlBZ3NnQWtFQU5nSUFJQVpCQVdvaEFVRUNER1VMUVl3QklRTWdBU0FFUmcyZ0FpQUNLQUlBSWdBZ0JDQUJhMm9oQlNBQklBQnJRUUZxSVFZQ1FBTkFJQUV0QUFBZ0FFSHd6d0JxTFFBQVJ3MWpJQUJCQVVZTkFTQUFRUUZxSVFBZ0JDQUJRUUZxSWdGSERRQUxJQUlnQlRZQ0FBeWhBZ3NnQWtFQU5nSUFJQVpCQVdvaEFVRWZER1FMUVkwQklRTWdBU0FFUmcyZkFpQUNLQUlBSWdBZ0JDQUJhMm9oQlNBQklBQnJRUUZxSVFZQ1FBTkFJQUV0QUFBZ0FFSHl6d0JxTFFBQVJ3MWlJQUJCQVVZTkFTQUFRUUZxSVFBZ0JDQUJRUUZxSWdGSERRQUxJQUlnQlRZQ0FBeWdBZ3NnQWtFQU5nSUFJQVpCQVdvaEFVRUpER01MSUFFZ0JFWUVRRUdPQVNFRERKOENDd0pBQWtBZ0FTMEFBRUhKQUdzT0J3QmlZbUppWWdGaUN5QUJRUUZxSVFGQitBQWhBd3lHQWdzZ0FVRUJhaUVCUWZrQUlRTU1oUUlMUVk4QklRTWdBU0FFUmcyZEFpQUNLQUlBSWdBZ0JDQUJhMm9oQlNBQklBQnJRUVZxSVFZQ1FBTkFJQUV0QUFBZ0FFR1J6d0JxTFFBQVJ3MWdJQUJCQlVZTkFTQUFRUUZxSVFBZ0JDQUJRUUZxSWdGSERRQUxJQUlnQlRZQ0FBeWVBZ3NnQWtFQU5nSUFJQVpCQVdvaEFVRVlER0VMUVpBQklRTWdBU0FFUmcyY0FpQUNLQUlBSWdBZ0JDQUJhMm9oQlNBQklBQnJRUUpxSVFZQ1FBTkFJQUV0QUFBZ0FFR1h6d0JxTFFBQVJ3MWZJQUJCQWtZTkFTQUFRUUZxSVFBZ0JDQUJRUUZxSWdGSERRQUxJQUlnQlRZQ0FBeWRBZ3NnQWtFQU5nSUFJQVpCQVdvaEFVRVhER0FMUVpFQklRTWdBU0FFUmcyYkFpQUNLQUlBSWdBZ0JDQUJhMm9oQlNBQklBQnJRUVpxSVFZQ1FBTkFJQUV0QUFBZ0FFR2F6d0JxTFFBQVJ3MWVJQUJCQmtZTkFTQUFRUUZxSVFBZ0JDQUJRUUZxSWdGSERRQUxJQUlnQlRZQ0FBeWNBZ3NnQWtFQU5nSUFJQVpCQVdvaEFVRVZERjhMUVpJQklRTWdBU0FFUmcyYUFpQUNLQUlBSWdBZ0JDQUJhMm9oQlNBQklBQnJRUVZxSVFZQ1FBTkFJQUV0QUFBZ0FFR2h6d0JxTFFBQVJ3MWRJQUJCQlVZTkFTQUFRUUZxSVFBZ0JDQUJRUUZxSWdGSERRQUxJQUlnQlRZQ0FBeWJBZ3NnQWtFQU5nSUFJQVpCQVdvaEFVRWVERjRMSUFFZ0JFWUVRRUdUQVNFRERKb0NDeUFCTFFBQVFjd0FSdzFiSUFGQkFXb2hBVUVLREYwTElBRWdCRVlFUUVHVUFTRURESmtDQ3dKQUFrQWdBUzBBQUVIQkFHc09Ed0JjWEZ4Y1hGeGNYRnhjWEZ4Y0FWd0xJQUZCQVdvaEFVSCtBQ0VERElBQ0N5QUJRUUZxSVFGQi93QWhBd3ovQVFzZ0FTQUVSZ1JBUVpVQklRTU1tQUlMQWtBQ1FDQUJMUUFBUWNFQWF3NERBRnNCV3dzZ0FVRUJhaUVCUWYwQUlRTU0vd0VMSUFGQkFXb2hBVUdBQVNFRERQNEJDMEdXQVNFRElBRWdCRVlObGdJZ0FpZ0NBQ0lBSUFRZ0FXdHFJUVVnQVNBQWEwRUJhaUVHQWtBRFFDQUJMUUFBSUFCQnA4OEFhaTBBQUVjTldTQUFRUUZHRFFFZ0FFRUJhaUVBSUFRZ0FVRUJhaUlCUncwQUN5QUNJQVUyQWdBTWx3SUxJQUpCQURZQ0FDQUdRUUZxSVFGQkN3eGFDeUFCSUFSR0JFQkJsd0VoQXd5V0Fnc0NRQUpBQWtBQ1FDQUJMUUFBUVMxckRpTUFXMXRiVzF0YlcxdGJXMXRiVzF0YlcxdGJXMXRiVzFzQlcxdGJXMXNDVzF0YkExc0xJQUZCQVdvaEFVSDdBQ0VERFA4QkN5QUJRUUZxSVFGQi9BQWhBd3orQVFzZ0FVRUJhaUVCUVlFQklRTU0vUUVMSUFGQkFXb2hBVUdDQVNFRERQd0JDMEdZQVNFRElBRWdCRVlObEFJZ0FpZ0NBQ0lBSUFRZ0FXdHFJUVVnQVNBQWEwRUVhaUVHQWtBRFFDQUJMUUFBSUFCQnFjOEFhaTBBQUVjTlZ5QUFRUVJHRFFFZ0FFRUJhaUVBSUFRZ0FVRUJhaUlCUncwQUN5QUNJQVUyQWdBTWxRSUxJQUpCQURZQ0FDQUdRUUZxSVFGQkdReFlDMEdaQVNFRElBRWdCRVlOa3dJZ0FpZ0NBQ0lBSUFRZ0FXdHFJUVVnQVNBQWEwRUZhaUVHQWtBRFFDQUJMUUFBSUFCQnJzOEFhaTBBQUVjTlZpQUFRUVZHRFFFZ0FFRUJhaUVBSUFRZ0FVRUJhaUlCUncwQUN5QUNJQVUyQWdBTWxBSUxJQUpCQURZQ0FDQUdRUUZxSVFGQkJneFhDMEdhQVNFRElBRWdCRVlOa2dJZ0FpZ0NBQ0lBSUFRZ0FXdHFJUVVnQVNBQWEwRUJhaUVHQWtBRFFDQUJMUUFBSUFCQnRNOEFhaTBBQUVjTlZTQUFRUUZHRFFFZ0FFRUJhaUVBSUFRZ0FVRUJhaUlCUncwQUN5QUNJQVUyQWdBTWt3SUxJQUpCQURZQ0FDQUdRUUZxSVFGQkhBeFdDMEdiQVNFRElBRWdCRVlOa1FJZ0FpZ0NBQ0lBSUFRZ0FXdHFJUVVnQVNBQWEwRUJhaUVHQWtBRFFDQUJMUUFBSUFCQnRzOEFhaTBBQUVjTlZDQUFRUUZHRFFFZ0FFRUJhaUVBSUFRZ0FVRUJhaUlCUncwQUN5QUNJQVUyQWdBTWtnSUxJQUpCQURZQ0FDQUdRUUZxSVFGQkp3eFZDeUFCSUFSR0JFQkJuQUVoQXd5UkFnc0NRQUpBSUFFdEFBQkIxQUJyRGdJQUFWUUxJQUZCQVdvaEFVR0dBU0VERFBnQkN5QUJRUUZxSVFGQmh3RWhBd3ozQVF0Qm5RRWhBeUFCSUFSR0RZOENJQUlvQWdBaUFDQUVJQUZyYWlFRklBRWdBR3RCQVdvaEJnSkFBMEFnQVMwQUFDQUFRYmpQQUdvdEFBQkhEVklnQUVFQlJnMEJJQUJCQVdvaEFDQUVJQUZCQVdvaUFVY05BQXNnQWlBRk5nSUFESkFDQ3lBQ1FRQTJBZ0FnQmtFQmFpRUJRU1lNVXd0Qm5nRWhBeUFCSUFSR0RZNENJQUlvQWdBaUFDQUVJQUZyYWlFRklBRWdBR3RCQVdvaEJnSkFBMEFnQVMwQUFDQUFRYnJQQUdvdEFBQkhEVkVnQUVFQlJnMEJJQUJCQVdvaEFDQUVJQUZCQVdvaUFVY05BQXNnQWlBRk5nSUFESThDQ3lBQ1FRQTJBZ0FnQmtFQmFpRUJRUU1NVWd0Qm53RWhBeUFCSUFSR0RZMENJQUlvQWdBaUFDQUVJQUZyYWlFRklBRWdBR3RCQW1vaEJnSkFBMEFnQVMwQUFDQUFRZTNQQUdvdEFBQkhEVkFnQUVFQ1JnMEJJQUJCQVdvaEFDQUVJQUZCQVdvaUFVY05BQXNnQWlBRk5nSUFESTRDQ3lBQ1FRQTJBZ0FnQmtFQmFpRUJRUXdNVVF0Qm9BRWhBeUFCSUFSR0RZd0NJQUlvQWdBaUFDQUVJQUZyYWlFRklBRWdBR3RCQTJvaEJnSkFBMEFnQVMwQUFDQUFRYnpQQUdvdEFBQkhEVThnQUVFRFJnMEJJQUJCQVdvaEFDQUVJQUZCQVdvaUFVY05BQXNnQWlBRk5nSUFESTBDQ3lBQ1FRQTJBZ0FnQmtFQmFpRUJRUTBNVUFzZ0FTQUVSZ1JBUWFFQklRTU1qQUlMQWtBQ1FDQUJMUUFBUWNZQWF3NExBRTlQVDA5UFQwOVBUd0ZQQ3lBQlFRRnFJUUZCaXdFaEF3enpBUXNnQVVFQmFpRUJRWXdCSVFNTThnRUxJQUVnQkVZRVFFR2lBU0VERElzQ0N5QUJMUUFBUWRBQVJ3MU1JQUZCQVdvaEFReEdDeUFCSUFSR0JFQkJvd0VoQXd5S0Fnc0NRQUpBSUFFdEFBQkJ5UUJyRGdjQlRVMU5UVTBBVFFzZ0FVRUJhaUVCUVk0QklRTU04UUVMSUFGQkFXb2hBVUVpREUwTFFhUUJJUU1nQVNBRVJnMklBaUFDS0FJQUlnQWdCQ0FCYTJvaEJTQUJJQUJyUVFGcUlRWUNRQU5BSUFFdEFBQWdBRUhBendCcUxRQUFSdzFMSUFCQkFVWU5BU0FBUVFGcUlRQWdCQ0FCUVFGcUlnRkhEUUFMSUFJZ0JUWUNBQXlKQWdzZ0FrRUFOZ0lBSUFaQkFXb2hBVUVkREV3TElBRWdCRVlFUUVHbEFTRURESWdDQ3dKQUFrQWdBUzBBQUVIU0FHc09Bd0JMQVVzTElBRkJBV29oQVVHUUFTRURETzhCQ3lBQlFRRnFJUUZCQkF4TEN5QUJJQVJHQkVCQnBnRWhBd3lIQWdzQ1FBSkFBa0FDUUFKQUlBRXRBQUJCd1FCckRoVUFUVTFOVFUxTlRVMU5UUUZOVFFKTlRRTk5UUVJOQ3lBQlFRRnFJUUZCaUFFaEF3enhBUXNnQVVFQmFpRUJRWWtCSVFNTThBRUxJQUZCQVdvaEFVR0tBU0VERE84QkN5QUJRUUZxSVFGQmp3RWhBd3p1QVFzZ0FVRUJhaUVCUVpFQklRTU03UUVMUWFjQklRTWdBU0FFUmcyRkFpQUNLQUlBSWdBZ0JDQUJhMm9oQlNBQklBQnJRUUpxSVFZQ1FBTkFJQUV0QUFBZ0FFSHR6d0JxTFFBQVJ3MUlJQUJCQWtZTkFTQUFRUUZxSVFBZ0JDQUJRUUZxSWdGSERRQUxJQUlnQlRZQ0FBeUdBZ3NnQWtFQU5nSUFJQVpCQVdvaEFVRVJERWtMUWFnQklRTWdBU0FFUmcyRUFpQUNLQUlBSWdBZ0JDQUJhMm9oQlNBQklBQnJRUUpxSVFZQ1FBTkFJQUV0QUFBZ0FFSEN6d0JxTFFBQVJ3MUhJQUJCQWtZTkFTQUFRUUZxSVFBZ0JDQUJRUUZxSWdGSERRQUxJQUlnQlRZQ0FBeUZBZ3NnQWtFQU5nSUFJQVpCQVdvaEFVRXNERWdMUWFrQklRTWdBU0FFUmcyREFpQUNLQUlBSWdBZ0JDQUJhMm9oQlNBQklBQnJRUVJxSVFZQ1FBTkFJQUV0QUFBZ0FFSEZ6d0JxTFFBQVJ3MUdJQUJCQkVZTkFTQUFRUUZxSVFBZ0JDQUJRUUZxSWdGSERRQUxJQUlnQlRZQ0FBeUVBZ3NnQWtFQU5nSUFJQVpCQVdvaEFVRXJERWNMUWFvQklRTWdBU0FFUmcyQ0FpQUNLQUlBSWdBZ0JDQUJhMm9oQlNBQklBQnJRUUpxSVFZQ1FBTkFJQUV0QUFBZ0FFSEt6d0JxTFFBQVJ3MUZJQUJCQWtZTkFTQUFRUUZxSVFBZ0JDQUJRUUZxSWdGSERRQUxJQUlnQlRZQ0FBeURBZ3NnQWtFQU5nSUFJQVpCQVdvaEFVRVVERVlMSUFFZ0JFWUVRRUdyQVNFRERJSUNDd0pBQWtBQ1FBSkFJQUV0QUFCQndnQnJEZzhBQVFKSFIwZEhSMGRIUjBkSFJ3TkhDeUFCUVFGcUlRRkJrd0VoQXd6ckFRc2dBVUVCYWlFQlFaUUJJUU1NNmdFTElBRkJBV29oQVVHVkFTRURET2tCQ3lBQlFRRnFJUUZCbGdFaEF3em9BUXNnQVNBRVJnUkFRYXdCSVFNTWdRSUxJQUV0QUFCQnhRQkhEVUlnQVVFQmFpRUJERDBMUWEwQklRTWdBU0FFUmczL0FTQUNLQUlBSWdBZ0JDQUJhMm9oQlNBQklBQnJRUUpxSVFZQ1FBTkFJQUV0QUFBZ0FFSE56d0JxTFFBQVJ3MUNJQUJCQWtZTkFTQUFRUUZxSVFBZ0JDQUJRUUZxSWdGSERRQUxJQUlnQlRZQ0FBeUFBZ3NnQWtFQU5nSUFJQVpCQVdvaEFVRU9ERU1MSUFFZ0JFWUVRRUd1QVNFRERQOEJDeUFCTFFBQVFkQUFSdzFBSUFGQkFXb2hBVUVsREVJTFFhOEJJUU1nQVNBRVJnMzlBU0FDS0FJQUlnQWdCQ0FCYTJvaEJTQUJJQUJyUVFocUlRWUNRQU5BSUFFdEFBQWdBRUhRendCcUxRQUFSdzFBSUFCQkNFWU5BU0FBUVFGcUlRQWdCQ0FCUVFGcUlnRkhEUUFMSUFJZ0JUWUNBQXorQVFzZ0FrRUFOZ0lBSUFaQkFXb2hBVUVxREVFTElBRWdCRVlFUUVHd0FTRUREUDBCQ3dKQUFrQWdBUzBBQUVIVkFHc09Dd0JBUUVCQVFFQkFRRUFCUUFzZ0FVRUJhaUVCUVpvQklRTU01QUVMSUFGQkFXb2hBVUdiQVNFRERPTUJDeUFCSUFSR0JFQkJzUUVoQXd6OEFRc0NRQUpBSUFFdEFBQkJ3UUJyRGhRQVB6OC9QejgvUHo4L1B6OC9QejgvUHo4L0FUOExJQUZCQVdvaEFVR1pBU0VERE9NQkN5QUJRUUZxSVFGQm5BRWhBd3ppQVF0QnNnRWhBeUFCSUFSR0Rmb0JJQUlvQWdBaUFDQUVJQUZyYWlFRklBRWdBR3RCQTJvaEJnSkFBMEFnQVMwQUFDQUFRZG5QQUdvdEFBQkhEVDBnQUVFRFJnMEJJQUJCQVdvaEFDQUVJQUZCQVdvaUFVY05BQXNnQWlBRk5nSUFEUHNCQ3lBQ1FRQTJBZ0FnQmtFQmFpRUJRU0VNUGd0QnN3RWhBeUFCSUFSR0Rma0JJQUlvQWdBaUFDQUVJQUZyYWlFRklBRWdBR3RCQm1vaEJnSkFBMEFnQVMwQUFDQUFRZDNQQUdvdEFBQkhEVHdnQUVFR1JnMEJJQUJCQVdvaEFDQUVJQUZCQVdvaUFVY05BQXNnQWlBRk5nSUFEUG9CQ3lBQ1FRQTJBZ0FnQmtFQmFpRUJRUm9NUFFzZ0FTQUVSZ1JBUWJRQklRTU0rUUVMQWtBQ1FBSkFJQUV0QUFCQnhRQnJEaEVBUFQwOVBUMDlQVDA5QVQwOVBUMDlBajBMSUFGQkFXb2hBVUdkQVNFRERPRUJDeUFCUVFGcUlRRkJuZ0VoQXd6Z0FRc2dBVUVCYWlFQlFaOEJJUU1NM3dFTFFiVUJJUU1nQVNBRVJnMzNBU0FDS0FJQUlnQWdCQ0FCYTJvaEJTQUJJQUJyUVFWcUlRWUNRQU5BSUFFdEFBQWdBRUhrendCcUxRQUFSdzA2SUFCQkJVWU5BU0FBUVFGcUlRQWdCQ0FCUVFGcUlnRkhEUUFMSUFJZ0JUWUNBQXo0QVFzZ0FrRUFOZ0lBSUFaQkFXb2hBVUVvRERzTFFiWUJJUU1nQVNBRVJnMzJBU0FDS0FJQUlnQWdCQ0FCYTJvaEJTQUJJQUJyUVFKcUlRWUNRQU5BSUFFdEFBQWdBRUhxendCcUxRQUFSdzA1SUFCQkFrWU5BU0FBUVFGcUlRQWdCQ0FCUVFGcUlnRkhEUUFMSUFJZ0JUWUNBQXozQVFzZ0FrRUFOZ0lBSUFaQkFXb2hBVUVIRERvTElBRWdCRVlFUUVHM0FTRUREUFlCQ3dKQUFrQWdBUzBBQUVIRkFHc09EZ0E1T1RrNU9UazVPVGs1T1RrQk9Rc2dBVUVCYWlFQlFhRUJJUU1NM1FFTElBRkJBV29oQVVHaUFTRURETndCQzBHNEFTRURJQUVnQkVZTjlBRWdBaWdDQUNJQUlBUWdBV3RxSVFVZ0FTQUFhMEVDYWlFR0FrQURRQ0FCTFFBQUlBQkI3YzhBYWkwQUFFY05OeUFBUVFKR0RRRWdBRUVCYWlFQUlBUWdBVUVCYWlJQlJ3MEFDeUFDSUFVMkFnQU05UUVMSUFKQkFEWUNBQ0FHUVFGcUlRRkJFZ3c0QzBHNUFTRURJQUVnQkVZTjh3RWdBaWdDQUNJQUlBUWdBV3RxSVFVZ0FTQUFhMEVCYWlFR0FrQURRQ0FCTFFBQUlBQkI4TThBYWkwQUFFY05OaUFBUVFGR0RRRWdBRUVCYWlFQUlBUWdBVUVCYWlJQlJ3MEFDeUFDSUFVMkFnQU05QUVMSUFKQkFEWUNBQ0FHUVFGcUlRRkJJQXczQzBHNkFTRURJQUVnQkVZTjhnRWdBaWdDQUNJQUlBUWdBV3RxSVFVZ0FTQUFhMEVCYWlFR0FrQURRQ0FCTFFBQUlBQkI4czhBYWkwQUFFY05OU0FBUVFGR0RRRWdBRUVCYWlFQUlBUWdBVUVCYWlJQlJ3MEFDeUFDSUFVMkFnQU04d0VMSUFKQkFEWUNBQ0FHUVFGcUlRRkJEd3cyQ3lBQklBUkdCRUJCdXdFaEF3enlBUXNDUUFKQUlBRXRBQUJCeVFCckRnY0FOVFUxTlRVQk5Rc2dBVUVCYWlFQlFhVUJJUU1NMlFFTElBRkJBV29oQVVHbUFTRURETmdCQzBHOEFTRURJQUVnQkVZTjhBRWdBaWdDQUNJQUlBUWdBV3RxSVFVZ0FTQUFhMEVIYWlFR0FrQURRQ0FCTFFBQUlBQkI5TThBYWkwQUFFY05NeUFBUVFkR0RRRWdBRUVCYWlFQUlBUWdBVUVCYWlJQlJ3MEFDeUFDSUFVMkFnQU04UUVMSUFKQkFEWUNBQ0FHUVFGcUlRRkJHd3cwQ3lBQklBUkdCRUJCdlFFaEF3endBUXNDUUFKQUFrQWdBUzBBQUVIQ0FHc09FZ0EwTkRRME5EUTBORFFCTkRRME5EUTBBalFMSUFGQkFXb2hBVUdrQVNFREROZ0JDeUFCUVFGcUlRRkJwd0VoQXd6WEFRc2dBVUVCYWlFQlFhZ0JJUU1NMWdFTElBRWdCRVlFUUVHK0FTRURETzhCQ3lBQkxRQUFRYzRBUncwd0lBRkJBV29oQVF3c0N5QUJJQVJHQkVCQnZ3RWhBd3p1QVFzQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FCTFFBQVFjRUFhdzRWQUFFQ0F6OEVCUVkvUHo4SENBa0tDejhNRFE0UFB3c2dBVUVCYWlFQlFlZ0FJUU1NNHdFTElBRkJBV29oQVVIcEFDRURET0lCQ3lBQlFRRnFJUUZCN2dBaEF3emhBUXNnQVVFQmFpRUJRZklBSVFNTTRBRUxJQUZCQVdvaEFVSHpBQ0VERE44QkN5QUJRUUZxSVFGQjlnQWhBd3plQVFzZ0FVRUJhaUVCUWZjQUlRTU0zUUVMSUFGQkFXb2hBVUg2QUNFREROd0JDeUFCUVFGcUlRRkJnd0VoQXd6YkFRc2dBVUVCYWlFQlFZUUJJUU1NMmdFTElBRkJBV29oQVVHRkFTRURETmtCQ3lBQlFRRnFJUUZCa2dFaEF3ellBUXNnQVVFQmFpRUJRWmdCSVFNTTF3RUxJQUZCQVdvaEFVR2dBU0VERE5ZQkN5QUJRUUZxSVFGQm93RWhBd3pWQVFzZ0FVRUJhaUVCUWFvQklRTU0xQUVMSUFFZ0JFY0VRQ0FDUVJBMkFnZ2dBaUFCTmdJRVFhc0JJUU1NMUFFTFFjQUJJUU1NN0FFTFFRQWhBQUpBSUFJb0FqZ2lBMFVOQUNBREtBSTBJZ05GRFFBZ0FpQURFUUFBSVFBTElBQkZEVjRnQUVFVlJ3MEhJQUpCMFFBMkFod2dBaUFCTmdJVUlBSkJzQmMyQWhBZ0FrRVZOZ0lNUVFBaEF3enJBUXNnQVVFQmFpQUJJQVJIRFFnYVFjSUJJUU1NNmdFTEEwQUNRQ0FCTFFBQVFRcHJEZ1FJQUFBTEFBc2dCQ0FCUVFGcUlnRkhEUUFMUWNNQklRTU02UUVMSUFFZ0JFY0VRQ0FDUVJFMkFnZ2dBaUFCTmdJRVFRRWhBd3pRQVF0QnhBRWhBd3pvQVFzZ0FTQUVSZ1JBUWNVQklRTU02QUVMQWtBQ1FDQUJMUUFBUVFwckRnUUJLQ2dBS0FzZ0FVRUJhZ3dKQ3lBQlFRRnFEQVVMSUFFZ0JFWUVRRUhHQVNFRERPY0JDd0pBQWtBZ0FTMEFBRUVLYXc0WEFRc0xBUXNMQ3dzTEN3c0xDd3NMQ3dzTEN3c0xDd0FMQ3lBQlFRRnFJUUVMUWJBQklRTU16UUVMSUFFZ0JFWUVRRUhJQVNFRERPWUJDeUFCTFFBQVFTQkhEUWtnQWtFQU93RXlJQUZCQVdvaEFVR3pBU0VERE13QkN3TkFJQUVoQUFKQUlBRWdCRWNFUUNBQkxRQUFRVEJyUWY4QmNTSURRUXBKRFFFTUp3dEJ4d0VoQXd6bUFRc0NRQ0FDTHdFeUlnRkJtVE5MRFFBZ0FpQUJRUXBzSWdVN0FUSWdCVUgrL3dOeElBTkIvLzhEYzBzTkFDQUFRUUZxSVFFZ0FpQURJQVZxSWdNN0FUSWdBMEgvL3dOeFFlZ0hTUTBCQ3d0QkFDRURJQUpCQURZQ0hDQUNRY0VKTmdJUUlBSkJEVFlDRENBQ0lBQkJBV28yQWhRTTVBRUxJQUpCQURZQ0hDQUNJQUUyQWhRZ0FrSHdERFlDRUNBQ1FSczJBZ3hCQUNFRERPTUJDeUFDS0FJRUlRQWdBa0VBTmdJRUlBSWdBQ0FCRUNZaUFBMEJJQUZCQVdvTElRRkJyUUVoQXd6SUFRc2dBa0hCQVRZQ0hDQUNJQUEyQWd3Z0FpQUJRUUZxTmdJVVFRQWhBd3pnQVFzZ0FpZ0NCQ0VBSUFKQkFEWUNCQ0FDSUFBZ0FSQW1JZ0FOQVNBQlFRRnFDeUVCUWE0QklRTU14UUVMSUFKQndnRTJBaHdnQWlBQU5nSU1JQUlnQVVFQmFqWUNGRUVBSVFNTTNRRUxJQUpCQURZQ0hDQUNJQUUyQWhRZ0FrR1hDellDRUNBQ1FRMDJBZ3hCQUNFREROd0JDeUFDUVFBMkFod2dBaUFCTmdJVUlBSkI0eEEyQWhBZ0FrRUpOZ0lNUVFBaEF3emJBUXNnQWtFQ09nQW9ES3dCQzBFQUlRTWdBa0VBTmdJY0lBSkJyd3MyQWhBZ0FrRUNOZ0lNSUFJZ0FVRUJhallDRkF6WkFRdEJBaUVEREw4QkMwRU5JUU1NdmdFTFFTWWhBd3k5QVF0QkZTRURETHdCQzBFV0lRTU11d0VMUVJnaEF3eTZBUXRCSENFRERMa0JDMEVkSVFNTXVBRUxRU0FoQXd5M0FRdEJJU0VERExZQkMwRWpJUU1NdFFFTFFjWUFJUU1NdEFFTFFTNGhBd3l6QVF0QlBTRURETElCQzBITEFDRURETEVCQzBIT0FDRURETEFCQzBIWUFDRURESzhCQzBIWkFDRURESzRCQzBIYkFDRURESzBCQzBIeEFDRURES3dCQzBIMEFDRURES3NCQzBHTkFTRURES29CQzBHWEFTRURES2tCQzBHcEFTRURES2dCQzBHdkFTRURES2NCQzBHeEFTRURES1lCQ3lBQ1FRQTJBZ0FMUVFBaEF5QUNRUUEyQWh3Z0FpQUJOZ0lVSUFKQjhSczJBaEFnQWtFR05nSU1ETDBCQ3lBQ1FRQTJBZ0FnQmtFQmFpRUJRU1FMT2dBcElBSW9BZ1FoQUNBQ1FRQTJBZ1FnQWlBQUlBRVFKeUlBUlFSQVFlVUFJUU1Nb3dFTElBSkIrUUEyQWh3Z0FpQUJOZ0lVSUFJZ0FEWUNERUVBSVFNTXV3RUxJQUJCRlVjRVFDQUNRUUEyQWh3Z0FpQUJOZ0lVSUFKQnpBNDJBaEFnQWtFZ05nSU1RUUFoQXd5N0FRc2dBa0g0QURZQ0hDQUNJQUUyQWhRZ0FrSEtHRFlDRUNBQ1FSVTJBZ3hCQUNFRERMb0JDeUFDUVFBMkFod2dBaUFCTmdJVUlBSkJqaHMyQWhBZ0FrRUdOZ0lNUVFBaEF3eTVBUXNnQWtFQU5nSWNJQUlnQVRZQ0ZDQUNRZjRSTmdJUUlBSkJCellDREVFQUlRTU11QUVMSUFKQkFEWUNIQ0FDSUFFMkFoUWdBa0dNSERZQ0VDQUNRUWMyQWd4QkFDRURETGNCQ3lBQ1FRQTJBaHdnQWlBQk5nSVVJQUpCd3c4MkFoQWdBa0VITmdJTVFRQWhBd3kyQVFzZ0FrRUFOZ0ljSUFJZ0FUWUNGQ0FDUWNNUE5nSVFJQUpCQnpZQ0RFRUFJUU1NdFFFTElBSW9BZ1FoQUNBQ1FRQTJBZ1FnQWlBQUlBRVFKU0lBUlEwUklBSkI1UUEyQWh3Z0FpQUJOZ0lVSUFJZ0FEWUNERUVBSVFNTXRBRUxJQUlvQWdRaEFDQUNRUUEyQWdRZ0FpQUFJQUVRSlNJQVJRMGdJQUpCMHdBMkFod2dBaUFCTmdJVUlBSWdBRFlDREVFQUlRTU1zd0VMSUFJb0FnUWhBQ0FDUVFBMkFnUWdBaUFBSUFFUUpTSUFSUTBpSUFKQjBnQTJBaHdnQWlBQk5nSVVJQUlnQURZQ0RFRUFJUU1Nc2dFTElBSW9BZ1FoQUNBQ1FRQTJBZ1FnQWlBQUlBRVFKU0lBUlEwT0lBSkI1UUEyQWh3Z0FpQUJOZ0lVSUFJZ0FEWUNERUVBSVFNTXNRRUxJQUlvQWdRaEFDQUNRUUEyQWdRZ0FpQUFJQUVRSlNJQVJRMGRJQUpCMHdBMkFod2dBaUFCTmdJVUlBSWdBRFlDREVFQUlRTU1zQUVMSUFJb0FnUWhBQ0FDUVFBMkFnUWdBaUFBSUFFUUpTSUFSUTBmSUFKQjBnQTJBaHdnQWlBQk5nSVVJQUlnQURZQ0RFRUFJUU1NcndFTElBQkJQMGNOQVNBQlFRRnFDeUVCUVFVaEF3eVVBUXRCQUNFRElBSkJBRFlDSENBQ0lBRTJBaFFnQWtIOUVqWUNFQ0FDUVFjMkFnd01yQUVMSUFKQkFEWUNIQ0FDSUFFMkFoUWdBa0hjQ0RZQ0VDQUNRUWMyQWd4QkFDRURES3NCQ3lBQ0tBSUVJUUFnQWtFQU5nSUVJQUlnQUNBQkVDVWlBRVVOQnlBQ1FlVUFOZ0ljSUFJZ0FUWUNGQ0FDSUFBMkFneEJBQ0VEREtvQkN5QUNLQUlFSVFBZ0FrRUFOZ0lFSUFJZ0FDQUJFQ1VpQUVVTkZpQUNRZE1BTmdJY0lBSWdBVFlDRkNBQ0lBQTJBZ3hCQUNFRERLa0JDeUFDS0FJRUlRQWdBa0VBTmdJRUlBSWdBQ0FCRUNVaUFFVU5HQ0FDUWRJQU5nSWNJQUlnQVRZQ0ZDQUNJQUEyQWd4QkFDRURES2dCQ3lBQ1FRQTJBaHdnQWlBQk5nSVVJQUpCeGdvMkFoQWdBa0VITmdJTVFRQWhBd3luQVFzZ0FpZ0NCQ0VBSUFKQkFEWUNCQ0FDSUFBZ0FSQWxJZ0JGRFFNZ0FrSGxBRFlDSENBQ0lBRTJBaFFnQWlBQU5nSU1RUUFoQXd5bUFRc2dBaWdDQkNFQUlBSkJBRFlDQkNBQ0lBQWdBUkFsSWdCRkRSSWdBa0hUQURZQ0hDQUNJQUUyQWhRZ0FpQUFOZ0lNUVFBaEF3eWxBUXNnQWlnQ0JDRUFJQUpCQURZQ0JDQUNJQUFnQVJBbElnQkZEUlFnQWtIU0FEWUNIQ0FDSUFFMkFoUWdBaUFBTmdJTVFRQWhBd3lrQVFzZ0FpZ0NCQ0VBSUFKQkFEWUNCQ0FDSUFBZ0FSQWxJZ0JGRFFBZ0FrSGxBRFlDSENBQ0lBRTJBaFFnQWlBQU5nSU1RUUFoQXd5akFRdEIxUUFoQXd5SkFRc2dBRUVWUndSQUlBSkJBRFlDSENBQ0lBRTJBaFFnQWtHNURUWUNFQ0FDUVJvMkFneEJBQ0VEREtJQkN5QUNRZVFBTmdJY0lBSWdBVFlDRkNBQ1FlTVhOZ0lRSUFKQkZUWUNERUVBSVFNTW9RRUxJQUpCQURZQ0FDQUdRUUZxSVFFZ0FpMEFLU0lBUVNOclFRdEpEUVFDUUNBQVFRWkxEUUJCQVNBQWRFSEtBSEZGRFFBTUJRdEJBQ0VESUFKQkFEWUNIQ0FDSUFFMkFoUWdBa0gzQ1RZQ0VDQUNRUWcyQWd3TW9BRUxJQUpCQURZQ0FDQUdRUUZxSVFFZ0FpMEFLVUVoUmcwRElBSkJBRFlDSENBQ0lBRTJBaFFnQWtHYkNqWUNFQ0FDUVFnMkFneEJBQ0VEREo4QkN5QUNRUUEyQWdBTFFRQWhBeUFDUVFBMkFod2dBaUFCTmdJVUlBSkJrRE0yQWhBZ0FrRUlOZ0lNREowQkN5QUNRUUEyQWdBZ0JrRUJhaUVCSUFJdEFDbEJJMGtOQUNBQ1FRQTJBaHdnQWlBQk5nSVVJQUpCMHdrMkFoQWdBa0VJTmdJTVFRQWhBd3ljQVF0QjBRQWhBd3lDQVFzZ0FTMEFBRUV3YXlJQVFmOEJjVUVLU1FSQUlBSWdBRG9BS2lBQlFRRnFJUUZCendBaEF3eUNBUXNnQWlnQ0JDRUFJQUpCQURZQ0JDQUNJQUFnQVJBb0lnQkZEWVlCSUFKQjNnQTJBaHdnQWlBQk5nSVVJQUlnQURZQ0RFRUFJUU1NbWdFTElBSW9BZ1FoQUNBQ1FRQTJBZ1FnQWlBQUlBRVFLQ0lBUlEyR0FTQUNRZHdBTmdJY0lBSWdBVFlDRkNBQ0lBQTJBZ3hCQUNFRERKa0JDeUFDS0FJRUlRQWdBa0VBTmdJRUlBSWdBQ0FGRUNnaUFFVUVRQ0FGSVFFTWh3RUxJQUpCMmdBMkFod2dBaUFGTmdJVUlBSWdBRFlDREF5WUFRdEJBQ0VCUVFFaEF3c2dBaUFET2dBcklBVkJBV29oQXdKQUFrQUNRQ0FDTFFBdFFSQnhEUUFDUUFKQUFrQWdBaTBBS2c0REFRQUNCQXNnQmtVTkF3d0NDeUFBRFFFTUFnc2dBVVVOQVFzZ0FpZ0NCQ0VBSUFKQkFEWUNCQ0FDSUFBZ0F4QW9JZ0JGQkVBZ0F5RUJEQUlMSUFKQjJBQTJBaHdnQWlBRE5nSVVJQUlnQURZQ0RFRUFJUU1NbUFFTElBSW9BZ1FoQUNBQ1FRQTJBZ1FnQWlBQUlBTVFLQ0lBUlFSQUlBTWhBUXlIQVFzZ0FrSFpBRFlDSENBQ0lBTTJBaFFnQWlBQU5nSU1RUUFoQXd5WEFRdEJ6QUFoQXd4OUN5QUFRUlZIQkVBZ0FrRUFOZ0ljSUFJZ0FUWUNGQ0FDUVpRTk5nSVFJQUpCSVRZQ0RFRUFJUU1NbGdFTElBSkIxd0EyQWh3Z0FpQUJOZ0lVSUFKQnlSYzJBaEFnQWtFVk5nSU1RUUFoQXd5VkFRdEJBQ0VESUFKQkFEWUNIQ0FDSUFFMkFoUWdBa0dBRVRZQ0VDQUNRUWsyQWd3TWxBRUxJQUlvQWdRaEFDQUNRUUEyQWdRZ0FpQUFJQUVRSlNJQVJRMEFJQUpCMHdBMkFod2dBaUFCTmdJVUlBSWdBRFlDREVFQUlRTU1rd0VMUWNrQUlRTU1lUXNnQWtFQU5nSWNJQUlnQVRZQ0ZDQUNRY0VvTmdJUUlBSkJCellDRENBQ1FRQTJBZ0JCQUNFRERKRUJDeUFDS0FJRUlRQkJBQ0VESUFKQkFEWUNCQ0FDSUFBZ0FSQWxJZ0JGRFFBZ0FrSFNBRFlDSENBQ0lBRTJBaFFnQWlBQU5nSU1ESkFCQzBISUFDRURESFlMSUFKQkFEWUNBQ0FGSVFFTElBSkJnQkk3QVNvZ0FVRUJhaUVCUVFBaEFBSkFJQUlvQWpnaUEwVU5BQ0FES0FJd0lnTkZEUUFnQWlBREVRQUFJUUFMSUFBTkFRdEJ4d0FoQXd4ekN5QUFRUlZHQkVBZ0FrSFJBRFlDSENBQ0lBRTJBaFFnQWtIakZ6WUNFQ0FDUVJVMkFneEJBQ0VEREl3QkMwRUFJUU1nQWtFQU5nSWNJQUlnQVRZQ0ZDQUNRYmtOTmdJUUlBSkJHallDREF5TEFRdEJBQ0VESUFKQkFEWUNIQ0FDSUFFMkFoUWdBa0dnR1RZQ0VDQUNRUjQyQWd3TWlnRUxJQUV0QUFCQk9rWUVRQ0FDS0FJRUlRQkJBQ0VESUFKQkFEWUNCQ0FDSUFBZ0FSQXBJZ0JGRFFFZ0FrSERBRFlDSENBQ0lBQTJBZ3dnQWlBQlFRRnFOZ0lVRElvQkMwRUFJUU1nQWtFQU5nSWNJQUlnQVRZQ0ZDQUNRYkVSTmdJUUlBSkJDallDREF5SkFRc2dBVUVCYWlFQlFUc2hBd3h2Q3lBQ1FjTUFOZ0ljSUFJZ0FEWUNEQ0FDSUFGQkFXbzJBaFFNaHdFTFFRQWhBeUFDUVFBMkFod2dBaUFCTmdJVUlBSkI4QTQyQWhBZ0FrRWNOZ0lNRElZQkN5QUNJQUl2QVRCQkVISTdBVEFNWmdzQ1FDQUNMd0V3SWdCQkNIRkZEUUFnQWkwQUtFRUJSdzBBSUFJdEFDMUJDSEZGRFFNTElBSWdBRUgzK3dOeFFZQUVjanNCTUF3RUN5QUJJQVJIQkVBQ1FBTkFJQUV0QUFCQk1Hc2lBRUgvQVhGQkNrOEVRRUUxSVFNTWJnc2dBaWtESUNJS1FwbXo1c3lacytiTUdWWU5BU0FDSUFwQ0NuNGlDamNESUNBS0lBQ3RRdjhCZ3lJTFFuK0ZWZzBCSUFJZ0NpQUxmRGNESUNBRUlBRkJBV29pQVVjTkFBdEJPU0VERElVQkN5QUNLQUlFSVFCQkFDRURJQUpCQURZQ0JDQUNJQUFnQVVFQmFpSUJFQ29pQUEwTURIY0xRVGtoQXd5REFRc2dBaTBBTUVFZ2NRMEdRY1VCSVFNTWFRdEJBQ0VESUFKQkFEWUNCQ0FDSUFFZ0FSQXFJZ0JGRFFRZ0FrRTZOZ0ljSUFJZ0FEWUNEQ0FDSUFGQkFXbzJBaFFNZ1FFTElBSXRBQ2hCQVVjTkFDQUNMUUF0UVFoeFJRMEJDMEUzSVFNTVpnc2dBaWdDQkNFQVFRQWhBeUFDUVFBMkFnUWdBaUFBSUFFUUtpSUFCRUFnQWtFN05nSWNJQUlnQURZQ0RDQUNJQUZCQVdvMkFoUU1md3NnQVVFQmFpRUJERzRMSUFKQkNEb0FMQXdFQ3lBQlFRRnFJUUVNYlF0QkFDRURJQUpCQURZQ0hDQUNJQUUyQWhRZ0FrSGtFallDRUNBQ1FRUTJBZ3dNZXdzZ0FpZ0NCQ0VBUVFBaEF5QUNRUUEyQWdRZ0FpQUFJQUVRS2lJQVJRMXNJQUpCTnpZQ0hDQUNJQUUyQWhRZ0FpQUFOZ0lNREhvTElBSWdBaThCTUVFZ2Nqc0JNQXRCTUNFRERGOExJQUpCTmpZQ0hDQUNJQUUyQWhRZ0FpQUFOZ0lNREhjTElBQkJMRWNOQVNBQlFRRnFJUUJCQVNFQkFrQUNRQUpBQWtBQ1FDQUNMUUFzUVFWckRnUURBUUlFQUFzZ0FDRUJEQVFMUVFJaEFRd0JDMEVFSVFFTElBSkJBVG9BTENBQ0lBSXZBVEFnQVhJN0FUQWdBQ0VCREFFTElBSWdBaThCTUVFSWNqc0JNQ0FBSVFFTFFUa2hBd3hjQ3lBQ1FRQTZBQ3dMUVRRaEF3eGFDeUFCSUFSR0JFQkJMU0VEREhNTEFrQUNRQU5BQWtBZ0FTMEFBRUVLYXc0RUFnQUFBd0FMSUFRZ0FVRUJhaUlCUncwQUMwRXRJUU1NZEFzZ0FpZ0NCQ0VBUVFBaEF5QUNRUUEyQWdRZ0FpQUFJQUVRS2lJQVJRMENJQUpCTERZQ0hDQUNJQUUyQWhRZ0FpQUFOZ0lNREhNTElBSW9BZ1FoQUVFQUlRTWdBa0VBTmdJRUlBSWdBQ0FCRUNvaUFFVUVRQ0FCUVFGcUlRRU1BZ3NnQWtFc05nSWNJQUlnQURZQ0RDQUNJQUZCQVdvMkFoUU1jZ3NnQVMwQUFFRU5SZ1JBSUFJb0FnUWhBRUVBSVFNZ0FrRUFOZ0lFSUFJZ0FDQUJFQ29pQUVVRVFDQUJRUUZxSVFFTUFnc2dBa0VzTmdJY0lBSWdBRFlDRENBQ0lBRkJBV28yQWhRTWNnc2dBaTBBTFVFQmNRUkFRY1FCSVFNTVdRc2dBaWdDQkNFQVFRQWhBeUFDUVFBMkFnUWdBaUFBSUFFUUtpSUFEUUVNWlF0Qkx5RURERmNMSUFKQkxqWUNIQ0FDSUFFMkFoUWdBaUFBTmdJTURHOExRUUFoQXlBQ1FRQTJBaHdnQWlBQk5nSVVJQUpCOEJRMkFoQWdBa0VETmdJTURHNExRUUVoQXdKQUFrQUNRQUpBSUFJdEFDeEJCV3NPQkFNQkFnQUVDeUFDSUFJdkFUQkJDSEk3QVRBTUF3dEJBaUVEREFFTFFRUWhBd3NnQWtFQk9nQXNJQUlnQWk4Qk1DQURjanNCTUF0QktpRURERk1MUVFBaEF5QUNRUUEyQWh3Z0FpQUJOZ0lVSUFKQjRRODJBaEFnQWtFS05nSU1ER3NMUVFFaEF3SkFBa0FDUUFKQUFrQUNRQ0FDTFFBc1FRSnJEZ2NGQkFRREFRSUFCQXNnQWlBQ0x3RXdRUWh5T3dFd0RBTUxRUUloQXd3QkMwRUVJUU1MSUFKQkFUb0FMQ0FDSUFJdkFUQWdBM0k3QVRBTFFTc2hBd3hTQzBFQUlRTWdBa0VBTmdJY0lBSWdBVFlDRkNBQ1Fhc1NOZ0lRSUFKQkN6WUNEQXhxQzBFQUlRTWdBa0VBTmdJY0lBSWdBVFlDRkNBQ1FmME5OZ0lRSUFKQkhUWUNEQXhwQ3lBQklBUkhCRUFEUUNBQkxRQUFRU0JIRFVnZ0JDQUJRUUZxSWdGSERRQUxRU1VoQXd4cEMwRWxJUU1NYUFzZ0FpMEFMVUVCY1FSQVFjTUJJUU1NVHdzZ0FpZ0NCQ0VBUVFBaEF5QUNRUUEyQWdRZ0FpQUFJQUVRS1NJQUJFQWdBa0VtTmdJY0lBSWdBRFlDRENBQ0lBRkJBV28yQWhRTWFBc2dBVUVCYWlFQkRGd0xJQUZCQVdvaEFTQUNMd0V3SWdCQmdBRnhCRUJCQUNFQUFrQWdBaWdDT0NJRFJRMEFJQU1vQWxRaUEwVU5BQ0FDSUFNUkFBQWhBQXNnQUVVTkJpQUFRUlZIRFI4Z0FrRUZOZ0ljSUFJZ0FUWUNGQ0FDUWZrWE5nSVFJQUpCRlRZQ0RFRUFJUU1NWndzQ1FDQUFRYUFFY1VHZ0JFY05BQ0FDTFFBdFFRSnhEUUJCQUNFRElBSkJBRFlDSENBQ0lBRTJBaFFnQWtHV0V6WUNFQ0FDUVFRMkFnd01ad3NnQWdKL0lBSXZBVEJCRkhGQkZFWUVRRUVCSUFJdEFDaEJBVVlOQVJvZ0FpOEJNa0hsQUVZTUFRc2dBaTBBS1VFRlJnczZBQzVCQUNFQUFrQWdBaWdDT0NJRFJRMEFJQU1vQWlRaUEwVU5BQ0FDSUFNUkFBQWhBQXNDUUFKQUFrQUNRQUpBSUFBT0ZnSUJBQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQU1FQ3lBQ1FRRTZBQzRMSUFJZ0FpOEJNRUhBQUhJN0FUQUxRU2NoQXd4UEN5QUNRU00yQWh3Z0FpQUJOZ0lVSUFKQnBSWTJBaEFnQWtFVk5nSU1RUUFoQXd4bkMwRUFJUU1nQWtFQU5nSWNJQUlnQVRZQ0ZDQUNRZFVMTmdJUUlBSkJFVFlDREF4bUMwRUFJUUFDUUNBQ0tBSTRJZ05GRFFBZ0F5Z0NMQ0lEUlEwQUlBSWdBeEVBQUNFQUN5QUFEUUVMUVE0aEF3eExDeUFBUVJWR0JFQWdBa0VDTmdJY0lBSWdBVFlDRkNBQ1FiQVlOZ0lRSUFKQkZUWUNERUVBSVFNTVpBdEJBQ0VESUFKQkFEWUNIQ0FDSUFFMkFoUWdBa0duRGpZQ0VDQUNRUkkyQWd3TVl3dEJBQ0VESUFKQkFEWUNIQ0FDSUFFMkFoUWdBa0dxSERZQ0VDQUNRUTgyQWd3TVlnc2dBaWdDQkNFQVFRQWhBeUFDUVFBMkFnUWdBaUFBSUFFZ0NxZHFJZ0VRS3lJQVJRMEFJQUpCQlRZQ0hDQUNJQUUyQWhRZ0FpQUFOZ0lNREdFTFFROGhBd3hIQzBFQUlRTWdBa0VBTmdJY0lBSWdBVFlDRkNBQ1FjMFROZ0lRSUFKQkREWUNEQXhmQzBJQklRb0xJQUZCQVdvaEFRSkFJQUlwQXlBaUMwTC8vLy8vLy8vLy93OVlCRUFnQWlBTFFnU0dJQXFFTndNZ0RBRUxRUUFoQXlBQ1FRQTJBaHdnQWlBQk5nSVVJQUpCclFrMkFoQWdBa0VNTmdJTURGNExRU1FoQXd4RUMwRUFJUU1nQWtFQU5nSWNJQUlnQVRZQ0ZDQUNRYzBUTmdJUUlBSkJERFlDREF4Y0N5QUNLQUlFSVFCQkFDRURJQUpCQURZQ0JDQUNJQUFnQVJBc0lnQkZCRUFnQVVFQmFpRUJERklMSUFKQkZ6WUNIQ0FDSUFBMkFnd2dBaUFCUVFGcU5nSVVERnNMSUFJb0FnUWhBRUVBSVFNZ0FrRUFOZ0lFQWtBZ0FpQUFJQUVRTENJQVJRUkFJQUZCQVdvaEFRd0JDeUFDUVJZMkFod2dBaUFBTmdJTUlBSWdBVUVCYWpZQ0ZBeGJDMEVmSVFNTVFRdEJBQ0VESUFKQkFEWUNIQ0FDSUFFMkFoUWdBa0dhRHpZQ0VDQUNRU0kyQWd3TVdRc2dBaWdDQkNFQVFRQWhBeUFDUVFBMkFnUWdBaUFBSUFFUUxTSUFSUVJBSUFGQkFXb2hBUXhRQ3lBQ1FSUTJBaHdnQWlBQU5nSU1JQUlnQVVFQmFqWUNGQXhZQ3lBQ0tBSUVJUUJCQUNFRElBSkJBRFlDQkFKQUlBSWdBQ0FCRUMwaUFFVUVRQ0FCUVFGcUlRRU1BUXNnQWtFVE5nSWNJQUlnQURZQ0RDQUNJQUZCQVdvMkFoUU1XQXRCSGlFRERENExRUUFoQXlBQ1FRQTJBaHdnQWlBQk5nSVVJQUpCeGd3MkFoQWdBa0VqTmdJTURGWUxJQUlvQWdRaEFFRUFJUU1nQWtFQU5nSUVJQUlnQUNBQkVDMGlBRVVFUUNBQlFRRnFJUUVNVGdzZ0FrRVJOZ0ljSUFJZ0FEWUNEQ0FDSUFGQkFXbzJBaFFNVlFzZ0FrRVFOZ0ljSUFJZ0FUWUNGQ0FDSUFBMkFnd01WQXRCQUNFRElBSkJBRFlDSENBQ0lBRTJBaFFnQWtIR0REWUNFQ0FDUVNNMkFnd01Vd3RCQUNFRElBSkJBRFlDSENBQ0lBRTJBaFFnQWtIQUZUWUNFQ0FDUVFJMkFnd01VZ3NnQWlnQ0JDRUFRUUFoQXlBQ1FRQTJBZ1FDUUNBQ0lBQWdBUkF0SWdCRkJFQWdBVUVCYWlFQkRBRUxJQUpCRGpZQ0hDQUNJQUEyQWd3Z0FpQUJRUUZxTmdJVURGSUxRUnNoQXd3NEMwRUFJUU1nQWtFQU5nSWNJQUlnQVRZQ0ZDQUNRY1lNTmdJUUlBSkJJellDREF4UUN5QUNLQUlFSVFCQkFDRURJQUpCQURZQ0JBSkFJQUlnQUNBQkVDd2lBRVVFUUNBQlFRRnFJUUVNQVFzZ0FrRU5OZ0ljSUFJZ0FEWUNEQ0FDSUFGQkFXbzJBaFFNVUF0QkdpRURERFlMUVFBaEF5QUNRUUEyQWh3Z0FpQUJOZ0lVSUFKQm1nODJBaEFnQWtFaU5nSU1ERTRMSUFJb0FnUWhBRUVBSVFNZ0FrRUFOZ0lFQWtBZ0FpQUFJQUVRTENJQVJRUkFJQUZCQVdvaEFRd0JDeUFDUVF3MkFod2dBaUFBTmdJTUlBSWdBVUVCYWpZQ0ZBeE9DMEVaSVFNTU5BdEJBQ0VESUFKQkFEWUNIQ0FDSUFFMkFoUWdBa0dhRHpZQ0VDQUNRU0kyQWd3TVRBc2dBRUVWUndSQVFRQWhBeUFDUVFBMkFod2dBaUFCTmdJVUlBSkJnd3cyQWhBZ0FrRVROZ0lNREV3TElBSkJDallDSENBQ0lBRTJBaFFnQWtIa0ZqWUNFQ0FDUVJVMkFneEJBQ0VEREVzTElBSW9BZ1FoQUVFQUlRTWdBa0VBTmdJRUlBSWdBQ0FCSUFxbmFpSUJFQ3NpQUFSQUlBSkJCellDSENBQ0lBRTJBaFFnQWlBQU5nSU1ERXNMUVJNaEF3d3hDeUFBUVJWSEJFQkJBQ0VESUFKQkFEWUNIQ0FDSUFFMkFoUWdBa0hhRFRZQ0VDQUNRUlEyQWd3TVNnc2dBa0VlTmdJY0lBSWdBVFlDRkNBQ1Fma1hOZ0lRSUFKQkZUWUNERUVBSVFNTVNRdEJBQ0VBQWtBZ0FpZ0NPQ0lEUlEwQUlBTW9BaXdpQTBVTkFDQUNJQU1SQUFBaEFBc2dBRVVOUVNBQVFSVkdCRUFnQWtFRE5nSWNJQUlnQVRZQ0ZDQUNRYkFZTmdJUUlBSkJGVFlDREVFQUlRTU1TUXRCQUNFRElBSkJBRFlDSENBQ0lBRTJBaFFnQWtHbkRqWUNFQ0FDUVJJMkFnd01TQXRCQUNFRElBSkJBRFlDSENBQ0lBRTJBaFFnQWtIYURUWUNFQ0FDUVJRMkFnd01Sd3RCQUNFRElBSkJBRFlDSENBQ0lBRTJBaFFnQWtHbkRqWUNFQ0FDUVJJMkFnd01SZ3NnQWtFQU9nQXZJQUl0QUMxQkJIRkZEVDhMSUFKQkFEb0FMeUFDUVFFNkFEUkJBQ0VERENzTFFRQWhBeUFDUVFBMkFod2dBa0hrRVRZQ0VDQUNRUWMyQWd3Z0FpQUJRUUZxTmdJVURFTUxBa0FEUUFKQUlBRXRBQUJCQ21zT0JBQUNBZ0FDQ3lBRUlBRkJBV29pQVVjTkFBdEIzUUVoQXd4REN3SkFBa0FnQWkwQU5FRUJSdzBBUVFBaEFBSkFJQUlvQWpnaUEwVU5BQ0FES0FKWUlnTkZEUUFnQWlBREVRQUFJUUFMSUFCRkRRQWdBRUVWUncwQklBSkIzQUUyQWh3Z0FpQUJOZ0lVSUFKQjFSWTJBaEFnQWtFVk5nSU1RUUFoQXd4RUMwSEJBU0VERENvTElBSkJBRFlDSENBQ0lBRTJBaFFnQWtIcEN6WUNFQ0FDUVI4MkFneEJBQ0VEREVJTEFrQUNRQ0FDTFFBb1FRRnJEZ0lFQVFBTFFjQUJJUU1NS1F0QnVRRWhBd3dvQ3lBQ1FRSTZBQzlCQUNFQUFrQWdBaWdDT0NJRFJRMEFJQU1vQWdBaUEwVU5BQ0FDSUFNUkFBQWhBQXNnQUVVRVFFSENBU0VERENnTElBQkJGVWNFUUNBQ1FRQTJBaHdnQWlBQk5nSVVJQUpCcEF3MkFoQWdBa0VRTmdJTVFRQWhBd3hCQ3lBQ1Fkc0JOZ0ljSUFJZ0FUWUNGQ0FDUWZvV05nSVFJQUpCRlRZQ0RFRUFJUU1NUUFzZ0FTQUVSZ1JBUWRvQklRTU1RQXNnQVMwQUFFSElBRVlOQVNBQ1FRRTZBQ2dMUWF3QklRTU1KUXRCdndFaEF3d2tDeUFCSUFSSEJFQWdBa0VRTmdJSUlBSWdBVFlDQkVHK0FTRUREQ1FMUWRrQklRTU1QQXNnQVNBRVJnUkFRZGdCSVFNTVBBc2dBUzBBQUVISUFFY05CQ0FCUVFGcUlRRkJ2UUVoQXd3aUN5QUJJQVJHQkVCQjF3RWhBd3c3Q3dKQUFrQWdBUzBBQUVIRkFHc09FQUFGQlFVRkJRVUZCUVVGQlFVRkJRRUZDeUFCUVFGcUlRRkJ1d0VoQXd3aUN5QUJRUUZxSVFGQnZBRWhBd3doQzBIV0FTRURJQUVnQkVZTk9TQUNLQUlBSWdBZ0JDQUJhMm9oQlNBQklBQnJRUUpxSVFZQ1FBTkFJQUV0QUFBZ0FFR0QwQUJxTFFBQVJ3MERJQUJCQWtZTkFTQUFRUUZxSVFBZ0JDQUJRUUZxSWdGSERRQUxJQUlnQlRZQ0FBdzZDeUFDS0FJRUlRQWdBa0lBTndNQUlBSWdBQ0FHUVFGcUlnRVFKeUlBUlFSQVFjWUJJUU1NSVFzZ0FrSFZBVFlDSENBQ0lBRTJBaFFnQWlBQU5nSU1RUUFoQXd3NUMwSFVBU0VESUFFZ0JFWU5PQ0FDS0FJQUlnQWdCQ0FCYTJvaEJTQUJJQUJyUVFGcUlRWUNRQU5BSUFFdEFBQWdBRUdCMEFCcUxRQUFSdzBDSUFCQkFVWU5BU0FBUVFGcUlRQWdCQ0FCUVFGcUlnRkhEUUFMSUFJZ0JUWUNBQXc1Q3lBQ1FZRUVPd0VvSUFJb0FnUWhBQ0FDUWdBM0F3QWdBaUFBSUFaQkFXb2lBUkFuSWdBTkF3d0NDeUFDUVFBMkFnQUxRUUFoQXlBQ1FRQTJBaHdnQWlBQk5nSVVJQUpCMkJzMkFoQWdBa0VJTmdJTUREWUxRYm9CSVFNTUhBc2dBa0hUQVRZQ0hDQUNJQUUyQWhRZ0FpQUFOZ0lNUVFBaEF3dzBDMEVBSVFBQ1FDQUNLQUk0SWdORkRRQWdBeWdDT0NJRFJRMEFJQUlnQXhFQUFDRUFDeUFBUlEwQUlBQkJGVVlOQVNBQ1FRQTJBaHdnQWlBQk5nSVVJQUpCekE0MkFoQWdBa0VnTmdJTVFRQWhBd3d6QzBIa0FDRUREQmtMSUFKQitBQTJBaHdnQWlBQk5nSVVJQUpCeWhnMkFoQWdBa0VWTmdJTVFRQWhBd3d4QzBIU0FTRURJQVFnQVNJQVJnMHdJQVFnQVdzZ0FpZ0NBQ0lCYWlFRklBQWdBV3RCQkdvaEJnSkFBMEFnQUMwQUFDQUJRZnpQQUdvdEFBQkhEUUVnQVVFRVJnMERJQUZCQVdvaEFTQUVJQUJCQVdvaUFFY05BQXNnQWlBRk5nSUFEREVMSUFKQkFEWUNIQ0FDSUFBMkFoUWdBa0dRTXpZQ0VDQUNRUWcyQWd3Z0FrRUFOZ0lBUVFBaEF3d3dDeUFCSUFSSEJFQWdBa0VPTmdJSUlBSWdBVFlDQkVHM0FTRUREQmNMUWRFQklRTU1Md3NnQWtFQU5nSUFJQVpCQVdvaEFRdEJ1QUVoQXd3VUN5QUJJQVJHQkVCQjBBRWhBd3d0Q3lBQkxRQUFRVEJySWdCQi93RnhRUXBKQkVBZ0FpQUFPZ0FxSUFGQkFXb2hBVUcyQVNFRERCUUxJQUlvQWdRaEFDQUNRUUEyQWdRZ0FpQUFJQUVRS0NJQVJRMFVJQUpCendFMkFod2dBaUFCTmdJVUlBSWdBRFlDREVFQUlRTU1MQXNnQVNBRVJnUkFRYzRCSVFNTUxBc0NRQ0FCTFFBQVFTNUdCRUFnQVVFQmFpRUJEQUVMSUFJb0FnUWhBQ0FDUVFBMkFnUWdBaUFBSUFFUUtDSUFSUTBWSUFKQnpRRTJBaHdnQWlBQk5nSVVJQUlnQURZQ0RFRUFJUU1NTEF0QnRRRWhBd3dTQ3lBRUlBRWlCVVlFUUVITUFTRUREQ3NMUVFBaEFFRUJJUUZCQVNFR1FRQWhBd0pBQWtBQ1FBSkFBa0FDZndKQUFrQUNRQUpBQWtBQ1FBSkFJQVV0QUFCQk1Hc09DZ29KQUFFQ0F3UUZCZ2dMQzBFQ0RBWUxRUU1NQlF0QkJBd0VDMEVGREFNTFFRWU1BZ3RCQnd3QkMwRUlDeUVEUVFBaEFVRUFJUVlNQWd0QkNTRURRUUVoQUVFQUlRRkJBQ0VHREFFTFFRQWhBVUVCSVFNTElBSWdBem9BS3lBRlFRRnFJUU1DUUFKQUlBSXRBQzFCRUhFTkFBSkFBa0FDUUNBQ0xRQXFEZ01CQUFJRUN5QUdSUTBEREFJTElBQU5BUXdDQ3lBQlJRMEJDeUFDS0FJRUlRQWdBa0VBTmdJRUlBSWdBQ0FERUNnaUFFVUVRQ0FESVFFTUF3c2dBa0hKQVRZQ0hDQUNJQU0yQWhRZ0FpQUFOZ0lNUVFBaEF3d3RDeUFDS0FJRUlRQWdBa0VBTmdJRUlBSWdBQ0FERUNnaUFFVUVRQ0FESVFFTUdBc2dBa0hLQVRZQ0hDQUNJQU0yQWhRZ0FpQUFOZ0lNUVFBaEF3d3NDeUFDS0FJRUlRQWdBa0VBTmdJRUlBSWdBQ0FGRUNnaUFFVUVRQ0FGSVFFTUZnc2dBa0hMQVRZQ0hDQUNJQVUyQWhRZ0FpQUFOZ0lNRENzTFFiUUJJUU1NRVF0QkFDRUFBa0FnQWlnQ09DSURSUTBBSUFNb0Fqd2lBMFVOQUNBQ0lBTVJBQUFoQUFzQ1FDQUFCRUFnQUVFVlJnMEJJQUpCQURZQ0hDQUNJQUUyQWhRZ0FrR1VEVFlDRUNBQ1FTRTJBZ3hCQUNFRERDc0xRYklCSVFNTUVRc2dBa0hJQVRZQ0hDQUNJQUUyQWhRZ0FrSEpGellDRUNBQ1FSVTJBZ3hCQUNFRERDa0xJQUpCQURZQ0FDQUdRUUZxSVFGQjlRQWhBd3dQQ3lBQ0xRQXBRUVZHQkVCQjR3QWhBd3dQQzBIaUFDRUREQTRMSUFBaEFTQUNRUUEyQWdBTElBSkJBRG9BTEVFSklRTU1EQXNnQWtFQU5nSUFJQWRCQVdvaEFVSEFBQ0VEREFzTFFRRUxPZ0FzSUFKQkFEWUNBQ0FHUVFGcUlRRUxRU2toQXd3SUMwRTRJUU1NQndzQ1FDQUJJQVJIQkVBRFFDQUJMUUFBUVlBK2FpMEFBQ0lBUVFGSEJFQWdBRUVDUncwRElBRkJBV29oQVF3RkN5QUVJQUZCQVdvaUFVY05BQXRCUGlFRERDRUxRVDRoQXd3Z0N3c2dBa0VBT2dBc0RBRUxRUXNoQXd3RUMwRTZJUU1NQXdzZ0FVRUJhaUVCUVMwaEF3d0NDeUFDSUFFNkFDd2dBa0VBTmdJQUlBWkJBV29oQVVFTUlRTU1BUXNnQWtFQU5nSUFJQVpCQVdvaEFVRUtJUU1NQUFzQUMwRUFJUU1nQWtFQU5nSWNJQUlnQVRZQ0ZDQUNRYzBRTmdJUUlBSkJDVFlDREF3WEMwRUFJUU1nQWtFQU5nSWNJQUlnQVRZQ0ZDQUNRZWtLTmdJUUlBSkJDVFlDREF3V0MwRUFJUU1nQWtFQU5nSWNJQUlnQVRZQ0ZDQUNRYmNRTmdJUUlBSkJDVFlDREF3VkMwRUFJUU1nQWtFQU5nSWNJQUlnQVRZQ0ZDQUNRWndSTmdJUUlBSkJDVFlDREF3VUMwRUFJUU1nQWtFQU5nSWNJQUlnQVRZQ0ZDQUNRYzBRTmdJUUlBSkJDVFlDREF3VEMwRUFJUU1nQWtFQU5nSWNJQUlnQVRZQ0ZDQUNRZWtLTmdJUUlBSkJDVFlDREF3U0MwRUFJUU1nQWtFQU5nSWNJQUlnQVRZQ0ZDQUNRYmNRTmdJUUlBSkJDVFlDREF3UkMwRUFJUU1nQWtFQU5nSWNJQUlnQVRZQ0ZDQUNRWndSTmdJUUlBSkJDVFlDREF3UUMwRUFJUU1nQWtFQU5nSWNJQUlnQVRZQ0ZDQUNRWmNWTmdJUUlBSkJEellDREF3UEMwRUFJUU1nQWtFQU5nSWNJQUlnQVRZQ0ZDQUNRWmNWTmdJUUlBSkJEellDREF3T0MwRUFJUU1nQWtFQU5nSWNJQUlnQVRZQ0ZDQUNRY0FTTmdJUUlBSkJDellDREF3TkMwRUFJUU1nQWtFQU5nSWNJQUlnQVRZQ0ZDQUNRWlVKTmdJUUlBSkJDellDREF3TUMwRUFJUU1nQWtFQU5nSWNJQUlnQVRZQ0ZDQUNRZUVQTmdJUUlBSkJDallDREF3TEMwRUFJUU1nQWtFQU5nSWNJQUlnQVRZQ0ZDQUNRZnNQTmdJUUlBSkJDallDREF3S0MwRUFJUU1nQWtFQU5nSWNJQUlnQVRZQ0ZDQUNRZkVaTmdJUUlBSkJBallDREF3SkMwRUFJUU1nQWtFQU5nSWNJQUlnQVRZQ0ZDQUNRY1FVTmdJUUlBSkJBallDREF3SUMwRUFJUU1nQWtFQU5nSWNJQUlnQVRZQ0ZDQUNRZklWTmdJUUlBSkJBallDREF3SEN5QUNRUUkyQWh3Z0FpQUJOZ0lVSUFKQm5CbzJBaEFnQWtFV05nSU1RUUFoQXd3R0MwRUJJUU1NQlF0QjFBQWhBeUFCSUFSR0RRUWdDRUVJYWlFSklBSW9BZ0FoQlFKQUFrQWdBU0FFUndSQUlBVkIyTUlBYWlFSElBUWdCV29nQVdzaEFDQUZRWDl6UVFwcUlnVWdBV29oQmdOQUlBRXRBQUFnQnkwQUFFY0VRRUVDSVFjTUF3c2dCVVVFUUVFQUlRY2dCaUVCREFNTElBVkJBV3NoQlNBSFFRRnFJUWNnQkNBQlFRRnFJZ0ZIRFFBTElBQWhCU0FFSVFFTElBbEJBVFlDQUNBQ0lBVTJBZ0FNQVFzZ0FrRUFOZ0lBSUFrZ0J6WUNBQXNnQ1NBQk5nSUVJQWdvQWd3aEFDQUlLQUlJRGdNQkJBSUFDd0FMSUFKQkFEWUNIQ0FDUWJVYU5nSVFJQUpCRnpZQ0RDQUNJQUJCQVdvMkFoUkJBQ0VEREFJTElBSkJBRFlDSENBQ0lBQTJBaFFnQWtIS0dqWUNFQ0FDUVFrMkFneEJBQ0VEREFFTElBRWdCRVlFUUVFaUlRTU1BUXNnQWtFSk5nSUlJQUlnQVRZQ0JFRWhJUU1MSUFoQkVHb2tBQ0FEUlFSQUlBSW9BZ3doQUF3QkN5QUNJQU0yQWh4QkFDRUFJQUlvQWdRaUFVVU5BQ0FDSUFFZ0JDQUNLQUlJRVFFQUlnRkZEUUFnQWlBRU5nSVVJQUlnQVRZQ0RDQUJJUUFMSUFBTHZnSUJBbjhnQUVFQU9nQUFJQUJCM0FCcUlnRkJBV3RCQURvQUFDQUFRUUE2QUFJZ0FFRUFPZ0FCSUFGQkEydEJBRG9BQUNBQlFRSnJRUUE2QUFBZ0FFRUFPZ0FESUFGQkJHdEJBRG9BQUVFQUlBQnJRUU54SWdFZ0FHb2lBRUVBTmdJQVFkd0FJQUZyUVh4eElnSWdBR29pQVVFRWEwRUFOZ0lBQWtBZ0FrRUpTUTBBSUFCQkFEWUNDQ0FBUVFBMkFnUWdBVUVJYTBFQU5nSUFJQUZCREd0QkFEWUNBQ0FDUVJsSkRRQWdBRUVBTmdJWUlBQkJBRFlDRkNBQVFRQTJBaEFnQUVFQU5nSU1JQUZCRUd0QkFEWUNBQ0FCUVJSclFRQTJBZ0FnQVVFWWEwRUFOZ0lBSUFGQkhHdEJBRFlDQUNBQ0lBQkJCSEZCR0hJaUFtc2lBVUVnU1EwQUlBQWdBbW9oQUFOQUlBQkNBRGNER0NBQVFnQTNBeEFnQUVJQU53TUlJQUJDQURjREFDQUFRU0JxSVFBZ0FVRWdheUlCUVI5TERRQUxDd3RXQVFGL0FrQWdBQ2dDREEwQUFrQUNRQUpBQWtBZ0FDMEFMdzREQVFBREFnc2dBQ2dDT0NJQlJRMEFJQUVvQWl3aUFVVU5BQ0FBSUFFUkFBQWlBUTBEQzBFQUR3c0FDeUFBUWNNV05nSVFRUTRoQVFzZ0FRc2FBQ0FBS0FJTVJRUkFJQUJCMFJzMkFoQWdBRUVWTmdJTUN3c1VBQ0FBS0FJTVFSVkdCRUFnQUVFQU5nSU1Dd3NVQUNBQUtBSU1RUlpHQkVBZ0FFRUFOZ0lNQ3dzSEFDQUFLQUlNQ3djQUlBQW9BaEFMQ1FBZ0FDQUJOZ0lRQ3djQUlBQW9BaFFMRndBZ0FFRWtUd1JBQUFzZ0FFRUNkRUdnTTJvb0FnQUxGd0FnQUVFdVR3UkFBQXNnQUVFQ2RFR3dOR29vQWdBTHZ3a0JBWDlCNnlnaEFRSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQUJCNUFCckR2UURZMklBQVdGaFlXRmhZUUlEQkFWaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhCZ2NJQ1FvTERBME9EMkZoWVdGaEVHRmhZV0ZoWVdGaFlXRmhFV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZUklURkJVV0Z4Z1pHaHRoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoSEIwZUh5QWhJaU1rSlNZbktDa3FLeXd0TGk4d01USXpORFUyWVRjNE9UcGhZV0ZoWVdGaFlUdGhZV0U4WVdGaFlUMCtQMkZoWVdGaFlXRmhRR0ZoUVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlVSkRSRVZHUjBoSlNrdE1UVTVQVUZGU1UyRmhZV0ZoWVdGaFZGVldWMWhaV2x0aFhGMWhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZlWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWDJCaEMwSGhKdzhMUWFRaER3dEJ5eXdQQzBIK01ROExRY0FrRHd0QnF5UVBDMEdOS0E4TFFlSW1Ed3RCZ0RBUEMwRzVMdzhMUWRja0R3dEI3eDhQQzBIaEh3OExRZm9mRHd0QjhpQVBDMEdvTHc4TFFhNHlEd3RCaURBUEMwSHNKdzhMUVlJaUR3dEJqaDBQQzBIUUxnOExRY29qRHd0QnhUSVBDMEhmSEE4TFFkSWNEd3RCeENBUEMwSFhJQThMUWFJZkR3dEI3UzRQQzBHck1BOExRZFFsRHd0QnpDNFBDMEg2TGc4TFFmd3JEd3RCMGpBUEMwSHhIUThMUWJzZ0R3dEI5eXNQQzBHUU1ROExRZGN4RHd0Qm9pMFBDMEhVSnc4TFFlQXJEd3RCbnl3UEMwSHJNUThMUWRVZkR3dEJ5akVQQzBIZUpROExRZFFlRHd0QjlCd1BDMEduTWc4TFFiRWREd3RCb0IwUEMwRzVNUThMUWJ3d0R3dEJraUVQQzBHekpnOExRZWtzRHd0QnJCNFBDMEhVS3c4TFFmY21Ed3RCZ0NZUEMwR3dJUThMUWY0ZUR3dEJqU01QQzBHSkxROExRZmNpRHd0Qm9ERVBDMEd1SHc4TFFjWWxEd3RCNkI0UEMwR1RJZzhMUWNJdkR3dEJ3eDBQQzBHTExBOExRZUVkRHd0QmpTOFBDMEhxSVE4TFFiUXREd3RCMGk4UEMwSGZNZzhMUWRJeUR3dEI4REFQQzBHcElnOExRZmtqRHd0Qm1SNFBDMEcxTEE4TFFac3dEd3RCa2pJUEMwRzJLdzhMUWNJaUR3dEIrRElQQzBHZUpROExRZEFpRHd0QnVoNFBDMEdCSGc4TEFBdEIxaUVoQVFzZ0FRc1dBQ0FBSUFBdEFDMUIvZ0Z4SUFGQkFFZHlPZ0F0Q3hrQUlBQWdBQzBBTFVIOUFYRWdBVUVBUjBFQmRISTZBQzBMR1FBZ0FDQUFMUUF0UWZzQmNTQUJRUUJIUVFKMGNqb0FMUXNaQUNBQUlBQXRBQzFCOXdGeElBRkJBRWRCQTNSeU9nQXRDejRCQW44Q1FDQUFLQUk0SWdORkRRQWdBeWdDQkNJRFJRMEFJQUFnQVNBQ0lBRnJJQU1SQVFBaUJFRi9SdzBBSUFCQnhoRTJBaEJCR0NFRUN5QUVDejRCQW44Q1FDQUFLQUk0SWdORkRRQWdBeWdDQ0NJRFJRMEFJQUFnQVNBQ0lBRnJJQU1SQVFBaUJFRi9SdzBBSUFCQjlnbzJBaEJCR0NFRUN5QUVDejRCQW44Q1FDQUFLQUk0SWdORkRRQWdBeWdDRENJRFJRMEFJQUFnQVNBQ0lBRnJJQU1SQVFBaUJFRi9SdzBBSUFCQjdSbzJBaEJCR0NFRUN5QUVDejRCQW44Q1FDQUFLQUk0SWdORkRRQWdBeWdDRUNJRFJRMEFJQUFnQVNBQ0lBRnJJQU1SQVFBaUJFRi9SdzBBSUFCQmxSQTJBaEJCR0NFRUN5QUVDejRCQW44Q1FDQUFLQUk0SWdORkRRQWdBeWdDRkNJRFJRMEFJQUFnQVNBQ0lBRnJJQU1SQVFBaUJFRi9SdzBBSUFCQnFoczJBaEJCR0NFRUN5QUVDejRCQW44Q1FDQUFLQUk0SWdORkRRQWdBeWdDR0NJRFJRMEFJQUFnQVNBQ0lBRnJJQU1SQVFBaUJFRi9SdzBBSUFCQjdSTTJBaEJCR0NFRUN5QUVDejRCQW44Q1FDQUFLQUk0SWdORkRRQWdBeWdDS0NJRFJRMEFJQUFnQVNBQ0lBRnJJQU1SQVFBaUJFRi9SdzBBSUFCQjlnZzJBaEJCR0NFRUN5QUVDejRCQW44Q1FDQUFLQUk0SWdORkRRQWdBeWdDSENJRFJRMEFJQUFnQVNBQ0lBRnJJQU1SQVFBaUJFRi9SdzBBSUFCQndoazJBaEJCR0NFRUN5QUVDejRCQW44Q1FDQUFLQUk0SWdORkRRQWdBeWdDSUNJRFJRMEFJQUFnQVNBQ0lBRnJJQU1SQVFBaUJFRi9SdzBBSUFCQmxCUTJBaEJCR0NFRUN5QUVDMWtCQW44Q1FDQUFMUUFvUVFGR0RRQWdBQzhCTWlJQlFlUUFhMEhrQUVrTkFDQUJRY3dCUmcwQUlBRkJzQUpHRFFBZ0FDOEJNQ0lBUWNBQWNRMEFRUUVoQWlBQVFZZ0VjVUdBQkVZTkFDQUFRU2h4UlNFQ0N5QUNDNHdCQVFKL0FrQUNRQUpBSUFBdEFDcEZEUUFnQUMwQUswVU5BQ0FBTHdFd0lnRkJBbkZGRFFFTUFnc2dBQzhCTUNJQlFRRnhSUTBCQzBFQklRSWdBQzBBS0VFQlJnMEFJQUF2QVRJaUFFSGtBR3RCNUFCSkRRQWdBRUhNQVVZTkFDQUFRYkFDUmcwQUlBRkJ3QUJ4RFFCQkFDRUNJQUZCaUFSeFFZQUVSZzBBSUFGQktIRkJBRWNoQWdzZ0FndHpBQ0FBUVJCcS9Rd0FBQUFBQUFBQUFBQUFBQUFBQUFBQS9Rc0RBQ0FBL1F3QUFBQUFBQUFBQUFBQUFBQUFBQUFBL1FzREFDQUFRVEJxL1F3QUFBQUFBQUFBQUFBQUFBQUFBQUFBL1FzREFDQUFRU0JxL1F3QUFBQUFBQUFBQUFBQUFBQUFBQUFBL1FzREFDQUFRZDBCTmdJY0N3WUFJQUFRTWd1YUxRRUxmeU1BUVJCcklnb2tBRUdrMEFBb0FnQWlDVVVFUUVIazB3QW9BZ0FpQlVVRVFFSHcwd0JDZnpjQ0FFSG8wd0JDZ0lDRWdJQ0F3QUEzQWdCQjVOTUFJQXBCQ0dwQmNIRkIyS3JWcWdWeklnVTJBZ0JCK05NQVFRQTJBZ0JCeU5NQVFRQTJBZ0FMUWN6VEFFR0ExQVEyQWdCQm5OQUFRWURVQkRZQ0FFR3cwQUFnQlRZQ0FFR3MwQUJCZnpZQ0FFSFEwd0JCZ0t3RE5nSUFBMEFnQVVISTBBQnFJQUZCdk5BQWFpSUNOZ0lBSUFJZ0FVRzAwQUJxSWdNMkFnQWdBVUhBMEFCcUlBTTJBZ0FnQVVIUTBBQnFJQUZCeE5BQWFpSUROZ0lBSUFNZ0FqWUNBQ0FCUWRqUUFHb2dBVUhNMEFCcUlnSTJBZ0FnQWlBRE5nSUFJQUZCMU5BQWFpQUNOZ0lBSUFGQklHb2lBVUdBQWtjTkFBdEJqTlFFUWNHckF6WUNBRUdvMEFCQjlOTUFLQUlBTmdJQVFaalFBRUhBcXdNMkFnQkJwTkFBUVlqVUJEWUNBRUhNL3dkQk9EWUNBRUdJMUFRaENRc0NRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQVFld0JUUVJBUVl6UUFDZ0NBQ0lHUVJBZ0FFRVRha0Z3Y1NBQVFRdEpHeUlFUVFOMklnQjJJZ0ZCQTNFRVFBSkFJQUZCQVhFZ0FISkJBWE1pQWtFRGRDSUFRYlRRQUdvaUFTQUFRYnpRQUdvb0FnQWlBQ2dDQ0NJRFJnUkFRWXpRQUNBR1FYNGdBbmR4TmdJQURBRUxJQUVnQXpZQ0NDQURJQUUyQWd3TElBQkJDR29oQVNBQUlBSkJBM1FpQWtFRGNqWUNCQ0FBSUFKcUlnQWdBQ2dDQkVFQmNqWUNCQXdSQzBHVTBBQW9BZ0FpQ0NBRVR3MEJJQUVFUUFKQVFRSWdBSFFpQWtFQUlBSnJjaUFCSUFCMGNXZ2lBRUVEZENJQ1FiVFFBR29pQVNBQ1FielFBR29vQWdBaUFpZ0NDQ0lEUmdSQVFZelFBQ0FHUVg0Z0FIZHhJZ1kyQWdBTUFRc2dBU0FETmdJSUlBTWdBVFlDREFzZ0FpQUVRUU55TmdJRUlBQkJBM1FpQUNBRWF5RUZJQUFnQW1vZ0JUWUNBQ0FDSUFScUlnUWdCVUVCY2pZQ0JDQUlCRUFnQ0VGNGNVRzAwQUJxSVFCQm9OQUFLQUlBSVFNQ2YwRUJJQWhCQTNaMElnRWdCbkZGQkVCQmpOQUFJQUVnQm5JMkFnQWdBQXdCQ3lBQUtBSUlDeUlCSUFNMkFnd2dBQ0FETmdJSUlBTWdBRFlDRENBRElBRTJBZ2dMSUFKQkNHb2hBVUdnMEFBZ0JEWUNBRUdVMEFBZ0JUWUNBQXdSQzBHUTBBQW9BZ0FpQzBVTkFTQUxhRUVDZEVHODBnQnFLQUlBSWdBb0FnUkJlSEVnQkdzaEJTQUFJUUlEUUFKQUlBSW9BaEFpQVVVRVFDQUNRUlJxS0FJQUlnRkZEUUVMSUFFb0FnUkJlSEVnQkdzaUF5QUZTU0VDSUFNZ0JTQUNHeUVGSUFFZ0FDQUNHeUVBSUFFaEFnd0JDd3NnQUNnQ0dDRUpJQUFvQWd3aUF5QUFSd1JBUVp6UUFDZ0NBQm9nQXlBQUtBSUlJZ0UyQWdnZ0FTQUROZ0lNREJBTElBQkJGR29pQWlnQ0FDSUJSUVJBSUFBb0FoQWlBVVVOQXlBQVFSQnFJUUlMQTBBZ0FpRUhJQUVpQTBFVWFpSUNLQUlBSWdFTkFDQURRUkJxSVFJZ0F5Z0NFQ0lCRFFBTElBZEJBRFlDQUF3UEMwRi9JUVFnQUVHL2Ywc05BQ0FBUVJOcUlnRkJjSEVoQkVHUTBBQW9BZ0FpQ0VVTkFFRUFJQVJySVFVQ1FBSkFBa0FDZjBFQUlBUkJnQUpKRFFBYVFSOGdCRUgvLy84SFN3MEFHaUFFUVNZZ0FVRUlkbWNpQUd0MlFRRnhJQUJCQVhSclFUNXFDeUlHUVFKMFFielNBR29vQWdBaUFrVUVRRUVBSVFGQkFDRUREQUVMUVFBaEFTQUVRUmtnQmtFQmRtdEJBQ0FHUVI5SEczUWhBRUVBSVFNRFFBSkFJQUlvQWdSQmVIRWdCR3NpQnlBRlR3MEFJQUloQXlBSElnVU5BRUVBSVFVZ0FpRUJEQU1MSUFFZ0FrRVVhaWdDQUNJSElBY2dBaUFBUVIxMlFRUnhha0VRYWlnQ0FDSUNSaHNnQVNBSEd5RUJJQUJCQVhRaEFDQUNEUUFMQ3lBQklBTnlSUVJBUVFBaEEwRUNJQVowSWdCQkFDQUFhM0lnQ0hFaUFFVU5BeUFBYUVFQ2RFRzgwZ0JxS0FJQUlRRUxJQUZGRFFFTEEwQWdBU2dDQkVGNGNTQUVheUlDSUFWSklRQWdBaUFGSUFBYklRVWdBU0FESUFBYklRTWdBU2dDRUNJQUJIOGdBQVVnQVVFVWFpZ0NBQXNpQVEwQUN3c2dBMFVOQUNBRlFaVFFBQ2dDQUNBRWEwOE5BQ0FES0FJWUlRY2dBeUFES0FJTUlnQkhCRUJCbk5BQUtBSUFHaUFBSUFNb0FnZ2lBVFlDQ0NBQklBQTJBZ3dNRGdzZ0EwRVVhaUlDS0FJQUlnRkZCRUFnQXlnQ0VDSUJSUTBESUFOQkVHb2hBZ3NEUUNBQ0lRWWdBU0lBUVJScUlnSW9BZ0FpQVEwQUlBQkJFR29oQWlBQUtBSVFJZ0VOQUFzZ0JrRUFOZ0lBREEwTFFaVFFBQ2dDQUNJRElBUlBCRUJCb05BQUtBSUFJUUVDUUNBRElBUnJJZ0pCRUU4RVFDQUJJQVJxSWdBZ0FrRUJjallDQkNBQklBTnFJQUkyQWdBZ0FTQUVRUU55TmdJRURBRUxJQUVnQTBFRGNqWUNCQ0FCSUFOcUlnQWdBQ2dDQkVFQmNqWUNCRUVBSVFCQkFDRUNDMEdVMEFBZ0FqWUNBRUdnMEFBZ0FEWUNBQ0FCUVFocUlRRU1Ed3RCbU5BQUtBSUFJZ01nQkVzRVFDQUVJQWxxSWdBZ0F5QUVheUlCUVFGeU5nSUVRYVRRQUNBQU5nSUFRWmpRQUNBQk5nSUFJQWtnQkVFRGNqWUNCQ0FKUVFocUlRRU1Ed3RCQUNFQklBUUNmMEhrMHdBb0FnQUVRRUhzMHdBb0FnQU1BUXRCOE5NQVFuODNBZ0JCNk5NQVFvQ0FoSUNBZ01BQU53SUFRZVRUQUNBS1FReHFRWEJ4UWRpcTFhb0ZjellDQUVINDB3QkJBRFlDQUVISTB3QkJBRFlDQUVHQWdBUUxJZ0FnQkVISEFHb2lCV29pQmtFQUlBQnJJZ2R4SWdKUEJFQkIvTk1BUVRBMkFnQU1Ed3NDUUVIRTB3QW9BZ0FpQVVVTkFFRzgwd0FvQWdBaUNDQUNhaUVBSUFBZ0FVMGdBQ0FJUzNFTkFFRUFJUUZCL05NQVFUQTJBZ0FNRHd0QnlOTUFMUUFBUVFSeERRUUNRQUpBSUFrRVFFSE0wd0FoQVFOQUlBRW9BZ0FpQUNBSlRRUkFJQUFnQVNnQ0JHb2dDVXNOQXdzZ0FTZ0NDQ0lCRFFBTEMwRUFFRE1pQUVGL1JnMEZJQUloQmtIbzB3QW9BZ0FpQVVFQmF5SURJQUJ4QkVBZ0FpQUFheUFBSUFOcVFRQWdBV3R4YWlFR0N5QUVJQVpQRFFVZ0JrSCsvLy8vQjBzTkJVSEUwd0FvQWdBaUF3UkFRYnpUQUNnQ0FDSUhJQVpxSVFFZ0FTQUhUUTBHSUFFZ0Ewc05CZ3NnQmhBeklnRWdBRWNOQVF3SEN5QUdJQU5ySUFkeElnWkIvdi8vL3dkTERRUWdCaEF6SVFBZ0FDQUJLQUlBSUFFb0FnUnFSZzBESUFBaEFRc0NRQ0FHSUFSQnlBQnFUdzBBSUFGQmYwWU5BRUhzMHdBb0FnQWlBQ0FGSUFacmFrRUFJQUJyY1NJQVFmNy8vLzhIU3dSQUlBRWhBQXdIQ3lBQUVETkJmMGNFUUNBQUlBWnFJUVlnQVNFQURBY0xRUUFnQm1zUU14b01CQXNnQVNJQVFYOUhEUVVNQXd0QkFDRUREQXdMUVFBaEFBd0tDeUFBUVg5SERRSUxRY2pUQUVISTB3QW9BZ0JCQkhJMkFnQUxJQUpCL3YvLy93ZExEUUVnQWhBeklRQkJBQkF6SVFFZ0FFRi9SZzBCSUFGQmYwWU5BU0FBSUFGUERRRWdBU0FBYXlJR0lBUkJPR3BORFFFTFFielRBRUc4MHdBb0FnQWdCbW9pQVRZQ0FFSEEwd0FvQWdBZ0FVa0VRRUhBMHdBZ0FUWUNBQXNDUUFKQUFrQkJwTkFBS0FJQUlnSUVRRUhNMHdBaEFRTkFJQUFnQVNnQ0FDSURJQUVvQWdRaUJXcEdEUUlnQVNnQ0NDSUJEUUFMREFJTFFaelFBQ2dDQUNJQlFRQkhJQUFnQVU5eFJRUkFRWnpRQUNBQU5nSUFDMEVBSVFGQjBOTUFJQVkyQWdCQnpOTUFJQUEyQWdCQnJOQUFRWDgyQWdCQnNOQUFRZVRUQUNnQ0FEWUNBRUhZMHdCQkFEWUNBQU5BSUFGQnlOQUFhaUFCUWJ6UUFHb2lBallDQUNBQ0lBRkJ0TkFBYWlJRE5nSUFJQUZCd05BQWFpQUROZ0lBSUFGQjBOQUFhaUFCUWNUUUFHb2lBellDQUNBRElBSTJBZ0FnQVVIWTBBQnFJQUZCek5BQWFpSUNOZ0lBSUFJZ0F6WUNBQ0FCUWRUUUFHb2dBallDQUNBQlFTQnFJZ0ZCZ0FKSERRQUxRWGdnQUd0QkQzRWlBU0FBYWlJQ0lBWkJPR3NpQXlBQmF5SUJRUUZ5TmdJRVFhalFBRUgwMHdBb0FnQTJBZ0JCbU5BQUlBRTJBZ0JCcE5BQUlBSTJBZ0FnQUNBRGFrRTROZ0lFREFJTElBQWdBazBOQUNBQ0lBTkpEUUFnQVNnQ0RFRUljUTBBUVhnZ0FtdEJEM0VpQUNBQ2FpSURRWmpRQUNnQ0FDQUdhaUlISUFCcklnQkJBWEkyQWdRZ0FTQUZJQVpxTmdJRVFhalFBRUgwMHdBb0FnQTJBZ0JCbU5BQUlBQTJBZ0JCcE5BQUlBTTJBZ0FnQWlBSGFrRTROZ0lFREFFTElBQkJuTkFBS0FJQVNRUkFRWnpRQUNBQU5nSUFDeUFBSUFacUlRTkJ6Tk1BSVFFQ1FBSkFBa0FEUUNBRElBRW9BZ0JIQkVBZ0FTZ0NDQ0lCRFFFTUFnc0xJQUV0QUF4QkNIRkZEUUVMUWN6VEFDRUJBMEFnQVNnQ0FDSURJQUpOQkVBZ0F5QUJLQUlFYWlJRklBSkxEUU1MSUFFb0FnZ2hBUXdBQ3dBTElBRWdBRFlDQUNBQklBRW9BZ1FnQm1vMkFnUWdBRUY0SUFCclFROXhhaUlKSUFSQkEzSTJBZ1FnQTBGNElBTnJRUTl4YWlJR0lBUWdDV29pQkdzaEFTQUNJQVpHQkVCQnBOQUFJQVEyQWdCQm1OQUFRWmpRQUNnQ0FDQUJhaUlBTmdJQUlBUWdBRUVCY2pZQ0JBd0lDMEdnMEFBb0FnQWdCa1lFUUVHZzBBQWdCRFlDQUVHVTBBQkJsTkFBS0FJQUlBRnFJZ0EyQWdBZ0JDQUFRUUZ5TmdJRUlBQWdCR29nQURZQ0FBd0lDeUFHS0FJRUlnVkJBM0ZCQVVjTkJpQUZRWGh4SVFnZ0JVSC9BVTBFUUNBRlFRTjJJUU1nQmlnQ0NDSUFJQVlvQWd3aUFrWUVRRUdNMEFCQmpOQUFLQUlBUVg0Z0EzZHhOZ0lBREFjTElBSWdBRFlDQ0NBQUlBSTJBZ3dNQmdzZ0JpZ0NHQ0VISUFZZ0JpZ0NEQ0lBUndSQUlBQWdCaWdDQ0NJQ05nSUlJQUlnQURZQ0RBd0ZDeUFHUVJScUlnSW9BZ0FpQlVVRVFDQUdLQUlRSWdWRkRRUWdCa0VRYWlFQ0N3TkFJQUloQXlBRklnQkJGR29pQWlnQ0FDSUZEUUFnQUVFUWFpRUNJQUFvQWhBaUJRMEFDeUFEUVFBMkFnQU1CQXRCZUNBQWEwRVBjU0lCSUFCcUlnY2dCa0U0YXlJRElBRnJJZ0ZCQVhJMkFnUWdBQ0FEYWtFNE5nSUVJQUlnQlVFM0lBVnJRUTl4YWtFL2F5SURJQU1nQWtFUWFra2JJZ05CSXpZQ0JFR28wQUJCOU5NQUtBSUFOZ0lBUVpqUUFDQUJOZ0lBUWFUUUFDQUhOZ0lBSUFOQkVHcEIxTk1BS1FJQU53SUFJQU5Cek5NQUtRSUFOd0lJUWRUVEFDQURRUWhxTmdJQVFkRFRBQ0FHTmdJQVFjelRBQ0FBTmdJQVFkalRBRUVBTmdJQUlBTkJKR29oQVFOQUlBRkJCellDQUNBRklBRkJCR29pQVVzTkFBc2dBaUFEUmcwQUlBTWdBeWdDQkVGK2NUWUNCQ0FESUFNZ0Ftc2lCVFlDQUNBQ0lBVkJBWEkyQWdRZ0JVSC9BVTBFUUNBRlFYaHhRYlRRQUdvaEFBSi9RWXpRQUNnQ0FDSUJRUUVnQlVFRGRuUWlBM0ZGQkVCQmpOQUFJQUVnQTNJMkFnQWdBQXdCQ3lBQUtBSUlDeUlCSUFJMkFnd2dBQ0FDTmdJSUlBSWdBRFlDRENBQ0lBRTJBZ2dNQVF0Qkh5RUJJQVZCLy8vL0IwMEVRQ0FGUVNZZ0JVRUlkbWNpQUd0MlFRRnhJQUJCQVhSclFUNXFJUUVMSUFJZ0FUWUNIQ0FDUWdBM0FoQWdBVUVDZEVHODBnQnFJUUJCa05BQUtBSUFJZ05CQVNBQmRDSUdjVVVFUUNBQUlBSTJBZ0JCa05BQUlBTWdCbkkyQWdBZ0FpQUFOZ0lZSUFJZ0FqWUNDQ0FDSUFJMkFnd01BUXNnQlVFWklBRkJBWFpyUVFBZ0FVRWZSeHQwSVFFZ0FDZ0NBQ0VEQWtBRFFDQURJZ0FvQWdSQmVIRWdCVVlOQVNBQlFSMTJJUU1nQVVFQmRDRUJJQUFnQTBFRWNXcEJFR29pQmlnQ0FDSUREUUFMSUFZZ0FqWUNBQ0FDSUFBMkFoZ2dBaUFDTmdJTUlBSWdBallDQ0F3QkN5QUFLQUlJSWdFZ0FqWUNEQ0FBSUFJMkFnZ2dBa0VBTmdJWUlBSWdBRFlDRENBQ0lBRTJBZ2dMUVpqUUFDZ0NBQ0lCSUFSTkRRQkJwTkFBS0FJQUlnQWdCR29pQWlBQklBUnJJZ0ZCQVhJMkFnUkJtTkFBSUFFMkFnQkJwTkFBSUFJMkFnQWdBQ0FFUVFOeU5nSUVJQUJCQ0dvaEFRd0lDMEVBSVFGQi9OTUFRVEEyQWdBTUJ3dEJBQ0VBQ3lBSFJRMEFBa0FnQmlnQ0hDSUNRUUowUWJ6U0FHb2lBeWdDQUNBR1JnUkFJQU1nQURZQ0FDQUFEUUZCa05BQVFaRFFBQ2dDQUVGK0lBSjNjVFlDQUF3Q0N5QUhRUkJCRkNBSEtBSVFJQVpHRzJvZ0FEWUNBQ0FBUlEwQkN5QUFJQWMyQWhnZ0JpZ0NFQ0lDQkVBZ0FDQUNOZ0lRSUFJZ0FEWUNHQXNnQmtFVWFpZ0NBQ0lDUlEwQUlBQkJGR29nQWpZQ0FDQUNJQUEyQWhnTElBRWdDR29oQVNBR0lBaHFJZ1lvQWdRaEJRc2dCaUFGUVg1eE5nSUVJQUVnQkdvZ0FUWUNBQ0FFSUFGQkFYSTJBZ1FnQVVIL0FVMEVRQ0FCUVhoeFFiVFFBR29oQUFKL1FZelFBQ2dDQUNJQ1FRRWdBVUVEZG5RaUFYRkZCRUJCak5BQUlBRWdBbkkyQWdBZ0FBd0JDeUFBS0FJSUN5SUJJQVEyQWd3Z0FDQUVOZ0lJSUFRZ0FEWUNEQ0FFSUFFMkFnZ01BUXRCSHlFRklBRkIvLy8vQjAwRVFDQUJRU1lnQVVFSWRtY2lBR3QyUVFGeElBQkJBWFJyUVQ1cUlRVUxJQVFnQlRZQ0hDQUVRZ0EzQWhBZ0JVRUNkRUc4MGdCcUlRQkJrTkFBS0FJQUlnSkJBU0FGZENJRGNVVUVRQ0FBSUFRMkFnQkJrTkFBSUFJZ0EzSTJBZ0FnQkNBQU5nSVlJQVFnQkRZQ0NDQUVJQVEyQWd3TUFRc2dBVUVaSUFWQkFYWnJRUUFnQlVFZlJ4dDBJUVVnQUNnQ0FDRUFBa0FEUUNBQUlnSW9BZ1JCZUhFZ0FVWU5BU0FGUVIxMklRQWdCVUVCZENFRklBSWdBRUVFY1dwQkVHb2lBeWdDQUNJQURRQUxJQU1nQkRZQ0FDQUVJQUkyQWhnZ0JDQUVOZ0lNSUFRZ0JEWUNDQXdCQ3lBQ0tBSUlJZ0FnQkRZQ0RDQUNJQVEyQWdnZ0JFRUFOZ0lZSUFRZ0FqWUNEQ0FFSUFBMkFnZ0xJQWxCQ0dvaEFRd0NDd0pBSUFkRkRRQUNRQ0FES0FJY0lnRkJBblJCdk5JQWFpSUNLQUlBSUFOR0JFQWdBaUFBTmdJQUlBQU5BVUdRMEFBZ0NFRitJQUYzY1NJSU5nSUFEQUlMSUFkQkVFRVVJQWNvQWhBZ0EwWWJhaUFBTmdJQUlBQkZEUUVMSUFBZ0J6WUNHQ0FES0FJUUlnRUVRQ0FBSUFFMkFoQWdBU0FBTmdJWUN5QURRUlJxS0FJQUlnRkZEUUFnQUVFVWFpQUJOZ0lBSUFFZ0FEWUNHQXNDUUNBRlFROU5CRUFnQXlBRUlBVnFJZ0JCQTNJMkFnUWdBQ0FEYWlJQUlBQW9BZ1JCQVhJMkFnUU1BUXNnQXlBRWFpSUNJQVZCQVhJMkFnUWdBeUFFUVFOeU5nSUVJQUlnQldvZ0JUWUNBQ0FGUWY4QlRRUkFJQVZCZUhGQnROQUFhaUVBQW45QmpOQUFLQUlBSWdGQkFTQUZRUU4yZENJRmNVVUVRRUdNMEFBZ0FTQUZjallDQUNBQURBRUxJQUFvQWdnTElnRWdBallDRENBQUlBSTJBZ2dnQWlBQU5nSU1JQUlnQVRZQ0NBd0JDMEVmSVFFZ0JVSC8vLzhIVFFSQUlBVkJKaUFGUVFoMlp5SUFhM1pCQVhFZ0FFRUJkR3RCUG1vaEFRc2dBaUFCTmdJY0lBSkNBRGNDRUNBQlFRSjBRYnpTQUdvaEFFRUJJQUYwSWdRZ0NIRkZCRUFnQUNBQ05nSUFRWkRRQUNBRUlBaHlOZ0lBSUFJZ0FEWUNHQ0FDSUFJMkFnZ2dBaUFDTmdJTURBRUxJQVZCR1NBQlFRRjJhMEVBSUFGQkgwY2JkQ0VCSUFBb0FnQWhCQUpBQTBBZ0JDSUFLQUlFUVhoeElBVkdEUUVnQVVFZGRpRUVJQUZCQVhRaEFTQUFJQVJCQkhGcVFSQnFJZ1lvQWdBaUJBMEFDeUFHSUFJMkFnQWdBaUFBTmdJWUlBSWdBallDRENBQ0lBSTJBZ2dNQVFzZ0FDZ0NDQ0lCSUFJMkFnd2dBQ0FDTmdJSUlBSkJBRFlDR0NBQ0lBQTJBZ3dnQWlBQk5nSUlDeUFEUVFocUlRRU1BUXNDUUNBSlJRMEFBa0FnQUNnQ0hDSUJRUUowUWJ6U0FHb2lBaWdDQUNBQVJnUkFJQUlnQXpZQ0FDQUREUUZCa05BQUlBdEJmaUFCZDNFMkFnQU1BZ3NnQ1VFUVFSUWdDU2dDRUNBQVJodHFJQU0yQWdBZ0EwVU5BUXNnQXlBSk5nSVlJQUFvQWhBaUFRUkFJQU1nQVRZQ0VDQUJJQU0yQWhnTElBQkJGR29vQWdBaUFVVU5BQ0FEUVJScUlBRTJBZ0FnQVNBRE5nSVlDd0pBSUFWQkQwMEVRQ0FBSUFRZ0JXb2lBVUVEY2pZQ0JDQUFJQUZxSWdFZ0FTZ0NCRUVCY2pZQ0JBd0JDeUFBSUFScUlnY2dCVUVCY2pZQ0JDQUFJQVJCQTNJMkFnUWdCU0FIYWlBRk5nSUFJQWdFUUNBSVFYaHhRYlRRQUdvaEFVR2cwQUFvQWdBaEF3Si9RUUVnQ0VFRGRuUWlBaUFHY1VVRVFFR00wQUFnQWlBR2NqWUNBQ0FCREFFTElBRW9BZ2dMSWdJZ0F6WUNEQ0FCSUFNMkFnZ2dBeUFCTmdJTUlBTWdBallDQ0F0Qm9OQUFJQWMyQWdCQmxOQUFJQVUyQWdBTElBQkJDR29oQVFzZ0NrRVFhaVFBSUFFTFF3QWdBRVVFUUQ4QVFSQjBEd3NDUUNBQVFmLy9BM0VOQUNBQVFRQklEUUFnQUVFUWRrQUFJZ0JCZjBZRVFFSDgwd0JCTURZQ0FFRi9Ed3NnQUVFUWRBOExBQXNMM0Q4aUFFR0FDQXNKQVFBQUFBSUFBQUFEQUVHVUNBc0ZCQUFBQUFVQVFhUUlDd2tHQUFBQUJ3QUFBQWdBUWR3SUM0b3RTVzUyWVd4cFpDQmphR0Z5SUdsdUlIVnliQ0J4ZFdWeWVRQlRjR0Z1SUdOaGJHeGlZV05ySUdWeWNtOXlJR2x1SUc5dVgySnZaSGtBUTI5dWRHVnVkQzFNWlc1bmRHZ2diM1psY21ac2IzY0FRMmgxYm1zZ2MybDZaU0J2ZG1WeVpteHZkd0JTWlhOd2IyNXpaU0J2ZG1WeVpteHZkd0JKYm5aaGJHbGtJRzFsZEdodlpDQm1iM0lnU0ZSVVVDOTRMbmdnY21WeGRXVnpkQUJKYm5aaGJHbGtJRzFsZEdodlpDQm1iM0lnVWxSVFVDOTRMbmdnY21WeGRXVnpkQUJGZUhCbFkzUmxaQ0JUVDFWU1EwVWdiV1YwYUc5a0lHWnZjaUJKUTBVdmVDNTRJSEpsY1hWbGMzUUFTVzUyWVd4cFpDQmphR0Z5SUdsdUlIVnliQ0JtY21GbmJXVnVkQ0J6ZEdGeWRBQkZlSEJsWTNSbFpDQmtiM1FBVTNCaGJpQmpZV3hzWW1GamF5Qmxjbkp2Y2lCcGJpQnZibDl6ZEdGMGRYTUFTVzUyWVd4cFpDQnlaWE53YjI1elpTQnpkR0YwZFhNQVNXNTJZV3hwWkNCamFHRnlZV04wWlhJZ2FXNGdZMmgxYm1zZ1pYaDBaVzV6YVc5dWN3QlZjMlZ5SUdOaGJHeGlZV05ySUdWeWNtOXlBR0J2Ymw5eVpYTmxkR0FnWTJGc2JHSmhZMnNnWlhKeWIzSUFZRzl1WDJOb2RXNXJYMmhsWVdSbGNtQWdZMkZzYkdKaFkyc2daWEp5YjNJQVlHOXVYMjFsYzNOaFoyVmZZbVZuYVc1Z0lHTmhiR3hpWVdOcklHVnljbTl5QUdCdmJsOWphSFZ1YTE5bGVIUmxibk5wYjI1ZmRtRnNkV1ZnSUdOaGJHeGlZV05ySUdWeWNtOXlBR0J2Ymw5emRHRjBkWE5mWTI5dGNHeGxkR1ZnSUdOaGJHeGlZV05ySUdWeWNtOXlBR0J2Ymw5MlpYSnphVzl1WDJOdmJYQnNaWFJsWUNCallXeHNZbUZqYXlCbGNuSnZjZ0JnYjI1ZmRYSnNYMk52YlhCc1pYUmxZQ0JqWVd4c1ltRmpheUJsY25KdmNnQmdiMjVmWTJoMWJtdGZZMjl0Y0d4bGRHVmdJR05oYkd4aVlXTnJJR1Z5Y205eUFHQnZibDlvWldGa1pYSmZkbUZzZFdWZlkyOXRjR3hsZEdWZ0lHTmhiR3hpWVdOcklHVnljbTl5QUdCdmJsOXRaWE56WVdkbFgyTnZiWEJzWlhSbFlDQmpZV3hzWW1GamF5Qmxjbkp2Y2dCZ2IyNWZiV1YwYUc5a1gyTnZiWEJzWlhSbFlDQmpZV3hzWW1GamF5Qmxjbkp2Y2dCZ2IyNWZhR1ZoWkdWeVgyWnBaV3hrWDJOdmJYQnNaWFJsWUNCallXeHNZbUZqYXlCbGNuSnZjZ0JnYjI1ZlkyaDFibXRmWlhoMFpXNXphVzl1WDI1aGJXVmdJR05oYkd4aVlXTnJJR1Z5Y205eUFGVnVaWGh3WldOMFpXUWdZMmhoY2lCcGJpQjFjbXdnYzJWeWRtVnlBRWx1ZG1Gc2FXUWdhR1ZoWkdWeUlIWmhiSFZsSUdOb1lYSUFTVzUyWVd4cFpDQm9aV0ZrWlhJZ1ptbGxiR1FnWTJoaGNnQlRjR0Z1SUdOaGJHeGlZV05ySUdWeWNtOXlJR2x1SUc5dVgzWmxjbk5wYjI0QVNXNTJZV3hwWkNCdGFXNXZjaUIyWlhKemFXOXVBRWx1ZG1Gc2FXUWdiV0ZxYjNJZ2RtVnljMmx2YmdCRmVIQmxZM1JsWkNCemNHRmpaU0JoWm5SbGNpQjJaWEp6YVc5dUFFVjRjR1ZqZEdWa0lFTlNURVlnWVdaMFpYSWdkbVZ5YzJsdmJnQkpiblpoYkdsa0lFaFVWRkFnZG1WeWMybHZiZ0JKYm5aaGJHbGtJR2hsWVdSbGNpQjBiMnRsYmdCVGNHRnVJR05oYkd4aVlXTnJJR1Z5Y205eUlHbHVJRzl1WDNWeWJBQkpiblpoYkdsa0lHTm9ZWEpoWTNSbGNuTWdhVzRnZFhKc0FGVnVaWGh3WldOMFpXUWdjM1JoY25RZ1kyaGhjaUJwYmlCMWNtd0FSRzkxWW14bElFQWdhVzRnZFhKc0FFVnRjSFI1SUVOdmJuUmxiblF0VEdWdVozUm9BRWx1ZG1Gc2FXUWdZMmhoY21GamRHVnlJR2x1SUVOdmJuUmxiblF0VEdWdVozUm9BRVIxY0d4cFkyRjBaU0JEYjI1MFpXNTBMVXhsYm1kMGFBQkpiblpoYkdsa0lHTm9ZWElnYVc0Z2RYSnNJSEJoZEdnQVEyOXVkR1Z1ZEMxTVpXNW5kR2dnWTJGdUozUWdZbVVnY0hKbGMyVnVkQ0IzYVhSb0lGUnlZVzV6Wm1WeUxVVnVZMjlrYVc1bkFFbHVkbUZzYVdRZ1kyaGhjbUZqZEdWeUlHbHVJR05vZFc1cklITnBlbVVBVTNCaGJpQmpZV3hzWW1GamF5Qmxjbkp2Y2lCcGJpQnZibDlvWldGa1pYSmZkbUZzZFdVQVUzQmhiaUJqWVd4c1ltRmpheUJsY25KdmNpQnBiaUJ2Ymw5amFIVnVhMTlsZUhSbGJuTnBiMjVmZG1Gc2RXVUFTVzUyWVd4cFpDQmphR0Z5WVdOMFpYSWdhVzRnWTJoMWJtc2daWGgwWlc1emFXOXVjeUIyWVd4MVpRQk5hWE56YVc1bklHVjRjR1ZqZEdWa0lFeEdJR0ZtZEdWeUlHaGxZV1JsY2lCMllXeDFaUUJKYm5aaGJHbGtJR0JVY21GdWMyWmxjaTFGYm1OdlpHbHVaMkFnYUdWaFpHVnlJSFpoYkhWbEFFbHVkbUZzYVdRZ1kyaGhjbUZqZEdWeUlHbHVJR05vZFc1cklHVjRkR1Z1YzJsdmJuTWdjWFZ2ZEdVZ2RtRnNkV1VBU1c1MllXeHBaQ0JqYUdGeVlXTjBaWElnYVc0Z1kyaDFibXNnWlhoMFpXNXphVzl1Y3lCeGRXOTBaV1FnZG1Gc2RXVUFVR0YxYzJWa0lHSjVJRzl1WDJobFlXUmxjbk5mWTI5dGNHeGxkR1VBU1c1MllXeHBaQ0JGVDBZZ2MzUmhkR1VBYjI1ZmNtVnpaWFFnY0dGMWMyVUFiMjVmWTJoMWJtdGZhR1ZoWkdWeUlIQmhkWE5sQUc5dVgyMWxjM05oWjJWZlltVm5hVzRnY0dGMWMyVUFiMjVmWTJoMWJtdGZaWGgwWlc1emFXOXVYM1poYkhWbElIQmhkWE5sQUc5dVgzTjBZWFIxYzE5amIyMXdiR1YwWlNCd1lYVnpaUUJ2Ymw5MlpYSnphVzl1WDJOdmJYQnNaWFJsSUhCaGRYTmxBRzl1WDNWeWJGOWpiMjF3YkdWMFpTQndZWFZ6WlFCdmJsOWphSFZ1YTE5amIyMXdiR1YwWlNCd1lYVnpaUUJ2Ymw5b1pXRmtaWEpmZG1Gc2RXVmZZMjl0Y0d4bGRHVWdjR0YxYzJVQWIyNWZiV1Z6YzJGblpWOWpiMjF3YkdWMFpTQndZWFZ6WlFCdmJsOXRaWFJvYjJSZlkyOXRjR3hsZEdVZ2NHRjFjMlVBYjI1ZmFHVmhaR1Z5WDJacFpXeGtYMk52YlhCc1pYUmxJSEJoZFhObEFHOXVYMk5vZFc1clgyVjRkR1Z1YzJsdmJsOXVZVzFsSUhCaGRYTmxBRlZ1Wlhod1pXTjBaV1FnYzNCaFkyVWdZV1owWlhJZ2MzUmhjblFnYkdsdVpRQlRjR0Z1SUdOaGJHeGlZV05ySUdWeWNtOXlJR2x1SUc5dVgyTm9kVzVyWDJWNGRHVnVjMmx2Ymw5dVlXMWxBRWx1ZG1Gc2FXUWdZMmhoY21GamRHVnlJR2x1SUdOb2RXNXJJR1Y0ZEdWdWMybHZibk1nYm1GdFpRQlFZWFZ6WlNCdmJpQkRUMDVPUlVOVUwxVndaM0poWkdVQVVHRjFjMlVnYjI0Z1VGSkpMMVZ3WjNKaFpHVUFSWGh3WldOMFpXUWdTRlJVVUM4eUlFTnZibTVsWTNScGIyNGdVSEpsWm1GalpRQlRjR0Z1SUdOaGJHeGlZV05ySUdWeWNtOXlJR2x1SUc5dVgyMWxkR2h2WkFCRmVIQmxZM1JsWkNCemNHRmpaU0JoWm5SbGNpQnRaWFJvYjJRQVUzQmhiaUJqWVd4c1ltRmpheUJsY25KdmNpQnBiaUJ2Ymw5b1pXRmtaWEpmWm1sbGJHUUFVR0YxYzJWa0FFbHVkbUZzYVdRZ2QyOXlaQ0JsYm1OdmRXNTBaWEpsWkFCSmJuWmhiR2xrSUcxbGRHaHZaQ0JsYm1OdmRXNTBaWEpsWkFCVmJtVjRjR1ZqZEdWa0lHTm9ZWElnYVc0Z2RYSnNJSE5qYUdWdFlRQlNaWEYxWlhOMElHaGhjeUJwYm5aaGJHbGtJR0JVY21GdWMyWmxjaTFGYm1OdlpHbHVaMkFBVTFkSlZFTklYMUJTVDFoWkFGVlRSVjlRVWs5WVdRQk5TMEZEVkVsV1NWUlpBRlZPVUZKUFEwVlRVMEZDVEVWZlJVNVVTVlJaQUVOUFVGa0FUVTlXUlVSZlVFVlNUVUZPUlU1VVRGa0FWRTlQWDBWQlVreFpBRTVQVkVsR1dRQkdRVWxNUlVSZlJFVlFSVTVFUlU1RFdRQkNRVVJmUjBGVVJWZEJXUUJRVEVGWkFGQlZWQUJEU0VWRFMwOVZWQUJIUVZSRlYwRlpYMVJKVFVWUFZWUUFVa1ZSVlVWVFZGOVVTVTFGVDFWVUFFNUZWRmRQVWt0ZlEwOU9Ua1ZEVkY5VVNVMUZUMVZVQUVOUFRrNUZRMVJKVDA1ZlZFbE5SVTlWVkFCTVQwZEpUbDlVU1UxRlQxVlVBRTVGVkZkUFVrdGZVa1ZCUkY5VVNVMUZUMVZVQUZCUFUxUUFUVWxUUkVsU1JVTlVSVVJmVWtWUlZVVlRWQUJEVEVsRlRsUmZRMHhQVTBWRVgxSkZVVlZGVTFRQVEweEpSVTVVWDBOTVQxTkZSRjlNVDBGRVgwSkJURUZPUTBWRVgxSkZVVlZGVTFRQVFrRkVYMUpGVVZWRlUxUUFTRlJVVUY5U1JWRlZSVk5VWDFORlRsUmZWRTlmU0ZSVVVGTmZVRTlTVkFCU1JWQlBVbFFBU1UxZlFWOVVSVUZRVDFRQVVrVlRSVlJmUTA5T1ZFVk9WQUJPVDE5RFQwNVVSVTVVQUZCQlVsUkpRVXhmUTA5T1ZFVk9WQUJJVUVWZlNVNVdRVXhKUkY5RFQwNVRWRUZPVkFCSVVFVmZRMEpmVWtWVFJWUUFSMFZVQUVoUVJWOVRWRkpKUTFRQVEwOU9Sa3hKUTFRQVZFVk5VRTlTUVZKWlgxSkZSRWxTUlVOVUFGQkZVazFCVGtWT1ZGOVNSVVJKVWtWRFZBQkRUMDVPUlVOVUFFMVZURlJKWDFOVVFWUlZVd0JJVUVWZlNVNVdRVXhKUkY5VFZFRlVWVk1BVkU5UFgwMUJUbGxmVWtWUlZVVlRWRk1BUlVGU1RGbGZTRWxPVkZNQVZVNUJWa0ZKVEVGQ1RFVmZSazlTWDB4RlIwRk1YMUpGUVZOUFRsTUFUMUJVU1U5T1V3QlRWMGxVUTBoSlRrZGZVRkpQVkU5RFQweFRBRlpCVWtsQlRsUmZRVXhUVDE5T1JVZFBWRWxCVkVWVEFFMVZURlJKVUV4RlgwTklUMGxEUlZNQVNVNVVSVkpPUVV4ZlUwVlNWa1ZTWDBWU1VrOVNBRmRGUWw5VFJWSldSVkpmVlU1TFRrOVhUbDlGVWxKUFVnQlNRVWxNUjFWT1gwVlNVazlTQUVsRVJVNVVTVlJaWDFCU1QxWkpSRVZTWDBGVlZFaEZUbFJKUTBGVVNVOU9YMFZTVWs5U0FGTlRURjlEUlZKVVNVWkpRMEZVUlY5RlVsSlBVZ0JKVGxaQlRFbEVYMWhmUms5U1YwRlNSRVZFWDBaUFVnQlRSVlJmVUVGU1FVMUZWRVZTQUVkRlZGOVFRVkpCVFVWVVJWSUFTRkJGWDFWVFJWSUFVMFZGWDA5VVNFVlNBRWhRUlY5RFFsOURTRlZPUzE5SVJVRkVSVklBVFV0RFFVeEZUa1JCVWdCVFJWUlZVQUJYUlVKZlUwVlNWa1ZTWDBsVFgwUlBWMDRBVkVWQlVrUlBWMDRBU0ZCRlgwTk1UMU5GUkY5RFQwNU9SVU5VU1U5T0FFaEZWVkpKVTFSSlExOUZXRkJKVWtGVVNVOU9BRVJKVTBOUFRrNUZRMVJGUkY5UFVFVlNRVlJKVDA0QVRrOU9YMEZWVkVoUFVrbFVRVlJKVmtWZlNVNUdUMUpOUVZSSlQwNEFTRkJGWDBsT1ZrRk1TVVJmVmtWU1UwbFBUZ0JJVUVWZlEwSmZUVVZUVTBGSFJWOUNSVWRKVGdCVFNWUkZYMGxUWDBaU1QxcEZUZ0JJVUVWZlNVNVdRVXhKUkY5SVJVRkVSVkpmVkU5TFJVNEFTVTVXUVV4SlJGOVVUMHRGVGdCR1QxSkNTVVJFUlU0QVJVNUlRVTVEUlY5WlQxVlNYME5CVEUwQVNGQkZYMGxPVmtGTVNVUmZWVkpNQUVKTVQwTkxSVVJmUWxsZlVFRlNSVTVVUVV4ZlEwOU9WRkpQVEFCTlMwTlBUQUJCUTB3QVNGQkZYMGxPVkVWU1RrRk1BRkpGVVZWRlUxUmZTRVZCUkVWU1gwWkpSVXhFVTE5VVQwOWZURUZTUjBWZlZVNVBSa1pKUTBsQlRBQklVRVZmVDBzQVZVNU1TVTVMQUZWT1RFOURTd0JRVWtrQVVrVlVVbGxmVjBsVVNBQklVRVZmU1U1V1FVeEpSRjlEVDA1VVJVNVVYMHhGVGtkVVNBQklVRVZmVlU1RldGQkZRMVJGUkY5RFQwNVVSVTVVWDB4RlRrZFVTQUJHVEZWVFNBQlFVazlRVUVGVVEwZ0FUUzFUUlVGU1EwZ0FWVkpKWDFSUFQxOU1UMDVIQUZCU1QwTkZVMU5KVGtjQVRVbFRRMFZNVEVGT1JVOVZVMTlRUlZKVFNWTlVSVTVVWDFkQlVrNUpUa2NBVFVsVFEwVk1URUZPUlU5VlUxOVhRVkpPU1U1SEFFaFFSVjlKVGxaQlRFbEVYMVJTUVU1VFJrVlNYMFZPUTA5RVNVNUhBRVY0Y0dWamRHVmtJRU5TVEVZQVNGQkZYMGxPVmtGTVNVUmZRMGhWVGt0ZlUwbGFSUUJOVDFaRkFFTlBUbFJKVGxWRkFFaFFSVjlEUWw5VFZFRlVWVk5mUTA5TlVFeEZWRVVBU0ZCRlgwTkNYMGhGUVVSRlVsTmZRMDlOVUV4RlZFVUFTRkJGWDBOQ1gxWkZVbE5KVDA1ZlEwOU5VRXhGVkVVQVNGQkZYME5DWDFWU1RGOURUMDFRVEVWVVJRQklVRVZmUTBKZlEwaFZUa3RmUTA5TlVFeEZWRVVBU0ZCRlgwTkNYMGhGUVVSRlVsOVdRVXhWUlY5RFQwMVFURVZVUlFCSVVFVmZRMEpmUTBoVlRrdGZSVmhVUlU1VFNVOU9YMVpCVEZWRlgwTlBUVkJNUlZSRkFFaFFSVjlEUWw5RFNGVk9TMTlGV0ZSRlRsTkpUMDVmVGtGTlJWOURUMDFRVEVWVVJRQklVRVZmUTBKZlRVVlRVMEZIUlY5RFQwMVFURVZVUlFCSVVFVmZRMEpmVFVWVVNFOUVYME5QVFZCTVJWUkZBRWhRUlY5RFFsOUlSVUZFUlZKZlJrbEZURVJmUTA5TlVFeEZWRVVBUkVWTVJWUkZBRWhRUlY5SlRsWkJURWxFWDBWUFJsOVRWRUZVUlFCSlRsWkJURWxFWDFOVFRGOURSVkpVU1VaSlEwRlVSUUJRUVZWVFJRQk9UMTlTUlZOUVQwNVRSUUJWVGxOVlVGQlBVbFJGUkY5TlJVUkpRVjlVV1ZCRkFFZFBUa1VBVGs5VVgwRkRRMFZRVkVGQ1RFVUFVMFZTVmtsRFJWOVZUa0ZXUVVsTVFVSk1SUUJTUVU1SFJWOU9UMVJmVTBGVVNWTkdTVUZDVEVVQVQxSkpSMGxPWDBsVFgxVk9Va1ZCUTBoQlFreEZBRkpGVTFCUFRsTkZYMGxUWDFOVVFVeEZBRkJWVWtkRkFFMUZVa2RGQUZKRlVWVkZVMVJmU0VWQlJFVlNYMFpKUlV4RVUxOVVUMDlmVEVGU1IwVUFVa1ZSVlVWVFZGOUlSVUZFUlZKZlZFOVBYMHhCVWtkRkFGQkJXVXhQUVVSZlZFOVBYMHhCVWtkRkFFbE9VMVZHUmtsRFNVVk9WRjlUVkU5U1FVZEZBRWhRUlY5UVFWVlRSVVJmVlZCSFVrRkVSUUJJVUVWZlVFRlZVMFZFWDBneVgxVlFSMUpCUkVVQVUwOVZVa05GQUVGT1RrOVZUa05GQUZSU1FVTkZBRWhRUlY5VlRrVllVRVZEVkVWRVgxTlFRVU5GQUVSRlUwTlNTVUpGQUZWT1UxVkNVME5TU1VKRkFGSkZRMDlTUkFCSVVFVmZTVTVXUVV4SlJGOU5SVlJJVDBRQVRrOVVYMFpQVlU1RUFGQlNUMUJHU1U1RUFGVk9Ra2xPUkFCU1JVSkpUa1FBVlU1QlZWUklUMUpKV2tWRUFFMUZWRWhQUkY5T1QxUmZRVXhNVDFkRlJBQklWRlJRWDFaRlVsTkpUMDVmVGs5VVgxTlZVRkJQVWxSRlJBQkJURkpGUVVSWlgxSkZVRTlTVkVWRUFFRkRRMFZRVkVWRUFFNVBWRjlKVFZCTVJVMUZUbFJGUkFCTVQwOVFYMFJGVkVWRFZFVkVBRWhRUlY5RFVsOUZXRkJGUTFSRlJBQklVRVZmVEVaZlJWaFFSVU5VUlVRQVExSkZRVlJGUkFCSlRWOVZVMFZFQUVoUVJWOVFRVlZUUlVRQVZFbE5SVTlWVkY5UFEwTlZVa1ZFQUZCQldVMUZUbFJmVWtWUlZVbFNSVVFBVUZKRlEwOU9SRWxVU1U5T1gxSkZVVlZKVWtWRUFGQlNUMWhaWDBGVlZFaEZUbFJKUTBGVVNVOU9YMUpGVVZWSlVrVkVBRTVGVkZkUFVrdGZRVlZVU0VWT1ZFbERRVlJKVDA1ZlVrVlJWVWxTUlVRQVRFVk9SMVJJWDFKRlVWVkpVa1ZFQUZOVFRGOURSVkpVU1VaSlEwRlVSVjlTUlZGVlNWSkZSQUJWVUVkU1FVUkZYMUpGVVZWSlVrVkVBRkJCUjBWZlJWaFFTVkpGUkFCUVVrVkRUMDVFU1ZSSlQwNWZSa0ZKVEVWRUFFVllVRVZEVkVGVVNVOU9YMFpCU1V4RlJBQlNSVlpCVEVsRVFWUkpUMDVmUmtGSlRFVkVBRk5UVEY5SVFVNUVVMGhCUzBWZlJrRkpURVZFQUV4UFEwdEZSQUJVVWtGT1UwWlBVazFCVkVsUFRsOUJVRkJNU1VWRUFFNVBWRjlOVDBSSlJrbEZSQUJPVDFSZlJWaFVSVTVFUlVRQVFrRk9SRmRKUkZSSVgweEpUVWxVWDBWWVEwVkZSRVZFQUZOSlZFVmZTVk5mVDFaRlVreFBRVVJGUkFCSVJVRkVBRVY0Y0dWamRHVmtJRWhVVkZBdkFBQmVFd0FBSmhNQUFEQVFBQUR3RndBQW5STUFBQlVTQUFBNUZ3QUE4QklBQUFvUUFBQjFFZ0FBclJJQUFJSVRBQUJQRkFBQWZ4QUFBS0FWQUFBakZBQUFpUklBQUlzVUFBQk5GUUFBMUJFQUFNOFVBQUFRR0FBQXlSWUFBTndXQUFEQkVRQUE0QmNBQUxzVUFBQjBGQUFBZkJVQUFPVVVBQUFJRndBQUh4QUFBR1VWQUFDakZBQUFLQlVBQUFJVkFBQ1pGUUFBTEJBQUFJc1pBQUJQRHdBQTFBNEFBR29RQUFET0VBQUFBaGNBQUlrT0FBQnVFd0FBSEJNQUFHWVVBQUJXRndBQXdSTUFBTTBUQUFCc0V3QUFhQmNBQUdZWEFBQmZGd0FBSWhNQUFNNFBBQUJwRGdBQTJBNEFBR01XQUFETEV3QUFxZzRBQUNnWEFBQW1Gd0FBeFJNQUFGMFdBQURvRVFBQVp4TUFBR1VUQUFEeUZnQUFjeE1BQUIwWEFBRDVGZ0FBOHhFQUFNOE9BQURPRlFBQURCSUFBTE1SQUFDbEVRQUFZUkFBQURJWEFBQzdFd0JCK1RVTEFRRUFRWkEyQytBQkFRRUNBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQVFmMDNDd0VCQUVHUk9BdGVBZ01DQWdJQ0FnQUFBZ0lBQWdJQUFnSUNBZ0lDQWdJQ0FnQUVBQUFBQUFBQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdBQUFBSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBQUlBQWdCQi9Ua0xBUUVBUVpFNkMxNENBQUlDQWdJQ0FBQUNBZ0FDQWdBQ0FnSUNBZ0lDQWdJQ0FBTUFCQUFBQUFJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQUFBQUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUFBZ0FDQUVId093c05iRzl6WldWbGNDMWhiR2wyWlFCQmlUd0xBUUVBUWFBOEMrQUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQUFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUFRWWsrQ3dFQkFFR2dQZ3ZuQVFFQkFRRUJBUUVCQVFFQkFRSUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCWTJoMWJtdGxaQUJCc01BQUMxOEJBUUFCQVFFQkFRQUFBUUVBQVFFQUFRRUJBUUVCQVFFQkFRQUFBQUFBQUFBQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQUFBRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBQUVBQVFCQmtNSUFDeUZsWTNScGIyNWxiblF0YkdWdVozUm9iMjV5YjNoNUxXTnZibTVsWTNScGIyNEFRY0RDQUFzdGNtRnVjMlpsY2kxbGJtTnZaR2x1WjNCbmNtRmtaUTBLRFFvTkNsTk5EUW9OQ2xSVVVDOURSUzlVVTFBdkFFSDV3Z0FMQlFFQ0FBRURBRUdRd3dBTDRBRUVBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRQkIrY1FBQ3dVQkFnQUJBd0JCa01VQUMrQUJCQUVCQlFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQUFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUFRZm5HQUFzRUFRQUFBUUJCa2NjQUM5OEJBUUVBQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRQkIrc2dBQ3dRQkFBQUNBRUdReVFBTFh3TUVBQUFFQkFRRUJBUUVCQVFFQkFVRUJBUUVCQVFFQkFRRUJBUUFCQUFHQndRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFBRUFBUUFCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUFBQUFFQUVINnlnQUxCQUVBQUFFQVFaRExBQXNCQVFCQnFzc0FDMEVDQUFBQUFBQUFBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TUFBQUFBQUFBREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdCQitzd0FDd1FCQUFBQkFFR1F6UUFMQVFFQVFack5BQXNHQWdBQUFBQUNBRUd4elFBTE9nTURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREFBQUFBQUFBQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01BUWZET0FBdVdBVTVQVlU1RFJVVkRTMDlWVkU1RlExUkZWRVZEVWtsQ1JVeFZVMGhGVkVWQlJGTkZRVkpEU0ZKSFJVTlVTVlpKVkZsTVJVNUVRVkpXUlU5VVNVWlpVRlJKVDA1VFEwaFRSVUZaVTFSQlZFTklSMFZQVWtSSlVrVkRWRTlTVkZKRFNGQkJVa0ZOUlZSRlVsVlNRMFZDVTBOU1NVSkZRVkpFVDFkT1FVTkZTVTVFVGt0RFMxVkNVME5TU1VKRlNGUlVVQzlCUkZSUUx3PT0nLCAnYmFzZTY0JylcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb3JzU2FmZUxpc3RlZE1ldGhvZHMgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoWydHRVQnLCAnSEVBRCcsICdQT1NUJ10pXG5jb25zdCBjb3JzU2FmZUxpc3RlZE1ldGhvZHNTZXQgPSBuZXcgU2V0KGNvcnNTYWZlTGlzdGVkTWV0aG9kcylcblxuY29uc3QgbnVsbEJvZHlTdGF0dXMgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoWzEwMSwgMjA0LCAyMDUsIDMwNF0pXG5cbmNvbnN0IHJlZGlyZWN0U3RhdHVzID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFszMDEsIDMwMiwgMzAzLCAzMDcsIDMwOF0pXG5jb25zdCByZWRpcmVjdFN0YXR1c1NldCA9IG5ldyBTZXQocmVkaXJlY3RTdGF0dXMpXG5cbi8qKlxuICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jYmxvY2stYmFkLXBvcnRcbiAqL1xuY29uc3QgYmFkUG9ydHMgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoW1xuICAnMScsICc3JywgJzknLCAnMTEnLCAnMTMnLCAnMTUnLCAnMTcnLCAnMTknLCAnMjAnLCAnMjEnLCAnMjInLCAnMjMnLCAnMjUnLCAnMzcnLCAnNDInLCAnNDMnLCAnNTMnLCAnNjknLCAnNzcnLCAnNzknLFxuICAnODcnLCAnOTUnLCAnMTAxJywgJzEwMicsICcxMDMnLCAnMTA0JywgJzEwOScsICcxMTAnLCAnMTExJywgJzExMycsICcxMTUnLCAnMTE3JywgJzExOScsICcxMjMnLCAnMTM1JywgJzEzNycsXG4gICcxMzknLCAnMTQzJywgJzE2MScsICcxNzknLCAnMzg5JywgJzQyNycsICc0NjUnLCAnNTEyJywgJzUxMycsICc1MTQnLCAnNTE1JywgJzUyNicsICc1MzAnLCAnNTMxJywgJzUzMicsXG4gICc1NDAnLCAnNTQ4JywgJzU1NCcsICc1NTYnLCAnNTYzJywgJzU4NycsICc2MDEnLCAnNjM2JywgJzk4OScsICc5OTAnLCAnOTkzJywgJzk5NScsICcxNzE5JywgJzE3MjAnLCAnMTcyMycsXG4gICcyMDQ5JywgJzM2NTknLCAnNDA0NScsICc0MTkwJywgJzUwNjAnLCAnNTA2MScsICc2MDAwJywgJzY1NjYnLCAnNjY2NScsICc2NjY2JywgJzY2NjcnLCAnNjY2OCcsICc2NjY5JywgJzY2NzknLFxuICAnNjY5NycsICcxMDA4MCdcbl0pXG5jb25zdCBiYWRQb3J0c1NldCA9IG5ldyBTZXQoYmFkUG9ydHMpXG5cbi8qKlxuICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLXJlZmVycmVyLXBvbGljeS8jcmVmZXJyZXItcG9saWNpZXNcbiAqL1xuY29uc3QgcmVmZXJyZXJQb2xpY3kgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoW1xuICAnJyxcbiAgJ25vLXJlZmVycmVyJyxcbiAgJ25vLXJlZmVycmVyLXdoZW4tZG93bmdyYWRlJyxcbiAgJ3NhbWUtb3JpZ2luJyxcbiAgJ29yaWdpbicsXG4gICdzdHJpY3Qtb3JpZ2luJyxcbiAgJ29yaWdpbi13aGVuLWNyb3NzLW9yaWdpbicsXG4gICdzdHJpY3Qtb3JpZ2luLXdoZW4tY3Jvc3Mtb3JpZ2luJyxcbiAgJ3Vuc2FmZS11cmwnXG5dKVxuY29uc3QgcmVmZXJyZXJQb2xpY3lTZXQgPSBuZXcgU2V0KHJlZmVycmVyUG9saWN5KVxuXG5jb25zdCByZXF1ZXN0UmVkaXJlY3QgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoWydmb2xsb3cnLCAnbWFudWFsJywgJ2Vycm9yJ10pXG5cbmNvbnN0IHNhZmVNZXRob2RzID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFsnR0VUJywgJ0hFQUQnLCAnT1BUSU9OUycsICdUUkFDRSddKVxuY29uc3Qgc2FmZU1ldGhvZHNTZXQgPSBuZXcgU2V0KHNhZmVNZXRob2RzKVxuXG5jb25zdCByZXF1ZXN0TW9kZSA9IC8qKiBAdHlwZSB7Y29uc3R9ICovIChbJ25hdmlnYXRlJywgJ3NhbWUtb3JpZ2luJywgJ25vLWNvcnMnLCAnY29ycyddKVxuXG5jb25zdCByZXF1ZXN0Q3JlZGVudGlhbHMgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoWydvbWl0JywgJ3NhbWUtb3JpZ2luJywgJ2luY2x1ZGUnXSlcblxuY29uc3QgcmVxdWVzdENhY2hlID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFtcbiAgJ2RlZmF1bHQnLFxuICAnbm8tc3RvcmUnLFxuICAncmVsb2FkJyxcbiAgJ25vLWNhY2hlJyxcbiAgJ2ZvcmNlLWNhY2hlJyxcbiAgJ29ubHktaWYtY2FjaGVkJ1xuXSlcblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXF1ZXN0LWJvZHktaGVhZGVyLW5hbWVcbiAqL1xuY29uc3QgcmVxdWVzdEJvZHlIZWFkZXIgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoW1xuICAnY29udGVudC1lbmNvZGluZycsXG4gICdjb250ZW50LWxhbmd1YWdlJyxcbiAgJ2NvbnRlbnQtbG9jYXRpb24nLFxuICAnY29udGVudC10eXBlJyxcbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2lzc3Vlcy8yMDIxXG4gIC8vICdDb250ZW50LUxlbmd0aCcgaXMgYSBmb3JiaWRkZW4gaGVhZGVyIG5hbWUsIHdoaWNoIGlzIHR5cGljYWxseVxuICAvLyByZW1vdmVkIGluIHRoZSBIZWFkZXJzIGltcGxlbWVudGF0aW9uLiBIb3dldmVyLCB1bmRpY2kgZG9lc24ndFxuICAvLyBmaWx0ZXIgb3V0IGhlYWRlcnMsIHNvIHdlIGFkZCBpdCBoZXJlLlxuICAnY29udGVudC1sZW5ndGgnXG5dKVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2VudW1kZWYtcmVxdWVzdGR1cGxleFxuICovXG5jb25zdCByZXF1ZXN0RHVwbGV4ID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFtcbiAgJ2hhbGYnXG5dKVxuXG4vKipcbiAqIEBzZWUgaHR0cDovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZm9yYmlkZGVuLW1ldGhvZFxuICovXG5jb25zdCBmb3JiaWRkZW5NZXRob2RzID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFsnQ09OTkVDVCcsICdUUkFDRScsICdUUkFDSyddKVxuY29uc3QgZm9yYmlkZGVuTWV0aG9kc1NldCA9IG5ldyBTZXQoZm9yYmlkZGVuTWV0aG9kcylcblxuY29uc3Qgc3VicmVzb3VyY2UgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoW1xuICAnYXVkaW8nLFxuICAnYXVkaW93b3JrbGV0JyxcbiAgJ2ZvbnQnLFxuICAnaW1hZ2UnLFxuICAnbWFuaWZlc3QnLFxuICAncGFpbnR3b3JrbGV0JyxcbiAgJ3NjcmlwdCcsXG4gICdzdHlsZScsXG4gICd0cmFjaycsXG4gICd2aWRlbycsXG4gICd4c2x0JyxcbiAgJydcbl0pXG5jb25zdCBzdWJyZXNvdXJjZVNldCA9IG5ldyBTZXQoc3VicmVzb3VyY2UpXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzdWJyZXNvdXJjZSxcbiAgZm9yYmlkZGVuTWV0aG9kcyxcbiAgcmVxdWVzdEJvZHlIZWFkZXIsXG4gIHJlZmVycmVyUG9saWN5LFxuICByZXF1ZXN0UmVkaXJlY3QsXG4gIHJlcXVlc3RNb2RlLFxuICByZXF1ZXN0Q3JlZGVudGlhbHMsXG4gIHJlcXVlc3RDYWNoZSxcbiAgcmVkaXJlY3RTdGF0dXMsXG4gIGNvcnNTYWZlTGlzdGVkTWV0aG9kcyxcbiAgbnVsbEJvZHlTdGF0dXMsXG4gIHNhZmVNZXRob2RzLFxuICBiYWRQb3J0cyxcbiAgcmVxdWVzdER1cGxleCxcbiAgc3VicmVzb3VyY2VTZXQsXG4gIGJhZFBvcnRzU2V0LFxuICByZWRpcmVjdFN0YXR1c1NldCxcbiAgY29yc1NhZmVMaXN0ZWRNZXRob2RzU2V0LFxuICBzYWZlTWV0aG9kc1NldCxcbiAgZm9yYmlkZGVuTWV0aG9kc1NldCxcbiAgcmVmZXJyZXJQb2xpY3lTZXRcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG4vLyBJbiBjYXNlIG9mIGJyZWFraW5nIGNoYW5nZXMsIGluY3JlYXNlIHRoZSB2ZXJzaW9uXG4vLyBudW1iZXIgdG8gYXZvaWQgY29uZmxpY3RzLlxuY29uc3QgZ2xvYmFsT3JpZ2luID0gU3ltYm9sLmZvcigndW5kaWNpLmdsb2JhbE9yaWdpbi4xJylcblxuZnVuY3Rpb24gZ2V0R2xvYmFsT3JpZ2luICgpIHtcbiAgcmV0dXJuIGdsb2JhbFRoaXNbZ2xvYmFsT3JpZ2luXVxufVxuXG5mdW5jdGlvbiBzZXRHbG9iYWxPcmlnaW4gKG5ld09yaWdpbikge1xuICBpZiAobmV3T3JpZ2luID09PSB1bmRlZmluZWQpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZ2xvYmFsVGhpcywgZ2xvYmFsT3JpZ2luLCB7XG4gICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2VcbiAgICB9KVxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBwYXJzZWRVUkwgPSBuZXcgVVJMKG5ld09yaWdpbilcblxuICBpZiAocGFyc2VkVVJMLnByb3RvY29sICE9PSAnaHR0cDonICYmIHBhcnNlZFVSTC5wcm90b2NvbCAhPT0gJ2h0dHBzOicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBPbmx5IGh0dHAgJiBodHRwcyB1cmxzIGFyZSBhbGxvd2VkLCByZWNlaXZlZCAke3BhcnNlZFVSTC5wcm90b2NvbH1gKVxuICB9XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbFRoaXMsIGdsb2JhbE9yaWdpbiwge1xuICAgIHZhbHVlOiBwYXJzZWRVUkwsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZVxuICB9KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0R2xvYmFsT3JpZ2luLFxuICBzZXRHbG9iYWxPcmlnaW5cbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdub2RlOmFzc2VydCcpXG5cbmNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9taW1lc25pZmYuc3BlYy53aGF0d2cub3JnLyNodHRwLXRva2VuLWNvZGUtcG9pbnRcbiAqL1xuY29uc3QgSFRUUF9UT0tFTl9DT0RFUE9JTlRTID0gL15bISMkJSYnKitcXC0uXl98fkEtWmEtejAtOV0rJC9cbmNvbnN0IEhUVFBfV0hJVEVTUEFDRV9SRUdFWCA9IC9bXFx1MDAwQVxcdTAwMERcXHUwMDA5XFx1MDAyMF0vIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbmNvbnN0IEFTQ0lJX1dISVRFU1BBQ0VfUkVQTEFDRV9SRUdFWCA9IC9bXFx1MDAwOVxcdTAwMEFcXHUwMDBDXFx1MDAwRFxcdTAwMjBdL2cgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vbWltZXNuaWZmLnNwZWMud2hhdHdnLm9yZy8jaHR0cC1xdW90ZWQtc3RyaW5nLXRva2VuLWNvZGUtcG9pbnRcbiAqL1xuY29uc3QgSFRUUF9RVU9URURfU1RSSU5HX1RPS0VOUyA9IC9eW1xcdTAwMDlcXHUwMDIwLVxcdTAwN0VcXHUwMDgwLVxcdTAwRkZdKyQvIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RhdGEtdXJsLXByb2Nlc3NvclxuLyoqIEBwYXJhbSB7VVJMfSBkYXRhVVJMICovXG5mdW5jdGlvbiBkYXRhVVJMUHJvY2Vzc29yIChkYXRhVVJMKSB7XG4gIC8vIDEuIEFzc2VydDogZGF0YVVSTOKAmXMgc2NoZW1lIGlzIFwiZGF0YVwiLlxuICBhc3NlcnQoZGF0YVVSTC5wcm90b2NvbCA9PT0gJ2RhdGE6JylcblxuICAvLyAyLiBMZXQgaW5wdXQgYmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nIHRoZSBVUkxcbiAgLy8gc2VyaWFsaXplciBvbiBkYXRhVVJMIHdpdGggZXhjbHVkZSBmcmFnbWVudFxuICAvLyBzZXQgdG8gdHJ1ZS5cbiAgbGV0IGlucHV0ID0gVVJMU2VyaWFsaXplcihkYXRhVVJMLCB0cnVlKVxuXG4gIC8vIDMuIFJlbW92ZSB0aGUgbGVhZGluZyBcImRhdGE6XCIgc3RyaW5nIGZyb20gaW5wdXQuXG4gIGlucHV0ID0gaW5wdXQuc2xpY2UoNSlcblxuICAvLyA0LiBMZXQgcG9zaXRpb24gcG9pbnQgYXQgdGhlIHN0YXJ0IG9mIGlucHV0LlxuICBjb25zdCBwb3NpdGlvbiA9IHsgcG9zaXRpb246IDAgfVxuXG4gIC8vIDUuIExldCBtaW1lVHlwZSBiZSB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmcgYVxuICAvLyBzZXF1ZW5jZSBvZiBjb2RlIHBvaW50cyB0aGF0IGFyZSBub3QgZXF1YWxcbiAgLy8gdG8gVSswMDJDICgsKSwgZ2l2ZW4gcG9zaXRpb24uXG4gIGxldCBtaW1lVHlwZSA9IGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0KFxuICAgICcsJyxcbiAgICBpbnB1dCxcbiAgICBwb3NpdGlvblxuICApXG5cbiAgLy8gNi4gU3RyaXAgbGVhZGluZyBhbmQgdHJhaWxpbmcgQVNDSUkgd2hpdGVzcGFjZVxuICAvLyBmcm9tIG1pbWVUeXBlLlxuICAvLyBVbmRpY2kgaW1wbGVtZW50YXRpb24gbm90ZTogd2UgbmVlZCB0byBzdG9yZSB0aGVcbiAgLy8gbGVuZ3RoIGJlY2F1c2UgaWYgdGhlIG1pbWV0eXBlIGhhcyBzcGFjZXMgcmVtb3ZlZCxcbiAgLy8gdGhlIHdyb25nIGFtb3VudCB3aWxsIGJlIHNsaWNlZCBmcm9tIHRoZSBpbnB1dCBpblxuICAvLyBzdGVwICM5XG4gIGNvbnN0IG1pbWVUeXBlTGVuZ3RoID0gbWltZVR5cGUubGVuZ3RoXG4gIG1pbWVUeXBlID0gcmVtb3ZlQVNDSUlXaGl0ZXNwYWNlKG1pbWVUeXBlLCB0cnVlLCB0cnVlKVxuXG4gIC8vIDcuIElmIHBvc2l0aW9uIGlzIHBhc3QgdGhlIGVuZCBvZiBpbnB1dCwgdGhlblxuICAvLyByZXR1cm4gZmFpbHVyZVxuICBpZiAocG9zaXRpb24ucG9zaXRpb24gPj0gaW5wdXQubGVuZ3RoKSB7XG4gICAgcmV0dXJuICdmYWlsdXJlJ1xuICB9XG5cbiAgLy8gOC4gQWR2YW5jZSBwb3NpdGlvbiBieSAxLlxuICBwb3NpdGlvbi5wb3NpdGlvbisrXG5cbiAgLy8gOS4gTGV0IGVuY29kZWRCb2R5IGJlIHRoZSByZW1haW5kZXIgb2YgaW5wdXQuXG4gIGNvbnN0IGVuY29kZWRCb2R5ID0gaW5wdXQuc2xpY2UobWltZVR5cGVMZW5ndGggKyAxKVxuXG4gIC8vIDEwLiBMZXQgYm9keSBiZSB0aGUgcGVyY2VudC1kZWNvZGluZyBvZiBlbmNvZGVkQm9keS5cbiAgbGV0IGJvZHkgPSBzdHJpbmdQZXJjZW50RGVjb2RlKGVuY29kZWRCb2R5KVxuXG4gIC8vIDExLiBJZiBtaW1lVHlwZSBlbmRzIHdpdGggVSswMDNCICg7KSwgZm9sbG93ZWQgYnlcbiAgLy8gemVybyBvciBtb3JlIFUrMDAyMCBTUEFDRSwgZm9sbG93ZWQgYnkgYW4gQVNDSUlcbiAgLy8gY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBmb3IgXCJiYXNlNjRcIiwgdGhlbjpcbiAgaWYgKC87KFxcdTAwMjApezAsfWJhc2U2NCQvaS50ZXN0KG1pbWVUeXBlKSkge1xuICAgIC8vIDEuIExldCBzdHJpbmdCb2R5IGJlIHRoZSBpc29tb3JwaGljIGRlY29kZSBvZiBib2R5LlxuICAgIGNvbnN0IHN0cmluZ0JvZHkgPSBpc29tb3JwaGljRGVjb2RlKGJvZHkpXG5cbiAgICAvLyAyLiBTZXQgYm9keSB0byB0aGUgZm9yZ2l2aW5nLWJhc2U2NCBkZWNvZGUgb2ZcbiAgICAvLyBzdHJpbmdCb2R5LlxuICAgIGJvZHkgPSBmb3JnaXZpbmdCYXNlNjQoc3RyaW5nQm9keSlcblxuICAgIC8vIDMuIElmIGJvZHkgaXMgZmFpbHVyZSwgdGhlbiByZXR1cm4gZmFpbHVyZS5cbiAgICBpZiAoYm9keSA9PT0gJ2ZhaWx1cmUnKSB7XG4gICAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gICAgfVxuXG4gICAgLy8gNC4gUmVtb3ZlIHRoZSBsYXN0IDYgY29kZSBwb2ludHMgZnJvbSBtaW1lVHlwZS5cbiAgICBtaW1lVHlwZSA9IG1pbWVUeXBlLnNsaWNlKDAsIC02KVxuXG4gICAgLy8gNS4gUmVtb3ZlIHRyYWlsaW5nIFUrMDAyMCBTUEFDRSBjb2RlIHBvaW50cyBmcm9tIG1pbWVUeXBlLFxuICAgIC8vIGlmIGFueS5cbiAgICBtaW1lVHlwZSA9IG1pbWVUeXBlLnJlcGxhY2UoLyhcXHUwMDIwKSskLywgJycpXG5cbiAgICAvLyA2LiBSZW1vdmUgdGhlIGxhc3QgVSswMDNCICg7KSBjb2RlIHBvaW50IGZyb20gbWltZVR5cGUuXG4gICAgbWltZVR5cGUgPSBtaW1lVHlwZS5zbGljZSgwLCAtMSlcbiAgfVxuXG4gIC8vIDEyLiBJZiBtaW1lVHlwZSBzdGFydHMgd2l0aCBVKzAwM0IgKDspLCB0aGVuIHByZXBlbmRcbiAgLy8gXCJ0ZXh0L3BsYWluXCIgdG8gbWltZVR5cGUuXG4gIGlmIChtaW1lVHlwZS5zdGFydHNXaXRoKCc7JykpIHtcbiAgICBtaW1lVHlwZSA9ICd0ZXh0L3BsYWluJyArIG1pbWVUeXBlXG4gIH1cblxuICAvLyAxMy4gTGV0IG1pbWVUeXBlUmVjb3JkIGJlIHRoZSByZXN1bHQgb2YgcGFyc2luZ1xuICAvLyBtaW1lVHlwZS5cbiAgbGV0IG1pbWVUeXBlUmVjb3JkID0gcGFyc2VNSU1FVHlwZShtaW1lVHlwZSlcblxuICAvLyAxNC4gSWYgbWltZVR5cGVSZWNvcmQgaXMgZmFpbHVyZSwgdGhlbiBzZXRcbiAgLy8gbWltZVR5cGVSZWNvcmQgdG8gdGV4dC9wbGFpbjtjaGFyc2V0PVVTLUFTQ0lJLlxuICBpZiAobWltZVR5cGVSZWNvcmQgPT09ICdmYWlsdXJlJykge1xuICAgIG1pbWVUeXBlUmVjb3JkID0gcGFyc2VNSU1FVHlwZSgndGV4dC9wbGFpbjtjaGFyc2V0PVVTLUFTQ0lJJylcbiAgfVxuXG4gIC8vIDE1LiBSZXR1cm4gYSBuZXcgZGF0YTogVVJMIHN0cnVjdCB3aG9zZSBNSU1FXG4gIC8vIHR5cGUgaXMgbWltZVR5cGVSZWNvcmQgYW5kIGJvZHkgaXMgYm9keS5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RhdGEtdXJsLXN0cnVjdFxuICByZXR1cm4geyBtaW1lVHlwZTogbWltZVR5cGVSZWNvcmQsIGJvZHkgfVxufVxuXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtdXJsLXNlcmlhbGl6ZXJcbi8qKlxuICogQHBhcmFtIHtVUkx9IHVybFxuICogQHBhcmFtIHtib29sZWFufSBleGNsdWRlRnJhZ21lbnRcbiAqL1xuZnVuY3Rpb24gVVJMU2VyaWFsaXplciAodXJsLCBleGNsdWRlRnJhZ21lbnQgPSBmYWxzZSkge1xuICBpZiAoIWV4Y2x1ZGVGcmFnbWVudCkge1xuICAgIHJldHVybiB1cmwuaHJlZlxuICB9XG5cbiAgY29uc3QgaHJlZiA9IHVybC5ocmVmXG4gIGNvbnN0IGhhc2hMZW5ndGggPSB1cmwuaGFzaC5sZW5ndGhcblxuICBjb25zdCBzZXJpYWxpemVkID0gaGFzaExlbmd0aCA9PT0gMCA/IGhyZWYgOiBocmVmLnN1YnN0cmluZygwLCBocmVmLmxlbmd0aCAtIGhhc2hMZW5ndGgpXG5cbiAgaWYgKCFoYXNoTGVuZ3RoICYmIGhyZWYuZW5kc1dpdGgoJyMnKSkge1xuICAgIHJldHVybiBzZXJpYWxpemVkLnNsaWNlKDAsIC0xKVxuICB9XG5cbiAgcmV0dXJuIHNlcmlhbGl6ZWRcbn1cblxuLy8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI2NvbGxlY3QtYS1zZXF1ZW5jZS1vZi1jb2RlLXBvaW50c1xuLyoqXG4gKiBAcGFyYW0geyhjaGFyOiBzdHJpbmcpID0+IGJvb2xlYW59IGNvbmRpdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0XG4gKiBAcGFyYW0ge3sgcG9zaXRpb246IG51bWJlciB9fSBwb3NpdGlvblxuICovXG5mdW5jdGlvbiBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzIChjb25kaXRpb24sIGlucHV0LCBwb3NpdGlvbikge1xuICAvLyAxLiBMZXQgcmVzdWx0IGJlIHRoZSBlbXB0eSBzdHJpbmcuXG4gIGxldCByZXN1bHQgPSAnJ1xuXG4gIC8vIDIuIFdoaWxlIHBvc2l0aW9uIGRvZXNu4oCZdCBwb2ludCBwYXN0IHRoZSBlbmQgb2YgaW5wdXQgYW5kIHRoZVxuICAvLyBjb2RlIHBvaW50IGF0IHBvc2l0aW9uIHdpdGhpbiBpbnB1dCBtZWV0cyB0aGUgY29uZGl0aW9uIGNvbmRpdGlvbjpcbiAgd2hpbGUgKHBvc2l0aW9uLnBvc2l0aW9uIDwgaW5wdXQubGVuZ3RoICYmIGNvbmRpdGlvbihpbnB1dFtwb3NpdGlvbi5wb3NpdGlvbl0pKSB7XG4gICAgLy8gMS4gQXBwZW5kIHRoYXQgY29kZSBwb2ludCB0byB0aGUgZW5kIG9mIHJlc3VsdC5cbiAgICByZXN1bHQgKz0gaW5wdXRbcG9zaXRpb24ucG9zaXRpb25dXG5cbiAgICAvLyAyLiBBZHZhbmNlIHBvc2l0aW9uIGJ5IDEuXG4gICAgcG9zaXRpb24ucG9zaXRpb24rK1xuICB9XG5cbiAgLy8gMy4gUmV0dXJuIHJlc3VsdC5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIEEgZmFzdGVyIGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHMgdGhhdCBvbmx5IHdvcmtzIHdoZW4gY29tcGFyaW5nIGEgc2luZ2xlIGNoYXJhY3Rlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGFyXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXRcbiAqIEBwYXJhbSB7eyBwb3NpdGlvbjogbnVtYmVyIH19IHBvc2l0aW9uXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0IChjaGFyLCBpbnB1dCwgcG9zaXRpb24pIHtcbiAgY29uc3QgaWR4ID0gaW5wdXQuaW5kZXhPZihjaGFyLCBwb3NpdGlvbi5wb3NpdGlvbilcbiAgY29uc3Qgc3RhcnQgPSBwb3NpdGlvbi5wb3NpdGlvblxuXG4gIGlmIChpZHggPT09IC0xKSB7XG4gICAgcG9zaXRpb24ucG9zaXRpb24gPSBpbnB1dC5sZW5ndGhcbiAgICByZXR1cm4gaW5wdXQuc2xpY2Uoc3RhcnQpXG4gIH1cblxuICBwb3NpdGlvbi5wb3NpdGlvbiA9IGlkeFxuICByZXR1cm4gaW5wdXQuc2xpY2Uoc3RhcnQsIHBvc2l0aW9uLnBvc2l0aW9uKVxufVxuXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3N0cmluZy1wZXJjZW50LWRlY29kZVxuLyoqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCAqL1xuZnVuY3Rpb24gc3RyaW5nUGVyY2VudERlY29kZSAoaW5wdXQpIHtcbiAgLy8gMS4gTGV0IGJ5dGVzIGJlIHRoZSBVVEYtOCBlbmNvZGluZyBvZiBpbnB1dC5cbiAgY29uc3QgYnl0ZXMgPSBlbmNvZGVyLmVuY29kZShpbnB1dClcblxuICAvLyAyLiBSZXR1cm4gdGhlIHBlcmNlbnQtZGVjb2Rpbmcgb2YgYnl0ZXMuXG4gIHJldHVybiBwZXJjZW50RGVjb2RlKGJ5dGVzKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBieXRlXG4gKi9cbmZ1bmN0aW9uIGlzSGV4Q2hhckJ5dGUgKGJ5dGUpIHtcbiAgLy8gMC05IEEtRiBhLWZcbiAgcmV0dXJuIChieXRlID49IDB4MzAgJiYgYnl0ZSA8PSAweDM5KSB8fCAoYnl0ZSA+PSAweDQxICYmIGJ5dGUgPD0gMHg0NikgfHwgKGJ5dGUgPj0gMHg2MSAmJiBieXRlIDw9IDB4NjYpXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGJ5dGVcbiAqL1xuZnVuY3Rpb24gaGV4Qnl0ZVRvTnVtYmVyIChieXRlKSB7XG4gIHJldHVybiAoXG4gICAgLy8gMC05XG4gICAgYnl0ZSA+PSAweDMwICYmIGJ5dGUgPD0gMHgzOVxuICAgICAgPyAoYnl0ZSAtIDQ4KVxuICAgIC8vIENvbnZlcnQgdG8gdXBwZXJjYXNlXG4gICAgLy8gKChieXRlICYgMHhERikgLSA2NSkgKyAxMFxuICAgICAgOiAoKGJ5dGUgJiAweERGKSAtIDU1KVxuICApXG59XG5cbi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jcGVyY2VudC1kZWNvZGVcbi8qKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGlucHV0ICovXG5mdW5jdGlvbiBwZXJjZW50RGVjb2RlIChpbnB1dCkge1xuICBjb25zdCBsZW5ndGggPSBpbnB1dC5sZW5ndGhcbiAgLy8gMS4gTGV0IG91dHB1dCBiZSBhbiBlbXB0eSBieXRlIHNlcXVlbmNlLlxuICAvKiogQHR5cGUge1VpbnQ4QXJyYXl9ICovXG4gIGNvbnN0IG91dHB1dCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcbiAgbGV0IGogPSAwXG4gIC8vIDIuIEZvciBlYWNoIGJ5dGUgYnl0ZSBpbiBpbnB1dDpcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IGJ5dGUgPSBpbnB1dFtpXVxuXG4gICAgLy8gMS4gSWYgYnl0ZSBpcyBub3QgMHgyNSAoJSksIHRoZW4gYXBwZW5kIGJ5dGUgdG8gb3V0cHV0LlxuICAgIGlmIChieXRlICE9PSAweDI1KSB7XG4gICAgICBvdXRwdXRbaisrXSA9IGJ5dGVcblxuICAgIC8vIDIuIE90aGVyd2lzZSwgaWYgYnl0ZSBpcyAweDI1ICglKSBhbmQgdGhlIG5leHQgdHdvIGJ5dGVzXG4gICAgLy8gYWZ0ZXIgYnl0ZSBpbiBpbnB1dCBhcmUgbm90IGluIHRoZSByYW5nZXNcbiAgICAvLyAweDMwICgwKSB0byAweDM5ICg5KSwgMHg0MSAoQSkgdG8gMHg0NiAoRiksXG4gICAgLy8gYW5kIDB4NjEgKGEpIHRvIDB4NjYgKGYpLCBhbGwgaW5jbHVzaXZlLCBhcHBlbmQgYnl0ZVxuICAgIC8vIHRvIG91dHB1dC5cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgYnl0ZSA9PT0gMHgyNSAmJlxuICAgICAgIShpc0hleENoYXJCeXRlKGlucHV0W2kgKyAxXSkgJiYgaXNIZXhDaGFyQnl0ZShpbnB1dFtpICsgMl0pKVxuICAgICkge1xuICAgICAgb3V0cHV0W2orK10gPSAweDI1XG5cbiAgICAvLyAzLiBPdGhlcndpc2U6XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDEuIExldCBieXRlUG9pbnQgYmUgdGhlIHR3byBieXRlcyBhZnRlciBieXRlIGluIGlucHV0LFxuICAgICAgLy8gZGVjb2RlZCwgYW5kIHRoZW4gaW50ZXJwcmV0ZWQgYXMgaGV4YWRlY2ltYWwgbnVtYmVyLlxuICAgICAgLy8gMi4gQXBwZW5kIGEgYnl0ZSB3aG9zZSB2YWx1ZSBpcyBieXRlUG9pbnQgdG8gb3V0cHV0LlxuICAgICAgb3V0cHV0W2orK10gPSAoaGV4Qnl0ZVRvTnVtYmVyKGlucHV0W2kgKyAxXSkgPDwgNCkgfCBoZXhCeXRlVG9OdW1iZXIoaW5wdXRbaSArIDJdKVxuXG4gICAgICAvLyAzLiBTa2lwIHRoZSBuZXh0IHR3byBieXRlcyBpbiBpbnB1dC5cbiAgICAgIGkgKz0gMlxuICAgIH1cbiAgfVxuXG4gIC8vIDMuIFJldHVybiBvdXRwdXQuXG4gIHJldHVybiBsZW5ndGggPT09IGogPyBvdXRwdXQgOiBvdXRwdXQuc3ViYXJyYXkoMCwgailcbn1cblxuLy8gaHR0cHM6Ly9taW1lc25pZmYuc3BlYy53aGF0d2cub3JnLyNwYXJzZS1hLW1pbWUtdHlwZVxuLyoqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCAqL1xuZnVuY3Rpb24gcGFyc2VNSU1FVHlwZSAoaW5wdXQpIHtcbiAgLy8gMS4gUmVtb3ZlIGFueSBsZWFkaW5nIGFuZCB0cmFpbGluZyBIVFRQIHdoaXRlc3BhY2VcbiAgLy8gZnJvbSBpbnB1dC5cbiAgaW5wdXQgPSByZW1vdmVIVFRQV2hpdGVzcGFjZShpbnB1dCwgdHJ1ZSwgdHJ1ZSlcblxuICAvLyAyLiBMZXQgcG9zaXRpb24gYmUgYSBwb3NpdGlvbiB2YXJpYWJsZSBmb3IgaW5wdXQsXG4gIC8vIGluaXRpYWxseSBwb2ludGluZyBhdCB0aGUgc3RhcnQgb2YgaW5wdXQuXG4gIGNvbnN0IHBvc2l0aW9uID0geyBwb3NpdGlvbjogMCB9XG5cbiAgLy8gMy4gTGV0IHR5cGUgYmUgdGhlIHJlc3VsdCBvZiBjb2xsZWN0aW5nIGEgc2VxdWVuY2VcbiAgLy8gb2YgY29kZSBwb2ludHMgdGhhdCBhcmUgbm90IFUrMDAyRiAoLykgZnJvbVxuICAvLyBpbnB1dCwgZ2l2ZW4gcG9zaXRpb24uXG4gIGNvbnN0IHR5cGUgPSBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzRmFzdChcbiAgICAnLycsXG4gICAgaW5wdXQsXG4gICAgcG9zaXRpb25cbiAgKVxuXG4gIC8vIDQuIElmIHR5cGUgaXMgdGhlIGVtcHR5IHN0cmluZyBvciBkb2VzIG5vdCBzb2xlbHlcbiAgLy8gY29udGFpbiBIVFRQIHRva2VuIGNvZGUgcG9pbnRzLCB0aGVuIHJldHVybiBmYWlsdXJlLlxuICAvLyBodHRwczovL21pbWVzbmlmZi5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtdG9rZW4tY29kZS1wb2ludFxuICBpZiAodHlwZS5sZW5ndGggPT09IDAgfHwgIUhUVFBfVE9LRU5fQ09ERVBPSU5UUy50ZXN0KHR5cGUpKSB7XG4gICAgcmV0dXJuICdmYWlsdXJlJ1xuICB9XG5cbiAgLy8gNS4gSWYgcG9zaXRpb24gaXMgcGFzdCB0aGUgZW5kIG9mIGlucHV0LCB0aGVuIHJldHVyblxuICAvLyBmYWlsdXJlXG4gIGlmIChwb3NpdGlvbi5wb3NpdGlvbiA+IGlucHV0Lmxlbmd0aCkge1xuICAgIHJldHVybiAnZmFpbHVyZSdcbiAgfVxuXG4gIC8vIDYuIEFkdmFuY2UgcG9zaXRpb24gYnkgMS4gKFRoaXMgc2tpcHMgcGFzdCBVKzAwMkYgKC8pLilcbiAgcG9zaXRpb24ucG9zaXRpb24rK1xuXG4gIC8vIDcuIExldCBzdWJ0eXBlIGJlIHRoZSByZXN1bHQgb2YgY29sbGVjdGluZyBhIHNlcXVlbmNlIG9mXG4gIC8vIGNvZGUgcG9pbnRzIHRoYXQgYXJlIG5vdCBVKzAwM0IgKDspIGZyb20gaW5wdXQsIGdpdmVuXG4gIC8vIHBvc2l0aW9uLlxuICBsZXQgc3VidHlwZSA9IGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0KFxuICAgICc7JyxcbiAgICBpbnB1dCxcbiAgICBwb3NpdGlvblxuICApXG5cbiAgLy8gOC4gUmVtb3ZlIGFueSB0cmFpbGluZyBIVFRQIHdoaXRlc3BhY2UgZnJvbSBzdWJ0eXBlLlxuICBzdWJ0eXBlID0gcmVtb3ZlSFRUUFdoaXRlc3BhY2Uoc3VidHlwZSwgZmFsc2UsIHRydWUpXG5cbiAgLy8gOS4gSWYgc3VidHlwZSBpcyB0aGUgZW1wdHkgc3RyaW5nIG9yIGRvZXMgbm90IHNvbGVseVxuICAvLyBjb250YWluIEhUVFAgdG9rZW4gY29kZSBwb2ludHMsIHRoZW4gcmV0dXJuIGZhaWx1cmUuXG4gIGlmIChzdWJ0eXBlLmxlbmd0aCA9PT0gMCB8fCAhSFRUUF9UT0tFTl9DT0RFUE9JTlRTLnRlc3Qoc3VidHlwZSkpIHtcbiAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gIH1cblxuICBjb25zdCB0eXBlTG93ZXJjYXNlID0gdHlwZS50b0xvd2VyQ2FzZSgpXG4gIGNvbnN0IHN1YnR5cGVMb3dlcmNhc2UgPSBzdWJ0eXBlLnRvTG93ZXJDYXNlKClcblxuICAvLyAxMC4gTGV0IG1pbWVUeXBlIGJlIGEgbmV3IE1JTUUgdHlwZSByZWNvcmQgd2hvc2UgdHlwZVxuICAvLyBpcyB0eXBlLCBpbiBBU0NJSSBsb3dlcmNhc2UsIGFuZCBzdWJ0eXBlIGlzIHN1YnR5cGUsXG4gIC8vIGluIEFTQ0lJIGxvd2VyY2FzZS5cbiAgLy8gaHR0cHM6Ly9taW1lc25pZmYuc3BlYy53aGF0d2cub3JnLyNtaW1lLXR5cGVcbiAgY29uc3QgbWltZVR5cGUgPSB7XG4gICAgdHlwZTogdHlwZUxvd2VyY2FzZSxcbiAgICBzdWJ0eXBlOiBzdWJ0eXBlTG93ZXJjYXNlLFxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgICBwYXJhbWV0ZXJzOiBuZXcgTWFwKCksXG4gICAgLy8gaHR0cHM6Ly9taW1lc25pZmYuc3BlYy53aGF0d2cub3JnLyNtaW1lLXR5cGUtZXNzZW5jZVxuICAgIGVzc2VuY2U6IGAke3R5cGVMb3dlcmNhc2V9LyR7c3VidHlwZUxvd2VyY2FzZX1gXG4gIH1cblxuICAvLyAxMS4gV2hpbGUgcG9zaXRpb24gaXMgbm90IHBhc3QgdGhlIGVuZCBvZiBpbnB1dDpcbiAgd2hpbGUgKHBvc2l0aW9uLnBvc2l0aW9uIDwgaW5wdXQubGVuZ3RoKSB7XG4gICAgLy8gMS4gQWR2YW5jZSBwb3NpdGlvbiBieSAxLiAoVGhpcyBza2lwcyBwYXN0IFUrMDAzQiAoOykuKVxuICAgIHBvc2l0aW9uLnBvc2l0aW9uKytcblxuICAgIC8vIDIuIENvbGxlY3QgYSBzZXF1ZW5jZSBvZiBjb2RlIHBvaW50cyB0aGF0IGFyZSBIVFRQXG4gICAgLy8gd2hpdGVzcGFjZSBmcm9tIGlucHV0IGdpdmVuIHBvc2l0aW9uLlxuICAgIGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHMoXG4gICAgICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaHR0cC13aGl0ZXNwYWNlXG4gICAgICBjaGFyID0+IEhUVFBfV0hJVEVTUEFDRV9SRUdFWC50ZXN0KGNoYXIpLFxuICAgICAgaW5wdXQsXG4gICAgICBwb3NpdGlvblxuICAgIClcblxuICAgIC8vIDMuIExldCBwYXJhbWV0ZXJOYW1lIGJlIHRoZSByZXN1bHQgb2YgY29sbGVjdGluZyBhXG4gICAgLy8gc2VxdWVuY2Ugb2YgY29kZSBwb2ludHMgdGhhdCBhcmUgbm90IFUrMDAzQiAoOylcbiAgICAvLyBvciBVKzAwM0QgKD0pIGZyb20gaW5wdXQsIGdpdmVuIHBvc2l0aW9uLlxuICAgIGxldCBwYXJhbWV0ZXJOYW1lID0gY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50cyhcbiAgICAgIChjaGFyKSA9PiBjaGFyICE9PSAnOycgJiYgY2hhciAhPT0gJz0nLFxuICAgICAgaW5wdXQsXG4gICAgICBwb3NpdGlvblxuICAgIClcblxuICAgIC8vIDQuIFNldCBwYXJhbWV0ZXJOYW1lIHRvIHBhcmFtZXRlck5hbWUsIGluIEFTQ0lJXG4gICAgLy8gbG93ZXJjYXNlLlxuICAgIHBhcmFtZXRlck5hbWUgPSBwYXJhbWV0ZXJOYW1lLnRvTG93ZXJDYXNlKClcblxuICAgIC8vIDUuIElmIHBvc2l0aW9uIGlzIG5vdCBwYXN0IHRoZSBlbmQgb2YgaW5wdXQsIHRoZW46XG4gICAgaWYgKHBvc2l0aW9uLnBvc2l0aW9uIDwgaW5wdXQubGVuZ3RoKSB7XG4gICAgICAvLyAxLiBJZiB0aGUgY29kZSBwb2ludCBhdCBwb3NpdGlvbiB3aXRoaW4gaW5wdXQgaXNcbiAgICAgIC8vIFUrMDAzQiAoOyksIHRoZW4gY29udGludWUuXG4gICAgICBpZiAoaW5wdXRbcG9zaXRpb24ucG9zaXRpb25dID09PSAnOycpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMi4gQWR2YW5jZSBwb3NpdGlvbiBieSAxLiAoVGhpcyBza2lwcyBwYXN0IFUrMDAzRCAoPSkuKVxuICAgICAgcG9zaXRpb24ucG9zaXRpb24rK1xuICAgIH1cblxuICAgIC8vIDYuIElmIHBvc2l0aW9uIGlzIHBhc3QgdGhlIGVuZCBvZiBpbnB1dCwgdGhlbiBicmVhay5cbiAgICBpZiAocG9zaXRpb24ucG9zaXRpb24gPiBpbnB1dC5sZW5ndGgpIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgLy8gNy4gTGV0IHBhcmFtZXRlclZhbHVlIGJlIG51bGwuXG4gICAgbGV0IHBhcmFtZXRlclZhbHVlID0gbnVsbFxuXG4gICAgLy8gOC4gSWYgdGhlIGNvZGUgcG9pbnQgYXQgcG9zaXRpb24gd2l0aGluIGlucHV0IGlzXG4gICAgLy8gVSswMDIyIChcIiksIHRoZW46XG4gICAgaWYgKGlucHV0W3Bvc2l0aW9uLnBvc2l0aW9uXSA9PT0gJ1wiJykge1xuICAgICAgLy8gMS4gU2V0IHBhcmFtZXRlclZhbHVlIHRvIHRoZSByZXN1bHQgb2YgY29sbGVjdGluZ1xuICAgICAgLy8gYW4gSFRUUCBxdW90ZWQgc3RyaW5nIGZyb20gaW5wdXQsIGdpdmVuIHBvc2l0aW9uXG4gICAgICAvLyBhbmQgdGhlIGV4dHJhY3QtdmFsdWUgZmxhZy5cbiAgICAgIHBhcmFtZXRlclZhbHVlID0gY29sbGVjdEFuSFRUUFF1b3RlZFN0cmluZyhpbnB1dCwgcG9zaXRpb24sIHRydWUpXG5cbiAgICAgIC8vIDIuIENvbGxlY3QgYSBzZXF1ZW5jZSBvZiBjb2RlIHBvaW50cyB0aGF0IGFyZSBub3RcbiAgICAgIC8vIFUrMDAzQiAoOykgZnJvbSBpbnB1dCwgZ2l2ZW4gcG9zaXRpb24uXG4gICAgICBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzRmFzdChcbiAgICAgICAgJzsnLFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgcG9zaXRpb25cbiAgICAgIClcblxuICAgIC8vIDkuIE90aGVyd2lzZTpcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gMS4gU2V0IHBhcmFtZXRlclZhbHVlIHRvIHRoZSByZXN1bHQgb2YgY29sbGVjdGluZ1xuICAgICAgLy8gYSBzZXF1ZW5jZSBvZiBjb2RlIHBvaW50cyB0aGF0IGFyZSBub3QgVSswMDNCICg7KVxuICAgICAgLy8gZnJvbSBpbnB1dCwgZ2l2ZW4gcG9zaXRpb24uXG4gICAgICBwYXJhbWV0ZXJWYWx1ZSA9IGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0KFxuICAgICAgICAnOycsXG4gICAgICAgIGlucHV0LFxuICAgICAgICBwb3NpdGlvblxuICAgICAgKVxuXG4gICAgICAvLyAyLiBSZW1vdmUgYW55IHRyYWlsaW5nIEhUVFAgd2hpdGVzcGFjZSBmcm9tIHBhcmFtZXRlclZhbHVlLlxuICAgICAgcGFyYW1ldGVyVmFsdWUgPSByZW1vdmVIVFRQV2hpdGVzcGFjZShwYXJhbWV0ZXJWYWx1ZSwgZmFsc2UsIHRydWUpXG5cbiAgICAgIC8vIDMuIElmIHBhcmFtZXRlclZhbHVlIGlzIHRoZSBlbXB0eSBzdHJpbmcsIHRoZW4gY29udGludWUuXG4gICAgICBpZiAocGFyYW1ldGVyVmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMTAuIElmIGFsbCBvZiB0aGUgZm9sbG93aW5nIGFyZSB0cnVlXG4gICAgLy8gLSBwYXJhbWV0ZXJOYW1lIGlzIG5vdCB0aGUgZW1wdHkgc3RyaW5nXG4gICAgLy8gLSBwYXJhbWV0ZXJOYW1lIHNvbGVseSBjb250YWlucyBIVFRQIHRva2VuIGNvZGUgcG9pbnRzXG4gICAgLy8gLSBwYXJhbWV0ZXJWYWx1ZSBzb2xlbHkgY29udGFpbnMgSFRUUCBxdW90ZWQtc3RyaW5nIHRva2VuIGNvZGUgcG9pbnRzXG4gICAgLy8gLSBtaW1lVHlwZeKAmXMgcGFyYW1ldGVyc1twYXJhbWV0ZXJOYW1lXSBkb2VzIG5vdCBleGlzdFxuICAgIC8vIHRoZW4gc2V0IG1pbWVUeXBl4oCZcyBwYXJhbWV0ZXJzW3BhcmFtZXRlck5hbWVdIHRvIHBhcmFtZXRlclZhbHVlLlxuICAgIGlmIChcbiAgICAgIHBhcmFtZXRlck5hbWUubGVuZ3RoICE9PSAwICYmXG4gICAgICBIVFRQX1RPS0VOX0NPREVQT0lOVFMudGVzdChwYXJhbWV0ZXJOYW1lKSAmJlxuICAgICAgKHBhcmFtZXRlclZhbHVlLmxlbmd0aCA9PT0gMCB8fCBIVFRQX1FVT1RFRF9TVFJJTkdfVE9LRU5TLnRlc3QocGFyYW1ldGVyVmFsdWUpKSAmJlxuICAgICAgIW1pbWVUeXBlLnBhcmFtZXRlcnMuaGFzKHBhcmFtZXRlck5hbWUpXG4gICAgKSB7XG4gICAgICBtaW1lVHlwZS5wYXJhbWV0ZXJzLnNldChwYXJhbWV0ZXJOYW1lLCBwYXJhbWV0ZXJWYWx1ZSlcbiAgICB9XG4gIH1cblxuICAvLyAxMi4gUmV0dXJuIG1pbWVUeXBlLlxuICByZXR1cm4gbWltZVR5cGVcbn1cblxuLy8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI2ZvcmdpdmluZy1iYXNlNjQtZGVjb2RlXG4vKiogQHBhcmFtIHtzdHJpbmd9IGRhdGEgKi9cbmZ1bmN0aW9uIGZvcmdpdmluZ0Jhc2U2NCAoZGF0YSkge1xuICAvLyAxLiBSZW1vdmUgYWxsIEFTQ0lJIHdoaXRlc3BhY2UgZnJvbSBkYXRhLlxuICBkYXRhID0gZGF0YS5yZXBsYWNlKEFTQ0lJX1dISVRFU1BBQ0VfUkVQTEFDRV9SRUdFWCwgJycpICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cbiAgbGV0IGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aFxuICAvLyAyLiBJZiBkYXRh4oCZcyBjb2RlIHBvaW50IGxlbmd0aCBkaXZpZGVzIGJ5IDQgbGVhdmluZ1xuICAvLyBubyByZW1haW5kZXIsIHRoZW46XG4gIGlmIChkYXRhTGVuZ3RoICUgNCA9PT0gMCkge1xuICAgIC8vIDEuIElmIGRhdGEgZW5kcyB3aXRoIG9uZSBvciB0d28gVSswMDNEICg9KSBjb2RlIHBvaW50cyxcbiAgICAvLyB0aGVuIHJlbW92ZSB0aGVtIGZyb20gZGF0YS5cbiAgICBpZiAoZGF0YS5jaGFyQ29kZUF0KGRhdGFMZW5ndGggLSAxKSA9PT0gMHgwMDNEKSB7XG4gICAgICAtLWRhdGFMZW5ndGhcbiAgICAgIGlmIChkYXRhLmNoYXJDb2RlQXQoZGF0YUxlbmd0aCAtIDEpID09PSAweDAwM0QpIHtcbiAgICAgICAgLS1kYXRhTGVuZ3RoXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gMy4gSWYgZGF0YeKAmXMgY29kZSBwb2ludCBsZW5ndGggZGl2aWRlcyBieSA0IGxlYXZpbmdcbiAgLy8gYSByZW1haW5kZXIgb2YgMSwgdGhlbiByZXR1cm4gZmFpbHVyZS5cbiAgaWYgKGRhdGFMZW5ndGggJSA0ID09PSAxKSB7XG4gICAgcmV0dXJuICdmYWlsdXJlJ1xuICB9XG5cbiAgLy8gNC4gSWYgZGF0YSBjb250YWlucyBhIGNvZGUgcG9pbnQgdGhhdCBpcyBub3Qgb25lIG9mXG4gIC8vICBVKzAwMkIgKCspXG4gIC8vICBVKzAwMkYgKC8pXG4gIC8vICBBU0NJSSBhbHBoYW51bWVyaWNcbiAgLy8gdGhlbiByZXR1cm4gZmFpbHVyZS5cbiAgaWYgKC9bXisvMC05QS1aYS16XS8udGVzdChkYXRhLmxlbmd0aCA9PT0gZGF0YUxlbmd0aCA/IGRhdGEgOiBkYXRhLnN1YnN0cmluZygwLCBkYXRhTGVuZ3RoKSkpIHtcbiAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gIH1cblxuICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShkYXRhLCAnYmFzZTY0JylcbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ1ZmZlci5idWZmZXIsIGJ1ZmZlci5ieXRlT2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aClcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbGxlY3QtYW4taHR0cC1xdW90ZWQtc3RyaW5nXG4vLyB0ZXN0czogaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2V4YW1wbGUtaHR0cC1xdW90ZWQtc3RyaW5nXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dFxuICogQHBhcmFtIHt7IHBvc2l0aW9uOiBudW1iZXIgfX0gcG9zaXRpb25cbiAqIEBwYXJhbSB7Ym9vbGVhbj99IGV4dHJhY3RWYWx1ZVxuICovXG5mdW5jdGlvbiBjb2xsZWN0QW5IVFRQUXVvdGVkU3RyaW5nIChpbnB1dCwgcG9zaXRpb24sIGV4dHJhY3RWYWx1ZSkge1xuICAvLyAxLiBMZXQgcG9zaXRpb25TdGFydCBiZSBwb3NpdGlvbi5cbiAgY29uc3QgcG9zaXRpb25TdGFydCA9IHBvc2l0aW9uLnBvc2l0aW9uXG5cbiAgLy8gMi4gTGV0IHZhbHVlIGJlIHRoZSBlbXB0eSBzdHJpbmcuXG4gIGxldCB2YWx1ZSA9ICcnXG5cbiAgLy8gMy4gQXNzZXJ0OiB0aGUgY29kZSBwb2ludCBhdCBwb3NpdGlvbiB3aXRoaW4gaW5wdXRcbiAgLy8gaXMgVSswMDIyIChcIikuXG4gIGFzc2VydChpbnB1dFtwb3NpdGlvbi5wb3NpdGlvbl0gPT09ICdcIicpXG5cbiAgLy8gNC4gQWR2YW5jZSBwb3NpdGlvbiBieSAxLlxuICBwb3NpdGlvbi5wb3NpdGlvbisrXG5cbiAgLy8gNS4gV2hpbGUgdHJ1ZTpcbiAgd2hpbGUgKHRydWUpIHtcbiAgICAvLyAxLiBBcHBlbmQgdGhlIHJlc3VsdCBvZiBjb2xsZWN0aW5nIGEgc2VxdWVuY2Ugb2YgY29kZSBwb2ludHNcbiAgICAvLyB0aGF0IGFyZSBub3QgVSswMDIyIChcIikgb3IgVSswMDVDIChcXCkgZnJvbSBpbnB1dCwgZ2l2ZW5cbiAgICAvLyBwb3NpdGlvbiwgdG8gdmFsdWUuXG4gICAgdmFsdWUgKz0gY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50cyhcbiAgICAgIChjaGFyKSA9PiBjaGFyICE9PSAnXCInICYmIGNoYXIgIT09ICdcXFxcJyxcbiAgICAgIGlucHV0LFxuICAgICAgcG9zaXRpb25cbiAgICApXG5cbiAgICAvLyAyLiBJZiBwb3NpdGlvbiBpcyBwYXN0IHRoZSBlbmQgb2YgaW5wdXQsIHRoZW4gYnJlYWsuXG4gICAgaWYgKHBvc2l0aW9uLnBvc2l0aW9uID49IGlucHV0Lmxlbmd0aCkge1xuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICAvLyAzLiBMZXQgcXVvdGVPckJhY2tzbGFzaCBiZSB0aGUgY29kZSBwb2ludCBhdCBwb3NpdGlvbiB3aXRoaW5cbiAgICAvLyBpbnB1dC5cbiAgICBjb25zdCBxdW90ZU9yQmFja3NsYXNoID0gaW5wdXRbcG9zaXRpb24ucG9zaXRpb25dXG5cbiAgICAvLyA0LiBBZHZhbmNlIHBvc2l0aW9uIGJ5IDEuXG4gICAgcG9zaXRpb24ucG9zaXRpb24rK1xuXG4gICAgLy8gNS4gSWYgcXVvdGVPckJhY2tzbGFzaCBpcyBVKzAwNUMgKFxcKSwgdGhlbjpcbiAgICBpZiAocXVvdGVPckJhY2tzbGFzaCA9PT0gJ1xcXFwnKSB7XG4gICAgICAvLyAxLiBJZiBwb3NpdGlvbiBpcyBwYXN0IHRoZSBlbmQgb2YgaW5wdXQsIHRoZW4gYXBwZW5kXG4gICAgICAvLyBVKzAwNUMgKFxcKSB0byB2YWx1ZSBhbmQgYnJlYWsuXG4gICAgICBpZiAocG9zaXRpb24ucG9zaXRpb24gPj0gaW5wdXQubGVuZ3RoKSB7XG4gICAgICAgIHZhbHVlICs9ICdcXFxcJ1xuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBBcHBlbmQgdGhlIGNvZGUgcG9pbnQgYXQgcG9zaXRpb24gd2l0aGluIGlucHV0IHRvIHZhbHVlLlxuICAgICAgdmFsdWUgKz0gaW5wdXRbcG9zaXRpb24ucG9zaXRpb25dXG5cbiAgICAgIC8vIDMuIEFkdmFuY2UgcG9zaXRpb24gYnkgMS5cbiAgICAgIHBvc2l0aW9uLnBvc2l0aW9uKytcblxuICAgIC8vIDYuIE90aGVyd2lzZTpcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gMS4gQXNzZXJ0OiBxdW90ZU9yQmFja3NsYXNoIGlzIFUrMDAyMiAoXCIpLlxuICAgICAgYXNzZXJ0KHF1b3RlT3JCYWNrc2xhc2ggPT09ICdcIicpXG5cbiAgICAgIC8vIDIuIEJyZWFrLlxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICAvLyA2LiBJZiB0aGUgZXh0cmFjdC12YWx1ZSBmbGFnIGlzIHNldCwgdGhlbiByZXR1cm4gdmFsdWUuXG4gIGlmIChleHRyYWN0VmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8vIDcuIFJldHVybiB0aGUgY29kZSBwb2ludHMgZnJvbSBwb3NpdGlvblN0YXJ0IHRvIHBvc2l0aW9uLFxuICAvLyBpbmNsdXNpdmUsIHdpdGhpbiBpbnB1dC5cbiAgcmV0dXJuIGlucHV0LnNsaWNlKHBvc2l0aW9uU3RhcnQsIHBvc2l0aW9uLnBvc2l0aW9uKVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9taW1lc25pZmYuc3BlYy53aGF0d2cub3JnLyNzZXJpYWxpemUtYS1taW1lLXR5cGVcbiAqL1xuZnVuY3Rpb24gc2VyaWFsaXplQU1pbWVUeXBlIChtaW1lVHlwZSkge1xuICBhc3NlcnQobWltZVR5cGUgIT09ICdmYWlsdXJlJylcbiAgY29uc3QgeyBwYXJhbWV0ZXJzLCBlc3NlbmNlIH0gPSBtaW1lVHlwZVxuXG4gIC8vIDEuIExldCBzZXJpYWxpemF0aW9uIGJlIHRoZSBjb25jYXRlbmF0aW9uIG9mIG1pbWVUeXBl4oCZc1xuICAvLyAgICB0eXBlLCBVKzAwMkYgKC8pLCBhbmQgbWltZVR5cGXigJlzIHN1YnR5cGUuXG4gIGxldCBzZXJpYWxpemF0aW9uID0gZXNzZW5jZVxuXG4gIC8vIDIuIEZvciBlYWNoIG5hbWUg4oaSIHZhbHVlIG9mIG1pbWVUeXBl4oCZcyBwYXJhbWV0ZXJzOlxuICBmb3IgKGxldCBbbmFtZSwgdmFsdWVdIG9mIHBhcmFtZXRlcnMuZW50cmllcygpKSB7XG4gICAgLy8gMS4gQXBwZW5kIFUrMDAzQiAoOykgdG8gc2VyaWFsaXphdGlvbi5cbiAgICBzZXJpYWxpemF0aW9uICs9ICc7J1xuXG4gICAgLy8gMi4gQXBwZW5kIG5hbWUgdG8gc2VyaWFsaXphdGlvbi5cbiAgICBzZXJpYWxpemF0aW9uICs9IG5hbWVcblxuICAgIC8vIDMuIEFwcGVuZCBVKzAwM0QgKD0pIHRvIHNlcmlhbGl6YXRpb24uXG4gICAgc2VyaWFsaXphdGlvbiArPSAnPSdcblxuICAgIC8vIDQuIElmIHZhbHVlIGRvZXMgbm90IHNvbGVseSBjb250YWluIEhUVFAgdG9rZW4gY29kZVxuICAgIC8vICAgIHBvaW50cyBvciB2YWx1ZSBpcyB0aGUgZW1wdHkgc3RyaW5nLCB0aGVuOlxuICAgIGlmICghSFRUUF9UT0tFTl9DT0RFUE9JTlRTLnRlc3QodmFsdWUpKSB7XG4gICAgICAvLyAxLiBQcmVjZWRlIGVhY2ggb2NjdXJyZW5jZSBvZiBVKzAwMjIgKFwiKSBvclxuICAgICAgLy8gICAgVSswMDVDIChcXCkgaW4gdmFsdWUgd2l0aCBVKzAwNUMgKFxcKS5cbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvKFxcXFx8XCIpL2csICdcXFxcJDEnKVxuXG4gICAgICAvLyAyLiBQcmVwZW5kIFUrMDAyMiAoXCIpIHRvIHZhbHVlLlxuICAgICAgdmFsdWUgPSAnXCInICsgdmFsdWVcblxuICAgICAgLy8gMy4gQXBwZW5kIFUrMDAyMiAoXCIpIHRvIHZhbHVlLlxuICAgICAgdmFsdWUgKz0gJ1wiJ1xuICAgIH1cblxuICAgIC8vIDUuIEFwcGVuZCB2YWx1ZSB0byBzZXJpYWxpemF0aW9uLlxuICAgIHNlcmlhbGl6YXRpb24gKz0gdmFsdWVcbiAgfVxuXG4gIC8vIDMuIFJldHVybiBzZXJpYWxpemF0aW9uLlxuICByZXR1cm4gc2VyaWFsaXphdGlvblxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtd2hpdGVzcGFjZVxuICogQHBhcmFtIHtudW1iZXJ9IGNoYXJcbiAqL1xuZnVuY3Rpb24gaXNIVFRQV2hpdGVTcGFjZSAoY2hhcikge1xuICAvLyBcIlxcclxcblxcdCBcIlxuICByZXR1cm4gY2hhciA9PT0gMHgwMGQgfHwgY2hhciA9PT0gMHgwMGEgfHwgY2hhciA9PT0gMHgwMDkgfHwgY2hhciA9PT0gMHgwMjBcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNodHRwLXdoaXRlc3BhY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2xlYWRpbmc9dHJ1ZV1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RyYWlsaW5nPXRydWVdXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUhUVFBXaGl0ZXNwYWNlIChzdHIsIGxlYWRpbmcgPSB0cnVlLCB0cmFpbGluZyA9IHRydWUpIHtcbiAgcmV0dXJuIHJlbW92ZUNoYXJzKHN0ciwgbGVhZGluZywgdHJhaWxpbmcsIGlzSFRUUFdoaXRlU3BhY2UpXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jYXNjaWktd2hpdGVzcGFjZVxuICogQHBhcmFtIHtudW1iZXJ9IGNoYXJcbiAqL1xuZnVuY3Rpb24gaXNBU0NJSVdoaXRlc3BhY2UgKGNoYXIpIHtcbiAgLy8gXCJcXHJcXG5cXHRcXGYgXCJcbiAgcmV0dXJuIGNoYXIgPT09IDB4MDBkIHx8IGNoYXIgPT09IDB4MDBhIHx8IGNoYXIgPT09IDB4MDA5IHx8IGNoYXIgPT09IDB4MDBjIHx8IGNoYXIgPT09IDB4MDIwXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jc3RyaXAtbGVhZGluZy1hbmQtdHJhaWxpbmctYXNjaWktd2hpdGVzcGFjZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHBhcmFtIHtib29sZWFufSBbbGVhZGluZz10cnVlXVxuICogQHBhcmFtIHtib29sZWFufSBbdHJhaWxpbmc9dHJ1ZV1cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQVNDSUlXaGl0ZXNwYWNlIChzdHIsIGxlYWRpbmcgPSB0cnVlLCB0cmFpbGluZyA9IHRydWUpIHtcbiAgcmV0dXJuIHJlbW92ZUNoYXJzKHN0ciwgbGVhZGluZywgdHJhaWxpbmcsIGlzQVNDSUlXaGl0ZXNwYWNlKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbGVhZGluZ1xuICogQHBhcmFtIHtib29sZWFufSB0cmFpbGluZ1xuICogQHBhcmFtIHsoY2hhckNvZGU6IG51bWJlcikgPT4gYm9vbGVhbn0gcHJlZGljYXRlXG4gKiBAcmV0dXJuc1xuICovXG5mdW5jdGlvbiByZW1vdmVDaGFycyAoc3RyLCBsZWFkaW5nLCB0cmFpbGluZywgcHJlZGljYXRlKSB7XG4gIGxldCBsZWFkID0gMFxuICBsZXQgdHJhaWwgPSBzdHIubGVuZ3RoIC0gMVxuXG4gIGlmIChsZWFkaW5nKSB7XG4gICAgd2hpbGUgKGxlYWQgPCBzdHIubGVuZ3RoICYmIHByZWRpY2F0ZShzdHIuY2hhckNvZGVBdChsZWFkKSkpIGxlYWQrK1xuICB9XG5cbiAgaWYgKHRyYWlsaW5nKSB7XG4gICAgd2hpbGUgKHRyYWlsID4gMCAmJiBwcmVkaWNhdGUoc3RyLmNoYXJDb2RlQXQodHJhaWwpKSkgdHJhaWwtLVxuICB9XG5cbiAgcmV0dXJuIGxlYWQgPT09IDAgJiYgdHJhaWwgPT09IHN0ci5sZW5ndGggLSAxID8gc3RyIDogc3RyLnNsaWNlKGxlYWQsIHRyYWlsICsgMSlcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNpc29tb3JwaGljLWRlY29kZVxuICogQHBhcmFtIHtVaW50OEFycmF5fSBpbnB1dFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gaXNvbW9ycGhpY0RlY29kZSAoaW5wdXQpIHtcbiAgLy8gMS4gVG8gaXNvbW9ycGhpYyBkZWNvZGUgYSBieXRlIHNlcXVlbmNlIGlucHV0LCByZXR1cm4gYSBzdHJpbmcgd2hvc2UgY29kZSBwb2ludFxuICAvLyAgICBsZW5ndGggaXMgZXF1YWwgdG8gaW5wdXTigJlzIGxlbmd0aCBhbmQgd2hvc2UgY29kZSBwb2ludHMgaGF2ZSB0aGUgc2FtZSB2YWx1ZXNcbiAgLy8gICAgYXMgdGhlIHZhbHVlcyBvZiBpbnB1dOKAmXMgYnl0ZXMsIGluIHRoZSBzYW1lIG9yZGVyLlxuICBjb25zdCBsZW5ndGggPSBpbnB1dC5sZW5ndGhcbiAgaWYgKCgyIDw8IDE1KSAtIDEgPiBsZW5ndGgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBpbnB1dClcbiAgfVxuICBsZXQgcmVzdWx0ID0gJyc7IGxldCBpID0gMFxuICBsZXQgYWRkaXRpb24gPSAoMiA8PCAxNSkgLSAxXG4gIHdoaWxlIChpIDwgbGVuZ3RoKSB7XG4gICAgaWYgKGkgKyBhZGRpdGlvbiA+IGxlbmd0aCkge1xuICAgICAgYWRkaXRpb24gPSBsZW5ndGggLSBpXG4gICAgfVxuICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGlucHV0LnN1YmFycmF5KGksIGkgKz0gYWRkaXRpb24pKVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vbWltZXNuaWZmLnNwZWMud2hhdHdnLm9yZy8jbWluaW1pemUtYS1zdXBwb3J0ZWQtbWltZS10eXBlXG4gKiBAcGFyYW0ge0V4Y2x1ZGU8UmV0dXJuVHlwZTx0eXBlb2YgcGFyc2VNSU1FVHlwZT4sICdmYWlsdXJlJz59IG1pbWVUeXBlXG4gKi9cbmZ1bmN0aW9uIG1pbmltaXplU3VwcG9ydGVkTWltZVR5cGUgKG1pbWVUeXBlKSB7XG4gIHN3aXRjaCAobWltZVR5cGUuZXNzZW5jZSkge1xuICAgIGNhc2UgJ2FwcGxpY2F0aW9uL2VjbWFzY3JpcHQnOlxuICAgIGNhc2UgJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnOlxuICAgIGNhc2UgJ2FwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCc6XG4gICAgY2FzZSAnYXBwbGljYXRpb24veC1qYXZhc2NyaXB0JzpcbiAgICBjYXNlICd0ZXh0L2VjbWFzY3JpcHQnOlxuICAgIGNhc2UgJ3RleHQvamF2YXNjcmlwdCc6XG4gICAgY2FzZSAndGV4dC9qYXZhc2NyaXB0MS4wJzpcbiAgICBjYXNlICd0ZXh0L2phdmFzY3JpcHQxLjEnOlxuICAgIGNhc2UgJ3RleHQvamF2YXNjcmlwdDEuMic6XG4gICAgY2FzZSAndGV4dC9qYXZhc2NyaXB0MS4zJzpcbiAgICBjYXNlICd0ZXh0L2phdmFzY3JpcHQxLjQnOlxuICAgIGNhc2UgJ3RleHQvamF2YXNjcmlwdDEuNSc6XG4gICAgY2FzZSAndGV4dC9qc2NyaXB0JzpcbiAgICBjYXNlICd0ZXh0L2xpdmVzY3JpcHQnOlxuICAgIGNhc2UgJ3RleHQveC1lY21hc2NyaXB0JzpcbiAgICBjYXNlICd0ZXh0L3gtamF2YXNjcmlwdCc6XG4gICAgICAvLyAxLiBJZiBtaW1lVHlwZSBpcyBhIEphdmFTY3JpcHQgTUlNRSB0eXBlLCB0aGVuIHJldHVybiBcInRleHQvamF2YXNjcmlwdFwiLlxuICAgICAgcmV0dXJuICd0ZXh0L2phdmFzY3JpcHQnXG4gICAgY2FzZSAnYXBwbGljYXRpb24vanNvbic6XG4gICAgY2FzZSAndGV4dC9qc29uJzpcbiAgICAgIC8vIDIuIElmIG1pbWVUeXBlIGlzIGEgSlNPTiBNSU1FIHR5cGUsIHRoZW4gcmV0dXJuIFwiYXBwbGljYXRpb24vanNvblwiLlxuICAgICAgcmV0dXJuICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgIGNhc2UgJ2ltYWdlL3N2Zyt4bWwnOlxuICAgICAgLy8gMy4gSWYgbWltZVR5cGXigJlzIGVzc2VuY2UgaXMgXCJpbWFnZS9zdmcreG1sXCIsIHRoZW4gcmV0dXJuIFwiaW1hZ2Uvc3ZnK3htbFwiLlxuICAgICAgcmV0dXJuICdpbWFnZS9zdmcreG1sJ1xuICAgIGNhc2UgJ3RleHQveG1sJzpcbiAgICBjYXNlICdhcHBsaWNhdGlvbi94bWwnOlxuICAgICAgLy8gNC4gSWYgbWltZVR5cGUgaXMgYW4gWE1MIE1JTUUgdHlwZSwgdGhlbiByZXR1cm4gXCJhcHBsaWNhdGlvbi94bWxcIi5cbiAgICAgIHJldHVybiAnYXBwbGljYXRpb24veG1sJ1xuICB9XG5cbiAgLy8gMi4gSWYgbWltZVR5cGUgaXMgYSBKU09OIE1JTUUgdHlwZSwgdGhlbiByZXR1cm4gXCJhcHBsaWNhdGlvbi9qc29uXCIuXG4gIGlmIChtaW1lVHlwZS5zdWJ0eXBlLmVuZHNXaXRoKCcranNvbicpKSB7XG4gICAgcmV0dXJuICdhcHBsaWNhdGlvbi9qc29uJ1xuICB9XG5cbiAgLy8gNC4gSWYgbWltZVR5cGUgaXMgYW4gWE1MIE1JTUUgdHlwZSwgdGhlbiByZXR1cm4gXCJhcHBsaWNhdGlvbi94bWxcIi5cbiAgaWYgKG1pbWVUeXBlLnN1YnR5cGUuZW5kc1dpdGgoJyt4bWwnKSkge1xuICAgIHJldHVybiAnYXBwbGljYXRpb24veG1sJ1xuICB9XG5cbiAgLy8gNS4gSWYgbWltZVR5cGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSB1c2VyIGFnZW50LCB0aGVuIHJldHVybiBtaW1lVHlwZeKAmXMgZXNzZW5jZS5cbiAgLy8gVGVjaG5pY2FsbHksIG5vZGUgZG9lc24ndCBzdXBwb3J0IGFueSBtaW1ldHlwZXMuXG5cbiAgLy8gNi4gUmV0dXJuIHRoZSBlbXB0eSBzdHJpbmcuXG4gIHJldHVybiAnJ1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZGF0YVVSTFByb2Nlc3NvcixcbiAgVVJMU2VyaWFsaXplcixcbiAgY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50cyxcbiAgY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50c0Zhc3QsXG4gIHN0cmluZ1BlcmNlbnREZWNvZGUsXG4gIHBhcnNlTUlNRVR5cGUsXG4gIGNvbGxlY3RBbkhUVFBRdW90ZWRTdHJpbmcsXG4gIHNlcmlhbGl6ZUFNaW1lVHlwZSxcbiAgcmVtb3ZlQ2hhcnMsXG4gIHJlbW92ZUhUVFBXaGl0ZXNwYWNlLFxuICBtaW5pbWl6ZVN1cHBvcnRlZE1pbWVUeXBlLFxuICBIVFRQX1RPS0VOX0NPREVQT0lOVFMsXG4gIGlzb21vcnBoaWNEZWNvZGVcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IHR5cGVzLCBpbnNwZWN0IH0gPSByZXF1aXJlKCdub2RlOnV0aWwnKVxuY29uc3QgeyBtYXJrQXNVbmNsb25lYWJsZSB9ID0gcmVxdWlyZSgnbm9kZTp3b3JrZXJfdGhyZWFkcycpXG5jb25zdCB7IHRvVVNWU3RyaW5nIH0gPSByZXF1aXJlKCcuLi8uLi9jb3JlL3V0aWwnKVxuXG4vKiogQHR5cGUge2ltcG9ydCgnLi4vLi4vLi4vdHlwZXMvd2ViaWRsJykuV2ViaWRsfSAqL1xuY29uc3Qgd2ViaWRsID0ge31cbndlYmlkbC5jb252ZXJ0ZXJzID0ge31cbndlYmlkbC51dGlsID0ge31cbndlYmlkbC5lcnJvcnMgPSB7fVxuXG53ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbiA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gIHJldHVybiBuZXcgVHlwZUVycm9yKGAke21lc3NhZ2UuaGVhZGVyfTogJHttZXNzYWdlLm1lc3NhZ2V9YClcbn1cblxud2ViaWRsLmVycm9ycy5jb252ZXJzaW9uRmFpbGVkID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgY29uc3QgcGx1cmFsID0gY29udGV4dC50eXBlcy5sZW5ndGggPT09IDEgPyAnJyA6ICcgb25lIG9mJ1xuICBjb25zdCBtZXNzYWdlID1cbiAgICBgJHtjb250ZXh0LmFyZ3VtZW50fSBjb3VsZCBub3QgYmUgY29udmVydGVkIHRvYCArXG4gICAgYCR7cGx1cmFsfTogJHtjb250ZXh0LnR5cGVzLmpvaW4oJywgJyl9LmBcblxuICByZXR1cm4gd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgIGhlYWRlcjogY29udGV4dC5wcmVmaXgsXG4gICAgbWVzc2FnZVxuICB9KVxufVxuXG53ZWJpZGwuZXJyb3JzLmludmFsaWRBcmd1bWVudCA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gIHJldHVybiB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgaGVhZGVyOiBjb250ZXh0LnByZWZpeCxcbiAgICBtZXNzYWdlOiBgXCIke2NvbnRleHQudmFsdWV9XCIgaXMgYW4gaW52YWxpZCAke2NvbnRleHQudHlwZX0uYFxuICB9KVxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2ltcGxlbWVudHNcbndlYmlkbC5icmFuZENoZWNrID0gZnVuY3Rpb24gKFYsIEksIG9wdHMpIHtcbiAgaWYgKG9wdHM/LnN0cmljdCAhPT0gZmFsc2UpIHtcbiAgICBpZiAoIShWIGluc3RhbmNlb2YgSSkpIHtcbiAgICAgIGNvbnN0IGVyciA9IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgaW52b2NhdGlvbicpXG4gICAgICBlcnIuY29kZSA9ICdFUlJfSU5WQUxJRF9USElTJyAvLyBub2RlIGNvbXBhdC5cbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoVj8uW1N5bWJvbC50b1N0cmluZ1RhZ10gIT09IEkucHJvdG90eXBlW1N5bWJvbC50b1N0cmluZ1RhZ10pIHtcbiAgICAgIGNvbnN0IGVyciA9IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgaW52b2NhdGlvbicpXG4gICAgICBlcnIuY29kZSA9ICdFUlJfSU5WQUxJRF9USElTJyAvLyBub2RlIGNvbXBhdC5cbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgfVxufVxuXG53ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayA9IGZ1bmN0aW9uICh7IGxlbmd0aCB9LCBtaW4sIGN0eCkge1xuICBpZiAobGVuZ3RoIDwgbWluKSB7XG4gICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgbWVzc2FnZTogYCR7bWlufSBhcmd1bWVudCR7bWluICE9PSAxID8gJ3MnIDogJyd9IHJlcXVpcmVkLCBgICtcbiAgICAgICAgICAgICAgIGBidXQke2xlbmd0aCA/ICcgb25seScgOiAnJ30gJHtsZW5ndGh9IGZvdW5kLmAsXG4gICAgICBoZWFkZXI6IGN0eFxuICAgIH0pXG4gIH1cbn1cblxud2ViaWRsLmlsbGVnYWxDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uICgpIHtcbiAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgIGhlYWRlcjogJ1R5cGVFcnJvcicsXG4gICAgbWVzc2FnZTogJ0lsbGVnYWwgY29uc3RydWN0b3InXG4gIH0pXG59XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZWNtYXNjcmlwdC1kYXRhLXR5cGVzLWFuZC12YWx1ZXNcbndlYmlkbC51dGlsLlR5cGUgPSBmdW5jdGlvbiAoVikge1xuICBzd2l0Y2ggKHR5cGVvZiBWKSB7XG4gICAgY2FzZSAndW5kZWZpbmVkJzogcmV0dXJuICdVbmRlZmluZWQnXG4gICAgY2FzZSAnYm9vbGVhbic6IHJldHVybiAnQm9vbGVhbidcbiAgICBjYXNlICdzdHJpbmcnOiByZXR1cm4gJ1N0cmluZydcbiAgICBjYXNlICdzeW1ib2wnOiByZXR1cm4gJ1N5bWJvbCdcbiAgICBjYXNlICdudW1iZXInOiByZXR1cm4gJ051bWJlcidcbiAgICBjYXNlICdiaWdpbnQnOiByZXR1cm4gJ0JpZ0ludCdcbiAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgY2FzZSAnb2JqZWN0Jzoge1xuICAgICAgaWYgKFYgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICdOdWxsJ1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJ09iamVjdCdcbiAgICB9XG4gIH1cbn1cblxud2ViaWRsLnV0aWwubWFya0FzVW5jbG9uZWFibGUgPSBtYXJrQXNVbmNsb25lYWJsZSB8fCAoKCkgPT4ge30pXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2Fic3RyYWN0LW9wZGVmLWNvbnZlcnR0b2ludFxud2ViaWRsLnV0aWwuQ29udmVydFRvSW50ID0gZnVuY3Rpb24gKFYsIGJpdExlbmd0aCwgc2lnbmVkbmVzcywgb3B0cykge1xuICBsZXQgdXBwZXJCb3VuZFxuICBsZXQgbG93ZXJCb3VuZFxuXG4gIC8vIDEuIElmIGJpdExlbmd0aCBpcyA2NCwgdGhlbjpcbiAgaWYgKGJpdExlbmd0aCA9PT0gNjQpIHtcbiAgICAvLyAxLiBMZXQgdXBwZXJCb3VuZCBiZSAyXjUzIOKIkiAxLlxuICAgIHVwcGVyQm91bmQgPSBNYXRoLnBvdygyLCA1MykgLSAxXG5cbiAgICAvLyAyLiBJZiBzaWduZWRuZXNzIGlzIFwidW5zaWduZWRcIiwgdGhlbiBsZXQgbG93ZXJCb3VuZCBiZSAwLlxuICAgIGlmIChzaWduZWRuZXNzID09PSAndW5zaWduZWQnKSB7XG4gICAgICBsb3dlckJvdW5kID0gMFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyAzLiBPdGhlcndpc2UgbGV0IGxvd2VyQm91bmQgYmUg4oiSMl41MyArIDEuXG4gICAgICBsb3dlckJvdW5kID0gTWF0aC5wb3coLTIsIDUzKSArIDFcbiAgICB9XG4gIH0gZWxzZSBpZiAoc2lnbmVkbmVzcyA9PT0gJ3Vuc2lnbmVkJykge1xuICAgIC8vIDIuIE90aGVyd2lzZSwgaWYgc2lnbmVkbmVzcyBpcyBcInVuc2lnbmVkXCIsIHRoZW46XG5cbiAgICAvLyAxLiBMZXQgbG93ZXJCb3VuZCBiZSAwLlxuICAgIGxvd2VyQm91bmQgPSAwXG5cbiAgICAvLyAyLiBMZXQgdXBwZXJCb3VuZCBiZSAyXmJpdExlbmd0aCDiiJIgMS5cbiAgICB1cHBlckJvdW5kID0gTWF0aC5wb3coMiwgYml0TGVuZ3RoKSAtIDFcbiAgfSBlbHNlIHtcbiAgICAvLyAzLiBPdGhlcndpc2U6XG5cbiAgICAvLyAxLiBMZXQgbG93ZXJCb3VuZCBiZSAtMl5iaXRMZW5ndGgg4oiSIDEuXG4gICAgbG93ZXJCb3VuZCA9IE1hdGgucG93KC0yLCBiaXRMZW5ndGgpIC0gMVxuXG4gICAgLy8gMi4gTGV0IHVwcGVyQm91bmQgYmUgMl5iaXRMZW5ndGgg4oiSIDEg4oiSIDEuXG4gICAgdXBwZXJCb3VuZCA9IE1hdGgucG93KDIsIGJpdExlbmd0aCAtIDEpIC0gMVxuICB9XG5cbiAgLy8gNC4gTGV0IHggYmUgPyBUb051bWJlcihWKS5cbiAgbGV0IHggPSBOdW1iZXIoVilcblxuICAvLyA1LiBJZiB4IGlzIOKIkjAsIHRoZW4gc2V0IHggdG8gKzAuXG4gIGlmICh4ID09PSAwKSB7XG4gICAgeCA9IDBcbiAgfVxuXG4gIC8vIDYuIElmIHRoZSBjb252ZXJzaW9uIGlzIHRvIGFuIElETCB0eXBlIGFzc29jaWF0ZWRcbiAgLy8gICAgd2l0aCB0aGUgW0VuZm9yY2VSYW5nZV0gZXh0ZW5kZWQgYXR0cmlidXRlLCB0aGVuOlxuICBpZiAob3B0cz8uZW5mb3JjZVJhbmdlID09PSB0cnVlKSB7XG4gICAgLy8gMS4gSWYgeCBpcyBOYU4sICviiJ4sIG9yIOKIkuKIniwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAoXG4gICAgICBOdW1iZXIuaXNOYU4oeCkgfHxcbiAgICAgIHggPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSB8fFxuICAgICAgeCA9PT0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZXG4gICAgKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgIGhlYWRlcjogJ0ludGVnZXIgY29udmVyc2lvbicsXG4gICAgICAgIG1lc3NhZ2U6IGBDb3VsZCBub3QgY29udmVydCAke3dlYmlkbC51dGlsLlN0cmluZ2lmeShWKX0gdG8gYW4gaW50ZWdlci5gXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDIuIFNldCB4IHRvIEludGVnZXJQYXJ0KHgpLlxuICAgIHggPSB3ZWJpZGwudXRpbC5JbnRlZ2VyUGFydCh4KVxuXG4gICAgLy8gMy4gSWYgeCA8IGxvd2VyQm91bmQgb3IgeCA+IHVwcGVyQm91bmQsIHRoZW5cbiAgICAvLyAgICB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAoeCA8IGxvd2VyQm91bmQgfHwgeCA+IHVwcGVyQm91bmQpIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgaGVhZGVyOiAnSW50ZWdlciBjb252ZXJzaW9uJyxcbiAgICAgICAgbWVzc2FnZTogYFZhbHVlIG11c3QgYmUgYmV0d2VlbiAke2xvd2VyQm91bmR9LSR7dXBwZXJCb3VuZH0sIGdvdCAke3h9LmBcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gNC4gUmV0dXJuIHguXG4gICAgcmV0dXJuIHhcbiAgfVxuXG4gIC8vIDcuIElmIHggaXMgbm90IE5hTiBhbmQgdGhlIGNvbnZlcnNpb24gaXMgdG8gYW4gSURMXG4gIC8vICAgIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBbQ2xhbXBdIGV4dGVuZGVkXG4gIC8vICAgIGF0dHJpYnV0ZSwgdGhlbjpcbiAgaWYgKCFOdW1iZXIuaXNOYU4oeCkgJiYgb3B0cz8uY2xhbXAgPT09IHRydWUpIHtcbiAgICAvLyAxLiBTZXQgeCB0byBtaW4obWF4KHgsIGxvd2VyQm91bmQpLCB1cHBlckJvdW5kKS5cbiAgICB4ID0gTWF0aC5taW4oTWF0aC5tYXgoeCwgbG93ZXJCb3VuZCksIHVwcGVyQm91bmQpXG5cbiAgICAvLyAyLiBSb3VuZCB4IHRvIHRoZSBuZWFyZXN0IGludGVnZXIsIGNob29zaW5nIHRoZVxuICAgIC8vICAgIGV2ZW4gaW50ZWdlciBpZiBpdCBsaWVzIGhhbGZ3YXkgYmV0d2VlbiB0d28sXG4gICAgLy8gICAgYW5kIGNob29zaW5nICswIHJhdGhlciB0aGFuIOKIkjAuXG4gICAgaWYgKE1hdGguZmxvb3IoeCkgJSAyID09PSAwKSB7XG4gICAgICB4ID0gTWF0aC5mbG9vcih4KVxuICAgIH0gZWxzZSB7XG4gICAgICB4ID0gTWF0aC5jZWlsKHgpXG4gICAgfVxuXG4gICAgLy8gMy4gUmV0dXJuIHguXG4gICAgcmV0dXJuIHhcbiAgfVxuXG4gIC8vIDguIElmIHggaXMgTmFOLCArMCwgK+KIniwgb3Ig4oiS4oieLCB0aGVuIHJldHVybiArMC5cbiAgaWYgKFxuICAgIE51bWJlci5pc05hTih4KSB8fFxuICAgICh4ID09PSAwICYmIE9iamVjdC5pcygwLCB4KSkgfHxcbiAgICB4ID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgfHxcbiAgICB4ID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFlcbiAgKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuXG4gIC8vIDkuIFNldCB4IHRvIEludGVnZXJQYXJ0KHgpLlxuICB4ID0gd2ViaWRsLnV0aWwuSW50ZWdlclBhcnQoeClcblxuICAvLyAxMC4gU2V0IHggdG8geCBtb2R1bG8gMl5iaXRMZW5ndGguXG4gIHggPSB4ICUgTWF0aC5wb3coMiwgYml0TGVuZ3RoKVxuXG4gIC8vIDExLiBJZiBzaWduZWRuZXNzIGlzIFwic2lnbmVkXCIgYW5kIHgg4omlIDJeYml0TGVuZ3RoIOKIkiAxLFxuICAvLyAgICB0aGVuIHJldHVybiB4IOKIkiAyXmJpdExlbmd0aC5cbiAgaWYgKHNpZ25lZG5lc3MgPT09ICdzaWduZWQnICYmIHggPj0gTWF0aC5wb3coMiwgYml0TGVuZ3RoKSAtIDEpIHtcbiAgICByZXR1cm4geCAtIE1hdGgucG93KDIsIGJpdExlbmd0aClcbiAgfVxuXG4gIC8vIDEyLiBPdGhlcndpc2UsIHJldHVybiB4LlxuICByZXR1cm4geFxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2Fic3RyYWN0LW9wZGVmLWludGVnZXJwYXJ0XG53ZWJpZGwudXRpbC5JbnRlZ2VyUGFydCA9IGZ1bmN0aW9uIChuKSB7XG4gIC8vIDEuIExldCByIGJlIGZsb29yKGFicyhuKSkuXG4gIGNvbnN0IHIgPSBNYXRoLmZsb29yKE1hdGguYWJzKG4pKVxuXG4gIC8vIDIuIElmIG4gPCAwLCB0aGVuIHJldHVybiAtMSDDlyByLlxuICBpZiAobiA8IDApIHtcbiAgICByZXR1cm4gLTEgKiByXG4gIH1cblxuICAvLyAzLiBPdGhlcndpc2UsIHJldHVybiByLlxuICByZXR1cm4gclxufVxuXG53ZWJpZGwudXRpbC5TdHJpbmdpZnkgPSBmdW5jdGlvbiAoVikge1xuICBjb25zdCB0eXBlID0gd2ViaWRsLnV0aWwuVHlwZShWKVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ1N5bWJvbCc6XG4gICAgICByZXR1cm4gYFN5bWJvbCgke1YuZGVzY3JpcHRpb259KWBcbiAgICBjYXNlICdPYmplY3QnOlxuICAgICAgcmV0dXJuIGluc3BlY3QoVilcbiAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgcmV0dXJuIGBcIiR7Vn1cImBcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGAke1Z9YFxuICB9XG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jZXMtc2VxdWVuY2VcbndlYmlkbC5zZXF1ZW5jZUNvbnZlcnRlciA9IGZ1bmN0aW9uIChjb252ZXJ0ZXIpIHtcbiAgcmV0dXJuIChWLCBwcmVmaXgsIGFyZ3VtZW50LCBJdGVyYWJsZSkgPT4ge1xuICAgIC8vIDEuIElmIFR5cGUoVikgaXMgbm90IE9iamVjdCwgdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKHdlYmlkbC51dGlsLlR5cGUoVikgIT09ICdPYmplY3QnKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgIGhlYWRlcjogcHJlZml4LFxuICAgICAgICBtZXNzYWdlOiBgJHthcmd1bWVudH0gKCR7d2ViaWRsLnV0aWwuU3RyaW5naWZ5KFYpfSkgaXMgbm90IGl0ZXJhYmxlLmBcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gMi4gTGV0IG1ldGhvZCBiZSA/IEdldE1ldGhvZChWLCBAQGl0ZXJhdG9yKS5cbiAgICAvKiogQHR5cGUge0dlbmVyYXRvcn0gKi9cbiAgICBjb25zdCBtZXRob2QgPSB0eXBlb2YgSXRlcmFibGUgPT09ICdmdW5jdGlvbicgPyBJdGVyYWJsZSgpIDogVj8uW1N5bWJvbC5pdGVyYXRvcl0/LigpXG4gICAgY29uc3Qgc2VxID0gW11cbiAgICBsZXQgaW5kZXggPSAwXG5cbiAgICAvLyAzLiBJZiBtZXRob2QgaXMgdW5kZWZpbmVkLCB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAoXG4gICAgICBtZXRob2QgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdHlwZW9mIG1ldGhvZC5uZXh0ICE9PSAnZnVuY3Rpb24nXG4gICAgKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgIGhlYWRlcjogcHJlZml4LFxuICAgICAgICBtZXNzYWdlOiBgJHthcmd1bWVudH0gaXMgbm90IGl0ZXJhYmxlLmBcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNjcmVhdGUtc2VxdWVuY2UtZnJvbS1pdGVyYWJsZVxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBtZXRob2QubmV4dCgpXG5cbiAgICAgIGlmIChkb25lKSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIHNlcS5wdXNoKGNvbnZlcnRlcih2YWx1ZSwgcHJlZml4LCBgJHthcmd1bWVudH1bJHtpbmRleCsrfV1gKSlcbiAgICB9XG5cbiAgICByZXR1cm4gc2VxXG4gIH1cbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNlcy10by1yZWNvcmRcbndlYmlkbC5yZWNvcmRDb252ZXJ0ZXIgPSBmdW5jdGlvbiAoa2V5Q29udmVydGVyLCB2YWx1ZUNvbnZlcnRlcikge1xuICByZXR1cm4gKE8sIHByZWZpeCwgYXJndW1lbnQpID0+IHtcbiAgICAvLyAxLiBJZiBUeXBlKE8pIGlzIG5vdCBPYmplY3QsIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmICh3ZWJpZGwudXRpbC5UeXBlKE8pICE9PSAnT2JqZWN0Jykge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6IHByZWZpeCxcbiAgICAgICAgbWVzc2FnZTogYCR7YXJndW1lbnR9IChcIiR7d2ViaWRsLnV0aWwuVHlwZShPKX1cIikgaXMgbm90IGFuIE9iamVjdC5gXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDIuIExldCByZXN1bHQgYmUgYSBuZXcgZW1wdHkgaW5zdGFuY2Ugb2YgcmVjb3JkPEssIFY+LlxuICAgIGNvbnN0IHJlc3VsdCA9IHt9XG5cbiAgICBpZiAoIXR5cGVzLmlzUHJveHkoTykpIHtcbiAgICAgIC8vIDEuIExldCBkZXNjIGJlID8gTy5bW0dldE93blByb3BlcnR5XV0oa2V5KS5cbiAgICAgIGNvbnN0IGtleXMgPSBbLi4uT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTyksIC4uLk9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoTyldXG5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgLy8gMS4gTGV0IHR5cGVkS2V5IGJlIGtleSBjb252ZXJ0ZWQgdG8gYW4gSURMIHZhbHVlIG9mIHR5cGUgSy5cbiAgICAgICAgY29uc3QgdHlwZWRLZXkgPSBrZXlDb252ZXJ0ZXIoa2V5LCBwcmVmaXgsIGFyZ3VtZW50KVxuXG4gICAgICAgIC8vIDIuIExldCB2YWx1ZSBiZSA/IEdldChPLCBrZXkpLlxuICAgICAgICAvLyAzLiBMZXQgdHlwZWRWYWx1ZSBiZSB2YWx1ZSBjb252ZXJ0ZWQgdG8gYW4gSURMIHZhbHVlIG9mIHR5cGUgVi5cbiAgICAgICAgY29uc3QgdHlwZWRWYWx1ZSA9IHZhbHVlQ29udmVydGVyKE9ba2V5XSwgcHJlZml4LCBhcmd1bWVudClcblxuICAgICAgICAvLyA0LiBTZXQgcmVzdWx0W3R5cGVkS2V5XSB0byB0eXBlZFZhbHVlLlxuICAgICAgICByZXN1bHRbdHlwZWRLZXldID0gdHlwZWRWYWx1ZVxuICAgICAgfVxuXG4gICAgICAvLyA1LiBSZXR1cm4gcmVzdWx0LlxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIC8vIDMuIExldCBrZXlzIGJlID8gTy5bW093blByb3BlcnR5S2V5c11dKCkuXG4gICAgY29uc3Qga2V5cyA9IFJlZmxlY3Qub3duS2V5cyhPKVxuXG4gICAgLy8gNC4gRm9yIGVhY2gga2V5IG9mIGtleXMuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgLy8gMS4gTGV0IGRlc2MgYmUgPyBPLltbR2V0T3duUHJvcGVydHldXShrZXkpLlxuICAgICAgY29uc3QgZGVzYyA9IFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIGtleSlcblxuICAgICAgLy8gMi4gSWYgZGVzYyBpcyBub3QgdW5kZWZpbmVkIGFuZCBkZXNjLltbRW51bWVyYWJsZV1dIGlzIHRydWU6XG4gICAgICBpZiAoZGVzYz8uZW51bWVyYWJsZSkge1xuICAgICAgICAvLyAxLiBMZXQgdHlwZWRLZXkgYmUga2V5IGNvbnZlcnRlZCB0byBhbiBJREwgdmFsdWUgb2YgdHlwZSBLLlxuICAgICAgICBjb25zdCB0eXBlZEtleSA9IGtleUNvbnZlcnRlcihrZXksIHByZWZpeCwgYXJndW1lbnQpXG5cbiAgICAgICAgLy8gMi4gTGV0IHZhbHVlIGJlID8gR2V0KE8sIGtleSkuXG4gICAgICAgIC8vIDMuIExldCB0eXBlZFZhbHVlIGJlIHZhbHVlIGNvbnZlcnRlZCB0byBhbiBJREwgdmFsdWUgb2YgdHlwZSBWLlxuICAgICAgICBjb25zdCB0eXBlZFZhbHVlID0gdmFsdWVDb252ZXJ0ZXIoT1trZXldLCBwcmVmaXgsIGFyZ3VtZW50KVxuXG4gICAgICAgIC8vIDQuIFNldCByZXN1bHRbdHlwZWRLZXldIHRvIHR5cGVkVmFsdWUuXG4gICAgICAgIHJlc3VsdFt0eXBlZEtleV0gPSB0eXBlZFZhbHVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNS4gUmV0dXJuIHJlc3VsdC5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbn1cblxud2ViaWRsLmludGVyZmFjZUNvbnZlcnRlciA9IGZ1bmN0aW9uIChpKSB7XG4gIHJldHVybiAoViwgcHJlZml4LCBhcmd1bWVudCwgb3B0cykgPT4ge1xuICAgIGlmIChvcHRzPy5zdHJpY3QgIT09IGZhbHNlICYmICEoViBpbnN0YW5jZW9mIGkpKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgIGhlYWRlcjogcHJlZml4LFxuICAgICAgICBtZXNzYWdlOiBgRXhwZWN0ZWQgJHthcmd1bWVudH0gKFwiJHt3ZWJpZGwudXRpbC5TdHJpbmdpZnkoVil9XCIpIHRvIGJlIGFuIGluc3RhbmNlIG9mICR7aS5uYW1lfS5gXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBWXG4gIH1cbn1cblxud2ViaWRsLmRpY3Rpb25hcnlDb252ZXJ0ZXIgPSBmdW5jdGlvbiAoY29udmVydGVycykge1xuICByZXR1cm4gKGRpY3Rpb25hcnksIHByZWZpeCwgYXJndW1lbnQpID0+IHtcbiAgICBjb25zdCB0eXBlID0gd2ViaWRsLnV0aWwuVHlwZShkaWN0aW9uYXJ5KVxuICAgIGNvbnN0IGRpY3QgPSB7fVxuXG4gICAgaWYgKHR5cGUgPT09ICdOdWxsJyB8fCB0eXBlID09PSAnVW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGRpY3RcbiAgICB9IGVsc2UgaWYgKHR5cGUgIT09ICdPYmplY3QnKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgIGhlYWRlcjogcHJlZml4LFxuICAgICAgICBtZXNzYWdlOiBgRXhwZWN0ZWQgJHtkaWN0aW9uYXJ5fSB0byBiZSBvbmUgb2Y6IE51bGwsIFVuZGVmaW5lZCwgT2JqZWN0LmBcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBvcHRpb25zIG9mIGNvbnZlcnRlcnMpIHtcbiAgICAgIGNvbnN0IHsga2V5LCBkZWZhdWx0VmFsdWUsIHJlcXVpcmVkLCBjb252ZXJ0ZXIgfSA9IG9wdGlvbnNcblxuICAgICAgaWYgKHJlcXVpcmVkID09PSB0cnVlKSB7XG4gICAgICAgIGlmICghT2JqZWN0Lmhhc093bihkaWN0aW9uYXJ5LCBrZXkpKSB7XG4gICAgICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICAgICAgaGVhZGVyOiBwcmVmaXgsXG4gICAgICAgICAgICBtZXNzYWdlOiBgTWlzc2luZyByZXF1aXJlZCBrZXkgXCIke2tleX1cIi5gXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgdmFsdWUgPSBkaWN0aW9uYXJ5W2tleV1cbiAgICAgIGNvbnN0IGhhc0RlZmF1bHQgPSBPYmplY3QuaGFzT3duKG9wdGlvbnMsICdkZWZhdWx0VmFsdWUnKVxuXG4gICAgICAvLyBPbmx5IHVzZSBkZWZhdWx0VmFsdWUgaWYgdmFsdWUgaXMgdW5kZWZpbmVkIGFuZFxuICAgICAgLy8gYSBkZWZhdWx0VmFsdWUgb3B0aW9ucyB3YXMgcHJvdmlkZWQuXG4gICAgICBpZiAoaGFzRGVmYXVsdCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YWx1ZSA/Pz0gZGVmYXVsdFZhbHVlKClcbiAgICAgIH1cblxuICAgICAgLy8gQSBrZXkgY2FuIGJlIG9wdGlvbmFsIGFuZCBoYXZlIG5vIGRlZmF1bHQgdmFsdWUuXG4gICAgICAvLyBXaGVuIHRoaXMgaGFwcGVucywgZG8gbm90IHBlcmZvcm0gYSBjb252ZXJzaW9uLFxuICAgICAgLy8gYW5kIGRvIG5vdCBhc3NpZ24gdGhlIGtleSBhIHZhbHVlLlxuICAgICAgaWYgKHJlcXVpcmVkIHx8IGhhc0RlZmF1bHQgfHwgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZSA9IGNvbnZlcnRlcih2YWx1ZSwgcHJlZml4LCBgJHthcmd1bWVudH0uJHtrZXl9YClcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgb3B0aW9ucy5hbGxvd2VkVmFsdWVzICYmXG4gICAgICAgICAgIW9wdGlvbnMuYWxsb3dlZFZhbHVlcy5pbmNsdWRlcyh2YWx1ZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICAgICAgaGVhZGVyOiBwcmVmaXgsXG4gICAgICAgICAgICBtZXNzYWdlOiBgJHt2YWx1ZX0gaXMgbm90IGFuIGFjY2VwdGVkIHR5cGUuIEV4cGVjdGVkIG9uZSBvZiAke29wdGlvbnMuYWxsb3dlZFZhbHVlcy5qb2luKCcsICcpfS5gXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGRpY3Rba2V5XSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpY3RcbiAgfVxufVxuXG53ZWJpZGwubnVsbGFibGVDb252ZXJ0ZXIgPSBmdW5jdGlvbiAoY29udmVydGVyKSB7XG4gIHJldHVybiAoViwgcHJlZml4LCBhcmd1bWVudCkgPT4ge1xuICAgIGlmIChWID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gVlxuICAgIH1cblxuICAgIHJldHVybiBjb252ZXJ0ZXIoViwgcHJlZml4LCBhcmd1bWVudClcbiAgfVxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2VzLURPTVN0cmluZ1xud2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nID0gZnVuY3Rpb24gKFYsIHByZWZpeCwgYXJndW1lbnQsIG9wdHMpIHtcbiAgLy8gMS4gSWYgViBpcyBudWxsIGFuZCB0aGUgY29udmVyc2lvbiBpcyB0byBhbiBJREwgdHlwZVxuICAvLyAgICBhc3NvY2lhdGVkIHdpdGggdGhlIFtMZWdhY3lOdWxsVG9FbXB0eVN0cmluZ11cbiAgLy8gICAgZXh0ZW5kZWQgYXR0cmlidXRlLCB0aGVuIHJldHVybiB0aGUgRE9NU3RyaW5nIHZhbHVlXG4gIC8vICAgIHRoYXQgcmVwcmVzZW50cyB0aGUgZW1wdHkgc3RyaW5nLlxuICBpZiAoViA9PT0gbnVsbCAmJiBvcHRzPy5sZWdhY3lOdWxsVG9FbXB0eVN0cmluZykge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgLy8gMi4gTGV0IHggYmUgPyBUb1N0cmluZyhWKS5cbiAgaWYgKHR5cGVvZiBWID09PSAnc3ltYm9sJykge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgIGhlYWRlcjogcHJlZml4LFxuICAgICAgbWVzc2FnZTogYCR7YXJndW1lbnR9IGlzIGEgc3ltYm9sLCB3aGljaCBjYW5ub3QgYmUgY29udmVydGVkIHRvIGEgRE9NU3RyaW5nLmBcbiAgICB9KVxuICB9XG5cbiAgLy8gMy4gUmV0dXJuIHRoZSBJREwgRE9NU3RyaW5nIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGVcbiAgLy8gICAgc2FtZSBzZXF1ZW5jZSBvZiBjb2RlIHVuaXRzIGFzIHRoZSBvbmUgdGhlXG4gIC8vICAgIEVDTUFTY3JpcHQgU3RyaW5nIHZhbHVlIHggcmVwcmVzZW50cy5cbiAgcmV0dXJuIFN0cmluZyhWKVxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2VzLUJ5dGVTdHJpbmdcbndlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmcgPSBmdW5jdGlvbiAoViwgcHJlZml4LCBhcmd1bWVudCkge1xuICAvLyAxLiBMZXQgeCBiZSA/IFRvU3RyaW5nKFYpLlxuICAvLyBOb3RlOiBET01TdHJpbmcgY29udmVydGVyIHBlcmZvcm0gPyBUb1N0cmluZyhWKVxuICBjb25zdCB4ID0gd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKFYsIHByZWZpeCwgYXJndW1lbnQpXG5cbiAgLy8gMi4gSWYgdGhlIHZhbHVlIG9mIGFueSBlbGVtZW50IG9mIHggaXMgZ3JlYXRlciB0aGFuXG4gIC8vICAgIDI1NSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHgubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgaWYgKHguY2hhckNvZGVBdChpbmRleCkgPiAyNTUpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdDYW5ub3QgY29udmVydCBhcmd1bWVudCB0byBhIEJ5dGVTdHJpbmcgYmVjYXVzZSB0aGUgY2hhcmFjdGVyIGF0ICcgK1xuICAgICAgICBgaW5kZXggJHtpbmRleH0gaGFzIGEgdmFsdWUgb2YgJHt4LmNoYXJDb2RlQXQoaW5kZXgpfSB3aGljaCBpcyBncmVhdGVyIHRoYW4gMjU1LmBcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICAvLyAzLiBSZXR1cm4gYW4gSURMIEJ5dGVTdHJpbmcgdmFsdWUgd2hvc2UgbGVuZ3RoIGlzIHRoZVxuICAvLyAgICBsZW5ndGggb2YgeCwgYW5kIHdoZXJlIHRoZSB2YWx1ZSBvZiBlYWNoIGVsZW1lbnQgaXNcbiAgLy8gICAgdGhlIHZhbHVlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgeC5cbiAgcmV0dXJuIHhcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNlcy1VU1ZTdHJpbmdcbi8vIFRPRE86IHJld3JpdGUgdGhpcyBzbyB3ZSBjYW4gY29udHJvbCB0aGUgZXJyb3JzIHRocm93blxud2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nID0gdG9VU1ZTdHJpbmdcblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNlcy1ib29sZWFuXG53ZWJpZGwuY29udmVydGVycy5ib29sZWFuID0gZnVuY3Rpb24gKFYpIHtcbiAgLy8gMS4gTGV0IHggYmUgdGhlIHJlc3VsdCBvZiBjb21wdXRpbmcgVG9Cb29sZWFuKFYpLlxuICBjb25zdCB4ID0gQm9vbGVhbihWKVxuXG4gIC8vIDIuIFJldHVybiB0aGUgSURMIGJvb2xlYW4gdmFsdWUgdGhhdCBpcyB0aGUgb25lIHRoYXQgcmVwcmVzZW50c1xuICAvLyAgICB0aGUgc2FtZSB0cnV0aCB2YWx1ZSBhcyB0aGUgRUNNQVNjcmlwdCBCb29sZWFuIHZhbHVlIHguXG4gIHJldHVybiB4XG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jZXMtYW55XG53ZWJpZGwuY29udmVydGVycy5hbnkgPSBmdW5jdGlvbiAoVikge1xuICByZXR1cm4gVlxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2VzLWxvbmctbG9uZ1xud2ViaWRsLmNvbnZlcnRlcnNbJ2xvbmcgbG9uZyddID0gZnVuY3Rpb24gKFYsIHByZWZpeCwgYXJndW1lbnQpIHtcbiAgLy8gMS4gTGV0IHggYmUgPyBDb252ZXJ0VG9JbnQoViwgNjQsIFwic2lnbmVkXCIpLlxuICBjb25zdCB4ID0gd2ViaWRsLnV0aWwuQ29udmVydFRvSW50KFYsIDY0LCAnc2lnbmVkJywgdW5kZWZpbmVkLCBwcmVmaXgsIGFyZ3VtZW50KVxuXG4gIC8vIDIuIFJldHVybiB0aGUgSURMIGxvbmcgbG9uZyB2YWx1ZSB0aGF0IHJlcHJlc2VudHNcbiAgLy8gICAgdGhlIHNhbWUgbnVtZXJpYyB2YWx1ZSBhcyB4LlxuICByZXR1cm4geFxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2VzLXVuc2lnbmVkLWxvbmctbG9uZ1xud2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIGxvbmcgbG9uZyddID0gZnVuY3Rpb24gKFYsIHByZWZpeCwgYXJndW1lbnQpIHtcbiAgLy8gMS4gTGV0IHggYmUgPyBDb252ZXJ0VG9JbnQoViwgNjQsIFwidW5zaWduZWRcIikuXG4gIGNvbnN0IHggPSB3ZWJpZGwudXRpbC5Db252ZXJ0VG9JbnQoViwgNjQsICd1bnNpZ25lZCcsIHVuZGVmaW5lZCwgcHJlZml4LCBhcmd1bWVudClcblxuICAvLyAyLiBSZXR1cm4gdGhlIElETCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUgdGhhdFxuICAvLyAgICByZXByZXNlbnRzIHRoZSBzYW1lIG51bWVyaWMgdmFsdWUgYXMgeC5cbiAgcmV0dXJuIHhcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNlcy11bnNpZ25lZC1sb25nXG53ZWJpZGwuY29udmVydGVyc1sndW5zaWduZWQgbG9uZyddID0gZnVuY3Rpb24gKFYsIHByZWZpeCwgYXJndW1lbnQpIHtcbiAgLy8gMS4gTGV0IHggYmUgPyBDb252ZXJ0VG9JbnQoViwgMzIsIFwidW5zaWduZWRcIikuXG4gIGNvbnN0IHggPSB3ZWJpZGwudXRpbC5Db252ZXJ0VG9JbnQoViwgMzIsICd1bnNpZ25lZCcsIHVuZGVmaW5lZCwgcHJlZml4LCBhcmd1bWVudClcblxuICAvLyAyLiBSZXR1cm4gdGhlIElETCB1bnNpZ25lZCBsb25nIHZhbHVlIHRoYXRcbiAgLy8gICAgcmVwcmVzZW50cyB0aGUgc2FtZSBudW1lcmljIHZhbHVlIGFzIHguXG4gIHJldHVybiB4XG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jZXMtdW5zaWduZWQtc2hvcnRcbndlYmlkbC5jb252ZXJ0ZXJzWyd1bnNpZ25lZCBzaG9ydCddID0gZnVuY3Rpb24gKFYsIHByZWZpeCwgYXJndW1lbnQsIG9wdHMpIHtcbiAgLy8gMS4gTGV0IHggYmUgPyBDb252ZXJ0VG9JbnQoViwgMTYsIFwidW5zaWduZWRcIikuXG4gIGNvbnN0IHggPSB3ZWJpZGwudXRpbC5Db252ZXJ0VG9JbnQoViwgMTYsICd1bnNpZ25lZCcsIG9wdHMsIHByZWZpeCwgYXJndW1lbnQpXG5cbiAgLy8gMi4gUmV0dXJuIHRoZSBJREwgdW5zaWduZWQgc2hvcnQgdmFsdWUgdGhhdCByZXByZXNlbnRzXG4gIC8vICAgIHRoZSBzYW1lIG51bWVyaWMgdmFsdWUgYXMgeC5cbiAgcmV0dXJuIHhcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNpZGwtQXJyYXlCdWZmZXJcbndlYmlkbC5jb252ZXJ0ZXJzLkFycmF5QnVmZmVyID0gZnVuY3Rpb24gKFYsIHByZWZpeCwgYXJndW1lbnQsIG9wdHMpIHtcbiAgLy8gMS4gSWYgVHlwZShWKSBpcyBub3QgT2JqZWN0LCBvciBWIGRvZXMgbm90IGhhdmUgYW5cbiAgLy8gICAgW1tBcnJheUJ1ZmZlckRhdGFdXSBpbnRlcm5hbCBzbG90LCB0aGVuIHRocm93IGFcbiAgLy8gICAgVHlwZUVycm9yLlxuICAvLyBzZWU6IGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvcGVydGllcy1vZi10aGUtYXJyYXlidWZmZXItaW5zdGFuY2VzXG4gIC8vIHNlZTogaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9wZXJ0aWVzLW9mLXRoZS1zaGFyZWRhcnJheWJ1ZmZlci1pbnN0YW5jZXNcbiAgaWYgKFxuICAgIHdlYmlkbC51dGlsLlR5cGUoVikgIT09ICdPYmplY3QnIHx8XG4gICAgIXR5cGVzLmlzQW55QXJyYXlCdWZmZXIoVilcbiAgKSB7XG4gICAgdGhyb3cgd2ViaWRsLmVycm9ycy5jb252ZXJzaW9uRmFpbGVkKHtcbiAgICAgIHByZWZpeCxcbiAgICAgIGFyZ3VtZW50OiBgJHthcmd1bWVudH0gKFwiJHt3ZWJpZGwudXRpbC5TdHJpbmdpZnkoVil9XCIpYCxcbiAgICAgIHR5cGVzOiBbJ0FycmF5QnVmZmVyJ11cbiAgICB9KVxuICB9XG5cbiAgLy8gMi4gSWYgdGhlIGNvbnZlcnNpb24gaXMgbm90IHRvIGFuIElETCB0eXBlIGFzc29jaWF0ZWRcbiAgLy8gICAgd2l0aCB0aGUgW0FsbG93U2hhcmVkXSBleHRlbmRlZCBhdHRyaWJ1dGUsIGFuZFxuICAvLyAgICBJc1NoYXJlZEFycmF5QnVmZmVyKFYpIGlzIHRydWUsIHRoZW4gdGhyb3cgYVxuICAvLyAgICBUeXBlRXJyb3IuXG4gIGlmIChvcHRzPy5hbGxvd1NoYXJlZCA9PT0gZmFsc2UgJiYgdHlwZXMuaXNTaGFyZWRBcnJheUJ1ZmZlcihWKSkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgIGhlYWRlcjogJ0FycmF5QnVmZmVyJyxcbiAgICAgIG1lc3NhZ2U6ICdTaGFyZWRBcnJheUJ1ZmZlciBpcyBub3QgYWxsb3dlZC4nXG4gICAgfSlcbiAgfVxuXG4gIC8vIDMuIElmIHRoZSBjb252ZXJzaW9uIGlzIG5vdCB0byBhbiBJREwgdHlwZSBhc3NvY2lhdGVkXG4gIC8vICAgIHdpdGggdGhlIFtBbGxvd1Jlc2l6YWJsZV0gZXh0ZW5kZWQgYXR0cmlidXRlLCBhbmRcbiAgLy8gICAgSXNSZXNpemFibGVBcnJheUJ1ZmZlcihWKSBpcyB0cnVlLCB0aGVuIHRocm93IGFcbiAgLy8gICAgVHlwZUVycm9yLlxuICBpZiAoVi5yZXNpemFibGUgfHwgVi5ncm93YWJsZSkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgIGhlYWRlcjogJ0FycmF5QnVmZmVyJyxcbiAgICAgIG1lc3NhZ2U6ICdSZWNlaXZlZCBhIHJlc2l6YWJsZSBBcnJheUJ1ZmZlci4nXG4gICAgfSlcbiAgfVxuXG4gIC8vIDQuIFJldHVybiB0aGUgSURMIEFycmF5QnVmZmVyIHZhbHVlIHRoYXQgaXMgYVxuICAvLyAgICByZWZlcmVuY2UgdG8gdGhlIHNhbWUgb2JqZWN0IGFzIFYuXG4gIHJldHVybiBWXG59XG5cbndlYmlkbC5jb252ZXJ0ZXJzLlR5cGVkQXJyYXkgPSBmdW5jdGlvbiAoViwgVCwgcHJlZml4LCBuYW1lLCBvcHRzKSB7XG4gIC8vIDEuIExldCBUIGJlIHRoZSBJREwgdHlwZSBWIGlzIGJlaW5nIGNvbnZlcnRlZCB0by5cblxuICAvLyAyLiBJZiBUeXBlKFYpIGlzIG5vdCBPYmplY3QsIG9yIFYgZG9lcyBub3QgaGF2ZSBhXG4gIC8vICAgIFtbVHlwZWRBcnJheU5hbWVdXSBpbnRlcm5hbCBzbG90IHdpdGggYSB2YWx1ZVxuICAvLyAgICBlcXVhbCB0byBU4oCZcyBuYW1lLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICBpZiAoXG4gICAgd2ViaWRsLnV0aWwuVHlwZShWKSAhPT0gJ09iamVjdCcgfHxcbiAgICAhdHlwZXMuaXNUeXBlZEFycmF5KFYpIHx8XG4gICAgVi5jb25zdHJ1Y3Rvci5uYW1lICE9PSBULm5hbWVcbiAgKSB7XG4gICAgdGhyb3cgd2ViaWRsLmVycm9ycy5jb252ZXJzaW9uRmFpbGVkKHtcbiAgICAgIHByZWZpeCxcbiAgICAgIGFyZ3VtZW50OiBgJHtuYW1lfSAoXCIke3dlYmlkbC51dGlsLlN0cmluZ2lmeShWKX1cIilgLFxuICAgICAgdHlwZXM6IFtULm5hbWVdXG4gICAgfSlcbiAgfVxuXG4gIC8vIDMuIElmIHRoZSBjb252ZXJzaW9uIGlzIG5vdCB0byBhbiBJREwgdHlwZSBhc3NvY2lhdGVkXG4gIC8vICAgIHdpdGggdGhlIFtBbGxvd1NoYXJlZF0gZXh0ZW5kZWQgYXR0cmlidXRlLCBhbmRcbiAgLy8gICAgSXNTaGFyZWRBcnJheUJ1ZmZlcihWLltbVmlld2VkQXJyYXlCdWZmZXJdXSkgaXNcbiAgLy8gICAgdHJ1ZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgaWYgKG9wdHM/LmFsbG93U2hhcmVkID09PSBmYWxzZSAmJiB0eXBlcy5pc1NoYXJlZEFycmF5QnVmZmVyKFYuYnVmZmVyKSkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgIGhlYWRlcjogJ0FycmF5QnVmZmVyJyxcbiAgICAgIG1lc3NhZ2U6ICdTaGFyZWRBcnJheUJ1ZmZlciBpcyBub3QgYWxsb3dlZC4nXG4gICAgfSlcbiAgfVxuXG4gIC8vIDQuIElmIHRoZSBjb252ZXJzaW9uIGlzIG5vdCB0byBhbiBJREwgdHlwZSBhc3NvY2lhdGVkXG4gIC8vICAgIHdpdGggdGhlIFtBbGxvd1Jlc2l6YWJsZV0gZXh0ZW5kZWQgYXR0cmlidXRlLCBhbmRcbiAgLy8gICAgSXNSZXNpemFibGVBcnJheUJ1ZmZlcihWLltbVmlld2VkQXJyYXlCdWZmZXJdXSkgaXNcbiAgLy8gICAgdHJ1ZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgaWYgKFYuYnVmZmVyLnJlc2l6YWJsZSB8fCBWLmJ1ZmZlci5ncm93YWJsZSkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgIGhlYWRlcjogJ0FycmF5QnVmZmVyJyxcbiAgICAgIG1lc3NhZ2U6ICdSZWNlaXZlZCBhIHJlc2l6YWJsZSBBcnJheUJ1ZmZlci4nXG4gICAgfSlcbiAgfVxuXG4gIC8vIDUuIFJldHVybiB0aGUgSURMIHZhbHVlIG9mIHR5cGUgVCB0aGF0IGlzIGEgcmVmZXJlbmNlXG4gIC8vICAgIHRvIHRoZSBzYW1lIG9iamVjdCBhcyBWLlxuICByZXR1cm4gVlxufVxuXG53ZWJpZGwuY29udmVydGVycy5EYXRhVmlldyA9IGZ1bmN0aW9uIChWLCBwcmVmaXgsIG5hbWUsIG9wdHMpIHtcbiAgLy8gMS4gSWYgVHlwZShWKSBpcyBub3QgT2JqZWN0LCBvciBWIGRvZXMgbm90IGhhdmUgYVxuICAvLyAgICBbW0RhdGFWaWV3XV0gaW50ZXJuYWwgc2xvdCwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgaWYgKHdlYmlkbC51dGlsLlR5cGUoVikgIT09ICdPYmplY3QnIHx8ICF0eXBlcy5pc0RhdGFWaWV3KFYpKSB7XG4gICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgaGVhZGVyOiBwcmVmaXgsXG4gICAgICBtZXNzYWdlOiBgJHtuYW1lfSBpcyBub3QgYSBEYXRhVmlldy5gXG4gICAgfSlcbiAgfVxuXG4gIC8vIDIuIElmIHRoZSBjb252ZXJzaW9uIGlzIG5vdCB0byBhbiBJREwgdHlwZSBhc3NvY2lhdGVkXG4gIC8vICAgIHdpdGggdGhlIFtBbGxvd1NoYXJlZF0gZXh0ZW5kZWQgYXR0cmlidXRlLCBhbmRcbiAgLy8gICAgSXNTaGFyZWRBcnJheUJ1ZmZlcihWLltbVmlld2VkQXJyYXlCdWZmZXJdXSkgaXMgdHJ1ZSxcbiAgLy8gICAgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgaWYgKG9wdHM/LmFsbG93U2hhcmVkID09PSBmYWxzZSAmJiB0eXBlcy5pc1NoYXJlZEFycmF5QnVmZmVyKFYuYnVmZmVyKSkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgIGhlYWRlcjogJ0FycmF5QnVmZmVyJyxcbiAgICAgIG1lc3NhZ2U6ICdTaGFyZWRBcnJheUJ1ZmZlciBpcyBub3QgYWxsb3dlZC4nXG4gICAgfSlcbiAgfVxuXG4gIC8vIDMuIElmIHRoZSBjb252ZXJzaW9uIGlzIG5vdCB0byBhbiBJREwgdHlwZSBhc3NvY2lhdGVkXG4gIC8vICAgIHdpdGggdGhlIFtBbGxvd1Jlc2l6YWJsZV0gZXh0ZW5kZWQgYXR0cmlidXRlLCBhbmRcbiAgLy8gICAgSXNSZXNpemFibGVBcnJheUJ1ZmZlcihWLltbVmlld2VkQXJyYXlCdWZmZXJdXSkgaXNcbiAgLy8gICAgdHJ1ZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgaWYgKFYuYnVmZmVyLnJlc2l6YWJsZSB8fCBWLmJ1ZmZlci5ncm93YWJsZSkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgIGhlYWRlcjogJ0FycmF5QnVmZmVyJyxcbiAgICAgIG1lc3NhZ2U6ICdSZWNlaXZlZCBhIHJlc2l6YWJsZSBBcnJheUJ1ZmZlci4nXG4gICAgfSlcbiAgfVxuXG4gIC8vIDQuIFJldHVybiB0aGUgSURMIERhdGFWaWV3IHZhbHVlIHRoYXQgaXMgYSByZWZlcmVuY2VcbiAgLy8gICAgdG8gdGhlIHNhbWUgb2JqZWN0IGFzIFYuXG4gIHJldHVybiBWXG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jQnVmZmVyU291cmNlXG53ZWJpZGwuY29udmVydGVycy5CdWZmZXJTb3VyY2UgPSBmdW5jdGlvbiAoViwgcHJlZml4LCBuYW1lLCBvcHRzKSB7XG4gIGlmICh0eXBlcy5pc0FueUFycmF5QnVmZmVyKFYpKSB7XG4gICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLkFycmF5QnVmZmVyKFYsIHByZWZpeCwgbmFtZSwgeyAuLi5vcHRzLCBhbGxvd1NoYXJlZDogZmFsc2UgfSlcbiAgfVxuXG4gIGlmICh0eXBlcy5pc1R5cGVkQXJyYXkoVikpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuVHlwZWRBcnJheShWLCBWLmNvbnN0cnVjdG9yLCBwcmVmaXgsIG5hbWUsIHsgLi4ub3B0cywgYWxsb3dTaGFyZWQ6IGZhbHNlIH0pXG4gIH1cblxuICBpZiAodHlwZXMuaXNEYXRhVmlldyhWKSkge1xuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5EYXRhVmlldyhWLCBwcmVmaXgsIG5hbWUsIHsgLi4ub3B0cywgYWxsb3dTaGFyZWQ6IGZhbHNlIH0pXG4gIH1cblxuICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmNvbnZlcnNpb25GYWlsZWQoe1xuICAgIHByZWZpeCxcbiAgICBhcmd1bWVudDogYCR7bmFtZX0gKFwiJHt3ZWJpZGwudXRpbC5TdHJpbmdpZnkoVil9XCIpYCxcbiAgICB0eXBlczogWydCdWZmZXJTb3VyY2UnXVxuICB9KVxufVxuXG53ZWJpZGwuY29udmVydGVyc1snc2VxdWVuY2U8Qnl0ZVN0cmluZz4nXSA9IHdlYmlkbC5zZXF1ZW5jZUNvbnZlcnRlcihcbiAgd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZ1xuKVxuXG53ZWJpZGwuY29udmVydGVyc1snc2VxdWVuY2U8c2VxdWVuY2U8Qnl0ZVN0cmluZz4+J10gPSB3ZWJpZGwuc2VxdWVuY2VDb252ZXJ0ZXIoXG4gIHdlYmlkbC5jb252ZXJ0ZXJzWydzZXF1ZW5jZTxCeXRlU3RyaW5nPiddXG4pXG5cbndlYmlkbC5jb252ZXJ0ZXJzWydyZWNvcmQ8Qnl0ZVN0cmluZywgQnl0ZVN0cmluZz4nXSA9IHdlYmlkbC5yZWNvcmRDb252ZXJ0ZXIoXG4gIHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmcsXG4gIHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmdcbilcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHdlYmlkbFxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgVHJhbnNmb3JtIH0gPSByZXF1aXJlKCdub2RlOnN0cmVhbScpXG5jb25zdCB6bGliID0gcmVxdWlyZSgnbm9kZTp6bGliJylcbmNvbnN0IHsgcmVkaXJlY3RTdGF0dXNTZXQsIHJlZmVycmVyUG9saWN5U2V0OiByZWZlcnJlclBvbGljeVRva2VucywgYmFkUG9ydHNTZXQgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IHsgZ2V0R2xvYmFsT3JpZ2luIH0gPSByZXF1aXJlKCcuL2dsb2JhbCcpXG5jb25zdCB7IGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHMsIGNvbGxlY3RBbkhUVFBRdW90ZWRTdHJpbmcsIHJlbW92ZUNoYXJzLCBwYXJzZU1JTUVUeXBlIH0gPSByZXF1aXJlKCcuL2RhdGEtdXJsJylcbmNvbnN0IHsgcGVyZm9ybWFuY2UgfSA9IHJlcXVpcmUoJ25vZGU6cGVyZl9ob29rcycpXG5jb25zdCB7IGlzQmxvYkxpa2UsIFJlYWRhYmxlU3RyZWFtRnJvbSwgaXNWYWxpZEhUVFBUb2tlbiwgbm9ybWFsaXplZE1ldGhvZFJlY29yZHNCYXNlIH0gPSByZXF1aXJlKCcuLi8uLi9jb3JlL3V0aWwnKVxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnbm9kZTphc3NlcnQnKVxuY29uc3QgeyBpc1VpbnQ4QXJyYXkgfSA9IHJlcXVpcmUoJ25vZGU6dXRpbC90eXBlcycpXG5jb25zdCB7IHdlYmlkbCB9ID0gcmVxdWlyZSgnLi93ZWJpZGwnKVxuXG5sZXQgc3VwcG9ydGVkSGFzaGVzID0gW11cblxuLy8gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9jcnlwdG8uaHRtbCNkZXRlcm1pbmluZy1pZi1jcnlwdG8tc3VwcG9ydC1pcy11bmF2YWlsYWJsZVxuLyoqIEB0eXBlIHtpbXBvcnQoJ2NyeXB0bycpfSAqL1xubGV0IGNyeXB0b1xudHJ5IHtcbiAgY3J5cHRvID0gcmVxdWlyZSgnbm9kZTpjcnlwdG8nKVxuICBjb25zdCBwb3NzaWJsZVJlbGV2YW50SGFzaGVzID0gWydzaGEyNTYnLCAnc2hhMzg0JywgJ3NoYTUxMiddXG4gIHN1cHBvcnRlZEhhc2hlcyA9IGNyeXB0by5nZXRIYXNoZXMoKS5maWx0ZXIoKGhhc2gpID0+IHBvc3NpYmxlUmVsZXZhbnRIYXNoZXMuaW5jbHVkZXMoaGFzaCkpXG4vKiBjOCBpZ25vcmUgbmV4dCAzICovXG59IGNhdGNoIHtcblxufVxuXG5mdW5jdGlvbiByZXNwb25zZVVSTCAocmVzcG9uc2UpIHtcbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI3Jlc3BvbnNlc1xuICAvLyBBIHJlc3BvbnNlIGhhcyBhbiBhc3NvY2lhdGVkIFVSTC4gSXQgaXMgYSBwb2ludGVyIHRvIHRoZSBsYXN0IFVSTFxuICAvLyBpbiByZXNwb25zZeKAmXMgVVJMIGxpc3QgYW5kIG51bGwgaWYgcmVzcG9uc2XigJlzIFVSTCBsaXN0IGlzIGVtcHR5LlxuICBjb25zdCB1cmxMaXN0ID0gcmVzcG9uc2UudXJsTGlzdFxuICBjb25zdCBsZW5ndGggPSB1cmxMaXN0Lmxlbmd0aFxuICByZXR1cm4gbGVuZ3RoID09PSAwID8gbnVsbCA6IHVybExpc3RbbGVuZ3RoIC0gMV0udG9TdHJpbmcoKVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1yZXNwb25zZS1sb2NhdGlvbi11cmxcbmZ1bmN0aW9uIHJlc3BvbnNlTG9jYXRpb25VUkwgKHJlc3BvbnNlLCByZXF1ZXN0RnJhZ21lbnQpIHtcbiAgLy8gMS4gSWYgcmVzcG9uc2XigJlzIHN0YXR1cyBpcyBub3QgYSByZWRpcmVjdCBzdGF0dXMsIHRoZW4gcmV0dXJuIG51bGwuXG4gIGlmICghcmVkaXJlY3RTdGF0dXNTZXQuaGFzKHJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLy8gMi4gTGV0IGxvY2F0aW9uIGJlIHRoZSByZXN1bHQgb2YgZXh0cmFjdGluZyBoZWFkZXIgbGlzdCB2YWx1ZXMgZ2l2ZW5cbiAgLy8gYExvY2F0aW9uYCBhbmQgcmVzcG9uc2XigJlzIGhlYWRlciBsaXN0LlxuICBsZXQgbG9jYXRpb24gPSByZXNwb25zZS5oZWFkZXJzTGlzdC5nZXQoJ2xvY2F0aW9uJywgdHJ1ZSlcblxuICAvLyAzLiBJZiBsb2NhdGlvbiBpcyBhIGhlYWRlciB2YWx1ZSwgdGhlbiBzZXQgbG9jYXRpb24gdG8gdGhlIHJlc3VsdCBvZlxuICAvLyAgICBwYXJzaW5nIGxvY2F0aW9uIHdpdGggcmVzcG9uc2XigJlzIFVSTC5cbiAgaWYgKGxvY2F0aW9uICE9PSBudWxsICYmIGlzVmFsaWRIZWFkZXJWYWx1ZShsb2NhdGlvbikpIHtcbiAgICBpZiAoIWlzVmFsaWRFbmNvZGVkVVJMKGxvY2F0aW9uKSkge1xuICAgICAgLy8gU29tZSB3ZWJzaXRlcyByZXNwb25kIGxvY2F0aW9uIGhlYWRlciBpbiBVVEYtOCBmb3JtIHdpdGhvdXQgZW5jb2RpbmcgdGhlbSBhcyBBU0NJSVxuICAgICAgLy8gYW5kIG1ham9yIGJyb3dzZXJzIHJlZGlyZWN0IHRoZW0gdG8gY29ycmVjdGx5IFVURi04IGVuY29kZWQgYWRkcmVzc2VzLlxuICAgICAgLy8gSGVyZSwgd2UgaGFuZGxlIHRoYXQgYmVoYXZpb3IgaW4gdGhlIHNhbWUgd2F5LlxuICAgICAgbG9jYXRpb24gPSBub3JtYWxpemVCaW5hcnlTdHJpbmdUb1V0ZjgobG9jYXRpb24pXG4gICAgfVxuICAgIGxvY2F0aW9uID0gbmV3IFVSTChsb2NhdGlvbiwgcmVzcG9uc2VVUkwocmVzcG9uc2UpKVxuICB9XG5cbiAgLy8gNC4gSWYgbG9jYXRpb24gaXMgYSBVUkwgd2hvc2UgZnJhZ21lbnQgaXMgbnVsbCwgdGhlbiBzZXQgbG9jYXRpb27igJlzXG4gIC8vIGZyYWdtZW50IHRvIHJlcXVlc3RGcmFnbWVudC5cbiAgaWYgKGxvY2F0aW9uICYmICFsb2NhdGlvbi5oYXNoKSB7XG4gICAgbG9jYXRpb24uaGFzaCA9IHJlcXVlc3RGcmFnbWVudFxuICB9XG5cbiAgLy8gNS4gUmV0dXJuIGxvY2F0aW9uLlxuICByZXR1cm4gbG9jYXRpb25cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmMxNzM4I3NlY3Rpb24tMi4yXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNWYWxpZEVuY29kZWRVUkwgKHVybCkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHVybC5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IGNvZGUgPSB1cmwuY2hhckNvZGVBdChpKVxuXG4gICAgaWYgKFxuICAgICAgY29kZSA+IDB4N0UgfHwgLy8gTm9uLVVTLUFTQ0lJICsgREVMXG4gICAgICBjb2RlIDwgMHgyMCAvLyBDb250cm9sIGNoYXJhY3RlcnMgTlVMIC0gVVNcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIElmIHN0cmluZyBjb250YWlucyBub24tQVNDSUkgY2hhcmFjdGVycywgYXNzdW1lcyBpdCdzIFVURi04IGVuY29kZWQgYW5kIGRlY29kZXMgaXQuXG4gKiBTaW5jZSBVVEYtOCBpcyBhIHN1cGVyc2V0IG9mIEFTQ0lJLCB0aGlzIHdpbGwgd29yayBmb3IgQVNDSUkgc3RyaW5ncyBhcyB3ZWxsLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBub3JtYWxpemVCaW5hcnlTdHJpbmdUb1V0ZjggKHZhbHVlKSB7XG4gIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSwgJ2JpbmFyeScpLnRvU3RyaW5nKCd1dGY4Jylcbn1cblxuLyoqIEByZXR1cm5zIHtVUkx9ICovXG5mdW5jdGlvbiByZXF1ZXN0Q3VycmVudFVSTCAocmVxdWVzdCkge1xuICByZXR1cm4gcmVxdWVzdC51cmxMaXN0W3JlcXVlc3QudXJsTGlzdC5sZW5ndGggLSAxXVxufVxuXG5mdW5jdGlvbiByZXF1ZXN0QmFkUG9ydCAocmVxdWVzdCkge1xuICAvLyAxLiBMZXQgdXJsIGJlIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJMLlxuICBjb25zdCB1cmwgPSByZXF1ZXN0Q3VycmVudFVSTChyZXF1ZXN0KVxuXG4gIC8vIDIuIElmIHVybOKAmXMgc2NoZW1lIGlzIGFuIEhUVFAoUykgc2NoZW1lIGFuZCB1cmzigJlzIHBvcnQgaXMgYSBiYWQgcG9ydCxcbiAgLy8gdGhlbiByZXR1cm4gYmxvY2tlZC5cbiAgaWYgKHVybElzSHR0cEh0dHBzU2NoZW1lKHVybCkgJiYgYmFkUG9ydHNTZXQuaGFzKHVybC5wb3J0KSkge1xuICAgIHJldHVybiAnYmxvY2tlZCdcbiAgfVxuXG4gIC8vIDMuIFJldHVybiBhbGxvd2VkLlxuICByZXR1cm4gJ2FsbG93ZWQnXG59XG5cbmZ1bmN0aW9uIGlzRXJyb3JMaWtlIChvYmplY3QpIHtcbiAgcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIEVycm9yIHx8IChcbiAgICBvYmplY3Q/LmNvbnN0cnVjdG9yPy5uYW1lID09PSAnRXJyb3InIHx8XG4gICAgb2JqZWN0Py5jb25zdHJ1Y3Rvcj8ubmFtZSA9PT0gJ0RPTUV4Y2VwdGlvbidcbiAgKVxufVxuXG4vLyBDaGVjayB3aGV0aGVyIHxzdGF0dXNUZXh0fCBpcyBhIEJ5dGVTdHJpbmcgYW5kXG4vLyBtYXRjaGVzIHRoZSBSZWFzb24tUGhyYXNlIHRva2VuIHByb2R1Y3Rpb24uXG4vLyBSRkMgMjYxNjogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzI2MTZcbi8vIFJGQyA3MjMwOiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMFxuLy8gXCJyZWFzb24tcGhyYXNlID0gKiggSFRBQiAvIFNQIC8gVkNIQVIgLyBvYnMtdGV4dCApXCJcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJvbWl1bS9jaHJvbWl1bS9ibG9iLzk0LjAuNDYwNC4xL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvZmV0Y2gvcmVzcG9uc2UuY2MjTDExNlxuZnVuY3Rpb24gaXNWYWxpZFJlYXNvblBocmFzZSAoc3RhdHVzVGV4dCkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YXR1c1RleHQubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBjID0gc3RhdHVzVGV4dC5jaGFyQ29kZUF0KGkpXG4gICAgaWYgKFxuICAgICAgIShcbiAgICAgICAgKFxuICAgICAgICAgIGMgPT09IDB4MDkgfHwgLy8gSFRBQlxuICAgICAgICAgIChjID49IDB4MjAgJiYgYyA8PSAweDdlKSB8fCAvLyBTUCAvIFZDSEFSXG4gICAgICAgICAgKGMgPj0gMHg4MCAmJiBjIDw9IDB4ZmYpXG4gICAgICAgICkgLy8gb2JzLXRleHRcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2hlYWRlci1uYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcG90ZW50aWFsVmFsdWVcbiAqL1xuY29uc3QgaXNWYWxpZEhlYWRlck5hbWUgPSBpc1ZhbGlkSFRUUFRva2VuXG5cbi8qKlxuICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaGVhZGVyLXZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gcG90ZW50aWFsVmFsdWVcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZEhlYWRlclZhbHVlIChwb3RlbnRpYWxWYWx1ZSkge1xuICAvLyAtIEhhcyBubyBsZWFkaW5nIG9yIHRyYWlsaW5nIEhUVFAgdGFiIG9yIHNwYWNlIGJ5dGVzLlxuICAvLyAtIENvbnRhaW5zIG5vIDB4MDAgKE5VTCkgb3IgSFRUUCBuZXdsaW5lIGJ5dGVzLlxuICByZXR1cm4gKFxuICAgIHBvdGVudGlhbFZhbHVlWzBdID09PSAnXFx0JyB8fFxuICAgIHBvdGVudGlhbFZhbHVlWzBdID09PSAnICcgfHxcbiAgICBwb3RlbnRpYWxWYWx1ZVtwb3RlbnRpYWxWYWx1ZS5sZW5ndGggLSAxXSA9PT0gJ1xcdCcgfHxcbiAgICBwb3RlbnRpYWxWYWx1ZVtwb3RlbnRpYWxWYWx1ZS5sZW5ndGggLSAxXSA9PT0gJyAnIHx8XG4gICAgcG90ZW50aWFsVmFsdWUuaW5jbHVkZXMoJ1xcbicpIHx8XG4gICAgcG90ZW50aWFsVmFsdWUuaW5jbHVkZXMoJ1xccicpIHx8XG4gICAgcG90ZW50aWFsVmFsdWUuaW5jbHVkZXMoJ1xcMCcpXG4gICkgPT09IGZhbHNlXG59XG5cbi8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtcmVmZXJyZXItcG9saWN5LyNzZXQtcmVxdWVzdHMtcmVmZXJyZXItcG9saWN5LW9uLXJlZGlyZWN0XG5mdW5jdGlvbiBzZXRSZXF1ZXN0UmVmZXJyZXJQb2xpY3lPblJlZGlyZWN0IChyZXF1ZXN0LCBhY3R1YWxSZXNwb25zZSkge1xuICAvLyAgR2l2ZW4gYSByZXF1ZXN0IHJlcXVlc3QgYW5kIGEgcmVzcG9uc2UgYWN0dWFsUmVzcG9uc2UsIHRoaXMgYWxnb3JpdGhtXG4gIC8vICB1cGRhdGVzIHJlcXVlc3TigJlzIHJlZmVycmVyIHBvbGljeSBhY2NvcmRpbmcgdG8gdGhlIFJlZmVycmVyLVBvbGljeVxuICAvLyAgaGVhZGVyIChpZiBhbnkpIGluIGFjdHVhbFJlc3BvbnNlLlxuXG4gIC8vIDEuIExldCBwb2xpY3kgYmUgdGhlIHJlc3VsdCBvZiBleGVjdXRpbmcgwqcgOC4xIFBhcnNlIGEgcmVmZXJyZXIgcG9saWN5XG4gIC8vIGZyb20gYSBSZWZlcnJlci1Qb2xpY3kgaGVhZGVyIG9uIGFjdHVhbFJlc3BvbnNlLlxuXG4gIC8vIDguMSBQYXJzZSBhIHJlZmVycmVyIHBvbGljeSBmcm9tIGEgUmVmZXJyZXItUG9saWN5IGhlYWRlclxuICAvLyAxLiBMZXQgcG9saWN5LXRva2VucyBiZSB0aGUgcmVzdWx0IG9mIGV4dHJhY3RpbmcgaGVhZGVyIGxpc3QgdmFsdWVzIGdpdmVuIGBSZWZlcnJlci1Qb2xpY3lgIGFuZCByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3QuXG4gIGNvbnN0IHsgaGVhZGVyc0xpc3QgfSA9IGFjdHVhbFJlc3BvbnNlXG4gIC8vIDIuIExldCBwb2xpY3kgYmUgdGhlIGVtcHR5IHN0cmluZy5cbiAgLy8gMy4gRm9yIGVhY2ggdG9rZW4gaW4gcG9saWN5LXRva2VucywgaWYgdG9rZW4gaXMgYSByZWZlcnJlciBwb2xpY3kgYW5kIHRva2VuIGlzIG5vdCB0aGUgZW1wdHkgc3RyaW5nLCB0aGVuIHNldCBwb2xpY3kgdG8gdG9rZW4uXG4gIC8vIDQuIFJldHVybiBwb2xpY3kuXG4gIGNvbnN0IHBvbGljeUhlYWRlciA9IChoZWFkZXJzTGlzdC5nZXQoJ3JlZmVycmVyLXBvbGljeScsIHRydWUpID8/ICcnKS5zcGxpdCgnLCcpXG5cbiAgLy8gTm90ZTogQXMgdGhlIHJlZmVycmVyLXBvbGljeSBjYW4gY29udGFpbiBtdWx0aXBsZSBwb2xpY2llc1xuICAvLyBzZXBhcmF0ZWQgYnkgY29tbWEsIHdlIG5lZWQgdG8gbG9vcCB0aHJvdWdoIGFsbCBvZiB0aGVtXG4gIC8vIGFuZCBwaWNrIHRoZSBmaXJzdCB2YWxpZCBvbmUuXG4gIC8vIFJlZjogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9IZWFkZXJzL1JlZmVycmVyLVBvbGljeSNzcGVjaWZ5X2FfZmFsbGJhY2tfcG9saWN5XG4gIGxldCBwb2xpY3kgPSAnJ1xuICBpZiAocG9saWN5SGVhZGVyLmxlbmd0aCA+IDApIHtcbiAgICAvLyBUaGUgcmlnaHQtbW9zdCBwb2xpY3kgdGFrZXMgcHJlY2VkZW5jZS5cbiAgICAvLyBUaGUgbGVmdC1tb3N0IHBvbGljeSBpcyB0aGUgZmFsbGJhY2suXG4gICAgZm9yIChsZXQgaSA9IHBvbGljeUhlYWRlci5sZW5ndGg7IGkgIT09IDA7IGktLSkge1xuICAgICAgY29uc3QgdG9rZW4gPSBwb2xpY3lIZWFkZXJbaSAtIDFdLnRyaW0oKVxuICAgICAgaWYgKHJlZmVycmVyUG9saWN5VG9rZW5zLmhhcyh0b2tlbikpIHtcbiAgICAgICAgcG9saWN5ID0gdG9rZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyAyLiBJZiBwb2xpY3kgaXMgbm90IHRoZSBlbXB0eSBzdHJpbmcsIHRoZW4gc2V0IHJlcXVlc3TigJlzIHJlZmVycmVyIHBvbGljeSB0byBwb2xpY3kuXG4gIGlmIChwb2xpY3kgIT09ICcnKSB7XG4gICAgcmVxdWVzdC5yZWZlcnJlclBvbGljeSA9IHBvbGljeVxuICB9XG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjcm9zcy1vcmlnaW4tcmVzb3VyY2UtcG9saWN5LWNoZWNrXG5mdW5jdGlvbiBjcm9zc09yaWdpblJlc291cmNlUG9saWN5Q2hlY2sgKCkge1xuICAvLyBUT0RPXG4gIHJldHVybiAnYWxsb3dlZCdcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtY29ycy1jaGVja1xuZnVuY3Rpb24gY29yc0NoZWNrICgpIHtcbiAgLy8gVE9ET1xuICByZXR1cm4gJ3N1Y2Nlc3MnXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LXRhby1jaGVja1xuZnVuY3Rpb24gVEFPQ2hlY2sgKCkge1xuICAvLyBUT0RPXG4gIHJldHVybiAnc3VjY2Vzcydcbn1cblxuZnVuY3Rpb24gYXBwZW5kRmV0Y2hNZXRhZGF0YSAoaHR0cFJlcXVlc3QpIHtcbiAgLy8gIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtZmV0Y2gtbWV0YWRhdGEvI3NlYy1mZXRjaC1kZXN0LWhlYWRlclxuICAvLyAgVE9ET1xuXG4gIC8vICBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLWZldGNoLW1ldGFkYXRhLyNzZWMtZmV0Y2gtbW9kZS1oZWFkZXJcblxuICAvLyAgMS4gQXNzZXJ0OiBy4oCZcyB1cmwgaXMgYSBwb3RlbnRpYWxseSB0cnVzdHdvcnRoeSBVUkwuXG4gIC8vICBUT0RPXG5cbiAgLy8gIDIuIExldCBoZWFkZXIgYmUgYSBTdHJ1Y3R1cmVkIEhlYWRlciB3aG9zZSB2YWx1ZSBpcyBhIHRva2VuLlxuICBsZXQgaGVhZGVyID0gbnVsbFxuXG4gIC8vICAzLiBTZXQgaGVhZGVy4oCZcyB2YWx1ZSB0byBy4oCZcyBtb2RlLlxuICBoZWFkZXIgPSBodHRwUmVxdWVzdC5tb2RlXG5cbiAgLy8gIDQuIFNldCBhIHN0cnVjdHVyZWQgZmllbGQgdmFsdWUgYFNlYy1GZXRjaC1Nb2RlYC9oZWFkZXIgaW4gcuKAmXMgaGVhZGVyIGxpc3QuXG4gIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LnNldCgnc2VjLWZldGNoLW1vZGUnLCBoZWFkZXIsIHRydWUpXG5cbiAgLy8gIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtZmV0Y2gtbWV0YWRhdGEvI3NlYy1mZXRjaC1zaXRlLWhlYWRlclxuICAvLyAgVE9ET1xuXG4gIC8vICBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLWZldGNoLW1ldGFkYXRhLyNzZWMtZmV0Y2gtdXNlci1oZWFkZXJcbiAgLy8gIFRPRE9cbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2FwcGVuZC1hLXJlcXVlc3Qtb3JpZ2luLWhlYWRlclxuZnVuY3Rpb24gYXBwZW5kUmVxdWVzdE9yaWdpbkhlYWRlciAocmVxdWVzdCkge1xuICAvLyAxLiBMZXQgc2VyaWFsaXplZE9yaWdpbiBiZSB0aGUgcmVzdWx0IG9mIGJ5dGUtc2VyaWFsaXppbmcgYSByZXF1ZXN0IG9yaWdpblxuICAvLyAgICB3aXRoIHJlcXVlc3QuXG4gIC8vIFRPRE86IGltcGxlbWVudCBcImJ5dGUtc2VyaWFsaXppbmcgYSByZXF1ZXN0IG9yaWdpblwiXG4gIGxldCBzZXJpYWxpemVkT3JpZ2luID0gcmVxdWVzdC5vcmlnaW5cblxuICAvLyAtIFwiJ2NsaWVudCcgaXMgY2hhbmdlZCB0byBhbiBvcmlnaW4gZHVyaW5nIGZldGNoaW5nLlwiXG4gIC8vICAgVGhpcyBkb2Vzbid0IGhhcHBlbiBpbiB1bmRpY2kgKGluIG1vc3QgY2FzZXMpIGJlY2F1c2UgdW5kaWNpLCBieSBkZWZhdWx0LFxuICAvLyAgIGhhcyBubyBjb25jZXB0IG9mIG9yaWdpbi5cbiAgLy8gLSByZXF1ZXN0Lm9yaWdpbiBjYW4gYWxzbyBiZSBzZXQgdG8gcmVxdWVzdC5jbGllbnQub3JpZ2luIChjbGllbnQgYmVpbmdcbiAgLy8gICBhbiBlbnZpcm9ubWVudCBzZXR0aW5ncyBvYmplY3QpLCB3aGljaCBpcyB1bmRlZmluZWQgd2l0aG91dCB1c2luZ1xuICAvLyAgIHNldEdsb2JhbE9yaWdpbi5cbiAgaWYgKHNlcmlhbGl6ZWRPcmlnaW4gPT09ICdjbGllbnQnIHx8IHNlcmlhbGl6ZWRPcmlnaW4gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gMi4gSWYgcmVxdWVzdOKAmXMgcmVzcG9uc2UgdGFpbnRpbmcgaXMgXCJjb3JzXCIgb3IgcmVxdWVzdOKAmXMgbW9kZSBpcyBcIndlYnNvY2tldFwiLFxuICAvLyAgICB0aGVuIGFwcGVuZCAoYE9yaWdpbmAsIHNlcmlhbGl6ZWRPcmlnaW4pIHRvIHJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICAvLyAzLiBPdGhlcndpc2UsIGlmIHJlcXVlc3TigJlzIG1ldGhvZCBpcyBuZWl0aGVyIGBHRVRgIG5vciBgSEVBRGAsIHRoZW46XG4gIGlmIChyZXF1ZXN0LnJlc3BvbnNlVGFpbnRpbmcgPT09ICdjb3JzJyB8fCByZXF1ZXN0Lm1vZGUgPT09ICd3ZWJzb2NrZXQnKSB7XG4gICAgcmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ29yaWdpbicsIHNlcmlhbGl6ZWRPcmlnaW4sIHRydWUpXG4gIH0gZWxzZSBpZiAocmVxdWVzdC5tZXRob2QgIT09ICdHRVQnICYmIHJlcXVlc3QubWV0aG9kICE9PSAnSEVBRCcpIHtcbiAgICAvLyAxLiBTd2l0Y2ggb24gcmVxdWVzdOKAmXMgcmVmZXJyZXIgcG9saWN5OlxuICAgIHN3aXRjaCAocmVxdWVzdC5yZWZlcnJlclBvbGljeSkge1xuICAgICAgY2FzZSAnbm8tcmVmZXJyZXInOlxuICAgICAgICAvLyBTZXQgc2VyaWFsaXplZE9yaWdpbiB0byBgbnVsbGAuXG4gICAgICAgIHNlcmlhbGl6ZWRPcmlnaW4gPSBudWxsXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICduby1yZWZlcnJlci13aGVuLWRvd25ncmFkZSc6XG4gICAgICBjYXNlICdzdHJpY3Qtb3JpZ2luJzpcbiAgICAgIGNhc2UgJ3N0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4nOlxuICAgICAgICAvLyBJZiByZXF1ZXN04oCZcyBvcmlnaW4gaXMgYSB0dXBsZSBvcmlnaW4sIGl0cyBzY2hlbWUgaXMgXCJodHRwc1wiLCBhbmRcbiAgICAgICAgLy8gcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIHNjaGVtZSBpcyBub3QgXCJodHRwc1wiLCB0aGVuIHNldFxuICAgICAgICAvLyBzZXJpYWxpemVkT3JpZ2luIHRvIGBudWxsYC5cbiAgICAgICAgaWYgKHJlcXVlc3Qub3JpZ2luICYmIHVybEhhc0h0dHBzU2NoZW1lKHJlcXVlc3Qub3JpZ2luKSAmJiAhdXJsSGFzSHR0cHNTY2hlbWUocmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdCkpKSB7XG4gICAgICAgICAgc2VyaWFsaXplZE9yaWdpbiA9IG51bGxcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnc2FtZS1vcmlnaW4nOlxuICAgICAgICAvLyBJZiByZXF1ZXN04oCZcyBvcmlnaW4gaXMgbm90IHNhbWUgb3JpZ2luIHdpdGggcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzXG4gICAgICAgIC8vIG9yaWdpbiwgdGhlbiBzZXQgc2VyaWFsaXplZE9yaWdpbiB0byBgbnVsbGAuXG4gICAgICAgIGlmICghc2FtZU9yaWdpbihyZXF1ZXN0LCByZXF1ZXN0Q3VycmVudFVSTChyZXF1ZXN0KSkpIHtcbiAgICAgICAgICBzZXJpYWxpemVkT3JpZ2luID0gbnVsbFxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBEbyBub3RoaW5nLlxuICAgIH1cblxuICAgIC8vIDIuIEFwcGVuZCAoYE9yaWdpbmAsIHNlcmlhbGl6ZWRPcmlnaW4pIHRvIHJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdvcmlnaW4nLCBzZXJpYWxpemVkT3JpZ2luLCB0cnVlKVxuICB9XG59XG5cbi8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9oci10aW1lLyNkZm4tY29hcnNlbi10aW1lXG5mdW5jdGlvbiBjb2Fyc2VuVGltZSAodGltZXN0YW1wLCBjcm9zc09yaWdpbklzb2xhdGVkQ2FwYWJpbGl0eSkge1xuICAvLyBUT0RPXG4gIHJldHVybiB0aW1lc3RhbXBcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NsYW1wLWFuZC1jb2Fyc2VuLWNvbm5lY3Rpb24tdGltaW5nLWluZm9cbmZ1bmN0aW9uIGNsYW1wQW5kQ29hcnNlbkNvbm5lY3Rpb25UaW1pbmdJbmZvIChjb25uZWN0aW9uVGltaW5nSW5mbywgZGVmYXVsdFN0YXJ0VGltZSwgY3Jvc3NPcmlnaW5Jc29sYXRlZENhcGFiaWxpdHkpIHtcbiAgaWYgKCFjb25uZWN0aW9uVGltaW5nSW5mbz8uc3RhcnRUaW1lIHx8IGNvbm5lY3Rpb25UaW1pbmdJbmZvLnN0YXJ0VGltZSA8IGRlZmF1bHRTdGFydFRpbWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZG9tYWluTG9va3VwU3RhcnRUaW1lOiBkZWZhdWx0U3RhcnRUaW1lLFxuICAgICAgZG9tYWluTG9va3VwRW5kVGltZTogZGVmYXVsdFN0YXJ0VGltZSxcbiAgICAgIGNvbm5lY3Rpb25TdGFydFRpbWU6IGRlZmF1bHRTdGFydFRpbWUsXG4gICAgICBjb25uZWN0aW9uRW5kVGltZTogZGVmYXVsdFN0YXJ0VGltZSxcbiAgICAgIHNlY3VyZUNvbm5lY3Rpb25TdGFydFRpbWU6IGRlZmF1bHRTdGFydFRpbWUsXG4gICAgICBBTFBOTmVnb3RpYXRlZFByb3RvY29sOiBjb25uZWN0aW9uVGltaW5nSW5mbz8uQUxQTk5lZ290aWF0ZWRQcm90b2NvbFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZG9tYWluTG9va3VwU3RhcnRUaW1lOiBjb2Fyc2VuVGltZShjb25uZWN0aW9uVGltaW5nSW5mby5kb21haW5Mb29rdXBTdGFydFRpbWUsIGNyb3NzT3JpZ2luSXNvbGF0ZWRDYXBhYmlsaXR5KSxcbiAgICBkb21haW5Mb29rdXBFbmRUaW1lOiBjb2Fyc2VuVGltZShjb25uZWN0aW9uVGltaW5nSW5mby5kb21haW5Mb29rdXBFbmRUaW1lLCBjcm9zc09yaWdpbklzb2xhdGVkQ2FwYWJpbGl0eSksXG4gICAgY29ubmVjdGlvblN0YXJ0VGltZTogY29hcnNlblRpbWUoY29ubmVjdGlvblRpbWluZ0luZm8uY29ubmVjdGlvblN0YXJ0VGltZSwgY3Jvc3NPcmlnaW5Jc29sYXRlZENhcGFiaWxpdHkpLFxuICAgIGNvbm5lY3Rpb25FbmRUaW1lOiBjb2Fyc2VuVGltZShjb25uZWN0aW9uVGltaW5nSW5mby5jb25uZWN0aW9uRW5kVGltZSwgY3Jvc3NPcmlnaW5Jc29sYXRlZENhcGFiaWxpdHkpLFxuICAgIHNlY3VyZUNvbm5lY3Rpb25TdGFydFRpbWU6IGNvYXJzZW5UaW1lKGNvbm5lY3Rpb25UaW1pbmdJbmZvLnNlY3VyZUNvbm5lY3Rpb25TdGFydFRpbWUsIGNyb3NzT3JpZ2luSXNvbGF0ZWRDYXBhYmlsaXR5KSxcbiAgICBBTFBOTmVnb3RpYXRlZFByb3RvY29sOiBjb25uZWN0aW9uVGltaW5nSW5mby5BTFBOTmVnb3RpYXRlZFByb3RvY29sXG4gIH1cbn1cblxuLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL2hyLXRpbWUvI2Rmbi1jb2Fyc2VuZWQtc2hhcmVkLWN1cnJlbnQtdGltZVxuZnVuY3Rpb24gY29hcnNlbmVkU2hhcmVkQ3VycmVudFRpbWUgKGNyb3NzT3JpZ2luSXNvbGF0ZWRDYXBhYmlsaXR5KSB7XG4gIHJldHVybiBjb2Fyc2VuVGltZShwZXJmb3JtYW5jZS5ub3coKSwgY3Jvc3NPcmlnaW5Jc29sYXRlZENhcGFiaWxpdHkpXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjcmVhdGUtYW4tb3BhcXVlLXRpbWluZy1pbmZvXG5mdW5jdGlvbiBjcmVhdGVPcGFxdWVUaW1pbmdJbmZvICh0aW1pbmdJbmZvKSB7XG4gIHJldHVybiB7XG4gICAgc3RhcnRUaW1lOiB0aW1pbmdJbmZvLnN0YXJ0VGltZSA/PyAwLFxuICAgIHJlZGlyZWN0U3RhcnRUaW1lOiAwLFxuICAgIHJlZGlyZWN0RW5kVGltZTogMCxcbiAgICBwb3N0UmVkaXJlY3RTdGFydFRpbWU6IHRpbWluZ0luZm8uc3RhcnRUaW1lID8/IDAsXG4gICAgZmluYWxTZXJ2aWNlV29ya2VyU3RhcnRUaW1lOiAwLFxuICAgIGZpbmFsTmV0d29ya1Jlc3BvbnNlU3RhcnRUaW1lOiAwLFxuICAgIGZpbmFsTmV0d29ya1JlcXVlc3RTdGFydFRpbWU6IDAsXG4gICAgZW5kVGltZTogMCxcbiAgICBlbmNvZGVkQm9keVNpemU6IDAsXG4gICAgZGVjb2RlZEJvZHlTaXplOiAwLFxuICAgIGZpbmFsQ29ubmVjdGlvblRpbWluZ0luZm86IG51bGxcbiAgfVxufVxuXG4vLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9vcmlnaW4uaHRtbCNwb2xpY3ktY29udGFpbmVyXG5mdW5jdGlvbiBtYWtlUG9saWN5Q29udGFpbmVyICgpIHtcbiAgLy8gTm90ZTogdGhlIGZldGNoIHNwZWMgZG9lc24ndCBtYWtlIHVzZSBvZiBlbWJlZGRlciBwb2xpY3kgb3IgQ1NQIGxpc3RcbiAgcmV0dXJuIHtcbiAgICByZWZlcnJlclBvbGljeTogJ3N0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4nXG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvb3JpZ2luLmh0bWwjY2xvbmUtYS1wb2xpY3ktY29udGFpbmVyXG5mdW5jdGlvbiBjbG9uZVBvbGljeUNvbnRhaW5lciAocG9saWN5Q29udGFpbmVyKSB7XG4gIHJldHVybiB7XG4gICAgcmVmZXJyZXJQb2xpY3k6IHBvbGljeUNvbnRhaW5lci5yZWZlcnJlclBvbGljeVxuICB9XG59XG5cbi8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtcmVmZXJyZXItcG9saWN5LyNkZXRlcm1pbmUtcmVxdWVzdHMtcmVmZXJyZXJcbmZ1bmN0aW9uIGRldGVybWluZVJlcXVlc3RzUmVmZXJyZXIgKHJlcXVlc3QpIHtcbiAgLy8gMS4gTGV0IHBvbGljeSBiZSByZXF1ZXN0J3MgcmVmZXJyZXIgcG9saWN5LlxuICBjb25zdCBwb2xpY3kgPSByZXF1ZXN0LnJlZmVycmVyUG9saWN5XG5cbiAgLy8gTm90ZTogcG9saWN5IGNhbm5vdCAoc2hvdWxkbid0KSBiZSBudWxsIG9yIGFuIGVtcHR5IHN0cmluZy5cbiAgYXNzZXJ0KHBvbGljeSlcblxuICAvLyAyLiBMZXQgZW52aXJvbm1lbnQgYmUgcmVxdWVzdOKAmXMgY2xpZW50LlxuXG4gIGxldCByZWZlcnJlclNvdXJjZSA9IG51bGxcblxuICAvLyAzLiBTd2l0Y2ggb24gcmVxdWVzdOKAmXMgcmVmZXJyZXI6XG4gIGlmIChyZXF1ZXN0LnJlZmVycmVyID09PSAnY2xpZW50Jykge1xuICAgIC8vIE5vdGU6IG5vZGUgaXNuJ3QgYSBicm93c2VyIGFuZCBkb2Vzbid0IGltcGxlbWVudCBkb2N1bWVudC9pZnJhbWVzLFxuICAgIC8vIHNvIHdlIGJ5cGFzcyB0aGlzIHN0ZXAgYW5kIHJlcGxhY2UgaXQgd2l0aCBvdXIgb3duLlxuXG4gICAgY29uc3QgZ2xvYmFsT3JpZ2luID0gZ2V0R2xvYmFsT3JpZ2luKClcblxuICAgIGlmICghZ2xvYmFsT3JpZ2luIHx8IGdsb2JhbE9yaWdpbi5vcmlnaW4gPT09ICdudWxsJykge1xuICAgICAgcmV0dXJuICduby1yZWZlcnJlcidcbiAgICB9XG5cbiAgICAvLyBub3RlOiB3ZSBuZWVkIHRvIGNsb25lIGl0IGFzIGl0J3MgbXV0YXRlZFxuICAgIHJlZmVycmVyU291cmNlID0gbmV3IFVSTChnbG9iYWxPcmlnaW4pXG4gIH0gZWxzZSBpZiAocmVxdWVzdC5yZWZlcnJlciBpbnN0YW5jZW9mIFVSTCkge1xuICAgIC8vIExldCByZWZlcnJlclNvdXJjZSBiZSByZXF1ZXN04oCZcyByZWZlcnJlci5cbiAgICByZWZlcnJlclNvdXJjZSA9IHJlcXVlc3QucmVmZXJyZXJcbiAgfVxuXG4gIC8vIDQuIExldCByZXF1ZXN04oCZcyByZWZlcnJlclVSTCBiZSB0aGUgcmVzdWx0IG9mIHN0cmlwcGluZyByZWZlcnJlclNvdXJjZSBmb3JcbiAgLy8gICAgdXNlIGFzIGEgcmVmZXJyZXIuXG4gIGxldCByZWZlcnJlclVSTCA9IHN0cmlwVVJMRm9yUmVmZXJyZXIocmVmZXJyZXJTb3VyY2UpXG5cbiAgLy8gNS4gTGV0IHJlZmVycmVyT3JpZ2luIGJlIHRoZSByZXN1bHQgb2Ygc3RyaXBwaW5nIHJlZmVycmVyU291cmNlIGZvciB1c2UgYXNcbiAgLy8gICAgYSByZWZlcnJlciwgd2l0aCB0aGUgb3JpZ2luLW9ubHkgZmxhZyBzZXQgdG8gdHJ1ZS5cbiAgY29uc3QgcmVmZXJyZXJPcmlnaW4gPSBzdHJpcFVSTEZvclJlZmVycmVyKHJlZmVycmVyU291cmNlLCB0cnVlKVxuXG4gIC8vIDYuIElmIHRoZSByZXN1bHQgb2Ygc2VyaWFsaXppbmcgcmVmZXJyZXJVUkwgaXMgYSBzdHJpbmcgd2hvc2UgbGVuZ3RoIGlzXG4gIC8vICAgIGdyZWF0ZXIgdGhhbiA0MDk2LCBzZXQgcmVmZXJyZXJVUkwgdG8gcmVmZXJyZXJPcmlnaW4uXG4gIGlmIChyZWZlcnJlclVSTC50b1N0cmluZygpLmxlbmd0aCA+IDQwOTYpIHtcbiAgICByZWZlcnJlclVSTCA9IHJlZmVycmVyT3JpZ2luXG4gIH1cblxuICBjb25zdCBhcmVTYW1lT3JpZ2luID0gc2FtZU9yaWdpbihyZXF1ZXN0LCByZWZlcnJlclVSTClcbiAgY29uc3QgaXNOb25Qb3RlbnRpYWxseVRydXN0V29ydGh5ID0gaXNVUkxQb3RlbnRpYWxseVRydXN0d29ydGh5KHJlZmVycmVyVVJMKSAmJlxuICAgICFpc1VSTFBvdGVudGlhbGx5VHJ1c3R3b3J0aHkocmVxdWVzdC51cmwpXG5cbiAgLy8gOC4gRXhlY3V0ZSB0aGUgc3dpdGNoIHN0YXRlbWVudHMgY29ycmVzcG9uZGluZyB0byB0aGUgdmFsdWUgb2YgcG9saWN5OlxuICBzd2l0Y2ggKHBvbGljeSkge1xuICAgIGNhc2UgJ29yaWdpbic6IHJldHVybiByZWZlcnJlck9yaWdpbiAhPSBudWxsID8gcmVmZXJyZXJPcmlnaW4gOiBzdHJpcFVSTEZvclJlZmVycmVyKHJlZmVycmVyU291cmNlLCB0cnVlKVxuICAgIGNhc2UgJ3Vuc2FmZS11cmwnOiByZXR1cm4gcmVmZXJyZXJVUkxcbiAgICBjYXNlICdzYW1lLW9yaWdpbic6XG4gICAgICByZXR1cm4gYXJlU2FtZU9yaWdpbiA/IHJlZmVycmVyT3JpZ2luIDogJ25vLXJlZmVycmVyJ1xuICAgIGNhc2UgJ29yaWdpbi13aGVuLWNyb3NzLW9yaWdpbic6XG4gICAgICByZXR1cm4gYXJlU2FtZU9yaWdpbiA/IHJlZmVycmVyVVJMIDogcmVmZXJyZXJPcmlnaW5cbiAgICBjYXNlICdzdHJpY3Qtb3JpZ2luLXdoZW4tY3Jvc3Mtb3JpZ2luJzoge1xuICAgICAgY29uc3QgY3VycmVudFVSTCA9IHJlcXVlc3RDdXJyZW50VVJMKHJlcXVlc3QpXG5cbiAgICAgIC8vIDEuIElmIHRoZSBvcmlnaW4gb2YgcmVmZXJyZXJVUkwgYW5kIHRoZSBvcmlnaW4gb2YgcmVxdWVzdOKAmXMgY3VycmVudFxuICAgICAgLy8gICAgVVJMIGFyZSB0aGUgc2FtZSwgdGhlbiByZXR1cm4gcmVmZXJyZXJVUkwuXG4gICAgICBpZiAoc2FtZU9yaWdpbihyZWZlcnJlclVSTCwgY3VycmVudFVSTCkpIHtcbiAgICAgICAgcmV0dXJuIHJlZmVycmVyVVJMXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIElmIHJlZmVycmVyVVJMIGlzIGEgcG90ZW50aWFsbHkgdHJ1c3R3b3J0aHkgVVJMIGFuZCByZXF1ZXN04oCZc1xuICAgICAgLy8gICAgY3VycmVudCBVUkwgaXMgbm90IGEgcG90ZW50aWFsbHkgdHJ1c3R3b3J0aHkgVVJMLCB0aGVuIHJldHVybiBub1xuICAgICAgLy8gICAgcmVmZXJyZXIuXG4gICAgICBpZiAoaXNVUkxQb3RlbnRpYWxseVRydXN0d29ydGh5KHJlZmVycmVyVVJMKSAmJiAhaXNVUkxQb3RlbnRpYWxseVRydXN0d29ydGh5KGN1cnJlbnRVUkwpKSB7XG4gICAgICAgIHJldHVybiAnbm8tcmVmZXJyZXInXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIFJldHVybiByZWZlcnJlck9yaWdpbi5cbiAgICAgIHJldHVybiByZWZlcnJlck9yaWdpblxuICAgIH1cbiAgICBjYXNlICdzdHJpY3Qtb3JpZ2luJzogLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgLyoqXG4gICAgICAgICAqIDEuIElmIHJlZmVycmVyVVJMIGlzIGEgcG90ZW50aWFsbHkgdHJ1c3R3b3J0aHkgVVJMIGFuZFxuICAgICAgICAgKiByZXF1ZXN04oCZcyBjdXJyZW50IFVSTCBpcyBub3QgYSBwb3RlbnRpYWxseSB0cnVzdHdvcnRoeSBVUkwsXG4gICAgICAgICAqIHRoZW4gcmV0dXJuIG5vIHJlZmVycmVyLlxuICAgICAgICAgKiAyLiBSZXR1cm4gcmVmZXJyZXJPcmlnaW5cbiAgICAgICAgKi9cbiAgICBjYXNlICduby1yZWZlcnJlci13aGVuLWRvd25ncmFkZSc6IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgIC8qKlxuICAgICAgICogMS4gSWYgcmVmZXJyZXJVUkwgaXMgYSBwb3RlbnRpYWxseSB0cnVzdHdvcnRoeSBVUkwgYW5kXG4gICAgICAgKiByZXF1ZXN04oCZcyBjdXJyZW50IFVSTCBpcyBub3QgYSBwb3RlbnRpYWxseSB0cnVzdHdvcnRoeSBVUkwsXG4gICAgICAgKiB0aGVuIHJldHVybiBubyByZWZlcnJlci5cbiAgICAgICAqIDIuIFJldHVybiByZWZlcnJlck9yaWdpblxuICAgICAgKi9cblxuICAgIGRlZmF1bHQ6IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgIHJldHVybiBpc05vblBvdGVudGlhbGx5VHJ1c3RXb3J0aHkgPyAnbm8tcmVmZXJyZXInIDogcmVmZXJyZXJPcmlnaW5cbiAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmFwcHNlYy1yZWZlcnJlci1wb2xpY3kvI3N0cmlwLXVybFxuICogQHBhcmFtIHtVUkx9IHVybFxuICogQHBhcmFtIHtib29sZWFufHVuZGVmaW5lZH0gb3JpZ2luT25seVxuICovXG5mdW5jdGlvbiBzdHJpcFVSTEZvclJlZmVycmVyICh1cmwsIG9yaWdpbk9ubHkpIHtcbiAgLy8gMS4gQXNzZXJ0OiB1cmwgaXMgYSBVUkwuXG4gIGFzc2VydCh1cmwgaW5zdGFuY2VvZiBVUkwpXG5cbiAgdXJsID0gbmV3IFVSTCh1cmwpXG5cbiAgLy8gMi4gSWYgdXJs4oCZcyBzY2hlbWUgaXMgYSBsb2NhbCBzY2hlbWUsIHRoZW4gcmV0dXJuIG5vIHJlZmVycmVyLlxuICBpZiAodXJsLnByb3RvY29sID09PSAnZmlsZTonIHx8IHVybC5wcm90b2NvbCA9PT0gJ2Fib3V0OicgfHwgdXJsLnByb3RvY29sID09PSAnYmxhbms6Jykge1xuICAgIHJldHVybiAnbm8tcmVmZXJyZXInXG4gIH1cblxuICAvLyAzLiBTZXQgdXJs4oCZcyB1c2VybmFtZSB0byB0aGUgZW1wdHkgc3RyaW5nLlxuICB1cmwudXNlcm5hbWUgPSAnJ1xuXG4gIC8vIDQuIFNldCB1cmzigJlzIHBhc3N3b3JkIHRvIHRoZSBlbXB0eSBzdHJpbmcuXG4gIHVybC5wYXNzd29yZCA9ICcnXG5cbiAgLy8gNS4gU2V0IHVybOKAmXMgZnJhZ21lbnQgdG8gbnVsbC5cbiAgdXJsLmhhc2ggPSAnJ1xuXG4gIC8vIDYuIElmIHRoZSBvcmlnaW4tb25seSBmbGFnIGlzIHRydWUsIHRoZW46XG4gIGlmIChvcmlnaW5Pbmx5KSB7XG4gICAgLy8gMS4gU2V0IHVybOKAmXMgcGF0aCB0byDCqyB0aGUgZW1wdHkgc3RyaW5nIMK7LlxuICAgIHVybC5wYXRobmFtZSA9ICcnXG5cbiAgICAvLyAyLiBTZXQgdXJs4oCZcyBxdWVyeSB0byBudWxsLlxuICAgIHVybC5zZWFyY2ggPSAnJ1xuICB9XG5cbiAgLy8gNy4gUmV0dXJuIHVybC5cbiAgcmV0dXJuIHVybFxufVxuXG5mdW5jdGlvbiBpc1VSTFBvdGVudGlhbGx5VHJ1c3R3b3J0aHkgKHVybCkge1xuICBpZiAoISh1cmwgaW5zdGFuY2VvZiBVUkwpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBJZiBjaGlsZCBvZiBhYm91dCwgcmV0dXJuIHRydWVcbiAgaWYgKHVybC5ocmVmID09PSAnYWJvdXQ6YmxhbmsnIHx8IHVybC5ocmVmID09PSAnYWJvdXQ6c3JjZG9jJykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvLyBJZiBzY2hlbWUgaXMgZGF0YSwgcmV0dXJuIHRydWVcbiAgaWYgKHVybC5wcm90b2NvbCA9PT0gJ2RhdGE6JykgcmV0dXJuIHRydWVcblxuICAvLyBJZiBmaWxlLCByZXR1cm4gdHJ1ZVxuICBpZiAodXJsLnByb3RvY29sID09PSAnZmlsZTonKSByZXR1cm4gdHJ1ZVxuXG4gIHJldHVybiBpc09yaWdpblBvdGVudGlhbGx5VHJ1c3R3b3J0aHkodXJsLm9yaWdpbilcblxuICBmdW5jdGlvbiBpc09yaWdpblBvdGVudGlhbGx5VHJ1c3R3b3J0aHkgKG9yaWdpbikge1xuICAgIC8vIElmIG9yaWdpbiBpcyBleHBsaWNpdGx5IG51bGwsIHJldHVybiBmYWxzZVxuICAgIGlmIChvcmlnaW4gPT0gbnVsbCB8fCBvcmlnaW4gPT09ICdudWxsJykgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCBvcmlnaW5Bc1VSTCA9IG5ldyBVUkwob3JpZ2luKVxuXG4gICAgLy8gSWYgc2VjdXJlLCByZXR1cm4gdHJ1ZVxuICAgIGlmIChvcmlnaW5Bc1VSTC5wcm90b2NvbCA9PT0gJ2h0dHBzOicgfHwgb3JpZ2luQXNVUkwucHJvdG9jb2wgPT09ICd3c3M6Jykge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvLyBJZiBsb2NhbGhvc3Qgb3IgdmFyaWFudHMsIHJldHVybiB0cnVlXG4gICAgaWYgKC9eMTI3KD86XFwuWzAtOV0rKXswLDJ9XFwuWzAtOV0rJHxeXFxbKD86MCo6KSo/Oj8wKjFcXF0kLy50ZXN0KG9yaWdpbkFzVVJMLmhvc3RuYW1lKSB8fFxuICAgICAob3JpZ2luQXNVUkwuaG9zdG5hbWUgPT09ICdsb2NhbGhvc3QnIHx8IG9yaWdpbkFzVVJMLmhvc3RuYW1lLmluY2x1ZGVzKCdsb2NhbGhvc3QuJykpIHx8XG4gICAgIChvcmlnaW5Bc1VSTC5ob3N0bmFtZS5lbmRzV2l0aCgnLmxvY2FsaG9zdCcpKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvLyBJZiBhbnkgb3RoZXIsIHJldHVybiBmYWxzZVxuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLXN1YnJlc291cmNlLWludGVncml0eS8jZG9lcy1yZXNwb25zZS1tYXRjaC1tZXRhZGF0YWxpc3RcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYnl0ZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRhZGF0YUxpc3RcbiAqL1xuZnVuY3Rpb24gYnl0ZXNNYXRjaCAoYnl0ZXMsIG1ldGFkYXRhTGlzdCkge1xuICAvLyBJZiBub2RlIGlzIG5vdCBidWlsdCB3aXRoIE9wZW5TU0wgc3VwcG9ydCwgd2UgY2Fubm90IGNoZWNrXG4gIC8vIGEgcmVxdWVzdCdzIGludGVncml0eSwgc28gYWxsb3cgaXQgYnkgZGVmYXVsdCAodGhlIHNwZWMgd2lsbFxuICAvLyBhbGxvdyByZXF1ZXN0cyBpZiBhbiBpbnZhbGlkIGhhc2ggaXMgZ2l2ZW4sIGFzIHByZWNlZGVuY2UpLlxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWY6IG9ubHkgaWYgbm9kZSBpcyBidWlsdCB3aXRoIC0td2l0aG91dC1zc2wgKi9cbiAgaWYgKGNyeXB0byA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIDEuIExldCBwYXJzZWRNZXRhZGF0YSBiZSB0aGUgcmVzdWx0IG9mIHBhcnNpbmcgbWV0YWRhdGFMaXN0LlxuICBjb25zdCBwYXJzZWRNZXRhZGF0YSA9IHBhcnNlTWV0YWRhdGEobWV0YWRhdGFMaXN0KVxuXG4gIC8vIDIuIElmIHBhcnNlZE1ldGFkYXRhIGlzIG5vIG1ldGFkYXRhLCByZXR1cm4gdHJ1ZS5cbiAgaWYgKHBhcnNlZE1ldGFkYXRhID09PSAnbm8gbWV0YWRhdGEnKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIDMuIElmIHJlc3BvbnNlIGlzIG5vdCBlbGlnaWJsZSBmb3IgaW50ZWdyaXR5IHZhbGlkYXRpb24sIHJldHVybiBmYWxzZS5cbiAgLy8gVE9ET1xuXG4gIC8vIDQuIElmIHBhcnNlZE1ldGFkYXRhIGlzIHRoZSBlbXB0eSBzZXQsIHJldHVybiB0cnVlLlxuICBpZiAocGFyc2VkTWV0YWRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIDUuIExldCBtZXRhZGF0YSBiZSB0aGUgcmVzdWx0IG9mIGdldHRpbmcgdGhlIHN0cm9uZ2VzdFxuICAvLyAgICBtZXRhZGF0YSBmcm9tIHBhcnNlZE1ldGFkYXRhLlxuICBjb25zdCBzdHJvbmdlc3QgPSBnZXRTdHJvbmdlc3RNZXRhZGF0YShwYXJzZWRNZXRhZGF0YSlcbiAgY29uc3QgbWV0YWRhdGEgPSBmaWx0ZXJNZXRhZGF0YUxpc3RCeUFsZ29yaXRobShwYXJzZWRNZXRhZGF0YSwgc3Ryb25nZXN0KVxuXG4gIC8vIDYuIEZvciBlYWNoIGl0ZW0gaW4gbWV0YWRhdGE6XG4gIGZvciAoY29uc3QgaXRlbSBvZiBtZXRhZGF0YSkge1xuICAgIC8vIDEuIExldCBhbGdvcml0aG0gYmUgdGhlIGFsZyBjb21wb25lbnQgb2YgaXRlbS5cbiAgICBjb25zdCBhbGdvcml0aG0gPSBpdGVtLmFsZ29cblxuICAgIC8vIDIuIExldCBleHBlY3RlZFZhbHVlIGJlIHRoZSB2YWwgY29tcG9uZW50IG9mIGl0ZW0uXG4gICAgY29uc3QgZXhwZWN0ZWRWYWx1ZSA9IGl0ZW0uaGFzaFxuXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWItcGxhdGZvcm0tdGVzdHMvd3B0L2NvbW1pdC9lNGM1Y2M3YTVlNDgwOTMyMjA1MjhkZmRkMWM0MDEyZGMzODM3YTBlXG4gICAgLy8gXCJiZSBsaWJlcmFsIHdpdGggcGFkZGluZ1wiLiBUaGlzIGlzIGFubm95aW5nLCBhbmQgaXQncyBub3QgZXZlbiBpbiB0aGUgc3BlYy5cblxuICAgIC8vIDMuIExldCBhY3R1YWxWYWx1ZSBiZSB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIGFsZ29yaXRobSB0byBieXRlcy5cbiAgICBsZXQgYWN0dWFsVmFsdWUgPSBjcnlwdG8uY3JlYXRlSGFzaChhbGdvcml0aG0pLnVwZGF0ZShieXRlcykuZGlnZXN0KCdiYXNlNjQnKVxuXG4gICAgaWYgKGFjdHVhbFZhbHVlW2FjdHVhbFZhbHVlLmxlbmd0aCAtIDFdID09PSAnPScpIHtcbiAgICAgIGlmIChhY3R1YWxWYWx1ZVthY3R1YWxWYWx1ZS5sZW5ndGggLSAyXSA9PT0gJz0nKSB7XG4gICAgICAgIGFjdHVhbFZhbHVlID0gYWN0dWFsVmFsdWUuc2xpY2UoMCwgLTIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY3R1YWxWYWx1ZSA9IGFjdHVhbFZhbHVlLnNsaWNlKDAsIC0xKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDQuIElmIGFjdHVhbFZhbHVlIGlzIGEgY2FzZS1zZW5zaXRpdmUgbWF0Y2ggZm9yIGV4cGVjdGVkVmFsdWUsXG4gICAgLy8gICAgcmV0dXJuIHRydWUuXG4gICAgaWYgKGNvbXBhcmVCYXNlNjRNaXhlZChhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgLy8gNy4gUmV0dXJuIGZhbHNlLlxuICByZXR1cm4gZmFsc2Vcbn1cblxuLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmFwcHNlYy1zdWJyZXNvdXJjZS1pbnRlZ3JpdHkvI2dyYW1tYXJkZWYtaGFzaC13aXRoLW9wdGlvbnNcbi8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9DU1AyLyNzb3VyY2UtbGlzdC1zeW50YXhcbi8vIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM1MjM0I2FwcGVuZGl4LUIuMVxuY29uc3QgcGFyc2VIYXNoV2l0aE9wdGlvbnMgPSAvKD88YWxnbz5zaGEyNTZ8c2hhMzg0fHNoYTUxMiktKCg/PGhhc2g+W0EtWmEtejAtOSsvXSt8W0EtWmEtejAtOV8tXSspPXswLDJ9KD86XFxzfCQpKCArWyEtfl0qKT8pPy9pXG5cbi8qKlxuICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLXN1YnJlc291cmNlLWludGVncml0eS8jcGFyc2UtbWV0YWRhdGFcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRhZGF0YVxuICovXG5mdW5jdGlvbiBwYXJzZU1ldGFkYXRhIChtZXRhZGF0YSkge1xuICAvLyAxLiBMZXQgcmVzdWx0IGJlIHRoZSBlbXB0eSBzZXQuXG4gIC8qKiBAdHlwZSB7eyBhbGdvOiBzdHJpbmcsIGhhc2g6IHN0cmluZyB9W119ICovXG4gIGNvbnN0IHJlc3VsdCA9IFtdXG5cbiAgLy8gMi4gTGV0IGVtcHR5IGJlIGVxdWFsIHRvIHRydWUuXG4gIGxldCBlbXB0eSA9IHRydWVcblxuICAvLyAzLiBGb3IgZWFjaCB0b2tlbiByZXR1cm5lZCBieSBzcGxpdHRpbmcgbWV0YWRhdGEgb24gc3BhY2VzOlxuICBmb3IgKGNvbnN0IHRva2VuIG9mIG1ldGFkYXRhLnNwbGl0KCcgJykpIHtcbiAgICAvLyAxLiBTZXQgZW1wdHkgdG8gZmFsc2UuXG4gICAgZW1wdHkgPSBmYWxzZVxuXG4gICAgLy8gMi4gUGFyc2UgdG9rZW4gYXMgYSBoYXNoLXdpdGgtb3B0aW9ucy5cbiAgICBjb25zdCBwYXJzZWRUb2tlbiA9IHBhcnNlSGFzaFdpdGhPcHRpb25zLmV4ZWModG9rZW4pXG5cbiAgICAvLyAzLiBJZiB0b2tlbiBkb2VzIG5vdCBwYXJzZSwgY29udGludWUgdG8gdGhlIG5leHQgdG9rZW4uXG4gICAgaWYgKFxuICAgICAgcGFyc2VkVG9rZW4gPT09IG51bGwgfHxcbiAgICAgIHBhcnNlZFRva2VuLmdyb3VwcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICBwYXJzZWRUb2tlbi5ncm91cHMuYWxnbyA9PT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICAvLyBOb3RlOiBDaHJvbWl1bSBibG9ja3MgdGhlIHJlcXVlc3QgYXQgdGhpcyBwb2ludCwgYnV0IEZpcmVmb3hcbiAgICAgIC8vIGdpdmVzIGEgd2FybmluZyB0aGF0IGFuIGludmFsaWQgaW50ZWdyaXR5IHdhcyBnaXZlbi4gVGhlXG4gICAgICAvLyBjb3JyZWN0IGJlaGF2aW9yIGlzIHRvIGlnbm9yZSB0aGVzZSwgYW5kIHN1YnNlcXVlbnRseSBub3RcbiAgICAgIC8vIGNoZWNrIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIHJlc291cmNlLlxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyA0LiBMZXQgYWxnb3JpdGhtIGJlIHRoZSBoYXNoLWFsZ28gY29tcG9uZW50IG9mIHRva2VuLlxuICAgIGNvbnN0IGFsZ29yaXRobSA9IHBhcnNlZFRva2VuLmdyb3Vwcy5hbGdvLnRvTG93ZXJDYXNlKClcblxuICAgIC8vIDUuIElmIGFsZ29yaXRobSBpcyBhIGhhc2ggZnVuY3Rpb24gcmVjb2duaXplZCBieSB0aGUgdXNlclxuICAgIC8vICAgIGFnZW50LCBhZGQgdGhlIHBhcnNlZCB0b2tlbiB0byByZXN1bHQuXG4gICAgaWYgKHN1cHBvcnRlZEhhc2hlcy5pbmNsdWRlcyhhbGdvcml0aG0pKSB7XG4gICAgICByZXN1bHQucHVzaChwYXJzZWRUb2tlbi5ncm91cHMpXG4gICAgfVxuICB9XG5cbiAgLy8gNC4gUmV0dXJuIG5vIG1ldGFkYXRhIGlmIGVtcHR5IGlzIHRydWUsIG90aGVyd2lzZSByZXR1cm4gcmVzdWx0LlxuICBpZiAoZW1wdHkgPT09IHRydWUpIHtcbiAgICByZXR1cm4gJ25vIG1ldGFkYXRhJ1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIEBwYXJhbSB7eyBhbGdvOiAnc2hhMjU2JyB8ICdzaGEzODQnIHwgJ3NoYTUxMicgfVtdfSBtZXRhZGF0YUxpc3RcbiAqL1xuZnVuY3Rpb24gZ2V0U3Ryb25nZXN0TWV0YWRhdGEgKG1ldGFkYXRhTGlzdCkge1xuICAvLyBMZXQgYWxnb3JpdGhtIGJlIHRoZSBhbGdvIGNvbXBvbmVudCBvZiB0aGUgZmlyc3QgaXRlbSBpbiBtZXRhZGF0YUxpc3QuXG4gIC8vIENhbiBiZSBzaGEyNTZcbiAgbGV0IGFsZ29yaXRobSA9IG1ldGFkYXRhTGlzdFswXS5hbGdvXG4gIC8vIElmIHRoZSBhbGdvcml0aG0gaXMgc2hhNTEyLCB0aGVuIGl0IGlzIHRoZSBzdHJvbmdlc3RcbiAgLy8gYW5kIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHlcbiAgaWYgKGFsZ29yaXRobVszXSA9PT0gJzUnKSB7XG4gICAgcmV0dXJuIGFsZ29yaXRobVxuICB9XG5cbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBtZXRhZGF0YUxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IG1ldGFkYXRhTGlzdFtpXVxuICAgIC8vIElmIHRoZSBhbGdvcml0aG0gaXMgc2hhNTEyLCB0aGVuIGl0IGlzIHRoZSBzdHJvbmdlc3RcbiAgICAvLyBhbmQgd2UgY2FuIGJyZWFrIHRoZSBsb29wIGltbWVkaWF0ZWx5XG4gICAgaWYgKG1ldGFkYXRhLmFsZ29bM10gPT09ICc1Jykge1xuICAgICAgYWxnb3JpdGhtID0gJ3NoYTUxMidcbiAgICAgIGJyZWFrXG4gICAgLy8gSWYgdGhlIGFsZ29yaXRobSBpcyBzaGEzODQsIHRoZW4gYSBwb3RlbnRpYWwgc2hhMjU2IG9yIHNoYTM4NCBpcyBpZ25vcmVkXG4gICAgfSBlbHNlIGlmIChhbGdvcml0aG1bM10gPT09ICczJykge1xuICAgICAgY29udGludWVcbiAgICAvLyBhbGdvcml0aG0gaXMgc2hhMjU2LCBjaGVjayBpZiBhbGdvcml0aG0gaXMgc2hhMzg0IGFuZCBpZiBzbywgc2V0IGl0IGFzXG4gICAgLy8gdGhlIHN0cm9uZ2VzdFxuICAgIH0gZWxzZSBpZiAobWV0YWRhdGEuYWxnb1szXSA9PT0gJzMnKSB7XG4gICAgICBhbGdvcml0aG0gPSAnc2hhMzg0J1xuICAgIH1cbiAgfVxuICByZXR1cm4gYWxnb3JpdGhtXG59XG5cbmZ1bmN0aW9uIGZpbHRlck1ldGFkYXRhTGlzdEJ5QWxnb3JpdGhtIChtZXRhZGF0YUxpc3QsIGFsZ29yaXRobSkge1xuICBpZiAobWV0YWRhdGFMaXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBtZXRhZGF0YUxpc3RcbiAgfVxuXG4gIGxldCBwb3MgPSAwXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWV0YWRhdGFMaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKG1ldGFkYXRhTGlzdFtpXS5hbGdvID09PSBhbGdvcml0aG0pIHtcbiAgICAgIG1ldGFkYXRhTGlzdFtwb3MrK10gPSBtZXRhZGF0YUxpc3RbaV1cbiAgICB9XG4gIH1cblxuICBtZXRhZGF0YUxpc3QubGVuZ3RoID0gcG9zXG5cbiAgcmV0dXJuIG1ldGFkYXRhTGlzdFxufVxuXG4vKipcbiAqIENvbXBhcmVzIHR3byBiYXNlNjQgc3RyaW5ncywgYWxsb3dpbmcgZm9yIGJhc2U2NHVybFxuICogaW4gdGhlIHNlY29uZCBzdHJpbmcuXG4gKlxuKiBAcGFyYW0ge3N0cmluZ30gYWN0dWFsVmFsdWUgYWx3YXlzIGJhc2U2NFxuICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVmFsdWUgYmFzZTY0IG9yIGJhc2U2NHVybFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVCYXNlNjRNaXhlZCAoYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpIHtcbiAgaWYgKGFjdHVhbFZhbHVlLmxlbmd0aCAhPT0gZXhwZWN0ZWRWYWx1ZS5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFjdHVhbFZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKGFjdHVhbFZhbHVlW2ldICE9PSBleHBlY3RlZFZhbHVlW2ldKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChhY3R1YWxWYWx1ZVtpXSA9PT0gJysnICYmIGV4cGVjdGVkVmFsdWVbaV0gPT09ICctJykgfHxcbiAgICAgICAgKGFjdHVhbFZhbHVlW2ldID09PSAnLycgJiYgZXhwZWN0ZWRWYWx1ZVtpXSA9PT0gJ18nKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vLyBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLXVwZ3JhZGUtaW5zZWN1cmUtcmVxdWVzdHMvI3VwZ3JhZGUtcmVxdWVzdFxuZnVuY3Rpb24gdHJ5VXBncmFkZVJlcXVlc3RUb0FQb3RlbnRpYWxseVRydXN0d29ydGh5VVJMIChyZXF1ZXN0KSB7XG4gIC8vIFRPRE9cbn1cblxuLyoqXG4gKiBAbGluayB7aHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvb3JpZ2luLmh0bWwjc2FtZS1vcmlnaW59XG4gKiBAcGFyYW0ge1VSTH0gQVxuICogQHBhcmFtIHtVUkx9IEJcbiAqL1xuZnVuY3Rpb24gc2FtZU9yaWdpbiAoQSwgQikge1xuICAvLyAxLiBJZiBBIGFuZCBCIGFyZSB0aGUgc2FtZSBvcGFxdWUgb3JpZ2luLCB0aGVuIHJldHVybiB0cnVlLlxuICBpZiAoQS5vcmlnaW4gPT09IEIub3JpZ2luICYmIEEub3JpZ2luID09PSAnbnVsbCcpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gMi4gSWYgQSBhbmQgQiBhcmUgYm90aCB0dXBsZSBvcmlnaW5zIGFuZCB0aGVpciBzY2hlbWVzLFxuICAvLyAgICBob3N0cywgYW5kIHBvcnQgYXJlIGlkZW50aWNhbCwgdGhlbiByZXR1cm4gdHJ1ZS5cbiAgaWYgKEEucHJvdG9jb2wgPT09IEIucHJvdG9jb2wgJiYgQS5ob3N0bmFtZSA9PT0gQi5ob3N0bmFtZSAmJiBBLnBvcnQgPT09IEIucG9ydCkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvLyAzLiBSZXR1cm4gZmFsc2UuXG4gIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBjcmVhdGVEZWZlcnJlZFByb21pc2UgKCkge1xuICBsZXQgcmVzXG4gIGxldCByZWpcbiAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICByZXMgPSByZXNvbHZlXG4gICAgcmVqID0gcmVqZWN0XG4gIH0pXG5cbiAgcmV0dXJuIHsgcHJvbWlzZSwgcmVzb2x2ZTogcmVzLCByZWplY3Q6IHJlaiB9XG59XG5cbmZ1bmN0aW9uIGlzQWJvcnRlZCAoZmV0Y2hQYXJhbXMpIHtcbiAgcmV0dXJuIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuc3RhdGUgPT09ICdhYm9ydGVkJ1xufVxuXG5mdW5jdGlvbiBpc0NhbmNlbGxlZCAoZmV0Y2hQYXJhbXMpIHtcbiAgcmV0dXJuIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuc3RhdGUgPT09ICdhYm9ydGVkJyB8fFxuICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuc3RhdGUgPT09ICd0ZXJtaW5hdGVkJ1xufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtbWV0aG9kLW5vcm1hbGl6ZVxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZFxuICovXG5mdW5jdGlvbiBub3JtYWxpemVNZXRob2QgKG1ldGhvZCkge1xuICByZXR1cm4gbm9ybWFsaXplZE1ldGhvZFJlY29yZHNCYXNlW21ldGhvZC50b0xvd2VyQ2FzZSgpXSA/PyBtZXRob2Rcbn1cblxuLy8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI3NlcmlhbGl6ZS1hLWphdmFzY3JpcHQtdmFsdWUtdG8tYS1qc29uLXN0cmluZ1xuZnVuY3Rpb24gc2VyaWFsaXplSmF2YXNjcmlwdFZhbHVlVG9KU09OU3RyaW5nICh2YWx1ZSkge1xuICAvLyAxLiBMZXQgcmVzdWx0IGJlID8gQ2FsbCglSlNPTi5zdHJpbmdpZnklLCB1bmRlZmluZWQsIMKrIHZhbHVlIMK7KS5cbiAgY29uc3QgcmVzdWx0ID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG5cbiAgLy8gMi4gSWYgcmVzdWx0IGlzIHVuZGVmaW5lZCwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVmFsdWUgaXMgbm90IEpTT04gc2VyaWFsaXphYmxlJylcbiAgfVxuXG4gIC8vIDMuIEFzc2VydDogcmVzdWx0IGlzIGEgc3RyaW5nLlxuICBhc3NlcnQodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycpXG5cbiAgLy8gNC4gUmV0dXJuIHJlc3VsdC5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSUyNWl0ZXJhdG9ycHJvdG90eXBlJTI1LW9iamVjdFxuY29uc3QgZXNJdGVyYXRvclByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihPYmplY3QuZ2V0UHJvdG90eXBlT2YoW11bU3ltYm9sLml0ZXJhdG9yXSgpKSlcblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jZGZuLWl0ZXJhdG9yLXByb3RvdHlwZS1vYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIG5hbWUgb2YgdGhlIGluc3RhbmNlXG4gKiBAcGFyYW0ge3N5bWJvbH0ga0ludGVybmFsSXRlcmF0b3JcbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBba2V5SW5kZXhdXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gW3ZhbHVlSW5kZXhdXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUl0ZXJhdG9yIChuYW1lLCBrSW50ZXJuYWxJdGVyYXRvciwga2V5SW5kZXggPSAwLCB2YWx1ZUluZGV4ID0gMSkge1xuICBjbGFzcyBGYXN0SXRlcmFibGVJdGVyYXRvciB7XG4gICAgLyoqIEB0eXBlIHthbnl9ICovXG4gICAgI3RhcmdldFxuICAgIC8qKiBAdHlwZSB7J2tleScgfCAndmFsdWUnIHwgJ2tleSt2YWx1ZSd9ICovXG4gICAgI2tpbmRcbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAjaW5kZXhcblxuICAgIC8qKlxuICAgICAqIEBzZWUgaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNkZm4tZGVmYXVsdC1pdGVyYXRvci1vYmplY3RcbiAgICAgKiBAcGFyYW0ge3Vua25vd259IHRhcmdldFxuICAgICAqIEBwYXJhbSB7J2tleScgfCAndmFsdWUnIHwgJ2tleSt2YWx1ZSd9IGtpbmRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAodGFyZ2V0LCBraW5kKSB7XG4gICAgICB0aGlzLiN0YXJnZXQgPSB0YXJnZXRcbiAgICAgIHRoaXMuI2tpbmQgPSBraW5kXG4gICAgICB0aGlzLiNpbmRleCA9IDBcbiAgICB9XG5cbiAgICBuZXh0ICgpIHtcbiAgICAgIC8vIDEuIExldCBpbnRlcmZhY2UgYmUgdGhlIGludGVyZmFjZSBmb3Igd2hpY2ggdGhlIGl0ZXJhdG9yIHByb3RvdHlwZSBvYmplY3QgZXhpc3RzLlxuICAgICAgLy8gMi4gTGV0IHRoaXNWYWx1ZSBiZSB0aGUgdGhpcyB2YWx1ZS5cbiAgICAgIC8vIDMuIExldCBvYmplY3QgYmUgPyBUb09iamVjdCh0aGlzVmFsdWUpLlxuICAgICAgLy8gNC4gSWYgb2JqZWN0IGlzIGEgcGxhdGZvcm0gb2JqZWN0LCB0aGVuIHBlcmZvcm0gYSBzZWN1cml0eVxuICAgICAgLy8gICAgY2hlY2ssIHBhc3Npbmc6XG4gICAgICAvLyA1LiBJZiBvYmplY3QgaXMgbm90IGEgZGVmYXVsdCBpdGVyYXRvciBvYmplY3QgZm9yIGludGVyZmFjZSxcbiAgICAgIC8vICAgIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgICBpZiAodHlwZW9mIHRoaXMgIT09ICdvYmplY3QnIHx8IHRoaXMgPT09IG51bGwgfHwgISgjdGFyZ2V0IGluIHRoaXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgYCduZXh0JyBjYWxsZWQgb24gYW4gb2JqZWN0IHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IGludGVyZmFjZSAke25hbWV9IEl0ZXJhdG9yLmBcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyA2LiBMZXQgaW5kZXggYmUgb2JqZWN04oCZcyBpbmRleC5cbiAgICAgIC8vIDcuIExldCBraW5kIGJlIG9iamVjdOKAmXMga2luZC5cbiAgICAgIC8vIDguIExldCB2YWx1ZXMgYmUgb2JqZWN04oCZcyB0YXJnZXQncyB2YWx1ZSBwYWlycyB0byBpdGVyYXRlIG92ZXIuXG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuI2luZGV4XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLiN0YXJnZXRba0ludGVybmFsSXRlcmF0b3JdXG5cbiAgICAgIC8vIDkuIExldCBsZW4gYmUgdGhlIGxlbmd0aCBvZiB2YWx1ZXMuXG4gICAgICBjb25zdCBsZW4gPSB2YWx1ZXMubGVuZ3RoXG5cbiAgICAgIC8vIDEwLiBJZiBpbmRleCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gbGVuLCB0aGVuIHJldHVyblxuICAgICAgLy8gICAgIENyZWF0ZUl0ZXJSZXN1bHRPYmplY3QodW5kZWZpbmVkLCB0cnVlKS5cbiAgICAgIGlmIChpbmRleCA+PSBsZW4pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICAgIGRvbmU6IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAxMS4gTGV0IHBhaXIgYmUgdGhlIGVudHJ5IGluIHZhbHVlcyBhdCBpbmRleCBpbmRleC5cbiAgICAgIGNvbnN0IHsgW2tleUluZGV4XToga2V5LCBbdmFsdWVJbmRleF06IHZhbHVlIH0gPSB2YWx1ZXNbaW5kZXhdXG5cbiAgICAgIC8vIDEyLiBTZXQgb2JqZWN04oCZcyBpbmRleCB0byBpbmRleCArIDEuXG4gICAgICB0aGlzLiNpbmRleCA9IGluZGV4ICsgMVxuXG4gICAgICAvLyAxMy4gUmV0dXJuIHRoZSBpdGVyYXRvciByZXN1bHQgZm9yIHBhaXIgYW5kIGtpbmQuXG5cbiAgICAgIC8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jaXRlcmF0b3ItcmVzdWx0XG5cbiAgICAgIC8vIDEuIExldCByZXN1bHQgYmUgYSB2YWx1ZSBkZXRlcm1pbmVkIGJ5IHRoZSB2YWx1ZSBvZiBraW5kOlxuICAgICAgbGV0IHJlc3VsdFxuICAgICAgc3dpdGNoICh0aGlzLiNraW5kKSB7XG4gICAgICAgIGNhc2UgJ2tleSc6XG4gICAgICAgICAgLy8gMS4gTGV0IGlkbEtleSBiZSBwYWly4oCZcyBrZXkuXG4gICAgICAgICAgLy8gMi4gTGV0IGtleSBiZSB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgaWRsS2V5IHRvIGFuXG4gICAgICAgICAgLy8gICAgRUNNQVNjcmlwdCB2YWx1ZS5cbiAgICAgICAgICAvLyAzLiByZXN1bHQgaXMga2V5LlxuICAgICAgICAgIHJlc3VsdCA9IGtleVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3ZhbHVlJzpcbiAgICAgICAgICAvLyAxLiBMZXQgaWRsVmFsdWUgYmUgcGFpcuKAmXMgdmFsdWUuXG4gICAgICAgICAgLy8gMi4gTGV0IHZhbHVlIGJlIHRoZSByZXN1bHQgb2YgY29udmVydGluZyBpZGxWYWx1ZSB0b1xuICAgICAgICAgIC8vICAgIGFuIEVDTUFTY3JpcHQgdmFsdWUuXG4gICAgICAgICAgLy8gMy4gcmVzdWx0IGlzIHZhbHVlLlxuICAgICAgICAgIHJlc3VsdCA9IHZhbHVlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAna2V5K3ZhbHVlJzpcbiAgICAgICAgICAvLyAxLiBMZXQgaWRsS2V5IGJlIHBhaXLigJlzIGtleS5cbiAgICAgICAgICAvLyAyLiBMZXQgaWRsVmFsdWUgYmUgcGFpcuKAmXMgdmFsdWUuXG4gICAgICAgICAgLy8gMy4gTGV0IGtleSBiZSB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgaWRsS2V5IHRvIGFuXG4gICAgICAgICAgLy8gICAgRUNNQVNjcmlwdCB2YWx1ZS5cbiAgICAgICAgICAvLyA0LiBMZXQgdmFsdWUgYmUgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIGlkbFZhbHVlIHRvXG4gICAgICAgICAgLy8gICAgYW4gRUNNQVNjcmlwdCB2YWx1ZS5cbiAgICAgICAgICAvLyA1LiBMZXQgYXJyYXkgYmUgISBBcnJheUNyZWF0ZSgyKS5cbiAgICAgICAgICAvLyA2LiBDYWxsICEgQ3JlYXRlRGF0YVByb3BlcnR5KGFycmF5LCBcIjBcIiwga2V5KS5cbiAgICAgICAgICAvLyA3LiBDYWxsICEgQ3JlYXRlRGF0YVByb3BlcnR5KGFycmF5LCBcIjFcIiwgdmFsdWUpLlxuICAgICAgICAgIC8vIDguIHJlc3VsdCBpcyBhcnJheS5cbiAgICAgICAgICByZXN1bHQgPSBba2V5LCB2YWx1ZV1cbiAgICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBSZXR1cm4gQ3JlYXRlSXRlclJlc3VsdE9iamVjdChyZXN1bHQsIGZhbHNlKS5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiByZXN1bHQsXG4gICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNkZm4taXRlcmF0b3ItcHJvdG90eXBlLW9iamVjdFxuICAvLyBAdHMtaWdub3JlXG4gIGRlbGV0ZSBGYXN0SXRlcmFibGVJdGVyYXRvci5wcm90b3R5cGUuY29uc3RydWN0b3JcblxuICBPYmplY3Quc2V0UHJvdG90eXBlT2YoRmFzdEl0ZXJhYmxlSXRlcmF0b3IucHJvdG90eXBlLCBlc0l0ZXJhdG9yUHJvdG90eXBlKVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEZhc3RJdGVyYWJsZUl0ZXJhdG9yLnByb3RvdHlwZSwge1xuICAgIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7XG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBgJHtuYW1lfSBJdGVyYXRvcmBcbiAgICB9LFxuICAgIG5leHQ6IHsgd3JpdGFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9XG4gIH0pXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7J2tleScgfCAndmFsdWUnIHwgJ2tleSt2YWx1ZSd9IGtpbmRcbiAgICogQHJldHVybnMge0l0ZXJhYmxlSXRlcmF0b3I8YW55Pn1cbiAgICovXG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBraW5kKSB7XG4gICAgcmV0dXJuIG5ldyBGYXN0SXRlcmFibGVJdGVyYXRvcih0YXJnZXQsIGtpbmQpXG4gIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jZGZuLWl0ZXJhdG9yLXByb3RvdHlwZS1vYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIG5hbWUgb2YgdGhlIGluc3RhbmNlXG4gKiBAcGFyYW0ge2FueX0gb2JqZWN0IGNsYXNzXG4gKiBAcGFyYW0ge3N5bWJvbH0ga0ludGVybmFsSXRlcmF0b3JcbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBba2V5SW5kZXhdXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gW3ZhbHVlSW5kZXhdXG4gKi9cbmZ1bmN0aW9uIGl0ZXJhdG9yTWl4aW4gKG5hbWUsIG9iamVjdCwga0ludGVybmFsSXRlcmF0b3IsIGtleUluZGV4ID0gMCwgdmFsdWVJbmRleCA9IDEpIHtcbiAgY29uc3QgbWFrZUl0ZXJhdG9yID0gY3JlYXRlSXRlcmF0b3IobmFtZSwga0ludGVybmFsSXRlcmF0b3IsIGtleUluZGV4LCB2YWx1ZUluZGV4KVxuXG4gIGNvbnN0IHByb3BlcnRpZXMgPSB7XG4gICAga2V5czoge1xuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGtleXMgKCkge1xuICAgICAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBvYmplY3QpXG4gICAgICAgIHJldHVybiBtYWtlSXRlcmF0b3IodGhpcywgJ2tleScpXG4gICAgICB9XG4gICAgfSxcbiAgICB2YWx1ZXM6IHtcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZXMgKCkge1xuICAgICAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBvYmplY3QpXG4gICAgICAgIHJldHVybiBtYWtlSXRlcmF0b3IodGhpcywgJ3ZhbHVlJylcbiAgICAgIH1cbiAgICB9LFxuICAgIGVudHJpZXM6IHtcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBlbnRyaWVzICgpIHtcbiAgICAgICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgb2JqZWN0KVxuICAgICAgICByZXR1cm4gbWFrZUl0ZXJhdG9yKHRoaXMsICdrZXkrdmFsdWUnKVxuICAgICAgfVxuICAgIH0sXG4gICAgZm9yRWFjaDoge1xuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGZvckVhY2ggKGNhbGxiYWNrZm4sIHRoaXNBcmcgPSBnbG9iYWxUaGlzKSB7XG4gICAgICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIG9iamVjdClcbiAgICAgICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCBgJHtuYW1lfS5mb3JFYWNoYClcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFja2ZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gZXhlY3V0ZSAnZm9yRWFjaCcgb24gJyR7bmFtZX0nOiBwYXJhbWV0ZXIgMSBpcyBub3Qgb2YgdHlwZSAnRnVuY3Rpb24nLmBcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB7IDA6IGtleSwgMTogdmFsdWUgfSBvZiBtYWtlSXRlcmF0b3IodGhpcywgJ2tleSt2YWx1ZScpKSB7XG4gICAgICAgICAgY2FsbGJhY2tmbi5jYWxsKHRoaXNBcmcsIHZhbHVlLCBrZXksIHRoaXMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMob2JqZWN0LnByb3RvdHlwZSwge1xuICAgIC4uLnByb3BlcnRpZXMsXG4gICAgW1N5bWJvbC5pdGVyYXRvcl06IHtcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogcHJvcGVydGllcy5lbnRyaWVzLnZhbHVlXG4gICAgfVxuICB9KVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2JvZHktZnVsbHktcmVhZFxuICovXG5hc3luYyBmdW5jdGlvbiBmdWxseVJlYWRCb2R5IChib2R5LCBwcm9jZXNzQm9keSwgcHJvY2Vzc0JvZHlFcnJvcikge1xuICAvLyAxLiBJZiB0YXNrRGVzdGluYXRpb24gaXMgbnVsbCwgdGhlbiBzZXQgdGFza0Rlc3RpbmF0aW9uIHRvXG4gIC8vICAgIHRoZSByZXN1bHQgb2Ygc3RhcnRpbmcgYSBuZXcgcGFyYWxsZWwgcXVldWUuXG5cbiAgLy8gMi4gTGV0IHN1Y2Nlc3NTdGVwcyBnaXZlbiBhIGJ5dGUgc2VxdWVuY2UgYnl0ZXMgYmUgdG8gcXVldWUgYVxuICAvLyAgICBmZXRjaCB0YXNrIHRvIHJ1biBwcm9jZXNzQm9keSBnaXZlbiBieXRlcywgd2l0aCB0YXNrRGVzdGluYXRpb24uXG4gIGNvbnN0IHN1Y2Nlc3NTdGVwcyA9IHByb2Nlc3NCb2R5XG5cbiAgLy8gMy4gTGV0IGVycm9yU3RlcHMgYmUgdG8gcXVldWUgYSBmZXRjaCB0YXNrIHRvIHJ1biBwcm9jZXNzQm9keUVycm9yLFxuICAvLyAgICB3aXRoIHRhc2tEZXN0aW5hdGlvbi5cbiAgY29uc3QgZXJyb3JTdGVwcyA9IHByb2Nlc3NCb2R5RXJyb3JcblxuICAvLyA0LiBMZXQgcmVhZGVyIGJlIHRoZSByZXN1bHQgb2YgZ2V0dGluZyBhIHJlYWRlciBmb3IgYm9keeKAmXMgc3RyZWFtLlxuICAvLyAgICBJZiB0aGF0IHRocmV3IGFuIGV4Y2VwdGlvbiwgdGhlbiBydW4gZXJyb3JTdGVwcyB3aXRoIHRoYXRcbiAgLy8gICAgZXhjZXB0aW9uIGFuZCByZXR1cm4uXG4gIGxldCByZWFkZXJcblxuICB0cnkge1xuICAgIHJlYWRlciA9IGJvZHkuc3RyZWFtLmdldFJlYWRlcigpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBlcnJvclN0ZXBzKGUpXG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyA1LiBSZWFkIGFsbCBieXRlcyBmcm9tIHJlYWRlciwgZ2l2ZW4gc3VjY2Vzc1N0ZXBzIGFuZCBlcnJvclN0ZXBzLlxuICB0cnkge1xuICAgIHN1Y2Nlc3NTdGVwcyhhd2FpdCByZWFkQWxsQnl0ZXMocmVhZGVyKSlcbiAgfSBjYXRjaCAoZSkge1xuICAgIGVycm9yU3RlcHMoZSlcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1JlYWRhYmxlU3RyZWFtTGlrZSAoc3RyZWFtKSB7XG4gIHJldHVybiBzdHJlYW0gaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbSB8fCAoXG4gICAgc3RyZWFtW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdSZWFkYWJsZVN0cmVhbScgJiZcbiAgICB0eXBlb2Ygc3RyZWFtLnRlZSA9PT0gJ2Z1bmN0aW9uJ1xuICApXG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXI8VWludDhBcnJheT59IGNvbnRyb2xsZXJcbiAqL1xuZnVuY3Rpb24gcmVhZGFibGVTdHJlYW1DbG9zZSAoY29udHJvbGxlcikge1xuICB0cnkge1xuICAgIGNvbnRyb2xsZXIuY2xvc2UoKVxuICAgIGNvbnRyb2xsZXIuYnlvYlJlcXVlc3Q/LnJlc3BvbmQoMClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gVE9ETzogYWRkIGNvbW1lbnQgZXhwbGFpbmluZyB3aHkgdGhpcyBlcnJvciBvY2N1cnMuXG4gICAgaWYgKCFlcnIubWVzc2FnZS5pbmNsdWRlcygnQ29udHJvbGxlciBpcyBhbHJlYWR5IGNsb3NlZCcpICYmICFlcnIubWVzc2FnZS5pbmNsdWRlcygnUmVhZGFibGVTdHJlYW0gaXMgYWxyZWFkeSBjbG9zZWQnKSkge1xuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGludmFsaWRJc29tb3JwaGljRW5jb2RlVmFsdWVSZWdleCA9IC9bXlxceDAwLVxceEZGXS8gLy8gZXNsaW50LWRpc2FibGUtbGluZVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI2lzb21vcnBoaWMtZW5jb2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXRcbiAqL1xuZnVuY3Rpb24gaXNvbW9ycGhpY0VuY29kZSAoaW5wdXQpIHtcbiAgLy8gMS4gQXNzZXJ0OiBpbnB1dCBjb250YWlucyBubyBjb2RlIHBvaW50cyBncmVhdGVyIHRoYW4gVSswMEZGLlxuICBhc3NlcnQoIWludmFsaWRJc29tb3JwaGljRW5jb2RlVmFsdWVSZWdleC50ZXN0KGlucHV0KSlcblxuICAvLyAyLiBSZXR1cm4gYSBieXRlIHNlcXVlbmNlIHdob3NlIGxlbmd0aCBpcyBlcXVhbCB0byBpbnB1dOKAmXMgY29kZVxuICAvLyAgICBwb2ludCBsZW5ndGggYW5kIHdob3NlIGJ5dGVzIGhhdmUgdGhlIHNhbWUgdmFsdWVzIGFzIHRoZVxuICAvLyAgICB2YWx1ZXMgb2YgaW5wdXTigJlzIGNvZGUgcG9pbnRzLCBpbiB0aGUgc2FtZSBvcmRlclxuICByZXR1cm4gaW5wdXRcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vc3RyZWFtcy5zcGVjLndoYXR3Zy5vcmcvI3JlYWRhYmxlc3RyZWFtZGVmYXVsdHJlYWRlci1yZWFkLWFsbC1ieXRlc1xuICogQHNlZSBodHRwczovL3N0cmVhbXMuc3BlYy53aGF0d2cub3JnLyNyZWFkLWxvb3BcbiAqIEBwYXJhbSB7UmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyfSByZWFkZXJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZEFsbEJ5dGVzIChyZWFkZXIpIHtcbiAgY29uc3QgYnl0ZXMgPSBbXVxuICBsZXQgYnl0ZUxlbmd0aCA9IDBcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IHsgZG9uZSwgdmFsdWU6IGNodW5rIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpXG5cbiAgICBpZiAoZG9uZSkge1xuICAgICAgLy8gMS4gQ2FsbCBzdWNjZXNzU3RlcHMgd2l0aCBieXRlcy5cbiAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGJ5dGVzLCBieXRlTGVuZ3RoKVxuICAgIH1cblxuICAgIC8vIDEuIElmIGNodW5rIGlzIG5vdCBhIFVpbnQ4QXJyYXkgb2JqZWN0LCBjYWxsIGZhaWx1cmVTdGVwc1xuICAgIC8vICAgIHdpdGggYSBUeXBlRXJyb3IgYW5kIGFib3J0IHRoZXNlIHN0ZXBzLlxuICAgIGlmICghaXNVaW50OEFycmF5KGNodW5rKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVjZWl2ZWQgbm9uLVVpbnQ4QXJyYXkgY2h1bmsnKVxuICAgIH1cblxuICAgIC8vIDIuIEFwcGVuZCB0aGUgYnl0ZXMgcmVwcmVzZW50ZWQgYnkgY2h1bmsgdG8gYnl0ZXMuXG4gICAgYnl0ZXMucHVzaChjaHVuaylcbiAgICBieXRlTGVuZ3RoICs9IGNodW5rLmxlbmd0aFxuXG4gICAgLy8gMy4gUmVhZC1sb29wIGdpdmVuIHJlYWRlciwgYnl0ZXMsIHN1Y2Nlc3NTdGVwcywgYW5kIGZhaWx1cmVTdGVwcy5cbiAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2lzLWxvY2FsXG4gKiBAcGFyYW0ge1VSTH0gdXJsXG4gKi9cbmZ1bmN0aW9uIHVybElzTG9jYWwgKHVybCkge1xuICBhc3NlcnQoJ3Byb3RvY29sJyBpbiB1cmwpIC8vIGVuc3VyZSBpdCdzIGEgdXJsIG9iamVjdFxuXG4gIGNvbnN0IHByb3RvY29sID0gdXJsLnByb3RvY29sXG5cbiAgcmV0dXJuIHByb3RvY29sID09PSAnYWJvdXQ6JyB8fCBwcm90b2NvbCA9PT0gJ2Jsb2I6JyB8fCBwcm90b2NvbCA9PT0gJ2RhdGE6J1xufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfFVSTH0gdXJsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gdXJsSGFzSHR0cHNTY2hlbWUgKHVybCkge1xuICByZXR1cm4gKFxuICAgIChcbiAgICAgIHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnICYmXG4gICAgICB1cmxbNV0gPT09ICc6JyAmJlxuICAgICAgdXJsWzBdID09PSAnaCcgJiZcbiAgICAgIHVybFsxXSA9PT0gJ3QnICYmXG4gICAgICB1cmxbMl0gPT09ICd0JyAmJlxuICAgICAgdXJsWzNdID09PSAncCcgJiZcbiAgICAgIHVybFs0XSA9PT0gJ3MnXG4gICAgKSB8fFxuICAgIHVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOidcbiAgKVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtc2NoZW1lXG4gKiBAcGFyYW0ge1VSTH0gdXJsXG4gKi9cbmZ1bmN0aW9uIHVybElzSHR0cEh0dHBzU2NoZW1lICh1cmwpIHtcbiAgYXNzZXJ0KCdwcm90b2NvbCcgaW4gdXJsKSAvLyBlbnN1cmUgaXQncyBhIHVybCBvYmplY3RcblxuICBjb25zdCBwcm90b2NvbCA9IHVybC5wcm90b2NvbFxuXG4gIHJldHVybiBwcm90b2NvbCA9PT0gJ2h0dHA6JyB8fCBwcm90b2NvbCA9PT0gJ2h0dHBzOidcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNzaW1wbGUtcmFuZ2UtaGVhZGVyLXZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dXaGl0ZXNwYWNlXG4gKi9cbmZ1bmN0aW9uIHNpbXBsZVJhbmdlSGVhZGVyVmFsdWUgKHZhbHVlLCBhbGxvd1doaXRlc3BhY2UpIHtcbiAgLy8gMS4gTGV0IGRhdGEgYmUgdGhlIGlzb21vcnBoaWMgZGVjb2Rpbmcgb2YgdmFsdWUuXG4gIC8vIE5vdGU6IGlzb21vcnBoaWMgZGVjb2RpbmcgdGFrZXMgYSBzZXF1ZW5jZSBvZiBieXRlcyAoaWUuIGEgVWludDhBcnJheSkgYW5kIHR1cm5zIGl0IGludG8gYSBzdHJpbmcsXG4gIC8vIG5vdGhpbmcgbW9yZS4gV2Ugb2J2aW91c2x5IGRvbid0IG5lZWQgdG8gZG8gdGhhdCBpZiB2YWx1ZSBpcyBhIHN0cmluZyBhbHJlYWR5LlxuICBjb25zdCBkYXRhID0gdmFsdWVcblxuICAvLyAyLiBJZiBkYXRhIGRvZXMgbm90IHN0YXJ0IHdpdGggXCJieXRlc1wiLCB0aGVuIHJldHVybiBmYWlsdXJlLlxuICBpZiAoIWRhdGEuc3RhcnRzV2l0aCgnYnl0ZXMnKSkge1xuICAgIHJldHVybiAnZmFpbHVyZSdcbiAgfVxuXG4gIC8vIDMuIExldCBwb3NpdGlvbiBiZSBhIHBvc2l0aW9uIHZhcmlhYmxlIGZvciBkYXRhLCBpbml0aWFsbHkgcG9pbnRpbmcgYXQgdGhlIDV0aCBjb2RlIHBvaW50IG9mIGRhdGEuXG4gIGNvbnN0IHBvc2l0aW9uID0geyBwb3NpdGlvbjogNSB9XG5cbiAgLy8gNC4gSWYgYWxsb3dXaGl0ZXNwYWNlIGlzIHRydWUsIGNvbGxlY3QgYSBzZXF1ZW5jZSBvZiBjb2RlIHBvaW50cyB0aGF0IGFyZSBIVFRQIHRhYiBvciBzcGFjZSxcbiAgLy8gICAgZnJvbSBkYXRhIGdpdmVuIHBvc2l0aW9uLlxuICBpZiAoYWxsb3dXaGl0ZXNwYWNlKSB7XG4gICAgY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50cyhcbiAgICAgIChjaGFyKSA9PiBjaGFyID09PSAnXFx0JyB8fCBjaGFyID09PSAnICcsXG4gICAgICBkYXRhLFxuICAgICAgcG9zaXRpb25cbiAgICApXG4gIH1cblxuICAvLyA1LiBJZiB0aGUgY29kZSBwb2ludCBhdCBwb3NpdGlvbiB3aXRoaW4gZGF0YSBpcyBub3QgVSswMDNEICg9KSwgdGhlbiByZXR1cm4gZmFpbHVyZS5cbiAgaWYgKGRhdGEuY2hhckNvZGVBdChwb3NpdGlvbi5wb3NpdGlvbikgIT09IDB4M0QpIHtcbiAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gIH1cblxuICAvLyA2LiBBZHZhbmNlIHBvc2l0aW9uIGJ5IDEuXG4gIHBvc2l0aW9uLnBvc2l0aW9uKytcblxuICAvLyA3LiBJZiBhbGxvd1doaXRlc3BhY2UgaXMgdHJ1ZSwgY29sbGVjdCBhIHNlcXVlbmNlIG9mIGNvZGUgcG9pbnRzIHRoYXQgYXJlIEhUVFAgdGFiIG9yIHNwYWNlLCBmcm9tXG4gIC8vICAgIGRhdGEgZ2l2ZW4gcG9zaXRpb24uXG4gIGlmIChhbGxvd1doaXRlc3BhY2UpIHtcbiAgICBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzKFxuICAgICAgKGNoYXIpID0+IGNoYXIgPT09ICdcXHQnIHx8IGNoYXIgPT09ICcgJyxcbiAgICAgIGRhdGEsXG4gICAgICBwb3NpdGlvblxuICAgIClcbiAgfVxuXG4gIC8vIDguIExldCByYW5nZVN0YXJ0IGJlIHRoZSByZXN1bHQgb2YgY29sbGVjdGluZyBhIHNlcXVlbmNlIG9mIGNvZGUgcG9pbnRzIHRoYXQgYXJlIEFTQ0lJIGRpZ2l0cyxcbiAgLy8gICAgZnJvbSBkYXRhIGdpdmVuIHBvc2l0aW9uLlxuICBjb25zdCByYW5nZVN0YXJ0ID0gY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50cyhcbiAgICAoY2hhcikgPT4ge1xuICAgICAgY29uc3QgY29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKVxuXG4gICAgICByZXR1cm4gY29kZSA+PSAweDMwICYmIGNvZGUgPD0gMHgzOVxuICAgIH0sXG4gICAgZGF0YSxcbiAgICBwb3NpdGlvblxuICApXG5cbiAgLy8gOS4gTGV0IHJhbmdlU3RhcnRWYWx1ZSBiZSByYW5nZVN0YXJ0LCBpbnRlcnByZXRlZCBhcyBkZWNpbWFsIG51bWJlciwgaWYgcmFuZ2VTdGFydCBpcyBub3QgdGhlXG4gIC8vICAgIGVtcHR5IHN0cmluZzsgb3RoZXJ3aXNlIG51bGwuXG4gIGNvbnN0IHJhbmdlU3RhcnRWYWx1ZSA9IHJhbmdlU3RhcnQubGVuZ3RoID8gTnVtYmVyKHJhbmdlU3RhcnQpIDogbnVsbFxuXG4gIC8vIDEwLiBJZiBhbGxvd1doaXRlc3BhY2UgaXMgdHJ1ZSwgY29sbGVjdCBhIHNlcXVlbmNlIG9mIGNvZGUgcG9pbnRzIHRoYXQgYXJlIEhUVFAgdGFiIG9yIHNwYWNlLFxuICAvLyAgICAgZnJvbSBkYXRhIGdpdmVuIHBvc2l0aW9uLlxuICBpZiAoYWxsb3dXaGl0ZXNwYWNlKSB7XG4gICAgY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50cyhcbiAgICAgIChjaGFyKSA9PiBjaGFyID09PSAnXFx0JyB8fCBjaGFyID09PSAnICcsXG4gICAgICBkYXRhLFxuICAgICAgcG9zaXRpb25cbiAgICApXG4gIH1cblxuICAvLyAxMS4gSWYgdGhlIGNvZGUgcG9pbnQgYXQgcG9zaXRpb24gd2l0aGluIGRhdGEgaXMgbm90IFUrMDAyRCAoLSksIHRoZW4gcmV0dXJuIGZhaWx1cmUuXG4gIGlmIChkYXRhLmNoYXJDb2RlQXQocG9zaXRpb24ucG9zaXRpb24pICE9PSAweDJEKSB7XG4gICAgcmV0dXJuICdmYWlsdXJlJ1xuICB9XG5cbiAgLy8gMTIuIEFkdmFuY2UgcG9zaXRpb24gYnkgMS5cbiAgcG9zaXRpb24ucG9zaXRpb24rK1xuXG4gIC8vIDEzLiBJZiBhbGxvd1doaXRlc3BhY2UgaXMgdHJ1ZSwgY29sbGVjdCBhIHNlcXVlbmNlIG9mIGNvZGUgcG9pbnRzIHRoYXQgYXJlIEhUVFAgdGFiXG4gIC8vICAgICBvciBzcGFjZSwgZnJvbSBkYXRhIGdpdmVuIHBvc2l0aW9uLlxuICAvLyBOb3RlIGZyb20gS2hhZnJhOiBpdHMgdGhlIHNhbWUgc3RlcCBhcyBpbiAjOCBhZ2FpbiBsb2xcbiAgaWYgKGFsbG93V2hpdGVzcGFjZSkge1xuICAgIGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHMoXG4gICAgICAoY2hhcikgPT4gY2hhciA9PT0gJ1xcdCcgfHwgY2hhciA9PT0gJyAnLFxuICAgICAgZGF0YSxcbiAgICAgIHBvc2l0aW9uXG4gICAgKVxuICB9XG5cbiAgLy8gMTQuIExldCByYW5nZUVuZCBiZSB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmcgYSBzZXF1ZW5jZSBvZiBjb2RlIHBvaW50cyB0aGF0IGFyZVxuICAvLyAgICAgQVNDSUkgZGlnaXRzLCBmcm9tIGRhdGEgZ2l2ZW4gcG9zaXRpb24uXG4gIC8vIE5vdGUgZnJvbSBLaGFmcmE6IHlvdSB3b3VsZG4ndCBndWVzcyBpdCwgYnV0IHRoaXMgaXMgYWxzbyB0aGUgc2FtZSBzdGVwIGFzICM4XG4gIGNvbnN0IHJhbmdlRW5kID0gY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50cyhcbiAgICAoY2hhcikgPT4ge1xuICAgICAgY29uc3QgY29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKVxuXG4gICAgICByZXR1cm4gY29kZSA+PSAweDMwICYmIGNvZGUgPD0gMHgzOVxuICAgIH0sXG4gICAgZGF0YSxcbiAgICBwb3NpdGlvblxuICApXG5cbiAgLy8gMTUuIExldCByYW5nZUVuZFZhbHVlIGJlIHJhbmdlRW5kLCBpbnRlcnByZXRlZCBhcyBkZWNpbWFsIG51bWJlciwgaWYgcmFuZ2VFbmRcbiAgLy8gICAgIGlzIG5vdCB0aGUgZW1wdHkgc3RyaW5nOyBvdGhlcndpc2UgbnVsbC5cbiAgLy8gTm90ZSBmcm9tIEtoYWZyYTogVEhFIFNBTUUgU1RFUCwgQUdBSU4hISFcbiAgLy8gTm90ZTogd2h5IGludGVycHJldCBhcyBhIGRlY2ltYWwgaWYgd2Ugb25seSBjb2xsZWN0IGFzY2lpIGRpZ2l0cz9cbiAgY29uc3QgcmFuZ2VFbmRWYWx1ZSA9IHJhbmdlRW5kLmxlbmd0aCA/IE51bWJlcihyYW5nZUVuZCkgOiBudWxsXG5cbiAgLy8gMTYuIElmIHBvc2l0aW9uIGlzIG5vdCBwYXN0IHRoZSBlbmQgb2YgZGF0YSwgdGhlbiByZXR1cm4gZmFpbHVyZS5cbiAgaWYgKHBvc2l0aW9uLnBvc2l0aW9uIDwgZGF0YS5sZW5ndGgpIHtcbiAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gIH1cblxuICAvLyAxNy4gSWYgcmFuZ2VFbmRWYWx1ZSBhbmQgcmFuZ2VTdGFydFZhbHVlIGFyZSBudWxsLCB0aGVuIHJldHVybiBmYWlsdXJlLlxuICBpZiAocmFuZ2VFbmRWYWx1ZSA9PT0gbnVsbCAmJiByYW5nZVN0YXJ0VmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gIH1cblxuICAvLyAxOC4gSWYgcmFuZ2VTdGFydFZhbHVlIGFuZCByYW5nZUVuZFZhbHVlIGFyZSBudW1iZXJzLCBhbmQgcmFuZ2VTdGFydFZhbHVlIGlzXG4gIC8vICAgICBncmVhdGVyIHRoYW4gcmFuZ2VFbmRWYWx1ZSwgdGhlbiByZXR1cm4gZmFpbHVyZS5cbiAgLy8gTm90ZTogLi4uIHdoZW4gY2FuIHRoZXkgbm90IGJlIG51bWJlcnM/XG4gIGlmIChyYW5nZVN0YXJ0VmFsdWUgPiByYW5nZUVuZFZhbHVlKSB7XG4gICAgcmV0dXJuICdmYWlsdXJlJ1xuICB9XG5cbiAgLy8gMTkuIFJldHVybiAocmFuZ2VTdGFydFZhbHVlLCByYW5nZUVuZFZhbHVlKS5cbiAgcmV0dXJuIHsgcmFuZ2VTdGFydFZhbHVlLCByYW5nZUVuZFZhbHVlIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNidWlsZC1hLWNvbnRlbnQtcmFuZ2VcbiAqIEBwYXJhbSB7bnVtYmVyfSByYW5nZVN0YXJ0XG4gKiBAcGFyYW0ge251bWJlcn0gcmFuZ2VFbmRcbiAqIEBwYXJhbSB7bnVtYmVyfSBmdWxsTGVuZ3RoXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkQ29udGVudFJhbmdlIChyYW5nZVN0YXJ0LCByYW5nZUVuZCwgZnVsbExlbmd0aCkge1xuICAvLyAxLiBMZXQgY29udGVudFJhbmdlIGJlIGBieXRlcyBgLlxuICBsZXQgY29udGVudFJhbmdlID0gJ2J5dGVzICdcblxuICAvLyAyLiBBcHBlbmQgcmFuZ2VTdGFydCwgc2VyaWFsaXplZCBhbmQgaXNvbW9ycGhpYyBlbmNvZGVkLCB0byBjb250ZW50UmFuZ2UuXG4gIGNvbnRlbnRSYW5nZSArPSBpc29tb3JwaGljRW5jb2RlKGAke3JhbmdlU3RhcnR9YClcblxuICAvLyAzLiBBcHBlbmQgMHgyRCAoLSkgdG8gY29udGVudFJhbmdlLlxuICBjb250ZW50UmFuZ2UgKz0gJy0nXG5cbiAgLy8gNC4gQXBwZW5kIHJhbmdlRW5kLCBzZXJpYWxpemVkIGFuZCBpc29tb3JwaGljIGVuY29kZWQgdG8gY29udGVudFJhbmdlLlxuICBjb250ZW50UmFuZ2UgKz0gaXNvbW9ycGhpY0VuY29kZShgJHtyYW5nZUVuZH1gKVxuXG4gIC8vIDUuIEFwcGVuZCAweDJGICgvKSB0byBjb250ZW50UmFuZ2UuXG4gIGNvbnRlbnRSYW5nZSArPSAnLydcblxuICAvLyA2LiBBcHBlbmQgZnVsbExlbmd0aCwgc2VyaWFsaXplZCBhbmQgaXNvbW9ycGhpYyBlbmNvZGVkIHRvIGNvbnRlbnRSYW5nZS5cbiAgY29udGVudFJhbmdlICs9IGlzb21vcnBoaWNFbmNvZGUoYCR7ZnVsbExlbmd0aH1gKVxuXG4gIC8vIDcuIFJldHVybiBjb250ZW50UmFuZ2UuXG4gIHJldHVybiBjb250ZW50UmFuZ2Vcbn1cblxuLy8gQSBTdHJlYW0sIHdoaWNoIHBpcGVzIHRoZSByZXNwb25zZSB0byB6bGliLmNyZWF0ZUluZmxhdGUoKSBvclxuLy8gemxpYi5jcmVhdGVJbmZsYXRlUmF3KCkgZGVwZW5kaW5nIG9uIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBCdWZmZXIuXG4vLyBJZiB0aGUgbG93ZXIgYnl0ZSBvZiB0aGUgZmlyc3QgYnl0ZSBpcyAweDA4LCB0aGVuIHRoZSBzdHJlYW0gaXNcbi8vIGludGVycHJldGVkIGFzIGEgemxpYiBzdHJlYW0sIG90aGVyd2lzZSBpdCdzIGludGVycHJldGVkIGFzIGFcbi8vIHJhdyBkZWZsYXRlIHN0cmVhbS5cbmNsYXNzIEluZmxhdGVTdHJlYW0gZXh0ZW5kcyBUcmFuc2Zvcm0ge1xuICAjemxpYk9wdGlvbnNcblxuICAvKiogQHBhcmFtIHt6bGliLlpsaWJPcHRpb25zfSBbemxpYk9wdGlvbnNdICovXG4gIGNvbnN0cnVjdG9yICh6bGliT3B0aW9ucykge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLiN6bGliT3B0aW9ucyA9IHpsaWJPcHRpb25zXG4gIH1cblxuICBfdHJhbnNmb3JtIChjaHVuaywgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLl9pbmZsYXRlU3RyZWFtKSB7XG4gICAgICBpZiAoY2h1bmsubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNhbGxiYWNrKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICB0aGlzLl9pbmZsYXRlU3RyZWFtID0gKGNodW5rWzBdICYgMHgwRikgPT09IDB4MDhcbiAgICAgICAgPyB6bGliLmNyZWF0ZUluZmxhdGUodGhpcy4jemxpYk9wdGlvbnMpXG4gICAgICAgIDogemxpYi5jcmVhdGVJbmZsYXRlUmF3KHRoaXMuI3psaWJPcHRpb25zKVxuXG4gICAgICB0aGlzLl9pbmZsYXRlU3RyZWFtLm9uKCdkYXRhJywgdGhpcy5wdXNoLmJpbmQodGhpcykpXG4gICAgICB0aGlzLl9pbmZsYXRlU3RyZWFtLm9uKCdlbmQnLCAoKSA9PiB0aGlzLnB1c2gobnVsbCkpXG4gICAgICB0aGlzLl9pbmZsYXRlU3RyZWFtLm9uKCdlcnJvcicsIChlcnIpID0+IHRoaXMuZGVzdHJveShlcnIpKVxuICAgIH1cblxuICAgIHRoaXMuX2luZmxhdGVTdHJlYW0ud3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaylcbiAgfVxuXG4gIF9maW5hbCAoY2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy5faW5mbGF0ZVN0cmVhbSkge1xuICAgICAgdGhpcy5faW5mbGF0ZVN0cmVhbS5lbmQoKVxuICAgICAgdGhpcy5faW5mbGF0ZVN0cmVhbSA9IG51bGxcbiAgICB9XG4gICAgY2FsbGJhY2soKVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHt6bGliLlpsaWJPcHRpb25zfSBbemxpYk9wdGlvbnNdXG4gKiBAcmV0dXJucyB7SW5mbGF0ZVN0cmVhbX1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5mbGF0ZSAoemxpYk9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBJbmZsYXRlU3RyZWFtKHpsaWJPcHRpb25zKVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtaGVhZGVyLWV4dHJhY3QtbWltZS10eXBlXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9oZWFkZXJzJykuSGVhZGVyc0xpc3R9IGhlYWRlcnNcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdE1pbWVUeXBlIChoZWFkZXJzKSB7XG4gIC8vIDEuIExldCBjaGFyc2V0IGJlIG51bGwuXG4gIGxldCBjaGFyc2V0ID0gbnVsbFxuXG4gIC8vIDIuIExldCBlc3NlbmNlIGJlIG51bGwuXG4gIGxldCBlc3NlbmNlID0gbnVsbFxuXG4gIC8vIDMuIExldCBtaW1lVHlwZSBiZSBudWxsLlxuICBsZXQgbWltZVR5cGUgPSBudWxsXG5cbiAgLy8gNC4gTGV0IHZhbHVlcyBiZSB0aGUgcmVzdWx0IG9mIGdldHRpbmcsIGRlY29kaW5nLCBhbmQgc3BsaXR0aW5nIGBDb250ZW50LVR5cGVgIGZyb20gaGVhZGVycy5cbiAgY29uc3QgdmFsdWVzID0gZ2V0RGVjb2RlU3BsaXQoJ2NvbnRlbnQtdHlwZScsIGhlYWRlcnMpXG5cbiAgLy8gNS4gSWYgdmFsdWVzIGlzIG51bGwsIHRoZW4gcmV0dXJuIGZhaWx1cmUuXG4gIGlmICh2YWx1ZXMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gIH1cblxuICAvLyA2LiBGb3IgZWFjaCB2YWx1ZSBvZiB2YWx1ZXM6XG4gIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgLy8gNi4xLiBMZXQgdGVtcG9yYXJ5TWltZVR5cGUgYmUgdGhlIHJlc3VsdCBvZiBwYXJzaW5nIHZhbHVlLlxuICAgIGNvbnN0IHRlbXBvcmFyeU1pbWVUeXBlID0gcGFyc2VNSU1FVHlwZSh2YWx1ZSlcblxuICAgIC8vIDYuMi4gSWYgdGVtcG9yYXJ5TWltZVR5cGUgaXMgZmFpbHVyZSBvciBpdHMgZXNzZW5jZSBpcyBcIiovKlwiLCB0aGVuIGNvbnRpbnVlLlxuICAgIGlmICh0ZW1wb3JhcnlNaW1lVHlwZSA9PT0gJ2ZhaWx1cmUnIHx8IHRlbXBvcmFyeU1pbWVUeXBlLmVzc2VuY2UgPT09ICcqLyonKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIDYuMy4gU2V0IG1pbWVUeXBlIHRvIHRlbXBvcmFyeU1pbWVUeXBlLlxuICAgIG1pbWVUeXBlID0gdGVtcG9yYXJ5TWltZVR5cGVcblxuICAgIC8vIDYuNC4gSWYgbWltZVR5cGXigJlzIGVzc2VuY2UgaXMgbm90IGVzc2VuY2UsIHRoZW46XG4gICAgaWYgKG1pbWVUeXBlLmVzc2VuY2UgIT09IGVzc2VuY2UpIHtcbiAgICAgIC8vIDYuNC4xLiBTZXQgY2hhcnNldCB0byBudWxsLlxuICAgICAgY2hhcnNldCA9IG51bGxcblxuICAgICAgLy8gNi40LjIuIElmIG1pbWVUeXBl4oCZcyBwYXJhbWV0ZXJzW1wiY2hhcnNldFwiXSBleGlzdHMsIHRoZW4gc2V0IGNoYXJzZXQgdG9cbiAgICAgIC8vICAgICAgICBtaW1lVHlwZeKAmXMgcGFyYW1ldGVyc1tcImNoYXJzZXRcIl0uXG4gICAgICBpZiAobWltZVR5cGUucGFyYW1ldGVycy5oYXMoJ2NoYXJzZXQnKSkge1xuICAgICAgICBjaGFyc2V0ID0gbWltZVR5cGUucGFyYW1ldGVycy5nZXQoJ2NoYXJzZXQnKVxuICAgICAgfVxuXG4gICAgICAvLyA2LjQuMy4gU2V0IGVzc2VuY2UgdG8gbWltZVR5cGXigJlzIGVzc2VuY2UuXG4gICAgICBlc3NlbmNlID0gbWltZVR5cGUuZXNzZW5jZVxuICAgIH0gZWxzZSBpZiAoIW1pbWVUeXBlLnBhcmFtZXRlcnMuaGFzKCdjaGFyc2V0JykgJiYgY2hhcnNldCAhPT0gbnVsbCkge1xuICAgICAgLy8gNi41LiBPdGhlcndpc2UsIGlmIG1pbWVUeXBl4oCZcyBwYXJhbWV0ZXJzW1wiY2hhcnNldFwiXSBkb2VzIG5vdCBleGlzdCwgYW5kXG4gICAgICAvLyAgICAgIGNoYXJzZXQgaXMgbm9uLW51bGwsIHNldCBtaW1lVHlwZeKAmXMgcGFyYW1ldGVyc1tcImNoYXJzZXRcIl0gdG8gY2hhcnNldC5cbiAgICAgIG1pbWVUeXBlLnBhcmFtZXRlcnMuc2V0KCdjaGFyc2V0JywgY2hhcnNldClcbiAgICB9XG4gIH1cblxuICAvLyA3LiBJZiBtaW1lVHlwZSBpcyBudWxsLCB0aGVuIHJldHVybiBmYWlsdXJlLlxuICBpZiAobWltZVR5cGUgPT0gbnVsbCkge1xuICAgIHJldHVybiAnZmFpbHVyZSdcbiAgfVxuXG4gIC8vIDguIFJldHVybiBtaW1lVHlwZS5cbiAgcmV0dXJuIG1pbWVUeXBlXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaGVhZGVyLXZhbHVlLWdldC1kZWNvZGUtYW5kLXNwbGl0XG4gKiBAcGFyYW0ge3N0cmluZ3xudWxsfSB2YWx1ZVxuICovXG5mdW5jdGlvbiBnZXR0aW5nRGVjb2RpbmdTcGxpdHRpbmcgKHZhbHVlKSB7XG4gIC8vIDEuIExldCBpbnB1dCBiZSB0aGUgcmVzdWx0IG9mIGlzb21vcnBoaWMgZGVjb2RpbmcgdmFsdWUuXG4gIGNvbnN0IGlucHV0ID0gdmFsdWVcblxuICAvLyAyLiBMZXQgcG9zaXRpb24gYmUgYSBwb3NpdGlvbiB2YXJpYWJsZSBmb3IgaW5wdXQsIGluaXRpYWxseSBwb2ludGluZyBhdCB0aGUgc3RhcnQgb2YgaW5wdXQuXG4gIGNvbnN0IHBvc2l0aW9uID0geyBwb3NpdGlvbjogMCB9XG5cbiAgLy8gMy4gTGV0IHZhbHVlcyBiZSBhIGxpc3Qgb2Ygc3RyaW5ncywgaW5pdGlhbGx5IGVtcHR5LlxuICBjb25zdCB2YWx1ZXMgPSBbXVxuXG4gIC8vIDQuIExldCB0ZW1wb3JhcnlWYWx1ZSBiZSB0aGUgZW1wdHkgc3RyaW5nLlxuICBsZXQgdGVtcG9yYXJ5VmFsdWUgPSAnJ1xuXG4gIC8vIDUuIFdoaWxlIHBvc2l0aW9uIGlzIG5vdCBwYXN0IHRoZSBlbmQgb2YgaW5wdXQ6XG4gIHdoaWxlIChwb3NpdGlvbi5wb3NpdGlvbiA8IGlucHV0Lmxlbmd0aCkge1xuICAgIC8vIDUuMS4gQXBwZW5kIHRoZSByZXN1bHQgb2YgY29sbGVjdGluZyBhIHNlcXVlbmNlIG9mIGNvZGUgcG9pbnRzIHRoYXQgYXJlIG5vdCBVKzAwMjIgKFwiKVxuICAgIC8vICAgICAgb3IgVSswMDJDICgsKSBmcm9tIGlucHV0LCBnaXZlbiBwb3NpdGlvbiwgdG8gdGVtcG9yYXJ5VmFsdWUuXG4gICAgdGVtcG9yYXJ5VmFsdWUgKz0gY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50cyhcbiAgICAgIChjaGFyKSA9PiBjaGFyICE9PSAnXCInICYmIGNoYXIgIT09ICcsJyxcbiAgICAgIGlucHV0LFxuICAgICAgcG9zaXRpb25cbiAgICApXG5cbiAgICAvLyA1LjIuIElmIHBvc2l0aW9uIGlzIG5vdCBwYXN0IHRoZSBlbmQgb2YgaW5wdXQsIHRoZW46XG4gICAgaWYgKHBvc2l0aW9uLnBvc2l0aW9uIDwgaW5wdXQubGVuZ3RoKSB7XG4gICAgICAvLyA1LjIuMS4gSWYgdGhlIGNvZGUgcG9pbnQgYXQgcG9zaXRpb24gd2l0aGluIGlucHV0IGlzIFUrMDAyMiAoXCIpLCB0aGVuOlxuICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocG9zaXRpb24ucG9zaXRpb24pID09PSAweDIyKSB7XG4gICAgICAgIC8vIDUuMi4xLjEuIEFwcGVuZCB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmcgYW4gSFRUUCBxdW90ZWQgc3RyaW5nIGZyb20gaW5wdXQsIGdpdmVuIHBvc2l0aW9uLCB0byB0ZW1wb3JhcnlWYWx1ZS5cbiAgICAgICAgdGVtcG9yYXJ5VmFsdWUgKz0gY29sbGVjdEFuSFRUUFF1b3RlZFN0cmluZyhcbiAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICBwb3NpdGlvblxuICAgICAgICApXG5cbiAgICAgICAgLy8gNS4yLjEuMi4gSWYgcG9zaXRpb24gaXMgbm90IHBhc3QgdGhlIGVuZCBvZiBpbnB1dCwgdGhlbiBjb250aW51ZS5cbiAgICAgICAgaWYgKHBvc2l0aW9uLnBvc2l0aW9uIDwgaW5wdXQubGVuZ3RoKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gNS4yLjIuIE90aGVyd2lzZTpcblxuICAgICAgICAvLyA1LjIuMi4xLiBBc3NlcnQ6IHRoZSBjb2RlIHBvaW50IGF0IHBvc2l0aW9uIHdpdGhpbiBpbnB1dCBpcyBVKzAwMkMgKCwpLlxuICAgICAgICBhc3NlcnQoaW5wdXQuY2hhckNvZGVBdChwb3NpdGlvbi5wb3NpdGlvbikgPT09IDB4MkMpXG5cbiAgICAgICAgLy8gNS4yLjIuMi4gQWR2YW5jZSBwb3NpdGlvbiBieSAxLlxuICAgICAgICBwb3NpdGlvbi5wb3NpdGlvbisrXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNS4zLiBSZW1vdmUgYWxsIEhUVFAgdGFiIG9yIHNwYWNlIGZyb20gdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGVtcG9yYXJ5VmFsdWUuXG4gICAgdGVtcG9yYXJ5VmFsdWUgPSByZW1vdmVDaGFycyh0ZW1wb3JhcnlWYWx1ZSwgdHJ1ZSwgdHJ1ZSwgKGNoYXIpID0+IGNoYXIgPT09IDB4OSB8fCBjaGFyID09PSAweDIwKVxuXG4gICAgLy8gNS40LiBBcHBlbmQgdGVtcG9yYXJ5VmFsdWUgdG8gdmFsdWVzLlxuICAgIHZhbHVlcy5wdXNoKHRlbXBvcmFyeVZhbHVlKVxuXG4gICAgLy8gNS42LiBTZXQgdGVtcG9yYXJ5VmFsdWUgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAgICB0ZW1wb3JhcnlWYWx1ZSA9ICcnXG4gIH1cblxuICAvLyA2LiBSZXR1cm4gdmFsdWVzLlxuICByZXR1cm4gdmFsdWVzXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1oZWFkZXItbGlzdC1nZXQtZGVjb2RlLXNwbGl0XG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBsb3dlcmNhc2UgaGVhZGVyIG5hbWVcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2hlYWRlcnMnKS5IZWFkZXJzTGlzdH0gbGlzdFxuICovXG5mdW5jdGlvbiBnZXREZWNvZGVTcGxpdCAobmFtZSwgbGlzdCkge1xuICAvLyAxLiBMZXQgdmFsdWUgYmUgdGhlIHJlc3VsdCBvZiBnZXR0aW5nIG5hbWUgZnJvbSBsaXN0LlxuICBjb25zdCB2YWx1ZSA9IGxpc3QuZ2V0KG5hbWUsIHRydWUpXG5cbiAgLy8gMi4gSWYgdmFsdWUgaXMgbnVsbCwgdGhlbiByZXR1cm4gbnVsbC5cbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8vIDMuIFJldHVybiB0aGUgcmVzdWx0IG9mIGdldHRpbmcsIGRlY29kaW5nLCBhbmQgc3BsaXR0aW5nIHZhbHVlLlxuICByZXR1cm4gZ2V0dGluZ0RlY29kaW5nU3BsaXR0aW5nKHZhbHVlKVxufVxuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpXG5cbi8qKlxuICogQHNlZSBodHRwczovL2VuY29kaW5nLnNwZWMud2hhdHdnLm9yZy8jdXRmLTgtZGVjb2RlXG4gKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyXG4gKi9cbmZ1bmN0aW9uIHV0ZjhEZWNvZGVCeXRlcyAoYnVmZmVyKSB7XG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyAxLiBMZXQgYnVmZmVyIGJlIHRoZSByZXN1bHQgb2YgcGVla2luZyB0aHJlZSBieXRlcyBmcm9tXG4gIC8vICAgIGlvUXVldWUsIGNvbnZlcnRlZCB0byBhIGJ5dGUgc2VxdWVuY2UuXG5cbiAgLy8gMi4gSWYgYnVmZmVyIGlzIDB4RUYgMHhCQiAweEJGLCB0aGVuIHJlYWQgdGhyZWVcbiAgLy8gICAgYnl0ZXMgZnJvbSBpb1F1ZXVlLiAoRG8gbm90aGluZyB3aXRoIHRob3NlIGJ5dGVzLilcbiAgaWYgKGJ1ZmZlclswXSA9PT0gMHhFRiAmJiBidWZmZXJbMV0gPT09IDB4QkIgJiYgYnVmZmVyWzJdID09PSAweEJGKSB7XG4gICAgYnVmZmVyID0gYnVmZmVyLnN1YmFycmF5KDMpXG4gIH1cblxuICAvLyAzLiBQcm9jZXNzIGEgcXVldWUgd2l0aCBhbiBpbnN0YW5jZSBvZiBVVEYtOOKAmXNcbiAgLy8gICAgZGVjb2RlciwgaW9RdWV1ZSwgb3V0cHV0LCBhbmQgXCJyZXBsYWNlbWVudFwiLlxuICBjb25zdCBvdXRwdXQgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoYnVmZmVyKVxuXG4gIC8vIDQuIFJldHVybiBvdXRwdXQuXG4gIHJldHVybiBvdXRwdXRcbn1cblxuY2xhc3MgRW52aXJvbm1lbnRTZXR0aW5nc09iamVjdEJhc2Uge1xuICBnZXQgYmFzZVVybCAoKSB7XG4gICAgcmV0dXJuIGdldEdsb2JhbE9yaWdpbigpXG4gIH1cblxuICBnZXQgb3JpZ2luICgpIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlVXJsPy5vcmlnaW5cbiAgfVxuXG4gIHBvbGljeUNvbnRhaW5lciA9IG1ha2VQb2xpY3lDb250YWluZXIoKVxufVxuXG5jbGFzcyBFbnZpcm9ubWVudFNldHRpbmdzT2JqZWN0IHtcbiAgc2V0dGluZ3NPYmplY3QgPSBuZXcgRW52aXJvbm1lbnRTZXR0aW5nc09iamVjdEJhc2UoKVxufVxuXG5jb25zdCBlbnZpcm9ubWVudFNldHRpbmdzT2JqZWN0ID0gbmV3IEVudmlyb25tZW50U2V0dGluZ3NPYmplY3QoKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNBYm9ydGVkLFxuICBpc0NhbmNlbGxlZCxcbiAgaXNWYWxpZEVuY29kZWRVUkwsXG4gIGNyZWF0ZURlZmVycmVkUHJvbWlzZSxcbiAgUmVhZGFibGVTdHJlYW1Gcm9tLFxuICB0cnlVcGdyYWRlUmVxdWVzdFRvQVBvdGVudGlhbGx5VHJ1c3R3b3J0aHlVUkwsXG4gIGNsYW1wQW5kQ29hcnNlbkNvbm5lY3Rpb25UaW1pbmdJbmZvLFxuICBjb2Fyc2VuZWRTaGFyZWRDdXJyZW50VGltZSxcbiAgZGV0ZXJtaW5lUmVxdWVzdHNSZWZlcnJlcixcbiAgbWFrZVBvbGljeUNvbnRhaW5lcixcbiAgY2xvbmVQb2xpY3lDb250YWluZXIsXG4gIGFwcGVuZEZldGNoTWV0YWRhdGEsXG4gIGFwcGVuZFJlcXVlc3RPcmlnaW5IZWFkZXIsXG4gIFRBT0NoZWNrLFxuICBjb3JzQ2hlY2ssXG4gIGNyb3NzT3JpZ2luUmVzb3VyY2VQb2xpY3lDaGVjayxcbiAgY3JlYXRlT3BhcXVlVGltaW5nSW5mbyxcbiAgc2V0UmVxdWVzdFJlZmVycmVyUG9saWN5T25SZWRpcmVjdCxcbiAgaXNWYWxpZEhUVFBUb2tlbixcbiAgcmVxdWVzdEJhZFBvcnQsXG4gIHJlcXVlc3RDdXJyZW50VVJMLFxuICByZXNwb25zZVVSTCxcbiAgcmVzcG9uc2VMb2NhdGlvblVSTCxcbiAgaXNCbG9iTGlrZSxcbiAgaXNVUkxQb3RlbnRpYWxseVRydXN0d29ydGh5LFxuICBpc1ZhbGlkUmVhc29uUGhyYXNlLFxuICBzYW1lT3JpZ2luLFxuICBub3JtYWxpemVNZXRob2QsXG4gIHNlcmlhbGl6ZUphdmFzY3JpcHRWYWx1ZVRvSlNPTlN0cmluZyxcbiAgaXRlcmF0b3JNaXhpbixcbiAgY3JlYXRlSXRlcmF0b3IsXG4gIGlzVmFsaWRIZWFkZXJOYW1lLFxuICBpc1ZhbGlkSGVhZGVyVmFsdWUsXG4gIGlzRXJyb3JMaWtlLFxuICBmdWxseVJlYWRCb2R5LFxuICBieXRlc01hdGNoLFxuICBpc1JlYWRhYmxlU3RyZWFtTGlrZSxcbiAgcmVhZGFibGVTdHJlYW1DbG9zZSxcbiAgaXNvbW9ycGhpY0VuY29kZSxcbiAgdXJsSXNMb2NhbCxcbiAgdXJsSGFzSHR0cHNTY2hlbWUsXG4gIHVybElzSHR0cEh0dHBzU2NoZW1lLFxuICByZWFkQWxsQnl0ZXMsXG4gIHNpbXBsZVJhbmdlSGVhZGVyVmFsdWUsXG4gIGJ1aWxkQ29udGVudFJhbmdlLFxuICBwYXJzZU1ldGFkYXRhLFxuICBjcmVhdGVJbmZsYXRlLFxuICBleHRyYWN0TWltZVR5cGUsXG4gIGdldERlY29kZVNwbGl0LFxuICB1dGY4RGVjb2RlQnl0ZXMsXG4gIGVudmlyb25tZW50U2V0dGluZ3NPYmplY3Rcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAga1VybDogU3ltYm9sKCd1cmwnKSxcbiAga0hlYWRlcnM6IFN5bWJvbCgnaGVhZGVycycpLFxuICBrU2lnbmFsOiBTeW1ib2woJ3NpZ25hbCcpLFxuICBrU3RhdGU6IFN5bWJvbCgnc3RhdGUnKSxcbiAga0Rpc3BhdGNoZXI6IFN5bWJvbCgnZGlzcGF0Y2hlcicpXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBCbG9iLCBGaWxlIH0gPSByZXF1aXJlKCdub2RlOmJ1ZmZlcicpXG5jb25zdCB7IGtTdGF0ZSB9ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgd2ViaWRsIH0gPSByZXF1aXJlKCcuL3dlYmlkbCcpXG5cbi8vIFRPRE8oQEtoYWZyYURldik6IHJlbW92ZVxuY2xhc3MgRmlsZUxpa2Uge1xuICBjb25zdHJ1Y3RvciAoYmxvYkxpa2UsIGZpbGVOYW1lLCBvcHRpb25zID0ge30pIHtcbiAgICAvLyBUT0RPOiBhcmd1bWVudCBpZGwgdHlwZSBjaGVja1xuXG4gICAgLy8gVGhlIEZpbGUgY29uc3RydWN0b3IgaXMgaW52b2tlZCB3aXRoIHR3byBvciB0aHJlZSBwYXJhbWV0ZXJzLCBkZXBlbmRpbmdcbiAgICAvLyBvbiB3aGV0aGVyIHRoZSBvcHRpb25hbCBkaWN0aW9uYXJ5IHBhcmFtZXRlciBpcyB1c2VkLiBXaGVuIHRoZSBGaWxlKClcbiAgICAvLyBjb25zdHJ1Y3RvciBpcyBpbnZva2VkLCB1c2VyIGFnZW50cyBtdXN0IHJ1biB0aGUgZm9sbG93aW5nIHN0ZXBzOlxuXG4gICAgLy8gMS4gTGV0IGJ5dGVzIGJlIHRoZSByZXN1bHQgb2YgcHJvY2Vzc2luZyBibG9iIHBhcnRzIGdpdmVuIGZpbGVCaXRzIGFuZFxuICAgIC8vIG9wdGlvbnMuXG5cbiAgICAvLyAyLiBMZXQgbiBiZSB0aGUgZmlsZU5hbWUgYXJndW1lbnQgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgIGNvbnN0IG4gPSBmaWxlTmFtZVxuXG4gICAgLy8gMy4gUHJvY2VzcyBGaWxlUHJvcGVydHlCYWcgZGljdGlvbmFyeSBhcmd1bWVudCBieSBydW5uaW5nIHRoZSBmb2xsb3dpbmdcbiAgICAvLyBzdWJzdGVwczpcblxuICAgIC8vICAgIDEuIElmIHRoZSB0eXBlIG1lbWJlciBpcyBwcm92aWRlZCBhbmQgaXMgbm90IHRoZSBlbXB0eSBzdHJpbmcsIGxldCB0XG4gICAgLy8gICAgYmUgc2V0IHRvIHRoZSB0eXBlIGRpY3Rpb25hcnkgbWVtYmVyLiBJZiB0IGNvbnRhaW5zIGFueSBjaGFyYWN0ZXJzXG4gICAgLy8gICAgb3V0c2lkZSB0aGUgcmFuZ2UgVSswMDIwIHRvIFUrMDA3RSwgdGhlbiBzZXQgdCB0byB0aGUgZW1wdHkgc3RyaW5nXG4gICAgLy8gICAgYW5kIHJldHVybiBmcm9tIHRoZXNlIHN1YnN0ZXBzLlxuICAgIC8vICAgIFRPRE9cbiAgICBjb25zdCB0ID0gb3B0aW9ucy50eXBlXG5cbiAgICAvLyAgICAyLiBDb252ZXJ0IGV2ZXJ5IGNoYXJhY3RlciBpbiB0IHRvIEFTQ0lJIGxvd2VyY2FzZS5cbiAgICAvLyAgICBUT0RPXG5cbiAgICAvLyAgICAzLiBJZiB0aGUgbGFzdE1vZGlmaWVkIG1lbWJlciBpcyBwcm92aWRlZCwgbGV0IGQgYmUgc2V0IHRvIHRoZVxuICAgIC8vICAgIGxhc3RNb2RpZmllZCBkaWN0aW9uYXJ5IG1lbWJlci4gSWYgaXQgaXMgbm90IHByb3ZpZGVkLCBzZXQgZCB0byB0aGVcbiAgICAvLyAgICBjdXJyZW50IGRhdGUgYW5kIHRpbWUgcmVwcmVzZW50ZWQgYXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2VcbiAgICAvLyAgICB0aGUgVW5peCBFcG9jaCAod2hpY2ggaXMgdGhlIGVxdWl2YWxlbnQgb2YgRGF0ZS5ub3coKSBbRUNNQS0yNjJdKS5cbiAgICBjb25zdCBkID0gb3B0aW9ucy5sYXN0TW9kaWZpZWQgPz8gRGF0ZS5ub3coKVxuXG4gICAgLy8gNC4gUmV0dXJuIGEgbmV3IEZpbGUgb2JqZWN0IEYgc3VjaCB0aGF0OlxuICAgIC8vIEYgcmVmZXJzIHRvIHRoZSBieXRlcyBieXRlIHNlcXVlbmNlLlxuICAgIC8vIEYuc2l6ZSBpcyBzZXQgdG8gdGhlIG51bWJlciBvZiB0b3RhbCBieXRlcyBpbiBieXRlcy5cbiAgICAvLyBGLm5hbWUgaXMgc2V0IHRvIG4uXG4gICAgLy8gRi50eXBlIGlzIHNldCB0byB0LlxuICAgIC8vIEYubGFzdE1vZGlmaWVkIGlzIHNldCB0byBkLlxuXG4gICAgdGhpc1trU3RhdGVdID0ge1xuICAgICAgYmxvYkxpa2UsXG4gICAgICBuYW1lOiBuLFxuICAgICAgdHlwZTogdCxcbiAgICAgIGxhc3RNb2RpZmllZDogZFxuICAgIH1cbiAgfVxuXG4gIHN0cmVhbSAoLi4uYXJncykge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVMaWtlKVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5ibG9iTGlrZS5zdHJlYW0oLi4uYXJncylcbiAgfVxuXG4gIGFycmF5QnVmZmVyICguLi5hcmdzKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZUxpa2UpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmJsb2JMaWtlLmFycmF5QnVmZmVyKC4uLmFyZ3MpXG4gIH1cblxuICBzbGljZSAoLi4uYXJncykge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVMaWtlKVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5ibG9iTGlrZS5zbGljZSguLi5hcmdzKVxuICB9XG5cbiAgdGV4dCAoLi4uYXJncykge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVMaWtlKVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5ibG9iTGlrZS50ZXh0KC4uLmFyZ3MpXG4gIH1cblxuICBnZXQgc2l6ZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZUxpa2UpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmJsb2JMaWtlLnNpemVcbiAgfVxuXG4gIGdldCB0eXBlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlTGlrZSlcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uYmxvYkxpa2UudHlwZVxuICB9XG5cbiAgZ2V0IG5hbWUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVMaWtlKVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5uYW1lXG4gIH1cblxuICBnZXQgbGFzdE1vZGlmaWVkICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlTGlrZSlcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ubGFzdE1vZGlmaWVkXG4gIH1cblxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10gKCkge1xuICAgIHJldHVybiAnRmlsZSdcbiAgfVxufVxuXG53ZWJpZGwuY29udmVydGVycy5CbG9iID0gd2ViaWRsLmludGVyZmFjZUNvbnZlcnRlcihCbG9iKVxuXG4vLyBJZiB0aGlzIGZ1bmN0aW9uIGlzIG1vdmVkIHRvIC4vdXRpbC5qcywgc29tZSB0b29scyAoc3VjaCBhc1xuLy8gcm9sbHVwKSB3aWxsIHdhcm4gYWJvdXQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzLiBTZWU6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9pc3N1ZXMvMTYyOVxuZnVuY3Rpb24gaXNGaWxlTGlrZSAob2JqZWN0KSB7XG4gIHJldHVybiAoXG4gICAgKG9iamVjdCBpbnN0YW5jZW9mIEZpbGUpIHx8XG4gICAgKFxuICAgICAgb2JqZWN0ICYmXG4gICAgICAodHlwZW9mIG9iamVjdC5zdHJlYW0gPT09ICdmdW5jdGlvbicgfHxcbiAgICAgIHR5cGVvZiBvYmplY3QuYXJyYXlCdWZmZXIgPT09ICdmdW5jdGlvbicpICYmXG4gICAgICBvYmplY3RbU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gJ0ZpbGUnXG4gICAgKVxuICApXG59XG5cbm1vZHVsZS5leHBvcnRzID0geyBGaWxlTGlrZSwgaXNGaWxlTGlrZSB9XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBpc0Jsb2JMaWtlLCBpdGVyYXRvck1peGluIH0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3QgeyBrU3RhdGUgfSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IGtFbnVtZXJhYmxlUHJvcGVydHkgfSA9IHJlcXVpcmUoJy4uLy4uL2NvcmUvdXRpbCcpXG5jb25zdCB7IEZpbGVMaWtlLCBpc0ZpbGVMaWtlIH0gPSByZXF1aXJlKCcuL2ZpbGUnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4vd2ViaWRsJylcbmNvbnN0IHsgRmlsZTogTmF0aXZlRmlsZSB9ID0gcmVxdWlyZSgnbm9kZTpidWZmZXInKVxuY29uc3Qgbm9kZVV0aWwgPSByZXF1aXJlKCdub2RlOnV0aWwnKVxuXG4vKiogQHR5cGUge2dsb2JhbFRoaXNbJ0ZpbGUnXX0gKi9cbmNvbnN0IEZpbGUgPSBnbG9iYWxUaGlzLkZpbGUgPz8gTmF0aXZlRmlsZVxuXG4vLyBodHRwczovL3hoci5zcGVjLndoYXR3Zy5vcmcvI2Zvcm1kYXRhXG5jbGFzcyBGb3JtRGF0YSB7XG4gIGNvbnN0cnVjdG9yIChmb3JtKSB7XG4gICAgd2ViaWRsLnV0aWwubWFya0FzVW5jbG9uZWFibGUodGhpcylcblxuICAgIGlmIChmb3JtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuY29udmVyc2lvbkZhaWxlZCh7XG4gICAgICAgIHByZWZpeDogJ0Zvcm1EYXRhIGNvbnN0cnVjdG9yJyxcbiAgICAgICAgYXJndW1lbnQ6ICdBcmd1bWVudCAxJyxcbiAgICAgICAgdHlwZXM6IFsndW5kZWZpbmVkJ11cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpc1trU3RhdGVdID0gW11cbiAgfVxuXG4gIGFwcGVuZCAobmFtZSwgdmFsdWUsIGZpbGVuYW1lID0gdW5kZWZpbmVkKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRm9ybURhdGEpXG5cbiAgICBjb25zdCBwcmVmaXggPSAnRm9ybURhdGEuYXBwZW5kJ1xuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMiwgcHJlZml4KVxuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgIWlzQmxvYkxpa2UodmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBcIkZhaWxlZCB0byBleGVjdXRlICdhcHBlbmQnIG9uICdGb3JtRGF0YSc6IHBhcmFtZXRlciAyIGlzIG5vdCBvZiB0eXBlICdCbG9iJ1wiXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gMS4gTGV0IHZhbHVlIGJlIHZhbHVlIGlmIGdpdmVuOyBvdGhlcndpc2UgYmxvYlZhbHVlLlxuXG4gICAgbmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhuYW1lLCBwcmVmaXgsICduYW1lJylcbiAgICB2YWx1ZSA9IGlzQmxvYkxpa2UodmFsdWUpXG4gICAgICA/IHdlYmlkbC5jb252ZXJ0ZXJzLkJsb2IodmFsdWUsIHByZWZpeCwgJ3ZhbHVlJywgeyBzdHJpY3Q6IGZhbHNlIH0pXG4gICAgICA6IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyh2YWx1ZSwgcHJlZml4LCAndmFsdWUnKVxuICAgIGZpbGVuYW1lID0gYXJndW1lbnRzLmxlbmd0aCA9PT0gM1xuICAgICAgPyB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcoZmlsZW5hbWUsIHByZWZpeCwgJ2ZpbGVuYW1lJylcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAvLyAyLiBMZXQgZW50cnkgYmUgdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhbiBlbnRyeSB3aXRoXG4gICAgLy8gbmFtZSwgdmFsdWUsIGFuZCBmaWxlbmFtZSBpZiBnaXZlbi5cbiAgICBjb25zdCBlbnRyeSA9IG1ha2VFbnRyeShuYW1lLCB2YWx1ZSwgZmlsZW5hbWUpXG5cbiAgICAvLyAzLiBBcHBlbmQgZW50cnkgdG8gdGhpc+KAmXMgZW50cnkgbGlzdC5cbiAgICB0aGlzW2tTdGF0ZV0ucHVzaChlbnRyeSlcbiAgfVxuXG4gIGRlbGV0ZSAobmFtZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZvcm1EYXRhKVxuXG4gICAgY29uc3QgcHJlZml4ID0gJ0Zvcm1EYXRhLmRlbGV0ZSdcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHByZWZpeClcblxuICAgIG5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcobmFtZSwgcHJlZml4LCAnbmFtZScpXG5cbiAgICAvLyBUaGUgZGVsZXRlKG5hbWUpIG1ldGhvZCBzdGVwcyBhcmUgdG8gcmVtb3ZlIGFsbCBlbnRyaWVzIHdob3NlIG5hbWVcbiAgICAvLyBpcyBuYW1lIGZyb20gdGhpc+KAmXMgZW50cnkgbGlzdC5cbiAgICB0aGlzW2tTdGF0ZV0gPSB0aGlzW2tTdGF0ZV0uZmlsdGVyKGVudHJ5ID0+IGVudHJ5Lm5hbWUgIT09IG5hbWUpXG4gIH1cblxuICBnZXQgKG5hbWUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGb3JtRGF0YSlcblxuICAgIGNvbnN0IHByZWZpeCA9ICdGb3JtRGF0YS5nZXQnXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCBwcmVmaXgpXG5cbiAgICBuYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKG5hbWUsIHByZWZpeCwgJ25hbWUnKVxuXG4gICAgLy8gMS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgd2hvc2UgbmFtZSBpcyBuYW1lIGluIHRoaXPigJlzIGVudHJ5IGxpc3QsXG4gICAgLy8gdGhlbiByZXR1cm4gbnVsbC5cbiAgICBjb25zdCBpZHggPSB0aGlzW2tTdGF0ZV0uZmluZEluZGV4KChlbnRyeSkgPT4gZW50cnkubmFtZSA9PT0gbmFtZSlcbiAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICAvLyAyLiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBlbnRyeSB3aG9zZSBuYW1lIGlzIG5hbWUgZnJvbVxuICAgIC8vIHRoaXPigJlzIGVudHJ5IGxpc3QuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXVtpZHhdLnZhbHVlXG4gIH1cblxuICBnZXRBbGwgKG5hbWUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGb3JtRGF0YSlcblxuICAgIGNvbnN0IHByZWZpeCA9ICdGb3JtRGF0YS5nZXRBbGwnXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCBwcmVmaXgpXG5cbiAgICBuYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKG5hbWUsIHByZWZpeCwgJ25hbWUnKVxuXG4gICAgLy8gMS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgd2hvc2UgbmFtZSBpcyBuYW1lIGluIHRoaXPigJlzIGVudHJ5IGxpc3QsXG4gICAgLy8gdGhlbiByZXR1cm4gdGhlIGVtcHR5IGxpc3QuXG4gICAgLy8gMi4gUmV0dXJuIHRoZSB2YWx1ZXMgb2YgYWxsIGVudHJpZXMgd2hvc2UgbmFtZSBpcyBuYW1lLCBpbiBvcmRlcixcbiAgICAvLyBmcm9tIHRoaXPigJlzIGVudHJ5IGxpc3QuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXVxuICAgICAgLmZpbHRlcigoZW50cnkpID0+IGVudHJ5Lm5hbWUgPT09IG5hbWUpXG4gICAgICAubWFwKChlbnRyeSkgPT4gZW50cnkudmFsdWUpXG4gIH1cblxuICBoYXMgKG5hbWUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGb3JtRGF0YSlcblxuICAgIGNvbnN0IHByZWZpeCA9ICdGb3JtRGF0YS5oYXMnXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCBwcmVmaXgpXG5cbiAgICBuYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKG5hbWUsIHByZWZpeCwgJ25hbWUnKVxuXG4gICAgLy8gVGhlIGhhcyhuYW1lKSBtZXRob2Qgc3RlcHMgYXJlIHRvIHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGFuIGVudHJ5XG4gICAgLy8gd2hvc2UgbmFtZSBpcyBuYW1lIGluIHRoaXPigJlzIGVudHJ5IGxpc3Q7IG90aGVyd2lzZSBmYWxzZS5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmZpbmRJbmRleCgoZW50cnkpID0+IGVudHJ5Lm5hbWUgPT09IG5hbWUpICE9PSAtMVxuICB9XG5cbiAgc2V0IChuYW1lLCB2YWx1ZSwgZmlsZW5hbWUgPSB1bmRlZmluZWQpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGb3JtRGF0YSlcblxuICAgIGNvbnN0IHByZWZpeCA9ICdGb3JtRGF0YS5zZXQnXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAyLCBwcmVmaXgpXG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiAhaXNCbG9iTGlrZSh2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIFwiRmFpbGVkIHRvIGV4ZWN1dGUgJ3NldCcgb24gJ0Zvcm1EYXRhJzogcGFyYW1ldGVyIDIgaXMgbm90IG9mIHR5cGUgJ0Jsb2InXCJcbiAgICAgIClcbiAgICB9XG5cbiAgICAvLyBUaGUgc2V0KG5hbWUsIHZhbHVlKSBhbmQgc2V0KG5hbWUsIGJsb2JWYWx1ZSwgZmlsZW5hbWUpIG1ldGhvZCBzdGVwc1xuICAgIC8vIGFyZTpcblxuICAgIC8vIDEuIExldCB2YWx1ZSBiZSB2YWx1ZSBpZiBnaXZlbjsgb3RoZXJ3aXNlIGJsb2JWYWx1ZS5cblxuICAgIG5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcobmFtZSwgcHJlZml4LCAnbmFtZScpXG4gICAgdmFsdWUgPSBpc0Jsb2JMaWtlKHZhbHVlKVxuICAgICAgPyB3ZWJpZGwuY29udmVydGVycy5CbG9iKHZhbHVlLCBwcmVmaXgsICduYW1lJywgeyBzdHJpY3Q6IGZhbHNlIH0pXG4gICAgICA6IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyh2YWx1ZSwgcHJlZml4LCAnbmFtZScpXG4gICAgZmlsZW5hbWUgPSBhcmd1bWVudHMubGVuZ3RoID09PSAzXG4gICAgICA/IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhmaWxlbmFtZSwgcHJlZml4LCAnbmFtZScpXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gICAgLy8gMi4gTGV0IGVudHJ5IGJlIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYW4gZW50cnkgd2l0aCBuYW1lLCB2YWx1ZSwgYW5kXG4gICAgLy8gZmlsZW5hbWUgaWYgZ2l2ZW4uXG4gICAgY29uc3QgZW50cnkgPSBtYWtlRW50cnkobmFtZSwgdmFsdWUsIGZpbGVuYW1lKVxuXG4gICAgLy8gMy4gSWYgdGhlcmUgYXJlIGVudHJpZXMgaW4gdGhpc+KAmXMgZW50cnkgbGlzdCB3aG9zZSBuYW1lIGlzIG5hbWUsIHRoZW5cbiAgICAvLyByZXBsYWNlIHRoZSBmaXJzdCBzdWNoIGVudHJ5IHdpdGggZW50cnkgYW5kIHJlbW92ZSB0aGUgb3RoZXJzLlxuICAgIGNvbnN0IGlkeCA9IHRoaXNba1N0YXRlXS5maW5kSW5kZXgoKGVudHJ5KSA9PiBlbnRyeS5uYW1lID09PSBuYW1lKVxuICAgIGlmIChpZHggIT09IC0xKSB7XG4gICAgICB0aGlzW2tTdGF0ZV0gPSBbXG4gICAgICAgIC4uLnRoaXNba1N0YXRlXS5zbGljZSgwLCBpZHgpLFxuICAgICAgICBlbnRyeSxcbiAgICAgICAgLi4udGhpc1trU3RhdGVdLnNsaWNlKGlkeCArIDEpLmZpbHRlcigoZW50cnkpID0+IGVudHJ5Lm5hbWUgIT09IG5hbWUpXG4gICAgICBdXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDQuIE90aGVyd2lzZSwgYXBwZW5kIGVudHJ5IHRvIHRoaXPigJlzIGVudHJ5IGxpc3QuXG4gICAgICB0aGlzW2tTdGF0ZV0ucHVzaChlbnRyeSlcbiAgICB9XG4gIH1cblxuICBbbm9kZVV0aWwuaW5zcGVjdC5jdXN0b21dIChkZXB0aCwgb3B0aW9ucykge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpc1trU3RhdGVdLnJlZHVjZSgoYSwgYikgPT4ge1xuICAgICAgaWYgKGFbYi5uYW1lXSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhW2IubmFtZV0pKSB7XG4gICAgICAgICAgYVtiLm5hbWVdLnB1c2goYi52YWx1ZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhW2IubmFtZV0gPSBbYVtiLm5hbWVdLCBiLnZhbHVlXVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhW2IubmFtZV0gPSBiLnZhbHVlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhXG4gICAgfSwgeyBfX3Byb3RvX186IG51bGwgfSlcblxuICAgIG9wdGlvbnMuZGVwdGggPz89IGRlcHRoXG4gICAgb3B0aW9ucy5jb2xvcnMgPz89IHRydWVcblxuICAgIGNvbnN0IG91dHB1dCA9IG5vZGVVdGlsLmZvcm1hdFdpdGhPcHRpb25zKG9wdGlvbnMsIHN0YXRlKVxuXG4gICAgLy8gcmVtb3ZlIFtPYmplY3QgbnVsbCBwcm90b3R5cGVdXG4gICAgcmV0dXJuIGBGb3JtRGF0YSAke291dHB1dC5zbGljZShvdXRwdXQuaW5kZXhPZignXScpICsgMil9YFxuICB9XG59XG5cbml0ZXJhdG9yTWl4aW4oJ0Zvcm1EYXRhJywgRm9ybURhdGEsIGtTdGF0ZSwgJ25hbWUnLCAndmFsdWUnKVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhGb3JtRGF0YS5wcm90b3R5cGUsIHtcbiAgYXBwZW5kOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBkZWxldGU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGdldDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgZ2V0QWxsOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBoYXM6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHNldDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHtcbiAgICB2YWx1ZTogJ0Zvcm1EYXRhJyxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfVxufSlcblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm0tY29udHJvbC1pbmZyYXN0cnVjdHVyZS5odG1sI2NyZWF0ZS1hbi1lbnRyeVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfEJsb2J9IHZhbHVlXG4gKiBAcGFyYW0gez9zdHJpbmd9IGZpbGVuYW1lXG4gKiBAcmV0dXJuc1xuICovXG5mdW5jdGlvbiBtYWtlRW50cnkgKG5hbWUsIHZhbHVlLCBmaWxlbmFtZSkge1xuICAvLyAxLiBTZXQgbmFtZSB0byB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgbmFtZSBpbnRvIGEgc2NhbGFyIHZhbHVlIHN0cmluZy5cbiAgLy8gTm90ZTogVGhpcyBvcGVyYXRpb24gd2FzIGRvbmUgYnkgdGhlIHdlYmlkbCBjb252ZXJ0ZXIgVVNWU3RyaW5nLlxuXG4gIC8vIDIuIElmIHZhbHVlIGlzIGEgc3RyaW5nLCB0aGVuIHNldCB2YWx1ZSB0byB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmdcbiAgLy8gICAgdmFsdWUgaW50byBhIHNjYWxhciB2YWx1ZSBzdHJpbmcuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gTm90ZTogVGhpcyBvcGVyYXRpb24gd2FzIGRvbmUgYnkgdGhlIHdlYmlkbCBjb252ZXJ0ZXIgVVNWU3RyaW5nLlxuICB9IGVsc2Uge1xuICAgIC8vIDMuIE90aGVyd2lzZTpcblxuICAgIC8vIDEuIElmIHZhbHVlIGlzIG5vdCBhIEZpbGUgb2JqZWN0LCB0aGVuIHNldCB2YWx1ZSB0byBhIG5ldyBGaWxlIG9iamVjdCxcbiAgICAvLyAgICByZXByZXNlbnRpbmcgdGhlIHNhbWUgYnl0ZXMsIHdob3NlIG5hbWUgYXR0cmlidXRlIHZhbHVlIGlzIFwiYmxvYlwiXG4gICAgaWYgKCFpc0ZpbGVMaWtlKHZhbHVlKSkge1xuICAgICAgdmFsdWUgPSB2YWx1ZSBpbnN0YW5jZW9mIEJsb2JcbiAgICAgICAgPyBuZXcgRmlsZShbdmFsdWVdLCAnYmxvYicsIHsgdHlwZTogdmFsdWUudHlwZSB9KVxuICAgICAgICA6IG5ldyBGaWxlTGlrZSh2YWx1ZSwgJ2Jsb2InLCB7IHR5cGU6IHZhbHVlLnR5cGUgfSlcbiAgICB9XG5cbiAgICAvLyAyLiBJZiBmaWxlbmFtZSBpcyBnaXZlbiwgdGhlbiBzZXQgdmFsdWUgdG8gYSBuZXcgRmlsZSBvYmplY3QsXG4gICAgLy8gICAgcmVwcmVzZW50aW5nIHRoZSBzYW1lIGJ5dGVzLCB3aG9zZSBuYW1lIGF0dHJpYnV0ZSBpcyBmaWxlbmFtZS5cbiAgICBpZiAoZmlsZW5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLyoqIEB0eXBlIHtGaWxlUHJvcGVydHlCYWd9ICovXG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICB0eXBlOiB2YWx1ZS50eXBlLFxuICAgICAgICBsYXN0TW9kaWZpZWQ6IHZhbHVlLmxhc3RNb2RpZmllZFxuICAgICAgfVxuXG4gICAgICB2YWx1ZSA9IHZhbHVlIGluc3RhbmNlb2YgTmF0aXZlRmlsZVxuICAgICAgICA/IG5ldyBGaWxlKFt2YWx1ZV0sIGZpbGVuYW1lLCBvcHRpb25zKVxuICAgICAgICA6IG5ldyBGaWxlTGlrZSh2YWx1ZSwgZmlsZW5hbWUsIG9wdGlvbnMpXG4gICAgfVxuICB9XG5cbiAgLy8gNC4gUmV0dXJuIGFuIGVudHJ5IHdob3NlIG5hbWUgaXMgbmFtZSBhbmQgd2hvc2UgdmFsdWUgaXMgdmFsdWUuXG4gIHJldHVybiB7IG5hbWUsIHZhbHVlIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7IEZvcm1EYXRhLCBtYWtlRW50cnkgfVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgaXNVU1ZTdHJpbmcsIGJ1ZmZlclRvTG93ZXJDYXNlZEhlYWRlck5hbWUgfSA9IHJlcXVpcmUoJy4uLy4uL2NvcmUvdXRpbCcpXG5jb25zdCB7IHV0ZjhEZWNvZGVCeXRlcyB9ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHsgSFRUUF9UT0tFTl9DT0RFUE9JTlRTLCBpc29tb3JwaGljRGVjb2RlIH0gPSByZXF1aXJlKCcuL2RhdGEtdXJsJylcbmNvbnN0IHsgaXNGaWxlTGlrZSB9ID0gcmVxdWlyZSgnLi9maWxlJylcbmNvbnN0IHsgbWFrZUVudHJ5IH0gPSByZXF1aXJlKCcuL2Zvcm1kYXRhJylcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ25vZGU6YXNzZXJ0JylcbmNvbnN0IHsgRmlsZTogTm9kZUZpbGUgfSA9IHJlcXVpcmUoJ25vZGU6YnVmZmVyJylcblxuY29uc3QgRmlsZSA9IGdsb2JhbFRoaXMuRmlsZSA/PyBOb2RlRmlsZVxuXG5jb25zdCBmb3JtRGF0YU5hbWVCdWZmZXIgPSBCdWZmZXIuZnJvbSgnZm9ybS1kYXRhOyBuYW1lPVwiJylcbmNvbnN0IGZpbGVuYW1lQnVmZmVyID0gQnVmZmVyLmZyb20oJzsgZmlsZW5hbWUnKVxuY29uc3QgZGQgPSBCdWZmZXIuZnJvbSgnLS0nKVxuY29uc3QgZGRjcmxmID0gQnVmZmVyLmZyb20oJy0tXFxyXFxuJylcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hhcnNcbiAqL1xuZnVuY3Rpb24gaXNBc2NpaVN0cmluZyAoY2hhcnMpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7ICsraSkge1xuICAgIGlmICgoY2hhcnMuY2hhckNvZGVBdChpKSAmIH4weDdGKSAhPT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2FuZHJldWJvdGVsbGEuZ2l0aHViLmlvL211bHRpcGFydC1mb3JtLWRhdGEvI211bHRpcGFydC1mb3JtLWRhdGEtYm91bmRhcnlcbiAqIEBwYXJhbSB7c3RyaW5nfSBib3VuZGFyeVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUJvdW5kYXJ5IChib3VuZGFyeSkge1xuICBjb25zdCBsZW5ndGggPSBib3VuZGFyeS5sZW5ndGhcblxuICAvLyAtIGl0cyBsZW5ndGggaXMgZ3JlYXRlciBvciBlcXVhbCB0byAyNyBhbmQgbGVzc2VyIG9yIGVxdWFsIHRvIDcwLCBhbmRcbiAgaWYgKGxlbmd0aCA8IDI3IHx8IGxlbmd0aCA+IDcwKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyAtIGl0IGlzIGNvbXBvc2VkIGJ5IGJ5dGVzIGluIHRoZSByYW5nZXMgMHgzMCB0byAweDM5LCAweDQxIHRvIDB4NUEsIG9yXG4gIC8vICAgMHg2MSB0byAweDdBLCBpbmNsdXNpdmUgKEFTQ0lJIGFscGhhbnVtZXJpYyksIG9yIHdoaWNoIGFyZSAweDI3ICgnKSxcbiAgLy8gICAweDJEICgtKSBvciAweDVGIChfKS5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IGNwID0gYm91bmRhcnkuY2hhckNvZGVBdChpKVxuXG4gICAgaWYgKCEoXG4gICAgICAoY3AgPj0gMHgzMCAmJiBjcCA8PSAweDM5KSB8fFxuICAgICAgKGNwID49IDB4NDEgJiYgY3AgPD0gMHg1YSkgfHxcbiAgICAgIChjcCA+PSAweDYxICYmIGNwIDw9IDB4N2EpIHx8XG4gICAgICBjcCA9PT0gMHgyNyB8fFxuICAgICAgY3AgPT09IDB4MmQgfHxcbiAgICAgIGNwID09PSAweDVmXG4gICAgKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vYW5kcmV1Ym90ZWxsYS5naXRodWIuaW8vbXVsdGlwYXJ0LWZvcm0tZGF0YS8jbXVsdGlwYXJ0LWZvcm0tZGF0YS1wYXJzZXJcbiAqIEBwYXJhbSB7QnVmZmVyfSBpbnB1dFxuICogQHBhcmFtIHtSZXR1cm5UeXBlPGltcG9ydCgnLi9kYXRhLXVybCcpWydwYXJzZU1JTUVUeXBlJ10+fSBtaW1lVHlwZVxuICovXG5mdW5jdGlvbiBtdWx0aXBhcnRGb3JtRGF0YVBhcnNlciAoaW5wdXQsIG1pbWVUeXBlKSB7XG4gIC8vIDEuIEFzc2VydDogbWltZVR5cGXigJlzIGVzc2VuY2UgaXMgXCJtdWx0aXBhcnQvZm9ybS1kYXRhXCIuXG4gIGFzc2VydChtaW1lVHlwZSAhPT0gJ2ZhaWx1cmUnICYmIG1pbWVUeXBlLmVzc2VuY2UgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJylcblxuICBjb25zdCBib3VuZGFyeVN0cmluZyA9IG1pbWVUeXBlLnBhcmFtZXRlcnMuZ2V0KCdib3VuZGFyeScpXG5cbiAgLy8gMi4gSWYgbWltZVR5cGXigJlzIHBhcmFtZXRlcnNbXCJib3VuZGFyeVwiXSBkb2VzIG5vdCBleGlzdCwgcmV0dXJuIGZhaWx1cmUuXG4gIC8vICAgIE90aGVyd2lzZSwgbGV0IGJvdW5kYXJ5IGJlIHRoZSByZXN1bHQgb2YgVVRGLTggZGVjb2RpbmcgbWltZVR5cGXigJlzXG4gIC8vICAgIHBhcmFtZXRlcnNbXCJib3VuZGFyeVwiXS5cbiAgaWYgKGJvdW5kYXJ5U3RyaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gIH1cblxuICBjb25zdCBib3VuZGFyeSA9IEJ1ZmZlci5mcm9tKGAtLSR7Ym91bmRhcnlTdHJpbmd9YCwgJ3V0ZjgnKVxuXG4gIC8vIDMuIExldCBlbnRyeSBsaXN0IGJlIGFuIGVtcHR5IGVudHJ5IGxpc3QuXG4gIGNvbnN0IGVudHJ5TGlzdCA9IFtdXG5cbiAgLy8gNC4gTGV0IHBvc2l0aW9uIGJlIGEgcG9pbnRlciB0byBhIGJ5dGUgaW4gaW5wdXQsIGluaXRpYWxseSBwb2ludGluZyBhdFxuICAvLyAgICB0aGUgZmlyc3QgYnl0ZS5cbiAgY29uc3QgcG9zaXRpb24gPSB7IHBvc2l0aW9uOiAwIH1cblxuICAvLyBOb3RlOiB1bmRpY2kgYWRkaXRpb24sIGFsbG93cyBsZWFkaW5nIGFuZCB0cmFpbGluZyBDUkxGcy5cbiAgd2hpbGUgKGlucHV0W3Bvc2l0aW9uLnBvc2l0aW9uXSA9PT0gMHgwZCAmJiBpbnB1dFtwb3NpdGlvbi5wb3NpdGlvbiArIDFdID09PSAweDBhKSB7XG4gICAgcG9zaXRpb24ucG9zaXRpb24gKz0gMlxuICB9XG5cbiAgbGV0IHRyYWlsaW5nID0gaW5wdXQubGVuZ3RoXG5cbiAgd2hpbGUgKGlucHV0W3RyYWlsaW5nIC0gMV0gPT09IDB4MGEgJiYgaW5wdXRbdHJhaWxpbmcgLSAyXSA9PT0gMHgwZCkge1xuICAgIHRyYWlsaW5nIC09IDJcbiAgfVxuXG4gIGlmICh0cmFpbGluZyAhPT0gaW5wdXQubGVuZ3RoKSB7XG4gICAgaW5wdXQgPSBpbnB1dC5zdWJhcnJheSgwLCB0cmFpbGluZylcbiAgfVxuXG4gIC8vIDUuIFdoaWxlIHRydWU6XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgLy8gNS4xLiBJZiBwb3NpdGlvbiBwb2ludHMgdG8gYSBzZXF1ZW5jZSBvZiBieXRlcyBzdGFydGluZyB3aXRoIDB4MkQgMHgyRFxuICAgIC8vICAgICAgKGAtLWApIGZvbGxvd2VkIGJ5IGJvdW5kYXJ5LCBhZHZhbmNlIHBvc2l0aW9uIGJ5IDIgKyB0aGUgbGVuZ3RoIG9mXG4gICAgLy8gICAgICBib3VuZGFyeS4gT3RoZXJ3aXNlLCByZXR1cm4gZmFpbHVyZS5cbiAgICAvLyBOb3RlOiBib3VuZGFyeSBpcyBwYWRkZWQgd2l0aCAyIGRhc2hlcyBhbHJlYWR5LCBubyBuZWVkIHRvIGFkZCAyLlxuICAgIGlmIChpbnB1dC5zdWJhcnJheShwb3NpdGlvbi5wb3NpdGlvbiwgcG9zaXRpb24ucG9zaXRpb24gKyBib3VuZGFyeS5sZW5ndGgpLmVxdWFscyhib3VuZGFyeSkpIHtcbiAgICAgIHBvc2l0aW9uLnBvc2l0aW9uICs9IGJvdW5kYXJ5Lmxlbmd0aFxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gICAgfVxuXG4gICAgLy8gNS4yLiBJZiBwb3NpdGlvbiBwb2ludHMgdG8gdGhlIHNlcXVlbmNlIG9mIGJ5dGVzIDB4MkQgMHgyRCAweDBEIDB4MEFcbiAgICAvLyAgICAgIChgLS1gIGZvbGxvd2VkIGJ5IENSIExGKSBmb2xsb3dlZCBieSB0aGUgZW5kIG9mIGlucHV0LCByZXR1cm4gZW50cnkgbGlzdC5cbiAgICAvLyBOb3RlOiBhIGJvZHkgZG9lcyBOT1QgbmVlZCB0byBlbmQgd2l0aCBDUkxGLiBJdCBjYW4gZW5kIHdpdGggLS0uXG4gICAgaWYgKFxuICAgICAgKHBvc2l0aW9uLnBvc2l0aW9uID09PSBpbnB1dC5sZW5ndGggLSAyICYmIGJ1ZmZlclN0YXJ0c1dpdGgoaW5wdXQsIGRkLCBwb3NpdGlvbikpIHx8XG4gICAgICAocG9zaXRpb24ucG9zaXRpb24gPT09IGlucHV0Lmxlbmd0aCAtIDQgJiYgYnVmZmVyU3RhcnRzV2l0aChpbnB1dCwgZGRjcmxmLCBwb3NpdGlvbikpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZW50cnlMaXN0XG4gICAgfVxuXG4gICAgLy8gNS4zLiBJZiBwb3NpdGlvbiBkb2VzIG5vdCBwb2ludCB0byBhIHNlcXVlbmNlIG9mIGJ5dGVzIHN0YXJ0aW5nIHdpdGggMHgwRFxuICAgIC8vICAgICAgMHgwQSAoQ1IgTEYpLCByZXR1cm4gZmFpbHVyZS5cbiAgICBpZiAoaW5wdXRbcG9zaXRpb24ucG9zaXRpb25dICE9PSAweDBkIHx8IGlucHV0W3Bvc2l0aW9uLnBvc2l0aW9uICsgMV0gIT09IDB4MGEpIHtcbiAgICAgIHJldHVybiAnZmFpbHVyZSdcbiAgICB9XG5cbiAgICAvLyA1LjQuIEFkdmFuY2UgcG9zaXRpb24gYnkgMi4gKFRoaXMgc2tpcHMgcGFzdCB0aGUgbmV3bGluZS4pXG4gICAgcG9zaXRpb24ucG9zaXRpb24gKz0gMlxuXG4gICAgLy8gNS41LiBMZXQgbmFtZSwgZmlsZW5hbWUgYW5kIGNvbnRlbnRUeXBlIGJlIHRoZSByZXN1bHQgb2YgcGFyc2luZ1xuICAgIC8vICAgICAgbXVsdGlwYXJ0L2Zvcm0tZGF0YSBoZWFkZXJzIG9uIGlucHV0IGFuZCBwb3NpdGlvbiwgaWYgdGhlIHJlc3VsdFxuICAgIC8vICAgICAgaXMgbm90IGZhaWx1cmUuIE90aGVyd2lzZSwgcmV0dXJuIGZhaWx1cmUuXG4gICAgY29uc3QgcmVzdWx0ID0gcGFyc2VNdWx0aXBhcnRGb3JtRGF0YUhlYWRlcnMoaW5wdXQsIHBvc2l0aW9uKVxuXG4gICAgaWYgKHJlc3VsdCA9PT0gJ2ZhaWx1cmUnKSB7XG4gICAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gICAgfVxuXG4gICAgbGV0IHsgbmFtZSwgZmlsZW5hbWUsIGNvbnRlbnRUeXBlLCBlbmNvZGluZyB9ID0gcmVzdWx0XG5cbiAgICAvLyA1LjYuIEFkdmFuY2UgcG9zaXRpb24gYnkgMi4gKFRoaXMgc2tpcHMgcGFzdCB0aGUgZW1wdHkgbGluZSB0aGF0IG1hcmtzXG4gICAgLy8gICAgICB0aGUgZW5kIG9mIHRoZSBoZWFkZXJzLilcbiAgICBwb3NpdGlvbi5wb3NpdGlvbiArPSAyXG5cbiAgICAvLyA1LjcuIExldCBib2R5IGJlIHRoZSBlbXB0eSBieXRlIHNlcXVlbmNlLlxuICAgIGxldCBib2R5XG5cbiAgICAvLyA1LjguIEJvZHkgbG9vcDogV2hpbGUgcG9zaXRpb24gaXMgbm90IHBhc3QgdGhlIGVuZCBvZiBpbnB1dDpcbiAgICAvLyBUT0RPOiB0aGUgc3RlcHMgaGVyZSBhcmUgY29tcGxldGVseSB3cm9uZ1xuICAgIHtcbiAgICAgIGNvbnN0IGJvdW5kYXJ5SW5kZXggPSBpbnB1dC5pbmRleE9mKGJvdW5kYXJ5LnN1YmFycmF5KDIpLCBwb3NpdGlvbi5wb3NpdGlvbilcblxuICAgICAgaWYgKGJvdW5kYXJ5SW5kZXggPT09IC0xKSB7XG4gICAgICAgIHJldHVybiAnZmFpbHVyZSdcbiAgICAgIH1cblxuICAgICAgYm9keSA9IGlucHV0LnN1YmFycmF5KHBvc2l0aW9uLnBvc2l0aW9uLCBib3VuZGFyeUluZGV4IC0gNClcblxuICAgICAgcG9zaXRpb24ucG9zaXRpb24gKz0gYm9keS5sZW5ndGhcblxuICAgICAgLy8gTm90ZTogcG9zaXRpb24gbXVzdCBiZSBhZHZhbmNlZCBieSB0aGUgYm9keSdzIGxlbmd0aCBiZWZvcmUgYmVpbmdcbiAgICAgIC8vIGRlY29kZWQsIG90aGVyd2lzZSB0aGUgcGFyc2luZyB3aWxsIGZhaWwuXG4gICAgICBpZiAoZW5jb2RpbmcgPT09ICdiYXNlNjQnKSB7XG4gICAgICAgIGJvZHkgPSBCdWZmZXIuZnJvbShib2R5LnRvU3RyaW5nKCksICdiYXNlNjQnKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDUuOS4gSWYgcG9zaXRpb24gZG9lcyBub3QgcG9pbnQgdG8gYSBzZXF1ZW5jZSBvZiBieXRlcyBzdGFydGluZyB3aXRoXG4gICAgLy8gICAgICAweDBEIDB4MEEgKENSIExGKSwgcmV0dXJuIGZhaWx1cmUuIE90aGVyd2lzZSwgYWR2YW5jZSBwb3NpdGlvbiBieSAyLlxuICAgIGlmIChpbnB1dFtwb3NpdGlvbi5wb3NpdGlvbl0gIT09IDB4MGQgfHwgaW5wdXRbcG9zaXRpb24ucG9zaXRpb24gKyAxXSAhPT0gMHgwYSkge1xuICAgICAgcmV0dXJuICdmYWlsdXJlJ1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3NpdGlvbi5wb3NpdGlvbiArPSAyXG4gICAgfVxuXG4gICAgLy8gNS4xMC4gSWYgZmlsZW5hbWUgaXMgbm90IG51bGw6XG4gICAgbGV0IHZhbHVlXG5cbiAgICBpZiAoZmlsZW5hbWUgIT09IG51bGwpIHtcbiAgICAgIC8vIDUuMTAuMS4gSWYgY29udGVudFR5cGUgaXMgbnVsbCwgc2V0IGNvbnRlbnRUeXBlIHRvIFwidGV4dC9wbGFpblwiLlxuICAgICAgY29udGVudFR5cGUgPz89ICd0ZXh0L3BsYWluJ1xuXG4gICAgICAvLyA1LjEwLjIuIElmIGNvbnRlbnRUeXBlIGlzIG5vdCBhbiBBU0NJSSBzdHJpbmcsIHNldCBjb250ZW50VHlwZSB0byB0aGUgZW1wdHkgc3RyaW5nLlxuXG4gICAgICAvLyBOb3RlOiBgYnVmZmVyLmlzQXNjaWlgIGNhbiBiZSB1c2VkIGF0IHplcm8tY29zdCwgYnV0IGNvbnZlcnRpbmcgYSBzdHJpbmcgdG8gYSBidWZmZXIgaXMgYSBoaWdoIG92ZXJoZWFkLlxuICAgICAgLy8gQ29udGVudC1UeXBlIGlzIGEgcmVsYXRpdmVseSBzbWFsbCBzdHJpbmcsIHNvIGl0IGlzIGZhc3RlciB0byB1c2UgYFN0cmluZyNjaGFyQ29kZUF0YC5cbiAgICAgIGlmICghaXNBc2NpaVN0cmluZyhjb250ZW50VHlwZSkpIHtcbiAgICAgICAgY29udGVudFR5cGUgPSAnJ1xuICAgICAgfVxuXG4gICAgICAvLyA1LjEwLjMuIExldCB2YWx1ZSBiZSBhIG5ldyBGaWxlIG9iamVjdCB3aXRoIG5hbWUgZmlsZW5hbWUsIHR5cGUgY29udGVudFR5cGUsIGFuZCBib2R5IGJvZHkuXG4gICAgICB2YWx1ZSA9IG5ldyBGaWxlKFtib2R5XSwgZmlsZW5hbWUsIHsgdHlwZTogY29udGVudFR5cGUgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gNS4xMS4gT3RoZXJ3aXNlOlxuXG4gICAgICAvLyA1LjExLjEuIExldCB2YWx1ZSBiZSB0aGUgVVRGLTggZGVjb2Rpbmcgd2l0aG91dCBCT00gb2YgYm9keS5cbiAgICAgIHZhbHVlID0gdXRmOERlY29kZUJ5dGVzKEJ1ZmZlci5mcm9tKGJvZHkpKVxuICAgIH1cblxuICAgIC8vIDUuMTIuIEFzc2VydDogbmFtZSBpcyBhIHNjYWxhciB2YWx1ZSBzdHJpbmcgYW5kIHZhbHVlIGlzIGVpdGhlciBhIHNjYWxhciB2YWx1ZSBzdHJpbmcgb3IgYSBGaWxlIG9iamVjdC5cbiAgICBhc3NlcnQoaXNVU1ZTdHJpbmcobmFtZSkpXG4gICAgYXNzZXJ0KCh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIGlzVVNWU3RyaW5nKHZhbHVlKSkgfHwgaXNGaWxlTGlrZSh2YWx1ZSkpXG5cbiAgICAvLyA1LjEzLiBDcmVhdGUgYW4gZW50cnkgd2l0aCBuYW1lIGFuZCB2YWx1ZSwgYW5kIGFwcGVuZCBpdCB0byBlbnRyeSBsaXN0LlxuICAgIGVudHJ5TGlzdC5wdXNoKG1ha2VFbnRyeShuYW1lLCB2YWx1ZSwgZmlsZW5hbWUpKVxuICB9XG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2FuZHJldWJvdGVsbGEuZ2l0aHViLmlvL211bHRpcGFydC1mb3JtLWRhdGEvI3BhcnNlLW11bHRpcGFydC1mb3JtLWRhdGEtaGVhZGVyc1xuICogQHBhcmFtIHtCdWZmZXJ9IGlucHV0XG4gKiBAcGFyYW0ge3sgcG9zaXRpb246IG51bWJlciB9fSBwb3NpdGlvblxuICovXG5mdW5jdGlvbiBwYXJzZU11bHRpcGFydEZvcm1EYXRhSGVhZGVycyAoaW5wdXQsIHBvc2l0aW9uKSB7XG4gIC8vIDEuIExldCBuYW1lLCBmaWxlbmFtZSBhbmQgY29udGVudFR5cGUgYmUgbnVsbC5cbiAgbGV0IG5hbWUgPSBudWxsXG4gIGxldCBmaWxlbmFtZSA9IG51bGxcbiAgbGV0IGNvbnRlbnRUeXBlID0gbnVsbFxuICBsZXQgZW5jb2RpbmcgPSBudWxsXG5cbiAgLy8gMi4gV2hpbGUgdHJ1ZTpcbiAgd2hpbGUgKHRydWUpIHtcbiAgICAvLyAyLjEuIElmIHBvc2l0aW9uIHBvaW50cyB0byBhIHNlcXVlbmNlIG9mIGJ5dGVzIHN0YXJ0aW5nIHdpdGggMHgwRCAweDBBIChDUiBMRik6XG4gICAgaWYgKGlucHV0W3Bvc2l0aW9uLnBvc2l0aW9uXSA9PT0gMHgwZCAmJiBpbnB1dFtwb3NpdGlvbi5wb3NpdGlvbiArIDFdID09PSAweDBhKSB7XG4gICAgICAvLyAyLjEuMS4gSWYgbmFtZSBpcyBudWxsLCByZXR1cm4gZmFpbHVyZS5cbiAgICAgIGlmIChuYW1lID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnZmFpbHVyZSdcbiAgICAgIH1cblxuICAgICAgLy8gMi4xLjIuIFJldHVybiBuYW1lLCBmaWxlbmFtZSBhbmQgY29udGVudFR5cGUuXG4gICAgICByZXR1cm4geyBuYW1lLCBmaWxlbmFtZSwgY29udGVudFR5cGUsIGVuY29kaW5nIH1cbiAgICB9XG5cbiAgICAvLyAyLjIuIExldCBoZWFkZXIgbmFtZSBiZSB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmcgYSBzZXF1ZW5jZSBvZiBieXRlcyB0aGF0IGFyZVxuICAgIC8vICAgICAgbm90IDB4MEEgKExGKSwgMHgwRCAoQ1IpIG9yIDB4M0EgKDopLCBnaXZlbiBwb3NpdGlvbi5cbiAgICBsZXQgaGVhZGVyTmFtZSA9IGNvbGxlY3RBU2VxdWVuY2VPZkJ5dGVzKFxuICAgICAgKGNoYXIpID0+IGNoYXIgIT09IDB4MGEgJiYgY2hhciAhPT0gMHgwZCAmJiBjaGFyICE9PSAweDNhLFxuICAgICAgaW5wdXQsXG4gICAgICBwb3NpdGlvblxuICAgIClcblxuICAgIC8vIDIuMy4gUmVtb3ZlIGFueSBIVFRQIHRhYiBvciBzcGFjZSBieXRlcyBmcm9tIHRoZSBzdGFydCBvciBlbmQgb2YgaGVhZGVyIG5hbWUuXG4gICAgaGVhZGVyTmFtZSA9IHJlbW92ZUNoYXJzKGhlYWRlck5hbWUsIHRydWUsIHRydWUsIChjaGFyKSA9PiBjaGFyID09PSAweDkgfHwgY2hhciA9PT0gMHgyMClcblxuICAgIC8vIDIuNC4gSWYgaGVhZGVyIG5hbWUgZG9lcyBub3QgbWF0Y2ggdGhlIGZpZWxkLW5hbWUgdG9rZW4gcHJvZHVjdGlvbiwgcmV0dXJuIGZhaWx1cmUuXG4gICAgaWYgKCFIVFRQX1RPS0VOX0NPREVQT0lOVFMudGVzdChoZWFkZXJOYW1lLnRvU3RyaW5nKCkpKSB7XG4gICAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gICAgfVxuXG4gICAgLy8gMi41LiBJZiB0aGUgYnl0ZSBhdCBwb3NpdGlvbiBpcyBub3QgMHgzQSAoOiksIHJldHVybiBmYWlsdXJlLlxuICAgIGlmIChpbnB1dFtwb3NpdGlvbi5wb3NpdGlvbl0gIT09IDB4M2EpIHtcbiAgICAgIHJldHVybiAnZmFpbHVyZSdcbiAgICB9XG5cbiAgICAvLyAyLjYuIEFkdmFuY2UgcG9zaXRpb24gYnkgMS5cbiAgICBwb3NpdGlvbi5wb3NpdGlvbisrXG5cbiAgICAvLyAyLjcuIENvbGxlY3QgYSBzZXF1ZW5jZSBvZiBieXRlcyB0aGF0IGFyZSBIVFRQIHRhYiBvciBzcGFjZSBieXRlcyBnaXZlbiBwb3NpdGlvbi5cbiAgICAvLyAgICAgIChEbyBub3RoaW5nIHdpdGggdGhvc2UgYnl0ZXMuKVxuICAgIGNvbGxlY3RBU2VxdWVuY2VPZkJ5dGVzKFxuICAgICAgKGNoYXIpID0+IGNoYXIgPT09IDB4MjAgfHwgY2hhciA9PT0gMHgwOSxcbiAgICAgIGlucHV0LFxuICAgICAgcG9zaXRpb25cbiAgICApXG5cbiAgICAvLyAyLjguIEJ5dGUtbG93ZXJjYXNlIGhlYWRlciBuYW1lIGFuZCBzd2l0Y2ggb24gdGhlIHJlc3VsdDpcbiAgICBzd2l0Y2ggKGJ1ZmZlclRvTG93ZXJDYXNlZEhlYWRlck5hbWUoaGVhZGVyTmFtZSkpIHtcbiAgICAgIGNhc2UgJ2NvbnRlbnQtZGlzcG9zaXRpb24nOiB7XG4gICAgICAgIC8vIDEuIFNldCBuYW1lIGFuZCBmaWxlbmFtZSB0byBudWxsLlxuICAgICAgICBuYW1lID0gZmlsZW5hbWUgPSBudWxsXG5cbiAgICAgICAgLy8gMi4gSWYgcG9zaXRpb24gZG9lcyBub3QgcG9pbnQgdG8gYSBzZXF1ZW5jZSBvZiBieXRlcyBzdGFydGluZyB3aXRoXG4gICAgICAgIC8vICAgIGBmb3JtLWRhdGE7IG5hbWU9XCJgLCByZXR1cm4gZmFpbHVyZS5cbiAgICAgICAgaWYgKCFidWZmZXJTdGFydHNXaXRoKGlucHV0LCBmb3JtRGF0YU5hbWVCdWZmZXIsIHBvc2l0aW9uKSkge1xuICAgICAgICAgIHJldHVybiAnZmFpbHVyZSdcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDMuIEFkdmFuY2UgcG9zaXRpb24gc28gaXQgcG9pbnRzIGF0IHRoZSBieXRlIGFmdGVyIHRoZSBuZXh0IDB4MjIgKFwiKVxuICAgICAgICAvLyAgICBieXRlICh0aGUgb25lIGluIHRoZSBzZXF1ZW5jZSBvZiBieXRlcyBtYXRjaGVkIGFib3ZlKS5cbiAgICAgICAgcG9zaXRpb24ucG9zaXRpb24gKz0gMTdcblxuICAgICAgICAvLyA0LiBTZXQgbmFtZSB0byB0aGUgcmVzdWx0IG9mIHBhcnNpbmcgYSBtdWx0aXBhcnQvZm9ybS1kYXRhIG5hbWUgZ2l2ZW5cbiAgICAgICAgLy8gICAgaW5wdXQgYW5kIHBvc2l0aW9uLCBpZiB0aGUgcmVzdWx0IGlzIG5vdCBmYWlsdXJlLiBPdGhlcndpc2UsIHJldHVyblxuICAgICAgICAvLyAgICBmYWlsdXJlLlxuICAgICAgICBuYW1lID0gcGFyc2VNdWx0aXBhcnRGb3JtRGF0YU5hbWUoaW5wdXQsIHBvc2l0aW9uKVxuXG4gICAgICAgIGlmIChuYW1lID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuICdmYWlsdXJlJ1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gNS4gSWYgcG9zaXRpb24gcG9pbnRzIHRvIGEgc2VxdWVuY2Ugb2YgYnl0ZXMgc3RhcnRpbmcgd2l0aCBgOyBmaWxlbmFtZT1cImA6XG4gICAgICAgIGlmIChidWZmZXJTdGFydHNXaXRoKGlucHV0LCBmaWxlbmFtZUJ1ZmZlciwgcG9zaXRpb24pKSB7XG4gICAgICAgICAgLy8gTm90ZTogdW5kaWNpIGFsc28gaGFuZGxlcyBmaWxlbmFtZSpcbiAgICAgICAgICBsZXQgY2hlY2sgPSBwb3NpdGlvbi5wb3NpdGlvbiArIGZpbGVuYW1lQnVmZmVyLmxlbmd0aFxuXG4gICAgICAgICAgaWYgKGlucHV0W2NoZWNrXSA9PT0gMHgyYSkge1xuICAgICAgICAgICAgcG9zaXRpb24ucG9zaXRpb24gKz0gMVxuICAgICAgICAgICAgY2hlY2sgKz0gMVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpbnB1dFtjaGVja10gIT09IDB4M2QgfHwgaW5wdXRbY2hlY2sgKyAxXSAhPT0gMHgyMikgeyAvLyA9XCJcbiAgICAgICAgICAgIHJldHVybiAnZmFpbHVyZSdcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyAxLiBBZHZhbmNlIHBvc2l0aW9uIHNvIGl0IHBvaW50cyBhdCB0aGUgYnl0ZSBhZnRlciB0aGUgbmV4dCAweDIyIChcIikgYnl0ZVxuICAgICAgICAgIC8vICAgICh0aGUgb25lIGluIHRoZSBzZXF1ZW5jZSBvZiBieXRlcyBtYXRjaGVkIGFib3ZlKS5cbiAgICAgICAgICBwb3NpdGlvbi5wb3NpdGlvbiArPSAxMlxuXG4gICAgICAgICAgLy8gMi4gU2V0IGZpbGVuYW1lIHRvIHRoZSByZXN1bHQgb2YgcGFyc2luZyBhIG11bHRpcGFydC9mb3JtLWRhdGEgbmFtZSBnaXZlblxuICAgICAgICAgIC8vICAgIGlucHV0IGFuZCBwb3NpdGlvbiwgaWYgdGhlIHJlc3VsdCBpcyBub3QgZmFpbHVyZS4gT3RoZXJ3aXNlLCByZXR1cm4gZmFpbHVyZS5cbiAgICAgICAgICBmaWxlbmFtZSA9IHBhcnNlTXVsdGlwYXJ0Rm9ybURhdGFOYW1lKGlucHV0LCBwb3NpdGlvbilcblxuICAgICAgICAgIGlmIChmaWxlbmFtZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuICdmYWlsdXJlJ1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdjb250ZW50LXR5cGUnOiB7XG4gICAgICAgIC8vIDEuIExldCBoZWFkZXIgdmFsdWUgYmUgdGhlIHJlc3VsdCBvZiBjb2xsZWN0aW5nIGEgc2VxdWVuY2Ugb2YgYnl0ZXMgdGhhdCBhcmVcbiAgICAgICAgLy8gICAgbm90IDB4MEEgKExGKSBvciAweDBEIChDUiksIGdpdmVuIHBvc2l0aW9uLlxuICAgICAgICBsZXQgaGVhZGVyVmFsdWUgPSBjb2xsZWN0QVNlcXVlbmNlT2ZCeXRlcyhcbiAgICAgICAgICAoY2hhcikgPT4gY2hhciAhPT0gMHgwYSAmJiBjaGFyICE9PSAweDBkLFxuICAgICAgICAgIGlucHV0LFxuICAgICAgICAgIHBvc2l0aW9uXG4gICAgICAgIClcblxuICAgICAgICAvLyAyLiBSZW1vdmUgYW55IEhUVFAgdGFiIG9yIHNwYWNlIGJ5dGVzIGZyb20gdGhlIGVuZCBvZiBoZWFkZXIgdmFsdWUuXG4gICAgICAgIGhlYWRlclZhbHVlID0gcmVtb3ZlQ2hhcnMoaGVhZGVyVmFsdWUsIGZhbHNlLCB0cnVlLCAoY2hhcikgPT4gY2hhciA9PT0gMHg5IHx8IGNoYXIgPT09IDB4MjApXG5cbiAgICAgICAgLy8gMy4gU2V0IGNvbnRlbnRUeXBlIHRvIHRoZSBpc29tb3JwaGljIGRlY29kaW5nIG9mIGhlYWRlciB2YWx1ZS5cbiAgICAgICAgY29udGVudFR5cGUgPSBpc29tb3JwaGljRGVjb2RlKGhlYWRlclZhbHVlKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJzoge1xuICAgICAgICBsZXQgaGVhZGVyVmFsdWUgPSBjb2xsZWN0QVNlcXVlbmNlT2ZCeXRlcyhcbiAgICAgICAgICAoY2hhcikgPT4gY2hhciAhPT0gMHgwYSAmJiBjaGFyICE9PSAweDBkLFxuICAgICAgICAgIGlucHV0LFxuICAgICAgICAgIHBvc2l0aW9uXG4gICAgICAgIClcblxuICAgICAgICBoZWFkZXJWYWx1ZSA9IHJlbW92ZUNoYXJzKGhlYWRlclZhbHVlLCBmYWxzZSwgdHJ1ZSwgKGNoYXIpID0+IGNoYXIgPT09IDB4OSB8fCBjaGFyID09PSAweDIwKVxuXG4gICAgICAgIGVuY29kaW5nID0gaXNvbW9ycGhpY0RlY29kZShoZWFkZXJWYWx1ZSlcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyBDb2xsZWN0IGEgc2VxdWVuY2Ugb2YgYnl0ZXMgdGhhdCBhcmUgbm90IDB4MEEgKExGKSBvciAweDBEIChDUiksIGdpdmVuIHBvc2l0aW9uLlxuICAgICAgICAvLyAoRG8gbm90aGluZyB3aXRoIHRob3NlIGJ5dGVzLilcbiAgICAgICAgY29sbGVjdEFTZXF1ZW5jZU9mQnl0ZXMoXG4gICAgICAgICAgKGNoYXIpID0+IGNoYXIgIT09IDB4MGEgJiYgY2hhciAhPT0gMHgwZCxcbiAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICBwb3NpdGlvblxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMi45LiBJZiBwb3NpdGlvbiBkb2VzIG5vdCBwb2ludCB0byBhIHNlcXVlbmNlIG9mIGJ5dGVzIHN0YXJ0aW5nIHdpdGggMHgwRCAweDBBXG4gICAgLy8gICAgICAoQ1IgTEYpLCByZXR1cm4gZmFpbHVyZS4gT3RoZXJ3aXNlLCBhZHZhbmNlIHBvc2l0aW9uIGJ5IDIgKHBhc3QgdGhlIG5ld2xpbmUpLlxuICAgIGlmIChpbnB1dFtwb3NpdGlvbi5wb3NpdGlvbl0gIT09IDB4MGQgJiYgaW5wdXRbcG9zaXRpb24ucG9zaXRpb24gKyAxXSAhPT0gMHgwYSkge1xuICAgICAgcmV0dXJuICdmYWlsdXJlJ1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3NpdGlvbi5wb3NpdGlvbiArPSAyXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2FuZHJldWJvdGVsbGEuZ2l0aHViLmlvL211bHRpcGFydC1mb3JtLWRhdGEvI3BhcnNlLWEtbXVsdGlwYXJ0LWZvcm0tZGF0YS1uYW1lXG4gKiBAcGFyYW0ge0J1ZmZlcn0gaW5wdXRcbiAqIEBwYXJhbSB7eyBwb3NpdGlvbjogbnVtYmVyIH19IHBvc2l0aW9uXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTXVsdGlwYXJ0Rm9ybURhdGFOYW1lIChpbnB1dCwgcG9zaXRpb24pIHtcbiAgLy8gMS4gQXNzZXJ0OiBUaGUgYnl0ZSBhdCAocG9zaXRpb24gLSAxKSBpcyAweDIyIChcIikuXG4gIGFzc2VydChpbnB1dFtwb3NpdGlvbi5wb3NpdGlvbiAtIDFdID09PSAweDIyKVxuXG4gIC8vIDIuIExldCBuYW1lIGJlIHRoZSByZXN1bHQgb2YgY29sbGVjdGluZyBhIHNlcXVlbmNlIG9mIGJ5dGVzIHRoYXQgYXJlIG5vdCAweDBBIChMRiksIDB4MEQgKENSKSBvciAweDIyIChcIiksIGdpdmVuIHBvc2l0aW9uLlxuICAvKiogQHR5cGUge3N0cmluZyB8IEJ1ZmZlcn0gKi9cbiAgbGV0IG5hbWUgPSBjb2xsZWN0QVNlcXVlbmNlT2ZCeXRlcyhcbiAgICAoY2hhcikgPT4gY2hhciAhPT0gMHgwYSAmJiBjaGFyICE9PSAweDBkICYmIGNoYXIgIT09IDB4MjIsXG4gICAgaW5wdXQsXG4gICAgcG9zaXRpb25cbiAgKVxuXG4gIC8vIDMuIElmIHRoZSBieXRlIGF0IHBvc2l0aW9uIGlzIG5vdCAweDIyIChcIiksIHJldHVybiBmYWlsdXJlLiBPdGhlcndpc2UsIGFkdmFuY2UgcG9zaXRpb24gYnkgMS5cbiAgaWYgKGlucHV0W3Bvc2l0aW9uLnBvc2l0aW9uXSAhPT0gMHgyMikge1xuICAgIHJldHVybiBudWxsIC8vIG5hbWUgY291bGQgYmUgJ2ZhaWx1cmUnXG4gIH0gZWxzZSB7XG4gICAgcG9zaXRpb24ucG9zaXRpb24rK1xuICB9XG5cbiAgLy8gNC4gUmVwbGFjZSBhbnkgb2NjdXJyZW5jZSBvZiB0aGUgZm9sbG93aW5nIHN1YnNlcXVlbmNlcyBpbiBuYW1lIHdpdGggdGhlIGdpdmVuIGJ5dGU6XG4gIC8vIC0gYCUwQWA6IDB4MEEgKExGKVxuICAvLyAtIGAlMERgOiAweDBEIChDUilcbiAgLy8gLSBgJTIyYDogMHgyMiAoXCIpXG4gIG5hbWUgPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUobmFtZSlcbiAgICAucmVwbGFjZSgvJTBBL2lnLCAnXFxuJylcbiAgICAucmVwbGFjZSgvJTBEL2lnLCAnXFxyJylcbiAgICAucmVwbGFjZSgvJTIyL2csICdcIicpXG5cbiAgLy8gNS4gUmV0dXJuIHRoZSBVVEYtOCBkZWNvZGluZyB3aXRob3V0IEJPTSBvZiBuYW1lLlxuICByZXR1cm4gbmFtZVxufVxuXG4vKipcbiAqIEBwYXJhbSB7KGNoYXI6IG51bWJlcikgPT4gYm9vbGVhbn0gY29uZGl0aW9uXG4gKiBAcGFyYW0ge0J1ZmZlcn0gaW5wdXRcbiAqIEBwYXJhbSB7eyBwb3NpdGlvbjogbnVtYmVyIH19IHBvc2l0aW9uXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RBU2VxdWVuY2VPZkJ5dGVzIChjb25kaXRpb24sIGlucHV0LCBwb3NpdGlvbikge1xuICBsZXQgc3RhcnQgPSBwb3NpdGlvbi5wb3NpdGlvblxuXG4gIHdoaWxlIChzdGFydCA8IGlucHV0Lmxlbmd0aCAmJiBjb25kaXRpb24oaW5wdXRbc3RhcnRdKSkge1xuICAgICsrc3RhcnRcbiAgfVxuXG4gIHJldHVybiBpbnB1dC5zdWJhcnJheShwb3NpdGlvbi5wb3NpdGlvbiwgKHBvc2l0aW9uLnBvc2l0aW9uID0gc3RhcnQpKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWZcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbGVhZGluZ1xuICogQHBhcmFtIHtib29sZWFufSB0cmFpbGluZ1xuICogQHBhcmFtIHsoY2hhckNvZGU6IG51bWJlcikgPT4gYm9vbGVhbn0gcHJlZGljYXRlXG4gKiBAcmV0dXJucyB7QnVmZmVyfVxuICovXG5mdW5jdGlvbiByZW1vdmVDaGFycyAoYnVmLCBsZWFkaW5nLCB0cmFpbGluZywgcHJlZGljYXRlKSB7XG4gIGxldCBsZWFkID0gMFxuICBsZXQgdHJhaWwgPSBidWYubGVuZ3RoIC0gMVxuXG4gIGlmIChsZWFkaW5nKSB7XG4gICAgd2hpbGUgKGxlYWQgPCBidWYubGVuZ3RoICYmIHByZWRpY2F0ZShidWZbbGVhZF0pKSBsZWFkKytcbiAgfVxuXG4gIGlmICh0cmFpbGluZykge1xuICAgIHdoaWxlICh0cmFpbCA+IDAgJiYgcHJlZGljYXRlKGJ1Zlt0cmFpbF0pKSB0cmFpbC0tXG4gIH1cblxuICByZXR1cm4gbGVhZCA9PT0gMCAmJiB0cmFpbCA9PT0gYnVmLmxlbmd0aCAtIDEgPyBidWYgOiBidWYuc3ViYXJyYXkobGVhZCwgdHJhaWwgKyAxKVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiB7QHBhcmFtIGJ1ZmZlcn0gc3RhcnRzIHdpdGgge0BwYXJhbSBzdGFydH1cbiAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXJcbiAqIEBwYXJhbSB7QnVmZmVyfSBzdGFydFxuICogQHBhcmFtIHt7IHBvc2l0aW9uOiBudW1iZXIgfX0gcG9zaXRpb25cbiAqL1xuZnVuY3Rpb24gYnVmZmVyU3RhcnRzV2l0aCAoYnVmZmVyLCBzdGFydCwgcG9zaXRpb24pIHtcbiAgaWYgKGJ1ZmZlci5sZW5ndGggPCBzdGFydC5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhcnQubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc3RhcnRbaV0gIT09IGJ1ZmZlcltwb3NpdGlvbi5wb3NpdGlvbiArIGldKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIsXG4gIHZhbGlkYXRlQm91bmRhcnlcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vLi4vY29yZS91dGlsJylcbmNvbnN0IHtcbiAgUmVhZGFibGVTdHJlYW1Gcm9tLFxuICBpc0Jsb2JMaWtlLFxuICBpc1JlYWRhYmxlU3RyZWFtTGlrZSxcbiAgcmVhZGFibGVTdHJlYW1DbG9zZSxcbiAgY3JlYXRlRGVmZXJyZWRQcm9taXNlLFxuICBmdWxseVJlYWRCb2R5LFxuICBleHRyYWN0TWltZVR5cGUsXG4gIHV0ZjhEZWNvZGVCeXRlc1xufSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IEZvcm1EYXRhIH0gPSByZXF1aXJlKCcuL2Zvcm1kYXRhJylcbmNvbnN0IHsga1N0YXRlIH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4vd2ViaWRsJylcbmNvbnN0IHsgQmxvYiB9ID0gcmVxdWlyZSgnbm9kZTpidWZmZXInKVxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnbm9kZTphc3NlcnQnKVxuY29uc3QgeyBpc0Vycm9yZWQsIGlzRGlzdHVyYmVkIH0gPSByZXF1aXJlKCdub2RlOnN0cmVhbScpXG5jb25zdCB7IGlzQXJyYXlCdWZmZXIgfSA9IHJlcXVpcmUoJ25vZGU6dXRpbC90eXBlcycpXG5jb25zdCB7IHNlcmlhbGl6ZUFNaW1lVHlwZSB9ID0gcmVxdWlyZSgnLi9kYXRhLXVybCcpXG5jb25zdCB7IG11bHRpcGFydEZvcm1EYXRhUGFyc2VyIH0gPSByZXF1aXJlKCcuL2Zvcm1kYXRhLXBhcnNlcicpXG5sZXQgcmFuZG9tXG5cbnRyeSB7XG4gIGNvbnN0IGNyeXB0byA9IHJlcXVpcmUoJ25vZGU6Y3J5cHRvJylcbiAgcmFuZG9tID0gKG1heCkgPT4gY3J5cHRvLnJhbmRvbUludCgwLCBtYXgpXG59IGNhdGNoIHtcbiAgcmFuZG9tID0gKG1heCkgPT4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbShtYXgpKVxufVxuXG5jb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpXG5mdW5jdGlvbiBub29wICgpIHt9XG5cbmNvbnN0IGhhc0ZpbmFsaXphdGlvblJlZ2lzdHJ5ID0gZ2xvYmFsVGhpcy5GaW5hbGl6YXRpb25SZWdpc3RyeSAmJiBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjE4JykgIT09IDBcbmxldCBzdHJlYW1SZWdpc3RyeVxuXG5pZiAoaGFzRmluYWxpemF0aW9uUmVnaXN0cnkpIHtcbiAgc3RyZWFtUmVnaXN0cnkgPSBuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoKHdlYWtSZWYpID0+IHtcbiAgICBjb25zdCBzdHJlYW0gPSB3ZWFrUmVmLmRlcmVmKClcbiAgICBpZiAoc3RyZWFtICYmICFzdHJlYW0ubG9ja2VkICYmICFpc0Rpc3R1cmJlZChzdHJlYW0pICYmICFpc0Vycm9yZWQoc3RyZWFtKSkge1xuICAgICAgc3RyZWFtLmNhbmNlbCgnUmVzcG9uc2Ugb2JqZWN0IGhhcyBiZWVuIGdhcmJhZ2UgY29sbGVjdGVkJykuY2F0Y2gobm9vcClcbiAgICB9XG4gIH0pXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWJvZHlpbml0LWV4dHJhY3RcbmZ1bmN0aW9uIGV4dHJhY3RCb2R5IChvYmplY3QsIGtlZXBhbGl2ZSA9IGZhbHNlKSB7XG4gIC8vIDEuIExldCBzdHJlYW0gYmUgbnVsbC5cbiAgbGV0IHN0cmVhbSA9IG51bGxcblxuICAvLyAyLiBJZiBvYmplY3QgaXMgYSBSZWFkYWJsZVN0cmVhbSBvYmplY3QsIHRoZW4gc2V0IHN0cmVhbSB0byBvYmplY3QuXG4gIGlmIChvYmplY3QgaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbSkge1xuICAgIHN0cmVhbSA9IG9iamVjdFxuICB9IGVsc2UgaWYgKGlzQmxvYkxpa2Uob2JqZWN0KSkge1xuICAgIC8vIDMuIE90aGVyd2lzZSwgaWYgb2JqZWN0IGlzIGEgQmxvYiBvYmplY3QsIHNldCBzdHJlYW0gdG8gdGhlXG4gICAgLy8gICAgcmVzdWx0IG9mIHJ1bm5pbmcgb2JqZWN04oCZcyBnZXQgc3RyZWFtLlxuICAgIHN0cmVhbSA9IG9iamVjdC5zdHJlYW0oKVxuICB9IGVsc2Uge1xuICAgIC8vIDQuIE90aGVyd2lzZSwgc2V0IHN0cmVhbSB0byBhIG5ldyBSZWFkYWJsZVN0cmVhbSBvYmplY3QsIGFuZCBzZXRcbiAgICAvLyAgICB1cCBzdHJlYW0gd2l0aCBieXRlIHJlYWRpbmcgc3VwcG9ydC5cbiAgICBzdHJlYW0gPSBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgICAgYXN5bmMgcHVsbCAoY29udHJvbGxlcikge1xuICAgICAgICBjb25zdCBidWZmZXIgPSB0eXBlb2Ygc291cmNlID09PSAnc3RyaW5nJyA/IHRleHRFbmNvZGVyLmVuY29kZShzb3VyY2UpIDogc291cmNlXG5cbiAgICAgICAgaWYgKGJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGJ1ZmZlcilcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHJlYWRhYmxlU3RyZWFtQ2xvc2UoY29udHJvbGxlcikpXG4gICAgICB9LFxuICAgICAgc3RhcnQgKCkge30sXG4gICAgICB0eXBlOiAnYnl0ZXMnXG4gICAgfSlcbiAgfVxuXG4gIC8vIDUuIEFzc2VydDogc3RyZWFtIGlzIGEgUmVhZGFibGVTdHJlYW0gb2JqZWN0LlxuICBhc3NlcnQoaXNSZWFkYWJsZVN0cmVhbUxpa2Uoc3RyZWFtKSlcblxuICAvLyA2LiBMZXQgYWN0aW9uIGJlIG51bGwuXG4gIGxldCBhY3Rpb24gPSBudWxsXG5cbiAgLy8gNy4gTGV0IHNvdXJjZSBiZSBudWxsLlxuICBsZXQgc291cmNlID0gbnVsbFxuXG4gIC8vIDguIExldCBsZW5ndGggYmUgbnVsbC5cbiAgbGV0IGxlbmd0aCA9IG51bGxcblxuICAvLyA5LiBMZXQgdHlwZSBiZSBudWxsLlxuICBsZXQgdHlwZSA9IG51bGxcblxuICAvLyAxMC4gU3dpdGNoIG9uIG9iamVjdDpcbiAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gU2V0IHNvdXJjZSB0byB0aGUgVVRGLTggZW5jb2Rpbmcgb2Ygb2JqZWN0LlxuICAgIC8vIE5vdGU6IHNldHRpbmcgc291cmNlIHRvIGEgVWludDhBcnJheSBoZXJlIGJyZWFrcyBzb21lIG1vY2tpbmcgYXNzdW1wdGlvbnMuXG4gICAgc291cmNlID0gb2JqZWN0XG5cbiAgICAvLyBTZXQgdHlwZSB0byBgdGV4dC9wbGFpbjtjaGFyc2V0PVVURi04YC5cbiAgICB0eXBlID0gJ3RleHQvcGxhaW47Y2hhcnNldD1VVEYtOCdcbiAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXMpIHtcbiAgICAvLyBVUkxTZWFyY2hQYXJhbXNcblxuICAgIC8vIHNwZWMgc2F5cyB0byBydW4gYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIG9uIGJvZHkubGlzdFxuICAgIC8vIHRoaXMgaXMgaW1wbGVtZW50ZWQgaW4gTm9kZS5qcyBhcyBhcGFydCBvZiBhbiBVUkxTZWFyY2hQYXJhbXMgaW5zdGFuY2UgdG9TdHJpbmcgbWV0aG9kXG4gICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi9lNDZjNjgwYmYyYjIxMWJiZDUyY2Y5NTljYTE3ZWU5OGM3ZjY1N2Y1L2xpYi9pbnRlcm5hbC91cmwuanMjTDQ5MFxuICAgIC8vIGFuZCBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi9lNDZjNjgwYmYyYjIxMWJiZDUyY2Y5NTljYTE3ZWU5OGM3ZjY1N2Y1L2xpYi9pbnRlcm5hbC91cmwuanMjTDExMDBcblxuICAgIC8vIFNldCBzb3VyY2UgdG8gdGhlIHJlc3VsdCBvZiBydW5uaW5nIHRoZSBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgc2VyaWFsaXplciB3aXRoIG9iamVjdOKAmXMgbGlzdC5cbiAgICBzb3VyY2UgPSBvYmplY3QudG9TdHJpbmcoKVxuXG4gICAgLy8gU2V0IHR5cGUgdG8gYGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04YC5cbiAgICB0eXBlID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04J1xuICB9IGVsc2UgaWYgKGlzQXJyYXlCdWZmZXIob2JqZWN0KSkge1xuICAgIC8vIEJ1ZmZlclNvdXJjZS9BcnJheUJ1ZmZlclxuXG4gICAgLy8gU2V0IHNvdXJjZSB0byBhIGNvcHkgb2YgdGhlIGJ5dGVzIGhlbGQgYnkgb2JqZWN0LlxuICAgIHNvdXJjZSA9IG5ldyBVaW50OEFycmF5KG9iamVjdC5zbGljZSgpKVxuICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhvYmplY3QpKSB7XG4gICAgLy8gQnVmZmVyU291cmNlL0FycmF5QnVmZmVyVmlld1xuXG4gICAgLy8gU2V0IHNvdXJjZSB0byBhIGNvcHkgb2YgdGhlIGJ5dGVzIGhlbGQgYnkgb2JqZWN0LlxuICAgIHNvdXJjZSA9IG5ldyBVaW50OEFycmF5KG9iamVjdC5idWZmZXIuc2xpY2Uob2JqZWN0LmJ5dGVPZmZzZXQsIG9iamVjdC5ieXRlT2Zmc2V0ICsgb2JqZWN0LmJ5dGVMZW5ndGgpKVxuICB9IGVsc2UgaWYgKHV0aWwuaXNGb3JtRGF0YUxpa2Uob2JqZWN0KSkge1xuICAgIGNvbnN0IGJvdW5kYXJ5ID0gYC0tLS1mb3JtZGF0YS11bmRpY2ktMCR7YCR7cmFuZG9tKDFlMTEpfWAucGFkU3RhcnQoMTEsICcwJyl9YFxuICAgIGNvbnN0IHByZWZpeCA9IGAtLSR7Ym91bmRhcnl9XFxyXFxuQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhYFxuXG4gICAgLyohIGZvcm1kYXRhLXBvbHlmaWxsLiBNSVQgTGljZW5zZS4gSmltbXkgV8OkcnRpbmcgPGh0dHBzOi8vamltbXkud2FydGluZy5zZS9vcGVuc291cmNlPiAqL1xuICAgIGNvbnN0IGVzY2FwZSA9IChzdHIpID0+XG4gICAgICBzdHIucmVwbGFjZSgvXFxuL2csICclMEEnKS5yZXBsYWNlKC9cXHIvZywgJyUwRCcpLnJlcGxhY2UoL1wiL2csICclMjInKVxuICAgIGNvbnN0IG5vcm1hbGl6ZUxpbmVmZWVkcyA9ICh2YWx1ZSkgPT4gdmFsdWUucmVwbGFjZSgvXFxyP1xcbnxcXHIvZywgJ1xcclxcbicpXG5cbiAgICAvLyBTZXQgYWN0aW9uIHRvIHRoaXMgc3RlcDogcnVuIHRoZSBtdWx0aXBhcnQvZm9ybS1kYXRhXG4gICAgLy8gZW5jb2RpbmcgYWxnb3JpdGhtLCB3aXRoIG9iamVjdOKAmXMgZW50cnkgbGlzdCBhbmQgVVRGLTguXG4gICAgLy8gLSBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgYm9keSBpcyBpbW11dGFibGUgYW5kIGNhbid0IGJlIGNoYW5nZWQgYWZ0ZXJ3b3Jkc1xuICAgIC8vIC0gVGhhdCB0aGUgY29udGVudC1sZW5ndGggaXMgY2FsY3VsYXRlZCBpbiBhZHZhbmNlLlxuICAgIC8vIC0gQW5kIHRoYXQgYWxsIHBhcnRzIGFyZSBwcmUtZW5jb2RlZCBhbmQgcmVhZHkgdG8gYmUgc2VudC5cblxuICAgIGNvbnN0IGJsb2JQYXJ0cyA9IFtdXG4gICAgY29uc3Qgcm4gPSBuZXcgVWludDhBcnJheShbMTMsIDEwXSkgLy8gJ1xcclxcbidcbiAgICBsZW5ndGggPSAwXG4gICAgbGV0IGhhc1Vua25vd25TaXplVmFsdWUgPSBmYWxzZVxuXG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIG9iamVjdCkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgY2h1bmsgPSB0ZXh0RW5jb2Rlci5lbmNvZGUocHJlZml4ICtcbiAgICAgICAgICBgOyBuYW1lPVwiJHtlc2NhcGUobm9ybWFsaXplTGluZWZlZWRzKG5hbWUpKX1cImAgK1xuICAgICAgICAgIGBcXHJcXG5cXHJcXG4ke25vcm1hbGl6ZUxpbmVmZWVkcyh2YWx1ZSl9XFxyXFxuYClcbiAgICAgICAgYmxvYlBhcnRzLnB1c2goY2h1bmspXG4gICAgICAgIGxlbmd0aCArPSBjaHVuay5ieXRlTGVuZ3RoXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjaHVuayA9IHRleHRFbmNvZGVyLmVuY29kZShgJHtwcmVmaXh9OyBuYW1lPVwiJHtlc2NhcGUobm9ybWFsaXplTGluZWZlZWRzKG5hbWUpKX1cImAgK1xuICAgICAgICAgICh2YWx1ZS5uYW1lID8gYDsgZmlsZW5hbWU9XCIke2VzY2FwZSh2YWx1ZS5uYW1lKX1cImAgOiAnJykgKyAnXFxyXFxuJyArXG4gICAgICAgICAgYENvbnRlbnQtVHlwZTogJHtcbiAgICAgICAgICAgIHZhbHVlLnR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbiAgICAgICAgICB9XFxyXFxuXFxyXFxuYClcbiAgICAgICAgYmxvYlBhcnRzLnB1c2goY2h1bmssIHZhbHVlLCBybilcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5zaXplID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIGxlbmd0aCArPSBjaHVuay5ieXRlTGVuZ3RoICsgdmFsdWUuc2l6ZSArIHJuLmJ5dGVMZW5ndGhcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoYXNVbmtub3duU2l6ZVZhbHVlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ1JMRiBpcyBhcHBlbmRlZCB0byB0aGUgYm9keSB0byBmdW5jdGlvbiB3aXRoIGxlZ2FjeSBzZXJ2ZXJzIGFuZCBtYXRjaCBvdGhlciBpbXBsZW1lbnRhdGlvbnMuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2N1cmwvY3VybC9ibG9iLzM0MzRjNmI0NmU2ODI0NTI5NzM5NzJlODMxMzYxM2RmYTU4Y2Q2OTAvbGliL21pbWUuYyNMMTAyOS1MMTAzMFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mb3JtLWRhdGEvZm9ybS1kYXRhL2lzc3Vlcy82M1xuICAgIGNvbnN0IGNodW5rID0gdGV4dEVuY29kZXIuZW5jb2RlKGAtLSR7Ym91bmRhcnl9LS1cXHJcXG5gKVxuICAgIGJsb2JQYXJ0cy5wdXNoKGNodW5rKVxuICAgIGxlbmd0aCArPSBjaHVuay5ieXRlTGVuZ3RoXG4gICAgaWYgKGhhc1Vua25vd25TaXplVmFsdWUpIHtcbiAgICAgIGxlbmd0aCA9IG51bGxcbiAgICB9XG5cbiAgICAvLyBTZXQgc291cmNlIHRvIG9iamVjdC5cbiAgICBzb3VyY2UgPSBvYmplY3RcblxuICAgIGFjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uICogKCkge1xuICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIGJsb2JQYXJ0cykge1xuICAgICAgICBpZiAocGFydC5zdHJlYW0pIHtcbiAgICAgICAgICB5aWVsZCAqIHBhcnQuc3RyZWFtKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB5aWVsZCBwYXJ0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgdHlwZSB0byBgbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9YCxcbiAgICAvLyBmb2xsb3dlZCBieSB0aGUgbXVsdGlwYXJ0L2Zvcm0tZGF0YSBib3VuZGFyeSBzdHJpbmcgZ2VuZXJhdGVkXG4gICAgLy8gYnkgdGhlIG11bHRpcGFydC9mb3JtLWRhdGEgZW5jb2RpbmcgYWxnb3JpdGhtLlxuICAgIHR5cGUgPSBgbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9JHtib3VuZGFyeX1gXG4gIH0gZWxzZSBpZiAoaXNCbG9iTGlrZShvYmplY3QpKSB7XG4gICAgLy8gQmxvYlxuXG4gICAgLy8gU2V0IHNvdXJjZSB0byBvYmplY3QuXG4gICAgc291cmNlID0gb2JqZWN0XG5cbiAgICAvLyBTZXQgbGVuZ3RoIHRvIG9iamVjdOKAmXMgc2l6ZS5cbiAgICBsZW5ndGggPSBvYmplY3Quc2l6ZVxuXG4gICAgLy8gSWYgb2JqZWN04oCZcyB0eXBlIGF0dHJpYnV0ZSBpcyBub3QgdGhlIGVtcHR5IGJ5dGUgc2VxdWVuY2UsIHNldFxuICAgIC8vIHR5cGUgdG8gaXRzIHZhbHVlLlxuICAgIGlmIChvYmplY3QudHlwZSkge1xuICAgICAgdHlwZSA9IG9iamVjdC50eXBlXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBvYmplY3RbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gSWYga2VlcGFsaXZlIGlzIHRydWUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKGtlZXBhbGl2ZSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigna2VlcGFsaXZlJylcbiAgICB9XG5cbiAgICAvLyBJZiBvYmplY3QgaXMgZGlzdHVyYmVkIG9yIGxvY2tlZCwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAodXRpbC5pc0Rpc3R1cmJlZChvYmplY3QpIHx8IG9iamVjdC5sb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdSZXNwb25zZSBib2R5IG9iamVjdCBzaG91bGQgbm90IGJlIGRpc3R1cmJlZCBvciBsb2NrZWQnXG4gICAgICApXG4gICAgfVxuXG4gICAgc3RyZWFtID1cbiAgICAgIG9iamVjdCBpbnN0YW5jZW9mIFJlYWRhYmxlU3RyZWFtID8gb2JqZWN0IDogUmVhZGFibGVTdHJlYW1Gcm9tKG9iamVjdClcbiAgfVxuXG4gIC8vIDExLiBJZiBzb3VyY2UgaXMgYSBieXRlIHNlcXVlbmNlLCB0aGVuIHNldCBhY3Rpb24gdG8gYVxuICAvLyBzdGVwIHRoYXQgcmV0dXJucyBzb3VyY2UgYW5kIGxlbmd0aCB0byBzb3VyY2XigJlzIGxlbmd0aC5cbiAgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnIHx8IHV0aWwuaXNCdWZmZXIoc291cmNlKSkge1xuICAgIGxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHNvdXJjZSlcbiAgfVxuXG4gIC8vIDEyLiBJZiBhY3Rpb24gaXMgbm9uLW51bGwsIHRoZW4gcnVuIHRoZXNlIHN0ZXBzIGluIGluIHBhcmFsbGVsOlxuICBpZiAoYWN0aW9uICE9IG51bGwpIHtcbiAgICAvLyBSdW4gYWN0aW9uLlxuICAgIGxldCBpdGVyYXRvclxuICAgIHN0cmVhbSA9IG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgICBhc3luYyBzdGFydCAoKSB7XG4gICAgICAgIGl0ZXJhdG9yID0gYWN0aW9uKG9iamVjdClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKClcbiAgICAgIH0sXG4gICAgICBhc3luYyBwdWxsIChjb250cm9sbGVyKSB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGF3YWl0IGl0ZXJhdG9yLm5leHQoKVxuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgIC8vIFdoZW4gcnVubmluZyBhY3Rpb24gaXMgZG9uZSwgY2xvc2Ugc3RyZWFtLlxuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKVxuICAgICAgICAgICAgY29udHJvbGxlci5ieW9iUmVxdWVzdD8ucmVzcG9uZCgwKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gV2hlbmV2ZXIgb25lIG9yIG1vcmUgYnl0ZXMgYXJlIGF2YWlsYWJsZSBhbmQgc3RyZWFtIGlzIG5vdCBlcnJvcmVkLFxuICAgICAgICAgIC8vIGVucXVldWUgYSBVaW50OEFycmF5IHdyYXBwaW5nIGFuIEFycmF5QnVmZmVyIGNvbnRhaW5pbmcgdGhlIGF2YWlsYWJsZVxuICAgICAgICAgIC8vIGJ5dGVzIGludG8gc3RyZWFtLlxuICAgICAgICAgIGlmICghaXNFcnJvcmVkKHN0cmVhbSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHZhbHVlKVxuICAgICAgICAgICAgaWYgKGJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShidWZmZXIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLmRlc2lyZWRTaXplID4gMFxuICAgICAgfSxcbiAgICAgIGFzeW5jIGNhbmNlbCAocmVhc29uKSB7XG4gICAgICAgIGF3YWl0IGl0ZXJhdG9yLnJldHVybigpXG4gICAgICB9LFxuICAgICAgdHlwZTogJ2J5dGVzJ1xuICAgIH0pXG4gIH1cblxuICAvLyAxMy4gTGV0IGJvZHkgYmUgYSBib2R5IHdob3NlIHN0cmVhbSBpcyBzdHJlYW0sIHNvdXJjZSBpcyBzb3VyY2UsXG4gIC8vIGFuZCBsZW5ndGggaXMgbGVuZ3RoLlxuICBjb25zdCBib2R5ID0geyBzdHJlYW0sIHNvdXJjZSwgbGVuZ3RoIH1cblxuICAvLyAxNC4gUmV0dXJuIChib2R5LCB0eXBlKS5cbiAgcmV0dXJuIFtib2R5LCB0eXBlXVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jYm9keWluaXQtc2FmZWx5LWV4dHJhY3RcbmZ1bmN0aW9uIHNhZmVseUV4dHJhY3RCb2R5IChvYmplY3QsIGtlZXBhbGl2ZSA9IGZhbHNlKSB7XG4gIC8vIFRvIHNhZmVseSBleHRyYWN0IGEgYm9keSBhbmQgYSBgQ29udGVudC1UeXBlYCB2YWx1ZSBmcm9tXG4gIC8vIGEgYnl0ZSBzZXF1ZW5jZSBvciBCb2R5SW5pdCBvYmplY3Qgb2JqZWN0LCBydW4gdGhlc2Ugc3RlcHM6XG5cbiAgLy8gMS4gSWYgb2JqZWN0IGlzIGEgUmVhZGFibGVTdHJlYW0gb2JqZWN0LCB0aGVuOlxuICBpZiAob2JqZWN0IGluc3RhbmNlb2YgUmVhZGFibGVTdHJlYW0pIHtcbiAgICAvLyBBc3NlcnQ6IG9iamVjdCBpcyBuZWl0aGVyIGRpc3R1cmJlZCBub3IgbG9ja2VkLlxuICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgYXNzZXJ0KCF1dGlsLmlzRGlzdHVyYmVkKG9iamVjdCksICdUaGUgYm9keSBoYXMgYWxyZWFkeSBiZWVuIGNvbnN1bWVkLicpXG4gICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICBhc3NlcnQoIW9iamVjdC5sb2NrZWQsICdUaGUgc3RyZWFtIGlzIGxvY2tlZC4nKVxuICB9XG5cbiAgLy8gMi4gUmV0dXJuIHRoZSByZXN1bHRzIG9mIGV4dHJhY3Rpbmcgb2JqZWN0LlxuICByZXR1cm4gZXh0cmFjdEJvZHkob2JqZWN0LCBrZWVwYWxpdmUpXG59XG5cbmZ1bmN0aW9uIGNsb25lQm9keSAoaW5zdGFuY2UsIGJvZHkpIHtcbiAgLy8gVG8gY2xvbmUgYSBib2R5IGJvZHksIHJ1biB0aGVzZSBzdGVwczpcblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1ib2R5LWNsb25lXG5cbiAgLy8gMS4gTGV0IMKrIG91dDEsIG91dDIgwrsgYmUgdGhlIHJlc3VsdCBvZiB0ZWVpbmcgYm9keeKAmXMgc3RyZWFtLlxuICBjb25zdCBbb3V0MSwgb3V0Ml0gPSBib2R5LnN0cmVhbS50ZWUoKVxuXG4gIC8vIDIuIFNldCBib2R54oCZcyBzdHJlYW0gdG8gb3V0MS5cbiAgYm9keS5zdHJlYW0gPSBvdXQxXG5cbiAgLy8gMy4gUmV0dXJuIGEgYm9keSB3aG9zZSBzdHJlYW0gaXMgb3V0MiBhbmQgb3RoZXIgbWVtYmVycyBhcmUgY29waWVkIGZyb20gYm9keS5cbiAgcmV0dXJuIHtcbiAgICBzdHJlYW06IG91dDIsXG4gICAgbGVuZ3RoOiBib2R5Lmxlbmd0aCxcbiAgICBzb3VyY2U6IGJvZHkuc291cmNlXG4gIH1cbn1cblxuZnVuY3Rpb24gdGhyb3dJZkFib3J0ZWQgKHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5hYm9ydGVkKSB7XG4gICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZC4nLCAnQWJvcnRFcnJvcicpXG4gIH1cbn1cblxuZnVuY3Rpb24gYm9keU1peGluTWV0aG9kcyAoaW5zdGFuY2UpIHtcbiAgY29uc3QgbWV0aG9kcyA9IHtcbiAgICBibG9iICgpIHtcbiAgICAgIC8vIFRoZSBibG9iKCkgbWV0aG9kIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhlIHJlc3VsdCBvZlxuICAgICAgLy8gcnVubmluZyBjb25zdW1lIGJvZHkgd2l0aCB0aGlzIGFuZCB0aGUgZm9sbG93aW5nIHN0ZXBcbiAgICAgIC8vIGdpdmVuIGEgYnl0ZSBzZXF1ZW5jZSBieXRlczogcmV0dXJuIGEgQmxvYiB3aG9zZVxuICAgICAgLy8gY29udGVudHMgYXJlIGJ5dGVzIGFuZCB3aG9zZSB0eXBlIGF0dHJpYnV0ZSBpcyB0aGlz4oCZc1xuICAgICAgLy8gTUlNRSB0eXBlLlxuICAgICAgcmV0dXJuIGNvbnN1bWVCb2R5KHRoaXMsIChieXRlcykgPT4ge1xuICAgICAgICBsZXQgbWltZVR5cGUgPSBib2R5TWltZVR5cGUodGhpcylcblxuICAgICAgICBpZiAobWltZVR5cGUgPT09IG51bGwpIHtcbiAgICAgICAgICBtaW1lVHlwZSA9ICcnXG4gICAgICAgIH0gZWxzZSBpZiAobWltZVR5cGUpIHtcbiAgICAgICAgICBtaW1lVHlwZSA9IHNlcmlhbGl6ZUFNaW1lVHlwZShtaW1lVHlwZSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiBhIEJsb2Igd2hvc2UgY29udGVudHMgYXJlIGJ5dGVzIGFuZCB0eXBlIGF0dHJpYnV0ZVxuICAgICAgICAvLyBpcyBtaW1lVHlwZS5cbiAgICAgICAgcmV0dXJuIG5ldyBCbG9iKFtieXRlc10sIHsgdHlwZTogbWltZVR5cGUgfSlcbiAgICAgIH0sIGluc3RhbmNlKVxuICAgIH0sXG5cbiAgICBhcnJheUJ1ZmZlciAoKSB7XG4gICAgICAvLyBUaGUgYXJyYXlCdWZmZXIoKSBtZXRob2Qgc3RlcHMgYXJlIHRvIHJldHVybiB0aGUgcmVzdWx0XG4gICAgICAvLyBvZiBydW5uaW5nIGNvbnN1bWUgYm9keSB3aXRoIHRoaXMgYW5kIHRoZSBmb2xsb3dpbmcgc3RlcFxuICAgICAgLy8gZ2l2ZW4gYSBieXRlIHNlcXVlbmNlIGJ5dGVzOiByZXR1cm4gYSBuZXcgQXJyYXlCdWZmZXJcbiAgICAgIC8vIHdob3NlIGNvbnRlbnRzIGFyZSBieXRlcy5cbiAgICAgIHJldHVybiBjb25zdW1lQm9keSh0aGlzLCAoYnl0ZXMpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ5dGVzKS5idWZmZXJcbiAgICAgIH0sIGluc3RhbmNlKVxuICAgIH0sXG5cbiAgICB0ZXh0ICgpIHtcbiAgICAgIC8vIFRoZSB0ZXh0KCkgbWV0aG9kIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhlIHJlc3VsdCBvZiBydW5uaW5nXG4gICAgICAvLyBjb25zdW1lIGJvZHkgd2l0aCB0aGlzIGFuZCBVVEYtOCBkZWNvZGUuXG4gICAgICByZXR1cm4gY29uc3VtZUJvZHkodGhpcywgdXRmOERlY29kZUJ5dGVzLCBpbnN0YW5jZSlcbiAgICB9LFxuXG4gICAganNvbiAoKSB7XG4gICAgICAvLyBUaGUganNvbigpIG1ldGhvZCBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoZSByZXN1bHQgb2YgcnVubmluZ1xuICAgICAgLy8gY29uc3VtZSBib2R5IHdpdGggdGhpcyBhbmQgcGFyc2UgSlNPTiBmcm9tIGJ5dGVzLlxuICAgICAgcmV0dXJuIGNvbnN1bWVCb2R5KHRoaXMsIHBhcnNlSlNPTkZyb21CeXRlcywgaW5zdGFuY2UpXG4gICAgfSxcblxuICAgIGZvcm1EYXRhICgpIHtcbiAgICAgIC8vIFRoZSBmb3JtRGF0YSgpIG1ldGhvZCBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoZSByZXN1bHQgb2YgcnVubmluZ1xuICAgICAgLy8gY29uc3VtZSBib2R5IHdpdGggdGhpcyBhbmQgdGhlIGZvbGxvd2luZyBzdGVwIGdpdmVuIGEgYnl0ZSBzZXF1ZW5jZSBieXRlczpcbiAgICAgIHJldHVybiBjb25zdW1lQm9keSh0aGlzLCAodmFsdWUpID0+IHtcbiAgICAgICAgLy8gMS4gTGV0IG1pbWVUeXBlIGJlIHRoZSByZXN1bHQgb2YgZ2V0IHRoZSBNSU1FIHR5cGUgd2l0aCB0aGlzLlxuICAgICAgICBjb25zdCBtaW1lVHlwZSA9IGJvZHlNaW1lVHlwZSh0aGlzKVxuXG4gICAgICAgIC8vIDIuIElmIG1pbWVUeXBlIGlzIG5vbi1udWxsLCB0aGVuIHN3aXRjaCBvbiBtaW1lVHlwZeKAmXMgZXNzZW5jZSBhbmQgcnVuXG4gICAgICAgIC8vICAgIHRoZSBjb3JyZXNwb25kaW5nIHN0ZXBzOlxuICAgICAgICBpZiAobWltZVR5cGUgIT09IG51bGwpIHtcbiAgICAgICAgICBzd2l0Y2ggKG1pbWVUeXBlLmVzc2VuY2UpIHtcbiAgICAgICAgICAgIGNhc2UgJ211bHRpcGFydC9mb3JtLWRhdGEnOiB7XG4gICAgICAgICAgICAgIC8vIDEuIC4uLiBbbG9uZyBzdGVwXVxuICAgICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBtdWx0aXBhcnRGb3JtRGF0YVBhcnNlcih2YWx1ZSwgbWltZVR5cGUpXG5cbiAgICAgICAgICAgICAgLy8gMi4gSWYgdGhhdCBmYWlscyBmb3Igc29tZSByZWFzb24sIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgICAgICAgICAgIGlmIChwYXJzZWQgPT09ICdmYWlsdXJlJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSBib2R5IGFzIEZvcm1EYXRhLicpXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyAzLiBSZXR1cm4gYSBuZXcgRm9ybURhdGEgb2JqZWN0LCBhcHBlbmRpbmcgZWFjaCBlbnRyeSxcbiAgICAgICAgICAgICAgLy8gICAgcmVzdWx0aW5nIGZyb20gdGhlIHBhcnNpbmcgb3BlcmF0aW9uLCB0byBpdHMgZW50cnkgbGlzdC5cbiAgICAgICAgICAgICAgY29uc3QgZmQgPSBuZXcgRm9ybURhdGEoKVxuICAgICAgICAgICAgICBmZFtrU3RhdGVdID0gcGFyc2VkXG5cbiAgICAgICAgICAgICAgcmV0dXJuIGZkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnOiB7XG4gICAgICAgICAgICAgIC8vIDEuIExldCBlbnRyaWVzIGJlIHRoZSByZXN1bHQgb2YgcGFyc2luZyBieXRlcy5cbiAgICAgICAgICAgICAgY29uc3QgZW50cmllcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXModmFsdWUudG9TdHJpbmcoKSlcblxuICAgICAgICAgICAgICAvLyAyLiBJZiBlbnRyaWVzIGlzIGZhaWx1cmUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG5cbiAgICAgICAgICAgICAgLy8gMy4gUmV0dXJuIGEgbmV3IEZvcm1EYXRhIG9iamVjdCB3aG9zZSBlbnRyeSBsaXN0IGlzIGVudHJpZXMuXG4gICAgICAgICAgICAgIGNvbnN0IGZkID0gbmV3IEZvcm1EYXRhKClcblxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgICAgICAgICAgICAgIGZkLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBmZFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDMuIFRocm93IGEgVHlwZUVycm9yLlxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICdDb250ZW50LVR5cGUgd2FzIG5vdCBvbmUgb2YgXCJtdWx0aXBhcnQvZm9ybS1kYXRhXCIgb3IgXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIi4nXG4gICAgICAgIClcbiAgICAgIH0sIGluc3RhbmNlKVxuICAgIH0sXG5cbiAgICBieXRlcyAoKSB7XG4gICAgICAvLyBUaGUgYnl0ZXMoKSBtZXRob2Qgc3RlcHMgYXJlIHRvIHJldHVybiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgY29uc3VtZSBib2R5XG4gICAgICAvLyB3aXRoIHRoaXMgYW5kIHRoZSBmb2xsb3dpbmcgc3RlcCBnaXZlbiBhIGJ5dGUgc2VxdWVuY2UgYnl0ZXM6IHJldHVybiB0aGVcbiAgICAgIC8vIHJlc3VsdCBvZiBjcmVhdGluZyBhIFVpbnQ4QXJyYXkgZnJvbSBieXRlcyBpbiB0aGlz4oCZcyByZWxldmFudCByZWFsbS5cbiAgICAgIHJldHVybiBjb25zdW1lQm9keSh0aGlzLCAoYnl0ZXMpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ5dGVzKVxuICAgICAgfSwgaW5zdGFuY2UpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1ldGhvZHNcbn1cblxuZnVuY3Rpb24gbWl4aW5Cb2R5IChwcm90b3R5cGUpIHtcbiAgT2JqZWN0LmFzc2lnbihwcm90b3R5cGUucHJvdG90eXBlLCBib2R5TWl4aW5NZXRob2RzKHByb3RvdHlwZSkpXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1ib2R5LWNvbnN1bWUtYm9keVxuICogQHBhcmFtIHtSZXNwb25zZXxSZXF1ZXN0fSBvYmplY3RcbiAqIEBwYXJhbSB7KHZhbHVlOiB1bmtub3duKSA9PiB1bmtub3dufSBjb252ZXJ0Qnl0ZXNUb0pTVmFsdWVcbiAqIEBwYXJhbSB7UmVzcG9uc2V8UmVxdWVzdH0gaW5zdGFuY2VcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29uc3VtZUJvZHkgKG9iamVjdCwgY29udmVydEJ5dGVzVG9KU1ZhbHVlLCBpbnN0YW5jZSkge1xuICB3ZWJpZGwuYnJhbmRDaGVjayhvYmplY3QsIGluc3RhbmNlKVxuXG4gIC8vIDEuIElmIG9iamVjdCBpcyB1bnVzYWJsZSwgdGhlbiByZXR1cm4gYSBwcm9taXNlIHJlamVjdGVkXG4gIC8vICAgIHdpdGggYSBUeXBlRXJyb3IuXG4gIGlmIChib2R5VW51c2FibGUob2JqZWN0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0JvZHkgaXMgdW51c2FibGU6IEJvZHkgaGFzIGFscmVhZHkgYmVlbiByZWFkJylcbiAgfVxuXG4gIHRocm93SWZBYm9ydGVkKG9iamVjdFtrU3RhdGVdKVxuXG4gIC8vIDIuIExldCBwcm9taXNlIGJlIGEgbmV3IHByb21pc2UuXG4gIGNvbnN0IHByb21pc2UgPSBjcmVhdGVEZWZlcnJlZFByb21pc2UoKVxuXG4gIC8vIDMuIExldCBlcnJvclN0ZXBzIGdpdmVuIGVycm9yIGJlIHRvIHJlamVjdCBwcm9taXNlIHdpdGggZXJyb3IuXG4gIGNvbnN0IGVycm9yU3RlcHMgPSAoZXJyb3IpID0+IHByb21pc2UucmVqZWN0KGVycm9yKVxuXG4gIC8vIDQuIExldCBzdWNjZXNzU3RlcHMgZ2l2ZW4gYSBieXRlIHNlcXVlbmNlIGRhdGEgYmUgdG8gcmVzb2x2ZVxuICAvLyAgICBwcm9taXNlIHdpdGggdGhlIHJlc3VsdCBvZiBydW5uaW5nIGNvbnZlcnRCeXRlc1RvSlNWYWx1ZVxuICAvLyAgICB3aXRoIGRhdGEuIElmIHRoYXQgdGhyZXcgYW4gZXhjZXB0aW9uLCB0aGVuIHJ1biBlcnJvclN0ZXBzXG4gIC8vICAgIHdpdGggdGhhdCBleGNlcHRpb24uXG4gIGNvbnN0IHN1Y2Nlc3NTdGVwcyA9IChkYXRhKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHByb21pc2UucmVzb2x2ZShjb252ZXJ0Qnl0ZXNUb0pTVmFsdWUoZGF0YSkpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JTdGVwcyhlKVxuICAgIH1cbiAgfVxuXG4gIC8vIDUuIElmIG9iamVjdOKAmXMgYm9keSBpcyBudWxsLCB0aGVuIHJ1biBzdWNjZXNzU3RlcHMgd2l0aCBhblxuICAvLyAgICBlbXB0eSBieXRlIHNlcXVlbmNlLlxuICBpZiAob2JqZWN0W2tTdGF0ZV0uYm9keSA9PSBudWxsKSB7XG4gICAgc3VjY2Vzc1N0ZXBzKEJ1ZmZlci5hbGxvY1Vuc2FmZSgwKSlcbiAgICByZXR1cm4gcHJvbWlzZS5wcm9taXNlXG4gIH1cblxuICAvLyA2LiBPdGhlcndpc2UsIGZ1bGx5IHJlYWQgb2JqZWN04oCZcyBib2R5IGdpdmVuIHN1Y2Nlc3NTdGVwcyxcbiAgLy8gICAgZXJyb3JTdGVwcywgYW5kIG9iamVjdOKAmXMgcmVsZXZhbnQgZ2xvYmFsIG9iamVjdC5cbiAgYXdhaXQgZnVsbHlSZWFkQm9keShvYmplY3Rba1N0YXRlXS5ib2R5LCBzdWNjZXNzU3RlcHMsIGVycm9yU3RlcHMpXG5cbiAgLy8gNy4gUmV0dXJuIHByb21pc2UuXG4gIHJldHVybiBwcm9taXNlLnByb21pc2Vcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2JvZHktdW51c2FibGVcbmZ1bmN0aW9uIGJvZHlVbnVzYWJsZSAob2JqZWN0KSB7XG4gIGNvbnN0IGJvZHkgPSBvYmplY3Rba1N0YXRlXS5ib2R5XG5cbiAgLy8gQW4gb2JqZWN0IGluY2x1ZGluZyB0aGUgQm9keSBpbnRlcmZhY2UgbWl4aW4gaXNcbiAgLy8gc2FpZCB0byBiZSB1bnVzYWJsZSBpZiBpdHMgYm9keSBpcyBub24tbnVsbCBhbmRcbiAgLy8gaXRzIGJvZHnigJlzIHN0cmVhbSBpcyBkaXN0dXJiZWQgb3IgbG9ja2VkLlxuICByZXR1cm4gYm9keSAhPSBudWxsICYmIChib2R5LnN0cmVhbS5sb2NrZWQgfHwgdXRpbC5pc0Rpc3R1cmJlZChib2R5LnN0cmVhbSkpXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jcGFyc2UtanNvbi1ieXRlcy10by1hLWphdmFzY3JpcHQtdmFsdWVcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYnl0ZXNcbiAqL1xuZnVuY3Rpb24gcGFyc2VKU09ORnJvbUJ5dGVzIChieXRlcykge1xuICByZXR1cm4gSlNPTi5wYXJzZSh1dGY4RGVjb2RlQnl0ZXMoYnl0ZXMpKVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtYm9keS1taW1lLXR5cGVcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL3Jlc3BvbnNlJykuUmVzcG9uc2V8aW1wb3J0KCcuL3JlcXVlc3QnKS5SZXF1ZXN0fSByZXF1ZXN0T3JSZXNwb25zZVxuICovXG5mdW5jdGlvbiBib2R5TWltZVR5cGUgKHJlcXVlc3RPclJlc3BvbnNlKSB7XG4gIC8vIDEuIExldCBoZWFkZXJzIGJlIG51bGwuXG4gIC8vIDIuIElmIHJlcXVlc3RPclJlc3BvbnNlIGlzIGEgUmVxdWVzdCBvYmplY3QsIHRoZW4gc2V0IGhlYWRlcnMgdG8gcmVxdWVzdE9yUmVzcG9uc2XigJlzIHJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICAvLyAzLiBPdGhlcndpc2UsIHNldCBoZWFkZXJzIHRvIHJlcXVlc3RPclJlc3BvbnNl4oCZcyByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3QuXG4gIC8qKiBAdHlwZSB7aW1wb3J0KCcuL2hlYWRlcnMnKS5IZWFkZXJzTGlzdH0gKi9cbiAgY29uc3QgaGVhZGVycyA9IHJlcXVlc3RPclJlc3BvbnNlW2tTdGF0ZV0uaGVhZGVyc0xpc3RcblxuICAvLyA0LiBMZXQgbWltZVR5cGUgYmUgdGhlIHJlc3VsdCBvZiBleHRyYWN0aW5nIGEgTUlNRSB0eXBlIGZyb20gaGVhZGVycy5cbiAgY29uc3QgbWltZVR5cGUgPSBleHRyYWN0TWltZVR5cGUoaGVhZGVycylcblxuICAvLyA1LiBJZiBtaW1lVHlwZSBpcyBmYWlsdXJlLCB0aGVuIHJldHVybiBudWxsLlxuICBpZiAobWltZVR5cGUgPT09ICdmYWlsdXJlJykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvLyA2LiBSZXR1cm4gbWltZVR5cGUuXG4gIHJldHVybiBtaW1lVHlwZVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZXh0cmFjdEJvZHksXG4gIHNhZmVseUV4dHJhY3RCb2R5LFxuICBjbG9uZUJvZHksXG4gIG1peGluQm9keSxcbiAgc3RyZWFtUmVnaXN0cnksXG4gIGhhc0ZpbmFsaXphdGlvblJlZ2lzdHJ5LFxuICBib2R5VW51c2FibGVcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG4vKiBnbG9iYWwgV2ViQXNzZW1ibHkgKi9cblxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnbm9kZTphc3NlcnQnKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbC5qcycpXG5jb25zdCB7IGNoYW5uZWxzIH0gPSByZXF1aXJlKCcuLi9jb3JlL2RpYWdub3N0aWNzLmpzJylcbmNvbnN0IHRpbWVycyA9IHJlcXVpcmUoJy4uL3V0aWwvdGltZXJzLmpzJylcbmNvbnN0IHtcbiAgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yLFxuICBSZXNwb25zZUNvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yLFxuICBSZXF1ZXN0QWJvcnRlZEVycm9yLFxuICBIZWFkZXJzVGltZW91dEVycm9yLFxuICBIZWFkZXJzT3ZlcmZsb3dFcnJvcixcbiAgU29ja2V0RXJyb3IsXG4gIEluZm9ybWF0aW9uYWxFcnJvcixcbiAgQm9keVRpbWVvdXRFcnJvcixcbiAgSFRUUFBhcnNlckVycm9yLFxuICBSZXNwb25zZUV4Y2VlZGVkTWF4U2l6ZUVycm9yXG59ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMuanMnKVxuY29uc3Qge1xuICBrVXJsLFxuICBrUmVzZXQsXG4gIGtDbGllbnQsXG4gIGtQYXJzZXIsXG4gIGtCbG9ja2luZyxcbiAga1J1bm5pbmcsXG4gIGtQZW5kaW5nLFxuICBrU2l6ZSxcbiAga1dyaXRpbmcsXG4gIGtRdWV1ZSxcbiAga05vUmVmLFxuICBrS2VlcEFsaXZlRGVmYXVsdFRpbWVvdXQsXG4gIGtIb3N0SGVhZGVyLFxuICBrUGVuZGluZ0lkeCxcbiAga1J1bm5pbmdJZHgsXG4gIGtFcnJvcixcbiAga1BpcGVsaW5pbmcsXG4gIGtTb2NrZXQsXG4gIGtLZWVwQWxpdmVUaW1lb3V0VmFsdWUsXG4gIGtNYXhIZWFkZXJzU2l6ZSxcbiAga0tlZXBBbGl2ZU1heFRpbWVvdXQsXG4gIGtLZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkLFxuICBrSGVhZGVyc1RpbWVvdXQsXG4gIGtCb2R5VGltZW91dCxcbiAga1N0cmljdENvbnRlbnRMZW5ndGgsXG4gIGtNYXhSZXF1ZXN0cyxcbiAga0NvdW50ZXIsXG4gIGtNYXhSZXNwb25zZVNpemUsXG4gIGtPbkVycm9yLFxuICBrUmVzdW1lLFxuICBrSFRUUENvbnRleHRcbn0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMuanMnKVxuXG5jb25zdCBjb25zdGFudHMgPSByZXF1aXJlKCcuLi9sbGh0dHAvY29uc3RhbnRzLmpzJylcbmNvbnN0IEVNUFRZX0JVRiA9IEJ1ZmZlci5hbGxvYygwKVxuY29uc3QgRmFzdEJ1ZmZlciA9IEJ1ZmZlcltTeW1ib2wuc3BlY2llc11cbmNvbnN0IGFkZExpc3RlbmVyID0gdXRpbC5hZGRMaXN0ZW5lclxuY29uc3QgcmVtb3ZlQWxsTGlzdGVuZXJzID0gdXRpbC5yZW1vdmVBbGxMaXN0ZW5lcnNcblxubGV0IGV4dHJhY3RCb2R5XG5cbmFzeW5jIGZ1bmN0aW9uIGxhenlsbGh0dHAgKCkge1xuICBjb25zdCBsbGh0dHBXYXNtRGF0YSA9IHByb2Nlc3MuZW52LkpFU1RfV09SS0VSX0lEID8gcmVxdWlyZSgnLi4vbGxodHRwL2xsaHR0cC13YXNtLmpzJykgOiB1bmRlZmluZWRcblxuICBsZXQgbW9kXG4gIHRyeSB7XG4gICAgbW9kID0gYXdhaXQgV2ViQXNzZW1ibHkuY29tcGlsZShyZXF1aXJlKCcuLi9sbGh0dHAvbGxodHRwX3NpbWQtd2FzbS5qcycpKVxuICB9IGNhdGNoIChlKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuICAgIC8vIFdlIGNvdWxkIGNoZWNrIGlmIHRoZSBlcnJvciB3YXMgY2F1c2VkIGJ5IHRoZSBzaW1kIG9wdGlvbiBub3RcbiAgICAvLyBiZWluZyBlbmFibGVkLCBidXQgdGhlIG9jY3VycmluZyBvZiB0aGlzIG90aGVyIGVycm9yXG4gICAgLy8gKiBodHRwczovL2dpdGh1Yi5jb20vZW1zY3JpcHRlbi1jb3JlL2Vtc2NyaXB0ZW4vaXNzdWVzLzExNDk1XG4gICAgLy8gZ290IG1lIHRvIHJlbW92ZSB0aGF0IGNoZWNrIHRvIGF2b2lkIGJyZWFraW5nIE5vZGUgMTIuXG4gICAgbW9kID0gYXdhaXQgV2ViQXNzZW1ibHkuY29tcGlsZShsbGh0dHBXYXNtRGF0YSB8fCByZXF1aXJlKCcuLi9sbGh0dHAvbGxodHRwLXdhc20uanMnKSlcbiAgfVxuXG4gIHJldHVybiBhd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShtb2QsIHtcbiAgICBlbnY6IHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuXG4gICAgICB3YXNtX29uX3VybDogKHAsIGF0LCBsZW4pID0+IHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH0sXG4gICAgICB3YXNtX29uX3N0YXR1czogKHAsIGF0LCBsZW4pID0+IHtcbiAgICAgICAgYXNzZXJ0KGN1cnJlbnRQYXJzZXIucHRyID09PSBwKVxuICAgICAgICBjb25zdCBzdGFydCA9IGF0IC0gY3VycmVudEJ1ZmZlclB0ciArIGN1cnJlbnRCdWZmZXJSZWYuYnl0ZU9mZnNldFxuICAgICAgICByZXR1cm4gY3VycmVudFBhcnNlci5vblN0YXR1cyhuZXcgRmFzdEJ1ZmZlcihjdXJyZW50QnVmZmVyUmVmLmJ1ZmZlciwgc3RhcnQsIGxlbikpIHx8IDBcbiAgICAgIH0sXG4gICAgICB3YXNtX29uX21lc3NhZ2VfYmVnaW46IChwKSA9PiB7XG4gICAgICAgIGFzc2VydChjdXJyZW50UGFyc2VyLnB0ciA9PT0gcClcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQYXJzZXIub25NZXNzYWdlQmVnaW4oKSB8fCAwXG4gICAgICB9LFxuICAgICAgd2FzbV9vbl9oZWFkZXJfZmllbGQ6IChwLCBhdCwgbGVuKSA9PiB7XG4gICAgICAgIGFzc2VydChjdXJyZW50UGFyc2VyLnB0ciA9PT0gcClcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBhdCAtIGN1cnJlbnRCdWZmZXJQdHIgKyBjdXJyZW50QnVmZmVyUmVmLmJ5dGVPZmZzZXRcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQYXJzZXIub25IZWFkZXJGaWVsZChuZXcgRmFzdEJ1ZmZlcihjdXJyZW50QnVmZmVyUmVmLmJ1ZmZlciwgc3RhcnQsIGxlbikpIHx8IDBcbiAgICAgIH0sXG4gICAgICB3YXNtX29uX2hlYWRlcl92YWx1ZTogKHAsIGF0LCBsZW4pID0+IHtcbiAgICAgICAgYXNzZXJ0KGN1cnJlbnRQYXJzZXIucHRyID09PSBwKVxuICAgICAgICBjb25zdCBzdGFydCA9IGF0IC0gY3VycmVudEJ1ZmZlclB0ciArIGN1cnJlbnRCdWZmZXJSZWYuYnl0ZU9mZnNldFxuICAgICAgICByZXR1cm4gY3VycmVudFBhcnNlci5vbkhlYWRlclZhbHVlKG5ldyBGYXN0QnVmZmVyKGN1cnJlbnRCdWZmZXJSZWYuYnVmZmVyLCBzdGFydCwgbGVuKSkgfHwgMFxuICAgICAgfSxcbiAgICAgIHdhc21fb25faGVhZGVyc19jb21wbGV0ZTogKHAsIHN0YXR1c0NvZGUsIHVwZ3JhZGUsIHNob3VsZEtlZXBBbGl2ZSkgPT4ge1xuICAgICAgICBhc3NlcnQoY3VycmVudFBhcnNlci5wdHIgPT09IHApXG4gICAgICAgIHJldHVybiBjdXJyZW50UGFyc2VyLm9uSGVhZGVyc0NvbXBsZXRlKHN0YXR1c0NvZGUsIEJvb2xlYW4odXBncmFkZSksIEJvb2xlYW4oc2hvdWxkS2VlcEFsaXZlKSkgfHwgMFxuICAgICAgfSxcbiAgICAgIHdhc21fb25fYm9keTogKHAsIGF0LCBsZW4pID0+IHtcbiAgICAgICAgYXNzZXJ0KGN1cnJlbnRQYXJzZXIucHRyID09PSBwKVxuICAgICAgICBjb25zdCBzdGFydCA9IGF0IC0gY3VycmVudEJ1ZmZlclB0ciArIGN1cnJlbnRCdWZmZXJSZWYuYnl0ZU9mZnNldFxuICAgICAgICByZXR1cm4gY3VycmVudFBhcnNlci5vbkJvZHkobmV3IEZhc3RCdWZmZXIoY3VycmVudEJ1ZmZlclJlZi5idWZmZXIsIHN0YXJ0LCBsZW4pKSB8fCAwXG4gICAgICB9LFxuICAgICAgd2FzbV9vbl9tZXNzYWdlX2NvbXBsZXRlOiAocCkgPT4ge1xuICAgICAgICBhc3NlcnQoY3VycmVudFBhcnNlci5wdHIgPT09IHApXG4gICAgICAgIHJldHVybiBjdXJyZW50UGFyc2VyLm9uTWVzc2FnZUNvbXBsZXRlKCkgfHwgMFxuICAgICAgfVxuXG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIGNhbWVsY2FzZSAqL1xuICAgIH1cbiAgfSlcbn1cblxubGV0IGxsaHR0cEluc3RhbmNlID0gbnVsbFxubGV0IGxsaHR0cFByb21pc2UgPSBsYXp5bGxodHRwKClcbmxsaHR0cFByb21pc2UuY2F0Y2goKVxuXG5sZXQgY3VycmVudFBhcnNlciA9IG51bGxcbmxldCBjdXJyZW50QnVmZmVyUmVmID0gbnVsbFxubGV0IGN1cnJlbnRCdWZmZXJTaXplID0gMFxubGV0IGN1cnJlbnRCdWZmZXJQdHIgPSBudWxsXG5cbmNvbnN0IFVTRV9OQVRJVkVfVElNRVIgPSAwXG5jb25zdCBVU0VfRkFTVF9USU1FUiA9IDFcblxuLy8gVXNlIGZhc3QgdGltZXJzIGZvciBoZWFkZXJzIGFuZCBib2R5IHRvIHRha2UgZXZlbnR1YWwgZXZlbnQgbG9vcFxuLy8gbGF0ZW5jeSBpbnRvIGFjY291bnQuXG5jb25zdCBUSU1FT1VUX0hFQURFUlMgPSAyIHwgVVNFX0ZBU1RfVElNRVJcbmNvbnN0IFRJTUVPVVRfQk9EWSA9IDQgfCBVU0VfRkFTVF9USU1FUlxuXG4vLyBVc2UgbmF0aXZlIHRpbWVycyB0byBpZ25vcmUgZXZlbnQgbG9vcCBsYXRlbmN5IGZvciBrZWVwLWFsaXZlXG4vLyBoYW5kbGluZy5cbmNvbnN0IFRJTUVPVVRfS0VFUF9BTElWRSA9IDggfCBVU0VfTkFUSVZFX1RJTUVSXG5cbmNsYXNzIFBhcnNlciB7XG4gIGNvbnN0cnVjdG9yIChjbGllbnQsIHNvY2tldCwgeyBleHBvcnRzIH0pIHtcbiAgICBhc3NlcnQoTnVtYmVyLmlzRmluaXRlKGNsaWVudFtrTWF4SGVhZGVyc1NpemVdKSAmJiBjbGllbnRba01heEhlYWRlcnNTaXplXSA+IDApXG5cbiAgICB0aGlzLmxsaHR0cCA9IGV4cG9ydHNcbiAgICB0aGlzLnB0ciA9IHRoaXMubGxodHRwLmxsaHR0cF9hbGxvYyhjb25zdGFudHMuVFlQRS5SRVNQT05TRSlcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudFxuICAgIHRoaXMuc29ja2V0ID0gc29ja2V0XG4gICAgdGhpcy50aW1lb3V0ID0gbnVsbFxuICAgIHRoaXMudGltZW91dFZhbHVlID0gbnVsbFxuICAgIHRoaXMudGltZW91dFR5cGUgPSBudWxsXG4gICAgdGhpcy5zdGF0dXNDb2RlID0gbnVsbFxuICAgIHRoaXMuc3RhdHVzVGV4dCA9ICcnXG4gICAgdGhpcy51cGdyYWRlID0gZmFsc2VcbiAgICB0aGlzLmhlYWRlcnMgPSBbXVxuICAgIHRoaXMuaGVhZGVyc1NpemUgPSAwXG4gICAgdGhpcy5oZWFkZXJzTWF4U2l6ZSA9IGNsaWVudFtrTWF4SGVhZGVyc1NpemVdXG4gICAgdGhpcy5zaG91bGRLZWVwQWxpdmUgPSBmYWxzZVxuICAgIHRoaXMucGF1c2VkID0gZmFsc2VcbiAgICB0aGlzLnJlc3VtZSA9IHRoaXMucmVzdW1lLmJpbmQodGhpcylcblxuICAgIHRoaXMuYnl0ZXNSZWFkID0gMFxuXG4gICAgdGhpcy5rZWVwQWxpdmUgPSAnJ1xuICAgIHRoaXMuY29udGVudExlbmd0aCA9ICcnXG4gICAgdGhpcy5jb25uZWN0aW9uID0gJydcbiAgICB0aGlzLm1heFJlc3BvbnNlU2l6ZSA9IGNsaWVudFtrTWF4UmVzcG9uc2VTaXplXVxuICB9XG5cbiAgc2V0VGltZW91dCAoZGVsYXksIHR5cGUpIHtcbiAgICAvLyBJZiB0aGUgZXhpc3RpbmcgdGltZXIgYW5kIHRoZSBuZXcgdGltZXIgYXJlIG9mIGRpZmZlcmVudCB0aW1lciB0eXBlXG4gICAgLy8gKGZhc3Qgb3IgbmF0aXZlKSBvciBoYXZlIGRpZmZlcmVudCBkZWxheSwgd2UgbmVlZCB0byBjbGVhciB0aGUgZXhpc3RpbmdcbiAgICAvLyB0aW1lciBhbmQgc2V0IGEgbmV3IG9uZS5cbiAgICBpZiAoXG4gICAgICBkZWxheSAhPT0gdGhpcy50aW1lb3V0VmFsdWUgfHxcbiAgICAgICh0eXBlICYgVVNFX0ZBU1RfVElNRVIpIF4gKHRoaXMudGltZW91dFR5cGUgJiBVU0VfRkFTVF9USU1FUilcbiAgICApIHtcbiAgICAgIC8vIElmIGEgdGltZW91dCBpcyBhbHJlYWR5IHNldCwgY2xlYXIgaXQgd2l0aCBjbGVhclRpbWVvdXQgb2YgdGhlIGZhc3RcbiAgICAgIC8vIHRpbWVyIGltcGxlbWVudGF0aW9uLCBhcyBpdCBjYW4gY2xlYXIgZmFzdCBhbmQgbmF0aXZlIHRpbWVycy5cbiAgICAgIGlmICh0aGlzLnRpbWVvdXQpIHtcbiAgICAgICAgdGltZXJzLmNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpXG4gICAgICAgIHRoaXMudGltZW91dCA9IG51bGxcbiAgICAgIH1cblxuICAgICAgaWYgKGRlbGF5KSB7XG4gICAgICAgIGlmICh0eXBlICYgVVNFX0ZBU1RfVElNRVIpIHtcbiAgICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lcnMuc2V0RmFzdFRpbWVvdXQob25QYXJzZXJUaW1lb3V0LCBkZWxheSwgbmV3IFdlYWtSZWYodGhpcykpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dChvblBhcnNlclRpbWVvdXQsIGRlbGF5LCBuZXcgV2Vha1JlZih0aGlzKSlcbiAgICAgICAgICB0aGlzLnRpbWVvdXQudW5yZWYoKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMudGltZW91dFZhbHVlID0gZGVsYXlcbiAgICB9IGVsc2UgaWYgKHRoaXMudGltZW91dCkge1xuICAgICAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2U6IG9ubHkgZm9yIGplc3RcbiAgICAgIGlmICh0aGlzLnRpbWVvdXQucmVmcmVzaCkge1xuICAgICAgICB0aGlzLnRpbWVvdXQucmVmcmVzaCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy50aW1lb3V0VHlwZSA9IHR5cGVcbiAgfVxuXG4gIHJlc3VtZSAoKSB7XG4gICAgaWYgKHRoaXMuc29ja2V0LmRlc3Ryb3llZCB8fCAhdGhpcy5wYXVzZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGFzc2VydCh0aGlzLnB0ciAhPSBudWxsKVxuICAgIGFzc2VydChjdXJyZW50UGFyc2VyID09IG51bGwpXG5cbiAgICB0aGlzLmxsaHR0cC5sbGh0dHBfcmVzdW1lKHRoaXMucHRyKVxuXG4gICAgYXNzZXJ0KHRoaXMudGltZW91dFR5cGUgPT09IFRJTUVPVVRfQk9EWSlcbiAgICBpZiAodGhpcy50aW1lb3V0KSB7XG4gICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZTogb25seSBmb3IgamVzdFxuICAgICAgaWYgKHRoaXMudGltZW91dC5yZWZyZXNoKSB7XG4gICAgICAgIHRoaXMudGltZW91dC5yZWZyZXNoKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnBhdXNlZCA9IGZhbHNlXG4gICAgdGhpcy5leGVjdXRlKHRoaXMuc29ja2V0LnJlYWQoKSB8fCBFTVBUWV9CVUYpIC8vIEZsdXNoIHBhcnNlci5cbiAgICB0aGlzLnJlYWRNb3JlKClcbiAgfVxuXG4gIHJlYWRNb3JlICgpIHtcbiAgICB3aGlsZSAoIXRoaXMucGF1c2VkICYmIHRoaXMucHRyKSB7XG4gICAgICBjb25zdCBjaHVuayA9IHRoaXMuc29ja2V0LnJlYWQoKVxuICAgICAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICB0aGlzLmV4ZWN1dGUoY2h1bmspXG4gICAgfVxuICB9XG5cbiAgZXhlY3V0ZSAoZGF0YSkge1xuICAgIGFzc2VydCh0aGlzLnB0ciAhPSBudWxsKVxuICAgIGFzc2VydChjdXJyZW50UGFyc2VyID09IG51bGwpXG4gICAgYXNzZXJ0KCF0aGlzLnBhdXNlZClcblxuICAgIGNvbnN0IHsgc29ja2V0LCBsbGh0dHAgfSA9IHRoaXNcblxuICAgIGlmIChkYXRhLmxlbmd0aCA+IGN1cnJlbnRCdWZmZXJTaXplKSB7XG4gICAgICBpZiAoY3VycmVudEJ1ZmZlclB0cikge1xuICAgICAgICBsbGh0dHAuZnJlZShjdXJyZW50QnVmZmVyUHRyKVxuICAgICAgfVxuICAgICAgY3VycmVudEJ1ZmZlclNpemUgPSBNYXRoLmNlaWwoZGF0YS5sZW5ndGggLyA0MDk2KSAqIDQwOTZcbiAgICAgIGN1cnJlbnRCdWZmZXJQdHIgPSBsbGh0dHAubWFsbG9jKGN1cnJlbnRCdWZmZXJTaXplKVxuICAgIH1cblxuICAgIG5ldyBVaW50OEFycmF5KGxsaHR0cC5tZW1vcnkuYnVmZmVyLCBjdXJyZW50QnVmZmVyUHRyLCBjdXJyZW50QnVmZmVyU2l6ZSkuc2V0KGRhdGEpXG5cbiAgICAvLyBDYWxsIGBleGVjdXRlYCBvbiB0aGUgd2FzbSBwYXJzZXIuXG4gICAgLy8gV2UgcGFzcyB0aGUgYGxsaHR0cF9wYXJzZXJgIHBvaW50ZXIgYWRkcmVzcywgdGhlIHBvaW50ZXIgYWRkcmVzcyBvZiBidWZmZXIgdmlldyBkYXRhLFxuICAgIC8vIGFuZCBmaW5hbGx5IHRoZSBsZW5ndGggb2YgYnl0ZXMgdG8gcGFyc2UuXG4gICAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBhbiBlcnJvciBjb2RlIG9yIGBjb25zdGFudHMuRVJST1IuT0tgLlxuICAgIHRyeSB7XG4gICAgICBsZXQgcmV0XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGN1cnJlbnRCdWZmZXJSZWYgPSBkYXRhXG4gICAgICAgIGN1cnJlbnRQYXJzZXIgPSB0aGlzXG4gICAgICAgIHJldCA9IGxsaHR0cC5sbGh0dHBfZXhlY3V0ZSh0aGlzLnB0ciwgY3VycmVudEJ1ZmZlclB0ciwgZGF0YS5sZW5ndGgpXG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLWNhdGNoICovXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGRpZmZpY3VsdCB0byBtYWtlIGEgdGVzdCBjYXNlIGZvciAqL1xuICAgICAgICB0aHJvdyBlcnJcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGN1cnJlbnRQYXJzZXIgPSBudWxsXG4gICAgICAgIGN1cnJlbnRCdWZmZXJSZWYgPSBudWxsXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9mZnNldCA9IGxsaHR0cC5sbGh0dHBfZ2V0X2Vycm9yX3Bvcyh0aGlzLnB0cikgLSBjdXJyZW50QnVmZmVyUHRyXG5cbiAgICAgIGlmIChyZXQgPT09IGNvbnN0YW50cy5FUlJPUi5QQVVTRURfVVBHUkFERSkge1xuICAgICAgICB0aGlzLm9uVXBncmFkZShkYXRhLnNsaWNlKG9mZnNldCkpXG4gICAgICB9IGVsc2UgaWYgKHJldCA9PT0gY29uc3RhbnRzLkVSUk9SLlBBVVNFRCkge1xuICAgICAgICB0aGlzLnBhdXNlZCA9IHRydWVcbiAgICAgICAgc29ja2V0LnVuc2hpZnQoZGF0YS5zbGljZShvZmZzZXQpKVxuICAgICAgfSBlbHNlIGlmIChyZXQgIT09IGNvbnN0YW50cy5FUlJPUi5PSykge1xuICAgICAgICBjb25zdCBwdHIgPSBsbGh0dHAubGxodHRwX2dldF9lcnJvcl9yZWFzb24odGhpcy5wdHIpXG4gICAgICAgIGxldCBtZXNzYWdlID0gJydcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2U6IGRpZmZpY3VsdCB0byBtYWtlIGEgdGVzdCBjYXNlIGZvciAqL1xuICAgICAgICBpZiAocHRyKSB7XG4gICAgICAgICAgY29uc3QgbGVuID0gbmV3IFVpbnQ4QXJyYXkobGxodHRwLm1lbW9yeS5idWZmZXIsIHB0cikuaW5kZXhPZigwKVxuICAgICAgICAgIG1lc3NhZ2UgPVxuICAgICAgICAgICAgJ1Jlc3BvbnNlIGRvZXMgbm90IG1hdGNoIHRoZSBIVFRQLzEuMSBwcm90b2NvbCAoJyArXG4gICAgICAgICAgICBCdWZmZXIuZnJvbShsbGh0dHAubWVtb3J5LmJ1ZmZlciwgcHRyLCBsZW4pLnRvU3RyaW5nKCkgK1xuICAgICAgICAgICAgJyknXG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEhUVFBQYXJzZXJFcnJvcihtZXNzYWdlLCBjb25zdGFudHMuRVJST1JbcmV0XSwgZGF0YS5zbGljZShvZmZzZXQpKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdXRpbC5kZXN0cm95KHNvY2tldCwgZXJyKVxuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3kgKCkge1xuICAgIGFzc2VydCh0aGlzLnB0ciAhPSBudWxsKVxuICAgIGFzc2VydChjdXJyZW50UGFyc2VyID09IG51bGwpXG5cbiAgICB0aGlzLmxsaHR0cC5sbGh0dHBfZnJlZSh0aGlzLnB0cilcbiAgICB0aGlzLnB0ciA9IG51bGxcblxuICAgIHRoaXMudGltZW91dCAmJiB0aW1lcnMuY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dClcbiAgICB0aGlzLnRpbWVvdXQgPSBudWxsXG4gICAgdGhpcy50aW1lb3V0VmFsdWUgPSBudWxsXG4gICAgdGhpcy50aW1lb3V0VHlwZSA9IG51bGxcblxuICAgIHRoaXMucGF1c2VkID0gZmFsc2VcbiAgfVxuXG4gIG9uU3RhdHVzIChidWYpIHtcbiAgICB0aGlzLnN0YXR1c1RleHQgPSBidWYudG9TdHJpbmcoKVxuICB9XG5cbiAgb25NZXNzYWdlQmVnaW4gKCkge1xuICAgIGNvbnN0IHsgc29ja2V0LCBjbGllbnQgfSA9IHRoaXNcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBkaWZmaWN1bHQgdG8gbWFrZSBhIHRlc3QgY2FzZSBmb3IgKi9cbiAgICBpZiAoc29ja2V0LmRlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdCA9IGNsaWVudFtrUXVldWVdW2NsaWVudFtrUnVubmluZ0lkeF1dXG4gICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gICAgcmVxdWVzdC5vblJlc3BvbnNlU3RhcnRlZCgpXG4gIH1cblxuICBvbkhlYWRlckZpZWxkIChidWYpIHtcbiAgICBjb25zdCBsZW4gPSB0aGlzLmhlYWRlcnMubGVuZ3RoXG5cbiAgICBpZiAoKGxlbiAmIDEpID09PSAwKSB7XG4gICAgICB0aGlzLmhlYWRlcnMucHVzaChidWYpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGVhZGVyc1tsZW4gLSAxXSA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuaGVhZGVyc1tsZW4gLSAxXSwgYnVmXSlcbiAgICB9XG5cbiAgICB0aGlzLnRyYWNrSGVhZGVyKGJ1Zi5sZW5ndGgpXG4gIH1cblxuICBvbkhlYWRlclZhbHVlIChidWYpIHtcbiAgICBsZXQgbGVuID0gdGhpcy5oZWFkZXJzLmxlbmd0aFxuXG4gICAgaWYgKChsZW4gJiAxKSA9PT0gMSkge1xuICAgICAgdGhpcy5oZWFkZXJzLnB1c2goYnVmKVxuICAgICAgbGVuICs9IDFcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWFkZXJzW2xlbiAtIDFdID0gQnVmZmVyLmNvbmNhdChbdGhpcy5oZWFkZXJzW2xlbiAtIDFdLCBidWZdKVxuICAgIH1cblxuICAgIGNvbnN0IGtleSA9IHRoaXMuaGVhZGVyc1tsZW4gLSAyXVxuICAgIGlmIChrZXkubGVuZ3RoID09PSAxMCkge1xuICAgICAgY29uc3QgaGVhZGVyTmFtZSA9IHV0aWwuYnVmZmVyVG9Mb3dlckNhc2VkSGVhZGVyTmFtZShrZXkpXG4gICAgICBpZiAoaGVhZGVyTmFtZSA9PT0gJ2tlZXAtYWxpdmUnKSB7XG4gICAgICAgIHRoaXMua2VlcEFsaXZlICs9IGJ1Zi50b1N0cmluZygpXG4gICAgICB9IGVsc2UgaWYgKGhlYWRlck5hbWUgPT09ICdjb25uZWN0aW9uJykge1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24gKz0gYnVmLnRvU3RyaW5nKClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGtleS5sZW5ndGggPT09IDE0ICYmIHV0aWwuYnVmZmVyVG9Mb3dlckNhc2VkSGVhZGVyTmFtZShrZXkpID09PSAnY29udGVudC1sZW5ndGgnKSB7XG4gICAgICB0aGlzLmNvbnRlbnRMZW5ndGggKz0gYnVmLnRvU3RyaW5nKClcbiAgICB9XG5cbiAgICB0aGlzLnRyYWNrSGVhZGVyKGJ1Zi5sZW5ndGgpXG4gIH1cblxuICB0cmFja0hlYWRlciAobGVuKSB7XG4gICAgdGhpcy5oZWFkZXJzU2l6ZSArPSBsZW5cbiAgICBpZiAodGhpcy5oZWFkZXJzU2l6ZSA+PSB0aGlzLmhlYWRlcnNNYXhTaXplKSB7XG4gICAgICB1dGlsLmRlc3Ryb3kodGhpcy5zb2NrZXQsIG5ldyBIZWFkZXJzT3ZlcmZsb3dFcnJvcigpKVxuICAgIH1cbiAgfVxuXG4gIG9uVXBncmFkZSAoaGVhZCkge1xuICAgIGNvbnN0IHsgdXBncmFkZSwgY2xpZW50LCBzb2NrZXQsIGhlYWRlcnMsIHN0YXR1c0NvZGUgfSA9IHRoaXNcblxuICAgIGFzc2VydCh1cGdyYWRlKVxuICAgIGFzc2VydChjbGllbnRba1NvY2tldF0gPT09IHNvY2tldClcbiAgICBhc3NlcnQoIXNvY2tldC5kZXN0cm95ZWQpXG4gICAgYXNzZXJ0KCF0aGlzLnBhdXNlZClcbiAgICBhc3NlcnQoKGhlYWRlcnMubGVuZ3RoICYgMSkgPT09IDApXG5cbiAgICBjb25zdCByZXF1ZXN0ID0gY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XV1cbiAgICBhc3NlcnQocmVxdWVzdClcbiAgICBhc3NlcnQocmVxdWVzdC51cGdyYWRlIHx8IHJlcXVlc3QubWV0aG9kID09PSAnQ09OTkVDVCcpXG5cbiAgICB0aGlzLnN0YXR1c0NvZGUgPSBudWxsXG4gICAgdGhpcy5zdGF0dXNUZXh0ID0gJydcbiAgICB0aGlzLnNob3VsZEtlZXBBbGl2ZSA9IG51bGxcblxuICAgIHRoaXMuaGVhZGVycyA9IFtdXG4gICAgdGhpcy5oZWFkZXJzU2l6ZSA9IDBcblxuICAgIHNvY2tldC51bnNoaWZ0KGhlYWQpXG5cbiAgICBzb2NrZXRba1BhcnNlcl0uZGVzdHJveSgpXG4gICAgc29ja2V0W2tQYXJzZXJdID0gbnVsbFxuXG4gICAgc29ja2V0W2tDbGllbnRdID0gbnVsbFxuICAgIHNvY2tldFtrRXJyb3JdID0gbnVsbFxuXG4gICAgcmVtb3ZlQWxsTGlzdGVuZXJzKHNvY2tldClcblxuICAgIGNsaWVudFtrU29ja2V0XSA9IG51bGxcbiAgICBjbGllbnRba0hUVFBDb250ZXh0XSA9IG51bGwgLy8gVE9ETyAoZml4KTogVGhpcyBpcyBoYWNreS4uLlxuICAgIGNsaWVudFtrUXVldWVdW2NsaWVudFtrUnVubmluZ0lkeF0rK10gPSBudWxsXG4gICAgY2xpZW50LmVtaXQoJ2Rpc2Nvbm5lY3QnLCBjbGllbnRba1VybF0sIFtjbGllbnRdLCBuZXcgSW5mb3JtYXRpb25hbEVycm9yKCd1cGdyYWRlJykpXG5cbiAgICB0cnkge1xuICAgICAgcmVxdWVzdC5vblVwZ3JhZGUoc3RhdHVzQ29kZSwgaGVhZGVycywgc29ja2V0KVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdXRpbC5kZXN0cm95KHNvY2tldCwgZXJyKVxuICAgIH1cblxuICAgIGNsaWVudFtrUmVzdW1lXSgpXG4gIH1cblxuICBvbkhlYWRlcnNDb21wbGV0ZSAoc3RhdHVzQ29kZSwgdXBncmFkZSwgc2hvdWxkS2VlcEFsaXZlKSB7XG4gICAgY29uc3QgeyBjbGllbnQsIHNvY2tldCwgaGVhZGVycywgc3RhdHVzVGV4dCB9ID0gdGhpc1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGRpZmZpY3VsdCB0byBtYWtlIGEgdGVzdCBjYXNlIGZvciAqL1xuICAgIGlmIChzb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XV1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBkaWZmaWN1bHQgdG8gbWFrZSBhIHRlc3QgY2FzZSBmb3IgKi9cbiAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cblxuICAgIGFzc2VydCghdGhpcy51cGdyYWRlKVxuICAgIGFzc2VydCh0aGlzLnN0YXR1c0NvZGUgPCAyMDApXG5cbiAgICBpZiAoc3RhdHVzQ29kZSA9PT0gMTAwKSB7XG4gICAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgU29ja2V0RXJyb3IoJ2JhZCByZXNwb25zZScsIHV0aWwuZ2V0U29ja2V0SW5mbyhzb2NrZXQpKSlcbiAgICAgIHJldHVybiAtMVxuICAgIH1cblxuICAgIC8qIHRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHNlcnZlciBpcyBtaXNiZWhhdmluZyAqL1xuICAgIGlmICh1cGdyYWRlICYmICFyZXF1ZXN0LnVwZ3JhZGUpIHtcbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIG5ldyBTb2NrZXRFcnJvcignYmFkIHVwZ3JhZGUnLCB1dGlsLmdldFNvY2tldEluZm8oc29ja2V0KSkpXG4gICAgICByZXR1cm4gLTFcbiAgICB9XG5cbiAgICBhc3NlcnQodGhpcy50aW1lb3V0VHlwZSA9PT0gVElNRU9VVF9IRUFERVJTKVxuXG4gICAgdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZVxuICAgIHRoaXMuc2hvdWxkS2VlcEFsaXZlID0gKFxuICAgICAgc2hvdWxkS2VlcEFsaXZlIHx8XG4gICAgICAvLyBPdmVycmlkZSBsbGh0dHAgdmFsdWUgd2hpY2ggZG9lcyBub3QgYWxsb3cga2VlcEFsaXZlIGZvciBIRUFELlxuICAgICAgKHJlcXVlc3QubWV0aG9kID09PSAnSEVBRCcgJiYgIXNvY2tldFtrUmVzZXRdICYmIHRoaXMuY29ubmVjdGlvbi50b0xvd2VyQ2FzZSgpID09PSAna2VlcC1hbGl2ZScpXG4gICAgKVxuXG4gICAgaWYgKHRoaXMuc3RhdHVzQ29kZSA+PSAyMDApIHtcbiAgICAgIGNvbnN0IGJvZHlUaW1lb3V0ID0gcmVxdWVzdC5ib2R5VGltZW91dCAhPSBudWxsXG4gICAgICAgID8gcmVxdWVzdC5ib2R5VGltZW91dFxuICAgICAgICA6IGNsaWVudFtrQm9keVRpbWVvdXRdXG4gICAgICB0aGlzLnNldFRpbWVvdXQoYm9keVRpbWVvdXQsIFRJTUVPVVRfQk9EWSlcbiAgICB9IGVsc2UgaWYgKHRoaXMudGltZW91dCkge1xuICAgICAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2U6IG9ubHkgZm9yIGplc3RcbiAgICAgIGlmICh0aGlzLnRpbWVvdXQucmVmcmVzaCkge1xuICAgICAgICB0aGlzLnRpbWVvdXQucmVmcmVzaCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3QubWV0aG9kID09PSAnQ09OTkVDVCcpIHtcbiAgICAgIGFzc2VydChjbGllbnRba1J1bm5pbmddID09PSAxKVxuICAgICAgdGhpcy51cGdyYWRlID0gdHJ1ZVxuICAgICAgcmV0dXJuIDJcbiAgICB9XG5cbiAgICBpZiAodXBncmFkZSkge1xuICAgICAgYXNzZXJ0KGNsaWVudFtrUnVubmluZ10gPT09IDEpXG4gICAgICB0aGlzLnVwZ3JhZGUgPSB0cnVlXG4gICAgICByZXR1cm4gMlxuICAgIH1cblxuICAgIGFzc2VydCgodGhpcy5oZWFkZXJzLmxlbmd0aCAmIDEpID09PSAwKVxuICAgIHRoaXMuaGVhZGVycyA9IFtdXG4gICAgdGhpcy5oZWFkZXJzU2l6ZSA9IDBcblxuICAgIGlmICh0aGlzLnNob3VsZEtlZXBBbGl2ZSAmJiBjbGllbnRba1BpcGVsaW5pbmddKSB7XG4gICAgICBjb25zdCBrZWVwQWxpdmVUaW1lb3V0ID0gdGhpcy5rZWVwQWxpdmUgPyB1dGlsLnBhcnNlS2VlcEFsaXZlVGltZW91dCh0aGlzLmtlZXBBbGl2ZSkgOiBudWxsXG5cbiAgICAgIGlmIChrZWVwQWxpdmVUaW1lb3V0ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IE1hdGgubWluKFxuICAgICAgICAgIGtlZXBBbGl2ZVRpbWVvdXQgLSBjbGllbnRba0tlZXBBbGl2ZVRpbWVvdXRUaHJlc2hvbGRdLFxuICAgICAgICAgIGNsaWVudFtrS2VlcEFsaXZlTWF4VGltZW91dF1cbiAgICAgICAgKVxuICAgICAgICBpZiAodGltZW91dCA8PSAwKSB7XG4gICAgICAgICAgc29ja2V0W2tSZXNldF0gPSB0cnVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2xpZW50W2tLZWVwQWxpdmVUaW1lb3V0VmFsdWVdID0gdGltZW91dFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGllbnRba0tlZXBBbGl2ZVRpbWVvdXRWYWx1ZV0gPSBjbGllbnRba0tlZXBBbGl2ZURlZmF1bHRUaW1lb3V0XVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdG9wIG1vcmUgcmVxdWVzdHMgZnJvbSBiZWluZyBkaXNwYXRjaGVkLlxuICAgICAgc29ja2V0W2tSZXNldF0gPSB0cnVlXG4gICAgfVxuXG4gICAgY29uc3QgcGF1c2UgPSByZXF1ZXN0Lm9uSGVhZGVycyhzdGF0dXNDb2RlLCBoZWFkZXJzLCB0aGlzLnJlc3VtZSwgc3RhdHVzVGV4dCkgPT09IGZhbHNlXG5cbiAgICBpZiAocmVxdWVzdC5hYm9ydGVkKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5tZXRob2QgPT09ICdIRUFEJykge1xuICAgICAgcmV0dXJuIDFcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzQ29kZSA8IDIwMCkge1xuICAgICAgcmV0dXJuIDFcbiAgICB9XG5cbiAgICBpZiAoc29ja2V0W2tCbG9ja2luZ10pIHtcbiAgICAgIHNvY2tldFtrQmxvY2tpbmddID0gZmFsc2VcbiAgICAgIGNsaWVudFtrUmVzdW1lXSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdXNlID8gY29uc3RhbnRzLkVSUk9SLlBBVVNFRCA6IDBcbiAgfVxuXG4gIG9uQm9keSAoYnVmKSB7XG4gICAgY29uc3QgeyBjbGllbnQsIHNvY2tldCwgc3RhdHVzQ29kZSwgbWF4UmVzcG9uc2VTaXplIH0gPSB0aGlzXG5cbiAgICBpZiAoc29ja2V0LmRlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdCA9IGNsaWVudFtrUXVldWVdW2NsaWVudFtrUnVubmluZ0lkeF1dXG4gICAgYXNzZXJ0KHJlcXVlc3QpXG5cbiAgICBhc3NlcnQodGhpcy50aW1lb3V0VHlwZSA9PT0gVElNRU9VVF9CT0RZKVxuICAgIGlmICh0aGlzLnRpbWVvdXQpIHtcbiAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBvbmx5IGZvciBqZXN0XG4gICAgICBpZiAodGhpcy50aW1lb3V0LnJlZnJlc2gpIHtcbiAgICAgICAgdGhpcy50aW1lb3V0LnJlZnJlc2goKVxuICAgICAgfVxuICAgIH1cblxuICAgIGFzc2VydChzdGF0dXNDb2RlID49IDIwMClcblxuICAgIGlmIChtYXhSZXNwb25zZVNpemUgPiAtMSAmJiB0aGlzLmJ5dGVzUmVhZCArIGJ1Zi5sZW5ndGggPiBtYXhSZXNwb25zZVNpemUpIHtcbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIG5ldyBSZXNwb25zZUV4Y2VlZGVkTWF4U2l6ZUVycm9yKCkpXG4gICAgICByZXR1cm4gLTFcbiAgICB9XG5cbiAgICB0aGlzLmJ5dGVzUmVhZCArPSBidWYubGVuZ3RoXG5cbiAgICBpZiAocmVxdWVzdC5vbkRhdGEoYnVmKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBjb25zdGFudHMuRVJST1IuUEFVU0VEXG4gICAgfVxuICB9XG5cbiAgb25NZXNzYWdlQ29tcGxldGUgKCkge1xuICAgIGNvbnN0IHsgY2xpZW50LCBzb2NrZXQsIHN0YXR1c0NvZGUsIHVwZ3JhZGUsIGhlYWRlcnMsIGNvbnRlbnRMZW5ndGgsIGJ5dGVzUmVhZCwgc2hvdWxkS2VlcEFsaXZlIH0gPSB0aGlzXG5cbiAgICBpZiAoc29ja2V0LmRlc3Ryb3llZCAmJiAoIXN0YXR1c0NvZGUgfHwgc2hvdWxkS2VlcEFsaXZlKSkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuXG4gICAgaWYgKHVwZ3JhZGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGFzc2VydChzdGF0dXNDb2RlID49IDEwMClcbiAgICBhc3NlcnQoKHRoaXMuaGVhZGVycy5sZW5ndGggJiAxKSA9PT0gMClcblxuICAgIGNvbnN0IHJlcXVlc3QgPSBjbGllbnRba1F1ZXVlXVtjbGllbnRba1J1bm5pbmdJZHhdXVxuICAgIGFzc2VydChyZXF1ZXN0KVxuXG4gICAgdGhpcy5zdGF0dXNDb2RlID0gbnVsbFxuICAgIHRoaXMuc3RhdHVzVGV4dCA9ICcnXG4gICAgdGhpcy5ieXRlc1JlYWQgPSAwXG4gICAgdGhpcy5jb250ZW50TGVuZ3RoID0gJydcbiAgICB0aGlzLmtlZXBBbGl2ZSA9ICcnXG4gICAgdGhpcy5jb25uZWN0aW9uID0gJydcblxuICAgIHRoaXMuaGVhZGVycyA9IFtdXG4gICAgdGhpcy5oZWFkZXJzU2l6ZSA9IDBcblxuICAgIGlmIChzdGF0dXNDb2RlIDwgMjAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogc2hvdWxkIGJlIGhhbmRsZWQgYnkgbGxodHRwPyAqL1xuICAgIGlmIChyZXF1ZXN0Lm1ldGhvZCAhPT0gJ0hFQUQnICYmIGNvbnRlbnRMZW5ndGggJiYgYnl0ZXNSZWFkICE9PSBwYXJzZUludChjb250ZW50TGVuZ3RoLCAxMCkpIHtcbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIG5ldyBSZXNwb25zZUNvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yKCkpXG4gICAgICByZXR1cm4gLTFcbiAgICB9XG5cbiAgICByZXF1ZXN0Lm9uQ29tcGxldGUoaGVhZGVycylcblxuICAgIGNsaWVudFtrUXVldWVdW2NsaWVudFtrUnVubmluZ0lkeF0rK10gPSBudWxsXG5cbiAgICBpZiAoc29ja2V0W2tXcml0aW5nXSkge1xuICAgICAgYXNzZXJ0KGNsaWVudFtrUnVubmluZ10gPT09IDApXG4gICAgICAvLyBSZXNwb25zZSBjb21wbGV0ZWQgYmVmb3JlIHJlcXVlc3QuXG4gICAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgSW5mb3JtYXRpb25hbEVycm9yKCdyZXNldCcpKVxuICAgICAgcmV0dXJuIGNvbnN0YW50cy5FUlJPUi5QQVVTRURcbiAgICB9IGVsc2UgaWYgKCFzaG91bGRLZWVwQWxpdmUpIHtcbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIG5ldyBJbmZvcm1hdGlvbmFsRXJyb3IoJ3Jlc2V0JykpXG4gICAgICByZXR1cm4gY29uc3RhbnRzLkVSUk9SLlBBVVNFRFxuICAgIH0gZWxzZSBpZiAoc29ja2V0W2tSZXNldF0gJiYgY2xpZW50W2tSdW5uaW5nXSA9PT0gMCkge1xuICAgICAgLy8gRGVzdHJveSBzb2NrZXQgb25jZSBhbGwgcmVxdWVzdHMgaGF2ZSBjb21wbGV0ZWQuXG4gICAgICAvLyBUaGUgcmVxdWVzdCBhdCB0aGUgdGFpbCBvZiB0aGUgcGlwZWxpbmUgaXMgdGhlIG9uZVxuICAgICAgLy8gdGhhdCByZXF1ZXN0ZWQgcmVzZXQgYW5kIG5vIGZ1cnRoZXIgcmVxdWVzdHMgc2hvdWxkXG4gICAgICAvLyBoYXZlIGJlZW4gcXVldWVkIHNpbmNlIHRoZW4uXG4gICAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgSW5mb3JtYXRpb25hbEVycm9yKCdyZXNldCcpKVxuICAgICAgcmV0dXJuIGNvbnN0YW50cy5FUlJPUi5QQVVTRURcbiAgICB9IGVsc2UgaWYgKGNsaWVudFtrUGlwZWxpbmluZ10gPT0gbnVsbCB8fCBjbGllbnRba1BpcGVsaW5pbmddID09PSAxKSB7XG4gICAgICAvLyBXZSBtdXN0IHdhaXQgYSBmdWxsIGV2ZW50IGxvb3AgY3ljbGUgdG8gcmV1c2UgdGhpcyBzb2NrZXQgdG8gbWFrZSBzdXJlXG4gICAgICAvLyB0aGF0IG5vbi1zcGVjIGNvbXBsaWFudCBzZXJ2ZXJzIGFyZSBub3QgY2xvc2luZyB0aGUgY29ubmVjdGlvbiBldmVuIGlmIHRoZXlcbiAgICAgIC8vIHNhaWQgdGhleSB3b24ndC5cbiAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiBjbGllbnRba1Jlc3VtZV0oKSlcbiAgICB9IGVsc2Uge1xuICAgICAgY2xpZW50W2tSZXN1bWVdKClcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gb25QYXJzZXJUaW1lb3V0IChwYXJzZXIpIHtcbiAgY29uc3QgeyBzb2NrZXQsIHRpbWVvdXRUeXBlLCBjbGllbnQsIHBhdXNlZCB9ID0gcGFyc2VyLmRlcmVmKClcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAodGltZW91dFR5cGUgPT09IFRJTUVPVVRfSEVBREVSUykge1xuICAgIGlmICghc29ja2V0W2tXcml0aW5nXSB8fCBzb2NrZXQud3JpdGFibGVOZWVkRHJhaW4gfHwgY2xpZW50W2tSdW5uaW5nXSA+IDEpIHtcbiAgICAgIGFzc2VydCghcGF1c2VkLCAnY2Fubm90IGJlIHBhdXNlZCB3aGlsZSB3YWl0aW5nIGZvciBoZWFkZXJzJylcbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIG5ldyBIZWFkZXJzVGltZW91dEVycm9yKCkpXG4gICAgfVxuICB9IGVsc2UgaWYgKHRpbWVvdXRUeXBlID09PSBUSU1FT1VUX0JPRFkpIHtcbiAgICBpZiAoIXBhdXNlZCkge1xuICAgICAgdXRpbC5kZXN0cm95KHNvY2tldCwgbmV3IEJvZHlUaW1lb3V0RXJyb3IoKSlcbiAgICB9XG4gIH0gZWxzZSBpZiAodGltZW91dFR5cGUgPT09IFRJTUVPVVRfS0VFUF9BTElWRSkge1xuICAgIGFzc2VydChjbGllbnRba1J1bm5pbmddID09PSAwICYmIGNsaWVudFtrS2VlcEFsaXZlVGltZW91dFZhbHVlXSlcbiAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgSW5mb3JtYXRpb25hbEVycm9yKCdzb2NrZXQgaWRsZSB0aW1lb3V0JykpXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY29ubmVjdEgxIChjbGllbnQsIHNvY2tldCkge1xuICBjbGllbnRba1NvY2tldF0gPSBzb2NrZXRcblxuICBpZiAoIWxsaHR0cEluc3RhbmNlKSB7XG4gICAgbGxodHRwSW5zdGFuY2UgPSBhd2FpdCBsbGh0dHBQcm9taXNlXG4gICAgbGxodHRwUHJvbWlzZSA9IG51bGxcbiAgfVxuXG4gIHNvY2tldFtrTm9SZWZdID0gZmFsc2VcbiAgc29ja2V0W2tXcml0aW5nXSA9IGZhbHNlXG4gIHNvY2tldFtrUmVzZXRdID0gZmFsc2VcbiAgc29ja2V0W2tCbG9ja2luZ10gPSBmYWxzZVxuICBzb2NrZXRba1BhcnNlcl0gPSBuZXcgUGFyc2VyKGNsaWVudCwgc29ja2V0LCBsbGh0dHBJbnN0YW5jZSlcblxuICBhZGRMaXN0ZW5lcihzb2NrZXQsICdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBhc3NlcnQoZXJyLmNvZGUgIT09ICdFUlJfVExTX0NFUlRfQUxUTkFNRV9JTlZBTElEJylcblxuICAgIGNvbnN0IHBhcnNlciA9IHRoaXNba1BhcnNlcl1cblxuICAgIC8vIE9uIE1hYyBPUywgd2UgZ2V0IGFuIEVDT05OUkVTRVQgZXZlbiBpZiB0aGVyZSBpcyBhIGZ1bGwgYm9keSB0byBiZSBmb3J3YXJkZWRcbiAgICAvLyB0byB0aGUgdXNlci5cbiAgICBpZiAoZXJyLmNvZGUgPT09ICdFQ09OTlJFU0VUJyAmJiBwYXJzZXIuc3RhdHVzQ29kZSAmJiAhcGFyc2VyLnNob3VsZEtlZXBBbGl2ZSkge1xuICAgICAgLy8gV2UgdHJlYXQgYWxsIGluY29taW5nIGRhdGEgc28gZm9yIGFzIGEgdmFsaWQgcmVzcG9uc2UuXG4gICAgICBwYXJzZXIub25NZXNzYWdlQ29tcGxldGUoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpc1trRXJyb3JdID0gZXJyXG5cbiAgICB0aGlzW2tDbGllbnRdW2tPbkVycm9yXShlcnIpXG4gIH0pXG4gIGFkZExpc3RlbmVyKHNvY2tldCwgJ3JlYWRhYmxlJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHBhcnNlciA9IHRoaXNba1BhcnNlcl1cblxuICAgIGlmIChwYXJzZXIpIHtcbiAgICAgIHBhcnNlci5yZWFkTW9yZSgpXG4gICAgfVxuICB9KVxuICBhZGRMaXN0ZW5lcihzb2NrZXQsICdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcGFyc2VyID0gdGhpc1trUGFyc2VyXVxuXG4gICAgaWYgKHBhcnNlci5zdGF0dXNDb2RlICYmICFwYXJzZXIuc2hvdWxkS2VlcEFsaXZlKSB7XG4gICAgICAvLyBXZSB0cmVhdCBhbGwgaW5jb21pbmcgZGF0YSBzbyBmYXIgYXMgYSB2YWxpZCByZXNwb25zZS5cbiAgICAgIHBhcnNlci5vbk1lc3NhZ2VDb21wbGV0ZSgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB1dGlsLmRlc3Ryb3kodGhpcywgbmV3IFNvY2tldEVycm9yKCdvdGhlciBzaWRlIGNsb3NlZCcsIHV0aWwuZ2V0U29ja2V0SW5mbyh0aGlzKSkpXG4gIH0pXG4gIGFkZExpc3RlbmVyKHNvY2tldCwgJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXNba0NsaWVudF1cbiAgICBjb25zdCBwYXJzZXIgPSB0aGlzW2tQYXJzZXJdXG5cbiAgICBpZiAocGFyc2VyKSB7XG4gICAgICBpZiAoIXRoaXNba0Vycm9yXSAmJiBwYXJzZXIuc3RhdHVzQ29kZSAmJiAhcGFyc2VyLnNob3VsZEtlZXBBbGl2ZSkge1xuICAgICAgICAvLyBXZSB0cmVhdCBhbGwgaW5jb21pbmcgZGF0YSBzbyBmYXIgYXMgYSB2YWxpZCByZXNwb25zZS5cbiAgICAgICAgcGFyc2VyLm9uTWVzc2FnZUNvbXBsZXRlKClcbiAgICAgIH1cblxuICAgICAgdGhpc1trUGFyc2VyXS5kZXN0cm95KClcbiAgICAgIHRoaXNba1BhcnNlcl0gPSBudWxsXG4gICAgfVxuXG4gICAgY29uc3QgZXJyID0gdGhpc1trRXJyb3JdIHx8IG5ldyBTb2NrZXRFcnJvcignY2xvc2VkJywgdXRpbC5nZXRTb2NrZXRJbmZvKHRoaXMpKVxuXG4gICAgY2xpZW50W2tTb2NrZXRdID0gbnVsbFxuICAgIGNsaWVudFtrSFRUUENvbnRleHRdID0gbnVsbCAvLyBUT0RPIChmaXgpOiBUaGlzIGlzIGhhY2t5Li4uXG5cbiAgICBpZiAoY2xpZW50LmRlc3Ryb3llZCkge1xuICAgICAgYXNzZXJ0KGNsaWVudFtrUGVuZGluZ10gPT09IDApXG5cbiAgICAgIC8vIEZhaWwgZW50aXJlIHF1ZXVlLlxuICAgICAgY29uc3QgcmVxdWVzdHMgPSBjbGllbnRba1F1ZXVlXS5zcGxpY2UoY2xpZW50W2tSdW5uaW5nSWR4XSlcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVxdWVzdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHJlcXVlc3RzW2ldXG4gICAgICAgIHV0aWwuZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgZXJyKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2xpZW50W2tSdW5uaW5nXSA+IDAgJiYgZXJyLmNvZGUgIT09ICdVTkRfRVJSX0lORk8nKSB7XG4gICAgICAvLyBGYWlsIGhlYWQgb2YgcGlwZWxpbmUuXG4gICAgICBjb25zdCByZXF1ZXN0ID0gY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XV1cbiAgICAgIGNsaWVudFtrUXVldWVdW2NsaWVudFtrUnVubmluZ0lkeF0rK10gPSBudWxsXG5cbiAgICAgIHV0aWwuZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgZXJyKVxuICAgIH1cblxuICAgIGNsaWVudFtrUGVuZGluZ0lkeF0gPSBjbGllbnRba1J1bm5pbmdJZHhdXG5cbiAgICBhc3NlcnQoY2xpZW50W2tSdW5uaW5nXSA9PT0gMClcblxuICAgIGNsaWVudC5lbWl0KCdkaXNjb25uZWN0JywgY2xpZW50W2tVcmxdLCBbY2xpZW50XSwgZXJyKVxuXG4gICAgY2xpZW50W2tSZXN1bWVdKClcbiAgfSlcblxuICBsZXQgY2xvc2VkID0gZmFsc2VcbiAgc29ja2V0Lm9uKCdjbG9zZScsICgpID0+IHtcbiAgICBjbG9zZWQgPSB0cnVlXG4gIH0pXG5cbiAgcmV0dXJuIHtcbiAgICB2ZXJzaW9uOiAnaDEnLFxuICAgIGRlZmF1bHRQaXBlbGluaW5nOiAxLFxuICAgIHdyaXRlICguLi5hcmdzKSB7XG4gICAgICByZXR1cm4gd3JpdGVIMShjbGllbnQsIC4uLmFyZ3MpXG4gICAgfSxcbiAgICByZXN1bWUgKCkge1xuICAgICAgcmVzdW1lSDEoY2xpZW50KVxuICAgIH0sXG4gICAgZGVzdHJveSAoZXJyLCBjYWxsYmFjaykge1xuICAgICAgaWYgKGNsb3NlZCkge1xuICAgICAgICBxdWV1ZU1pY3JvdGFzayhjYWxsYmFjaylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvY2tldC5kZXN0cm95KGVycikub24oJ2Nsb3NlJywgY2FsbGJhY2spXG4gICAgICB9XG4gICAgfSxcbiAgICBnZXQgZGVzdHJveWVkICgpIHtcbiAgICAgIHJldHVybiBzb2NrZXQuZGVzdHJveWVkXG4gICAgfSxcbiAgICBidXN5IChyZXF1ZXN0KSB7XG4gICAgICBpZiAoc29ja2V0W2tXcml0aW5nXSB8fCBzb2NrZXRba1Jlc2V0XSB8fCBzb2NrZXRba0Jsb2NraW5nXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuXG4gICAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICBpZiAoY2xpZW50W2tSdW5uaW5nXSA+IDAgJiYgIXJlcXVlc3QuaWRlbXBvdGVudCkge1xuICAgICAgICAgIC8vIE5vbi1pZGVtcG90ZW50IHJlcXVlc3QgY2Fubm90IGJlIHJldHJpZWQuXG4gICAgICAgICAgLy8gRW5zdXJlIHRoYXQgbm8gb3RoZXIgcmVxdWVzdHMgYXJlIGluZmxpZ2h0IGFuZFxuICAgICAgICAgIC8vIGNvdWxkIGNhdXNlIGZhaWx1cmUuXG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjbGllbnRba1J1bm5pbmddID4gMCAmJiAocmVxdWVzdC51cGdyYWRlIHx8IHJlcXVlc3QubWV0aG9kID09PSAnQ09OTkVDVCcpKSB7XG4gICAgICAgICAgLy8gRG9uJ3QgZGlzcGF0Y2ggYW4gdXBncmFkZSB1bnRpbCBhbGwgcHJlY2VkaW5nIHJlcXVlc3RzIGhhdmUgY29tcGxldGVkLlxuICAgICAgICAgIC8vIEEgbWlzYmVoYXZpbmcgc2VydmVyIG1pZ2h0IHVwZ3JhZGUgdGhlIGNvbm5lY3Rpb24gYmVmb3JlIGFsbCBwaXBlbGluZWRcbiAgICAgICAgICAvLyByZXF1ZXN0IGhhcyBjb21wbGV0ZWQuXG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjbGllbnRba1J1bm5pbmddID4gMCAmJiB1dGlsLmJvZHlMZW5ndGgocmVxdWVzdC5ib2R5KSAhPT0gMCAmJlxuICAgICAgICAgICh1dGlsLmlzU3RyZWFtKHJlcXVlc3QuYm9keSkgfHwgdXRpbC5pc0FzeW5jSXRlcmFibGUocmVxdWVzdC5ib2R5KSB8fCB1dGlsLmlzRm9ybURhdGFMaWtlKHJlcXVlc3QuYm9keSkpKSB7XG4gICAgICAgICAgLy8gUmVxdWVzdCB3aXRoIHN0cmVhbSBvciBpdGVyYXRvciBib2R5IGNhbiBlcnJvciB3aGlsZSBvdGhlciByZXF1ZXN0c1xuICAgICAgICAgIC8vIGFyZSBpbmZsaWdodCBhbmQgaW5kaXJlY3RseSBlcnJvciB0aG9zZSBhcyB3ZWxsLlxuICAgICAgICAgIC8vIEVuc3VyZSB0aGlzIGRvZXNuJ3QgaGFwcGVuIGJ5IHdhaXRpbmcgZm9yIGluZmxpZ2h0XG4gICAgICAgICAgLy8gdG8gY29tcGxldGUgYmVmb3JlIGRpc3BhdGNoaW5nLlxuXG4gICAgICAgICAgLy8gUmVxdWVzdCB3aXRoIHN0cmVhbSBvciBpdGVyYXRvciBib2R5IGNhbm5vdCBiZSByZXRyaWVkLlxuICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IG5vIG90aGVyIHJlcXVlc3RzIGFyZSBpbmZsaWdodCBhbmRcbiAgICAgICAgICAvLyBjb3VsZCBjYXVzZSBmYWlsdXJlLlxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlc3VtZUgxIChjbGllbnQpIHtcbiAgY29uc3Qgc29ja2V0ID0gY2xpZW50W2tTb2NrZXRdXG5cbiAgaWYgKHNvY2tldCAmJiAhc29ja2V0LmRlc3Ryb3llZCkge1xuICAgIGlmIChjbGllbnRba1NpemVdID09PSAwKSB7XG4gICAgICBpZiAoIXNvY2tldFtrTm9SZWZdICYmIHNvY2tldC51bnJlZikge1xuICAgICAgICBzb2NrZXQudW5yZWYoKVxuICAgICAgICBzb2NrZXRba05vUmVmXSA9IHRydWVcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNvY2tldFtrTm9SZWZdICYmIHNvY2tldC5yZWYpIHtcbiAgICAgIHNvY2tldC5yZWYoKVxuICAgICAgc29ja2V0W2tOb1JlZl0gPSBmYWxzZVxuICAgIH1cblxuICAgIGlmIChjbGllbnRba1NpemVdID09PSAwKSB7XG4gICAgICBpZiAoc29ja2V0W2tQYXJzZXJdLnRpbWVvdXRUeXBlICE9PSBUSU1FT1VUX0tFRVBfQUxJVkUpIHtcbiAgICAgICAgc29ja2V0W2tQYXJzZXJdLnNldFRpbWVvdXQoY2xpZW50W2tLZWVwQWxpdmVUaW1lb3V0VmFsdWVdLCBUSU1FT1VUX0tFRVBfQUxJVkUpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjbGllbnRba1J1bm5pbmddID4gMCAmJiBzb2NrZXRba1BhcnNlcl0uc3RhdHVzQ29kZSA8IDIwMCkge1xuICAgICAgaWYgKHNvY2tldFtrUGFyc2VyXS50aW1lb3V0VHlwZSAhPT0gVElNRU9VVF9IRUFERVJTKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBjbGllbnRba1F1ZXVlXVtjbGllbnRba1J1bm5pbmdJZHhdXVxuICAgICAgICBjb25zdCBoZWFkZXJzVGltZW91dCA9IHJlcXVlc3QuaGVhZGVyc1RpbWVvdXQgIT0gbnVsbFxuICAgICAgICAgID8gcmVxdWVzdC5oZWFkZXJzVGltZW91dFxuICAgICAgICAgIDogY2xpZW50W2tIZWFkZXJzVGltZW91dF1cbiAgICAgICAgc29ja2V0W2tQYXJzZXJdLnNldFRpbWVvdXQoaGVhZGVyc1RpbWVvdXQsIFRJTUVPVVRfSEVBREVSUylcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8gaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzcyMzAjc2VjdGlvbi0zLjMuMlxuZnVuY3Rpb24gc2hvdWxkU2VuZENvbnRlbnRMZW5ndGggKG1ldGhvZCkge1xuICByZXR1cm4gbWV0aG9kICE9PSAnR0VUJyAmJiBtZXRob2QgIT09ICdIRUFEJyAmJiBtZXRob2QgIT09ICdPUFRJT05TJyAmJiBtZXRob2QgIT09ICdUUkFDRScgJiYgbWV0aG9kICE9PSAnQ09OTkVDVCdcbn1cblxuZnVuY3Rpb24gd3JpdGVIMSAoY2xpZW50LCByZXF1ZXN0KSB7XG4gIGNvbnN0IHsgbWV0aG9kLCBwYXRoLCBob3N0LCB1cGdyYWRlLCBibG9ja2luZywgcmVzZXQgfSA9IHJlcXVlc3RcblxuICBsZXQgeyBib2R5LCBoZWFkZXJzLCBjb250ZW50TGVuZ3RoIH0gPSByZXF1ZXN0XG5cbiAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi00LjMuMVxuICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTQuMy4yXG4gIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNC4zLjVcblxuICAvLyBTZW5kaW5nIGEgcGF5bG9hZCBib2R5IG9uIGEgcmVxdWVzdCB0aGF0IGRvZXMgbm90XG4gIC8vIGV4cGVjdCBpdCBjYW4gY2F1c2UgdW5kZWZpbmVkIGJlaGF2aW9yIG9uIHNvbWVcbiAgLy8gc2VydmVycyBhbmQgY29ycnVwdCBjb25uZWN0aW9uIHN0YXRlLiBEbyBub3RcbiAgLy8gcmUtdXNlIHRoZSBjb25uZWN0aW9uIGZvciBmdXJ0aGVyIHJlcXVlc3RzLlxuXG4gIGNvbnN0IGV4cGVjdHNQYXlsb2FkID0gKFxuICAgIG1ldGhvZCA9PT0gJ1BVVCcgfHxcbiAgICBtZXRob2QgPT09ICdQT1NUJyB8fFxuICAgIG1ldGhvZCA9PT0gJ1BBVENIJyB8fFxuICAgIG1ldGhvZCA9PT0gJ1FVRVJZJyB8fFxuICAgIG1ldGhvZCA9PT0gJ1BST1BGSU5EJyB8fFxuICAgIG1ldGhvZCA9PT0gJ1BST1BQQVRDSCdcbiAgKVxuXG4gIGlmICh1dGlsLmlzRm9ybURhdGFMaWtlKGJvZHkpKSB7XG4gICAgaWYgKCFleHRyYWN0Qm9keSkge1xuICAgICAgZXh0cmFjdEJvZHkgPSByZXF1aXJlKCcuLi93ZWIvZmV0Y2gvYm9keS5qcycpLmV4dHJhY3RCb2R5XG4gICAgfVxuXG4gICAgY29uc3QgW2JvZHlTdHJlYW0sIGNvbnRlbnRUeXBlXSA9IGV4dHJhY3RCb2R5KGJvZHkpXG4gICAgaWYgKHJlcXVlc3QuY29udGVudFR5cGUgPT0gbnVsbCkge1xuICAgICAgaGVhZGVycy5wdXNoKCdjb250ZW50LXR5cGUnLCBjb250ZW50VHlwZSlcbiAgICB9XG4gICAgYm9keSA9IGJvZHlTdHJlYW0uc3RyZWFtXG4gICAgY29udGVudExlbmd0aCA9IGJvZHlTdHJlYW0ubGVuZ3RoXG4gIH0gZWxzZSBpZiAodXRpbC5pc0Jsb2JMaWtlKGJvZHkpICYmIHJlcXVlc3QuY29udGVudFR5cGUgPT0gbnVsbCAmJiBib2R5LnR5cGUpIHtcbiAgICBoZWFkZXJzLnB1c2goJ2NvbnRlbnQtdHlwZScsIGJvZHkudHlwZSlcbiAgfVxuXG4gIGlmIChib2R5ICYmIHR5cGVvZiBib2R5LnJlYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBUcnkgdG8gcmVhZCBFT0YgaW4gb3JkZXIgdG8gZ2V0IGxlbmd0aC5cbiAgICBib2R5LnJlYWQoMClcbiAgfVxuXG4gIGNvbnN0IGJvZHlMZW5ndGggPSB1dGlsLmJvZHlMZW5ndGgoYm9keSlcblxuICBjb250ZW50TGVuZ3RoID0gYm9keUxlbmd0aCA/PyBjb250ZW50TGVuZ3RoXG5cbiAgaWYgKGNvbnRlbnRMZW5ndGggPT09IG51bGwpIHtcbiAgICBjb250ZW50TGVuZ3RoID0gcmVxdWVzdC5jb250ZW50TGVuZ3RoXG4gIH1cblxuICBpZiAoY29udGVudExlbmd0aCA9PT0gMCAmJiAhZXhwZWN0c1BheWxvYWQpIHtcbiAgICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMy4yXG4gICAgLy8gQSB1c2VyIGFnZW50IFNIT1VMRCBOT1Qgc2VuZCBhIENvbnRlbnQtTGVuZ3RoIGhlYWRlciBmaWVsZCB3aGVuXG4gICAgLy8gdGhlIHJlcXVlc3QgbWVzc2FnZSBkb2VzIG5vdCBjb250YWluIGEgcGF5bG9hZCBib2R5IGFuZCB0aGUgbWV0aG9kXG4gICAgLy8gc2VtYW50aWNzIGRvIG5vdCBhbnRpY2lwYXRlIHN1Y2ggYSBib2R5LlxuXG4gICAgY29udGVudExlbmd0aCA9IG51bGxcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2lzc3Vlcy8yMDQ2XG4gIC8vIEEgdXNlciBhZ2VudCBtYXkgc2VuZCBhIENvbnRlbnQtTGVuZ3RoIGhlYWRlciB3aXRoIDAgdmFsdWUsIHRoaXMgc2hvdWxkIGJlIGFsbG93ZWQuXG4gIGlmIChzaG91bGRTZW5kQ29udGVudExlbmd0aChtZXRob2QpICYmIGNvbnRlbnRMZW5ndGggPiAwICYmIHJlcXVlc3QuY29udGVudExlbmd0aCAhPT0gbnVsbCAmJiByZXF1ZXN0LmNvbnRlbnRMZW5ndGggIT09IGNvbnRlbnRMZW5ndGgpIHtcbiAgICBpZiAoY2xpZW50W2tTdHJpY3RDb250ZW50TGVuZ3RoXSkge1xuICAgICAgdXRpbC5lcnJvclJlcXVlc3QoY2xpZW50LCByZXF1ZXN0LCBuZXcgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yKCkpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKG5ldyBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IoKSlcbiAgfVxuXG4gIGNvbnN0IHNvY2tldCA9IGNsaWVudFtrU29ja2V0XVxuXG4gIGNvbnN0IGFib3J0ID0gKGVycikgPT4ge1xuICAgIGlmIChyZXF1ZXN0LmFib3J0ZWQgfHwgcmVxdWVzdC5jb21wbGV0ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHV0aWwuZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgZXJyIHx8IG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKCkpXG5cbiAgICB1dGlsLmRlc3Ryb3koYm9keSlcbiAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgSW5mb3JtYXRpb25hbEVycm9yKCdhYm9ydGVkJykpXG4gIH1cblxuICB0cnkge1xuICAgIHJlcXVlc3Qub25Db25uZWN0KGFib3J0KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICB1dGlsLmVycm9yUmVxdWVzdChjbGllbnQsIHJlcXVlc3QsIGVycilcbiAgfVxuXG4gIGlmIChyZXF1ZXN0LmFib3J0ZWQpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmIChtZXRob2QgPT09ICdIRUFEJykge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tY29sbGluYS91bmRpY2kvaXNzdWVzLzI1OFxuICAgIC8vIENsb3NlIGFmdGVyIGEgSEVBRCByZXF1ZXN0IHRvIGludGVyb3Agd2l0aCBtaXNiZWhhdmluZyBzZXJ2ZXJzXG4gICAgLy8gdGhhdCBtYXkgc2VuZCBhIGJvZHkgaW4gdGhlIHJlc3BvbnNlLlxuXG4gICAgc29ja2V0W2tSZXNldF0gPSB0cnVlXG4gIH1cblxuICBpZiAodXBncmFkZSB8fCBtZXRob2QgPT09ICdDT05ORUNUJykge1xuICAgIC8vIE9uIENPTk5FQ1Qgb3IgdXBncmFkZSwgYmxvY2sgcGlwZWxpbmUgZnJvbSBkaXNwYXRjaGluZyBmdXJ0aGVyXG4gICAgLy8gcmVxdWVzdHMgb24gdGhpcyBjb25uZWN0aW9uLlxuXG4gICAgc29ja2V0W2tSZXNldF0gPSB0cnVlXG4gIH1cblxuICBpZiAocmVzZXQgIT0gbnVsbCkge1xuICAgIHNvY2tldFtrUmVzZXRdID0gcmVzZXRcbiAgfVxuXG4gIGlmIChjbGllbnRba01heFJlcXVlc3RzXSAmJiBzb2NrZXRba0NvdW50ZXJdKysgPj0gY2xpZW50W2tNYXhSZXF1ZXN0c10pIHtcbiAgICBzb2NrZXRba1Jlc2V0XSA9IHRydWVcbiAgfVxuXG4gIGlmIChibG9ja2luZykge1xuICAgIHNvY2tldFtrQmxvY2tpbmddID0gdHJ1ZVxuICB9XG5cbiAgbGV0IGhlYWRlciA9IGAke21ldGhvZH0gJHtwYXRofSBIVFRQLzEuMVxcclxcbmBcblxuICBpZiAodHlwZW9mIGhvc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgaGVhZGVyICs9IGBob3N0OiAke2hvc3R9XFxyXFxuYFxuICB9IGVsc2Uge1xuICAgIGhlYWRlciArPSBjbGllbnRba0hvc3RIZWFkZXJdXG4gIH1cblxuICBpZiAodXBncmFkZSkge1xuICAgIGhlYWRlciArPSBgY29ubmVjdGlvbjogdXBncmFkZVxcclxcbnVwZ3JhZGU6ICR7dXBncmFkZX1cXHJcXG5gXG4gIH0gZWxzZSBpZiAoY2xpZW50W2tQaXBlbGluaW5nXSAmJiAhc29ja2V0W2tSZXNldF0pIHtcbiAgICBoZWFkZXIgKz0gJ2Nvbm5lY3Rpb246IGtlZXAtYWxpdmVcXHJcXG4nXG4gIH0gZWxzZSB7XG4gICAgaGVhZGVyICs9ICdjb25uZWN0aW9uOiBjbG9zZVxcclxcbidcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGhlYWRlcnMpKSB7XG4gICAgZm9yIChsZXQgbiA9IDA7IG4gPCBoZWFkZXJzLmxlbmd0aDsgbiArPSAyKSB7XG4gICAgICBjb25zdCBrZXkgPSBoZWFkZXJzW24gKyAwXVxuICAgICAgY29uc3QgdmFsID0gaGVhZGVyc1tuICsgMV1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGhlYWRlciArPSBgJHtrZXl9OiAke3ZhbFtpXX1cXHJcXG5gXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhlYWRlciArPSBgJHtrZXl9OiAke3ZhbH1cXHJcXG5gXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNoYW5uZWxzLnNlbmRIZWFkZXJzLmhhc1N1YnNjcmliZXJzKSB7XG4gICAgY2hhbm5lbHMuc2VuZEhlYWRlcnMucHVibGlzaCh7IHJlcXVlc3QsIGhlYWRlcnM6IGhlYWRlciwgc29ja2V0IH0pXG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZTogYXNzZXJ0aW9uICovXG4gIGlmICghYm9keSB8fCBib2R5TGVuZ3RoID09PSAwKSB7XG4gICAgd3JpdGVCdWZmZXIoYWJvcnQsIG51bGwsIGNsaWVudCwgcmVxdWVzdCwgc29ja2V0LCBjb250ZW50TGVuZ3RoLCBoZWFkZXIsIGV4cGVjdHNQYXlsb2FkKVxuICB9IGVsc2UgaWYgKHV0aWwuaXNCdWZmZXIoYm9keSkpIHtcbiAgICB3cml0ZUJ1ZmZlcihhYm9ydCwgYm9keSwgY2xpZW50LCByZXF1ZXN0LCBzb2NrZXQsIGNvbnRlbnRMZW5ndGgsIGhlYWRlciwgZXhwZWN0c1BheWxvYWQpXG4gIH0gZWxzZSBpZiAodXRpbC5pc0Jsb2JMaWtlKGJvZHkpKSB7XG4gICAgaWYgKHR5cGVvZiBib2R5LnN0cmVhbSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd3JpdGVJdGVyYWJsZShhYm9ydCwgYm9keS5zdHJlYW0oKSwgY2xpZW50LCByZXF1ZXN0LCBzb2NrZXQsIGNvbnRlbnRMZW5ndGgsIGhlYWRlciwgZXhwZWN0c1BheWxvYWQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHdyaXRlQmxvYihhYm9ydCwgYm9keSwgY2xpZW50LCByZXF1ZXN0LCBzb2NrZXQsIGNvbnRlbnRMZW5ndGgsIGhlYWRlciwgZXhwZWN0c1BheWxvYWQpXG4gICAgfVxuICB9IGVsc2UgaWYgKHV0aWwuaXNTdHJlYW0oYm9keSkpIHtcbiAgICB3cml0ZVN0cmVhbShhYm9ydCwgYm9keSwgY2xpZW50LCByZXF1ZXN0LCBzb2NrZXQsIGNvbnRlbnRMZW5ndGgsIGhlYWRlciwgZXhwZWN0c1BheWxvYWQpXG4gIH0gZWxzZSBpZiAodXRpbC5pc0l0ZXJhYmxlKGJvZHkpKSB7XG4gICAgd3JpdGVJdGVyYWJsZShhYm9ydCwgYm9keSwgY2xpZW50LCByZXF1ZXN0LCBzb2NrZXQsIGNvbnRlbnRMZW5ndGgsIGhlYWRlciwgZXhwZWN0c1BheWxvYWQpXG4gIH0gZWxzZSB7XG4gICAgYXNzZXJ0KGZhbHNlKVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gd3JpdGVTdHJlYW0gKGFib3J0LCBib2R5LCBjbGllbnQsIHJlcXVlc3QsIHNvY2tldCwgY29udGVudExlbmd0aCwgaGVhZGVyLCBleHBlY3RzUGF5bG9hZCkge1xuICBhc3NlcnQoY29udGVudExlbmd0aCAhPT0gMCB8fCBjbGllbnRba1J1bm5pbmddID09PSAwLCAnc3RyZWFtIGJvZHkgY2Fubm90IGJlIHBpcGVsaW5lZCcpXG5cbiAgbGV0IGZpbmlzaGVkID0gZmFsc2VcblxuICBjb25zdCB3cml0ZXIgPSBuZXcgQXN5bmNXcml0ZXIoeyBhYm9ydCwgc29ja2V0LCByZXF1ZXN0LCBjb250ZW50TGVuZ3RoLCBjbGllbnQsIGV4cGVjdHNQYXlsb2FkLCBoZWFkZXIgfSlcblxuICBjb25zdCBvbkRhdGEgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICBpZiAoZmluaXNoZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBpZiAoIXdyaXRlci53cml0ZShjaHVuaykgJiYgdGhpcy5wYXVzZSkge1xuICAgICAgICB0aGlzLnBhdXNlKClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHV0aWwuZGVzdHJveSh0aGlzLCBlcnIpXG4gICAgfVxuICB9XG4gIGNvbnN0IG9uRHJhaW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGZpbmlzaGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoYm9keS5yZXN1bWUpIHtcbiAgICAgIGJvZHkucmVzdW1lKClcbiAgICB9XG4gIH1cbiAgY29uc3Qgb25DbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyAnY2xvc2UnIG1pZ2h0IGJlIGVtaXR0ZWQgKmJlZm9yZSogJ2Vycm9yJyBmb3JcbiAgICAvLyBicm9rZW4gc3RyZWFtcy4gV2FpdCBhIHRpY2sgdG8gYXZvaWQgdGhpcyBjYXNlLlxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIC8vIEl0J3Mgb25seSBzYWZlIHRvIHJlbW92ZSAnZXJyb3InIGxpc3RlbmVyIGFmdGVyXG4gICAgICAvLyAnY2xvc2UnLlxuICAgICAgYm9keS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbkZpbmlzaGVkKVxuICAgIH0pXG5cbiAgICBpZiAoIWZpbmlzaGVkKSB7XG4gICAgICBjb25zdCBlcnIgPSBuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpXG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBvbkZpbmlzaGVkKGVycikpXG4gICAgfVxuICB9XG4gIGNvbnN0IG9uRmluaXNoZWQgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGZpbmlzaGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBmaW5pc2hlZCA9IHRydWVcblxuICAgIGFzc2VydChzb2NrZXQuZGVzdHJveWVkIHx8IChzb2NrZXRba1dyaXRpbmddICYmIGNsaWVudFtrUnVubmluZ10gPD0gMSkpXG5cbiAgICBzb2NrZXRcbiAgICAgIC5vZmYoJ2RyYWluJywgb25EcmFpbilcbiAgICAgIC5vZmYoJ2Vycm9yJywgb25GaW5pc2hlZClcblxuICAgIGJvZHlcbiAgICAgIC5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uRGF0YSlcbiAgICAgIC5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25GaW5pc2hlZClcbiAgICAgIC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbkNsb3NlKVxuXG4gICAgaWYgKCFlcnIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHdyaXRlci5lbmQoKVxuICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgZXJyID0gZXJcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3cml0ZXIuZGVzdHJveShlcnIpXG5cbiAgICBpZiAoZXJyICYmIChlcnIuY29kZSAhPT0gJ1VORF9FUlJfSU5GTycgfHwgZXJyLm1lc3NhZ2UgIT09ICdyZXNldCcpKSB7XG4gICAgICB1dGlsLmRlc3Ryb3koYm9keSwgZXJyKVxuICAgIH0gZWxzZSB7XG4gICAgICB1dGlsLmRlc3Ryb3koYm9keSlcbiAgICB9XG4gIH1cblxuICBib2R5XG4gICAgLm9uKCdkYXRhJywgb25EYXRhKVxuICAgIC5vbignZW5kJywgb25GaW5pc2hlZClcbiAgICAub24oJ2Vycm9yJywgb25GaW5pc2hlZClcbiAgICAub24oJ2Nsb3NlJywgb25DbG9zZSlcblxuICBpZiAoYm9keS5yZXN1bWUpIHtcbiAgICBib2R5LnJlc3VtZSgpXG4gIH1cblxuICBzb2NrZXRcbiAgICAub24oJ2RyYWluJywgb25EcmFpbilcbiAgICAub24oJ2Vycm9yJywgb25GaW5pc2hlZClcblxuICBpZiAoYm9keS5lcnJvckVtaXR0ZWQgPz8gYm9keS5lcnJvcmVkKSB7XG4gICAgc2V0SW1tZWRpYXRlKCgpID0+IG9uRmluaXNoZWQoYm9keS5lcnJvcmVkKSlcbiAgfSBlbHNlIGlmIChib2R5LmVuZEVtaXR0ZWQgPz8gYm9keS5yZWFkYWJsZUVuZGVkKSB7XG4gICAgc2V0SW1tZWRpYXRlKCgpID0+IG9uRmluaXNoZWQobnVsbCkpXG4gIH1cblxuICBpZiAoYm9keS5jbG9zZUVtaXR0ZWQgPz8gYm9keS5jbG9zZWQpIHtcbiAgICBzZXRJbW1lZGlhdGUob25DbG9zZSlcbiAgfVxufVxuXG5mdW5jdGlvbiB3cml0ZUJ1ZmZlciAoYWJvcnQsIGJvZHksIGNsaWVudCwgcmVxdWVzdCwgc29ja2V0LCBjb250ZW50TGVuZ3RoLCBoZWFkZXIsIGV4cGVjdHNQYXlsb2FkKSB7XG4gIHRyeSB7XG4gICAgaWYgKCFib2R5KSB7XG4gICAgICBpZiAoY29udGVudExlbmd0aCA9PT0gMCkge1xuICAgICAgICBzb2NrZXQud3JpdGUoYCR7aGVhZGVyfWNvbnRlbnQtbGVuZ3RoOiAwXFxyXFxuXFxyXFxuYCwgJ2xhdGluMScpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhc3NlcnQoY29udGVudExlbmd0aCA9PT0gbnVsbCwgJ25vIGJvZHkgbXVzdCBub3QgaGF2ZSBjb250ZW50IGxlbmd0aCcpXG4gICAgICAgIHNvY2tldC53cml0ZShgJHtoZWFkZXJ9XFxyXFxuYCwgJ2xhdGluMScpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh1dGlsLmlzQnVmZmVyKGJvZHkpKSB7XG4gICAgICBhc3NlcnQoY29udGVudExlbmd0aCA9PT0gYm9keS5ieXRlTGVuZ3RoLCAnYnVmZmVyIGJvZHkgbXVzdCBoYXZlIGNvbnRlbnQgbGVuZ3RoJylcblxuICAgICAgc29ja2V0LmNvcmsoKVxuICAgICAgc29ja2V0LndyaXRlKGAke2hlYWRlcn1jb250ZW50LWxlbmd0aDogJHtjb250ZW50TGVuZ3RofVxcclxcblxcclxcbmAsICdsYXRpbjEnKVxuICAgICAgc29ja2V0LndyaXRlKGJvZHkpXG4gICAgICBzb2NrZXQudW5jb3JrKClcbiAgICAgIHJlcXVlc3Qub25Cb2R5U2VudChib2R5KVxuXG4gICAgICBpZiAoIWV4cGVjdHNQYXlsb2FkICYmIHJlcXVlc3QucmVzZXQgIT09IGZhbHNlKSB7XG4gICAgICAgIHNvY2tldFtrUmVzZXRdID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXF1ZXN0Lm9uUmVxdWVzdFNlbnQoKVxuXG4gICAgY2xpZW50W2tSZXN1bWVdKClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgYWJvcnQoZXJyKVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQmxvYiAoYWJvcnQsIGJvZHksIGNsaWVudCwgcmVxdWVzdCwgc29ja2V0LCBjb250ZW50TGVuZ3RoLCBoZWFkZXIsIGV4cGVjdHNQYXlsb2FkKSB7XG4gIGFzc2VydChjb250ZW50TGVuZ3RoID09PSBib2R5LnNpemUsICdibG9iIGJvZHkgbXVzdCBoYXZlIGNvbnRlbnQgbGVuZ3RoJylcblxuICB0cnkge1xuICAgIGlmIChjb250ZW50TGVuZ3RoICE9IG51bGwgJiYgY29udGVudExlbmd0aCAhPT0gYm9keS5zaXplKSB7XG4gICAgICB0aHJvdyBuZXcgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yKClcbiAgICB9XG5cbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShhd2FpdCBib2R5LmFycmF5QnVmZmVyKCkpXG5cbiAgICBzb2NrZXQuY29yaygpXG4gICAgc29ja2V0LndyaXRlKGAke2hlYWRlcn1jb250ZW50LWxlbmd0aDogJHtjb250ZW50TGVuZ3RofVxcclxcblxcclxcbmAsICdsYXRpbjEnKVxuICAgIHNvY2tldC53cml0ZShidWZmZXIpXG4gICAgc29ja2V0LnVuY29yaygpXG5cbiAgICByZXF1ZXN0Lm9uQm9keVNlbnQoYnVmZmVyKVxuICAgIHJlcXVlc3Qub25SZXF1ZXN0U2VudCgpXG5cbiAgICBpZiAoIWV4cGVjdHNQYXlsb2FkICYmIHJlcXVlc3QucmVzZXQgIT09IGZhbHNlKSB7XG4gICAgICBzb2NrZXRba1Jlc2V0XSA9IHRydWVcbiAgICB9XG5cbiAgICBjbGllbnRba1Jlc3VtZV0oKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBhYm9ydChlcnIpXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVJdGVyYWJsZSAoYWJvcnQsIGJvZHksIGNsaWVudCwgcmVxdWVzdCwgc29ja2V0LCBjb250ZW50TGVuZ3RoLCBoZWFkZXIsIGV4cGVjdHNQYXlsb2FkKSB7XG4gIGFzc2VydChjb250ZW50TGVuZ3RoICE9PSAwIHx8IGNsaWVudFtrUnVubmluZ10gPT09IDAsICdpdGVyYXRvciBib2R5IGNhbm5vdCBiZSBwaXBlbGluZWQnKVxuXG4gIGxldCBjYWxsYmFjayA9IG51bGxcbiAgZnVuY3Rpb24gb25EcmFpbiAoKSB7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBjb25zdCBjYiA9IGNhbGxiYWNrXG4gICAgICBjYWxsYmFjayA9IG51bGxcbiAgICAgIGNiKClcbiAgICB9XG4gIH1cblxuICBjb25zdCB3YWl0Rm9yRHJhaW4gPSAoKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgYXNzZXJ0KGNhbGxiYWNrID09PSBudWxsKVxuXG4gICAgaWYgKHNvY2tldFtrRXJyb3JdKSB7XG4gICAgICByZWplY3Qoc29ja2V0W2tFcnJvcl0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrID0gcmVzb2x2ZVxuICAgIH1cbiAgfSlcblxuICBzb2NrZXRcbiAgICAub24oJ2Nsb3NlJywgb25EcmFpbilcbiAgICAub24oJ2RyYWluJywgb25EcmFpbilcblxuICBjb25zdCB3cml0ZXIgPSBuZXcgQXN5bmNXcml0ZXIoeyBhYm9ydCwgc29ja2V0LCByZXF1ZXN0LCBjb250ZW50TGVuZ3RoLCBjbGllbnQsIGV4cGVjdHNQYXlsb2FkLCBoZWFkZXIgfSlcbiAgdHJ5IHtcbiAgICAvLyBJdCdzIHVwIHRvIHRoZSB1c2VyIHRvIHNvbWVob3cgYWJvcnQgdGhlIGFzeW5jIGl0ZXJhYmxlLlxuICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgYm9keSkge1xuICAgICAgaWYgKHNvY2tldFtrRXJyb3JdKSB7XG4gICAgICAgIHRocm93IHNvY2tldFtrRXJyb3JdXG4gICAgICB9XG5cbiAgICAgIGlmICghd3JpdGVyLndyaXRlKGNodW5rKSkge1xuICAgICAgICBhd2FpdCB3YWl0Rm9yRHJhaW4oKVxuICAgICAgfVxuICAgIH1cblxuICAgIHdyaXRlci5lbmQoKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICB3cml0ZXIuZGVzdHJveShlcnIpXG4gIH0gZmluYWxseSB7XG4gICAgc29ja2V0XG4gICAgICAub2ZmKCdjbG9zZScsIG9uRHJhaW4pXG4gICAgICAub2ZmKCdkcmFpbicsIG9uRHJhaW4pXG4gIH1cbn1cblxuY2xhc3MgQXN5bmNXcml0ZXIge1xuICBjb25zdHJ1Y3RvciAoeyBhYm9ydCwgc29ja2V0LCByZXF1ZXN0LCBjb250ZW50TGVuZ3RoLCBjbGllbnQsIGV4cGVjdHNQYXlsb2FkLCBoZWFkZXIgfSkge1xuICAgIHRoaXMuc29ja2V0ID0gc29ja2V0XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdFxuICAgIHRoaXMuY29udGVudExlbmd0aCA9IGNvbnRlbnRMZW5ndGhcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudFxuICAgIHRoaXMuYnl0ZXNXcml0dGVuID0gMFxuICAgIHRoaXMuZXhwZWN0c1BheWxvYWQgPSBleHBlY3RzUGF5bG9hZFxuICAgIHRoaXMuaGVhZGVyID0gaGVhZGVyXG4gICAgdGhpcy5hYm9ydCA9IGFib3J0XG5cbiAgICBzb2NrZXRba1dyaXRpbmddID0gdHJ1ZVxuICB9XG5cbiAgd3JpdGUgKGNodW5rKSB7XG4gICAgY29uc3QgeyBzb2NrZXQsIHJlcXVlc3QsIGNvbnRlbnRMZW5ndGgsIGNsaWVudCwgYnl0ZXNXcml0dGVuLCBleHBlY3RzUGF5bG9hZCwgaGVhZGVyIH0gPSB0aGlzXG5cbiAgICBpZiAoc29ja2V0W2tFcnJvcl0pIHtcbiAgICAgIHRocm93IHNvY2tldFtrRXJyb3JdXG4gICAgfVxuXG4gICAgaWYgKHNvY2tldC5kZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGNvbnN0IGxlbiA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGNodW5rKVxuICAgIGlmICghbGVuKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIC8vIFdlIHNob3VsZCBkZWZlciB3cml0aW5nIGNodW5rcy5cbiAgICBpZiAoY29udGVudExlbmd0aCAhPT0gbnVsbCAmJiBieXRlc1dyaXR0ZW4gKyBsZW4gPiBjb250ZW50TGVuZ3RoKSB7XG4gICAgICBpZiAoY2xpZW50W2tTdHJpY3RDb250ZW50TGVuZ3RoXSkge1xuICAgICAgICB0aHJvdyBuZXcgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yKClcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5lbWl0V2FybmluZyhuZXcgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yKCkpXG4gICAgfVxuXG4gICAgc29ja2V0LmNvcmsoKVxuXG4gICAgaWYgKGJ5dGVzV3JpdHRlbiA9PT0gMCkge1xuICAgICAgaWYgKCFleHBlY3RzUGF5bG9hZCAmJiByZXF1ZXN0LnJlc2V0ICE9PSBmYWxzZSkge1xuICAgICAgICBzb2NrZXRba1Jlc2V0XSA9IHRydWVcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbnRlbnRMZW5ndGggPT09IG51bGwpIHtcbiAgICAgICAgc29ja2V0LndyaXRlKGAke2hlYWRlcn10cmFuc2Zlci1lbmNvZGluZzogY2h1bmtlZFxcclxcbmAsICdsYXRpbjEnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc29ja2V0LndyaXRlKGAke2hlYWRlcn1jb250ZW50LWxlbmd0aDogJHtjb250ZW50TGVuZ3RofVxcclxcblxcclxcbmAsICdsYXRpbjEnKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb250ZW50TGVuZ3RoID09PSBudWxsKSB7XG4gICAgICBzb2NrZXQud3JpdGUoYFxcclxcbiR7bGVuLnRvU3RyaW5nKDE2KX1cXHJcXG5gLCAnbGF0aW4xJylcbiAgICB9XG5cbiAgICB0aGlzLmJ5dGVzV3JpdHRlbiArPSBsZW5cblxuICAgIGNvbnN0IHJldCA9IHNvY2tldC53cml0ZShjaHVuaylcblxuICAgIHNvY2tldC51bmNvcmsoKVxuXG4gICAgcmVxdWVzdC5vbkJvZHlTZW50KGNodW5rKVxuXG4gICAgaWYgKCFyZXQpIHtcbiAgICAgIGlmIChzb2NrZXRba1BhcnNlcl0udGltZW91dCAmJiBzb2NrZXRba1BhcnNlcl0udGltZW91dFR5cGUgPT09IFRJTUVPVVRfSEVBREVSUykge1xuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZTogb25seSBmb3IgamVzdFxuICAgICAgICBpZiAoc29ja2V0W2tQYXJzZXJdLnRpbWVvdXQucmVmcmVzaCkge1xuICAgICAgICAgIHNvY2tldFtrUGFyc2VyXS50aW1lb3V0LnJlZnJlc2goKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldFxuICB9XG5cbiAgZW5kICgpIHtcbiAgICBjb25zdCB7IHNvY2tldCwgY29udGVudExlbmd0aCwgY2xpZW50LCBieXRlc1dyaXR0ZW4sIGV4cGVjdHNQYXlsb2FkLCBoZWFkZXIsIHJlcXVlc3QgfSA9IHRoaXNcbiAgICByZXF1ZXN0Lm9uUmVxdWVzdFNlbnQoKVxuXG4gICAgc29ja2V0W2tXcml0aW5nXSA9IGZhbHNlXG5cbiAgICBpZiAoc29ja2V0W2tFcnJvcl0pIHtcbiAgICAgIHRocm93IHNvY2tldFtrRXJyb3JdXG4gICAgfVxuXG4gICAgaWYgKHNvY2tldC5kZXN0cm95ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChieXRlc1dyaXR0ZW4gPT09IDApIHtcbiAgICAgIGlmIChleHBlY3RzUGF5bG9hZCkge1xuICAgICAgICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMy4yXG4gICAgICAgIC8vIEEgdXNlciBhZ2VudCBTSE9VTEQgc2VuZCBhIENvbnRlbnQtTGVuZ3RoIGluIGEgcmVxdWVzdCBtZXNzYWdlIHdoZW5cbiAgICAgICAgLy8gbm8gVHJhbnNmZXItRW5jb2RpbmcgaXMgc2VudCBhbmQgdGhlIHJlcXVlc3QgbWV0aG9kIGRlZmluZXMgYSBtZWFuaW5nXG4gICAgICAgIC8vIGZvciBhbiBlbmNsb3NlZCBwYXlsb2FkIGJvZHkuXG5cbiAgICAgICAgc29ja2V0LndyaXRlKGAke2hlYWRlcn1jb250ZW50LWxlbmd0aDogMFxcclxcblxcclxcbmAsICdsYXRpbjEnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc29ja2V0LndyaXRlKGAke2hlYWRlcn1cXHJcXG5gLCAnbGF0aW4xJylcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbnRlbnRMZW5ndGggPT09IG51bGwpIHtcbiAgICAgIHNvY2tldC53cml0ZSgnXFxyXFxuMFxcclxcblxcclxcbicsICdsYXRpbjEnKVxuICAgIH1cblxuICAgIGlmIChjb250ZW50TGVuZ3RoICE9PSBudWxsICYmIGJ5dGVzV3JpdHRlbiAhPT0gY29udGVudExlbmd0aCkge1xuICAgICAgaWYgKGNsaWVudFtrU3RyaWN0Q29udGVudExlbmd0aF0pIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlcXVlc3RDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcigpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKG5ldyBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IoKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc29ja2V0W2tQYXJzZXJdLnRpbWVvdXQgJiYgc29ja2V0W2tQYXJzZXJdLnRpbWVvdXRUeXBlID09PSBUSU1FT1VUX0hFQURFUlMpIHtcbiAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBvbmx5IGZvciBqZXN0XG4gICAgICBpZiAoc29ja2V0W2tQYXJzZXJdLnRpbWVvdXQucmVmcmVzaCkge1xuICAgICAgICBzb2NrZXRba1BhcnNlcl0udGltZW91dC5yZWZyZXNoKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjbGllbnRba1Jlc3VtZV0oKVxuICB9XG5cbiAgZGVzdHJveSAoZXJyKSB7XG4gICAgY29uc3QgeyBzb2NrZXQsIGNsaWVudCwgYWJvcnQgfSA9IHRoaXNcblxuICAgIHNvY2tldFtrV3JpdGluZ10gPSBmYWxzZVxuXG4gICAgaWYgKGVycikge1xuICAgICAgYXNzZXJ0KGNsaWVudFtrUnVubmluZ10gPD0gMSwgJ3BpcGVsaW5lIHNob3VsZCBvbmx5IGNvbnRhaW4gdGhpcyByZXF1ZXN0JylcbiAgICAgIGFib3J0KGVycilcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb25uZWN0SDFcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdub2RlOmFzc2VydCcpXG5jb25zdCB7IHBpcGVsaW5lIH0gPSByZXF1aXJlKCdub2RlOnN0cmVhbScpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vY29yZS91dGlsLmpzJylcbmNvbnN0IHtcbiAgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yLFxuICBSZXF1ZXN0QWJvcnRlZEVycm9yLFxuICBTb2NrZXRFcnJvcixcbiAgSW5mb3JtYXRpb25hbEVycm9yXG59ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMuanMnKVxuY29uc3Qge1xuICBrVXJsLFxuICBrUmVzZXQsXG4gIGtDbGllbnQsXG4gIGtSdW5uaW5nLFxuICBrUGVuZGluZyxcbiAga1F1ZXVlLFxuICBrUGVuZGluZ0lkeCxcbiAga1J1bm5pbmdJZHgsXG4gIGtFcnJvcixcbiAga1NvY2tldCxcbiAga1N0cmljdENvbnRlbnRMZW5ndGgsXG4gIGtPbkVycm9yLFxuICBrTWF4Q29uY3VycmVudFN0cmVhbXMsXG4gIGtIVFRQMlNlc3Npb24sXG4gIGtSZXN1bWUsXG4gIGtTaXplLFxuICBrSFRUUENvbnRleHRcbn0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMuanMnKVxuXG5jb25zdCBrT3BlblN0cmVhbXMgPSBTeW1ib2woJ29wZW4gc3RyZWFtcycpXG5cbmxldCBleHRyYWN0Qm9keVxuXG4vLyBFeHBlcmltZW50YWxcbmxldCBoMkV4cGVyaW1lbnRhbFdhcm5lZCA9IGZhbHNlXG5cbi8qKiBAdHlwZSB7aW1wb3J0KCdodHRwMicpfSAqL1xubGV0IGh0dHAyXG50cnkge1xuICBodHRwMiA9IHJlcXVpcmUoJ25vZGU6aHR0cDInKVxufSBjYXRjaCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgaHR0cDIgPSB7IGNvbnN0YW50czoge30gfVxufVxuXG5jb25zdCB7XG4gIGNvbnN0YW50czoge1xuICAgIEhUVFAyX0hFQURFUl9BVVRIT1JJVFksXG4gICAgSFRUUDJfSEVBREVSX01FVEhPRCxcbiAgICBIVFRQMl9IRUFERVJfUEFUSCxcbiAgICBIVFRQMl9IRUFERVJfU0NIRU1FLFxuICAgIEhUVFAyX0hFQURFUl9DT05URU5UX0xFTkdUSCxcbiAgICBIVFRQMl9IRUFERVJfRVhQRUNULFxuICAgIEhUVFAyX0hFQURFUl9TVEFUVVNcbiAgfVxufSA9IGh0dHAyXG5cbmZ1bmN0aW9uIHBhcnNlSDJIZWFkZXJzIChoZWFkZXJzKSB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdXG5cbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKSB7XG4gICAgLy8gaDIgbWF5IGNvbmNhdCB0aGUgaGVhZGVyIHZhbHVlIGJ5IGFycmF5XG4gICAgLy8gZS5nLiBTZXQtQ29va2llXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBmb3IgKGNvbnN0IHN1YnZhbHVlIG9mIHZhbHVlKSB7XG4gICAgICAgIC8vIHdlIG5lZWQgdG8gcHJvdmlkZSBlYWNoIGhlYWRlciB2YWx1ZSBvZiBoZWFkZXIgbmFtZVxuICAgICAgICAvLyBiZWNhdXNlIHRoZSBoZWFkZXJzIGhhbmRsZXIgZXhwZWN0IG5hbWUtdmFsdWUgcGFpclxuICAgICAgICByZXN1bHQucHVzaChCdWZmZXIuZnJvbShuYW1lKSwgQnVmZmVyLmZyb20oc3VidmFsdWUpKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucHVzaChCdWZmZXIuZnJvbShuYW1lKSwgQnVmZmVyLmZyb20odmFsdWUpKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29ubmVjdEgyIChjbGllbnQsIHNvY2tldCkge1xuICBjbGllbnRba1NvY2tldF0gPSBzb2NrZXRcblxuICBpZiAoIWgyRXhwZXJpbWVudGFsV2FybmVkKSB7XG4gICAgaDJFeHBlcmltZW50YWxXYXJuZWQgPSB0cnVlXG4gICAgcHJvY2Vzcy5lbWl0V2FybmluZygnSDIgc3VwcG9ydCBpcyBleHBlcmltZW50YWwsIGV4cGVjdCB0aGVtIHRvIGNoYW5nZSBhdCBhbnkgdGltZS4nLCB7XG4gICAgICBjb2RlOiAnVU5ESUNJLUgyJ1xuICAgIH0pXG4gIH1cblxuICBjb25zdCBzZXNzaW9uID0gaHR0cDIuY29ubmVjdChjbGllbnRba1VybF0sIHtcbiAgICBjcmVhdGVDb25uZWN0aW9uOiAoKSA9PiBzb2NrZXQsXG4gICAgcGVlck1heENvbmN1cnJlbnRTdHJlYW1zOiBjbGllbnRba01heENvbmN1cnJlbnRTdHJlYW1zXVxuICB9KVxuXG4gIHNlc3Npb25ba09wZW5TdHJlYW1zXSA9IDBcbiAgc2Vzc2lvbltrQ2xpZW50XSA9IGNsaWVudFxuICBzZXNzaW9uW2tTb2NrZXRdID0gc29ja2V0XG5cbiAgdXRpbC5hZGRMaXN0ZW5lcihzZXNzaW9uLCAnZXJyb3InLCBvbkh0dHAyU2Vzc2lvbkVycm9yKVxuICB1dGlsLmFkZExpc3RlbmVyKHNlc3Npb24sICdmcmFtZUVycm9yJywgb25IdHRwMkZyYW1lRXJyb3IpXG4gIHV0aWwuYWRkTGlzdGVuZXIoc2Vzc2lvbiwgJ2VuZCcsIG9uSHR0cDJTZXNzaW9uRW5kKVxuICB1dGlsLmFkZExpc3RlbmVyKHNlc3Npb24sICdnb2F3YXknLCBvbkhUVFAyR29Bd2F5KVxuICB1dGlsLmFkZExpc3RlbmVyKHNlc3Npb24sICdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB7IFtrQ2xpZW50XTogY2xpZW50IH0gPSB0aGlzXG4gICAgY29uc3QgeyBba1NvY2tldF06IHNvY2tldCB9ID0gY2xpZW50XG5cbiAgICBjb25zdCBlcnIgPSB0aGlzW2tTb2NrZXRdW2tFcnJvcl0gfHwgdGhpc1trRXJyb3JdIHx8IG5ldyBTb2NrZXRFcnJvcignY2xvc2VkJywgdXRpbC5nZXRTb2NrZXRJbmZvKHNvY2tldCkpXG5cbiAgICBjbGllbnRba0hUVFAyU2Vzc2lvbl0gPSBudWxsXG5cbiAgICBpZiAoY2xpZW50LmRlc3Ryb3llZCkge1xuICAgICAgYXNzZXJ0KGNsaWVudFtrUGVuZGluZ10gPT09IDApXG5cbiAgICAgIC8vIEZhaWwgZW50aXJlIHF1ZXVlLlxuICAgICAgY29uc3QgcmVxdWVzdHMgPSBjbGllbnRba1F1ZXVlXS5zcGxpY2UoY2xpZW50W2tSdW5uaW5nSWR4XSlcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVxdWVzdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHJlcXVlc3RzW2ldXG4gICAgICAgIHV0aWwuZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgZXJyKVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICBzZXNzaW9uLnVucmVmKClcblxuICBjbGllbnRba0hUVFAyU2Vzc2lvbl0gPSBzZXNzaW9uXG4gIHNvY2tldFtrSFRUUDJTZXNzaW9uXSA9IHNlc3Npb25cblxuICB1dGlsLmFkZExpc3RlbmVyKHNvY2tldCwgJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgIGFzc2VydChlcnIuY29kZSAhPT0gJ0VSUl9UTFNfQ0VSVF9BTFROQU1FX0lOVkFMSUQnKVxuXG4gICAgdGhpc1trRXJyb3JdID0gZXJyXG5cbiAgICB0aGlzW2tDbGllbnRdW2tPbkVycm9yXShlcnIpXG4gIH0pXG5cbiAgdXRpbC5hZGRMaXN0ZW5lcihzb2NrZXQsICdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgdXRpbC5kZXN0cm95KHRoaXMsIG5ldyBTb2NrZXRFcnJvcignb3RoZXIgc2lkZSBjbG9zZWQnLCB1dGlsLmdldFNvY2tldEluZm8odGhpcykpKVxuICB9KVxuXG4gIHV0aWwuYWRkTGlzdGVuZXIoc29ja2V0LCAnY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZXJyID0gdGhpc1trRXJyb3JdIHx8IG5ldyBTb2NrZXRFcnJvcignY2xvc2VkJywgdXRpbC5nZXRTb2NrZXRJbmZvKHRoaXMpKVxuXG4gICAgY2xpZW50W2tTb2NrZXRdID0gbnVsbFxuXG4gICAgaWYgKHRoaXNba0hUVFAyU2Vzc2lvbl0gIT0gbnVsbCkge1xuICAgICAgdGhpc1trSFRUUDJTZXNzaW9uXS5kZXN0cm95KGVycilcbiAgICB9XG5cbiAgICBjbGllbnRba1BlbmRpbmdJZHhdID0gY2xpZW50W2tSdW5uaW5nSWR4XVxuXG4gICAgYXNzZXJ0KGNsaWVudFtrUnVubmluZ10gPT09IDApXG5cbiAgICBjbGllbnQuZW1pdCgnZGlzY29ubmVjdCcsIGNsaWVudFtrVXJsXSwgW2NsaWVudF0sIGVycilcblxuICAgIGNsaWVudFtrUmVzdW1lXSgpXG4gIH0pXG5cbiAgbGV0IGNsb3NlZCA9IGZhbHNlXG4gIHNvY2tldC5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgY2xvc2VkID0gdHJ1ZVxuICB9KVxuXG4gIHJldHVybiB7XG4gICAgdmVyc2lvbjogJ2gyJyxcbiAgICBkZWZhdWx0UGlwZWxpbmluZzogSW5maW5pdHksXG4gICAgd3JpdGUgKC4uLmFyZ3MpIHtcbiAgICAgIHJldHVybiB3cml0ZUgyKGNsaWVudCwgLi4uYXJncylcbiAgICB9LFxuICAgIHJlc3VtZSAoKSB7XG4gICAgICByZXN1bWVIMihjbGllbnQpXG4gICAgfSxcbiAgICBkZXN0cm95IChlcnIsIGNhbGxiYWNrKSB7XG4gICAgICBpZiAoY2xvc2VkKSB7XG4gICAgICAgIHF1ZXVlTWljcm90YXNrKGNhbGxiYWNrKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGVzdHJveWluZyB0aGUgc29ja2V0IHdpbGwgdHJpZ2dlciB0aGUgc2Vzc2lvbiBjbG9zZVxuICAgICAgICBzb2NrZXQuZGVzdHJveShlcnIpLm9uKCdjbG9zZScsIGNhbGxiYWNrKVxuICAgICAgfVxuICAgIH0sXG4gICAgZ2V0IGRlc3Ryb3llZCAoKSB7XG4gICAgICByZXR1cm4gc29ja2V0LmRlc3Ryb3llZFxuICAgIH0sXG4gICAgYnVzeSAoKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lSDIgKGNsaWVudCkge1xuICBjb25zdCBzb2NrZXQgPSBjbGllbnRba1NvY2tldF1cblxuICBpZiAoc29ja2V0Py5kZXN0cm95ZWQgPT09IGZhbHNlKSB7XG4gICAgaWYgKGNsaWVudFtrU2l6ZV0gPT09IDAgJiYgY2xpZW50W2tNYXhDb25jdXJyZW50U3RyZWFtc10gPT09IDApIHtcbiAgICAgIHNvY2tldC51bnJlZigpXG4gICAgICBjbGllbnRba0hUVFAyU2Vzc2lvbl0udW5yZWYoKVxuICAgIH0gZWxzZSB7XG4gICAgICBzb2NrZXQucmVmKClcbiAgICAgIGNsaWVudFtrSFRUUDJTZXNzaW9uXS5yZWYoKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBvbkh0dHAyU2Vzc2lvbkVycm9yIChlcnIpIHtcbiAgYXNzZXJ0KGVyci5jb2RlICE9PSAnRVJSX1RMU19DRVJUX0FMVE5BTUVfSU5WQUxJRCcpXG5cbiAgdGhpc1trU29ja2V0XVtrRXJyb3JdID0gZXJyXG4gIHRoaXNba0NsaWVudF1ba09uRXJyb3JdKGVycilcbn1cblxuZnVuY3Rpb24gb25IdHRwMkZyYW1lRXJyb3IgKHR5cGUsIGNvZGUsIGlkKSB7XG4gIGlmIChpZCA9PT0gMCkge1xuICAgIGNvbnN0IGVyciA9IG5ldyBJbmZvcm1hdGlvbmFsRXJyb3IoYEhUVFAvMjogXCJmcmFtZUVycm9yXCIgcmVjZWl2ZWQgLSB0eXBlICR7dHlwZX0sIGNvZGUgJHtjb2RlfWApXG4gICAgdGhpc1trU29ja2V0XVtrRXJyb3JdID0gZXJyXG4gICAgdGhpc1trQ2xpZW50XVtrT25FcnJvcl0oZXJyKVxuICB9XG59XG5cbmZ1bmN0aW9uIG9uSHR0cDJTZXNzaW9uRW5kICgpIHtcbiAgY29uc3QgZXJyID0gbmV3IFNvY2tldEVycm9yKCdvdGhlciBzaWRlIGNsb3NlZCcsIHV0aWwuZ2V0U29ja2V0SW5mbyh0aGlzW2tTb2NrZXRdKSlcbiAgdGhpcy5kZXN0cm95KGVycilcbiAgdXRpbC5kZXN0cm95KHRoaXNba1NvY2tldF0sIGVycilcbn1cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSByb290IGNhdXNlIG9mICMzMDExXG4gKiBXZSBuZWVkIHRvIGhhbmRsZSBHT0FXQVkgZnJhbWVzIHByb3Blcmx5LCBhbmQgdHJpZ2dlciB0aGUgc2Vzc2lvbiBjbG9zZVxuICogYWxvbmcgd2l0aCB0aGUgc29ja2V0IHJpZ2h0IGF3YXlcbiAqL1xuZnVuY3Rpb24gb25IVFRQMkdvQXdheSAoY29kZSkge1xuICAvLyBXZSBjYW5ub3QgcmVjb3Zlciwgc28gYmVzdCB0byBjbG9zZSB0aGUgc2Vzc2lvbiBhbmQgdGhlIHNvY2tldFxuICBjb25zdCBlcnIgPSB0aGlzW2tFcnJvcl0gfHwgbmV3IFNvY2tldEVycm9yKGBIVFRQLzI6IFwiR09BV0FZXCIgZnJhbWUgcmVjZWl2ZWQgd2l0aCBjb2RlICR7Y29kZX1gLCB1dGlsLmdldFNvY2tldEluZm8odGhpcykpXG4gIGNvbnN0IGNsaWVudCA9IHRoaXNba0NsaWVudF1cblxuICBjbGllbnRba1NvY2tldF0gPSBudWxsXG4gIGNsaWVudFtrSFRUUENvbnRleHRdID0gbnVsbFxuXG4gIGlmICh0aGlzW2tIVFRQMlNlc3Npb25dICE9IG51bGwpIHtcbiAgICB0aGlzW2tIVFRQMlNlc3Npb25dLmRlc3Ryb3koZXJyKVxuICAgIHRoaXNba0hUVFAyU2Vzc2lvbl0gPSBudWxsXG4gIH1cblxuICB1dGlsLmRlc3Ryb3kodGhpc1trU29ja2V0XSwgZXJyKVxuXG4gIC8vIEZhaWwgaGVhZCBvZiBwaXBlbGluZS5cbiAgaWYgKGNsaWVudFtrUnVubmluZ0lkeF0gPCBjbGllbnRba1F1ZXVlXS5sZW5ndGgpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XV1cbiAgICBjbGllbnRba1F1ZXVlXVtjbGllbnRba1J1bm5pbmdJZHhdKytdID0gbnVsbFxuICAgIHV0aWwuZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgZXJyKVxuICAgIGNsaWVudFtrUGVuZGluZ0lkeF0gPSBjbGllbnRba1J1bm5pbmdJZHhdXG4gIH1cblxuICBhc3NlcnQoY2xpZW50W2tSdW5uaW5nXSA9PT0gMClcblxuICBjbGllbnQuZW1pdCgnZGlzY29ubmVjdCcsIGNsaWVudFtrVXJsXSwgW2NsaWVudF0sIGVycilcblxuICBjbGllbnRba1Jlc3VtZV0oKVxufVxuXG4vLyBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNzIzMCNzZWN0aW9uLTMuMy4yXG5mdW5jdGlvbiBzaG91bGRTZW5kQ29udGVudExlbmd0aCAobWV0aG9kKSB7XG4gIHJldHVybiBtZXRob2QgIT09ICdHRVQnICYmIG1ldGhvZCAhPT0gJ0hFQUQnICYmIG1ldGhvZCAhPT0gJ09QVElPTlMnICYmIG1ldGhvZCAhPT0gJ1RSQUNFJyAmJiBtZXRob2QgIT09ICdDT05ORUNUJ1xufVxuXG5mdW5jdGlvbiB3cml0ZUgyIChjbGllbnQsIHJlcXVlc3QpIHtcbiAgY29uc3Qgc2Vzc2lvbiA9IGNsaWVudFtrSFRUUDJTZXNzaW9uXVxuICBjb25zdCB7IG1ldGhvZCwgcGF0aCwgaG9zdCwgdXBncmFkZSwgZXhwZWN0Q29udGludWUsIHNpZ25hbCwgaGVhZGVyczogcmVxSGVhZGVycyB9ID0gcmVxdWVzdFxuICBsZXQgeyBib2R5IH0gPSByZXF1ZXN0XG5cbiAgaWYgKHVwZ3JhZGUpIHtcbiAgICB1dGlsLmVycm9yUmVxdWVzdChjbGllbnQsIHJlcXVlc3QsIG5ldyBFcnJvcignVXBncmFkZSBub3Qgc3VwcG9ydGVkIGZvciBIMicpKVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgY29uc3QgaGVhZGVycyA9IHt9XG4gIGZvciAobGV0IG4gPSAwOyBuIDwgcmVxSGVhZGVycy5sZW5ndGg7IG4gKz0gMikge1xuICAgIGNvbnN0IGtleSA9IHJlcUhlYWRlcnNbbiArIDBdXG4gICAgY29uc3QgdmFsID0gcmVxSGVhZGVyc1tuICsgMV1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChoZWFkZXJzW2tleV0pIHtcbiAgICAgICAgICBoZWFkZXJzW2tleV0gKz0gYCwke3ZhbFtpXX1gXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGVhZGVyc1trZXldID0gdmFsW2ldXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaGVhZGVyc1trZXldID0gdmFsXG4gICAgfVxuICB9XG5cbiAgLyoqIEB0eXBlIHtpbXBvcnQoJ25vZGU6aHR0cDInKS5DbGllbnRIdHRwMlN0cmVhbX0gKi9cbiAgbGV0IHN0cmVhbVxuXG4gIGNvbnN0IHsgaG9zdG5hbWUsIHBvcnQgfSA9IGNsaWVudFtrVXJsXVxuXG4gIGhlYWRlcnNbSFRUUDJfSEVBREVSX0FVVEhPUklUWV0gPSBob3N0IHx8IGAke2hvc3RuYW1lfSR7cG9ydCA/IGA6JHtwb3J0fWAgOiAnJ31gXG4gIGhlYWRlcnNbSFRUUDJfSEVBREVSX01FVEhPRF0gPSBtZXRob2RcblxuICBjb25zdCBhYm9ydCA9IChlcnIpID0+IHtcbiAgICBpZiAocmVxdWVzdC5hYm9ydGVkIHx8IHJlcXVlc3QuY29tcGxldGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBlcnIgPSBlcnIgfHwgbmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoKVxuXG4gICAgdXRpbC5lcnJvclJlcXVlc3QoY2xpZW50LCByZXF1ZXN0LCBlcnIpXG5cbiAgICBpZiAoc3RyZWFtICE9IG51bGwpIHtcbiAgICAgIHV0aWwuZGVzdHJveShzdHJlYW0sIGVycilcbiAgICB9XG5cbiAgICAvLyBXZSBkbyBub3QgZGVzdHJveSB0aGUgc29ja2V0IGFzIHdlIGNhbiBjb250aW51ZSB1c2luZyB0aGUgc2Vzc2lvblxuICAgIC8vIHRoZSBzdHJlYW0gZ2V0J3MgZGVzdHJveWVkIGFuZCB0aGUgc2Vzc2lvbiByZW1haW5zIHRvIGNyZWF0ZSBuZXcgc3RyZWFtc1xuICAgIHV0aWwuZGVzdHJveShib2R5LCBlcnIpXG4gICAgY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XSsrXSA9IG51bGxcbiAgICBjbGllbnRba1Jlc3VtZV0oKVxuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBXZSBhcmUgYWxyZWFkeSBjb25uZWN0ZWQsIHN0cmVhbXMgYXJlIHBlbmRpbmcuXG4gICAgLy8gV2UgY2FuIGNhbGwgb24gY29ubmVjdCwgYW5kIHdhaXQgZm9yIGFib3J0XG4gICAgcmVxdWVzdC5vbkNvbm5lY3QoYWJvcnQpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHV0aWwuZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgZXJyKVxuICB9XG5cbiAgaWYgKHJlcXVlc3QuYWJvcnRlZCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKG1ldGhvZCA9PT0gJ0NPTk5FQ1QnKSB7XG4gICAgc2Vzc2lvbi5yZWYoKVxuICAgIC8vIFdlIGFyZSBhbHJlYWR5IGNvbm5lY3RlZCwgc3RyZWFtcyBhcmUgcGVuZGluZywgZmlyc3QgcmVxdWVzdFxuICAgIC8vIHdpbGwgY3JlYXRlIGEgbmV3IHN0cmVhbS4gV2UgdHJpZ2dlciBhIHJlcXVlc3QgdG8gY3JlYXRlIHRoZSBzdHJlYW0gYW5kIHdhaXQgdW50aWxcbiAgICAvLyBgcmVhZHlgIGV2ZW50IGlzIHRyaWdnZXJlZFxuICAgIC8vIFdlIGRpc2FibGVkIGVuZFN0cmVhbSB0byBhbGxvdyB0aGUgdXNlciB0byB3cml0ZSB0byB0aGUgc3RyZWFtXG4gICAgc3RyZWFtID0gc2Vzc2lvbi5yZXF1ZXN0KGhlYWRlcnMsIHsgZW5kU3RyZWFtOiBmYWxzZSwgc2lnbmFsIH0pXG5cbiAgICBpZiAoc3RyZWFtLmlkICYmICFzdHJlYW0ucGVuZGluZykge1xuICAgICAgcmVxdWVzdC5vblVwZ3JhZGUobnVsbCwgbnVsbCwgc3RyZWFtKVxuICAgICAgKytzZXNzaW9uW2tPcGVuU3RyZWFtc11cbiAgICAgIGNsaWVudFtrUXVldWVdW2NsaWVudFtrUnVubmluZ0lkeF0rK10gPSBudWxsXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0cmVhbS5vbmNlKCdyZWFkeScsICgpID0+IHtcbiAgICAgICAgcmVxdWVzdC5vblVwZ3JhZGUobnVsbCwgbnVsbCwgc3RyZWFtKVxuICAgICAgICArK3Nlc3Npb25ba09wZW5TdHJlYW1zXVxuICAgICAgICBjbGllbnRba1F1ZXVlXVtjbGllbnRba1J1bm5pbmdJZHhdKytdID0gbnVsbFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBzdHJlYW0ub25jZSgnY2xvc2UnLCAoKSA9PiB7XG4gICAgICBzZXNzaW9uW2tPcGVuU3RyZWFtc10gLT0gMVxuICAgICAgaWYgKHNlc3Npb25ba09wZW5TdHJlYW1zXSA9PT0gMCkgc2Vzc2lvbi51bnJlZigpXG4gICAgfSlcblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzU0MCNzZWN0aW9uLTguM1xuICAvLyA6cGF0aCBhbmQgOnNjaGVtZSBoZWFkZXJzIG11c3QgYmUgb21pdHRlZCB3aGVuIHNlbmRpbmcgQ09OTkVDVFxuXG4gIGhlYWRlcnNbSFRUUDJfSEVBREVSX1BBVEhdID0gcGF0aFxuICBoZWFkZXJzW0hUVFAyX0hFQURFUl9TQ0hFTUVdID0gJ2h0dHBzJ1xuXG4gIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNC4zLjFcbiAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi00LjMuMlxuICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTQuMy41XG5cbiAgLy8gU2VuZGluZyBhIHBheWxvYWQgYm9keSBvbiBhIHJlcXVlc3QgdGhhdCBkb2VzIG5vdFxuICAvLyBleHBlY3QgaXQgY2FuIGNhdXNlIHVuZGVmaW5lZCBiZWhhdmlvciBvbiBzb21lXG4gIC8vIHNlcnZlcnMgYW5kIGNvcnJ1cHQgY29ubmVjdGlvbiBzdGF0ZS4gRG8gbm90XG4gIC8vIHJlLXVzZSB0aGUgY29ubmVjdGlvbiBmb3IgZnVydGhlciByZXF1ZXN0cy5cblxuICBjb25zdCBleHBlY3RzUGF5bG9hZCA9IChcbiAgICBtZXRob2QgPT09ICdQVVQnIHx8XG4gICAgbWV0aG9kID09PSAnUE9TVCcgfHxcbiAgICBtZXRob2QgPT09ICdQQVRDSCdcbiAgKVxuXG4gIGlmIChib2R5ICYmIHR5cGVvZiBib2R5LnJlYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBUcnkgdG8gcmVhZCBFT0YgaW4gb3JkZXIgdG8gZ2V0IGxlbmd0aC5cbiAgICBib2R5LnJlYWQoMClcbiAgfVxuXG4gIGxldCBjb250ZW50TGVuZ3RoID0gdXRpbC5ib2R5TGVuZ3RoKGJvZHkpXG5cbiAgaWYgKHV0aWwuaXNGb3JtRGF0YUxpa2UoYm9keSkpIHtcbiAgICBleHRyYWN0Qm9keSA/Pz0gcmVxdWlyZSgnLi4vd2ViL2ZldGNoL2JvZHkuanMnKS5leHRyYWN0Qm9keVxuXG4gICAgY29uc3QgW2JvZHlTdHJlYW0sIGNvbnRlbnRUeXBlXSA9IGV4dHJhY3RCb2R5KGJvZHkpXG4gICAgaGVhZGVyc1snY29udGVudC10eXBlJ10gPSBjb250ZW50VHlwZVxuXG4gICAgYm9keSA9IGJvZHlTdHJlYW0uc3RyZWFtXG4gICAgY29udGVudExlbmd0aCA9IGJvZHlTdHJlYW0ubGVuZ3RoXG4gIH1cblxuICBpZiAoY29udGVudExlbmd0aCA9PSBudWxsKSB7XG4gICAgY29udGVudExlbmd0aCA9IHJlcXVlc3QuY29udGVudExlbmd0aFxuICB9XG5cbiAgaWYgKGNvbnRlbnRMZW5ndGggPT09IDAgfHwgIWV4cGVjdHNQYXlsb2FkKSB7XG4gICAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzAjc2VjdGlvbi0zLjMuMlxuICAgIC8vIEEgdXNlciBhZ2VudCBTSE9VTEQgTk9UIHNlbmQgYSBDb250ZW50LUxlbmd0aCBoZWFkZXIgZmllbGQgd2hlblxuICAgIC8vIHRoZSByZXF1ZXN0IG1lc3NhZ2UgZG9lcyBub3QgY29udGFpbiBhIHBheWxvYWQgYm9keSBhbmQgdGhlIG1ldGhvZFxuICAgIC8vIHNlbWFudGljcyBkbyBub3QgYW50aWNpcGF0ZSBzdWNoIGEgYm9keS5cblxuICAgIGNvbnRlbnRMZW5ndGggPSBudWxsXG4gIH1cblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9pc3N1ZXMvMjA0NlxuICAvLyBBIHVzZXIgYWdlbnQgbWF5IHNlbmQgYSBDb250ZW50LUxlbmd0aCBoZWFkZXIgd2l0aCAwIHZhbHVlLCB0aGlzIHNob3VsZCBiZSBhbGxvd2VkLlxuICBpZiAoc2hvdWxkU2VuZENvbnRlbnRMZW5ndGgobWV0aG9kKSAmJiBjb250ZW50TGVuZ3RoID4gMCAmJiByZXF1ZXN0LmNvbnRlbnRMZW5ndGggIT0gbnVsbCAmJiByZXF1ZXN0LmNvbnRlbnRMZW5ndGggIT09IGNvbnRlbnRMZW5ndGgpIHtcbiAgICBpZiAoY2xpZW50W2tTdHJpY3RDb250ZW50TGVuZ3RoXSkge1xuICAgICAgdXRpbC5lcnJvclJlcXVlc3QoY2xpZW50LCByZXF1ZXN0LCBuZXcgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yKCkpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKG5ldyBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IoKSlcbiAgfVxuXG4gIGlmIChjb250ZW50TGVuZ3RoICE9IG51bGwpIHtcbiAgICBhc3NlcnQoYm9keSwgJ25vIGJvZHkgbXVzdCBub3QgaGF2ZSBjb250ZW50IGxlbmd0aCcpXG4gICAgaGVhZGVyc1tIVFRQMl9IRUFERVJfQ09OVEVOVF9MRU5HVEhdID0gYCR7Y29udGVudExlbmd0aH1gXG4gIH1cblxuICBzZXNzaW9uLnJlZigpXG5cbiAgY29uc3Qgc2hvdWxkRW5kU3RyZWFtID0gbWV0aG9kID09PSAnR0VUJyB8fCBtZXRob2QgPT09ICdIRUFEJyB8fCBib2R5ID09PSBudWxsXG4gIGlmIChleHBlY3RDb250aW51ZSkge1xuICAgIGhlYWRlcnNbSFRUUDJfSEVBREVSX0VYUEVDVF0gPSAnMTAwLWNvbnRpbnVlJ1xuICAgIHN0cmVhbSA9IHNlc3Npb24ucmVxdWVzdChoZWFkZXJzLCB7IGVuZFN0cmVhbTogc2hvdWxkRW5kU3RyZWFtLCBzaWduYWwgfSlcblxuICAgIHN0cmVhbS5vbmNlKCdjb250aW51ZScsIHdyaXRlQm9keUgyKVxuICB9IGVsc2Uge1xuICAgIHN0cmVhbSA9IHNlc3Npb24ucmVxdWVzdChoZWFkZXJzLCB7XG4gICAgICBlbmRTdHJlYW06IHNob3VsZEVuZFN0cmVhbSxcbiAgICAgIHNpZ25hbFxuICAgIH0pXG4gICAgd3JpdGVCb2R5SDIoKVxuICB9XG5cbiAgLy8gSW5jcmVtZW50IGNvdW50ZXIgYXMgd2UgaGF2ZSBuZXcgc3RyZWFtcyBvcGVuXG4gICsrc2Vzc2lvbltrT3BlblN0cmVhbXNdXG5cbiAgc3RyZWFtLm9uY2UoJ3Jlc3BvbnNlJywgaGVhZGVycyA9PiB7XG4gICAgY29uc3QgeyBbSFRUUDJfSEVBREVSX1NUQVRVU106IHN0YXR1c0NvZGUsIC4uLnJlYWxIZWFkZXJzIH0gPSBoZWFkZXJzXG4gICAgcmVxdWVzdC5vblJlc3BvbnNlU3RhcnRlZCgpXG5cbiAgICAvLyBEdWUgdG8gdGhlIHN0cmVhbSBuYXR1cmUsIGl0IGlzIHBvc3NpYmxlIHdlIGZhY2UgYSByYWNlIGNvbmRpdGlvblxuICAgIC8vIHdoZXJlIHRoZSBzdHJlYW0gaGFzIGJlZW4gYXNzaWduZWQsIGJ1dCB0aGUgcmVxdWVzdCBoYXMgYmVlbiBhYm9ydGVkXG4gICAgLy8gdGhlIHJlcXVlc3QgcmVtYWlucyBpbi1mbGlnaHQgYW5kIGhlYWRlcnMgaGFzbid0IGJlZW4gcmVjZWl2ZWQgeWV0XG4gICAgLy8gZm9yIHRob3NlIHNjZW5hcmlvcywgYmVzdCBlZmZvcnQgaXMgdG8gZGVzdHJveSB0aGUgc3RyZWFtIGltbWVkaWF0ZWx5XG4gICAgLy8gYXMgdGhlcmUncyBubyB2YWx1ZSB0byBrZWVwIGl0IG9wZW4uXG4gICAgaWYgKHJlcXVlc3QuYWJvcnRlZCkge1xuICAgICAgY29uc3QgZXJyID0gbmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoKVxuICAgICAgdXRpbC5lcnJvclJlcXVlc3QoY2xpZW50LCByZXF1ZXN0LCBlcnIpXG4gICAgICB1dGlsLmRlc3Ryb3koc3RyZWFtLCBlcnIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5vbkhlYWRlcnMoTnVtYmVyKHN0YXR1c0NvZGUpLCBwYXJzZUgySGVhZGVycyhyZWFsSGVhZGVycyksIHN0cmVhbS5yZXN1bWUuYmluZChzdHJlYW0pLCAnJykgPT09IGZhbHNlKSB7XG4gICAgICBzdHJlYW0ucGF1c2UoKVxuICAgIH1cblxuICAgIHN0cmVhbS5vbignZGF0YScsIChjaHVuaykgPT4ge1xuICAgICAgaWYgKHJlcXVlc3Qub25EYXRhKGNodW5rKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgc3RyZWFtLnBhdXNlKClcbiAgICAgIH1cbiAgICB9KVxuICB9KVxuXG4gIHN0cmVhbS5vbmNlKCdlbmQnLCAoKSA9PiB7XG4gICAgLy8gV2hlbiBzdGF0ZSBpcyBudWxsLCBpdCBtZWFucyB3ZSBoYXZlbid0IGNvbnN1bWVkIGJvZHkgYW5kIHRoZSBzdHJlYW0gc3RpbGwgZG8gbm90IGhhdmVcbiAgICAvLyBhIHN0YXRlLlxuICAgIC8vIFByZXNlbnQgc3BlY2lhbGx5IHdoZW4gdXNpbmcgcGlwZWxpbmUgb3Igc3RyZWFtXG4gICAgaWYgKHN0cmVhbS5zdGF0ZT8uc3RhdGUgPT0gbnVsbCB8fCBzdHJlYW0uc3RhdGUuc3RhdGUgPCA2KSB7XG4gICAgICByZXF1ZXN0Lm9uQ29tcGxldGUoW10pXG4gICAgfVxuXG4gICAgaWYgKHNlc3Npb25ba09wZW5TdHJlYW1zXSA9PT0gMCkge1xuICAgICAgLy8gU3RyZWFtIGlzIGNsb3NlZCBvciBoYWxmLWNsb3NlZC1yZW1vdGUgKDYpLCBkZWNyZW1lbnQgY291bnRlciBhbmQgY2xlYW51cFxuICAgICAgLy8gSXQgZG9lcyBub3QgaGF2ZSBzZW5zZSB0byBjb250aW51ZSB3b3JraW5nIHdpdGggdGhlIHN0cmVhbSBhcyB3ZSBkbyBub3RcbiAgICAgIC8vIGhhdmUgeWV0IFJTVF9TVFJFQU0gc3VwcG9ydCBvbiBjbGllbnQtc2lkZVxuXG4gICAgICBzZXNzaW9uLnVucmVmKClcbiAgICB9XG5cbiAgICBhYm9ydChuZXcgSW5mb3JtYXRpb25hbEVycm9yKCdIVFRQLzI6IHN0cmVhbSBoYWxmLWNsb3NlZCAocmVtb3RlKScpKVxuICAgIGNsaWVudFtrUXVldWVdW2NsaWVudFtrUnVubmluZ0lkeF0rK10gPSBudWxsXG4gICAgY2xpZW50W2tQZW5kaW5nSWR4XSA9IGNsaWVudFtrUnVubmluZ0lkeF1cbiAgICBjbGllbnRba1Jlc3VtZV0oKVxuICB9KVxuXG4gIHN0cmVhbS5vbmNlKCdjbG9zZScsICgpID0+IHtcbiAgICBzZXNzaW9uW2tPcGVuU3RyZWFtc10gLT0gMVxuICAgIGlmIChzZXNzaW9uW2tPcGVuU3RyZWFtc10gPT09IDApIHtcbiAgICAgIHNlc3Npb24udW5yZWYoKVxuICAgIH1cbiAgfSlcblxuICBzdHJlYW0ub25jZSgnZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgYWJvcnQoZXJyKVxuICB9KVxuXG4gIHN0cmVhbS5vbmNlKCdmcmFtZUVycm9yJywgKHR5cGUsIGNvZGUpID0+IHtcbiAgICBhYm9ydChuZXcgSW5mb3JtYXRpb25hbEVycm9yKGBIVFRQLzI6IFwiZnJhbWVFcnJvclwiIHJlY2VpdmVkIC0gdHlwZSAke3R5cGV9LCBjb2RlICR7Y29kZX1gKSlcbiAgfSlcblxuICAvLyBzdHJlYW0ub24oJ2Fib3J0ZWQnLCAoKSA9PiB7XG4gIC8vICAgLy8gVE9ETyhIVFRQLzIpOiBTdXBwb3J0IGFib3J0ZWRcbiAgLy8gfSlcblxuICAvLyBzdHJlYW0ub24oJ3RpbWVvdXQnLCAoKSA9PiB7XG4gIC8vICAgLy8gVE9ETyhIVFRQLzIpOiBTdXBwb3J0IHRpbWVvdXRcbiAgLy8gfSlcblxuICAvLyBzdHJlYW0ub24oJ3B1c2gnLCBoZWFkZXJzID0+IHtcbiAgLy8gICAvLyBUT0RPKEhUVFAvMik6IFN1cHBvcnQgcHVzaFxuICAvLyB9KVxuXG4gIC8vIHN0cmVhbS5vbigndHJhaWxlcnMnLCBoZWFkZXJzID0+IHtcbiAgLy8gICAvLyBUT0RPKEhUVFAvMik6IFN1cHBvcnQgdHJhaWxlcnNcbiAgLy8gfSlcblxuICByZXR1cm4gdHJ1ZVxuXG4gIGZ1bmN0aW9uIHdyaXRlQm9keUgyICgpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZTogYXNzZXJ0aW9uICovXG4gICAgaWYgKCFib2R5IHx8IGNvbnRlbnRMZW5ndGggPT09IDApIHtcbiAgICAgIHdyaXRlQnVmZmVyKFxuICAgICAgICBhYm9ydCxcbiAgICAgICAgc3RyZWFtLFxuICAgICAgICBudWxsLFxuICAgICAgICBjbGllbnQsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIGNsaWVudFtrU29ja2V0XSxcbiAgICAgICAgY29udGVudExlbmd0aCxcbiAgICAgICAgZXhwZWN0c1BheWxvYWRcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKHV0aWwuaXNCdWZmZXIoYm9keSkpIHtcbiAgICAgIHdyaXRlQnVmZmVyKFxuICAgICAgICBhYm9ydCxcbiAgICAgICAgc3RyZWFtLFxuICAgICAgICBib2R5LFxuICAgICAgICBjbGllbnQsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIGNsaWVudFtrU29ja2V0XSxcbiAgICAgICAgY29udGVudExlbmd0aCxcbiAgICAgICAgZXhwZWN0c1BheWxvYWRcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKHV0aWwuaXNCbG9iTGlrZShib2R5KSkge1xuICAgICAgaWYgKHR5cGVvZiBib2R5LnN0cmVhbSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3cml0ZUl0ZXJhYmxlKFxuICAgICAgICAgIGFib3J0LFxuICAgICAgICAgIHN0cmVhbSxcbiAgICAgICAgICBib2R5LnN0cmVhbSgpLFxuICAgICAgICAgIGNsaWVudCxcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIGNsaWVudFtrU29ja2V0XSxcbiAgICAgICAgICBjb250ZW50TGVuZ3RoLFxuICAgICAgICAgIGV4cGVjdHNQYXlsb2FkXG4gICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdyaXRlQmxvYihcbiAgICAgICAgICBhYm9ydCxcbiAgICAgICAgICBzdHJlYW0sXG4gICAgICAgICAgYm9keSxcbiAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICBjbGllbnRba1NvY2tldF0sXG4gICAgICAgICAgY29udGVudExlbmd0aCxcbiAgICAgICAgICBleHBlY3RzUGF5bG9hZFxuICAgICAgICApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh1dGlsLmlzU3RyZWFtKGJvZHkpKSB7XG4gICAgICB3cml0ZVN0cmVhbShcbiAgICAgICAgYWJvcnQsXG4gICAgICAgIGNsaWVudFtrU29ja2V0XSxcbiAgICAgICAgZXhwZWN0c1BheWxvYWQsXG4gICAgICAgIHN0cmVhbSxcbiAgICAgICAgYm9keSxcbiAgICAgICAgY2xpZW50LFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICBjb250ZW50TGVuZ3RoXG4gICAgICApXG4gICAgfSBlbHNlIGlmICh1dGlsLmlzSXRlcmFibGUoYm9keSkpIHtcbiAgICAgIHdyaXRlSXRlcmFibGUoXG4gICAgICAgIGFib3J0LFxuICAgICAgICBzdHJlYW0sXG4gICAgICAgIGJvZHksXG4gICAgICAgIGNsaWVudCxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgY2xpZW50W2tTb2NrZXRdLFxuICAgICAgICBjb250ZW50TGVuZ3RoLFxuICAgICAgICBleHBlY3RzUGF5bG9hZFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoZmFsc2UpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHdyaXRlQnVmZmVyIChhYm9ydCwgaDJzdHJlYW0sIGJvZHksIGNsaWVudCwgcmVxdWVzdCwgc29ja2V0LCBjb250ZW50TGVuZ3RoLCBleHBlY3RzUGF5bG9hZCkge1xuICB0cnkge1xuICAgIGlmIChib2R5ICE9IG51bGwgJiYgdXRpbC5pc0J1ZmZlcihib2R5KSkge1xuICAgICAgYXNzZXJ0KGNvbnRlbnRMZW5ndGggPT09IGJvZHkuYnl0ZUxlbmd0aCwgJ2J1ZmZlciBib2R5IG11c3QgaGF2ZSBjb250ZW50IGxlbmd0aCcpXG4gICAgICBoMnN0cmVhbS5jb3JrKClcbiAgICAgIGgyc3RyZWFtLndyaXRlKGJvZHkpXG4gICAgICBoMnN0cmVhbS51bmNvcmsoKVxuICAgICAgaDJzdHJlYW0uZW5kKClcblxuICAgICAgcmVxdWVzdC5vbkJvZHlTZW50KGJvZHkpXG4gICAgfVxuXG4gICAgaWYgKCFleHBlY3RzUGF5bG9hZCkge1xuICAgICAgc29ja2V0W2tSZXNldF0gPSB0cnVlXG4gICAgfVxuXG4gICAgcmVxdWVzdC5vblJlcXVlc3RTZW50KClcbiAgICBjbGllbnRba1Jlc3VtZV0oKVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGFib3J0KGVycm9yKVxuICB9XG59XG5cbmZ1bmN0aW9uIHdyaXRlU3RyZWFtIChhYm9ydCwgc29ja2V0LCBleHBlY3RzUGF5bG9hZCwgaDJzdHJlYW0sIGJvZHksIGNsaWVudCwgcmVxdWVzdCwgY29udGVudExlbmd0aCkge1xuICBhc3NlcnQoY29udGVudExlbmd0aCAhPT0gMCB8fCBjbGllbnRba1J1bm5pbmddID09PSAwLCAnc3RyZWFtIGJvZHkgY2Fubm90IGJlIHBpcGVsaW5lZCcpXG5cbiAgLy8gRm9yIEhUVFAvMiwgaXMgZW5vdWdoIHRvIHBpcGUgdGhlIHN0cmVhbVxuICBjb25zdCBwaXBlID0gcGlwZWxpbmUoXG4gICAgYm9keSxcbiAgICBoMnN0cmVhbSxcbiAgICAoZXJyKSA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHV0aWwuZGVzdHJveShwaXBlLCBlcnIpXG4gICAgICAgIGFib3J0KGVycilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHV0aWwucmVtb3ZlQWxsTGlzdGVuZXJzKHBpcGUpXG4gICAgICAgIHJlcXVlc3Qub25SZXF1ZXN0U2VudCgpXG5cbiAgICAgICAgaWYgKCFleHBlY3RzUGF5bG9hZCkge1xuICAgICAgICAgIHNvY2tldFtrUmVzZXRdID0gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY2xpZW50W2tSZXN1bWVdKClcbiAgICAgIH1cbiAgICB9XG4gIClcblxuICB1dGlsLmFkZExpc3RlbmVyKHBpcGUsICdkYXRhJywgb25QaXBlRGF0YSlcblxuICBmdW5jdGlvbiBvblBpcGVEYXRhIChjaHVuaykge1xuICAgIHJlcXVlc3Qub25Cb2R5U2VudChjaHVuaylcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUJsb2IgKGFib3J0LCBoMnN0cmVhbSwgYm9keSwgY2xpZW50LCByZXF1ZXN0LCBzb2NrZXQsIGNvbnRlbnRMZW5ndGgsIGV4cGVjdHNQYXlsb2FkKSB7XG4gIGFzc2VydChjb250ZW50TGVuZ3RoID09PSBib2R5LnNpemUsICdibG9iIGJvZHkgbXVzdCBoYXZlIGNvbnRlbnQgbGVuZ3RoJylcblxuICB0cnkge1xuICAgIGlmIChjb250ZW50TGVuZ3RoICE9IG51bGwgJiYgY29udGVudExlbmd0aCAhPT0gYm9keS5zaXplKSB7XG4gICAgICB0aHJvdyBuZXcgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yKClcbiAgICB9XG5cbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShhd2FpdCBib2R5LmFycmF5QnVmZmVyKCkpXG5cbiAgICBoMnN0cmVhbS5jb3JrKClcbiAgICBoMnN0cmVhbS53cml0ZShidWZmZXIpXG4gICAgaDJzdHJlYW0udW5jb3JrKClcbiAgICBoMnN0cmVhbS5lbmQoKVxuXG4gICAgcmVxdWVzdC5vbkJvZHlTZW50KGJ1ZmZlcilcbiAgICByZXF1ZXN0Lm9uUmVxdWVzdFNlbnQoKVxuXG4gICAgaWYgKCFleHBlY3RzUGF5bG9hZCkge1xuICAgICAgc29ja2V0W2tSZXNldF0gPSB0cnVlXG4gICAgfVxuXG4gICAgY2xpZW50W2tSZXN1bWVdKClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgYWJvcnQoZXJyKVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlSXRlcmFibGUgKGFib3J0LCBoMnN0cmVhbSwgYm9keSwgY2xpZW50LCByZXF1ZXN0LCBzb2NrZXQsIGNvbnRlbnRMZW5ndGgsIGV4cGVjdHNQYXlsb2FkKSB7XG4gIGFzc2VydChjb250ZW50TGVuZ3RoICE9PSAwIHx8IGNsaWVudFtrUnVubmluZ10gPT09IDAsICdpdGVyYXRvciBib2R5IGNhbm5vdCBiZSBwaXBlbGluZWQnKVxuXG4gIGxldCBjYWxsYmFjayA9IG51bGxcbiAgZnVuY3Rpb24gb25EcmFpbiAoKSB7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBjb25zdCBjYiA9IGNhbGxiYWNrXG4gICAgICBjYWxsYmFjayA9IG51bGxcbiAgICAgIGNiKClcbiAgICB9XG4gIH1cblxuICBjb25zdCB3YWl0Rm9yRHJhaW4gPSAoKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgYXNzZXJ0KGNhbGxiYWNrID09PSBudWxsKVxuXG4gICAgaWYgKHNvY2tldFtrRXJyb3JdKSB7XG4gICAgICByZWplY3Qoc29ja2V0W2tFcnJvcl0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrID0gcmVzb2x2ZVxuICAgIH1cbiAgfSlcblxuICBoMnN0cmVhbVxuICAgIC5vbignY2xvc2UnLCBvbkRyYWluKVxuICAgIC5vbignZHJhaW4nLCBvbkRyYWluKVxuXG4gIHRyeSB7XG4gICAgLy8gSXQncyB1cCB0byB0aGUgdXNlciB0byBzb21laG93IGFib3J0IHRoZSBhc3luYyBpdGVyYWJsZS5cbiAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIGJvZHkpIHtcbiAgICAgIGlmIChzb2NrZXRba0Vycm9yXSkge1xuICAgICAgICB0aHJvdyBzb2NrZXRba0Vycm9yXVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXMgPSBoMnN0cmVhbS53cml0ZShjaHVuaylcbiAgICAgIHJlcXVlc3Qub25Cb2R5U2VudChjaHVuaylcbiAgICAgIGlmICghcmVzKSB7XG4gICAgICAgIGF3YWl0IHdhaXRGb3JEcmFpbigpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaDJzdHJlYW0uZW5kKClcblxuICAgIHJlcXVlc3Qub25SZXF1ZXN0U2VudCgpXG5cbiAgICBpZiAoIWV4cGVjdHNQYXlsb2FkKSB7XG4gICAgICBzb2NrZXRba1Jlc2V0XSA9IHRydWVcbiAgICB9XG5cbiAgICBjbGllbnRba1Jlc3VtZV0oKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBhYm9ydChlcnIpXG4gIH0gZmluYWxseSB7XG4gICAgaDJzdHJlYW1cbiAgICAgIC5vZmYoJ2Nsb3NlJywgb25EcmFpbilcbiAgICAgIC5vZmYoJ2RyYWluJywgb25EcmFpbilcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbm5lY3RIMlxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBrQm9keVVzZWQgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdub2RlOmFzc2VydCcpXG5jb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5jb25zdCBFRSA9IHJlcXVpcmUoJ25vZGU6ZXZlbnRzJylcblxuY29uc3QgcmVkaXJlY3RhYmxlU3RhdHVzQ29kZXMgPSBbMzAwLCAzMDEsIDMwMiwgMzAzLCAzMDcsIDMwOF1cblxuY29uc3Qga0JvZHkgPSBTeW1ib2woJ2JvZHknKVxuXG5jbGFzcyBCb2R5QXN5bmNJdGVyYWJsZSB7XG4gIGNvbnN0cnVjdG9yIChib2R5KSB7XG4gICAgdGhpc1trQm9keV0gPSBib2R5XG4gICAgdGhpc1trQm9keVVzZWRdID0gZmFsc2VcbiAgfVxuXG4gIGFzeW5jICogW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSAoKSB7XG4gICAgYXNzZXJ0KCF0aGlzW2tCb2R5VXNlZF0sICdkaXN0dXJiZWQnKVxuICAgIHRoaXNba0JvZHlVc2VkXSA9IHRydWVcbiAgICB5aWVsZCAqIHRoaXNba0JvZHldXG4gIH1cbn1cblxuY2xhc3MgUmVkaXJlY3RIYW5kbGVyIHtcbiAgY29uc3RydWN0b3IgKGRpc3BhdGNoLCBtYXhSZWRpcmVjdGlvbnMsIG9wdHMsIGhhbmRsZXIpIHtcbiAgICBpZiAobWF4UmVkaXJlY3Rpb25zICE9IG51bGwgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKG1heFJlZGlyZWN0aW9ucykgfHwgbWF4UmVkaXJlY3Rpb25zIDwgMCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignbWF4UmVkaXJlY3Rpb25zIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKVxuICAgIH1cblxuICAgIHV0aWwudmFsaWRhdGVIYW5kbGVyKGhhbmRsZXIsIG9wdHMubWV0aG9kLCBvcHRzLnVwZ3JhZGUpXG5cbiAgICB0aGlzLmRpc3BhdGNoID0gZGlzcGF0Y2hcbiAgICB0aGlzLmxvY2F0aW9uID0gbnVsbFxuICAgIHRoaXMuYWJvcnQgPSBudWxsXG4gICAgdGhpcy5vcHRzID0geyAuLi5vcHRzLCBtYXhSZWRpcmVjdGlvbnM6IDAgfSAvLyBvcHRzIG11c3QgYmUgYSBjb3B5XG4gICAgdGhpcy5tYXhSZWRpcmVjdGlvbnMgPSBtYXhSZWRpcmVjdGlvbnNcbiAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyXG4gICAgdGhpcy5oaXN0b3J5ID0gW11cbiAgICB0aGlzLnJlZGlyZWN0aW9uTGltaXRSZWFjaGVkID0gZmFsc2VcblxuICAgIGlmICh1dGlsLmlzU3RyZWFtKHRoaXMub3B0cy5ib2R5KSkge1xuICAgICAgLy8gVE9ETyAoZml4KTogUHJvdmlkZSBzb21lIHdheSBmb3IgdGhlIHVzZXIgdG8gY2FjaGUgdGhlIGZpbGUgdG8gZS5nLiAvdG1wXG4gICAgICAvLyBzbyB0aGF0IGl0IGNhbiBiZSBkaXNwYXRjaGVkIGFnYWluP1xuICAgICAgLy8gVE9ETyAoZml4KTogRG8gd2UgbmVlZCAxMDAtZXhwZWN0IHN1cHBvcnQgdG8gcHJvdmlkZSBhIHdheSB0byBkbyB0aGlzIHByb3Blcmx5P1xuICAgICAgaWYgKHV0aWwuYm9keUxlbmd0aCh0aGlzLm9wdHMuYm9keSkgPT09IDApIHtcbiAgICAgICAgdGhpcy5vcHRzLmJvZHlcbiAgICAgICAgICAub24oJ2RhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBhc3NlcnQoZmFsc2UpXG4gICAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdHMuYm9keS5yZWFkYWJsZURpZFJlYWQgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aGlzLm9wdHMuYm9keVtrQm9keVVzZWRdID0gZmFsc2VcbiAgICAgICAgRUUucHJvdG90eXBlLm9uLmNhbGwodGhpcy5vcHRzLmJvZHksICdkYXRhJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRoaXNba0JvZHlVc2VkXSA9IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMub3B0cy5ib2R5ICYmIHR5cGVvZiB0aGlzLm9wdHMuYm9keS5waXBlVG8gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFRPRE8gKGZpeCk6IFdlIGNhbid0IGFjY2VzcyBSZWFkYWJsZVN0cmVhbSBpbnRlcm5hbCBzdGF0ZVxuICAgICAgLy8gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGl0IGhhcyBiZWVuIGRpc3R1cmJlZC4gVGhpcyBpcyBqdXN0XG4gICAgICAvLyBhIHdvcmthcm91bmQuXG4gICAgICB0aGlzLm9wdHMuYm9keSA9IG5ldyBCb2R5QXN5bmNJdGVyYWJsZSh0aGlzLm9wdHMuYm9keSlcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5vcHRzLmJvZHkgJiZcbiAgICAgIHR5cGVvZiB0aGlzLm9wdHMuYm9keSAhPT0gJ3N0cmluZycgJiZcbiAgICAgICFBcnJheUJ1ZmZlci5pc1ZpZXcodGhpcy5vcHRzLmJvZHkpICYmXG4gICAgICB1dGlsLmlzSXRlcmFibGUodGhpcy5vcHRzLmJvZHkpXG4gICAgKSB7XG4gICAgICAvLyBUT0RPOiBTaG91bGQgd2UgYWxsb3cgcmUtdXNpbmcgaXRlcmFibGUgaWYgIXRoaXMub3B0cy5pZGVtcG90ZW50XG4gICAgICAvLyBvciB0aHJvdWdoIHNvbWUgb3RoZXIgZmxhZz9cbiAgICAgIHRoaXMub3B0cy5ib2R5ID0gbmV3IEJvZHlBc3luY0l0ZXJhYmxlKHRoaXMub3B0cy5ib2R5KVxuICAgIH1cbiAgfVxuXG4gIG9uQ29ubmVjdCAoYWJvcnQpIHtcbiAgICB0aGlzLmFib3J0ID0gYWJvcnRcbiAgICB0aGlzLmhhbmRsZXIub25Db25uZWN0KGFib3J0LCB7IGhpc3Rvcnk6IHRoaXMuaGlzdG9yeSB9KVxuICB9XG5cbiAgb25VcGdyYWRlIChzdGF0dXNDb2RlLCBoZWFkZXJzLCBzb2NrZXQpIHtcbiAgICB0aGlzLmhhbmRsZXIub25VcGdyYWRlKHN0YXR1c0NvZGUsIGhlYWRlcnMsIHNvY2tldClcbiAgfVxuXG4gIG9uRXJyb3IgKGVycm9yKSB7XG4gICAgdGhpcy5oYW5kbGVyLm9uRXJyb3IoZXJyb3IpXG4gIH1cblxuICBvbkhlYWRlcnMgKHN0YXR1c0NvZGUsIGhlYWRlcnMsIHJlc3VtZSwgc3RhdHVzVGV4dCkge1xuICAgIHRoaXMubG9jYXRpb24gPSB0aGlzLmhpc3RvcnkubGVuZ3RoID49IHRoaXMubWF4UmVkaXJlY3Rpb25zIHx8IHV0aWwuaXNEaXN0dXJiZWQodGhpcy5vcHRzLmJvZHkpXG4gICAgICA/IG51bGxcbiAgICAgIDogcGFyc2VMb2NhdGlvbihzdGF0dXNDb2RlLCBoZWFkZXJzKVxuXG4gICAgaWYgKHRoaXMub3B0cy50aHJvd09uTWF4UmVkaXJlY3QgJiYgdGhpcy5oaXN0b3J5Lmxlbmd0aCA+PSB0aGlzLm1heFJlZGlyZWN0aW9ucykge1xuICAgICAgaWYgKHRoaXMucmVxdWVzdCkge1xuICAgICAgICB0aGlzLnJlcXVlc3QuYWJvcnQobmV3IEVycm9yKCdtYXggcmVkaXJlY3RzJykpXG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVkaXJlY3Rpb25MaW1pdFJlYWNoZWQgPSB0cnVlXG4gICAgICB0aGlzLmFib3J0KG5ldyBFcnJvcignbWF4IHJlZGlyZWN0cycpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0cy5vcmlnaW4pIHtcbiAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKG5ldyBVUkwodGhpcy5vcHRzLnBhdGgsIHRoaXMub3B0cy5vcmlnaW4pKVxuICAgIH1cblxuICAgIGlmICghdGhpcy5sb2NhdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkhlYWRlcnMoc3RhdHVzQ29kZSwgaGVhZGVycywgcmVzdW1lLCBzdGF0dXNUZXh0KVxuICAgIH1cblxuICAgIGNvbnN0IHsgb3JpZ2luLCBwYXRobmFtZSwgc2VhcmNoIH0gPSB1dGlsLnBhcnNlVVJMKG5ldyBVUkwodGhpcy5sb2NhdGlvbiwgdGhpcy5vcHRzLm9yaWdpbiAmJiBuZXcgVVJMKHRoaXMub3B0cy5wYXRoLCB0aGlzLm9wdHMub3JpZ2luKSkpXG4gICAgY29uc3QgcGF0aCA9IHNlYXJjaCA/IGAke3BhdGhuYW1lfSR7c2VhcmNofWAgOiBwYXRobmFtZVxuXG4gICAgLy8gUmVtb3ZlIGhlYWRlcnMgcmVmZXJyaW5nIHRvIHRoZSBvcmlnaW5hbCBVUkwuXG4gICAgLy8gQnkgZGVmYXVsdCBpdCBpcyBIb3N0IG9ubHksIHVubGVzcyBpdCdzIGEgMzAzIChzZWUgYmVsb3cpLCB3aGljaCByZW1vdmVzIGFsc28gYWxsIENvbnRlbnQtKiBoZWFkZXJzLlxuICAgIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi40XG4gICAgdGhpcy5vcHRzLmhlYWRlcnMgPSBjbGVhblJlcXVlc3RIZWFkZXJzKHRoaXMub3B0cy5oZWFkZXJzLCBzdGF0dXNDb2RlID09PSAzMDMsIHRoaXMub3B0cy5vcmlnaW4gIT09IG9yaWdpbilcbiAgICB0aGlzLm9wdHMucGF0aCA9IHBhdGhcbiAgICB0aGlzLm9wdHMub3JpZ2luID0gb3JpZ2luXG4gICAgdGhpcy5vcHRzLm1heFJlZGlyZWN0aW9ucyA9IDBcbiAgICB0aGlzLm9wdHMucXVlcnkgPSBudWxsXG5cbiAgICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNC40XG4gICAgLy8gSW4gY2FzZSBvZiBIVFRQIDMwMywgYWx3YXlzIHJlcGxhY2UgbWV0aG9kIHRvIGJlIGVpdGhlciBIRUFEIG9yIEdFVFxuICAgIGlmIChzdGF0dXNDb2RlID09PSAzMDMgJiYgdGhpcy5vcHRzLm1ldGhvZCAhPT0gJ0hFQUQnKSB7XG4gICAgICB0aGlzLm9wdHMubWV0aG9kID0gJ0dFVCdcbiAgICAgIHRoaXMub3B0cy5ib2R5ID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIG9uRGF0YSAoY2h1bmspIHtcbiAgICBpZiAodGhpcy5sb2NhdGlvbikge1xuICAgICAgLypcbiAgICAgICAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjRcblxuICAgICAgICBUTERSOiB1bmRpY2kgYWx3YXlzIGlnbm9yZXMgM3h4IHJlc3BvbnNlIGJvZGllcy5cblxuICAgICAgICBSZWRpcmVjdGlvbiBpcyB1c2VkIHRvIHNlcnZlIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgZnJvbSBhbm90aGVyIFVSTCwgc28gaXQgaXMgYXNzdW1lcyB0aGF0XG4gICAgICAgIG5vIGJvZHkgaXMgZ2VuZXJhdGVkIChhbmQgdGh1cyBjYW4gYmUgaWdub3JlZCkuIEV2ZW4gdGhvdWdoIGdlbmVyYXRpbmcgYSBib2R5IGlzIG5vdCBwcm9oaWJpdGVkLlxuXG4gICAgICAgIEZvciBzdGF0dXMgMzAxLCAzMDIsIDMwMywgMzA3IGFuZCAzMDggKHRoZSBsYXR0ZXIgZnJvbSBSRkMgNzIzOCksIHRoZSBzcGVjcyBtZW50aW9uIHRoYXQgdGhlIGJvZHkgdXN1YWxseVxuICAgICAgICAod2hpY2ggbWVhbnMgaXQncyBvcHRpb25hbCBhbmQgbm90IG1hbmRhdGVkKSBjb250YWluIGp1c3QgYW4gaHlwZXJsaW5rIHRvIHRoZSB2YWx1ZSBvZlxuICAgICAgICB0aGUgTG9jYXRpb24gcmVzcG9uc2UgaGVhZGVyLCBzbyB0aGUgYm9keSBjYW4gYmUgaWdub3JlZCBzYWZlbHkuXG5cbiAgICAgICAgRm9yIHN0YXR1cyAzMDAsIHdoaWNoIGlzIFwiTXVsdGlwbGUgQ2hvaWNlc1wiLCB0aGUgc3BlYyBtZW50aW9ucyBib3RoIGdlbmVyYXRpbmcgYSBMb2NhdGlvblxuICAgICAgICByZXNwb25zZSBoZWFkZXIgQU5EIGEgcmVzcG9uc2UgYm9keSB3aXRoIHRoZSBvdGhlciBwb3NzaWJsZSBsb2NhdGlvbiB0byBmb2xsb3cuXG4gICAgICAgIFNpbmNlIHRoZSBzcGVjIGV4cGxpY2l0bHkgY2hvb3NlcyBub3QgdG8gc3BlY2lmeSBhIGZvcm1hdCBmb3Igc3VjaCBib2R5IGFuZCBsZWF2ZSBpdCB0b1xuICAgICAgICBzZXJ2ZXJzIGFuZCBicm93c2VycyBpbXBsZW1lbnRvcnMsIHdlIGlnbm9yZSB0aGUgYm9keSBhcyB0aGVyZSBpcyBubyBzcGVjaWZpZWQgd2F5IHRvIGV2ZW50dWFsbHkgcGFyc2UgaXQuXG4gICAgICAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uRGF0YShjaHVuaylcbiAgICB9XG4gIH1cblxuICBvbkNvbXBsZXRlICh0cmFpbGVycykge1xuICAgIGlmICh0aGlzLmxvY2F0aW9uKSB7XG4gICAgICAvKlxuICAgICAgICBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNFxuXG4gICAgICAgIFRMRFI6IHVuZGljaSBhbHdheXMgaWdub3JlcyAzeHggcmVzcG9uc2UgdHJhaWxlcnMgYXMgdGhleSBhcmUgbm90IGV4cGVjdGVkIGluIGNhc2Ugb2YgcmVkaXJlY3Rpb25zXG4gICAgICAgIGFuZCBuZWl0aGVyIGFyZSB1c2VmdWwgaWYgcHJlc2VudC5cblxuICAgICAgICBTZWUgY29tbWVudCBvbiBvbkRhdGEgbWV0aG9kIGFib3ZlIGZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uLlxuICAgICAgKi9cblxuICAgICAgdGhpcy5sb2NhdGlvbiA9IG51bGxcbiAgICAgIHRoaXMuYWJvcnQgPSBudWxsXG5cbiAgICAgIHRoaXMuZGlzcGF0Y2godGhpcy5vcHRzLCB0aGlzKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhhbmRsZXIub25Db21wbGV0ZSh0cmFpbGVycylcbiAgICB9XG4gIH1cblxuICBvbkJvZHlTZW50IChjaHVuaykge1xuICAgIGlmICh0aGlzLmhhbmRsZXIub25Cb2R5U2VudCkge1xuICAgICAgdGhpcy5oYW5kbGVyLm9uQm9keVNlbnQoY2h1bmspXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlTG9jYXRpb24gKHN0YXR1c0NvZGUsIGhlYWRlcnMpIHtcbiAgaWYgKHJlZGlyZWN0YWJsZVN0YXR1c0NvZGVzLmluZGV4T2Yoc3RhdHVzQ29kZSkgPT09IC0xKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkgKz0gMikge1xuICAgIGlmIChoZWFkZXJzW2ldLmxlbmd0aCA9PT0gOCAmJiB1dGlsLmhlYWRlck5hbWVUb1N0cmluZyhoZWFkZXJzW2ldKSA9PT0gJ2xvY2F0aW9uJykge1xuICAgICAgcmV0dXJuIGhlYWRlcnNbaSArIDFdXG4gICAgfVxuICB9XG59XG5cbi8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi40LjRcbmZ1bmN0aW9uIHNob3VsZFJlbW92ZUhlYWRlciAoaGVhZGVyLCByZW1vdmVDb250ZW50LCB1bmtub3duT3JpZ2luKSB7XG4gIGlmIChoZWFkZXIubGVuZ3RoID09PSA0KSB7XG4gICAgcmV0dXJuIHV0aWwuaGVhZGVyTmFtZVRvU3RyaW5nKGhlYWRlcikgPT09ICdob3N0J1xuICB9XG4gIGlmIChyZW1vdmVDb250ZW50ICYmIHV0aWwuaGVhZGVyTmFtZVRvU3RyaW5nKGhlYWRlcikuc3RhcnRzV2l0aCgnY29udGVudC0nKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgaWYgKHVua25vd25PcmlnaW4gJiYgKGhlYWRlci5sZW5ndGggPT09IDEzIHx8IGhlYWRlci5sZW5ndGggPT09IDYgfHwgaGVhZGVyLmxlbmd0aCA9PT0gMTkpKSB7XG4gICAgY29uc3QgbmFtZSA9IHV0aWwuaGVhZGVyTmFtZVRvU3RyaW5nKGhlYWRlcilcbiAgICByZXR1cm4gbmFtZSA9PT0gJ2F1dGhvcml6YXRpb24nIHx8IG5hbWUgPT09ICdjb29raWUnIHx8IG5hbWUgPT09ICdwcm94eS1hdXRob3JpemF0aW9uJ1xuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG4vLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNFxuZnVuY3Rpb24gY2xlYW5SZXF1ZXN0SGVhZGVycyAoaGVhZGVycywgcmVtb3ZlQ29udGVudCwgdW5rbm93bk9yaWdpbikge1xuICBjb25zdCByZXQgPSBbXVxuICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgaWYgKCFzaG91bGRSZW1vdmVIZWFkZXIoaGVhZGVyc1tpXSwgcmVtb3ZlQ29udGVudCwgdW5rbm93bk9yaWdpbikpIHtcbiAgICAgICAgcmV0LnB1c2goaGVhZGVyc1tpXSwgaGVhZGVyc1tpICsgMV0pXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGhlYWRlcnMgJiYgdHlwZW9mIGhlYWRlcnMgPT09ICdvYmplY3QnKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoaGVhZGVycykpIHtcbiAgICAgIGlmICghc2hvdWxkUmVtb3ZlSGVhZGVyKGtleSwgcmVtb3ZlQ29udGVudCwgdW5rbm93bk9yaWdpbikpIHtcbiAgICAgICAgcmV0LnB1c2goa2V5LCBoZWFkZXJzW2tleV0pXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGFzc2VydChoZWFkZXJzID09IG51bGwsICdoZWFkZXJzIG11c3QgYmUgYW4gb2JqZWN0IG9yIGFuIGFycmF5JylcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmVkaXJlY3RIYW5kbGVyXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgUmVkaXJlY3RIYW5kbGVyID0gcmVxdWlyZSgnLi4vaGFuZGxlci9yZWRpcmVjdC1oYW5kbGVyJylcblxuZnVuY3Rpb24gY3JlYXRlUmVkaXJlY3RJbnRlcmNlcHRvciAoeyBtYXhSZWRpcmVjdGlvbnM6IGRlZmF1bHRNYXhSZWRpcmVjdGlvbnMgfSkge1xuICByZXR1cm4gKGRpc3BhdGNoKSA9PiB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIEludGVyY2VwdCAob3B0cywgaGFuZGxlcikge1xuICAgICAgY29uc3QgeyBtYXhSZWRpcmVjdGlvbnMgPSBkZWZhdWx0TWF4UmVkaXJlY3Rpb25zIH0gPSBvcHRzXG5cbiAgICAgIGlmICghbWF4UmVkaXJlY3Rpb25zKSB7XG4gICAgICAgIHJldHVybiBkaXNwYXRjaChvcHRzLCBoYW5kbGVyKVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWRpcmVjdEhhbmRsZXIgPSBuZXcgUmVkaXJlY3RIYW5kbGVyKGRpc3BhdGNoLCBtYXhSZWRpcmVjdGlvbnMsIG9wdHMsIGhhbmRsZXIpXG4gICAgICBvcHRzID0geyAuLi5vcHRzLCBtYXhSZWRpcmVjdGlvbnM6IDAgfSAvLyBTdG9wIHN1YiBkaXNwYXRjaGVyIGZyb20gYWxzbyByZWRpcmVjdGluZy5cbiAgICAgIHJldHVybiBkaXNwYXRjaChvcHRzLCByZWRpcmVjdEhhbmRsZXIpXG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlUmVkaXJlY3RJbnRlcmNlcHRvclxuIiwiLy8gQHRzLWNoZWNrXG5cbid1c2Ugc3RyaWN0J1xuXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdub2RlOmFzc2VydCcpXG5jb25zdCBuZXQgPSByZXF1aXJlKCdub2RlOm5ldCcpXG5jb25zdCBodHRwID0gcmVxdWlyZSgnbm9kZTpodHRwJylcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwuanMnKVxuY29uc3QgeyBjaGFubmVscyB9ID0gcmVxdWlyZSgnLi4vY29yZS9kaWFnbm9zdGljcy5qcycpXG5jb25zdCBSZXF1ZXN0ID0gcmVxdWlyZSgnLi4vY29yZS9yZXF1ZXN0LmpzJylcbmNvbnN0IERpc3BhdGNoZXJCYXNlID0gcmVxdWlyZSgnLi9kaXNwYXRjaGVyLWJhc2UnKVxuY29uc3Qge1xuICBJbnZhbGlkQXJndW1lbnRFcnJvcixcbiAgSW5mb3JtYXRpb25hbEVycm9yLFxuICBDbGllbnREZXN0cm95ZWRFcnJvclxufSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzLmpzJylcbmNvbnN0IGJ1aWxkQ29ubmVjdG9yID0gcmVxdWlyZSgnLi4vY29yZS9jb25uZWN0LmpzJylcbmNvbnN0IHtcbiAga1VybCxcbiAga1NlcnZlck5hbWUsXG4gIGtDbGllbnQsXG4gIGtCdXN5LFxuICBrQ29ubmVjdCxcbiAga1Jlc3VtaW5nLFxuICBrUnVubmluZyxcbiAga1BlbmRpbmcsXG4gIGtTaXplLFxuICBrUXVldWUsXG4gIGtDb25uZWN0ZWQsXG4gIGtDb25uZWN0aW5nLFxuICBrTmVlZERyYWluLFxuICBrS2VlcEFsaXZlRGVmYXVsdFRpbWVvdXQsXG4gIGtIb3N0SGVhZGVyLFxuICBrUGVuZGluZ0lkeCxcbiAga1J1bm5pbmdJZHgsXG4gIGtFcnJvcixcbiAga1BpcGVsaW5pbmcsXG4gIGtLZWVwQWxpdmVUaW1lb3V0VmFsdWUsXG4gIGtNYXhIZWFkZXJzU2l6ZSxcbiAga0tlZXBBbGl2ZU1heFRpbWVvdXQsXG4gIGtLZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkLFxuICBrSGVhZGVyc1RpbWVvdXQsXG4gIGtCb2R5VGltZW91dCxcbiAga1N0cmljdENvbnRlbnRMZW5ndGgsXG4gIGtDb25uZWN0b3IsXG4gIGtNYXhSZWRpcmVjdGlvbnMsXG4gIGtNYXhSZXF1ZXN0cyxcbiAga0NvdW50ZXIsXG4gIGtDbG9zZSxcbiAga0Rlc3Ryb3ksXG4gIGtEaXNwYXRjaCxcbiAga0ludGVyY2VwdG9ycyxcbiAga0xvY2FsQWRkcmVzcyxcbiAga01heFJlc3BvbnNlU2l6ZSxcbiAga09uRXJyb3IsXG4gIGtIVFRQQ29udGV4dCxcbiAga01heENvbmN1cnJlbnRTdHJlYW1zLFxuICBrUmVzdW1lXG59ID0gcmVxdWlyZSgnLi4vY29yZS9zeW1ib2xzLmpzJylcbmNvbnN0IGNvbm5lY3RIMSA9IHJlcXVpcmUoJy4vY2xpZW50LWgxLmpzJylcbmNvbnN0IGNvbm5lY3RIMiA9IHJlcXVpcmUoJy4vY2xpZW50LWgyLmpzJylcbmxldCBkZXByZWNhdGVkSW50ZXJjZXB0b3JXYXJuZWQgPSBmYWxzZVxuXG5jb25zdCBrQ2xvc2VkUmVzb2x2ZSA9IFN5bWJvbCgna0Nsb3NlZFJlc29sdmUnKVxuXG5jb25zdCBub29wID0gKCkgPT4ge31cblxuZnVuY3Rpb24gZ2V0UGlwZWxpbmluZyAoY2xpZW50KSB7XG4gIHJldHVybiBjbGllbnRba1BpcGVsaW5pbmddID8/IGNsaWVudFtrSFRUUENvbnRleHRdPy5kZWZhdWx0UGlwZWxpbmluZyA/PyAxXG59XG5cbi8qKlxuICogQHR5cGUge2ltcG9ydCgnLi4vLi4vdHlwZXMvY2xpZW50LmpzJykuZGVmYXVsdH1cbiAqL1xuY2xhc3MgQ2xpZW50IGV4dGVuZHMgRGlzcGF0Y2hlckJhc2Uge1xuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8VVJMfSB1cmxcbiAgICogQHBhcmFtIHtpbXBvcnQoJy4uLy4uL3R5cGVzL2NsaWVudC5qcycpLkNsaWVudC5PcHRpb25zfSBvcHRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvciAodXJsLCB7XG4gICAgaW50ZXJjZXB0b3JzLFxuICAgIG1heEhlYWRlclNpemUsXG4gICAgaGVhZGVyc1RpbWVvdXQsXG4gICAgc29ja2V0VGltZW91dCxcbiAgICByZXF1ZXN0VGltZW91dCxcbiAgICBjb25uZWN0VGltZW91dCxcbiAgICBib2R5VGltZW91dCxcbiAgICBpZGxlVGltZW91dCxcbiAgICBrZWVwQWxpdmUsXG4gICAga2VlcEFsaXZlVGltZW91dCxcbiAgICBtYXhLZWVwQWxpdmVUaW1lb3V0LFxuICAgIGtlZXBBbGl2ZU1heFRpbWVvdXQsXG4gICAga2VlcEFsaXZlVGltZW91dFRocmVzaG9sZCxcbiAgICBzb2NrZXRQYXRoLFxuICAgIHBpcGVsaW5pbmcsXG4gICAgdGxzLFxuICAgIHN0cmljdENvbnRlbnRMZW5ndGgsXG4gICAgbWF4Q2FjaGVkU2Vzc2lvbnMsXG4gICAgbWF4UmVkaXJlY3Rpb25zLFxuICAgIGNvbm5lY3QsXG4gICAgbWF4UmVxdWVzdHNQZXJDbGllbnQsXG4gICAgbG9jYWxBZGRyZXNzLFxuICAgIG1heFJlc3BvbnNlU2l6ZSxcbiAgICBhdXRvU2VsZWN0RmFtaWx5LFxuICAgIGF1dG9TZWxlY3RGYW1pbHlBdHRlbXB0VGltZW91dCxcbiAgICAvLyBoMlxuICAgIG1heENvbmN1cnJlbnRTdHJlYW1zLFxuICAgIGFsbG93SDJcbiAgfSA9IHt9KSB7XG4gICAgc3VwZXIoKVxuXG4gICAgaWYgKGtlZXBBbGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3Vuc3VwcG9ydGVkIGtlZXBBbGl2ZSwgdXNlIHBpcGVsaW5pbmc9MCBpbnN0ZWFkJylcbiAgICB9XG5cbiAgICBpZiAoc29ja2V0VGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3Vuc3VwcG9ydGVkIHNvY2tldFRpbWVvdXQsIHVzZSBoZWFkZXJzVGltZW91dCAmIGJvZHlUaW1lb3V0IGluc3RlYWQnKVxuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0VGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3Vuc3VwcG9ydGVkIHJlcXVlc3RUaW1lb3V0LCB1c2UgaGVhZGVyc1RpbWVvdXQgJiBib2R5VGltZW91dCBpbnN0ZWFkJylcbiAgICB9XG5cbiAgICBpZiAoaWRsZVRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCd1bnN1cHBvcnRlZCBpZGxlVGltZW91dCwgdXNlIGtlZXBBbGl2ZVRpbWVvdXQgaW5zdGVhZCcpXG4gICAgfVxuXG4gICAgaWYgKG1heEtlZXBBbGl2ZVRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCd1bnN1cHBvcnRlZCBtYXhLZWVwQWxpdmVUaW1lb3V0LCB1c2Uga2VlcEFsaXZlTWF4VGltZW91dCBpbnN0ZWFkJylcbiAgICB9XG5cbiAgICBpZiAobWF4SGVhZGVyU2l6ZSAhPSBudWxsICYmICFOdW1iZXIuaXNGaW5pdGUobWF4SGVhZGVyU2l6ZSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBtYXhIZWFkZXJTaXplJylcbiAgICB9XG5cbiAgICBpZiAoc29ja2V0UGF0aCAhPSBudWxsICYmIHR5cGVvZiBzb2NrZXRQYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIHNvY2tldFBhdGgnKVxuICAgIH1cblxuICAgIGlmIChjb25uZWN0VGltZW91dCAhPSBudWxsICYmICghTnVtYmVyLmlzRmluaXRlKGNvbm5lY3RUaW1lb3V0KSB8fCBjb25uZWN0VGltZW91dCA8IDApKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgY29ubmVjdFRpbWVvdXQnKVxuICAgIH1cblxuICAgIGlmIChrZWVwQWxpdmVUaW1lb3V0ICE9IG51bGwgJiYgKCFOdW1iZXIuaXNGaW5pdGUoa2VlcEFsaXZlVGltZW91dCkgfHwga2VlcEFsaXZlVGltZW91dCA8PSAwKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGtlZXBBbGl2ZVRpbWVvdXQnKVxuICAgIH1cblxuICAgIGlmIChrZWVwQWxpdmVNYXhUaW1lb3V0ICE9IG51bGwgJiYgKCFOdW1iZXIuaXNGaW5pdGUoa2VlcEFsaXZlTWF4VGltZW91dCkgfHwga2VlcEFsaXZlTWF4VGltZW91dCA8PSAwKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGtlZXBBbGl2ZU1heFRpbWVvdXQnKVxuICAgIH1cblxuICAgIGlmIChrZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkICE9IG51bGwgJiYgIU51bWJlci5pc0Zpbml0ZShrZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGtlZXBBbGl2ZVRpbWVvdXRUaHJlc2hvbGQnKVxuICAgIH1cblxuICAgIGlmIChoZWFkZXJzVGltZW91dCAhPSBudWxsICYmICghTnVtYmVyLmlzSW50ZWdlcihoZWFkZXJzVGltZW91dCkgfHwgaGVhZGVyc1RpbWVvdXQgPCAwKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdoZWFkZXJzVGltZW91dCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBvciB6ZXJvJylcbiAgICB9XG5cbiAgICBpZiAoYm9keVRpbWVvdXQgIT0gbnVsbCAmJiAoIU51bWJlci5pc0ludGVnZXIoYm9keVRpbWVvdXQpIHx8IGJvZHlUaW1lb3V0IDwgMCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignYm9keVRpbWVvdXQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgb3IgemVybycpXG4gICAgfVxuXG4gICAgaWYgKGNvbm5lY3QgIT0gbnVsbCAmJiB0eXBlb2YgY29ubmVjdCAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgY29ubmVjdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignY29ubmVjdCBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0JylcbiAgICB9XG5cbiAgICBpZiAobWF4UmVkaXJlY3Rpb25zICE9IG51bGwgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKG1heFJlZGlyZWN0aW9ucykgfHwgbWF4UmVkaXJlY3Rpb25zIDwgMCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignbWF4UmVkaXJlY3Rpb25zIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKVxuICAgIH1cblxuICAgIGlmIChtYXhSZXF1ZXN0c1BlckNsaWVudCAhPSBudWxsICYmICghTnVtYmVyLmlzSW50ZWdlcihtYXhSZXF1ZXN0c1BlckNsaWVudCkgfHwgbWF4UmVxdWVzdHNQZXJDbGllbnQgPCAwKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdtYXhSZXF1ZXN0c1BlckNsaWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJylcbiAgICB9XG5cbiAgICBpZiAobG9jYWxBZGRyZXNzICE9IG51bGwgJiYgKHR5cGVvZiBsb2NhbEFkZHJlc3MgIT09ICdzdHJpbmcnIHx8IG5ldC5pc0lQKGxvY2FsQWRkcmVzcykgPT09IDApKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2xvY2FsQWRkcmVzcyBtdXN0IGJlIHZhbGlkIHN0cmluZyBJUCBhZGRyZXNzJylcbiAgICB9XG5cbiAgICBpZiAobWF4UmVzcG9uc2VTaXplICE9IG51bGwgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKG1heFJlc3BvbnNlU2l6ZSkgfHwgbWF4UmVzcG9uc2VTaXplIDwgLTEpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ21heFJlc3BvbnNlU2l6ZSBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJylcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBhdXRvU2VsZWN0RmFtaWx5QXR0ZW1wdFRpbWVvdXQgIT0gbnVsbCAmJlxuICAgICAgKCFOdW1iZXIuaXNJbnRlZ2VyKGF1dG9TZWxlY3RGYW1pbHlBdHRlbXB0VGltZW91dCkgfHwgYXV0b1NlbGVjdEZhbWlseUF0dGVtcHRUaW1lb3V0IDwgLTEpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2F1dG9TZWxlY3RGYW1pbHlBdHRlbXB0VGltZW91dCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJylcbiAgICB9XG5cbiAgICAvLyBoMlxuICAgIGlmIChhbGxvd0gyICE9IG51bGwgJiYgdHlwZW9mIGFsbG93SDIgIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdhbGxvd0gyIG11c3QgYmUgYSB2YWxpZCBib29sZWFuIHZhbHVlJylcbiAgICB9XG5cbiAgICBpZiAobWF4Q29uY3VycmVudFN0cmVhbXMgIT0gbnVsbCAmJiAodHlwZW9mIG1heENvbmN1cnJlbnRTdHJlYW1zICE9PSAnbnVtYmVyJyB8fCBtYXhDb25jdXJyZW50U3RyZWFtcyA8IDEpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ21heENvbmN1cnJlbnRTdHJlYW1zIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBncmVhdGVyIHRoYW4gMCcpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb25uZWN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25uZWN0ID0gYnVpbGRDb25uZWN0b3Ioe1xuICAgICAgICAuLi50bHMsXG4gICAgICAgIG1heENhY2hlZFNlc3Npb25zLFxuICAgICAgICBhbGxvd0gyLFxuICAgICAgICBzb2NrZXRQYXRoLFxuICAgICAgICB0aW1lb3V0OiBjb25uZWN0VGltZW91dCxcbiAgICAgICAgLi4uKGF1dG9TZWxlY3RGYW1pbHkgPyB7IGF1dG9TZWxlY3RGYW1pbHksIGF1dG9TZWxlY3RGYW1pbHlBdHRlbXB0VGltZW91dCB9IDogdW5kZWZpbmVkKSxcbiAgICAgICAgLi4uY29ubmVjdFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoaW50ZXJjZXB0b3JzPy5DbGllbnQgJiYgQXJyYXkuaXNBcnJheShpbnRlcmNlcHRvcnMuQ2xpZW50KSkge1xuICAgICAgdGhpc1trSW50ZXJjZXB0b3JzXSA9IGludGVyY2VwdG9ycy5DbGllbnRcbiAgICAgIGlmICghZGVwcmVjYXRlZEludGVyY2VwdG9yV2FybmVkKSB7XG4gICAgICAgIGRlcHJlY2F0ZWRJbnRlcmNlcHRvcldhcm5lZCA9IHRydWVcbiAgICAgICAgcHJvY2Vzcy5lbWl0V2FybmluZygnQ2xpZW50Lk9wdGlvbnMjaW50ZXJjZXB0b3IgaXMgZGVwcmVjYXRlZC4gVXNlIERpc3BhdGNoZXIjY29tcG9zZSBpbnN0ZWFkLicsIHtcbiAgICAgICAgICBjb2RlOiAnVU5ESUNJLUNMSUVOVC1JTlRFUkNFUFRPUi1ERVBSRUNBVEVEJ1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzW2tJbnRlcmNlcHRvcnNdID0gW2NyZWF0ZVJlZGlyZWN0SW50ZXJjZXB0b3IoeyBtYXhSZWRpcmVjdGlvbnMgfSldXG4gICAgfVxuXG4gICAgdGhpc1trVXJsXSA9IHV0aWwucGFyc2VPcmlnaW4odXJsKVxuICAgIHRoaXNba0Nvbm5lY3Rvcl0gPSBjb25uZWN0XG4gICAgdGhpc1trUGlwZWxpbmluZ10gPSBwaXBlbGluaW5nICE9IG51bGwgPyBwaXBlbGluaW5nIDogMVxuICAgIHRoaXNba01heEhlYWRlcnNTaXplXSA9IG1heEhlYWRlclNpemUgfHwgaHR0cC5tYXhIZWFkZXJTaXplXG4gICAgdGhpc1trS2VlcEFsaXZlRGVmYXVsdFRpbWVvdXRdID0ga2VlcEFsaXZlVGltZW91dCA9PSBudWxsID8gNGUzIDoga2VlcEFsaXZlVGltZW91dFxuICAgIHRoaXNba0tlZXBBbGl2ZU1heFRpbWVvdXRdID0ga2VlcEFsaXZlTWF4VGltZW91dCA9PSBudWxsID8gNjAwZTMgOiBrZWVwQWxpdmVNYXhUaW1lb3V0XG4gICAgdGhpc1trS2VlcEFsaXZlVGltZW91dFRocmVzaG9sZF0gPSBrZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkID09IG51bGwgPyAyZTMgOiBrZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkXG4gICAgdGhpc1trS2VlcEFsaXZlVGltZW91dFZhbHVlXSA9IHRoaXNba0tlZXBBbGl2ZURlZmF1bHRUaW1lb3V0XVxuICAgIHRoaXNba1NlcnZlck5hbWVdID0gbnVsbFxuICAgIHRoaXNba0xvY2FsQWRkcmVzc10gPSBsb2NhbEFkZHJlc3MgIT0gbnVsbCA/IGxvY2FsQWRkcmVzcyA6IG51bGxcbiAgICB0aGlzW2tSZXN1bWluZ10gPSAwIC8vIDAsIGlkbGUsIDEsIHNjaGVkdWxlZCwgMiByZXN1bWluZ1xuICAgIHRoaXNba05lZWREcmFpbl0gPSAwIC8vIDAsIGlkbGUsIDEsIHNjaGVkdWxlZCwgMiByZXN1bWluZ1xuICAgIHRoaXNba0hvc3RIZWFkZXJdID0gYGhvc3Q6ICR7dGhpc1trVXJsXS5ob3N0bmFtZX0ke3RoaXNba1VybF0ucG9ydCA/IGA6JHt0aGlzW2tVcmxdLnBvcnR9YCA6ICcnfVxcclxcbmBcbiAgICB0aGlzW2tCb2R5VGltZW91dF0gPSBib2R5VGltZW91dCAhPSBudWxsID8gYm9keVRpbWVvdXQgOiAzMDBlM1xuICAgIHRoaXNba0hlYWRlcnNUaW1lb3V0XSA9IGhlYWRlcnNUaW1lb3V0ICE9IG51bGwgPyBoZWFkZXJzVGltZW91dCA6IDMwMGUzXG4gICAgdGhpc1trU3RyaWN0Q29udGVudExlbmd0aF0gPSBzdHJpY3RDb250ZW50TGVuZ3RoID09IG51bGwgPyB0cnVlIDogc3RyaWN0Q29udGVudExlbmd0aFxuICAgIHRoaXNba01heFJlZGlyZWN0aW9uc10gPSBtYXhSZWRpcmVjdGlvbnNcbiAgICB0aGlzW2tNYXhSZXF1ZXN0c10gPSBtYXhSZXF1ZXN0c1BlckNsaWVudFxuICAgIHRoaXNba0Nsb3NlZFJlc29sdmVdID0gbnVsbFxuICAgIHRoaXNba01heFJlc3BvbnNlU2l6ZV0gPSBtYXhSZXNwb25zZVNpemUgPiAtMSA/IG1heFJlc3BvbnNlU2l6ZSA6IC0xXG4gICAgdGhpc1trTWF4Q29uY3VycmVudFN0cmVhbXNdID0gbWF4Q29uY3VycmVudFN0cmVhbXMgIT0gbnVsbCA/IG1heENvbmN1cnJlbnRTdHJlYW1zIDogMTAwIC8vIE1heCBwZWVyQ29uY3VycmVudFN0cmVhbXMgZm9yIGEgTm9kZSBoMiBzZXJ2ZXJcbiAgICB0aGlzW2tIVFRQQ29udGV4dF0gPSBudWxsXG5cbiAgICAvLyBrUXVldWUgaXMgYnVpbHQgdXAgb2YgMyBzZWN0aW9ucyBzZXBhcmF0ZWQgYnlcbiAgICAvLyB0aGUga1J1bm5pbmdJZHggYW5kIGtQZW5kaW5nSWR4IGluZGljZXMuXG4gICAgLy8gfCAgIGNvbXBsZXRlICAgfCAgIHJ1bm5pbmcgICB8ICAgcGVuZGluZyAgIHxcbiAgICAvLyAgICAgICAgICAgICAgICBeIGtSdW5uaW5nSWR4IF4ga1BlbmRpbmdJZHggXiBrUXVldWUubGVuZ3RoXG4gICAgLy8ga1J1bm5pbmdJZHggcG9pbnRzIHRvIHRoZSBmaXJzdCBydW5uaW5nIGVsZW1lbnQuXG4gICAgLy8ga1BlbmRpbmdJZHggcG9pbnRzIHRvIHRoZSBmaXJzdCBwZW5kaW5nIGVsZW1lbnQuXG4gICAgLy8gVGhpcyBpbXBsZW1lbnRzIGEgZmFzdCBxdWV1ZSB3aXRoIGFuIGFtb3J0aXplZFxuICAgIC8vIHRpbWUgb2YgTygxKS5cblxuICAgIHRoaXNba1F1ZXVlXSA9IFtdXG4gICAgdGhpc1trUnVubmluZ0lkeF0gPSAwXG4gICAgdGhpc1trUGVuZGluZ0lkeF0gPSAwXG5cbiAgICB0aGlzW2tSZXN1bWVdID0gKHN5bmMpID0+IHJlc3VtZSh0aGlzLCBzeW5jKVxuICAgIHRoaXNba09uRXJyb3JdID0gKGVycikgPT4gb25FcnJvcih0aGlzLCBlcnIpXG4gIH1cblxuICBnZXQgcGlwZWxpbmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1BpcGVsaW5pbmddXG4gIH1cblxuICBzZXQgcGlwZWxpbmluZyAodmFsdWUpIHtcbiAgICB0aGlzW2tQaXBlbGluaW5nXSA9IHZhbHVlXG4gICAgdGhpc1trUmVzdW1lXSh0cnVlKVxuICB9XG5cbiAgZ2V0IFtrUGVuZGluZ10gKCkge1xuICAgIHJldHVybiB0aGlzW2tRdWV1ZV0ubGVuZ3RoIC0gdGhpc1trUGVuZGluZ0lkeF1cbiAgfVxuXG4gIGdldCBba1J1bm5pbmddICgpIHtcbiAgICByZXR1cm4gdGhpc1trUGVuZGluZ0lkeF0gLSB0aGlzW2tSdW5uaW5nSWR4XVxuICB9XG5cbiAgZ2V0IFtrU2l6ZV0gKCkge1xuICAgIHJldHVybiB0aGlzW2tRdWV1ZV0ubGVuZ3RoIC0gdGhpc1trUnVubmluZ0lkeF1cbiAgfVxuXG4gIGdldCBba0Nvbm5lY3RlZF0gKCkge1xuICAgIHJldHVybiAhIXRoaXNba0hUVFBDb250ZXh0XSAmJiAhdGhpc1trQ29ubmVjdGluZ10gJiYgIXRoaXNba0hUVFBDb250ZXh0XS5kZXN0cm95ZWRcbiAgfVxuXG4gIGdldCBba0J1c3ldICgpIHtcbiAgICByZXR1cm4gQm9vbGVhbihcbiAgICAgIHRoaXNba0hUVFBDb250ZXh0XT8uYnVzeShudWxsKSB8fFxuICAgICAgKHRoaXNba1NpemVdID49IChnZXRQaXBlbGluaW5nKHRoaXMpIHx8IDEpKSB8fFxuICAgICAgdGhpc1trUGVuZGluZ10gPiAwXG4gICAgKVxuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlOiBvbmx5IHVzZWQgZm9yIHRlc3QgKi9cbiAgW2tDb25uZWN0XSAoY2IpIHtcbiAgICBjb25uZWN0KHRoaXMpXG4gICAgdGhpcy5vbmNlKCdjb25uZWN0JywgY2IpXG4gIH1cblxuICBba0Rpc3BhdGNoXSAob3B0cywgaGFuZGxlcikge1xuICAgIGNvbnN0IG9yaWdpbiA9IG9wdHMub3JpZ2luIHx8IHRoaXNba1VybF0ub3JpZ2luXG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KG9yaWdpbiwgb3B0cywgaGFuZGxlcilcblxuICAgIHRoaXNba1F1ZXVlXS5wdXNoKHJlcXVlc3QpXG4gICAgaWYgKHRoaXNba1Jlc3VtaW5nXSkge1xuICAgICAgLy8gRG8gbm90aGluZy5cbiAgICB9IGVsc2UgaWYgKHV0aWwuYm9keUxlbmd0aChyZXF1ZXN0LmJvZHkpID09IG51bGwgJiYgdXRpbC5pc0l0ZXJhYmxlKHJlcXVlc3QuYm9keSkpIHtcbiAgICAgIC8vIFdhaXQgYSB0aWNrIGluIGNhc2Ugc3RyZWFtL2l0ZXJhdG9yIGlzIGVuZGVkIGluIHRoZSBzYW1lIHRpY2suXG4gICAgICB0aGlzW2tSZXN1bWluZ10gPSAxXG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiByZXN1bWUodGhpcykpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNba1Jlc3VtZV0odHJ1ZSlcbiAgICB9XG5cbiAgICBpZiAodGhpc1trUmVzdW1pbmddICYmIHRoaXNba05lZWREcmFpbl0gIT09IDIgJiYgdGhpc1trQnVzeV0pIHtcbiAgICAgIHRoaXNba05lZWREcmFpbl0gPSAyXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNba05lZWREcmFpbl0gPCAyXG4gIH1cblxuICBhc3luYyBba0Nsb3NlXSAoKSB7XG4gICAgLy8gVE9ETzogZm9yIEgyIHdlIG5lZWQgdG8gZ3JhY2VmdWxseSBmbHVzaCB0aGUgcmVtYWluaW5nIGVucXVldWVkXG4gICAgLy8gcmVxdWVzdCBhbmQgY2xvc2UgZWFjaCBzdHJlYW0uXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBpZiAodGhpc1trU2l6ZV0pIHtcbiAgICAgICAgdGhpc1trQ2xvc2VkUmVzb2x2ZV0gPSByZXNvbHZlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKG51bGwpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIFtrRGVzdHJveV0gKGVycikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdHMgPSB0aGlzW2tRdWV1ZV0uc3BsaWNlKHRoaXNba1BlbmRpbmdJZHhdKVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXF1ZXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gcmVxdWVzdHNbaV1cbiAgICAgICAgdXRpbC5lcnJvclJlcXVlc3QodGhpcywgcmVxdWVzdCwgZXJyKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjYWxsYmFjayA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXNba0Nsb3NlZFJlc29sdmVdKSB7XG4gICAgICAgICAgLy8gVE9ETyAoZml4KTogU2hvdWxkIHdlIGVycm9yIGhlcmUgd2l0aCBDbGllbnREZXN0cm95ZWRFcnJvcj9cbiAgICAgICAgICB0aGlzW2tDbG9zZWRSZXNvbHZlXSgpXG4gICAgICAgICAgdGhpc1trQ2xvc2VkUmVzb2x2ZV0gPSBudWxsXG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShudWxsKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpc1trSFRUUENvbnRleHRdKSB7XG4gICAgICAgIHRoaXNba0hUVFBDb250ZXh0XS5kZXN0cm95KGVyciwgY2FsbGJhY2spXG4gICAgICAgIHRoaXNba0hUVFBDb250ZXh0XSA9IG51bGxcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlTWljcm90YXNrKGNhbGxiYWNrKVxuICAgICAgfVxuXG4gICAgICB0aGlzW2tSZXN1bWVdKClcbiAgICB9KVxuICB9XG59XG5cbmNvbnN0IGNyZWF0ZVJlZGlyZWN0SW50ZXJjZXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcmNlcHRvci9yZWRpcmVjdC1pbnRlcmNlcHRvci5qcycpXG5cbmZ1bmN0aW9uIG9uRXJyb3IgKGNsaWVudCwgZXJyKSB7XG4gIGlmIChcbiAgICBjbGllbnRba1J1bm5pbmddID09PSAwICYmXG4gICAgZXJyLmNvZGUgIT09ICdVTkRfRVJSX0lORk8nICYmXG4gICAgZXJyLmNvZGUgIT09ICdVTkRfRVJSX1NPQ0tFVCdcbiAgKSB7XG4gICAgLy8gRXJyb3IgaXMgbm90IGNhdXNlZCBieSBydW5uaW5nIHJlcXVlc3QgYW5kIG5vdCBhIHJlY292ZXJhYmxlXG4gICAgLy8gc29ja2V0IGVycm9yLlxuXG4gICAgYXNzZXJ0KGNsaWVudFtrUGVuZGluZ0lkeF0gPT09IGNsaWVudFtrUnVubmluZ0lkeF0pXG5cbiAgICBjb25zdCByZXF1ZXN0cyA9IGNsaWVudFtrUXVldWVdLnNwbGljZShjbGllbnRba1J1bm5pbmdJZHhdKVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXF1ZXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHJlcXVlc3RzW2ldXG4gICAgICB1dGlsLmVycm9yUmVxdWVzdChjbGllbnQsIHJlcXVlc3QsIGVycilcbiAgICB9XG4gICAgYXNzZXJ0KGNsaWVudFtrU2l6ZV0gPT09IDApXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge0NsaWVudH0gY2xpZW50XG4gKiBAcmV0dXJuc1xuICovXG5hc3luYyBmdW5jdGlvbiBjb25uZWN0IChjbGllbnQpIHtcbiAgYXNzZXJ0KCFjbGllbnRba0Nvbm5lY3RpbmddKVxuICBhc3NlcnQoIWNsaWVudFtrSFRUUENvbnRleHRdKVxuXG4gIGxldCB7IGhvc3QsIGhvc3RuYW1lLCBwcm90b2NvbCwgcG9ydCB9ID0gY2xpZW50W2tVcmxdXG5cbiAgLy8gUmVzb2x2ZSBpcHY2XG4gIGlmIChob3N0bmFtZVswXSA9PT0gJ1snKSB7XG4gICAgY29uc3QgaWR4ID0gaG9zdG5hbWUuaW5kZXhPZignXScpXG5cbiAgICBhc3NlcnQoaWR4ICE9PSAtMSlcbiAgICBjb25zdCBpcCA9IGhvc3RuYW1lLnN1YnN0cmluZygxLCBpZHgpXG5cbiAgICBhc3NlcnQobmV0LmlzSVAoaXApKVxuICAgIGhvc3RuYW1lID0gaXBcbiAgfVxuXG4gIGNsaWVudFtrQ29ubmVjdGluZ10gPSB0cnVlXG5cbiAgaWYgKGNoYW5uZWxzLmJlZm9yZUNvbm5lY3QuaGFzU3Vic2NyaWJlcnMpIHtcbiAgICBjaGFubmVscy5iZWZvcmVDb25uZWN0LnB1Ymxpc2goe1xuICAgICAgY29ubmVjdFBhcmFtczoge1xuICAgICAgICBob3N0LFxuICAgICAgICBob3N0bmFtZSxcbiAgICAgICAgcHJvdG9jb2wsXG4gICAgICAgIHBvcnQsXG4gICAgICAgIHZlcnNpb246IGNsaWVudFtrSFRUUENvbnRleHRdPy52ZXJzaW9uLFxuICAgICAgICBzZXJ2ZXJuYW1lOiBjbGllbnRba1NlcnZlck5hbWVdLFxuICAgICAgICBsb2NhbEFkZHJlc3M6IGNsaWVudFtrTG9jYWxBZGRyZXNzXVxuICAgICAgfSxcbiAgICAgIGNvbm5lY3RvcjogY2xpZW50W2tDb25uZWN0b3JdXG4gICAgfSlcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3Qgc29ja2V0ID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY2xpZW50W2tDb25uZWN0b3JdKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgaG9zdG5hbWUsXG4gICAgICAgIHByb3RvY29sLFxuICAgICAgICBwb3J0LFxuICAgICAgICBzZXJ2ZXJuYW1lOiBjbGllbnRba1NlcnZlck5hbWVdLFxuICAgICAgICBsb2NhbEFkZHJlc3M6IGNsaWVudFtrTG9jYWxBZGRyZXNzXVxuICAgICAgfSwgKGVyciwgc29ja2V0KSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoc29ja2V0KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpZiAoY2xpZW50LmRlc3Ryb3llZCkge1xuICAgICAgdXRpbC5kZXN0cm95KHNvY2tldC5vbignZXJyb3InLCBub29wKSwgbmV3IENsaWVudERlc3Ryb3llZEVycm9yKCkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhc3NlcnQoc29ja2V0KVxuXG4gICAgdHJ5IHtcbiAgICAgIGNsaWVudFtrSFRUUENvbnRleHRdID0gc29ja2V0LmFscG5Qcm90b2NvbCA9PT0gJ2gyJ1xuICAgICAgICA/IGF3YWl0IGNvbm5lY3RIMihjbGllbnQsIHNvY2tldClcbiAgICAgICAgOiBhd2FpdCBjb25uZWN0SDEoY2xpZW50LCBzb2NrZXQpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzb2NrZXQuZGVzdHJveSgpLm9uKCdlcnJvcicsIG5vb3ApXG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG5cbiAgICBjbGllbnRba0Nvbm5lY3RpbmddID0gZmFsc2VcblxuICAgIHNvY2tldFtrQ291bnRlcl0gPSAwXG4gICAgc29ja2V0W2tNYXhSZXF1ZXN0c10gPSBjbGllbnRba01heFJlcXVlc3RzXVxuICAgIHNvY2tldFtrQ2xpZW50XSA9IGNsaWVudFxuICAgIHNvY2tldFtrRXJyb3JdID0gbnVsbFxuXG4gICAgaWYgKGNoYW5uZWxzLmNvbm5lY3RlZC5oYXNTdWJzY3JpYmVycykge1xuICAgICAgY2hhbm5lbHMuY29ubmVjdGVkLnB1Ymxpc2goe1xuICAgICAgICBjb25uZWN0UGFyYW1zOiB7XG4gICAgICAgICAgaG9zdCxcbiAgICAgICAgICBob3N0bmFtZSxcbiAgICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgICBwb3J0LFxuICAgICAgICAgIHZlcnNpb246IGNsaWVudFtrSFRUUENvbnRleHRdPy52ZXJzaW9uLFxuICAgICAgICAgIHNlcnZlcm5hbWU6IGNsaWVudFtrU2VydmVyTmFtZV0sXG4gICAgICAgICAgbG9jYWxBZGRyZXNzOiBjbGllbnRba0xvY2FsQWRkcmVzc11cbiAgICAgICAgfSxcbiAgICAgICAgY29ubmVjdG9yOiBjbGllbnRba0Nvbm5lY3Rvcl0sXG4gICAgICAgIHNvY2tldFxuICAgICAgfSlcbiAgICB9XG4gICAgY2xpZW50LmVtaXQoJ2Nvbm5lY3QnLCBjbGllbnRba1VybF0sIFtjbGllbnRdKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoY2xpZW50LmRlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY2xpZW50W2tDb25uZWN0aW5nXSA9IGZhbHNlXG5cbiAgICBpZiAoY2hhbm5lbHMuY29ubmVjdEVycm9yLmhhc1N1YnNjcmliZXJzKSB7XG4gICAgICBjaGFubmVscy5jb25uZWN0RXJyb3IucHVibGlzaCh7XG4gICAgICAgIGNvbm5lY3RQYXJhbXM6IHtcbiAgICAgICAgICBob3N0LFxuICAgICAgICAgIGhvc3RuYW1lLFxuICAgICAgICAgIHByb3RvY29sLFxuICAgICAgICAgIHBvcnQsXG4gICAgICAgICAgdmVyc2lvbjogY2xpZW50W2tIVFRQQ29udGV4dF0/LnZlcnNpb24sXG4gICAgICAgICAgc2VydmVybmFtZTogY2xpZW50W2tTZXJ2ZXJOYW1lXSxcbiAgICAgICAgICBsb2NhbEFkZHJlc3M6IGNsaWVudFtrTG9jYWxBZGRyZXNzXVxuICAgICAgICB9LFxuICAgICAgICBjb25uZWN0b3I6IGNsaWVudFtrQ29ubmVjdG9yXSxcbiAgICAgICAgZXJyb3I6IGVyclxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoZXJyLmNvZGUgPT09ICdFUlJfVExTX0NFUlRfQUxUTkFNRV9JTlZBTElEJykge1xuICAgICAgYXNzZXJ0KGNsaWVudFtrUnVubmluZ10gPT09IDApXG4gICAgICB3aGlsZSAoY2xpZW50W2tQZW5kaW5nXSA+IDAgJiYgY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tQZW5kaW5nSWR4XV0uc2VydmVybmFtZSA9PT0gY2xpZW50W2tTZXJ2ZXJOYW1lXSkge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tQZW5kaW5nSWR4XSsrXVxuICAgICAgICB1dGlsLmVycm9yUmVxdWVzdChjbGllbnQsIHJlcXVlc3QsIGVycilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb25FcnJvcihjbGllbnQsIGVycilcbiAgICB9XG5cbiAgICBjbGllbnQuZW1pdCgnY29ubmVjdGlvbkVycm9yJywgY2xpZW50W2tVcmxdLCBbY2xpZW50XSwgZXJyKVxuICB9XG5cbiAgY2xpZW50W2tSZXN1bWVdKClcbn1cblxuZnVuY3Rpb24gZW1pdERyYWluIChjbGllbnQpIHtcbiAgY2xpZW50W2tOZWVkRHJhaW5dID0gMFxuICBjbGllbnQuZW1pdCgnZHJhaW4nLCBjbGllbnRba1VybF0sIFtjbGllbnRdKVxufVxuXG5mdW5jdGlvbiByZXN1bWUgKGNsaWVudCwgc3luYykge1xuICBpZiAoY2xpZW50W2tSZXN1bWluZ10gPT09IDIpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNsaWVudFtrUmVzdW1pbmddID0gMlxuXG4gIF9yZXN1bWUoY2xpZW50LCBzeW5jKVxuICBjbGllbnRba1Jlc3VtaW5nXSA9IDBcblxuICBpZiAoY2xpZW50W2tSdW5uaW5nSWR4XSA+IDI1Nikge1xuICAgIGNsaWVudFtrUXVldWVdLnNwbGljZSgwLCBjbGllbnRba1J1bm5pbmdJZHhdKVxuICAgIGNsaWVudFtrUGVuZGluZ0lkeF0gLT0gY2xpZW50W2tSdW5uaW5nSWR4XVxuICAgIGNsaWVudFtrUnVubmluZ0lkeF0gPSAwXG4gIH1cbn1cblxuZnVuY3Rpb24gX3Jlc3VtZSAoY2xpZW50LCBzeW5jKSB7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKGNsaWVudC5kZXN0cm95ZWQpIHtcbiAgICAgIGFzc2VydChjbGllbnRba1BlbmRpbmddID09PSAwKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGNsaWVudFtrQ2xvc2VkUmVzb2x2ZV0gJiYgIWNsaWVudFtrU2l6ZV0pIHtcbiAgICAgIGNsaWVudFtrQ2xvc2VkUmVzb2x2ZV0oKVxuICAgICAgY2xpZW50W2tDbG9zZWRSZXNvbHZlXSA9IG51bGxcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChjbGllbnRba0hUVFBDb250ZXh0XSkge1xuICAgICAgY2xpZW50W2tIVFRQQ29udGV4dF0ucmVzdW1lKClcbiAgICB9XG5cbiAgICBpZiAoY2xpZW50W2tCdXN5XSkge1xuICAgICAgY2xpZW50W2tOZWVkRHJhaW5dID0gMlxuICAgIH0gZWxzZSBpZiAoY2xpZW50W2tOZWVkRHJhaW5dID09PSAyKSB7XG4gICAgICBpZiAoc3luYykge1xuICAgICAgICBjbGllbnRba05lZWREcmFpbl0gPSAxXG4gICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IGVtaXREcmFpbihjbGllbnQpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW1pdERyYWluKGNsaWVudClcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKGNsaWVudFtrUGVuZGluZ10gPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChjbGllbnRba1J1bm5pbmddID49IChnZXRQaXBlbGluaW5nKGNsaWVudCkgfHwgMSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3QgPSBjbGllbnRba1F1ZXVlXVtjbGllbnRba1BlbmRpbmdJZHhdXVxuXG4gICAgaWYgKGNsaWVudFtrVXJsXS5wcm90b2NvbCA9PT0gJ2h0dHBzOicgJiYgY2xpZW50W2tTZXJ2ZXJOYW1lXSAhPT0gcmVxdWVzdC5zZXJ2ZXJuYW1lKSB7XG4gICAgICBpZiAoY2xpZW50W2tSdW5uaW5nXSA+IDApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNsaWVudFtrU2VydmVyTmFtZV0gPSByZXF1ZXN0LnNlcnZlcm5hbWVcbiAgICAgIGNsaWVudFtrSFRUUENvbnRleHRdPy5kZXN0cm95KG5ldyBJbmZvcm1hdGlvbmFsRXJyb3IoJ3NlcnZlcm5hbWUgY2hhbmdlZCcpLCAoKSA9PiB7XG4gICAgICAgIGNsaWVudFtrSFRUUENvbnRleHRdID0gbnVsbFxuICAgICAgICByZXN1bWUoY2xpZW50KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoY2xpZW50W2tDb25uZWN0aW5nXSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFjbGllbnRba0hUVFBDb250ZXh0XSkge1xuICAgICAgY29ubmVjdChjbGllbnQpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoY2xpZW50W2tIVFRQQ29udGV4dF0uZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoY2xpZW50W2tIVFRQQ29udGV4dF0uYnVzeShyZXF1ZXN0KSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFyZXF1ZXN0LmFib3J0ZWQgJiYgY2xpZW50W2tIVFRQQ29udGV4dF0ud3JpdGUocmVxdWVzdCkpIHtcbiAgICAgIGNsaWVudFtrUGVuZGluZ0lkeF0rK1xuICAgIH0gZWxzZSB7XG4gICAgICBjbGllbnRba1F1ZXVlXS5zcGxpY2UoY2xpZW50W2tQZW5kaW5nSWR4XSwgMSlcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBDbGllbnRcbiIsIi8qIGVzbGludC1kaXNhYmxlICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vLyBFeHRyYWN0ZWQgZnJvbSBub2RlL2xpYi9pbnRlcm5hbC9maXhlZF9xdWV1ZS5qc1xuXG4vLyBDdXJyZW50bHkgb3B0aW1hbCBxdWV1ZSBzaXplLCB0ZXN0ZWQgb24gVjggNi4wIC0gNi42LiBNdXN0IGJlIHBvd2VyIG9mIHR3by5cbmNvbnN0IGtTaXplID0gMjA0ODtcbmNvbnN0IGtNYXNrID0ga1NpemUgLSAxO1xuXG4vLyBUaGUgRml4ZWRRdWV1ZSBpcyBpbXBsZW1lbnRlZCBhcyBhIHNpbmdseS1saW5rZWQgbGlzdCBvZiBmaXhlZC1zaXplXG4vLyBjaXJjdWxhciBidWZmZXJzLiBJdCBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzOlxuLy9cbi8vICBoZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhaWxcbi8vICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuLy8gICAgdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2XG4vLyArLS0tLS0tLS0tLS0rIDwtLS0tLVxcICAgICAgICstLS0tLS0tLS0tLSsgPC0tLS0tLVxcICAgICAgICAgKy0tLS0tLS0tLS0tK1xuLy8gfCAgW251bGxdICAgfCAgICAgICAgXFwtLS0tLSB8ICAgbmV4dCAgICB8ICAgICAgICAgXFwtLS0tLS0tIHwgICBuZXh0ICAgIHxcbi8vICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tK1xuLy8gfCAgIGl0ZW0gICAgfCA8LS0gYm90dG9tICAgIHwgICBpdGVtICAgIHwgPC0tIGJvdHRvbSAgICAgICB8ICBbZW1wdHldICB8XG4vLyB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfCAgICAgICAgICAgICAgICAgIHwgIFtlbXB0eV0gIHxcbi8vIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgICAgfCAgW2VtcHR5XSAgfFxuLy8gfCAgIGl0ZW0gICAgfCAgICAgICAgICAgICAgIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICAgICB8ICBbZW1wdHldICB8XG4vLyB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfCAgICAgICBib3R0b20gLS0+IHwgICBpdGVtICAgIHxcbi8vIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfFxuLy8gfCAgICAuLi4gICAgfCAgICAgICAgICAgICAgIHwgICAgLi4uICAgIHwgICAgICAgICAgICAgICAgICB8ICAgIC4uLiAgICB8XG4vLyB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfCAgICAgICAgICAgICAgICAgIHwgICBpdGVtICAgIHxcbi8vIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfFxuLy8gfCAgW2VtcHR5XSAgfCA8LS0gdG9wICAgICAgIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8XG4vLyB8ICBbZW1wdHldICB8ICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfCAgICAgICAgICAgICAgICAgIHwgICBpdGVtICAgIHxcbi8vIHwgIFtlbXB0eV0gIHwgICAgICAgICAgICAgICB8ICBbZW1wdHldICB8IDwtLSB0b3AgIHRvcCAtLT4gfCAgW2VtcHR5XSAgfFxuLy8gKy0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rXG4vL1xuLy8gT3IsIGlmIHRoZXJlIGlzIG9ubHkgb25lIGNpcmN1bGFyIGJ1ZmZlciwgaXQgbG9va3Mgc29tZXRoaW5nXG4vLyBsaWtlIGVpdGhlciBvZiB0aGVzZTpcbi8vXG4vLyAgaGVhZCAgIHRhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkICAgdGFpbFxuLy8gICAgfCAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8XG4vLyAgICB2ICAgICB2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgICAgIHZcbi8vICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tK1xuLy8gfCAgW251bGxdICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBbbnVsbF0gICB8XG4vLyArLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLStcbi8vIHwgIFtlbXB0eV0gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfFxuLy8gfCAgW2VtcHR5XSAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8XG4vLyB8ICAgaXRlbSAgICB8IDwtLSBib3R0b20gICAgICAgICAgICB0b3AgLS0+IHwgIFtlbXB0eV0gIHxcbi8vIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgW2VtcHR5XSAgfFxuLy8gfCAgW2VtcHR5XSAgfCA8LS0gdG9wICAgICAgICAgICAgYm90dG9tIC0tPiB8ICAgaXRlbSAgICB8XG4vLyB8ICBbZW1wdHldICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBpdGVtICAgIHxcbi8vICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tK1xuLy9cbi8vIEFkZGluZyBhIHZhbHVlIG1lYW5zIG1vdmluZyBgdG9wYCBmb3J3YXJkIGJ5IG9uZSwgcmVtb3ZpbmcgbWVhbnNcbi8vIG1vdmluZyBgYm90dG9tYCBmb3J3YXJkIGJ5IG9uZS4gQWZ0ZXIgcmVhY2hpbmcgdGhlIGVuZCwgdGhlIHF1ZXVlXG4vLyB3cmFwcyBhcm91bmQuXG4vL1xuLy8gV2hlbiBgdG9wID09PSBib3R0b21gIHRoZSBjdXJyZW50IHF1ZXVlIGlzIGVtcHR5IGFuZCB3aGVuXG4vLyBgdG9wICsgMSA9PT0gYm90dG9tYCBpdCdzIGZ1bGwuIFRoaXMgd2FzdGVzIGEgc2luZ2xlIHNwYWNlIG9mIHN0b3JhZ2Vcbi8vIGJ1dCBhbGxvd3MgbXVjaCBxdWlja2VyIGNoZWNrcy5cblxuY2xhc3MgRml4ZWRDaXJjdWxhckJ1ZmZlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuYm90dG9tID0gMDtcbiAgICB0aGlzLnRvcCA9IDA7XG4gICAgdGhpcy5saXN0ID0gbmV3IEFycmF5KGtTaXplKTtcbiAgICB0aGlzLm5leHQgPSBudWxsO1xuICB9XG5cbiAgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy50b3AgPT09IHRoaXMuYm90dG9tO1xuICB9XG5cbiAgaXNGdWxsKCkge1xuICAgIHJldHVybiAoKHRoaXMudG9wICsgMSkgJiBrTWFzaykgPT09IHRoaXMuYm90dG9tO1xuICB9XG5cbiAgcHVzaChkYXRhKSB7XG4gICAgdGhpcy5saXN0W3RoaXMudG9wXSA9IGRhdGE7XG4gICAgdGhpcy50b3AgPSAodGhpcy50b3AgKyAxKSAmIGtNYXNrO1xuICB9XG5cbiAgc2hpZnQoKSB7XG4gICAgY29uc3QgbmV4dEl0ZW0gPSB0aGlzLmxpc3RbdGhpcy5ib3R0b21dO1xuICAgIGlmIChuZXh0SXRlbSA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5saXN0W3RoaXMuYm90dG9tXSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmJvdHRvbSA9ICh0aGlzLmJvdHRvbSArIDEpICYga01hc2s7XG4gICAgcmV0dXJuIG5leHRJdGVtO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgRml4ZWRRdWV1ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG5ldyBGaXhlZENpcmN1bGFyQnVmZmVyKCk7XG4gIH1cblxuICBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLmhlYWQuaXNFbXB0eSgpO1xuICB9XG5cbiAgcHVzaChkYXRhKSB7XG4gICAgaWYgKHRoaXMuaGVhZC5pc0Z1bGwoKSkge1xuICAgICAgLy8gSGVhZCBpcyBmdWxsOiBDcmVhdGVzIGEgbmV3IHF1ZXVlLCBzZXRzIHRoZSBvbGQgcXVldWUncyBgLm5leHRgIHRvIGl0LFxuICAgICAgLy8gYW5kIHNldHMgaXQgYXMgdGhlIG5ldyBtYWluIHF1ZXVlLlxuICAgICAgdGhpcy5oZWFkID0gdGhpcy5oZWFkLm5leHQgPSBuZXcgRml4ZWRDaXJjdWxhckJ1ZmZlcigpO1xuICAgIH1cbiAgICB0aGlzLmhlYWQucHVzaChkYXRhKTtcbiAgfVxuXG4gIHNoaWZ0KCkge1xuICAgIGNvbnN0IHRhaWwgPSB0aGlzLnRhaWw7XG4gICAgY29uc3QgbmV4dCA9IHRhaWwuc2hpZnQoKTtcbiAgICBpZiAodGFpbC5pc0VtcHR5KCkgJiYgdGFpbC5uZXh0ICE9PSBudWxsKSB7XG4gICAgICAvLyBJZiB0aGVyZSBpcyBhbm90aGVyIHF1ZXVlLCBpdCBmb3JtcyB0aGUgbmV3IHRhaWwuXG4gICAgICB0aGlzLnRhaWwgPSB0YWlsLm5leHQ7XG4gICAgfVxuICAgIHJldHVybiBuZXh0O1xuICB9XG59O1xuIiwiY29uc3QgeyBrRnJlZSwga0Nvbm5lY3RlZCwga1BlbmRpbmcsIGtRdWV1ZWQsIGtSdW5uaW5nLCBrU2l6ZSB9ID0gcmVxdWlyZSgnLi4vY29yZS9zeW1ib2xzJylcbmNvbnN0IGtQb29sID0gU3ltYm9sKCdwb29sJylcblxuY2xhc3MgUG9vbFN0YXRzIHtcbiAgY29uc3RydWN0b3IgKHBvb2wpIHtcbiAgICB0aGlzW2tQb29sXSA9IHBvb2xcbiAgfVxuXG4gIGdldCBjb25uZWN0ZWQgKCkge1xuICAgIHJldHVybiB0aGlzW2tQb29sXVtrQ29ubmVjdGVkXVxuICB9XG5cbiAgZ2V0IGZyZWUgKCkge1xuICAgIHJldHVybiB0aGlzW2tQb29sXVtrRnJlZV1cbiAgfVxuXG4gIGdldCBwZW5kaW5nICgpIHtcbiAgICByZXR1cm4gdGhpc1trUG9vbF1ba1BlbmRpbmddXG4gIH1cblxuICBnZXQgcXVldWVkICgpIHtcbiAgICByZXR1cm4gdGhpc1trUG9vbF1ba1F1ZXVlZF1cbiAgfVxuXG4gIGdldCBydW5uaW5nICgpIHtcbiAgICByZXR1cm4gdGhpc1trUG9vbF1ba1J1bm5pbmddXG4gIH1cblxuICBnZXQgc2l6ZSAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1Bvb2xdW2tTaXplXVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUG9vbFN0YXRzXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgRGlzcGF0Y2hlckJhc2UgPSByZXF1aXJlKCcuL2Rpc3BhdGNoZXItYmFzZScpXG5jb25zdCBGaXhlZFF1ZXVlID0gcmVxdWlyZSgnLi9maXhlZC1xdWV1ZScpXG5jb25zdCB7IGtDb25uZWN0ZWQsIGtTaXplLCBrUnVubmluZywga1BlbmRpbmcsIGtRdWV1ZWQsIGtCdXN5LCBrRnJlZSwga1VybCwga0Nsb3NlLCBrRGVzdHJveSwga0Rpc3BhdGNoIH0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuY29uc3QgUG9vbFN0YXRzID0gcmVxdWlyZSgnLi9wb29sLXN0YXRzJylcblxuY29uc3Qga0NsaWVudHMgPSBTeW1ib2woJ2NsaWVudHMnKVxuY29uc3Qga05lZWREcmFpbiA9IFN5bWJvbCgnbmVlZERyYWluJylcbmNvbnN0IGtRdWV1ZSA9IFN5bWJvbCgncXVldWUnKVxuY29uc3Qga0Nsb3NlZFJlc29sdmUgPSBTeW1ib2woJ2Nsb3NlZCByZXNvbHZlJylcbmNvbnN0IGtPbkRyYWluID0gU3ltYm9sKCdvbkRyYWluJylcbmNvbnN0IGtPbkNvbm5lY3QgPSBTeW1ib2woJ29uQ29ubmVjdCcpXG5jb25zdCBrT25EaXNjb25uZWN0ID0gU3ltYm9sKCdvbkRpc2Nvbm5lY3QnKVxuY29uc3Qga09uQ29ubmVjdGlvbkVycm9yID0gU3ltYm9sKCdvbkNvbm5lY3Rpb25FcnJvcicpXG5jb25zdCBrR2V0RGlzcGF0Y2hlciA9IFN5bWJvbCgnZ2V0IGRpc3BhdGNoZXInKVxuY29uc3Qga0FkZENsaWVudCA9IFN5bWJvbCgnYWRkIGNsaWVudCcpXG5jb25zdCBrUmVtb3ZlQ2xpZW50ID0gU3ltYm9sKCdyZW1vdmUgY2xpZW50JylcbmNvbnN0IGtTdGF0cyA9IFN5bWJvbCgnc3RhdHMnKVxuXG5jbGFzcyBQb29sQmFzZSBleHRlbmRzIERpc3BhdGNoZXJCYXNlIHtcbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHN1cGVyKClcblxuICAgIHRoaXNba1F1ZXVlXSA9IG5ldyBGaXhlZFF1ZXVlKClcbiAgICB0aGlzW2tDbGllbnRzXSA9IFtdXG4gICAgdGhpc1trUXVldWVkXSA9IDBcblxuICAgIGNvbnN0IHBvb2wgPSB0aGlzXG5cbiAgICB0aGlzW2tPbkRyYWluXSA9IGZ1bmN0aW9uIG9uRHJhaW4gKG9yaWdpbiwgdGFyZ2V0cykge1xuICAgICAgY29uc3QgcXVldWUgPSBwb29sW2tRdWV1ZV1cblxuICAgICAgbGV0IG5lZWREcmFpbiA9IGZhbHNlXG5cbiAgICAgIHdoaWxlICghbmVlZERyYWluKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBxdWV1ZS5zaGlmdCgpXG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgcG9vbFtrUXVldWVkXS0tXG4gICAgICAgIG5lZWREcmFpbiA9ICF0aGlzLmRpc3BhdGNoKGl0ZW0ub3B0cywgaXRlbS5oYW5kbGVyKVxuICAgICAgfVxuXG4gICAgICB0aGlzW2tOZWVkRHJhaW5dID0gbmVlZERyYWluXG5cbiAgICAgIGlmICghdGhpc1trTmVlZERyYWluXSAmJiBwb29sW2tOZWVkRHJhaW5dKSB7XG4gICAgICAgIHBvb2xba05lZWREcmFpbl0gPSBmYWxzZVxuICAgICAgICBwb29sLmVtaXQoJ2RyYWluJywgb3JpZ2luLCBbcG9vbCwgLi4udGFyZ2V0c10pXG4gICAgICB9XG5cbiAgICAgIGlmIChwb29sW2tDbG9zZWRSZXNvbHZlXSAmJiBxdWV1ZS5pc0VtcHR5KCkpIHtcbiAgICAgICAgUHJvbWlzZVxuICAgICAgICAgIC5hbGwocG9vbFtrQ2xpZW50c10ubWFwKGMgPT4gYy5jbG9zZSgpKSlcbiAgICAgICAgICAudGhlbihwb29sW2tDbG9zZWRSZXNvbHZlXSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzW2tPbkNvbm5lY3RdID0gKG9yaWdpbiwgdGFyZ2V0cykgPT4ge1xuICAgICAgcG9vbC5lbWl0KCdjb25uZWN0Jywgb3JpZ2luLCBbcG9vbCwgLi4udGFyZ2V0c10pXG4gICAgfVxuXG4gICAgdGhpc1trT25EaXNjb25uZWN0XSA9IChvcmlnaW4sIHRhcmdldHMsIGVycikgPT4ge1xuICAgICAgcG9vbC5lbWl0KCdkaXNjb25uZWN0Jywgb3JpZ2luLCBbcG9vbCwgLi4udGFyZ2V0c10sIGVycilcbiAgICB9XG5cbiAgICB0aGlzW2tPbkNvbm5lY3Rpb25FcnJvcl0gPSAob3JpZ2luLCB0YXJnZXRzLCBlcnIpID0+IHtcbiAgICAgIHBvb2wuZW1pdCgnY29ubmVjdGlvbkVycm9yJywgb3JpZ2luLCBbcG9vbCwgLi4udGFyZ2V0c10sIGVycilcbiAgICB9XG5cbiAgICB0aGlzW2tTdGF0c10gPSBuZXcgUG9vbFN0YXRzKHRoaXMpXG4gIH1cblxuICBnZXQgW2tCdXN5XSAoKSB7XG4gICAgcmV0dXJuIHRoaXNba05lZWREcmFpbl1cbiAgfVxuXG4gIGdldCBba0Nvbm5lY3RlZF0gKCkge1xuICAgIHJldHVybiB0aGlzW2tDbGllbnRzXS5maWx0ZXIoY2xpZW50ID0+IGNsaWVudFtrQ29ubmVjdGVkXSkubGVuZ3RoXG4gIH1cblxuICBnZXQgW2tGcmVlXSAoKSB7XG4gICAgcmV0dXJuIHRoaXNba0NsaWVudHNdLmZpbHRlcihjbGllbnQgPT4gY2xpZW50W2tDb25uZWN0ZWRdICYmICFjbGllbnRba05lZWREcmFpbl0pLmxlbmd0aFxuICB9XG5cbiAgZ2V0IFtrUGVuZGluZ10gKCkge1xuICAgIGxldCByZXQgPSB0aGlzW2tRdWV1ZWRdXG4gICAgZm9yIChjb25zdCB7IFtrUGVuZGluZ106IHBlbmRpbmcgfSBvZiB0aGlzW2tDbGllbnRzXSkge1xuICAgICAgcmV0ICs9IHBlbmRpbmdcbiAgICB9XG4gICAgcmV0dXJuIHJldFxuICB9XG5cbiAgZ2V0IFtrUnVubmluZ10gKCkge1xuICAgIGxldCByZXQgPSAwXG4gICAgZm9yIChjb25zdCB7IFtrUnVubmluZ106IHJ1bm5pbmcgfSBvZiB0aGlzW2tDbGllbnRzXSkge1xuICAgICAgcmV0ICs9IHJ1bm5pbmdcbiAgICB9XG4gICAgcmV0dXJuIHJldFxuICB9XG5cbiAgZ2V0IFtrU2l6ZV0gKCkge1xuICAgIGxldCByZXQgPSB0aGlzW2tRdWV1ZWRdXG4gICAgZm9yIChjb25zdCB7IFtrU2l6ZV06IHNpemUgfSBvZiB0aGlzW2tDbGllbnRzXSkge1xuICAgICAgcmV0ICs9IHNpemVcbiAgICB9XG4gICAgcmV0dXJuIHJldFxuICB9XG5cbiAgZ2V0IHN0YXRzICgpIHtcbiAgICByZXR1cm4gdGhpc1trU3RhdHNdXG4gIH1cblxuICBhc3luYyBba0Nsb3NlXSAoKSB7XG4gICAgaWYgKHRoaXNba1F1ZXVlXS5pc0VtcHR5KCkpIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXNba0NsaWVudHNdLm1hcChjID0+IGMuY2xvc2UoKSkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHRoaXNba0Nsb3NlZFJlc29sdmVdID0gcmVzb2x2ZVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBhc3luYyBba0Rlc3Ryb3ldIChlcnIpIHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXNba1F1ZXVlXS5zaGlmdCgpXG4gICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGl0ZW0uaGFuZGxlci5vbkVycm9yKGVycilcbiAgICB9XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzW2tDbGllbnRzXS5tYXAoYyA9PiBjLmRlc3Ryb3koZXJyKSkpXG4gIH1cblxuICBba0Rpc3BhdGNoXSAob3B0cywgaGFuZGxlcikge1xuICAgIGNvbnN0IGRpc3BhdGNoZXIgPSB0aGlzW2tHZXREaXNwYXRjaGVyXSgpXG5cbiAgICBpZiAoIWRpc3BhdGNoZXIpIHtcbiAgICAgIHRoaXNba05lZWREcmFpbl0gPSB0cnVlXG4gICAgICB0aGlzW2tRdWV1ZV0ucHVzaCh7IG9wdHMsIGhhbmRsZXIgfSlcbiAgICAgIHRoaXNba1F1ZXVlZF0rK1xuICAgIH0gZWxzZSBpZiAoIWRpc3BhdGNoZXIuZGlzcGF0Y2gob3B0cywgaGFuZGxlcikpIHtcbiAgICAgIGRpc3BhdGNoZXJba05lZWREcmFpbl0gPSB0cnVlXG4gICAgICB0aGlzW2tOZWVkRHJhaW5dID0gIXRoaXNba0dldERpc3BhdGNoZXJdKClcbiAgICB9XG5cbiAgICByZXR1cm4gIXRoaXNba05lZWREcmFpbl1cbiAgfVxuXG4gIFtrQWRkQ2xpZW50XSAoY2xpZW50KSB7XG4gICAgY2xpZW50XG4gICAgICAub24oJ2RyYWluJywgdGhpc1trT25EcmFpbl0pXG4gICAgICAub24oJ2Nvbm5lY3QnLCB0aGlzW2tPbkNvbm5lY3RdKVxuICAgICAgLm9uKCdkaXNjb25uZWN0JywgdGhpc1trT25EaXNjb25uZWN0XSlcbiAgICAgIC5vbignY29ubmVjdGlvbkVycm9yJywgdGhpc1trT25Db25uZWN0aW9uRXJyb3JdKVxuXG4gICAgdGhpc1trQ2xpZW50c10ucHVzaChjbGllbnQpXG5cbiAgICBpZiAodGhpc1trTmVlZERyYWluXSkge1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICBpZiAodGhpc1trTmVlZERyYWluXSkge1xuICAgICAgICAgIHRoaXNba09uRHJhaW5dKGNsaWVudFtrVXJsXSwgW3RoaXMsIGNsaWVudF0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIFtrUmVtb3ZlQ2xpZW50XSAoY2xpZW50KSB7XG4gICAgY2xpZW50LmNsb3NlKCgpID0+IHtcbiAgICAgIGNvbnN0IGlkeCA9IHRoaXNba0NsaWVudHNdLmluZGV4T2YoY2xpZW50KVxuICAgICAgaWYgKGlkeCAhPT0gLTEpIHtcbiAgICAgICAgdGhpc1trQ2xpZW50c10uc3BsaWNlKGlkeCwgMSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdGhpc1trTmVlZERyYWluXSA9IHRoaXNba0NsaWVudHNdLnNvbWUoZGlzcGF0Y2hlciA9PiAoXG4gICAgICAhZGlzcGF0Y2hlcltrTmVlZERyYWluXSAmJlxuICAgICAgZGlzcGF0Y2hlci5jbG9zZWQgIT09IHRydWUgJiZcbiAgICAgIGRpc3BhdGNoZXIuZGVzdHJveWVkICE9PSB0cnVlXG4gICAgKSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgUG9vbEJhc2UsXG4gIGtDbGllbnRzLFxuICBrTmVlZERyYWluLFxuICBrQWRkQ2xpZW50LFxuICBrUmVtb3ZlQ2xpZW50LFxuICBrR2V0RGlzcGF0Y2hlclxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHtcbiAgUG9vbEJhc2UsXG4gIGtDbGllbnRzLFxuICBrTmVlZERyYWluLFxuICBrQWRkQ2xpZW50LFxuICBrR2V0RGlzcGF0Y2hlclxufSA9IHJlcXVpcmUoJy4vcG9vbC1iYXNlJylcbmNvbnN0IENsaWVudCA9IHJlcXVpcmUoJy4vY2xpZW50JylcbmNvbnN0IHtcbiAgSW52YWxpZEFyZ3VtZW50RXJyb3Jcbn0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsga1VybCwga0ludGVyY2VwdG9ycyB9ID0gcmVxdWlyZSgnLi4vY29yZS9zeW1ib2xzJylcbmNvbnN0IGJ1aWxkQ29ubmVjdG9yID0gcmVxdWlyZSgnLi4vY29yZS9jb25uZWN0JylcblxuY29uc3Qga09wdGlvbnMgPSBTeW1ib2woJ29wdGlvbnMnKVxuY29uc3Qga0Nvbm5lY3Rpb25zID0gU3ltYm9sKCdjb25uZWN0aW9ucycpXG5jb25zdCBrRmFjdG9yeSA9IFN5bWJvbCgnZmFjdG9yeScpXG5cbmZ1bmN0aW9uIGRlZmF1bHRGYWN0b3J5IChvcmlnaW4sIG9wdHMpIHtcbiAgcmV0dXJuIG5ldyBDbGllbnQob3JpZ2luLCBvcHRzKVxufVxuXG5jbGFzcyBQb29sIGV4dGVuZHMgUG9vbEJhc2Uge1xuICBjb25zdHJ1Y3RvciAob3JpZ2luLCB7XG4gICAgY29ubmVjdGlvbnMsXG4gICAgZmFjdG9yeSA9IGRlZmF1bHRGYWN0b3J5LFxuICAgIGNvbm5lY3QsXG4gICAgY29ubmVjdFRpbWVvdXQsXG4gICAgdGxzLFxuICAgIG1heENhY2hlZFNlc3Npb25zLFxuICAgIHNvY2tldFBhdGgsXG4gICAgYXV0b1NlbGVjdEZhbWlseSxcbiAgICBhdXRvU2VsZWN0RmFtaWx5QXR0ZW1wdFRpbWVvdXQsXG4gICAgYWxsb3dIMixcbiAgICAuLi5vcHRpb25zXG4gIH0gPSB7fSkge1xuICAgIHN1cGVyKClcblxuICAgIGlmIChjb25uZWN0aW9ucyAhPSBudWxsICYmICghTnVtYmVyLmlzRmluaXRlKGNvbm5lY3Rpb25zKSB8fCBjb25uZWN0aW9ucyA8IDApKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgY29ubmVjdGlvbnMnKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZmFjdG9yeSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdmYWN0b3J5IG11c3QgYmUgYSBmdW5jdGlvbi4nKVxuICAgIH1cblxuICAgIGlmIChjb25uZWN0ICE9IG51bGwgJiYgdHlwZW9mIGNvbm5lY3QgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGNvbm5lY3QgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2Nvbm5lY3QgbXVzdCBiZSBhIGZ1bmN0aW9uIG9yIGFuIG9iamVjdCcpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb25uZWN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25uZWN0ID0gYnVpbGRDb25uZWN0b3Ioe1xuICAgICAgICAuLi50bHMsXG4gICAgICAgIG1heENhY2hlZFNlc3Npb25zLFxuICAgICAgICBhbGxvd0gyLFxuICAgICAgICBzb2NrZXRQYXRoLFxuICAgICAgICB0aW1lb3V0OiBjb25uZWN0VGltZW91dCxcbiAgICAgICAgLi4uKGF1dG9TZWxlY3RGYW1pbHkgPyB7IGF1dG9TZWxlY3RGYW1pbHksIGF1dG9TZWxlY3RGYW1pbHlBdHRlbXB0VGltZW91dCB9IDogdW5kZWZpbmVkKSxcbiAgICAgICAgLi4uY29ubmVjdFxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0aGlzW2tJbnRlcmNlcHRvcnNdID0gb3B0aW9ucy5pbnRlcmNlcHRvcnM/LlBvb2wgJiYgQXJyYXkuaXNBcnJheShvcHRpb25zLmludGVyY2VwdG9ycy5Qb29sKVxuICAgICAgPyBvcHRpb25zLmludGVyY2VwdG9ycy5Qb29sXG4gICAgICA6IFtdXG4gICAgdGhpc1trQ29ubmVjdGlvbnNdID0gY29ubmVjdGlvbnMgfHwgbnVsbFxuICAgIHRoaXNba1VybF0gPSB1dGlsLnBhcnNlT3JpZ2luKG9yaWdpbilcbiAgICB0aGlzW2tPcHRpb25zXSA9IHsgLi4udXRpbC5kZWVwQ2xvbmUob3B0aW9ucyksIGNvbm5lY3QsIGFsbG93SDIgfVxuICAgIHRoaXNba09wdGlvbnNdLmludGVyY2VwdG9ycyA9IG9wdGlvbnMuaW50ZXJjZXB0b3JzXG4gICAgICA/IHsgLi4ub3B0aW9ucy5pbnRlcmNlcHRvcnMgfVxuICAgICAgOiB1bmRlZmluZWRcbiAgICB0aGlzW2tGYWN0b3J5XSA9IGZhY3RvcnlcblxuICAgIHRoaXMub24oJ2Nvbm5lY3Rpb25FcnJvcicsIChvcmlnaW4sIHRhcmdldHMsIGVycm9yKSA9PiB7XG4gICAgICAvLyBJZiBhIGNvbm5lY3Rpb24gZXJyb3Igb2NjdXJzLCB3ZSByZW1vdmUgdGhlIGNsaWVudCBmcm9tIHRoZSBwb29sLFxuICAgICAgLy8gYW5kIGVtaXQgYSBjb25uZWN0aW9uRXJyb3IgZXZlbnQuIFRoZXkgd2lsbCBub3QgYmUgcmUtdXNlZC5cbiAgICAgIC8vIEZpeGVzIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2lzc3Vlcy8zODk1XG4gICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICAgIC8vIERvIG5vdCB1c2Uga1JlbW92ZUNsaWVudCBoZXJlLCBhcyBpdCB3aWxsIGNsb3NlIHRoZSBjbGllbnQsXG4gICAgICAgIC8vIGJ1dCB0aGUgY2xpZW50IGNhbm5vdCBiZSBjbG9zZWQgaW4gdGhpcyBzdGF0ZS5cbiAgICAgICAgY29uc3QgaWR4ID0gdGhpc1trQ2xpZW50c10uaW5kZXhPZih0YXJnZXQpXG4gICAgICAgIGlmIChpZHggIT09IC0xKSB7XG4gICAgICAgICAgdGhpc1trQ2xpZW50c10uc3BsaWNlKGlkeCwgMSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBba0dldERpc3BhdGNoZXJdICgpIHtcbiAgICBmb3IgKGNvbnN0IGNsaWVudCBvZiB0aGlzW2tDbGllbnRzXSkge1xuICAgICAgaWYgKCFjbGllbnRba05lZWREcmFpbl0pIHtcbiAgICAgICAgcmV0dXJuIGNsaWVudFxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGhpc1trQ29ubmVjdGlvbnNdIHx8IHRoaXNba0NsaWVudHNdLmxlbmd0aCA8IHRoaXNba0Nvbm5lY3Rpb25zXSkge1xuICAgICAgY29uc3QgZGlzcGF0Y2hlciA9IHRoaXNba0ZhY3RvcnldKHRoaXNba1VybF0sIHRoaXNba09wdGlvbnNdKVxuICAgICAgdGhpc1trQWRkQ2xpZW50XShkaXNwYXRjaGVyKVxuICAgICAgcmV0dXJuIGRpc3BhdGNoZXJcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBQb29sXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBCYWxhbmNlZFBvb2xNaXNzaW5nVXBzdHJlYW1FcnJvcixcbiAgSW52YWxpZEFyZ3VtZW50RXJyb3Jcbn0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5jb25zdCB7XG4gIFBvb2xCYXNlLFxuICBrQ2xpZW50cyxcbiAga05lZWREcmFpbixcbiAga0FkZENsaWVudCxcbiAga1JlbW92ZUNsaWVudCxcbiAga0dldERpc3BhdGNoZXJcbn0gPSByZXF1aXJlKCcuL3Bvb2wtYmFzZScpXG5jb25zdCBQb29sID0gcmVxdWlyZSgnLi9wb29sJylcbmNvbnN0IHsga1VybCwga0ludGVyY2VwdG9ycyB9ID0gcmVxdWlyZSgnLi4vY29yZS9zeW1ib2xzJylcbmNvbnN0IHsgcGFyc2VPcmlnaW4gfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5jb25zdCBrRmFjdG9yeSA9IFN5bWJvbCgnZmFjdG9yeScpXG5cbmNvbnN0IGtPcHRpb25zID0gU3ltYm9sKCdvcHRpb25zJylcbmNvbnN0IGtHcmVhdGVzdENvbW1vbkRpdmlzb3IgPSBTeW1ib2woJ2tHcmVhdGVzdENvbW1vbkRpdmlzb3InKVxuY29uc3Qga0N1cnJlbnRXZWlnaHQgPSBTeW1ib2woJ2tDdXJyZW50V2VpZ2h0JylcbmNvbnN0IGtJbmRleCA9IFN5bWJvbCgna0luZGV4JylcbmNvbnN0IGtXZWlnaHQgPSBTeW1ib2woJ2tXZWlnaHQnKVxuY29uc3Qga01heFdlaWdodFBlclNlcnZlciA9IFN5bWJvbCgna01heFdlaWdodFBlclNlcnZlcicpXG5jb25zdCBrRXJyb3JQZW5hbHR5ID0gU3ltYm9sKCdrRXJyb3JQZW5hbHR5JylcblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yIG9mIHR3byBudW1iZXJzIGJ5XG4gKiB1c2luZyB0aGUgRXVjbGlkZWFuIGFsZ29yaXRobS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gYVxuICogQHBhcmFtIHtudW1iZXJ9IGJcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIGdldEdyZWF0ZXN0Q29tbW9uRGl2aXNvciAoYSwgYikge1xuICBpZiAoYSA9PT0gMCkgcmV0dXJuIGJcblxuICB3aGlsZSAoYiAhPT0gMCkge1xuICAgIGNvbnN0IHQgPSBiXG4gICAgYiA9IGEgJSBiXG4gICAgYSA9IHRcbiAgfVxuICByZXR1cm4gYVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0RmFjdG9yeSAob3JpZ2luLCBvcHRzKSB7XG4gIHJldHVybiBuZXcgUG9vbChvcmlnaW4sIG9wdHMpXG59XG5cbmNsYXNzIEJhbGFuY2VkUG9vbCBleHRlbmRzIFBvb2xCYXNlIHtcbiAgY29uc3RydWN0b3IgKHVwc3RyZWFtcyA9IFtdLCB7IGZhY3RvcnkgPSBkZWZhdWx0RmFjdG9yeSwgLi4ub3B0cyB9ID0ge30pIHtcbiAgICBzdXBlcigpXG5cbiAgICB0aGlzW2tPcHRpb25zXSA9IG9wdHNcbiAgICB0aGlzW2tJbmRleF0gPSAtMVxuICAgIHRoaXNba0N1cnJlbnRXZWlnaHRdID0gMFxuXG4gICAgdGhpc1trTWF4V2VpZ2h0UGVyU2VydmVyXSA9IHRoaXNba09wdGlvbnNdLm1heFdlaWdodFBlclNlcnZlciB8fCAxMDBcbiAgICB0aGlzW2tFcnJvclBlbmFsdHldID0gdGhpc1trT3B0aW9uc10uZXJyb3JQZW5hbHR5IHx8IDE1XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodXBzdHJlYW1zKSkge1xuICAgICAgdXBzdHJlYW1zID0gW3Vwc3RyZWFtc11cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZhY3RvcnkgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignZmFjdG9yeSBtdXN0IGJlIGEgZnVuY3Rpb24uJylcbiAgICB9XG5cbiAgICB0aGlzW2tJbnRlcmNlcHRvcnNdID0gb3B0cy5pbnRlcmNlcHRvcnM/LkJhbGFuY2VkUG9vbCAmJiBBcnJheS5pc0FycmF5KG9wdHMuaW50ZXJjZXB0b3JzLkJhbGFuY2VkUG9vbClcbiAgICAgID8gb3B0cy5pbnRlcmNlcHRvcnMuQmFsYW5jZWRQb29sXG4gICAgICA6IFtdXG4gICAgdGhpc1trRmFjdG9yeV0gPSBmYWN0b3J5XG5cbiAgICBmb3IgKGNvbnN0IHVwc3RyZWFtIG9mIHVwc3RyZWFtcykge1xuICAgICAgdGhpcy5hZGRVcHN0cmVhbSh1cHN0cmVhbSlcbiAgICB9XG4gICAgdGhpcy5fdXBkYXRlQmFsYW5jZWRQb29sU3RhdHMoKVxuICB9XG5cbiAgYWRkVXBzdHJlYW0gKHVwc3RyZWFtKSB7XG4gICAgY29uc3QgdXBzdHJlYW1PcmlnaW4gPSBwYXJzZU9yaWdpbih1cHN0cmVhbSkub3JpZ2luXG5cbiAgICBpZiAodGhpc1trQ2xpZW50c10uZmluZCgocG9vbCkgPT4gKFxuICAgICAgcG9vbFtrVXJsXS5vcmlnaW4gPT09IHVwc3RyZWFtT3JpZ2luICYmXG4gICAgICBwb29sLmNsb3NlZCAhPT0gdHJ1ZSAmJlxuICAgICAgcG9vbC5kZXN0cm95ZWQgIT09IHRydWVcbiAgICApKSkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG4gICAgY29uc3QgcG9vbCA9IHRoaXNba0ZhY3RvcnldKHVwc3RyZWFtT3JpZ2luLCBPYmplY3QuYXNzaWduKHt9LCB0aGlzW2tPcHRpb25zXSkpXG5cbiAgICB0aGlzW2tBZGRDbGllbnRdKHBvb2wpXG4gICAgcG9vbC5vbignY29ubmVjdCcsICgpID0+IHtcbiAgICAgIHBvb2xba1dlaWdodF0gPSBNYXRoLm1pbih0aGlzW2tNYXhXZWlnaHRQZXJTZXJ2ZXJdLCBwb29sW2tXZWlnaHRdICsgdGhpc1trRXJyb3JQZW5hbHR5XSlcbiAgICB9KVxuXG4gICAgcG9vbC5vbignY29ubmVjdGlvbkVycm9yJywgKCkgPT4ge1xuICAgICAgcG9vbFtrV2VpZ2h0XSA9IE1hdGgubWF4KDEsIHBvb2xba1dlaWdodF0gLSB0aGlzW2tFcnJvclBlbmFsdHldKVxuICAgICAgdGhpcy5fdXBkYXRlQmFsYW5jZWRQb29sU3RhdHMoKVxuICAgIH0pXG5cbiAgICBwb29sLm9uKCdkaXNjb25uZWN0JywgKC4uLmFyZ3MpID0+IHtcbiAgICAgIGNvbnN0IGVyciA9IGFyZ3NbMl1cbiAgICAgIGlmIChlcnIgJiYgZXJyLmNvZGUgPT09ICdVTkRfRVJSX1NPQ0tFVCcpIHtcbiAgICAgICAgLy8gZGVjcmVhc2UgdGhlIHdlaWdodCBvZiB0aGUgcG9vbC5cbiAgICAgICAgcG9vbFtrV2VpZ2h0XSA9IE1hdGgubWF4KDEsIHBvb2xba1dlaWdodF0gLSB0aGlzW2tFcnJvclBlbmFsdHldKVxuICAgICAgICB0aGlzLl91cGRhdGVCYWxhbmNlZFBvb2xTdGF0cygpXG4gICAgICB9XG4gICAgfSlcblxuICAgIGZvciAoY29uc3QgY2xpZW50IG9mIHRoaXNba0NsaWVudHNdKSB7XG4gICAgICBjbGllbnRba1dlaWdodF0gPSB0aGlzW2tNYXhXZWlnaHRQZXJTZXJ2ZXJdXG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlQmFsYW5jZWRQb29sU3RhdHMoKVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIF91cGRhdGVCYWxhbmNlZFBvb2xTdGF0cyAoKSB7XG4gICAgbGV0IHJlc3VsdCA9IDBcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXNba0NsaWVudHNdLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHQgPSBnZXRHcmVhdGVzdENvbW1vbkRpdmlzb3IodGhpc1trQ2xpZW50c11baV1ba1dlaWdodF0sIHJlc3VsdClcbiAgICB9XG5cbiAgICB0aGlzW2tHcmVhdGVzdENvbW1vbkRpdmlzb3JdID0gcmVzdWx0XG4gIH1cblxuICByZW1vdmVVcHN0cmVhbSAodXBzdHJlYW0pIHtcbiAgICBjb25zdCB1cHN0cmVhbU9yaWdpbiA9IHBhcnNlT3JpZ2luKHVwc3RyZWFtKS5vcmlnaW5cblxuICAgIGNvbnN0IHBvb2wgPSB0aGlzW2tDbGllbnRzXS5maW5kKChwb29sKSA9PiAoXG4gICAgICBwb29sW2tVcmxdLm9yaWdpbiA9PT0gdXBzdHJlYW1PcmlnaW4gJiZcbiAgICAgIHBvb2wuY2xvc2VkICE9PSB0cnVlICYmXG4gICAgICBwb29sLmRlc3Ryb3llZCAhPT0gdHJ1ZVxuICAgICkpXG5cbiAgICBpZiAocG9vbCkge1xuICAgICAgdGhpc1trUmVtb3ZlQ2xpZW50XShwb29sKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBnZXQgdXBzdHJlYW1zICgpIHtcbiAgICByZXR1cm4gdGhpc1trQ2xpZW50c11cbiAgICAgIC5maWx0ZXIoZGlzcGF0Y2hlciA9PiBkaXNwYXRjaGVyLmNsb3NlZCAhPT0gdHJ1ZSAmJiBkaXNwYXRjaGVyLmRlc3Ryb3llZCAhPT0gdHJ1ZSlcbiAgICAgIC5tYXAoKHApID0+IHBba1VybF0ub3JpZ2luKVxuICB9XG5cbiAgW2tHZXREaXNwYXRjaGVyXSAoKSB7XG4gICAgLy8gV2UgdmFsaWRhdGUgdGhhdCBwb29scyBpcyBncmVhdGVyIHRoYW4gMCxcbiAgICAvLyBvdGhlcndpc2Ugd2Ugd291bGQgaGF2ZSB0byB3YWl0IHVudGlsIGFuIHVwc3RyZWFtXG4gICAgLy8gaXMgYWRkZWQsIHdoaWNoIG1pZ2h0IG5ldmVyIGhhcHBlbi5cbiAgICBpZiAodGhpc1trQ2xpZW50c10ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQmFsYW5jZWRQb29sTWlzc2luZ1Vwc3RyZWFtRXJyb3IoKVxuICAgIH1cblxuICAgIGNvbnN0IGRpc3BhdGNoZXIgPSB0aGlzW2tDbGllbnRzXS5maW5kKGRpc3BhdGNoZXIgPT4gKFxuICAgICAgIWRpc3BhdGNoZXJba05lZWREcmFpbl0gJiZcbiAgICAgIGRpc3BhdGNoZXIuY2xvc2VkICE9PSB0cnVlICYmXG4gICAgICBkaXNwYXRjaGVyLmRlc3Ryb3llZCAhPT0gdHJ1ZVxuICAgICkpXG5cbiAgICBpZiAoIWRpc3BhdGNoZXIpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGFsbENsaWVudHNCdXN5ID0gdGhpc1trQ2xpZW50c10ubWFwKHBvb2wgPT4gcG9vbFtrTmVlZERyYWluXSkucmVkdWNlKChhLCBiKSA9PiBhICYmIGIsIHRydWUpXG5cbiAgICBpZiAoYWxsQ2xpZW50c0J1c3kpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxldCBjb3VudGVyID0gMFxuXG4gICAgbGV0IG1heFdlaWdodEluZGV4ID0gdGhpc1trQ2xpZW50c10uZmluZEluZGV4KHBvb2wgPT4gIXBvb2xba05lZWREcmFpbl0pXG5cbiAgICB3aGlsZSAoY291bnRlcisrIDwgdGhpc1trQ2xpZW50c10ubGVuZ3RoKSB7XG4gICAgICB0aGlzW2tJbmRleF0gPSAodGhpc1trSW5kZXhdICsgMSkgJSB0aGlzW2tDbGllbnRzXS5sZW5ndGhcbiAgICAgIGNvbnN0IHBvb2wgPSB0aGlzW2tDbGllbnRzXVt0aGlzW2tJbmRleF1dXG5cbiAgICAgIC8vIGZpbmQgcG9vbCBpbmRleCB3aXRoIHRoZSBsYXJnZXN0IHdlaWdodFxuICAgICAgaWYgKHBvb2xba1dlaWdodF0gPiB0aGlzW2tDbGllbnRzXVttYXhXZWlnaHRJbmRleF1ba1dlaWdodF0gJiYgIXBvb2xba05lZWREcmFpbl0pIHtcbiAgICAgICAgbWF4V2VpZ2h0SW5kZXggPSB0aGlzW2tJbmRleF1cbiAgICAgIH1cblxuICAgICAgLy8gZGVjcmVhc2UgdGhlIGN1cnJlbnQgd2VpZ2h0IGV2ZXJ5IGB0aGlzW2tDbGllbnRzXS5sZW5ndGhgLlxuICAgICAgaWYgKHRoaXNba0luZGV4XSA9PT0gMCkge1xuICAgICAgICAvLyBTZXQgdGhlIGN1cnJlbnQgd2VpZ2h0IHRvIHRoZSBuZXh0IGxvd2VyIHdlaWdodC5cbiAgICAgICAgdGhpc1trQ3VycmVudFdlaWdodF0gPSB0aGlzW2tDdXJyZW50V2VpZ2h0XSAtIHRoaXNba0dyZWF0ZXN0Q29tbW9uRGl2aXNvcl1cblxuICAgICAgICBpZiAodGhpc1trQ3VycmVudFdlaWdodF0gPD0gMCkge1xuICAgICAgICAgIHRoaXNba0N1cnJlbnRXZWlnaHRdID0gdGhpc1trTWF4V2VpZ2h0UGVyU2VydmVyXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocG9vbFtrV2VpZ2h0XSA+PSB0aGlzW2tDdXJyZW50V2VpZ2h0XSAmJiAoIXBvb2xba05lZWREcmFpbl0pKSB7XG4gICAgICAgIHJldHVybiBwb29sXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpc1trQ3VycmVudFdlaWdodF0gPSB0aGlzW2tDbGllbnRzXVttYXhXZWlnaHRJbmRleF1ba1dlaWdodF1cbiAgICB0aGlzW2tJbmRleF0gPSBtYXhXZWlnaHRJbmRleFxuICAgIHJldHVybiB0aGlzW2tDbGllbnRzXVttYXhXZWlnaHRJbmRleF1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEJhbGFuY2VkUG9vbFxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcbmNvbnN0IHsga0NsaWVudHMsIGtSdW5uaW5nLCBrQ2xvc2UsIGtEZXN0cm95LCBrRGlzcGF0Y2gsIGtJbnRlcmNlcHRvcnMgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCBEaXNwYXRjaGVyQmFzZSA9IHJlcXVpcmUoJy4vZGlzcGF0Y2hlci1iYXNlJylcbmNvbnN0IFBvb2wgPSByZXF1aXJlKCcuL3Bvb2wnKVxuY29uc3QgQ2xpZW50ID0gcmVxdWlyZSgnLi9jbGllbnQnKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5jb25zdCBjcmVhdGVSZWRpcmVjdEludGVyY2VwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJjZXB0b3IvcmVkaXJlY3QtaW50ZXJjZXB0b3InKVxuXG5jb25zdCBrT25Db25uZWN0ID0gU3ltYm9sKCdvbkNvbm5lY3QnKVxuY29uc3Qga09uRGlzY29ubmVjdCA9IFN5bWJvbCgnb25EaXNjb25uZWN0JylcbmNvbnN0IGtPbkNvbm5lY3Rpb25FcnJvciA9IFN5bWJvbCgnb25Db25uZWN0aW9uRXJyb3InKVxuY29uc3Qga01heFJlZGlyZWN0aW9ucyA9IFN5bWJvbCgnbWF4UmVkaXJlY3Rpb25zJylcbmNvbnN0IGtPbkRyYWluID0gU3ltYm9sKCdvbkRyYWluJylcbmNvbnN0IGtGYWN0b3J5ID0gU3ltYm9sKCdmYWN0b3J5JylcbmNvbnN0IGtPcHRpb25zID0gU3ltYm9sKCdvcHRpb25zJylcblxuZnVuY3Rpb24gZGVmYXVsdEZhY3RvcnkgKG9yaWdpbiwgb3B0cykge1xuICByZXR1cm4gb3B0cyAmJiBvcHRzLmNvbm5lY3Rpb25zID09PSAxXG4gICAgPyBuZXcgQ2xpZW50KG9yaWdpbiwgb3B0cylcbiAgICA6IG5ldyBQb29sKG9yaWdpbiwgb3B0cylcbn1cblxuY2xhc3MgQWdlbnQgZXh0ZW5kcyBEaXNwYXRjaGVyQmFzZSB7XG4gIGNvbnN0cnVjdG9yICh7IGZhY3RvcnkgPSBkZWZhdWx0RmFjdG9yeSwgbWF4UmVkaXJlY3Rpb25zID0gMCwgY29ubmVjdCwgLi4ub3B0aW9ucyB9ID0ge30pIHtcbiAgICBzdXBlcigpXG5cbiAgICBpZiAodHlwZW9mIGZhY3RvcnkgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignZmFjdG9yeSBtdXN0IGJlIGEgZnVuY3Rpb24uJylcbiAgICB9XG5cbiAgICBpZiAoY29ubmVjdCAhPSBudWxsICYmIHR5cGVvZiBjb25uZWN0ICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBjb25uZWN0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdjb25uZWN0IG11c3QgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3QnKVxuICAgIH1cblxuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihtYXhSZWRpcmVjdGlvbnMpIHx8IG1heFJlZGlyZWN0aW9ucyA8IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignbWF4UmVkaXJlY3Rpb25zIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKVxuICAgIH1cblxuICAgIGlmIChjb25uZWN0ICYmIHR5cGVvZiBjb25uZWN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25uZWN0ID0geyAuLi5jb25uZWN0IH1cbiAgICB9XG5cbiAgICB0aGlzW2tJbnRlcmNlcHRvcnNdID0gb3B0aW9ucy5pbnRlcmNlcHRvcnM/LkFnZW50ICYmIEFycmF5LmlzQXJyYXkob3B0aW9ucy5pbnRlcmNlcHRvcnMuQWdlbnQpXG4gICAgICA/IG9wdGlvbnMuaW50ZXJjZXB0b3JzLkFnZW50XG4gICAgICA6IFtjcmVhdGVSZWRpcmVjdEludGVyY2VwdG9yKHsgbWF4UmVkaXJlY3Rpb25zIH0pXVxuXG4gICAgdGhpc1trT3B0aW9uc10gPSB7IC4uLnV0aWwuZGVlcENsb25lKG9wdGlvbnMpLCBjb25uZWN0IH1cbiAgICB0aGlzW2tPcHRpb25zXS5pbnRlcmNlcHRvcnMgPSBvcHRpb25zLmludGVyY2VwdG9yc1xuICAgICAgPyB7IC4uLm9wdGlvbnMuaW50ZXJjZXB0b3JzIH1cbiAgICAgIDogdW5kZWZpbmVkXG4gICAgdGhpc1trTWF4UmVkaXJlY3Rpb25zXSA9IG1heFJlZGlyZWN0aW9uc1xuICAgIHRoaXNba0ZhY3RvcnldID0gZmFjdG9yeVxuICAgIHRoaXNba0NsaWVudHNdID0gbmV3IE1hcCgpXG5cbiAgICB0aGlzW2tPbkRyYWluXSA9IChvcmlnaW4sIHRhcmdldHMpID0+IHtcbiAgICAgIHRoaXMuZW1pdCgnZHJhaW4nLCBvcmlnaW4sIFt0aGlzLCAuLi50YXJnZXRzXSlcbiAgICB9XG5cbiAgICB0aGlzW2tPbkNvbm5lY3RdID0gKG9yaWdpbiwgdGFyZ2V0cykgPT4ge1xuICAgICAgdGhpcy5lbWl0KCdjb25uZWN0Jywgb3JpZ2luLCBbdGhpcywgLi4udGFyZ2V0c10pXG4gICAgfVxuXG4gICAgdGhpc1trT25EaXNjb25uZWN0XSA9IChvcmlnaW4sIHRhcmdldHMsIGVycikgPT4ge1xuICAgICAgdGhpcy5lbWl0KCdkaXNjb25uZWN0Jywgb3JpZ2luLCBbdGhpcywgLi4udGFyZ2V0c10sIGVycilcbiAgICB9XG5cbiAgICB0aGlzW2tPbkNvbm5lY3Rpb25FcnJvcl0gPSAob3JpZ2luLCB0YXJnZXRzLCBlcnIpID0+IHtcbiAgICAgIHRoaXMuZW1pdCgnY29ubmVjdGlvbkVycm9yJywgb3JpZ2luLCBbdGhpcywgLi4udGFyZ2V0c10sIGVycilcbiAgICB9XG4gIH1cblxuICBnZXQgW2tSdW5uaW5nXSAoKSB7XG4gICAgbGV0IHJldCA9IDBcbiAgICBmb3IgKGNvbnN0IGNsaWVudCBvZiB0aGlzW2tDbGllbnRzXS52YWx1ZXMoKSkge1xuICAgICAgcmV0ICs9IGNsaWVudFtrUnVubmluZ11cbiAgICB9XG4gICAgcmV0dXJuIHJldFxuICB9XG5cbiAgW2tEaXNwYXRjaF0gKG9wdHMsIGhhbmRsZXIpIHtcbiAgICBsZXQga2V5XG4gICAgaWYgKG9wdHMub3JpZ2luICYmICh0eXBlb2Ygb3B0cy5vcmlnaW4gPT09ICdzdHJpbmcnIHx8IG9wdHMub3JpZ2luIGluc3RhbmNlb2YgVVJMKSkge1xuICAgICAga2V5ID0gU3RyaW5nKG9wdHMub3JpZ2luKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ29wdHMub3JpZ2luIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIG9yIFVSTC4nKVxuICAgIH1cblxuICAgIGxldCBkaXNwYXRjaGVyID0gdGhpc1trQ2xpZW50c10uZ2V0KGtleSlcblxuICAgIGlmICghZGlzcGF0Y2hlcikge1xuICAgICAgZGlzcGF0Y2hlciA9IHRoaXNba0ZhY3RvcnldKG9wdHMub3JpZ2luLCB0aGlzW2tPcHRpb25zXSlcbiAgICAgICAgLm9uKCdkcmFpbicsIHRoaXNba09uRHJhaW5dKVxuICAgICAgICAub24oJ2Nvbm5lY3QnLCB0aGlzW2tPbkNvbm5lY3RdKVxuICAgICAgICAub24oJ2Rpc2Nvbm5lY3QnLCB0aGlzW2tPbkRpc2Nvbm5lY3RdKVxuICAgICAgICAub24oJ2Nvbm5lY3Rpb25FcnJvcicsIHRoaXNba09uQ29ubmVjdGlvbkVycm9yXSlcblxuICAgICAgLy8gVGhpcyBpbnRyb2R1Y2VzIGEgdGlueSBtZW1vcnkgbGVhaywgYXMgZGlzcGF0Y2hlcnMgYXJlIG5ldmVyIHJlbW92ZWQgZnJvbSB0aGUgbWFwLlxuICAgICAgLy8gVE9ETyhtY29sbGluYSk6IHJlbW92ZSB0ZSB0aW1lciB3aGVuIHRoZSBjbGllbnQvcG9vbCBkbyBub3QgaGF2ZSBhbnkgbW9yZVxuICAgICAgLy8gYWN0aXZlIGNvbm5lY3Rpb25zLlxuICAgICAgdGhpc1trQ2xpZW50c10uc2V0KGtleSwgZGlzcGF0Y2hlcilcbiAgICB9XG5cbiAgICByZXR1cm4gZGlzcGF0Y2hlci5kaXNwYXRjaChvcHRzLCBoYW5kbGVyKVxuICB9XG5cbiAgYXN5bmMgW2tDbG9zZV0gKCkge1xuICAgIGNvbnN0IGNsb3NlUHJvbWlzZXMgPSBbXVxuICAgIGZvciAoY29uc3QgY2xpZW50IG9mIHRoaXNba0NsaWVudHNdLnZhbHVlcygpKSB7XG4gICAgICBjbG9zZVByb21pc2VzLnB1c2goY2xpZW50LmNsb3NlKCkpXG4gICAgfVxuICAgIHRoaXNba0NsaWVudHNdLmNsZWFyKClcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGNsb3NlUHJvbWlzZXMpXG4gIH1cblxuICBhc3luYyBba0Rlc3Ryb3ldIChlcnIpIHtcbiAgICBjb25zdCBkZXN0cm95UHJvbWlzZXMgPSBbXVxuICAgIGZvciAoY29uc3QgY2xpZW50IG9mIHRoaXNba0NsaWVudHNdLnZhbHVlcygpKSB7XG4gICAgICBkZXN0cm95UHJvbWlzZXMucHVzaChjbGllbnQuZGVzdHJveShlcnIpKVxuICAgIH1cbiAgICB0aGlzW2tDbGllbnRzXS5jbGVhcigpXG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChkZXN0cm95UHJvbWlzZXMpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBBZ2VudFxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsga1Byb3h5LCBrQ2xvc2UsIGtEZXN0cm95LCBrRGlzcGF0Y2gsIGtJbnRlcmNlcHRvcnMgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCB7IFVSTCB9ID0gcmVxdWlyZSgnbm9kZTp1cmwnKVxuY29uc3QgQWdlbnQgPSByZXF1aXJlKCcuL2FnZW50JylcbmNvbnN0IFBvb2wgPSByZXF1aXJlKCcuL3Bvb2wnKVxuY29uc3QgRGlzcGF0Y2hlckJhc2UgPSByZXF1aXJlKCcuL2Rpc3BhdGNoZXItYmFzZScpXG5jb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yLCBSZXF1ZXN0QWJvcnRlZEVycm9yLCBTZWN1cmVQcm94eUNvbm5lY3Rpb25FcnJvciB9ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMnKVxuY29uc3QgYnVpbGRDb25uZWN0b3IgPSByZXF1aXJlKCcuLi9jb3JlL2Nvbm5lY3QnKVxuY29uc3QgQ2xpZW50ID0gcmVxdWlyZSgnLi9jbGllbnQnKVxuXG5jb25zdCBrQWdlbnQgPSBTeW1ib2woJ3Byb3h5IGFnZW50JylcbmNvbnN0IGtDbGllbnQgPSBTeW1ib2woJ3Byb3h5IGNsaWVudCcpXG5jb25zdCBrUHJveHlIZWFkZXJzID0gU3ltYm9sKCdwcm94eSBoZWFkZXJzJylcbmNvbnN0IGtSZXF1ZXN0VGxzID0gU3ltYm9sKCdyZXF1ZXN0IHRscyBzZXR0aW5ncycpXG5jb25zdCBrUHJveHlUbHMgPSBTeW1ib2woJ3Byb3h5IHRscyBzZXR0aW5ncycpXG5jb25zdCBrQ29ubmVjdEVuZHBvaW50ID0gU3ltYm9sKCdjb25uZWN0IGVuZHBvaW50IGZ1bmN0aW9uJylcbmNvbnN0IGtUdW5uZWxQcm94eSA9IFN5bWJvbCgndHVubmVsIHByb3h5JylcblxuZnVuY3Rpb24gZGVmYXVsdFByb3RvY29sUG9ydCAocHJvdG9jb2wpIHtcbiAgcmV0dXJuIHByb3RvY29sID09PSAnaHR0cHM6JyA/IDQ0MyA6IDgwXG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRGYWN0b3J5IChvcmlnaW4sIG9wdHMpIHtcbiAgcmV0dXJuIG5ldyBQb29sKG9yaWdpbiwgb3B0cylcbn1cblxuY29uc3Qgbm9vcCA9ICgpID0+IHt9XG5cbmZ1bmN0aW9uIGRlZmF1bHRBZ2VudEZhY3RvcnkgKG9yaWdpbiwgb3B0cykge1xuICBpZiAob3B0cy5jb25uZWN0aW9ucyA9PT0gMSkge1xuICAgIHJldHVybiBuZXcgQ2xpZW50KG9yaWdpbiwgb3B0cylcbiAgfVxuICByZXR1cm4gbmV3IFBvb2wob3JpZ2luLCBvcHRzKVxufVxuXG5jbGFzcyBIdHRwMVByb3h5V3JhcHBlciBleHRlbmRzIERpc3BhdGNoZXJCYXNlIHtcbiAgI2NsaWVudFxuXG4gIGNvbnN0cnVjdG9yIChwcm94eVVybCwgeyBoZWFkZXJzID0ge30sIGNvbm5lY3QsIGZhY3RvcnkgfSkge1xuICAgIHN1cGVyKClcbiAgICBpZiAoIXByb3h5VXJsKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ1Byb3h5IFVSTCBpcyBtYW5kYXRvcnknKVxuICAgIH1cblxuICAgIHRoaXNba1Byb3h5SGVhZGVyc10gPSBoZWFkZXJzXG4gICAgaWYgKGZhY3RvcnkpIHtcbiAgICAgIHRoaXMuI2NsaWVudCA9IGZhY3RvcnkocHJveHlVcmwsIHsgY29ubmVjdCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNjbGllbnQgPSBuZXcgQ2xpZW50KHByb3h5VXJsLCB7IGNvbm5lY3QgfSlcbiAgICB9XG4gIH1cblxuICBba0Rpc3BhdGNoXSAob3B0cywgaGFuZGxlcikge1xuICAgIGNvbnN0IG9uSGVhZGVycyA9IGhhbmRsZXIub25IZWFkZXJzXG4gICAgaGFuZGxlci5vbkhlYWRlcnMgPSBmdW5jdGlvbiAoc3RhdHVzQ29kZSwgZGF0YSwgcmVzdW1lKSB7XG4gICAgICBpZiAoc3RhdHVzQ29kZSA9PT0gNDA3KSB7XG4gICAgICAgIGlmICh0eXBlb2YgaGFuZGxlci5vbkVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgaGFuZGxlci5vbkVycm9yKG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWQgKDQwNyknKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChvbkhlYWRlcnMpIG9uSGVhZGVycy5jYWxsKHRoaXMsIHN0YXR1c0NvZGUsIGRhdGEsIHJlc3VtZSlcbiAgICB9XG5cbiAgICAvLyBSZXdyaXRlIHJlcXVlc3QgYXMgYW4gSFRUUDEgUHJveHkgcmVxdWVzdCwgd2l0aG91dCB0dW5uZWxpbmcuXG4gICAgY29uc3Qge1xuICAgICAgb3JpZ2luLFxuICAgICAgcGF0aCA9ICcvJyxcbiAgICAgIGhlYWRlcnMgPSB7fVxuICAgIH0gPSBvcHRzXG5cbiAgICBvcHRzLnBhdGggPSBvcmlnaW4gKyBwYXRoXG5cbiAgICBpZiAoISgnaG9zdCcgaW4gaGVhZGVycykgJiYgISgnSG9zdCcgaW4gaGVhZGVycykpIHtcbiAgICAgIGNvbnN0IHsgaG9zdCB9ID0gbmV3IFVSTChvcmlnaW4pXG4gICAgICBoZWFkZXJzLmhvc3QgPSBob3N0XG4gICAgfVxuICAgIG9wdHMuaGVhZGVycyA9IHsgLi4udGhpc1trUHJveHlIZWFkZXJzXSwgLi4uaGVhZGVycyB9XG5cbiAgICByZXR1cm4gdGhpcy4jY2xpZW50W2tEaXNwYXRjaF0ob3B0cywgaGFuZGxlcilcbiAgfVxuXG4gIGFzeW5jIFtrQ2xvc2VdICgpIHtcbiAgICByZXR1cm4gdGhpcy4jY2xpZW50LmNsb3NlKClcbiAgfVxuXG4gIGFzeW5jIFtrRGVzdHJveV0gKGVycikge1xuICAgIHJldHVybiB0aGlzLiNjbGllbnQuZGVzdHJveShlcnIpXG4gIH1cbn1cblxuY2xhc3MgUHJveHlBZ2VudCBleHRlbmRzIERpc3BhdGNoZXJCYXNlIHtcbiAgY29uc3RydWN0b3IgKG9wdHMpIHtcbiAgICBzdXBlcigpXG5cbiAgICBpZiAoIW9wdHMgfHwgKHR5cGVvZiBvcHRzID09PSAnb2JqZWN0JyAmJiAhKG9wdHMgaW5zdGFuY2VvZiBVUkwpICYmICFvcHRzLnVyaSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignUHJveHkgdXJpIGlzIG1hbmRhdG9yeScpXG4gICAgfVxuXG4gICAgY29uc3QgeyBjbGllbnRGYWN0b3J5ID0gZGVmYXVsdEZhY3RvcnkgfSA9IG9wdHNcbiAgICBpZiAodHlwZW9mIGNsaWVudEZhY3RvcnkgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignUHJveHkgb3B0cy5jbGllbnRGYWN0b3J5IG11c3QgYmUgYSBmdW5jdGlvbi4nKVxuICAgIH1cblxuICAgIGNvbnN0IHsgcHJveHlUdW5uZWwgPSB0cnVlIH0gPSBvcHRzXG5cbiAgICBjb25zdCB1cmwgPSB0aGlzLiNnZXRVcmwob3B0cylcbiAgICBjb25zdCB7IGhyZWYsIG9yaWdpbiwgcG9ydCwgcHJvdG9jb2wsIHVzZXJuYW1lLCBwYXNzd29yZCwgaG9zdG5hbWU6IHByb3h5SG9zdG5hbWUgfSA9IHVybFxuXG4gICAgdGhpc1trUHJveHldID0geyB1cmk6IGhyZWYsIHByb3RvY29sIH1cbiAgICB0aGlzW2tJbnRlcmNlcHRvcnNdID0gb3B0cy5pbnRlcmNlcHRvcnM/LlByb3h5QWdlbnQgJiYgQXJyYXkuaXNBcnJheShvcHRzLmludGVyY2VwdG9ycy5Qcm94eUFnZW50KVxuICAgICAgPyBvcHRzLmludGVyY2VwdG9ycy5Qcm94eUFnZW50XG4gICAgICA6IFtdXG4gICAgdGhpc1trUmVxdWVzdFRsc10gPSBvcHRzLnJlcXVlc3RUbHNcbiAgICB0aGlzW2tQcm94eVRsc10gPSBvcHRzLnByb3h5VGxzXG4gICAgdGhpc1trUHJveHlIZWFkZXJzXSA9IG9wdHMuaGVhZGVycyB8fCB7fVxuICAgIHRoaXNba1R1bm5lbFByb3h5XSA9IHByb3h5VHVubmVsXG5cbiAgICBpZiAob3B0cy5hdXRoICYmIG9wdHMudG9rZW4pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignb3B0cy5hdXRoIGNhbm5vdCBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggb3B0cy50b2tlbicpXG4gICAgfSBlbHNlIGlmIChvcHRzLmF1dGgpIHtcbiAgICAgIC8qIEBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBvcHRzLnRva2VuICovXG4gICAgICB0aGlzW2tQcm94eUhlYWRlcnNdWydwcm94eS1hdXRob3JpemF0aW9uJ10gPSBgQmFzaWMgJHtvcHRzLmF1dGh9YFxuICAgIH0gZWxzZSBpZiAob3B0cy50b2tlbikge1xuICAgICAgdGhpc1trUHJveHlIZWFkZXJzXVsncHJveHktYXV0aG9yaXphdGlvbiddID0gb3B0cy50b2tlblxuICAgIH0gZWxzZSBpZiAodXNlcm5hbWUgJiYgcGFzc3dvcmQpIHtcbiAgICAgIHRoaXNba1Byb3h5SGVhZGVyc11bJ3Byb3h5LWF1dGhvcml6YXRpb24nXSA9IGBCYXNpYyAke0J1ZmZlci5mcm9tKGAke2RlY29kZVVSSUNvbXBvbmVudCh1c2VybmFtZSl9OiR7ZGVjb2RlVVJJQ29tcG9uZW50KHBhc3N3b3JkKX1gKS50b1N0cmluZygnYmFzZTY0Jyl9YFxuICAgIH1cblxuICAgIGNvbnN0IGNvbm5lY3QgPSBidWlsZENvbm5lY3Rvcih7IC4uLm9wdHMucHJveHlUbHMgfSlcbiAgICB0aGlzW2tDb25uZWN0RW5kcG9pbnRdID0gYnVpbGRDb25uZWN0b3IoeyAuLi5vcHRzLnJlcXVlc3RUbHMgfSlcblxuICAgIGNvbnN0IGFnZW50RmFjdG9yeSA9IG9wdHMuZmFjdG9yeSB8fCBkZWZhdWx0QWdlbnRGYWN0b3J5XG4gICAgY29uc3QgZmFjdG9yeSA9IChvcmlnaW4sIG9wdGlvbnMpID0+IHtcbiAgICAgIGNvbnN0IHsgcHJvdG9jb2wgfSA9IG5ldyBVUkwob3JpZ2luKVxuICAgICAgaWYgKCF0aGlzW2tUdW5uZWxQcm94eV0gJiYgcHJvdG9jb2wgPT09ICdodHRwOicgJiYgdGhpc1trUHJveHldLnByb3RvY29sID09PSAnaHR0cDonKSB7XG4gICAgICAgIHJldHVybiBuZXcgSHR0cDFQcm94eVdyYXBwZXIodGhpc1trUHJveHldLnVyaSwge1xuICAgICAgICAgIGhlYWRlcnM6IHRoaXNba1Byb3h5SGVhZGVyc10sXG4gICAgICAgICAgY29ubmVjdCxcbiAgICAgICAgICBmYWN0b3J5OiBhZ2VudEZhY3RvcnlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBhZ2VudEZhY3Rvcnkob3JpZ2luLCBvcHRpb25zKVxuICAgIH1cbiAgICB0aGlzW2tDbGllbnRdID0gY2xpZW50RmFjdG9yeSh1cmwsIHsgY29ubmVjdCB9KVxuICAgIHRoaXNba0FnZW50XSA9IG5ldyBBZ2VudCh7XG4gICAgICAuLi5vcHRzLFxuICAgICAgZmFjdG9yeSxcbiAgICAgIGNvbm5lY3Q6IGFzeW5jIChvcHRzLCBjYWxsYmFjaykgPT4ge1xuICAgICAgICBsZXQgcmVxdWVzdGVkUGF0aCA9IG9wdHMuaG9zdFxuICAgICAgICBpZiAoIW9wdHMucG9ydCkge1xuICAgICAgICAgIHJlcXVlc3RlZFBhdGggKz0gYDoke2RlZmF1bHRQcm90b2NvbFBvcnQob3B0cy5wcm90b2NvbCl9YFxuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBzb2NrZXQsIHN0YXR1c0NvZGUgfSA9IGF3YWl0IHRoaXNba0NsaWVudF0uY29ubmVjdCh7XG4gICAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgICBwb3J0LFxuICAgICAgICAgICAgcGF0aDogcmVxdWVzdGVkUGF0aCxcbiAgICAgICAgICAgIHNpZ25hbDogb3B0cy5zaWduYWwsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgIC4uLnRoaXNba1Byb3h5SGVhZGVyc10sXG4gICAgICAgICAgICAgIGhvc3Q6IG9wdHMuaG9zdFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlcnZlcm5hbWU6IHRoaXNba1Byb3h5VGxzXT8uc2VydmVybmFtZSB8fCBwcm94eUhvc3RuYW1lXG4gICAgICAgICAgfSlcbiAgICAgICAgICBpZiAoc3RhdHVzQ29kZSAhPT0gMjAwKSB7XG4gICAgICAgICAgICBzb2NrZXQub24oJ2Vycm9yJywgbm9vcCkuZGVzdHJveSgpXG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcihgUHJveHkgcmVzcG9uc2UgKCR7c3RhdHVzQ29kZX0pICE9PSAyMDAgd2hlbiBIVFRQIFR1bm5lbGluZ2ApKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAob3B0cy5wcm90b2NvbCAhPT0gJ2h0dHBzOicpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHNvY2tldClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgc2VydmVybmFtZVxuICAgICAgICAgIGlmICh0aGlzW2tSZXF1ZXN0VGxzXSkge1xuICAgICAgICAgICAgc2VydmVybmFtZSA9IHRoaXNba1JlcXVlc3RUbHNdLnNlcnZlcm5hbWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VydmVybmFtZSA9IG9wdHMuc2VydmVybmFtZVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzW2tDb25uZWN0RW5kcG9pbnRdKHsgLi4ub3B0cywgc2VydmVybmFtZSwgaHR0cFNvY2tldDogc29ja2V0IH0sIGNhbGxiYWNrKVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoZXJyLmNvZGUgPT09ICdFUlJfVExTX0NFUlRfQUxUTkFNRV9JTlZBTElEJykge1xuICAgICAgICAgICAgLy8gVGhyb3cgYSBjdXN0b20gZXJyb3IgdG8gYXZvaWQgbG9vcCBpbiBjbGllbnQuanMjY29ubmVjdFxuICAgICAgICAgICAgY2FsbGJhY2sobmV3IFNlY3VyZVByb3h5Q29ubmVjdGlvbkVycm9yKGVycikpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVycilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZGlzcGF0Y2ggKG9wdHMsIGhhbmRsZXIpIHtcbiAgICBjb25zdCBoZWFkZXJzID0gYnVpbGRIZWFkZXJzKG9wdHMuaGVhZGVycylcbiAgICB0aHJvd0lmUHJveHlBdXRoSXNTZW50KGhlYWRlcnMpXG5cbiAgICBpZiAoaGVhZGVycyAmJiAhKCdob3N0JyBpbiBoZWFkZXJzKSAmJiAhKCdIb3N0JyBpbiBoZWFkZXJzKSkge1xuICAgICAgY29uc3QgeyBob3N0IH0gPSBuZXcgVVJMKG9wdHMub3JpZ2luKVxuICAgICAgaGVhZGVycy5ob3N0ID0gaG9zdFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzW2tBZ2VudF0uZGlzcGF0Y2goXG4gICAgICB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIGhlYWRlcnNcbiAgICAgIH0sXG4gICAgICBoYW5kbGVyXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KCcuLi90eXBlcy9wcm94eS1hZ2VudCcpLlByb3h5QWdlbnQuT3B0aW9ucyB8IHN0cmluZyB8IFVSTH0gb3B0c1xuICAgKiBAcmV0dXJucyB7VVJMfVxuICAgKi9cbiAgI2dldFVybCAob3B0cykge1xuICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBuZXcgVVJMKG9wdHMpXG4gICAgfSBlbHNlIGlmIChvcHRzIGluc3RhbmNlb2YgVVJMKSB7XG4gICAgICByZXR1cm4gb3B0c1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IFVSTChvcHRzLnVyaSlcbiAgICB9XG4gIH1cblxuICBhc3luYyBba0Nsb3NlXSAoKSB7XG4gICAgYXdhaXQgdGhpc1trQWdlbnRdLmNsb3NlKClcbiAgICBhd2FpdCB0aGlzW2tDbGllbnRdLmNsb3NlKClcbiAgfVxuXG4gIGFzeW5jIFtrRGVzdHJveV0gKCkge1xuICAgIGF3YWl0IHRoaXNba0FnZW50XS5kZXN0cm95KClcbiAgICBhd2FpdCB0aGlzW2tDbGllbnRdLmRlc3Ryb3koKVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz59IGhlYWRlcnNcbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fVxuICovXG5mdW5jdGlvbiBidWlsZEhlYWRlcnMgKGhlYWRlcnMpIHtcbiAgLy8gV2hlbiB1c2luZyB1bmRpY2kuZmV0Y2gsIHRoZSBoZWFkZXJzIGxpc3QgaXMgc3RvcmVkXG4gIC8vIGFzIGFuIGFycmF5LlxuICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgICBjb25zdCBoZWFkZXJzUGFpciA9IHt9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIGhlYWRlcnNQYWlyW2hlYWRlcnNbaV1dID0gaGVhZGVyc1tpICsgMV1cbiAgICB9XG5cbiAgICByZXR1cm4gaGVhZGVyc1BhaXJcbiAgfVxuXG4gIHJldHVybiBoZWFkZXJzXG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBoZWFkZXJzXG4gKlxuICogUHJldmlvdXMgdmVyc2lvbnMgb2YgUHJveHlBZ2VudCBzdWdnZXN0cyB0aGUgUHJveHktQXV0aG9yaXphdGlvbiBpbiByZXF1ZXN0IGhlYWRlcnNcbiAqIE5ldmVydGhlbGVzcywgaXQgd2FzIGNoYW5nZWQgYW5kIHRvIGF2b2lkIGEgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSBieSBlbmQgdXNlcnNcbiAqIHRoaXMgY2hlY2sgd2FzIGNyZWF0ZWQuXG4gKiBJdCBzaG91bGQgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIGZvciBwZXJmb3JtYW5jZSByZWFzb25zXG4gKi9cbmZ1bmN0aW9uIHRocm93SWZQcm94eUF1dGhJc1NlbnQgKGhlYWRlcnMpIHtcbiAgY29uc3QgZXhpc3RQcm94eUF1dGggPSBoZWFkZXJzICYmIE9iamVjdC5rZXlzKGhlYWRlcnMpXG4gICAgLmZpbmQoKGtleSkgPT4ga2V5LnRvTG93ZXJDYXNlKCkgPT09ICdwcm94eS1hdXRob3JpemF0aW9uJylcbiAgaWYgKGV4aXN0UHJveHlBdXRoKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdQcm94eS1BdXRob3JpemF0aW9uIHNob3VsZCBiZSBzZW50IGluIFByb3h5QWdlbnQgY29uc3RydWN0b3InKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUHJveHlBZ2VudFxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IERpc3BhdGNoZXJCYXNlID0gcmVxdWlyZSgnLi9kaXNwYXRjaGVyLWJhc2UnKVxuY29uc3QgeyBrQ2xvc2UsIGtEZXN0cm95LCBrQ2xvc2VkLCBrRGVzdHJveWVkLCBrRGlzcGF0Y2gsIGtOb1Byb3h5QWdlbnQsIGtIdHRwUHJveHlBZ2VudCwga0h0dHBzUHJveHlBZ2VudCB9ID0gcmVxdWlyZSgnLi4vY29yZS9zeW1ib2xzJylcbmNvbnN0IFByb3h5QWdlbnQgPSByZXF1aXJlKCcuL3Byb3h5LWFnZW50JylcbmNvbnN0IEFnZW50ID0gcmVxdWlyZSgnLi9hZ2VudCcpXG5cbmNvbnN0IERFRkFVTFRfUE9SVFMgPSB7XG4gICdodHRwOic6IDgwLFxuICAnaHR0cHM6JzogNDQzXG59XG5cbmxldCBleHBlcmltZW50YWxXYXJuZWQgPSBmYWxzZVxuXG5jbGFzcyBFbnZIdHRwUHJveHlBZ2VudCBleHRlbmRzIERpc3BhdGNoZXJCYXNlIHtcbiAgI25vUHJveHlWYWx1ZSA9IG51bGxcbiAgI25vUHJveHlFbnRyaWVzID0gbnVsbFxuICAjb3B0cyA9IG51bGxcblxuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9KSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuI29wdHMgPSBvcHRzXG5cbiAgICBpZiAoIWV4cGVyaW1lbnRhbFdhcm5lZCkge1xuICAgICAgZXhwZXJpbWVudGFsV2FybmVkID0gdHJ1ZVxuICAgICAgcHJvY2Vzcy5lbWl0V2FybmluZygnRW52SHR0cFByb3h5QWdlbnQgaXMgZXhwZXJpbWVudGFsLCBleHBlY3QgdGhlbSB0byBjaGFuZ2UgYXQgYW55IHRpbWUuJywge1xuICAgICAgICBjb2RlOiAnVU5ESUNJLUVIUEEnXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IHsgaHR0cFByb3h5LCBodHRwc1Byb3h5LCBub1Byb3h5LCAuLi5hZ2VudE9wdHMgfSA9IG9wdHNcblxuICAgIHRoaXNba05vUHJveHlBZ2VudF0gPSBuZXcgQWdlbnQoYWdlbnRPcHRzKVxuXG4gICAgY29uc3QgSFRUUF9QUk9YWSA9IGh0dHBQcm94eSA/PyBwcm9jZXNzLmVudi5odHRwX3Byb3h5ID8/IHByb2Nlc3MuZW52LkhUVFBfUFJPWFlcbiAgICBpZiAoSFRUUF9QUk9YWSkge1xuICAgICAgdGhpc1trSHR0cFByb3h5QWdlbnRdID0gbmV3IFByb3h5QWdlbnQoeyAuLi5hZ2VudE9wdHMsIHVyaTogSFRUUF9QUk9YWSB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzW2tIdHRwUHJveHlBZ2VudF0gPSB0aGlzW2tOb1Byb3h5QWdlbnRdXG4gICAgfVxuXG4gICAgY29uc3QgSFRUUFNfUFJPWFkgPSBodHRwc1Byb3h5ID8/IHByb2Nlc3MuZW52Lmh0dHBzX3Byb3h5ID8/IHByb2Nlc3MuZW52LkhUVFBTX1BST1hZXG4gICAgaWYgKEhUVFBTX1BST1hZKSB7XG4gICAgICB0aGlzW2tIdHRwc1Byb3h5QWdlbnRdID0gbmV3IFByb3h5QWdlbnQoeyAuLi5hZ2VudE9wdHMsIHVyaTogSFRUUFNfUFJPWFkgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1trSHR0cHNQcm94eUFnZW50XSA9IHRoaXNba0h0dHBQcm94eUFnZW50XVxuICAgIH1cblxuICAgIHRoaXMuI3BhcnNlTm9Qcm94eSgpXG4gIH1cblxuICBba0Rpc3BhdGNoXSAob3B0cywgaGFuZGxlcikge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwob3B0cy5vcmlnaW4pXG4gICAgY29uc3QgYWdlbnQgPSB0aGlzLiNnZXRQcm94eUFnZW50Rm9yVXJsKHVybClcbiAgICByZXR1cm4gYWdlbnQuZGlzcGF0Y2gob3B0cywgaGFuZGxlcilcbiAgfVxuXG4gIGFzeW5jIFtrQ2xvc2VdICgpIHtcbiAgICBhd2FpdCB0aGlzW2tOb1Byb3h5QWdlbnRdLmNsb3NlKClcbiAgICBpZiAoIXRoaXNba0h0dHBQcm94eUFnZW50XVtrQ2xvc2VkXSkge1xuICAgICAgYXdhaXQgdGhpc1trSHR0cFByb3h5QWdlbnRdLmNsb3NlKClcbiAgICB9XG4gICAgaWYgKCF0aGlzW2tIdHRwc1Byb3h5QWdlbnRdW2tDbG9zZWRdKSB7XG4gICAgICBhd2FpdCB0aGlzW2tIdHRwc1Byb3h5QWdlbnRdLmNsb3NlKClcbiAgICB9XG4gIH1cblxuICBhc3luYyBba0Rlc3Ryb3ldIChlcnIpIHtcbiAgICBhd2FpdCB0aGlzW2tOb1Byb3h5QWdlbnRdLmRlc3Ryb3koZXJyKVxuICAgIGlmICghdGhpc1trSHR0cFByb3h5QWdlbnRdW2tEZXN0cm95ZWRdKSB7XG4gICAgICBhd2FpdCB0aGlzW2tIdHRwUHJveHlBZ2VudF0uZGVzdHJveShlcnIpXG4gICAgfVxuICAgIGlmICghdGhpc1trSHR0cHNQcm94eUFnZW50XVtrRGVzdHJveWVkXSkge1xuICAgICAgYXdhaXQgdGhpc1trSHR0cHNQcm94eUFnZW50XS5kZXN0cm95KGVycilcbiAgICB9XG4gIH1cblxuICAjZ2V0UHJveHlBZ2VudEZvclVybCAodXJsKSB7XG4gICAgbGV0IHsgcHJvdG9jb2wsIGhvc3Q6IGhvc3RuYW1lLCBwb3J0IH0gPSB1cmxcblxuICAgIC8vIFN0cmlwcGluZyBwb3J0cyBpbiB0aGlzIHdheSBpbnN0ZWFkIG9mIHVzaW5nIHBhcnNlZFVybC5ob3N0bmFtZSB0byBtYWtlXG4gICAgLy8gc3VyZSB0aGF0IHRoZSBicmFja2V0cyBhcm91bmQgSVB2NiBhZGRyZXNzZXMgYXJlIGtlcHQuXG4gICAgaG9zdG5hbWUgPSBob3N0bmFtZS5yZXBsYWNlKC86XFxkKiQvLCAnJykudG9Mb3dlckNhc2UoKVxuICAgIHBvcnQgPSBOdW1iZXIucGFyc2VJbnQocG9ydCwgMTApIHx8IERFRkFVTFRfUE9SVFNbcHJvdG9jb2xdIHx8IDBcbiAgICBpZiAoIXRoaXMuI3Nob3VsZFByb3h5KGhvc3RuYW1lLCBwb3J0KSkge1xuICAgICAgcmV0dXJuIHRoaXNba05vUHJveHlBZ2VudF1cbiAgICB9XG4gICAgaWYgKHByb3RvY29sID09PSAnaHR0cHM6Jykge1xuICAgICAgcmV0dXJuIHRoaXNba0h0dHBzUHJveHlBZ2VudF1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXNba0h0dHBQcm94eUFnZW50XVxuICB9XG5cbiAgI3Nob3VsZFByb3h5IChob3N0bmFtZSwgcG9ydCkge1xuICAgIGlmICh0aGlzLiNub1Byb3h5Q2hhbmdlZCkge1xuICAgICAgdGhpcy4jcGFyc2VOb1Byb3h5KClcbiAgICB9XG5cbiAgICBpZiAodGhpcy4jbm9Qcm94eUVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZSAvLyBBbHdheXMgcHJveHkgaWYgTk9fUFJPWFkgaXMgbm90IHNldCBvciBlbXB0eS5cbiAgICB9XG4gICAgaWYgKHRoaXMuI25vUHJveHlWYWx1ZSA9PT0gJyonKSB7XG4gICAgICByZXR1cm4gZmFsc2UgLy8gTmV2ZXIgcHJveHkgaWYgd2lsZGNhcmQgaXMgc2V0LlxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy4jbm9Qcm94eUVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy4jbm9Qcm94eUVudHJpZXNbaV1cbiAgICAgIGlmIChlbnRyeS5wb3J0ICYmIGVudHJ5LnBvcnQgIT09IHBvcnQpIHtcbiAgICAgICAgY29udGludWUgLy8gU2tpcCBpZiBwb3J0cyBkb24ndCBtYXRjaC5cbiAgICAgIH1cbiAgICAgIGlmICghL15bLipdLy50ZXN0KGVudHJ5Lmhvc3RuYW1lKSkge1xuICAgICAgICAvLyBObyB3aWxkY2FyZHMsIHNvIGRvbid0IHByb3h5IG9ubHkgaWYgdGhlcmUgaXMgbm90IGFuIGV4YWN0IG1hdGNoLlxuICAgICAgICBpZiAoaG9zdG5hbWUgPT09IGVudHJ5Lmhvc3RuYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERvbid0IHByb3h5IGlmIHRoZSBob3N0bmFtZSBlbmRzIHdpdGggdGhlIG5vX3Byb3h5IGhvc3QuXG4gICAgICAgIGlmIChob3N0bmFtZS5lbmRzV2l0aChlbnRyeS5ob3N0bmFtZS5yZXBsYWNlKC9eXFwqLywgJycpKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gICNwYXJzZU5vUHJveHkgKCkge1xuICAgIGNvbnN0IG5vUHJveHlWYWx1ZSA9IHRoaXMuI29wdHMubm9Qcm94eSA/PyB0aGlzLiNub1Byb3h5RW52XG4gICAgY29uc3Qgbm9Qcm94eVNwbGl0ID0gbm9Qcm94eVZhbHVlLnNwbGl0KC9bLFxcc10vKVxuICAgIGNvbnN0IG5vUHJveHlFbnRyaWVzID0gW11cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9Qcm94eVNwbGl0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbnRyeSA9IG5vUHJveHlTcGxpdFtpXVxuICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgY29uc3QgcGFyc2VkID0gZW50cnkubWF0Y2goL14oLispOihcXGQrKSQvKVxuICAgICAgbm9Qcm94eUVudHJpZXMucHVzaCh7XG4gICAgICAgIGhvc3RuYW1lOiAocGFyc2VkID8gcGFyc2VkWzFdIDogZW50cnkpLnRvTG93ZXJDYXNlKCksXG4gICAgICAgIHBvcnQ6IHBhcnNlZCA/IE51bWJlci5wYXJzZUludChwYXJzZWRbMl0sIDEwKSA6IDBcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy4jbm9Qcm94eVZhbHVlID0gbm9Qcm94eVZhbHVlXG4gICAgdGhpcy4jbm9Qcm94eUVudHJpZXMgPSBub1Byb3h5RW50cmllc1xuICB9XG5cbiAgZ2V0ICNub1Byb3h5Q2hhbmdlZCAoKSB7XG4gICAgaWYgKHRoaXMuI29wdHMubm9Qcm94eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuI25vUHJveHlWYWx1ZSAhPT0gdGhpcy4jbm9Qcm94eUVudlxuICB9XG5cbiAgZ2V0ICNub1Byb3h5RW52ICgpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYubm9fcHJveHkgPz8gcHJvY2Vzcy5lbnYuTk9fUFJPWFkgPz8gJydcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEVudkh0dHBQcm94eUFnZW50XG4iLCIndXNlIHN0cmljdCdcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ25vZGU6YXNzZXJ0JylcblxuY29uc3QgeyBrUmV0cnlIYW5kbGVyRGVmYXVsdFJldHJ5IH0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuY29uc3QgeyBSZXF1ZXN0UmV0cnlFcnJvciB9ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMnKVxuY29uc3Qge1xuICBpc0Rpc3R1cmJlZCxcbiAgcGFyc2VIZWFkZXJzLFxuICBwYXJzZVJhbmdlSGVhZGVyLFxuICB3cmFwUmVxdWVzdEJvZHlcbn0gPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVSZXRyeUFmdGVySGVhZGVyIChyZXRyeUFmdGVyKSB7XG4gIGNvbnN0IGN1cnJlbnQgPSBEYXRlLm5vdygpXG4gIHJldHVybiBuZXcgRGF0ZShyZXRyeUFmdGVyKS5nZXRUaW1lKCkgLSBjdXJyZW50XG59XG5cbmNsYXNzIFJldHJ5SGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yIChvcHRzLCBoYW5kbGVycykge1xuICAgIGNvbnN0IHsgcmV0cnlPcHRpb25zLCAuLi5kaXNwYXRjaE9wdHMgfSA9IG9wdHNcbiAgICBjb25zdCB7XG4gICAgICAvLyBSZXRyeSBzY29wZWRcbiAgICAgIHJldHJ5OiByZXRyeUZuLFxuICAgICAgbWF4UmV0cmllcyxcbiAgICAgIG1heFRpbWVvdXQsXG4gICAgICBtaW5UaW1lb3V0LFxuICAgICAgdGltZW91dEZhY3RvcixcbiAgICAgIC8vIFJlc3BvbnNlIHNjb3BlZFxuICAgICAgbWV0aG9kcyxcbiAgICAgIGVycm9yQ29kZXMsXG4gICAgICByZXRyeUFmdGVyLFxuICAgICAgc3RhdHVzQ29kZXNcbiAgICB9ID0gcmV0cnlPcHRpb25zID8/IHt9XG5cbiAgICB0aGlzLmRpc3BhdGNoID0gaGFuZGxlcnMuZGlzcGF0Y2hcbiAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVycy5oYW5kbGVyXG4gICAgdGhpcy5vcHRzID0geyAuLi5kaXNwYXRjaE9wdHMsIGJvZHk6IHdyYXBSZXF1ZXN0Qm9keShvcHRzLmJvZHkpIH1cbiAgICB0aGlzLmFib3J0ID0gbnVsbFxuICAgIHRoaXMuYWJvcnRlZCA9IGZhbHNlXG4gICAgdGhpcy5yZXRyeU9wdHMgPSB7XG4gICAgICByZXRyeTogcmV0cnlGbiA/PyBSZXRyeUhhbmRsZXJba1JldHJ5SGFuZGxlckRlZmF1bHRSZXRyeV0sXG4gICAgICByZXRyeUFmdGVyOiByZXRyeUFmdGVyID8/IHRydWUsXG4gICAgICBtYXhUaW1lb3V0OiBtYXhUaW1lb3V0ID8/IDMwICogMTAwMCwgLy8gMzBzLFxuICAgICAgbWluVGltZW91dDogbWluVGltZW91dCA/PyA1MDAsIC8vIC41c1xuICAgICAgdGltZW91dEZhY3RvcjogdGltZW91dEZhY3RvciA/PyAyLFxuICAgICAgbWF4UmV0cmllczogbWF4UmV0cmllcyA/PyA1LFxuICAgICAgLy8gV2hhdCBlcnJvcnMgd2Ugc2hvdWxkIHJldHJ5XG4gICAgICBtZXRob2RzOiBtZXRob2RzID8/IFsnR0VUJywgJ0hFQUQnLCAnT1BUSU9OUycsICdQVVQnLCAnREVMRVRFJywgJ1RSQUNFJ10sXG4gICAgICAvLyBJbmRpY2F0ZXMgd2hpY2ggZXJyb3JzIHRvIHJldHJ5XG4gICAgICBzdGF0dXNDb2Rlczogc3RhdHVzQ29kZXMgPz8gWzUwMCwgNTAyLCA1MDMsIDUwNCwgNDI5XSxcbiAgICAgIC8vIExpc3Qgb2YgZXJyb3JzIHRvIHJldHJ5XG4gICAgICBlcnJvckNvZGVzOiBlcnJvckNvZGVzID8/IFtcbiAgICAgICAgJ0VDT05OUkVTRVQnLFxuICAgICAgICAnRUNPTk5SRUZVU0VEJyxcbiAgICAgICAgJ0VOT1RGT1VORCcsXG4gICAgICAgICdFTkVURE9XTicsXG4gICAgICAgICdFTkVUVU5SRUFDSCcsXG4gICAgICAgICdFSE9TVERPV04nLFxuICAgICAgICAnRUhPU1RVTlJFQUNIJyxcbiAgICAgICAgJ0VQSVBFJyxcbiAgICAgICAgJ1VORF9FUlJfU09DS0VUJ1xuICAgICAgXVxuICAgIH1cblxuICAgIHRoaXMucmV0cnlDb3VudCA9IDBcbiAgICB0aGlzLnJldHJ5Q291bnRDaGVja3BvaW50ID0gMFxuICAgIHRoaXMuc3RhcnQgPSAwXG4gICAgdGhpcy5lbmQgPSBudWxsXG4gICAgdGhpcy5ldGFnID0gbnVsbFxuICAgIHRoaXMucmVzdW1lID0gbnVsbFxuXG4gICAgLy8gSGFuZGxlIHBvc3NpYmxlIG9uQ29ubmVjdCBkdXBsaWNhdGlvblxuICAgIHRoaXMuaGFuZGxlci5vbkNvbm5lY3QocmVhc29uID0+IHtcbiAgICAgIHRoaXMuYWJvcnRlZCA9IHRydWVcbiAgICAgIGlmICh0aGlzLmFib3J0KSB7XG4gICAgICAgIHRoaXMuYWJvcnQocmVhc29uKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZWFzb24gPSByZWFzb25cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgb25SZXF1ZXN0U2VudCAoKSB7XG4gICAgaWYgKHRoaXMuaGFuZGxlci5vblJlcXVlc3RTZW50KSB7XG4gICAgICB0aGlzLmhhbmRsZXIub25SZXF1ZXN0U2VudCgpXG4gICAgfVxuICB9XG5cbiAgb25VcGdyYWRlIChzdGF0dXNDb2RlLCBoZWFkZXJzLCBzb2NrZXQpIHtcbiAgICBpZiAodGhpcy5oYW5kbGVyLm9uVXBncmFkZSkge1xuICAgICAgdGhpcy5oYW5kbGVyLm9uVXBncmFkZShzdGF0dXNDb2RlLCBoZWFkZXJzLCBzb2NrZXQpXG4gICAgfVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCkge1xuICAgIGlmICh0aGlzLmFib3J0ZWQpIHtcbiAgICAgIGFib3J0KHRoaXMucmVhc29uKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFib3J0ID0gYWJvcnRcbiAgICB9XG4gIH1cblxuICBvbkJvZHlTZW50IChjaHVuaykge1xuICAgIGlmICh0aGlzLmhhbmRsZXIub25Cb2R5U2VudCkgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkJvZHlTZW50KGNodW5rKVxuICB9XG5cbiAgc3RhdGljIFtrUmV0cnlIYW5kbGVyRGVmYXVsdFJldHJ5XSAoZXJyLCB7IHN0YXRlLCBvcHRzIH0sIGNiKSB7XG4gICAgY29uc3QgeyBzdGF0dXNDb2RlLCBjb2RlLCBoZWFkZXJzIH0gPSBlcnJcbiAgICBjb25zdCB7IG1ldGhvZCwgcmV0cnlPcHRpb25zIH0gPSBvcHRzXG4gICAgY29uc3Qge1xuICAgICAgbWF4UmV0cmllcyxcbiAgICAgIG1pblRpbWVvdXQsXG4gICAgICBtYXhUaW1lb3V0LFxuICAgICAgdGltZW91dEZhY3RvcixcbiAgICAgIHN0YXR1c0NvZGVzLFxuICAgICAgZXJyb3JDb2RlcyxcbiAgICAgIG1ldGhvZHNcbiAgICB9ID0gcmV0cnlPcHRpb25zXG4gICAgY29uc3QgeyBjb3VudGVyIH0gPSBzdGF0ZVxuXG4gICAgLy8gQW55IGNvZGUgdGhhdCBpcyBub3QgYSBVbmRpY2kncyBvcmlnaW5hdGVkIGFuZCBhbGxvd2VkIHRvIHJldHJ5XG4gICAgaWYgKGNvZGUgJiYgY29kZSAhPT0gJ1VORF9FUlJfUkVRX1JFVFJZJyAmJiAhZXJyb3JDb2Rlcy5pbmNsdWRlcyhjb2RlKSkge1xuICAgICAgY2IoZXJyKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gSWYgYSBzZXQgb2YgbWV0aG9kIGFyZSBwcm92aWRlZCBhbmQgdGhlIGN1cnJlbnQgbWV0aG9kIGlzIG5vdCBpbiB0aGUgbGlzdFxuICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGhvZHMpICYmICFtZXRob2RzLmluY2x1ZGVzKG1ldGhvZCkpIHtcbiAgICAgIGNiKGVycilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIElmIGEgc2V0IG9mIHN0YXR1cyBjb2RlIGFyZSBwcm92aWRlZCBhbmQgdGhlIGN1cnJlbnQgc3RhdHVzIGNvZGUgaXMgbm90IGluIHRoZSBsaXN0XG4gICAgaWYgKFxuICAgICAgc3RhdHVzQ29kZSAhPSBudWxsICYmXG4gICAgICBBcnJheS5pc0FycmF5KHN0YXR1c0NvZGVzKSAmJlxuICAgICAgIXN0YXR1c0NvZGVzLmluY2x1ZGVzKHN0YXR1c0NvZGUpXG4gICAgKSB7XG4gICAgICBjYihlcnIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBJZiB3ZSByZWFjaGVkIHRoZSBtYXggbnVtYmVyIG9mIHJldHJpZXNcbiAgICBpZiAoY291bnRlciA+IG1heFJldHJpZXMpIHtcbiAgICAgIGNiKGVycilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxldCByZXRyeUFmdGVySGVhZGVyID0gaGVhZGVycz8uWydyZXRyeS1hZnRlciddXG4gICAgaWYgKHJldHJ5QWZ0ZXJIZWFkZXIpIHtcbiAgICAgIHJldHJ5QWZ0ZXJIZWFkZXIgPSBOdW1iZXIocmV0cnlBZnRlckhlYWRlcilcbiAgICAgIHJldHJ5QWZ0ZXJIZWFkZXIgPSBOdW1iZXIuaXNOYU4ocmV0cnlBZnRlckhlYWRlcilcbiAgICAgICAgPyBjYWxjdWxhdGVSZXRyeUFmdGVySGVhZGVyKHJldHJ5QWZ0ZXJIZWFkZXIpXG4gICAgICAgIDogcmV0cnlBZnRlckhlYWRlciAqIDFlMyAvLyBSZXRyeS1BZnRlciBpcyBpbiBzZWNvbmRzXG4gICAgfVxuXG4gICAgY29uc3QgcmV0cnlUaW1lb3V0ID1cbiAgICAgIHJldHJ5QWZ0ZXJIZWFkZXIgPiAwXG4gICAgICAgID8gTWF0aC5taW4ocmV0cnlBZnRlckhlYWRlciwgbWF4VGltZW91dClcbiAgICAgICAgOiBNYXRoLm1pbihtaW5UaW1lb3V0ICogdGltZW91dEZhY3RvciAqKiAoY291bnRlciAtIDEpLCBtYXhUaW1lb3V0KVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiBjYihudWxsKSwgcmV0cnlUaW1lb3V0KVxuICB9XG5cbiAgb25IZWFkZXJzIChzdGF0dXNDb2RlLCByYXdIZWFkZXJzLCByZXN1bWUsIHN0YXR1c01lc3NhZ2UpIHtcbiAgICBjb25zdCBoZWFkZXJzID0gcGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpXG5cbiAgICB0aGlzLnJldHJ5Q291bnQgKz0gMVxuXG4gICAgaWYgKHN0YXR1c0NvZGUgPj0gMzAwKSB7XG4gICAgICBpZiAodGhpcy5yZXRyeU9wdHMuc3RhdHVzQ29kZXMuaW5jbHVkZXMoc3RhdHVzQ29kZSkgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXIub25IZWFkZXJzKFxuICAgICAgICAgIHN0YXR1c0NvZGUsXG4gICAgICAgICAgcmF3SGVhZGVycyxcbiAgICAgICAgICByZXN1bWUsXG4gICAgICAgICAgc3RhdHVzTWVzc2FnZVxuICAgICAgICApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFib3J0KFxuICAgICAgICAgIG5ldyBSZXF1ZXN0UmV0cnlFcnJvcignUmVxdWVzdCBmYWlsZWQnLCBzdGF0dXNDb2RlLCB7XG4gICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICBjb3VudDogdGhpcy5yZXRyeUNvdW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVja3BvaW50IGZvciByZXN1bWUgZnJvbSB3aGVyZSB3ZSBsZWZ0IGl0XG4gICAgaWYgKHRoaXMucmVzdW1lICE9IG51bGwpIHtcbiAgICAgIHRoaXMucmVzdW1lID0gbnVsbFxuXG4gICAgICAvLyBPbmx5IFBhcnRpYWwgQ29udGVudCAyMDYgc3VwcG9zZWQgdG8gcHJvdmlkZSBDb250ZW50LVJhbmdlLFxuICAgICAgLy8gYW55IG90aGVyIHN0YXR1cyBjb2RlIHRoYXQgcGFydGlhbGx5IGNvbnN1bWVkIHRoZSBwYXlsb2FkXG4gICAgICAvLyBzaG91bGQgbm90IGJlIHJldHJ5IGJlY2F1c2UgaXQgd291bGQgcmVzdWx0IGluIGRvd25zdHJlYW1cbiAgICAgIC8vIHdyb25nbHkgY29uY2F0YW5ldGUgbXVsdGlwbGUgcmVzcG9uc2VzLlxuICAgICAgaWYgKHN0YXR1c0NvZGUgIT09IDIwNiAmJiAodGhpcy5zdGFydCA+IDAgfHwgc3RhdHVzQ29kZSAhPT0gMjAwKSkge1xuICAgICAgICB0aGlzLmFib3J0KFxuICAgICAgICAgIG5ldyBSZXF1ZXN0UmV0cnlFcnJvcignc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHJhbmdlIGhlYWRlciBhbmQgdGhlIHBheWxvYWQgd2FzIHBhcnRpYWxseSBjb25zdW1lZCcsIHN0YXR1c0NvZGUsIHtcbiAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICBkYXRhOiB7IGNvdW50OiB0aGlzLnJldHJ5Q291bnQgfVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbnRlbnRSYW5nZSA9IHBhcnNlUmFuZ2VIZWFkZXIoaGVhZGVyc1snY29udGVudC1yYW5nZSddKVxuICAgICAgLy8gSWYgbm8gY29udGVudCByYW5nZVxuICAgICAgaWYgKCFjb250ZW50UmFuZ2UpIHtcbiAgICAgICAgdGhpcy5hYm9ydChcbiAgICAgICAgICBuZXcgUmVxdWVzdFJldHJ5RXJyb3IoJ0NvbnRlbnQtUmFuZ2UgbWlzbWF0Y2gnLCBzdGF0dXNDb2RlLCB7XG4gICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgZGF0YTogeyBjb3VudDogdGhpcy5yZXRyeUNvdW50IH1cbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICAvLyBMZXQncyBzdGFydCB3aXRoIGEgd2VhayBldGFnIGNoZWNrXG4gICAgICBpZiAodGhpcy5ldGFnICE9IG51bGwgJiYgdGhpcy5ldGFnICE9PSBoZWFkZXJzLmV0YWcpIHtcbiAgICAgICAgdGhpcy5hYm9ydChcbiAgICAgICAgICBuZXcgUmVxdWVzdFJldHJ5RXJyb3IoJ0VUYWcgbWlzbWF0Y2gnLCBzdGF0dXNDb2RlLCB7XG4gICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgZGF0YTogeyBjb3VudDogdGhpcy5yZXRyeUNvdW50IH1cbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHN0YXJ0LCBzaXplLCBlbmQgPSBzaXplIC0gMSB9ID0gY29udGVudFJhbmdlXG5cbiAgICAgIGFzc2VydCh0aGlzLnN0YXJ0ID09PSBzdGFydCwgJ2NvbnRlbnQtcmFuZ2UgbWlzbWF0Y2gnKVxuICAgICAgYXNzZXJ0KHRoaXMuZW5kID09IG51bGwgfHwgdGhpcy5lbmQgPT09IGVuZCwgJ2NvbnRlbnQtcmFuZ2UgbWlzbWF0Y2gnKVxuXG4gICAgICB0aGlzLnJlc3VtZSA9IHJlc3VtZVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAodGhpcy5lbmQgPT0gbnVsbCkge1xuICAgICAgaWYgKHN0YXR1c0NvZGUgPT09IDIwNikge1xuICAgICAgICAvLyBGaXJzdCB0aW1lIHdlIHJlY2VpdmUgMjA2XG4gICAgICAgIGNvbnN0IHJhbmdlID0gcGFyc2VSYW5nZUhlYWRlcihoZWFkZXJzWydjb250ZW50LXJhbmdlJ10pXG5cbiAgICAgICAgaWYgKHJhbmdlID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uSGVhZGVycyhcbiAgICAgICAgICAgIHN0YXR1c0NvZGUsXG4gICAgICAgICAgICByYXdIZWFkZXJzLFxuICAgICAgICAgICAgcmVzdW1lLFxuICAgICAgICAgICAgc3RhdHVzTWVzc2FnZVxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgc3RhcnQsIHNpemUsIGVuZCA9IHNpemUgLSAxIH0gPSByYW5nZVxuICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgc3RhcnQgIT0gbnVsbCAmJiBOdW1iZXIuaXNGaW5pdGUoc3RhcnQpLFxuICAgICAgICAgICdjb250ZW50LXJhbmdlIG1pc21hdGNoJ1xuICAgICAgICApXG4gICAgICAgIGFzc2VydChlbmQgIT0gbnVsbCAmJiBOdW1iZXIuaXNGaW5pdGUoZW5kKSwgJ2ludmFsaWQgY29udGVudC1sZW5ndGgnKVxuXG4gICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydFxuICAgICAgICB0aGlzLmVuZCA9IGVuZFxuICAgICAgfVxuXG4gICAgICAvLyBXZSBtYWtlIG91ciBiZXN0IHRvIGNoZWNrcG9pbnQgdGhlIGJvZHkgZm9yIGZ1cnRoZXIgcmFuZ2UgaGVhZGVyc1xuICAgICAgaWYgKHRoaXMuZW5kID09IG51bGwpIHtcbiAgICAgICAgY29uc3QgY29udGVudExlbmd0aCA9IGhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ11cbiAgICAgICAgdGhpcy5lbmQgPSBjb250ZW50TGVuZ3RoICE9IG51bGwgPyBOdW1iZXIoY29udGVudExlbmd0aCkgLSAxIDogbnVsbFxuICAgICAgfVxuXG4gICAgICBhc3NlcnQoTnVtYmVyLmlzRmluaXRlKHRoaXMuc3RhcnQpKVxuICAgICAgYXNzZXJ0KFxuICAgICAgICB0aGlzLmVuZCA9PSBudWxsIHx8IE51bWJlci5pc0Zpbml0ZSh0aGlzLmVuZCksXG4gICAgICAgICdpbnZhbGlkIGNvbnRlbnQtbGVuZ3RoJ1xuICAgICAgKVxuXG4gICAgICB0aGlzLnJlc3VtZSA9IHJlc3VtZVxuICAgICAgdGhpcy5ldGFnID0gaGVhZGVycy5ldGFnICE9IG51bGwgPyBoZWFkZXJzLmV0YWcgOiBudWxsXG5cbiAgICAgIC8vIFdlYWsgZXRhZ3MgYXJlIG5vdCB1c2VmdWwgZm9yIGNvbXBhcmlzb24gbm9yIGNhY2hlXG4gICAgICAvLyBmb3IgaW5zdGFuY2Ugbm90IHNhZmUgdG8gYXNzdW1lIGlmIHRoZSByZXNwb25zZSBpcyBieXRlLXBlci1ieXRlXG4gICAgICAvLyBlcXVhbFxuICAgICAgaWYgKHRoaXMuZXRhZyAhPSBudWxsICYmIHRoaXMuZXRhZy5zdGFydHNXaXRoKCdXLycpKSB7XG4gICAgICAgIHRoaXMuZXRhZyA9IG51bGxcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkhlYWRlcnMoXG4gICAgICAgIHN0YXR1c0NvZGUsXG4gICAgICAgIHJhd0hlYWRlcnMsXG4gICAgICAgIHJlc3VtZSxcbiAgICAgICAgc3RhdHVzTWVzc2FnZVxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IGVyciA9IG5ldyBSZXF1ZXN0UmV0cnlFcnJvcignUmVxdWVzdCBmYWlsZWQnLCBzdGF0dXNDb2RlLCB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgZGF0YTogeyBjb3VudDogdGhpcy5yZXRyeUNvdW50IH1cbiAgICB9KVxuXG4gICAgdGhpcy5hYm9ydChlcnIpXG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIG9uRGF0YSAoY2h1bmspIHtcbiAgICB0aGlzLnN0YXJ0ICs9IGNodW5rLmxlbmd0aFxuXG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkRhdGEoY2h1bmspXG4gIH1cblxuICBvbkNvbXBsZXRlIChyYXdUcmFpbGVycykge1xuICAgIHRoaXMucmV0cnlDb3VudCA9IDBcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uQ29tcGxldGUocmF3VHJhaWxlcnMpXG4gIH1cblxuICBvbkVycm9yIChlcnIpIHtcbiAgICBpZiAodGhpcy5hYm9ydGVkIHx8IGlzRGlzdHVyYmVkKHRoaXMub3B0cy5ib2R5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkVycm9yKGVycilcbiAgICB9XG5cbiAgICAvLyBXZSByZWNvbmNpbGUgaW4gY2FzZSBvZiBhIG1peCBiZXR3ZWVuIG5ldHdvcmsgZXJyb3JzXG4gICAgLy8gYW5kIHNlcnZlciBlcnJvciByZXNwb25zZVxuICAgIGlmICh0aGlzLnJldHJ5Q291bnQgLSB0aGlzLnJldHJ5Q291bnRDaGVja3BvaW50ID4gMCkge1xuICAgICAgLy8gV2UgY291bnQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbGFzdCBjaGVja3BvaW50IGFuZCB0aGUgY3VycmVudCByZXRyeSBjb3VudFxuICAgICAgdGhpcy5yZXRyeUNvdW50ID1cbiAgICAgICAgdGhpcy5yZXRyeUNvdW50Q2hlY2twb2ludCArXG4gICAgICAgICh0aGlzLnJldHJ5Q291bnQgLSB0aGlzLnJldHJ5Q291bnRDaGVja3BvaW50KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJldHJ5Q291bnQgKz0gMVxuICAgIH1cblxuICAgIHRoaXMucmV0cnlPcHRzLnJldHJ5KFxuICAgICAgZXJyLFxuICAgICAge1xuICAgICAgICBzdGF0ZTogeyBjb3VudGVyOiB0aGlzLnJldHJ5Q291bnQgfSxcbiAgICAgICAgb3B0czogeyByZXRyeU9wdGlvbnM6IHRoaXMucmV0cnlPcHRzLCAuLi50aGlzLm9wdHMgfVxuICAgICAgfSxcbiAgICAgIG9uUmV0cnkuYmluZCh0aGlzKVxuICAgIClcblxuICAgIGZ1bmN0aW9uIG9uUmV0cnkgKGVycikge1xuICAgICAgaWYgKGVyciAhPSBudWxsIHx8IHRoaXMuYWJvcnRlZCB8fCBpc0Rpc3R1cmJlZCh0aGlzLm9wdHMuYm9keSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkVycm9yKGVycilcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc3RhcnQgIT09IDApIHtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHsgcmFuZ2U6IGBieXRlcz0ke3RoaXMuc3RhcnR9LSR7dGhpcy5lbmQgPz8gJyd9YCB9XG5cbiAgICAgICAgLy8gV2VhayBldGFnIGNoZWNrIC0gd2VhayBldGFncyB3aWxsIG1ha2UgY29tcGFyaXNvbiBhbGdvcml0aG1zIG5ldmVyIG1hdGNoXG4gICAgICAgIGlmICh0aGlzLmV0YWcgIT0gbnVsbCkge1xuICAgICAgICAgIGhlYWRlcnNbJ2lmLW1hdGNoJ10gPSB0aGlzLmV0YWdcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3B0cyA9IHtcbiAgICAgICAgICAuLi50aGlzLm9wdHMsXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgLi4udGhpcy5vcHRzLmhlYWRlcnMsXG4gICAgICAgICAgICAuLi5oZWFkZXJzXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMucmV0cnlDb3VudENoZWNrcG9pbnQgPSB0aGlzLnJldHJ5Q291bnRcbiAgICAgICAgdGhpcy5kaXNwYXRjaCh0aGlzLm9wdHMsIHRoaXMpXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVyLm9uRXJyb3IoZXJyKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJldHJ5SGFuZGxlclxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IERpc3BhdGNoZXIgPSByZXF1aXJlKCcuL2Rpc3BhdGNoZXInKVxuY29uc3QgUmV0cnlIYW5kbGVyID0gcmVxdWlyZSgnLi4vaGFuZGxlci9yZXRyeS1oYW5kbGVyJylcblxuY2xhc3MgUmV0cnlBZ2VudCBleHRlbmRzIERpc3BhdGNoZXIge1xuICAjYWdlbnQgPSBudWxsXG4gICNvcHRpb25zID0gbnVsbFxuICBjb25zdHJ1Y3RvciAoYWdlbnQsIG9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKG9wdGlvbnMpXG4gICAgdGhpcy4jYWdlbnQgPSBhZ2VudFxuICAgIHRoaXMuI29wdGlvbnMgPSBvcHRpb25zXG4gIH1cblxuICBkaXNwYXRjaCAob3B0cywgaGFuZGxlcikge1xuICAgIGNvbnN0IHJldHJ5ID0gbmV3IFJldHJ5SGFuZGxlcih7XG4gICAgICAuLi5vcHRzLFxuICAgICAgcmV0cnlPcHRpb25zOiB0aGlzLiNvcHRpb25zXG4gICAgfSwge1xuICAgICAgZGlzcGF0Y2g6IHRoaXMuI2FnZW50LmRpc3BhdGNoLmJpbmQodGhpcy4jYWdlbnQpLFxuICAgICAgaGFuZGxlclxuICAgIH0pXG4gICAgcmV0dXJuIHRoaXMuI2FnZW50LmRpc3BhdGNoKG9wdHMsIHJldHJ5KVxuICB9XG5cbiAgY2xvc2UgKCkge1xuICAgIHJldHVybiB0aGlzLiNhZ2VudC5jbG9zZSgpXG4gIH1cblxuICBkZXN0cm95ICgpIHtcbiAgICByZXR1cm4gdGhpcy4jYWdlbnQuZGVzdHJveSgpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSZXRyeUFnZW50XG4iLCIvLyBQb3J0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9wdWxsLzkwN1xuXG4ndXNlIHN0cmljdCdcblxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnbm9kZTphc3NlcnQnKVxuY29uc3QgeyBSZWFkYWJsZSB9ID0gcmVxdWlyZSgnbm9kZTpzdHJlYW0nKVxuY29uc3QgeyBSZXF1ZXN0QWJvcnRlZEVycm9yLCBOb3RTdXBwb3J0ZWRFcnJvciwgSW52YWxpZEFyZ3VtZW50RXJyb3IsIEFib3J0RXJyb3IgfSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBSZWFkYWJsZVN0cmVhbUZyb20gfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5cbmNvbnN0IGtDb25zdW1lID0gU3ltYm9sKCdrQ29uc3VtZScpXG5jb25zdCBrUmVhZGluZyA9IFN5bWJvbCgna1JlYWRpbmcnKVxuY29uc3Qga0JvZHkgPSBTeW1ib2woJ2tCb2R5JylcbmNvbnN0IGtBYm9ydCA9IFN5bWJvbCgna0Fib3J0JylcbmNvbnN0IGtDb250ZW50VHlwZSA9IFN5bWJvbCgna0NvbnRlbnRUeXBlJylcbmNvbnN0IGtDb250ZW50TGVuZ3RoID0gU3ltYm9sKCdrQ29udGVudExlbmd0aCcpXG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7fVxuXG5jbGFzcyBCb2R5UmVhZGFibGUgZXh0ZW5kcyBSZWFkYWJsZSB7XG4gIGNvbnN0cnVjdG9yICh7XG4gICAgcmVzdW1lLFxuICAgIGFib3J0LFxuICAgIGNvbnRlbnRUeXBlID0gJycsXG4gICAgY29udGVudExlbmd0aCxcbiAgICBoaWdoV2F0ZXJNYXJrID0gNjQgKiAxMDI0IC8vIFNhbWUgYXMgbm9kZWpzIGZzIHN0cmVhbXMuXG4gIH0pIHtcbiAgICBzdXBlcih7XG4gICAgICBhdXRvRGVzdHJveTogdHJ1ZSxcbiAgICAgIHJlYWQ6IHJlc3VtZSxcbiAgICAgIGhpZ2hXYXRlck1hcmtcbiAgICB9KVxuXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kYXRhRW1pdHRlZCA9IGZhbHNlXG5cbiAgICB0aGlzW2tBYm9ydF0gPSBhYm9ydFxuICAgIHRoaXNba0NvbnN1bWVdID0gbnVsbFxuICAgIHRoaXNba0JvZHldID0gbnVsbFxuICAgIHRoaXNba0NvbnRlbnRUeXBlXSA9IGNvbnRlbnRUeXBlXG4gICAgdGhpc1trQ29udGVudExlbmd0aF0gPSBjb250ZW50TGVuZ3RoXG5cbiAgICAvLyBJcyBzdHJlYW0gYmVpbmcgY29uc3VtZWQgdGhyb3VnaCBSZWFkYWJsZSBBUEk/XG4gICAgLy8gVGhpcyBpcyBhbiBvcHRpbWl6YXRpb24gc28gdGhhdCB3ZSBhdm9pZCBjaGVja2luZ1xuICAgIC8vIGZvciAnZGF0YScgYW5kICdyZWFkYWJsZScgbGlzdGVuZXJzIGluIHRoZSBob3QgcGF0aFxuICAgIC8vIGluc2lkZSBwdXNoKCkuXG4gICAgdGhpc1trUmVhZGluZ10gPSBmYWxzZVxuICB9XG5cbiAgZGVzdHJveSAoZXJyKSB7XG4gICAgaWYgKCFlcnIgJiYgIXRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCkge1xuICAgICAgZXJyID0gbmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoKVxuICAgIH1cblxuICAgIGlmIChlcnIpIHtcbiAgICAgIHRoaXNba0Fib3J0XSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLmRlc3Ryb3koZXJyKVxuICB9XG5cbiAgX2Rlc3Ryb3kgKGVyciwgY2FsbGJhY2spIHtcbiAgICAvLyBXb3JrYXJvdW5kIGZvciBOb2RlIFwiYnVnXCIuIElmIHRoZSBzdHJlYW0gaXMgZGVzdHJveWVkIGluIHNhbWVcbiAgICAvLyB0aWNrIGFzIGl0IGlzIGNyZWF0ZWQsIHRoZW4gYSB1c2VyIHdobyBpcyB3YWl0aW5nIGZvciBhXG4gICAgLy8gcHJvbWlzZSAoaS5lIG1pY3JvIHRpY2spIGZvciBpbnN0YWxsaW5nIGEgJ2Vycm9yJyBsaXN0ZW5lciB3aWxsXG4gICAgLy8gbmV2ZXIgZ2V0IGEgY2hhbmNlIGFuZCB3aWxsIGFsd2F5cyBlbmNvdW50ZXIgYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi5cbiAgICBpZiAoIXRoaXNba1JlYWRpbmddKSB7XG4gICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICBjYWxsYmFjayhlcnIpXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjayhlcnIpXG4gICAgfVxuICB9XG5cbiAgb24gKGV2LCAuLi5hcmdzKSB7XG4gICAgaWYgKGV2ID09PSAnZGF0YScgfHwgZXYgPT09ICdyZWFkYWJsZScpIHtcbiAgICAgIHRoaXNba1JlYWRpbmddID0gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gc3VwZXIub24oZXYsIC4uLmFyZ3MpXG4gIH1cblxuICBhZGRMaXN0ZW5lciAoZXYsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5vbihldiwgLi4uYXJncylcbiAgfVxuXG4gIG9mZiAoZXYsIC4uLmFyZ3MpIHtcbiAgICBjb25zdCByZXQgPSBzdXBlci5vZmYoZXYsIC4uLmFyZ3MpXG4gICAgaWYgKGV2ID09PSAnZGF0YScgfHwgZXYgPT09ICdyZWFkYWJsZScpIHtcbiAgICAgIHRoaXNba1JlYWRpbmddID0gKFxuICAgICAgICB0aGlzLmxpc3RlbmVyQ291bnQoJ2RhdGEnKSA+IDAgfHxcbiAgICAgICAgdGhpcy5saXN0ZW5lckNvdW50KCdyZWFkYWJsZScpID4gMFxuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gcmV0XG4gIH1cblxuICByZW1vdmVMaXN0ZW5lciAoZXYsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5vZmYoZXYsIC4uLmFyZ3MpXG4gIH1cblxuICBwdXNoIChjaHVuaykge1xuICAgIGlmICh0aGlzW2tDb25zdW1lXSAmJiBjaHVuayAhPT0gbnVsbCkge1xuICAgICAgY29uc3VtZVB1c2godGhpc1trQ29uc3VtZV0sIGNodW5rKVxuICAgICAgcmV0dXJuIHRoaXNba1JlYWRpbmddID8gc3VwZXIucHVzaChjaHVuaykgOiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBzdXBlci5wdXNoKGNodW5rKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ib2R5LXRleHRcbiAgYXN5bmMgdGV4dCAoKSB7XG4gICAgcmV0dXJuIGNvbnN1bWUodGhpcywgJ3RleHQnKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ib2R5LWpzb25cbiAgYXN5bmMganNvbiAoKSB7XG4gICAgcmV0dXJuIGNvbnN1bWUodGhpcywgJ2pzb24nKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ib2R5LWJsb2JcbiAgYXN5bmMgYmxvYiAoKSB7XG4gICAgcmV0dXJuIGNvbnN1bWUodGhpcywgJ2Jsb2InKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ib2R5LWJ5dGVzXG4gIGFzeW5jIGJ5dGVzICgpIHtcbiAgICByZXR1cm4gY29uc3VtZSh0aGlzLCAnYnl0ZXMnKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ib2R5LWFycmF5YnVmZmVyXG4gIGFzeW5jIGFycmF5QnVmZmVyICgpIHtcbiAgICByZXR1cm4gY29uc3VtZSh0aGlzLCAnYXJyYXlCdWZmZXInKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ib2R5LWZvcm1kYXRhXG4gIGFzeW5jIGZvcm1EYXRhICgpIHtcbiAgICAvLyBUT0RPOiBJbXBsZW1lbnQuXG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEVycm9yKClcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkb20tYm9keS1ib2R5dXNlZFxuICBnZXQgYm9keVVzZWQgKCkge1xuICAgIHJldHVybiB1dGlsLmlzRGlzdHVyYmVkKHRoaXMpXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWJvZHktYm9keVxuICBnZXQgYm9keSAoKSB7XG4gICAgaWYgKCF0aGlzW2tCb2R5XSkge1xuICAgICAgdGhpc1trQm9keV0gPSBSZWFkYWJsZVN0cmVhbUZyb20odGhpcylcbiAgICAgIGlmICh0aGlzW2tDb25zdW1lXSkge1xuICAgICAgICAvLyBUT0RPOiBJcyB0aGlzIHRoZSBiZXN0IHdheSB0byBmb3JjZSBhIGxvY2s/XG4gICAgICAgIHRoaXNba0JvZHldLmdldFJlYWRlcigpIC8vIEVuc3VyZSBzdHJlYW0gaXMgbG9ja2VkLlxuICAgICAgICBhc3NlcnQodGhpc1trQm9keV0ubG9ja2VkKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpc1trQm9keV1cbiAgfVxuXG4gIGFzeW5jIGR1bXAgKG9wdHMpIHtcbiAgICBsZXQgbGltaXQgPSBOdW1iZXIuaXNGaW5pdGUob3B0cz8ubGltaXQpID8gb3B0cy5saW1pdCA6IDEyOCAqIDEwMjRcbiAgICBjb25zdCBzaWduYWwgPSBvcHRzPy5zaWduYWxcblxuICAgIGlmIChzaWduYWwgIT0gbnVsbCAmJiAodHlwZW9mIHNpZ25hbCAhPT0gJ29iamVjdCcgfHwgISgnYWJvcnRlZCcgaW4gc2lnbmFsKSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignc2lnbmFsIG11c3QgYmUgYW4gQWJvcnRTaWduYWwnKVxuICAgIH1cblxuICAgIHNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKVxuXG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUuY2xvc2VFbWl0dGVkKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAodGhpc1trQ29udGVudExlbmd0aF0gPiBsaW1pdCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3kobmV3IEFib3J0RXJyb3IoKSlcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb25BYm9ydCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5kZXN0cm95KHNpZ25hbC5yZWFzb24gPz8gbmV3IEFib3J0RXJyb3IoKSlcbiAgICAgIH1cbiAgICAgIHNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0KVxuXG4gICAgICB0aGlzXG4gICAgICAgIC5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQpXG4gICAgICAgICAgaWYgKHNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgICAgICAgcmVqZWN0KHNpZ25hbC5yZWFzb24gPz8gbmV3IEFib3J0RXJyb3IoKSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZShudWxsKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdlcnJvcicsIG5vb3ApXG4gICAgICAgIC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICAgIGxpbWl0IC09IGNodW5rLmxlbmd0aFxuICAgICAgICAgIGlmIChsaW1pdCA8PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3koKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLnJlc3VtZSgpXG4gICAgfSlcbiAgfVxufVxuXG4vLyBodHRwczovL3N0cmVhbXMuc3BlYy53aGF0d2cub3JnLyNyZWFkYWJsZXN0cmVhbS1sb2NrZWRcbmZ1bmN0aW9uIGlzTG9ja2VkIChzZWxmKSB7XG4gIC8vIENvbnN1bWUgaXMgYW4gaW1wbGljaXQgbG9jay5cbiAgcmV0dXJuIChzZWxmW2tCb2R5XSAmJiBzZWxmW2tCb2R5XS5sb2NrZWQgPT09IHRydWUpIHx8IHNlbGZba0NvbnN1bWVdXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNib2R5LXVudXNhYmxlXG5mdW5jdGlvbiBpc1VudXNhYmxlIChzZWxmKSB7XG4gIHJldHVybiB1dGlsLmlzRGlzdHVyYmVkKHNlbGYpIHx8IGlzTG9ja2VkKHNlbGYpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbnN1bWUgKHN0cmVhbSwgdHlwZSkge1xuICBhc3NlcnQoIXN0cmVhbVtrQ29uc3VtZV0pXG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBpZiAoaXNVbnVzYWJsZShzdHJlYW0pKSB7XG4gICAgICBjb25zdCByU3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGVcbiAgICAgIGlmIChyU3RhdGUuZGVzdHJveWVkICYmIHJTdGF0ZS5jbG9zZUVtaXR0ZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHN0cmVhbVxuICAgICAgICAgIC5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICByZWplY3QobmV3IFR5cGVFcnJvcigndW51c2FibGUnKSlcbiAgICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVqZWN0KHJTdGF0ZS5lcnJvcmVkID8/IG5ldyBUeXBlRXJyb3IoJ3VudXNhYmxlJykpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgc3RyZWFtW2tDb25zdW1lXSA9IHtcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIHN0cmVhbSxcbiAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICBsZW5ndGg6IDAsXG4gICAgICAgICAgYm9keTogW11cbiAgICAgICAgfVxuXG4gICAgICAgIHN0cmVhbVxuICAgICAgICAgIC5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICBjb25zdW1lRmluaXNoKHRoaXNba0NvbnN1bWVdLCBlcnIpXG4gICAgICAgICAgfSlcbiAgICAgICAgICAub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXNba0NvbnN1bWVdLmJvZHkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgY29uc3VtZUZpbmlzaCh0aGlzW2tDb25zdW1lXSwgbmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN1bWVTdGFydChzdHJlYW1ba0NvbnN1bWVdKVxuICAgICAgfSlcbiAgICB9XG4gIH0pXG59XG5cbmZ1bmN0aW9uIGNvbnN1bWVTdGFydCAoY29uc3VtZSkge1xuICBpZiAoY29uc3VtZS5ib2R5ID09PSBudWxsKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB7IF9yZWFkYWJsZVN0YXRlOiBzdGF0ZSB9ID0gY29uc3VtZS5zdHJlYW1cblxuICBpZiAoc3RhdGUuYnVmZmVySW5kZXgpIHtcbiAgICBjb25zdCBzdGFydCA9IHN0YXRlLmJ1ZmZlckluZGV4XG4gICAgY29uc3QgZW5kID0gc3RhdGUuYnVmZmVyLmxlbmd0aFxuICAgIGZvciAobGV0IG4gPSBzdGFydDsgbiA8IGVuZDsgbisrKSB7XG4gICAgICBjb25zdW1lUHVzaChjb25zdW1lLCBzdGF0ZS5idWZmZXJbbl0pXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgY2h1bmsgb2Ygc3RhdGUuYnVmZmVyKSB7XG4gICAgICBjb25zdW1lUHVzaChjb25zdW1lLCBjaHVuaylcbiAgICB9XG4gIH1cblxuICBpZiAoc3RhdGUuZW5kRW1pdHRlZCkge1xuICAgIGNvbnN1bWVFbmQodGhpc1trQ29uc3VtZV0pXG4gIH0gZWxzZSB7XG4gICAgY29uc3VtZS5zdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN1bWVFbmQodGhpc1trQ29uc3VtZV0pXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN1bWUuc3RyZWFtLnJlc3VtZSgpXG5cbiAgd2hpbGUgKGNvbnN1bWUuc3RyZWFtLnJlYWQoKSAhPSBudWxsKSB7XG4gICAgLy8gTG9vcFxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJbXX0gY2h1bmtzXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKi9cbmZ1bmN0aW9uIGNodW5rc0RlY29kZSAoY2h1bmtzLCBsZW5ndGgpIHtcbiAgaWYgKGNodW5rcy5sZW5ndGggPT09IDAgfHwgbGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbiAgY29uc3QgYnVmZmVyID0gY2h1bmtzLmxlbmd0aCA9PT0gMSA/IGNodW5rc1swXSA6IEJ1ZmZlci5jb25jYXQoY2h1bmtzLCBsZW5ndGgpXG4gIGNvbnN0IGJ1ZmZlckxlbmd0aCA9IGJ1ZmZlci5sZW5ndGhcblxuICAvLyBTa2lwIEJPTS5cbiAgY29uc3Qgc3RhcnQgPVxuICAgIGJ1ZmZlckxlbmd0aCA+IDIgJiZcbiAgICBidWZmZXJbMF0gPT09IDB4ZWYgJiZcbiAgICBidWZmZXJbMV0gPT09IDB4YmIgJiZcbiAgICBidWZmZXJbMl0gPT09IDB4YmZcbiAgICAgID8gM1xuICAgICAgOiAwXG4gIHJldHVybiBidWZmZXIudXRmOFNsaWNlKHN0YXJ0LCBidWZmZXJMZW5ndGgpXG59XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJbXX0gY2h1bmtzXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX1cbiAqL1xuZnVuY3Rpb24gY2h1bmtzQ29uY2F0IChjaHVua3MsIGxlbmd0aCkge1xuICBpZiAoY2h1bmtzLmxlbmd0aCA9PT0gMCB8fCBsZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMClcbiAgfVxuICBpZiAoY2h1bmtzLmxlbmd0aCA9PT0gMSkge1xuICAgIC8vIGZhc3QtcGF0aFxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShjaHVua3NbMF0pXG4gIH1cbiAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyhsZW5ndGgpLmJ1ZmZlcilcblxuICBsZXQgb2Zmc2V0ID0gMFxuICBmb3IgKGxldCBpID0gMDsgaSA8IGNodW5rcy5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IGNodW5rID0gY2h1bmtzW2ldXG4gICAgYnVmZmVyLnNldChjaHVuaywgb2Zmc2V0KVxuICAgIG9mZnNldCArPSBjaHVuay5sZW5ndGhcbiAgfVxuXG4gIHJldHVybiBidWZmZXJcbn1cblxuZnVuY3Rpb24gY29uc3VtZUVuZCAoY29uc3VtZSkge1xuICBjb25zdCB7IHR5cGUsIGJvZHksIHJlc29sdmUsIHN0cmVhbSwgbGVuZ3RoIH0gPSBjb25zdW1lXG5cbiAgdHJ5IHtcbiAgICBpZiAodHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICByZXNvbHZlKGNodW5rc0RlY29kZShib2R5LCBsZW5ndGgpKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2pzb24nKSB7XG4gICAgICByZXNvbHZlKEpTT04ucGFyc2UoY2h1bmtzRGVjb2RlKGJvZHksIGxlbmd0aCkpKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2FycmF5QnVmZmVyJykge1xuICAgICAgcmVzb2x2ZShjaHVua3NDb25jYXQoYm9keSwgbGVuZ3RoKS5idWZmZXIpXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnYmxvYicpIHtcbiAgICAgIHJlc29sdmUobmV3IEJsb2IoYm9keSwgeyB0eXBlOiBzdHJlYW1ba0NvbnRlbnRUeXBlXSB9KSlcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdieXRlcycpIHtcbiAgICAgIHJlc29sdmUoY2h1bmtzQ29uY2F0KGJvZHksIGxlbmd0aCkpXG4gICAgfVxuXG4gICAgY29uc3VtZUZpbmlzaChjb25zdW1lKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBzdHJlYW0uZGVzdHJveShlcnIpXG4gIH1cbn1cblxuZnVuY3Rpb24gY29uc3VtZVB1c2ggKGNvbnN1bWUsIGNodW5rKSB7XG4gIGNvbnN1bWUubGVuZ3RoICs9IGNodW5rLmxlbmd0aFxuICBjb25zdW1lLmJvZHkucHVzaChjaHVuaylcbn1cblxuZnVuY3Rpb24gY29uc3VtZUZpbmlzaCAoY29uc3VtZSwgZXJyKSB7XG4gIGlmIChjb25zdW1lLmJvZHkgPT09IG51bGwpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChlcnIpIHtcbiAgICBjb25zdW1lLnJlamVjdChlcnIpXG4gIH0gZWxzZSB7XG4gICAgY29uc3VtZS5yZXNvbHZlKClcbiAgfVxuXG4gIGNvbnN1bWUudHlwZSA9IG51bGxcbiAgY29uc3VtZS5zdHJlYW0gPSBudWxsXG4gIGNvbnN1bWUucmVzb2x2ZSA9IG51bGxcbiAgY29uc3VtZS5yZWplY3QgPSBudWxsXG4gIGNvbnN1bWUubGVuZ3RoID0gMFxuICBjb25zdW1lLmJvZHkgPSBudWxsXG59XG5cbm1vZHVsZS5leHBvcnRzID0geyBSZWFkYWJsZTogQm9keVJlYWRhYmxlLCBjaHVua3NEZWNvZGUgfVxuIiwiY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnbm9kZTphc3NlcnQnKVxuY29uc3Qge1xuICBSZXNwb25zZVN0YXR1c0NvZGVFcnJvclxufSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcblxuY29uc3QgeyBjaHVua3NEZWNvZGUgfSA9IHJlcXVpcmUoJy4vcmVhZGFibGUnKVxuY29uc3QgQ0hVTktfTElNSVQgPSAxMjggKiAxMDI0XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFJlc29sdmVFcnJvckJvZHlDYWxsYmFjayAoeyBjYWxsYmFjaywgYm9keSwgY29udGVudFR5cGUsIHN0YXR1c0NvZGUsIHN0YXR1c01lc3NhZ2UsIGhlYWRlcnMgfSkge1xuICBhc3NlcnQoYm9keSlcblxuICBsZXQgY2h1bmtzID0gW11cbiAgbGV0IGxlbmd0aCA9IDBcblxuICB0cnkge1xuICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgYm9keSkge1xuICAgICAgY2h1bmtzLnB1c2goY2h1bmspXG4gICAgICBsZW5ndGggKz0gY2h1bmsubGVuZ3RoXG4gICAgICBpZiAobGVuZ3RoID4gQ0hVTktfTElNSVQpIHtcbiAgICAgICAgY2h1bmtzID0gW11cbiAgICAgICAgbGVuZ3RoID0gMFxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgY2h1bmtzID0gW11cbiAgICBsZW5ndGggPSAwXG4gICAgLy8gRG8gbm90aGluZy4uLi5cbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSBgUmVzcG9uc2Ugc3RhdHVzIGNvZGUgJHtzdGF0dXNDb2RlfSR7c3RhdHVzTWVzc2FnZSA/IGA6ICR7c3RhdHVzTWVzc2FnZX1gIDogJyd9YFxuXG4gIGlmIChzdGF0dXNDb2RlID09PSAyMDQgfHwgIWNvbnRlbnRUeXBlIHx8ICFsZW5ndGgpIHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBjYWxsYmFjayhuZXcgUmVzcG9uc2VTdGF0dXNDb2RlRXJyb3IobWVzc2FnZSwgc3RhdHVzQ29kZSwgaGVhZGVycykpKVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc3RhY2tUcmFjZUxpbWl0ID0gRXJyb3Iuc3RhY2tUcmFjZUxpbWl0XG4gIEVycm9yLnN0YWNrVHJhY2VMaW1pdCA9IDBcbiAgbGV0IHBheWxvYWRcblxuICB0cnkge1xuICAgIGlmIChpc0NvbnRlbnRUeXBlQXBwbGljYXRpb25Kc29uKGNvbnRlbnRUeXBlKSkge1xuICAgICAgcGF5bG9hZCA9IEpTT04ucGFyc2UoY2h1bmtzRGVjb2RlKGNodW5rcywgbGVuZ3RoKSlcbiAgICB9IGVsc2UgaWYgKGlzQ29udGVudFR5cGVUZXh0KGNvbnRlbnRUeXBlKSkge1xuICAgICAgcGF5bG9hZCA9IGNodW5rc0RlY29kZShjaHVua3MsIGxlbmd0aClcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIHByb2Nlc3MgaW4gYSBjYWxsYmFjayB0byBhdm9pZCB0aHJvd2luZyBpbiB0aGUgbWljcm90YXNrIHF1ZXVlXG4gIH0gZmluYWxseSB7XG4gICAgRXJyb3Iuc3RhY2tUcmFjZUxpbWl0ID0gc3RhY2tUcmFjZUxpbWl0XG4gIH1cbiAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2FsbGJhY2sobmV3IFJlc3BvbnNlU3RhdHVzQ29kZUVycm9yKG1lc3NhZ2UsIHN0YXR1c0NvZGUsIGhlYWRlcnMsIHBheWxvYWQpKSlcbn1cblxuY29uc3QgaXNDb250ZW50VHlwZUFwcGxpY2F0aW9uSnNvbiA9IChjb250ZW50VHlwZSkgPT4ge1xuICByZXR1cm4gKFxuICAgIGNvbnRlbnRUeXBlLmxlbmd0aCA+IDE1ICYmXG4gICAgY29udGVudFR5cGVbMTFdID09PSAnLycgJiZcbiAgICBjb250ZW50VHlwZVswXSA9PT0gJ2EnICYmXG4gICAgY29udGVudFR5cGVbMV0gPT09ICdwJyAmJlxuICAgIGNvbnRlbnRUeXBlWzJdID09PSAncCcgJiZcbiAgICBjb250ZW50VHlwZVszXSA9PT0gJ2wnICYmXG4gICAgY29udGVudFR5cGVbNF0gPT09ICdpJyAmJlxuICAgIGNvbnRlbnRUeXBlWzVdID09PSAnYycgJiZcbiAgICBjb250ZW50VHlwZVs2XSA9PT0gJ2EnICYmXG4gICAgY29udGVudFR5cGVbN10gPT09ICd0JyAmJlxuICAgIGNvbnRlbnRUeXBlWzhdID09PSAnaScgJiZcbiAgICBjb250ZW50VHlwZVs5XSA9PT0gJ28nICYmXG4gICAgY29udGVudFR5cGVbMTBdID09PSAnbicgJiZcbiAgICBjb250ZW50VHlwZVsxMl0gPT09ICdqJyAmJlxuICAgIGNvbnRlbnRUeXBlWzEzXSA9PT0gJ3MnICYmXG4gICAgY29udGVudFR5cGVbMTRdID09PSAnbycgJiZcbiAgICBjb250ZW50VHlwZVsxNV0gPT09ICduJ1xuICApXG59XG5cbmNvbnN0IGlzQ29udGVudFR5cGVUZXh0ID0gKGNvbnRlbnRUeXBlKSA9PiB7XG4gIHJldHVybiAoXG4gICAgY29udGVudFR5cGUubGVuZ3RoID4gNCAmJlxuICAgIGNvbnRlbnRUeXBlWzRdID09PSAnLycgJiZcbiAgICBjb250ZW50VHlwZVswXSA9PT0gJ3QnICYmXG4gICAgY29udGVudFR5cGVbMV0gPT09ICdlJyAmJlxuICAgIGNvbnRlbnRUeXBlWzJdID09PSAneCcgJiZcbiAgICBjb250ZW50VHlwZVszXSA9PT0gJ3QnXG4gIClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldFJlc29sdmVFcnJvckJvZHlDYWxsYmFjayxcbiAgaXNDb250ZW50VHlwZUFwcGxpY2F0aW9uSnNvbixcbiAgaXNDb250ZW50VHlwZVRleHRcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdub2RlOmFzc2VydCcpXG5jb25zdCB7IFJlYWRhYmxlIH0gPSByZXF1aXJlKCcuL3JlYWRhYmxlJylcbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IsIFJlcXVlc3RBYm9ydGVkRXJyb3IgfSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBnZXRSZXNvbHZlRXJyb3JCb2R5Q2FsbGJhY2sgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IEFzeW5jUmVzb3VyY2UgfSA9IHJlcXVpcmUoJ25vZGU6YXN5bmNfaG9va3MnKVxuXG5jbGFzcyBSZXF1ZXN0SGFuZGxlciBleHRlbmRzIEFzeW5jUmVzb3VyY2Uge1xuICBjb25zdHJ1Y3RvciAob3B0cywgY2FsbGJhY2spIHtcbiAgICBpZiAoIW9wdHMgfHwgdHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgb3B0cycpXG4gICAgfVxuXG4gICAgY29uc3QgeyBzaWduYWwsIG1ldGhvZCwgb3BhcXVlLCBib2R5LCBvbkluZm8sIHJlc3BvbnNlSGVhZGVycywgdGhyb3dPbkVycm9yLCBoaWdoV2F0ZXJNYXJrIH0gPSBvcHRzXG5cbiAgICB0cnkge1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgY2FsbGJhY2snKVxuICAgICAgfVxuXG4gICAgICBpZiAoaGlnaFdhdGVyTWFyayAmJiAodHlwZW9mIGhpZ2hXYXRlck1hcmsgIT09ICdudW1iZXInIHx8IGhpZ2hXYXRlck1hcmsgPCAwKSkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgaGlnaFdhdGVyTWFyaycpXG4gICAgICB9XG5cbiAgICAgIGlmIChzaWduYWwgJiYgdHlwZW9mIHNpZ25hbC5vbiAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdzaWduYWwgbXVzdCBiZSBhbiBFdmVudEVtaXR0ZXIgb3IgRXZlbnRUYXJnZXQnKVxuICAgICAgfVxuXG4gICAgICBpZiAobWV0aG9kID09PSAnQ09OTkVDVCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG1ldGhvZCcpXG4gICAgICB9XG5cbiAgICAgIGlmIChvbkluZm8gJiYgdHlwZW9mIG9uSW5mbyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgb25JbmZvIGNhbGxiYWNrJylcbiAgICAgIH1cblxuICAgICAgc3VwZXIoJ1VORElDSV9SRVFVRVNUJylcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmICh1dGlsLmlzU3RyZWFtKGJvZHkpKSB7XG4gICAgICAgIHV0aWwuZGVzdHJveShib2R5Lm9uKCdlcnJvcicsIHV0aWwubm9wKSwgZXJyKVxuICAgICAgfVxuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuXG4gICAgdGhpcy5tZXRob2QgPSBtZXRob2RcbiAgICB0aGlzLnJlc3BvbnNlSGVhZGVycyA9IHJlc3BvbnNlSGVhZGVycyB8fCBudWxsXG4gICAgdGhpcy5vcGFxdWUgPSBvcGFxdWUgfHwgbnVsbFxuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHRoaXMucmVzID0gbnVsbFxuICAgIHRoaXMuYWJvcnQgPSBudWxsXG4gICAgdGhpcy5ib2R5ID0gYm9keVxuICAgIHRoaXMudHJhaWxlcnMgPSB7fVxuICAgIHRoaXMuY29udGV4dCA9IG51bGxcbiAgICB0aGlzLm9uSW5mbyA9IG9uSW5mbyB8fCBudWxsXG4gICAgdGhpcy50aHJvd09uRXJyb3IgPSB0aHJvd09uRXJyb3JcbiAgICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBoaWdoV2F0ZXJNYXJrXG4gICAgdGhpcy5zaWduYWwgPSBzaWduYWxcbiAgICB0aGlzLnJlYXNvbiA9IG51bGxcbiAgICB0aGlzLnJlbW92ZUFib3J0TGlzdGVuZXIgPSBudWxsXG5cbiAgICBpZiAodXRpbC5pc1N0cmVhbShib2R5KSkge1xuICAgICAgYm9keS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMub25FcnJvcihlcnIpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmICh0aGlzLnNpZ25hbCkge1xuICAgICAgaWYgKHRoaXMuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgdGhpcy5yZWFzb24gPSB0aGlzLnNpZ25hbC5yZWFzb24gPz8gbmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW1vdmVBYm9ydExpc3RlbmVyID0gdXRpbC5hZGRBYm9ydExpc3RlbmVyKHRoaXMuc2lnbmFsLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZWFzb24gPSB0aGlzLnNpZ25hbC5yZWFzb24gPz8gbmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoKVxuICAgICAgICAgIGlmICh0aGlzLnJlcykge1xuICAgICAgICAgICAgdXRpbC5kZXN0cm95KHRoaXMucmVzLm9uKCdlcnJvcicsIHV0aWwubm9wKSwgdGhpcy5yZWFzb24pXG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmFib3J0KSB7XG4gICAgICAgICAgICB0aGlzLmFib3J0KHRoaXMucmVhc29uKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0aGlzLnJlbW92ZUFib3J0TGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHRoaXMucmVzPy5vZmYoJ2Nsb3NlJywgdGhpcy5yZW1vdmVBYm9ydExpc3RlbmVyKVxuICAgICAgICAgICAgdGhpcy5yZW1vdmVBYm9ydExpc3RlbmVyKClcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQWJvcnRMaXN0ZW5lciA9IG51bGxcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCwgY29udGV4dCkge1xuICAgIGlmICh0aGlzLnJlYXNvbikge1xuICAgICAgYWJvcnQodGhpcy5yZWFzb24pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhc3NlcnQodGhpcy5jYWxsYmFjaylcblxuICAgIHRoaXMuYWJvcnQgPSBhYm9ydFxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHRcbiAgfVxuXG4gIG9uSGVhZGVycyAoc3RhdHVzQ29kZSwgcmF3SGVhZGVycywgcmVzdW1lLCBzdGF0dXNNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBjYWxsYmFjaywgb3BhcXVlLCBhYm9ydCwgY29udGV4dCwgcmVzcG9uc2VIZWFkZXJzLCBoaWdoV2F0ZXJNYXJrIH0gPSB0aGlzXG5cbiAgICBjb25zdCBoZWFkZXJzID0gcmVzcG9uc2VIZWFkZXJzID09PSAncmF3JyA/IHV0aWwucGFyc2VSYXdIZWFkZXJzKHJhd0hlYWRlcnMpIDogdXRpbC5wYXJzZUhlYWRlcnMocmF3SGVhZGVycylcblxuICAgIGlmIChzdGF0dXNDb2RlIDwgMjAwKSB7XG4gICAgICBpZiAodGhpcy5vbkluZm8pIHtcbiAgICAgICAgdGhpcy5vbkluZm8oeyBzdGF0dXNDb2RlLCBoZWFkZXJzIH0pXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWRIZWFkZXJzID0gcmVzcG9uc2VIZWFkZXJzID09PSAncmF3JyA/IHV0aWwucGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpIDogaGVhZGVyc1xuICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcGFyc2VkSGVhZGVyc1snY29udGVudC10eXBlJ11cbiAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gcGFyc2VkSGVhZGVyc1snY29udGVudC1sZW5ndGgnXVxuICAgIGNvbnN0IHJlcyA9IG5ldyBSZWFkYWJsZSh7XG4gICAgICByZXN1bWUsXG4gICAgICBhYm9ydCxcbiAgICAgIGNvbnRlbnRUeXBlLFxuICAgICAgY29udGVudExlbmd0aDogdGhpcy5tZXRob2QgIT09ICdIRUFEJyAmJiBjb250ZW50TGVuZ3RoXG4gICAgICAgID8gTnVtYmVyKGNvbnRlbnRMZW5ndGgpXG4gICAgICAgIDogbnVsbCxcbiAgICAgIGhpZ2hXYXRlck1hcmtcbiAgICB9KVxuXG4gICAgaWYgKHRoaXMucmVtb3ZlQWJvcnRMaXN0ZW5lcikge1xuICAgICAgcmVzLm9uKCdjbG9zZScsIHRoaXMucmVtb3ZlQWJvcnRMaXN0ZW5lcilcbiAgICB9XG5cbiAgICB0aGlzLmNhbGxiYWNrID0gbnVsbFxuICAgIHRoaXMucmVzID0gcmVzXG4gICAgaWYgKGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICBpZiAodGhpcy50aHJvd09uRXJyb3IgJiYgc3RhdHVzQ29kZSA+PSA0MDApIHtcbiAgICAgICAgdGhpcy5ydW5JbkFzeW5jU2NvcGUoZ2V0UmVzb2x2ZUVycm9yQm9keUNhbGxiYWNrLCBudWxsLFxuICAgICAgICAgIHsgY2FsbGJhY2ssIGJvZHk6IHJlcywgY29udGVudFR5cGUsIHN0YXR1c0NvZGUsIHN0YXR1c01lc3NhZ2UsIGhlYWRlcnMgfVxuICAgICAgICApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJ1bkluQXN5bmNTY29wZShjYWxsYmFjaywgbnVsbCwgbnVsbCwge1xuICAgICAgICAgIHN0YXR1c0NvZGUsXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICB0cmFpbGVyczogdGhpcy50cmFpbGVycyxcbiAgICAgICAgICBvcGFxdWUsXG4gICAgICAgICAgYm9keTogcmVzLFxuICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkRhdGEgKGNodW5rKSB7XG4gICAgcmV0dXJuIHRoaXMucmVzLnB1c2goY2h1bmspXG4gIH1cblxuICBvbkNvbXBsZXRlICh0cmFpbGVycykge1xuICAgIHV0aWwucGFyc2VIZWFkZXJzKHRyYWlsZXJzLCB0aGlzLnRyYWlsZXJzKVxuICAgIHRoaXMucmVzLnB1c2gobnVsbClcbiAgfVxuXG4gIG9uRXJyb3IgKGVycikge1xuICAgIGNvbnN0IHsgcmVzLCBjYWxsYmFjaywgYm9keSwgb3BhcXVlIH0gPSB0aGlzXG5cbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIC8vIFRPRE86IERvZXMgdGhpcyBuZWVkIHF1ZXVlTWljcm90YXNrP1xuICAgICAgdGhpcy5jYWxsYmFjayA9IG51bGxcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5ydW5JbkFzeW5jU2NvcGUoY2FsbGJhY2ssIG51bGwsIGVyciwgeyBvcGFxdWUgfSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHJlcykge1xuICAgICAgdGhpcy5yZXMgPSBudWxsXG4gICAgICAvLyBFbnN1cmUgYWxsIHF1ZXVlZCBoYW5kbGVycyBhcmUgaW52b2tlZCBiZWZvcmUgZGVzdHJveWluZyByZXMuXG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIHV0aWwuZGVzdHJveShyZXMsIGVycilcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGJvZHkpIHtcbiAgICAgIHRoaXMuYm9keSA9IG51bGxcbiAgICAgIHV0aWwuZGVzdHJveShib2R5LCBlcnIpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVtb3ZlQWJvcnRMaXN0ZW5lcikge1xuICAgICAgcmVzPy5vZmYoJ2Nsb3NlJywgdGhpcy5yZW1vdmVBYm9ydExpc3RlbmVyKVxuICAgICAgdGhpcy5yZW1vdmVBYm9ydExpc3RlbmVyKClcbiAgICAgIHRoaXMucmVtb3ZlQWJvcnRMaXN0ZW5lciA9IG51bGxcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVxdWVzdCAob3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcmVxdWVzdC5jYWxsKHRoaXMsIG9wdHMsIChlcnIsIGRhdGEpID0+IHtcbiAgICAgICAgcmV0dXJuIGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZShkYXRhKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgdHJ5IHtcbiAgICB0aGlzLmRpc3BhdGNoKG9wdHMsIG5ldyBSZXF1ZXN0SGFuZGxlcihvcHRzLCBjYWxsYmFjaykpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgICBjb25zdCBvcGFxdWUgPSBvcHRzPy5vcGFxdWVcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBjYWxsYmFjayhlcnIsIHsgb3BhcXVlIH0pKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWVzdFxubW9kdWxlLmV4cG9ydHMuUmVxdWVzdEhhbmRsZXIgPSBSZXF1ZXN0SGFuZGxlclxuIiwiY29uc3QgeyBhZGRBYm9ydExpc3RlbmVyIH0gPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBSZXF1ZXN0QWJvcnRlZEVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5cbmNvbnN0IGtMaXN0ZW5lciA9IFN5bWJvbCgna0xpc3RlbmVyJylcbmNvbnN0IGtTaWduYWwgPSBTeW1ib2woJ2tTaWduYWwnKVxuXG5mdW5jdGlvbiBhYm9ydCAoc2VsZikge1xuICBpZiAoc2VsZi5hYm9ydCkge1xuICAgIHNlbGYuYWJvcnQoc2VsZltrU2lnbmFsXT8ucmVhc29uKVxuICB9IGVsc2Uge1xuICAgIHNlbGYucmVhc29uID0gc2VsZltrU2lnbmFsXT8ucmVhc29uID8/IG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKClcbiAgfVxuICByZW1vdmVTaWduYWwoc2VsZilcbn1cblxuZnVuY3Rpb24gYWRkU2lnbmFsIChzZWxmLCBzaWduYWwpIHtcbiAgc2VsZi5yZWFzb24gPSBudWxsXG5cbiAgc2VsZltrU2lnbmFsXSA9IG51bGxcbiAgc2VsZltrTGlzdGVuZXJdID0gbnVsbFxuXG4gIGlmICghc2lnbmFsKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICBhYm9ydChzZWxmKVxuICAgIHJldHVyblxuICB9XG5cbiAgc2VsZltrU2lnbmFsXSA9IHNpZ25hbFxuICBzZWxmW2tMaXN0ZW5lcl0gPSAoKSA9PiB7XG4gICAgYWJvcnQoc2VsZilcbiAgfVxuXG4gIGFkZEFib3J0TGlzdGVuZXIoc2VsZltrU2lnbmFsXSwgc2VsZltrTGlzdGVuZXJdKVxufVxuXG5mdW5jdGlvbiByZW1vdmVTaWduYWwgKHNlbGYpIHtcbiAgaWYgKCFzZWxmW2tTaWduYWxdKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoJ3JlbW92ZUV2ZW50TGlzdGVuZXInIGluIHNlbGZba1NpZ25hbF0pIHtcbiAgICBzZWxmW2tTaWduYWxdLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgc2VsZltrTGlzdGVuZXJdKVxuICB9IGVsc2Uge1xuICAgIHNlbGZba1NpZ25hbF0ucmVtb3ZlTGlzdGVuZXIoJ2Fib3J0Jywgc2VsZltrTGlzdGVuZXJdKVxuICB9XG5cbiAgc2VsZltrU2lnbmFsXSA9IG51bGxcbiAgc2VsZltrTGlzdGVuZXJdID0gbnVsbFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgYWRkU2lnbmFsLFxuICByZW1vdmVTaWduYWxcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdub2RlOmFzc2VydCcpXG5jb25zdCB7IGZpbmlzaGVkLCBQYXNzVGhyb3VnaCB9ID0gcmVxdWlyZSgnbm9kZTpzdHJlYW0nKVxuY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciwgSW52YWxpZFJldHVyblZhbHVlRXJyb3IgfSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBnZXRSZXNvbHZlRXJyb3JCb2R5Q2FsbGJhY2sgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IEFzeW5jUmVzb3VyY2UgfSA9IHJlcXVpcmUoJ25vZGU6YXN5bmNfaG9va3MnKVxuY29uc3QgeyBhZGRTaWduYWwsIHJlbW92ZVNpZ25hbCB9ID0gcmVxdWlyZSgnLi9hYm9ydC1zaWduYWwnKVxuXG5jbGFzcyBTdHJlYW1IYW5kbGVyIGV4dGVuZHMgQXN5bmNSZXNvdXJjZSB7XG4gIGNvbnN0cnVjdG9yIChvcHRzLCBmYWN0b3J5LCBjYWxsYmFjaykge1xuICAgIGlmICghb3B0cyB8fCB0eXBlb2Ygb3B0cyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvcHRzJylcbiAgICB9XG5cbiAgICBjb25zdCB7IHNpZ25hbCwgbWV0aG9kLCBvcGFxdWUsIGJvZHksIG9uSW5mbywgcmVzcG9uc2VIZWFkZXJzLCB0aHJvd09uRXJyb3IgfSA9IG9wdHNcblxuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBjYWxsYmFjaycpXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZmFjdG9yeSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgZmFjdG9yeScpXG4gICAgICB9XG5cbiAgICAgIGlmIChzaWduYWwgJiYgdHlwZW9mIHNpZ25hbC5vbiAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdzaWduYWwgbXVzdCBiZSBhbiBFdmVudEVtaXR0ZXIgb3IgRXZlbnRUYXJnZXQnKVxuICAgICAgfVxuXG4gICAgICBpZiAobWV0aG9kID09PSAnQ09OTkVDVCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG1ldGhvZCcpXG4gICAgICB9XG5cbiAgICAgIGlmIChvbkluZm8gJiYgdHlwZW9mIG9uSW5mbyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgb25JbmZvIGNhbGxiYWNrJylcbiAgICAgIH1cblxuICAgICAgc3VwZXIoJ1VORElDSV9TVFJFQU0nKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKHV0aWwuaXNTdHJlYW0oYm9keSkpIHtcbiAgICAgICAgdXRpbC5kZXN0cm95KGJvZHkub24oJ2Vycm9yJywgdXRpbC5ub3ApLCBlcnIpXG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG5cbiAgICB0aGlzLnJlc3BvbnNlSGVhZGVycyA9IHJlc3BvbnNlSGVhZGVycyB8fCBudWxsXG4gICAgdGhpcy5vcGFxdWUgPSBvcGFxdWUgfHwgbnVsbFxuICAgIHRoaXMuZmFjdG9yeSA9IGZhY3RvcnlcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2tcbiAgICB0aGlzLnJlcyA9IG51bGxcbiAgICB0aGlzLmFib3J0ID0gbnVsbFxuICAgIHRoaXMuY29udGV4dCA9IG51bGxcbiAgICB0aGlzLnRyYWlsZXJzID0gbnVsbFxuICAgIHRoaXMuYm9keSA9IGJvZHlcbiAgICB0aGlzLm9uSW5mbyA9IG9uSW5mbyB8fCBudWxsXG4gICAgdGhpcy50aHJvd09uRXJyb3IgPSB0aHJvd09uRXJyb3IgfHwgZmFsc2VcblxuICAgIGlmICh1dGlsLmlzU3RyZWFtKGJvZHkpKSB7XG4gICAgICBib2R5Lm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5vbkVycm9yKGVycilcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgYWRkU2lnbmFsKHRoaXMsIHNpZ25hbClcbiAgfVxuXG4gIG9uQ29ubmVjdCAoYWJvcnQsIGNvbnRleHQpIHtcbiAgICBpZiAodGhpcy5yZWFzb24pIHtcbiAgICAgIGFib3J0KHRoaXMucmVhc29uKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXNzZXJ0KHRoaXMuY2FsbGJhY2spXG5cbiAgICB0aGlzLmFib3J0ID0gYWJvcnRcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0XG4gIH1cblxuICBvbkhlYWRlcnMgKHN0YXR1c0NvZGUsIHJhd0hlYWRlcnMsIHJlc3VtZSwgc3RhdHVzTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgZmFjdG9yeSwgb3BhcXVlLCBjb250ZXh0LCBjYWxsYmFjaywgcmVzcG9uc2VIZWFkZXJzIH0gPSB0aGlzXG5cbiAgICBjb25zdCBoZWFkZXJzID0gcmVzcG9uc2VIZWFkZXJzID09PSAncmF3JyA/IHV0aWwucGFyc2VSYXdIZWFkZXJzKHJhd0hlYWRlcnMpIDogdXRpbC5wYXJzZUhlYWRlcnMocmF3SGVhZGVycylcblxuICAgIGlmIChzdGF0dXNDb2RlIDwgMjAwKSB7XG4gICAgICBpZiAodGhpcy5vbkluZm8pIHtcbiAgICAgICAgdGhpcy5vbkluZm8oeyBzdGF0dXNDb2RlLCBoZWFkZXJzIH0pXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmZhY3RvcnkgPSBudWxsXG5cbiAgICBsZXQgcmVzXG5cbiAgICBpZiAodGhpcy50aHJvd09uRXJyb3IgJiYgc3RhdHVzQ29kZSA+PSA0MDApIHtcbiAgICAgIGNvbnN0IHBhcnNlZEhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMgPT09ICdyYXcnID8gdXRpbC5wYXJzZUhlYWRlcnMocmF3SGVhZGVycykgOiBoZWFkZXJzXG4gICAgICBjb25zdCBjb250ZW50VHlwZSA9IHBhcnNlZEhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddXG4gICAgICByZXMgPSBuZXcgUGFzc1Rocm91Z2goKVxuXG4gICAgICB0aGlzLmNhbGxiYWNrID0gbnVsbFxuICAgICAgdGhpcy5ydW5JbkFzeW5jU2NvcGUoZ2V0UmVzb2x2ZUVycm9yQm9keUNhbGxiYWNrLCBudWxsLFxuICAgICAgICB7IGNhbGxiYWNrLCBib2R5OiByZXMsIGNvbnRlbnRUeXBlLCBzdGF0dXNDb2RlLCBzdGF0dXNNZXNzYWdlLCBoZWFkZXJzIH1cbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGZhY3RvcnkgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHJlcyA9IHRoaXMucnVuSW5Bc3luY1Njb3BlKGZhY3RvcnksIG51bGwsIHtcbiAgICAgICAgc3RhdHVzQ29kZSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgb3BhcXVlLFxuICAgICAgICBjb250ZXh0XG4gICAgICB9KVxuXG4gICAgICBpZiAoXG4gICAgICAgICFyZXMgfHxcbiAgICAgICAgdHlwZW9mIHJlcy53cml0ZSAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICB0eXBlb2YgcmVzLmVuZCAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICB0eXBlb2YgcmVzLm9uICE9PSAnZnVuY3Rpb24nXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXR1cm5WYWx1ZUVycm9yKCdleHBlY3RlZCBXcml0YWJsZScpXG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE86IEF2b2lkIGZpbmlzaGVkLiBJdCByZWdpc3RlcnMgYW4gdW5uZWNlc3NhcnkgYW1vdW50IG9mIGxpc3RlbmVycy5cbiAgICAgIGZpbmlzaGVkKHJlcywgeyByZWFkYWJsZTogZmFsc2UgfSwgKGVycikgPT4ge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCByZXMsIG9wYXF1ZSwgdHJhaWxlcnMsIGFib3J0IH0gPSB0aGlzXG5cbiAgICAgICAgdGhpcy5yZXMgPSBudWxsXG4gICAgICAgIGlmIChlcnIgfHwgIXJlcy5yZWFkYWJsZSkge1xuICAgICAgICAgIHV0aWwuZGVzdHJveShyZXMsIGVycilcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBudWxsXG4gICAgICAgIHRoaXMucnVuSW5Bc3luY1Njb3BlKGNhbGxiYWNrLCBudWxsLCBlcnIgfHwgbnVsbCwgeyBvcGFxdWUsIHRyYWlsZXJzIH0pXG5cbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIGFib3J0KClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXMub24oJ2RyYWluJywgcmVzdW1lKVxuXG4gICAgdGhpcy5yZXMgPSByZXNcblxuICAgIGNvbnN0IG5lZWREcmFpbiA9IHJlcy53cml0YWJsZU5lZWREcmFpbiAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHJlcy53cml0YWJsZU5lZWREcmFpblxuICAgICAgOiByZXMuX3dyaXRhYmxlU3RhdGU/Lm5lZWREcmFpblxuXG4gICAgcmV0dXJuIG5lZWREcmFpbiAhPT0gdHJ1ZVxuICB9XG5cbiAgb25EYXRhIChjaHVuaykge1xuICAgIGNvbnN0IHsgcmVzIH0gPSB0aGlzXG5cbiAgICByZXR1cm4gcmVzID8gcmVzLndyaXRlKGNodW5rKSA6IHRydWVcbiAgfVxuXG4gIG9uQ29tcGxldGUgKHRyYWlsZXJzKSB7XG4gICAgY29uc3QgeyByZXMgfSA9IHRoaXNcblxuICAgIHJlbW92ZVNpZ25hbCh0aGlzKVxuXG4gICAgaWYgKCFyZXMpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMudHJhaWxlcnMgPSB1dGlsLnBhcnNlSGVhZGVycyh0cmFpbGVycylcblxuICAgIHJlcy5lbmQoKVxuICB9XG5cbiAgb25FcnJvciAoZXJyKSB7XG4gICAgY29uc3QgeyByZXMsIGNhbGxiYWNrLCBvcGFxdWUsIGJvZHkgfSA9IHRoaXNcblxuICAgIHJlbW92ZVNpZ25hbCh0aGlzKVxuXG4gICAgdGhpcy5mYWN0b3J5ID0gbnVsbFxuXG4gICAgaWYgKHJlcykge1xuICAgICAgdGhpcy5yZXMgPSBudWxsXG4gICAgICB1dGlsLmRlc3Ryb3kocmVzLCBlcnIpXG4gICAgfSBlbHNlIGlmIChjYWxsYmFjaykge1xuICAgICAgdGhpcy5jYWxsYmFjayA9IG51bGxcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5ydW5JbkFzeW5jU2NvcGUoY2FsbGJhY2ssIG51bGwsIGVyciwgeyBvcGFxdWUgfSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGJvZHkpIHtcbiAgICAgIHRoaXMuYm9keSA9IG51bGxcbiAgICAgIHV0aWwuZGVzdHJveShib2R5LCBlcnIpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHN0cmVhbSAob3B0cywgZmFjdG9yeSwgY2FsbGJhY2spIHtcbiAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgc3RyZWFtLmNhbGwodGhpcywgb3B0cywgZmFjdG9yeSwgKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICByZXR1cm4gZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKGRhdGEpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICB0cnkge1xuICAgIHRoaXMuZGlzcGF0Y2gob3B0cywgbmV3IFN0cmVhbUhhbmRsZXIob3B0cywgZmFjdG9yeSwgY2FsbGJhY2spKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG4gICAgY29uc3Qgb3BhcXVlID0gb3B0cz8ub3BhcXVlXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2FsbGJhY2soZXJyLCB7IG9wYXF1ZSB9KSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmVhbVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHtcbiAgUmVhZGFibGUsXG4gIER1cGxleCxcbiAgUGFzc1Rocm91Z2hcbn0gPSByZXF1aXJlKCdub2RlOnN0cmVhbScpXG5jb25zdCB7XG4gIEludmFsaWRBcmd1bWVudEVycm9yLFxuICBJbnZhbGlkUmV0dXJuVmFsdWVFcnJvcixcbiAgUmVxdWVzdEFib3J0ZWRFcnJvclxufSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBBc3luY1Jlc291cmNlIH0gPSByZXF1aXJlKCdub2RlOmFzeW5jX2hvb2tzJylcbmNvbnN0IHsgYWRkU2lnbmFsLCByZW1vdmVTaWduYWwgfSA9IHJlcXVpcmUoJy4vYWJvcnQtc2lnbmFsJylcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ25vZGU6YXNzZXJ0JylcblxuY29uc3Qga1Jlc3VtZSA9IFN5bWJvbCgncmVzdW1lJylcblxuY2xhc3MgUGlwZWxpbmVSZXF1ZXN0IGV4dGVuZHMgUmVhZGFibGUge1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgc3VwZXIoeyBhdXRvRGVzdHJveTogdHJ1ZSB9KVxuXG4gICAgdGhpc1trUmVzdW1lXSA9IG51bGxcbiAgfVxuXG4gIF9yZWFkICgpIHtcbiAgICBjb25zdCB7IFtrUmVzdW1lXTogcmVzdW1lIH0gPSB0aGlzXG5cbiAgICBpZiAocmVzdW1lKSB7XG4gICAgICB0aGlzW2tSZXN1bWVdID0gbnVsbFxuICAgICAgcmVzdW1lKClcbiAgICB9XG4gIH1cblxuICBfZGVzdHJveSAoZXJyLCBjYWxsYmFjaykge1xuICAgIHRoaXMuX3JlYWQoKVxuXG4gICAgY2FsbGJhY2soZXJyKVxuICB9XG59XG5cbmNsYXNzIFBpcGVsaW5lUmVzcG9uc2UgZXh0ZW5kcyBSZWFkYWJsZSB7XG4gIGNvbnN0cnVjdG9yIChyZXN1bWUpIHtcbiAgICBzdXBlcih7IGF1dG9EZXN0cm95OiB0cnVlIH0pXG4gICAgdGhpc1trUmVzdW1lXSA9IHJlc3VtZVxuICB9XG5cbiAgX3JlYWQgKCkge1xuICAgIHRoaXNba1Jlc3VtZV0oKVxuICB9XG5cbiAgX2Rlc3Ryb3kgKGVyciwgY2FsbGJhY2spIHtcbiAgICBpZiAoIWVyciAmJiAhdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgICBlcnIgPSBuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpXG4gICAgfVxuXG4gICAgY2FsbGJhY2soZXJyKVxuICB9XG59XG5cbmNsYXNzIFBpcGVsaW5lSGFuZGxlciBleHRlbmRzIEFzeW5jUmVzb3VyY2Uge1xuICBjb25zdHJ1Y3RvciAob3B0cywgaGFuZGxlcikge1xuICAgIGlmICghb3B0cyB8fCB0eXBlb2Ygb3B0cyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvcHRzJylcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGhhbmRsZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBoYW5kbGVyJylcbiAgICB9XG5cbiAgICBjb25zdCB7IHNpZ25hbCwgbWV0aG9kLCBvcGFxdWUsIG9uSW5mbywgcmVzcG9uc2VIZWFkZXJzIH0gPSBvcHRzXG5cbiAgICBpZiAoc2lnbmFsICYmIHR5cGVvZiBzaWduYWwub24gIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3NpZ25hbCBtdXN0IGJlIGFuIEV2ZW50RW1pdHRlciBvciBFdmVudFRhcmdldCcpXG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gJ0NPTk5FQ1QnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgbWV0aG9kJylcbiAgICB9XG5cbiAgICBpZiAob25JbmZvICYmIHR5cGVvZiBvbkluZm8gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvbkluZm8gY2FsbGJhY2snKVxuICAgIH1cblxuICAgIHN1cGVyKCdVTkRJQ0lfUElQRUxJTkUnKVxuXG4gICAgdGhpcy5vcGFxdWUgPSBvcGFxdWUgfHwgbnVsbFxuICAgIHRoaXMucmVzcG9uc2VIZWFkZXJzID0gcmVzcG9uc2VIZWFkZXJzIHx8IG51bGxcbiAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyXG4gICAgdGhpcy5hYm9ydCA9IG51bGxcbiAgICB0aGlzLmNvbnRleHQgPSBudWxsXG4gICAgdGhpcy5vbkluZm8gPSBvbkluZm8gfHwgbnVsbFxuXG4gICAgdGhpcy5yZXEgPSBuZXcgUGlwZWxpbmVSZXF1ZXN0KCkub24oJ2Vycm9yJywgdXRpbC5ub3ApXG5cbiAgICB0aGlzLnJldCA9IG5ldyBEdXBsZXgoe1xuICAgICAgcmVhZGFibGVPYmplY3RNb2RlOiBvcHRzLm9iamVjdE1vZGUsXG4gICAgICBhdXRvRGVzdHJveTogdHJ1ZSxcbiAgICAgIHJlYWQ6ICgpID0+IHtcbiAgICAgICAgY29uc3QgeyBib2R5IH0gPSB0aGlzXG5cbiAgICAgICAgaWYgKGJvZHk/LnJlc3VtZSkge1xuICAgICAgICAgIGJvZHkucmVzdW1lKClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHdyaXRlOiAoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykgPT4ge1xuICAgICAgICBjb25zdCB7IHJlcSB9ID0gdGhpc1xuXG4gICAgICAgIGlmIChyZXEucHVzaChjaHVuaywgZW5jb2RpbmcpIHx8IHJlcS5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQpIHtcbiAgICAgICAgICBjYWxsYmFjaygpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVxW2tSZXN1bWVdID0gY2FsbGJhY2tcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRlc3Ryb3k6IChlcnIsIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgYm9keSwgcmVxLCByZXMsIHJldCwgYWJvcnQgfSA9IHRoaXNcblxuICAgICAgICBpZiAoIWVyciAmJiAhcmV0Ll9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICAgICAgICBlcnIgPSBuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWJvcnQgJiYgZXJyKSB7XG4gICAgICAgICAgYWJvcnQoKVxuICAgICAgICB9XG5cbiAgICAgICAgdXRpbC5kZXN0cm95KGJvZHksIGVycilcbiAgICAgICAgdXRpbC5kZXN0cm95KHJlcSwgZXJyKVxuICAgICAgICB1dGlsLmRlc3Ryb3kocmVzLCBlcnIpXG5cbiAgICAgICAgcmVtb3ZlU2lnbmFsKHRoaXMpXG5cbiAgICAgICAgY2FsbGJhY2soZXJyKVxuICAgICAgfVxuICAgIH0pLm9uKCdwcmVmaW5pc2gnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHJlcSB9ID0gdGhpc1xuXG4gICAgICAvLyBOb2RlIDwgMTUgZG9lcyBub3QgY2FsbCBfZmluYWwgaW4gc2FtZSB0aWNrLlxuICAgICAgcmVxLnB1c2gobnVsbClcbiAgICB9KVxuXG4gICAgdGhpcy5yZXMgPSBudWxsXG5cbiAgICBhZGRTaWduYWwodGhpcywgc2lnbmFsKVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCwgY29udGV4dCkge1xuICAgIGNvbnN0IHsgcmV0LCByZXMgfSA9IHRoaXNcblxuICAgIGlmICh0aGlzLnJlYXNvbikge1xuICAgICAgYWJvcnQodGhpcy5yZWFzb24pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhc3NlcnQoIXJlcywgJ3BpcGVsaW5lIGNhbm5vdCBiZSByZXRyaWVkJylcbiAgICBhc3NlcnQoIXJldC5kZXN0cm95ZWQpXG5cbiAgICB0aGlzLmFib3J0ID0gYWJvcnRcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0XG4gIH1cblxuICBvbkhlYWRlcnMgKHN0YXR1c0NvZGUsIHJhd0hlYWRlcnMsIHJlc3VtZSkge1xuICAgIGNvbnN0IHsgb3BhcXVlLCBoYW5kbGVyLCBjb250ZXh0IH0gPSB0aGlzXG5cbiAgICBpZiAoc3RhdHVzQ29kZSA8IDIwMCkge1xuICAgICAgaWYgKHRoaXMub25JbmZvKSB7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnJlc3BvbnNlSGVhZGVycyA9PT0gJ3JhdycgPyB1dGlsLnBhcnNlUmF3SGVhZGVycyhyYXdIZWFkZXJzKSA6IHV0aWwucGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpXG4gICAgICAgIHRoaXMub25JbmZvKHsgc3RhdHVzQ29kZSwgaGVhZGVycyB9KVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5yZXMgPSBuZXcgUGlwZWxpbmVSZXNwb25zZShyZXN1bWUpXG5cbiAgICBsZXQgYm9keVxuICAgIHRyeSB7XG4gICAgICB0aGlzLmhhbmRsZXIgPSBudWxsXG4gICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5yZXNwb25zZUhlYWRlcnMgPT09ICdyYXcnID8gdXRpbC5wYXJzZVJhd0hlYWRlcnMocmF3SGVhZGVycykgOiB1dGlsLnBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKVxuICAgICAgYm9keSA9IHRoaXMucnVuSW5Bc3luY1Njb3BlKGhhbmRsZXIsIG51bGwsIHtcbiAgICAgICAgc3RhdHVzQ29kZSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgb3BhcXVlLFxuICAgICAgICBib2R5OiB0aGlzLnJlcyxcbiAgICAgICAgY29udGV4dFxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMucmVzLm9uKCdlcnJvcicsIHV0aWwubm9wKVxuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuXG4gICAgaWYgKCFib2R5IHx8IHR5cGVvZiBib2R5Lm9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFJldHVyblZhbHVlRXJyb3IoJ2V4cGVjdGVkIFJlYWRhYmxlJylcbiAgICB9XG5cbiAgICBib2R5XG4gICAgICAub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICAgICAgY29uc3QgeyByZXQsIGJvZHkgfSA9IHRoaXNcblxuICAgICAgICBpZiAoIXJldC5wdXNoKGNodW5rKSAmJiBib2R5LnBhdXNlKSB7XG4gICAgICAgICAgYm9keS5wYXVzZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICBjb25zdCB7IHJldCB9ID0gdGhpc1xuXG4gICAgICAgIHV0aWwuZGVzdHJveShyZXQsIGVycilcbiAgICAgIH0pXG4gICAgICAub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgeyByZXQgfSA9IHRoaXNcblxuICAgICAgICByZXQucHVzaChudWxsKVxuICAgICAgfSlcbiAgICAgIC5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcmV0IH0gPSB0aGlzXG5cbiAgICAgICAgaWYgKCFyZXQuX3JlYWRhYmxlU3RhdGUuZW5kZWQpIHtcbiAgICAgICAgICB1dGlsLmRlc3Ryb3kocmV0LCBuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgdGhpcy5ib2R5ID0gYm9keVxuICB9XG5cbiAgb25EYXRhIChjaHVuaykge1xuICAgIGNvbnN0IHsgcmVzIH0gPSB0aGlzXG4gICAgcmV0dXJuIHJlcy5wdXNoKGNodW5rKVxuICB9XG5cbiAgb25Db21wbGV0ZSAodHJhaWxlcnMpIHtcbiAgICBjb25zdCB7IHJlcyB9ID0gdGhpc1xuICAgIHJlcy5wdXNoKG51bGwpXG4gIH1cblxuICBvbkVycm9yIChlcnIpIHtcbiAgICBjb25zdCB7IHJldCB9ID0gdGhpc1xuICAgIHRoaXMuaGFuZGxlciA9IG51bGxcbiAgICB1dGlsLmRlc3Ryb3kocmV0LCBlcnIpXG4gIH1cbn1cblxuZnVuY3Rpb24gcGlwZWxpbmUgKG9wdHMsIGhhbmRsZXIpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwaXBlbGluZUhhbmRsZXIgPSBuZXcgUGlwZWxpbmVIYW5kbGVyKG9wdHMsIGhhbmRsZXIpXG4gICAgdGhpcy5kaXNwYXRjaCh7IC4uLm9wdHMsIGJvZHk6IHBpcGVsaW5lSGFuZGxlci5yZXEgfSwgcGlwZWxpbmVIYW5kbGVyKVxuICAgIHJldHVybiBwaXBlbGluZUhhbmRsZXIucmV0XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBuZXcgUGFzc1Rocm91Z2goKS5kZXN0cm95KGVycilcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBpcGVsaW5lXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciwgU29ja2V0RXJyb3IgfSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcbmNvbnN0IHsgQXN5bmNSZXNvdXJjZSB9ID0gcmVxdWlyZSgnbm9kZTphc3luY19ob29rcycpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgYWRkU2lnbmFsLCByZW1vdmVTaWduYWwgfSA9IHJlcXVpcmUoJy4vYWJvcnQtc2lnbmFsJylcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ25vZGU6YXNzZXJ0JylcblxuY2xhc3MgVXBncmFkZUhhbmRsZXIgZXh0ZW5kcyBBc3luY1Jlc291cmNlIHtcbiAgY29uc3RydWN0b3IgKG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFvcHRzIHx8IHR5cGVvZiBvcHRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9wdHMnKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBjYWxsYmFjaycpXG4gICAgfVxuXG4gICAgY29uc3QgeyBzaWduYWwsIG9wYXF1ZSwgcmVzcG9uc2VIZWFkZXJzIH0gPSBvcHRzXG5cbiAgICBpZiAoc2lnbmFsICYmIHR5cGVvZiBzaWduYWwub24gIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3NpZ25hbCBtdXN0IGJlIGFuIEV2ZW50RW1pdHRlciBvciBFdmVudFRhcmdldCcpXG4gICAgfVxuXG4gICAgc3VwZXIoJ1VORElDSV9VUEdSQURFJylcblxuICAgIHRoaXMucmVzcG9uc2VIZWFkZXJzID0gcmVzcG9uc2VIZWFkZXJzIHx8IG51bGxcbiAgICB0aGlzLm9wYXF1ZSA9IG9wYXF1ZSB8fCBudWxsXG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrXG4gICAgdGhpcy5hYm9ydCA9IG51bGxcbiAgICB0aGlzLmNvbnRleHQgPSBudWxsXG5cbiAgICBhZGRTaWduYWwodGhpcywgc2lnbmFsKVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCwgY29udGV4dCkge1xuICAgIGlmICh0aGlzLnJlYXNvbikge1xuICAgICAgYWJvcnQodGhpcy5yZWFzb24pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhc3NlcnQodGhpcy5jYWxsYmFjaylcblxuICAgIHRoaXMuYWJvcnQgPSBhYm9ydFxuICAgIHRoaXMuY29udGV4dCA9IG51bGxcbiAgfVxuXG4gIG9uSGVhZGVycyAoKSB7XG4gICAgdGhyb3cgbmV3IFNvY2tldEVycm9yKCdiYWQgdXBncmFkZScsIG51bGwpXG4gIH1cblxuICBvblVwZ3JhZGUgKHN0YXR1c0NvZGUsIHJhd0hlYWRlcnMsIHNvY2tldCkge1xuICAgIGFzc2VydChzdGF0dXNDb2RlID09PSAxMDEpXG5cbiAgICBjb25zdCB7IGNhbGxiYWNrLCBvcGFxdWUsIGNvbnRleHQgfSA9IHRoaXNcblxuICAgIHJlbW92ZVNpZ25hbCh0aGlzKVxuXG4gICAgdGhpcy5jYWxsYmFjayA9IG51bGxcbiAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5yZXNwb25zZUhlYWRlcnMgPT09ICdyYXcnID8gdXRpbC5wYXJzZVJhd0hlYWRlcnMocmF3SGVhZGVycykgOiB1dGlsLnBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKVxuICAgIHRoaXMucnVuSW5Bc3luY1Njb3BlKGNhbGxiYWNrLCBudWxsLCBudWxsLCB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgc29ja2V0LFxuICAgICAgb3BhcXVlLFxuICAgICAgY29udGV4dFxuICAgIH0pXG4gIH1cblxuICBvbkVycm9yIChlcnIpIHtcbiAgICBjb25zdCB7IGNhbGxiYWNrLCBvcGFxdWUgfSA9IHRoaXNcblxuICAgIHJlbW92ZVNpZ25hbCh0aGlzKVxuXG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLmNhbGxiYWNrID0gbnVsbFxuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICB0aGlzLnJ1bkluQXN5bmNTY29wZShjYWxsYmFjaywgbnVsbCwgZXJyLCB7IG9wYXF1ZSB9KVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBncmFkZSAob3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdXBncmFkZS5jYWxsKHRoaXMsIG9wdHMsIChlcnIsIGRhdGEpID0+IHtcbiAgICAgICAgcmV0dXJuIGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZShkYXRhKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB1cGdyYWRlSGFuZGxlciA9IG5ldyBVcGdyYWRlSGFuZGxlcihvcHRzLCBjYWxsYmFjaylcbiAgICB0aGlzLmRpc3BhdGNoKHtcbiAgICAgIC4uLm9wdHMsXG4gICAgICBtZXRob2Q6IG9wdHMubWV0aG9kIHx8ICdHRVQnLFxuICAgICAgdXBncmFkZTogb3B0cy5wcm90b2NvbCB8fCAnV2Vic29ja2V0J1xuICAgIH0sIHVwZ3JhZGVIYW5kbGVyKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG4gICAgY29uc3Qgb3BhcXVlID0gb3B0cz8ub3BhcXVlXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2FsbGJhY2soZXJyLCB7IG9wYXF1ZSB9KSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHVwZ3JhZGVcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdub2RlOmFzc2VydCcpXG5jb25zdCB7IEFzeW5jUmVzb3VyY2UgfSA9IHJlcXVpcmUoJ25vZGU6YXN5bmNfaG9va3MnKVxuY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciwgU29ja2V0RXJyb3IgfSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBhZGRTaWduYWwsIHJlbW92ZVNpZ25hbCB9ID0gcmVxdWlyZSgnLi9hYm9ydC1zaWduYWwnKVxuXG5jbGFzcyBDb25uZWN0SGFuZGxlciBleHRlbmRzIEFzeW5jUmVzb3VyY2Uge1xuICBjb25zdHJ1Y3RvciAob3B0cywgY2FsbGJhY2spIHtcbiAgICBpZiAoIW9wdHMgfHwgdHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgb3B0cycpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGNhbGxiYWNrJylcbiAgICB9XG5cbiAgICBjb25zdCB7IHNpZ25hbCwgb3BhcXVlLCByZXNwb25zZUhlYWRlcnMgfSA9IG9wdHNcblxuICAgIGlmIChzaWduYWwgJiYgdHlwZW9mIHNpZ25hbC5vbiAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignc2lnbmFsIG11c3QgYmUgYW4gRXZlbnRFbWl0dGVyIG9yIEV2ZW50VGFyZ2V0JylcbiAgICB9XG5cbiAgICBzdXBlcignVU5ESUNJX0NPTk5FQ1QnKVxuXG4gICAgdGhpcy5vcGFxdWUgPSBvcGFxdWUgfHwgbnVsbFxuICAgIHRoaXMucmVzcG9uc2VIZWFkZXJzID0gcmVzcG9uc2VIZWFkZXJzIHx8IG51bGxcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2tcbiAgICB0aGlzLmFib3J0ID0gbnVsbFxuXG4gICAgYWRkU2lnbmFsKHRoaXMsIHNpZ25hbClcbiAgfVxuXG4gIG9uQ29ubmVjdCAoYWJvcnQsIGNvbnRleHQpIHtcbiAgICBpZiAodGhpcy5yZWFzb24pIHtcbiAgICAgIGFib3J0KHRoaXMucmVhc29uKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXNzZXJ0KHRoaXMuY2FsbGJhY2spXG5cbiAgICB0aGlzLmFib3J0ID0gYWJvcnRcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0XG4gIH1cblxuICBvbkhlYWRlcnMgKCkge1xuICAgIHRocm93IG5ldyBTb2NrZXRFcnJvcignYmFkIGNvbm5lY3QnLCBudWxsKVxuICB9XG5cbiAgb25VcGdyYWRlIChzdGF0dXNDb2RlLCByYXdIZWFkZXJzLCBzb2NrZXQpIHtcbiAgICBjb25zdCB7IGNhbGxiYWNrLCBvcGFxdWUsIGNvbnRleHQgfSA9IHRoaXNcblxuICAgIHJlbW92ZVNpZ25hbCh0aGlzKVxuXG4gICAgdGhpcy5jYWxsYmFjayA9IG51bGxcblxuICAgIGxldCBoZWFkZXJzID0gcmF3SGVhZGVyc1xuICAgIC8vIEluZGljYXRlcyBpcyBhbiBIVFRQMlNlc3Npb25cbiAgICBpZiAoaGVhZGVycyAhPSBudWxsKSB7XG4gICAgICBoZWFkZXJzID0gdGhpcy5yZXNwb25zZUhlYWRlcnMgPT09ICdyYXcnID8gdXRpbC5wYXJzZVJhd0hlYWRlcnMocmF3SGVhZGVycykgOiB1dGlsLnBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKVxuICAgIH1cblxuICAgIHRoaXMucnVuSW5Bc3luY1Njb3BlKGNhbGxiYWNrLCBudWxsLCBudWxsLCB7XG4gICAgICBzdGF0dXNDb2RlLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHNvY2tldCxcbiAgICAgIG9wYXF1ZSxcbiAgICAgIGNvbnRleHRcbiAgICB9KVxuICB9XG5cbiAgb25FcnJvciAoZXJyKSB7XG4gICAgY29uc3QgeyBjYWxsYmFjaywgb3BhcXVlIH0gPSB0aGlzXG5cbiAgICByZW1vdmVTaWduYWwodGhpcylcblxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgdGhpcy5jYWxsYmFjayA9IG51bGxcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5ydW5JbkFzeW5jU2NvcGUoY2FsbGJhY2ssIG51bGwsIGVyciwgeyBvcGFxdWUgfSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbm5lY3QgKG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbm5lY3QuY2FsbCh0aGlzLCBvcHRzLCAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgIHJldHVybiBlcnIgPyByZWplY3QoZXJyKSA6IHJlc29sdmUoZGF0YSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgY29ubmVjdEhhbmRsZXIgPSBuZXcgQ29ubmVjdEhhbmRsZXIob3B0cywgY2FsbGJhY2spXG4gICAgdGhpcy5kaXNwYXRjaCh7IC4uLm9wdHMsIG1ldGhvZDogJ0NPTk5FQ1QnIH0sIGNvbm5lY3RIYW5kbGVyKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG4gICAgY29uc3Qgb3BhcXVlID0gb3B0cz8ub3BhcXVlXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2FsbGJhY2soZXJyLCB7IG9wYXF1ZSB9KSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbm5lY3RcbiIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cy5yZXF1ZXN0ID0gcmVxdWlyZSgnLi9hcGktcmVxdWVzdCcpXG5tb2R1bGUuZXhwb3J0cy5zdHJlYW0gPSByZXF1aXJlKCcuL2FwaS1zdHJlYW0nKVxubW9kdWxlLmV4cG9ydHMucGlwZWxpbmUgPSByZXF1aXJlKCcuL2FwaS1waXBlbGluZScpXG5tb2R1bGUuZXhwb3J0cy51cGdyYWRlID0gcmVxdWlyZSgnLi9hcGktdXBncmFkZScpXG5tb2R1bGUuZXhwb3J0cy5jb25uZWN0ID0gcmVxdWlyZSgnLi9hcGktY29ubmVjdCcpXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBVbmRpY2lFcnJvciB9ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMnKVxuXG5jb25zdCBrTW9ja05vdE1hdGNoZWRFcnJvciA9IFN5bWJvbC5mb3IoJ3VuZGljaS5lcnJvci5VTkRfTU9DS19FUlJfTU9DS19OT1RfTUFUQ0hFRCcpXG5cbi8qKlxuICogVGhlIHJlcXVlc3QgZG9lcyBub3QgbWF0Y2ggYW55IHJlZ2lzdGVyZWQgbW9jayBkaXNwYXRjaGVzLlxuICovXG5jbGFzcyBNb2NrTm90TWF0Y2hlZEVycm9yIGV4dGVuZHMgVW5kaWNpRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgTW9ja05vdE1hdGNoZWRFcnJvcilcbiAgICB0aGlzLm5hbWUgPSAnTW9ja05vdE1hdGNoZWRFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdUaGUgcmVxdWVzdCBkb2VzIG5vdCBtYXRjaCBhbnkgcmVnaXN0ZXJlZCBtb2NrIGRpc3BhdGNoZXMnXG4gICAgdGhpcy5jb2RlID0gJ1VORF9NT0NLX0VSUl9NT0NLX05PVF9NQVRDSEVEJ1xuICB9XG5cbiAgc3RhdGljIFtTeW1ib2wuaGFzSW5zdGFuY2VdIChpbnN0YW5jZSkge1xuICAgIHJldHVybiBpbnN0YW5jZSAmJiBpbnN0YW5jZVtrTW9ja05vdE1hdGNoZWRFcnJvcl0gPT09IHRydWVcbiAgfVxuXG4gIFtrTW9ja05vdE1hdGNoZWRFcnJvcl0gPSB0cnVlXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBNb2NrTm90TWF0Y2hlZEVycm9yXG59XG4iLCIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGtBZ2VudDogU3ltYm9sKCdhZ2VudCcpLFxuICBrT3B0aW9uczogU3ltYm9sKCdvcHRpb25zJyksXG4gIGtGYWN0b3J5OiBTeW1ib2woJ2ZhY3RvcnknKSxcbiAga0Rpc3BhdGNoZXM6IFN5bWJvbCgnZGlzcGF0Y2hlcycpLFxuICBrRGlzcGF0Y2hLZXk6IFN5bWJvbCgnZGlzcGF0Y2gga2V5JyksXG4gIGtEZWZhdWx0SGVhZGVyczogU3ltYm9sKCdkZWZhdWx0IGhlYWRlcnMnKSxcbiAga0RlZmF1bHRUcmFpbGVyczogU3ltYm9sKCdkZWZhdWx0IHRyYWlsZXJzJyksXG4gIGtDb250ZW50TGVuZ3RoOiBTeW1ib2woJ2NvbnRlbnQgbGVuZ3RoJyksXG4gIGtNb2NrQWdlbnQ6IFN5bWJvbCgnbW9jayBhZ2VudCcpLFxuICBrTW9ja0FnZW50U2V0OiBTeW1ib2woJ21vY2sgYWdlbnQgc2V0JyksXG4gIGtNb2NrQWdlbnRHZXQ6IFN5bWJvbCgnbW9jayBhZ2VudCBnZXQnKSxcbiAga01vY2tEaXNwYXRjaDogU3ltYm9sKCdtb2NrIGRpc3BhdGNoJyksXG4gIGtDbG9zZTogU3ltYm9sKCdjbG9zZScpLFxuICBrT3JpZ2luYWxDbG9zZTogU3ltYm9sKCdvcmlnaW5hbCBhZ2VudCBjbG9zZScpLFxuICBrT3JpZ2luOiBTeW1ib2woJ29yaWdpbicpLFxuICBrSXNNb2NrQWN0aXZlOiBTeW1ib2woJ2lzIG1vY2sgYWN0aXZlJyksXG4gIGtOZXRDb25uZWN0OiBTeW1ib2woJ25ldCBjb25uZWN0JyksXG4gIGtHZXROZXRDb25uZWN0OiBTeW1ib2woJ2dldCBuZXQgY29ubmVjdCcpLFxuICBrQ29ubmVjdGVkOiBTeW1ib2woJ2Nvbm5lY3RlZCcpXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBNb2NrTm90TWF0Y2hlZEVycm9yIH0gPSByZXF1aXJlKCcuL21vY2stZXJyb3JzJylcbmNvbnN0IHtcbiAga0Rpc3BhdGNoZXMsXG4gIGtNb2NrQWdlbnQsXG4gIGtPcmlnaW5hbERpc3BhdGNoLFxuICBrT3JpZ2luLFxuICBrR2V0TmV0Q29ubmVjdFxufSA9IHJlcXVpcmUoJy4vbW9jay1zeW1ib2xzJylcbmNvbnN0IHsgYnVpbGRVUkwgfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5jb25zdCB7IFNUQVRVU19DT0RFUyB9ID0gcmVxdWlyZSgnbm9kZTpodHRwJylcbmNvbnN0IHtcbiAgdHlwZXM6IHtcbiAgICBpc1Byb21pc2VcbiAgfVxufSA9IHJlcXVpcmUoJ25vZGU6dXRpbCcpXG5cbmZ1bmN0aW9uIG1hdGNoVmFsdWUgKG1hdGNoLCB2YWx1ZSkge1xuICBpZiAodHlwZW9mIG1hdGNoID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBtYXRjaCA9PT0gdmFsdWVcbiAgfVxuICBpZiAobWF0Y2ggaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICByZXR1cm4gbWF0Y2gudGVzdCh2YWx1ZSlcbiAgfVxuICBpZiAodHlwZW9mIG1hdGNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG1hdGNoKHZhbHVlKSA9PT0gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBsb3dlckNhc2VFbnRyaWVzIChoZWFkZXJzKSB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMoaGVhZGVycykubWFwKChbaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWVdKSA9PiB7XG4gICAgICByZXR1cm4gW2hlYWRlck5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKSwgaGVhZGVyVmFsdWVdXG4gICAgfSlcbiAgKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi8uLi9pbmRleCcpLkhlYWRlcnN8c3RyaW5nW118UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gaGVhZGVyc1xuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICovXG5mdW5jdGlvbiBnZXRIZWFkZXJCeU5hbWUgKGhlYWRlcnMsIGtleSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgaWYgKGhlYWRlcnNbaV0udG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0ga2V5LnRvTG9jYWxlTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgcmV0dXJuIGhlYWRlcnNbaSArIDFdXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9IGVsc2UgaWYgKHR5cGVvZiBoZWFkZXJzLmdldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBoZWFkZXJzLmdldChrZXkpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxvd2VyQ2FzZUVudHJpZXMoaGVhZGVycylba2V5LnRvTG9jYWxlTG93ZXJDYXNlKCldXG4gIH1cbn1cblxuLyoqIEBwYXJhbSB7c3RyaW5nW119IGhlYWRlcnMgKi9cbmZ1bmN0aW9uIGJ1aWxkSGVhZGVyc0Zyb21BcnJheSAoaGVhZGVycykgeyAvLyBmZXRjaCBIZWFkZXJzTGlzdFxuICBjb25zdCBjbG9uZSA9IGhlYWRlcnMuc2xpY2UoKVxuICBjb25zdCBlbnRyaWVzID0gW11cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNsb25lLmxlbmd0aDsgaW5kZXggKz0gMikge1xuICAgIGVudHJpZXMucHVzaChbY2xvbmVbaW5kZXhdLCBjbG9uZVtpbmRleCArIDFdXSlcbiAgfVxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMpXG59XG5cbmZ1bmN0aW9uIG1hdGNoSGVhZGVycyAobW9ja0Rpc3BhdGNoLCBoZWFkZXJzKSB7XG4gIGlmICh0eXBlb2YgbW9ja0Rpc3BhdGNoLmhlYWRlcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkgeyAvLyBmZXRjaCBIZWFkZXJzTGlzdFxuICAgICAgaGVhZGVycyA9IGJ1aWxkSGVhZGVyc0Zyb21BcnJheShoZWFkZXJzKVxuICAgIH1cbiAgICByZXR1cm4gbW9ja0Rpc3BhdGNoLmhlYWRlcnMoaGVhZGVycyA/IGxvd2VyQ2FzZUVudHJpZXMoaGVhZGVycykgOiB7fSlcbiAgfVxuICBpZiAodHlwZW9mIG1vY2tEaXNwYXRjaC5oZWFkZXJzID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgaWYgKHR5cGVvZiBoZWFkZXJzICE9PSAnb2JqZWN0JyB8fCB0eXBlb2YgbW9ja0Rpc3BhdGNoLmhlYWRlcnMgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBmb3IgKGNvbnN0IFttYXRjaEhlYWRlck5hbWUsIG1hdGNoSGVhZGVyVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG1vY2tEaXNwYXRjaC5oZWFkZXJzKSkge1xuICAgIGNvbnN0IGhlYWRlclZhbHVlID0gZ2V0SGVhZGVyQnlOYW1lKGhlYWRlcnMsIG1hdGNoSGVhZGVyTmFtZSlcblxuICAgIGlmICghbWF0Y2hWYWx1ZShtYXRjaEhlYWRlclZhbHVlLCBoZWFkZXJWYWx1ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG5mdW5jdGlvbiBzYWZlVXJsIChwYXRoKSB7XG4gIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcGF0aFxuICB9XG5cbiAgY29uc3QgcGF0aFNlZ21lbnRzID0gcGF0aC5zcGxpdCgnPycpXG5cbiAgaWYgKHBhdGhTZWdtZW50cy5sZW5ndGggIT09IDIpIHtcbiAgICByZXR1cm4gcGF0aFxuICB9XG5cbiAgY29uc3QgcXAgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHBhdGhTZWdtZW50cy5wb3AoKSlcbiAgcXAuc29ydCgpXG4gIHJldHVybiBbLi4ucGF0aFNlZ21lbnRzLCBxcC50b1N0cmluZygpXS5qb2luKCc/Jylcbn1cblxuZnVuY3Rpb24gbWF0Y2hLZXkgKG1vY2tEaXNwYXRjaCwgeyBwYXRoLCBtZXRob2QsIGJvZHksIGhlYWRlcnMgfSkge1xuICBjb25zdCBwYXRoTWF0Y2ggPSBtYXRjaFZhbHVlKG1vY2tEaXNwYXRjaC5wYXRoLCBwYXRoKVxuICBjb25zdCBtZXRob2RNYXRjaCA9IG1hdGNoVmFsdWUobW9ja0Rpc3BhdGNoLm1ldGhvZCwgbWV0aG9kKVxuICBjb25zdCBib2R5TWF0Y2ggPSB0eXBlb2YgbW9ja0Rpc3BhdGNoLmJvZHkgIT09ICd1bmRlZmluZWQnID8gbWF0Y2hWYWx1ZShtb2NrRGlzcGF0Y2guYm9keSwgYm9keSkgOiB0cnVlXG4gIGNvbnN0IGhlYWRlcnNNYXRjaCA9IG1hdGNoSGVhZGVycyhtb2NrRGlzcGF0Y2gsIGhlYWRlcnMpXG4gIHJldHVybiBwYXRoTWF0Y2ggJiYgbWV0aG9kTWF0Y2ggJiYgYm9keU1hdGNoICYmIGhlYWRlcnNNYXRjaFxufVxuXG5mdW5jdGlvbiBnZXRSZXNwb25zZURhdGEgKGRhdGEpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSkge1xuICAgIHJldHVybiBkYXRhXG4gIH0gZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICByZXR1cm4gZGF0YVxuICB9IGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBkYXRhXG4gIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE1vY2tEaXNwYXRjaCAobW9ja0Rpc3BhdGNoZXMsIGtleSkge1xuICBjb25zdCBiYXNlUGF0aCA9IGtleS5xdWVyeSA/IGJ1aWxkVVJMKGtleS5wYXRoLCBrZXkucXVlcnkpIDoga2V5LnBhdGhcbiAgY29uc3QgcmVzb2x2ZWRQYXRoID0gdHlwZW9mIGJhc2VQYXRoID09PSAnc3RyaW5nJyA/IHNhZmVVcmwoYmFzZVBhdGgpIDogYmFzZVBhdGhcblxuICAvLyBNYXRjaCBwYXRoXG4gIGxldCBtYXRjaGVkTW9ja0Rpc3BhdGNoZXMgPSBtb2NrRGlzcGF0Y2hlcy5maWx0ZXIoKHsgY29uc3VtZWQgfSkgPT4gIWNvbnN1bWVkKS5maWx0ZXIoKHsgcGF0aCB9KSA9PiBtYXRjaFZhbHVlKHNhZmVVcmwocGF0aCksIHJlc29sdmVkUGF0aCkpXG4gIGlmIChtYXRjaGVkTW9ja0Rpc3BhdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IE1vY2tOb3RNYXRjaGVkRXJyb3IoYE1vY2sgZGlzcGF0Y2ggbm90IG1hdGNoZWQgZm9yIHBhdGggJyR7cmVzb2x2ZWRQYXRofSdgKVxuICB9XG5cbiAgLy8gTWF0Y2ggbWV0aG9kXG4gIG1hdGNoZWRNb2NrRGlzcGF0Y2hlcyA9IG1hdGNoZWRNb2NrRGlzcGF0Y2hlcy5maWx0ZXIoKHsgbWV0aG9kIH0pID0+IG1hdGNoVmFsdWUobWV0aG9kLCBrZXkubWV0aG9kKSlcbiAgaWYgKG1hdGNoZWRNb2NrRGlzcGF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgTW9ja05vdE1hdGNoZWRFcnJvcihgTW9jayBkaXNwYXRjaCBub3QgbWF0Y2hlZCBmb3IgbWV0aG9kICcke2tleS5tZXRob2R9JyBvbiBwYXRoICcke3Jlc29sdmVkUGF0aH0nYClcbiAgfVxuXG4gIC8vIE1hdGNoIGJvZHlcbiAgbWF0Y2hlZE1vY2tEaXNwYXRjaGVzID0gbWF0Y2hlZE1vY2tEaXNwYXRjaGVzLmZpbHRlcigoeyBib2R5IH0pID0+IHR5cGVvZiBib2R5ICE9PSAndW5kZWZpbmVkJyA/IG1hdGNoVmFsdWUoYm9keSwga2V5LmJvZHkpIDogdHJ1ZSlcbiAgaWYgKG1hdGNoZWRNb2NrRGlzcGF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgTW9ja05vdE1hdGNoZWRFcnJvcihgTW9jayBkaXNwYXRjaCBub3QgbWF0Y2hlZCBmb3IgYm9keSAnJHtrZXkuYm9keX0nIG9uIHBhdGggJyR7cmVzb2x2ZWRQYXRofSdgKVxuICB9XG5cbiAgLy8gTWF0Y2ggaGVhZGVyc1xuICBtYXRjaGVkTW9ja0Rpc3BhdGNoZXMgPSBtYXRjaGVkTW9ja0Rpc3BhdGNoZXMuZmlsdGVyKChtb2NrRGlzcGF0Y2gpID0+IG1hdGNoSGVhZGVycyhtb2NrRGlzcGF0Y2gsIGtleS5oZWFkZXJzKSlcbiAgaWYgKG1hdGNoZWRNb2NrRGlzcGF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICBjb25zdCBoZWFkZXJzID0gdHlwZW9mIGtleS5oZWFkZXJzID09PSAnb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGtleS5oZWFkZXJzKSA6IGtleS5oZWFkZXJzXG4gICAgdGhyb3cgbmV3IE1vY2tOb3RNYXRjaGVkRXJyb3IoYE1vY2sgZGlzcGF0Y2ggbm90IG1hdGNoZWQgZm9yIGhlYWRlcnMgJyR7aGVhZGVyc30nIG9uIHBhdGggJyR7cmVzb2x2ZWRQYXRofSdgKVxuICB9XG5cbiAgcmV0dXJuIG1hdGNoZWRNb2NrRGlzcGF0Y2hlc1swXVxufVxuXG5mdW5jdGlvbiBhZGRNb2NrRGlzcGF0Y2ggKG1vY2tEaXNwYXRjaGVzLCBrZXksIGRhdGEpIHtcbiAgY29uc3QgYmFzZURhdGEgPSB7IHRpbWVzSW52b2tlZDogMCwgdGltZXM6IDEsIHBlcnNpc3Q6IGZhbHNlLCBjb25zdW1lZDogZmFsc2UgfVxuICBjb25zdCByZXBseURhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJyA/IHsgY2FsbGJhY2s6IGRhdGEgfSA6IHsgLi4uZGF0YSB9XG4gIGNvbnN0IG5ld01vY2tEaXNwYXRjaCA9IHsgLi4uYmFzZURhdGEsIC4uLmtleSwgcGVuZGluZzogdHJ1ZSwgZGF0YTogeyBlcnJvcjogbnVsbCwgLi4ucmVwbHlEYXRhIH0gfVxuICBtb2NrRGlzcGF0Y2hlcy5wdXNoKG5ld01vY2tEaXNwYXRjaClcbiAgcmV0dXJuIG5ld01vY2tEaXNwYXRjaFxufVxuXG5mdW5jdGlvbiBkZWxldGVNb2NrRGlzcGF0Y2ggKG1vY2tEaXNwYXRjaGVzLCBrZXkpIHtcbiAgY29uc3QgaW5kZXggPSBtb2NrRGlzcGF0Y2hlcy5maW5kSW5kZXgoZGlzcGF0Y2ggPT4ge1xuICAgIGlmICghZGlzcGF0Y2guY29uc3VtZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hLZXkoZGlzcGF0Y2gsIGtleSlcbiAgfSlcbiAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgIG1vY2tEaXNwYXRjaGVzLnNwbGljZShpbmRleCwgMSlcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZEtleSAob3B0cykge1xuICBjb25zdCB7IHBhdGgsIG1ldGhvZCwgYm9keSwgaGVhZGVycywgcXVlcnkgfSA9IG9wdHNcbiAgcmV0dXJuIHtcbiAgICBwYXRoLFxuICAgIG1ldGhvZCxcbiAgICBib2R5LFxuICAgIGhlYWRlcnMsXG4gICAgcXVlcnlcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUtleVZhbHVlcyAoZGF0YSkge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSlcbiAgY29uc3QgcmVzdWx0ID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3Qga2V5ID0ga2V5c1tpXVxuICAgIGNvbnN0IHZhbHVlID0gZGF0YVtrZXldXG4gICAgY29uc3QgbmFtZSA9IEJ1ZmZlci5mcm9tKGAke2tleX1gKVxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB2YWx1ZS5sZW5ndGg7ICsraikge1xuICAgICAgICByZXN1bHQucHVzaChuYW1lLCBCdWZmZXIuZnJvbShgJHt2YWx1ZVtqXX1gKSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnB1c2gobmFtZSwgQnVmZmVyLmZyb20oYCR7dmFsdWV9YCkpXG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvU3RhdHVzXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhdHVzQ29kZVxuICovXG5mdW5jdGlvbiBnZXRTdGF0dXNUZXh0IChzdGF0dXNDb2RlKSB7XG4gIHJldHVybiBTVEFUVVNfQ09ERVNbc3RhdHVzQ29kZV0gfHwgJ3Vua25vd24nXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFJlc3BvbnNlIChib2R5KSB7XG4gIGNvbnN0IGJ1ZmZlcnMgPSBbXVxuICBmb3IgYXdhaXQgKGNvbnN0IGRhdGEgb2YgYm9keSkge1xuICAgIGJ1ZmZlcnMucHVzaChkYXRhKVxuICB9XG4gIHJldHVybiBCdWZmZXIuY29uY2F0KGJ1ZmZlcnMpLnRvU3RyaW5nKCd1dGY4Jylcbn1cblxuLyoqXG4gKiBNb2NrIGRpc3BhdGNoIGZ1bmN0aW9uIHVzZWQgdG8gc2ltdWxhdGUgdW5kaWNpIGRpc3BhdGNoZXNcbiAqL1xuZnVuY3Rpb24gbW9ja0Rpc3BhdGNoIChvcHRzLCBoYW5kbGVyKSB7XG4gIC8vIEdldCBtb2NrIGRpc3BhdGNoIGZyb20gYnVpbHQga2V5XG4gIGNvbnN0IGtleSA9IGJ1aWxkS2V5KG9wdHMpXG4gIGNvbnN0IG1vY2tEaXNwYXRjaCA9IGdldE1vY2tEaXNwYXRjaCh0aGlzW2tEaXNwYXRjaGVzXSwga2V5KVxuXG4gIG1vY2tEaXNwYXRjaC50aW1lc0ludm9rZWQrK1xuXG4gIC8vIEhlcmUncyB3aGVyZSB3ZSByZXNvbHZlIGEgY2FsbGJhY2sgaWYgYSBjYWxsYmFjayBpcyBwcmVzZW50IGZvciB0aGUgZGlzcGF0Y2ggZGF0YS5cbiAgaWYgKG1vY2tEaXNwYXRjaC5kYXRhLmNhbGxiYWNrKSB7XG4gICAgbW9ja0Rpc3BhdGNoLmRhdGEgPSB7IC4uLm1vY2tEaXNwYXRjaC5kYXRhLCAuLi5tb2NrRGlzcGF0Y2guZGF0YS5jYWxsYmFjayhvcHRzKSB9XG4gIH1cblxuICAvLyBQYXJzZSBtb2NrRGlzcGF0Y2ggZGF0YVxuICBjb25zdCB7IGRhdGE6IHsgc3RhdHVzQ29kZSwgZGF0YSwgaGVhZGVycywgdHJhaWxlcnMsIGVycm9yIH0sIGRlbGF5LCBwZXJzaXN0IH0gPSBtb2NrRGlzcGF0Y2hcbiAgY29uc3QgeyB0aW1lc0ludm9rZWQsIHRpbWVzIH0gPSBtb2NrRGlzcGF0Y2hcblxuICAvLyBJZiBpdCdzIHVzZWQgdXAgYW5kIG5vdCBwZXJzaXN0ZW50LCBtYXJrIGFzIGNvbnN1bWVkXG4gIG1vY2tEaXNwYXRjaC5jb25zdW1lZCA9ICFwZXJzaXN0ICYmIHRpbWVzSW52b2tlZCA+PSB0aW1lc1xuICBtb2NrRGlzcGF0Y2gucGVuZGluZyA9IHRpbWVzSW52b2tlZCA8IHRpbWVzXG5cbiAgLy8gSWYgc3BlY2lmaWVkLCB0cmlnZ2VyIGRpc3BhdGNoIGVycm9yXG4gIGlmIChlcnJvciAhPT0gbnVsbCkge1xuICAgIGRlbGV0ZU1vY2tEaXNwYXRjaCh0aGlzW2tEaXNwYXRjaGVzXSwga2V5KVxuICAgIGhhbmRsZXIub25FcnJvcihlcnJvcilcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gSGFuZGxlIHRoZSByZXF1ZXN0IHdpdGggYSBkZWxheSBpZiBuZWNlc3NhcnlcbiAgaWYgKHR5cGVvZiBkZWxheSA9PT0gJ251bWJlcicgJiYgZGVsYXkgPiAwKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBoYW5kbGVSZXBseSh0aGlzW2tEaXNwYXRjaGVzXSlcbiAgICB9LCBkZWxheSlcbiAgfSBlbHNlIHtcbiAgICBoYW5kbGVSZXBseSh0aGlzW2tEaXNwYXRjaGVzXSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZVJlcGx5IChtb2NrRGlzcGF0Y2hlcywgX2RhdGEgPSBkYXRhKSB7XG4gICAgLy8gZmV0Y2gncyBIZWFkZXJzTGlzdCBpcyBhIDFEIHN0cmluZyBhcnJheVxuICAgIGNvbnN0IG9wdHNIZWFkZXJzID0gQXJyYXkuaXNBcnJheShvcHRzLmhlYWRlcnMpXG4gICAgICA/IGJ1aWxkSGVhZGVyc0Zyb21BcnJheShvcHRzLmhlYWRlcnMpXG4gICAgICA6IG9wdHMuaGVhZGVyc1xuICAgIGNvbnN0IGJvZHkgPSB0eXBlb2YgX2RhdGEgPT09ICdmdW5jdGlvbidcbiAgICAgID8gX2RhdGEoeyAuLi5vcHRzLCBoZWFkZXJzOiBvcHRzSGVhZGVycyB9KVxuICAgICAgOiBfZGF0YVxuXG4gICAgLy8gdXRpbC50eXBlcy5pc1Byb21pc2UgaXMgbGlrZWx5IG5lZWRlZCBmb3IgamVzdC5cbiAgICBpZiAoaXNQcm9taXNlKGJvZHkpKSB7XG4gICAgICAvLyBJZiBoYW5kbGVSZXBseSBpcyBhc3luY2hyb25vdXMsIHRocm93aW5nIGFuIGVycm9yXG4gICAgICAvLyBpbiB0aGUgY2FsbGJhY2sgd2lsbCByZWplY3QgdGhlIHByb21pc2UsIHJhdGhlciB0aGFuXG4gICAgICAvLyBzeW5jaHJvbm91c2x5IHRocm93IHRoZSBlcnJvciwgd2hpY2ggYnJlYWtzIHNvbWUgdGVzdHMuXG4gICAgICAvLyBSYXRoZXIsIHdlIHdhaXQgZm9yIHRoZSBjYWxsYmFjayB0byByZXNvbHZlIGlmIGl0IGlzIGFcbiAgICAgIC8vIHByb21pc2UsIGFuZCB0aGVuIHJlLXJ1biBoYW5kbGVSZXBseSB3aXRoIHRoZSBuZXcgYm9keS5cbiAgICAgIGJvZHkudGhlbigobmV3RGF0YSkgPT4gaGFuZGxlUmVwbHkobW9ja0Rpc3BhdGNoZXMsIG5ld0RhdGEpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2VEYXRhID0gZ2V0UmVzcG9uc2VEYXRhKGJvZHkpXG4gICAgY29uc3QgcmVzcG9uc2VIZWFkZXJzID0gZ2VuZXJhdGVLZXlWYWx1ZXMoaGVhZGVycylcbiAgICBjb25zdCByZXNwb25zZVRyYWlsZXJzID0gZ2VuZXJhdGVLZXlWYWx1ZXModHJhaWxlcnMpXG5cbiAgICBoYW5kbGVyLm9uQ29ubmVjdD8uKGVyciA9PiBoYW5kbGVyLm9uRXJyb3IoZXJyKSwgbnVsbClcbiAgICBoYW5kbGVyLm9uSGVhZGVycz8uKHN0YXR1c0NvZGUsIHJlc3BvbnNlSGVhZGVycywgcmVzdW1lLCBnZXRTdGF0dXNUZXh0KHN0YXR1c0NvZGUpKVxuICAgIGhhbmRsZXIub25EYXRhPy4oQnVmZmVyLmZyb20ocmVzcG9uc2VEYXRhKSlcbiAgICBoYW5kbGVyLm9uQ29tcGxldGU/LihyZXNwb25zZVRyYWlsZXJzKVxuICAgIGRlbGV0ZU1vY2tEaXNwYXRjaChtb2NrRGlzcGF0Y2hlcywga2V5KVxuICB9XG5cbiAgZnVuY3Rpb24gcmVzdW1lICgpIHt9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gYnVpbGRNb2NrRGlzcGF0Y2ggKCkge1xuICBjb25zdCBhZ2VudCA9IHRoaXNba01vY2tBZ2VudF1cbiAgY29uc3Qgb3JpZ2luID0gdGhpc1trT3JpZ2luXVxuICBjb25zdCBvcmlnaW5hbERpc3BhdGNoID0gdGhpc1trT3JpZ2luYWxEaXNwYXRjaF1cblxuICByZXR1cm4gZnVuY3Rpb24gZGlzcGF0Y2ggKG9wdHMsIGhhbmRsZXIpIHtcbiAgICBpZiAoYWdlbnQuaXNNb2NrQWN0aXZlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBtb2NrRGlzcGF0Y2guY2FsbCh0aGlzLCBvcHRzLCBoYW5kbGVyKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTW9ja05vdE1hdGNoZWRFcnJvcikge1xuICAgICAgICAgIGNvbnN0IG5ldENvbm5lY3QgPSBhZ2VudFtrR2V0TmV0Q29ubmVjdF0oKVxuICAgICAgICAgIGlmIChuZXRDb25uZWN0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1vY2tOb3RNYXRjaGVkRXJyb3IoYCR7ZXJyb3IubWVzc2FnZX06IHN1YnNlcXVlbnQgcmVxdWVzdCB0byBvcmlnaW4gJHtvcmlnaW59IHdhcyBub3QgYWxsb3dlZCAobmV0LmNvbm5lY3QgZGlzYWJsZWQpYClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNoZWNrTmV0Q29ubmVjdChuZXRDb25uZWN0LCBvcmlnaW4pKSB7XG4gICAgICAgICAgICBvcmlnaW5hbERpc3BhdGNoLmNhbGwodGhpcywgb3B0cywgaGFuZGxlcilcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1vY2tOb3RNYXRjaGVkRXJyb3IoYCR7ZXJyb3IubWVzc2FnZX06IHN1YnNlcXVlbnQgcmVxdWVzdCB0byBvcmlnaW4gJHtvcmlnaW59IHdhcyBub3QgYWxsb3dlZCAobmV0LmNvbm5lY3QgaXMgbm90IGVuYWJsZWQgZm9yIHRoaXMgb3JpZ2luKWApXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb3JpZ2luYWxEaXNwYXRjaC5jYWxsKHRoaXMsIG9wdHMsIGhhbmRsZXIpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrTmV0Q29ubmVjdCAobmV0Q29ubmVjdCwgb3JpZ2luKSB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwob3JpZ2luKVxuICBpZiAobmV0Q29ubmVjdCA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiB0cnVlXG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShuZXRDb25uZWN0KSAmJiBuZXRDb25uZWN0LnNvbWUoKG1hdGNoZXIpID0+IG1hdGNoVmFsdWUobWF0Y2hlciwgdXJsLmhvc3QpKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIGJ1aWxkTW9ja09wdGlvbnMgKG9wdHMpIHtcbiAgaWYgKG9wdHMpIHtcbiAgICBjb25zdCB7IGFnZW50LCAuLi5tb2NrT3B0aW9ucyB9ID0gb3B0c1xuICAgIHJldHVybiBtb2NrT3B0aW9uc1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRSZXNwb25zZURhdGEsXG4gIGdldE1vY2tEaXNwYXRjaCxcbiAgYWRkTW9ja0Rpc3BhdGNoLFxuICBkZWxldGVNb2NrRGlzcGF0Y2gsXG4gIGJ1aWxkS2V5LFxuICBnZW5lcmF0ZUtleVZhbHVlcyxcbiAgbWF0Y2hWYWx1ZSxcbiAgZ2V0UmVzcG9uc2UsXG4gIGdldFN0YXR1c1RleHQsXG4gIG1vY2tEaXNwYXRjaCxcbiAgYnVpbGRNb2NrRGlzcGF0Y2gsXG4gIGNoZWNrTmV0Q29ubmVjdCxcbiAgYnVpbGRNb2NrT3B0aW9ucyxcbiAgZ2V0SGVhZGVyQnlOYW1lLFxuICBidWlsZEhlYWRlcnNGcm9tQXJyYXlcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IGdldFJlc3BvbnNlRGF0YSwgYnVpbGRLZXksIGFkZE1vY2tEaXNwYXRjaCB9ID0gcmVxdWlyZSgnLi9tb2NrLXV0aWxzJylcbmNvbnN0IHtcbiAga0Rpc3BhdGNoZXMsXG4gIGtEaXNwYXRjaEtleSxcbiAga0RlZmF1bHRIZWFkZXJzLFxuICBrRGVmYXVsdFRyYWlsZXJzLFxuICBrQ29udGVudExlbmd0aCxcbiAga01vY2tEaXNwYXRjaFxufSA9IHJlcXVpcmUoJy4vbW9jay1zeW1ib2xzJylcbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcbmNvbnN0IHsgYnVpbGRVUkwgfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5cbi8qKlxuICogRGVmaW5lcyB0aGUgc2NvcGUgQVBJIGZvciBhbiBpbnRlcmNlcHRvciByZXBseVxuICovXG5jbGFzcyBNb2NrU2NvcGUge1xuICBjb25zdHJ1Y3RvciAobW9ja0Rpc3BhdGNoKSB7XG4gICAgdGhpc1trTW9ja0Rpc3BhdGNoXSA9IG1vY2tEaXNwYXRjaFxuICB9XG5cbiAgLyoqXG4gICAqIERlbGF5IGEgcmVwbHkgYnkgYSBzZXQgYW1vdW50IGluIG1zLlxuICAgKi9cbiAgZGVsYXkgKHdhaXRJbk1zKSB7XG4gICAgaWYgKHR5cGVvZiB3YWl0SW5NcyAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc0ludGVnZXIod2FpdEluTXMpIHx8IHdhaXRJbk1zIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignd2FpdEluTXMgbXVzdCBiZSBhIHZhbGlkIGludGVnZXIgPiAwJylcbiAgICB9XG5cbiAgICB0aGlzW2tNb2NrRGlzcGF0Y2hdLmRlbGF5ID0gd2FpdEluTXNcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciBhIGRlZmluZWQgcmVwbHksIG5ldmVyIG1hcmsgYXMgY29uc3VtZWQuXG4gICAqL1xuICBwZXJzaXN0ICgpIHtcbiAgICB0aGlzW2tNb2NrRGlzcGF0Y2hdLnBlcnNpc3QgPSB0cnVlXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyBvbmUgdG8gZGVmaW5lIGEgcmVwbHkgZm9yIGEgc2V0IGFtb3VudCBvZiBtYXRjaGluZyByZXF1ZXN0cy5cbiAgICovXG4gIHRpbWVzIChyZXBlYXRUaW1lcykge1xuICAgIGlmICh0eXBlb2YgcmVwZWF0VGltZXMgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHJlcGVhdFRpbWVzKSB8fCByZXBlYXRUaW1lcyA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3JlcGVhdFRpbWVzIG11c3QgYmUgYSB2YWxpZCBpbnRlZ2VyID4gMCcpXG4gICAgfVxuXG4gICAgdGhpc1trTW9ja0Rpc3BhdGNoXS50aW1lcyA9IHJlcGVhdFRpbWVzXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxufVxuXG4vKipcbiAqIERlZmluZXMgYW4gaW50ZXJjZXB0b3IgZm9yIGEgTW9ja1xuICovXG5jbGFzcyBNb2NrSW50ZXJjZXB0b3Ige1xuICBjb25zdHJ1Y3RvciAob3B0cywgbW9ja0Rpc3BhdGNoZXMpIHtcbiAgICBpZiAodHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ29wdHMgbXVzdCBiZSBhbiBvYmplY3QnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIG9wdHMucGF0aCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignb3B0cy5wYXRoIG11c3QgYmUgZGVmaW5lZCcpXG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3B0cy5tZXRob2QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBvcHRzLm1ldGhvZCA9ICdHRVQnXG4gICAgfVxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9pc3N1ZXMvMTI0NVxuICAgIC8vIEFzIHBlciBSRkMgMzk4NiwgY2xpZW50cyBhcmUgbm90IHN1cHBvc2VkIHRvIHNlbmQgVVJJXG4gICAgLy8gZnJhZ21lbnRzIHRvIHNlcnZlcnMgd2hlbiB0aGV5IHJldHJpZXZlIGEgZG9jdW1lbnQsXG4gICAgaWYgKHR5cGVvZiBvcHRzLnBhdGggPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAob3B0cy5xdWVyeSkge1xuICAgICAgICBvcHRzLnBhdGggPSBidWlsZFVSTChvcHRzLnBhdGgsIG9wdHMucXVlcnkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBNYXRjaGVzIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2Jsb2IvbWFpbi9saWIvd2ViL2ZldGNoL2luZGV4LmpzI0wxODExXG4gICAgICAgIGNvbnN0IHBhcnNlZFVSTCA9IG5ldyBVUkwob3B0cy5wYXRoLCAnZGF0YTovLycpXG4gICAgICAgIG9wdHMucGF0aCA9IHBhcnNlZFVSTC5wYXRobmFtZSArIHBhcnNlZFVSTC5zZWFyY2hcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvcHRzLm1ldGhvZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG9wdHMubWV0aG9kID0gb3B0cy5tZXRob2QudG9VcHBlckNhc2UoKVxuICAgIH1cblxuICAgIHRoaXNba0Rpc3BhdGNoS2V5XSA9IGJ1aWxkS2V5KG9wdHMpXG4gICAgdGhpc1trRGlzcGF0Y2hlc10gPSBtb2NrRGlzcGF0Y2hlc1xuICAgIHRoaXNba0RlZmF1bHRIZWFkZXJzXSA9IHt9XG4gICAgdGhpc1trRGVmYXVsdFRyYWlsZXJzXSA9IHt9XG4gICAgdGhpc1trQ29udGVudExlbmd0aF0gPSBmYWxzZVxuICB9XG5cbiAgY3JlYXRlTW9ja1Njb3BlRGlzcGF0Y2hEYXRhICh7IHN0YXR1c0NvZGUsIGRhdGEsIHJlc3BvbnNlT3B0aW9ucyB9KSB7XG4gICAgY29uc3QgcmVzcG9uc2VEYXRhID0gZ2V0UmVzcG9uc2VEYXRhKGRhdGEpXG4gICAgY29uc3QgY29udGVudExlbmd0aCA9IHRoaXNba0NvbnRlbnRMZW5ndGhdID8geyAnY29udGVudC1sZW5ndGgnOiByZXNwb25zZURhdGEubGVuZ3RoIH0gOiB7fVxuICAgIGNvbnN0IGhlYWRlcnMgPSB7IC4uLnRoaXNba0RlZmF1bHRIZWFkZXJzXSwgLi4uY29udGVudExlbmd0aCwgLi4ucmVzcG9uc2VPcHRpb25zLmhlYWRlcnMgfVxuICAgIGNvbnN0IHRyYWlsZXJzID0geyAuLi50aGlzW2tEZWZhdWx0VHJhaWxlcnNdLCAuLi5yZXNwb25zZU9wdGlvbnMudHJhaWxlcnMgfVxuXG4gICAgcmV0dXJuIHsgc3RhdHVzQ29kZSwgZGF0YSwgaGVhZGVycywgdHJhaWxlcnMgfVxuICB9XG5cbiAgdmFsaWRhdGVSZXBseVBhcmFtZXRlcnMgKHJlcGx5UGFyYW1ldGVycykge1xuICAgIGlmICh0eXBlb2YgcmVwbHlQYXJhbWV0ZXJzLnN0YXR1c0NvZGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3N0YXR1c0NvZGUgbXVzdCBiZSBkZWZpbmVkJylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZXBseVBhcmFtZXRlcnMucmVzcG9uc2VPcHRpb25zICE9PSAnb2JqZWN0JyB8fCByZXBseVBhcmFtZXRlcnMucmVzcG9uc2VPcHRpb25zID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3Jlc3BvbnNlT3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCcpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vY2sgYW4gdW5kaWNpIHJlcXVlc3Qgd2l0aCBhIGRlZmluZWQgcmVwbHkuXG4gICAqL1xuICByZXBseSAocmVwbHlPcHRpb25zQ2FsbGJhY2tPclN0YXR1c0NvZGUpIHtcbiAgICAvLyBWYWx1ZXMgb2YgcmVwbHkgYXJlbid0IGF2YWlsYWJsZSByaWdodCBub3cgYXMgdGhleVxuICAgIC8vIGNhbiBvbmx5IGJlIGF2YWlsYWJsZSB3aGVuIHRoZSByZXBseSBjYWxsYmFjayBpcyBpbnZva2VkLlxuICAgIGlmICh0eXBlb2YgcmVwbHlPcHRpb25zQ2FsbGJhY2tPclN0YXR1c0NvZGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFdlJ2xsIGZpcnN0IHdyYXAgdGhlIHByb3ZpZGVkIGNhbGxiYWNrIGluIGFub3RoZXIgZnVuY3Rpb24sXG4gICAgICAvLyB0aGlzIGZ1bmN0aW9uIHdpbGwgcHJvcGVybHkgcmVzb2x2ZSB0aGUgZGF0YSBmcm9tIHRoZSBjYWxsYmFja1xuICAgICAgLy8gd2hlbiBpbnZva2VkLlxuICAgICAgY29uc3Qgd3JhcHBlZERlZmF1bHRzQ2FsbGJhY2sgPSAob3B0cykgPT4ge1xuICAgICAgICAvLyBPdXIgcmVwbHkgb3B0aW9ucyBjYWxsYmFjayBjb250YWlucyB0aGUgcGFyYW1ldGVyIGZvciBzdGF0dXNDb2RlLCBkYXRhIGFuZCBvcHRpb25zLlxuICAgICAgICBjb25zdCByZXNvbHZlZERhdGEgPSByZXBseU9wdGlvbnNDYWxsYmFja09yU3RhdHVzQ29kZShvcHRzKVxuXG4gICAgICAgIC8vIENoZWNrIGlmIGl0IGlzIGluIHRoZSByaWdodCBmb3JtYXRcbiAgICAgICAgaWYgKHR5cGVvZiByZXNvbHZlZERhdGEgIT09ICdvYmplY3QnIHx8IHJlc29sdmVkRGF0YSA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcigncmVwbHkgb3B0aW9ucyBjYWxsYmFjayBtdXN0IHJldHVybiBhbiBvYmplY3QnKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVwbHlQYXJhbWV0ZXJzID0geyBkYXRhOiAnJywgcmVzcG9uc2VPcHRpb25zOiB7fSwgLi4ucmVzb2x2ZWREYXRhIH1cbiAgICAgICAgdGhpcy52YWxpZGF0ZVJlcGx5UGFyYW1ldGVycyhyZXBseVBhcmFtZXRlcnMpXG4gICAgICAgIC8vIFNpbmNlIHRoZSB2YWx1ZXMgY2FuIGJlIG9idGFpbmVkIGltbWVkaWF0ZWx5IHdlIHJldHVybiB0aGVtXG4gICAgICAgIC8vIGZyb20gdGhpcyBoaWdoZXIgb3JkZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHJlc29sdmVkIGxhdGVyLlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnRoaXMuY3JlYXRlTW9ja1Njb3BlRGlzcGF0Y2hEYXRhKHJlcGx5UGFyYW1ldGVycylcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBZGQgdXN1YWwgZGlzcGF0Y2ggZGF0YSwgYnV0IHRoaXMgdGltZSBzZXQgdGhlIGRhdGEgcGFyYW1ldGVyIHRvIGZ1bmN0aW9uIHRoYXQgd2lsbCBldmVudHVhbGx5IHByb3ZpZGUgZGF0YS5cbiAgICAgIGNvbnN0IG5ld01vY2tEaXNwYXRjaCA9IGFkZE1vY2tEaXNwYXRjaCh0aGlzW2tEaXNwYXRjaGVzXSwgdGhpc1trRGlzcGF0Y2hLZXldLCB3cmFwcGVkRGVmYXVsdHNDYWxsYmFjaylcbiAgICAgIHJldHVybiBuZXcgTW9ja1Njb3BlKG5ld01vY2tEaXNwYXRjaClcbiAgICB9XG5cbiAgICAvLyBXZSBjYW4gaGF2ZSBlaXRoZXIgb25lIG9yIHRocmVlIHBhcmFtZXRlcnMsIGlmIHdlIGdldCBoZXJlLFxuICAgIC8vIHdlIHNob3VsZCBoYXZlIDEtMyBwYXJhbWV0ZXJzLiBTbyB3ZSBzcHJlYWQgdGhlIGFyZ3VtZW50cyBvZlxuICAgIC8vIHRoaXMgZnVuY3Rpb24gdG8gb2J0YWluIHRoZSBwYXJhbWV0ZXJzLCBzaW5jZSByZXBseURhdGEgd2lsbCBhbHdheXNcbiAgICAvLyBqdXN0IGJlIHRoZSBzdGF0dXNDb2RlLlxuICAgIGNvbnN0IHJlcGx5UGFyYW1ldGVycyA9IHtcbiAgICAgIHN0YXR1c0NvZGU6IHJlcGx5T3B0aW9uc0NhbGxiYWNrT3JTdGF0dXNDb2RlLFxuICAgICAgZGF0YTogYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyAnJyA6IGFyZ3VtZW50c1sxXSxcbiAgICAgIHJlc3BvbnNlT3B0aW9uczogYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1syXVxuICAgIH1cbiAgICB0aGlzLnZhbGlkYXRlUmVwbHlQYXJhbWV0ZXJzKHJlcGx5UGFyYW1ldGVycylcblxuICAgIC8vIFNlbmQgaW4tYWxyZWFkeSBwcm92aWRlZCBkYXRhIGxpa2UgdXN1YWxcbiAgICBjb25zdCBkaXNwYXRjaERhdGEgPSB0aGlzLmNyZWF0ZU1vY2tTY29wZURpc3BhdGNoRGF0YShyZXBseVBhcmFtZXRlcnMpXG4gICAgY29uc3QgbmV3TW9ja0Rpc3BhdGNoID0gYWRkTW9ja0Rpc3BhdGNoKHRoaXNba0Rpc3BhdGNoZXNdLCB0aGlzW2tEaXNwYXRjaEtleV0sIGRpc3BhdGNoRGF0YSlcbiAgICByZXR1cm4gbmV3IE1vY2tTY29wZShuZXdNb2NrRGlzcGF0Y2gpXG4gIH1cblxuICAvKipcbiAgICogTW9jayBhbiB1bmRpY2kgcmVxdWVzdCB3aXRoIGEgZGVmaW5lZCBlcnJvci5cbiAgICovXG4gIHJlcGx5V2l0aEVycm9yIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2Vycm9yIG11c3QgYmUgZGVmaW5lZCcpXG4gICAgfVxuXG4gICAgY29uc3QgbmV3TW9ja0Rpc3BhdGNoID0gYWRkTW9ja0Rpc3BhdGNoKHRoaXNba0Rpc3BhdGNoZXNdLCB0aGlzW2tEaXNwYXRjaEtleV0sIHsgZXJyb3IgfSlcbiAgICByZXR1cm4gbmV3IE1vY2tTY29wZShuZXdNb2NrRGlzcGF0Y2gpXG4gIH1cblxuICAvKipcbiAgICogU2V0IGRlZmF1bHQgcmVwbHkgaGVhZGVycyBvbiB0aGUgaW50ZXJjZXB0b3IgZm9yIHN1YnNlcXVlbnQgcmVwbGllc1xuICAgKi9cbiAgZGVmYXVsdFJlcGx5SGVhZGVycyAoaGVhZGVycykge1xuICAgIGlmICh0eXBlb2YgaGVhZGVycyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaGVhZGVycyBtdXN0IGJlIGRlZmluZWQnKVxuICAgIH1cblxuICAgIHRoaXNba0RlZmF1bHRIZWFkZXJzXSA9IGhlYWRlcnNcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBkZWZhdWx0IHJlcGx5IHRyYWlsZXJzIG9uIHRoZSBpbnRlcmNlcHRvciBmb3Igc3Vic2VxdWVudCByZXBsaWVzXG4gICAqL1xuICBkZWZhdWx0UmVwbHlUcmFpbGVycyAodHJhaWxlcnMpIHtcbiAgICBpZiAodHlwZW9mIHRyYWlsZXJzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCd0cmFpbGVycyBtdXN0IGJlIGRlZmluZWQnKVxuICAgIH1cblxuICAgIHRoaXNba0RlZmF1bHRUcmFpbGVyc10gPSB0cmFpbGVyc1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogU2V0IHJlcGx5IGNvbnRlbnQgbGVuZ3RoIGhlYWRlciBmb3IgcmVwbGllcyBvbiB0aGUgaW50ZXJjZXB0b3JcbiAgICovXG4gIHJlcGx5Q29udGVudExlbmd0aCAoKSB7XG4gICAgdGhpc1trQ29udGVudExlbmd0aF0gPSB0cnVlXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cy5Nb2NrSW50ZXJjZXB0b3IgPSBNb2NrSW50ZXJjZXB0b3Jcbm1vZHVsZS5leHBvcnRzLk1vY2tTY29wZSA9IE1vY2tTY29wZVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgcHJvbWlzaWZ5IH0gPSByZXF1aXJlKCdub2RlOnV0aWwnKVxuY29uc3QgQ2xpZW50ID0gcmVxdWlyZSgnLi4vZGlzcGF0Y2hlci9jbGllbnQnKVxuY29uc3QgeyBidWlsZE1vY2tEaXNwYXRjaCB9ID0gcmVxdWlyZSgnLi9tb2NrLXV0aWxzJylcbmNvbnN0IHtcbiAga0Rpc3BhdGNoZXMsXG4gIGtNb2NrQWdlbnQsXG4gIGtDbG9zZSxcbiAga09yaWdpbmFsQ2xvc2UsXG4gIGtPcmlnaW4sXG4gIGtPcmlnaW5hbERpc3BhdGNoLFxuICBrQ29ubmVjdGVkXG59ID0gcmVxdWlyZSgnLi9tb2NrLXN5bWJvbHMnKVxuY29uc3QgeyBNb2NrSW50ZXJjZXB0b3IgfSA9IHJlcXVpcmUoJy4vbW9jay1pbnRlcmNlcHRvcicpXG5jb25zdCBTeW1ib2xzID0gcmVxdWlyZSgnLi4vY29yZS9zeW1ib2xzJylcbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcblxuLyoqXG4gKiBNb2NrQ2xpZW50IHByb3ZpZGVzIGFuIEFQSSB0aGF0IGV4dGVuZHMgdGhlIENsaWVudCB0byBpbmZsdWVuY2UgdGhlIG1vY2tEaXNwYXRjaGVzLlxuICovXG5jbGFzcyBNb2NrQ2xpZW50IGV4dGVuZHMgQ2xpZW50IHtcbiAgY29uc3RydWN0b3IgKG9yaWdpbiwgb3B0cykge1xuICAgIHN1cGVyKG9yaWdpbiwgb3B0cylcblxuICAgIGlmICghb3B0cyB8fCAhb3B0cy5hZ2VudCB8fCB0eXBlb2Ygb3B0cy5hZ2VudC5kaXNwYXRjaCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdBcmd1bWVudCBvcHRzLmFnZW50IG11c3QgaW1wbGVtZW50IEFnZW50JylcbiAgICB9XG5cbiAgICB0aGlzW2tNb2NrQWdlbnRdID0gb3B0cy5hZ2VudFxuICAgIHRoaXNba09yaWdpbl0gPSBvcmlnaW5cbiAgICB0aGlzW2tEaXNwYXRjaGVzXSA9IFtdXG4gICAgdGhpc1trQ29ubmVjdGVkXSA9IDFcbiAgICB0aGlzW2tPcmlnaW5hbERpc3BhdGNoXSA9IHRoaXMuZGlzcGF0Y2hcbiAgICB0aGlzW2tPcmlnaW5hbENsb3NlXSA9IHRoaXMuY2xvc2UuYmluZCh0aGlzKVxuXG4gICAgdGhpcy5kaXNwYXRjaCA9IGJ1aWxkTW9ja0Rpc3BhdGNoLmNhbGwodGhpcylcbiAgICB0aGlzLmNsb3NlID0gdGhpc1trQ2xvc2VdXG4gIH1cblxuICBnZXQgW1N5bWJvbHMua0Nvbm5lY3RlZF0gKCkge1xuICAgIHJldHVybiB0aGlzW2tDb25uZWN0ZWRdXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCB0aGUgYmFzZSBpbnRlcmNlcHRvciBmb3IgbW9ja2luZyByZXBsaWVzIGZyb20gdW5kaWNpLlxuICAgKi9cbiAgaW50ZXJjZXB0IChvcHRzKSB7XG4gICAgcmV0dXJuIG5ldyBNb2NrSW50ZXJjZXB0b3Iob3B0cywgdGhpc1trRGlzcGF0Y2hlc10pXG4gIH1cblxuICBhc3luYyBba0Nsb3NlXSAoKSB7XG4gICAgYXdhaXQgcHJvbWlzaWZ5KHRoaXNba09yaWdpbmFsQ2xvc2VdKSgpXG4gICAgdGhpc1trQ29ubmVjdGVkXSA9IDBcbiAgICB0aGlzW2tNb2NrQWdlbnRdW1N5bWJvbHMua0NsaWVudHNdLmRlbGV0ZSh0aGlzW2tPcmlnaW5dKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTW9ja0NsaWVudFxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgcHJvbWlzaWZ5IH0gPSByZXF1aXJlKCdub2RlOnV0aWwnKVxuY29uc3QgUG9vbCA9IHJlcXVpcmUoJy4uL2Rpc3BhdGNoZXIvcG9vbCcpXG5jb25zdCB7IGJ1aWxkTW9ja0Rpc3BhdGNoIH0gPSByZXF1aXJlKCcuL21vY2stdXRpbHMnKVxuY29uc3Qge1xuICBrRGlzcGF0Y2hlcyxcbiAga01vY2tBZ2VudCxcbiAga0Nsb3NlLFxuICBrT3JpZ2luYWxDbG9zZSxcbiAga09yaWdpbixcbiAga09yaWdpbmFsRGlzcGF0Y2gsXG4gIGtDb25uZWN0ZWRcbn0gPSByZXF1aXJlKCcuL21vY2stc3ltYm9scycpXG5jb25zdCB7IE1vY2tJbnRlcmNlcHRvciB9ID0gcmVxdWlyZSgnLi9tb2NrLWludGVyY2VwdG9yJylcbmNvbnN0IFN5bWJvbHMgPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciB9ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMnKVxuXG4vKipcbiAqIE1vY2tQb29sIHByb3ZpZGVzIGFuIEFQSSB0aGF0IGV4dGVuZHMgdGhlIFBvb2wgdG8gaW5mbHVlbmNlIHRoZSBtb2NrRGlzcGF0Y2hlcy5cbiAqL1xuY2xhc3MgTW9ja1Bvb2wgZXh0ZW5kcyBQb29sIHtcbiAgY29uc3RydWN0b3IgKG9yaWdpbiwgb3B0cykge1xuICAgIHN1cGVyKG9yaWdpbiwgb3B0cylcblxuICAgIGlmICghb3B0cyB8fCAhb3B0cy5hZ2VudCB8fCB0eXBlb2Ygb3B0cy5hZ2VudC5kaXNwYXRjaCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdBcmd1bWVudCBvcHRzLmFnZW50IG11c3QgaW1wbGVtZW50IEFnZW50JylcbiAgICB9XG5cbiAgICB0aGlzW2tNb2NrQWdlbnRdID0gb3B0cy5hZ2VudFxuICAgIHRoaXNba09yaWdpbl0gPSBvcmlnaW5cbiAgICB0aGlzW2tEaXNwYXRjaGVzXSA9IFtdXG4gICAgdGhpc1trQ29ubmVjdGVkXSA9IDFcbiAgICB0aGlzW2tPcmlnaW5hbERpc3BhdGNoXSA9IHRoaXMuZGlzcGF0Y2hcbiAgICB0aGlzW2tPcmlnaW5hbENsb3NlXSA9IHRoaXMuY2xvc2UuYmluZCh0aGlzKVxuXG4gICAgdGhpcy5kaXNwYXRjaCA9IGJ1aWxkTW9ja0Rpc3BhdGNoLmNhbGwodGhpcylcbiAgICB0aGlzLmNsb3NlID0gdGhpc1trQ2xvc2VdXG4gIH1cblxuICBnZXQgW1N5bWJvbHMua0Nvbm5lY3RlZF0gKCkge1xuICAgIHJldHVybiB0aGlzW2tDb25uZWN0ZWRdXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCB0aGUgYmFzZSBpbnRlcmNlcHRvciBmb3IgbW9ja2luZyByZXBsaWVzIGZyb20gdW5kaWNpLlxuICAgKi9cbiAgaW50ZXJjZXB0IChvcHRzKSB7XG4gICAgcmV0dXJuIG5ldyBNb2NrSW50ZXJjZXB0b3Iob3B0cywgdGhpc1trRGlzcGF0Y2hlc10pXG4gIH1cblxuICBhc3luYyBba0Nsb3NlXSAoKSB7XG4gICAgYXdhaXQgcHJvbWlzaWZ5KHRoaXNba09yaWdpbmFsQ2xvc2VdKSgpXG4gICAgdGhpc1trQ29ubmVjdGVkXSA9IDBcbiAgICB0aGlzW2tNb2NrQWdlbnRdW1N5bWJvbHMua0NsaWVudHNdLmRlbGV0ZSh0aGlzW2tPcmlnaW5dKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTW9ja1Bvb2xcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBzaW5ndWxhcnMgPSB7XG4gIHByb25vdW46ICdpdCcsXG4gIGlzOiAnaXMnLFxuICB3YXM6ICd3YXMnLFxuICB0aGlzOiAndGhpcydcbn1cblxuY29uc3QgcGx1cmFscyA9IHtcbiAgcHJvbm91bjogJ3RoZXknLFxuICBpczogJ2FyZScsXG4gIHdhczogJ3dlcmUnLFxuICB0aGlzOiAndGhlc2UnXG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgUGx1cmFsaXplciB7XG4gIGNvbnN0cnVjdG9yIChzaW5ndWxhciwgcGx1cmFsKSB7XG4gICAgdGhpcy5zaW5ndWxhciA9IHNpbmd1bGFyXG4gICAgdGhpcy5wbHVyYWwgPSBwbHVyYWxcbiAgfVxuXG4gIHBsdXJhbGl6ZSAoY291bnQpIHtcbiAgICBjb25zdCBvbmUgPSBjb3VudCA9PT0gMVxuICAgIGNvbnN0IGtleXMgPSBvbmUgPyBzaW5ndWxhcnMgOiBwbHVyYWxzXG4gICAgY29uc3Qgbm91biA9IG9uZSA/IHRoaXMuc2luZ3VsYXIgOiB0aGlzLnBsdXJhbFxuICAgIHJldHVybiB7IC4uLmtleXMsIGNvdW50LCBub3VuIH1cbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgVHJhbnNmb3JtIH0gPSByZXF1aXJlKCdub2RlOnN0cmVhbScpXG5jb25zdCB7IENvbnNvbGUgfSA9IHJlcXVpcmUoJ25vZGU6Y29uc29sZScpXG5cbmNvbnN0IFBFUlNJU1RFTlQgPSBwcm9jZXNzLnZlcnNpb25zLmljdSA/ICfinIUnIDogJ1kgJ1xuY29uc3QgTk9UX1BFUlNJU1RFTlQgPSBwcm9jZXNzLnZlcnNpb25zLmljdSA/ICfinYwnIDogJ04gJ1xuXG4vKipcbiAqIEdldHMgdGhlIG91dHB1dCBvZiBgY29uc29sZS50YWJsZSjigKYpYCBhcyBhIHN0cmluZy5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBQZW5kaW5nSW50ZXJjZXB0b3JzRm9ybWF0dGVyIHtcbiAgY29uc3RydWN0b3IgKHsgZGlzYWJsZUNvbG9ycyB9ID0ge30pIHtcbiAgICB0aGlzLnRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oe1xuICAgICAgdHJhbnNmb3JtIChjaHVuaywgX2VuYywgY2IpIHtcbiAgICAgICAgY2IobnVsbCwgY2h1bmspXG4gICAgICB9XG4gICAgfSlcblxuICAgIHRoaXMubG9nZ2VyID0gbmV3IENvbnNvbGUoe1xuICAgICAgc3Rkb3V0OiB0aGlzLnRyYW5zZm9ybSxcbiAgICAgIGluc3BlY3RPcHRpb25zOiB7XG4gICAgICAgIGNvbG9yczogIWRpc2FibGVDb2xvcnMgJiYgIXByb2Nlc3MuZW52LkNJXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZvcm1hdCAocGVuZGluZ0ludGVyY2VwdG9ycykge1xuICAgIGNvbnN0IHdpdGhQcmV0dHlIZWFkZXJzID0gcGVuZGluZ0ludGVyY2VwdG9ycy5tYXAoXG4gICAgICAoeyBtZXRob2QsIHBhdGgsIGRhdGE6IHsgc3RhdHVzQ29kZSB9LCBwZXJzaXN0LCB0aW1lcywgdGltZXNJbnZva2VkLCBvcmlnaW4gfSkgPT4gKHtcbiAgICAgICAgTWV0aG9kOiBtZXRob2QsXG4gICAgICAgIE9yaWdpbjogb3JpZ2luLFxuICAgICAgICBQYXRoOiBwYXRoLFxuICAgICAgICAnU3RhdHVzIGNvZGUnOiBzdGF0dXNDb2RlLFxuICAgICAgICBQZXJzaXN0ZW50OiBwZXJzaXN0ID8gUEVSU0lTVEVOVCA6IE5PVF9QRVJTSVNURU5ULFxuICAgICAgICBJbnZvY2F0aW9uczogdGltZXNJbnZva2VkLFxuICAgICAgICBSZW1haW5pbmc6IHBlcnNpc3QgPyBJbmZpbml0eSA6IHRpbWVzIC0gdGltZXNJbnZva2VkXG4gICAgICB9KSlcblxuICAgIHRoaXMubG9nZ2VyLnRhYmxlKHdpdGhQcmV0dHlIZWFkZXJzKVxuICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5yZWFkKCkudG9TdHJpbmcoKVxuICB9XG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBrQ2xpZW50cyB9ID0gcmVxdWlyZSgnLi4vY29yZS9zeW1ib2xzJylcbmNvbnN0IEFnZW50ID0gcmVxdWlyZSgnLi4vZGlzcGF0Y2hlci9hZ2VudCcpXG5jb25zdCB7XG4gIGtBZ2VudCxcbiAga01vY2tBZ2VudFNldCxcbiAga01vY2tBZ2VudEdldCxcbiAga0Rpc3BhdGNoZXMsXG4gIGtJc01vY2tBY3RpdmUsXG4gIGtOZXRDb25uZWN0LFxuICBrR2V0TmV0Q29ubmVjdCxcbiAga09wdGlvbnMsXG4gIGtGYWN0b3J5XG59ID0gcmVxdWlyZSgnLi9tb2NrLXN5bWJvbHMnKVxuY29uc3QgTW9ja0NsaWVudCA9IHJlcXVpcmUoJy4vbW9jay1jbGllbnQnKVxuY29uc3QgTW9ja1Bvb2wgPSByZXF1aXJlKCcuL21vY2stcG9vbCcpXG5jb25zdCB7IG1hdGNoVmFsdWUsIGJ1aWxkTW9ja09wdGlvbnMgfSA9IHJlcXVpcmUoJy4vbW9jay11dGlscycpXG5jb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yLCBVbmRpY2lFcnJvciB9ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMnKVxuY29uc3QgRGlzcGF0Y2hlciA9IHJlcXVpcmUoJy4uL2Rpc3BhdGNoZXIvZGlzcGF0Y2hlcicpXG5jb25zdCBQbHVyYWxpemVyID0gcmVxdWlyZSgnLi9wbHVyYWxpemVyJylcbmNvbnN0IFBlbmRpbmdJbnRlcmNlcHRvcnNGb3JtYXR0ZXIgPSByZXF1aXJlKCcuL3BlbmRpbmctaW50ZXJjZXB0b3JzLWZvcm1hdHRlcicpXG5cbmNsYXNzIE1vY2tBZ2VudCBleHRlbmRzIERpc3BhdGNoZXIge1xuICBjb25zdHJ1Y3RvciAob3B0cykge1xuICAgIHN1cGVyKG9wdHMpXG5cbiAgICB0aGlzW2tOZXRDb25uZWN0XSA9IHRydWVcbiAgICB0aGlzW2tJc01vY2tBY3RpdmVdID0gdHJ1ZVxuXG4gICAgLy8gSW5zdGFudGlhdGUgQWdlbnQgYW5kIGVuY2Fwc3VsYXRlXG4gICAgaWYgKChvcHRzPy5hZ2VudCAmJiB0eXBlb2Ygb3B0cy5hZ2VudC5kaXNwYXRjaCAhPT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignQXJndW1lbnQgb3B0cy5hZ2VudCBtdXN0IGltcGxlbWVudCBBZ2VudCcpXG4gICAgfVxuICAgIGNvbnN0IGFnZW50ID0gb3B0cz8uYWdlbnQgPyBvcHRzLmFnZW50IDogbmV3IEFnZW50KG9wdHMpXG4gICAgdGhpc1trQWdlbnRdID0gYWdlbnRcblxuICAgIHRoaXNba0NsaWVudHNdID0gYWdlbnRba0NsaWVudHNdXG4gICAgdGhpc1trT3B0aW9uc10gPSBidWlsZE1vY2tPcHRpb25zKG9wdHMpXG4gIH1cblxuICBnZXQgKG9yaWdpbikge1xuICAgIGxldCBkaXNwYXRjaGVyID0gdGhpc1trTW9ja0FnZW50R2V0XShvcmlnaW4pXG5cbiAgICBpZiAoIWRpc3BhdGNoZXIpIHtcbiAgICAgIGRpc3BhdGNoZXIgPSB0aGlzW2tGYWN0b3J5XShvcmlnaW4pXG4gICAgICB0aGlzW2tNb2NrQWdlbnRTZXRdKG9yaWdpbiwgZGlzcGF0Y2hlcilcbiAgICB9XG4gICAgcmV0dXJuIGRpc3BhdGNoZXJcbiAgfVxuXG4gIGRpc3BhdGNoIChvcHRzLCBoYW5kbGVyKSB7XG4gICAgLy8gQ2FsbCBNb2NrQWdlbnQuZ2V0IHRvIHBlcmZvcm0gYWRkaXRpb25hbCBzZXR1cCBiZWZvcmUgZGlzcGF0Y2hpbmcgYXMgbm9ybWFsXG4gICAgdGhpcy5nZXQob3B0cy5vcmlnaW4pXG4gICAgcmV0dXJuIHRoaXNba0FnZW50XS5kaXNwYXRjaChvcHRzLCBoYW5kbGVyKVxuICB9XG5cbiAgYXN5bmMgY2xvc2UgKCkge1xuICAgIGF3YWl0IHRoaXNba0FnZW50XS5jbG9zZSgpXG4gICAgdGhpc1trQ2xpZW50c10uY2xlYXIoKVxuICB9XG5cbiAgZGVhY3RpdmF0ZSAoKSB7XG4gICAgdGhpc1trSXNNb2NrQWN0aXZlXSA9IGZhbHNlXG4gIH1cblxuICBhY3RpdmF0ZSAoKSB7XG4gICAgdGhpc1trSXNNb2NrQWN0aXZlXSA9IHRydWVcbiAgfVxuXG4gIGVuYWJsZU5ldENvbm5lY3QgKG1hdGNoZXIpIHtcbiAgICBpZiAodHlwZW9mIG1hdGNoZXIgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBtYXRjaGVyID09PSAnZnVuY3Rpb24nIHx8IG1hdGNoZXIgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXNba05ldENvbm5lY3RdKSkge1xuICAgICAgICB0aGlzW2tOZXRDb25uZWN0XS5wdXNoKG1hdGNoZXIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzW2tOZXRDb25uZWN0XSA9IFttYXRjaGVyXVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1hdGNoZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzW2tOZXRDb25uZWN0XSA9IHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdVbnN1cHBvcnRlZCBtYXRjaGVyLiBNdXN0IGJlIG9uZSBvZiBTdHJpbmd8RnVuY3Rpb258UmVnRXhwLicpXG4gICAgfVxuICB9XG5cbiAgZGlzYWJsZU5ldENvbm5lY3QgKCkge1xuICAgIHRoaXNba05ldENvbm5lY3RdID0gZmFsc2VcbiAgfVxuXG4gIC8vIFRoaXMgaXMgcmVxdWlyZWQgdG8gYnlwYXNzIGlzc3VlcyBjYXVzZWQgYnkgdXNpbmcgZ2xvYmFsIHN5bWJvbHMgLSBzZWU6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2lzc3Vlcy8xNDQ3XG4gIGdldCBpc01vY2tBY3RpdmUgKCkge1xuICAgIHJldHVybiB0aGlzW2tJc01vY2tBY3RpdmVdXG4gIH1cblxuICBba01vY2tBZ2VudFNldF0gKG9yaWdpbiwgZGlzcGF0Y2hlcikge1xuICAgIHRoaXNba0NsaWVudHNdLnNldChvcmlnaW4sIGRpc3BhdGNoZXIpXG4gIH1cblxuICBba0ZhY3RvcnldIChvcmlnaW4pIHtcbiAgICBjb25zdCBtb2NrT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oeyBhZ2VudDogdGhpcyB9LCB0aGlzW2tPcHRpb25zXSlcbiAgICByZXR1cm4gdGhpc1trT3B0aW9uc10gJiYgdGhpc1trT3B0aW9uc10uY29ubmVjdGlvbnMgPT09IDFcbiAgICAgID8gbmV3IE1vY2tDbGllbnQob3JpZ2luLCBtb2NrT3B0aW9ucylcbiAgICAgIDogbmV3IE1vY2tQb29sKG9yaWdpbiwgbW9ja09wdGlvbnMpXG4gIH1cblxuICBba01vY2tBZ2VudEdldF0gKG9yaWdpbikge1xuICAgIC8vIEZpcnN0IGNoZWNrIGlmIHdlIGNhbiBpbW1lZGlhdGVseSBmaW5kIGl0XG4gICAgY29uc3QgY2xpZW50ID0gdGhpc1trQ2xpZW50c10uZ2V0KG9yaWdpbilcbiAgICBpZiAoY2xpZW50KSB7XG4gICAgICByZXR1cm4gY2xpZW50XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIG9yaWdpbiBpcyBub3QgYSBzdHJpbmcgY3JlYXRlIGEgZHVtbXkgcGFyZW50IHBvb2wgYW5kIHJldHVybiB0byB1c2VyXG4gICAgaWYgKHR5cGVvZiBvcmlnaW4gIT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBkaXNwYXRjaGVyID0gdGhpc1trRmFjdG9yeV0oJ2h0dHA6Ly9sb2NhbGhvc3Q6OTk5OScpXG4gICAgICB0aGlzW2tNb2NrQWdlbnRTZXRdKG9yaWdpbiwgZGlzcGF0Y2hlcilcbiAgICAgIHJldHVybiBkaXNwYXRjaGVyXG4gICAgfVxuXG4gICAgLy8gSWYgd2UgbWF0Y2gsIGNyZWF0ZSBhIHBvb2wgYW5kIGFzc2lnbiB0aGUgc2FtZSBkaXNwYXRjaGVzXG4gICAgZm9yIChjb25zdCBba2V5TWF0Y2hlciwgbm9uRXhwbGljaXREaXNwYXRjaGVyXSBvZiBBcnJheS5mcm9tKHRoaXNba0NsaWVudHNdKSkge1xuICAgICAgaWYgKG5vbkV4cGxpY2l0RGlzcGF0Y2hlciAmJiB0eXBlb2Yga2V5TWF0Y2hlciAhPT0gJ3N0cmluZycgJiYgbWF0Y2hWYWx1ZShrZXlNYXRjaGVyLCBvcmlnaW4pKSB7XG4gICAgICAgIGNvbnN0IGRpc3BhdGNoZXIgPSB0aGlzW2tGYWN0b3J5XShvcmlnaW4pXG4gICAgICAgIHRoaXNba01vY2tBZ2VudFNldF0ob3JpZ2luLCBkaXNwYXRjaGVyKVxuICAgICAgICBkaXNwYXRjaGVyW2tEaXNwYXRjaGVzXSA9IG5vbkV4cGxpY2l0RGlzcGF0Y2hlcltrRGlzcGF0Y2hlc11cbiAgICAgICAgcmV0dXJuIGRpc3BhdGNoZXJcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBba0dldE5ldENvbm5lY3RdICgpIHtcbiAgICByZXR1cm4gdGhpc1trTmV0Q29ubmVjdF1cbiAgfVxuXG4gIHBlbmRpbmdJbnRlcmNlcHRvcnMgKCkge1xuICAgIGNvbnN0IG1vY2tBZ2VudENsaWVudHMgPSB0aGlzW2tDbGllbnRzXVxuXG4gICAgcmV0dXJuIEFycmF5LmZyb20obW9ja0FnZW50Q2xpZW50cy5lbnRyaWVzKCkpXG4gICAgICAuZmxhdE1hcCgoW29yaWdpbiwgc2NvcGVdKSA9PiBzY29wZVtrRGlzcGF0Y2hlc10ubWFwKGRpc3BhdGNoID0+ICh7IC4uLmRpc3BhdGNoLCBvcmlnaW4gfSkpKVxuICAgICAgLmZpbHRlcigoeyBwZW5kaW5nIH0pID0+IHBlbmRpbmcpXG4gIH1cblxuICBhc3NlcnROb1BlbmRpbmdJbnRlcmNlcHRvcnMgKHsgcGVuZGluZ0ludGVyY2VwdG9yc0Zvcm1hdHRlciA9IG5ldyBQZW5kaW5nSW50ZXJjZXB0b3JzRm9ybWF0dGVyKCkgfSA9IHt9KSB7XG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZ0ludGVyY2VwdG9ycygpXG5cbiAgICBpZiAocGVuZGluZy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHBsdXJhbGl6ZXIgPSBuZXcgUGx1cmFsaXplcignaW50ZXJjZXB0b3InLCAnaW50ZXJjZXB0b3JzJykucGx1cmFsaXplKHBlbmRpbmcubGVuZ3RoKVxuXG4gICAgdGhyb3cgbmV3IFVuZGljaUVycm9yKGBcbiR7cGx1cmFsaXplci5jb3VudH0gJHtwbHVyYWxpemVyLm5vdW59ICR7cGx1cmFsaXplci5pc30gcGVuZGluZzpcblxuJHtwZW5kaW5nSW50ZXJjZXB0b3JzRm9ybWF0dGVyLmZvcm1hdChwZW5kaW5nKX1cbmAudHJpbSgpKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTW9ja0FnZW50XG4iLCIndXNlIHN0cmljdCdcblxuLy8gV2UgaW5jbHVkZSBhIHZlcnNpb24gbnVtYmVyIGZvciB0aGUgRGlzcGF0Y2hlciBBUEkuIEluIGNhc2Ugb2YgYnJlYWtpbmcgY2hhbmdlcyxcbi8vIHRoaXMgdmVyc2lvbiBudW1iZXIgbXVzdCBiZSBpbmNyZWFzZWQgdG8gYXZvaWQgY29uZmxpY3RzLlxuY29uc3QgZ2xvYmFsRGlzcGF0Y2hlciA9IFN5bWJvbC5mb3IoJ3VuZGljaS5nbG9iYWxEaXNwYXRjaGVyLjEnKVxuY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciB9ID0gcmVxdWlyZSgnLi9jb3JlL2Vycm9ycycpXG5jb25zdCBBZ2VudCA9IHJlcXVpcmUoJy4vZGlzcGF0Y2hlci9hZ2VudCcpXG5cbmlmIChnZXRHbG9iYWxEaXNwYXRjaGVyKCkgPT09IHVuZGVmaW5lZCkge1xuICBzZXRHbG9iYWxEaXNwYXRjaGVyKG5ldyBBZ2VudCgpKVxufVxuXG5mdW5jdGlvbiBzZXRHbG9iYWxEaXNwYXRjaGVyIChhZ2VudCkge1xuICBpZiAoIWFnZW50IHx8IHR5cGVvZiBhZ2VudC5kaXNwYXRjaCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignQXJndW1lbnQgYWdlbnQgbXVzdCBpbXBsZW1lbnQgQWdlbnQnKVxuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnbG9iYWxUaGlzLCBnbG9iYWxEaXNwYXRjaGVyLCB7XG4gICAgdmFsdWU6IGFnZW50LFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2VcbiAgfSlcbn1cblxuZnVuY3Rpb24gZ2V0R2xvYmFsRGlzcGF0Y2hlciAoKSB7XG4gIHJldHVybiBnbG9iYWxUaGlzW2dsb2JhbERpc3BhdGNoZXJdXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXRHbG9iYWxEaXNwYXRjaGVyLFxuICBnZXRHbG9iYWxEaXNwYXRjaGVyXG59XG4iLCIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBEZWNvcmF0b3JIYW5kbGVyIHtcbiAgI2hhbmRsZXJcblxuICBjb25zdHJ1Y3RvciAoaGFuZGxlcikge1xuICAgIGlmICh0eXBlb2YgaGFuZGxlciAhPT0gJ29iamVjdCcgfHwgaGFuZGxlciA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaGFuZGxlciBtdXN0IGJlIGFuIG9iamVjdCcpXG4gICAgfVxuICAgIHRoaXMuI2hhbmRsZXIgPSBoYW5kbGVyXG4gIH1cblxuICBvbkNvbm5lY3QgKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy4jaGFuZGxlci5vbkNvbm5lY3Q/LiguLi5hcmdzKVxuICB9XG5cbiAgb25FcnJvciAoLi4uYXJncykge1xuICAgIHJldHVybiB0aGlzLiNoYW5kbGVyLm9uRXJyb3I/LiguLi5hcmdzKVxuICB9XG5cbiAgb25VcGdyYWRlICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuI2hhbmRsZXIub25VcGdyYWRlPy4oLi4uYXJncylcbiAgfVxuXG4gIG9uUmVzcG9uc2VTdGFydGVkICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuI2hhbmRsZXIub25SZXNwb25zZVN0YXJ0ZWQ/LiguLi5hcmdzKVxuICB9XG5cbiAgb25IZWFkZXJzICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuI2hhbmRsZXIub25IZWFkZXJzPy4oLi4uYXJncylcbiAgfVxuXG4gIG9uRGF0YSAoLi4uYXJncykge1xuICAgIHJldHVybiB0aGlzLiNoYW5kbGVyLm9uRGF0YT8uKC4uLmFyZ3MpXG4gIH1cblxuICBvbkNvbXBsZXRlICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuI2hhbmRsZXIub25Db21wbGV0ZT8uKC4uLmFyZ3MpXG4gIH1cblxuICBvbkJvZHlTZW50ICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuI2hhbmRsZXIub25Cb2R5U2VudD8uKC4uLmFyZ3MpXG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0J1xuY29uc3QgUmVkaXJlY3RIYW5kbGVyID0gcmVxdWlyZSgnLi4vaGFuZGxlci9yZWRpcmVjdC1oYW5kbGVyJylcblxubW9kdWxlLmV4cG9ydHMgPSBvcHRzID0+IHtcbiAgY29uc3QgZ2xvYmFsTWF4UmVkaXJlY3Rpb25zID0gb3B0cz8ubWF4UmVkaXJlY3Rpb25zXG4gIHJldHVybiBkaXNwYXRjaCA9PiB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHJlZGlyZWN0SW50ZXJjZXB0b3IgKG9wdHMsIGhhbmRsZXIpIHtcbiAgICAgIGNvbnN0IHsgbWF4UmVkaXJlY3Rpb25zID0gZ2xvYmFsTWF4UmVkaXJlY3Rpb25zLCAuLi5iYXNlT3B0cyB9ID0gb3B0c1xuXG4gICAgICBpZiAoIW1heFJlZGlyZWN0aW9ucykge1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2gob3B0cywgaGFuZGxlcilcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVkaXJlY3RIYW5kbGVyID0gbmV3IFJlZGlyZWN0SGFuZGxlcihcbiAgICAgICAgZGlzcGF0Y2gsXG4gICAgICAgIG1heFJlZGlyZWN0aW9ucyxcbiAgICAgICAgb3B0cyxcbiAgICAgICAgaGFuZGxlclxuICAgICAgKVxuXG4gICAgICByZXR1cm4gZGlzcGF0Y2goYmFzZU9wdHMsIHJlZGlyZWN0SGFuZGxlcilcbiAgICB9XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0J1xuY29uc3QgUmV0cnlIYW5kbGVyID0gcmVxdWlyZSgnLi4vaGFuZGxlci9yZXRyeS1oYW5kbGVyJylcblxubW9kdWxlLmV4cG9ydHMgPSBnbG9iYWxPcHRzID0+IHtcbiAgcmV0dXJuIGRpc3BhdGNoID0+IHtcbiAgICByZXR1cm4gZnVuY3Rpb24gcmV0cnlJbnRlcmNlcHRvciAob3B0cywgaGFuZGxlcikge1xuICAgICAgcmV0dXJuIGRpc3BhdGNoKFxuICAgICAgICBvcHRzLFxuICAgICAgICBuZXcgUmV0cnlIYW5kbGVyKFxuICAgICAgICAgIHsgLi4ub3B0cywgcmV0cnlPcHRpb25zOiB7IC4uLmdsb2JhbE9wdHMsIC4uLm9wdHMucmV0cnlPcHRpb25zIH0gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoYW5kbGVyLFxuICAgICAgICAgICAgZGlzcGF0Y2hcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIClcbiAgICB9XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IsIFJlcXVlc3RBYm9ydGVkRXJyb3IgfSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcbmNvbnN0IERlY29yYXRvckhhbmRsZXIgPSByZXF1aXJlKCcuLi9oYW5kbGVyL2RlY29yYXRvci1oYW5kbGVyJylcblxuY2xhc3MgRHVtcEhhbmRsZXIgZXh0ZW5kcyBEZWNvcmF0b3JIYW5kbGVyIHtcbiAgI21heFNpemUgPSAxMDI0ICogMTAyNFxuICAjYWJvcnQgPSBudWxsXG4gICNkdW1wZWQgPSBmYWxzZVxuICAjYWJvcnRlZCA9IGZhbHNlXG4gICNzaXplID0gMFxuICAjcmVhc29uID0gbnVsbFxuICAjaGFuZGxlciA9IG51bGxcblxuICBjb25zdHJ1Y3RvciAoeyBtYXhTaXplIH0sIGhhbmRsZXIpIHtcbiAgICBzdXBlcihoYW5kbGVyKVxuXG4gICAgaWYgKG1heFNpemUgIT0gbnVsbCAmJiAoIU51bWJlci5pc0Zpbml0ZShtYXhTaXplKSB8fCBtYXhTaXplIDwgMSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignbWF4U2l6ZSBtdXN0IGJlIGEgbnVtYmVyIGdyZWF0ZXIgdGhhbiAwJylcbiAgICB9XG5cbiAgICB0aGlzLiNtYXhTaXplID0gbWF4U2l6ZSA/PyB0aGlzLiNtYXhTaXplXG4gICAgdGhpcy4jaGFuZGxlciA9IGhhbmRsZXJcbiAgfVxuXG4gIG9uQ29ubmVjdCAoYWJvcnQpIHtcbiAgICB0aGlzLiNhYm9ydCA9IGFib3J0XG5cbiAgICB0aGlzLiNoYW5kbGVyLm9uQ29ubmVjdCh0aGlzLiNjdXN0b21BYm9ydC5iaW5kKHRoaXMpKVxuICB9XG5cbiAgI2N1c3RvbUFib3J0IChyZWFzb24pIHtcbiAgICB0aGlzLiNhYm9ydGVkID0gdHJ1ZVxuICAgIHRoaXMuI3JlYXNvbiA9IHJlYXNvblxuICB9XG5cbiAgLy8gVE9ETzogd2lsbCByZXF1aXJlIGFkanVzdG1lbnQgYWZ0ZXIgbmV3IGhvb2tzIGFyZSBvdXRcbiAgb25IZWFkZXJzIChzdGF0dXNDb2RlLCByYXdIZWFkZXJzLCByZXN1bWUsIHN0YXR1c01lc3NhZ2UpIHtcbiAgICBjb25zdCBoZWFkZXJzID0gdXRpbC5wYXJzZUhlYWRlcnMocmF3SGVhZGVycylcbiAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gaGVhZGVyc1snY29udGVudC1sZW5ndGgnXVxuXG4gICAgaWYgKGNvbnRlbnRMZW5ndGggIT0gbnVsbCAmJiBjb250ZW50TGVuZ3RoID4gdGhpcy4jbWF4U2l6ZSkge1xuICAgICAgdGhyb3cgbmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoXG4gICAgICAgIGBSZXNwb25zZSBzaXplICgke2NvbnRlbnRMZW5ndGh9KSBsYXJnZXIgdGhhbiBtYXhTaXplICgke1xuICAgICAgICAgIHRoaXMuI21heFNpemVcbiAgICAgICAgfSlgXG4gICAgICApXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuI2Fib3J0ZWQpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuI2hhbmRsZXIub25IZWFkZXJzKFxuICAgICAgc3RhdHVzQ29kZSxcbiAgICAgIHJhd0hlYWRlcnMsXG4gICAgICByZXN1bWUsXG4gICAgICBzdGF0dXNNZXNzYWdlXG4gICAgKVxuICB9XG5cbiAgb25FcnJvciAoZXJyKSB7XG4gICAgaWYgKHRoaXMuI2R1bXBlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZXJyID0gdGhpcy4jcmVhc29uID8/IGVyclxuXG4gICAgdGhpcy4jaGFuZGxlci5vbkVycm9yKGVycilcbiAgfVxuXG4gIG9uRGF0YSAoY2h1bmspIHtcbiAgICB0aGlzLiNzaXplID0gdGhpcy4jc2l6ZSArIGNodW5rLmxlbmd0aFxuXG4gICAgaWYgKHRoaXMuI3NpemUgPj0gdGhpcy4jbWF4U2l6ZSkge1xuICAgICAgdGhpcy4jZHVtcGVkID0gdHJ1ZVxuXG4gICAgICBpZiAodGhpcy4jYWJvcnRlZCkge1xuICAgICAgICB0aGlzLiNoYW5kbGVyLm9uRXJyb3IodGhpcy4jcmVhc29uKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4jaGFuZGxlci5vbkNvbXBsZXRlKFtdKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBvbkNvbXBsZXRlICh0cmFpbGVycykge1xuICAgIGlmICh0aGlzLiNkdW1wZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLiNhYm9ydGVkKSB7XG4gICAgICB0aGlzLiNoYW5kbGVyLm9uRXJyb3IodGhpcy5yZWFzb24pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLiNoYW5kbGVyLm9uQ29tcGxldGUodHJhaWxlcnMpXG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRHVtcEludGVyY2VwdG9yIChcbiAgeyBtYXhTaXplOiBkZWZhdWx0TWF4U2l6ZSB9ID0ge1xuICAgIG1heFNpemU6IDEwMjQgKiAxMDI0XG4gIH1cbikge1xuICByZXR1cm4gZGlzcGF0Y2ggPT4ge1xuICAgIHJldHVybiBmdW5jdGlvbiBJbnRlcmNlcHQgKG9wdHMsIGhhbmRsZXIpIHtcbiAgICAgIGNvbnN0IHsgZHVtcE1heFNpemUgPSBkZWZhdWx0TWF4U2l6ZSB9ID1cbiAgICAgICAgb3B0c1xuXG4gICAgICBjb25zdCBkdW1wSGFuZGxlciA9IG5ldyBEdW1wSGFuZGxlcihcbiAgICAgICAgeyBtYXhTaXplOiBkdW1wTWF4U2l6ZSB9LFxuICAgICAgICBoYW5kbGVyXG4gICAgICApXG5cbiAgICAgIHJldHVybiBkaXNwYXRjaChvcHRzLCBkdW1wSGFuZGxlcilcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVEdW1wSW50ZXJjZXB0b3JcbiIsIid1c2Ugc3RyaWN0J1xuY29uc3QgeyBpc0lQIH0gPSByZXF1aXJlKCdub2RlOm5ldCcpXG5jb25zdCB7IGxvb2t1cCB9ID0gcmVxdWlyZSgnbm9kZTpkbnMnKVxuY29uc3QgRGVjb3JhdG9ySGFuZGxlciA9IHJlcXVpcmUoJy4uL2hhbmRsZXIvZGVjb3JhdG9yLWhhbmRsZXInKVxuY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciwgSW5mb3JtYXRpb25hbEVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5jb25zdCBtYXhJbnQgPSBNYXRoLnBvdygyLCAzMSkgLSAxXG5cbmNsYXNzIEROU0luc3RhbmNlIHtcbiAgI21heFRUTCA9IDBcbiAgI21heEl0ZW1zID0gMFxuICAjcmVjb3JkcyA9IG5ldyBNYXAoKVxuICBkdWFsU3RhY2sgPSB0cnVlXG4gIGFmZmluaXR5ID0gbnVsbFxuICBsb29rdXAgPSBudWxsXG4gIHBpY2sgPSBudWxsXG5cbiAgY29uc3RydWN0b3IgKG9wdHMpIHtcbiAgICB0aGlzLiNtYXhUVEwgPSBvcHRzLm1heFRUTFxuICAgIHRoaXMuI21heEl0ZW1zID0gb3B0cy5tYXhJdGVtc1xuICAgIHRoaXMuZHVhbFN0YWNrID0gb3B0cy5kdWFsU3RhY2tcbiAgICB0aGlzLmFmZmluaXR5ID0gb3B0cy5hZmZpbml0eVxuICAgIHRoaXMubG9va3VwID0gb3B0cy5sb29rdXAgPz8gdGhpcy4jZGVmYXVsdExvb2t1cFxuICAgIHRoaXMucGljayA9IG9wdHMucGljayA/PyB0aGlzLiNkZWZhdWx0UGlja1xuICB9XG5cbiAgZ2V0IGZ1bGwgKCkge1xuICAgIHJldHVybiB0aGlzLiNyZWNvcmRzLnNpemUgPT09IHRoaXMuI21heEl0ZW1zXG4gIH1cblxuICBydW5Mb29rdXAgKG9yaWdpbiwgb3B0cywgY2IpIHtcbiAgICBjb25zdCBpcHMgPSB0aGlzLiNyZWNvcmRzLmdldChvcmlnaW4uaG9zdG5hbWUpXG5cbiAgICAvLyBJZiBmdWxsLCB3ZSBqdXN0IHJldHVybiB0aGUgb3JpZ2luXG4gICAgaWYgKGlwcyA9PSBudWxsICYmIHRoaXMuZnVsbCkge1xuICAgICAgY2IobnVsbCwgb3JpZ2luLm9yaWdpbilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IG5ld09wdHMgPSB7XG4gICAgICBhZmZpbml0eTogdGhpcy5hZmZpbml0eSxcbiAgICAgIGR1YWxTdGFjazogdGhpcy5kdWFsU3RhY2ssXG4gICAgICBsb29rdXA6IHRoaXMubG9va3VwLFxuICAgICAgcGljazogdGhpcy5waWNrLFxuICAgICAgLi4ub3B0cy5kbnMsXG4gICAgICBtYXhUVEw6IHRoaXMuI21heFRUTCxcbiAgICAgIG1heEl0ZW1zOiB0aGlzLiNtYXhJdGVtc1xuICAgIH1cblxuICAgIC8vIElmIG5vIElQcyB3ZSBsb29rdXBcbiAgICBpZiAoaXBzID09IG51bGwpIHtcbiAgICAgIHRoaXMubG9va3VwKG9yaWdpbiwgbmV3T3B0cywgKGVyciwgYWRkcmVzc2VzKSA9PiB7XG4gICAgICAgIGlmIChlcnIgfHwgYWRkcmVzc2VzID09IG51bGwgfHwgYWRkcmVzc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNiKGVyciA/PyBuZXcgSW5mb3JtYXRpb25hbEVycm9yKCdObyBETlMgZW50cmllcyBmb3VuZCcpKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRSZWNvcmRzKG9yaWdpbiwgYWRkcmVzc2VzKVxuICAgICAgICBjb25zdCByZWNvcmRzID0gdGhpcy4jcmVjb3Jkcy5nZXQob3JpZ2luLmhvc3RuYW1lKVxuXG4gICAgICAgIGNvbnN0IGlwID0gdGhpcy5waWNrKFxuICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICByZWNvcmRzLFxuICAgICAgICAgIG5ld09wdHMuYWZmaW5pdHlcbiAgICAgICAgKVxuXG4gICAgICAgIGxldCBwb3J0XG4gICAgICAgIGlmICh0eXBlb2YgaXAucG9ydCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBwb3J0ID0gYDoke2lwLnBvcnR9YFxuICAgICAgICB9IGVsc2UgaWYgKG9yaWdpbi5wb3J0ICE9PSAnJykge1xuICAgICAgICAgIHBvcnQgPSBgOiR7b3JpZ2luLnBvcnR9YFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBvcnQgPSAnJ1xuICAgICAgICB9XG5cbiAgICAgICAgY2IoXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBgJHtvcmlnaW4ucHJvdG9jb2x9Ly8ke1xuICAgICAgICAgICAgaXAuZmFtaWx5ID09PSA2ID8gYFske2lwLmFkZHJlc3N9XWAgOiBpcC5hZGRyZXNzXG4gICAgICAgICAgfSR7cG9ydH1gXG4gICAgICAgIClcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHRoZXJlJ3MgSVBzIHdlIHBpY2tcbiAgICAgIGNvbnN0IGlwID0gdGhpcy5waWNrKFxuICAgICAgICBvcmlnaW4sXG4gICAgICAgIGlwcyxcbiAgICAgICAgbmV3T3B0cy5hZmZpbml0eVxuICAgICAgKVxuXG4gICAgICAvLyBJZiBubyBJUHMgd2UgbG9va3VwIC0gZGVsZXRpbmcgb2xkIHJlY29yZHNcbiAgICAgIGlmIChpcCA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuI3JlY29yZHMuZGVsZXRlKG9yaWdpbi5ob3N0bmFtZSlcbiAgICAgICAgdGhpcy5ydW5Mb29rdXAob3JpZ2luLCBvcHRzLCBjYilcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGxldCBwb3J0XG4gICAgICBpZiAodHlwZW9mIGlwLnBvcnQgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHBvcnQgPSBgOiR7aXAucG9ydH1gXG4gICAgICB9IGVsc2UgaWYgKG9yaWdpbi5wb3J0ICE9PSAnJykge1xuICAgICAgICBwb3J0ID0gYDoke29yaWdpbi5wb3J0fWBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBvcnQgPSAnJ1xuICAgICAgfVxuXG4gICAgICBjYihcbiAgICAgICAgbnVsbCxcbiAgICAgICAgYCR7b3JpZ2luLnByb3RvY29sfS8vJHtcbiAgICAgICAgICBpcC5mYW1pbHkgPT09IDYgPyBgWyR7aXAuYWRkcmVzc31dYCA6IGlwLmFkZHJlc3NcbiAgICAgICAgfSR7cG9ydH1gXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgI2RlZmF1bHRMb29rdXAgKG9yaWdpbiwgb3B0cywgY2IpIHtcbiAgICBsb29rdXAoXG4gICAgICBvcmlnaW4uaG9zdG5hbWUsXG4gICAgICB7XG4gICAgICAgIGFsbDogdHJ1ZSxcbiAgICAgICAgZmFtaWx5OiB0aGlzLmR1YWxTdGFjayA9PT0gZmFsc2UgPyB0aGlzLmFmZmluaXR5IDogMCxcbiAgICAgICAgb3JkZXI6ICdpcHY0Zmlyc3QnXG4gICAgICB9LFxuICAgICAgKGVyciwgYWRkcmVzc2VzKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZXR1cm4gY2IoZXJyKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IG5ldyBNYXAoKVxuXG4gICAgICAgIGZvciAoY29uc3QgYWRkciBvZiBhZGRyZXNzZXMpIHtcbiAgICAgICAgICAvLyBPbiBsaW51eCB3ZSBmb3VuZCBkdXBsaWNhdGVzLCB3ZSBhdHRlbXB0IHRvIHJlbW92ZSB0aGVtIHdpdGhcbiAgICAgICAgICAvLyB0aGUgbGF0ZXN0IHJlY29yZFxuICAgICAgICAgIHJlc3VsdHMuc2V0KGAke2FkZHIuYWRkcmVzc306JHthZGRyLmZhbWlseX1gLCBhZGRyKVxuICAgICAgICB9XG5cbiAgICAgICAgY2IobnVsbCwgcmVzdWx0cy52YWx1ZXMoKSlcbiAgICAgIH1cbiAgICApXG4gIH1cblxuICAjZGVmYXVsdFBpY2sgKG9yaWdpbiwgaG9zdG5hbWVSZWNvcmRzLCBhZmZpbml0eSkge1xuICAgIGxldCBpcCA9IG51bGxcbiAgICBjb25zdCB7IHJlY29yZHMsIG9mZnNldCB9ID0gaG9zdG5hbWVSZWNvcmRzXG5cbiAgICBsZXQgZmFtaWx5XG4gICAgaWYgKHRoaXMuZHVhbFN0YWNrKSB7XG4gICAgICBpZiAoYWZmaW5pdHkgPT0gbnVsbCkge1xuICAgICAgICAvLyBCYWxhbmNlIGJldHdlZW4gaXAgZmFtaWxpZXNcbiAgICAgICAgaWYgKG9mZnNldCA9PSBudWxsIHx8IG9mZnNldCA9PT0gbWF4SW50KSB7XG4gICAgICAgICAgaG9zdG5hbWVSZWNvcmRzLm9mZnNldCA9IDBcbiAgICAgICAgICBhZmZpbml0eSA9IDRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBob3N0bmFtZVJlY29yZHMub2Zmc2V0KytcbiAgICAgICAgICBhZmZpbml0eSA9IChob3N0bmFtZVJlY29yZHMub2Zmc2V0ICYgMSkgPT09IDEgPyA2IDogNFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWNvcmRzW2FmZmluaXR5XSAhPSBudWxsICYmIHJlY29yZHNbYWZmaW5pdHldLmlwcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZhbWlseSA9IHJlY29yZHNbYWZmaW5pdHldXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmYW1pbHkgPSByZWNvcmRzW2FmZmluaXR5ID09PSA0ID8gNiA6IDRdXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZhbWlseSA9IHJlY29yZHNbYWZmaW5pdHldXG4gICAgfVxuXG4gICAgLy8gSWYgbm8gSVBzIHdlIHJldHVybiBudWxsXG4gICAgaWYgKGZhbWlseSA9PSBudWxsIHx8IGZhbWlseS5pcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gaXBcbiAgICB9XG5cbiAgICBpZiAoZmFtaWx5Lm9mZnNldCA9PSBudWxsIHx8IGZhbWlseS5vZmZzZXQgPT09IG1heEludCkge1xuICAgICAgZmFtaWx5Lm9mZnNldCA9IDBcbiAgICB9IGVsc2Uge1xuICAgICAgZmFtaWx5Lm9mZnNldCsrXG4gICAgfVxuXG4gICAgY29uc3QgcG9zaXRpb24gPSBmYW1pbHkub2Zmc2V0ICUgZmFtaWx5Lmlwcy5sZW5ndGhcbiAgICBpcCA9IGZhbWlseS5pcHNbcG9zaXRpb25dID8/IG51bGxcblxuICAgIGlmIChpcCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gaXBcbiAgICB9XG5cbiAgICBpZiAoRGF0ZS5ub3coKSAtIGlwLnRpbWVzdGFtcCA+IGlwLnR0bCkgeyAvLyByZWNvcmQgVFRMIGlzIGFscmVhZHkgaW4gbXNcbiAgICAgIC8vIFdlIGRlbGV0ZSBleHBpcmVkIHJlY29yZHNcbiAgICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhleSBoYXZlIGRpZmZlcmVudCBUVEwsIHNvIHdlIG1hbmFnZSB0aGVtIGluZGl2aWR1YWxseVxuICAgICAgZmFtaWx5Lmlwcy5zcGxpY2UocG9zaXRpb24sIDEpXG4gICAgICByZXR1cm4gdGhpcy5waWNrKG9yaWdpbiwgaG9zdG5hbWVSZWNvcmRzLCBhZmZpbml0eSlcbiAgICB9XG5cbiAgICByZXR1cm4gaXBcbiAgfVxuXG4gIHNldFJlY29yZHMgKG9yaWdpbiwgYWRkcmVzc2VzKSB7XG4gICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKVxuICAgIGNvbnN0IHJlY29yZHMgPSB7IHJlY29yZHM6IHsgNDogbnVsbCwgNjogbnVsbCB9IH1cbiAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiBhZGRyZXNzZXMpIHtcbiAgICAgIHJlY29yZC50aW1lc3RhbXAgPSB0aW1lc3RhbXBcbiAgICAgIGlmICh0eXBlb2YgcmVjb3JkLnR0bCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgLy8gVGhlIHJlY29yZCBUVEwgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gbXNcbiAgICAgICAgcmVjb3JkLnR0bCA9IE1hdGgubWluKHJlY29yZC50dGwsIHRoaXMuI21heFRUTClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlY29yZC50dGwgPSB0aGlzLiNtYXhUVExcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmFtaWx5UmVjb3JkcyA9IHJlY29yZHMucmVjb3Jkc1tyZWNvcmQuZmFtaWx5XSA/PyB7IGlwczogW10gfVxuXG4gICAgICBmYW1pbHlSZWNvcmRzLmlwcy5wdXNoKHJlY29yZClcbiAgICAgIHJlY29yZHMucmVjb3Jkc1tyZWNvcmQuZmFtaWx5XSA9IGZhbWlseVJlY29yZHNcbiAgICB9XG5cbiAgICB0aGlzLiNyZWNvcmRzLnNldChvcmlnaW4uaG9zdG5hbWUsIHJlY29yZHMpXG4gIH1cblxuICBnZXRIYW5kbGVyIChtZXRhLCBvcHRzKSB7XG4gICAgcmV0dXJuIG5ldyBETlNEaXNwYXRjaEhhbmRsZXIodGhpcywgbWV0YSwgb3B0cylcbiAgfVxufVxuXG5jbGFzcyBETlNEaXNwYXRjaEhhbmRsZXIgZXh0ZW5kcyBEZWNvcmF0b3JIYW5kbGVyIHtcbiAgI3N0YXRlID0gbnVsbFxuICAjb3B0cyA9IG51bGxcbiAgI2Rpc3BhdGNoID0gbnVsbFxuICAjaGFuZGxlciA9IG51bGxcbiAgI29yaWdpbiA9IG51bGxcblxuICBjb25zdHJ1Y3RvciAoc3RhdGUsIHsgb3JpZ2luLCBoYW5kbGVyLCBkaXNwYXRjaCB9LCBvcHRzKSB7XG4gICAgc3VwZXIoaGFuZGxlcilcbiAgICB0aGlzLiNvcmlnaW4gPSBvcmlnaW5cbiAgICB0aGlzLiNoYW5kbGVyID0gaGFuZGxlclxuICAgIHRoaXMuI29wdHMgPSB7IC4uLm9wdHMgfVxuICAgIHRoaXMuI3N0YXRlID0gc3RhdGVcbiAgICB0aGlzLiNkaXNwYXRjaCA9IGRpc3BhdGNoXG4gIH1cblxuICBvbkVycm9yIChlcnIpIHtcbiAgICBzd2l0Y2ggKGVyci5jb2RlKSB7XG4gICAgICBjYXNlICdFVElNRURPVVQnOlxuICAgICAgY2FzZSAnRUNPTk5SRUZVU0VEJzoge1xuICAgICAgICBpZiAodGhpcy4jc3RhdGUuZHVhbFN0YWNrKSB7XG4gICAgICAgICAgLy8gV2UgZGVsZXRlIHRoZSByZWNvcmQgYW5kIHJldHJ5XG4gICAgICAgICAgdGhpcy4jc3RhdGUucnVuTG9va3VwKHRoaXMuI29yaWdpbiwgdGhpcy4jb3B0cywgKGVyciwgbmV3T3JpZ2luKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLiNoYW5kbGVyLm9uRXJyb3IoZXJyKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkaXNwYXRjaE9wdHMgPSB7XG4gICAgICAgICAgICAgIC4uLnRoaXMuI29wdHMsXG4gICAgICAgICAgICAgIG9yaWdpbjogbmV3T3JpZ2luXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuI2Rpc3BhdGNoKGRpc3BhdGNoT3B0cywgdGhpcylcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgLy8gaWYgZHVhbC1zdGFjayBkaXNhYmxlZCwgd2UgZXJyb3Igb3V0XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLiNoYW5kbGVyLm9uRXJyb3IoZXJyKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VOT1RGT1VORCc6XG4gICAgICAgIHRoaXMuI3N0YXRlLmRlbGV0ZVJlY29yZCh0aGlzLiNvcmlnaW4pXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuI2hhbmRsZXIub25FcnJvcihlcnIpXG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW50ZXJjZXB0b3JPcHRzID0+IHtcbiAgaWYgKFxuICAgIGludGVyY2VwdG9yT3B0cz8ubWF4VFRMICE9IG51bGwgJiZcbiAgICAodHlwZW9mIGludGVyY2VwdG9yT3B0cz8ubWF4VFRMICE9PSAnbnVtYmVyJyB8fCBpbnRlcmNlcHRvck9wdHM/Lm1heFRUTCA8IDApXG4gICkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignSW52YWxpZCBtYXhUVEwuIE11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKVxuICB9XG5cbiAgaWYgKFxuICAgIGludGVyY2VwdG9yT3B0cz8ubWF4SXRlbXMgIT0gbnVsbCAmJlxuICAgICh0eXBlb2YgaW50ZXJjZXB0b3JPcHRzPy5tYXhJdGVtcyAhPT0gJ251bWJlcicgfHxcbiAgICAgIGludGVyY2VwdG9yT3B0cz8ubWF4SXRlbXMgPCAxKVxuICApIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAnSW52YWxpZCBtYXhJdGVtcy4gTXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciBhbmQgZ3JlYXRlciB0aGFuIHplcm8nXG4gICAgKVxuICB9XG5cbiAgaWYgKFxuICAgIGludGVyY2VwdG9yT3B0cz8uYWZmaW5pdHkgIT0gbnVsbCAmJlxuICAgIGludGVyY2VwdG9yT3B0cz8uYWZmaW5pdHkgIT09IDQgJiZcbiAgICBpbnRlcmNlcHRvck9wdHM/LmFmZmluaXR5ICE9PSA2XG4gICkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignSW52YWxpZCBhZmZpbml0eS4gTXVzdCBiZSBlaXRoZXIgNCBvciA2JylcbiAgfVxuXG4gIGlmIChcbiAgICBpbnRlcmNlcHRvck9wdHM/LmR1YWxTdGFjayAhPSBudWxsICYmXG4gICAgdHlwZW9mIGludGVyY2VwdG9yT3B0cz8uZHVhbFN0YWNrICE9PSAnYm9vbGVhbidcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdJbnZhbGlkIGR1YWxTdGFjay4gTXVzdCBiZSBhIGJvb2xlYW4nKVxuICB9XG5cbiAgaWYgKFxuICAgIGludGVyY2VwdG9yT3B0cz8ubG9va3VwICE9IG51bGwgJiZcbiAgICB0eXBlb2YgaW50ZXJjZXB0b3JPcHRzPy5sb29rdXAgIT09ICdmdW5jdGlvbidcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdJbnZhbGlkIGxvb2t1cC4gTXVzdCBiZSBhIGZ1bmN0aW9uJylcbiAgfVxuXG4gIGlmIChcbiAgICBpbnRlcmNlcHRvck9wdHM/LnBpY2sgIT0gbnVsbCAmJlxuICAgIHR5cGVvZiBpbnRlcmNlcHRvck9wdHM/LnBpY2sgIT09ICdmdW5jdGlvbidcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdJbnZhbGlkIHBpY2suIE11c3QgYmUgYSBmdW5jdGlvbicpXG4gIH1cblxuICBjb25zdCBkdWFsU3RhY2sgPSBpbnRlcmNlcHRvck9wdHM/LmR1YWxTdGFjayA/PyB0cnVlXG4gIGxldCBhZmZpbml0eVxuICBpZiAoZHVhbFN0YWNrKSB7XG4gICAgYWZmaW5pdHkgPSBpbnRlcmNlcHRvck9wdHM/LmFmZmluaXR5ID8/IG51bGxcbiAgfSBlbHNlIHtcbiAgICBhZmZpbml0eSA9IGludGVyY2VwdG9yT3B0cz8uYWZmaW5pdHkgPz8gNFxuICB9XG5cbiAgY29uc3Qgb3B0cyA9IHtcbiAgICBtYXhUVEw6IGludGVyY2VwdG9yT3B0cz8ubWF4VFRMID8/IDEwZTMsIC8vIEV4cHJlc3NlZCBpbiBtc1xuICAgIGxvb2t1cDogaW50ZXJjZXB0b3JPcHRzPy5sb29rdXAgPz8gbnVsbCxcbiAgICBwaWNrOiBpbnRlcmNlcHRvck9wdHM/LnBpY2sgPz8gbnVsbCxcbiAgICBkdWFsU3RhY2ssXG4gICAgYWZmaW5pdHksXG4gICAgbWF4SXRlbXM6IGludGVyY2VwdG9yT3B0cz8ubWF4SXRlbXMgPz8gSW5maW5pdHlcbiAgfVxuXG4gIGNvbnN0IGluc3RhbmNlID0gbmV3IEROU0luc3RhbmNlKG9wdHMpXG5cbiAgcmV0dXJuIGRpc3BhdGNoID0+IHtcbiAgICByZXR1cm4gZnVuY3Rpb24gZG5zSW50ZXJjZXB0b3IgKG9yaWdEaXNwYXRjaE9wdHMsIGhhbmRsZXIpIHtcbiAgICAgIGNvbnN0IG9yaWdpbiA9XG4gICAgICAgIG9yaWdEaXNwYXRjaE9wdHMub3JpZ2luLmNvbnN0cnVjdG9yID09PSBVUkxcbiAgICAgICAgICA/IG9yaWdEaXNwYXRjaE9wdHMub3JpZ2luXG4gICAgICAgICAgOiBuZXcgVVJMKG9yaWdEaXNwYXRjaE9wdHMub3JpZ2luKVxuXG4gICAgICBpZiAoaXNJUChvcmlnaW4uaG9zdG5hbWUpICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBkaXNwYXRjaChvcmlnRGlzcGF0Y2hPcHRzLCBoYW5kbGVyKVxuICAgICAgfVxuXG4gICAgICBpbnN0YW5jZS5ydW5Mb29rdXAob3JpZ2luLCBvcmlnRGlzcGF0Y2hPcHRzLCAoZXJyLCBuZXdPcmlnaW4pID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiBoYW5kbGVyLm9uRXJyb3IoZXJyKVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRpc3BhdGNoT3B0cyA9IG51bGxcbiAgICAgICAgZGlzcGF0Y2hPcHRzID0ge1xuICAgICAgICAgIC4uLm9yaWdEaXNwYXRjaE9wdHMsXG4gICAgICAgICAgc2VydmVybmFtZTogb3JpZ2luLmhvc3RuYW1lLCAvLyBGb3IgU05JIG9uIFRMU1xuICAgICAgICAgIG9yaWdpbjogbmV3T3JpZ2luLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIGhvc3Q6IG9yaWdpbi5ob3N0bmFtZSxcbiAgICAgICAgICAgIC4uLm9yaWdEaXNwYXRjaE9wdHMuaGVhZGVyc1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgIGRpc3BhdGNoT3B0cyxcbiAgICAgICAgICBpbnN0YW5jZS5nZXRIYW5kbGVyKHsgb3JpZ2luLCBkaXNwYXRjaCwgaGFuZGxlciB9LCBvcmlnRGlzcGF0Y2hPcHRzKVxuICAgICAgICApXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxufVxuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL0V0aGFuLUFycm93b29kL3VuZGljaS1mZXRjaFxuXG4ndXNlIHN0cmljdCdcblxuY29uc3QgeyBrQ29uc3RydWN0IH0gPSByZXF1aXJlKCcuLi8uLi9jb3JlL3N5bWJvbHMnKVxuY29uc3QgeyBrRW51bWVyYWJsZVByb3BlcnR5IH0gPSByZXF1aXJlKCcuLi8uLi9jb3JlL3V0aWwnKVxuY29uc3Qge1xuICBpdGVyYXRvck1peGluLFxuICBpc1ZhbGlkSGVhZGVyTmFtZSxcbiAgaXNWYWxpZEhlYWRlclZhbHVlXG59ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHsgd2ViaWRsIH0gPSByZXF1aXJlKCcuL3dlYmlkbCcpXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdub2RlOmFzc2VydCcpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnbm9kZTp1dGlsJylcblxuY29uc3Qga0hlYWRlcnNNYXAgPSBTeW1ib2woJ2hlYWRlcnMgbWFwJylcbmNvbnN0IGtIZWFkZXJzU29ydGVkTWFwID0gU3ltYm9sKCdoZWFkZXJzIG1hcCBzb3J0ZWQnKVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlXG4gKi9cbmZ1bmN0aW9uIGlzSFRUUFdoaXRlU3BhY2VDaGFyQ29kZSAoY29kZSkge1xuICByZXR1cm4gY29kZSA9PT0gMHgwMGEgfHwgY29kZSA9PT0gMHgwMGQgfHwgY29kZSA9PT0gMHgwMDkgfHwgY29kZSA9PT0gMHgwMjBcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWhlYWRlci12YWx1ZS1ub3JtYWxpemVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwb3RlbnRpYWxWYWx1ZVxuICovXG5mdW5jdGlvbiBoZWFkZXJWYWx1ZU5vcm1hbGl6ZSAocG90ZW50aWFsVmFsdWUpIHtcbiAgLy8gIFRvIG5vcm1hbGl6ZSBhIGJ5dGUgc2VxdWVuY2UgcG90ZW50aWFsVmFsdWUsIHJlbW92ZVxuICAvLyAgYW55IGxlYWRpbmcgYW5kIHRyYWlsaW5nIEhUVFAgd2hpdGVzcGFjZSBieXRlcyBmcm9tXG4gIC8vICBwb3RlbnRpYWxWYWx1ZS5cbiAgbGV0IGkgPSAwOyBsZXQgaiA9IHBvdGVudGlhbFZhbHVlLmxlbmd0aFxuXG4gIHdoaWxlIChqID4gaSAmJiBpc0hUVFBXaGl0ZVNwYWNlQ2hhckNvZGUocG90ZW50aWFsVmFsdWUuY2hhckNvZGVBdChqIC0gMSkpKSAtLWpcbiAgd2hpbGUgKGogPiBpICYmIGlzSFRUUFdoaXRlU3BhY2VDaGFyQ29kZShwb3RlbnRpYWxWYWx1ZS5jaGFyQ29kZUF0KGkpKSkgKytpXG5cbiAgcmV0dXJuIGkgPT09IDAgJiYgaiA9PT0gcG90ZW50aWFsVmFsdWUubGVuZ3RoID8gcG90ZW50aWFsVmFsdWUgOiBwb3RlbnRpYWxWYWx1ZS5zdWJzdHJpbmcoaSwgailcbn1cblxuZnVuY3Rpb24gZmlsbCAoaGVhZGVycywgb2JqZWN0KSB7XG4gIC8vIFRvIGZpbGwgYSBIZWFkZXJzIG9iamVjdCBoZWFkZXJzIHdpdGggYSBnaXZlbiBvYmplY3Qgb2JqZWN0LCBydW4gdGhlc2Ugc3RlcHM6XG5cbiAgLy8gMS4gSWYgb2JqZWN0IGlzIGEgc2VxdWVuY2UsIHRoZW4gZm9yIGVhY2ggaGVhZGVyIGluIG9iamVjdDpcbiAgLy8gTm90ZTogd2ViaWRsIGNvbnZlcnNpb24gdG8gYXJyYXkgaGFzIGFscmVhZHkgYmVlbiBkb25lLlxuICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmplY3QubGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvbnN0IGhlYWRlciA9IG9iamVjdFtpXVxuICAgICAgLy8gMS4gSWYgaGVhZGVyIGRvZXMgbm90IGNvbnRhaW4gZXhhY3RseSB0d28gaXRlbXMsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgICBpZiAoaGVhZGVyLmxlbmd0aCAhPT0gMikge1xuICAgICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgaGVhZGVyOiAnSGVhZGVycyBjb25zdHJ1Y3RvcicsXG4gICAgICAgICAgbWVzc2FnZTogYGV4cGVjdGVkIG5hbWUvdmFsdWUgcGFpciB0byBiZSBsZW5ndGggMiwgZm91bmQgJHtoZWFkZXIubGVuZ3RofS5gXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIEFwcGVuZCAoaGVhZGVy4oCZcyBmaXJzdCBpdGVtLCBoZWFkZXLigJlzIHNlY29uZCBpdGVtKSB0byBoZWFkZXJzLlxuICAgICAgYXBwZW5kSGVhZGVyKGhlYWRlcnMsIGhlYWRlclswXSwgaGVhZGVyWzFdKVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwpIHtcbiAgICAvLyBOb3RlOiBudWxsIHNob3VsZCB0aHJvd1xuXG4gICAgLy8gMi4gT3RoZXJ3aXNlLCBvYmplY3QgaXMgYSByZWNvcmQsIHRoZW4gZm9yIGVhY2gga2V5IOKGkiB2YWx1ZSBpbiBvYmplY3QsXG4gICAgLy8gICAgYXBwZW5kIChrZXksIHZhbHVlKSB0byBoZWFkZXJzXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGFwcGVuZEhlYWRlcihoZWFkZXJzLCBrZXlzW2ldLCBvYmplY3Rba2V5c1tpXV0pXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuY29udmVyc2lvbkZhaWxlZCh7XG4gICAgICBwcmVmaXg6ICdIZWFkZXJzIGNvbnN0cnVjdG9yJyxcbiAgICAgIGFyZ3VtZW50OiAnQXJndW1lbnQgMScsXG4gICAgICB0eXBlczogWydzZXF1ZW5jZTxzZXF1ZW5jZTxCeXRlU3RyaW5nPj4nLCAncmVjb3JkPEJ5dGVTdHJpbmcsIEJ5dGVTdHJpbmc+J11cbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1oZWFkZXJzLWFwcGVuZFxuICovXG5mdW5jdGlvbiBhcHBlbmRIZWFkZXIgKGhlYWRlcnMsIG5hbWUsIHZhbHVlKSB7XG4gIC8vIDEuIE5vcm1hbGl6ZSB2YWx1ZS5cbiAgdmFsdWUgPSBoZWFkZXJWYWx1ZU5vcm1hbGl6ZSh2YWx1ZSlcblxuICAvLyAyLiBJZiBuYW1lIGlzIG5vdCBhIGhlYWRlciBuYW1lIG9yIHZhbHVlIGlzIG5vdCBhXG4gIC8vICAgIGhlYWRlciB2YWx1ZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgaWYgKCFpc1ZhbGlkSGVhZGVyTmFtZShuYW1lKSkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuaW52YWxpZEFyZ3VtZW50KHtcbiAgICAgIHByZWZpeDogJ0hlYWRlcnMuYXBwZW5kJyxcbiAgICAgIHZhbHVlOiBuYW1lLFxuICAgICAgdHlwZTogJ2hlYWRlciBuYW1lJ1xuICAgIH0pXG4gIH0gZWxzZSBpZiAoIWlzVmFsaWRIZWFkZXJWYWx1ZSh2YWx1ZSkpIHtcbiAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmludmFsaWRBcmd1bWVudCh7XG4gICAgICBwcmVmaXg6ICdIZWFkZXJzLmFwcGVuZCcsXG4gICAgICB2YWx1ZSxcbiAgICAgIHR5cGU6ICdoZWFkZXIgdmFsdWUnXG4gICAgfSlcbiAgfVxuXG4gIC8vIDMuIElmIGhlYWRlcnPigJlzIGd1YXJkIGlzIFwiaW1tdXRhYmxlXCIsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gIC8vIDQuIE90aGVyd2lzZSwgaWYgaGVhZGVyc+KAmXMgZ3VhcmQgaXMgXCJyZXF1ZXN0XCIgYW5kIG5hbWUgaXMgYVxuICAvLyAgICBmb3JiaWRkZW4gaGVhZGVyIG5hbWUsIHJldHVybi5cbiAgLy8gNS4gT3RoZXJ3aXNlLCBpZiBoZWFkZXJz4oCZcyBndWFyZCBpcyBcInJlcXVlc3Qtbm8tY29yc1wiOlxuICAvLyAgICBUT0RPXG4gIC8vIE5vdGU6IHVuZGljaSBkb2VzIG5vdCBpbXBsZW1lbnQgZm9yYmlkZGVuIGhlYWRlciBuYW1lc1xuICBpZiAoZ2V0SGVhZGVyc0d1YXJkKGhlYWRlcnMpID09PSAnaW1tdXRhYmxlJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ltbXV0YWJsZScpXG4gIH1cblxuICAvLyA2LiBPdGhlcndpc2UsIGlmIGhlYWRlcnPigJlzIGd1YXJkIGlzIFwicmVzcG9uc2VcIiBhbmQgbmFtZSBpcyBhXG4gIC8vICAgIGZvcmJpZGRlbiByZXNwb25zZS1oZWFkZXIgbmFtZSwgcmV0dXJuLlxuXG4gIC8vIDcuIEFwcGVuZCAobmFtZSwgdmFsdWUpIHRvIGhlYWRlcnPigJlzIGhlYWRlciBsaXN0LlxuICByZXR1cm4gZ2V0SGVhZGVyc0xpc3QoaGVhZGVycykuYXBwZW5kKG5hbWUsIHZhbHVlLCBmYWxzZSlcblxuICAvLyA4LiBJZiBoZWFkZXJz4oCZcyBndWFyZCBpcyBcInJlcXVlc3Qtbm8tY29yc1wiLCB0aGVuIHJlbW92ZVxuICAvLyAgICBwcml2aWxlZ2VkIG5vLUNPUlMgcmVxdWVzdCBoZWFkZXJzIGZyb20gaGVhZGVyc1xufVxuXG5mdW5jdGlvbiBjb21wYXJlSGVhZGVyTmFtZSAoYSwgYikge1xuICByZXR1cm4gYVswXSA8IGJbMF0gPyAtMSA6IDFcbn1cblxuY2xhc3MgSGVhZGVyc0xpc3Qge1xuICAvKiogQHR5cGUge1tzdHJpbmcsIHN0cmluZ11bXXxudWxsfSAqL1xuICBjb29raWVzID0gbnVsbFxuXG4gIGNvbnN0cnVjdG9yIChpbml0KSB7XG4gICAgaWYgKGluaXQgaW5zdGFuY2VvZiBIZWFkZXJzTGlzdCkge1xuICAgICAgdGhpc1trSGVhZGVyc01hcF0gPSBuZXcgTWFwKGluaXRba0hlYWRlcnNNYXBdKVxuICAgICAgdGhpc1trSGVhZGVyc1NvcnRlZE1hcF0gPSBpbml0W2tIZWFkZXJzU29ydGVkTWFwXVxuICAgICAgdGhpcy5jb29raWVzID0gaW5pdC5jb29raWVzID09PSBudWxsID8gbnVsbCA6IFsuLi5pbml0LmNvb2tpZXNdXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNba0hlYWRlcnNNYXBdID0gbmV3IE1hcChpbml0KVxuICAgICAgdGhpc1trSGVhZGVyc1NvcnRlZE1hcF0gPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2hlYWRlci1saXN0LWNvbnRhaW5zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNMb3dlckNhc2VcbiAgICovXG4gIGNvbnRhaW5zIChuYW1lLCBpc0xvd2VyQ2FzZSkge1xuICAgIC8vIEEgaGVhZGVyIGxpc3QgbGlzdCBjb250YWlucyBhIGhlYWRlciBuYW1lIG5hbWUgaWYgbGlzdFxuICAgIC8vIGNvbnRhaW5zIGEgaGVhZGVyIHdob3NlIG5hbWUgaXMgYSBieXRlLWNhc2UtaW5zZW5zaXRpdmVcbiAgICAvLyBtYXRjaCBmb3IgbmFtZS5cblxuICAgIHJldHVybiB0aGlzW2tIZWFkZXJzTWFwXS5oYXMoaXNMb3dlckNhc2UgPyBuYW1lIDogbmFtZS50b0xvd2VyQ2FzZSgpKVxuICB9XG5cbiAgY2xlYXIgKCkge1xuICAgIHRoaXNba0hlYWRlcnNNYXBdLmNsZWFyKClcbiAgICB0aGlzW2tIZWFkZXJzU29ydGVkTWFwXSA9IG51bGxcbiAgICB0aGlzLmNvb2tpZXMgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1oZWFkZXItbGlzdC1hcHBlbmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNMb3dlckNhc2VcbiAgICovXG4gIGFwcGVuZCAobmFtZSwgdmFsdWUsIGlzTG93ZXJDYXNlKSB7XG4gICAgdGhpc1trSGVhZGVyc1NvcnRlZE1hcF0gPSBudWxsXG5cbiAgICAvLyAxLiBJZiBsaXN0IGNvbnRhaW5zIG5hbWUsIHRoZW4gc2V0IG5hbWUgdG8gdGhlIGZpcnN0IHN1Y2hcbiAgICAvLyAgICBoZWFkZXLigJlzIG5hbWUuXG4gICAgY29uc3QgbG93ZXJjYXNlTmFtZSA9IGlzTG93ZXJDYXNlID8gbmFtZSA6IG5hbWUudG9Mb3dlckNhc2UoKVxuICAgIGNvbnN0IGV4aXN0cyA9IHRoaXNba0hlYWRlcnNNYXBdLmdldChsb3dlcmNhc2VOYW1lKVxuXG4gICAgLy8gMi4gQXBwZW5kIChuYW1lLCB2YWx1ZSkgdG8gbGlzdC5cbiAgICBpZiAoZXhpc3RzKSB7XG4gICAgICBjb25zdCBkZWxpbWl0ZXIgPSBsb3dlcmNhc2VOYW1lID09PSAnY29va2llJyA/ICc7ICcgOiAnLCAnXG4gICAgICB0aGlzW2tIZWFkZXJzTWFwXS5zZXQobG93ZXJjYXNlTmFtZSwge1xuICAgICAgICBuYW1lOiBleGlzdHMubmFtZSxcbiAgICAgICAgdmFsdWU6IGAke2V4aXN0cy52YWx1ZX0ke2RlbGltaXRlcn0ke3ZhbHVlfWBcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNba0hlYWRlcnNNYXBdLnNldChsb3dlcmNhc2VOYW1lLCB7IG5hbWUsIHZhbHVlIH0pXG4gICAgfVxuXG4gICAgaWYgKGxvd2VyY2FzZU5hbWUgPT09ICdzZXQtY29va2llJykge1xuICAgICAgKHRoaXMuY29va2llcyA/Pz0gW10pLnB1c2godmFsdWUpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtaGVhZGVyLWxpc3Qtc2V0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzTG93ZXJDYXNlXG4gICAqL1xuICBzZXQgKG5hbWUsIHZhbHVlLCBpc0xvd2VyQ2FzZSkge1xuICAgIHRoaXNba0hlYWRlcnNTb3J0ZWRNYXBdID0gbnVsbFxuICAgIGNvbnN0IGxvd2VyY2FzZU5hbWUgPSBpc0xvd2VyQ2FzZSA/IG5hbWUgOiBuYW1lLnRvTG93ZXJDYXNlKClcblxuICAgIGlmIChsb3dlcmNhc2VOYW1lID09PSAnc2V0LWNvb2tpZScpIHtcbiAgICAgIHRoaXMuY29va2llcyA9IFt2YWx1ZV1cbiAgICB9XG5cbiAgICAvLyAxLiBJZiBsaXN0IGNvbnRhaW5zIG5hbWUsIHRoZW4gc2V0IHRoZSB2YWx1ZSBvZlxuICAgIC8vICAgIHRoZSBmaXJzdCBzdWNoIGhlYWRlciB0byB2YWx1ZSBhbmQgcmVtb3ZlIHRoZVxuICAgIC8vICAgIG90aGVycy5cbiAgICAvLyAyLiBPdGhlcndpc2UsIGFwcGVuZCBoZWFkZXIgKG5hbWUsIHZhbHVlKSB0byBsaXN0LlxuICAgIHRoaXNba0hlYWRlcnNNYXBdLnNldChsb3dlcmNhc2VOYW1lLCB7IG5hbWUsIHZhbHVlIH0pXG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1oZWFkZXItbGlzdC1kZWxldGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtib29sZWFufSBpc0xvd2VyQ2FzZVxuICAgKi9cbiAgZGVsZXRlIChuYW1lLCBpc0xvd2VyQ2FzZSkge1xuICAgIHRoaXNba0hlYWRlcnNTb3J0ZWRNYXBdID0gbnVsbFxuICAgIGlmICghaXNMb3dlckNhc2UpIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKClcblxuICAgIGlmIChuYW1lID09PSAnc2V0LWNvb2tpZScpIHtcbiAgICAgIHRoaXMuY29va2llcyA9IG51bGxcbiAgICB9XG5cbiAgICB0aGlzW2tIZWFkZXJzTWFwXS5kZWxldGUobmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWhlYWRlci1saXN0LWdldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzTG93ZXJDYXNlXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfVxuICAgKi9cbiAgZ2V0IChuYW1lLCBpc0xvd2VyQ2FzZSkge1xuICAgIC8vIDEuIElmIGxpc3QgZG9lcyBub3QgY29udGFpbiBuYW1lLCB0aGVuIHJldHVybiBudWxsLlxuICAgIC8vIDIuIFJldHVybiB0aGUgdmFsdWVzIG9mIGFsbCBoZWFkZXJzIGluIGxpc3Qgd2hvc2UgbmFtZVxuICAgIC8vICAgIGlzIGEgYnl0ZS1jYXNlLWluc2Vuc2l0aXZlIG1hdGNoIGZvciBuYW1lLFxuICAgIC8vICAgIHNlcGFyYXRlZCBmcm9tIGVhY2ggb3RoZXIgYnkgMHgyQyAweDIwLCBpbiBvcmRlci5cbiAgICByZXR1cm4gdGhpc1trSGVhZGVyc01hcF0uZ2V0KGlzTG93ZXJDYXNlID8gbmFtZSA6IG5hbWUudG9Mb3dlckNhc2UoKSk/LnZhbHVlID8/IG51bGxcbiAgfVxuXG4gICogW1N5bWJvbC5pdGVyYXRvcl0gKCkge1xuICAgIC8vIHVzZSB0aGUgbG93ZXJjYXNlZCBuYW1lXG4gICAgZm9yIChjb25zdCB7IDA6IG5hbWUsIDE6IHsgdmFsdWUgfSB9IG9mIHRoaXNba0hlYWRlcnNNYXBdKSB7XG4gICAgICB5aWVsZCBbbmFtZSwgdmFsdWVdXG4gICAgfVxuICB9XG5cbiAgZ2V0IGVudHJpZXMgKCkge1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fVxuXG4gICAgaWYgKHRoaXNba0hlYWRlcnNNYXBdLnNpemUgIT09IDApIHtcbiAgICAgIGZvciAoY29uc3QgeyBuYW1lLCB2YWx1ZSB9IG9mIHRoaXNba0hlYWRlcnNNYXBdLnZhbHVlcygpKSB7XG4gICAgICAgIGhlYWRlcnNbbmFtZV0gPSB2YWx1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cblxuICByYXdWYWx1ZXMgKCkge1xuICAgIHJldHVybiB0aGlzW2tIZWFkZXJzTWFwXS52YWx1ZXMoKVxuICB9XG5cbiAgZ2V0IGVudHJpZXNMaXN0ICgpIHtcbiAgICBjb25zdCBoZWFkZXJzID0gW11cblxuICAgIGlmICh0aGlzW2tIZWFkZXJzTWFwXS5zaXplICE9PSAwKSB7XG4gICAgICBmb3IgKGNvbnN0IHsgMDogbG93ZXJOYW1lLCAxOiB7IG5hbWUsIHZhbHVlIH0gfSBvZiB0aGlzW2tIZWFkZXJzTWFwXSkge1xuICAgICAgICBpZiAobG93ZXJOYW1lID09PSAnc2V0LWNvb2tpZScpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNvb2tpZSBvZiB0aGlzLmNvb2tpZXMpIHtcbiAgICAgICAgICAgIGhlYWRlcnMucHVzaChbbmFtZSwgY29va2llXSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGVhZGVycy5wdXNoKFtuYW1lLCB2YWx1ZV0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaGVhZGVyc1xuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbnZlcnQtaGVhZGVyLW5hbWVzLXRvLWEtc29ydGVkLWxvd2VyY2FzZS1zZXRcbiAgdG9Tb3J0ZWRBcnJheSAoKSB7XG4gICAgY29uc3Qgc2l6ZSA9IHRoaXNba0hlYWRlcnNNYXBdLnNpemVcbiAgICBjb25zdCBhcnJheSA9IG5ldyBBcnJheShzaXplKVxuICAgIC8vIEluIG1vc3QgY2FzZXMsIHlvdSB3aWxsIHVzZSB0aGUgZmFzdC1wYXRoLlxuICAgIC8vIGZhc3QtcGF0aDogVXNlIGJpbmFyeSBpbnNlcnRpb24gc29ydCBmb3Igc21hbGwgYXJyYXlzLlxuICAgIGlmIChzaXplIDw9IDMyKSB7XG4gICAgICBpZiAoc2l6ZSA9PT0gMCkge1xuICAgICAgICAvLyBJZiBlbXB0eSwgaXQgaXMgYW4gZW1wdHkgYXJyYXkuIFRvIGF2b2lkIHRoZSBmaXJzdCBpbmRleCBhc3NpZ25tZW50LlxuICAgICAgICByZXR1cm4gYXJyYXlcbiAgICAgIH1cbiAgICAgIC8vIEltcHJvdmUgcGVyZm9ybWFuY2UgYnkgdW5yb2xsaW5nIGxvb3AgYW5kIGF2b2lkaW5nIGRvdWJsZS1sb29wLlxuICAgICAgLy8gRG91YmxlLWxvb3AtbGVzcyB2ZXJzaW9uIG9mIHRoZSBiaW5hcnkgaW5zZXJ0aW9uIHNvcnQuXG4gICAgICBjb25zdCBpdGVyYXRvciA9IHRoaXNba0hlYWRlcnNNYXBdW1N5bWJvbC5pdGVyYXRvcl0oKVxuICAgICAgY29uc3QgZmlyc3RWYWx1ZSA9IGl0ZXJhdG9yLm5leHQoKS52YWx1ZVxuICAgICAgLy8gc2V0IFtuYW1lLCB2YWx1ZV0gdG8gZmlyc3QgaW5kZXguXG4gICAgICBhcnJheVswXSA9IFtmaXJzdFZhbHVlWzBdLCBmaXJzdFZhbHVlWzFdLnZhbHVlXVxuICAgICAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtaGVhZGVyLWxpc3Qtc29ydC1hbmQtY29tYmluZVxuICAgICAgLy8gMy4yLjIuIEFzc2VydDogdmFsdWUgaXMgbm9uLW51bGwuXG4gICAgICBhc3NlcnQoZmlyc3RWYWx1ZVsxXS52YWx1ZSAhPT0gbnVsbClcbiAgICAgIGZvciAoXG4gICAgICAgIGxldCBpID0gMSwgaiA9IDAsIHJpZ2h0ID0gMCwgbGVmdCA9IDAsIHBpdm90ID0gMCwgeCwgdmFsdWU7XG4gICAgICAgIGkgPCBzaXplO1xuICAgICAgICArK2lcbiAgICAgICkge1xuICAgICAgICAvLyBnZXQgbmV4dCB2YWx1ZVxuICAgICAgICB2YWx1ZSA9IGl0ZXJhdG9yLm5leHQoKS52YWx1ZVxuICAgICAgICAvLyBzZXQgW25hbWUsIHZhbHVlXSB0byBjdXJyZW50IGluZGV4LlxuICAgICAgICB4ID0gYXJyYXlbaV0gPSBbdmFsdWVbMF0sIHZhbHVlWzFdLnZhbHVlXVxuICAgICAgICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1oZWFkZXItbGlzdC1zb3J0LWFuZC1jb21iaW5lXG4gICAgICAgIC8vIDMuMi4yLiBBc3NlcnQ6IHZhbHVlIGlzIG5vbi1udWxsLlxuICAgICAgICBhc3NlcnQoeFsxXSAhPT0gbnVsbClcbiAgICAgICAgbGVmdCA9IDBcbiAgICAgICAgcmlnaHQgPSBpXG4gICAgICAgIC8vIGJpbmFyeSBzZWFyY2hcbiAgICAgICAgd2hpbGUgKGxlZnQgPCByaWdodCkge1xuICAgICAgICAgIC8vIG1pZGRsZSBpbmRleFxuICAgICAgICAgIHBpdm90ID0gbGVmdCArICgocmlnaHQgLSBsZWZ0KSA+PiAxKVxuICAgICAgICAgIC8vIGNvbXBhcmUgaGVhZGVyIG5hbWVcbiAgICAgICAgICBpZiAoYXJyYXlbcGl2b3RdWzBdIDw9IHhbMF0pIHtcbiAgICAgICAgICAgIGxlZnQgPSBwaXZvdCArIDFcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmlnaHQgPSBwaXZvdFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaSAhPT0gcGl2b3QpIHtcbiAgICAgICAgICBqID0gaVxuICAgICAgICAgIHdoaWxlIChqID4gbGVmdCkge1xuICAgICAgICAgICAgYXJyYXlbal0gPSBhcnJheVstLWpdXG4gICAgICAgICAgfVxuICAgICAgICAgIGFycmF5W2xlZnRdID0geFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvKiBjOCBpZ25vcmUgbmV4dCA0ICovXG4gICAgICBpZiAoIWl0ZXJhdG9yLm5leHQoKS5kb25lKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgZm9yIGRlYnVnZ2luZyBhbmQgd2lsbCBuZXZlciBiZSBjYWxsZWQuXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1VucmVhY2hhYmxlJylcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGNhc2Ugd291bGQgYmUgYSByYXJlIG9jY3VycmVuY2UuXG4gICAgICAvLyBzbG93LXBhdGg6IGZhbGxiYWNrXG4gICAgICBsZXQgaSA9IDBcbiAgICAgIGZvciAoY29uc3QgeyAwOiBuYW1lLCAxOiB7IHZhbHVlIH0gfSBvZiB0aGlzW2tIZWFkZXJzTWFwXSkge1xuICAgICAgICBhcnJheVtpKytdID0gW25hbWUsIHZhbHVlXVxuICAgICAgICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1oZWFkZXItbGlzdC1zb3J0LWFuZC1jb21iaW5lXG4gICAgICAgIC8vIDMuMi4yLiBBc3NlcnQ6IHZhbHVlIGlzIG5vbi1udWxsLlxuICAgICAgICBhc3NlcnQodmFsdWUgIT09IG51bGwpXG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXkuc29ydChjb21wYXJlSGVhZGVyTmFtZSlcbiAgICB9XG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2hlYWRlcnMtY2xhc3NcbmNsYXNzIEhlYWRlcnMge1xuICAjZ3VhcmRcbiAgI2hlYWRlcnNMaXN0XG5cbiAgY29uc3RydWN0b3IgKGluaXQgPSB1bmRlZmluZWQpIHtcbiAgICB3ZWJpZGwudXRpbC5tYXJrQXNVbmNsb25lYWJsZSh0aGlzKVxuXG4gICAgaWYgKGluaXQgPT09IGtDb25zdHJ1Y3QpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuI2hlYWRlcnNMaXN0ID0gbmV3IEhlYWRlcnNMaXN0KClcblxuICAgIC8vIFRoZSBuZXcgSGVhZGVycyhpbml0KSBjb25zdHJ1Y3RvciBzdGVwcyBhcmU6XG5cbiAgICAvLyAxLiBTZXQgdGhpc+KAmXMgZ3VhcmQgdG8gXCJub25lXCIuXG4gICAgdGhpcy4jZ3VhcmQgPSAnbm9uZSdcblxuICAgIC8vIDIuIElmIGluaXQgaXMgZ2l2ZW4sIHRoZW4gZmlsbCB0aGlzIHdpdGggaW5pdC5cbiAgICBpZiAoaW5pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpbml0ID0gd2ViaWRsLmNvbnZlcnRlcnMuSGVhZGVyc0luaXQoaW5pdCwgJ0hlYWRlcnMgY29udHJ1Y3RvcicsICdpbml0JylcbiAgICAgIGZpbGwodGhpcywgaW5pdClcbiAgICB9XG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWhlYWRlcnMtYXBwZW5kXG4gIGFwcGVuZCAobmFtZSwgdmFsdWUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBIZWFkZXJzKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAyLCAnSGVhZGVycy5hcHBlbmQnKVxuXG4gICAgY29uc3QgcHJlZml4ID0gJ0hlYWRlcnMuYXBwZW5kJ1xuICAgIG5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5CeXRlU3RyaW5nKG5hbWUsIHByZWZpeCwgJ25hbWUnKVxuICAgIHZhbHVlID0gd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZyh2YWx1ZSwgcHJlZml4LCAndmFsdWUnKVxuXG4gICAgcmV0dXJuIGFwcGVuZEhlYWRlcih0aGlzLCBuYW1lLCB2YWx1ZSlcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkb20taGVhZGVycy1kZWxldGVcbiAgZGVsZXRlIChuYW1lKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgSGVhZGVycylcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgJ0hlYWRlcnMuZGVsZXRlJylcblxuICAgIGNvbnN0IHByZWZpeCA9ICdIZWFkZXJzLmRlbGV0ZSdcbiAgICBuYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZyhuYW1lLCBwcmVmaXgsICduYW1lJylcblxuICAgIC8vIDEuIElmIG5hbWUgaXMgbm90IGEgaGVhZGVyIG5hbWUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKCFpc1ZhbGlkSGVhZGVyTmFtZShuYW1lKSkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5pbnZhbGlkQXJndW1lbnQoe1xuICAgICAgICBwcmVmaXg6ICdIZWFkZXJzLmRlbGV0ZScsXG4gICAgICAgIHZhbHVlOiBuYW1lLFxuICAgICAgICB0eXBlOiAnaGVhZGVyIG5hbWUnXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDIuIElmIHRoaXPigJlzIGd1YXJkIGlzIFwiaW1tdXRhYmxlXCIsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgLy8gMy4gT3RoZXJ3aXNlLCBpZiB0aGlz4oCZcyBndWFyZCBpcyBcInJlcXVlc3RcIiBhbmQgbmFtZSBpcyBhXG4gICAgLy8gICAgZm9yYmlkZGVuIGhlYWRlciBuYW1lLCByZXR1cm4uXG4gICAgLy8gNC4gT3RoZXJ3aXNlLCBpZiB0aGlz4oCZcyBndWFyZCBpcyBcInJlcXVlc3Qtbm8tY29yc1wiLCBuYW1lXG4gICAgLy8gICAgaXMgbm90IGEgbm8tQ09SUy1zYWZlbGlzdGVkIHJlcXVlc3QtaGVhZGVyIG5hbWUsIGFuZFxuICAgIC8vICAgIG5hbWUgaXMgbm90IGEgcHJpdmlsZWdlZCBuby1DT1JTIHJlcXVlc3QtaGVhZGVyIG5hbWUsXG4gICAgLy8gICAgcmV0dXJuLlxuICAgIC8vIDUuIE90aGVyd2lzZSwgaWYgdGhpc+KAmXMgZ3VhcmQgaXMgXCJyZXNwb25zZVwiIGFuZCBuYW1lIGlzXG4gICAgLy8gICAgYSBmb3JiaWRkZW4gcmVzcG9uc2UtaGVhZGVyIG5hbWUsIHJldHVybi5cbiAgICAvLyBOb3RlOiB1bmRpY2kgZG9lcyBub3QgaW1wbGVtZW50IGZvcmJpZGRlbiBoZWFkZXIgbmFtZXNcbiAgICBpZiAodGhpcy4jZ3VhcmQgPT09ICdpbW11dGFibGUnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbW11dGFibGUnKVxuICAgIH1cblxuICAgIC8vIDYuIElmIHRoaXPigJlzIGhlYWRlciBsaXN0IGRvZXMgbm90IGNvbnRhaW4gbmFtZSwgdGhlblxuICAgIC8vICAgIHJldHVybi5cbiAgICBpZiAoIXRoaXMuI2hlYWRlcnNMaXN0LmNvbnRhaW5zKG5hbWUsIGZhbHNlKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gNy4gRGVsZXRlIG5hbWUgZnJvbSB0aGlz4oCZcyBoZWFkZXIgbGlzdC5cbiAgICAvLyA4LiBJZiB0aGlz4oCZcyBndWFyZCBpcyBcInJlcXVlc3Qtbm8tY29yc1wiLCB0aGVuIHJlbW92ZVxuICAgIC8vICAgIHByaXZpbGVnZWQgbm8tQ09SUyByZXF1ZXN0IGhlYWRlcnMgZnJvbSB0aGlzLlxuICAgIHRoaXMuI2hlYWRlcnNMaXN0LmRlbGV0ZShuYW1lLCBmYWxzZSlcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkb20taGVhZGVycy1nZXRcbiAgZ2V0IChuYW1lKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgSGVhZGVycylcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgJ0hlYWRlcnMuZ2V0JylcblxuICAgIGNvbnN0IHByZWZpeCA9ICdIZWFkZXJzLmdldCdcbiAgICBuYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZyhuYW1lLCBwcmVmaXgsICduYW1lJylcblxuICAgIC8vIDEuIElmIG5hbWUgaXMgbm90IGEgaGVhZGVyIG5hbWUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKCFpc1ZhbGlkSGVhZGVyTmFtZShuYW1lKSkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5pbnZhbGlkQXJndW1lbnQoe1xuICAgICAgICBwcmVmaXgsXG4gICAgICAgIHZhbHVlOiBuYW1lLFxuICAgICAgICB0eXBlOiAnaGVhZGVyIG5hbWUnXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDIuIFJldHVybiB0aGUgcmVzdWx0IG9mIGdldHRpbmcgbmFtZSBmcm9tIHRoaXPigJlzIGhlYWRlclxuICAgIC8vICAgIGxpc3QuXG4gICAgcmV0dXJuIHRoaXMuI2hlYWRlcnNMaXN0LmdldChuYW1lLCBmYWxzZSlcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkb20taGVhZGVycy1oYXNcbiAgaGFzIChuYW1lKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgSGVhZGVycylcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgJ0hlYWRlcnMuaGFzJylcblxuICAgIGNvbnN0IHByZWZpeCA9ICdIZWFkZXJzLmhhcydcbiAgICBuYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZyhuYW1lLCBwcmVmaXgsICduYW1lJylcblxuICAgIC8vIDEuIElmIG5hbWUgaXMgbm90IGEgaGVhZGVyIG5hbWUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKCFpc1ZhbGlkSGVhZGVyTmFtZShuYW1lKSkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5pbnZhbGlkQXJndW1lbnQoe1xuICAgICAgICBwcmVmaXgsXG4gICAgICAgIHZhbHVlOiBuYW1lLFxuICAgICAgICB0eXBlOiAnaGVhZGVyIG5hbWUnXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDIuIFJldHVybiB0cnVlIGlmIHRoaXPigJlzIGhlYWRlciBsaXN0IGNvbnRhaW5zIG5hbWU7XG4gICAgLy8gICAgb3RoZXJ3aXNlIGZhbHNlLlxuICAgIHJldHVybiB0aGlzLiNoZWFkZXJzTGlzdC5jb250YWlucyhuYW1lLCBmYWxzZSlcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkb20taGVhZGVycy1zZXRcbiAgc2V0IChuYW1lLCB2YWx1ZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEhlYWRlcnMpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDIsICdIZWFkZXJzLnNldCcpXG5cbiAgICBjb25zdCBwcmVmaXggPSAnSGVhZGVycy5zZXQnXG4gICAgbmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmcobmFtZSwgcHJlZml4LCAnbmFtZScpXG4gICAgdmFsdWUgPSB3ZWJpZGwuY29udmVydGVycy5CeXRlU3RyaW5nKHZhbHVlLCBwcmVmaXgsICd2YWx1ZScpXG5cbiAgICAvLyAxLiBOb3JtYWxpemUgdmFsdWUuXG4gICAgdmFsdWUgPSBoZWFkZXJWYWx1ZU5vcm1hbGl6ZSh2YWx1ZSlcblxuICAgIC8vIDIuIElmIG5hbWUgaXMgbm90IGEgaGVhZGVyIG5hbWUgb3IgdmFsdWUgaXMgbm90IGFcbiAgICAvLyAgICBoZWFkZXIgdmFsdWUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKCFpc1ZhbGlkSGVhZGVyTmFtZShuYW1lKSkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5pbnZhbGlkQXJndW1lbnQoe1xuICAgICAgICBwcmVmaXgsXG4gICAgICAgIHZhbHVlOiBuYW1lLFxuICAgICAgICB0eXBlOiAnaGVhZGVyIG5hbWUnXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAoIWlzVmFsaWRIZWFkZXJWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuaW52YWxpZEFyZ3VtZW50KHtcbiAgICAgICAgcHJlZml4LFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdHlwZTogJ2hlYWRlciB2YWx1ZSdcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gMy4gSWYgdGhpc+KAmXMgZ3VhcmQgaXMgXCJpbW11dGFibGVcIiwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAvLyA0LiBPdGhlcndpc2UsIGlmIHRoaXPigJlzIGd1YXJkIGlzIFwicmVxdWVzdFwiIGFuZCBuYW1lIGlzIGFcbiAgICAvLyAgICBmb3JiaWRkZW4gaGVhZGVyIG5hbWUsIHJldHVybi5cbiAgICAvLyA1LiBPdGhlcndpc2UsIGlmIHRoaXPigJlzIGd1YXJkIGlzIFwicmVxdWVzdC1uby1jb3JzXCIgYW5kXG4gICAgLy8gICAgbmFtZS92YWx1ZSBpcyBub3QgYSBuby1DT1JTLXNhZmVsaXN0ZWQgcmVxdWVzdC1oZWFkZXIsXG4gICAgLy8gICAgcmV0dXJuLlxuICAgIC8vIDYuIE90aGVyd2lzZSwgaWYgdGhpc+KAmXMgZ3VhcmQgaXMgXCJyZXNwb25zZVwiIGFuZCBuYW1lIGlzIGFcbiAgICAvLyAgICBmb3JiaWRkZW4gcmVzcG9uc2UtaGVhZGVyIG5hbWUsIHJldHVybi5cbiAgICAvLyBOb3RlOiB1bmRpY2kgZG9lcyBub3QgaW1wbGVtZW50IGZvcmJpZGRlbiBoZWFkZXIgbmFtZXNcbiAgICBpZiAodGhpcy4jZ3VhcmQgPT09ICdpbW11dGFibGUnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbW11dGFibGUnKVxuICAgIH1cblxuICAgIC8vIDcuIFNldCAobmFtZSwgdmFsdWUpIGluIHRoaXPigJlzIGhlYWRlciBsaXN0LlxuICAgIC8vIDguIElmIHRoaXPigJlzIGd1YXJkIGlzIFwicmVxdWVzdC1uby1jb3JzXCIsIHRoZW4gcmVtb3ZlXG4gICAgLy8gICAgcHJpdmlsZWdlZCBuby1DT1JTIHJlcXVlc3QgaGVhZGVycyBmcm9tIHRoaXNcbiAgICB0aGlzLiNoZWFkZXJzTGlzdC5zZXQobmFtZSwgdmFsdWUsIGZhbHNlKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1oZWFkZXJzLWdldHNldGNvb2tpZVxuICBnZXRTZXRDb29raWUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEhlYWRlcnMpXG5cbiAgICAvLyAxLiBJZiB0aGlz4oCZcyBoZWFkZXIgbGlzdCBkb2VzIG5vdCBjb250YWluIGBTZXQtQ29va2llYCwgdGhlbiByZXR1cm4gwqsgwrsuXG4gICAgLy8gMi4gUmV0dXJuIHRoZSB2YWx1ZXMgb2YgYWxsIGhlYWRlcnMgaW4gdGhpc+KAmXMgaGVhZGVyIGxpc3Qgd2hvc2UgbmFtZSBpc1xuICAgIC8vICAgIGEgYnl0ZS1jYXNlLWluc2Vuc2l0aXZlIG1hdGNoIGZvciBgU2V0LUNvb2tpZWAsIGluIG9yZGVyLlxuXG4gICAgY29uc3QgbGlzdCA9IHRoaXMuI2hlYWRlcnNMaXN0LmNvb2tpZXNcblxuICAgIGlmIChsaXN0KSB7XG4gICAgICByZXR1cm4gWy4uLmxpc3RdXG4gICAgfVxuXG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1oZWFkZXItbGlzdC1zb3J0LWFuZC1jb21iaW5lXG4gIGdldCBba0hlYWRlcnNTb3J0ZWRNYXBdICgpIHtcbiAgICBpZiAodGhpcy4jaGVhZGVyc0xpc3Rba0hlYWRlcnNTb3J0ZWRNYXBdKSB7XG4gICAgICByZXR1cm4gdGhpcy4jaGVhZGVyc0xpc3Rba0hlYWRlcnNTb3J0ZWRNYXBdXG4gICAgfVxuXG4gICAgLy8gMS4gTGV0IGhlYWRlcnMgYmUgYW4gZW1wdHkgbGlzdCBvZiBoZWFkZXJzIHdpdGggdGhlIGtleSBiZWluZyB0aGUgbmFtZVxuICAgIC8vICAgIGFuZCB2YWx1ZSB0aGUgdmFsdWUuXG4gICAgY29uc3QgaGVhZGVycyA9IFtdXG5cbiAgICAvLyAyLiBMZXQgbmFtZXMgYmUgdGhlIHJlc3VsdCBvZiBjb252ZXJ0IGhlYWRlciBuYW1lcyB0byBhIHNvcnRlZC1sb3dlcmNhc2VcbiAgICAvLyAgICBzZXQgd2l0aCBhbGwgdGhlIG5hbWVzIG9mIHRoZSBoZWFkZXJzIGluIGxpc3QuXG4gICAgY29uc3QgbmFtZXMgPSB0aGlzLiNoZWFkZXJzTGlzdC50b1NvcnRlZEFycmF5KClcblxuICAgIGNvbnN0IGNvb2tpZXMgPSB0aGlzLiNoZWFkZXJzTGlzdC5jb29raWVzXG5cbiAgICAvLyBmYXN0LXBhdGhcbiAgICBpZiAoY29va2llcyA9PT0gbnVsbCB8fCBjb29raWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgLy8gTm90ZTogVGhlIG5vbi1udWxsIGFzc2VydGlvbiBvZiB2YWx1ZSBoYXMgYWxyZWFkeSBiZWVuIGRvbmUgYnkgYEhlYWRlcnNMaXN0I3RvU29ydGVkQXJyYXlgXG4gICAgICByZXR1cm4gKHRoaXMuI2hlYWRlcnNMaXN0W2tIZWFkZXJzU29ydGVkTWFwXSA9IG5hbWVzKVxuICAgIH1cblxuICAgIC8vIDMuIEZvciBlYWNoIG5hbWUgb2YgbmFtZXM6XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7ICsraSkge1xuICAgICAgY29uc3QgeyAwOiBuYW1lLCAxOiB2YWx1ZSB9ID0gbmFtZXNbaV1cbiAgICAgIC8vIDEuIElmIG5hbWUgaXMgYHNldC1jb29raWVgLCB0aGVuOlxuICAgICAgaWYgKG5hbWUgPT09ICdzZXQtY29va2llJykge1xuICAgICAgICAvLyAxLiBMZXQgdmFsdWVzIGJlIGEgbGlzdCBvZiBhbGwgdmFsdWVzIG9mIGhlYWRlcnMgaW4gbGlzdCB3aG9zZSBuYW1lXG4gICAgICAgIC8vICAgIGlzIGEgYnl0ZS1jYXNlLWluc2Vuc2l0aXZlIG1hdGNoIGZvciBuYW1lLCBpbiBvcmRlci5cblxuICAgICAgICAvLyAyLiBGb3IgZWFjaCB2YWx1ZSBvZiB2YWx1ZXM6XG4gICAgICAgIC8vIDEuIEFwcGVuZCAobmFtZSwgdmFsdWUpIHRvIGhlYWRlcnMuXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29va2llcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgIGhlYWRlcnMucHVzaChbbmFtZSwgY29va2llc1tqXV0pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIDIuIE90aGVyd2lzZTpcblxuICAgICAgICAvLyAxLiBMZXQgdmFsdWUgYmUgdGhlIHJlc3VsdCBvZiBnZXR0aW5nIG5hbWUgZnJvbSBsaXN0LlxuXG4gICAgICAgIC8vIDIuIEFzc2VydDogdmFsdWUgaXMgbm9uLW51bGwuXG4gICAgICAgIC8vIE5vdGU6IFRoaXMgb3BlcmF0aW9uIHdhcyBkb25lIGJ5IGBIZWFkZXJzTGlzdCN0b1NvcnRlZEFycmF5YC5cblxuICAgICAgICAvLyAzLiBBcHBlbmQgKG5hbWUsIHZhbHVlKSB0byBoZWFkZXJzLlxuICAgICAgICBoZWFkZXJzLnB1c2goW25hbWUsIHZhbHVlXSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA0LiBSZXR1cm4gaGVhZGVycy5cbiAgICByZXR1cm4gKHRoaXMuI2hlYWRlcnNMaXN0W2tIZWFkZXJzU29ydGVkTWFwXSA9IGhlYWRlcnMpXG4gIH1cblxuICBbdXRpbC5pbnNwZWN0LmN1c3RvbV0gKGRlcHRoLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucy5kZXB0aCA/Pz0gZGVwdGhcblxuICAgIHJldHVybiBgSGVhZGVycyAke3V0aWwuZm9ybWF0V2l0aE9wdGlvbnMob3B0aW9ucywgdGhpcy4jaGVhZGVyc0xpc3QuZW50cmllcyl9YFxuICB9XG5cbiAgc3RhdGljIGdldEhlYWRlcnNHdWFyZCAobykge1xuICAgIHJldHVybiBvLiNndWFyZFxuICB9XG5cbiAgc3RhdGljIHNldEhlYWRlcnNHdWFyZCAobywgZ3VhcmQpIHtcbiAgICBvLiNndWFyZCA9IGd1YXJkXG4gIH1cblxuICBzdGF0aWMgZ2V0SGVhZGVyc0xpc3QgKG8pIHtcbiAgICByZXR1cm4gby4jaGVhZGVyc0xpc3RcbiAgfVxuXG4gIHN0YXRpYyBzZXRIZWFkZXJzTGlzdCAobywgbGlzdCkge1xuICAgIG8uI2hlYWRlcnNMaXN0ID0gbGlzdFxuICB9XG59XG5cbmNvbnN0IHsgZ2V0SGVhZGVyc0d1YXJkLCBzZXRIZWFkZXJzR3VhcmQsIGdldEhlYWRlcnNMaXN0LCBzZXRIZWFkZXJzTGlzdCB9ID0gSGVhZGVyc1xuUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShIZWFkZXJzLCAnZ2V0SGVhZGVyc0d1YXJkJylcblJlZmxlY3QuZGVsZXRlUHJvcGVydHkoSGVhZGVycywgJ3NldEhlYWRlcnNHdWFyZCcpXG5SZWZsZWN0LmRlbGV0ZVByb3BlcnR5KEhlYWRlcnMsICdnZXRIZWFkZXJzTGlzdCcpXG5SZWZsZWN0LmRlbGV0ZVByb3BlcnR5KEhlYWRlcnMsICdzZXRIZWFkZXJzTGlzdCcpXG5cbml0ZXJhdG9yTWl4aW4oJ0hlYWRlcnMnLCBIZWFkZXJzLCBrSGVhZGVyc1NvcnRlZE1hcCwgMCwgMSlcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoSGVhZGVycy5wcm90b3R5cGUsIHtcbiAgYXBwZW5kOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBkZWxldGU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGdldDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgaGFzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBzZXQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGdldFNldENvb2tpZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHtcbiAgICB2YWx1ZTogJ0hlYWRlcnMnLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9LFxuICBbdXRpbC5pbnNwZWN0LmN1c3RvbV06IHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICB9XG59KVxuXG53ZWJpZGwuY29udmVydGVycy5IZWFkZXJzSW5pdCA9IGZ1bmN0aW9uIChWLCBwcmVmaXgsIGFyZ3VtZW50KSB7XG4gIGlmICh3ZWJpZGwudXRpbC5UeXBlKFYpID09PSAnT2JqZWN0Jykge1xuICAgIGNvbnN0IGl0ZXJhdG9yID0gUmVmbGVjdC5nZXQoViwgU3ltYm9sLml0ZXJhdG9yKVxuXG4gICAgLy8gQSB3b3JrLWFyb3VuZCB0byBlbnN1cmUgd2Ugc2VuZCB0aGUgcHJvcGVybHktY2FzZWQgSGVhZGVycyB3aGVuIFYgaXMgYSBIZWFkZXJzIG9iamVjdC5cbiAgICAvLyBSZWFkIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL3B1bGwvMzE1OSNpc3N1ZWNvbW1lbnQtMjA3NTUzNzIyNiBiZWZvcmUgdG91Y2hpbmcsIHBsZWFzZS5cbiAgICBpZiAoIXV0aWwudHlwZXMuaXNQcm94eShWKSAmJiBpdGVyYXRvciA9PT0gSGVhZGVycy5wcm90b3R5cGUuZW50cmllcykgeyAvLyBIZWFkZXJzIG9iamVjdFxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGdldEhlYWRlcnNMaXN0KFYpLmVudHJpZXNMaXN0XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gZmFsbC10aHJvdWdoXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzWydzZXF1ZW5jZTxzZXF1ZW5jZTxCeXRlU3RyaW5nPj4nXShWLCBwcmVmaXgsIGFyZ3VtZW50LCBpdGVyYXRvci5iaW5kKFYpKVxuICAgIH1cblxuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVyc1sncmVjb3JkPEJ5dGVTdHJpbmcsIEJ5dGVTdHJpbmc+J10oViwgcHJlZml4LCBhcmd1bWVudClcbiAgfVxuXG4gIHRocm93IHdlYmlkbC5lcnJvcnMuY29udmVyc2lvbkZhaWxlZCh7XG4gICAgcHJlZml4OiAnSGVhZGVycyBjb25zdHJ1Y3RvcicsXG4gICAgYXJndW1lbnQ6ICdBcmd1bWVudCAxJyxcbiAgICB0eXBlczogWydzZXF1ZW5jZTxzZXF1ZW5jZTxCeXRlU3RyaW5nPj4nLCAncmVjb3JkPEJ5dGVTdHJpbmcsIEJ5dGVTdHJpbmc+J11cbiAgfSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGZpbGwsXG4gIC8vIGZvciB0ZXN0LlxuICBjb21wYXJlSGVhZGVyTmFtZSxcbiAgSGVhZGVycyxcbiAgSGVhZGVyc0xpc3QsXG4gIGdldEhlYWRlcnNHdWFyZCxcbiAgc2V0SGVhZGVyc0d1YXJkLFxuICBzZXRIZWFkZXJzTGlzdCxcbiAgZ2V0SGVhZGVyc0xpc3Rcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IEhlYWRlcnMsIEhlYWRlcnNMaXN0LCBmaWxsLCBnZXRIZWFkZXJzR3VhcmQsIHNldEhlYWRlcnNHdWFyZCwgc2V0SGVhZGVyc0xpc3QgfSA9IHJlcXVpcmUoJy4vaGVhZGVycycpXG5jb25zdCB7IGV4dHJhY3RCb2R5LCBjbG9uZUJvZHksIG1peGluQm9keSwgaGFzRmluYWxpemF0aW9uUmVnaXN0cnksIHN0cmVhbVJlZ2lzdHJ5LCBib2R5VW51c2FibGUgfSA9IHJlcXVpcmUoJy4vYm9keScpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vLi4vY29yZS91dGlsJylcbmNvbnN0IG5vZGVVdGlsID0gcmVxdWlyZSgnbm9kZTp1dGlsJylcbmNvbnN0IHsga0VudW1lcmFibGVQcm9wZXJ0eSB9ID0gdXRpbFxuY29uc3Qge1xuICBpc1ZhbGlkUmVhc29uUGhyYXNlLFxuICBpc0NhbmNlbGxlZCxcbiAgaXNBYm9ydGVkLFxuICBpc0Jsb2JMaWtlLFxuICBzZXJpYWxpemVKYXZhc2NyaXB0VmFsdWVUb0pTT05TdHJpbmcsXG4gIGlzRXJyb3JMaWtlLFxuICBpc29tb3JwaGljRW5jb2RlLFxuICBlbnZpcm9ubWVudFNldHRpbmdzT2JqZWN0OiByZWxldmFudFJlYWxtXG59ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHtcbiAgcmVkaXJlY3RTdGF0dXNTZXQsXG4gIG51bGxCb2R5U3RhdHVzXG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3QgeyBrU3RhdGUsIGtIZWFkZXJzIH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4vd2ViaWRsJylcbmNvbnN0IHsgRm9ybURhdGEgfSA9IHJlcXVpcmUoJy4vZm9ybWRhdGEnKVxuY29uc3QgeyBVUkxTZXJpYWxpemVyIH0gPSByZXF1aXJlKCcuL2RhdGEtdXJsJylcbmNvbnN0IHsga0NvbnN0cnVjdCB9ID0gcmVxdWlyZSgnLi4vLi4vY29yZS9zeW1ib2xzJylcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ25vZGU6YXNzZXJ0JylcbmNvbnN0IHsgdHlwZXMgfSA9IHJlcXVpcmUoJ25vZGU6dXRpbCcpXG5cbmNvbnN0IHRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCd1dGYtOCcpXG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXNwb25zZS1jbGFzc1xuY2xhc3MgUmVzcG9uc2Uge1xuICAvLyBDcmVhdGVzIG5ldHdvcmsgZXJyb3IgUmVzcG9uc2UuXG4gIHN0YXRpYyBlcnJvciAoKSB7XG4gICAgLy8gVGhlIHN0YXRpYyBlcnJvcigpIG1ldGhvZCBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYVxuICAgIC8vIFJlc3BvbnNlIG9iamVjdCwgZ2l2ZW4gYSBuZXcgbmV0d29yayBlcnJvciwgXCJpbW11dGFibGVcIiwgYW5kIHRoaXPigJlzXG4gICAgLy8gcmVsZXZhbnQgUmVhbG0uXG4gICAgY29uc3QgcmVzcG9uc2VPYmplY3QgPSBmcm9tSW5uZXJSZXNwb25zZShtYWtlTmV0d29ya0Vycm9yKCksICdpbW11dGFibGUnKVxuXG4gICAgcmV0dXJuIHJlc3BvbnNlT2JqZWN0XG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLXJlc3BvbnNlLWpzb25cbiAgc3RhdGljIGpzb24gKGRhdGEsIGluaXQgPSB7fSkge1xuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgJ1Jlc3BvbnNlLmpzb24nKVxuXG4gICAgaWYgKGluaXQgIT09IG51bGwpIHtcbiAgICAgIGluaXQgPSB3ZWJpZGwuY29udmVydGVycy5SZXNwb25zZUluaXQoaW5pdClcbiAgICB9XG5cbiAgICAvLyAxLiBMZXQgYnl0ZXMgdGhlIHJlc3VsdCBvZiBydW5uaW5nIHNlcmlhbGl6ZSBhIEphdmFTY3JpcHQgdmFsdWUgdG8gSlNPTiBieXRlcyBvbiBkYXRhLlxuICAgIGNvbnN0IGJ5dGVzID0gdGV4dEVuY29kZXIuZW5jb2RlKFxuICAgICAgc2VyaWFsaXplSmF2YXNjcmlwdFZhbHVlVG9KU09OU3RyaW5nKGRhdGEpXG4gICAgKVxuXG4gICAgLy8gMi4gTGV0IGJvZHkgYmUgdGhlIHJlc3VsdCBvZiBleHRyYWN0aW5nIGJ5dGVzLlxuICAgIGNvbnN0IGJvZHkgPSBleHRyYWN0Qm9keShieXRlcylcblxuICAgIC8vIDMuIExldCByZXNwb25zZU9iamVjdCBiZSB0aGUgcmVzdWx0IG9mIGNyZWF0aW5nIGEgUmVzcG9uc2Ugb2JqZWN0LCBnaXZlbiBhIG5ldyByZXNwb25zZSxcbiAgICAvLyAgICBcInJlc3BvbnNlXCIsIGFuZCB0aGlz4oCZcyByZWxldmFudCBSZWFsbS5cbiAgICBjb25zdCByZXNwb25zZU9iamVjdCA9IGZyb21Jbm5lclJlc3BvbnNlKG1ha2VSZXNwb25zZSh7fSksICdyZXNwb25zZScpXG5cbiAgICAvLyA0LiBQZXJmb3JtIGluaXRpYWxpemUgYSByZXNwb25zZSBnaXZlbiByZXNwb25zZU9iamVjdCwgaW5pdCwgYW5kIChib2R5LCBcImFwcGxpY2F0aW9uL2pzb25cIikuXG4gICAgaW5pdGlhbGl6ZVJlc3BvbnNlKHJlc3BvbnNlT2JqZWN0LCBpbml0LCB7IGJvZHk6IGJvZHlbMF0sIHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KVxuXG4gICAgLy8gNS4gUmV0dXJuIHJlc3BvbnNlT2JqZWN0LlxuICAgIHJldHVybiByZXNwb25zZU9iamVjdFxuICB9XG5cbiAgLy8gQ3JlYXRlcyBhIHJlZGlyZWN0IFJlc3BvbnNlIHRoYXQgcmVkaXJlY3RzIHRvIHVybCB3aXRoIHN0YXR1cyBzdGF0dXMuXG4gIHN0YXRpYyByZWRpcmVjdCAodXJsLCBzdGF0dXMgPSAzMDIpIHtcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsICdSZXNwb25zZS5yZWRpcmVjdCcpXG5cbiAgICB1cmwgPSB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcodXJsKVxuICAgIHN0YXR1cyA9IHdlYmlkbC5jb252ZXJ0ZXJzWyd1bnNpZ25lZCBzaG9ydCddKHN0YXR1cylcblxuICAgIC8vIDEuIExldCBwYXJzZWRVUkwgYmUgdGhlIHJlc3VsdCBvZiBwYXJzaW5nIHVybCB3aXRoIGN1cnJlbnQgc2V0dGluZ3NcbiAgICAvLyBvYmplY3TigJlzIEFQSSBiYXNlIFVSTC5cbiAgICAvLyAyLiBJZiBwYXJzZWRVUkwgaXMgZmFpbHVyZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAvLyBUT0RPOiBiYXNlLVVSTD9cbiAgICBsZXQgcGFyc2VkVVJMXG4gICAgdHJ5IHtcbiAgICAgIHBhcnNlZFVSTCA9IG5ldyBVUkwodXJsLCByZWxldmFudFJlYWxtLnNldHRpbmdzT2JqZWN0LmJhc2VVcmwpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBGYWlsZWQgdG8gcGFyc2UgVVJMIGZyb20gJHt1cmx9YCwgeyBjYXVzZTogZXJyIH0pXG4gICAgfVxuXG4gICAgLy8gMy4gSWYgc3RhdHVzIGlzIG5vdCBhIHJlZGlyZWN0IHN0YXR1cywgdGhlbiB0aHJvdyBhIFJhbmdlRXJyb3IuXG4gICAgaWYgKCFyZWRpcmVjdFN0YXR1c1NldC5oYXMoc3RhdHVzKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFsaWQgc3RhdHVzIGNvZGUgJHtzdGF0dXN9YClcbiAgICB9XG5cbiAgICAvLyA0LiBMZXQgcmVzcG9uc2VPYmplY3QgYmUgdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhIFJlc3BvbnNlIG9iamVjdCxcbiAgICAvLyBnaXZlbiBhIG5ldyByZXNwb25zZSwgXCJpbW11dGFibGVcIiwgYW5kIHRoaXPigJlzIHJlbGV2YW50IFJlYWxtLlxuICAgIGNvbnN0IHJlc3BvbnNlT2JqZWN0ID0gZnJvbUlubmVyUmVzcG9uc2UobWFrZVJlc3BvbnNlKHt9KSwgJ2ltbXV0YWJsZScpXG5cbiAgICAvLyA1LiBTZXQgcmVzcG9uc2VPYmplY3TigJlzIHJlc3BvbnNl4oCZcyBzdGF0dXMgdG8gc3RhdHVzLlxuICAgIHJlc3BvbnNlT2JqZWN0W2tTdGF0ZV0uc3RhdHVzID0gc3RhdHVzXG5cbiAgICAvLyA2LiBMZXQgdmFsdWUgYmUgcGFyc2VkVVJMLCBzZXJpYWxpemVkIGFuZCBpc29tb3JwaGljIGVuY29kZWQuXG4gICAgY29uc3QgdmFsdWUgPSBpc29tb3JwaGljRW5jb2RlKFVSTFNlcmlhbGl6ZXIocGFyc2VkVVJMKSlcblxuICAgIC8vIDcuIEFwcGVuZCBgTG9jYXRpb25gL3ZhbHVlIHRvIHJlc3BvbnNlT2JqZWN04oCZcyByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3QuXG4gICAgcmVzcG9uc2VPYmplY3Rba1N0YXRlXS5oZWFkZXJzTGlzdC5hcHBlbmQoJ2xvY2F0aW9uJywgdmFsdWUsIHRydWUpXG5cbiAgICAvLyA4LiBSZXR1cm4gcmVzcG9uc2VPYmplY3QuXG4gICAgcmV0dXJuIHJlc3BvbnNlT2JqZWN0XG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLXJlc3BvbnNlXG4gIGNvbnN0cnVjdG9yIChib2R5ID0gbnVsbCwgaW5pdCA9IHt9KSB7XG4gICAgd2ViaWRsLnV0aWwubWFya0FzVW5jbG9uZWFibGUodGhpcylcbiAgICBpZiAoYm9keSA9PT0ga0NvbnN0cnVjdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGJvZHkgIT09IG51bGwpIHtcbiAgICAgIGJvZHkgPSB3ZWJpZGwuY29udmVydGVycy5Cb2R5SW5pdChib2R5KVxuICAgIH1cblxuICAgIGluaXQgPSB3ZWJpZGwuY29udmVydGVycy5SZXNwb25zZUluaXQoaW5pdClcblxuICAgIC8vIDEuIFNldCB0aGlz4oCZcyByZXNwb25zZSB0byBhIG5ldyByZXNwb25zZS5cbiAgICB0aGlzW2tTdGF0ZV0gPSBtYWtlUmVzcG9uc2Uoe30pXG5cbiAgICAvLyAyLiBTZXQgdGhpc+KAmXMgaGVhZGVycyB0byBhIG5ldyBIZWFkZXJzIG9iamVjdCB3aXRoIHRoaXPigJlzIHJlbGV2YW50XG4gICAgLy8gUmVhbG0sIHdob3NlIGhlYWRlciBsaXN0IGlzIHRoaXPigJlzIHJlc3BvbnNl4oCZcyBoZWFkZXIgbGlzdCBhbmQgZ3VhcmRcbiAgICAvLyBpcyBcInJlc3BvbnNlXCIuXG4gICAgdGhpc1trSGVhZGVyc10gPSBuZXcgSGVhZGVycyhrQ29uc3RydWN0KVxuICAgIHNldEhlYWRlcnNHdWFyZCh0aGlzW2tIZWFkZXJzXSwgJ3Jlc3BvbnNlJylcbiAgICBzZXRIZWFkZXJzTGlzdCh0aGlzW2tIZWFkZXJzXSwgdGhpc1trU3RhdGVdLmhlYWRlcnNMaXN0KVxuXG4gICAgLy8gMy4gTGV0IGJvZHlXaXRoVHlwZSBiZSBudWxsLlxuICAgIGxldCBib2R5V2l0aFR5cGUgPSBudWxsXG5cbiAgICAvLyA0LiBJZiBib2R5IGlzIG5vbi1udWxsLCB0aGVuIHNldCBib2R5V2l0aFR5cGUgdG8gdGhlIHJlc3VsdCBvZiBleHRyYWN0aW5nIGJvZHkuXG4gICAgaWYgKGJvZHkgIT0gbnVsbCkge1xuICAgICAgY29uc3QgW2V4dHJhY3RlZEJvZHksIHR5cGVdID0gZXh0cmFjdEJvZHkoYm9keSlcbiAgICAgIGJvZHlXaXRoVHlwZSA9IHsgYm9keTogZXh0cmFjdGVkQm9keSwgdHlwZSB9XG4gICAgfVxuXG4gICAgLy8gNS4gUGVyZm9ybSBpbml0aWFsaXplIGEgcmVzcG9uc2UgZ2l2ZW4gdGhpcywgaW5pdCwgYW5kIGJvZHlXaXRoVHlwZS5cbiAgICBpbml0aWFsaXplUmVzcG9uc2UodGhpcywgaW5pdCwgYm9keVdpdGhUeXBlKVxuICB9XG5cbiAgLy8gUmV0dXJucyByZXNwb25zZeKAmXMgdHlwZSwgZS5nLiwgXCJjb3JzXCIuXG4gIGdldCB0eXBlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXNwb25zZSlcblxuICAgIC8vIFRoZSB0eXBlIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHJlc3BvbnNl4oCZcyB0eXBlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0udHlwZVxuICB9XG5cbiAgLy8gUmV0dXJucyByZXNwb25zZeKAmXMgVVJMLCBpZiBpdCBoYXMgb25lOyBvdGhlcndpc2UgdGhlIGVtcHR5IHN0cmluZy5cbiAgZ2V0IHVybCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVzcG9uc2UpXG5cbiAgICBjb25zdCB1cmxMaXN0ID0gdGhpc1trU3RhdGVdLnVybExpc3RcblxuICAgIC8vIFRoZSB1cmwgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhlIGVtcHR5IHN0cmluZyBpZiB0aGlz4oCZc1xuICAgIC8vIHJlc3BvbnNl4oCZcyBVUkwgaXMgbnVsbDsgb3RoZXJ3aXNlIHRoaXPigJlzIHJlc3BvbnNl4oCZcyBVUkwsXG4gICAgLy8gc2VyaWFsaXplZCB3aXRoIGV4Y2x1ZGUgZnJhZ21lbnQgc2V0IHRvIHRydWUuXG4gICAgY29uc3QgdXJsID0gdXJsTGlzdFt1cmxMaXN0Lmxlbmd0aCAtIDFdID8/IG51bGxcblxuICAgIGlmICh1cmwgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cblxuICAgIHJldHVybiBVUkxTZXJpYWxpemVyKHVybCwgdHJ1ZSlcbiAgfVxuXG4gIC8vIFJldHVybnMgd2hldGhlciByZXNwb25zZSB3YXMgb2J0YWluZWQgdGhyb3VnaCBhIHJlZGlyZWN0LlxuICBnZXQgcmVkaXJlY3RlZCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVzcG9uc2UpXG5cbiAgICAvLyBUaGUgcmVkaXJlY3RlZCBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0cnVlIGlmIHRoaXPigJlzIHJlc3BvbnNl4oCZcyBVUkxcbiAgICAvLyBsaXN0IGhhcyBtb3JlIHRoYW4gb25lIGl0ZW07IG90aGVyd2lzZSBmYWxzZS5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLnVybExpc3QubGVuZ3RoID4gMVxuICB9XG5cbiAgLy8gUmV0dXJucyByZXNwb25zZeKAmXMgc3RhdHVzLlxuICBnZXQgc3RhdHVzICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXNwb25zZSlcblxuICAgIC8vIFRoZSBzdGF0dXMgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVzcG9uc2XigJlzIHN0YXR1cy5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLnN0YXR1c1xuICB9XG5cbiAgLy8gUmV0dXJucyB3aGV0aGVyIHJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgYW4gb2sgc3RhdHVzLlxuICBnZXQgb2sgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlc3BvbnNlKVxuXG4gICAgLy8gVGhlIG9rIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRydWUgaWYgdGhpc+KAmXMgcmVzcG9uc2XigJlzIHN0YXR1cyBpcyBhblxuICAgIC8vIG9rIHN0YXR1czsgb3RoZXJ3aXNlIGZhbHNlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uc3RhdHVzID49IDIwMCAmJiB0aGlzW2tTdGF0ZV0uc3RhdHVzIDw9IDI5OVxuICB9XG5cbiAgLy8gUmV0dXJucyByZXNwb25zZeKAmXMgc3RhdHVzIG1lc3NhZ2UuXG4gIGdldCBzdGF0dXNUZXh0ICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXNwb25zZSlcblxuICAgIC8vIFRoZSBzdGF0dXNUZXh0IGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHJlc3BvbnNl4oCZcyBzdGF0dXNcbiAgICAvLyBtZXNzYWdlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uc3RhdHVzVGV4dFxuICB9XG5cbiAgLy8gUmV0dXJucyByZXNwb25zZeKAmXMgaGVhZGVycyBhcyBIZWFkZXJzLlxuICBnZXQgaGVhZGVycyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVzcG9uc2UpXG5cbiAgICAvLyBUaGUgaGVhZGVycyBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlz4oCZcyBoZWFkZXJzLlxuICAgIHJldHVybiB0aGlzW2tIZWFkZXJzXVxuICB9XG5cbiAgZ2V0IGJvZHkgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlc3BvbnNlKVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5ib2R5ID8gdGhpc1trU3RhdGVdLmJvZHkuc3RyZWFtIDogbnVsbFxuICB9XG5cbiAgZ2V0IGJvZHlVc2VkICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXNwb25zZSlcblxuICAgIHJldHVybiAhIXRoaXNba1N0YXRlXS5ib2R5ICYmIHV0aWwuaXNEaXN0dXJiZWQodGhpc1trU3RhdGVdLmJvZHkuc3RyZWFtKVxuICB9XG5cbiAgLy8gUmV0dXJucyBhIGNsb25lIG9mIHJlc3BvbnNlLlxuICBjbG9uZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVzcG9uc2UpXG5cbiAgICAvLyAxLiBJZiB0aGlzIGlzIHVudXNhYmxlLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmIChib2R5VW51c2FibGUodGhpcykpIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgaGVhZGVyOiAnUmVzcG9uc2UuY2xvbmUnLFxuICAgICAgICBtZXNzYWdlOiAnQm9keSBoYXMgYWxyZWFkeSBiZWVuIGNvbnN1bWVkLidcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gMi4gTGV0IGNsb25lZFJlc3BvbnNlIGJlIHRoZSByZXN1bHQgb2YgY2xvbmluZyB0aGlz4oCZcyByZXNwb25zZS5cbiAgICBjb25zdCBjbG9uZWRSZXNwb25zZSA9IGNsb25lUmVzcG9uc2UodGhpc1trU3RhdGVdKVxuXG4gICAgLy8gTm90ZTogVG8gcmUtcmVnaXN0ZXIgYmVjYXVzZSBvZiBhIG5ldyBzdHJlYW0uXG4gICAgaWYgKGhhc0ZpbmFsaXphdGlvblJlZ2lzdHJ5ICYmIHRoaXNba1N0YXRlXS5ib2R5Py5zdHJlYW0pIHtcbiAgICAgIHN0cmVhbVJlZ2lzdHJ5LnJlZ2lzdGVyKHRoaXMsIG5ldyBXZWFrUmVmKHRoaXNba1N0YXRlXS5ib2R5LnN0cmVhbSkpXG4gICAgfVxuXG4gICAgLy8gMy4gUmV0dXJuIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYSBSZXNwb25zZSBvYmplY3QsIGdpdmVuXG4gICAgLy8gY2xvbmVkUmVzcG9uc2UsIHRoaXPigJlzIGhlYWRlcnPigJlzIGd1YXJkLCBhbmQgdGhpc+KAmXMgcmVsZXZhbnQgUmVhbG0uXG4gICAgcmV0dXJuIGZyb21Jbm5lclJlc3BvbnNlKGNsb25lZFJlc3BvbnNlLCBnZXRIZWFkZXJzR3VhcmQodGhpc1trSGVhZGVyc10pKVxuICB9XG5cbiAgW25vZGVVdGlsLmluc3BlY3QuY3VzdG9tXSAoZGVwdGgsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5kZXB0aCA9PT0gbnVsbCkge1xuICAgICAgb3B0aW9ucy5kZXB0aCA9IDJcbiAgICB9XG5cbiAgICBvcHRpb25zLmNvbG9ycyA/Pz0gdHJ1ZVxuXG4gICAgY29uc3QgcHJvcGVydGllcyA9IHtcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICBzdGF0dXNUZXh0OiB0aGlzLnN0YXR1c1RleHQsXG4gICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICBib2R5OiB0aGlzLmJvZHksXG4gICAgICBib2R5VXNlZDogdGhpcy5ib2R5VXNlZCxcbiAgICAgIG9rOiB0aGlzLm9rLFxuICAgICAgcmVkaXJlY3RlZDogdGhpcy5yZWRpcmVjdGVkLFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgdXJsOiB0aGlzLnVybFxuICAgIH1cblxuICAgIHJldHVybiBgUmVzcG9uc2UgJHtub2RlVXRpbC5mb3JtYXRXaXRoT3B0aW9ucyhvcHRpb25zLCBwcm9wZXJ0aWVzKX1gXG4gIH1cbn1cblxubWl4aW5Cb2R5KFJlc3BvbnNlKVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhSZXNwb25zZS5wcm90b3R5cGUsIHtcbiAgdHlwZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgdXJsOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBzdGF0dXM6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIG9rOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZWRpcmVjdGVkOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBzdGF0dXNUZXh0OiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBoZWFkZXJzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBjbG9uZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgYm9keToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgYm9keVVzZWQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7XG4gICAgdmFsdWU6ICdSZXNwb25zZScsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH1cbn0pXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFJlc3BvbnNlLCB7XG4gIGpzb246IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHJlZGlyZWN0OiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBlcnJvcjoga0VudW1lcmFibGVQcm9wZXJ0eVxufSlcblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtcmVzcG9uc2UtY2xvbmVcbmZ1bmN0aW9uIGNsb25lUmVzcG9uc2UgKHJlc3BvbnNlKSB7XG4gIC8vIFRvIGNsb25lIGEgcmVzcG9uc2UgcmVzcG9uc2UsIHJ1biB0aGVzZSBzdGVwczpcblxuICAvLyAxLiBJZiByZXNwb25zZSBpcyBhIGZpbHRlcmVkIHJlc3BvbnNlLCB0aGVuIHJldHVybiBhIG5ldyBpZGVudGljYWxcbiAgLy8gZmlsdGVyZWQgcmVzcG9uc2Ugd2hvc2UgaW50ZXJuYWwgcmVzcG9uc2UgaXMgYSBjbG9uZSBvZiByZXNwb25zZeKAmXNcbiAgLy8gaW50ZXJuYWwgcmVzcG9uc2UuXG4gIGlmIChyZXNwb25zZS5pbnRlcm5hbFJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIGZpbHRlclJlc3BvbnNlKFxuICAgICAgY2xvbmVSZXNwb25zZShyZXNwb25zZS5pbnRlcm5hbFJlc3BvbnNlKSxcbiAgICAgIHJlc3BvbnNlLnR5cGVcbiAgICApXG4gIH1cblxuICAvLyAyLiBMZXQgbmV3UmVzcG9uc2UgYmUgYSBjb3B5IG9mIHJlc3BvbnNlLCBleGNlcHQgZm9yIGl0cyBib2R5LlxuICBjb25zdCBuZXdSZXNwb25zZSA9IG1ha2VSZXNwb25zZSh7IC4uLnJlc3BvbnNlLCBib2R5OiBudWxsIH0pXG5cbiAgLy8gMy4gSWYgcmVzcG9uc2XigJlzIGJvZHkgaXMgbm9uLW51bGwsIHRoZW4gc2V0IG5ld1Jlc3BvbnNl4oCZcyBib2R5IHRvIHRoZVxuICAvLyByZXN1bHQgb2YgY2xvbmluZyByZXNwb25zZeKAmXMgYm9keS5cbiAgaWYgKHJlc3BvbnNlLmJvZHkgIT0gbnVsbCkge1xuICAgIG5ld1Jlc3BvbnNlLmJvZHkgPSBjbG9uZUJvZHkobmV3UmVzcG9uc2UsIHJlc3BvbnNlLmJvZHkpXG4gIH1cblxuICAvLyA0LiBSZXR1cm4gbmV3UmVzcG9uc2UuXG4gIHJldHVybiBuZXdSZXNwb25zZVxufVxuXG5mdW5jdGlvbiBtYWtlUmVzcG9uc2UgKGluaXQpIHtcbiAgcmV0dXJuIHtcbiAgICBhYm9ydGVkOiBmYWxzZSxcbiAgICByYW5nZVJlcXVlc3RlZDogZmFsc2UsXG4gICAgdGltaW5nQWxsb3dQYXNzZWQ6IGZhbHNlLFxuICAgIHJlcXVlc3RJbmNsdWRlc0NyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICB0eXBlOiAnZGVmYXVsdCcsXG4gICAgc3RhdHVzOiAyMDAsXG4gICAgdGltaW5nSW5mbzogbnVsbCxcbiAgICBjYWNoZVN0YXRlOiAnJyxcbiAgICBzdGF0dXNUZXh0OiAnJyxcbiAgICAuLi5pbml0LFxuICAgIGhlYWRlcnNMaXN0OiBpbml0Py5oZWFkZXJzTGlzdFxuICAgICAgPyBuZXcgSGVhZGVyc0xpc3QoaW5pdD8uaGVhZGVyc0xpc3QpXG4gICAgICA6IG5ldyBIZWFkZXJzTGlzdCgpLFxuICAgIHVybExpc3Q6IGluaXQ/LnVybExpc3QgPyBbLi4uaW5pdC51cmxMaXN0XSA6IFtdXG4gIH1cbn1cblxuZnVuY3Rpb24gbWFrZU5ldHdvcmtFcnJvciAocmVhc29uKSB7XG4gIGNvbnN0IGlzRXJyb3IgPSBpc0Vycm9yTGlrZShyZWFzb24pXG4gIHJldHVybiBtYWtlUmVzcG9uc2Uoe1xuICAgIHR5cGU6ICdlcnJvcicsXG4gICAgc3RhdHVzOiAwLFxuICAgIGVycm9yOiBpc0Vycm9yXG4gICAgICA/IHJlYXNvblxuICAgICAgOiBuZXcgRXJyb3IocmVhc29uID8gU3RyaW5nKHJlYXNvbikgOiByZWFzb24pLFxuICAgIGFib3J0ZWQ6IHJlYXNvbiAmJiByZWFzb24ubmFtZSA9PT0gJ0Fib3J0RXJyb3InXG4gIH0pXG59XG5cbi8vIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtbmV0d29yay1lcnJvclxuZnVuY3Rpb24gaXNOZXR3b3JrRXJyb3IgKHJlc3BvbnNlKSB7XG4gIHJldHVybiAoXG4gICAgLy8gQSBuZXR3b3JrIGVycm9yIGlzIGEgcmVzcG9uc2Ugd2hvc2UgdHlwZSBpcyBcImVycm9yXCIsXG4gICAgcmVzcG9uc2UudHlwZSA9PT0gJ2Vycm9yJyAmJlxuICAgIC8vIHN0YXR1cyBpcyAwXG4gICAgcmVzcG9uc2Uuc3RhdHVzID09PSAwXG4gIClcbn1cblxuZnVuY3Rpb24gbWFrZUZpbHRlcmVkUmVzcG9uc2UgKHJlc3BvbnNlLCBzdGF0ZSkge1xuICBzdGF0ZSA9IHtcbiAgICBpbnRlcm5hbFJlc3BvbnNlOiByZXNwb25zZSxcbiAgICAuLi5zdGF0ZVxuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm94eShyZXNwb25zZSwge1xuICAgIGdldCAodGFyZ2V0LCBwKSB7XG4gICAgICByZXR1cm4gcCBpbiBzdGF0ZSA/IHN0YXRlW3BdIDogdGFyZ2V0W3BdXG4gICAgfSxcbiAgICBzZXQgKHRhcmdldCwgcCwgdmFsdWUpIHtcbiAgICAgIGFzc2VydCghKHAgaW4gc3RhdGUpKVxuICAgICAgdGFyZ2V0W3BdID0gdmFsdWVcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9KVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1maWx0ZXJlZC1yZXNwb25zZVxuZnVuY3Rpb24gZmlsdGVyUmVzcG9uc2UgKHJlc3BvbnNlLCB0eXBlKSB7XG4gIC8vIFNldCByZXNwb25zZSB0byB0aGUgZm9sbG93aW5nIGZpbHRlcmVkIHJlc3BvbnNlIHdpdGggcmVzcG9uc2UgYXMgaXRzXG4gIC8vIGludGVybmFsIHJlc3BvbnNlLCBkZXBlbmRpbmcgb24gcmVxdWVzdOKAmXMgcmVzcG9uc2UgdGFpbnRpbmc6XG4gIGlmICh0eXBlID09PSAnYmFzaWMnKSB7XG4gICAgLy8gQSBiYXNpYyBmaWx0ZXJlZCByZXNwb25zZSBpcyBhIGZpbHRlcmVkIHJlc3BvbnNlIHdob3NlIHR5cGUgaXMgXCJiYXNpY1wiXG4gICAgLy8gYW5kIGhlYWRlciBsaXN0IGV4Y2x1ZGVzIGFueSBoZWFkZXJzIGluIGludGVybmFsIHJlc3BvbnNl4oCZcyBoZWFkZXIgbGlzdFxuICAgIC8vIHdob3NlIG5hbWUgaXMgYSBmb3JiaWRkZW4gcmVzcG9uc2UtaGVhZGVyIG5hbWUuXG5cbiAgICAvLyBOb3RlOiB1bmRpY2kgZG9lcyBub3QgaW1wbGVtZW50IGZvcmJpZGRlbiByZXNwb25zZS1oZWFkZXIgbmFtZXNcbiAgICByZXR1cm4gbWFrZUZpbHRlcmVkUmVzcG9uc2UocmVzcG9uc2UsIHtcbiAgICAgIHR5cGU6ICdiYXNpYycsXG4gICAgICBoZWFkZXJzTGlzdDogcmVzcG9uc2UuaGVhZGVyc0xpc3RcbiAgICB9KVxuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdjb3JzJykge1xuICAgIC8vIEEgQ09SUyBmaWx0ZXJlZCByZXNwb25zZSBpcyBhIGZpbHRlcmVkIHJlc3BvbnNlIHdob3NlIHR5cGUgaXMgXCJjb3JzXCJcbiAgICAvLyBhbmQgaGVhZGVyIGxpc3QgZXhjbHVkZXMgYW55IGhlYWRlcnMgaW4gaW50ZXJuYWwgcmVzcG9uc2XigJlzIGhlYWRlclxuICAgIC8vIGxpc3Qgd2hvc2UgbmFtZSBpcyBub3QgYSBDT1JTLXNhZmVsaXN0ZWQgcmVzcG9uc2UtaGVhZGVyIG5hbWUsIGdpdmVuXG4gICAgLy8gaW50ZXJuYWwgcmVzcG9uc2XigJlzIENPUlMtZXhwb3NlZCBoZWFkZXItbmFtZSBsaXN0LlxuXG4gICAgLy8gTm90ZTogdW5kaWNpIGRvZXMgbm90IGltcGxlbWVudCBDT1JTLXNhZmVsaXN0ZWQgcmVzcG9uc2UtaGVhZGVyIG5hbWVzXG4gICAgcmV0dXJuIG1ha2VGaWx0ZXJlZFJlc3BvbnNlKHJlc3BvbnNlLCB7XG4gICAgICB0eXBlOiAnY29ycycsXG4gICAgICBoZWFkZXJzTGlzdDogcmVzcG9uc2UuaGVhZGVyc0xpc3RcbiAgICB9KVxuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvcGFxdWUnKSB7XG4gICAgLy8gQW4gb3BhcXVlIGZpbHRlcmVkIHJlc3BvbnNlIGlzIGEgZmlsdGVyZWQgcmVzcG9uc2Ugd2hvc2UgdHlwZSBpc1xuICAgIC8vIFwib3BhcXVlXCIsIFVSTCBsaXN0IGlzIHRoZSBlbXB0eSBsaXN0LCBzdGF0dXMgaXMgMCwgc3RhdHVzIG1lc3NhZ2VcbiAgICAvLyBpcyB0aGUgZW1wdHkgYnl0ZSBzZXF1ZW5jZSwgaGVhZGVyIGxpc3QgaXMgZW1wdHksIGFuZCBib2R5IGlzIG51bGwuXG5cbiAgICByZXR1cm4gbWFrZUZpbHRlcmVkUmVzcG9uc2UocmVzcG9uc2UsIHtcbiAgICAgIHR5cGU6ICdvcGFxdWUnLFxuICAgICAgdXJsTGlzdDogT2JqZWN0LmZyZWV6ZShbXSksXG4gICAgICBzdGF0dXM6IDAsXG4gICAgICBzdGF0dXNUZXh0OiAnJyxcbiAgICAgIGJvZHk6IG51bGxcbiAgICB9KVxuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvcGFxdWVyZWRpcmVjdCcpIHtcbiAgICAvLyBBbiBvcGFxdWUtcmVkaXJlY3QgZmlsdGVyZWQgcmVzcG9uc2UgaXMgYSBmaWx0ZXJlZCByZXNwb25zZSB3aG9zZSB0eXBlXG4gICAgLy8gaXMgXCJvcGFxdWVyZWRpcmVjdFwiLCBzdGF0dXMgaXMgMCwgc3RhdHVzIG1lc3NhZ2UgaXMgdGhlIGVtcHR5IGJ5dGVcbiAgICAvLyBzZXF1ZW5jZSwgaGVhZGVyIGxpc3QgaXMgZW1wdHksIGFuZCBib2R5IGlzIG51bGwuXG5cbiAgICByZXR1cm4gbWFrZUZpbHRlcmVkUmVzcG9uc2UocmVzcG9uc2UsIHtcbiAgICAgIHR5cGU6ICdvcGFxdWVyZWRpcmVjdCcsXG4gICAgICBzdGF0dXM6IDAsXG4gICAgICBzdGF0dXNUZXh0OiAnJyxcbiAgICAgIGhlYWRlcnNMaXN0OiBbXSxcbiAgICAgIGJvZHk6IG51bGxcbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIGFzc2VydChmYWxzZSlcbiAgfVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jYXBwcm9wcmlhdGUtbmV0d29yay1lcnJvclxuZnVuY3Rpb24gbWFrZUFwcHJvcHJpYXRlTmV0d29ya0Vycm9yIChmZXRjaFBhcmFtcywgZXJyID0gbnVsbCkge1xuICAvLyAxLiBBc3NlcnQ6IGZldGNoUGFyYW1zIGlzIGNhbmNlbGVkLlxuICBhc3NlcnQoaXNDYW5jZWxsZWQoZmV0Y2hQYXJhbXMpKVxuXG4gIC8vIDIuIFJldHVybiBhbiBhYm9ydGVkIG5ldHdvcmsgZXJyb3IgaWYgZmV0Y2hQYXJhbXMgaXMgYWJvcnRlZDtcbiAgLy8gb3RoZXJ3aXNlIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG4gIHJldHVybiBpc0Fib3J0ZWQoZmV0Y2hQYXJhbXMpXG4gICAgPyBtYWtlTmV0d29ya0Vycm9yKE9iamVjdC5hc3NpZ24obmV3IERPTUV4Y2VwdGlvbignVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZC4nLCAnQWJvcnRFcnJvcicpLCB7IGNhdXNlOiBlcnIgfSkpXG4gICAgOiBtYWtlTmV0d29ya0Vycm9yKE9iamVjdC5hc3NpZ24obmV3IERPTUV4Y2VwdGlvbignUmVxdWVzdCB3YXMgY2FuY2VsbGVkLicpLCB7IGNhdXNlOiBlcnIgfSkpXG59XG5cbi8vIGh0dHBzOi8vd2hhdHByLm9yZy9mZXRjaC8xMzkyLmh0bWwjaW5pdGlhbGl6ZS1hLXJlc3BvbnNlXG5mdW5jdGlvbiBpbml0aWFsaXplUmVzcG9uc2UgKHJlc3BvbnNlLCBpbml0LCBib2R5KSB7XG4gIC8vIDEuIElmIGluaXRbXCJzdGF0dXNcIl0gaXMgbm90IGluIHRoZSByYW5nZSAyMDAgdG8gNTk5LCBpbmNsdXNpdmUsIHRoZW5cbiAgLy8gICAgdGhyb3cgYSBSYW5nZUVycm9yLlxuICBpZiAoaW5pdC5zdGF0dXMgIT09IG51bGwgJiYgKGluaXQuc3RhdHVzIDwgMjAwIHx8IGluaXQuc3RhdHVzID4gNTk5KSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdpbml0W1wic3RhdHVzXCJdIG11c3QgYmUgaW4gdGhlIHJhbmdlIG9mIDIwMCB0byA1OTksIGluY2x1c2l2ZS4nKVxuICB9XG5cbiAgLy8gMi4gSWYgaW5pdFtcInN0YXR1c1RleHRcIl0gZG9lcyBub3QgbWF0Y2ggdGhlIHJlYXNvbi1waHJhc2UgdG9rZW4gcHJvZHVjdGlvbixcbiAgLy8gICAgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgaWYgKCdzdGF0dXNUZXh0JyBpbiBpbml0ICYmIGluaXQuc3RhdHVzVGV4dCAhPSBudWxsKSB7XG4gICAgLy8gU2VlLCBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzcyMzAjc2VjdGlvbi0zLjEuMjpcbiAgICAvLyAgIHJlYXNvbi1waHJhc2UgID0gKiggSFRBQiAvIFNQIC8gVkNIQVIgLyBvYnMtdGV4dCApXG4gICAgaWYgKCFpc1ZhbGlkUmVhc29uUGhyYXNlKFN0cmluZyhpbml0LnN0YXR1c1RleHQpKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBzdGF0dXNUZXh0JylcbiAgICB9XG4gIH1cblxuICAvLyAzLiBTZXQgcmVzcG9uc2XigJlzIHJlc3BvbnNl4oCZcyBzdGF0dXMgdG8gaW5pdFtcInN0YXR1c1wiXS5cbiAgaWYgKCdzdGF0dXMnIGluIGluaXQgJiYgaW5pdC5zdGF0dXMgIT0gbnVsbCkge1xuICAgIHJlc3BvbnNlW2tTdGF0ZV0uc3RhdHVzID0gaW5pdC5zdGF0dXNcbiAgfVxuXG4gIC8vIDQuIFNldCByZXNwb25zZeKAmXMgcmVzcG9uc2XigJlzIHN0YXR1cyBtZXNzYWdlIHRvIGluaXRbXCJzdGF0dXNUZXh0XCJdLlxuICBpZiAoJ3N0YXR1c1RleHQnIGluIGluaXQgJiYgaW5pdC5zdGF0dXNUZXh0ICE9IG51bGwpIHtcbiAgICByZXNwb25zZVtrU3RhdGVdLnN0YXR1c1RleHQgPSBpbml0LnN0YXR1c1RleHRcbiAgfVxuXG4gIC8vIDUuIElmIGluaXRbXCJoZWFkZXJzXCJdIGV4aXN0cywgdGhlbiBmaWxsIHJlc3BvbnNl4oCZcyBoZWFkZXJzIHdpdGggaW5pdFtcImhlYWRlcnNcIl0uXG4gIGlmICgnaGVhZGVycycgaW4gaW5pdCAmJiBpbml0LmhlYWRlcnMgIT0gbnVsbCkge1xuICAgIGZpbGwocmVzcG9uc2Vba0hlYWRlcnNdLCBpbml0LmhlYWRlcnMpXG4gIH1cblxuICAvLyA2LiBJZiBib2R5IHdhcyBnaXZlbiwgdGhlbjpcbiAgaWYgKGJvZHkpIHtcbiAgICAvLyAxLiBJZiByZXNwb25zZSdzIHN0YXR1cyBpcyBhIG51bGwgYm9keSBzdGF0dXMsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKG51bGxCb2R5U3RhdHVzLmluY2x1ZGVzKHJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgaGVhZGVyOiAnUmVzcG9uc2UgY29uc3RydWN0b3InLFxuICAgICAgICBtZXNzYWdlOiBgSW52YWxpZCByZXNwb25zZSBzdGF0dXMgY29kZSAke3Jlc3BvbnNlLnN0YXR1c31gXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDIuIFNldCByZXNwb25zZSdzIGJvZHkgdG8gYm9keSdzIGJvZHkuXG4gICAgcmVzcG9uc2Vba1N0YXRlXS5ib2R5ID0gYm9keS5ib2R5XG5cbiAgICAvLyAzLiBJZiBib2R5J3MgdHlwZSBpcyBub24tbnVsbCBhbmQgcmVzcG9uc2UncyBoZWFkZXIgbGlzdCBkb2VzIG5vdCBjb250YWluXG4gICAgLy8gICAgYENvbnRlbnQtVHlwZWAsIHRoZW4gYXBwZW5kIChgQ29udGVudC1UeXBlYCwgYm9keSdzIHR5cGUpIHRvIHJlc3BvbnNlJ3MgaGVhZGVyIGxpc3QuXG4gICAgaWYgKGJvZHkudHlwZSAhPSBudWxsICYmICFyZXNwb25zZVtrU3RhdGVdLmhlYWRlcnNMaXN0LmNvbnRhaW5zKCdjb250ZW50LXR5cGUnLCB0cnVlKSkge1xuICAgICAgcmVzcG9uc2Vba1N0YXRlXS5oZWFkZXJzTGlzdC5hcHBlbmQoJ2NvbnRlbnQtdHlwZScsIGJvZHkudHlwZSwgdHJ1ZSlcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXNwb25zZS1jcmVhdGVcbiAqIEBwYXJhbSB7YW55fSBpbm5lclJlc3BvbnNlXG4gKiBAcGFyYW0geydyZXF1ZXN0JyB8ICdpbW11dGFibGUnIHwgJ3JlcXVlc3Qtbm8tY29ycycgfCAncmVzcG9uc2UnIHwgJ25vbmUnfSBndWFyZFxuICogQHJldHVybnMge1Jlc3BvbnNlfVxuICovXG5mdW5jdGlvbiBmcm9tSW5uZXJSZXNwb25zZSAoaW5uZXJSZXNwb25zZSwgZ3VhcmQpIHtcbiAgY29uc3QgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2Uoa0NvbnN0cnVjdClcbiAgcmVzcG9uc2Vba1N0YXRlXSA9IGlubmVyUmVzcG9uc2VcbiAgcmVzcG9uc2Vba0hlYWRlcnNdID0gbmV3IEhlYWRlcnMoa0NvbnN0cnVjdClcbiAgc2V0SGVhZGVyc0xpc3QocmVzcG9uc2Vba0hlYWRlcnNdLCBpbm5lclJlc3BvbnNlLmhlYWRlcnNMaXN0KVxuICBzZXRIZWFkZXJzR3VhcmQocmVzcG9uc2Vba0hlYWRlcnNdLCBndWFyZClcblxuICBpZiAoaGFzRmluYWxpemF0aW9uUmVnaXN0cnkgJiYgaW5uZXJSZXNwb25zZS5ib2R5Py5zdHJlYW0pIHtcbiAgICAvLyBJZiB0aGUgdGFyZ2V0IChyZXNwb25zZSkgaXMgcmVjbGFpbWVkLCB0aGUgY2xlYW51cCBjYWxsYmFjayBtYXkgYmUgY2FsbGVkIGF0IHNvbWUgcG9pbnQgd2l0aFxuICAgIC8vIHRoZSBoZWxkIHZhbHVlIHByb3ZpZGVkIGZvciBpdCAoaW5uZXJSZXNwb25zZS5ib2R5LnN0cmVhbSkuIFRoZSBoZWxkIHZhbHVlIGNhbiBiZSBhbnkgdmFsdWU6XG4gICAgLy8gYSBwcmltaXRpdmUgb3IgYW4gb2JqZWN0LCBldmVuIHVuZGVmaW5lZC4gSWYgdGhlIGhlbGQgdmFsdWUgaXMgYW4gb2JqZWN0LCB0aGUgcmVnaXN0cnkga2VlcHNcbiAgICAvLyBhIHN0cm9uZyByZWZlcmVuY2UgdG8gaXQgKHNvIGl0IGNhbiBwYXNzIGl0IHRvIHRoZSBjbGVhbnVwIGNhbGxiYWNrIGxhdGVyKS4gUmV3b3JkZWQgZnJvbVxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0ZpbmFsaXphdGlvblJlZ2lzdHJ5XG4gICAgc3RyZWFtUmVnaXN0cnkucmVnaXN0ZXIocmVzcG9uc2UsIG5ldyBXZWFrUmVmKGlubmVyUmVzcG9uc2UuYm9keS5zdHJlYW0pKVxuICB9XG5cbiAgcmV0dXJuIHJlc3BvbnNlXG59XG5cbndlYmlkbC5jb252ZXJ0ZXJzLlJlYWRhYmxlU3RyZWFtID0gd2ViaWRsLmludGVyZmFjZUNvbnZlcnRlcihcbiAgUmVhZGFibGVTdHJlYW1cbilcblxud2ViaWRsLmNvbnZlcnRlcnMuRm9ybURhdGEgPSB3ZWJpZGwuaW50ZXJmYWNlQ29udmVydGVyKFxuICBGb3JtRGF0YVxuKVxuXG53ZWJpZGwuY29udmVydGVycy5VUkxTZWFyY2hQYXJhbXMgPSB3ZWJpZGwuaW50ZXJmYWNlQ29udmVydGVyKFxuICBVUkxTZWFyY2hQYXJhbXNcbilcblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI3R5cGVkZWZkZWYteG1saHR0cHJlcXVlc3Rib2R5aW5pdFxud2ViaWRsLmNvbnZlcnRlcnMuWE1MSHR0cFJlcXVlc3RCb2R5SW5pdCA9IGZ1bmN0aW9uIChWLCBwcmVmaXgsIG5hbWUpIHtcbiAgaWYgKHR5cGVvZiBWID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcoViwgcHJlZml4LCBuYW1lKVxuICB9XG5cbiAgaWYgKGlzQmxvYkxpa2UoVikpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuQmxvYihWLCBwcmVmaXgsIG5hbWUsIHsgc3RyaWN0OiBmYWxzZSB9KVxuICB9XG5cbiAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhWKSB8fCB0eXBlcy5pc0FycmF5QnVmZmVyKFYpKSB7XG4gICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLkJ1ZmZlclNvdXJjZShWLCBwcmVmaXgsIG5hbWUpXG4gIH1cblxuICBpZiAodXRpbC5pc0Zvcm1EYXRhTGlrZShWKSkge1xuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5Gb3JtRGF0YShWLCBwcmVmaXgsIG5hbWUsIHsgc3RyaWN0OiBmYWxzZSB9KVxuICB9XG5cbiAgaWYgKFYgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXMpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuVVJMU2VhcmNoUGFyYW1zKFYsIHByZWZpeCwgbmFtZSlcbiAgfVxuXG4gIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcoViwgcHJlZml4LCBuYW1lKVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jYm9keWluaXRcbndlYmlkbC5jb252ZXJ0ZXJzLkJvZHlJbml0ID0gZnVuY3Rpb24gKFYsIHByZWZpeCwgYXJndW1lbnQpIHtcbiAgaWYgKFYgaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbSkge1xuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5SZWFkYWJsZVN0cmVhbShWLCBwcmVmaXgsIGFyZ3VtZW50KVxuICB9XG5cbiAgLy8gTm90ZTogdGhlIHNwZWMgZG9lc24ndCBpbmNsdWRlIGFzeW5jIGl0ZXJhYmxlcyxcbiAgLy8gdGhpcyBpcyBhbiB1bmRpY2kgZXh0ZW5zaW9uLlxuICBpZiAoVj8uW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSkge1xuICAgIHJldHVybiBWXG4gIH1cblxuICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuWE1MSHR0cFJlcXVlc3RCb2R5SW5pdChWLCBwcmVmaXgsIGFyZ3VtZW50KVxufVxuXG53ZWJpZGwuY29udmVydGVycy5SZXNwb25zZUluaXQgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIHtcbiAgICBrZXk6ICdzdGF0dXMnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIHNob3J0J10sXG4gICAgZGVmYXVsdFZhbHVlOiAoKSA9PiAyMDBcbiAgfSxcbiAge1xuICAgIGtleTogJ3N0YXR1c1RleHQnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6ICgpID0+ICcnXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdoZWFkZXJzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkhlYWRlcnNJbml0XG4gIH1cbl0pXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc05ldHdvcmtFcnJvcixcbiAgbWFrZU5ldHdvcmtFcnJvcixcbiAgbWFrZVJlc3BvbnNlLFxuICBtYWtlQXBwcm9wcmlhdGVOZXR3b3JrRXJyb3IsXG4gIGZpbHRlclJlc3BvbnNlLFxuICBSZXNwb25zZSxcbiAgY2xvbmVSZXNwb25zZSxcbiAgZnJvbUlubmVyUmVzcG9uc2Vcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IGtDb25uZWN0ZWQsIGtTaXplIH0gPSByZXF1aXJlKCcuLi8uLi9jb3JlL3N5bWJvbHMnKVxuXG5jbGFzcyBDb21wYXRXZWFrUmVmIHtcbiAgY29uc3RydWN0b3IgKHZhbHVlKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gIH1cblxuICBkZXJlZiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVba0Nvbm5lY3RlZF0gPT09IDAgJiYgdGhpcy52YWx1ZVtrU2l6ZV0gPT09IDBcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IHRoaXMudmFsdWVcbiAgfVxufVxuXG5jbGFzcyBDb21wYXRGaW5hbGl6ZXIge1xuICBjb25zdHJ1Y3RvciAoZmluYWxpemVyKSB7XG4gICAgdGhpcy5maW5hbGl6ZXIgPSBmaW5hbGl6ZXJcbiAgfVxuXG4gIHJlZ2lzdGVyIChkaXNwYXRjaGVyLCBrZXkpIHtcbiAgICBpZiAoZGlzcGF0Y2hlci5vbikge1xuICAgICAgZGlzcGF0Y2hlci5vbignZGlzY29ubmVjdCcsICgpID0+IHtcbiAgICAgICAgaWYgKGRpc3BhdGNoZXJba0Nvbm5lY3RlZF0gPT09IDAgJiYgZGlzcGF0Y2hlcltrU2l6ZV0gPT09IDApIHtcbiAgICAgICAgICB0aGlzLmZpbmFsaXplcihrZXkpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgdW5yZWdpc3RlciAoa2V5KSB7fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gRklYTUU6IHJlbW92ZSB3b3JrYXJvdW5kIHdoZW4gdGhlIE5vZGUgYnVnIGlzIGJhY2twb3J0ZWQgdG8gdjE4XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvNDkzNDQjaXNzdWVjb21tZW50LTE3NDE3NzYzMDhcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfVjhfQ09WRVJBR0UgJiYgcHJvY2Vzcy52ZXJzaW9uLnN0YXJ0c1dpdGgoJ3YxOCcpKSB7XG4gICAgcHJvY2Vzcy5fcmF3RGVidWcoJ1VzaW5nIGNvbXBhdGliaWxpdHkgV2Vha1JlZiBhbmQgRmluYWxpemF0aW9uUmVnaXN0cnknKVxuICAgIHJldHVybiB7XG4gICAgICBXZWFrUmVmOiBDb21wYXRXZWFrUmVmLFxuICAgICAgRmluYWxpemF0aW9uUmVnaXN0cnk6IENvbXBhdEZpbmFsaXplclxuICAgIH1cbiAgfVxuICByZXR1cm4geyBXZWFrUmVmLCBGaW5hbGl6YXRpb25SZWdpc3RyeSB9XG59XG4iLCIvKiBnbG9iYWxzIEFib3J0Q29udHJvbGxlciAqL1xuXG4ndXNlIHN0cmljdCdcblxuY29uc3QgeyBleHRyYWN0Qm9keSwgbWl4aW5Cb2R5LCBjbG9uZUJvZHksIGJvZHlVbnVzYWJsZSB9ID0gcmVxdWlyZSgnLi9ib2R5JylcbmNvbnN0IHsgSGVhZGVycywgZmlsbDogZmlsbEhlYWRlcnMsIEhlYWRlcnNMaXN0LCBzZXRIZWFkZXJzR3VhcmQsIGdldEhlYWRlcnNHdWFyZCwgc2V0SGVhZGVyc0xpc3QsIGdldEhlYWRlcnNMaXN0IH0gPSByZXF1aXJlKCcuL2hlYWRlcnMnKVxuY29uc3QgeyBGaW5hbGl6YXRpb25SZWdpc3RyeSB9ID0gcmVxdWlyZSgnLi9kaXNwYXRjaGVyLXdlYWtyZWYnKSgpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vLi4vY29yZS91dGlsJylcbmNvbnN0IG5vZGVVdGlsID0gcmVxdWlyZSgnbm9kZTp1dGlsJylcbmNvbnN0IHtcbiAgaXNWYWxpZEhUVFBUb2tlbixcbiAgc2FtZU9yaWdpbixcbiAgZW52aXJvbm1lbnRTZXR0aW5nc09iamVjdFxufSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7XG4gIGZvcmJpZGRlbk1ldGhvZHNTZXQsXG4gIGNvcnNTYWZlTGlzdGVkTWV0aG9kc1NldCxcbiAgcmVmZXJyZXJQb2xpY3ksXG4gIHJlcXVlc3RSZWRpcmVjdCxcbiAgcmVxdWVzdE1vZGUsXG4gIHJlcXVlc3RDcmVkZW50aWFscyxcbiAgcmVxdWVzdENhY2hlLFxuICByZXF1ZXN0RHVwbGV4XG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3QgeyBrRW51bWVyYWJsZVByb3BlcnR5LCBub3JtYWxpemVkTWV0aG9kUmVjb3Jkc0Jhc2UsIG5vcm1hbGl6ZWRNZXRob2RSZWNvcmRzIH0gPSB1dGlsXG5jb25zdCB7IGtIZWFkZXJzLCBrU2lnbmFsLCBrU3RhdGUsIGtEaXNwYXRjaGVyIH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4vd2ViaWRsJylcbmNvbnN0IHsgVVJMU2VyaWFsaXplciB9ID0gcmVxdWlyZSgnLi9kYXRhLXVybCcpXG5jb25zdCB7IGtDb25zdHJ1Y3QgfSA9IHJlcXVpcmUoJy4uLy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdub2RlOmFzc2VydCcpXG5jb25zdCB7IGdldE1heExpc3RlbmVycywgc2V0TWF4TGlzdGVuZXJzLCBnZXRFdmVudExpc3RlbmVycywgZGVmYXVsdE1heExpc3RlbmVycyB9ID0gcmVxdWlyZSgnbm9kZTpldmVudHMnKVxuXG5jb25zdCBrQWJvcnRDb250cm9sbGVyID0gU3ltYm9sKCdhYm9ydENvbnRyb2xsZXInKVxuXG5jb25zdCByZXF1ZXN0RmluYWxpemVyID0gbmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KCh7IHNpZ25hbCwgYWJvcnQgfSkgPT4ge1xuICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydClcbn0pXG5cbmNvbnN0IGRlcGVuZGVudENvbnRyb2xsZXJNYXAgPSBuZXcgV2Vha01hcCgpXG5cbmZ1bmN0aW9uIGJ1aWxkQWJvcnQgKGFjUmVmKSB7XG4gIHJldHVybiBhYm9ydFxuXG4gIGZ1bmN0aW9uIGFib3J0ICgpIHtcbiAgICBjb25zdCBhYyA9IGFjUmVmLmRlcmVmKClcbiAgICBpZiAoYWMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQ3VycmVudGx5LCB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCBGaW5hbGl6YXRpb25SZWdpc3RyeS5cbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvNDkzNDRcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvNDc3NDhcbiAgICAgIC8vIEluIHRoZSBjYXNlIG9mIGFib3J0LCB0aGUgZmlyc3Qgc3RlcCBpcyB0byB1bnJlZ2lzdGVyIGZyb20gaXQuXG4gICAgICAvLyBJZiB0aGUgY29udHJvbGxlciBjYW4gcmVmZXIgdG8gaXQsIGl0IGlzIHN0aWxsIHJlZ2lzdGVyZWQuXG4gICAgICAvLyBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS5cbiAgICAgIHJlcXVlc3RGaW5hbGl6ZXIudW5yZWdpc3RlcihhYm9ydClcblxuICAgICAgLy8gVW5zdWJzY3JpYmUgYSBsaXN0ZW5lci5cbiAgICAgIC8vIEZpbmFsaXphdGlvblJlZ2lzdHJ5IHdpbGwgbm8gbG9uZ2VyIGJlIGNhbGxlZCwgc28gdGhpcyBtdXN0IGJlIGRvbmUuXG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnQpXG5cbiAgICAgIGFjLmFib3J0KHRoaXMucmVhc29uKVxuXG4gICAgICBjb25zdCBjb250cm9sbGVyTGlzdCA9IGRlcGVuZGVudENvbnRyb2xsZXJNYXAuZ2V0KGFjLnNpZ25hbClcblxuICAgICAgaWYgKGNvbnRyb2xsZXJMaXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGNvbnRyb2xsZXJMaXN0LnNpemUgIT09IDApIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHJlZiBvZiBjb250cm9sbGVyTGlzdCkge1xuICAgICAgICAgICAgY29uc3QgY3RybCA9IHJlZi5kZXJlZigpXG4gICAgICAgICAgICBpZiAoY3RybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGN0cmwuYWJvcnQodGhpcy5yZWFzb24pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRyb2xsZXJMaXN0LmNsZWFyKClcbiAgICAgICAgfVxuICAgICAgICBkZXBlbmRlbnRDb250cm9sbGVyTWFwLmRlbGV0ZShhYy5zaWduYWwpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmxldCBwYXRjaE1ldGhvZFdhcm5pbmcgPSBmYWxzZVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jcmVxdWVzdC1jbGFzc1xuY2xhc3MgUmVxdWVzdCB7XG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkb20tcmVxdWVzdFxuICBjb25zdHJ1Y3RvciAoaW5wdXQsIGluaXQgPSB7fSkge1xuICAgIHdlYmlkbC51dGlsLm1hcmtBc1VuY2xvbmVhYmxlKHRoaXMpXG4gICAgaWYgKGlucHV0ID09PSBrQ29uc3RydWN0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBwcmVmaXggPSAnUmVxdWVzdCBjb25zdHJ1Y3RvcidcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHByZWZpeClcblxuICAgIGlucHV0ID0gd2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdEluZm8oaW5wdXQsIHByZWZpeCwgJ2lucHV0JylcbiAgICBpbml0ID0gd2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdEluaXQoaW5pdCwgcHJlZml4LCAnaW5pdCcpXG5cbiAgICAvLyAxLiBMZXQgcmVxdWVzdCBiZSBudWxsLlxuICAgIGxldCByZXF1ZXN0ID0gbnVsbFxuXG4gICAgLy8gMi4gTGV0IGZhbGxiYWNrTW9kZSBiZSBudWxsLlxuICAgIGxldCBmYWxsYmFja01vZGUgPSBudWxsXG5cbiAgICAvLyAzLiBMZXQgYmFzZVVSTCBiZSB0aGlz4oCZcyByZWxldmFudCBzZXR0aW5ncyBvYmplY3TigJlzIEFQSSBiYXNlIFVSTC5cbiAgICBjb25zdCBiYXNlVXJsID0gZW52aXJvbm1lbnRTZXR0aW5nc09iamVjdC5zZXR0aW5nc09iamVjdC5iYXNlVXJsXG5cbiAgICAvLyA0LiBMZXQgc2lnbmFsIGJlIG51bGwuXG4gICAgbGV0IHNpZ25hbCA9IG51bGxcblxuICAgIC8vIDUuIElmIGlucHV0IGlzIGEgc3RyaW5nLCB0aGVuOlxuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzW2tEaXNwYXRjaGVyXSA9IGluaXQuZGlzcGF0Y2hlclxuXG4gICAgICAvLyAxLiBMZXQgcGFyc2VkVVJMIGJlIHRoZSByZXN1bHQgb2YgcGFyc2luZyBpbnB1dCB3aXRoIGJhc2VVUkwuXG4gICAgICAvLyAyLiBJZiBwYXJzZWRVUkwgaXMgZmFpbHVyZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgIGxldCBwYXJzZWRVUkxcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhcnNlZFVSTCA9IG5ldyBVUkwoaW5wdXQsIGJhc2VVcmwpXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRmFpbGVkIHRvIHBhcnNlIFVSTCBmcm9tICcgKyBpbnB1dCwgeyBjYXVzZTogZXJyIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIElmIHBhcnNlZFVSTCBpbmNsdWRlcyBjcmVkZW50aWFscywgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgIGlmIChwYXJzZWRVUkwudXNlcm5hbWUgfHwgcGFyc2VkVVJMLnBhc3N3b3JkKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgJ1JlcXVlc3QgY2Fubm90IGJlIGNvbnN0cnVjdGVkIGZyb20gYSBVUkwgdGhhdCBpbmNsdWRlcyBjcmVkZW50aWFsczogJyArXG4gICAgICAgICAgICBpbnB1dFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8vIDQuIFNldCByZXF1ZXN0IHRvIGEgbmV3IHJlcXVlc3Qgd2hvc2UgVVJMIGlzIHBhcnNlZFVSTC5cbiAgICAgIHJlcXVlc3QgPSBtYWtlUmVxdWVzdCh7IHVybExpc3Q6IFtwYXJzZWRVUkxdIH0pXG5cbiAgICAgIC8vIDUuIFNldCBmYWxsYmFja01vZGUgdG8gXCJjb3JzXCIuXG4gICAgICBmYWxsYmFja01vZGUgPSAnY29ycydcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1trRGlzcGF0Y2hlcl0gPSBpbml0LmRpc3BhdGNoZXIgfHwgaW5wdXRba0Rpc3BhdGNoZXJdXG5cbiAgICAgIC8vIDYuIE90aGVyd2lzZTpcblxuICAgICAgLy8gNy4gQXNzZXJ0OiBpbnB1dCBpcyBhIFJlcXVlc3Qgb2JqZWN0LlxuICAgICAgYXNzZXJ0KGlucHV0IGluc3RhbmNlb2YgUmVxdWVzdClcblxuICAgICAgLy8gOC4gU2V0IHJlcXVlc3QgdG8gaW5wdXTigJlzIHJlcXVlc3QuXG4gICAgICByZXF1ZXN0ID0gaW5wdXRba1N0YXRlXVxuXG4gICAgICAvLyA5LiBTZXQgc2lnbmFsIHRvIGlucHV04oCZcyBzaWduYWwuXG4gICAgICBzaWduYWwgPSBpbnB1dFtrU2lnbmFsXVxuICAgIH1cblxuICAgIC8vIDcuIExldCBvcmlnaW4gYmUgdGhpc+KAmXMgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN04oCZcyBvcmlnaW4uXG4gICAgY29uc3Qgb3JpZ2luID0gZW52aXJvbm1lbnRTZXR0aW5nc09iamVjdC5zZXR0aW5nc09iamVjdC5vcmlnaW5cblxuICAgIC8vIDguIExldCB3aW5kb3cgYmUgXCJjbGllbnRcIi5cbiAgICBsZXQgd2luZG93ID0gJ2NsaWVudCdcblxuICAgIC8vIDkuIElmIHJlcXVlc3TigJlzIHdpbmRvdyBpcyBhbiBlbnZpcm9ubWVudCBzZXR0aW5ncyBvYmplY3QgYW5kIGl0cyBvcmlnaW5cbiAgICAvLyBpcyBzYW1lIG9yaWdpbiB3aXRoIG9yaWdpbiwgdGhlbiBzZXQgd2luZG93IHRvIHJlcXVlc3TigJlzIHdpbmRvdy5cbiAgICBpZiAoXG4gICAgICByZXF1ZXN0LndpbmRvdz8uY29uc3RydWN0b3I/Lm5hbWUgPT09ICdFbnZpcm9ubWVudFNldHRpbmdzT2JqZWN0JyAmJlxuICAgICAgc2FtZU9yaWdpbihyZXF1ZXN0LndpbmRvdywgb3JpZ2luKVxuICAgICkge1xuICAgICAgd2luZG93ID0gcmVxdWVzdC53aW5kb3dcbiAgICB9XG5cbiAgICAvLyAxMC4gSWYgaW5pdFtcIndpbmRvd1wiXSBleGlzdHMgYW5kIGlzIG5vbi1udWxsLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmIChpbml0LndpbmRvdyAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAnd2luZG93JyBvcHRpb24gJyR7d2luZG93fScgbXVzdCBiZSBudWxsYClcbiAgICB9XG5cbiAgICAvLyAxMS4gSWYgaW5pdFtcIndpbmRvd1wiXSBleGlzdHMsIHRoZW4gc2V0IHdpbmRvdyB0byBcIm5vLXdpbmRvd1wiLlxuICAgIGlmICgnd2luZG93JyBpbiBpbml0KSB7XG4gICAgICB3aW5kb3cgPSAnbm8td2luZG93J1xuICAgIH1cblxuICAgIC8vIDEyLiBTZXQgcmVxdWVzdCB0byBhIG5ldyByZXF1ZXN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgIHJlcXVlc3QgPSBtYWtlUmVxdWVzdCh7XG4gICAgICAvLyBVUkwgcmVxdWVzdOKAmXMgVVJMLlxuICAgICAgLy8gdW5kaWNpIGltcGxlbWVudGF0aW9uIG5vdGU6IHRoaXMgaXMgc2V0IGFzIHRoZSBmaXJzdCBpdGVtIGluIHJlcXVlc3QncyB1cmxMaXN0IGluIG1ha2VSZXF1ZXN0XG4gICAgICAvLyBtZXRob2QgcmVxdWVzdOKAmXMgbWV0aG9kLlxuICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgIC8vIGhlYWRlciBsaXN0IEEgY29weSBvZiByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgICAgIC8vIHVuZGljaSBpbXBsZW1lbnRhdGlvbiBub3RlOiBoZWFkZXJzTGlzdCBpcyBjbG9uZWQgaW4gbWFrZVJlcXVlc3RcbiAgICAgIGhlYWRlcnNMaXN0OiByZXF1ZXN0LmhlYWRlcnNMaXN0LFxuICAgICAgLy8gdW5zYWZlLXJlcXVlc3QgZmxhZyBTZXQuXG4gICAgICB1bnNhZmVSZXF1ZXN0OiByZXF1ZXN0LnVuc2FmZVJlcXVlc3QsXG4gICAgICAvLyBjbGllbnQgVGhpc+KAmXMgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN0LlxuICAgICAgY2xpZW50OiBlbnZpcm9ubWVudFNldHRpbmdzT2JqZWN0LnNldHRpbmdzT2JqZWN0LFxuICAgICAgLy8gd2luZG93IHdpbmRvdy5cbiAgICAgIHdpbmRvdyxcbiAgICAgIC8vIHByaW9yaXR5IHJlcXVlc3TigJlzIHByaW9yaXR5LlxuICAgICAgcHJpb3JpdHk6IHJlcXVlc3QucHJpb3JpdHksXG4gICAgICAvLyBvcmlnaW4gcmVxdWVzdOKAmXMgb3JpZ2luLiBUaGUgcHJvcGFnYXRpb24gb2YgdGhlIG9yaWdpbiBpcyBvbmx5IHNpZ25pZmljYW50IGZvciBuYXZpZ2F0aW9uIHJlcXVlc3RzXG4gICAgICAvLyBiZWluZyBoYW5kbGVkIGJ5IGEgc2VydmljZSB3b3JrZXIuIEluIHRoaXMgc2NlbmFyaW8gYSByZXF1ZXN0IGNhbiBoYXZlIGFuIG9yaWdpbiB0aGF0IGlzIGRpZmZlcmVudFxuICAgICAgLy8gZnJvbSB0aGUgY3VycmVudCBjbGllbnQuXG4gICAgICBvcmlnaW46IHJlcXVlc3Qub3JpZ2luLFxuICAgICAgLy8gcmVmZXJyZXIgcmVxdWVzdOKAmXMgcmVmZXJyZXIuXG4gICAgICByZWZlcnJlcjogcmVxdWVzdC5yZWZlcnJlcixcbiAgICAgIC8vIHJlZmVycmVyIHBvbGljeSByZXF1ZXN04oCZcyByZWZlcnJlciBwb2xpY3kuXG4gICAgICByZWZlcnJlclBvbGljeTogcmVxdWVzdC5yZWZlcnJlclBvbGljeSxcbiAgICAgIC8vIG1vZGUgcmVxdWVzdOKAmXMgbW9kZS5cbiAgICAgIG1vZGU6IHJlcXVlc3QubW9kZSxcbiAgICAgIC8vIGNyZWRlbnRpYWxzIG1vZGUgcmVxdWVzdOKAmXMgY3JlZGVudGlhbHMgbW9kZS5cbiAgICAgIGNyZWRlbnRpYWxzOiByZXF1ZXN0LmNyZWRlbnRpYWxzLFxuICAgICAgLy8gY2FjaGUgbW9kZSByZXF1ZXN04oCZcyBjYWNoZSBtb2RlLlxuICAgICAgY2FjaGU6IHJlcXVlc3QuY2FjaGUsXG4gICAgICAvLyByZWRpcmVjdCBtb2RlIHJlcXVlc3TigJlzIHJlZGlyZWN0IG1vZGUuXG4gICAgICByZWRpcmVjdDogcmVxdWVzdC5yZWRpcmVjdCxcbiAgICAgIC8vIGludGVncml0eSBtZXRhZGF0YSByZXF1ZXN04oCZcyBpbnRlZ3JpdHkgbWV0YWRhdGEuXG4gICAgICBpbnRlZ3JpdHk6IHJlcXVlc3QuaW50ZWdyaXR5LFxuICAgICAgLy8ga2VlcGFsaXZlIHJlcXVlc3TigJlzIGtlZXBhbGl2ZS5cbiAgICAgIGtlZXBhbGl2ZTogcmVxdWVzdC5rZWVwYWxpdmUsXG4gICAgICAvLyByZWxvYWQtbmF2aWdhdGlvbiBmbGFnIHJlcXVlc3TigJlzIHJlbG9hZC1uYXZpZ2F0aW9uIGZsYWcuXG4gICAgICByZWxvYWROYXZpZ2F0aW9uOiByZXF1ZXN0LnJlbG9hZE5hdmlnYXRpb24sXG4gICAgICAvLyBoaXN0b3J5LW5hdmlnYXRpb24gZmxhZyByZXF1ZXN04oCZcyBoaXN0b3J5LW5hdmlnYXRpb24gZmxhZy5cbiAgICAgIGhpc3RvcnlOYXZpZ2F0aW9uOiByZXF1ZXN0Lmhpc3RvcnlOYXZpZ2F0aW9uLFxuICAgICAgLy8gVVJMIGxpc3QgQSBjbG9uZSBvZiByZXF1ZXN04oCZcyBVUkwgbGlzdC5cbiAgICAgIHVybExpc3Q6IFsuLi5yZXF1ZXN0LnVybExpc3RdXG4gICAgfSlcblxuICAgIGNvbnN0IGluaXRIYXNLZXkgPSBPYmplY3Qua2V5cyhpbml0KS5sZW5ndGggIT09IDBcblxuICAgIC8vIDEzLiBJZiBpbml0IGlzIG5vdCBlbXB0eSwgdGhlbjpcbiAgICBpZiAoaW5pdEhhc0tleSkge1xuICAgICAgLy8gMS4gSWYgcmVxdWVzdOKAmXMgbW9kZSBpcyBcIm5hdmlnYXRlXCIsIHRoZW4gc2V0IGl0IHRvIFwic2FtZS1vcmlnaW5cIi5cbiAgICAgIGlmIChyZXF1ZXN0Lm1vZGUgPT09ICduYXZpZ2F0ZScpIHtcbiAgICAgICAgcmVxdWVzdC5tb2RlID0gJ3NhbWUtb3JpZ2luJ1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBVbnNldCByZXF1ZXN04oCZcyByZWxvYWQtbmF2aWdhdGlvbiBmbGFnLlxuICAgICAgcmVxdWVzdC5yZWxvYWROYXZpZ2F0aW9uID0gZmFsc2VcblxuICAgICAgLy8gMy4gVW5zZXQgcmVxdWVzdOKAmXMgaGlzdG9yeS1uYXZpZ2F0aW9uIGZsYWcuXG4gICAgICByZXF1ZXN0Lmhpc3RvcnlOYXZpZ2F0aW9uID0gZmFsc2VcblxuICAgICAgLy8gNC4gU2V0IHJlcXVlc3TigJlzIG9yaWdpbiB0byBcImNsaWVudFwiLlxuICAgICAgcmVxdWVzdC5vcmlnaW4gPSAnY2xpZW50J1xuXG4gICAgICAvLyA1LiBTZXQgcmVxdWVzdOKAmXMgcmVmZXJyZXIgdG8gXCJjbGllbnRcIlxuICAgICAgcmVxdWVzdC5yZWZlcnJlciA9ICdjbGllbnQnXG5cbiAgICAgIC8vIDYuIFNldCByZXF1ZXN04oCZcyByZWZlcnJlciBwb2xpY3kgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAgICAgIHJlcXVlc3QucmVmZXJyZXJQb2xpY3kgPSAnJ1xuXG4gICAgICAvLyA3LiBTZXQgcmVxdWVzdOKAmXMgVVJMIHRvIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJMLlxuICAgICAgcmVxdWVzdC51cmwgPSByZXF1ZXN0LnVybExpc3RbcmVxdWVzdC51cmxMaXN0Lmxlbmd0aCAtIDFdXG5cbiAgICAgIC8vIDguIFNldCByZXF1ZXN04oCZcyBVUkwgbGlzdCB0byDCqyByZXF1ZXN04oCZcyBVUkwgwrsuXG4gICAgICByZXF1ZXN0LnVybExpc3QgPSBbcmVxdWVzdC51cmxdXG4gICAgfVxuXG4gICAgLy8gMTQuIElmIGluaXRbXCJyZWZlcnJlclwiXSBleGlzdHMsIHRoZW46XG4gICAgaWYgKGluaXQucmVmZXJyZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gMS4gTGV0IHJlZmVycmVyIGJlIGluaXRbXCJyZWZlcnJlclwiXS5cbiAgICAgIGNvbnN0IHJlZmVycmVyID0gaW5pdC5yZWZlcnJlclxuXG4gICAgICAvLyAyLiBJZiByZWZlcnJlciBpcyB0aGUgZW1wdHkgc3RyaW5nLCB0aGVuIHNldCByZXF1ZXN04oCZcyByZWZlcnJlciB0byBcIm5vLXJlZmVycmVyXCIuXG4gICAgICBpZiAocmVmZXJyZXIgPT09ICcnKSB7XG4gICAgICAgIHJlcXVlc3QucmVmZXJyZXIgPSAnbm8tcmVmZXJyZXInXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAxLiBMZXQgcGFyc2VkUmVmZXJyZXIgYmUgdGhlIHJlc3VsdCBvZiBwYXJzaW5nIHJlZmVycmVyIHdpdGhcbiAgICAgICAgLy8gYmFzZVVSTC5cbiAgICAgICAgLy8gMi4gSWYgcGFyc2VkUmVmZXJyZXIgaXMgZmFpbHVyZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgICAgbGV0IHBhcnNlZFJlZmVycmVyXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGFyc2VkUmVmZXJyZXIgPSBuZXcgVVJMKHJlZmVycmVyLCBiYXNlVXJsKVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBSZWZlcnJlciBcIiR7cmVmZXJyZXJ9XCIgaXMgbm90IGEgdmFsaWQgVVJMLmAsIHsgY2F1c2U6IGVyciB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMy4gSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZVxuICAgICAgICAvLyAtIHBhcnNlZFJlZmVycmVy4oCZcyBzY2hlbWUgaXMgXCJhYm91dFwiIGFuZCBwYXRoIGlzIHRoZSBzdHJpbmcgXCJjbGllbnRcIlxuICAgICAgICAvLyAtIHBhcnNlZFJlZmVycmVy4oCZcyBvcmlnaW4gaXMgbm90IHNhbWUgb3JpZ2luIHdpdGggb3JpZ2luXG4gICAgICAgIC8vIHRoZW4gc2V0IHJlcXVlc3TigJlzIHJlZmVycmVyIHRvIFwiY2xpZW50XCIuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAocGFyc2VkUmVmZXJyZXIucHJvdG9jb2wgPT09ICdhYm91dDonICYmIHBhcnNlZFJlZmVycmVyLmhvc3RuYW1lID09PSAnY2xpZW50JykgfHxcbiAgICAgICAgICAob3JpZ2luICYmICFzYW1lT3JpZ2luKHBhcnNlZFJlZmVycmVyLCBlbnZpcm9ubWVudFNldHRpbmdzT2JqZWN0LnNldHRpbmdzT2JqZWN0LmJhc2VVcmwpKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXF1ZXN0LnJlZmVycmVyID0gJ2NsaWVudCdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyA0LiBPdGhlcndpc2UsIHNldCByZXF1ZXN04oCZcyByZWZlcnJlciB0byBwYXJzZWRSZWZlcnJlci5cbiAgICAgICAgICByZXF1ZXN0LnJlZmVycmVyID0gcGFyc2VkUmVmZXJyZXJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDE1LiBJZiBpbml0W1wicmVmZXJyZXJQb2xpY3lcIl0gZXhpc3RzLCB0aGVuIHNldCByZXF1ZXN04oCZcyByZWZlcnJlciBwb2xpY3lcbiAgICAvLyB0byBpdC5cbiAgICBpZiAoaW5pdC5yZWZlcnJlclBvbGljeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXF1ZXN0LnJlZmVycmVyUG9saWN5ID0gaW5pdC5yZWZlcnJlclBvbGljeVxuICAgIH1cblxuICAgIC8vIDE2LiBMZXQgbW9kZSBiZSBpbml0W1wibW9kZVwiXSBpZiBpdCBleGlzdHMsIGFuZCBmYWxsYmFja01vZGUgb3RoZXJ3aXNlLlxuICAgIGxldCBtb2RlXG4gICAgaWYgKGluaXQubW9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb2RlID0gaW5pdC5tb2RlXG4gICAgfSBlbHNlIHtcbiAgICAgIG1vZGUgPSBmYWxsYmFja01vZGVcbiAgICB9XG5cbiAgICAvLyAxNy4gSWYgbW9kZSBpcyBcIm5hdmlnYXRlXCIsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKG1vZGUgPT09ICduYXZpZ2F0ZScpIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgaGVhZGVyOiAnUmVxdWVzdCBjb25zdHJ1Y3RvcicsXG4gICAgICAgIG1lc3NhZ2U6ICdpbnZhbGlkIHJlcXVlc3QgbW9kZSBuYXZpZ2F0ZS4nXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDE4LiBJZiBtb2RlIGlzIG5vbi1udWxsLCBzZXQgcmVxdWVzdOKAmXMgbW9kZSB0byBtb2RlLlxuICAgIGlmIChtb2RlICE9IG51bGwpIHtcbiAgICAgIHJlcXVlc3QubW9kZSA9IG1vZGVcbiAgICB9XG5cbiAgICAvLyAxOS4gSWYgaW5pdFtcImNyZWRlbnRpYWxzXCJdIGV4aXN0cywgdGhlbiBzZXQgcmVxdWVzdOKAmXMgY3JlZGVudGlhbHMgbW9kZVxuICAgIC8vIHRvIGl0LlxuICAgIGlmIChpbml0LmNyZWRlbnRpYWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlcXVlc3QuY3JlZGVudGlhbHMgPSBpbml0LmNyZWRlbnRpYWxzXG4gICAgfVxuXG4gICAgLy8gMTguIElmIGluaXRbXCJjYWNoZVwiXSBleGlzdHMsIHRoZW4gc2V0IHJlcXVlc3TigJlzIGNhY2hlIG1vZGUgdG8gaXQuXG4gICAgaWYgKGluaXQuY2FjaGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVxdWVzdC5jYWNoZSA9IGluaXQuY2FjaGVcbiAgICB9XG5cbiAgICAvLyAyMS4gSWYgcmVxdWVzdOKAmXMgY2FjaGUgbW9kZSBpcyBcIm9ubHktaWYtY2FjaGVkXCIgYW5kIHJlcXVlc3TigJlzIG1vZGUgaXNcbiAgICAvLyBub3QgXCJzYW1lLW9yaWdpblwiLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmIChyZXF1ZXN0LmNhY2hlID09PSAnb25seS1pZi1jYWNoZWQnICYmIHJlcXVlc3QubW9kZSAhPT0gJ3NhbWUtb3JpZ2luJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgXCInb25seS1pZi1jYWNoZWQnIGNhbiBiZSBzZXQgb25seSB3aXRoICdzYW1lLW9yaWdpbicgbW9kZVwiXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gMjIuIElmIGluaXRbXCJyZWRpcmVjdFwiXSBleGlzdHMsIHRoZW4gc2V0IHJlcXVlc3TigJlzIHJlZGlyZWN0IG1vZGUgdG8gaXQuXG4gICAgaWYgKGluaXQucmVkaXJlY3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVxdWVzdC5yZWRpcmVjdCA9IGluaXQucmVkaXJlY3RcbiAgICB9XG5cbiAgICAvLyAyMy4gSWYgaW5pdFtcImludGVncml0eVwiXSBleGlzdHMsIHRoZW4gc2V0IHJlcXVlc3TigJlzIGludGVncml0eSBtZXRhZGF0YSB0byBpdC5cbiAgICBpZiAoaW5pdC5pbnRlZ3JpdHkgIT0gbnVsbCkge1xuICAgICAgcmVxdWVzdC5pbnRlZ3JpdHkgPSBTdHJpbmcoaW5pdC5pbnRlZ3JpdHkpXG4gICAgfVxuXG4gICAgLy8gMjQuIElmIGluaXRbXCJrZWVwYWxpdmVcIl0gZXhpc3RzLCB0aGVuIHNldCByZXF1ZXN04oCZcyBrZWVwYWxpdmUgdG8gaXQuXG4gICAgaWYgKGluaXQua2VlcGFsaXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlcXVlc3Qua2VlcGFsaXZlID0gQm9vbGVhbihpbml0LmtlZXBhbGl2ZSlcbiAgICB9XG5cbiAgICAvLyAyNS4gSWYgaW5pdFtcIm1ldGhvZFwiXSBleGlzdHMsIHRoZW46XG4gICAgaWYgKGluaXQubWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIDEuIExldCBtZXRob2QgYmUgaW5pdFtcIm1ldGhvZFwiXS5cbiAgICAgIGxldCBtZXRob2QgPSBpbml0Lm1ldGhvZFxuXG4gICAgICBjb25zdCBtYXlCZU5vcm1hbGl6ZWQgPSBub3JtYWxpemVkTWV0aG9kUmVjb3Jkc1ttZXRob2RdXG5cbiAgICAgIGlmIChtYXlCZU5vcm1hbGl6ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBOb3RlOiBCeXBhc3MgdmFsaWRhdGlvbiBERUxFVEUsIEdFVCwgSEVBRCwgT1BUSU9OUywgUE9TVCwgUFVULCBQQVRDSCBhbmQgdGhlc2UgbG93ZXJjYXNlIG9uZXNcbiAgICAgICAgcmVxdWVzdC5tZXRob2QgPSBtYXlCZU5vcm1hbGl6ZWRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIDIuIElmIG1ldGhvZCBpcyBub3QgYSBtZXRob2Qgb3IgbWV0aG9kIGlzIGEgZm9yYmlkZGVuIG1ldGhvZCwgdGhlblxuICAgICAgICAvLyB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgICAgaWYgKCFpc1ZhbGlkSFRUUFRva2VuKG1ldGhvZCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAnJHttZXRob2R9JyBpcyBub3QgYSB2YWxpZCBIVFRQIG1ldGhvZC5gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdXBwZXJDYXNlID0gbWV0aG9kLnRvVXBwZXJDYXNlKClcblxuICAgICAgICBpZiAoZm9yYmlkZGVuTWV0aG9kc1NldC5oYXModXBwZXJDYXNlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCcke21ldGhvZH0nIEhUVFAgbWV0aG9kIGlzIHVuc3VwcG9ydGVkLmApXG4gICAgICAgIH1cblxuICAgICAgICAvLyAzLiBOb3JtYWxpemUgbWV0aG9kLlxuICAgICAgICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1tZXRob2Qtbm9ybWFsaXplXG4gICAgICAgIC8vIE5vdGU6IG11c3QgYmUgaW4gdXBwZXJjYXNlXG4gICAgICAgIG1ldGhvZCA9IG5vcm1hbGl6ZWRNZXRob2RSZWNvcmRzQmFzZVt1cHBlckNhc2VdID8/IG1ldGhvZFxuXG4gICAgICAgIC8vIDQuIFNldCByZXF1ZXN04oCZcyBtZXRob2QgdG8gbWV0aG9kLlxuICAgICAgICByZXF1ZXN0Lm1ldGhvZCA9IG1ldGhvZFxuICAgICAgfVxuXG4gICAgICBpZiAoIXBhdGNoTWV0aG9kV2FybmluZyAmJiByZXF1ZXN0Lm1ldGhvZCA9PT0gJ3BhdGNoJykge1xuICAgICAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKCdVc2luZyBgcGF0Y2hgIGlzIGhpZ2hseSBsaWtlbHkgdG8gcmVzdWx0IGluIGEgYDQwNSBNZXRob2QgTm90IEFsbG93ZWRgLiBgUEFUQ0hgIGlzIG11Y2ggbW9yZSBsaWtlbHkgdG8gc3VjY2VlZC4nLCB7XG4gICAgICAgICAgY29kZTogJ1VORElDSS1GRVRDSC1wYXRjaCdcbiAgICAgICAgfSlcblxuICAgICAgICBwYXRjaE1ldGhvZFdhcm5pbmcgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMjYuIElmIGluaXRbXCJzaWduYWxcIl0gZXhpc3RzLCB0aGVuIHNldCBzaWduYWwgdG8gaXQuXG4gICAgaWYgKGluaXQuc2lnbmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNpZ25hbCA9IGluaXQuc2lnbmFsXG4gICAgfVxuXG4gICAgLy8gMjcuIFNldCB0aGlz4oCZcyByZXF1ZXN0IHRvIHJlcXVlc3QuXG4gICAgdGhpc1trU3RhdGVdID0gcmVxdWVzdFxuXG4gICAgLy8gMjguIFNldCB0aGlz4oCZcyBzaWduYWwgdG8gYSBuZXcgQWJvcnRTaWduYWwgb2JqZWN0IHdpdGggdGhpc+KAmXMgcmVsZXZhbnRcbiAgICAvLyBSZWFsbS5cbiAgICAvLyBUT0RPOiBjb3VsZCB0aGlzIGJlIHNpbXBsaWZpZWQgd2l0aCBBYm9ydFNpZ25hbC5hbnlcbiAgICAvLyAoaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tYWJvcnRzaWduYWwtYW55KVxuICAgIGNvbnN0IGFjID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgdGhpc1trU2lnbmFsXSA9IGFjLnNpZ25hbFxuXG4gICAgLy8gMjkuIElmIHNpZ25hbCBpcyBub3QgbnVsbCwgdGhlbiBtYWtlIHRoaXPigJlzIHNpZ25hbCBmb2xsb3cgc2lnbmFsLlxuICAgIGlmIChzaWduYWwgIT0gbnVsbCkge1xuICAgICAgaWYgKFxuICAgICAgICAhc2lnbmFsIHx8XG4gICAgICAgIHR5cGVvZiBzaWduYWwuYWJvcnRlZCAhPT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgIHR5cGVvZiBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJ1xuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgXCJGYWlsZWQgdG8gY29uc3RydWN0ICdSZXF1ZXN0JzogbWVtYmVyIHNpZ25hbCBpcyBub3Qgb2YgdHlwZSBBYm9ydFNpZ25hbC5cIlxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICBhYy5hYm9ydChzaWduYWwucmVhc29uKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gS2VlcCBhIHN0cm9uZyByZWYgdG8gYWMgd2hpbGUgcmVxdWVzdCBvYmplY3RcbiAgICAgICAgLy8gaXMgYWxpdmUuIFRoaXMgaXMgbmVlZGVkIHRvIHByZXZlbnQgQWJvcnRDb250cm9sbGVyXG4gICAgICAgIC8vIGZyb20gYmVpbmcgcHJlbWF0dXJlbHkgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gICAgICAgIC8vIFNlZSwgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzE5MjYuXG4gICAgICAgIHRoaXNba0Fib3J0Q29udHJvbGxlcl0gPSBhY1xuXG4gICAgICAgIGNvbnN0IGFjUmVmID0gbmV3IFdlYWtSZWYoYWMpXG4gICAgICAgIGNvbnN0IGFib3J0ID0gYnVpbGRBYm9ydChhY1JlZilcblxuICAgICAgICAvLyBUaGlyZC1wYXJ0eSBBYm9ydENvbnRyb2xsZXJzIG1heSBub3Qgd29yayB3aXRoIHRoZXNlLlxuICAgICAgICAvLyBTZWUsIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL3B1bGwvMTkxMCNpc3N1ZWNvbW1lbnQtMTQ2NDQ5NTYxOS5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBJZiB0aGUgbWF4IGFtb3VudCBvZiBsaXN0ZW5lcnMgaXMgZXF1YWwgdG8gdGhlIGRlZmF1bHQsIGluY3JlYXNlIGl0XG4gICAgICAgICAgLy8gVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBpbiBub2RlID49IHYxOS45LjBcbiAgICAgICAgICBpZiAodHlwZW9mIGdldE1heExpc3RlbmVycyA9PT0gJ2Z1bmN0aW9uJyAmJiBnZXRNYXhMaXN0ZW5lcnMoc2lnbmFsKSA9PT0gZGVmYXVsdE1heExpc3RlbmVycykge1xuICAgICAgICAgICAgc2V0TWF4TGlzdGVuZXJzKDE1MDAsIHNpZ25hbClcbiAgICAgICAgICB9IGVsc2UgaWYgKGdldEV2ZW50TGlzdGVuZXJzKHNpZ25hbCwgJ2Fib3J0JykubGVuZ3RoID49IGRlZmF1bHRNYXhMaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIHNldE1heExpc3RlbmVycygxNTAwLCBzaWduYWwpXG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHt9XG5cbiAgICAgICAgdXRpbC5hZGRBYm9ydExpc3RlbmVyKHNpZ25hbCwgYWJvcnQpXG4gICAgICAgIC8vIFRoZSB0aGlyZCBhcmd1bWVudCBtdXN0IGJlIGEgcmVnaXN0cnkga2V5IHRvIGJlIHVucmVnaXN0ZXJlZC5cbiAgICAgICAgLy8gV2l0aG91dCBpdCwgeW91IGNhbm5vdCB1bnJlZ2lzdGVyLlxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9GaW5hbGl6YXRpb25SZWdpc3RyeVxuICAgICAgICAvLyBhYm9ydCBpcyB1c2VkIGFzIHRoZSB1bnJlZ2lzdGVyIGtleS4gKGJlY2F1c2UgaXQgaXMgdW5pcXVlKVxuICAgICAgICByZXF1ZXN0RmluYWxpemVyLnJlZ2lzdGVyKGFjLCB7IHNpZ25hbCwgYWJvcnQgfSwgYWJvcnQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMzAuIFNldCB0aGlz4oCZcyBoZWFkZXJzIHRvIGEgbmV3IEhlYWRlcnMgb2JqZWN0IHdpdGggdGhpc+KAmXMgcmVsZXZhbnRcbiAgICAvLyBSZWFsbSwgd2hvc2UgaGVhZGVyIGxpc3QgaXMgcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgYW5kIGd1YXJkIGlzXG4gICAgLy8gXCJyZXF1ZXN0XCIuXG4gICAgdGhpc1trSGVhZGVyc10gPSBuZXcgSGVhZGVycyhrQ29uc3RydWN0KVxuICAgIHNldEhlYWRlcnNMaXN0KHRoaXNba0hlYWRlcnNdLCByZXF1ZXN0LmhlYWRlcnNMaXN0KVxuICAgIHNldEhlYWRlcnNHdWFyZCh0aGlzW2tIZWFkZXJzXSwgJ3JlcXVlc3QnKVxuXG4gICAgLy8gMzEuIElmIHRoaXPigJlzIHJlcXVlc3TigJlzIG1vZGUgaXMgXCJuby1jb3JzXCIsIHRoZW46XG4gICAgaWYgKG1vZGUgPT09ICduby1jb3JzJykge1xuICAgICAgLy8gMS4gSWYgdGhpc+KAmXMgcmVxdWVzdOKAmXMgbWV0aG9kIGlzIG5vdCBhIENPUlMtc2FmZWxpc3RlZCBtZXRob2QsXG4gICAgICAvLyB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgICAgaWYgKCFjb3JzU2FmZUxpc3RlZE1ldGhvZHNTZXQuaGFzKHJlcXVlc3QubWV0aG9kKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIGAnJHtyZXF1ZXN0Lm1ldGhvZH0gaXMgdW5zdXBwb3J0ZWQgaW4gbm8tY29ycyBtb2RlLmBcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyAyLiBTZXQgdGhpc+KAmXMgaGVhZGVyc+KAmXMgZ3VhcmQgdG8gXCJyZXF1ZXN0LW5vLWNvcnNcIi5cbiAgICAgIHNldEhlYWRlcnNHdWFyZCh0aGlzW2tIZWFkZXJzXSwgJ3JlcXVlc3Qtbm8tY29ycycpXG4gICAgfVxuXG4gICAgLy8gMzIuIElmIGluaXQgaXMgbm90IGVtcHR5LCB0aGVuOlxuICAgIGlmIChpbml0SGFzS2V5KSB7XG4gICAgICAvKiogQHR5cGUge0hlYWRlcnNMaXN0fSAqL1xuICAgICAgY29uc3QgaGVhZGVyc0xpc3QgPSBnZXRIZWFkZXJzTGlzdCh0aGlzW2tIZWFkZXJzXSlcbiAgICAgIC8vIDEuIExldCBoZWFkZXJzIGJlIGEgY29weSBvZiB0aGlz4oCZcyBoZWFkZXJzIGFuZCBpdHMgYXNzb2NpYXRlZCBoZWFkZXJcbiAgICAgIC8vIGxpc3QuXG4gICAgICAvLyAyLiBJZiBpbml0W1wiaGVhZGVyc1wiXSBleGlzdHMsIHRoZW4gc2V0IGhlYWRlcnMgdG8gaW5pdFtcImhlYWRlcnNcIl0uXG4gICAgICBjb25zdCBoZWFkZXJzID0gaW5pdC5oZWFkZXJzICE9PSB1bmRlZmluZWQgPyBpbml0LmhlYWRlcnMgOiBuZXcgSGVhZGVyc0xpc3QoaGVhZGVyc0xpc3QpXG5cbiAgICAgIC8vIDMuIEVtcHR5IHRoaXPigJlzIGhlYWRlcnPigJlzIGhlYWRlciBsaXN0LlxuICAgICAgaGVhZGVyc0xpc3QuY2xlYXIoKVxuXG4gICAgICAvLyA0LiBJZiBoZWFkZXJzIGlzIGEgSGVhZGVycyBvYmplY3QsIHRoZW4gZm9yIGVhY2ggaGVhZGVyIGluIGl0cyBoZWFkZXJcbiAgICAgIC8vIGxpc3QsIGFwcGVuZCBoZWFkZXLigJlzIG5hbWUvaGVhZGVy4oCZcyB2YWx1ZSB0byB0aGlz4oCZcyBoZWFkZXJzLlxuICAgICAgaWYgKGhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzTGlzdCkge1xuICAgICAgICBmb3IgKGNvbnN0IHsgbmFtZSwgdmFsdWUgfSBvZiBoZWFkZXJzLnJhd1ZhbHVlcygpKSB7XG4gICAgICAgICAgaGVhZGVyc0xpc3QuYXBwZW5kKG5hbWUsIHZhbHVlLCBmYWxzZSlcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3RlOiBDb3B5IHRoZSBgc2V0LWNvb2tpZWAgbWV0YS1kYXRhLlxuICAgICAgICBoZWFkZXJzTGlzdC5jb29raWVzID0gaGVhZGVycy5jb29raWVzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyA1LiBPdGhlcndpc2UsIGZpbGwgdGhpc+KAmXMgaGVhZGVycyB3aXRoIGhlYWRlcnMuXG4gICAgICAgIGZpbGxIZWFkZXJzKHRoaXNba0hlYWRlcnNdLCBoZWFkZXJzKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDMzLiBMZXQgaW5wdXRCb2R5IGJlIGlucHV04oCZcyByZXF1ZXN04oCZcyBib2R5IGlmIGlucHV0IGlzIGEgUmVxdWVzdFxuICAgIC8vIG9iamVjdDsgb3RoZXJ3aXNlIG51bGwuXG4gICAgY29uc3QgaW5wdXRCb2R5ID0gaW5wdXQgaW5zdGFuY2VvZiBSZXF1ZXN0ID8gaW5wdXRba1N0YXRlXS5ib2R5IDogbnVsbFxuXG4gICAgLy8gMzQuIElmIGVpdGhlciBpbml0W1wiYm9keVwiXSBleGlzdHMgYW5kIGlzIG5vbi1udWxsIG9yIGlucHV0Qm9keSBpc1xuICAgIC8vIG5vbi1udWxsLCBhbmQgcmVxdWVzdOKAmXMgbWV0aG9kIGlzIGBHRVRgIG9yIGBIRUFEYCwgdGhlbiB0aHJvdyBhXG4gICAgLy8gVHlwZUVycm9yLlxuICAgIGlmIChcbiAgICAgIChpbml0LmJvZHkgIT0gbnVsbCB8fCBpbnB1dEJvZHkgIT0gbnVsbCkgJiZcbiAgICAgIChyZXF1ZXN0Lm1ldGhvZCA9PT0gJ0dFVCcgfHwgcmVxdWVzdC5tZXRob2QgPT09ICdIRUFEJylcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlcXVlc3Qgd2l0aCBHRVQvSEVBRCBtZXRob2QgY2Fubm90IGhhdmUgYm9keS4nKVxuICAgIH1cblxuICAgIC8vIDM1LiBMZXQgaW5pdEJvZHkgYmUgbnVsbC5cbiAgICBsZXQgaW5pdEJvZHkgPSBudWxsXG5cbiAgICAvLyAzNi4gSWYgaW5pdFtcImJvZHlcIl0gZXhpc3RzIGFuZCBpcyBub24tbnVsbCwgdGhlbjpcbiAgICBpZiAoaW5pdC5ib2R5ICE9IG51bGwpIHtcbiAgICAgIC8vIDEuIExldCBDb250ZW50LVR5cGUgYmUgbnVsbC5cbiAgICAgIC8vIDIuIFNldCBpbml0Qm9keSBhbmQgQ29udGVudC1UeXBlIHRvIHRoZSByZXN1bHQgb2YgZXh0cmFjdGluZ1xuICAgICAgLy8gaW5pdFtcImJvZHlcIl0sIHdpdGgga2VlcGFsaXZlIHNldCB0byByZXF1ZXN04oCZcyBrZWVwYWxpdmUuXG4gICAgICBjb25zdCBbZXh0cmFjdGVkQm9keSwgY29udGVudFR5cGVdID0gZXh0cmFjdEJvZHkoXG4gICAgICAgIGluaXQuYm9keSxcbiAgICAgICAgcmVxdWVzdC5rZWVwYWxpdmVcbiAgICAgIClcbiAgICAgIGluaXRCb2R5ID0gZXh0cmFjdGVkQm9keVxuXG4gICAgICAvLyAzLCBJZiBDb250ZW50LVR5cGUgaXMgbm9uLW51bGwgYW5kIHRoaXPigJlzIGhlYWRlcnPigJlzIGhlYWRlciBsaXN0IGRvZXNcbiAgICAgIC8vIG5vdCBjb250YWluIGBDb250ZW50LVR5cGVgLCB0aGVuIGFwcGVuZCBgQ29udGVudC1UeXBlYC9Db250ZW50LVR5cGUgdG9cbiAgICAgIC8vIHRoaXPigJlzIGhlYWRlcnMuXG4gICAgICBpZiAoY29udGVudFR5cGUgJiYgIWdldEhlYWRlcnNMaXN0KHRoaXNba0hlYWRlcnNdKS5jb250YWlucygnY29udGVudC10eXBlJywgdHJ1ZSkpIHtcbiAgICAgICAgdGhpc1trSGVhZGVyc10uYXBwZW5kKCdjb250ZW50LXR5cGUnLCBjb250ZW50VHlwZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAzNy4gTGV0IGlucHV0T3JJbml0Qm9keSBiZSBpbml0Qm9keSBpZiBpdCBpcyBub24tbnVsbDsgb3RoZXJ3aXNlXG4gICAgLy8gaW5wdXRCb2R5LlxuICAgIGNvbnN0IGlucHV0T3JJbml0Qm9keSA9IGluaXRCb2R5ID8/IGlucHV0Qm9keVxuXG4gICAgLy8gMzguIElmIGlucHV0T3JJbml0Qm9keSBpcyBub24tbnVsbCBhbmQgaW5wdXRPckluaXRCb2R54oCZcyBzb3VyY2UgaXNcbiAgICAvLyBudWxsLCB0aGVuOlxuICAgIGlmIChpbnB1dE9ySW5pdEJvZHkgIT0gbnVsbCAmJiBpbnB1dE9ySW5pdEJvZHkuc291cmNlID09IG51bGwpIHtcbiAgICAgIC8vIDEuIElmIGluaXRCb2R5IGlzIG5vbi1udWxsIGFuZCBpbml0W1wiZHVwbGV4XCJdIGRvZXMgbm90IGV4aXN0LFxuICAgICAgLy8gICAgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgIGlmIChpbml0Qm9keSAhPSBudWxsICYmIGluaXQuZHVwbGV4ID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVxdWVzdEluaXQ6IGR1cGxleCBvcHRpb24gaXMgcmVxdWlyZWQgd2hlbiBzZW5kaW5nIGEgYm9keS4nKVxuICAgICAgfVxuXG4gICAgICAvLyAyLiBJZiB0aGlz4oCZcyByZXF1ZXN04oCZcyBtb2RlIGlzIG5laXRoZXIgXCJzYW1lLW9yaWdpblwiIG5vciBcImNvcnNcIixcbiAgICAgIC8vIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgICBpZiAocmVxdWVzdC5tb2RlICE9PSAnc2FtZS1vcmlnaW4nICYmIHJlcXVlc3QubW9kZSAhPT0gJ2NvcnMnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgJ0lmIHJlcXVlc3QgaXMgbWFkZSBmcm9tIFJlYWRhYmxlU3RyZWFtLCBtb2RlIHNob3VsZCBiZSBcInNhbWUtb3JpZ2luXCIgb3IgXCJjb3JzXCInXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gMy4gU2V0IHRoaXPigJlzIHJlcXVlc3TigJlzIHVzZS1DT1JTLXByZWZsaWdodCBmbGFnLlxuICAgICAgcmVxdWVzdC51c2VDT1JTUHJlZmxpZ2h0RmxhZyA9IHRydWVcbiAgICB9XG5cbiAgICAvLyAzOS4gTGV0IGZpbmFsQm9keSBiZSBpbnB1dE9ySW5pdEJvZHkuXG4gICAgbGV0IGZpbmFsQm9keSA9IGlucHV0T3JJbml0Qm9keVxuXG4gICAgLy8gNDAuIElmIGluaXRCb2R5IGlzIG51bGwgYW5kIGlucHV0Qm9keSBpcyBub24tbnVsbCwgdGhlbjpcbiAgICBpZiAoaW5pdEJvZHkgPT0gbnVsbCAmJiBpbnB1dEJvZHkgIT0gbnVsbCkge1xuICAgICAgLy8gMS4gSWYgaW5wdXQgaXMgdW51c2FibGUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgICBpZiAoYm9keVVudXNhYmxlKGlucHV0KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICdDYW5ub3QgY29uc3RydWN0IGEgUmVxdWVzdCB3aXRoIGEgUmVxdWVzdCBvYmplY3QgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHVzZWQuJ1xuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIFNldCBmaW5hbEJvZHkgdG8gdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhIHByb3h5IGZvciBpbnB1dEJvZHkuXG4gICAgICAvLyBodHRwczovL3N0cmVhbXMuc3BlYy53aGF0d2cub3JnLyNyZWFkYWJsZXN0cmVhbS1jcmVhdGUtYS1wcm94eVxuICAgICAgY29uc3QgaWRlbnRpdHlUcmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtU3RyZWFtKClcbiAgICAgIGlucHV0Qm9keS5zdHJlYW0ucGlwZVRocm91Z2goaWRlbnRpdHlUcmFuc2Zvcm0pXG4gICAgICBmaW5hbEJvZHkgPSB7XG4gICAgICAgIHNvdXJjZTogaW5wdXRCb2R5LnNvdXJjZSxcbiAgICAgICAgbGVuZ3RoOiBpbnB1dEJvZHkubGVuZ3RoLFxuICAgICAgICBzdHJlYW06IGlkZW50aXR5VHJhbnNmb3JtLnJlYWRhYmxlXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNDEuIFNldCB0aGlz4oCZcyByZXF1ZXN04oCZcyBib2R5IHRvIGZpbmFsQm9keS5cbiAgICB0aGlzW2tTdGF0ZV0uYm9keSA9IGZpbmFsQm9keVxuICB9XG5cbiAgLy8gUmV0dXJucyByZXF1ZXN04oCZcyBIVFRQIG1ldGhvZCwgd2hpY2ggaXMgXCJHRVRcIiBieSBkZWZhdWx0LlxuICBnZXQgbWV0aG9kICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIG1ldGhvZCBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlz4oCZcyByZXF1ZXN04oCZcyBtZXRob2QuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5tZXRob2RcbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIFVSTCBvZiByZXF1ZXN0IGFzIGEgc3RyaW5nLlxuICBnZXQgdXJsICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIHVybCBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlz4oCZcyByZXF1ZXN04oCZcyBVUkwsIHNlcmlhbGl6ZWQuXG4gICAgcmV0dXJuIFVSTFNlcmlhbGl6ZXIodGhpc1trU3RhdGVdLnVybClcbiAgfVxuXG4gIC8vIFJldHVybnMgYSBIZWFkZXJzIG9iamVjdCBjb25zaXN0aW5nIG9mIHRoZSBoZWFkZXJzIGFzc29jaWF0ZWQgd2l0aCByZXF1ZXN0LlxuICAvLyBOb3RlIHRoYXQgaGVhZGVycyBhZGRlZCBpbiB0aGUgbmV0d29yayBsYXllciBieSB0aGUgdXNlciBhZ2VudCB3aWxsIG5vdFxuICAvLyBiZSBhY2NvdW50ZWQgZm9yIGluIHRoaXMgb2JqZWN0LCBlLmcuLCB0aGUgXCJIb3N0XCIgaGVhZGVyLlxuICBnZXQgaGVhZGVycyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIC8vIFRoZSBoZWFkZXJzIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIGhlYWRlcnMuXG4gICAgcmV0dXJuIHRoaXNba0hlYWRlcnNdXG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSBraW5kIG9mIHJlc291cmNlIHJlcXVlc3RlZCBieSByZXF1ZXN0LCBlLmcuLCBcImRvY3VtZW50XCJcbiAgLy8gb3IgXCJzY3JpcHRcIi5cbiAgZ2V0IGRlc3RpbmF0aW9uICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIGRlc3RpbmF0aW9uIGdldHRlciBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHJlcXVlc3TigJlzIGRlc3RpbmF0aW9uLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uZGVzdGluYXRpb25cbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIHJlZmVycmVyIG9mIHJlcXVlc3QuIEl0cyB2YWx1ZSBjYW4gYmUgYSBzYW1lLW9yaWdpbiBVUkwgaWZcbiAgLy8gZXhwbGljaXRseSBzZXQgaW4gaW5pdCwgdGhlIGVtcHR5IHN0cmluZyB0byBpbmRpY2F0ZSBubyByZWZlcnJlciwgYW5kXG4gIC8vIFwiYWJvdXQ6Y2xpZW50XCIgd2hlbiBkZWZhdWx0aW5nIHRvIHRoZSBnbG9iYWzigJlzIGRlZmF1bHQuIFRoaXMgaXMgdXNlZFxuICAvLyBkdXJpbmcgZmV0Y2hpbmcgdG8gZGV0ZXJtaW5lIHRoZSB2YWx1ZSBvZiB0aGUgYFJlZmVyZXJgIGhlYWRlciBvZiB0aGVcbiAgLy8gcmVxdWVzdCBiZWluZyBtYWRlLlxuICBnZXQgcmVmZXJyZXIgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyAxLiBJZiB0aGlz4oCZcyByZXF1ZXN04oCZcyByZWZlcnJlciBpcyBcIm5vLXJlZmVycmVyXCIsIHRoZW4gcmV0dXJuIHRoZVxuICAgIC8vIGVtcHR5IHN0cmluZy5cbiAgICBpZiAodGhpc1trU3RhdGVdLnJlZmVycmVyID09PSAnbm8tcmVmZXJyZXInKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG5cbiAgICAvLyAyLiBJZiB0aGlz4oCZcyByZXF1ZXN04oCZcyByZWZlcnJlciBpcyBcImNsaWVudFwiLCB0aGVuIHJldHVyblxuICAgIC8vIFwiYWJvdXQ6Y2xpZW50XCIuXG4gICAgaWYgKHRoaXNba1N0YXRlXS5yZWZlcnJlciA9PT0gJ2NsaWVudCcpIHtcbiAgICAgIHJldHVybiAnYWJvdXQ6Y2xpZW50J1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGlz4oCZcyByZXF1ZXN04oCZcyByZWZlcnJlciwgc2VyaWFsaXplZC5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLnJlZmVycmVyLnRvU3RyaW5nKClcbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIHJlZmVycmVyIHBvbGljeSBhc3NvY2lhdGVkIHdpdGggcmVxdWVzdC5cbiAgLy8gVGhpcyBpcyB1c2VkIGR1cmluZyBmZXRjaGluZyB0byBjb21wdXRlIHRoZSB2YWx1ZSBvZiB0aGUgcmVxdWVzdOKAmXNcbiAgLy8gcmVmZXJyZXIuXG4gIGdldCByZWZlcnJlclBvbGljeSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIC8vIFRoZSByZWZlcnJlclBvbGljeSBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlz4oCZcyByZXF1ZXN04oCZcyByZWZlcnJlciBwb2xpY3kuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5yZWZlcnJlclBvbGljeVxuICB9XG5cbiAgLy8gUmV0dXJucyB0aGUgbW9kZSBhc3NvY2lhdGVkIHdpdGggcmVxdWVzdCwgd2hpY2ggaXMgYSBzdHJpbmcgaW5kaWNhdGluZ1xuICAvLyB3aGV0aGVyIHRoZSByZXF1ZXN0IHdpbGwgdXNlIENPUlMsIG9yIHdpbGwgYmUgcmVzdHJpY3RlZCB0byBzYW1lLW9yaWdpblxuICAvLyBVUkxzLlxuICBnZXQgbW9kZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIC8vIFRoZSBtb2RlIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHJlcXVlc3TigJlzIG1vZGUuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5tb2RlXG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSBjcmVkZW50aWFscyBtb2RlIGFzc29jaWF0ZWQgd2l0aCByZXF1ZXN0LFxuICAvLyB3aGljaCBpcyBhIHN0cmluZyBpbmRpY2F0aW5nIHdoZXRoZXIgY3JlZGVudGlhbHMgd2lsbCBiZSBzZW50IHdpdGggdGhlXG4gIC8vIHJlcXVlc3QgYWx3YXlzLCBuZXZlciwgb3Igb25seSB3aGVuIHNlbnQgdG8gYSBzYW1lLW9yaWdpbiBVUkwuXG4gIGdldCBjcmVkZW50aWFscyAoKSB7XG4gICAgLy8gVGhlIGNyZWRlbnRpYWxzIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHJlcXVlc3TigJlzIGNyZWRlbnRpYWxzIG1vZGUuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5jcmVkZW50aWFsc1xuICB9XG5cbiAgLy8gUmV0dXJucyB0aGUgY2FjaGUgbW9kZSBhc3NvY2lhdGVkIHdpdGggcmVxdWVzdCxcbiAgLy8gd2hpY2ggaXMgYSBzdHJpbmcgaW5kaWNhdGluZyBob3cgdGhlIHJlcXVlc3Qgd2lsbFxuICAvLyBpbnRlcmFjdCB3aXRoIHRoZSBicm93c2Vy4oCZcyBjYWNoZSB3aGVuIGZldGNoaW5nLlxuICBnZXQgY2FjaGUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUgY2FjaGUgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVxdWVzdOKAmXMgY2FjaGUgbW9kZS5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmNhY2hlXG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSByZWRpcmVjdCBtb2RlIGFzc29jaWF0ZWQgd2l0aCByZXF1ZXN0LFxuICAvLyB3aGljaCBpcyBhIHN0cmluZyBpbmRpY2F0aW5nIGhvdyByZWRpcmVjdHMgZm9yIHRoZVxuICAvLyByZXF1ZXN0IHdpbGwgYmUgaGFuZGxlZCBkdXJpbmcgZmV0Y2hpbmcuIEEgcmVxdWVzdFxuICAvLyB3aWxsIGZvbGxvdyByZWRpcmVjdHMgYnkgZGVmYXVsdC5cbiAgZ2V0IHJlZGlyZWN0ICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIHJlZGlyZWN0IGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHJlcXVlc3TigJlzIHJlZGlyZWN0IG1vZGUuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5yZWRpcmVjdFxuICB9XG5cbiAgLy8gUmV0dXJucyByZXF1ZXN04oCZcyBzdWJyZXNvdXJjZSBpbnRlZ3JpdHkgbWV0YWRhdGEsIHdoaWNoIGlzIGFcbiAgLy8gY3J5cHRvZ3JhcGhpYyBoYXNoIG9mIHRoZSByZXNvdXJjZSBiZWluZyBmZXRjaGVkLiBJdHMgdmFsdWVcbiAgLy8gY29uc2lzdHMgb2YgbXVsdGlwbGUgaGFzaGVzIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLiBbU1JJXVxuICBnZXQgaW50ZWdyaXR5ICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIGludGVncml0eSBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlz4oCZcyByZXF1ZXN04oCZcyBpbnRlZ3JpdHlcbiAgICAvLyBtZXRhZGF0YS5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmludGVncml0eVxuICB9XG5cbiAgLy8gUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCByZXF1ZXN0IGNhbiBvdXRsaXZlIHRoZVxuICAvLyBnbG9iYWwgaW4gd2hpY2ggaXQgd2FzIGNyZWF0ZWQuXG4gIGdldCBrZWVwYWxpdmUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUga2VlcGFsaXZlIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHJlcXVlc3TigJlzIGtlZXBhbGl2ZS5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmtlZXBhbGl2ZVxuICB9XG5cbiAgLy8gUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCByZXF1ZXN0IGlzIGZvciBhIHJlbG9hZFxuICAvLyBuYXZpZ2F0aW9uLlxuICBnZXQgaXNSZWxvYWROYXZpZ2F0aW9uICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIGlzUmVsb2FkTmF2aWdhdGlvbiBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0cnVlIGlmIHRoaXPigJlzXG4gICAgLy8gcmVxdWVzdOKAmXMgcmVsb2FkLW5hdmlnYXRpb24gZmxhZyBpcyBzZXQ7IG90aGVyd2lzZSBmYWxzZS5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLnJlbG9hZE5hdmlnYXRpb25cbiAgfVxuXG4gIC8vIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgcmVxdWVzdCBpcyBmb3IgYSBoaXN0b3J5XG4gIC8vIG5hdmlnYXRpb24gKGEuay5hLiBiYWNrLWZvcndhcmQgbmF2aWdhdGlvbikuXG4gIGdldCBpc0hpc3RvcnlOYXZpZ2F0aW9uICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIGlzSGlzdG9yeU5hdmlnYXRpb24gZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdHJ1ZSBpZiB0aGlz4oCZcyByZXF1ZXN04oCZc1xuICAgIC8vIGhpc3RvcnktbmF2aWdhdGlvbiBmbGFnIGlzIHNldDsgb3RoZXJ3aXNlIGZhbHNlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uaGlzdG9yeU5hdmlnYXRpb25cbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIHNpZ25hbCBhc3NvY2lhdGVkIHdpdGggcmVxdWVzdCwgd2hpY2ggaXMgYW4gQWJvcnRTaWduYWxcbiAgLy8gb2JqZWN0IGluZGljYXRpbmcgd2hldGhlciBvciBub3QgcmVxdWVzdCBoYXMgYmVlbiBhYm9ydGVkLCBhbmQgaXRzXG4gIC8vIGFib3J0IGV2ZW50IGhhbmRsZXIuXG4gIGdldCBzaWduYWwgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUgc2lnbmFsIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHNpZ25hbC5cbiAgICByZXR1cm4gdGhpc1trU2lnbmFsXVxuICB9XG5cbiAgZ2V0IGJvZHkgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmJvZHkgPyB0aGlzW2tTdGF0ZV0uYm9keS5zdHJlYW0gOiBudWxsXG4gIH1cblxuICBnZXQgYm9keVVzZWQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICByZXR1cm4gISF0aGlzW2tTdGF0ZV0uYm9keSAmJiB1dGlsLmlzRGlzdHVyYmVkKHRoaXNba1N0YXRlXS5ib2R5LnN0cmVhbSlcbiAgfVxuXG4gIGdldCBkdXBsZXggKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICByZXR1cm4gJ2hhbGYnXG4gIH1cblxuICAvLyBSZXR1cm5zIGEgY2xvbmUgb2YgcmVxdWVzdC5cbiAgY2xvbmUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyAxLiBJZiB0aGlzIGlzIHVudXNhYmxlLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmIChib2R5VW51c2FibGUodGhpcykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3VudXNhYmxlJylcbiAgICB9XG5cbiAgICAvLyAyLiBMZXQgY2xvbmVkUmVxdWVzdCBiZSB0aGUgcmVzdWx0IG9mIGNsb25pbmcgdGhpc+KAmXMgcmVxdWVzdC5cbiAgICBjb25zdCBjbG9uZWRSZXF1ZXN0ID0gY2xvbmVSZXF1ZXN0KHRoaXNba1N0YXRlXSlcblxuICAgIC8vIDMuIExldCBjbG9uZWRSZXF1ZXN0T2JqZWN0IGJlIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYSBSZXF1ZXN0IG9iamVjdCxcbiAgICAvLyBnaXZlbiBjbG9uZWRSZXF1ZXN0LCB0aGlz4oCZcyBoZWFkZXJz4oCZcyBndWFyZCwgYW5kIHRoaXPigJlzIHJlbGV2YW50IFJlYWxtLlxuICAgIC8vIDQuIE1ha2UgY2xvbmVkUmVxdWVzdE9iamVjdOKAmXMgc2lnbmFsIGZvbGxvdyB0aGlz4oCZcyBzaWduYWwuXG4gICAgY29uc3QgYWMgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgICBpZiAodGhpcy5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgYWMuYWJvcnQodGhpcy5zaWduYWwucmVhc29uKVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbGlzdCA9IGRlcGVuZGVudENvbnRyb2xsZXJNYXAuZ2V0KHRoaXMuc2lnbmFsKVxuICAgICAgaWYgKGxpc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsaXN0ID0gbmV3IFNldCgpXG4gICAgICAgIGRlcGVuZGVudENvbnRyb2xsZXJNYXAuc2V0KHRoaXMuc2lnbmFsLCBsaXN0KVxuICAgICAgfVxuICAgICAgY29uc3QgYWNSZWYgPSBuZXcgV2Vha1JlZihhYylcbiAgICAgIGxpc3QuYWRkKGFjUmVmKVxuICAgICAgdXRpbC5hZGRBYm9ydExpc3RlbmVyKFxuICAgICAgICBhYy5zaWduYWwsXG4gICAgICAgIGJ1aWxkQWJvcnQoYWNSZWYpXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gNC4gUmV0dXJuIGNsb25lZFJlcXVlc3RPYmplY3QuXG4gICAgcmV0dXJuIGZyb21Jbm5lclJlcXVlc3QoY2xvbmVkUmVxdWVzdCwgYWMuc2lnbmFsLCBnZXRIZWFkZXJzR3VhcmQodGhpc1trSGVhZGVyc10pKVxuICB9XG5cbiAgW25vZGVVdGlsLmluc3BlY3QuY3VzdG9tXSAoZGVwdGgsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5kZXB0aCA9PT0gbnVsbCkge1xuICAgICAgb3B0aW9ucy5kZXB0aCA9IDJcbiAgICB9XG5cbiAgICBvcHRpb25zLmNvbG9ycyA/Pz0gdHJ1ZVxuXG4gICAgY29uc3QgcHJvcGVydGllcyA9IHtcbiAgICAgIG1ldGhvZDogdGhpcy5tZXRob2QsXG4gICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgZGVzdGluYXRpb246IHRoaXMuZGVzdGluYXRpb24sXG4gICAgICByZWZlcnJlcjogdGhpcy5yZWZlcnJlcixcbiAgICAgIHJlZmVycmVyUG9saWN5OiB0aGlzLnJlZmVycmVyUG9saWN5LFxuICAgICAgbW9kZTogdGhpcy5tb2RlLFxuICAgICAgY3JlZGVudGlhbHM6IHRoaXMuY3JlZGVudGlhbHMsXG4gICAgICBjYWNoZTogdGhpcy5jYWNoZSxcbiAgICAgIHJlZGlyZWN0OiB0aGlzLnJlZGlyZWN0LFxuICAgICAgaW50ZWdyaXR5OiB0aGlzLmludGVncml0eSxcbiAgICAgIGtlZXBhbGl2ZTogdGhpcy5rZWVwYWxpdmUsXG4gICAgICBpc1JlbG9hZE5hdmlnYXRpb246IHRoaXMuaXNSZWxvYWROYXZpZ2F0aW9uLFxuICAgICAgaXNIaXN0b3J5TmF2aWdhdGlvbjogdGhpcy5pc0hpc3RvcnlOYXZpZ2F0aW9uLFxuICAgICAgc2lnbmFsOiB0aGlzLnNpZ25hbFxuICAgIH1cblxuICAgIHJldHVybiBgUmVxdWVzdCAke25vZGVVdGlsLmZvcm1hdFdpdGhPcHRpb25zKG9wdGlvbnMsIHByb3BlcnRpZXMpfWBcbiAgfVxufVxuXG5taXhpbkJvZHkoUmVxdWVzdClcblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI3JlcXVlc3RzXG5mdW5jdGlvbiBtYWtlUmVxdWVzdCAoaW5pdCkge1xuICByZXR1cm4ge1xuICAgIG1ldGhvZDogaW5pdC5tZXRob2QgPz8gJ0dFVCcsXG4gICAgbG9jYWxVUkxzT25seTogaW5pdC5sb2NhbFVSTHNPbmx5ID8/IGZhbHNlLFxuICAgIHVuc2FmZVJlcXVlc3Q6IGluaXQudW5zYWZlUmVxdWVzdCA/PyBmYWxzZSxcbiAgICBib2R5OiBpbml0LmJvZHkgPz8gbnVsbCxcbiAgICBjbGllbnQ6IGluaXQuY2xpZW50ID8/IG51bGwsXG4gICAgcmVzZXJ2ZWRDbGllbnQ6IGluaXQucmVzZXJ2ZWRDbGllbnQgPz8gbnVsbCxcbiAgICByZXBsYWNlc0NsaWVudElkOiBpbml0LnJlcGxhY2VzQ2xpZW50SWQgPz8gJycsXG4gICAgd2luZG93OiBpbml0LndpbmRvdyA/PyAnY2xpZW50JyxcbiAgICBrZWVwYWxpdmU6IGluaXQua2VlcGFsaXZlID8/IGZhbHNlLFxuICAgIHNlcnZpY2VXb3JrZXJzOiBpbml0LnNlcnZpY2VXb3JrZXJzID8/ICdhbGwnLFxuICAgIGluaXRpYXRvcjogaW5pdC5pbml0aWF0b3IgPz8gJycsXG4gICAgZGVzdGluYXRpb246IGluaXQuZGVzdGluYXRpb24gPz8gJycsXG4gICAgcHJpb3JpdHk6IGluaXQucHJpb3JpdHkgPz8gbnVsbCxcbiAgICBvcmlnaW46IGluaXQub3JpZ2luID8/ICdjbGllbnQnLFxuICAgIHBvbGljeUNvbnRhaW5lcjogaW5pdC5wb2xpY3lDb250YWluZXIgPz8gJ2NsaWVudCcsXG4gICAgcmVmZXJyZXI6IGluaXQucmVmZXJyZXIgPz8gJ2NsaWVudCcsXG4gICAgcmVmZXJyZXJQb2xpY3k6IGluaXQucmVmZXJyZXJQb2xpY3kgPz8gJycsXG4gICAgbW9kZTogaW5pdC5tb2RlID8/ICduby1jb3JzJyxcbiAgICB1c2VDT1JTUHJlZmxpZ2h0RmxhZzogaW5pdC51c2VDT1JTUHJlZmxpZ2h0RmxhZyA/PyBmYWxzZSxcbiAgICBjcmVkZW50aWFsczogaW5pdC5jcmVkZW50aWFscyA/PyAnc2FtZS1vcmlnaW4nLFxuICAgIHVzZUNyZWRlbnRpYWxzOiBpbml0LnVzZUNyZWRlbnRpYWxzID8/IGZhbHNlLFxuICAgIGNhY2hlOiBpbml0LmNhY2hlID8/ICdkZWZhdWx0JyxcbiAgICByZWRpcmVjdDogaW5pdC5yZWRpcmVjdCA/PyAnZm9sbG93JyxcbiAgICBpbnRlZ3JpdHk6IGluaXQuaW50ZWdyaXR5ID8/ICcnLFxuICAgIGNyeXB0b0dyYXBoaWNzTm9uY2VNZXRhZGF0YTogaW5pdC5jcnlwdG9HcmFwaGljc05vbmNlTWV0YWRhdGEgPz8gJycsXG4gICAgcGFyc2VyTWV0YWRhdGE6IGluaXQucGFyc2VyTWV0YWRhdGEgPz8gJycsXG4gICAgcmVsb2FkTmF2aWdhdGlvbjogaW5pdC5yZWxvYWROYXZpZ2F0aW9uID8/IGZhbHNlLFxuICAgIGhpc3RvcnlOYXZpZ2F0aW9uOiBpbml0Lmhpc3RvcnlOYXZpZ2F0aW9uID8/IGZhbHNlLFxuICAgIHVzZXJBY3RpdmF0aW9uOiBpbml0LnVzZXJBY3RpdmF0aW9uID8/IGZhbHNlLFxuICAgIHRhaW50ZWRPcmlnaW46IGluaXQudGFpbnRlZE9yaWdpbiA/PyBmYWxzZSxcbiAgICByZWRpcmVjdENvdW50OiBpbml0LnJlZGlyZWN0Q291bnQgPz8gMCxcbiAgICByZXNwb25zZVRhaW50aW5nOiBpbml0LnJlc3BvbnNlVGFpbnRpbmcgPz8gJ2Jhc2ljJyxcbiAgICBwcmV2ZW50Tm9DYWNoZUNhY2hlQ29udHJvbEhlYWRlck1vZGlmaWNhdGlvbjogaW5pdC5wcmV2ZW50Tm9DYWNoZUNhY2hlQ29udHJvbEhlYWRlck1vZGlmaWNhdGlvbiA/PyBmYWxzZSxcbiAgICBkb25lOiBpbml0LmRvbmUgPz8gZmFsc2UsXG4gICAgdGltaW5nQWxsb3dGYWlsZWQ6IGluaXQudGltaW5nQWxsb3dGYWlsZWQgPz8gZmFsc2UsXG4gICAgdXJsTGlzdDogaW5pdC51cmxMaXN0LFxuICAgIHVybDogaW5pdC51cmxMaXN0WzBdLFxuICAgIGhlYWRlcnNMaXN0OiBpbml0LmhlYWRlcnNMaXN0XG4gICAgICA/IG5ldyBIZWFkZXJzTGlzdChpbml0LmhlYWRlcnNMaXN0KVxuICAgICAgOiBuZXcgSGVhZGVyc0xpc3QoKVxuICB9XG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LXJlcXVlc3QtY2xvbmVcbmZ1bmN0aW9uIGNsb25lUmVxdWVzdCAocmVxdWVzdCkge1xuICAvLyBUbyBjbG9uZSBhIHJlcXVlc3QgcmVxdWVzdCwgcnVuIHRoZXNlIHN0ZXBzOlxuXG4gIC8vIDEuIExldCBuZXdSZXF1ZXN0IGJlIGEgY29weSBvZiByZXF1ZXN0LCBleGNlcHQgZm9yIGl0cyBib2R5LlxuICBjb25zdCBuZXdSZXF1ZXN0ID0gbWFrZVJlcXVlc3QoeyAuLi5yZXF1ZXN0LCBib2R5OiBudWxsIH0pXG5cbiAgLy8gMi4gSWYgcmVxdWVzdOKAmXMgYm9keSBpcyBub24tbnVsbCwgc2V0IG5ld1JlcXVlc3TigJlzIGJvZHkgdG8gdGhlXG4gIC8vIHJlc3VsdCBvZiBjbG9uaW5nIHJlcXVlc3TigJlzIGJvZHkuXG4gIGlmIChyZXF1ZXN0LmJvZHkgIT0gbnVsbCkge1xuICAgIG5ld1JlcXVlc3QuYm9keSA9IGNsb25lQm9keShuZXdSZXF1ZXN0LCByZXF1ZXN0LmJvZHkpXG4gIH1cblxuICAvLyAzLiBSZXR1cm4gbmV3UmVxdWVzdC5cbiAgcmV0dXJuIG5ld1JlcXVlc3Rcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXF1ZXN0LWNyZWF0ZVxuICogQHBhcmFtIHthbnl9IGlubmVyUmVxdWVzdFxuICogQHBhcmFtIHtBYm9ydFNpZ25hbH0gc2lnbmFsXG4gKiBAcGFyYW0geydyZXF1ZXN0JyB8ICdpbW11dGFibGUnIHwgJ3JlcXVlc3Qtbm8tY29ycycgfCAncmVzcG9uc2UnIHwgJ25vbmUnfSBndWFyZFxuICogQHJldHVybnMge1JlcXVlc3R9XG4gKi9cbmZ1bmN0aW9uIGZyb21Jbm5lclJlcXVlc3QgKGlubmVyUmVxdWVzdCwgc2lnbmFsLCBndWFyZCkge1xuICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3Qoa0NvbnN0cnVjdClcbiAgcmVxdWVzdFtrU3RhdGVdID0gaW5uZXJSZXF1ZXN0XG4gIHJlcXVlc3Rba1NpZ25hbF0gPSBzaWduYWxcbiAgcmVxdWVzdFtrSGVhZGVyc10gPSBuZXcgSGVhZGVycyhrQ29uc3RydWN0KVxuICBzZXRIZWFkZXJzTGlzdChyZXF1ZXN0W2tIZWFkZXJzXSwgaW5uZXJSZXF1ZXN0LmhlYWRlcnNMaXN0KVxuICBzZXRIZWFkZXJzR3VhcmQocmVxdWVzdFtrSGVhZGVyc10sIGd1YXJkKVxuICByZXR1cm4gcmVxdWVzdFxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhSZXF1ZXN0LnByb3RvdHlwZSwge1xuICBtZXRob2Q6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHVybDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgaGVhZGVyczoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgcmVkaXJlY3Q6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGNsb25lOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBzaWduYWw6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGR1cGxleDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgZGVzdGluYXRpb246IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGJvZHk6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGJvZHlVc2VkOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBpc0hpc3RvcnlOYXZpZ2F0aW9uOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBpc1JlbG9hZE5hdmlnYXRpb246IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGtlZXBhbGl2ZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgaW50ZWdyaXR5OiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBjYWNoZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgY3JlZGVudGlhbHM6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGF0dHJpYnV0ZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgcmVmZXJyZXJQb2xpY3k6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHJlZmVycmVyOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBtb2RlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBbU3ltYm9sLnRvU3RyaW5nVGFnXToge1xuICAgIHZhbHVlOiAnUmVxdWVzdCcsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH1cbn0pXG5cbndlYmlkbC5jb252ZXJ0ZXJzLlJlcXVlc3QgPSB3ZWJpZGwuaW50ZXJmYWNlQ29udmVydGVyKFxuICBSZXF1ZXN0XG4pXG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXF1ZXN0aW5mb1xud2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdEluZm8gPSBmdW5jdGlvbiAoViwgcHJlZml4LCBhcmd1bWVudCkge1xuICBpZiAodHlwZW9mIFYgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhWLCBwcmVmaXgsIGFyZ3VtZW50KVxuICB9XG5cbiAgaWYgKFYgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7XG4gICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLlJlcXVlc3QoViwgcHJlZml4LCBhcmd1bWVudClcbiAgfVxuXG4gIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcoViwgcHJlZml4LCBhcmd1bWVudClcbn1cblxud2ViaWRsLmNvbnZlcnRlcnMuQWJvcnRTaWduYWwgPSB3ZWJpZGwuaW50ZXJmYWNlQ29udmVydGVyKFxuICBBYm9ydFNpZ25hbFxuKVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jcmVxdWVzdGluaXRcbndlYmlkbC5jb252ZXJ0ZXJzLlJlcXVlc3RJbml0ID0gd2ViaWRsLmRpY3Rpb25hcnlDb252ZXJ0ZXIoW1xuICB7XG4gICAga2V5OiAnbWV0aG9kJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmdcbiAgfSxcbiAge1xuICAgIGtleTogJ2hlYWRlcnMnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuSGVhZGVyc0luaXRcbiAgfSxcbiAge1xuICAgIGtleTogJ2JvZHknLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKFxuICAgICAgd2ViaWRsLmNvbnZlcnRlcnMuQm9keUluaXRcbiAgICApXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdyZWZlcnJlcicsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmdcbiAgfSxcbiAge1xuICAgIGtleTogJ3JlZmVycmVyUG9saWN5JyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyxcbiAgICAvLyBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLXJlZmVycmVyLXBvbGljeS8jcmVmZXJyZXItcG9saWN5XG4gICAgYWxsb3dlZFZhbHVlczogcmVmZXJyZXJQb2xpY3lcbiAgfSxcbiAge1xuICAgIGtleTogJ21vZGUnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nLFxuICAgIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LXJlcXVlc3QtbW9kZVxuICAgIGFsbG93ZWRWYWx1ZXM6IHJlcXVlc3RNb2RlXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdjcmVkZW50aWFscycsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI3JlcXVlc3RjcmVkZW50aWFsc1xuICAgIGFsbG93ZWRWYWx1ZXM6IHJlcXVlc3RDcmVkZW50aWFsc1xuICB9LFxuICB7XG4gICAga2V5OiAnY2FjaGUnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nLFxuICAgIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXF1ZXN0Y2FjaGVcbiAgICBhbGxvd2VkVmFsdWVzOiByZXF1ZXN0Q2FjaGVcbiAgfSxcbiAge1xuICAgIGtleTogJ3JlZGlyZWN0JyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyxcbiAgICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jcmVxdWVzdHJlZGlyZWN0XG4gICAgYWxsb3dlZFZhbHVlczogcmVxdWVzdFJlZGlyZWN0XG4gIH0sXG4gIHtcbiAgICBrZXk6ICdpbnRlZ3JpdHknLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdrZWVwYWxpdmUnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYm9vbGVhblxuICB9LFxuICB7XG4gICAga2V5OiAnc2lnbmFsJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5udWxsYWJsZUNvbnZlcnRlcihcbiAgICAgIChzaWduYWwpID0+IHdlYmlkbC5jb252ZXJ0ZXJzLkFib3J0U2lnbmFsKFxuICAgICAgICBzaWduYWwsXG4gICAgICAgICdSZXF1ZXN0SW5pdCcsXG4gICAgICAgICdzaWduYWwnLFxuICAgICAgICB7IHN0cmljdDogZmFsc2UgfVxuICAgICAgKVxuICAgIClcbiAgfSxcbiAge1xuICAgIGtleTogJ3dpbmRvdycsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5hbnlcbiAgfSxcbiAge1xuICAgIGtleTogJ2R1cGxleCcsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAgYWxsb3dlZFZhbHVlczogcmVxdWVzdER1cGxleFxuICB9LFxuICB7XG4gICAga2V5OiAnZGlzcGF0Y2hlcicsIC8vIHVuZGljaSBzcGVjaWZpYyBvcHRpb25cbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmFueVxuICB9XG5dKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHsgUmVxdWVzdCwgbWFrZVJlcXVlc3QsIGZyb21Jbm5lclJlcXVlc3QsIGNsb25lUmVxdWVzdCB9XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vRXRoYW4tQXJyb3dvb2QvdW5kaWNpLWZldGNoXG5cbid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7XG4gIG1ha2VOZXR3b3JrRXJyb3IsXG4gIG1ha2VBcHByb3ByaWF0ZU5ldHdvcmtFcnJvcixcbiAgZmlsdGVyUmVzcG9uc2UsXG4gIG1ha2VSZXNwb25zZSxcbiAgZnJvbUlubmVyUmVzcG9uc2Vcbn0gPSByZXF1aXJlKCcuL3Jlc3BvbnNlJylcbmNvbnN0IHsgSGVhZGVyc0xpc3QgfSA9IHJlcXVpcmUoJy4vaGVhZGVycycpXG5jb25zdCB7IFJlcXVlc3QsIGNsb25lUmVxdWVzdCB9ID0gcmVxdWlyZSgnLi9yZXF1ZXN0JylcbmNvbnN0IHpsaWIgPSByZXF1aXJlKCdub2RlOnpsaWInKVxuY29uc3Qge1xuICBieXRlc01hdGNoLFxuICBtYWtlUG9saWN5Q29udGFpbmVyLFxuICBjbG9uZVBvbGljeUNvbnRhaW5lcixcbiAgcmVxdWVzdEJhZFBvcnQsXG4gIFRBT0NoZWNrLFxuICBhcHBlbmRSZXF1ZXN0T3JpZ2luSGVhZGVyLFxuICByZXNwb25zZUxvY2F0aW9uVVJMLFxuICByZXF1ZXN0Q3VycmVudFVSTCxcbiAgc2V0UmVxdWVzdFJlZmVycmVyUG9saWN5T25SZWRpcmVjdCxcbiAgdHJ5VXBncmFkZVJlcXVlc3RUb0FQb3RlbnRpYWxseVRydXN0d29ydGh5VVJMLFxuICBjcmVhdGVPcGFxdWVUaW1pbmdJbmZvLFxuICBhcHBlbmRGZXRjaE1ldGFkYXRhLFxuICBjb3JzQ2hlY2ssXG4gIGNyb3NzT3JpZ2luUmVzb3VyY2VQb2xpY3lDaGVjayxcbiAgZGV0ZXJtaW5lUmVxdWVzdHNSZWZlcnJlcixcbiAgY29hcnNlbmVkU2hhcmVkQ3VycmVudFRpbWUsXG4gIGNyZWF0ZURlZmVycmVkUHJvbWlzZSxcbiAgaXNCbG9iTGlrZSxcbiAgc2FtZU9yaWdpbixcbiAgaXNDYW5jZWxsZWQsXG4gIGlzQWJvcnRlZCxcbiAgaXNFcnJvckxpa2UsXG4gIGZ1bGx5UmVhZEJvZHksXG4gIHJlYWRhYmxlU3RyZWFtQ2xvc2UsXG4gIGlzb21vcnBoaWNFbmNvZGUsXG4gIHVybElzTG9jYWwsXG4gIHVybElzSHR0cEh0dHBzU2NoZW1lLFxuICB1cmxIYXNIdHRwc1NjaGVtZSxcbiAgY2xhbXBBbmRDb2Fyc2VuQ29ubmVjdGlvblRpbWluZ0luZm8sXG4gIHNpbXBsZVJhbmdlSGVhZGVyVmFsdWUsXG4gIGJ1aWxkQ29udGVudFJhbmdlLFxuICBjcmVhdGVJbmZsYXRlLFxuICBleHRyYWN0TWltZVR5cGVcbn0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3QgeyBrU3RhdGUsIGtEaXNwYXRjaGVyIH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnbm9kZTphc3NlcnQnKVxuY29uc3QgeyBzYWZlbHlFeHRyYWN0Qm9keSwgZXh0cmFjdEJvZHkgfSA9IHJlcXVpcmUoJy4vYm9keScpXG5jb25zdCB7XG4gIHJlZGlyZWN0U3RhdHVzU2V0LFxuICBudWxsQm9keVN0YXR1cyxcbiAgc2FmZU1ldGhvZHNTZXQsXG4gIHJlcXVlc3RCb2R5SGVhZGVyLFxuICBzdWJyZXNvdXJjZVNldFxufSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IEVFID0gcmVxdWlyZSgnbm9kZTpldmVudHMnKVxuY29uc3QgeyBSZWFkYWJsZSwgcGlwZWxpbmUsIGZpbmlzaGVkIH0gPSByZXF1aXJlKCdub2RlOnN0cmVhbScpXG5jb25zdCB7IGFkZEFib3J0TGlzdGVuZXIsIGlzRXJyb3JlZCwgaXNSZWFkYWJsZSwgYnVmZmVyVG9Mb3dlckNhc2VkSGVhZGVyTmFtZSB9ID0gcmVxdWlyZSgnLi4vLi4vY29yZS91dGlsJylcbmNvbnN0IHsgZGF0YVVSTFByb2Nlc3Nvciwgc2VyaWFsaXplQU1pbWVUeXBlLCBtaW5pbWl6ZVN1cHBvcnRlZE1pbWVUeXBlIH0gPSByZXF1aXJlKCcuL2RhdGEtdXJsJylcbmNvbnN0IHsgZ2V0R2xvYmFsRGlzcGF0Y2hlciB9ID0gcmVxdWlyZSgnLi4vLi4vZ2xvYmFsJylcbmNvbnN0IHsgd2ViaWRsIH0gPSByZXF1aXJlKCcuL3dlYmlkbCcpXG5jb25zdCB7IFNUQVRVU19DT0RFUyB9ID0gcmVxdWlyZSgnbm9kZTpodHRwJylcbmNvbnN0IEdFVF9PUl9IRUFEID0gWydHRVQnLCAnSEVBRCddXG5cbmNvbnN0IGRlZmF1bHRVc2VyQWdlbnQgPSB0eXBlb2YgX19VTkRJQ0lfSVNfTk9ERV9fICE9PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgZXNidWlsZERldGVjdGlvbiAhPT0gJ3VuZGVmaW5lZCdcbiAgPyAnbm9kZSdcbiAgOiAndW5kaWNpJ1xuXG4vKiogQHR5cGUge2ltcG9ydCgnYnVmZmVyJykucmVzb2x2ZU9iamVjdFVSTH0gKi9cbmxldCByZXNvbHZlT2JqZWN0VVJMXG5cbmNsYXNzIEZldGNoIGV4dGVuZHMgRUUge1xuICBjb25zdHJ1Y3RvciAoZGlzcGF0Y2hlcikge1xuICAgIHN1cGVyKClcblxuICAgIHRoaXMuZGlzcGF0Y2hlciA9IGRpc3BhdGNoZXJcbiAgICB0aGlzLmNvbm5lY3Rpb24gPSBudWxsXG4gICAgdGhpcy5kdW1wID0gZmFsc2VcbiAgICB0aGlzLnN0YXRlID0gJ29uZ29pbmcnXG4gIH1cblxuICB0ZXJtaW5hdGUgKHJlYXNvbikge1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSAnb25nb2luZycpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSAndGVybWluYXRlZCdcbiAgICB0aGlzLmNvbm5lY3Rpb24/LmRlc3Ryb3kocmVhc29uKVxuICAgIHRoaXMuZW1pdCgndGVybWluYXRlZCcsIHJlYXNvbilcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNmZXRjaC1jb250cm9sbGVyLWFib3J0XG4gIGFib3J0IChlcnJvcikge1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSAnb25nb2luZycpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIDEuIFNldCBjb250cm9sbGVy4oCZcyBzdGF0ZSB0byBcImFib3J0ZWRcIi5cbiAgICB0aGlzLnN0YXRlID0gJ2Fib3J0ZWQnXG5cbiAgICAvLyAyLiBMZXQgZmFsbGJhY2tFcnJvciBiZSBhbiBcIkFib3J0RXJyb3JcIiBET01FeGNlcHRpb24uXG4gICAgLy8gMy4gU2V0IGVycm9yIHRvIGZhbGxiYWNrRXJyb3IgaWYgaXQgaXMgbm90IGdpdmVuLlxuICAgIGlmICghZXJyb3IpIHtcbiAgICAgIGVycm9yID0gbmV3IERPTUV4Y2VwdGlvbignVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZC4nLCAnQWJvcnRFcnJvcicpXG4gICAgfVxuXG4gICAgLy8gNC4gTGV0IHNlcmlhbGl6ZWRFcnJvciBiZSBTdHJ1Y3R1cmVkU2VyaWFsaXplKGVycm9yKS5cbiAgICAvLyAgICBJZiB0aGF0IHRocmV3IGFuIGV4Y2VwdGlvbiwgY2F0Y2ggaXQsIGFuZCBsZXRcbiAgICAvLyAgICBzZXJpYWxpemVkRXJyb3IgYmUgU3RydWN0dXJlZFNlcmlhbGl6ZShmYWxsYmFja0Vycm9yKS5cblxuICAgIC8vIDUuIFNldCBjb250cm9sbGVy4oCZcyBzZXJpYWxpemVkIGFib3J0IHJlYXNvbiB0byBzZXJpYWxpemVkRXJyb3IuXG4gICAgdGhpcy5zZXJpYWxpemVkQWJvcnRSZWFzb24gPSBlcnJvclxuXG4gICAgdGhpcy5jb25uZWN0aW9uPy5kZXN0cm95KGVycm9yKVxuICAgIHRoaXMuZW1pdCgndGVybWluYXRlZCcsIGVycm9yKVxuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUZldGNoRG9uZSAocmVzcG9uc2UpIHtcbiAgZmluYWxpemVBbmRSZXBvcnRUaW1pbmcocmVzcG9uc2UsICdmZXRjaCcpXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNmZXRjaC1tZXRob2RcbmZ1bmN0aW9uIGZldGNoIChpbnB1dCwgaW5pdCA9IHVuZGVmaW5lZCkge1xuICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsICdnbG9iYWxUaGlzLmZldGNoJylcblxuICAvLyAxLiBMZXQgcCBiZSBhIG5ldyBwcm9taXNlLlxuICBsZXQgcCA9IGNyZWF0ZURlZmVycmVkUHJvbWlzZSgpXG5cbiAgLy8gMi4gTGV0IHJlcXVlc3RPYmplY3QgYmUgdGhlIHJlc3VsdCBvZiBpbnZva2luZyB0aGUgaW5pdGlhbCB2YWx1ZSBvZlxuICAvLyBSZXF1ZXN0IGFzIGNvbnN0cnVjdG9yIHdpdGggaW5wdXQgYW5kIGluaXQgYXMgYXJndW1lbnRzLiBJZiB0aGlzIHRocm93c1xuICAvLyBhbiBleGNlcHRpb24sIHJlamVjdCBwIHdpdGggaXQgYW5kIHJldHVybiBwLlxuICBsZXQgcmVxdWVzdE9iamVjdFxuXG4gIHRyeSB7XG4gICAgcmVxdWVzdE9iamVjdCA9IG5ldyBSZXF1ZXN0KGlucHV0LCBpbml0KVxuICB9IGNhdGNoIChlKSB7XG4gICAgcC5yZWplY3QoZSlcbiAgICByZXR1cm4gcC5wcm9taXNlXG4gIH1cblxuICAvLyAzLiBMZXQgcmVxdWVzdCBiZSByZXF1ZXN0T2JqZWN04oCZcyByZXF1ZXN0LlxuICBjb25zdCByZXF1ZXN0ID0gcmVxdWVzdE9iamVjdFtrU3RhdGVdXG5cbiAgLy8gNC4gSWYgcmVxdWVzdE9iamVjdOKAmXMgc2lnbmFs4oCZcyBhYm9ydGVkIGZsYWcgaXMgc2V0LCB0aGVuOlxuICBpZiAocmVxdWVzdE9iamVjdC5zaWduYWwuYWJvcnRlZCkge1xuICAgIC8vIDEuIEFib3J0IHRoZSBmZXRjaCgpIGNhbGwgd2l0aCBwLCByZXF1ZXN0LCBudWxsLCBhbmRcbiAgICAvLyAgICByZXF1ZXN0T2JqZWN04oCZcyBzaWduYWzigJlzIGFib3J0IHJlYXNvbi5cbiAgICBhYm9ydEZldGNoKHAsIHJlcXVlc3QsIG51bGwsIHJlcXVlc3RPYmplY3Quc2lnbmFsLnJlYXNvbilcblxuICAgIC8vIDIuIFJldHVybiBwLlxuICAgIHJldHVybiBwLnByb21pc2VcbiAgfVxuXG4gIC8vIDUuIExldCBnbG9iYWxPYmplY3QgYmUgcmVxdWVzdOKAmXMgY2xpZW504oCZcyBnbG9iYWwgb2JqZWN0LlxuICBjb25zdCBnbG9iYWxPYmplY3QgPSByZXF1ZXN0LmNsaWVudC5nbG9iYWxPYmplY3RcblxuICAvLyA2LiBJZiBnbG9iYWxPYmplY3QgaXMgYSBTZXJ2aWNlV29ya2VyR2xvYmFsU2NvcGUgb2JqZWN0LCB0aGVuIHNldFxuICAvLyByZXF1ZXN04oCZcyBzZXJ2aWNlLXdvcmtlcnMgbW9kZSB0byBcIm5vbmVcIi5cbiAgaWYgKGdsb2JhbE9iamVjdD8uY29uc3RydWN0b3I/Lm5hbWUgPT09ICdTZXJ2aWNlV29ya2VyR2xvYmFsU2NvcGUnKSB7XG4gICAgcmVxdWVzdC5zZXJ2aWNlV29ya2VycyA9ICdub25lJ1xuICB9XG5cbiAgLy8gNy4gTGV0IHJlc3BvbnNlT2JqZWN0IGJlIG51bGwuXG4gIGxldCByZXNwb25zZU9iamVjdCA9IG51bGxcblxuICAvLyA4LiBMZXQgcmVsZXZhbnRSZWFsbSBiZSB0aGlz4oCZcyByZWxldmFudCBSZWFsbS5cblxuICAvLyA5LiBMZXQgbG9jYWxseUFib3J0ZWQgYmUgZmFsc2UuXG4gIGxldCBsb2NhbGx5QWJvcnRlZCA9IGZhbHNlXG5cbiAgLy8gMTAuIExldCBjb250cm9sbGVyIGJlIG51bGwuXG4gIGxldCBjb250cm9sbGVyID0gbnVsbFxuXG4gIC8vIDExLiBBZGQgdGhlIGZvbGxvd2luZyBhYm9ydCBzdGVwcyB0byByZXF1ZXN0T2JqZWN04oCZcyBzaWduYWw6XG4gIGFkZEFib3J0TGlzdGVuZXIoXG4gICAgcmVxdWVzdE9iamVjdC5zaWduYWwsXG4gICAgKCkgPT4ge1xuICAgICAgLy8gMS4gU2V0IGxvY2FsbHlBYm9ydGVkIHRvIHRydWUuXG4gICAgICBsb2NhbGx5QWJvcnRlZCA9IHRydWVcblxuICAgICAgLy8gMi4gQXNzZXJ0OiBjb250cm9sbGVyIGlzIG5vbi1udWxsLlxuICAgICAgYXNzZXJ0KGNvbnRyb2xsZXIgIT0gbnVsbClcblxuICAgICAgLy8gMy4gQWJvcnQgY29udHJvbGxlciB3aXRoIHJlcXVlc3RPYmplY3TigJlzIHNpZ25hbOKAmXMgYWJvcnQgcmVhc29uLlxuICAgICAgY29udHJvbGxlci5hYm9ydChyZXF1ZXN0T2JqZWN0LnNpZ25hbC5yZWFzb24pXG5cbiAgICAgIGNvbnN0IHJlYWxSZXNwb25zZSA9IHJlc3BvbnNlT2JqZWN0Py5kZXJlZigpXG5cbiAgICAgIC8vIDQuIEFib3J0IHRoZSBmZXRjaCgpIGNhbGwgd2l0aCBwLCByZXF1ZXN0LCByZXNwb25zZU9iamVjdCxcbiAgICAgIC8vICAgIGFuZCByZXF1ZXN0T2JqZWN04oCZcyBzaWduYWzigJlzIGFib3J0IHJlYXNvbi5cbiAgICAgIGFib3J0RmV0Y2gocCwgcmVxdWVzdCwgcmVhbFJlc3BvbnNlLCByZXF1ZXN0T2JqZWN0LnNpZ25hbC5yZWFzb24pXG4gICAgfVxuICApXG5cbiAgLy8gMTIuIExldCBoYW5kbGVGZXRjaERvbmUgZ2l2ZW4gcmVzcG9uc2UgcmVzcG9uc2UgYmUgdG8gZmluYWxpemUgYW5kXG4gIC8vIHJlcG9ydCB0aW1pbmcgd2l0aCByZXNwb25zZSwgZ2xvYmFsT2JqZWN0LCBhbmQgXCJmZXRjaFwiLlxuICAvLyBzZWUgZnVuY3Rpb24gaGFuZGxlRmV0Y2hEb25lXG5cbiAgLy8gMTMuIFNldCBjb250cm9sbGVyIHRvIHRoZSByZXN1bHQgb2YgY2FsbGluZyBmZXRjaCBnaXZlbiByZXF1ZXN0LFxuICAvLyB3aXRoIHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keSBzZXQgdG8gaGFuZGxlRmV0Y2hEb25lLCBhbmQgcHJvY2Vzc1Jlc3BvbnNlXG4gIC8vIGdpdmVuIHJlc3BvbnNlIGJlaW5nIHRoZXNlIHN1YnN0ZXBzOlxuXG4gIGNvbnN0IHByb2Nlc3NSZXNwb25zZSA9IChyZXNwb25zZSkgPT4ge1xuICAgIC8vIDEuIElmIGxvY2FsbHlBYm9ydGVkIGlzIHRydWUsIHRlcm1pbmF0ZSB0aGVzZSBzdWJzdGVwcy5cbiAgICBpZiAobG9jYWxseUFib3J0ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIDIuIElmIHJlc3BvbnNl4oCZcyBhYm9ydGVkIGZsYWcgaXMgc2V0LCB0aGVuOlxuICAgIGlmIChyZXNwb25zZS5hYm9ydGVkKSB7XG4gICAgICAvLyAxLiBMZXQgZGVzZXJpYWxpemVkRXJyb3IgYmUgdGhlIHJlc3VsdCBvZiBkZXNlcmlhbGl6ZSBhIHNlcmlhbGl6ZWRcbiAgICAgIC8vICAgIGFib3J0IHJlYXNvbiBnaXZlbiBjb250cm9sbGVy4oCZcyBzZXJpYWxpemVkIGFib3J0IHJlYXNvbiBhbmRcbiAgICAgIC8vICAgIHJlbGV2YW50UmVhbG0uXG5cbiAgICAgIC8vIDIuIEFib3J0IHRoZSBmZXRjaCgpIGNhbGwgd2l0aCBwLCByZXF1ZXN0LCByZXNwb25zZU9iamVjdCwgYW5kXG4gICAgICAvLyAgICBkZXNlcmlhbGl6ZWRFcnJvci5cblxuICAgICAgYWJvcnRGZXRjaChwLCByZXF1ZXN0LCByZXNwb25zZU9iamVjdCwgY29udHJvbGxlci5zZXJpYWxpemVkQWJvcnRSZWFzb24pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyAzLiBJZiByZXNwb25zZSBpcyBhIG5ldHdvcmsgZXJyb3IsIHRoZW4gcmVqZWN0IHAgd2l0aCBhIFR5cGVFcnJvclxuICAgIC8vIGFuZCB0ZXJtaW5hdGUgdGhlc2Ugc3Vic3RlcHMuXG4gICAgaWYgKHJlc3BvbnNlLnR5cGUgPT09ICdlcnJvcicpIHtcbiAgICAgIHAucmVqZWN0KG5ldyBUeXBlRXJyb3IoJ2ZldGNoIGZhaWxlZCcsIHsgY2F1c2U6IHJlc3BvbnNlLmVycm9yIH0pKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gNC4gU2V0IHJlc3BvbnNlT2JqZWN0IHRvIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYSBSZXNwb25zZSBvYmplY3QsXG4gICAgLy8gZ2l2ZW4gcmVzcG9uc2UsIFwiaW1tdXRhYmxlXCIsIGFuZCByZWxldmFudFJlYWxtLlxuICAgIHJlc3BvbnNlT2JqZWN0ID0gbmV3IFdlYWtSZWYoZnJvbUlubmVyUmVzcG9uc2UocmVzcG9uc2UsICdpbW11dGFibGUnKSlcblxuICAgIC8vIDUuIFJlc29sdmUgcCB3aXRoIHJlc3BvbnNlT2JqZWN0LlxuICAgIHAucmVzb2x2ZShyZXNwb25zZU9iamVjdC5kZXJlZigpKVxuICAgIHAgPSBudWxsXG4gIH1cblxuICBjb250cm9sbGVyID0gZmV0Y2hpbmcoe1xuICAgIHJlcXVlc3QsXG4gICAgcHJvY2Vzc1Jlc3BvbnNlRW5kT2ZCb2R5OiBoYW5kbGVGZXRjaERvbmUsXG4gICAgcHJvY2Vzc1Jlc3BvbnNlLFxuICAgIGRpc3BhdGNoZXI6IHJlcXVlc3RPYmplY3Rba0Rpc3BhdGNoZXJdIC8vIHVuZGljaVxuICB9KVxuXG4gIC8vIDE0LiBSZXR1cm4gcC5cbiAgcmV0dXJuIHAucHJvbWlzZVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZmluYWxpemUtYW5kLXJlcG9ydC10aW1pbmdcbmZ1bmN0aW9uIGZpbmFsaXplQW5kUmVwb3J0VGltaW5nIChyZXNwb25zZSwgaW5pdGlhdG9yVHlwZSA9ICdvdGhlcicpIHtcbiAgLy8gMS4gSWYgcmVzcG9uc2UgaXMgYW4gYWJvcnRlZCBuZXR3b3JrIGVycm9yLCB0aGVuIHJldHVybi5cbiAgaWYgKHJlc3BvbnNlLnR5cGUgPT09ICdlcnJvcicgJiYgcmVzcG9uc2UuYWJvcnRlZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gMi4gSWYgcmVzcG9uc2XigJlzIFVSTCBsaXN0IGlzIG51bGwgb3IgZW1wdHksIHRoZW4gcmV0dXJuLlxuICBpZiAoIXJlc3BvbnNlLnVybExpc3Q/Lmxlbmd0aCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gMy4gTGV0IG9yaWdpbmFsVVJMIGJlIHJlc3BvbnNl4oCZcyBVUkwgbGlzdFswXS5cbiAgY29uc3Qgb3JpZ2luYWxVUkwgPSByZXNwb25zZS51cmxMaXN0WzBdXG5cbiAgLy8gNC4gTGV0IHRpbWluZ0luZm8gYmUgcmVzcG9uc2XigJlzIHRpbWluZyBpbmZvLlxuICBsZXQgdGltaW5nSW5mbyA9IHJlc3BvbnNlLnRpbWluZ0luZm9cblxuICAvLyA1LiBMZXQgY2FjaGVTdGF0ZSBiZSByZXNwb25zZeKAmXMgY2FjaGUgc3RhdGUuXG4gIGxldCBjYWNoZVN0YXRlID0gcmVzcG9uc2UuY2FjaGVTdGF0ZVxuXG4gIC8vIDYuIElmIG9yaWdpbmFsVVJM4oCZcyBzY2hlbWUgaXMgbm90IGFuIEhUVFAoUykgc2NoZW1lLCB0aGVuIHJldHVybi5cbiAgaWYgKCF1cmxJc0h0dHBIdHRwc1NjaGVtZShvcmlnaW5hbFVSTCkpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIDcuIElmIHRpbWluZ0luZm8gaXMgbnVsbCwgdGhlbiByZXR1cm4uXG4gIGlmICh0aW1pbmdJbmZvID09PSBudWxsKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyA4LiBJZiByZXNwb25zZeKAmXMgdGltaW5nIGFsbG93IHBhc3NlZCBmbGFnIGlzIG5vdCBzZXQsIHRoZW46XG4gIGlmICghcmVzcG9uc2UudGltaW5nQWxsb3dQYXNzZWQpIHtcbiAgICAvLyAgMS4gU2V0IHRpbWluZ0luZm8gdG8gYSB0aGUgcmVzdWx0IG9mIGNyZWF0aW5nIGFuIG9wYXF1ZSB0aW1pbmcgaW5mbyBmb3IgdGltaW5nSW5mby5cbiAgICB0aW1pbmdJbmZvID0gY3JlYXRlT3BhcXVlVGltaW5nSW5mbyh7XG4gICAgICBzdGFydFRpbWU6IHRpbWluZ0luZm8uc3RhcnRUaW1lXG4gICAgfSlcblxuICAgIC8vICAyLiBTZXQgY2FjaGVTdGF0ZSB0byB0aGUgZW1wdHkgc3RyaW5nLlxuICAgIGNhY2hlU3RhdGUgPSAnJ1xuICB9XG5cbiAgLy8gOS4gU2V0IHRpbWluZ0luZm/igJlzIGVuZCB0aW1lIHRvIHRoZSBjb2Fyc2VuZWQgc2hhcmVkIGN1cnJlbnQgdGltZVxuICAvLyBnaXZlbiBnbG9iYWzigJlzIHJlbGV2YW50IHNldHRpbmdzIG9iamVjdOKAmXMgY3Jvc3Mtb3JpZ2luIGlzb2xhdGVkXG4gIC8vIGNhcGFiaWxpdHkuXG4gIC8vIFRPRE86IGdpdmVuIGdsb2JhbOKAmXMgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN04oCZcyBjcm9zcy1vcmlnaW4gaXNvbGF0ZWRcbiAgLy8gY2FwYWJpbGl0eT9cbiAgdGltaW5nSW5mby5lbmRUaW1lID0gY29hcnNlbmVkU2hhcmVkQ3VycmVudFRpbWUoKVxuXG4gIC8vIDEwLiBTZXQgcmVzcG9uc2XigJlzIHRpbWluZyBpbmZvIHRvIHRpbWluZ0luZm8uXG4gIHJlc3BvbnNlLnRpbWluZ0luZm8gPSB0aW1pbmdJbmZvXG5cbiAgLy8gMTEuIE1hcmsgcmVzb3VyY2UgdGltaW5nIGZvciB0aW1pbmdJbmZvLCBvcmlnaW5hbFVSTCwgaW5pdGlhdG9yVHlwZSxcbiAgLy8gZ2xvYmFsLCBhbmQgY2FjaGVTdGF0ZS5cbiAgbWFya1Jlc291cmNlVGltaW5nKFxuICAgIHRpbWluZ0luZm8sXG4gICAgb3JpZ2luYWxVUkwuaHJlZixcbiAgICBpbml0aWF0b3JUeXBlLFxuICAgIGdsb2JhbFRoaXMsXG4gICAgY2FjaGVTdGF0ZVxuICApXG59XG5cbi8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9yZXNvdXJjZS10aW1pbmcvI2Rmbi1tYXJrLXJlc291cmNlLXRpbWluZ1xuY29uc3QgbWFya1Jlc291cmNlVGltaW5nID0gcGVyZm9ybWFuY2UubWFya1Jlc291cmNlVGltaW5nXG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNhYm9ydC1mZXRjaFxuZnVuY3Rpb24gYWJvcnRGZXRjaCAocCwgcmVxdWVzdCwgcmVzcG9uc2VPYmplY3QsIGVycm9yKSB7XG4gIC8vIDEuIFJlamVjdCBwcm9taXNlIHdpdGggZXJyb3IuXG4gIGlmIChwKSB7XG4gICAgLy8gV2UgbWlnaHQgaGF2ZSBhbHJlYWR5IHJlc29sdmVkIHRoZSBwcm9taXNlIGF0IHRoaXMgc3RhZ2VcbiAgICBwLnJlamVjdChlcnJvcilcbiAgfVxuXG4gIC8vIDIuIElmIHJlcXVlc3TigJlzIGJvZHkgaXMgbm90IG51bGwgYW5kIGlzIHJlYWRhYmxlLCB0aGVuIGNhbmNlbCByZXF1ZXN04oCZc1xuICAvLyBib2R5IHdpdGggZXJyb3IuXG4gIGlmIChyZXF1ZXN0LmJvZHkgIT0gbnVsbCAmJiBpc1JlYWRhYmxlKHJlcXVlc3QuYm9keT8uc3RyZWFtKSkge1xuICAgIHJlcXVlc3QuYm9keS5zdHJlYW0uY2FuY2VsKGVycm9yKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFUlJfSU5WQUxJRF9TVEFURScpIHtcbiAgICAgICAgLy8gTm9kZSBidWc/XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgdGhyb3cgZXJyXG4gICAgfSlcbiAgfVxuXG4gIC8vIDMuIElmIHJlc3BvbnNlT2JqZWN0IGlzIG51bGwsIHRoZW4gcmV0dXJuLlxuICBpZiAocmVzcG9uc2VPYmplY3QgPT0gbnVsbCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gNC4gTGV0IHJlc3BvbnNlIGJlIHJlc3BvbnNlT2JqZWN04oCZcyByZXNwb25zZS5cbiAgY29uc3QgcmVzcG9uc2UgPSByZXNwb25zZU9iamVjdFtrU3RhdGVdXG5cbiAgLy8gNS4gSWYgcmVzcG9uc2XigJlzIGJvZHkgaXMgbm90IG51bGwgYW5kIGlzIHJlYWRhYmxlLCB0aGVuIGVycm9yIHJlc3BvbnNl4oCZc1xuICAvLyBib2R5IHdpdGggZXJyb3IuXG4gIGlmIChyZXNwb25zZS5ib2R5ICE9IG51bGwgJiYgaXNSZWFkYWJsZShyZXNwb25zZS5ib2R5Py5zdHJlYW0pKSB7XG4gICAgcmVzcG9uc2UuYm9keS5zdHJlYW0uY2FuY2VsKGVycm9yKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFUlJfSU5WQUxJRF9TVEFURScpIHtcbiAgICAgICAgLy8gTm9kZSBidWc/XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgdGhyb3cgZXJyXG4gICAgfSlcbiAgfVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZmV0Y2hpbmdcbmZ1bmN0aW9uIGZldGNoaW5nICh7XG4gIHJlcXVlc3QsXG4gIHByb2Nlc3NSZXF1ZXN0Qm9keUNodW5rTGVuZ3RoLFxuICBwcm9jZXNzUmVxdWVzdEVuZE9mQm9keSxcbiAgcHJvY2Vzc1Jlc3BvbnNlLFxuICBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHksXG4gIHByb2Nlc3NSZXNwb25zZUNvbnN1bWVCb2R5LFxuICB1c2VQYXJhbGxlbFF1ZXVlID0gZmFsc2UsXG4gIGRpc3BhdGNoZXIgPSBnZXRHbG9iYWxEaXNwYXRjaGVyKCkgLy8gdW5kaWNpXG59KSB7XG4gIC8vIEVuc3VyZSB0aGF0IHRoZSBkaXNwYXRjaGVyIGlzIHNldCBhY2NvcmRpbmdseVxuICBhc3NlcnQoZGlzcGF0Y2hlcilcblxuICAvLyAxLiBMZXQgdGFza0Rlc3RpbmF0aW9uIGJlIG51bGwuXG4gIGxldCB0YXNrRGVzdGluYXRpb24gPSBudWxsXG5cbiAgLy8gMi4gTGV0IGNyb3NzT3JpZ2luSXNvbGF0ZWRDYXBhYmlsaXR5IGJlIGZhbHNlLlxuICBsZXQgY3Jvc3NPcmlnaW5Jc29sYXRlZENhcGFiaWxpdHkgPSBmYWxzZVxuXG4gIC8vIDMuIElmIHJlcXVlc3TigJlzIGNsaWVudCBpcyBub24tbnVsbCwgdGhlbjpcbiAgaWYgKHJlcXVlc3QuY2xpZW50ICE9IG51bGwpIHtcbiAgICAvLyAxLiBTZXQgdGFza0Rlc3RpbmF0aW9uIHRvIHJlcXVlc3TigJlzIGNsaWVudOKAmXMgZ2xvYmFsIG9iamVjdC5cbiAgICB0YXNrRGVzdGluYXRpb24gPSByZXF1ZXN0LmNsaWVudC5nbG9iYWxPYmplY3RcblxuICAgIC8vIDIuIFNldCBjcm9zc09yaWdpbklzb2xhdGVkQ2FwYWJpbGl0eSB0byByZXF1ZXN04oCZcyBjbGllbnTigJlzIGNyb3NzLW9yaWdpblxuICAgIC8vIGlzb2xhdGVkIGNhcGFiaWxpdHkuXG4gICAgY3Jvc3NPcmlnaW5Jc29sYXRlZENhcGFiaWxpdHkgPVxuICAgICAgcmVxdWVzdC5jbGllbnQuY3Jvc3NPcmlnaW5Jc29sYXRlZENhcGFiaWxpdHlcbiAgfVxuXG4gIC8vIDQuIElmIHVzZVBhcmFsbGVsUXVldWUgaXMgdHJ1ZSwgdGhlbiBzZXQgdGFza0Rlc3RpbmF0aW9uIHRvIHRoZSByZXN1bHQgb2ZcbiAgLy8gc3RhcnRpbmcgYSBuZXcgcGFyYWxsZWwgcXVldWUuXG4gIC8vIFRPRE9cblxuICAvLyA1LiBMZXQgdGltaW5nSW5mbyBiZSBhIG5ldyBmZXRjaCB0aW1pbmcgaW5mbyB3aG9zZSBzdGFydCB0aW1lIGFuZFxuICAvLyBwb3N0LXJlZGlyZWN0IHN0YXJ0IHRpbWUgYXJlIHRoZSBjb2Fyc2VuZWQgc2hhcmVkIGN1cnJlbnQgdGltZSBnaXZlblxuICAvLyBjcm9zc09yaWdpbklzb2xhdGVkQ2FwYWJpbGl0eS5cbiAgY29uc3QgY3VycmVudFRpbWUgPSBjb2Fyc2VuZWRTaGFyZWRDdXJyZW50VGltZShjcm9zc09yaWdpbklzb2xhdGVkQ2FwYWJpbGl0eSlcbiAgY29uc3QgdGltaW5nSW5mbyA9IGNyZWF0ZU9wYXF1ZVRpbWluZ0luZm8oe1xuICAgIHN0YXJ0VGltZTogY3VycmVudFRpbWVcbiAgfSlcblxuICAvLyA2LiBMZXQgZmV0Y2hQYXJhbXMgYmUgYSBuZXcgZmV0Y2ggcGFyYW1zIHdob3NlXG4gIC8vIHJlcXVlc3QgaXMgcmVxdWVzdCxcbiAgLy8gdGltaW5nIGluZm8gaXMgdGltaW5nSW5mbyxcbiAgLy8gcHJvY2VzcyByZXF1ZXN0IGJvZHkgY2h1bmsgbGVuZ3RoIGlzIHByb2Nlc3NSZXF1ZXN0Qm9keUNodW5rTGVuZ3RoLFxuICAvLyBwcm9jZXNzIHJlcXVlc3QgZW5kLW9mLWJvZHkgaXMgcHJvY2Vzc1JlcXVlc3RFbmRPZkJvZHksXG4gIC8vIHByb2Nlc3MgcmVzcG9uc2UgaXMgcHJvY2Vzc1Jlc3BvbnNlLFxuICAvLyBwcm9jZXNzIHJlc3BvbnNlIGNvbnN1bWUgYm9keSBpcyBwcm9jZXNzUmVzcG9uc2VDb25zdW1lQm9keSxcbiAgLy8gcHJvY2VzcyByZXNwb25zZSBlbmQtb2YtYm9keSBpcyBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHksXG4gIC8vIHRhc2sgZGVzdGluYXRpb24gaXMgdGFza0Rlc3RpbmF0aW9uLFxuICAvLyBhbmQgY3Jvc3Mtb3JpZ2luIGlzb2xhdGVkIGNhcGFiaWxpdHkgaXMgY3Jvc3NPcmlnaW5Jc29sYXRlZENhcGFiaWxpdHkuXG4gIGNvbnN0IGZldGNoUGFyYW1zID0ge1xuICAgIGNvbnRyb2xsZXI6IG5ldyBGZXRjaChkaXNwYXRjaGVyKSxcbiAgICByZXF1ZXN0LFxuICAgIHRpbWluZ0luZm8sXG4gICAgcHJvY2Vzc1JlcXVlc3RCb2R5Q2h1bmtMZW5ndGgsXG4gICAgcHJvY2Vzc1JlcXVlc3RFbmRPZkJvZHksXG4gICAgcHJvY2Vzc1Jlc3BvbnNlLFxuICAgIHByb2Nlc3NSZXNwb25zZUNvbnN1bWVCb2R5LFxuICAgIHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keSxcbiAgICB0YXNrRGVzdGluYXRpb24sXG4gICAgY3Jvc3NPcmlnaW5Jc29sYXRlZENhcGFiaWxpdHlcbiAgfVxuXG4gIC8vIDcuIElmIHJlcXVlc3TigJlzIGJvZHkgaXMgYSBieXRlIHNlcXVlbmNlLCB0aGVuIHNldCByZXF1ZXN04oCZcyBib2R5IHRvXG4gIC8vICAgIHJlcXVlc3TigJlzIGJvZHkgYXMgYSBib2R5LlxuICAvLyBOT1RFOiBTaW5jZSBmZXRjaGluZyBpcyBvbmx5IGNhbGxlZCBmcm9tIGZldGNoLCBib2R5IHNob3VsZCBhbHJlYWR5IGJlXG4gIC8vIGV4dHJhY3RlZC5cbiAgYXNzZXJ0KCFyZXF1ZXN0LmJvZHkgfHwgcmVxdWVzdC5ib2R5LnN0cmVhbSlcblxuICAvLyA4LiBJZiByZXF1ZXN04oCZcyB3aW5kb3cgaXMgXCJjbGllbnRcIiwgdGhlbiBzZXQgcmVxdWVzdOKAmXMgd2luZG93IHRvIHJlcXVlc3TigJlzXG4gIC8vIGNsaWVudCwgaWYgcmVxdWVzdOKAmXMgY2xpZW504oCZcyBnbG9iYWwgb2JqZWN0IGlzIGEgV2luZG93IG9iamVjdDsgb3RoZXJ3aXNlXG4gIC8vIFwibm8td2luZG93XCIuXG4gIGlmIChyZXF1ZXN0LndpbmRvdyA9PT0gJ2NsaWVudCcpIHtcbiAgICAvLyBUT0RPOiBXaGF0IGlmIHJlcXVlc3QuY2xpZW50IGlzIG51bGw/XG4gICAgcmVxdWVzdC53aW5kb3cgPVxuICAgICAgcmVxdWVzdC5jbGllbnQ/Lmdsb2JhbE9iamVjdD8uY29uc3RydWN0b3I/Lm5hbWUgPT09ICdXaW5kb3cnXG4gICAgICAgID8gcmVxdWVzdC5jbGllbnRcbiAgICAgICAgOiAnbm8td2luZG93J1xuICB9XG5cbiAgLy8gOS4gSWYgcmVxdWVzdOKAmXMgb3JpZ2luIGlzIFwiY2xpZW50XCIsIHRoZW4gc2V0IHJlcXVlc3TigJlzIG9yaWdpbiB0byByZXF1ZXN04oCZc1xuICAvLyBjbGllbnTigJlzIG9yaWdpbi5cbiAgaWYgKHJlcXVlc3Qub3JpZ2luID09PSAnY2xpZW50Jykge1xuICAgIHJlcXVlc3Qub3JpZ2luID0gcmVxdWVzdC5jbGllbnQub3JpZ2luXG4gIH1cblxuICAvLyAxMC4gSWYgYWxsIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgdHJ1ZTpcbiAgLy8gVE9ET1xuXG4gIC8vIDExLiBJZiByZXF1ZXN04oCZcyBwb2xpY3kgY29udGFpbmVyIGlzIFwiY2xpZW50XCIsIHRoZW46XG4gIGlmIChyZXF1ZXN0LnBvbGljeUNvbnRhaW5lciA9PT0gJ2NsaWVudCcpIHtcbiAgICAvLyAxLiBJZiByZXF1ZXN04oCZcyBjbGllbnQgaXMgbm9uLW51bGwsIHRoZW4gc2V0IHJlcXVlc3TigJlzIHBvbGljeVxuICAgIC8vIGNvbnRhaW5lciB0byBhIGNsb25lIG9mIHJlcXVlc3TigJlzIGNsaWVudOKAmXMgcG9saWN5IGNvbnRhaW5lci4gW0hUTUxdXG4gICAgaWYgKHJlcXVlc3QuY2xpZW50ICE9IG51bGwpIHtcbiAgICAgIHJlcXVlc3QucG9saWN5Q29udGFpbmVyID0gY2xvbmVQb2xpY3lDb250YWluZXIoXG4gICAgICAgIHJlcXVlc3QuY2xpZW50LnBvbGljeUNvbnRhaW5lclxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyAyLiBPdGhlcndpc2UsIHNldCByZXF1ZXN04oCZcyBwb2xpY3kgY29udGFpbmVyIHRvIGEgbmV3IHBvbGljeVxuICAgICAgLy8gY29udGFpbmVyLlxuICAgICAgcmVxdWVzdC5wb2xpY3lDb250YWluZXIgPSBtYWtlUG9saWN5Q29udGFpbmVyKClcbiAgICB9XG4gIH1cblxuICAvLyAxMi4gSWYgcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgZG9lcyBub3QgY29udGFpbiBgQWNjZXB0YCwgdGhlbjpcbiAgaWYgKCFyZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCdhY2NlcHQnLCB0cnVlKSkge1xuICAgIC8vIDEuIExldCB2YWx1ZSBiZSBgKi8qYC5cbiAgICBjb25zdCB2YWx1ZSA9ICcqLyonXG5cbiAgICAvLyAyLiBBIHVzZXIgYWdlbnQgc2hvdWxkIHNldCB2YWx1ZSB0byB0aGUgZmlyc3QgbWF0Y2hpbmcgc3RhdGVtZW50LCBpZlxuICAgIC8vIGFueSwgc3dpdGNoaW5nIG9uIHJlcXVlc3TigJlzIGRlc3RpbmF0aW9uOlxuICAgIC8vIFwiZG9jdW1lbnRcIlxuICAgIC8vIFwiZnJhbWVcIlxuICAgIC8vIFwiaWZyYW1lXCJcbiAgICAvLyBgdGV4dC9odG1sLGFwcGxpY2F0aW9uL3hodG1sK3htbCxhcHBsaWNhdGlvbi94bWw7cT0wLjksKi8qO3E9MC44YFxuICAgIC8vIFwiaW1hZ2VcIlxuICAgIC8vIGBpbWFnZS9wbmcsaW1hZ2Uvc3ZnK3htbCxpbWFnZS8qO3E9MC44LCovKjtxPTAuNWBcbiAgICAvLyBcInN0eWxlXCJcbiAgICAvLyBgdGV4dC9jc3MsKi8qO3E9MC4xYFxuICAgIC8vIFRPRE9cblxuICAgIC8vIDMuIEFwcGVuZCBgQWNjZXB0YC92YWx1ZSB0byByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgICByZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgnYWNjZXB0JywgdmFsdWUsIHRydWUpXG4gIH1cblxuICAvLyAxMy4gSWYgcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgZG9lcyBub3QgY29udGFpbiBgQWNjZXB0LUxhbmd1YWdlYCwgdGhlblxuICAvLyB1c2VyIGFnZW50cyBzaG91bGQgYXBwZW5kIGBBY2NlcHQtTGFuZ3VhZ2VgL2FuIGFwcHJvcHJpYXRlIHZhbHVlIHRvXG4gIC8vIHJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICBpZiAoIXJlcXVlc3QuaGVhZGVyc0xpc3QuY29udGFpbnMoJ2FjY2VwdC1sYW5ndWFnZScsIHRydWUpKSB7XG4gICAgcmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ2FjY2VwdC1sYW5ndWFnZScsICcqJywgdHJ1ZSlcbiAgfVxuXG4gIC8vIDE0LiBJZiByZXF1ZXN04oCZcyBwcmlvcml0eSBpcyBudWxsLCB0aGVuIHVzZSByZXF1ZXN04oCZcyBpbml0aWF0b3IgYW5kXG4gIC8vIGRlc3RpbmF0aW9uIGFwcHJvcHJpYXRlbHkgaW4gc2V0dGluZyByZXF1ZXN04oCZcyBwcmlvcml0eSB0byBhXG4gIC8vIHVzZXItYWdlbnQtZGVmaW5lZCBvYmplY3QuXG4gIGlmIChyZXF1ZXN0LnByaW9yaXR5ID09PSBudWxsKSB7XG4gICAgLy8gVE9ET1xuICB9XG5cbiAgLy8gMTUuIElmIHJlcXVlc3QgaXMgYSBzdWJyZXNvdXJjZSByZXF1ZXN0LCB0aGVuOlxuICBpZiAoc3VicmVzb3VyY2VTZXQuaGFzKHJlcXVlc3QuZGVzdGluYXRpb24pKSB7XG4gICAgLy8gVE9ET1xuICB9XG5cbiAgLy8gMTYuIFJ1biBtYWluIGZldGNoIGdpdmVuIGZldGNoUGFyYW1zLlxuICBtYWluRmV0Y2goZmV0Y2hQYXJhbXMpXG4gICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLnRlcm1pbmF0ZShlcnIpXG4gICAgfSlcblxuICAvLyAxNy4gUmV0dXJuIGZldGNoUGFyYW0ncyBjb250cm9sbGVyXG4gIHJldHVybiBmZXRjaFBhcmFtcy5jb250cm9sbGVyXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LW1haW4tZmV0Y2hcbmFzeW5jIGZ1bmN0aW9uIG1haW5GZXRjaCAoZmV0Y2hQYXJhbXMsIHJlY3Vyc2l2ZSA9IGZhbHNlKSB7XG4gIC8vIDEuIExldCByZXF1ZXN0IGJlIGZldGNoUGFyYW1z4oCZcyByZXF1ZXN0LlxuICBjb25zdCByZXF1ZXN0ID0gZmV0Y2hQYXJhbXMucmVxdWVzdFxuXG4gIC8vIDIuIExldCByZXNwb25zZSBiZSBudWxsLlxuICBsZXQgcmVzcG9uc2UgPSBudWxsXG5cbiAgLy8gMy4gSWYgcmVxdWVzdOKAmXMgbG9jYWwtVVJMcy1vbmx5IGZsYWcgaXMgc2V0IGFuZCByZXF1ZXN04oCZcyBjdXJyZW50IFVSTCBpc1xuICAvLyBub3QgbG9jYWwsIHRoZW4gc2V0IHJlc3BvbnNlIHRvIGEgbmV0d29yayBlcnJvci5cbiAgaWYgKHJlcXVlc3QubG9jYWxVUkxzT25seSAmJiAhdXJsSXNMb2NhbChyZXF1ZXN0Q3VycmVudFVSTChyZXF1ZXN0KSkpIHtcbiAgICByZXNwb25zZSA9IG1ha2VOZXR3b3JrRXJyb3IoJ2xvY2FsIFVSTHMgb25seScpXG4gIH1cblxuICAvLyA0LiBSdW4gcmVwb3J0IENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IHZpb2xhdGlvbnMgZm9yIHJlcXVlc3QuXG4gIC8vIFRPRE9cblxuICAvLyA1LiBVcGdyYWRlIHJlcXVlc3QgdG8gYSBwb3RlbnRpYWxseSB0cnVzdHdvcnRoeSBVUkwsIGlmIGFwcHJvcHJpYXRlLlxuICB0cnlVcGdyYWRlUmVxdWVzdFRvQVBvdGVudGlhbGx5VHJ1c3R3b3J0aHlVUkwocmVxdWVzdClcblxuICAvLyA2LiBJZiBzaG91bGQgcmVxdWVzdCBiZSBibG9ja2VkIGR1ZSB0byBhIGJhZCBwb3J0LCBzaG91bGQgZmV0Y2hpbmcgcmVxdWVzdFxuICAvLyBiZSBibG9ja2VkIGFzIG1peGVkIGNvbnRlbnQsIG9yIHNob3VsZCByZXF1ZXN0IGJlIGJsb2NrZWQgYnkgQ29udGVudFxuICAvLyBTZWN1cml0eSBQb2xpY3kgcmV0dXJucyBibG9ja2VkLCB0aGVuIHNldCByZXNwb25zZSB0byBhIG5ldHdvcmsgZXJyb3IuXG4gIGlmIChyZXF1ZXN0QmFkUG9ydChyZXF1ZXN0KSA9PT0gJ2Jsb2NrZWQnKSB7XG4gICAgcmVzcG9uc2UgPSBtYWtlTmV0d29ya0Vycm9yKCdiYWQgcG9ydCcpXG4gIH1cbiAgLy8gVE9ETzogc2hvdWxkIGZldGNoaW5nIHJlcXVlc3QgYmUgYmxvY2tlZCBhcyBtaXhlZCBjb250ZW50P1xuICAvLyBUT0RPOiBzaG91bGQgcmVxdWVzdCBiZSBibG9ja2VkIGJ5IENvbnRlbnQgU2VjdXJpdHkgUG9saWN5P1xuXG4gIC8vIDcuIElmIHJlcXVlc3TigJlzIHJlZmVycmVyIHBvbGljeSBpcyB0aGUgZW1wdHkgc3RyaW5nLCB0aGVuIHNldCByZXF1ZXN04oCZc1xuICAvLyByZWZlcnJlciBwb2xpY3kgdG8gcmVxdWVzdOKAmXMgcG9saWN5IGNvbnRhaW5lcuKAmXMgcmVmZXJyZXIgcG9saWN5LlxuICBpZiAocmVxdWVzdC5yZWZlcnJlclBvbGljeSA9PT0gJycpIHtcbiAgICByZXF1ZXN0LnJlZmVycmVyUG9saWN5ID0gcmVxdWVzdC5wb2xpY3lDb250YWluZXIucmVmZXJyZXJQb2xpY3lcbiAgfVxuXG4gIC8vIDguIElmIHJlcXVlc3TigJlzIHJlZmVycmVyIGlzIG5vdCBcIm5vLXJlZmVycmVyXCIsIHRoZW4gc2V0IHJlcXVlc3TigJlzXG4gIC8vIHJlZmVycmVyIHRvIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgZGV0ZXJtaW5lIHJlcXVlc3TigJlzIHJlZmVycmVyLlxuICBpZiAocmVxdWVzdC5yZWZlcnJlciAhPT0gJ25vLXJlZmVycmVyJykge1xuICAgIHJlcXVlc3QucmVmZXJyZXIgPSBkZXRlcm1pbmVSZXF1ZXN0c1JlZmVycmVyKHJlcXVlc3QpXG4gIH1cblxuICAvLyA5LiBTZXQgcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIHNjaGVtZSB0byBcImh0dHBzXCIgaWYgYWxsIG9mIHRoZSBmb2xsb3dpbmdcbiAgLy8gY29uZGl0aW9ucyBhcmUgdHJ1ZTpcbiAgLy8gLSByZXF1ZXN04oCZcyBjdXJyZW50IFVSTOKAmXMgc2NoZW1lIGlzIFwiaHR0cFwiXG4gIC8vIC0gcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIGhvc3QgaXMgYSBkb21haW5cbiAgLy8gLSBNYXRjaGluZyByZXF1ZXN04oCZcyBjdXJyZW50IFVSTOKAmXMgaG9zdCBwZXIgS25vd24gSFNUUyBIb3N0IERvbWFpbiBOYW1lXG4gIC8vICAgTWF0Y2hpbmcgcmVzdWx0cyBpbiBlaXRoZXIgYSBzdXBlcmRvbWFpbiBtYXRjaCB3aXRoIGFuIGFzc2VydGVkXG4gIC8vICAgaW5jbHVkZVN1YkRvbWFpbnMgZGlyZWN0aXZlIG9yIGEgY29uZ3J1ZW50IG1hdGNoICh3aXRoIG9yIHdpdGhvdXQgYW5cbiAgLy8gICBhc3NlcnRlZCBpbmNsdWRlU3ViRG9tYWlucyBkaXJlY3RpdmUpLiBbSFNUU11cbiAgLy8gVE9ET1xuXG4gIC8vIDEwLiBJZiByZWN1cnNpdmUgaXMgZmFsc2UsIHRoZW4gcnVuIHRoZSByZW1haW5pbmcgc3RlcHMgaW4gcGFyYWxsZWwuXG4gIC8vIFRPRE9cblxuICAvLyAxMS4gSWYgcmVzcG9uc2UgaXMgbnVsbCwgdGhlbiBzZXQgcmVzcG9uc2UgdG8gdGhlIHJlc3VsdCBvZiBydW5uaW5nXG4gIC8vIHRoZSBzdGVwcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaXJzdCBtYXRjaGluZyBzdGF0ZW1lbnQ6XG4gIGlmIChyZXNwb25zZSA9PT0gbnVsbCkge1xuICAgIHJlc3BvbnNlID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRVUkwgPSByZXF1ZXN0Q3VycmVudFVSTChyZXF1ZXN0KVxuXG4gICAgICBpZiAoXG4gICAgICAgIC8vIC0gcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIG9yaWdpbiBpcyBzYW1lIG9yaWdpbiB3aXRoIHJlcXVlc3TigJlzIG9yaWdpbixcbiAgICAgICAgLy8gICBhbmQgcmVxdWVzdOKAmXMgcmVzcG9uc2UgdGFpbnRpbmcgaXMgXCJiYXNpY1wiXG4gICAgICAgIChzYW1lT3JpZ2luKGN1cnJlbnRVUkwsIHJlcXVlc3QudXJsKSAmJiByZXF1ZXN0LnJlc3BvbnNlVGFpbnRpbmcgPT09ICdiYXNpYycpIHx8XG4gICAgICAgIC8vIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBzY2hlbWUgaXMgXCJkYXRhXCJcbiAgICAgICAgKGN1cnJlbnRVUkwucHJvdG9jb2wgPT09ICdkYXRhOicpIHx8XG4gICAgICAgIC8vIC0gcmVxdWVzdOKAmXMgbW9kZSBpcyBcIm5hdmlnYXRlXCIgb3IgXCJ3ZWJzb2NrZXRcIlxuICAgICAgICAocmVxdWVzdC5tb2RlID09PSAnbmF2aWdhdGUnIHx8IHJlcXVlc3QubW9kZSA9PT0gJ3dlYnNvY2tldCcpXG4gICAgICApIHtcbiAgICAgICAgLy8gMS4gU2V0IHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nIHRvIFwiYmFzaWNcIi5cbiAgICAgICAgcmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID0gJ2Jhc2ljJ1xuXG4gICAgICAgIC8vIDIuIFJldHVybiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgc2NoZW1lIGZldGNoIGdpdmVuIGZldGNoUGFyYW1zLlxuICAgICAgICByZXR1cm4gYXdhaXQgc2NoZW1lRmV0Y2goZmV0Y2hQYXJhbXMpXG4gICAgICB9XG5cbiAgICAgIC8vIHJlcXVlc3TigJlzIG1vZGUgaXMgXCJzYW1lLW9yaWdpblwiXG4gICAgICBpZiAocmVxdWVzdC5tb2RlID09PSAnc2FtZS1vcmlnaW4nKSB7XG4gICAgICAgIC8vIDEuIFJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG4gICAgICAgIHJldHVybiBtYWtlTmV0d29ya0Vycm9yKCdyZXF1ZXN0IG1vZGUgY2Fubm90IGJlIFwic2FtZS1vcmlnaW5cIicpXG4gICAgICB9XG5cbiAgICAgIC8vIHJlcXVlc3TigJlzIG1vZGUgaXMgXCJuby1jb3JzXCJcbiAgICAgIGlmIChyZXF1ZXN0Lm1vZGUgPT09ICduby1jb3JzJykge1xuICAgICAgICAvLyAxLiBJZiByZXF1ZXN04oCZcyByZWRpcmVjdCBtb2RlIGlzIG5vdCBcImZvbGxvd1wiLCB0aGVuIHJldHVybiBhIG5ldHdvcmtcbiAgICAgICAgLy8gZXJyb3IuXG4gICAgICAgIGlmIChyZXF1ZXN0LnJlZGlyZWN0ICE9PSAnZm9sbG93Jykge1xuICAgICAgICAgIHJldHVybiBtYWtlTmV0d29ya0Vycm9yKFxuICAgICAgICAgICAgJ3JlZGlyZWN0IG1vZGUgY2Fubm90IGJlIFwiZm9sbG93XCIgZm9yIFwibm8tY29yc1wiIHJlcXVlc3QnXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4gU2V0IHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nIHRvIFwib3BhcXVlXCIuXG4gICAgICAgIHJlcXVlc3QucmVzcG9uc2VUYWludGluZyA9ICdvcGFxdWUnXG5cbiAgICAgICAgLy8gMy4gUmV0dXJuIHRoZSByZXN1bHQgb2YgcnVubmluZyBzY2hlbWUgZmV0Y2ggZ2l2ZW4gZmV0Y2hQYXJhbXMuXG4gICAgICAgIHJldHVybiBhd2FpdCBzY2hlbWVGZXRjaChmZXRjaFBhcmFtcylcbiAgICAgIH1cblxuICAgICAgLy8gcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIHNjaGVtZSBpcyBub3QgYW4gSFRUUChTKSBzY2hlbWVcbiAgICAgIGlmICghdXJsSXNIdHRwSHR0cHNTY2hlbWUocmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdCkpKSB7XG4gICAgICAgIC8vIFJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG4gICAgICAgIHJldHVybiBtYWtlTmV0d29ya0Vycm9yKCdVUkwgc2NoZW1lIG11c3QgYmUgYSBIVFRQKFMpIHNjaGVtZScpXG4gICAgICB9XG5cbiAgICAgIC8vIC0gcmVxdWVzdOKAmXMgdXNlLUNPUlMtcHJlZmxpZ2h0IGZsYWcgaXMgc2V0XG4gICAgICAvLyAtIHJlcXVlc3TigJlzIHVuc2FmZS1yZXF1ZXN0IGZsYWcgaXMgc2V0IGFuZCBlaXRoZXIgcmVxdWVzdOKAmXMgbWV0aG9kIGlzXG4gICAgICAvLyAgIG5vdCBhIENPUlMtc2FmZWxpc3RlZCBtZXRob2Qgb3IgQ09SUy11bnNhZmUgcmVxdWVzdC1oZWFkZXIgbmFtZXMgd2l0aFxuICAgICAgLy8gICByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdCBpcyBub3QgZW1wdHlcbiAgICAgIC8vICAgIDEuIFNldCByZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZyB0byBcImNvcnNcIi5cbiAgICAgIC8vICAgIDIuIExldCBjb3JzV2l0aFByZWZsaWdodFJlc3BvbnNlIGJlIHRoZSByZXN1bHQgb2YgcnVubmluZyBIVFRQIGZldGNoXG4gICAgICAvLyAgICBnaXZlbiBmZXRjaFBhcmFtcyBhbmQgdHJ1ZS5cbiAgICAgIC8vICAgIDMuIElmIGNvcnNXaXRoUHJlZmxpZ2h0UmVzcG9uc2UgaXMgYSBuZXR3b3JrIGVycm9yLCB0aGVuIGNsZWFyIGNhY2hlXG4gICAgICAvLyAgICBlbnRyaWVzIHVzaW5nIHJlcXVlc3QuXG4gICAgICAvLyAgICA0LiBSZXR1cm4gY29yc1dpdGhQcmVmbGlnaHRSZXNwb25zZS5cbiAgICAgIC8vIFRPRE9cblxuICAgICAgLy8gT3RoZXJ3aXNlXG4gICAgICAvLyAgICAxLiBTZXQgcmVxdWVzdOKAmXMgcmVzcG9uc2UgdGFpbnRpbmcgdG8gXCJjb3JzXCIuXG4gICAgICByZXF1ZXN0LnJlc3BvbnNlVGFpbnRpbmcgPSAnY29ycydcblxuICAgICAgLy8gICAgMi4gUmV0dXJuIHRoZSByZXN1bHQgb2YgcnVubmluZyBIVFRQIGZldGNoIGdpdmVuIGZldGNoUGFyYW1zLlxuICAgICAgcmV0dXJuIGF3YWl0IGh0dHBGZXRjaChmZXRjaFBhcmFtcylcbiAgICB9KSgpXG4gIH1cblxuICAvLyAxMi4gSWYgcmVjdXJzaXZlIGlzIHRydWUsIHRoZW4gcmV0dXJuIHJlc3BvbnNlLlxuICBpZiAocmVjdXJzaXZlKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlXG4gIH1cblxuICAvLyAxMy4gSWYgcmVzcG9uc2UgaXMgbm90IGEgbmV0d29yayBlcnJvciBhbmQgcmVzcG9uc2UgaXMgbm90IGEgZmlsdGVyZWRcbiAgLy8gcmVzcG9uc2UsIHRoZW46XG4gIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDAgJiYgIXJlc3BvbnNlLmludGVybmFsUmVzcG9uc2UpIHtcbiAgICAvLyBJZiByZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZyBpcyBcImNvcnNcIiwgdGhlbjpcbiAgICBpZiAocmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnY29ycycpIHtcbiAgICAgIC8vIDEuIExldCBoZWFkZXJOYW1lcyBiZSB0aGUgcmVzdWx0IG9mIGV4dHJhY3RpbmcgaGVhZGVyIGxpc3QgdmFsdWVzXG4gICAgICAvLyBnaXZlbiBgQWNjZXNzLUNvbnRyb2wtRXhwb3NlLUhlYWRlcnNgIGFuZCByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3QuXG4gICAgICAvLyBUT0RPXG4gICAgICAvLyAyLiBJZiByZXF1ZXN04oCZcyBjcmVkZW50aWFscyBtb2RlIGlzIG5vdCBcImluY2x1ZGVcIiBhbmQgaGVhZGVyTmFtZXNcbiAgICAgIC8vIGNvbnRhaW5zIGAqYCwgdGhlbiBzZXQgcmVzcG9uc2XigJlzIENPUlMtZXhwb3NlZCBoZWFkZXItbmFtZSBsaXN0IHRvXG4gICAgICAvLyBhbGwgdW5pcXVlIGhlYWRlciBuYW1lcyBpbiByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3QuXG4gICAgICAvLyBUT0RPXG4gICAgICAvLyAzLiBPdGhlcndpc2UsIGlmIGhlYWRlck5hbWVzIGlzIG5vdCBudWxsIG9yIGZhaWx1cmUsIHRoZW4gc2V0XG4gICAgICAvLyByZXNwb25zZeKAmXMgQ09SUy1leHBvc2VkIGhlYWRlci1uYW1lIGxpc3QgdG8gaGVhZGVyTmFtZXMuXG4gICAgICAvLyBUT0RPXG4gICAgfVxuXG4gICAgLy8gU2V0IHJlc3BvbnNlIHRvIHRoZSBmb2xsb3dpbmcgZmlsdGVyZWQgcmVzcG9uc2Ugd2l0aCByZXNwb25zZSBhcyBpdHNcbiAgICAvLyBpbnRlcm5hbCByZXNwb25zZSwgZGVwZW5kaW5nIG9uIHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nOlxuICAgIGlmIChyZXF1ZXN0LnJlc3BvbnNlVGFpbnRpbmcgPT09ICdiYXNpYycpIHtcbiAgICAgIHJlc3BvbnNlID0gZmlsdGVyUmVzcG9uc2UocmVzcG9uc2UsICdiYXNpYycpXG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0LnJlc3BvbnNlVGFpbnRpbmcgPT09ICdjb3JzJykge1xuICAgICAgcmVzcG9uc2UgPSBmaWx0ZXJSZXNwb25zZShyZXNwb25zZSwgJ2NvcnMnKVxuICAgIH0gZWxzZSBpZiAocmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnb3BhcXVlJykge1xuICAgICAgcmVzcG9uc2UgPSBmaWx0ZXJSZXNwb25zZShyZXNwb25zZSwgJ29wYXF1ZScpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChmYWxzZSlcbiAgICB9XG4gIH1cblxuICAvLyAxNC4gTGV0IGludGVybmFsUmVzcG9uc2UgYmUgcmVzcG9uc2UsIGlmIHJlc3BvbnNlIGlzIGEgbmV0d29yayBlcnJvcixcbiAgLy8gYW5kIHJlc3BvbnNl4oCZcyBpbnRlcm5hbCByZXNwb25zZSBvdGhlcndpc2UuXG4gIGxldCBpbnRlcm5hbFJlc3BvbnNlID1cbiAgICByZXNwb25zZS5zdGF0dXMgPT09IDAgPyByZXNwb25zZSA6IHJlc3BvbnNlLmludGVybmFsUmVzcG9uc2VcblxuICAvLyAxNS4gSWYgaW50ZXJuYWxSZXNwb25zZeKAmXMgVVJMIGxpc3QgaXMgZW1wdHksIHRoZW4gc2V0IGl0IHRvIGEgY2xvbmUgb2ZcbiAgLy8gcmVxdWVzdOKAmXMgVVJMIGxpc3QuXG4gIGlmIChpbnRlcm5hbFJlc3BvbnNlLnVybExpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgaW50ZXJuYWxSZXNwb25zZS51cmxMaXN0LnB1c2goLi4ucmVxdWVzdC51cmxMaXN0KVxuICB9XG5cbiAgLy8gMTYuIElmIHJlcXVlc3TigJlzIHRpbWluZyBhbGxvdyBmYWlsZWQgZmxhZyBpcyB1bnNldCwgdGhlbiBzZXRcbiAgLy8gaW50ZXJuYWxSZXNwb25zZeKAmXMgdGltaW5nIGFsbG93IHBhc3NlZCBmbGFnLlxuICBpZiAoIXJlcXVlc3QudGltaW5nQWxsb3dGYWlsZWQpIHtcbiAgICByZXNwb25zZS50aW1pbmdBbGxvd1Bhc3NlZCA9IHRydWVcbiAgfVxuXG4gIC8vIDE3LiBJZiByZXNwb25zZSBpcyBub3QgYSBuZXR3b3JrIGVycm9yIGFuZCBhbnkgb2YgdGhlIGZvbGxvd2luZyByZXR1cm5zXG4gIC8vIGJsb2NrZWRcbiAgLy8gLSBzaG91bGQgaW50ZXJuYWxSZXNwb25zZSB0byByZXF1ZXN0IGJlIGJsb2NrZWQgYXMgbWl4ZWQgY29udGVudFxuICAvLyAtIHNob3VsZCBpbnRlcm5hbFJlc3BvbnNlIHRvIHJlcXVlc3QgYmUgYmxvY2tlZCBieSBDb250ZW50IFNlY3VyaXR5IFBvbGljeVxuICAvLyAtIHNob3VsZCBpbnRlcm5hbFJlc3BvbnNlIHRvIHJlcXVlc3QgYmUgYmxvY2tlZCBkdWUgdG8gaXRzIE1JTUUgdHlwZVxuICAvLyAtIHNob3VsZCBpbnRlcm5hbFJlc3BvbnNlIHRvIHJlcXVlc3QgYmUgYmxvY2tlZCBkdWUgdG8gbm9zbmlmZlxuICAvLyBUT0RPXG5cbiAgLy8gMTguIElmIHJlc3BvbnNl4oCZcyB0eXBlIGlzIFwib3BhcXVlXCIsIGludGVybmFsUmVzcG9uc2XigJlzIHN0YXR1cyBpcyAyMDYsXG4gIC8vIGludGVybmFsUmVzcG9uc2XigJlzIHJhbmdlLXJlcXVlc3RlZCBmbGFnIGlzIHNldCwgYW5kIHJlcXVlc3TigJlzIGhlYWRlclxuICAvLyBsaXN0IGRvZXMgbm90IGNvbnRhaW4gYFJhbmdlYCwgdGhlbiBzZXQgcmVzcG9uc2UgYW5kIGludGVybmFsUmVzcG9uc2VcbiAgLy8gdG8gYSBuZXR3b3JrIGVycm9yLlxuICBpZiAoXG4gICAgcmVzcG9uc2UudHlwZSA9PT0gJ29wYXF1ZScgJiZcbiAgICBpbnRlcm5hbFJlc3BvbnNlLnN0YXR1cyA9PT0gMjA2ICYmXG4gICAgaW50ZXJuYWxSZXNwb25zZS5yYW5nZVJlcXVlc3RlZCAmJlxuICAgICFyZXF1ZXN0LmhlYWRlcnMuY29udGFpbnMoJ3JhbmdlJywgdHJ1ZSlcbiAgKSB7XG4gICAgcmVzcG9uc2UgPSBpbnRlcm5hbFJlc3BvbnNlID0gbWFrZU5ldHdvcmtFcnJvcigpXG4gIH1cblxuICAvLyAxOS4gSWYgcmVzcG9uc2UgaXMgbm90IGEgbmV0d29yayBlcnJvciBhbmQgZWl0aGVyIHJlcXVlc3TigJlzIG1ldGhvZCBpc1xuICAvLyBgSEVBRGAgb3IgYENPTk5FQ1RgLCBvciBpbnRlcm5hbFJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgYSBudWxsIGJvZHkgc3RhdHVzLFxuICAvLyBzZXQgaW50ZXJuYWxSZXNwb25zZeKAmXMgYm9keSB0byBudWxsIGFuZCBkaXNyZWdhcmQgYW55IGVucXVldWluZyB0b3dhcmRcbiAgLy8gaXQgKGlmIGFueSkuXG4gIGlmIChcbiAgICByZXNwb25zZS5zdGF0dXMgIT09IDAgJiZcbiAgICAocmVxdWVzdC5tZXRob2QgPT09ICdIRUFEJyB8fFxuICAgICAgcmVxdWVzdC5tZXRob2QgPT09ICdDT05ORUNUJyB8fFxuICAgICAgbnVsbEJvZHlTdGF0dXMuaW5jbHVkZXMoaW50ZXJuYWxSZXNwb25zZS5zdGF0dXMpKVxuICApIHtcbiAgICBpbnRlcm5hbFJlc3BvbnNlLmJvZHkgPSBudWxsXG4gICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5kdW1wID0gdHJ1ZVxuICB9XG5cbiAgLy8gMjAuIElmIHJlcXVlc3TigJlzIGludGVncml0eSBtZXRhZGF0YSBpcyBub3QgdGhlIGVtcHR5IHN0cmluZywgdGhlbjpcbiAgaWYgKHJlcXVlc3QuaW50ZWdyaXR5KSB7XG4gICAgLy8gMS4gTGV0IHByb2Nlc3NCb2R5RXJyb3IgYmUgdGhpcyBzdGVwOiBydW4gZmV0Y2ggZmluYWxlIGdpdmVuIGZldGNoUGFyYW1zXG4gICAgLy8gYW5kIGEgbmV0d29yayBlcnJvci5cbiAgICBjb25zdCBwcm9jZXNzQm9keUVycm9yID0gKHJlYXNvbikgPT5cbiAgICAgIGZldGNoRmluYWxlKGZldGNoUGFyYW1zLCBtYWtlTmV0d29ya0Vycm9yKHJlYXNvbikpXG5cbiAgICAvLyAyLiBJZiByZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZyBpcyBcIm9wYXF1ZVwiLCBvciByZXNwb25zZeKAmXMgYm9keSBpcyBudWxsLFxuICAgIC8vIHRoZW4gcnVuIHByb2Nlc3NCb2R5RXJyb3IgYW5kIGFib3J0IHRoZXNlIHN0ZXBzLlxuICAgIGlmIChyZXF1ZXN0LnJlc3BvbnNlVGFpbnRpbmcgPT09ICdvcGFxdWUnIHx8IHJlc3BvbnNlLmJvZHkgPT0gbnVsbCkge1xuICAgICAgcHJvY2Vzc0JvZHlFcnJvcihyZXNwb25zZS5lcnJvcilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIDMuIExldCBwcm9jZXNzQm9keSBnaXZlbiBieXRlcyBiZSB0aGVzZSBzdGVwczpcbiAgICBjb25zdCBwcm9jZXNzQm9keSA9IChieXRlcykgPT4ge1xuICAgICAgLy8gMS4gSWYgYnl0ZXMgZG8gbm90IG1hdGNoIHJlcXVlc3TigJlzIGludGVncml0eSBtZXRhZGF0YSxcbiAgICAgIC8vIHRoZW4gcnVuIHByb2Nlc3NCb2R5RXJyb3IgYW5kIGFib3J0IHRoZXNlIHN0ZXBzLiBbU1JJXVxuICAgICAgaWYgKCFieXRlc01hdGNoKGJ5dGVzLCByZXF1ZXN0LmludGVncml0eSkpIHtcbiAgICAgICAgcHJvY2Vzc0JvZHlFcnJvcignaW50ZWdyaXR5IG1pc21hdGNoJylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIFNldCByZXNwb25zZeKAmXMgYm9keSB0byBieXRlcyBhcyBhIGJvZHkuXG4gICAgICByZXNwb25zZS5ib2R5ID0gc2FmZWx5RXh0cmFjdEJvZHkoYnl0ZXMpWzBdXG5cbiAgICAgIC8vIDMuIFJ1biBmZXRjaCBmaW5hbGUgZ2l2ZW4gZmV0Y2hQYXJhbXMgYW5kIHJlc3BvbnNlLlxuICAgICAgZmV0Y2hGaW5hbGUoZmV0Y2hQYXJhbXMsIHJlc3BvbnNlKVxuICAgIH1cblxuICAgIC8vIDQuIEZ1bGx5IHJlYWQgcmVzcG9uc2XigJlzIGJvZHkgZ2l2ZW4gcHJvY2Vzc0JvZHkgYW5kIHByb2Nlc3NCb2R5RXJyb3IuXG4gICAgYXdhaXQgZnVsbHlSZWFkQm9keShyZXNwb25zZS5ib2R5LCBwcm9jZXNzQm9keSwgcHJvY2Vzc0JvZHlFcnJvcilcbiAgfSBlbHNlIHtcbiAgICAvLyAyMS4gT3RoZXJ3aXNlLCBydW4gZmV0Y2ggZmluYWxlIGdpdmVuIGZldGNoUGFyYW1zIGFuZCByZXNwb25zZS5cbiAgICBmZXRjaEZpbmFsZShmZXRjaFBhcmFtcywgcmVzcG9uc2UpXG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtc2NoZW1lLWZldGNoXG4vLyBnaXZlbiBhIGZldGNoIHBhcmFtcyBmZXRjaFBhcmFtc1xuZnVuY3Rpb24gc2NoZW1lRmV0Y2ggKGZldGNoUGFyYW1zKSB7XG4gIC8vIE5vdGU6IHNpbmNlIHRoZSBjb25uZWN0aW9uIGlzIGRlc3Ryb3llZCBvbiByZWRpcmVjdCwgd2hpY2ggc2V0cyBmZXRjaFBhcmFtcyB0byBhXG4gIC8vIGNhbmNlbGxlZCBzdGF0ZSwgd2UgZG8gbm90IHdhbnQgdGhpcyBjb25kaXRpb24gdG8gdHJpZ2dlciAqdW5sZXNzKiB0aGVyZSBoYXZlIGJlZW5cbiAgLy8gbm8gcmVkaXJlY3RzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzE3NzZcbiAgLy8gMS4gSWYgZmV0Y2hQYXJhbXMgaXMgY2FuY2VsZWQsIHRoZW4gcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBuZXR3b3JrIGVycm9yIGZvciBmZXRjaFBhcmFtcy5cbiAgaWYgKGlzQ2FuY2VsbGVkKGZldGNoUGFyYW1zKSAmJiBmZXRjaFBhcmFtcy5yZXF1ZXN0LnJlZGlyZWN0Q291bnQgPT09IDApIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VBcHByb3ByaWF0ZU5ldHdvcmtFcnJvcihmZXRjaFBhcmFtcykpXG4gIH1cblxuICAvLyAyLiBMZXQgcmVxdWVzdCBiZSBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdC5cbiAgY29uc3QgeyByZXF1ZXN0IH0gPSBmZXRjaFBhcmFtc1xuXG4gIGNvbnN0IHsgcHJvdG9jb2w6IHNjaGVtZSB9ID0gcmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdClcblxuICAvLyAzLiBTd2l0Y2ggb24gcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIHNjaGVtZSBhbmQgcnVuIHRoZSBhc3NvY2lhdGVkIHN0ZXBzOlxuICBzd2l0Y2ggKHNjaGVtZSkge1xuICAgIGNhc2UgJ2Fib3V0Oic6IHtcbiAgICAgIC8vIElmIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBwYXRoIGlzIHRoZSBzdHJpbmcgXCJibGFua1wiLCB0aGVuIHJldHVybiBhIG5ldyByZXNwb25zZVxuICAgICAgLy8gd2hvc2Ugc3RhdHVzIG1lc3NhZ2UgaXMgYE9LYCwgaGVhZGVyIGxpc3QgaXMgwqsgKGBDb250ZW50LVR5cGVgLCBgdGV4dC9odG1sO2NoYXJzZXQ9dXRmLThgKSDCuyxcbiAgICAgIC8vIGFuZCBib2R5IGlzIHRoZSBlbXB0eSBieXRlIHNlcXVlbmNlIGFzIGEgYm9keS5cblxuICAgICAgLy8gT3RoZXJ3aXNlLCByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlTmV0d29ya0Vycm9yKCdhYm91dCBzY2hlbWUgaXMgbm90IHN1cHBvcnRlZCcpKVxuICAgIH1cbiAgICBjYXNlICdibG9iOic6IHtcbiAgICAgIGlmICghcmVzb2x2ZU9iamVjdFVSTCkge1xuICAgICAgICByZXNvbHZlT2JqZWN0VVJMID0gcmVxdWlyZSgnbm9kZTpidWZmZXInKS5yZXNvbHZlT2JqZWN0VVJMXG4gICAgICB9XG5cbiAgICAgIC8vIDEuIExldCBibG9iVVJMRW50cnkgYmUgcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIGJsb2IgVVJMIGVudHJ5LlxuICAgICAgY29uc3QgYmxvYlVSTEVudHJ5ID0gcmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdClcblxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3dlYi1wbGF0Zm9ybS10ZXN0cy93cHQvYmxvYi83YjBlYmFjY2M2MmI1NjZhMTk2NTM5NmU1YmU3YmIyYmMwNmY4NDFmL0ZpbGVBUEkvdXJsL3Jlc291cmNlcy9mZXRjaC10ZXN0cy5qcyNMNTItTDU2XG4gICAgICAvLyBCdWZmZXIucmVzb2x2ZU9iamVjdFVSTCBkb2VzIG5vdCBpZ25vcmUgVVJMIHF1ZXJpZXMuXG4gICAgICBpZiAoYmxvYlVSTEVudHJ5LnNlYXJjaC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlTmV0d29ya0Vycm9yKCdOZXR3b3JrRXJyb3Igd2hlbiBhdHRlbXB0aW5nIHRvIGZldGNoIHJlc291cmNlLicpKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBibG9iID0gcmVzb2x2ZU9iamVjdFVSTChibG9iVVJMRW50cnkudG9TdHJpbmcoKSlcblxuICAgICAgLy8gMi4gSWYgcmVxdWVzdOKAmXMgbWV0aG9kIGlzIG5vdCBgR0VUYCwgYmxvYlVSTEVudHJ5IGlzIG51bGwsIG9yIGJsb2JVUkxFbnRyeeKAmXNcbiAgICAgIC8vICAgIG9iamVjdCBpcyBub3QgYSBCbG9iIG9iamVjdCwgdGhlbiByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICAgICAgaWYgKHJlcXVlc3QubWV0aG9kICE9PSAnR0VUJyB8fCAhaXNCbG9iTGlrZShibG9iKSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VOZXR3b3JrRXJyb3IoJ2ludmFsaWQgbWV0aG9kJykpXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIExldCBibG9iIGJlIGJsb2JVUkxFbnRyeeKAmXMgb2JqZWN0LlxuICAgICAgLy8gTm90ZTogZG9uZSBhYm92ZVxuXG4gICAgICAvLyA0LiBMZXQgcmVzcG9uc2UgYmUgYSBuZXcgcmVzcG9uc2UuXG4gICAgICBjb25zdCByZXNwb25zZSA9IG1ha2VSZXNwb25zZSgpXG5cbiAgICAgIC8vIDUuIExldCBmdWxsTGVuZ3RoIGJlIGJsb2LigJlzIHNpemUuXG4gICAgICBjb25zdCBmdWxsTGVuZ3RoID0gYmxvYi5zaXplXG5cbiAgICAgIC8vIDYuIExldCBzZXJpYWxpemVkRnVsbExlbmd0aCBiZSBmdWxsTGVuZ3RoLCBzZXJpYWxpemVkIGFuZCBpc29tb3JwaGljIGVuY29kZWQuXG4gICAgICBjb25zdCBzZXJpYWxpemVkRnVsbExlbmd0aCA9IGlzb21vcnBoaWNFbmNvZGUoYCR7ZnVsbExlbmd0aH1gKVxuXG4gICAgICAvLyA3LiBMZXQgdHlwZSBiZSBibG9i4oCZcyB0eXBlLlxuICAgICAgY29uc3QgdHlwZSA9IGJsb2IudHlwZVxuXG4gICAgICAvLyA4LiBJZiByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdCBkb2VzIG5vdCBjb250YWluIGBSYW5nZWA6XG4gICAgICAvLyA5LiBPdGhlcndpc2U6XG4gICAgICBpZiAoIXJlcXVlc3QuaGVhZGVyc0xpc3QuY29udGFpbnMoJ3JhbmdlJywgdHJ1ZSkpIHtcbiAgICAgICAgLy8gMS4gTGV0IGJvZHlXaXRoVHlwZSBiZSB0aGUgcmVzdWx0IG9mIHNhZmVseSBleHRyYWN0aW5nIGJsb2IuXG4gICAgICAgIC8vIE5vdGU6IGluIHRoZSBGaWxlQVBJIGEgYmxvYiBcIm9iamVjdFwiIGlzIGEgQmxvYiAqb3IqIGEgTWVkaWFTb3VyY2UuXG4gICAgICAgIC8vIEluIG5vZGUsIHRoaXMgY2FuIG9ubHkgZXZlciBiZSBhIEJsb2IuIFRoZXJlZm9yZSB3ZSBjYW4gc2FmZWx5XG4gICAgICAgIC8vIHVzZSBleHRyYWN0Qm9keSBkaXJlY3RseS5cbiAgICAgICAgY29uc3QgYm9keVdpdGhUeXBlID0gZXh0cmFjdEJvZHkoYmxvYilcblxuICAgICAgICAvLyAyLiBTZXQgcmVzcG9uc2XigJlzIHN0YXR1cyBtZXNzYWdlIHRvIGBPS2AuXG4gICAgICAgIHJlc3BvbnNlLnN0YXR1c1RleHQgPSAnT0snXG5cbiAgICAgICAgLy8gMy4gU2V0IHJlc3BvbnNl4oCZcyBib2R5IHRvIGJvZHlXaXRoVHlwZeKAmXMgYm9keS5cbiAgICAgICAgcmVzcG9uc2UuYm9keSA9IGJvZHlXaXRoVHlwZVswXVxuXG4gICAgICAgIC8vIDQuIFNldCByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3QgdG8gwqsgKGBDb250ZW50LUxlbmd0aGAsIHNlcmlhbGl6ZWRGdWxsTGVuZ3RoKSwgKGBDb250ZW50LVR5cGVgLCB0eXBlKSDCuy5cbiAgICAgICAgcmVzcG9uc2UuaGVhZGVyc0xpc3Quc2V0KCdjb250ZW50LWxlbmd0aCcsIHNlcmlhbGl6ZWRGdWxsTGVuZ3RoLCB0cnVlKVxuICAgICAgICByZXNwb25zZS5oZWFkZXJzTGlzdC5zZXQoJ2NvbnRlbnQtdHlwZScsIHR5cGUsIHRydWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAxLiBTZXQgcmVzcG9uc2XigJlzIHJhbmdlLXJlcXVlc3RlZCBmbGFnLlxuICAgICAgICByZXNwb25zZS5yYW5nZVJlcXVlc3RlZCA9IHRydWVcblxuICAgICAgICAvLyAyLiBMZXQgcmFuZ2VIZWFkZXIgYmUgdGhlIHJlc3VsdCBvZiBnZXR0aW5nIGBSYW5nZWAgZnJvbSByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgICAgICAgY29uc3QgcmFuZ2VIZWFkZXIgPSByZXF1ZXN0LmhlYWRlcnNMaXN0LmdldCgncmFuZ2UnLCB0cnVlKVxuXG4gICAgICAgIC8vIDMuIExldCByYW5nZVZhbHVlIGJlIHRoZSByZXN1bHQgb2YgcGFyc2luZyBhIHNpbmdsZSByYW5nZSBoZWFkZXIgdmFsdWUgZ2l2ZW4gcmFuZ2VIZWFkZXIgYW5kIHRydWUuXG4gICAgICAgIGNvbnN0IHJhbmdlVmFsdWUgPSBzaW1wbGVSYW5nZUhlYWRlclZhbHVlKHJhbmdlSGVhZGVyLCB0cnVlKVxuXG4gICAgICAgIC8vIDQuIElmIHJhbmdlVmFsdWUgaXMgZmFpbHVyZSwgdGhlbiByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICAgICAgICBpZiAocmFuZ2VWYWx1ZSA9PT0gJ2ZhaWx1cmUnKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlTmV0d29ya0Vycm9yKCdmYWlsZWQgdG8gZmV0Y2ggdGhlIGRhdGEgVVJMJykpXG4gICAgICAgIH1cblxuICAgICAgICAvLyA1LiBMZXQgKHJhbmdlU3RhcnQsIHJhbmdlRW5kKSBiZSByYW5nZVZhbHVlLlxuICAgICAgICBsZXQgeyByYW5nZVN0YXJ0VmFsdWU6IHJhbmdlU3RhcnQsIHJhbmdlRW5kVmFsdWU6IHJhbmdlRW5kIH0gPSByYW5nZVZhbHVlXG5cbiAgICAgICAgLy8gNi4gSWYgcmFuZ2VTdGFydCBpcyBudWxsOlxuICAgICAgICAvLyA3LiBPdGhlcndpc2U6XG4gICAgICAgIGlmIChyYW5nZVN0YXJ0ID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gMS4gU2V0IHJhbmdlU3RhcnQgdG8gZnVsbExlbmd0aCDiiJIgcmFuZ2VFbmQuXG4gICAgICAgICAgcmFuZ2VTdGFydCA9IGZ1bGxMZW5ndGggLSByYW5nZUVuZFxuXG4gICAgICAgICAgLy8gMi4gU2V0IHJhbmdlRW5kIHRvIHJhbmdlU3RhcnQgKyByYW5nZUVuZCDiiJIgMS5cbiAgICAgICAgICByYW5nZUVuZCA9IHJhbmdlU3RhcnQgKyByYW5nZUVuZCAtIDFcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyAxLiBJZiByYW5nZVN0YXJ0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBmdWxsTGVuZ3RoLCB0aGVuIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG4gICAgICAgICAgaWYgKHJhbmdlU3RhcnQgPj0gZnVsbExlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlTmV0d29ya0Vycm9yKCdSYW5nZSBzdGFydCBpcyBncmVhdGVyIHRoYW4gdGhlIGJsb2JcXCdzIHNpemUuJykpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gMi4gSWYgcmFuZ2VFbmQgaXMgbnVsbCBvciByYW5nZUVuZCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gZnVsbExlbmd0aCwgdGhlbiBzZXRcbiAgICAgICAgICAvLyAgICByYW5nZUVuZCB0byBmdWxsTGVuZ3RoIOKIkiAxLlxuICAgICAgICAgIGlmIChyYW5nZUVuZCA9PT0gbnVsbCB8fCByYW5nZUVuZCA+PSBmdWxsTGVuZ3RoKSB7XG4gICAgICAgICAgICByYW5nZUVuZCA9IGZ1bGxMZW5ndGggLSAxXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gOC4gTGV0IHNsaWNlZEJsb2IgYmUgdGhlIHJlc3VsdCBvZiBpbnZva2luZyBzbGljZSBibG9iIGdpdmVuIGJsb2IsIHJhbmdlU3RhcnQsXG4gICAgICAgIC8vICAgIHJhbmdlRW5kICsgMSwgYW5kIHR5cGUuXG4gICAgICAgIGNvbnN0IHNsaWNlZEJsb2IgPSBibG9iLnNsaWNlKHJhbmdlU3RhcnQsIHJhbmdlRW5kLCB0eXBlKVxuXG4gICAgICAgIC8vIDkuIExldCBzbGljZWRCb2R5V2l0aFR5cGUgYmUgdGhlIHJlc3VsdCBvZiBzYWZlbHkgZXh0cmFjdGluZyBzbGljZWRCbG9iLlxuICAgICAgICAvLyBOb3RlOiBzYW1lIHJlYXNvbiBhcyBtZW50aW9uZWQgYWJvdmUgYXMgdG8gd2h5IHdlIHVzZSBleHRyYWN0Qm9keVxuICAgICAgICBjb25zdCBzbGljZWRCb2R5V2l0aFR5cGUgPSBleHRyYWN0Qm9keShzbGljZWRCbG9iKVxuXG4gICAgICAgIC8vIDEwLiBTZXQgcmVzcG9uc2XigJlzIGJvZHkgdG8gc2xpY2VkQm9keVdpdGhUeXBl4oCZcyBib2R5LlxuICAgICAgICByZXNwb25zZS5ib2R5ID0gc2xpY2VkQm9keVdpdGhUeXBlWzBdXG5cbiAgICAgICAgLy8gMTEuIExldCBzZXJpYWxpemVkU2xpY2VkTGVuZ3RoIGJlIHNsaWNlZEJsb2LigJlzIHNpemUsIHNlcmlhbGl6ZWQgYW5kIGlzb21vcnBoaWMgZW5jb2RlZC5cbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZFNsaWNlZExlbmd0aCA9IGlzb21vcnBoaWNFbmNvZGUoYCR7c2xpY2VkQmxvYi5zaXplfWApXG5cbiAgICAgICAgLy8gMTIuIExldCBjb250ZW50UmFuZ2UgYmUgdGhlIHJlc3VsdCBvZiBpbnZva2luZyBidWlsZCBhIGNvbnRlbnQgcmFuZ2UgZ2l2ZW4gcmFuZ2VTdGFydCxcbiAgICAgICAgLy8gICAgIHJhbmdlRW5kLCBhbmQgZnVsbExlbmd0aC5cbiAgICAgICAgY29uc3QgY29udGVudFJhbmdlID0gYnVpbGRDb250ZW50UmFuZ2UocmFuZ2VTdGFydCwgcmFuZ2VFbmQsIGZ1bGxMZW5ndGgpXG5cbiAgICAgICAgLy8gMTMuIFNldCByZXNwb25zZeKAmXMgc3RhdHVzIHRvIDIwNi5cbiAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID0gMjA2XG5cbiAgICAgICAgLy8gMTQuIFNldCByZXNwb25zZeKAmXMgc3RhdHVzIG1lc3NhZ2UgdG8gYFBhcnRpYWwgQ29udGVudGAuXG4gICAgICAgIHJlc3BvbnNlLnN0YXR1c1RleHQgPSAnUGFydGlhbCBDb250ZW50J1xuXG4gICAgICAgIC8vIDE1LiBTZXQgcmVzcG9uc2XigJlzIGhlYWRlciBsaXN0IHRvIMKrIChgQ29udGVudC1MZW5ndGhgLCBzZXJpYWxpemVkU2xpY2VkTGVuZ3RoKSxcbiAgICAgICAgLy8gICAgIChgQ29udGVudC1UeXBlYCwgdHlwZSksIChgQ29udGVudC1SYW5nZWAsIGNvbnRlbnRSYW5nZSkgwrsuXG4gICAgICAgIHJlc3BvbnNlLmhlYWRlcnNMaXN0LnNldCgnY29udGVudC1sZW5ndGgnLCBzZXJpYWxpemVkU2xpY2VkTGVuZ3RoLCB0cnVlKVxuICAgICAgICByZXNwb25zZS5oZWFkZXJzTGlzdC5zZXQoJ2NvbnRlbnQtdHlwZScsIHR5cGUsIHRydWUpXG4gICAgICAgIHJlc3BvbnNlLmhlYWRlcnNMaXN0LnNldCgnY29udGVudC1yYW5nZScsIGNvbnRlbnRSYW5nZSwgdHJ1ZSlcbiAgICAgIH1cblxuICAgICAgLy8gMTAuIFJldHVybiByZXNwb25zZS5cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2UpXG4gICAgfVxuICAgIGNhc2UgJ2RhdGE6Jzoge1xuICAgICAgLy8gMS4gTGV0IGRhdGFVUkxTdHJ1Y3QgYmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nIHRoZVxuICAgICAgLy8gICAgZGF0YTogVVJMIHByb2Nlc3NvciBvbiByZXF1ZXN04oCZcyBjdXJyZW50IFVSTC5cbiAgICAgIGNvbnN0IGN1cnJlbnRVUkwgPSByZXF1ZXN0Q3VycmVudFVSTChyZXF1ZXN0KVxuICAgICAgY29uc3QgZGF0YVVSTFN0cnVjdCA9IGRhdGFVUkxQcm9jZXNzb3IoY3VycmVudFVSTClcblxuICAgICAgLy8gMi4gSWYgZGF0YVVSTFN0cnVjdCBpcyBmYWlsdXJlLCB0aGVuIHJldHVybiBhXG4gICAgICAvLyAgICBuZXR3b3JrIGVycm9yLlxuICAgICAgaWYgKGRhdGFVUkxTdHJ1Y3QgPT09ICdmYWlsdXJlJykge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VOZXR3b3JrRXJyb3IoJ2ZhaWxlZCB0byBmZXRjaCB0aGUgZGF0YSBVUkwnKSlcbiAgICAgIH1cblxuICAgICAgLy8gMy4gTGV0IG1pbWVUeXBlIGJlIGRhdGFVUkxTdHJ1Y3TigJlzIE1JTUUgdHlwZSwgc2VyaWFsaXplZC5cbiAgICAgIGNvbnN0IG1pbWVUeXBlID0gc2VyaWFsaXplQU1pbWVUeXBlKGRhdGFVUkxTdHJ1Y3QubWltZVR5cGUpXG5cbiAgICAgIC8vIDQuIFJldHVybiBhIHJlc3BvbnNlIHdob3NlIHN0YXR1cyBtZXNzYWdlIGlzIGBPS2AsXG4gICAgICAvLyAgICBoZWFkZXIgbGlzdCBpcyDCqyAoYENvbnRlbnQtVHlwZWAsIG1pbWVUeXBlKSDCuyxcbiAgICAgIC8vICAgIGFuZCBib2R5IGlzIGRhdGFVUkxTdHJ1Y3TigJlzIGJvZHkgYXMgYSBib2R5LlxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlUmVzcG9uc2Uoe1xuICAgICAgICBzdGF0dXNUZXh0OiAnT0snLFxuICAgICAgICBoZWFkZXJzTGlzdDogW1xuICAgICAgICAgIFsnY29udGVudC10eXBlJywgeyBuYW1lOiAnQ29udGVudC1UeXBlJywgdmFsdWU6IG1pbWVUeXBlIH1dXG4gICAgICAgIF0sXG4gICAgICAgIGJvZHk6IHNhZmVseUV4dHJhY3RCb2R5KGRhdGFVUkxTdHJ1Y3QuYm9keSlbMF1cbiAgICAgIH0pKVxuICAgIH1cbiAgICBjYXNlICdmaWxlOic6IHtcbiAgICAgIC8vIEZvciBub3csIHVuZm9ydHVuYXRlIGFzIGl0IGlzLCBmaWxlIFVSTHMgYXJlIGxlZnQgYXMgYW4gZXhlcmNpc2UgZm9yIHRoZSByZWFkZXIuXG4gICAgICAvLyBXaGVuIGluIGRvdWJ0LCByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlTmV0d29ya0Vycm9yKCdub3QgaW1wbGVtZW50ZWQuLi4geWV0Li4uJykpXG4gICAgfVxuICAgIGNhc2UgJ2h0dHA6JzpcbiAgICBjYXNlICdodHRwczonOiB7XG4gICAgICAvLyBSZXR1cm4gdGhlIHJlc3VsdCBvZiBydW5uaW5nIEhUVFAgZmV0Y2ggZ2l2ZW4gZmV0Y2hQYXJhbXMuXG5cbiAgICAgIHJldHVybiBodHRwRmV0Y2goZmV0Y2hQYXJhbXMpXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiBtYWtlTmV0d29ya0Vycm9yKGVycikpXG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFrZU5ldHdvcmtFcnJvcigndW5rbm93biBzY2hlbWUnKSlcbiAgICB9XG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2ZpbmFsaXplLXJlc3BvbnNlXG5mdW5jdGlvbiBmaW5hbGl6ZVJlc3BvbnNlIChmZXRjaFBhcmFtcywgcmVzcG9uc2UpIHtcbiAgLy8gMS4gU2V0IGZldGNoUGFyYW1z4oCZcyByZXF1ZXN04oCZcyBkb25lIGZsYWcuXG4gIGZldGNoUGFyYW1zLnJlcXVlc3QuZG9uZSA9IHRydWVcblxuICAvLyAyLCBJZiBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXNwb25zZSBkb25lIGlzIG5vdCBudWxsLCB0aGVuIHF1ZXVlIGEgZmV0Y2hcbiAgLy8gdGFzayB0byBydW4gZmV0Y2hQYXJhbXPigJlzIHByb2Nlc3MgcmVzcG9uc2UgZG9uZSBnaXZlbiByZXNwb25zZSwgd2l0aFxuICAvLyBmZXRjaFBhcmFtc+KAmXMgdGFzayBkZXN0aW5hdGlvbi5cbiAgaWYgKGZldGNoUGFyYW1zLnByb2Nlc3NSZXNwb25zZURvbmUgIT0gbnVsbCkge1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IGZldGNoUGFyYW1zLnByb2Nlc3NSZXNwb25zZURvbmUocmVzcG9uc2UpKVxuICB9XG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNmZXRjaC1maW5hbGVcbmZ1bmN0aW9uIGZldGNoRmluYWxlIChmZXRjaFBhcmFtcywgcmVzcG9uc2UpIHtcbiAgLy8gMS4gTGV0IHRpbWluZ0luZm8gYmUgZmV0Y2hQYXJhbXPigJlzIHRpbWluZyBpbmZvLlxuICBsZXQgdGltaW5nSW5mbyA9IGZldGNoUGFyYW1zLnRpbWluZ0luZm9cblxuICAvLyAyLiBJZiByZXNwb25zZSBpcyBub3QgYSBuZXR3b3JrIGVycm9yIGFuZCBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdOKAmXMgY2xpZW50IGlzIGEgc2VjdXJlIGNvbnRleHQsXG4gIC8vICAgIHRoZW4gc2V0IHRpbWluZ0luZm/igJlzIHNlcnZlci10aW1pbmcgaGVhZGVycyB0byB0aGUgcmVzdWx0IG9mIGdldHRpbmcsIGRlY29kaW5nLCBhbmQgc3BsaXR0aW5nXG4gIC8vICAgIGBTZXJ2ZXItVGltaW5nYCBmcm9tIHJlc3BvbnNl4oCZcyBpbnRlcm5hbCByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3QuXG4gIC8vIFRPRE9cblxuICAvLyAzLiBMZXQgcHJvY2Vzc1Jlc3BvbnNlRW5kT2ZCb2R5IGJlIHRoZSBmb2xsb3dpbmcgc3RlcHM6XG4gIGNvbnN0IHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keSA9ICgpID0+IHtcbiAgICAvLyAxLiBMZXQgdW5zYWZlRW5kVGltZSBiZSB0aGUgdW5zYWZlIHNoYXJlZCBjdXJyZW50IHRpbWUuXG4gICAgY29uc3QgdW5zYWZlRW5kVGltZSA9IERhdGUubm93KCkgLy8gP1xuXG4gICAgLy8gMi4gSWYgZmV0Y2hQYXJhbXPigJlzIHJlcXVlc3TigJlzIGRlc3RpbmF0aW9uIGlzIFwiZG9jdW1lbnRcIiwgdGhlbiBzZXQgZmV0Y2hQYXJhbXPigJlzIGNvbnRyb2xsZXLigJlzXG4gICAgLy8gICAgZnVsbCB0aW1pbmcgaW5mbyB0byBmZXRjaFBhcmFtc+KAmXMgdGltaW5nIGluZm8uXG4gICAgaWYgKGZldGNoUGFyYW1zLnJlcXVlc3QuZGVzdGluYXRpb24gPT09ICdkb2N1bWVudCcpIHtcbiAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuZnVsbFRpbWluZ0luZm8gPSB0aW1pbmdJbmZvXG4gICAgfVxuXG4gICAgLy8gMy4gU2V0IGZldGNoUGFyYW1z4oCZcyBjb250cm9sbGVy4oCZcyByZXBvcnQgdGltaW5nIHN0ZXBzIHRvIHRoZSBmb2xsb3dpbmcgc3RlcHMgZ2l2ZW4gYSBnbG9iYWwgb2JqZWN0IGdsb2JhbDpcbiAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLnJlcG9ydFRpbWluZ1N0ZXBzID0gKCkgPT4ge1xuICAgICAgLy8gMS4gSWYgZmV0Y2hQYXJhbXPigJlzIHJlcXVlc3TigJlzIFVSTOKAmXMgc2NoZW1lIGlzIG5vdCBhbiBIVFRQKFMpIHNjaGVtZSwgdGhlbiByZXR1cm4uXG4gICAgICBpZiAoZmV0Y2hQYXJhbXMucmVxdWVzdC51cmwucHJvdG9jb2wgIT09ICdodHRwczonKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyAyLiBTZXQgdGltaW5nSW5mb+KAmXMgZW5kIHRpbWUgdG8gdGhlIHJlbGF0aXZlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lIGdpdmVuIHVuc2FmZUVuZFRpbWUgYW5kIGdsb2JhbC5cbiAgICAgIHRpbWluZ0luZm8uZW5kVGltZSA9IHVuc2FmZUVuZFRpbWVcblxuICAgICAgLy8gMy4gTGV0IGNhY2hlU3RhdGUgYmUgcmVzcG9uc2XigJlzIGNhY2hlIHN0YXRlLlxuICAgICAgbGV0IGNhY2hlU3RhdGUgPSByZXNwb25zZS5jYWNoZVN0YXRlXG5cbiAgICAgIC8vIDQuIExldCBib2R5SW5mbyBiZSByZXNwb25zZeKAmXMgYm9keSBpbmZvLlxuICAgICAgY29uc3QgYm9keUluZm8gPSByZXNwb25zZS5ib2R5SW5mb1xuXG4gICAgICAvLyA1LiBJZiByZXNwb25zZeKAmXMgdGltaW5nIGFsbG93IHBhc3NlZCBmbGFnIGlzIG5vdCBzZXQsIHRoZW4gc2V0IHRpbWluZ0luZm8gdG8gdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhblxuICAgICAgLy8gICAgb3BhcXVlIHRpbWluZyBpbmZvIGZvciB0aW1pbmdJbmZvIGFuZCBzZXQgY2FjaGVTdGF0ZSB0byB0aGUgZW1wdHkgc3RyaW5nLlxuICAgICAgaWYgKCFyZXNwb25zZS50aW1pbmdBbGxvd1Bhc3NlZCkge1xuICAgICAgICB0aW1pbmdJbmZvID0gY3JlYXRlT3BhcXVlVGltaW5nSW5mbyh0aW1pbmdJbmZvKVxuXG4gICAgICAgIGNhY2hlU3RhdGUgPSAnJ1xuICAgICAgfVxuXG4gICAgICAvLyA2LiBMZXQgcmVzcG9uc2VTdGF0dXMgYmUgMC5cbiAgICAgIGxldCByZXNwb25zZVN0YXR1cyA9IDBcblxuICAgICAgLy8gNy4gSWYgZmV0Y2hQYXJhbXPigJlzIHJlcXVlc3TigJlzIG1vZGUgaXMgbm90IFwibmF2aWdhdGVcIiBvciByZXNwb25zZeKAmXMgaGFzLWNyb3NzLW9yaWdpbi1yZWRpcmVjdHMgaXMgZmFsc2U6XG4gICAgICBpZiAoZmV0Y2hQYXJhbXMucmVxdWVzdC5tb2RlICE9PSAnbmF2aWdhdG9yJyB8fCAhcmVzcG9uc2UuaGFzQ3Jvc3NPcmlnaW5SZWRpcmVjdHMpIHtcbiAgICAgICAgLy8gMS4gU2V0IHJlc3BvbnNlU3RhdHVzIHRvIHJlc3BvbnNl4oCZcyBzdGF0dXMuXG4gICAgICAgIHJlc3BvbnNlU3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzXG5cbiAgICAgICAgLy8gMi4gTGV0IG1pbWVUeXBlIGJlIHRoZSByZXN1bHQgb2YgZXh0cmFjdGluZyBhIE1JTUUgdHlwZSBmcm9tIHJlc3BvbnNl4oCZcyBoZWFkZXIgbGlzdC5cbiAgICAgICAgY29uc3QgbWltZVR5cGUgPSBleHRyYWN0TWltZVR5cGUocmVzcG9uc2UuaGVhZGVyc0xpc3QpXG5cbiAgICAgICAgLy8gMy4gSWYgbWltZVR5cGUgaXMgbm90IGZhaWx1cmUsIHRoZW4gc2V0IGJvZHlJbmZv4oCZcyBjb250ZW50IHR5cGUgdG8gdGhlIHJlc3VsdCBvZiBtaW5pbWl6aW5nIGEgc3VwcG9ydGVkIE1JTUUgdHlwZSBnaXZlbiBtaW1lVHlwZS5cbiAgICAgICAgaWYgKG1pbWVUeXBlICE9PSAnZmFpbHVyZScpIHtcbiAgICAgICAgICBib2R5SW5mby5jb250ZW50VHlwZSA9IG1pbmltaXplU3VwcG9ydGVkTWltZVR5cGUobWltZVR5cGUpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gOC4gSWYgZmV0Y2hQYXJhbXPigJlzIHJlcXVlc3TigJlzIGluaXRpYXRvciB0eXBlIGlzIG5vbi1udWxsLCB0aGVuIG1hcmsgcmVzb3VyY2UgdGltaW5nIGdpdmVuIHRpbWluZ0luZm8sXG4gICAgICAvLyAgICBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdOKAmXMgVVJMLCBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdOKAmXMgaW5pdGlhdG9yIHR5cGUsIGdsb2JhbCwgY2FjaGVTdGF0ZSwgYm9keUluZm8sXG4gICAgICAvLyAgICBhbmQgcmVzcG9uc2VTdGF0dXMuXG4gICAgICBpZiAoZmV0Y2hQYXJhbXMucmVxdWVzdC5pbml0aWF0b3JUeXBlICE9IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogdXBkYXRlIG1hcmtyZXNvdXJjZXRpbWluZ1xuICAgICAgICBtYXJrUmVzb3VyY2VUaW1pbmcodGltaW5nSW5mbywgZmV0Y2hQYXJhbXMucmVxdWVzdC51cmwuaHJlZiwgZmV0Y2hQYXJhbXMucmVxdWVzdC5pbml0aWF0b3JUeXBlLCBnbG9iYWxUaGlzLCBjYWNoZVN0YXRlLCBib2R5SW5mbywgcmVzcG9uc2VTdGF0dXMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNC4gTGV0IHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keVRhc2sgYmUgdGhlIGZvbGxvd2luZyBzdGVwczpcbiAgICBjb25zdCBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHlUYXNrID0gKCkgPT4ge1xuICAgICAgLy8gMS4gU2V0IGZldGNoUGFyYW1z4oCZcyByZXF1ZXN04oCZcyBkb25lIGZsYWcuXG4gICAgICBmZXRjaFBhcmFtcy5yZXF1ZXN0LmRvbmUgPSB0cnVlXG5cbiAgICAgIC8vIDIuIElmIGZldGNoUGFyYW1z4oCZcyBwcm9jZXNzIHJlc3BvbnNlIGVuZC1vZi1ib2R5IGlzIG5vbi1udWxsLCB0aGVuIHJ1biBmZXRjaFBhcmFtc+KAmXMgcHJvY2Vzc1xuICAgICAgLy8gICAgcmVzcG9uc2UgZW5kLW9mLWJvZHkgZ2l2ZW4gcmVzcG9uc2UuXG4gICAgICBpZiAoZmV0Y2hQYXJhbXMucHJvY2Vzc1Jlc3BvbnNlRW5kT2ZCb2R5ICE9IG51bGwpIHtcbiAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gZmV0Y2hQYXJhbXMucHJvY2Vzc1Jlc3BvbnNlRW5kT2ZCb2R5KHJlc3BvbnNlKSlcbiAgICAgIH1cblxuICAgICAgLy8gMy4gSWYgZmV0Y2hQYXJhbXPigJlzIHJlcXVlc3TigJlzIGluaXRpYXRvciB0eXBlIGlzIG5vbi1udWxsIGFuZCBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdOKAmXMgY2xpZW504oCZc1xuICAgICAgLy8gICAgZ2xvYmFsIG9iamVjdCBpcyBmZXRjaFBhcmFtc+KAmXMgdGFzayBkZXN0aW5hdGlvbiwgdGhlbiBydW4gZmV0Y2hQYXJhbXPigJlzIGNvbnRyb2xsZXLigJlzIHJlcG9ydFxuICAgICAgLy8gICAgdGltaW5nIHN0ZXBzIGdpdmVuIGZldGNoUGFyYW1z4oCZcyByZXF1ZXN04oCZcyBjbGllbnTigJlzIGdsb2JhbCBvYmplY3QuXG4gICAgICBpZiAoZmV0Y2hQYXJhbXMucmVxdWVzdC5pbml0aWF0b3JUeXBlICE9IG51bGwpIHtcbiAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5yZXBvcnRUaW1pbmdTdGVwcygpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNS4gUXVldWUgYSBmZXRjaCB0YXNrIHRvIHJ1biBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHlUYXNrIHdpdGggZmV0Y2hQYXJhbXPigJlzIHRhc2sgZGVzdGluYXRpb25cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHlUYXNrKCkpXG4gIH1cblxuICAvLyA0LiBJZiBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXNwb25zZSBpcyBub24tbnVsbCwgdGhlbiBxdWV1ZSBhIGZldGNoIHRhc2sgdG8gcnVuIGZldGNoUGFyYW1z4oCZc1xuICAvLyAgICBwcm9jZXNzIHJlc3BvbnNlIGdpdmVuIHJlc3BvbnNlLCB3aXRoIGZldGNoUGFyYW1z4oCZcyB0YXNrIGRlc3RpbmF0aW9uLlxuICBpZiAoZmV0Y2hQYXJhbXMucHJvY2Vzc1Jlc3BvbnNlICE9IG51bGwpIHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICBmZXRjaFBhcmFtcy5wcm9jZXNzUmVzcG9uc2UocmVzcG9uc2UpXG4gICAgICBmZXRjaFBhcmFtcy5wcm9jZXNzUmVzcG9uc2UgPSBudWxsXG4gICAgfSlcbiAgfVxuXG4gIC8vIDUuIExldCBpbnRlcm5hbFJlc3BvbnNlIGJlIHJlc3BvbnNlLCBpZiByZXNwb25zZSBpcyBhIG5ldHdvcmsgZXJyb3I7IG90aGVyd2lzZSByZXNwb25zZeKAmXMgaW50ZXJuYWwgcmVzcG9uc2UuXG4gIGNvbnN0IGludGVybmFsUmVzcG9uc2UgPSByZXNwb25zZS50eXBlID09PSAnZXJyb3InID8gcmVzcG9uc2UgOiAocmVzcG9uc2UuaW50ZXJuYWxSZXNwb25zZSA/PyByZXNwb25zZSlcblxuICAvLyA2LiBJZiBpbnRlcm5hbFJlc3BvbnNl4oCZcyBib2R5IGlzIG51bGwsIHRoZW4gcnVuIHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keS5cbiAgLy8gNy4gT3RoZXJ3aXNlOlxuICBpZiAoaW50ZXJuYWxSZXNwb25zZS5ib2R5ID09IG51bGwpIHtcbiAgICBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHkoKVxuICB9IGVsc2Uge1xuICAgIC8vIG1jb2xsaW5hOiBhbGwgdGhlIGZvbGxvd2luZyBzdGVwcyBvZiB0aGUgc3BlY3MgYXJlIHNraXBwZWQuXG4gICAgLy8gVGhlIGludGVybmFsIHRyYW5zZm9ybSBzdHJlYW0gaXMgbm90IG5lZWRlZC5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvcHVsbC8zMDkzI2lzc3VlY29tbWVudC0yMDUwMTk4NTQxXG5cbiAgICAvLyAxLiBMZXQgdHJhbnNmb3JtU3RyZWFtIGJlIGEgbmV3IFRyYW5zZm9ybVN0cmVhbS5cbiAgICAvLyAyLiBMZXQgaWRlbnRpdHlUcmFuc2Zvcm1BbGdvcml0aG0gYmUgYW4gYWxnb3JpdGhtIHdoaWNoLCBnaXZlbiBjaHVuaywgZW5xdWV1ZXMgY2h1bmsgaW4gdHJhbnNmb3JtU3RyZWFtLlxuICAgIC8vIDMuIFNldCB1cCB0cmFuc2Zvcm1TdHJlYW0gd2l0aCB0cmFuc2Zvcm1BbGdvcml0aG0gc2V0IHRvIGlkZW50aXR5VHJhbnNmb3JtQWxnb3JpdGhtIGFuZCBmbHVzaEFsZ29yaXRobVxuICAgIC8vICAgIHNldCB0byBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHkuXG4gICAgLy8gNC4gU2V0IGludGVybmFsUmVzcG9uc2XigJlzIGJvZHnigJlzIHN0cmVhbSB0byB0aGUgcmVzdWx0IG9mIGludGVybmFsUmVzcG9uc2XigJlzIGJvZHnigJlzIHN0cmVhbSBwaXBlZCB0aHJvdWdoIHRyYW5zZm9ybVN0cmVhbS5cblxuICAgIGZpbmlzaGVkKGludGVybmFsUmVzcG9uc2UuYm9keS5zdHJlYW0sICgpID0+IHtcbiAgICAgIHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keSgpXG4gICAgfSlcbiAgfVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaHR0cC1mZXRjaFxuYXN5bmMgZnVuY3Rpb24gaHR0cEZldGNoIChmZXRjaFBhcmFtcykge1xuICAvLyAxLiBMZXQgcmVxdWVzdCBiZSBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdC5cbiAgY29uc3QgcmVxdWVzdCA9IGZldGNoUGFyYW1zLnJlcXVlc3RcblxuICAvLyAyLiBMZXQgcmVzcG9uc2UgYmUgbnVsbC5cbiAgbGV0IHJlc3BvbnNlID0gbnVsbFxuXG4gIC8vIDMuIExldCBhY3R1YWxSZXNwb25zZSBiZSBudWxsLlxuICBsZXQgYWN0dWFsUmVzcG9uc2UgPSBudWxsXG5cbiAgLy8gNC4gTGV0IHRpbWluZ0luZm8gYmUgZmV0Y2hQYXJhbXPigJlzIHRpbWluZyBpbmZvLlxuICBjb25zdCB0aW1pbmdJbmZvID0gZmV0Y2hQYXJhbXMudGltaW5nSW5mb1xuXG4gIC8vIDUuIElmIHJlcXVlc3TigJlzIHNlcnZpY2Utd29ya2VycyBtb2RlIGlzIFwiYWxsXCIsIHRoZW46XG4gIGlmIChyZXF1ZXN0LnNlcnZpY2VXb3JrZXJzID09PSAnYWxsJykge1xuICAgIC8vIFRPRE9cbiAgfVxuXG4gIC8vIDYuIElmIHJlc3BvbnNlIGlzIG51bGwsIHRoZW46XG4gIGlmIChyZXNwb25zZSA9PT0gbnVsbCkge1xuICAgIC8vIDEuIElmIG1ha2VDT1JTUHJlZmxpZ2h0IGlzIHRydWUgYW5kIG9uZSBvZiB0aGVzZSBjb25kaXRpb25zIGlzIHRydWU6XG4gICAgLy8gVE9ET1xuXG4gICAgLy8gMi4gSWYgcmVxdWVzdOKAmXMgcmVkaXJlY3QgbW9kZSBpcyBcImZvbGxvd1wiLCB0aGVuIHNldCByZXF1ZXN04oCZc1xuICAgIC8vIHNlcnZpY2Utd29ya2VycyBtb2RlIHRvIFwibm9uZVwiLlxuICAgIGlmIChyZXF1ZXN0LnJlZGlyZWN0ID09PSAnZm9sbG93Jykge1xuICAgICAgcmVxdWVzdC5zZXJ2aWNlV29ya2VycyA9ICdub25lJ1xuICAgIH1cblxuICAgIC8vIDMuIFNldCByZXNwb25zZSBhbmQgYWN0dWFsUmVzcG9uc2UgdG8gdGhlIHJlc3VsdCBvZiBydW5uaW5nXG4gICAgLy8gSFRUUC1uZXR3b3JrLW9yLWNhY2hlIGZldGNoIGdpdmVuIGZldGNoUGFyYW1zLlxuICAgIGFjdHVhbFJlc3BvbnNlID0gcmVzcG9uc2UgPSBhd2FpdCBodHRwTmV0d29ya09yQ2FjaGVGZXRjaChmZXRjaFBhcmFtcylcblxuICAgIC8vIDQuIElmIHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nIGlzIFwiY29yc1wiIGFuZCBhIENPUlMgY2hlY2tcbiAgICAvLyBmb3IgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcmV0dXJucyBmYWlsdXJlLCB0aGVuIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG4gICAgaWYgKFxuICAgICAgcmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnY29ycycgJiZcbiAgICAgIGNvcnNDaGVjayhyZXF1ZXN0LCByZXNwb25zZSkgPT09ICdmYWlsdXJlJ1xuICAgICkge1xuICAgICAgcmV0dXJuIG1ha2VOZXR3b3JrRXJyb3IoJ2NvcnMgZmFpbHVyZScpXG4gICAgfVxuXG4gICAgLy8gNS4gSWYgdGhlIFRBTyBjaGVjayBmb3IgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcmV0dXJucyBmYWlsdXJlLCB0aGVuIHNldFxuICAgIC8vIHJlcXVlc3TigJlzIHRpbWluZyBhbGxvdyBmYWlsZWQgZmxhZy5cbiAgICBpZiAoVEFPQ2hlY2socmVxdWVzdCwgcmVzcG9uc2UpID09PSAnZmFpbHVyZScpIHtcbiAgICAgIHJlcXVlc3QudGltaW5nQWxsb3dGYWlsZWQgPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgLy8gNy4gSWYgZWl0aGVyIHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nIG9yIHJlc3BvbnNl4oCZcyB0eXBlXG4gIC8vIGlzIFwib3BhcXVlXCIsIGFuZCB0aGUgY3Jvc3Mtb3JpZ2luIHJlc291cmNlIHBvbGljeSBjaGVjayB3aXRoXG4gIC8vIHJlcXVlc3TigJlzIG9yaWdpbiwgcmVxdWVzdOKAmXMgY2xpZW50LCByZXF1ZXN04oCZcyBkZXN0aW5hdGlvbixcbiAgLy8gYW5kIGFjdHVhbFJlc3BvbnNlIHJldHVybnMgYmxvY2tlZCwgdGhlbiByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICBpZiAoXG4gICAgKHJlcXVlc3QucmVzcG9uc2VUYWludGluZyA9PT0gJ29wYXF1ZScgfHwgcmVzcG9uc2UudHlwZSA9PT0gJ29wYXF1ZScpICYmXG4gICAgY3Jvc3NPcmlnaW5SZXNvdXJjZVBvbGljeUNoZWNrKFxuICAgICAgcmVxdWVzdC5vcmlnaW4sXG4gICAgICByZXF1ZXN0LmNsaWVudCxcbiAgICAgIHJlcXVlc3QuZGVzdGluYXRpb24sXG4gICAgICBhY3R1YWxSZXNwb25zZVxuICAgICkgPT09ICdibG9ja2VkJ1xuICApIHtcbiAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcignYmxvY2tlZCcpXG4gIH1cblxuICAvLyA4LiBJZiBhY3R1YWxSZXNwb25zZeKAmXMgc3RhdHVzIGlzIGEgcmVkaXJlY3Qgc3RhdHVzLCB0aGVuOlxuICBpZiAocmVkaXJlY3RTdGF0dXNTZXQuaGFzKGFjdHVhbFJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICAvLyAxLiBJZiBhY3R1YWxSZXNwb25zZeKAmXMgc3RhdHVzIGlzIG5vdCAzMDMsIHJlcXVlc3TigJlzIGJvZHkgaXMgbm90IG51bGwsXG4gICAgLy8gYW5kIHRoZSBjb25uZWN0aW9uIHVzZXMgSFRUUC8yLCB0aGVuIHVzZXIgYWdlbnRzIG1heSwgYW5kIGFyZSBldmVuXG4gICAgLy8gZW5jb3VyYWdlZCB0bywgdHJhbnNtaXQgYW4gUlNUX1NUUkVBTSBmcmFtZS5cbiAgICAvLyBTZWUsIGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvZmV0Y2gvaXNzdWVzLzEyODhcbiAgICBpZiAocmVxdWVzdC5yZWRpcmVjdCAhPT0gJ21hbnVhbCcpIHtcbiAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29ubmVjdGlvbi5kZXN0cm95KHVuZGVmaW5lZCwgZmFsc2UpXG4gICAgfVxuXG4gICAgLy8gMi4gU3dpdGNoIG9uIHJlcXVlc3TigJlzIHJlZGlyZWN0IG1vZGU6XG4gICAgaWYgKHJlcXVlc3QucmVkaXJlY3QgPT09ICdlcnJvcicpIHtcbiAgICAgIC8vIFNldCByZXNwb25zZSB0byBhIG5ldHdvcmsgZXJyb3IuXG4gICAgICByZXNwb25zZSA9IG1ha2VOZXR3b3JrRXJyb3IoJ3VuZXhwZWN0ZWQgcmVkaXJlY3QnKVxuICAgIH0gZWxzZSBpZiAocmVxdWVzdC5yZWRpcmVjdCA9PT0gJ21hbnVhbCcpIHtcbiAgICAgIC8vIFNldCByZXNwb25zZSB0byBhbiBvcGFxdWUtcmVkaXJlY3QgZmlsdGVyZWQgcmVzcG9uc2Ugd2hvc2UgaW50ZXJuYWxcbiAgICAgIC8vIHJlc3BvbnNlIGlzIGFjdHVhbFJlc3BvbnNlLlxuICAgICAgLy8gTk9URShzcGVjKTogT24gdGhlIHdlYiB0aGlzIHdvdWxkIHJldHVybiBhbiBgb3BhcXVlcmVkaXJlY3RgIHJlc3BvbnNlLFxuICAgICAgLy8gYnV0IHRoYXQgZG9lc24ndCBtYWtlIHNlbnNlIHNlcnZlciBzaWRlLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2lzc3Vlcy8xMTkzLlxuICAgICAgcmVzcG9uc2UgPSBhY3R1YWxSZXNwb25zZVxuICAgIH0gZWxzZSBpZiAocmVxdWVzdC5yZWRpcmVjdCA9PT0gJ2ZvbGxvdycpIHtcbiAgICAgIC8vIFNldCByZXNwb25zZSB0byB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgSFRUUC1yZWRpcmVjdCBmZXRjaCBnaXZlblxuICAgICAgLy8gZmV0Y2hQYXJhbXMgYW5kIHJlc3BvbnNlLlxuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBodHRwUmVkaXJlY3RGZXRjaChmZXRjaFBhcmFtcywgcmVzcG9uc2UpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChmYWxzZSlcbiAgICB9XG4gIH1cblxuICAvLyA5LiBTZXQgcmVzcG9uc2XigJlzIHRpbWluZyBpbmZvIHRvIHRpbWluZ0luZm8uXG4gIHJlc3BvbnNlLnRpbWluZ0luZm8gPSB0aW1pbmdJbmZvXG5cbiAgLy8gMTAuIFJldHVybiByZXNwb25zZS5cbiAgcmV0dXJuIHJlc3BvbnNlXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNodHRwLXJlZGlyZWN0LWZldGNoXG5mdW5jdGlvbiBodHRwUmVkaXJlY3RGZXRjaCAoZmV0Y2hQYXJhbXMsIHJlc3BvbnNlKSB7XG4gIC8vIDEuIExldCByZXF1ZXN0IGJlIGZldGNoUGFyYW1z4oCZcyByZXF1ZXN0LlxuICBjb25zdCByZXF1ZXN0ID0gZmV0Y2hQYXJhbXMucmVxdWVzdFxuXG4gIC8vIDIuIExldCBhY3R1YWxSZXNwb25zZSBiZSByZXNwb25zZSwgaWYgcmVzcG9uc2UgaXMgbm90IGEgZmlsdGVyZWQgcmVzcG9uc2UsXG4gIC8vIGFuZCByZXNwb25zZeKAmXMgaW50ZXJuYWwgcmVzcG9uc2Ugb3RoZXJ3aXNlLlxuICBjb25zdCBhY3R1YWxSZXNwb25zZSA9IHJlc3BvbnNlLmludGVybmFsUmVzcG9uc2VcbiAgICA/IHJlc3BvbnNlLmludGVybmFsUmVzcG9uc2VcbiAgICA6IHJlc3BvbnNlXG5cbiAgLy8gMy4gTGV0IGxvY2F0aW9uVVJMIGJlIGFjdHVhbFJlc3BvbnNl4oCZcyBsb2NhdGlvbiBVUkwgZ2l2ZW4gcmVxdWVzdOKAmXMgY3VycmVudFxuICAvLyBVUkzigJlzIGZyYWdtZW50LlxuICBsZXQgbG9jYXRpb25VUkxcblxuICB0cnkge1xuICAgIGxvY2F0aW9uVVJMID0gcmVzcG9uc2VMb2NhdGlvblVSTChcbiAgICAgIGFjdHVhbFJlc3BvbnNlLFxuICAgICAgcmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdCkuaGFzaFxuICAgIClcblxuICAgIC8vIDQuIElmIGxvY2F0aW9uVVJMIGlzIG51bGwsIHRoZW4gcmV0dXJuIHJlc3BvbnNlLlxuICAgIGlmIChsb2NhdGlvblVSTCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2VcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIDUuIElmIGxvY2F0aW9uVVJMIGlzIGZhaWx1cmUsIHRoZW4gcmV0dXJuIGEgbmV0d29yayBlcnJvci5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VOZXR3b3JrRXJyb3IoZXJyKSlcbiAgfVxuXG4gIC8vIDYuIElmIGxvY2F0aW9uVVJM4oCZcyBzY2hlbWUgaXMgbm90IGFuIEhUVFAoUykgc2NoZW1lLCB0aGVuIHJldHVybiBhIG5ldHdvcmtcbiAgLy8gZXJyb3IuXG4gIGlmICghdXJsSXNIdHRwSHR0cHNTY2hlbWUobG9jYXRpb25VUkwpKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlTmV0d29ya0Vycm9yKCdVUkwgc2NoZW1lIG11c3QgYmUgYSBIVFRQKFMpIHNjaGVtZScpKVxuICB9XG5cbiAgLy8gNy4gSWYgcmVxdWVzdOKAmXMgcmVkaXJlY3QgY291bnQgaXMgMjAsIHRoZW4gcmV0dXJuIGEgbmV0d29yayBlcnJvci5cbiAgaWYgKHJlcXVlc3QucmVkaXJlY3RDb3VudCA9PT0gMjApIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VOZXR3b3JrRXJyb3IoJ3JlZGlyZWN0IGNvdW50IGV4Y2VlZGVkJykpXG4gIH1cblxuICAvLyA4LiBJbmNyZWFzZSByZXF1ZXN04oCZcyByZWRpcmVjdCBjb3VudCBieSAxLlxuICByZXF1ZXN0LnJlZGlyZWN0Q291bnQgKz0gMVxuXG4gIC8vIDkuIElmIHJlcXVlc3TigJlzIG1vZGUgaXMgXCJjb3JzXCIsIGxvY2F0aW9uVVJMIGluY2x1ZGVzIGNyZWRlbnRpYWxzLCBhbmRcbiAgLy8gcmVxdWVzdOKAmXMgb3JpZ2luIGlzIG5vdCBzYW1lIG9yaWdpbiB3aXRoIGxvY2F0aW9uVVJM4oCZcyBvcmlnaW4sIHRoZW4gcmV0dXJuXG4gIC8vICBhIG5ldHdvcmsgZXJyb3IuXG4gIGlmIChcbiAgICByZXF1ZXN0Lm1vZGUgPT09ICdjb3JzJyAmJlxuICAgIChsb2NhdGlvblVSTC51c2VybmFtZSB8fCBsb2NhdGlvblVSTC5wYXNzd29yZCkgJiZcbiAgICAhc2FtZU9yaWdpbihyZXF1ZXN0LCBsb2NhdGlvblVSTClcbiAgKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlTmV0d29ya0Vycm9yKCdjcm9zcyBvcmlnaW4gbm90IGFsbG93ZWQgZm9yIHJlcXVlc3QgbW9kZSBcImNvcnNcIicpKVxuICB9XG5cbiAgLy8gMTAuIElmIHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nIGlzIFwiY29yc1wiIGFuZCBsb2NhdGlvblVSTCBpbmNsdWRlc1xuICAvLyBjcmVkZW50aWFscywgdGhlbiByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICBpZiAoXG4gICAgcmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnY29ycycgJiZcbiAgICAobG9jYXRpb25VUkwudXNlcm5hbWUgfHwgbG9jYXRpb25VUkwucGFzc3dvcmQpXG4gICkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFrZU5ldHdvcmtFcnJvcihcbiAgICAgICdVUkwgY2Fubm90IGNvbnRhaW4gY3JlZGVudGlhbHMgZm9yIHJlcXVlc3QgbW9kZSBcImNvcnNcIidcbiAgICApKVxuICB9XG5cbiAgLy8gMTEuIElmIGFjdHVhbFJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgbm90IDMwMywgcmVxdWVzdOKAmXMgYm9keSBpcyBub24tbnVsbCxcbiAgLy8gYW5kIHJlcXVlc3TigJlzIGJvZHnigJlzIHNvdXJjZSBpcyBudWxsLCB0aGVuIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG4gIGlmIChcbiAgICBhY3R1YWxSZXNwb25zZS5zdGF0dXMgIT09IDMwMyAmJlxuICAgIHJlcXVlc3QuYm9keSAhPSBudWxsICYmXG4gICAgcmVxdWVzdC5ib2R5LnNvdXJjZSA9PSBudWxsXG4gICkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFrZU5ldHdvcmtFcnJvcigpKVxuICB9XG5cbiAgLy8gMTIuIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWVcbiAgLy8gLSBhY3R1YWxSZXNwb25zZeKAmXMgc3RhdHVzIGlzIDMwMSBvciAzMDIgYW5kIHJlcXVlc3TigJlzIG1ldGhvZCBpcyBgUE9TVGBcbiAgLy8gLSBhY3R1YWxSZXNwb25zZeKAmXMgc3RhdHVzIGlzIDMwMyBhbmQgcmVxdWVzdOKAmXMgbWV0aG9kIGlzIG5vdCBgR0VUYCBvciBgSEVBRGBcbiAgaWYgKFxuICAgIChbMzAxLCAzMDJdLmluY2x1ZGVzKGFjdHVhbFJlc3BvbnNlLnN0YXR1cykgJiYgcmVxdWVzdC5tZXRob2QgPT09ICdQT1NUJykgfHxcbiAgICAoYWN0dWFsUmVzcG9uc2Uuc3RhdHVzID09PSAzMDMgJiZcbiAgICAgICFHRVRfT1JfSEVBRC5pbmNsdWRlcyhyZXF1ZXN0Lm1ldGhvZCkpXG4gICkge1xuICAgIC8vIHRoZW46XG4gICAgLy8gMS4gU2V0IHJlcXVlc3TigJlzIG1ldGhvZCB0byBgR0VUYCBhbmQgcmVxdWVzdOKAmXMgYm9keSB0byBudWxsLlxuICAgIHJlcXVlc3QubWV0aG9kID0gJ0dFVCdcbiAgICByZXF1ZXN0LmJvZHkgPSBudWxsXG5cbiAgICAvLyAyLiBGb3IgZWFjaCBoZWFkZXJOYW1lIG9mIHJlcXVlc3QtYm9keS1oZWFkZXIgbmFtZSwgZGVsZXRlIGhlYWRlck5hbWUgZnJvbVxuICAgIC8vIHJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICAgIGZvciAoY29uc3QgaGVhZGVyTmFtZSBvZiByZXF1ZXN0Qm9keUhlYWRlcikge1xuICAgICAgcmVxdWVzdC5oZWFkZXJzTGlzdC5kZWxldGUoaGVhZGVyTmFtZSlcbiAgICB9XG4gIH1cblxuICAvLyAxMy4gSWYgcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIG9yaWdpbiBpcyBub3Qgc2FtZSBvcmlnaW4gd2l0aCBsb2NhdGlvblVSTOKAmXNcbiAgLy8gICAgIG9yaWdpbiwgdGhlbiBmb3IgZWFjaCBoZWFkZXJOYW1lIG9mIENPUlMgbm9uLXdpbGRjYXJkIHJlcXVlc3QtaGVhZGVyIG5hbWUsXG4gIC8vICAgICBkZWxldGUgaGVhZGVyTmFtZSBmcm9tIHJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICBpZiAoIXNhbWVPcmlnaW4ocmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdCksIGxvY2F0aW9uVVJMKSkge1xuICAgIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb3JzLW5vbi13aWxkY2FyZC1yZXF1ZXN0LWhlYWRlci1uYW1lXG4gICAgcmVxdWVzdC5oZWFkZXJzTGlzdC5kZWxldGUoJ2F1dGhvcml6YXRpb24nLCB0cnVlKVxuXG4gICAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2F1dGhlbnRpY2F0aW9uLWVudHJpZXNcbiAgICByZXF1ZXN0LmhlYWRlcnNMaXN0LmRlbGV0ZSgncHJveHktYXV0aG9yaXphdGlvbicsIHRydWUpXG5cbiAgICAvLyBcIkNvb2tpZVwiIGFuZCBcIkhvc3RcIiBhcmUgZm9yYmlkZGVuIHJlcXVlc3QtaGVhZGVycywgd2hpY2ggdW5kaWNpIGRvZXNuJ3QgaW1wbGVtZW50LlxuICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QuZGVsZXRlKCdjb29raWUnLCB0cnVlKVxuICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QuZGVsZXRlKCdob3N0JywgdHJ1ZSlcbiAgfVxuXG4gIC8vIDE0LiBJZiByZXF1ZXN04oCZcyBib2R5IGlzIG5vbi1udWxsLCB0aGVuIHNldCByZXF1ZXN04oCZcyBib2R5IHRvIHRoZSBmaXJzdCByZXR1cm5cbiAgLy8gdmFsdWUgb2Ygc2FmZWx5IGV4dHJhY3RpbmcgcmVxdWVzdOKAmXMgYm9keeKAmXMgc291cmNlLlxuICBpZiAocmVxdWVzdC5ib2R5ICE9IG51bGwpIHtcbiAgICBhc3NlcnQocmVxdWVzdC5ib2R5LnNvdXJjZSAhPSBudWxsKVxuICAgIHJlcXVlc3QuYm9keSA9IHNhZmVseUV4dHJhY3RCb2R5KHJlcXVlc3QuYm9keS5zb3VyY2UpWzBdXG4gIH1cblxuICAvLyAxNS4gTGV0IHRpbWluZ0luZm8gYmUgZmV0Y2hQYXJhbXPigJlzIHRpbWluZyBpbmZvLlxuICBjb25zdCB0aW1pbmdJbmZvID0gZmV0Y2hQYXJhbXMudGltaW5nSW5mb1xuXG4gIC8vIDE2LiBTZXQgdGltaW5nSW5mb+KAmXMgcmVkaXJlY3QgZW5kIHRpbWUgYW5kIHBvc3QtcmVkaXJlY3Qgc3RhcnQgdGltZSB0byB0aGVcbiAgLy8gY29hcnNlbmVkIHNoYXJlZCBjdXJyZW50IHRpbWUgZ2l2ZW4gZmV0Y2hQYXJhbXPigJlzIGNyb3NzLW9yaWdpbiBpc29sYXRlZFxuICAvLyBjYXBhYmlsaXR5LlxuICB0aW1pbmdJbmZvLnJlZGlyZWN0RW5kVGltZSA9IHRpbWluZ0luZm8ucG9zdFJlZGlyZWN0U3RhcnRUaW1lID1cbiAgICBjb2Fyc2VuZWRTaGFyZWRDdXJyZW50VGltZShmZXRjaFBhcmFtcy5jcm9zc09yaWdpbklzb2xhdGVkQ2FwYWJpbGl0eSlcblxuICAvLyAxNy4gSWYgdGltaW5nSW5mb+KAmXMgcmVkaXJlY3Qgc3RhcnQgdGltZSBpcyAwLCB0aGVuIHNldCB0aW1pbmdJbmZv4oCZc1xuICAvLyAgcmVkaXJlY3Qgc3RhcnQgdGltZSB0byB0aW1pbmdJbmZv4oCZcyBzdGFydCB0aW1lLlxuICBpZiAodGltaW5nSW5mby5yZWRpcmVjdFN0YXJ0VGltZSA9PT0gMCkge1xuICAgIHRpbWluZ0luZm8ucmVkaXJlY3RTdGFydFRpbWUgPSB0aW1pbmdJbmZvLnN0YXJ0VGltZVxuICB9XG5cbiAgLy8gMTguIEFwcGVuZCBsb2NhdGlvblVSTCB0byByZXF1ZXN04oCZcyBVUkwgbGlzdC5cbiAgcmVxdWVzdC51cmxMaXN0LnB1c2gobG9jYXRpb25VUkwpXG5cbiAgLy8gMTkuIEludm9rZSBzZXQgcmVxdWVzdOKAmXMgcmVmZXJyZXIgcG9saWN5IG9uIHJlZGlyZWN0IG9uIHJlcXVlc3QgYW5kXG4gIC8vIGFjdHVhbFJlc3BvbnNlLlxuICBzZXRSZXF1ZXN0UmVmZXJyZXJQb2xpY3lPblJlZGlyZWN0KHJlcXVlc3QsIGFjdHVhbFJlc3BvbnNlKVxuXG4gIC8vIDIwLiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBydW5uaW5nIG1haW4gZmV0Y2ggZ2l2ZW4gZmV0Y2hQYXJhbXMgYW5kIHRydWUuXG4gIHJldHVybiBtYWluRmV0Y2goZmV0Y2hQYXJhbXMsIHRydWUpXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNodHRwLW5ldHdvcmstb3ItY2FjaGUtZmV0Y2hcbmFzeW5jIGZ1bmN0aW9uIGh0dHBOZXR3b3JrT3JDYWNoZUZldGNoIChcbiAgZmV0Y2hQYXJhbXMsXG4gIGlzQXV0aGVudGljYXRpb25GZXRjaCA9IGZhbHNlLFxuICBpc05ld0Nvbm5lY3Rpb25GZXRjaCA9IGZhbHNlXG4pIHtcbiAgLy8gMS4gTGV0IHJlcXVlc3QgYmUgZmV0Y2hQYXJhbXPigJlzIHJlcXVlc3QuXG4gIGNvbnN0IHJlcXVlc3QgPSBmZXRjaFBhcmFtcy5yZXF1ZXN0XG5cbiAgLy8gMi4gTGV0IGh0dHBGZXRjaFBhcmFtcyBiZSBudWxsLlxuICBsZXQgaHR0cEZldGNoUGFyYW1zID0gbnVsbFxuXG4gIC8vIDMuIExldCBodHRwUmVxdWVzdCBiZSBudWxsLlxuICBsZXQgaHR0cFJlcXVlc3QgPSBudWxsXG5cbiAgLy8gNC4gTGV0IHJlc3BvbnNlIGJlIG51bGwuXG4gIGxldCByZXNwb25zZSA9IG51bGxcblxuICAvLyA1LiBMZXQgc3RvcmVkUmVzcG9uc2UgYmUgbnVsbC5cbiAgLy8gVE9ETzogY2FjaGVcblxuICAvLyA2LiBMZXQgaHR0cENhY2hlIGJlIG51bGwuXG4gIGNvbnN0IGh0dHBDYWNoZSA9IG51bGxcblxuICAvLyA3LiBMZXQgdGhlIHJldmFsaWRhdGluZ0ZsYWcgYmUgdW5zZXQuXG4gIGNvbnN0IHJldmFsaWRhdGluZ0ZsYWcgPSBmYWxzZVxuXG4gIC8vIDguIFJ1biB0aGVzZSBzdGVwcywgYnV0IGFib3J0IHdoZW4gdGhlIG9uZ29pbmcgZmV0Y2ggaXMgdGVybWluYXRlZDpcblxuICAvLyAgICAxLiBJZiByZXF1ZXN04oCZcyB3aW5kb3cgaXMgXCJuby13aW5kb3dcIiBhbmQgcmVxdWVzdOKAmXMgcmVkaXJlY3QgbW9kZSBpc1xuICAvLyAgICBcImVycm9yXCIsIHRoZW4gc2V0IGh0dHBGZXRjaFBhcmFtcyB0byBmZXRjaFBhcmFtcyBhbmQgaHR0cFJlcXVlc3QgdG9cbiAgLy8gICAgcmVxdWVzdC5cbiAgaWYgKHJlcXVlc3Qud2luZG93ID09PSAnbm8td2luZG93JyAmJiByZXF1ZXN0LnJlZGlyZWN0ID09PSAnZXJyb3InKSB7XG4gICAgaHR0cEZldGNoUGFyYW1zID0gZmV0Y2hQYXJhbXNcbiAgICBodHRwUmVxdWVzdCA9IHJlcXVlc3RcbiAgfSBlbHNlIHtcbiAgICAvLyBPdGhlcndpc2U6XG5cbiAgICAvLyAxLiBTZXQgaHR0cFJlcXVlc3QgdG8gYSBjbG9uZSBvZiByZXF1ZXN0LlxuICAgIGh0dHBSZXF1ZXN0ID0gY2xvbmVSZXF1ZXN0KHJlcXVlc3QpXG5cbiAgICAvLyAyLiBTZXQgaHR0cEZldGNoUGFyYW1zIHRvIGEgY29weSBvZiBmZXRjaFBhcmFtcy5cbiAgICBodHRwRmV0Y2hQYXJhbXMgPSB7IC4uLmZldGNoUGFyYW1zIH1cblxuICAgIC8vIDMuIFNldCBodHRwRmV0Y2hQYXJhbXPigJlzIHJlcXVlc3QgdG8gaHR0cFJlcXVlc3QuXG4gICAgaHR0cEZldGNoUGFyYW1zLnJlcXVlc3QgPSBodHRwUmVxdWVzdFxuICB9XG5cbiAgLy8gICAgMy4gTGV0IGluY2x1ZGVDcmVkZW50aWFscyBiZSB0cnVlIGlmIG9uZSBvZlxuICBjb25zdCBpbmNsdWRlQ3JlZGVudGlhbHMgPVxuICAgIHJlcXVlc3QuY3JlZGVudGlhbHMgPT09ICdpbmNsdWRlJyB8fFxuICAgIChyZXF1ZXN0LmNyZWRlbnRpYWxzID09PSAnc2FtZS1vcmlnaW4nICYmXG4gICAgICByZXF1ZXN0LnJlc3BvbnNlVGFpbnRpbmcgPT09ICdiYXNpYycpXG5cbiAgLy8gICAgNC4gTGV0IGNvbnRlbnRMZW5ndGggYmUgaHR0cFJlcXVlc3TigJlzIGJvZHnigJlzIGxlbmd0aCwgaWYgaHR0cFJlcXVlc3TigJlzXG4gIC8vICAgIGJvZHkgaXMgbm9uLW51bGw7IG90aGVyd2lzZSBudWxsLlxuICBjb25zdCBjb250ZW50TGVuZ3RoID0gaHR0cFJlcXVlc3QuYm9keSA/IGh0dHBSZXF1ZXN0LmJvZHkubGVuZ3RoIDogbnVsbFxuXG4gIC8vICAgIDUuIExldCBjb250ZW50TGVuZ3RoSGVhZGVyVmFsdWUgYmUgbnVsbC5cbiAgbGV0IGNvbnRlbnRMZW5ndGhIZWFkZXJWYWx1ZSA9IG51bGxcblxuICAvLyAgICA2LiBJZiBodHRwUmVxdWVzdOKAmXMgYm9keSBpcyBudWxsIGFuZCBodHRwUmVxdWVzdOKAmXMgbWV0aG9kIGlzIGBQT1NUYCBvclxuICAvLyAgICBgUFVUYCwgdGhlbiBzZXQgY29udGVudExlbmd0aEhlYWRlclZhbHVlIHRvIGAwYC5cbiAgaWYgKFxuICAgIGh0dHBSZXF1ZXN0LmJvZHkgPT0gbnVsbCAmJlxuICAgIFsnUE9TVCcsICdQVVQnXS5pbmNsdWRlcyhodHRwUmVxdWVzdC5tZXRob2QpXG4gICkge1xuICAgIGNvbnRlbnRMZW5ndGhIZWFkZXJWYWx1ZSA9ICcwJ1xuICB9XG5cbiAgLy8gICAgNy4gSWYgY29udGVudExlbmd0aCBpcyBub24tbnVsbCwgdGhlbiBzZXQgY29udGVudExlbmd0aEhlYWRlclZhbHVlIHRvXG4gIC8vICAgIGNvbnRlbnRMZW5ndGgsIHNlcmlhbGl6ZWQgYW5kIGlzb21vcnBoaWMgZW5jb2RlZC5cbiAgaWYgKGNvbnRlbnRMZW5ndGggIT0gbnVsbCkge1xuICAgIGNvbnRlbnRMZW5ndGhIZWFkZXJWYWx1ZSA9IGlzb21vcnBoaWNFbmNvZGUoYCR7Y29udGVudExlbmd0aH1gKVxuICB9XG5cbiAgLy8gICAgOC4gSWYgY29udGVudExlbmd0aEhlYWRlclZhbHVlIGlzIG5vbi1udWxsLCB0aGVuIGFwcGVuZFxuICAvLyAgICBgQ29udGVudC1MZW5ndGhgL2NvbnRlbnRMZW5ndGhIZWFkZXJWYWx1ZSB0byBodHRwUmVxdWVzdOKAmXMgaGVhZGVyXG4gIC8vICAgIGxpc3QuXG4gIGlmIChjb250ZW50TGVuZ3RoSGVhZGVyVmFsdWUgIT0gbnVsbCkge1xuICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgnY29udGVudC1sZW5ndGgnLCBjb250ZW50TGVuZ3RoSGVhZGVyVmFsdWUsIHRydWUpXG4gIH1cblxuICAvLyAgICA5LiBJZiBjb250ZW50TGVuZ3RoSGVhZGVyVmFsdWUgaXMgbm9uLW51bGwsIHRoZW4gYXBwZW5kIChgQ29udGVudC1MZW5ndGhgLFxuICAvLyAgICBjb250ZW50TGVuZ3RoSGVhZGVyVmFsdWUpIHRvIGh0dHBSZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cblxuICAvLyAgICAxMC4gSWYgY29udGVudExlbmd0aCBpcyBub24tbnVsbCBhbmQgaHR0cFJlcXVlc3TigJlzIGtlZXBhbGl2ZSBpcyB0cnVlLFxuICAvLyAgICB0aGVuOlxuICBpZiAoY29udGVudExlbmd0aCAhPSBudWxsICYmIGh0dHBSZXF1ZXN0LmtlZXBhbGl2ZSkge1xuICAgIC8vIE5PVEU6IGtlZXBhbGl2ZSBpcyBhIG5vb3Agb3V0c2lkZSBvZiBicm93c2VyIGNvbnRleHQuXG4gIH1cblxuICAvLyAgICAxMS4gSWYgaHR0cFJlcXVlc3TigJlzIHJlZmVycmVyIGlzIGEgVVJMLCB0aGVuIGFwcGVuZFxuICAvLyAgICBgUmVmZXJlcmAvaHR0cFJlcXVlc3TigJlzIHJlZmVycmVyLCBzZXJpYWxpemVkIGFuZCBpc29tb3JwaGljIGVuY29kZWQsXG4gIC8vICAgICB0byBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gIGlmIChodHRwUmVxdWVzdC5yZWZlcnJlciBpbnN0YW5jZW9mIFVSTCkge1xuICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgncmVmZXJlcicsIGlzb21vcnBoaWNFbmNvZGUoaHR0cFJlcXVlc3QucmVmZXJyZXIuaHJlZiksIHRydWUpXG4gIH1cblxuICAvLyAgICAxMi4gQXBwZW5kIGEgcmVxdWVzdCBgT3JpZ2luYCBoZWFkZXIgZm9yIGh0dHBSZXF1ZXN0LlxuICBhcHBlbmRSZXF1ZXN0T3JpZ2luSGVhZGVyKGh0dHBSZXF1ZXN0KVxuXG4gIC8vICAgIDEzLiBBcHBlbmQgdGhlIEZldGNoIG1ldGFkYXRhIGhlYWRlcnMgZm9yIGh0dHBSZXF1ZXN0LiBbRkVUQ0gtTUVUQURBVEFdXG4gIGFwcGVuZEZldGNoTWV0YWRhdGEoaHR0cFJlcXVlc3QpXG5cbiAgLy8gICAgMTQuIElmIGh0dHBSZXF1ZXN04oCZcyBoZWFkZXIgbGlzdCBkb2VzIG5vdCBjb250YWluIGBVc2VyLUFnZW50YCwgdGhlblxuICAvLyAgICB1c2VyIGFnZW50cyBzaG91bGQgYXBwZW5kIGBVc2VyLUFnZW50YC9kZWZhdWx0IGBVc2VyLUFnZW50YCB2YWx1ZSB0b1xuICAvLyAgICBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gIGlmICghaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuY29udGFpbnMoJ3VzZXItYWdlbnQnLCB0cnVlKSkge1xuICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgndXNlci1hZ2VudCcsIGRlZmF1bHRVc2VyQWdlbnQpXG4gIH1cblxuICAvLyAgICAxNS4gSWYgaHR0cFJlcXVlc3TigJlzIGNhY2hlIG1vZGUgaXMgXCJkZWZhdWx0XCIgYW5kIGh0dHBSZXF1ZXN04oCZcyBoZWFkZXJcbiAgLy8gICAgbGlzdCBjb250YWlucyBgSWYtTW9kaWZpZWQtU2luY2VgLCBgSWYtTm9uZS1NYXRjaGAsXG4gIC8vICAgIGBJZi1Vbm1vZGlmaWVkLVNpbmNlYCwgYElmLU1hdGNoYCwgb3IgYElmLVJhbmdlYCwgdGhlbiBzZXRcbiAgLy8gICAgaHR0cFJlcXVlc3TigJlzIGNhY2hlIG1vZGUgdG8gXCJuby1zdG9yZVwiLlxuICBpZiAoXG4gICAgaHR0cFJlcXVlc3QuY2FjaGUgPT09ICdkZWZhdWx0JyAmJlxuICAgIChodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygnaWYtbW9kaWZpZWQtc2luY2UnLCB0cnVlKSB8fFxuICAgICAgaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuY29udGFpbnMoJ2lmLW5vbmUtbWF0Y2gnLCB0cnVlKSB8fFxuICAgICAgaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuY29udGFpbnMoJ2lmLXVubW9kaWZpZWQtc2luY2UnLCB0cnVlKSB8fFxuICAgICAgaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuY29udGFpbnMoJ2lmLW1hdGNoJywgdHJ1ZSkgfHxcbiAgICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCdpZi1yYW5nZScsIHRydWUpKVxuICApIHtcbiAgICBodHRwUmVxdWVzdC5jYWNoZSA9ICduby1zdG9yZSdcbiAgfVxuXG4gIC8vICAgIDE2LiBJZiBodHRwUmVxdWVzdOKAmXMgY2FjaGUgbW9kZSBpcyBcIm5vLWNhY2hlXCIsIGh0dHBSZXF1ZXN04oCZcyBwcmV2ZW50XG4gIC8vICAgIG5vLWNhY2hlIGNhY2hlLWNvbnRyb2wgaGVhZGVyIG1vZGlmaWNhdGlvbiBmbGFnIGlzIHVuc2V0LCBhbmRcbiAgLy8gICAgaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGRvZXMgbm90IGNvbnRhaW4gYENhY2hlLUNvbnRyb2xgLCB0aGVuIGFwcGVuZFxuICAvLyAgICBgQ2FjaGUtQ29udHJvbGAvYG1heC1hZ2U9MGAgdG8gaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICBpZiAoXG4gICAgaHR0cFJlcXVlc3QuY2FjaGUgPT09ICduby1jYWNoZScgJiZcbiAgICAhaHR0cFJlcXVlc3QucHJldmVudE5vQ2FjaGVDYWNoZUNvbnRyb2xIZWFkZXJNb2RpZmljYXRpb24gJiZcbiAgICAhaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuY29udGFpbnMoJ2NhY2hlLWNvbnRyb2wnLCB0cnVlKVxuICApIHtcbiAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ2NhY2hlLWNvbnRyb2wnLCAnbWF4LWFnZT0wJywgdHJ1ZSlcbiAgfVxuXG4gIC8vICAgIDE3LiBJZiBodHRwUmVxdWVzdOKAmXMgY2FjaGUgbW9kZSBpcyBcIm5vLXN0b3JlXCIgb3IgXCJyZWxvYWRcIiwgdGhlbjpcbiAgaWYgKGh0dHBSZXF1ZXN0LmNhY2hlID09PSAnbm8tc3RvcmUnIHx8IGh0dHBSZXF1ZXN0LmNhY2hlID09PSAncmVsb2FkJykge1xuICAgIC8vIDEuIElmIGh0dHBSZXF1ZXN04oCZcyBoZWFkZXIgbGlzdCBkb2VzIG5vdCBjb250YWluIGBQcmFnbWFgLCB0aGVuIGFwcGVuZFxuICAgIC8vIGBQcmFnbWFgL2Buby1jYWNoZWAgdG8gaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICAgIGlmICghaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuY29udGFpbnMoJ3ByYWdtYScsIHRydWUpKSB7XG4gICAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ3ByYWdtYScsICduby1jYWNoZScsIHRydWUpXG4gICAgfVxuXG4gICAgLy8gMi4gSWYgaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGRvZXMgbm90IGNvbnRhaW4gYENhY2hlLUNvbnRyb2xgLFxuICAgIC8vIHRoZW4gYXBwZW5kIGBDYWNoZS1Db250cm9sYC9gbm8tY2FjaGVgIHRvIGh0dHBSZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgICBpZiAoIWh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCdjYWNoZS1jb250cm9sJywgdHJ1ZSkpIHtcbiAgICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgnY2FjaGUtY29udHJvbCcsICduby1jYWNoZScsIHRydWUpXG4gICAgfVxuICB9XG5cbiAgLy8gICAgMTguIElmIGh0dHBSZXF1ZXN04oCZcyBoZWFkZXIgbGlzdCBjb250YWlucyBgUmFuZ2VgLCB0aGVuIGFwcGVuZFxuICAvLyAgICBgQWNjZXB0LUVuY29kaW5nYC9gaWRlbnRpdHlgIHRvIGh0dHBSZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgaWYgKGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCdyYW5nZScsIHRydWUpKSB7XG4gICAgaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdhY2NlcHQtZW5jb2RpbmcnLCAnaWRlbnRpdHknLCB0cnVlKVxuICB9XG5cbiAgLy8gICAgMTkuIE1vZGlmeSBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgcGVyIEhUVFAuIERvIG5vdCBhcHBlbmQgYSBnaXZlblxuICAvLyAgICBoZWFkZXIgaWYgaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGNvbnRhaW5zIHRoYXQgaGVhZGVy4oCZcyBuYW1lLlxuICAvLyAgICBUT0RPOiBodHRwczovL2dpdGh1Yi5jb20vd2hhdHdnL2ZldGNoL2lzc3Vlcy8xMjg1I2lzc3VlY29tbWVudC04OTY1NjAxMjlcbiAgaWYgKCFodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygnYWNjZXB0LWVuY29kaW5nJywgdHJ1ZSkpIHtcbiAgICBpZiAodXJsSGFzSHR0cHNTY2hlbWUocmVxdWVzdEN1cnJlbnRVUkwoaHR0cFJlcXVlc3QpKSkge1xuICAgICAgaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdhY2NlcHQtZW5jb2RpbmcnLCAnYnIsIGd6aXAsIGRlZmxhdGUnLCB0cnVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ2FjY2VwdC1lbmNvZGluZycsICdnemlwLCBkZWZsYXRlJywgdHJ1ZSlcbiAgICB9XG4gIH1cblxuICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5kZWxldGUoJ2hvc3QnLCB0cnVlKVxuXG4gIC8vICAgIDIwLiBJZiBpbmNsdWRlQ3JlZGVudGlhbHMgaXMgdHJ1ZSwgdGhlbjpcbiAgaWYgKGluY2x1ZGVDcmVkZW50aWFscykge1xuICAgIC8vIDEuIElmIHRoZSB1c2VyIGFnZW50IGlzIG5vdCBjb25maWd1cmVkIHRvIGJsb2NrIGNvb2tpZXMgZm9yIGh0dHBSZXF1ZXN0XG4gICAgLy8gKHNlZSBzZWN0aW9uIDcgb2YgW0NPT0tJRVNdKSwgdGhlbjpcbiAgICAvLyBUT0RPOiBjcmVkZW50aWFsc1xuICAgIC8vIDIuIElmIGh0dHBSZXF1ZXN04oCZcyBoZWFkZXIgbGlzdCBkb2VzIG5vdCBjb250YWluIGBBdXRob3JpemF0aW9uYCwgdGhlbjpcbiAgICAvLyBUT0RPOiBjcmVkZW50aWFsc1xuICB9XG5cbiAgLy8gICAgMjEuIElmIHRoZXJl4oCZcyBhIHByb3h5LWF1dGhlbnRpY2F0aW9uIGVudHJ5LCB1c2UgaXQgYXMgYXBwcm9wcmlhdGUuXG4gIC8vICAgIFRPRE86IHByb3h5LWF1dGhlbnRpY2F0aW9uXG5cbiAgLy8gICAgMjIuIFNldCBodHRwQ2FjaGUgdG8gdGhlIHJlc3VsdCBvZiBkZXRlcm1pbmluZyB0aGUgSFRUUCBjYWNoZVxuICAvLyAgICBwYXJ0aXRpb24sIGdpdmVuIGh0dHBSZXF1ZXN0LlxuICAvLyAgICBUT0RPOiBjYWNoZVxuXG4gIC8vICAgIDIzLiBJZiBodHRwQ2FjaGUgaXMgbnVsbCwgdGhlbiBzZXQgaHR0cFJlcXVlc3TigJlzIGNhY2hlIG1vZGUgdG9cbiAgLy8gICAgXCJuby1zdG9yZVwiLlxuICBpZiAoaHR0cENhY2hlID09IG51bGwpIHtcbiAgICBodHRwUmVxdWVzdC5jYWNoZSA9ICduby1zdG9yZSdcbiAgfVxuXG4gIC8vICAgIDI0LiBJZiBodHRwUmVxdWVzdOKAmXMgY2FjaGUgbW9kZSBpcyBuZWl0aGVyIFwibm8tc3RvcmVcIiBub3IgXCJyZWxvYWRcIixcbiAgLy8gICAgdGhlbjpcbiAgaWYgKGh0dHBSZXF1ZXN0LmNhY2hlICE9PSAnbm8tc3RvcmUnICYmIGh0dHBSZXF1ZXN0LmNhY2hlICE9PSAncmVsb2FkJykge1xuICAgIC8vIFRPRE86IGNhY2hlXG4gIH1cblxuICAvLyA5LiBJZiBhYm9ydGVkLCB0aGVuIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgbmV0d29yayBlcnJvciBmb3IgZmV0Y2hQYXJhbXMuXG4gIC8vIFRPRE9cblxuICAvLyAxMC4gSWYgcmVzcG9uc2UgaXMgbnVsbCwgdGhlbjpcbiAgaWYgKHJlc3BvbnNlID09IG51bGwpIHtcbiAgICAvLyAxLiBJZiBodHRwUmVxdWVzdOKAmXMgY2FjaGUgbW9kZSBpcyBcIm9ubHktaWYtY2FjaGVkXCIsIHRoZW4gcmV0dXJuIGFcbiAgICAvLyBuZXR3b3JrIGVycm9yLlxuICAgIGlmIChodHRwUmVxdWVzdC5jYWNoZSA9PT0gJ29ubHktaWYtY2FjaGVkJykge1xuICAgICAgcmV0dXJuIG1ha2VOZXR3b3JrRXJyb3IoJ29ubHkgaWYgY2FjaGVkJylcbiAgICB9XG5cbiAgICAvLyAyLiBMZXQgZm9yd2FyZFJlc3BvbnNlIGJlIHRoZSByZXN1bHQgb2YgcnVubmluZyBIVFRQLW5ldHdvcmsgZmV0Y2hcbiAgICAvLyBnaXZlbiBodHRwRmV0Y2hQYXJhbXMsIGluY2x1ZGVDcmVkZW50aWFscywgYW5kIGlzTmV3Q29ubmVjdGlvbkZldGNoLlxuICAgIGNvbnN0IGZvcndhcmRSZXNwb25zZSA9IGF3YWl0IGh0dHBOZXR3b3JrRmV0Y2goXG4gICAgICBodHRwRmV0Y2hQYXJhbXMsXG4gICAgICBpbmNsdWRlQ3JlZGVudGlhbHMsXG4gICAgICBpc05ld0Nvbm5lY3Rpb25GZXRjaFxuICAgIClcblxuICAgIC8vIDMuIElmIGh0dHBSZXF1ZXN04oCZcyBtZXRob2QgaXMgdW5zYWZlIGFuZCBmb3J3YXJkUmVzcG9uc2XigJlzIHN0YXR1cyBpc1xuICAgIC8vIGluIHRoZSByYW5nZSAyMDAgdG8gMzk5LCBpbmNsdXNpdmUsIGludmFsaWRhdGUgYXBwcm9wcmlhdGUgc3RvcmVkXG4gICAgLy8gcmVzcG9uc2VzIGluIGh0dHBDYWNoZSwgYXMgcGVyIHRoZSBcIkludmFsaWRhdGlvblwiIGNoYXB0ZXIgb2YgSFRUUFxuICAgIC8vIENhY2hpbmcsIGFuZCBzZXQgc3RvcmVkUmVzcG9uc2UgdG8gbnVsbC4gW0hUVFAtQ0FDSElOR11cbiAgICBpZiAoXG4gICAgICAhc2FmZU1ldGhvZHNTZXQuaGFzKGh0dHBSZXF1ZXN0Lm1ldGhvZCkgJiZcbiAgICAgIGZvcndhcmRSZXNwb25zZS5zdGF0dXMgPj0gMjAwICYmXG4gICAgICBmb3J3YXJkUmVzcG9uc2Uuc3RhdHVzIDw9IDM5OVxuICAgICkge1xuICAgICAgLy8gVE9ETzogY2FjaGVcbiAgICB9XG5cbiAgICAvLyA0LiBJZiB0aGUgcmV2YWxpZGF0aW5nRmxhZyBpcyBzZXQgYW5kIGZvcndhcmRSZXNwb25zZeKAmXMgc3RhdHVzIGlzIDMwNCxcbiAgICAvLyB0aGVuOlxuICAgIGlmIChyZXZhbGlkYXRpbmdGbGFnICYmIGZvcndhcmRSZXNwb25zZS5zdGF0dXMgPT09IDMwNCkge1xuICAgICAgLy8gVE9ETzogY2FjaGVcbiAgICB9XG5cbiAgICAvLyA1LiBJZiByZXNwb25zZSBpcyBudWxsLCB0aGVuOlxuICAgIGlmIChyZXNwb25zZSA9PSBudWxsKSB7XG4gICAgICAvLyAxLiBTZXQgcmVzcG9uc2UgdG8gZm9yd2FyZFJlc3BvbnNlLlxuICAgICAgcmVzcG9uc2UgPSBmb3J3YXJkUmVzcG9uc2VcblxuICAgICAgLy8gMi4gU3RvcmUgaHR0cFJlcXVlc3QgYW5kIGZvcndhcmRSZXNwb25zZSBpbiBodHRwQ2FjaGUsIGFzIHBlciB0aGVcbiAgICAgIC8vIFwiU3RvcmluZyBSZXNwb25zZXMgaW4gQ2FjaGVzXCIgY2hhcHRlciBvZiBIVFRQIENhY2hpbmcuIFtIVFRQLUNBQ0hJTkddXG4gICAgICAvLyBUT0RPOiBjYWNoZVxuICAgIH1cbiAgfVxuXG4gIC8vIDExLiBTZXQgcmVzcG9uc2XigJlzIFVSTCBsaXN0IHRvIGEgY2xvbmUgb2YgaHR0cFJlcXVlc3TigJlzIFVSTCBsaXN0LlxuICByZXNwb25zZS51cmxMaXN0ID0gWy4uLmh0dHBSZXF1ZXN0LnVybExpc3RdXG5cbiAgLy8gMTIuIElmIGh0dHBSZXF1ZXN04oCZcyBoZWFkZXIgbGlzdCBjb250YWlucyBgUmFuZ2VgLCB0aGVuIHNldCByZXNwb25zZeKAmXNcbiAgLy8gcmFuZ2UtcmVxdWVzdGVkIGZsYWcuXG4gIGlmIChodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygncmFuZ2UnLCB0cnVlKSkge1xuICAgIHJlc3BvbnNlLnJhbmdlUmVxdWVzdGVkID0gdHJ1ZVxuICB9XG5cbiAgLy8gMTMuIFNldCByZXNwb25zZeKAmXMgcmVxdWVzdC1pbmNsdWRlcy1jcmVkZW50aWFscyB0byBpbmNsdWRlQ3JlZGVudGlhbHMuXG4gIHJlc3BvbnNlLnJlcXVlc3RJbmNsdWRlc0NyZWRlbnRpYWxzID0gaW5jbHVkZUNyZWRlbnRpYWxzXG5cbiAgLy8gMTQuIElmIHJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgNDAxLCBodHRwUmVxdWVzdOKAmXMgcmVzcG9uc2UgdGFpbnRpbmcgaXMgbm90XG4gIC8vIFwiY29yc1wiLCBpbmNsdWRlQ3JlZGVudGlhbHMgaXMgdHJ1ZSwgYW5kIHJlcXVlc3TigJlzIHdpbmRvdyBpcyBhbiBlbnZpcm9ubWVudFxuICAvLyBzZXR0aW5ncyBvYmplY3QsIHRoZW46XG4gIC8vIFRPRE9cblxuICAvLyAxNS4gSWYgcmVzcG9uc2XigJlzIHN0YXR1cyBpcyA0MDcsIHRoZW46XG4gIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwNykge1xuICAgIC8vIDEuIElmIHJlcXVlc3TigJlzIHdpbmRvdyBpcyBcIm5vLXdpbmRvd1wiLCB0aGVuIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG4gICAgaWYgKHJlcXVlc3Qud2luZG93ID09PSAnbm8td2luZG93Jykge1xuICAgICAgcmV0dXJuIG1ha2VOZXR3b3JrRXJyb3IoKVxuICAgIH1cblxuICAgIC8vIDIuID8/P1xuXG4gICAgLy8gMy4gSWYgZmV0Y2hQYXJhbXMgaXMgY2FuY2VsZWQsIHRoZW4gcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBuZXR3b3JrIGVycm9yIGZvciBmZXRjaFBhcmFtcy5cbiAgICBpZiAoaXNDYW5jZWxsZWQoZmV0Y2hQYXJhbXMpKSB7XG4gICAgICByZXR1cm4gbWFrZUFwcHJvcHJpYXRlTmV0d29ya0Vycm9yKGZldGNoUGFyYW1zKVxuICAgIH1cblxuICAgIC8vIDQuIFByb21wdCB0aGUgZW5kIHVzZXIgYXMgYXBwcm9wcmlhdGUgaW4gcmVxdWVzdOKAmXMgd2luZG93IGFuZCBzdG9yZVxuICAgIC8vIHRoZSByZXN1bHQgYXMgYSBwcm94eS1hdXRoZW50aWNhdGlvbiBlbnRyeS4gW0hUVFAtQVVUSF1cbiAgICAvLyBUT0RPOiBJbnZva2Ugc29tZSBraW5kIG9mIGNhbGxiYWNrP1xuXG4gICAgLy8gNS4gU2V0IHJlc3BvbnNlIHRvIHRoZSByZXN1bHQgb2YgcnVubmluZyBIVFRQLW5ldHdvcmstb3ItY2FjaGUgZmV0Y2ggZ2l2ZW5cbiAgICAvLyBmZXRjaFBhcmFtcy5cbiAgICAvLyBUT0RPXG4gICAgcmV0dXJuIG1ha2VOZXR3b3JrRXJyb3IoJ3Byb3h5IGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkJylcbiAgfVxuXG4gIC8vIDE2LiBJZiBhbGwgb2YgdGhlIGZvbGxvd2luZyBhcmUgdHJ1ZVxuICBpZiAoXG4gICAgLy8gcmVzcG9uc2XigJlzIHN0YXR1cyBpcyA0MjFcbiAgICByZXNwb25zZS5zdGF0dXMgPT09IDQyMSAmJlxuICAgIC8vIGlzTmV3Q29ubmVjdGlvbkZldGNoIGlzIGZhbHNlXG4gICAgIWlzTmV3Q29ubmVjdGlvbkZldGNoICYmXG4gICAgLy8gcmVxdWVzdOKAmXMgYm9keSBpcyBudWxsLCBvciByZXF1ZXN04oCZcyBib2R5IGlzIG5vbi1udWxsIGFuZCByZXF1ZXN04oCZcyBib2R54oCZcyBzb3VyY2UgaXMgbm9uLW51bGxcbiAgICAocmVxdWVzdC5ib2R5ID09IG51bGwgfHwgcmVxdWVzdC5ib2R5LnNvdXJjZSAhPSBudWxsKVxuICApIHtcbiAgICAvLyB0aGVuOlxuXG4gICAgLy8gMS4gSWYgZmV0Y2hQYXJhbXMgaXMgY2FuY2VsZWQsIHRoZW4gcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBuZXR3b3JrIGVycm9yIGZvciBmZXRjaFBhcmFtcy5cbiAgICBpZiAoaXNDYW5jZWxsZWQoZmV0Y2hQYXJhbXMpKSB7XG4gICAgICByZXR1cm4gbWFrZUFwcHJvcHJpYXRlTmV0d29ya0Vycm9yKGZldGNoUGFyYW1zKVxuICAgIH1cblxuICAgIC8vIDIuIFNldCByZXNwb25zZSB0byB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgSFRUUC1uZXR3b3JrLW9yLWNhY2hlXG4gICAgLy8gZmV0Y2ggZ2l2ZW4gZmV0Y2hQYXJhbXMsIGlzQXV0aGVudGljYXRpb25GZXRjaCwgYW5kIHRydWUuXG5cbiAgICAvLyBUT0RPIChzcGVjKTogVGhlIHNwZWMgZG9lc24ndCBzcGVjaWZ5IHRoaXMgYnV0IHdlIG5lZWQgdG8gY2FuY2VsXG4gICAgLy8gdGhlIGFjdGl2ZSByZXNwb25zZSBiZWZvcmUgd2UgY2FuIHN0YXJ0IGEgbmV3IG9uZS5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vd2hhdHdnL2ZldGNoL2lzc3Vlcy8xMjkzXG4gICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb25uZWN0aW9uLmRlc3Ryb3koKVxuXG4gICAgcmVzcG9uc2UgPSBhd2FpdCBodHRwTmV0d29ya09yQ2FjaGVGZXRjaChcbiAgICAgIGZldGNoUGFyYW1zLFxuICAgICAgaXNBdXRoZW50aWNhdGlvbkZldGNoLFxuICAgICAgdHJ1ZVxuICAgIClcbiAgfVxuXG4gIC8vIDE3LiBJZiBpc0F1dGhlbnRpY2F0aW9uRmV0Y2ggaXMgdHJ1ZSwgdGhlbiBjcmVhdGUgYW4gYXV0aGVudGljYXRpb24gZW50cnlcbiAgaWYgKGlzQXV0aGVudGljYXRpb25GZXRjaCkge1xuICAgIC8vIFRPRE9cbiAgfVxuXG4gIC8vIDE4LiBSZXR1cm4gcmVzcG9uc2UuXG4gIHJldHVybiByZXNwb25zZVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaHR0cC1uZXR3b3JrLWZldGNoXG5hc3luYyBmdW5jdGlvbiBodHRwTmV0d29ya0ZldGNoIChcbiAgZmV0Y2hQYXJhbXMsXG4gIGluY2x1ZGVDcmVkZW50aWFscyA9IGZhbHNlLFxuICBmb3JjZU5ld0Nvbm5lY3Rpb24gPSBmYWxzZVxuKSB7XG4gIGFzc2VydCghZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb25uZWN0aW9uIHx8IGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29ubmVjdGlvbi5kZXN0cm95ZWQpXG5cbiAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb25uZWN0aW9uID0ge1xuICAgIGFib3J0OiBudWxsLFxuICAgIGRlc3Ryb3llZDogZmFsc2UsXG4gICAgZGVzdHJveSAoZXJyLCBhYm9ydCA9IHRydWUpIHtcbiAgICAgIGlmICghdGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlXG4gICAgICAgIGlmIChhYm9ydCkge1xuICAgICAgICAgIHRoaXMuYWJvcnQ/LihlcnIgPz8gbmV3IERPTUV4Y2VwdGlvbignVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZC4nLCAnQWJvcnRFcnJvcicpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gMS4gTGV0IHJlcXVlc3QgYmUgZmV0Y2hQYXJhbXPigJlzIHJlcXVlc3QuXG4gIGNvbnN0IHJlcXVlc3QgPSBmZXRjaFBhcmFtcy5yZXF1ZXN0XG5cbiAgLy8gMi4gTGV0IHJlc3BvbnNlIGJlIG51bGwuXG4gIGxldCByZXNwb25zZSA9IG51bGxcblxuICAvLyAzLiBMZXQgdGltaW5nSW5mbyBiZSBmZXRjaFBhcmFtc+KAmXMgdGltaW5nIGluZm8uXG4gIGNvbnN0IHRpbWluZ0luZm8gPSBmZXRjaFBhcmFtcy50aW1pbmdJbmZvXG5cbiAgLy8gNC4gTGV0IGh0dHBDYWNoZSBiZSB0aGUgcmVzdWx0IG9mIGRldGVybWluaW5nIHRoZSBIVFRQIGNhY2hlIHBhcnRpdGlvbixcbiAgLy8gZ2l2ZW4gcmVxdWVzdC5cbiAgLy8gVE9ETzogY2FjaGVcbiAgY29uc3QgaHR0cENhY2hlID0gbnVsbFxuXG4gIC8vIDUuIElmIGh0dHBDYWNoZSBpcyBudWxsLCB0aGVuIHNldCByZXF1ZXN04oCZcyBjYWNoZSBtb2RlIHRvIFwibm8tc3RvcmVcIi5cbiAgaWYgKGh0dHBDYWNoZSA9PSBudWxsKSB7XG4gICAgcmVxdWVzdC5jYWNoZSA9ICduby1zdG9yZSdcbiAgfVxuXG4gIC8vIDYuIExldCBuZXR3b3JrUGFydGl0aW9uS2V5IGJlIHRoZSByZXN1bHQgb2YgZGV0ZXJtaW5pbmcgdGhlIG5ldHdvcmtcbiAgLy8gcGFydGl0aW9uIGtleSBnaXZlbiByZXF1ZXN0LlxuICAvLyBUT0RPXG5cbiAgLy8gNy4gTGV0IG5ld0Nvbm5lY3Rpb24gYmUgXCJ5ZXNcIiBpZiBmb3JjZU5ld0Nvbm5lY3Rpb24gaXMgdHJ1ZTsgb3RoZXJ3aXNlXG4gIC8vIFwibm9cIi5cbiAgY29uc3QgbmV3Q29ubmVjdGlvbiA9IGZvcmNlTmV3Q29ubmVjdGlvbiA/ICd5ZXMnIDogJ25vJyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG5cbiAgLy8gOC4gU3dpdGNoIG9uIHJlcXVlc3TigJlzIG1vZGU6XG4gIGlmIChyZXF1ZXN0Lm1vZGUgPT09ICd3ZWJzb2NrZXQnKSB7XG4gICAgLy8gTGV0IGNvbm5lY3Rpb24gYmUgdGhlIHJlc3VsdCBvZiBvYnRhaW5pbmcgYSBXZWJTb2NrZXQgY29ubmVjdGlvbixcbiAgICAvLyBnaXZlbiByZXF1ZXN04oCZcyBjdXJyZW50IFVSTC5cbiAgICAvLyBUT0RPXG4gIH0gZWxzZSB7XG4gICAgLy8gTGV0IGNvbm5lY3Rpb24gYmUgdGhlIHJlc3VsdCBvZiBvYnRhaW5pbmcgYSBjb25uZWN0aW9uLCBnaXZlblxuICAgIC8vIG5ldHdvcmtQYXJ0aXRpb25LZXksIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBvcmlnaW4sXG4gICAgLy8gaW5jbHVkZUNyZWRlbnRpYWxzLCBhbmQgZm9yY2VOZXdDb25uZWN0aW9uLlxuICAgIC8vIFRPRE9cbiAgfVxuXG4gIC8vIDkuIFJ1biB0aGVzZSBzdGVwcywgYnV0IGFib3J0IHdoZW4gdGhlIG9uZ29pbmcgZmV0Y2ggaXMgdGVybWluYXRlZDpcblxuICAvLyAgICAxLiBJZiBjb25uZWN0aW9uIGlzIGZhaWx1cmUsIHRoZW4gcmV0dXJuIGEgbmV0d29yayBlcnJvci5cblxuICAvLyAgICAyLiBTZXQgdGltaW5nSW5mb+KAmXMgZmluYWwgY29ubmVjdGlvbiB0aW1pbmcgaW5mbyB0byB0aGUgcmVzdWx0IG9mXG4gIC8vICAgIGNhbGxpbmcgY2xhbXAgYW5kIGNvYXJzZW4gY29ubmVjdGlvbiB0aW1pbmcgaW5mbyB3aXRoIGNvbm5lY3Rpb27igJlzXG4gIC8vICAgIHRpbWluZyBpbmZvLCB0aW1pbmdJbmZv4oCZcyBwb3N0LXJlZGlyZWN0IHN0YXJ0IHRpbWUsIGFuZCBmZXRjaFBhcmFtc+KAmXNcbiAgLy8gICAgY3Jvc3Mtb3JpZ2luIGlzb2xhdGVkIGNhcGFiaWxpdHkuXG5cbiAgLy8gICAgMy4gSWYgY29ubmVjdGlvbiBpcyBub3QgYW4gSFRUUC8yIGNvbm5lY3Rpb24sIHJlcXVlc3TigJlzIGJvZHkgaXMgbm9uLW51bGwsXG4gIC8vICAgIGFuZCByZXF1ZXN04oCZcyBib2R54oCZcyBzb3VyY2UgaXMgbnVsbCwgdGhlbiBhcHBlbmQgKGBUcmFuc2Zlci1FbmNvZGluZ2AsXG4gIC8vICAgIGBjaHVua2VkYCkgdG8gcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG5cbiAgLy8gICAgNC4gU2V0IHRpbWluZ0luZm/igJlzIGZpbmFsIG5ldHdvcmstcmVxdWVzdCBzdGFydCB0aW1lIHRvIHRoZSBjb2Fyc2VuZWRcbiAgLy8gICAgc2hhcmVkIGN1cnJlbnQgdGltZSBnaXZlbiBmZXRjaFBhcmFtc+KAmXMgY3Jvc3Mtb3JpZ2luIGlzb2xhdGVkXG4gIC8vICAgIGNhcGFiaWxpdHkuXG5cbiAgLy8gICAgNS4gU2V0IHJlc3BvbnNlIHRvIHRoZSByZXN1bHQgb2YgbWFraW5nIGFuIEhUVFAgcmVxdWVzdCBvdmVyIGNvbm5lY3Rpb25cbiAgLy8gICAgdXNpbmcgcmVxdWVzdCB3aXRoIHRoZSBmb2xsb3dpbmcgY2F2ZWF0czpcblxuICAvLyAgICAgICAgLSBGb2xsb3cgdGhlIHJlbGV2YW50IHJlcXVpcmVtZW50cyBmcm9tIEhUVFAuIFtIVFRQXSBbSFRUUC1TRU1BTlRJQ1NdXG4gIC8vICAgICAgICBbSFRUUC1DT05EXSBbSFRUUC1DQUNISU5HXSBbSFRUUC1BVVRIXVxuXG4gIC8vICAgICAgICAtIElmIHJlcXVlc3TigJlzIGJvZHkgaXMgbm9uLW51bGwsIGFuZCByZXF1ZXN04oCZcyBib2R54oCZcyBzb3VyY2UgaXMgbnVsbCxcbiAgLy8gICAgICAgIHRoZW4gdGhlIHVzZXIgYWdlbnQgbWF5IGhhdmUgYSBidWZmZXIgb2YgdXAgdG8gNjQga2liaWJ5dGVzIGFuZCBzdG9yZVxuICAvLyAgICAgICAgYSBwYXJ0IG9mIHJlcXVlc3TigJlzIGJvZHkgaW4gdGhhdCBidWZmZXIuIElmIHRoZSB1c2VyIGFnZW50IHJlYWRzIGZyb21cbiAgLy8gICAgICAgIHJlcXVlc3TigJlzIGJvZHkgYmV5b25kIHRoYXQgYnVmZmVy4oCZcyBzaXplIGFuZCB0aGUgdXNlciBhZ2VudCBuZWVkcyB0b1xuICAvLyAgICAgICAgcmVzZW5kIHJlcXVlc3QsIHRoZW4gaW5zdGVhZCByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuXG4gIC8vICAgICAgICAtIFNldCB0aW1pbmdJbmZv4oCZcyBmaW5hbCBuZXR3b3JrLXJlc3BvbnNlIHN0YXJ0IHRpbWUgdG8gdGhlIGNvYXJzZW5lZFxuICAvLyAgICAgICAgc2hhcmVkIGN1cnJlbnQgdGltZSBnaXZlbiBmZXRjaFBhcmFtc+KAmXMgY3Jvc3Mtb3JpZ2luIGlzb2xhdGVkIGNhcGFiaWxpdHksXG4gIC8vICAgICAgICBpbW1lZGlhdGVseSBhZnRlciB0aGUgdXNlciBhZ2VudOKAmXMgSFRUUCBwYXJzZXIgcmVjZWl2ZXMgdGhlIGZpcnN0IGJ5dGVcbiAgLy8gICAgICAgIG9mIHRoZSByZXNwb25zZSAoZS5nLiwgZnJhbWUgaGVhZGVyIGJ5dGVzIGZvciBIVFRQLzIgb3IgcmVzcG9uc2Ugc3RhdHVzXG4gIC8vICAgICAgICBsaW5lIGZvciBIVFRQLzEueCkuXG5cbiAgLy8gICAgICAgIC0gV2FpdCB1bnRpbCBhbGwgdGhlIGhlYWRlcnMgYXJlIHRyYW5zbWl0dGVkLlxuXG4gIC8vICAgICAgICAtIEFueSByZXNwb25zZXMgd2hvc2Ugc3RhdHVzIGlzIGluIHRoZSByYW5nZSAxMDAgdG8gMTk5LCBpbmNsdXNpdmUsXG4gIC8vICAgICAgICBhbmQgaXMgbm90IDEwMSwgYXJlIHRvIGJlIGlnbm9yZWQsIGV4Y2VwdCBmb3IgdGhlIHB1cnBvc2VzIG9mIHNldHRpbmdcbiAgLy8gICAgICAgIHRpbWluZ0luZm/igJlzIGZpbmFsIG5ldHdvcmstcmVzcG9uc2Ugc3RhcnQgdGltZSBhYm92ZS5cblxuICAvLyAgICAtIElmIHJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGNvbnRhaW5zIGBUcmFuc2Zlci1FbmNvZGluZ2AvYGNodW5rZWRgIGFuZFxuICAvLyAgICByZXNwb25zZSBpcyB0cmFuc2ZlcnJlZCB2aWEgSFRUUC8xLjAgb3Igb2xkZXIsIHRoZW4gcmV0dXJuIGEgbmV0d29ya1xuICAvLyAgICBlcnJvci5cblxuICAvLyAgICAtIElmIHRoZSBIVFRQIHJlcXVlc3QgcmVzdWx0cyBpbiBhIFRMUyBjbGllbnQgY2VydGlmaWNhdGUgZGlhbG9nLCB0aGVuOlxuXG4gIC8vICAgICAgICAxLiBJZiByZXF1ZXN04oCZcyB3aW5kb3cgaXMgYW4gZW52aXJvbm1lbnQgc2V0dGluZ3Mgb2JqZWN0LCBtYWtlIHRoZVxuICAvLyAgICAgICAgZGlhbG9nIGF2YWlsYWJsZSBpbiByZXF1ZXN04oCZcyB3aW5kb3cuXG5cbiAgLy8gICAgICAgIDIuIE90aGVyd2lzZSwgcmV0dXJuIGEgbmV0d29yayBlcnJvci5cblxuICAvLyBUbyB0cmFuc21pdCByZXF1ZXN04oCZcyBib2R5IGJvZHksIHJ1biB0aGVzZSBzdGVwczpcbiAgbGV0IHJlcXVlc3RCb2R5ID0gbnVsbFxuICAvLyAxLiBJZiBib2R5IGlzIG51bGwgYW5kIGZldGNoUGFyYW1z4oCZcyBwcm9jZXNzIHJlcXVlc3QgZW5kLW9mLWJvZHkgaXNcbiAgLy8gbm9uLW51bGwsIHRoZW4gcXVldWUgYSBmZXRjaCB0YXNrIGdpdmVuIGZldGNoUGFyYW1z4oCZcyBwcm9jZXNzIHJlcXVlc3RcbiAgLy8gZW5kLW9mLWJvZHkgYW5kIGZldGNoUGFyYW1z4oCZcyB0YXNrIGRlc3RpbmF0aW9uLlxuICBpZiAocmVxdWVzdC5ib2R5ID09IG51bGwgJiYgZmV0Y2hQYXJhbXMucHJvY2Vzc1JlcXVlc3RFbmRPZkJvZHkpIHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBmZXRjaFBhcmFtcy5wcm9jZXNzUmVxdWVzdEVuZE9mQm9keSgpKVxuICB9IGVsc2UgaWYgKHJlcXVlc3QuYm9keSAhPSBudWxsKSB7XG4gICAgLy8gMi4gT3RoZXJ3aXNlLCBpZiBib2R5IGlzIG5vbi1udWxsOlxuXG4gICAgLy8gICAgMS4gTGV0IHByb2Nlc3NCb2R5Q2h1bmsgZ2l2ZW4gYnl0ZXMgYmUgdGhlc2Ugc3RlcHM6XG4gICAgY29uc3QgcHJvY2Vzc0JvZHlDaHVuayA9IGFzeW5jIGZ1bmN0aW9uICogKGJ5dGVzKSB7XG4gICAgICAvLyAxLiBJZiB0aGUgb25nb2luZyBmZXRjaCBpcyB0ZXJtaW5hdGVkLCB0aGVuIGFib3J0IHRoZXNlIHN0ZXBzLlxuICAgICAgaWYgKGlzQ2FuY2VsbGVkKGZldGNoUGFyYW1zKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gMi4gUnVuIHRoaXMgc3RlcCBpbiBwYXJhbGxlbDogdHJhbnNtaXQgYnl0ZXMuXG4gICAgICB5aWVsZCBieXRlc1xuXG4gICAgICAvLyAzLiBJZiBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXF1ZXN0IGJvZHkgaXMgbm9uLW51bGwsIHRoZW4gcnVuXG4gICAgICAvLyBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXF1ZXN0IGJvZHkgZ2l2ZW4gYnl0ZXPigJlzIGxlbmd0aC5cbiAgICAgIGZldGNoUGFyYW1zLnByb2Nlc3NSZXF1ZXN0Qm9keUNodW5rTGVuZ3RoPy4oYnl0ZXMuYnl0ZUxlbmd0aClcbiAgICB9XG5cbiAgICAvLyAyLiBMZXQgcHJvY2Vzc0VuZE9mQm9keSBiZSB0aGVzZSBzdGVwczpcbiAgICBjb25zdCBwcm9jZXNzRW5kT2ZCb2R5ID0gKCkgPT4ge1xuICAgICAgLy8gMS4gSWYgZmV0Y2hQYXJhbXMgaXMgY2FuY2VsZWQsIHRoZW4gYWJvcnQgdGhlc2Ugc3RlcHMuXG4gICAgICBpZiAoaXNDYW5jZWxsZWQoZmV0Y2hQYXJhbXMpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyAyLiBJZiBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXF1ZXN0IGVuZC1vZi1ib2R5IGlzIG5vbi1udWxsLFxuICAgICAgLy8gdGhlbiBydW4gZmV0Y2hQYXJhbXPigJlzIHByb2Nlc3MgcmVxdWVzdCBlbmQtb2YtYm9keS5cbiAgICAgIGlmIChmZXRjaFBhcmFtcy5wcm9jZXNzUmVxdWVzdEVuZE9mQm9keSkge1xuICAgICAgICBmZXRjaFBhcmFtcy5wcm9jZXNzUmVxdWVzdEVuZE9mQm9keSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMy4gTGV0IHByb2Nlc3NCb2R5RXJyb3IgZ2l2ZW4gZSBiZSB0aGVzZSBzdGVwczpcbiAgICBjb25zdCBwcm9jZXNzQm9keUVycm9yID0gKGUpID0+IHtcbiAgICAgIC8vIDEuIElmIGZldGNoUGFyYW1zIGlzIGNhbmNlbGVkLCB0aGVuIGFib3J0IHRoZXNlIHN0ZXBzLlxuICAgICAgaWYgKGlzQ2FuY2VsbGVkKGZldGNoUGFyYW1zKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gMi4gSWYgZSBpcyBhbiBcIkFib3J0RXJyb3JcIiBET01FeGNlcHRpb24sIHRoZW4gYWJvcnQgZmV0Y2hQYXJhbXPigJlzIGNvbnRyb2xsZXIuXG4gICAgICBpZiAoZS5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5hYm9ydCgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLnRlcm1pbmF0ZShlKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDQuIEluY3JlbWVudGFsbHkgcmVhZCByZXF1ZXN04oCZcyBib2R5IGdpdmVuIHByb2Nlc3NCb2R5Q2h1bmssIHByb2Nlc3NFbmRPZkJvZHksXG4gICAgLy8gcHJvY2Vzc0JvZHlFcnJvciwgYW5kIGZldGNoUGFyYW1z4oCZcyB0YXNrIGRlc3RpbmF0aW9uLlxuICAgIHJlcXVlc3RCb2R5ID0gKGFzeW5jIGZ1bmN0aW9uICogKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBieXRlcyBvZiByZXF1ZXN0LmJvZHkuc3RyZWFtKSB7XG4gICAgICAgICAgeWllbGQgKiBwcm9jZXNzQm9keUNodW5rKGJ5dGVzKVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3NFbmRPZkJvZHkoKVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHByb2Nlc3NCb2R5RXJyb3IoZXJyKVxuICAgICAgfVxuICAgIH0pKClcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gc29ja2V0IGlzIG9ubHkgcHJvdmlkZWQgZm9yIHdlYnNvY2tldHNcbiAgICBjb25zdCB7IGJvZHksIHN0YXR1cywgc3RhdHVzVGV4dCwgaGVhZGVyc0xpc3QsIHNvY2tldCB9ID0gYXdhaXQgZGlzcGF0Y2goeyBib2R5OiByZXF1ZXN0Qm9keSB9KVxuXG4gICAgaWYgKHNvY2tldCkge1xuICAgICAgcmVzcG9uc2UgPSBtYWtlUmVzcG9uc2UoeyBzdGF0dXMsIHN0YXR1c1RleHQsIGhlYWRlcnNMaXN0LCBzb2NrZXQgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaXRlcmF0b3IgPSBib2R5W1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpXG4gICAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLm5leHQgPSAoKSA9PiBpdGVyYXRvci5uZXh0KClcblxuICAgICAgcmVzcG9uc2UgPSBtYWtlUmVzcG9uc2UoeyBzdGF0dXMsIHN0YXR1c1RleHQsIGhlYWRlcnNMaXN0IH0pXG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyAxMC4gSWYgYWJvcnRlZCwgdGhlbjpcbiAgICBpZiAoZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgLy8gMS4gSWYgY29ubmVjdGlvbiB1c2VzIEhUVFAvMiwgdGhlbiB0cmFuc21pdCBhbiBSU1RfU1RSRUFNIGZyYW1lLlxuICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb25uZWN0aW9uLmRlc3Ryb3koKVxuXG4gICAgICAvLyAyLiBSZXR1cm4gdGhlIGFwcHJvcHJpYXRlIG5ldHdvcmsgZXJyb3IgZm9yIGZldGNoUGFyYW1zLlxuICAgICAgcmV0dXJuIG1ha2VBcHByb3ByaWF0ZU5ldHdvcmtFcnJvcihmZXRjaFBhcmFtcywgZXJyKVxuICAgIH1cblxuICAgIHJldHVybiBtYWtlTmV0d29ya0Vycm9yKGVycilcbiAgfVxuXG4gIC8vIDExLiBMZXQgcHVsbEFsZ29yaXRobSBiZSBhbiBhY3Rpb24gdGhhdCByZXN1bWVzIHRoZSBvbmdvaW5nIGZldGNoXG4gIC8vIGlmIGl0IGlzIHN1c3BlbmRlZC5cbiAgY29uc3QgcHVsbEFsZ29yaXRobSA9IGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBmZXRjaFBhcmFtcy5jb250cm9sbGVyLnJlc3VtZSgpXG4gIH1cblxuICAvLyAxMi4gTGV0IGNhbmNlbEFsZ29yaXRobSBiZSBhbiBhbGdvcml0aG0gdGhhdCBhYm9ydHMgZmV0Y2hQYXJhbXPigJlzXG4gIC8vIGNvbnRyb2xsZXIgd2l0aCByZWFzb24sIGdpdmVuIHJlYXNvbi5cbiAgY29uc3QgY2FuY2VsQWxnb3JpdGhtID0gKHJlYXNvbikgPT4ge1xuICAgIC8vIElmIHRoZSBhYm9ydGVkIGZldGNoIHdhcyBhbHJlYWR5IHRlcm1pbmF0ZWQsIHRoZW4gd2UgZG8gbm90XG4gICAgLy8gbmVlZCB0byBkbyBhbnl0aGluZy5cbiAgICBpZiAoIWlzQ2FuY2VsbGVkKGZldGNoUGFyYW1zKSkge1xuICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5hYm9ydChyZWFzb24pXG4gICAgfVxuICB9XG5cbiAgLy8gMTMuIExldCBoaWdoV2F0ZXJNYXJrIGJlIGEgbm9uLW5lZ2F0aXZlLCBub24tTmFOIG51bWJlciwgY2hvc2VuIGJ5XG4gIC8vIHRoZSB1c2VyIGFnZW50LlxuICAvLyBUT0RPXG5cbiAgLy8gMTQuIExldCBzaXplQWxnb3JpdGhtIGJlIGFuIGFsZ29yaXRobSB0aGF0IGFjY2VwdHMgYSBjaHVuayBvYmplY3RcbiAgLy8gYW5kIHJldHVybnMgYSBub24tbmVnYXRpdmUsIG5vbi1OYU4sIG5vbi1pbmZpbml0ZSBudW1iZXIsIGNob3NlbiBieSB0aGUgdXNlciBhZ2VudC5cbiAgLy8gVE9ET1xuXG4gIC8vIDE1LiBMZXQgc3RyZWFtIGJlIGEgbmV3IFJlYWRhYmxlU3RyZWFtLlxuICAvLyAxNi4gU2V0IHVwIHN0cmVhbSB3aXRoIGJ5dGUgcmVhZGluZyBzdXBwb3J0IHdpdGggcHVsbEFsZ29yaXRobSBzZXQgdG8gcHVsbEFsZ29yaXRobSxcbiAgLy8gICAgIGNhbmNlbEFsZ29yaXRobSBzZXQgdG8gY2FuY2VsQWxnb3JpdGhtLlxuICBjb25zdCBzdHJlYW0gPSBuZXcgUmVhZGFibGVTdHJlYW0oXG4gICAge1xuICAgICAgYXN5bmMgc3RhcnQgKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb250cm9sbGVyID0gY29udHJvbGxlclxuICAgICAgfSxcbiAgICAgIGFzeW5jIHB1bGwgKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgYXdhaXQgcHVsbEFsZ29yaXRobShjb250cm9sbGVyKVxuICAgICAgfSxcbiAgICAgIGFzeW5jIGNhbmNlbCAocmVhc29uKSB7XG4gICAgICAgIGF3YWl0IGNhbmNlbEFsZ29yaXRobShyZWFzb24pXG4gICAgICB9LFxuICAgICAgdHlwZTogJ2J5dGVzJ1xuICAgIH1cbiAgKVxuXG4gIC8vIDE3LiBSdW4gdGhlc2Ugc3RlcHMsIGJ1dCBhYm9ydCB3aGVuIHRoZSBvbmdvaW5nIGZldGNoIGlzIHRlcm1pbmF0ZWQ6XG5cbiAgLy8gICAgMS4gU2V0IHJlc3BvbnNl4oCZcyBib2R5IHRvIGEgbmV3IGJvZHkgd2hvc2Ugc3RyZWFtIGlzIHN0cmVhbS5cbiAgcmVzcG9uc2UuYm9keSA9IHsgc3RyZWFtLCBzb3VyY2U6IG51bGwsIGxlbmd0aDogbnVsbCB9XG5cbiAgLy8gICAgMi4gSWYgcmVzcG9uc2UgaXMgbm90IGEgbmV0d29yayBlcnJvciBhbmQgcmVxdWVzdOKAmXMgY2FjaGUgbW9kZSBpc1xuICAvLyAgICBub3QgXCJuby1zdG9yZVwiLCB0aGVuIHVwZGF0ZSByZXNwb25zZSBpbiBodHRwQ2FjaGUgZm9yIHJlcXVlc3QuXG4gIC8vICAgIFRPRE9cblxuICAvLyAgICAzLiBJZiBpbmNsdWRlQ3JlZGVudGlhbHMgaXMgdHJ1ZSBhbmQgdGhlIHVzZXIgYWdlbnQgaXMgbm90IGNvbmZpZ3VyZWRcbiAgLy8gICAgdG8gYmxvY2sgY29va2llcyBmb3IgcmVxdWVzdCAoc2VlIHNlY3Rpb24gNyBvZiBbQ09PS0lFU10pLCB0aGVuIHJ1biB0aGVcbiAgLy8gICAgXCJzZXQtY29va2llLXN0cmluZ1wiIHBhcnNpbmcgYWxnb3JpdGhtIChzZWUgc2VjdGlvbiA1LjIgb2YgW0NPT0tJRVNdKSBvblxuICAvLyAgICB0aGUgdmFsdWUgb2YgZWFjaCBoZWFkZXIgd2hvc2UgbmFtZSBpcyBhIGJ5dGUtY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBmb3JcbiAgLy8gICAgYFNldC1Db29raWVgIGluIHJlc3BvbnNl4oCZcyBoZWFkZXIgbGlzdCwgaWYgYW55LCBhbmQgcmVxdWVzdOKAmXMgY3VycmVudCBVUkwuXG4gIC8vICAgIFRPRE9cblxuICAvLyAxOC4gSWYgYWJvcnRlZCwgdGhlbjpcbiAgLy8gVE9ET1xuXG4gIC8vIDE5LiBSdW4gdGhlc2Ugc3RlcHMgaW4gcGFyYWxsZWw6XG5cbiAgLy8gICAgMS4gUnVuIHRoZXNlIHN0ZXBzLCBidXQgYWJvcnQgd2hlbiBmZXRjaFBhcmFtcyBpcyBjYW5jZWxlZDpcbiAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5vbkFib3J0ZWQgPSBvbkFib3J0ZWRcbiAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5vbigndGVybWluYXRlZCcsIG9uQWJvcnRlZClcbiAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5yZXN1bWUgPSBhc3luYyAoKSA9PiB7XG4gICAgLy8gMS4gV2hpbGUgdHJ1ZVxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAvLyAxLTMuIFNlZSBvbkRhdGEuLi5cblxuICAgICAgLy8gNC4gU2V0IGJ5dGVzIHRvIHRoZSByZXN1bHQgb2YgaGFuZGxpbmcgY29udGVudCBjb2RpbmdzIGdpdmVuXG4gICAgICAvLyBjb2RpbmdzIGFuZCBieXRlcy5cbiAgICAgIGxldCBieXRlc1xuICAgICAgbGV0IGlzRmFpbHVyZVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5uZXh0KClcblxuICAgICAgICBpZiAoaXNBYm9ydGVkKGZldGNoUGFyYW1zKSkge1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cblxuICAgICAgICBieXRlcyA9IGRvbmUgPyB1bmRlZmluZWQgOiB2YWx1ZVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChmZXRjaFBhcmFtcy5jb250cm9sbGVyLmVuZGVkICYmICF0aW1pbmdJbmZvLmVuY29kZWRCb2R5U2l6ZSkge1xuICAgICAgICAgIC8vIHpsaWIgZG9lc24ndCBsaWtlIGVtcHR5IHN0cmVhbXMuXG4gICAgICAgICAgYnl0ZXMgPSB1bmRlZmluZWRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBieXRlcyA9IGVyclxuXG4gICAgICAgICAgLy8gZXJyIG1heSBiZSBwcm9wYWdhdGVkIGZyb20gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHJlYWRhYmxlc3RyZWFtLmNhbmNlbCxcbiAgICAgICAgICAvLyB3aGljaCBtaWdodCBub3QgYmUgYW4gZXJyb3IuIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2lzc3Vlcy8yMDA5XG4gICAgICAgICAgaXNGYWlsdXJlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChieXRlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIDIuIE90aGVyd2lzZSwgaWYgdGhlIGJ5dGVzIHRyYW5zbWlzc2lvbiBmb3IgcmVzcG9uc2XigJlzIG1lc3NhZ2VcbiAgICAgICAgLy8gYm9keSBpcyBkb25lIG5vcm1hbGx5IGFuZCBzdHJlYW0gaXMgcmVhZGFibGUsIHRoZW4gY2xvc2VcbiAgICAgICAgLy8gc3RyZWFtLCBmaW5hbGl6ZSByZXNwb25zZSBmb3IgZmV0Y2hQYXJhbXMgYW5kIHJlc3BvbnNlLCBhbmRcbiAgICAgICAgLy8gYWJvcnQgdGhlc2UgaW4tcGFyYWxsZWwgc3RlcHMuXG4gICAgICAgIHJlYWRhYmxlU3RyZWFtQ2xvc2UoZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb250cm9sbGVyKVxuXG4gICAgICAgIGZpbmFsaXplUmVzcG9uc2UoZmV0Y2hQYXJhbXMsIHJlc3BvbnNlKVxuXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyA1LiBJbmNyZWFzZSB0aW1pbmdJbmZv4oCZcyBkZWNvZGVkIGJvZHkgc2l6ZSBieSBieXRlc+KAmXMgbGVuZ3RoLlxuICAgICAgdGltaW5nSW5mby5kZWNvZGVkQm9keVNpemUgKz0gYnl0ZXM/LmJ5dGVMZW5ndGggPz8gMFxuXG4gICAgICAvLyA2LiBJZiBieXRlcyBpcyBmYWlsdXJlLCB0aGVuIHRlcm1pbmF0ZSBmZXRjaFBhcmFtc+KAmXMgY29udHJvbGxlci5cbiAgICAgIGlmIChpc0ZhaWx1cmUpIHtcbiAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci50ZXJtaW5hdGUoYnl0ZXMpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyA3LiBFbnF1ZXVlIGEgVWludDhBcnJheSB3cmFwcGluZyBhbiBBcnJheUJ1ZmZlciBjb250YWluaW5nIGJ5dGVzXG4gICAgICAvLyBpbnRvIHN0cmVhbS5cbiAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGJ5dGVzKVxuICAgICAgaWYgKGJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29udHJvbGxlci5lbnF1ZXVlKGJ1ZmZlcilcbiAgICAgIH1cblxuICAgICAgLy8gOC4gSWYgc3RyZWFtIGlzIGVycm9yZWQsIHRoZW4gdGVybWluYXRlIHRoZSBvbmdvaW5nIGZldGNoLlxuICAgICAgaWYgKGlzRXJyb3JlZChzdHJlYW0pKSB7XG4gICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIudGVybWluYXRlKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDkuIElmIHN0cmVhbSBkb2VzbuKAmXQgbmVlZCBtb3JlIGRhdGEgYXNrIHRoZSB1c2VyIGFnZW50IHRvIHN1c3BlbmRcbiAgICAgIC8vIHRoZSBvbmdvaW5nIGZldGNoLlxuICAgICAgaWYgKGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29udHJvbGxlci5kZXNpcmVkU2l6ZSA8PSAwKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vICAgIDIuIElmIGFib3J0ZWQsIHRoZW46XG4gIGZ1bmN0aW9uIG9uQWJvcnRlZCAocmVhc29uKSB7XG4gICAgLy8gMi4gSWYgZmV0Y2hQYXJhbXMgaXMgYWJvcnRlZCwgdGhlbjpcbiAgICBpZiAoaXNBYm9ydGVkKGZldGNoUGFyYW1zKSkge1xuICAgICAgLy8gMS4gU2V0IHJlc3BvbnNl4oCZcyBhYm9ydGVkIGZsYWcuXG4gICAgICByZXNwb25zZS5hYm9ydGVkID0gdHJ1ZVxuXG4gICAgICAvLyAyLiBJZiBzdHJlYW0gaXMgcmVhZGFibGUsIHRoZW4gZXJyb3Igc3RyZWFtIHdpdGggdGhlIHJlc3VsdCBvZlxuICAgICAgLy8gICAgZGVzZXJpYWxpemUgYSBzZXJpYWxpemVkIGFib3J0IHJlYXNvbiBnaXZlbiBmZXRjaFBhcmFtc+KAmXNcbiAgICAgIC8vICAgIGNvbnRyb2xsZXLigJlzIHNlcmlhbGl6ZWQgYWJvcnQgcmVhc29uIGFuZCBhblxuICAgICAgLy8gICAgaW1wbGVtZW50YXRpb24tZGVmaW5lZCByZWFsbS5cbiAgICAgIGlmIChpc1JlYWRhYmxlKHN0cmVhbSkpIHtcbiAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb250cm9sbGVyLmVycm9yKFxuICAgICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuc2VyaWFsaXplZEFib3J0UmVhc29uXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gMy4gT3RoZXJ3aXNlLCBpZiBzdHJlYW0gaXMgcmVhZGFibGUsIGVycm9yIHN0cmVhbSB3aXRoIGEgVHlwZUVycm9yLlxuICAgICAgaWYgKGlzUmVhZGFibGUoc3RyZWFtKSkge1xuICAgICAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLmNvbnRyb2xsZXIuZXJyb3IobmV3IFR5cGVFcnJvcigndGVybWluYXRlZCcsIHtcbiAgICAgICAgICBjYXVzZTogaXNFcnJvckxpa2UocmVhc29uKSA/IHJlYXNvbiA6IHVuZGVmaW5lZFxuICAgICAgICB9KSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA0LiBJZiBjb25uZWN0aW9uIHVzZXMgSFRUUC8yLCB0aGVuIHRyYW5zbWl0IGFuIFJTVF9TVFJFQU0gZnJhbWUuXG4gICAgLy8gNS4gT3RoZXJ3aXNlLCB0aGUgdXNlciBhZ2VudCBzaG91bGQgY2xvc2UgY29ubmVjdGlvbiB1bmxlc3MgaXQgd291bGQgYmUgYmFkIGZvciBwZXJmb3JtYW5jZSB0byBkbyBzby5cbiAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLmNvbm5lY3Rpb24uZGVzdHJveSgpXG4gIH1cblxuICAvLyAyMC4gUmV0dXJuIHJlc3BvbnNlLlxuICByZXR1cm4gcmVzcG9uc2VcblxuICBmdW5jdGlvbiBkaXNwYXRjaCAoeyBib2R5IH0pIHtcbiAgICBjb25zdCB1cmwgPSByZXF1ZXN0Q3VycmVudFVSTChyZXF1ZXN0KVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KCcuLi8uLicpLkFnZW50fSAqL1xuICAgIGNvbnN0IGFnZW50ID0gZmV0Y2hQYXJhbXMuY29udHJvbGxlci5kaXNwYXRjaGVyXG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gYWdlbnQuZGlzcGF0Y2goXG4gICAgICB7XG4gICAgICAgIHBhdGg6IHVybC5wYXRobmFtZSArIHVybC5zZWFyY2gsXG4gICAgICAgIG9yaWdpbjogdXJsLm9yaWdpbixcbiAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgYm9keTogYWdlbnQuaXNNb2NrQWN0aXZlID8gcmVxdWVzdC5ib2R5ICYmIChyZXF1ZXN0LmJvZHkuc291cmNlIHx8IHJlcXVlc3QuYm9keS5zdHJlYW0pIDogYm9keSxcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzTGlzdC5lbnRyaWVzLFxuICAgICAgICBtYXhSZWRpcmVjdGlvbnM6IDAsXG4gICAgICAgIHVwZ3JhZGU6IHJlcXVlc3QubW9kZSA9PT0gJ3dlYnNvY2tldCcgPyAnd2Vic29ja2V0JyA6IHVuZGVmaW5lZFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYm9keTogbnVsbCxcbiAgICAgICAgYWJvcnQ6IG51bGwsXG5cbiAgICAgICAgb25Db25uZWN0IChhYm9ydCkge1xuICAgICAgICAgIC8vIFRPRE8gKGZpeCk6IERvIHdlIG5lZWQgY29ubmVjdGlvbiBoZXJlP1xuICAgICAgICAgIGNvbnN0IHsgY29ubmVjdGlvbiB9ID0gZmV0Y2hQYXJhbXMuY29udHJvbGxlclxuXG4gICAgICAgICAgLy8gU2V0IHRpbWluZ0luZm/igJlzIGZpbmFsIGNvbm5lY3Rpb24gdGltaW5nIGluZm8gdG8gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGNsYW1wIGFuZCBjb2Fyc2VuXG4gICAgICAgICAgLy8gY29ubmVjdGlvbiB0aW1pbmcgaW5mbyB3aXRoIGNvbm5lY3Rpb27igJlzIHRpbWluZyBpbmZvLCB0aW1pbmdJbmZv4oCZcyBwb3N0LXJlZGlyZWN0IHN0YXJ0XG4gICAgICAgICAgLy8gdGltZSwgYW5kIGZldGNoUGFyYW1z4oCZcyBjcm9zcy1vcmlnaW4gaXNvbGF0ZWQgY2FwYWJpbGl0eS5cbiAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgY29ubmVjdGlvbiB0aW1pbmdcbiAgICAgICAgICB0aW1pbmdJbmZvLmZpbmFsQ29ubmVjdGlvblRpbWluZ0luZm8gPSBjbGFtcEFuZENvYXJzZW5Db25uZWN0aW9uVGltaW5nSW5mbyh1bmRlZmluZWQsIHRpbWluZ0luZm8ucG9zdFJlZGlyZWN0U3RhcnRUaW1lLCBmZXRjaFBhcmFtcy5jcm9zc09yaWdpbklzb2xhdGVkQ2FwYWJpbGl0eSlcblxuICAgICAgICAgIGlmIChjb25uZWN0aW9uLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgYWJvcnQobmV3IERPTUV4Y2VwdGlvbignVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZC4nLCAnQWJvcnRFcnJvcicpKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLm9uKCd0ZXJtaW5hdGVkJywgYWJvcnQpXG4gICAgICAgICAgICB0aGlzLmFib3J0ID0gY29ubmVjdGlvbi5hYm9ydCA9IGFib3J0XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2V0IHRpbWluZ0luZm/igJlzIGZpbmFsIG5ldHdvcmstcmVxdWVzdCBzdGFydCB0aW1lIHRvIHRoZSBjb2Fyc2VuZWQgc2hhcmVkIGN1cnJlbnQgdGltZSBnaXZlblxuICAgICAgICAgIC8vIGZldGNoUGFyYW1z4oCZcyBjcm9zcy1vcmlnaW4gaXNvbGF0ZWQgY2FwYWJpbGl0eS5cbiAgICAgICAgICB0aW1pbmdJbmZvLmZpbmFsTmV0d29ya1JlcXVlc3RTdGFydFRpbWUgPSBjb2Fyc2VuZWRTaGFyZWRDdXJyZW50VGltZShmZXRjaFBhcmFtcy5jcm9zc09yaWdpbklzb2xhdGVkQ2FwYWJpbGl0eSlcbiAgICAgICAgfSxcblxuICAgICAgICBvblJlc3BvbnNlU3RhcnRlZCAoKSB7XG4gICAgICAgICAgLy8gU2V0IHRpbWluZ0luZm/igJlzIGZpbmFsIG5ldHdvcmstcmVzcG9uc2Ugc3RhcnQgdGltZSB0byB0aGUgY29hcnNlbmVkIHNoYXJlZCBjdXJyZW50XG4gICAgICAgICAgLy8gdGltZSBnaXZlbiBmZXRjaFBhcmFtc+KAmXMgY3Jvc3Mtb3JpZ2luIGlzb2xhdGVkIGNhcGFiaWxpdHksIGltbWVkaWF0ZWx5IGFmdGVyIHRoZVxuICAgICAgICAgIC8vIHVzZXIgYWdlbnTigJlzIEhUVFAgcGFyc2VyIHJlY2VpdmVzIHRoZSBmaXJzdCBieXRlIG9mIHRoZSByZXNwb25zZSAoZS5nLiwgZnJhbWUgaGVhZGVyXG4gICAgICAgICAgLy8gYnl0ZXMgZm9yIEhUVFAvMiBvciByZXNwb25zZSBzdGF0dXMgbGluZSBmb3IgSFRUUC8xLngpLlxuICAgICAgICAgIHRpbWluZ0luZm8uZmluYWxOZXR3b3JrUmVzcG9uc2VTdGFydFRpbWUgPSBjb2Fyc2VuZWRTaGFyZWRDdXJyZW50VGltZShmZXRjaFBhcmFtcy5jcm9zc09yaWdpbklzb2xhdGVkQ2FwYWJpbGl0eSlcbiAgICAgICAgfSxcblxuICAgICAgICBvbkhlYWRlcnMgKHN0YXR1cywgcmF3SGVhZGVycywgcmVzdW1lLCBzdGF0dXNUZXh0KSB7XG4gICAgICAgICAgaWYgKHN0YXR1cyA8IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IGxvY2F0aW9uID0gJydcblxuICAgICAgICAgIGNvbnN0IGhlYWRlcnNMaXN0ID0gbmV3IEhlYWRlcnNMaXN0KClcblxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3SGVhZGVycy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgaGVhZGVyc0xpc3QuYXBwZW5kKGJ1ZmZlclRvTG93ZXJDYXNlZEhlYWRlck5hbWUocmF3SGVhZGVyc1tpXSksIHJhd0hlYWRlcnNbaSArIDFdLnRvU3RyaW5nKCdsYXRpbjEnKSwgdHJ1ZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgbG9jYXRpb24gPSBoZWFkZXJzTGlzdC5nZXQoJ2xvY2F0aW9uJywgdHJ1ZSlcblxuICAgICAgICAgIHRoaXMuYm9keSA9IG5ldyBSZWFkYWJsZSh7IHJlYWQ6IHJlc3VtZSB9KVxuXG4gICAgICAgICAgY29uc3QgZGVjb2RlcnMgPSBbXVxuXG4gICAgICAgICAgY29uc3Qgd2lsbEZvbGxvdyA9IGxvY2F0aW9uICYmIHJlcXVlc3QucmVkaXJlY3QgPT09ICdmb2xsb3cnICYmXG4gICAgICAgICAgICByZWRpcmVjdFN0YXR1c1NldC5oYXMoc3RhdHVzKVxuXG4gICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9IZWFkZXJzL0NvbnRlbnQtRW5jb2RpbmdcbiAgICAgICAgICBpZiAocmVxdWVzdC5tZXRob2QgIT09ICdIRUFEJyAmJiByZXF1ZXN0Lm1ldGhvZCAhPT0gJ0NPTk5FQ1QnICYmICFudWxsQm9keVN0YXR1cy5pbmNsdWRlcyhzdGF0dXMpICYmICF3aWxsRm9sbG93KSB7XG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNzIzMSNzZWN0aW9uLTMuMS4yLjFcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRFbmNvZGluZyA9IGhlYWRlcnNMaXN0LmdldCgnY29udGVudC1lbmNvZGluZycsIHRydWUpXG4gICAgICAgICAgICAvLyBcIkFsbCBjb250ZW50LWNvZGluZyB2YWx1ZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUuLi5cIlxuICAgICAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICAgICAgICAgIGNvbnN0IGNvZGluZ3MgPSBjb250ZW50RW5jb2RpbmcgPyBjb250ZW50RW5jb2RpbmcudG9Mb3dlckNhc2UoKS5zcGxpdCgnLCcpIDogW11cblxuICAgICAgICAgICAgLy8gTGltaXQgdGhlIG51bWJlciBvZiBjb250ZW50LWVuY29kaW5ncyB0byBwcmV2ZW50IHJlc291cmNlIGV4aGF1c3Rpb24uXG4gICAgICAgICAgICAvLyBDVkUgZml4IHNpbWlsYXIgdG8gdXJsbGliMyAoR0hTQS1nbTYyLXh2MmotNHc1MykgYW5kIGN1cmwgKENWRS0yMDIyLTMyMjA2KS5cbiAgICAgICAgICAgIGNvbnN0IG1heENvbnRlbnRFbmNvZGluZ3MgPSA1XG4gICAgICAgICAgICBpZiAoY29kaW5ncy5sZW5ndGggPiBtYXhDb250ZW50RW5jb2RpbmdzKSB7XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYHRvbyBtYW55IGNvbnRlbnQtZW5jb2RpbmdzIGluIHJlc3BvbnNlOiAke2NvZGluZ3MubGVuZ3RofSwgbWF4aW11bSBhbGxvd2VkIGlzICR7bWF4Q29udGVudEVuY29kaW5nc31gKSlcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGNvZGluZ3MubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgICAgY29uc3QgY29kaW5nID0gY29kaW5nc1tpXS50cmltKClcbiAgICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzkxMTIuaHRtbCNzZWN0aW9uLTcuMlxuICAgICAgICAgICAgICBpZiAoY29kaW5nID09PSAneC1nemlwJyB8fCBjb2RpbmcgPT09ICdnemlwJykge1xuICAgICAgICAgICAgICAgIGRlY29kZXJzLnB1c2goemxpYi5jcmVhdGVHdW56aXAoe1xuICAgICAgICAgICAgICAgICAgLy8gQmUgbGVzcyBzdHJpY3Qgd2hlbiBkZWNvZGluZyBjb21wcmVzc2VkIHJlc3BvbnNlcywgc2luY2Ugc29tZXRpbWVzXG4gICAgICAgICAgICAgICAgICAvLyBzZXJ2ZXJzIHNlbmQgc2xpZ2h0bHkgaW52YWxpZCByZXNwb25zZXMgdGhhdCBhcmUgc3RpbGwgYWNjZXB0ZWRcbiAgICAgICAgICAgICAgICAgIC8vIGJ5IGNvbW1vbiBicm93c2Vycy5cbiAgICAgICAgICAgICAgICAgIC8vIEFsd2F5cyB1c2luZyBaX1NZTkNfRkxVU0ggaXMgd2hhdCBjVVJMIGRvZXMuXG4gICAgICAgICAgICAgICAgICBmbHVzaDogemxpYi5jb25zdGFudHMuWl9TWU5DX0ZMVVNILFxuICAgICAgICAgICAgICAgICAgZmluaXNoRmx1c2g6IHpsaWIuY29uc3RhbnRzLlpfU1lOQ19GTFVTSFxuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGluZyA9PT0gJ2RlZmxhdGUnKSB7XG4gICAgICAgICAgICAgICAgZGVjb2RlcnMucHVzaChjcmVhdGVJbmZsYXRlKHtcbiAgICAgICAgICAgICAgICAgIGZsdXNoOiB6bGliLmNvbnN0YW50cy5aX1NZTkNfRkxVU0gsXG4gICAgICAgICAgICAgICAgICBmaW5pc2hGbHVzaDogemxpYi5jb25zdGFudHMuWl9TWU5DX0ZMVVNIXG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kaW5nID09PSAnYnInKSB7XG4gICAgICAgICAgICAgICAgZGVjb2RlcnMucHVzaCh6bGliLmNyZWF0ZUJyb3RsaURlY29tcHJlc3Moe1xuICAgICAgICAgICAgICAgICAgZmx1c2g6IHpsaWIuY29uc3RhbnRzLkJST1RMSV9PUEVSQVRJT05fRkxVU0gsXG4gICAgICAgICAgICAgICAgICBmaW5pc2hGbHVzaDogemxpYi5jb25zdGFudHMuQlJPVExJX09QRVJBVElPTl9GTFVTSFxuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlY29kZXJzLmxlbmd0aCA9IDBcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgb25FcnJvciA9IHRoaXMub25FcnJvci5iaW5kKHRoaXMpXG5cbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgIHN0YXR1c1RleHQsXG4gICAgICAgICAgICBoZWFkZXJzTGlzdCxcbiAgICAgICAgICAgIGJvZHk6IGRlY29kZXJzLmxlbmd0aFxuICAgICAgICAgICAgICA/IHBpcGVsaW5lKHRoaXMuYm9keSwgLi4uZGVjb2RlcnMsIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoZXJyKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSkub24oJ2Vycm9yJywgb25FcnJvcilcbiAgICAgICAgICAgICAgOiB0aGlzLmJvZHkub24oJ2Vycm9yJywgb25FcnJvcilcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfSxcblxuICAgICAgICBvbkRhdGEgKGNodW5rKSB7XG4gICAgICAgICAgaWYgKGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuZHVtcCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gMS4gSWYgb25lIG9yIG1vcmUgYnl0ZXMgaGF2ZSBiZWVuIHRyYW5zbWl0dGVkIGZyb20gcmVzcG9uc2XigJlzXG4gICAgICAgICAgLy8gbWVzc2FnZSBib2R5LCB0aGVuOlxuXG4gICAgICAgICAgLy8gIDEuIExldCBieXRlcyBiZSB0aGUgdHJhbnNtaXR0ZWQgYnl0ZXMuXG4gICAgICAgICAgY29uc3QgYnl0ZXMgPSBjaHVua1xuXG4gICAgICAgICAgLy8gIDIuIExldCBjb2RpbmdzIGJlIHRoZSByZXN1bHQgb2YgZXh0cmFjdGluZyBoZWFkZXIgbGlzdCB2YWx1ZXNcbiAgICAgICAgICAvLyAgZ2l2ZW4gYENvbnRlbnQtRW5jb2RpbmdgIGFuZCByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3QuXG4gICAgICAgICAgLy8gIFNlZSBwdWxsQWxnb3JpdGhtLlxuXG4gICAgICAgICAgLy8gIDMuIEluY3JlYXNlIHRpbWluZ0luZm/igJlzIGVuY29kZWQgYm9keSBzaXplIGJ5IGJ5dGVz4oCZcyBsZW5ndGguXG4gICAgICAgICAgdGltaW5nSW5mby5lbmNvZGVkQm9keVNpemUgKz0gYnl0ZXMuYnl0ZUxlbmd0aFxuXG4gICAgICAgICAgLy8gIDQuIFNlZSBwdWxsQWxnb3JpdGhtLi4uXG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5ib2R5LnB1c2goYnl0ZXMpXG4gICAgICAgIH0sXG5cbiAgICAgICAgb25Db21wbGV0ZSAoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuYWJvcnQpIHtcbiAgICAgICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIub2ZmKCd0ZXJtaW5hdGVkJywgdGhpcy5hYm9ydClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZmV0Y2hQYXJhbXMuY29udHJvbGxlci5vbkFib3J0ZWQpIHtcbiAgICAgICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIub2ZmKCd0ZXJtaW5hdGVkJywgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5vbkFib3J0ZWQpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5lbmRlZCA9IHRydWVcblxuICAgICAgICAgIHRoaXMuYm9keS5wdXNoKG51bGwpXG4gICAgICAgIH0sXG5cbiAgICAgICAgb25FcnJvciAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAodGhpcy5hYm9ydCkge1xuICAgICAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5vZmYoJ3Rlcm1pbmF0ZWQnLCB0aGlzLmFib3J0KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuYm9keT8uZGVzdHJveShlcnJvcilcblxuICAgICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIudGVybWluYXRlKGVycm9yKVxuXG4gICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICB9LFxuXG4gICAgICAgIG9uVXBncmFkZSAoc3RhdHVzLCByYXdIZWFkZXJzLCBzb2NrZXQpIHtcbiAgICAgICAgICBpZiAoc3RhdHVzICE9PSAxMDEpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGhlYWRlcnNMaXN0ID0gbmV3IEhlYWRlcnNMaXN0KClcblxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3SGVhZGVycy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgaGVhZGVyc0xpc3QuYXBwZW5kKGJ1ZmZlclRvTG93ZXJDYXNlZEhlYWRlck5hbWUocmF3SGVhZGVyc1tpXSksIHJhd0hlYWRlcnNbaSArIDFdLnRvU3RyaW5nKCdsYXRpbjEnKSwgdHJ1ZSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgIHN0YXR1c1RleHQ6IFNUQVRVU19DT0RFU1tzdGF0dXNdLFxuICAgICAgICAgICAgaGVhZGVyc0xpc3QsXG4gICAgICAgICAgICBzb2NrZXRcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICkpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGZldGNoLFxuICBGZXRjaCxcbiAgZmV0Y2hpbmcsXG4gIGZpbmFsaXplQW5kUmVwb3J0VGltaW5nXG59XG4iLCIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGtTdGF0ZTogU3ltYm9sKCdGaWxlUmVhZGVyIHN0YXRlJyksXG4gIGtSZXN1bHQ6IFN5bWJvbCgnRmlsZVJlYWRlciByZXN1bHQnKSxcbiAga0Vycm9yOiBTeW1ib2woJ0ZpbGVSZWFkZXIgZXJyb3InKSxcbiAga0xhc3RQcm9ncmVzc0V2ZW50RmlyZWQ6IFN5bWJvbCgnRmlsZVJlYWRlciBsYXN0IHByb2dyZXNzIGV2ZW50IGZpcmVkIHRpbWVzdGFtcCcpLFxuICBrRXZlbnRzOiBTeW1ib2woJ0ZpbGVSZWFkZXIgZXZlbnRzJyksXG4gIGtBYm9ydGVkOiBTeW1ib2woJ0ZpbGVSZWFkZXIgYWJvcnRlZCcpXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3dlYmlkbCcpXG5cbmNvbnN0IGtTdGF0ZSA9IFN5bWJvbCgnUHJvZ3Jlc3NFdmVudCBzdGF0ZScpXG5cbi8qKlxuICogQHNlZSBodHRwczovL3hoci5zcGVjLndoYXR3Zy5vcmcvI3Byb2dyZXNzZXZlbnRcbiAqL1xuY2xhc3MgUHJvZ3Jlc3NFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgY29uc3RydWN0b3IgKHR5cGUsIGV2ZW50SW5pdERpY3QgPSB7fSkge1xuICAgIHR5cGUgPSB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcodHlwZSwgJ1Byb2dyZXNzRXZlbnQgY29uc3RydWN0b3InLCAndHlwZScpXG4gICAgZXZlbnRJbml0RGljdCA9IHdlYmlkbC5jb252ZXJ0ZXJzLlByb2dyZXNzRXZlbnRJbml0KGV2ZW50SW5pdERpY3QgPz8ge30pXG5cbiAgICBzdXBlcih0eXBlLCBldmVudEluaXREaWN0KVxuXG4gICAgdGhpc1trU3RhdGVdID0ge1xuICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogZXZlbnRJbml0RGljdC5sZW5ndGhDb21wdXRhYmxlLFxuICAgICAgbG9hZGVkOiBldmVudEluaXREaWN0LmxvYWRlZCxcbiAgICAgIHRvdGFsOiBldmVudEluaXREaWN0LnRvdGFsXG4gICAgfVxuICB9XG5cbiAgZ2V0IGxlbmd0aENvbXB1dGFibGUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFByb2dyZXNzRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmxlbmd0aENvbXB1dGFibGVcbiAgfVxuXG4gIGdldCBsb2FkZWQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFByb2dyZXNzRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmxvYWRlZFxuICB9XG5cbiAgZ2V0IHRvdGFsICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBQcm9ncmVzc0V2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS50b3RhbFxuICB9XG59XG5cbndlYmlkbC5jb252ZXJ0ZXJzLlByb2dyZXNzRXZlbnRJbml0ID0gd2ViaWRsLmRpY3Rpb25hcnlDb252ZXJ0ZXIoW1xuICB7XG4gICAga2V5OiAnbGVuZ3RoQ29tcHV0YWJsZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ib29sZWFuLFxuICAgIGRlZmF1bHRWYWx1ZTogKCkgPT4gZmFsc2VcbiAgfSxcbiAge1xuICAgIGtleTogJ2xvYWRlZCcsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVyc1sndW5zaWduZWQgbG9uZyBsb25nJ10sXG4gICAgZGVmYXVsdFZhbHVlOiAoKSA9PiAwXG4gIH0sXG4gIHtcbiAgICBrZXk6ICd0b3RhbCcsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVyc1sndW5zaWduZWQgbG9uZyBsb25nJ10sXG4gICAgZGVmYXVsdFZhbHVlOiAoKSA9PiAwXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdidWJibGVzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4sXG4gICAgZGVmYXVsdFZhbHVlOiAoKSA9PiBmYWxzZVxuICB9LFxuICB7XG4gICAga2V5OiAnY2FuY2VsYWJsZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ib29sZWFuLFxuICAgIGRlZmF1bHRWYWx1ZTogKCkgPT4gZmFsc2VcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbXBvc2VkJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4sXG4gICAgZGVmYXVsdFZhbHVlOiAoKSA9PiBmYWxzZVxuICB9XG5dKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgUHJvZ3Jlc3NFdmVudFxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogQHNlZSBodHRwczovL2VuY29kaW5nLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1lbmNvZGluZy1nZXRcbiAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gbGFiZWxcbiAqL1xuZnVuY3Rpb24gZ2V0RW5jb2RpbmcgKGxhYmVsKSB7XG4gIGlmICghbGFiZWwpIHtcbiAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gIH1cblxuICAvLyAxLiBSZW1vdmUgYW55IGxlYWRpbmcgYW5kIHRyYWlsaW5nIEFTQ0lJIHdoaXRlc3BhY2UgZnJvbSBsYWJlbC5cbiAgLy8gMi4gSWYgbGFiZWwgaXMgYW4gQVNDSUkgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBmb3IgYW55IG9mIHRoZVxuICAvLyAgICBsYWJlbHMgbGlzdGVkIGluIHRoZSB0YWJsZSBiZWxvdywgdGhlbiByZXR1cm4gdGhlXG4gIC8vICAgIGNvcnJlc3BvbmRpbmcgZW5jb2Rpbmc7IG90aGVyd2lzZSByZXR1cm4gZmFpbHVyZS5cbiAgc3dpdGNoIChsYWJlbC50cmltKCkudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ3VuaWNvZGUtMS0xLXV0Zi04JzpcbiAgICBjYXNlICd1bmljb2RlMTF1dGY4JzpcbiAgICBjYXNlICd1bmljb2RlMjB1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAndXRmOCc6XG4gICAgY2FzZSAneC11bmljb2RlMjB1dGY4JzpcbiAgICAgIHJldHVybiAnVVRGLTgnXG4gICAgY2FzZSAnODY2JzpcbiAgICBjYXNlICdjcDg2Nic6XG4gICAgY2FzZSAnY3NpYm04NjYnOlxuICAgIGNhc2UgJ2libTg2Nic6XG4gICAgICByZXR1cm4gJ0lCTTg2NidcbiAgICBjYXNlICdjc2lzb2xhdGluMic6XG4gICAgY2FzZSAnaXNvLTg4NTktMic6XG4gICAgY2FzZSAnaXNvLWlyLTEwMSc6XG4gICAgY2FzZSAnaXNvODg1OS0yJzpcbiAgICBjYXNlICdpc284ODU5Mic6XG4gICAgY2FzZSAnaXNvXzg4NTktMic6XG4gICAgY2FzZSAnaXNvXzg4NTktMjoxOTg3JzpcbiAgICBjYXNlICdsMic6XG4gICAgY2FzZSAnbGF0aW4yJzpcbiAgICAgIHJldHVybiAnSVNPLTg4NTktMidcbiAgICBjYXNlICdjc2lzb2xhdGluMyc6XG4gICAgY2FzZSAnaXNvLTg4NTktMyc6XG4gICAgY2FzZSAnaXNvLWlyLTEwOSc6XG4gICAgY2FzZSAnaXNvODg1OS0zJzpcbiAgICBjYXNlICdpc284ODU5Myc6XG4gICAgY2FzZSAnaXNvXzg4NTktMyc6XG4gICAgY2FzZSAnaXNvXzg4NTktMzoxOTg4JzpcbiAgICBjYXNlICdsMyc6XG4gICAgY2FzZSAnbGF0aW4zJzpcbiAgICAgIHJldHVybiAnSVNPLTg4NTktMydcbiAgICBjYXNlICdjc2lzb2xhdGluNCc6XG4gICAgY2FzZSAnaXNvLTg4NTktNCc6XG4gICAgY2FzZSAnaXNvLWlyLTExMCc6XG4gICAgY2FzZSAnaXNvODg1OS00JzpcbiAgICBjYXNlICdpc284ODU5NCc6XG4gICAgY2FzZSAnaXNvXzg4NTktNCc6XG4gICAgY2FzZSAnaXNvXzg4NTktNDoxOTg4JzpcbiAgICBjYXNlICdsNCc6XG4gICAgY2FzZSAnbGF0aW40JzpcbiAgICAgIHJldHVybiAnSVNPLTg4NTktNCdcbiAgICBjYXNlICdjc2lzb2xhdGluY3lyaWxsaWMnOlxuICAgIGNhc2UgJ2N5cmlsbGljJzpcbiAgICBjYXNlICdpc28tODg1OS01JzpcbiAgICBjYXNlICdpc28taXItMTQ0JzpcbiAgICBjYXNlICdpc284ODU5LTUnOlxuICAgIGNhc2UgJ2lzbzg4NTk1JzpcbiAgICBjYXNlICdpc29fODg1OS01JzpcbiAgICBjYXNlICdpc29fODg1OS01OjE5ODgnOlxuICAgICAgcmV0dXJuICdJU08tODg1OS01J1xuICAgIGNhc2UgJ2FyYWJpYyc6XG4gICAgY2FzZSAnYXNtby03MDgnOlxuICAgIGNhc2UgJ2NzaXNvODg1OTZlJzpcbiAgICBjYXNlICdjc2lzbzg4NTk2aSc6XG4gICAgY2FzZSAnY3Npc29sYXRpbmFyYWJpYyc6XG4gICAgY2FzZSAnZWNtYS0xMTQnOlxuICAgIGNhc2UgJ2lzby04ODU5LTYnOlxuICAgIGNhc2UgJ2lzby04ODU5LTYtZSc6XG4gICAgY2FzZSAnaXNvLTg4NTktNi1pJzpcbiAgICBjYXNlICdpc28taXItMTI3JzpcbiAgICBjYXNlICdpc284ODU5LTYnOlxuICAgIGNhc2UgJ2lzbzg4NTk2JzpcbiAgICBjYXNlICdpc29fODg1OS02JzpcbiAgICBjYXNlICdpc29fODg1OS02OjE5ODcnOlxuICAgICAgcmV0dXJuICdJU08tODg1OS02J1xuICAgIGNhc2UgJ2NzaXNvbGF0aW5ncmVlayc6XG4gICAgY2FzZSAnZWNtYS0xMTgnOlxuICAgIGNhc2UgJ2Vsb3RfOTI4JzpcbiAgICBjYXNlICdncmVlayc6XG4gICAgY2FzZSAnZ3JlZWs4JzpcbiAgICBjYXNlICdpc28tODg1OS03JzpcbiAgICBjYXNlICdpc28taXItMTI2JzpcbiAgICBjYXNlICdpc284ODU5LTcnOlxuICAgIGNhc2UgJ2lzbzg4NTk3JzpcbiAgICBjYXNlICdpc29fODg1OS03JzpcbiAgICBjYXNlICdpc29fODg1OS03OjE5ODcnOlxuICAgIGNhc2UgJ3N1bl9ldV9ncmVlayc6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTcnXG4gICAgY2FzZSAnY3Npc284ODU5OGUnOlxuICAgIGNhc2UgJ2NzaXNvbGF0aW5oZWJyZXcnOlxuICAgIGNhc2UgJ2hlYnJldyc6XG4gICAgY2FzZSAnaXNvLTg4NTktOCc6XG4gICAgY2FzZSAnaXNvLTg4NTktOC1lJzpcbiAgICBjYXNlICdpc28taXItMTM4JzpcbiAgICBjYXNlICdpc284ODU5LTgnOlxuICAgIGNhc2UgJ2lzbzg4NTk4JzpcbiAgICBjYXNlICdpc29fODg1OS04JzpcbiAgICBjYXNlICdpc29fODg1OS04OjE5ODgnOlxuICAgIGNhc2UgJ3Zpc3VhbCc6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTgnXG4gICAgY2FzZSAnY3Npc284ODU5OGknOlxuICAgIGNhc2UgJ2lzby04ODU5LTgtaSc6XG4gICAgY2FzZSAnbG9naWNhbCc6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTgtSSdcbiAgICBjYXNlICdjc2lzb2xhdGluNic6XG4gICAgY2FzZSAnaXNvLTg4NTktMTAnOlxuICAgIGNhc2UgJ2lzby1pci0xNTcnOlxuICAgIGNhc2UgJ2lzbzg4NTktMTAnOlxuICAgIGNhc2UgJ2lzbzg4NTkxMCc6XG4gICAgY2FzZSAnbDYnOlxuICAgIGNhc2UgJ2xhdGluNic6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTEwJ1xuICAgIGNhc2UgJ2lzby04ODU5LTEzJzpcbiAgICBjYXNlICdpc284ODU5LTEzJzpcbiAgICBjYXNlICdpc284ODU5MTMnOlxuICAgICAgcmV0dXJuICdJU08tODg1OS0xMydcbiAgICBjYXNlICdpc28tODg1OS0xNCc6XG4gICAgY2FzZSAnaXNvODg1OS0xNCc6XG4gICAgY2FzZSAnaXNvODg1OTE0JzpcbiAgICAgIHJldHVybiAnSVNPLTg4NTktMTQnXG4gICAgY2FzZSAnY3Npc29sYXRpbjknOlxuICAgIGNhc2UgJ2lzby04ODU5LTE1JzpcbiAgICBjYXNlICdpc284ODU5LTE1JzpcbiAgICBjYXNlICdpc284ODU5MTUnOlxuICAgIGNhc2UgJ2lzb184ODU5LTE1JzpcbiAgICBjYXNlICdsOSc6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTE1J1xuICAgIGNhc2UgJ2lzby04ODU5LTE2JzpcbiAgICAgIHJldHVybiAnSVNPLTg4NTktMTYnXG4gICAgY2FzZSAnY3Nrb2k4cic6XG4gICAgY2FzZSAna29pJzpcbiAgICBjYXNlICdrb2k4JzpcbiAgICBjYXNlICdrb2k4LXInOlxuICAgIGNhc2UgJ2tvaThfcic6XG4gICAgICByZXR1cm4gJ0tPSTgtUidcbiAgICBjYXNlICdrb2k4LXJ1JzpcbiAgICBjYXNlICdrb2k4LXUnOlxuICAgICAgcmV0dXJuICdLT0k4LVUnXG4gICAgY2FzZSAnY3NtYWNpbnRvc2gnOlxuICAgIGNhc2UgJ21hYyc6XG4gICAgY2FzZSAnbWFjaW50b3NoJzpcbiAgICBjYXNlICd4LW1hYy1yb21hbic6XG4gICAgICByZXR1cm4gJ21hY2ludG9zaCdcbiAgICBjYXNlICdpc28tODg1OS0xMSc6XG4gICAgY2FzZSAnaXNvODg1OS0xMSc6XG4gICAgY2FzZSAnaXNvODg1OTExJzpcbiAgICBjYXNlICd0aXMtNjIwJzpcbiAgICBjYXNlICd3aW5kb3dzLTg3NCc6XG4gICAgICByZXR1cm4gJ3dpbmRvd3MtODc0J1xuICAgIGNhc2UgJ2NwMTI1MCc6XG4gICAgY2FzZSAnd2luZG93cy0xMjUwJzpcbiAgICBjYXNlICd4LWNwMTI1MCc6XG4gICAgICByZXR1cm4gJ3dpbmRvd3MtMTI1MCdcbiAgICBjYXNlICdjcDEyNTEnOlxuICAgIGNhc2UgJ3dpbmRvd3MtMTI1MSc6XG4gICAgY2FzZSAneC1jcDEyNTEnOlxuICAgICAgcmV0dXJuICd3aW5kb3dzLTEyNTEnXG4gICAgY2FzZSAnYW5zaV94My40LTE5NjgnOlxuICAgIGNhc2UgJ2FzY2lpJzpcbiAgICBjYXNlICdjcDEyNTInOlxuICAgIGNhc2UgJ2NwODE5JzpcbiAgICBjYXNlICdjc2lzb2xhdGluMSc6XG4gICAgY2FzZSAnaWJtODE5JzpcbiAgICBjYXNlICdpc28tODg1OS0xJzpcbiAgICBjYXNlICdpc28taXItMTAwJzpcbiAgICBjYXNlICdpc284ODU5LTEnOlxuICAgIGNhc2UgJ2lzbzg4NTkxJzpcbiAgICBjYXNlICdpc29fODg1OS0xJzpcbiAgICBjYXNlICdpc29fODg1OS0xOjE5ODcnOlxuICAgIGNhc2UgJ2wxJzpcbiAgICBjYXNlICdsYXRpbjEnOlxuICAgIGNhc2UgJ3VzLWFzY2lpJzpcbiAgICBjYXNlICd3aW5kb3dzLTEyNTInOlxuICAgIGNhc2UgJ3gtY3AxMjUyJzpcbiAgICAgIHJldHVybiAnd2luZG93cy0xMjUyJ1xuICAgIGNhc2UgJ2NwMTI1Myc6XG4gICAgY2FzZSAnd2luZG93cy0xMjUzJzpcbiAgICBjYXNlICd4LWNwMTI1Myc6XG4gICAgICByZXR1cm4gJ3dpbmRvd3MtMTI1MydcbiAgICBjYXNlICdjcDEyNTQnOlxuICAgIGNhc2UgJ2NzaXNvbGF0aW41JzpcbiAgICBjYXNlICdpc28tODg1OS05JzpcbiAgICBjYXNlICdpc28taXItMTQ4JzpcbiAgICBjYXNlICdpc284ODU5LTknOlxuICAgIGNhc2UgJ2lzbzg4NTk5JzpcbiAgICBjYXNlICdpc29fODg1OS05JzpcbiAgICBjYXNlICdpc29fODg1OS05OjE5ODknOlxuICAgIGNhc2UgJ2w1JzpcbiAgICBjYXNlICdsYXRpbjUnOlxuICAgIGNhc2UgJ3dpbmRvd3MtMTI1NCc6XG4gICAgY2FzZSAneC1jcDEyNTQnOlxuICAgICAgcmV0dXJuICd3aW5kb3dzLTEyNTQnXG4gICAgY2FzZSAnY3AxMjU1JzpcbiAgICBjYXNlICd3aW5kb3dzLTEyNTUnOlxuICAgIGNhc2UgJ3gtY3AxMjU1JzpcbiAgICAgIHJldHVybiAnd2luZG93cy0xMjU1J1xuICAgIGNhc2UgJ2NwMTI1Nic6XG4gICAgY2FzZSAnd2luZG93cy0xMjU2JzpcbiAgICBjYXNlICd4LWNwMTI1Nic6XG4gICAgICByZXR1cm4gJ3dpbmRvd3MtMTI1NidcbiAgICBjYXNlICdjcDEyNTcnOlxuICAgIGNhc2UgJ3dpbmRvd3MtMTI1Nyc6XG4gICAgY2FzZSAneC1jcDEyNTcnOlxuICAgICAgcmV0dXJuICd3aW5kb3dzLTEyNTcnXG4gICAgY2FzZSAnY3AxMjU4JzpcbiAgICBjYXNlICd3aW5kb3dzLTEyNTgnOlxuICAgIGNhc2UgJ3gtY3AxMjU4JzpcbiAgICAgIHJldHVybiAnd2luZG93cy0xMjU4J1xuICAgIGNhc2UgJ3gtbWFjLWN5cmlsbGljJzpcbiAgICBjYXNlICd4LW1hYy11a3JhaW5pYW4nOlxuICAgICAgcmV0dXJuICd4LW1hYy1jeXJpbGxpYydcbiAgICBjYXNlICdjaGluZXNlJzpcbiAgICBjYXNlICdjc2diMjMxMic6XG4gICAgY2FzZSAnY3Npc281OGdiMjMxMjgwJzpcbiAgICBjYXNlICdnYjIzMTInOlxuICAgIGNhc2UgJ2diXzIzMTInOlxuICAgIGNhc2UgJ2diXzIzMTItODAnOlxuICAgIGNhc2UgJ2diayc6XG4gICAgY2FzZSAnaXNvLWlyLTU4JzpcbiAgICBjYXNlICd4LWdiayc6XG4gICAgICByZXR1cm4gJ0dCSydcbiAgICBjYXNlICdnYjE4MDMwJzpcbiAgICAgIHJldHVybiAnZ2IxODAzMCdcbiAgICBjYXNlICdiaWc1JzpcbiAgICBjYXNlICdiaWc1LWhrc2NzJzpcbiAgICBjYXNlICdjbi1iaWc1JzpcbiAgICBjYXNlICdjc2JpZzUnOlxuICAgIGNhc2UgJ3gteC1iaWc1JzpcbiAgICAgIHJldHVybiAnQmlnNSdcbiAgICBjYXNlICdjc2V1Y3BrZGZtdGphcGFuZXNlJzpcbiAgICBjYXNlICdldWMtanAnOlxuICAgIGNhc2UgJ3gtZXVjLWpwJzpcbiAgICAgIHJldHVybiAnRVVDLUpQJ1xuICAgIGNhc2UgJ2NzaXNvMjAyMmpwJzpcbiAgICBjYXNlICdpc28tMjAyMi1qcCc6XG4gICAgICByZXR1cm4gJ0lTTy0yMDIyLUpQJ1xuICAgIGNhc2UgJ2Nzc2hpZnRqaXMnOlxuICAgIGNhc2UgJ21zOTMyJzpcbiAgICBjYXNlICdtc19rYW5qaSc6XG4gICAgY2FzZSAnc2hpZnQtamlzJzpcbiAgICBjYXNlICdzaGlmdF9qaXMnOlxuICAgIGNhc2UgJ3NqaXMnOlxuICAgIGNhc2UgJ3dpbmRvd3MtMzFqJzpcbiAgICBjYXNlICd4LXNqaXMnOlxuICAgICAgcmV0dXJuICdTaGlmdF9KSVMnXG4gICAgY2FzZSAnY3NldWNrcic6XG4gICAgY2FzZSAnY3Nrc2M1NjAxMTk4Nyc6XG4gICAgY2FzZSAnZXVjLWtyJzpcbiAgICBjYXNlICdpc28taXItMTQ5JzpcbiAgICBjYXNlICdrb3JlYW4nOlxuICAgIGNhc2UgJ2tzX2NfNTYwMS0xOTg3JzpcbiAgICBjYXNlICdrc19jXzU2MDEtMTk4OSc6XG4gICAgY2FzZSAna3NjNTYwMSc6XG4gICAgY2FzZSAna3NjXzU2MDEnOlxuICAgIGNhc2UgJ3dpbmRvd3MtOTQ5JzpcbiAgICAgIHJldHVybiAnRVVDLUtSJ1xuICAgIGNhc2UgJ2NzaXNvMjAyMmtyJzpcbiAgICBjYXNlICdoei1nYi0yMzEyJzpcbiAgICBjYXNlICdpc28tMjAyMi1jbic6XG4gICAgY2FzZSAnaXNvLTIwMjItY24tZXh0JzpcbiAgICBjYXNlICdpc28tMjAyMi1rcic6XG4gICAgY2FzZSAncmVwbGFjZW1lbnQnOlxuICAgICAgcmV0dXJuICdyZXBsYWNlbWVudCdcbiAgICBjYXNlICd1bmljb2RlZmZmZSc6XG4gICAgY2FzZSAndXRmLTE2YmUnOlxuICAgICAgcmV0dXJuICdVVEYtMTZCRSdcbiAgICBjYXNlICdjc3VuaWNvZGUnOlxuICAgIGNhc2UgJ2lzby0xMDY0Ni11Y3MtMic6XG4gICAgY2FzZSAndWNzLTInOlxuICAgIGNhc2UgJ3VuaWNvZGUnOlxuICAgIGNhc2UgJ3VuaWNvZGVmZWZmJzpcbiAgICBjYXNlICd1dGYtMTYnOlxuICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIHJldHVybiAnVVRGLTE2TEUnXG4gICAgY2FzZSAneC11c2VyLWRlZmluZWQnOlxuICAgICAgcmV0dXJuICd4LXVzZXItZGVmaW5lZCdcbiAgICBkZWZhdWx0OiByZXR1cm4gJ2ZhaWx1cmUnXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldEVuY29kaW5nXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBrU3RhdGUsXG4gIGtFcnJvcixcbiAga1Jlc3VsdCxcbiAga0Fib3J0ZWQsXG4gIGtMYXN0UHJvZ3Jlc3NFdmVudEZpcmVkXG59ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgUHJvZ3Jlc3NFdmVudCB9ID0gcmVxdWlyZSgnLi9wcm9ncmVzc2V2ZW50JylcbmNvbnN0IHsgZ2V0RW5jb2RpbmcgfSA9IHJlcXVpcmUoJy4vZW5jb2RpbmcnKVxuY29uc3QgeyBzZXJpYWxpemVBTWltZVR5cGUsIHBhcnNlTUlNRVR5cGUgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL2RhdGEtdXJsJylcbmNvbnN0IHsgdHlwZXMgfSA9IHJlcXVpcmUoJ25vZGU6dXRpbCcpXG5jb25zdCB7IFN0cmluZ0RlY29kZXIgfSA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyJylcbmNvbnN0IHsgYnRvYSB9ID0gcmVxdWlyZSgnbm9kZTpidWZmZXInKVxuXG4vKiogQHR5cGUge1Byb3BlcnR5RGVzY3JpcHRvcn0gKi9cbmNvbnN0IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMgPSB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiBmYWxzZSxcbiAgY29uZmlndXJhYmxlOiBmYWxzZVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI3JlYWRPcGVyYXRpb25cbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2ZpbGVyZWFkZXInKS5GaWxlUmVhZGVyfSBmclxuICogQHBhcmFtIHtpbXBvcnQoJ2J1ZmZlcicpLkJsb2J9IGJsb2JcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge3N0cmluZz99IGVuY29kaW5nTmFtZVxuICovXG5mdW5jdGlvbiByZWFkT3BlcmF0aW9uIChmciwgYmxvYiwgdHlwZSwgZW5jb2RpbmdOYW1lKSB7XG4gIC8vIDEuIElmIGZy4oCZcyBzdGF0ZSBpcyBcImxvYWRpbmdcIiwgdGhyb3cgYW4gSW52YWxpZFN0YXRlRXJyb3JcbiAgLy8gICAgRE9NRXhjZXB0aW9uLlxuICBpZiAoZnJba1N0YXRlXSA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignSW52YWxpZCBzdGF0ZScsICdJbnZhbGlkU3RhdGVFcnJvcicpXG4gIH1cblxuICAvLyAyLiBTZXQgZnLigJlzIHN0YXRlIHRvIFwibG9hZGluZ1wiLlxuICBmcltrU3RhdGVdID0gJ2xvYWRpbmcnXG5cbiAgLy8gMy4gU2V0IGZy4oCZcyByZXN1bHQgdG8gbnVsbC5cbiAgZnJba1Jlc3VsdF0gPSBudWxsXG5cbiAgLy8gNC4gU2V0IGZy4oCZcyBlcnJvciB0byBudWxsLlxuICBmcltrRXJyb3JdID0gbnVsbFxuXG4gIC8vIDUuIExldCBzdHJlYW0gYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGdldCBzdHJlYW0gb24gYmxvYi5cbiAgLyoqIEB0eXBlIHtpbXBvcnQoJ3N0cmVhbS93ZWInKS5SZWFkYWJsZVN0cmVhbX0gKi9cbiAgY29uc3Qgc3RyZWFtID0gYmxvYi5zdHJlYW0oKVxuXG4gIC8vIDYuIExldCByZWFkZXIgYmUgdGhlIHJlc3VsdCBvZiBnZXR0aW5nIGEgcmVhZGVyIGZyb20gc3RyZWFtLlxuICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKClcblxuICAvLyA3LiBMZXQgYnl0ZXMgYmUgYW4gZW1wdHkgYnl0ZSBzZXF1ZW5jZS5cbiAgLyoqIEB0eXBlIHtVaW50OEFycmF5W119ICovXG4gIGNvbnN0IGJ5dGVzID0gW11cblxuICAvLyA4LiBMZXQgY2h1bmtQcm9taXNlIGJlIHRoZSByZXN1bHQgb2YgcmVhZGluZyBhIGNodW5rIGZyb21cbiAgLy8gICAgc3RyZWFtIHdpdGggcmVhZGVyLlxuICBsZXQgY2h1bmtQcm9taXNlID0gcmVhZGVyLnJlYWQoKVxuXG4gIC8vIDkuIExldCBpc0ZpcnN0Q2h1bmsgYmUgdHJ1ZS5cbiAgbGV0IGlzRmlyc3RDaHVuayA9IHRydWVcblxuICAvLyAxMC4gSW4gcGFyYWxsZWwsIHdoaWxlIHRydWU6XG4gIC8vIE5vdGU6IFwiSW4gcGFyYWxsZWxcIiBqdXN0IG1lYW5zIG5vbi1ibG9ja2luZ1xuICAvLyBOb3RlIDI6IHJlYWRPcGVyYXRpb24gaXRzZWxmIGNhbm5vdCBiZSBhc3luYyBhcyBkb3VibGVcbiAgLy8gcmVhZGluZyB0aGUgYm9keSB3b3VsZCB0aGVuIHJlamVjdCB0aGUgcHJvbWlzZSwgaW5zdGVhZFxuICAvLyBvZiB0aHJvd2luZyBhbiBlcnJvci5cbiAgOyhhc3luYyAoKSA9PiB7XG4gICAgd2hpbGUgKCFmcltrQWJvcnRlZF0pIHtcbiAgICAgIC8vIDEuIFdhaXQgZm9yIGNodW5rUHJvbWlzZSB0byBiZSBmdWxmaWxsZWQgb3IgcmVqZWN0ZWQuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCBjaHVua1Byb21pc2VcblxuICAgICAgICAvLyAyLiBJZiBjaHVua1Byb21pc2UgaXMgZnVsZmlsbGVkLCBhbmQgaXNGaXJzdENodW5rIGlzXG4gICAgICAgIC8vICAgIHRydWUsIHF1ZXVlIGEgdGFzayB0byBmaXJlIGEgcHJvZ3Jlc3MgZXZlbnQgY2FsbGVkXG4gICAgICAgIC8vICAgIGxvYWRzdGFydCBhdCBmci5cbiAgICAgICAgaWYgKGlzRmlyc3RDaHVuayAmJiAhZnJba0Fib3J0ZWRdKSB7XG4gICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgZmlyZUFQcm9ncmVzc0V2ZW50KCdsb2Fkc3RhcnQnLCBmcilcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMy4gU2V0IGlzRmlyc3RDaHVuayB0byBmYWxzZS5cbiAgICAgICAgaXNGaXJzdENodW5rID0gZmFsc2VcblxuICAgICAgICAvLyA0LiBJZiBjaHVua1Byb21pc2UgaXMgZnVsZmlsbGVkIHdpdGggYW4gb2JqZWN0IHdob3NlXG4gICAgICAgIC8vICAgIGRvbmUgcHJvcGVydHkgaXMgZmFsc2UgYW5kIHdob3NlIHZhbHVlIHByb3BlcnR5IGlzXG4gICAgICAgIC8vICAgIGEgVWludDhBcnJheSBvYmplY3QsIHJ1biB0aGVzZSBzdGVwczpcbiAgICAgICAgaWYgKCFkb25lICYmIHR5cGVzLmlzVWludDhBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAvLyAxLiBMZXQgYnMgYmUgdGhlIGJ5dGUgc2VxdWVuY2UgcmVwcmVzZW50ZWQgYnkgdGhlXG4gICAgICAgICAgLy8gICAgVWludDhBcnJheSBvYmplY3QuXG5cbiAgICAgICAgICAvLyAyLiBBcHBlbmQgYnMgdG8gYnl0ZXMuXG4gICAgICAgICAgYnl0ZXMucHVzaCh2YWx1ZSlcblxuICAgICAgICAgIC8vIDMuIElmIHJvdWdobHkgNTBtcyBoYXZlIHBhc3NlZCBzaW5jZSB0aGVzZSBzdGVwc1xuICAgICAgICAgIC8vICAgIHdlcmUgbGFzdCBpbnZva2VkLCBxdWV1ZSBhIHRhc2sgdG8gZmlyZSBhXG4gICAgICAgICAgLy8gICAgcHJvZ3Jlc3MgZXZlbnQgY2FsbGVkIHByb2dyZXNzIGF0IGZyLlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgZnJba0xhc3RQcm9ncmVzc0V2ZW50RmlyZWRdID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgRGF0ZS5ub3coKSAtIGZyW2tMYXN0UHJvZ3Jlc3NFdmVudEZpcmVkXSA+PSA1MFxuICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgIWZyW2tBYm9ydGVkXVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZnJba0xhc3RQcm9ncmVzc0V2ZW50RmlyZWRdID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgICBmaXJlQVByb2dyZXNzRXZlbnQoJ3Byb2dyZXNzJywgZnIpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIDQuIFNldCBjaHVua1Byb21pc2UgdG8gdGhlIHJlc3VsdCBvZiByZWFkaW5nIGFcbiAgICAgICAgICAvLyAgICBjaHVuayBmcm9tIHN0cmVhbSB3aXRoIHJlYWRlci5cbiAgICAgICAgICBjaHVua1Byb21pc2UgPSByZWFkZXIucmVhZCgpXG4gICAgICAgIH0gZWxzZSBpZiAoZG9uZSkge1xuICAgICAgICAgIC8vIDUuIE90aGVyd2lzZSwgaWYgY2h1bmtQcm9taXNlIGlzIGZ1bGZpbGxlZCB3aXRoIGFuXG4gICAgICAgICAgLy8gICAgb2JqZWN0IHdob3NlIGRvbmUgcHJvcGVydHkgaXMgdHJ1ZSwgcXVldWUgYSB0YXNrXG4gICAgICAgICAgLy8gICAgdG8gcnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgYW5kIGFib3J0IHRoaXMgYWxnb3JpdGhtOlxuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgIC8vIDEuIFNldCBmcuKAmXMgc3RhdGUgdG8gXCJkb25lXCIuXG4gICAgICAgICAgICBmcltrU3RhdGVdID0gJ2RvbmUnXG5cbiAgICAgICAgICAgIC8vIDIuIExldCByZXN1bHQgYmUgdGhlIHJlc3VsdCBvZiBwYWNrYWdlIGRhdGEgZ2l2ZW5cbiAgICAgICAgICAgIC8vICAgIGJ5dGVzLCB0eXBlLCBibG9i4oCZcyB0eXBlLCBhbmQgZW5jb2RpbmdOYW1lLlxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcGFja2FnZURhdGEoYnl0ZXMsIHR5cGUsIGJsb2IudHlwZSwgZW5jb2RpbmdOYW1lKVxuXG4gICAgICAgICAgICAgIC8vIDQuIEVsc2U6XG5cbiAgICAgICAgICAgICAgaWYgKGZyW2tBYm9ydGVkXSkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gMS4gU2V0IGZy4oCZcyByZXN1bHQgdG8gcmVzdWx0LlxuICAgICAgICAgICAgICBmcltrUmVzdWx0XSA9IHJlc3VsdFxuXG4gICAgICAgICAgICAgIC8vIDIuIEZpcmUgYSBwcm9ncmVzcyBldmVudCBjYWxsZWQgbG9hZCBhdCB0aGUgZnIuXG4gICAgICAgICAgICAgIGZpcmVBUHJvZ3Jlc3NFdmVudCgnbG9hZCcsIGZyKVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgLy8gMy4gSWYgcGFja2FnZSBkYXRhIHRocmV3IGFuIGV4Y2VwdGlvbiBlcnJvcjpcblxuICAgICAgICAgICAgICAvLyAxLiBTZXQgZnLigJlzIGVycm9yIHRvIGVycm9yLlxuICAgICAgICAgICAgICBmcltrRXJyb3JdID0gZXJyb3JcblxuICAgICAgICAgICAgICAvLyAyLiBGaXJlIGEgcHJvZ3Jlc3MgZXZlbnQgY2FsbGVkIGVycm9yIGF0IGZyLlxuICAgICAgICAgICAgICBmaXJlQVByb2dyZXNzRXZlbnQoJ2Vycm9yJywgZnIpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIDUuIElmIGZy4oCZcyBzdGF0ZSBpcyBub3QgXCJsb2FkaW5nXCIsIGZpcmUgYSBwcm9ncmVzc1xuICAgICAgICAgICAgLy8gICAgZXZlbnQgY2FsbGVkIGxvYWRlbmQgYXQgdGhlIGZyLlxuICAgICAgICAgICAgaWYgKGZyW2tTdGF0ZV0gIT09ICdsb2FkaW5nJykge1xuICAgICAgICAgICAgICBmaXJlQVByb2dyZXNzRXZlbnQoJ2xvYWRlbmQnLCBmcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGZyW2tBYm9ydGVkXSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNi4gT3RoZXJ3aXNlLCBpZiBjaHVua1Byb21pc2UgaXMgcmVqZWN0ZWQgd2l0aCBhblxuICAgICAgICAvLyAgICBlcnJvciBlcnJvciwgcXVldWUgYSB0YXNrIHRvIHJ1biB0aGUgZm9sbG93aW5nXG4gICAgICAgIC8vICAgIHN0ZXBzIGFuZCBhYm9ydCB0aGlzIGFsZ29yaXRobTpcbiAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgIC8vIDEuIFNldCBmcuKAmXMgc3RhdGUgdG8gXCJkb25lXCIuXG4gICAgICAgICAgZnJba1N0YXRlXSA9ICdkb25lJ1xuXG4gICAgICAgICAgLy8gMi4gU2V0IGZy4oCZcyBlcnJvciB0byBlcnJvci5cbiAgICAgICAgICBmcltrRXJyb3JdID0gZXJyb3JcblxuICAgICAgICAgIC8vIDMuIEZpcmUgYSBwcm9ncmVzcyBldmVudCBjYWxsZWQgZXJyb3IgYXQgZnIuXG4gICAgICAgICAgZmlyZUFQcm9ncmVzc0V2ZW50KCdlcnJvcicsIGZyKVxuXG4gICAgICAgICAgLy8gNC4gSWYgZnLigJlzIHN0YXRlIGlzIG5vdCBcImxvYWRpbmdcIiwgZmlyZSBhIHByb2dyZXNzXG4gICAgICAgICAgLy8gICAgZXZlbnQgY2FsbGVkIGxvYWRlbmQgYXQgZnIuXG4gICAgICAgICAgaWYgKGZyW2tTdGF0ZV0gIT09ICdsb2FkaW5nJykge1xuICAgICAgICAgICAgZmlyZUFQcm9ncmVzc0V2ZW50KCdsb2FkZW5kJywgZnIpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9KSgpXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jZmlyZS1hLXByb2dyZXNzLWV2ZW50XG4gKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1ldmVudC1maXJlXG4gKiBAcGFyYW0ge3N0cmluZ30gZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2ZpbGVyZWFkZXInKS5GaWxlUmVhZGVyfSByZWFkZXJcbiAqL1xuZnVuY3Rpb24gZmlyZUFQcm9ncmVzc0V2ZW50IChlLCByZWFkZXIpIHtcbiAgLy8gVGhlIHByb2dyZXNzIGV2ZW50IGUgZG9lcyBub3QgYnViYmxlLiBlLmJ1YmJsZXMgbXVzdCBiZSBmYWxzZVxuICAvLyBUaGUgcHJvZ3Jlc3MgZXZlbnQgZSBpcyBOT1QgY2FuY2VsYWJsZS4gZS5jYW5jZWxhYmxlIG11c3QgYmUgZmFsc2VcbiAgY29uc3QgZXZlbnQgPSBuZXcgUHJvZ3Jlc3NFdmVudChlLCB7XG4gICAgYnViYmxlczogZmFsc2UsXG4gICAgY2FuY2VsYWJsZTogZmFsc2VcbiAgfSlcblxuICByZWFkZXIuZGlzcGF0Y2hFdmVudChldmVudClcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9GaWxlQVBJLyNibG9iLXBhY2thZ2UtZGF0YVxuICogQHBhcmFtIHtVaW50OEFycmF5W119IGJ5dGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtzdHJpbmc/fSBtaW1lVHlwZVxuICogQHBhcmFtIHtzdHJpbmc/fSBlbmNvZGluZ05hbWVcbiAqL1xuZnVuY3Rpb24gcGFja2FnZURhdGEgKGJ5dGVzLCB0eXBlLCBtaW1lVHlwZSwgZW5jb2RpbmdOYW1lKSB7XG4gIC8vIDEuIEEgQmxvYiBoYXMgYW4gYXNzb2NpYXRlZCBwYWNrYWdlIGRhdGEgYWxnb3JpdGhtLCBnaXZlblxuICAvLyAgICBieXRlcywgYSB0eXBlLCBhIG9wdGlvbmFsIG1pbWVUeXBlLCBhbmQgYSBvcHRpb25hbFxuICAvLyAgICBlbmNvZGluZ05hbWUsIHdoaWNoIHN3aXRjaGVzIG9uIHR5cGUgYW5kIHJ1bnMgdGhlXG4gIC8vICAgIGFzc29jaWF0ZWQgc3RlcHM6XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnRGF0YVVSTCc6IHtcbiAgICAgIC8vIDEuIFJldHVybiBieXRlcyBhcyBhIERhdGFVUkwgW1JGQzIzOTddIHN1YmplY3QgdG9cbiAgICAgIC8vICAgIHRoZSBjb25zaWRlcmF0aW9ucyBiZWxvdzpcbiAgICAgIC8vICAqIFVzZSBtaW1lVHlwZSBhcyBwYXJ0IG9mIHRoZSBEYXRhIFVSTCBpZiBpdCBpc1xuICAgICAgLy8gICAgYXZhaWxhYmxlIGluIGtlZXBpbmcgd2l0aCB0aGUgRGF0YSBVUkxcbiAgICAgIC8vICAgIHNwZWNpZmljYXRpb24gW1JGQzIzOTddLlxuICAgICAgLy8gICogSWYgbWltZVR5cGUgaXMgbm90IGF2YWlsYWJsZSByZXR1cm4gYSBEYXRhIFVSTFxuICAgICAgLy8gICAgd2l0aG91dCBhIG1lZGlhLXR5cGUuIFtSRkMyMzk3XS5cblxuICAgICAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMyMzk3I3NlY3Rpb24tM1xuICAgICAgLy8gZGF0YXVybCAgICA6PSBcImRhdGE6XCIgWyBtZWRpYXR5cGUgXSBbIFwiO2Jhc2U2NFwiIF0gXCIsXCIgZGF0YVxuICAgICAgLy8gbWVkaWF0eXBlICA6PSBbIHR5cGUgXCIvXCIgc3VidHlwZSBdICooIFwiO1wiIHBhcmFtZXRlciApXG4gICAgICAvLyBkYXRhICAgICAgIDo9ICp1cmxjaGFyXG4gICAgICAvLyBwYXJhbWV0ZXIgIDo9IGF0dHJpYnV0ZSBcIj1cIiB2YWx1ZVxuICAgICAgbGV0IGRhdGFVUkwgPSAnZGF0YTonXG5cbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlTUlNRVR5cGUobWltZVR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpXG5cbiAgICAgIGlmIChwYXJzZWQgIT09ICdmYWlsdXJlJykge1xuICAgICAgICBkYXRhVVJMICs9IHNlcmlhbGl6ZUFNaW1lVHlwZShwYXJzZWQpXG4gICAgICB9XG5cbiAgICAgIGRhdGFVUkwgKz0gJztiYXNlNjQsJ1xuXG4gICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoJ2xhdGluMScpXG5cbiAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgYnl0ZXMpIHtcbiAgICAgICAgZGF0YVVSTCArPSBidG9hKGRlY29kZXIud3JpdGUoY2h1bmspKVxuICAgICAgfVxuXG4gICAgICBkYXRhVVJMICs9IGJ0b2EoZGVjb2Rlci5lbmQoKSlcblxuICAgICAgcmV0dXJuIGRhdGFVUkxcbiAgICB9XG4gICAgY2FzZSAnVGV4dCc6IHtcbiAgICAgIC8vIDEuIExldCBlbmNvZGluZyBiZSBmYWlsdXJlXG4gICAgICBsZXQgZW5jb2RpbmcgPSAnZmFpbHVyZSdcblxuICAgICAgLy8gMi4gSWYgdGhlIGVuY29kaW5nTmFtZSBpcyBwcmVzZW50LCBzZXQgZW5jb2RpbmcgdG8gdGhlXG4gICAgICAvLyAgICByZXN1bHQgb2YgZ2V0dGluZyBhbiBlbmNvZGluZyBmcm9tIGVuY29kaW5nTmFtZS5cbiAgICAgIGlmIChlbmNvZGluZ05hbWUpIHtcbiAgICAgICAgZW5jb2RpbmcgPSBnZXRFbmNvZGluZyhlbmNvZGluZ05hbWUpXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIElmIGVuY29kaW5nIGlzIGZhaWx1cmUsIGFuZCBtaW1lVHlwZSBpcyBwcmVzZW50OlxuICAgICAgaWYgKGVuY29kaW5nID09PSAnZmFpbHVyZScgJiYgbWltZVR5cGUpIHtcbiAgICAgICAgLy8gMS4gTGV0IHR5cGUgYmUgdGhlIHJlc3VsdCBvZiBwYXJzZSBhIE1JTUUgdHlwZVxuICAgICAgICAvLyAgICBnaXZlbiBtaW1lVHlwZS5cbiAgICAgICAgY29uc3QgdHlwZSA9IHBhcnNlTUlNRVR5cGUobWltZVR5cGUpXG5cbiAgICAgICAgLy8gMi4gSWYgdHlwZSBpcyBub3QgZmFpbHVyZSwgc2V0IGVuY29kaW5nIHRvIHRoZSByZXN1bHRcbiAgICAgICAgLy8gICAgb2YgZ2V0dGluZyBhbiBlbmNvZGluZyBmcm9tIHR5cGXigJlzIHBhcmFtZXRlcnNbXCJjaGFyc2V0XCJdLlxuICAgICAgICBpZiAodHlwZSAhPT0gJ2ZhaWx1cmUnKSB7XG4gICAgICAgICAgZW5jb2RpbmcgPSBnZXRFbmNvZGluZyh0eXBlLnBhcmFtZXRlcnMuZ2V0KCdjaGFyc2V0JykpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gNC4gSWYgZW5jb2RpbmcgaXMgZmFpbHVyZSwgdGhlbiBzZXQgZW5jb2RpbmcgdG8gVVRGLTguXG4gICAgICBpZiAoZW5jb2RpbmcgPT09ICdmYWlsdXJlJykge1xuICAgICAgICBlbmNvZGluZyA9ICdVVEYtOCdcbiAgICAgIH1cblxuICAgICAgLy8gNS4gRGVjb2RlIGJ5dGVzIHVzaW5nIGZhbGxiYWNrIGVuY29kaW5nIGVuY29kaW5nLCBhbmRcbiAgICAgIC8vICAgIHJldHVybiB0aGUgcmVzdWx0LlxuICAgICAgcmV0dXJuIGRlY29kZShieXRlcywgZW5jb2RpbmcpXG4gICAgfVxuICAgIGNhc2UgJ0FycmF5QnVmZmVyJzoge1xuICAgICAgLy8gUmV0dXJuIGEgbmV3IEFycmF5QnVmZmVyIHdob3NlIGNvbnRlbnRzIGFyZSBieXRlcy5cbiAgICAgIGNvbnN0IHNlcXVlbmNlID0gY29tYmluZUJ5dGVTZXF1ZW5jZXMoYnl0ZXMpXG5cbiAgICAgIHJldHVybiBzZXF1ZW5jZS5idWZmZXJcbiAgICB9XG4gICAgY2FzZSAnQmluYXJ5U3RyaW5nJzoge1xuICAgICAgLy8gUmV0dXJuIGJ5dGVzIGFzIGEgYmluYXJ5IHN0cmluZywgaW4gd2hpY2ggZXZlcnkgYnl0ZVxuICAgICAgLy8gIGlzIHJlcHJlc2VudGVkIGJ5IGEgY29kZSB1bml0IG9mIGVxdWFsIHZhbHVlIFswLi4yNTVdLlxuICAgICAgbGV0IGJpbmFyeVN0cmluZyA9ICcnXG5cbiAgICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcignbGF0aW4xJylcblxuICAgICAgZm9yIChjb25zdCBjaHVuayBvZiBieXRlcykge1xuICAgICAgICBiaW5hcnlTdHJpbmcgKz0gZGVjb2Rlci53cml0ZShjaHVuaylcbiAgICAgIH1cblxuICAgICAgYmluYXJ5U3RyaW5nICs9IGRlY29kZXIuZW5kKClcblxuICAgICAgcmV0dXJuIGJpbmFyeVN0cmluZ1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI2RlY29kZVxuICogQHBhcmFtIHtVaW50OEFycmF5W119IGlvUXVldWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGluZ1xuICovXG5mdW5jdGlvbiBkZWNvZGUgKGlvUXVldWUsIGVuY29kaW5nKSB7XG4gIGNvbnN0IGJ5dGVzID0gY29tYmluZUJ5dGVTZXF1ZW5jZXMoaW9RdWV1ZSlcblxuICAvLyAxLiBMZXQgQk9NRW5jb2RpbmcgYmUgdGhlIHJlc3VsdCBvZiBCT00gc25pZmZpbmcgaW9RdWV1ZS5cbiAgY29uc3QgQk9NRW5jb2RpbmcgPSBCT01TbmlmZmluZyhieXRlcylcblxuICBsZXQgc2xpY2UgPSAwXG5cbiAgLy8gMi4gSWYgQk9NRW5jb2RpbmcgaXMgbm9uLW51bGw6XG4gIGlmIChCT01FbmNvZGluZyAhPT0gbnVsbCkge1xuICAgIC8vIDEuIFNldCBlbmNvZGluZyB0byBCT01FbmNvZGluZy5cbiAgICBlbmNvZGluZyA9IEJPTUVuY29kaW5nXG5cbiAgICAvLyAyLiBSZWFkIHRocmVlIGJ5dGVzIGZyb20gaW9RdWV1ZSwgaWYgQk9NRW5jb2RpbmcgaXNcbiAgICAvLyAgICBVVEYtODsgb3RoZXJ3aXNlIHJlYWQgdHdvIGJ5dGVzLlxuICAgIC8vICAgIChEbyBub3RoaW5nIHdpdGggdGhvc2UgYnl0ZXMuKVxuICAgIHNsaWNlID0gQk9NRW5jb2RpbmcgPT09ICdVVEYtOCcgPyAzIDogMlxuICB9XG5cbiAgLy8gMy4gUHJvY2VzcyBhIHF1ZXVlIHdpdGggYW4gaW5zdGFuY2Ugb2YgZW5jb2RpbmfigJlzXG4gIC8vICAgIGRlY29kZXIsIGlvUXVldWUsIG91dHB1dCwgYW5kIFwicmVwbGFjZW1lbnRcIi5cblxuICAvLyA0LiBSZXR1cm4gb3V0cHV0LlxuXG4gIGNvbnN0IHNsaWNlZCA9IGJ5dGVzLnNsaWNlKHNsaWNlKVxuICByZXR1cm4gbmV3IFRleHREZWNvZGVyKGVuY29kaW5nKS5kZWNvZGUoc2xpY2VkKVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI2JvbS1zbmlmZlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBpb1F1ZXVlXG4gKi9cbmZ1bmN0aW9uIEJPTVNuaWZmaW5nIChpb1F1ZXVlKSB7XG4gIC8vIDEuIExldCBCT00gYmUgdGhlIHJlc3VsdCBvZiBwZWVraW5nIDMgYnl0ZXMgZnJvbSBpb1F1ZXVlLFxuICAvLyAgICBjb252ZXJ0ZWQgdG8gYSBieXRlIHNlcXVlbmNlLlxuICBjb25zdCBbYSwgYiwgY10gPSBpb1F1ZXVlXG5cbiAgLy8gMi4gRm9yIGVhY2ggb2YgdGhlIHJvd3MgaW4gdGhlIHRhYmxlIGJlbG93LCBzdGFydGluZyB3aXRoXG4gIC8vICAgIHRoZSBmaXJzdCBvbmUgYW5kIGdvaW5nIGRvd24sIGlmIEJPTSBzdGFydHMgd2l0aCB0aGVcbiAgLy8gICAgYnl0ZXMgZ2l2ZW4gaW4gdGhlIGZpcnN0IGNvbHVtbiwgdGhlbiByZXR1cm4gdGhlXG4gIC8vICAgIGVuY29kaW5nIGdpdmVuIGluIHRoZSBjZWxsIGluIHRoZSBzZWNvbmQgY29sdW1uIG9mIHRoYXRcbiAgLy8gICAgcm93LiBPdGhlcndpc2UsIHJldHVybiBudWxsLlxuICBpZiAoYSA9PT0gMHhFRiAmJiBiID09PSAweEJCICYmIGMgPT09IDB4QkYpIHtcbiAgICByZXR1cm4gJ1VURi04J1xuICB9IGVsc2UgaWYgKGEgPT09IDB4RkUgJiYgYiA9PT0gMHhGRikge1xuICAgIHJldHVybiAnVVRGLTE2QkUnXG4gIH0gZWxzZSBpZiAoYSA9PT0gMHhGRiAmJiBiID09PSAweEZFKSB7XG4gICAgcmV0dXJuICdVVEYtMTZMRSdcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5W119IHNlcXVlbmNlc1xuICovXG5mdW5jdGlvbiBjb21iaW5lQnl0ZVNlcXVlbmNlcyAoc2VxdWVuY2VzKSB7XG4gIGNvbnN0IHNpemUgPSBzZXF1ZW5jZXMucmVkdWNlKChhLCBiKSA9PiB7XG4gICAgcmV0dXJuIGEgKyBiLmJ5dGVMZW5ndGhcbiAgfSwgMClcblxuICBsZXQgb2Zmc2V0ID0gMFxuXG4gIHJldHVybiBzZXF1ZW5jZXMucmVkdWNlKChhLCBiKSA9PiB7XG4gICAgYS5zZXQoYiwgb2Zmc2V0KVxuICAgIG9mZnNldCArPSBiLmJ5dGVMZW5ndGhcbiAgICByZXR1cm4gYVxuICB9LCBuZXcgVWludDhBcnJheShzaXplKSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIHJlYWRPcGVyYXRpb24sXG4gIGZpcmVBUHJvZ3Jlc3NFdmVudFxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHtcbiAgc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgcmVhZE9wZXJhdGlvbixcbiAgZmlyZUFQcm9ncmVzc0V2ZW50XG59ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHtcbiAga1N0YXRlLFxuICBrRXJyb3IsXG4gIGtSZXN1bHQsXG4gIGtFdmVudHMsXG4gIGtBYm9ydGVkXG59ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgd2ViaWRsIH0gPSByZXF1aXJlKCcuLi9mZXRjaC93ZWJpZGwnKVxuY29uc3QgeyBrRW51bWVyYWJsZVByb3BlcnR5IH0gPSByZXF1aXJlKCcuLi8uLi9jb3JlL3V0aWwnKVxuXG5jbGFzcyBGaWxlUmVhZGVyIGV4dGVuZHMgRXZlbnRUYXJnZXQge1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgdGhpc1trU3RhdGVdID0gJ2VtcHR5J1xuICAgIHRoaXNba1Jlc3VsdF0gPSBudWxsXG4gICAgdGhpc1trRXJyb3JdID0gbnVsbFxuICAgIHRoaXNba0V2ZW50c10gPSB7XG4gICAgICBsb2FkZW5kOiBudWxsLFxuICAgICAgZXJyb3I6IG51bGwsXG4gICAgICBhYm9ydDogbnVsbCxcbiAgICAgIGxvYWQ6IG51bGwsXG4gICAgICBwcm9ncmVzczogbnVsbCxcbiAgICAgIGxvYWRzdGFydDogbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9GaWxlQVBJLyNkZm4tcmVhZEFzQXJyYXlCdWZmZXJcbiAgICogQHBhcmFtIHtpbXBvcnQoJ2J1ZmZlcicpLkJsb2J9IGJsb2JcbiAgICovXG4gIHJlYWRBc0FycmF5QnVmZmVyIChibG9iKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgJ0ZpbGVSZWFkZXIucmVhZEFzQXJyYXlCdWZmZXInKVxuXG4gICAgYmxvYiA9IHdlYmlkbC5jb252ZXJ0ZXJzLkJsb2IoYmxvYiwgeyBzdHJpY3Q6IGZhbHNlIH0pXG5cbiAgICAvLyBUaGUgcmVhZEFzQXJyYXlCdWZmZXIoYmxvYikgbWV0aG9kLCB3aGVuIGludm9rZWQsXG4gICAgLy8gbXVzdCBpbml0aWF0ZSBhIHJlYWQgb3BlcmF0aW9uIGZvciBibG9iIHdpdGggQXJyYXlCdWZmZXIuXG4gICAgcmVhZE9wZXJhdGlvbih0aGlzLCBibG9iLCAnQXJyYXlCdWZmZXInKVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI3JlYWRBc0JpbmFyeVN0cmluZ1xuICAgKiBAcGFyYW0ge2ltcG9ydCgnYnVmZmVyJykuQmxvYn0gYmxvYlxuICAgKi9cbiAgcmVhZEFzQmluYXJ5U3RyaW5nIChibG9iKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgJ0ZpbGVSZWFkZXIucmVhZEFzQmluYXJ5U3RyaW5nJylcblxuICAgIGJsb2IgPSB3ZWJpZGwuY29udmVydGVycy5CbG9iKGJsb2IsIHsgc3RyaWN0OiBmYWxzZSB9KVxuXG4gICAgLy8gVGhlIHJlYWRBc0JpbmFyeVN0cmluZyhibG9iKSBtZXRob2QsIHdoZW4gaW52b2tlZCxcbiAgICAvLyBtdXN0IGluaXRpYXRlIGEgcmVhZCBvcGVyYXRpb24gZm9yIGJsb2Igd2l0aCBCaW5hcnlTdHJpbmcuXG4gICAgcmVhZE9wZXJhdGlvbih0aGlzLCBibG9iLCAnQmluYXJ5U3RyaW5nJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9GaWxlQVBJLyNyZWFkQXNEYXRhVGV4dFxuICAgKiBAcGFyYW0ge2ltcG9ydCgnYnVmZmVyJykuQmxvYn0gYmxvYlxuICAgKiBAcGFyYW0ge3N0cmluZz99IGVuY29kaW5nXG4gICAqL1xuICByZWFkQXNUZXh0IChibG9iLCBlbmNvZGluZyA9IHVuZGVmaW5lZCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsICdGaWxlUmVhZGVyLnJlYWRBc1RleHQnKVxuXG4gICAgYmxvYiA9IHdlYmlkbC5jb252ZXJ0ZXJzLkJsb2IoYmxvYiwgeyBzdHJpY3Q6IGZhbHNlIH0pXG5cbiAgICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW5jb2RpbmcgPSB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcoZW5jb2RpbmcsICdGaWxlUmVhZGVyLnJlYWRBc1RleHQnLCAnZW5jb2RpbmcnKVxuICAgIH1cblxuICAgIC8vIFRoZSByZWFkQXNUZXh0KGJsb2IsIGVuY29kaW5nKSBtZXRob2QsIHdoZW4gaW52b2tlZCxcbiAgICAvLyBtdXN0IGluaXRpYXRlIGEgcmVhZCBvcGVyYXRpb24gZm9yIGJsb2Igd2l0aCBUZXh0IGFuZCBlbmNvZGluZy5cbiAgICByZWFkT3BlcmF0aW9uKHRoaXMsIGJsb2IsICdUZXh0JywgZW5jb2RpbmcpXG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jZGZuLXJlYWRBc0RhdGFVUkxcbiAgICogQHBhcmFtIHtpbXBvcnQoJ2J1ZmZlcicpLkJsb2J9IGJsb2JcbiAgICovXG4gIHJlYWRBc0RhdGFVUkwgKGJsb2IpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCAnRmlsZVJlYWRlci5yZWFkQXNEYXRhVVJMJylcblxuICAgIGJsb2IgPSB3ZWJpZGwuY29udmVydGVycy5CbG9iKGJsb2IsIHsgc3RyaWN0OiBmYWxzZSB9KVxuXG4gICAgLy8gVGhlIHJlYWRBc0RhdGFVUkwoYmxvYikgbWV0aG9kLCB3aGVuIGludm9rZWQsIG11c3RcbiAgICAvLyBpbml0aWF0ZSBhIHJlYWQgb3BlcmF0aW9uIGZvciBibG9iIHdpdGggRGF0YVVSTC5cbiAgICByZWFkT3BlcmF0aW9uKHRoaXMsIGJsb2IsICdEYXRhVVJMJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9GaWxlQVBJLyNkZm4tYWJvcnRcbiAgICovXG4gIGFib3J0ICgpIHtcbiAgICAvLyAxLiBJZiB0aGlzJ3Mgc3RhdGUgaXMgXCJlbXB0eVwiIG9yIGlmIHRoaXMncyBzdGF0ZSBpc1xuICAgIC8vICAgIFwiZG9uZVwiIHNldCB0aGlzJ3MgcmVzdWx0IHRvIG51bGwgYW5kIHRlcm1pbmF0ZVxuICAgIC8vICAgIHRoaXMgYWxnb3JpdGhtLlxuICAgIGlmICh0aGlzW2tTdGF0ZV0gPT09ICdlbXB0eScgfHwgdGhpc1trU3RhdGVdID09PSAnZG9uZScpIHtcbiAgICAgIHRoaXNba1Jlc3VsdF0gPSBudWxsXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyAyLiBJZiB0aGlzJ3Mgc3RhdGUgaXMgXCJsb2FkaW5nXCIgc2V0IHRoaXMncyBzdGF0ZSB0b1xuICAgIC8vICAgIFwiZG9uZVwiIGFuZCBzZXQgdGhpcydzIHJlc3VsdCB0byBudWxsLlxuICAgIGlmICh0aGlzW2tTdGF0ZV0gPT09ICdsb2FkaW5nJykge1xuICAgICAgdGhpc1trU3RhdGVdID0gJ2RvbmUnXG4gICAgICB0aGlzW2tSZXN1bHRdID0gbnVsbFxuICAgIH1cblxuICAgIC8vIDMuIElmIHRoZXJlIGFyZSBhbnkgdGFza3MgZnJvbSB0aGlzIG9uIHRoZSBmaWxlIHJlYWRpbmdcbiAgICAvLyAgICB0YXNrIHNvdXJjZSBpbiBhbiBhZmZpbGlhdGVkIHRhc2sgcXVldWUsIHRoZW4gcmVtb3ZlXG4gICAgLy8gICAgdGhvc2UgdGFza3MgZnJvbSB0aGF0IHRhc2sgcXVldWUuXG4gICAgdGhpc1trQWJvcnRlZF0gPSB0cnVlXG5cbiAgICAvLyA0LiBUZXJtaW5hdGUgdGhlIGFsZ29yaXRobSBmb3IgdGhlIHJlYWQgbWV0aG9kIGJlaW5nIHByb2Nlc3NlZC5cbiAgICAvLyBUT0RPXG5cbiAgICAvLyA1LiBGaXJlIGEgcHJvZ3Jlc3MgZXZlbnQgY2FsbGVkIGFib3J0IGF0IHRoaXMuXG4gICAgZmlyZUFQcm9ncmVzc0V2ZW50KCdhYm9ydCcsIHRoaXMpXG5cbiAgICAvLyA2LiBJZiB0aGlzJ3Mgc3RhdGUgaXMgbm90IFwibG9hZGluZ1wiLCBmaXJlIGEgcHJvZ3Jlc3NcbiAgICAvLyAgICBldmVudCBjYWxsZWQgbG9hZGVuZCBhdCB0aGlzLlxuICAgIGlmICh0aGlzW2tTdGF0ZV0gIT09ICdsb2FkaW5nJykge1xuICAgICAgZmlyZUFQcm9ncmVzc0V2ZW50KCdsb2FkZW5kJywgdGhpcylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jZG9tLWZpbGVyZWFkZXItcmVhZHlzdGF0ZVxuICAgKi9cbiAgZ2V0IHJlYWR5U3RhdGUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICBzd2l0Y2ggKHRoaXNba1N0YXRlXSkge1xuICAgICAgY2FzZSAnZW1wdHknOiByZXR1cm4gdGhpcy5FTVBUWVxuICAgICAgY2FzZSAnbG9hZGluZyc6IHJldHVybiB0aGlzLkxPQURJTkdcbiAgICAgIGNhc2UgJ2RvbmUnOiByZXR1cm4gdGhpcy5ET05FXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI2RvbS1maWxlcmVhZGVyLXJlc3VsdFxuICAgKi9cbiAgZ2V0IHJlc3VsdCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIC8vIFRoZSByZXN1bHQgYXR0cmlidXRl4oCZcyBnZXR0ZXIsIHdoZW4gaW52b2tlZCwgbXVzdCByZXR1cm5cbiAgICAvLyB0aGlzJ3MgcmVzdWx0LlxuICAgIHJldHVybiB0aGlzW2tSZXN1bHRdXG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jZG9tLWZpbGVyZWFkZXItZXJyb3JcbiAgICovXG4gIGdldCBlcnJvciAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIC8vIFRoZSBlcnJvciBhdHRyaWJ1dGXigJlzIGdldHRlciwgd2hlbiBpbnZva2VkLCBtdXN0IHJldHVyblxuICAgIC8vIHRoaXMncyBlcnJvci5cbiAgICByZXR1cm4gdGhpc1trRXJyb3JdXG4gIH1cblxuICBnZXQgb25sb2FkZW5kICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgcmV0dXJuIHRoaXNba0V2ZW50c10ubG9hZGVuZFxuICB9XG5cbiAgc2V0IG9ubG9hZGVuZCAoZm4pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgaWYgKHRoaXNba0V2ZW50c10ubG9hZGVuZCkge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZW5kJywgdGhpc1trRXZlbnRzXS5sb2FkZW5kKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXNba0V2ZW50c10ubG9hZGVuZCA9IGZuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlbmQnLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1trRXZlbnRzXS5sb2FkZW5kID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGdldCBvbmVycm9yICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgcmV0dXJuIHRoaXNba0V2ZW50c10uZXJyb3JcbiAgfVxuXG4gIHNldCBvbmVycm9yIChmbikge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICBpZiAodGhpc1trRXZlbnRzXS5lcnJvcikge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIHRoaXNba0V2ZW50c10uZXJyb3IpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1trRXZlbnRzXS5lcnJvciA9IGZuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZm4pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNba0V2ZW50c10uZXJyb3IgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgZ2V0IG9ubG9hZHN0YXJ0ICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgcmV0dXJuIHRoaXNba0V2ZW50c10ubG9hZHN0YXJ0XG4gIH1cblxuICBzZXQgb25sb2Fkc3RhcnQgKGZuKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIGlmICh0aGlzW2tFdmVudHNdLmxvYWRzdGFydCkge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2Fkc3RhcnQnLCB0aGlzW2tFdmVudHNdLmxvYWRzdGFydClcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2tFdmVudHNdLmxvYWRzdGFydCA9IGZuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRzdGFydCcsIGZuKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzW2tFdmVudHNdLmxvYWRzdGFydCA9IG51bGxcbiAgICB9XG4gIH1cblxuICBnZXQgb25wcm9ncmVzcyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIHJldHVybiB0aGlzW2tFdmVudHNdLnByb2dyZXNzXG4gIH1cblxuICBzZXQgb25wcm9ncmVzcyAoZm4pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgaWYgKHRoaXNba0V2ZW50c10ucHJvZ3Jlc3MpIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCB0aGlzW2tFdmVudHNdLnByb2dyZXNzKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXNba0V2ZW50c10ucHJvZ3Jlc3MgPSBmblxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIGZuKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzW2tFdmVudHNdLnByb2dyZXNzID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGdldCBvbmxvYWQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICByZXR1cm4gdGhpc1trRXZlbnRzXS5sb2FkXG4gIH1cblxuICBzZXQgb25sb2FkIChmbikge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICBpZiAodGhpc1trRXZlbnRzXS5sb2FkKSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWQnLCB0aGlzW2tFdmVudHNdLmxvYWQpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1trRXZlbnRzXS5sb2FkID0gZm5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZuKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzW2tFdmVudHNdLmxvYWQgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgZ2V0IG9uYWJvcnQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICByZXR1cm4gdGhpc1trRXZlbnRzXS5hYm9ydFxuICB9XG5cbiAgc2V0IG9uYWJvcnQgKGZuKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIGlmICh0aGlzW2tFdmVudHNdLmFib3J0KSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgdGhpc1trRXZlbnRzXS5hYm9ydClcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2tFdmVudHNdLmFib3J0ID0gZm5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1trRXZlbnRzXS5hYm9ydCA9IG51bGxcbiAgICB9XG4gIH1cbn1cblxuLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI2RvbS1maWxlcmVhZGVyLWVtcHR5XG5GaWxlUmVhZGVyLkVNUFRZID0gRmlsZVJlYWRlci5wcm90b3R5cGUuRU1QVFkgPSAwXG4vLyBodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jZG9tLWZpbGVyZWFkZXItbG9hZGluZ1xuRmlsZVJlYWRlci5MT0FESU5HID0gRmlsZVJlYWRlci5wcm90b3R5cGUuTE9BRElORyA9IDFcbi8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9GaWxlQVBJLyNkb20tZmlsZXJlYWRlci1kb25lXG5GaWxlUmVhZGVyLkRPTkUgPSBGaWxlUmVhZGVyLnByb3RvdHlwZS5ET05FID0gMlxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhGaWxlUmVhZGVyLnByb3RvdHlwZSwge1xuICBFTVBUWTogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgTE9BRElORzogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgRE9ORTogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgcmVhZEFzQXJyYXlCdWZmZXI6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHJlYWRBc0JpbmFyeVN0cmluZzoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgcmVhZEFzVGV4dDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgcmVhZEFzRGF0YVVSTDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgYWJvcnQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHJlYWR5U3RhdGU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHJlc3VsdDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgZXJyb3I6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIG9ubG9hZHN0YXJ0OiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbnByb2dyZXNzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbmxvYWQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIG9uYWJvcnQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIG9uZXJyb3I6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIG9ubG9hZGVuZDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHtcbiAgICB2YWx1ZTogJ0ZpbGVSZWFkZXInLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfVxufSlcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRmlsZVJlYWRlciwge1xuICBFTVBUWTogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgTE9BRElORzogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgRE9ORTogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9yc1xufSlcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEZpbGVSZWFkZXJcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAga0NvbnN0cnVjdDogcmVxdWlyZSgnLi4vLi4vY29yZS9zeW1ib2xzJykua0NvbnN0cnVjdFxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ25vZGU6YXNzZXJ0JylcbmNvbnN0IHsgVVJMU2VyaWFsaXplciB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvZGF0YS11cmwnKVxuY29uc3QgeyBpc1ZhbGlkSGVhZGVyTmFtZSB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvdXRpbCcpXG5cbi8qKlxuICogQHNlZSBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtdXJsLWVxdWFsc1xuICogQHBhcmFtIHtVUkx9IEFcbiAqIEBwYXJhbSB7VVJMfSBCXG4gKiBAcGFyYW0ge2Jvb2xlYW4gfCB1bmRlZmluZWR9IGV4Y2x1ZGVGcmFnbWVudFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHVybEVxdWFscyAoQSwgQiwgZXhjbHVkZUZyYWdtZW50ID0gZmFsc2UpIHtcbiAgY29uc3Qgc2VyaWFsaXplZEEgPSBVUkxTZXJpYWxpemVyKEEsIGV4Y2x1ZGVGcmFnbWVudClcblxuICBjb25zdCBzZXJpYWxpemVkQiA9IFVSTFNlcmlhbGl6ZXIoQiwgZXhjbHVkZUZyYWdtZW50KVxuXG4gIHJldHVybiBzZXJpYWxpemVkQSA9PT0gc2VyaWFsaXplZEJcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJvbWl1bS9jaHJvbWl1bS9ibG9iLzY5NGQyMGQxMzRjYjU1M2Q4ZDg5ZTU1MDBiOTE0ODAxMmIxYmEyOTkvY29udGVudC9icm93c2VyL2NhY2hlX3N0b3JhZ2UvY2FjaGVfc3RvcmFnZV9jYWNoZS5jYyNMMjYwLUwyNjJcbiAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAqL1xuZnVuY3Rpb24gZ2V0RmllbGRWYWx1ZXMgKGhlYWRlcikge1xuICBhc3NlcnQoaGVhZGVyICE9PSBudWxsKVxuXG4gIGNvbnN0IHZhbHVlcyA9IFtdXG5cbiAgZm9yIChsZXQgdmFsdWUgb2YgaGVhZGVyLnNwbGl0KCcsJykpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKVxuXG4gICAgaWYgKGlzVmFsaWRIZWFkZXJOYW1lKHZhbHVlKSkge1xuICAgICAgdmFsdWVzLnB1c2godmFsdWUpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlc1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgdXJsRXF1YWxzLFxuICBnZXRGaWVsZFZhbHVlc1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsga0NvbnN0cnVjdCB9ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgdXJsRXF1YWxzLCBnZXRGaWVsZFZhbHVlcyB9ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHsga0VudW1lcmFibGVQcm9wZXJ0eSwgaXNEaXN0dXJiZWQgfSA9IHJlcXVpcmUoJy4uLy4uL2NvcmUvdXRpbCcpXG5jb25zdCB7IHdlYmlkbCB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvd2ViaWRsJylcbmNvbnN0IHsgUmVzcG9uc2UsIGNsb25lUmVzcG9uc2UsIGZyb21Jbm5lclJlc3BvbnNlIH0gPSByZXF1aXJlKCcuLi9mZXRjaC9yZXNwb25zZScpXG5jb25zdCB7IFJlcXVlc3QsIGZyb21Jbm5lclJlcXVlc3QgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3JlcXVlc3QnKVxuY29uc3QgeyBrU3RhdGUgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3N5bWJvbHMnKVxuY29uc3QgeyBmZXRjaGluZyB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvaW5kZXgnKVxuY29uc3QgeyB1cmxJc0h0dHBIdHRwc1NjaGVtZSwgY3JlYXRlRGVmZXJyZWRQcm9taXNlLCByZWFkQWxsQnl0ZXMgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3V0aWwnKVxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnbm9kZTphc3NlcnQnKVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL1NlcnZpY2VXb3JrZXIvI2Rmbi1jYWNoZS1iYXRjaC1vcGVyYXRpb25cbiAqIEB0eXBlZGVmIHtPYmplY3R9IENhY2hlQmF0Y2hPcGVyYXRpb25cbiAqIEBwcm9wZXJ0eSB7J2RlbGV0ZScgfCAncHV0J30gdHlwZVxuICogQHByb3BlcnR5IHthbnl9IHJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7YW55fSByZXNwb25zZVxuICogQHByb3BlcnR5IHtpbXBvcnQoJy4uLy4uL3R5cGVzL2NhY2hlJykuQ2FjaGVRdWVyeU9wdGlvbnN9IG9wdGlvbnNcbiAqL1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL1NlcnZpY2VXb3JrZXIvI2Rmbi1yZXF1ZXN0LXJlc3BvbnNlLWxpc3RcbiAqIEB0eXBlZGVmIHtbYW55LCBhbnldW119IHJlcXVlc3RSZXNwb25zZUxpc3RcbiAqL1xuXG5jbGFzcyBDYWNoZSB7XG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9TZXJ2aWNlV29ya2VyLyNkZm4tcmVsZXZhbnQtcmVxdWVzdC1yZXNwb25zZS1saXN0XG4gICAqIEB0eXBlIHtyZXF1ZXN0UmVzcG9uc2VMaXN0fVxuICAgKi9cbiAgI3JlbGV2YW50UmVxdWVzdFJlc3BvbnNlTGlzdFxuXG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBpZiAoYXJndW1lbnRzWzBdICE9PSBrQ29uc3RydWN0KSB7XG4gICAgICB3ZWJpZGwuaWxsZWdhbENvbnN0cnVjdG9yKClcbiAgICB9XG5cbiAgICB3ZWJpZGwudXRpbC5tYXJrQXNVbmNsb25lYWJsZSh0aGlzKVxuICAgIHRoaXMuI3JlbGV2YW50UmVxdWVzdFJlc3BvbnNlTGlzdCA9IGFyZ3VtZW50c1sxXVxuICB9XG5cbiAgYXN5bmMgbWF0Y2ggKHJlcXVlc3QsIG9wdGlvbnMgPSB7fSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIENhY2hlKVxuXG4gICAgY29uc3QgcHJlZml4ID0gJ0NhY2hlLm1hdGNoJ1xuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgcHJlZml4KVxuXG4gICAgcmVxdWVzdCA9IHdlYmlkbC5jb252ZXJ0ZXJzLlJlcXVlc3RJbmZvKHJlcXVlc3QsIHByZWZpeCwgJ3JlcXVlc3QnKVxuICAgIG9wdGlvbnMgPSB3ZWJpZGwuY29udmVydGVycy5DYWNoZVF1ZXJ5T3B0aW9ucyhvcHRpb25zLCBwcmVmaXgsICdvcHRpb25zJylcblxuICAgIGNvbnN0IHAgPSB0aGlzLiNpbnRlcm5hbE1hdGNoQWxsKHJlcXVlc3QsIG9wdGlvbnMsIDEpXG5cbiAgICBpZiAocC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHJldHVybiBwWzBdXG4gIH1cblxuICBhc3luYyBtYXRjaEFsbCAocmVxdWVzdCA9IHVuZGVmaW5lZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGUpXG5cbiAgICBjb25zdCBwcmVmaXggPSAnQ2FjaGUubWF0Y2hBbGwnXG4gICAgaWYgKHJlcXVlc3QgIT09IHVuZGVmaW5lZCkgcmVxdWVzdCA9IHdlYmlkbC5jb252ZXJ0ZXJzLlJlcXVlc3RJbmZvKHJlcXVlc3QsIHByZWZpeCwgJ3JlcXVlc3QnKVxuICAgIG9wdGlvbnMgPSB3ZWJpZGwuY29udmVydGVycy5DYWNoZVF1ZXJ5T3B0aW9ucyhvcHRpb25zLCBwcmVmaXgsICdvcHRpb25zJylcblxuICAgIHJldHVybiB0aGlzLiNpbnRlcm5hbE1hdGNoQWxsKHJlcXVlc3QsIG9wdGlvbnMpXG4gIH1cblxuICBhc3luYyBhZGQgKHJlcXVlc3QpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBDYWNoZSlcblxuICAgIGNvbnN0IHByZWZpeCA9ICdDYWNoZS5hZGQnXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCBwcmVmaXgpXG5cbiAgICByZXF1ZXN0ID0gd2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdEluZm8ocmVxdWVzdCwgcHJlZml4LCAncmVxdWVzdCcpXG5cbiAgICAvLyAxLlxuICAgIGNvbnN0IHJlcXVlc3RzID0gW3JlcXVlc3RdXG5cbiAgICAvLyAyLlxuICAgIGNvbnN0IHJlc3BvbnNlQXJyYXlQcm9taXNlID0gdGhpcy5hZGRBbGwocmVxdWVzdHMpXG5cbiAgICAvLyAzLlxuICAgIHJldHVybiBhd2FpdCByZXNwb25zZUFycmF5UHJvbWlzZVxuICB9XG5cbiAgYXN5bmMgYWRkQWxsIChyZXF1ZXN0cykge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIENhY2hlKVxuXG4gICAgY29uc3QgcHJlZml4ID0gJ0NhY2hlLmFkZEFsbCdcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHByZWZpeClcblxuICAgIC8vIDEuXG4gICAgY29uc3QgcmVzcG9uc2VQcm9taXNlcyA9IFtdXG5cbiAgICAvLyAyLlxuICAgIGNvbnN0IHJlcXVlc3RMaXN0ID0gW11cblxuICAgIC8vIDMuXG4gICAgZm9yIChsZXQgcmVxdWVzdCBvZiByZXF1ZXN0cykge1xuICAgICAgaWYgKHJlcXVlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmNvbnZlcnNpb25GYWlsZWQoe1xuICAgICAgICAgIHByZWZpeCxcbiAgICAgICAgICBhcmd1bWVudDogJ0FyZ3VtZW50IDEnLFxuICAgICAgICAgIHR5cGVzOiBbJ3VuZGVmaW5lZCBpcyBub3QgYWxsb3dlZCddXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIHJlcXVlc3QgPSB3ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mbyhyZXF1ZXN0KVxuXG4gICAgICBpZiAodHlwZW9mIHJlcXVlc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDMuMVxuICAgICAgY29uc3QgciA9IHJlcXVlc3Rba1N0YXRlXVxuXG4gICAgICAvLyAzLjJcbiAgICAgIGlmICghdXJsSXNIdHRwSHR0cHNTY2hlbWUoci51cmwpIHx8IHIubWV0aG9kICE9PSAnR0VUJykge1xuICAgICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgaGVhZGVyOiBwcmVmaXgsXG4gICAgICAgICAgbWVzc2FnZTogJ0V4cGVjdGVkIGh0dHAvcyBzY2hlbWUgd2hlbiBtZXRob2QgaXMgbm90IEdFVC4nXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNC5cbiAgICAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIGZldGNoaW5nPltdfSAqL1xuICAgIGNvbnN0IGZldGNoQ29udHJvbGxlcnMgPSBbXVxuXG4gICAgLy8gNS5cbiAgICBmb3IgKGNvbnN0IHJlcXVlc3Qgb2YgcmVxdWVzdHMpIHtcbiAgICAgIC8vIDUuMVxuICAgICAgY29uc3QgciA9IG5ldyBSZXF1ZXN0KHJlcXVlc3QpW2tTdGF0ZV1cblxuICAgICAgLy8gNS4yXG4gICAgICBpZiAoIXVybElzSHR0cEh0dHBzU2NoZW1lKHIudXJsKSkge1xuICAgICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgaGVhZGVyOiBwcmVmaXgsXG4gICAgICAgICAgbWVzc2FnZTogJ0V4cGVjdGVkIGh0dHAvcyBzY2hlbWUuJ1xuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyA1LjRcbiAgICAgIHIuaW5pdGlhdG9yID0gJ2ZldGNoJ1xuICAgICAgci5kZXN0aW5hdGlvbiA9ICdzdWJyZXNvdXJjZSdcblxuICAgICAgLy8gNS41XG4gICAgICByZXF1ZXN0TGlzdC5wdXNoKHIpXG5cbiAgICAgIC8vIDUuNlxuICAgICAgY29uc3QgcmVzcG9uc2VQcm9taXNlID0gY3JlYXRlRGVmZXJyZWRQcm9taXNlKClcblxuICAgICAgLy8gNS43XG4gICAgICBmZXRjaENvbnRyb2xsZXJzLnB1c2goZmV0Y2hpbmcoe1xuICAgICAgICByZXF1ZXN0OiByLFxuICAgICAgICBwcm9jZXNzUmVzcG9uc2UgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgLy8gMS5cbiAgICAgICAgICBpZiAocmVzcG9uc2UudHlwZSA9PT0gJ2Vycm9yJyB8fCByZXNwb25zZS5zdGF0dXMgPT09IDIwNiB8fCByZXNwb25zZS5zdGF0dXMgPCAyMDAgfHwgcmVzcG9uc2Uuc3RhdHVzID4gMjk5KSB7XG4gICAgICAgICAgICByZXNwb25zZVByb21pc2UucmVqZWN0KHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICAgICAgaGVhZGVyOiAnQ2FjaGUuYWRkQWxsJyxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ1JlY2VpdmVkIGFuIGludmFsaWQgc3RhdHVzIGNvZGUgb3IgdGhlIHJlcXVlc3QgZmFpbGVkLidcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuaGVhZGVyc0xpc3QuY29udGFpbnMoJ3ZhcnknKSkgeyAvLyAyLlxuICAgICAgICAgICAgLy8gMi4xXG4gICAgICAgICAgICBjb25zdCBmaWVsZFZhbHVlcyA9IGdldEZpZWxkVmFsdWVzKHJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgndmFyeScpKVxuXG4gICAgICAgICAgICAvLyAyLjJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGRWYWx1ZSBvZiBmaWVsZFZhbHVlcykge1xuICAgICAgICAgICAgICAvLyAyLjIuMVxuICAgICAgICAgICAgICBpZiAoZmllbGRWYWx1ZSA9PT0gJyonKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlamVjdCh3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgICAgICAgICBoZWFkZXI6ICdDYWNoZS5hZGRBbGwnLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2ludmFsaWQgdmFyeSBmaWVsZCB2YWx1ZSdcbiAgICAgICAgICAgICAgICB9KSlcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29udHJvbGxlciBvZiBmZXRjaENvbnRyb2xsZXJzKSB7XG4gICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmFib3J0KClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcHJvY2Vzc1Jlc3BvbnNlRW5kT2ZCb2R5IChyZXNwb25zZSkge1xuICAgICAgICAgIC8vIDEuXG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmFib3J0ZWQpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZWplY3QobmV3IERPTUV4Y2VwdGlvbignYWJvcnRlZCcsICdBYm9ydEVycm9yJykpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyAyLlxuICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKVxuICAgICAgICB9XG4gICAgICB9KSlcblxuICAgICAgLy8gNS44XG4gICAgICByZXNwb25zZVByb21pc2VzLnB1c2gocmVzcG9uc2VQcm9taXNlLnByb21pc2UpXG4gICAgfVxuXG4gICAgLy8gNi5cbiAgICBjb25zdCBwID0gUHJvbWlzZS5hbGwocmVzcG9uc2VQcm9taXNlcylcblxuICAgIC8vIDcuXG4gICAgY29uc3QgcmVzcG9uc2VzID0gYXdhaXQgcFxuXG4gICAgLy8gNy4xXG4gICAgY29uc3Qgb3BlcmF0aW9ucyA9IFtdXG5cbiAgICAvLyA3LjJcbiAgICBsZXQgaW5kZXggPSAwXG5cbiAgICAvLyA3LjNcbiAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIHJlc3BvbnNlcykge1xuICAgICAgLy8gNy4zLjFcbiAgICAgIC8qKiBAdHlwZSB7Q2FjaGVCYXRjaE9wZXJhdGlvbn0gKi9cbiAgICAgIGNvbnN0IG9wZXJhdGlvbiA9IHtcbiAgICAgICAgdHlwZTogJ3B1dCcsIC8vIDcuMy4yXG4gICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RMaXN0W2luZGV4XSwgLy8gNy4zLjNcbiAgICAgICAgcmVzcG9uc2UgLy8gNy4zLjRcbiAgICAgIH1cblxuICAgICAgb3BlcmF0aW9ucy5wdXNoKG9wZXJhdGlvbikgLy8gNy4zLjVcblxuICAgICAgaW5kZXgrKyAvLyA3LjMuNlxuICAgIH1cblxuICAgIC8vIDcuNVxuICAgIGNvbnN0IGNhY2hlSm9iUHJvbWlzZSA9IGNyZWF0ZURlZmVycmVkUHJvbWlzZSgpXG5cbiAgICAvLyA3LjYuMVxuICAgIGxldCBlcnJvckRhdGEgPSBudWxsXG5cbiAgICAvLyA3LjYuMlxuICAgIHRyeSB7XG4gICAgICB0aGlzLiNiYXRjaENhY2hlT3BlcmF0aW9ucyhvcGVyYXRpb25zKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yRGF0YSA9IGVcbiAgICB9XG5cbiAgICAvLyA3LjYuM1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIC8vIDcuNi4zLjFcbiAgICAgIGlmIChlcnJvckRhdGEgPT09IG51bGwpIHtcbiAgICAgICAgY2FjaGVKb2JQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gNy42LjMuMlxuICAgICAgICBjYWNoZUpvYlByb21pc2UucmVqZWN0KGVycm9yRGF0YSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gNy43XG4gICAgcmV0dXJuIGNhY2hlSm9iUHJvbWlzZS5wcm9taXNlXG4gIH1cblxuICBhc3luYyBwdXQgKHJlcXVlc3QsIHJlc3BvbnNlKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGUpXG5cbiAgICBjb25zdCBwcmVmaXggPSAnQ2FjaGUucHV0J1xuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMiwgcHJlZml4KVxuXG4gICAgcmVxdWVzdCA9IHdlYmlkbC5jb252ZXJ0ZXJzLlJlcXVlc3RJbmZvKHJlcXVlc3QsIHByZWZpeCwgJ3JlcXVlc3QnKVxuICAgIHJlc3BvbnNlID0gd2ViaWRsLmNvbnZlcnRlcnMuUmVzcG9uc2UocmVzcG9uc2UsIHByZWZpeCwgJ3Jlc3BvbnNlJylcblxuICAgIC8vIDEuXG4gICAgbGV0IGlubmVyUmVxdWVzdCA9IG51bGxcblxuICAgIC8vIDIuXG4gICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7XG4gICAgICBpbm5lclJlcXVlc3QgPSByZXF1ZXN0W2tTdGF0ZV1cbiAgICB9IGVsc2UgeyAvLyAzLlxuICAgICAgaW5uZXJSZXF1ZXN0ID0gbmV3IFJlcXVlc3QocmVxdWVzdClba1N0YXRlXVxuICAgIH1cblxuICAgIC8vIDQuXG4gICAgaWYgKCF1cmxJc0h0dHBIdHRwc1NjaGVtZShpbm5lclJlcXVlc3QudXJsKSB8fCBpbm5lclJlcXVlc3QubWV0aG9kICE9PSAnR0VUJykge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6IHByZWZpeCxcbiAgICAgICAgbWVzc2FnZTogJ0V4cGVjdGVkIGFuIGh0dHAvcyBzY2hlbWUgd2hlbiBtZXRob2QgaXMgbm90IEdFVCdcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gNS5cbiAgICBjb25zdCBpbm5lclJlc3BvbnNlID0gcmVzcG9uc2Vba1N0YXRlXVxuXG4gICAgLy8gNi5cbiAgICBpZiAoaW5uZXJSZXNwb25zZS5zdGF0dXMgPT09IDIwNikge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6IHByZWZpeCxcbiAgICAgICAgbWVzc2FnZTogJ0dvdCAyMDYgc3RhdHVzJ1xuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyA3LlxuICAgIGlmIChpbm5lclJlc3BvbnNlLmhlYWRlcnNMaXN0LmNvbnRhaW5zKCd2YXJ5JykpIHtcbiAgICAgIC8vIDcuMS5cbiAgICAgIGNvbnN0IGZpZWxkVmFsdWVzID0gZ2V0RmllbGRWYWx1ZXMoaW5uZXJSZXNwb25zZS5oZWFkZXJzTGlzdC5nZXQoJ3ZhcnknKSlcblxuICAgICAgLy8gNy4yLlxuICAgICAgZm9yIChjb25zdCBmaWVsZFZhbHVlIG9mIGZpZWxkVmFsdWVzKSB7XG4gICAgICAgIC8vIDcuMi4xXG4gICAgICAgIGlmIChmaWVsZFZhbHVlID09PSAnKicpIHtcbiAgICAgICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgICBoZWFkZXI6IHByZWZpeCxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdHb3QgKiB2YXJ5IGZpZWxkIHZhbHVlJ1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA4LlxuICAgIGlmIChpbm5lclJlc3BvbnNlLmJvZHkgJiYgKGlzRGlzdHVyYmVkKGlubmVyUmVzcG9uc2UuYm9keS5zdHJlYW0pIHx8IGlubmVyUmVzcG9uc2UuYm9keS5zdHJlYW0ubG9ja2VkKSkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6IHByZWZpeCxcbiAgICAgICAgbWVzc2FnZTogJ1Jlc3BvbnNlIGJvZHkgaXMgbG9ja2VkIG9yIGRpc3R1cmJlZCdcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gOS5cbiAgICBjb25zdCBjbG9uZWRSZXNwb25zZSA9IGNsb25lUmVzcG9uc2UoaW5uZXJSZXNwb25zZSlcblxuICAgIC8vIDEwLlxuICAgIGNvbnN0IGJvZHlSZWFkUHJvbWlzZSA9IGNyZWF0ZURlZmVycmVkUHJvbWlzZSgpXG5cbiAgICAvLyAxMS5cbiAgICBpZiAoaW5uZXJSZXNwb25zZS5ib2R5ICE9IG51bGwpIHtcbiAgICAgIC8vIDExLjFcbiAgICAgIGNvbnN0IHN0cmVhbSA9IGlubmVyUmVzcG9uc2UuYm9keS5zdHJlYW1cblxuICAgICAgLy8gMTEuMlxuICAgICAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpXG5cbiAgICAgIC8vIDExLjNcbiAgICAgIHJlYWRBbGxCeXRlcyhyZWFkZXIpLnRoZW4oYm9keVJlYWRQcm9taXNlLnJlc29sdmUsIGJvZHlSZWFkUHJvbWlzZS5yZWplY3QpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJvZHlSZWFkUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZClcbiAgICB9XG5cbiAgICAvLyAxMi5cbiAgICAvKiogQHR5cGUge0NhY2hlQmF0Y2hPcGVyYXRpb25bXX0gKi9cbiAgICBjb25zdCBvcGVyYXRpb25zID0gW11cblxuICAgIC8vIDEzLlxuICAgIC8qKiBAdHlwZSB7Q2FjaGVCYXRjaE9wZXJhdGlvbn0gKi9cbiAgICBjb25zdCBvcGVyYXRpb24gPSB7XG4gICAgICB0eXBlOiAncHV0JywgLy8gMTQuXG4gICAgICByZXF1ZXN0OiBpbm5lclJlcXVlc3QsIC8vIDE1LlxuICAgICAgcmVzcG9uc2U6IGNsb25lZFJlc3BvbnNlIC8vIDE2LlxuICAgIH1cblxuICAgIC8vIDE3LlxuICAgIG9wZXJhdGlvbnMucHVzaChvcGVyYXRpb24pXG5cbiAgICAvLyAxOS5cbiAgICBjb25zdCBieXRlcyA9IGF3YWl0IGJvZHlSZWFkUHJvbWlzZS5wcm9taXNlXG5cbiAgICBpZiAoY2xvbmVkUmVzcG9uc2UuYm9keSAhPSBudWxsKSB7XG4gICAgICBjbG9uZWRSZXNwb25zZS5ib2R5LnNvdXJjZSA9IGJ5dGVzXG4gICAgfVxuXG4gICAgLy8gMTkuMVxuICAgIGNvbnN0IGNhY2hlSm9iUHJvbWlzZSA9IGNyZWF0ZURlZmVycmVkUHJvbWlzZSgpXG5cbiAgICAvLyAxOS4yLjFcbiAgICBsZXQgZXJyb3JEYXRhID0gbnVsbFxuXG4gICAgLy8gMTkuMi4yXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuI2JhdGNoQ2FjaGVPcGVyYXRpb25zKG9wZXJhdGlvbnMpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JEYXRhID0gZVxuICAgIH1cblxuICAgIC8vIDE5LjIuM1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIC8vIDE5LjIuMy4xXG4gICAgICBpZiAoZXJyb3JEYXRhID09PSBudWxsKSB7XG4gICAgICAgIGNhY2hlSm9iUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgIH0gZWxzZSB7IC8vIDE5LjIuMy4yXG4gICAgICAgIGNhY2hlSm9iUHJvbWlzZS5yZWplY3QoZXJyb3JEYXRhKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4gY2FjaGVKb2JQcm9taXNlLnByb21pc2VcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZSAocmVxdWVzdCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGUpXG5cbiAgICBjb25zdCBwcmVmaXggPSAnQ2FjaGUuZGVsZXRlJ1xuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgcHJlZml4KVxuXG4gICAgcmVxdWVzdCA9IHdlYmlkbC5jb252ZXJ0ZXJzLlJlcXVlc3RJbmZvKHJlcXVlc3QsIHByZWZpeCwgJ3JlcXVlc3QnKVxuICAgIG9wdGlvbnMgPSB3ZWJpZGwuY29udmVydGVycy5DYWNoZVF1ZXJ5T3B0aW9ucyhvcHRpb25zLCBwcmVmaXgsICdvcHRpb25zJylcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtSZXF1ZXN0fVxuICAgICAqL1xuICAgIGxldCByID0gbnVsbFxuXG4gICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7XG4gICAgICByID0gcmVxdWVzdFtrU3RhdGVdXG5cbiAgICAgIGlmIChyLm1ldGhvZCAhPT0gJ0dFVCcgJiYgIW9wdGlvbnMuaWdub3JlTWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQodHlwZW9mIHJlcXVlc3QgPT09ICdzdHJpbmcnKVxuXG4gICAgICByID0gbmV3IFJlcXVlc3QocmVxdWVzdClba1N0YXRlXVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7Q2FjaGVCYXRjaE9wZXJhdGlvbltdfSAqL1xuICAgIGNvbnN0IG9wZXJhdGlvbnMgPSBbXVxuXG4gICAgLyoqIEB0eXBlIHtDYWNoZUJhdGNoT3BlcmF0aW9ufSAqL1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IHtcbiAgICAgIHR5cGU6ICdkZWxldGUnLFxuICAgICAgcmVxdWVzdDogcixcbiAgICAgIG9wdGlvbnNcbiAgICB9XG5cbiAgICBvcGVyYXRpb25zLnB1c2gob3BlcmF0aW9uKVxuXG4gICAgY29uc3QgY2FjaGVKb2JQcm9taXNlID0gY3JlYXRlRGVmZXJyZWRQcm9taXNlKClcblxuICAgIGxldCBlcnJvckRhdGEgPSBudWxsXG4gICAgbGV0IHJlcXVlc3RSZXNwb25zZXNcblxuICAgIHRyeSB7XG4gICAgICByZXF1ZXN0UmVzcG9uc2VzID0gdGhpcy4jYmF0Y2hDYWNoZU9wZXJhdGlvbnMob3BlcmF0aW9ucylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckRhdGEgPSBlXG4gICAgfVxuXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgaWYgKGVycm9yRGF0YSA9PT0gbnVsbCkge1xuICAgICAgICBjYWNoZUpvYlByb21pc2UucmVzb2x2ZSghIXJlcXVlc3RSZXNwb25zZXM/Lmxlbmd0aClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhY2hlSm9iUHJvbWlzZS5yZWplY3QoZXJyb3JEYXRhKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4gY2FjaGVKb2JQcm9taXNlLnByb21pc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9TZXJ2aWNlV29ya2VyLyNkb20tY2FjaGUta2V5c1xuICAgKiBAcGFyYW0ge2FueX0gcmVxdWVzdFxuICAgKiBAcGFyYW0ge2ltcG9ydCgnLi4vLi4vdHlwZXMvY2FjaGUnKS5DYWNoZVF1ZXJ5T3B0aW9uc30gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxyZWFkb25seSBSZXF1ZXN0W10+fVxuICAgKi9cbiAgYXN5bmMga2V5cyAocmVxdWVzdCA9IHVuZGVmaW5lZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGUpXG5cbiAgICBjb25zdCBwcmVmaXggPSAnQ2FjaGUua2V5cydcblxuICAgIGlmIChyZXF1ZXN0ICE9PSB1bmRlZmluZWQpIHJlcXVlc3QgPSB3ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mbyhyZXF1ZXN0LCBwcmVmaXgsICdyZXF1ZXN0JylcbiAgICBvcHRpb25zID0gd2ViaWRsLmNvbnZlcnRlcnMuQ2FjaGVRdWVyeU9wdGlvbnMob3B0aW9ucywgcHJlZml4LCAnb3B0aW9ucycpXG5cbiAgICAvLyAxLlxuICAgIGxldCByID0gbnVsbFxuXG4gICAgLy8gMi5cbiAgICBpZiAocmVxdWVzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyAyLjFcbiAgICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVxdWVzdCkge1xuICAgICAgICAvLyAyLjEuMVxuICAgICAgICByID0gcmVxdWVzdFtrU3RhdGVdXG5cbiAgICAgICAgLy8gMi4xLjJcbiAgICAgICAgaWYgKHIubWV0aG9kICE9PSAnR0VUJyAmJiAhb3B0aW9ucy5pZ25vcmVNZXRob2QpIHtcbiAgICAgICAgICByZXR1cm4gW11cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmVxdWVzdCA9PT0gJ3N0cmluZycpIHsgLy8gMi4yXG4gICAgICAgIHIgPSBuZXcgUmVxdWVzdChyZXF1ZXN0KVtrU3RhdGVdXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNC5cbiAgICBjb25zdCBwcm9taXNlID0gY3JlYXRlRGVmZXJyZWRQcm9taXNlKClcblxuICAgIC8vIDUuXG4gICAgLy8gNS4xXG4gICAgY29uc3QgcmVxdWVzdHMgPSBbXVxuXG4gICAgLy8gNS4yXG4gICAgaWYgKHJlcXVlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gNS4yLjFcbiAgICAgIGZvciAoY29uc3QgcmVxdWVzdFJlc3BvbnNlIG9mIHRoaXMuI3JlbGV2YW50UmVxdWVzdFJlc3BvbnNlTGlzdCkge1xuICAgICAgICAvLyA1LjIuMS4xXG4gICAgICAgIHJlcXVlc3RzLnB1c2gocmVxdWVzdFJlc3BvbnNlWzBdKVxuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIDUuM1xuICAgICAgLy8gNS4zLjFcbiAgICAgIGNvbnN0IHJlcXVlc3RSZXNwb25zZXMgPSB0aGlzLiNxdWVyeUNhY2hlKHIsIG9wdGlvbnMpXG5cbiAgICAgIC8vIDUuMy4yXG4gICAgICBmb3IgKGNvbnN0IHJlcXVlc3RSZXNwb25zZSBvZiByZXF1ZXN0UmVzcG9uc2VzKSB7XG4gICAgICAgIC8vIDUuMy4yLjFcbiAgICAgICAgcmVxdWVzdHMucHVzaChyZXF1ZXN0UmVzcG9uc2VbMF0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNS40XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgLy8gNS40LjFcbiAgICAgIGNvbnN0IHJlcXVlc3RMaXN0ID0gW11cblxuICAgICAgLy8gNS40LjJcbiAgICAgIGZvciAoY29uc3QgcmVxdWVzdCBvZiByZXF1ZXN0cykge1xuICAgICAgICBjb25zdCByZXF1ZXN0T2JqZWN0ID0gZnJvbUlubmVyUmVxdWVzdChcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIG5ldyBBYm9ydENvbnRyb2xsZXIoKS5zaWduYWwsXG4gICAgICAgICAgJ2ltbXV0YWJsZSdcbiAgICAgICAgKVxuICAgICAgICAvLyA1LjQuMi4xXG4gICAgICAgIHJlcXVlc3RMaXN0LnB1c2gocmVxdWVzdE9iamVjdClcbiAgICAgIH1cblxuICAgICAgLy8gNS40LjNcbiAgICAgIHByb21pc2UucmVzb2x2ZShPYmplY3QuZnJlZXplKHJlcXVlc3RMaXN0KSlcbiAgICB9KVxuXG4gICAgcmV0dXJuIHByb21pc2UucHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL1NlcnZpY2VXb3JrZXIvI2JhdGNoLWNhY2hlLW9wZXJhdGlvbnMtYWxnb3JpdGhtXG4gICAqIEBwYXJhbSB7Q2FjaGVCYXRjaE9wZXJhdGlvbltdfSBvcGVyYXRpb25zXG4gICAqIEByZXR1cm5zIHtyZXF1ZXN0UmVzcG9uc2VMaXN0fVxuICAgKi9cbiAgI2JhdGNoQ2FjaGVPcGVyYXRpb25zIChvcGVyYXRpb25zKSB7XG4gICAgLy8gMS5cbiAgICBjb25zdCBjYWNoZSA9IHRoaXMuI3JlbGV2YW50UmVxdWVzdFJlc3BvbnNlTGlzdFxuXG4gICAgLy8gMi5cbiAgICBjb25zdCBiYWNrdXBDYWNoZSA9IFsuLi5jYWNoZV1cblxuICAgIC8vIDMuXG4gICAgY29uc3QgYWRkZWRJdGVtcyA9IFtdXG5cbiAgICAvLyA0LjFcbiAgICBjb25zdCByZXN1bHRMaXN0ID0gW11cblxuICAgIHRyeSB7XG4gICAgICAvLyA0LjJcbiAgICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIG9wZXJhdGlvbnMpIHtcbiAgICAgICAgLy8gNC4yLjFcbiAgICAgICAgaWYgKG9wZXJhdGlvbi50eXBlICE9PSAnZGVsZXRlJyAmJiBvcGVyYXRpb24udHlwZSAhPT0gJ3B1dCcpIHtcbiAgICAgICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgICBoZWFkZXI6ICdDYWNoZS4jYmF0Y2hDYWNoZU9wZXJhdGlvbnMnLFxuICAgICAgICAgICAgbWVzc2FnZTogJ29wZXJhdGlvbiB0eXBlIGRvZXMgbm90IG1hdGNoIFwiZGVsZXRlXCIgb3IgXCJwdXRcIidcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNC4yLjJcbiAgICAgICAgaWYgKG9wZXJhdGlvbi50eXBlID09PSAnZGVsZXRlJyAmJiBvcGVyYXRpb24ucmVzcG9uc2UgIT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICAgIGhlYWRlcjogJ0NhY2hlLiNiYXRjaENhY2hlT3BlcmF0aW9ucycsXG4gICAgICAgICAgICBtZXNzYWdlOiAnZGVsZXRlIG9wZXJhdGlvbiBzaG91bGQgbm90IGhhdmUgYW4gYXNzb2NpYXRlZCByZXNwb25zZSdcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNC4yLjNcbiAgICAgICAgaWYgKHRoaXMuI3F1ZXJ5Q2FjaGUob3BlcmF0aW9uLnJlcXVlc3QsIG9wZXJhdGlvbi5vcHRpb25zLCBhZGRlZEl0ZW1zKS5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCc/Pz8nLCAnSW52YWxpZFN0YXRlRXJyb3InKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNC4yLjRcbiAgICAgICAgbGV0IHJlcXVlc3RSZXNwb25zZXNcblxuICAgICAgICAvLyA0LjIuNVxuICAgICAgICBpZiAob3BlcmF0aW9uLnR5cGUgPT09ICdkZWxldGUnKSB7XG4gICAgICAgICAgLy8gNC4yLjUuMVxuICAgICAgICAgIHJlcXVlc3RSZXNwb25zZXMgPSB0aGlzLiNxdWVyeUNhY2hlKG9wZXJhdGlvbi5yZXF1ZXN0LCBvcGVyYXRpb24ub3B0aW9ucylcblxuICAgICAgICAgIC8vIFRPRE86IHRoZSBzcGVjIGlzIHdyb25nLCB0aGlzIGlzIG5lZWRlZCB0byBwYXNzIFdQVHNcbiAgICAgICAgICBpZiAocmVxdWVzdFJlc3BvbnNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIDQuMi41LjJcbiAgICAgICAgICBmb3IgKGNvbnN0IHJlcXVlc3RSZXNwb25zZSBvZiByZXF1ZXN0UmVzcG9uc2VzKSB7XG4gICAgICAgICAgICBjb25zdCBpZHggPSBjYWNoZS5pbmRleE9mKHJlcXVlc3RSZXNwb25zZSlcbiAgICAgICAgICAgIGFzc2VydChpZHggIT09IC0xKVxuXG4gICAgICAgICAgICAvLyA0LjIuNS4yLjFcbiAgICAgICAgICAgIGNhY2hlLnNwbGljZShpZHgsIDEpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbi50eXBlID09PSAncHV0JykgeyAvLyA0LjIuNlxuICAgICAgICAgIC8vIDQuMi42LjFcbiAgICAgICAgICBpZiAob3BlcmF0aW9uLnJlc3BvbnNlID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICAgICAgaGVhZGVyOiAnQ2FjaGUuI2JhdGNoQ2FjaGVPcGVyYXRpb25zJyxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ3B1dCBvcGVyYXRpb24gc2hvdWxkIGhhdmUgYW4gYXNzb2NpYXRlZCByZXNwb25zZSdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gNC4yLjYuMlxuICAgICAgICAgIGNvbnN0IHIgPSBvcGVyYXRpb24ucmVxdWVzdFxuXG4gICAgICAgICAgLy8gNC4yLjYuM1xuICAgICAgICAgIGlmICghdXJsSXNIdHRwSHR0cHNTY2hlbWUoci51cmwpKSB7XG4gICAgICAgICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgICAgIGhlYWRlcjogJ0NhY2hlLiNiYXRjaENhY2hlT3BlcmF0aW9ucycsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdleHBlY3RlZCBodHRwIG9yIGh0dHBzIHNjaGVtZSdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gNC4yLjYuNFxuICAgICAgICAgIGlmIChyLm1ldGhvZCAhPT0gJ0dFVCcpIHtcbiAgICAgICAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICAgICAgaGVhZGVyOiAnQ2FjaGUuI2JhdGNoQ2FjaGVPcGVyYXRpb25zJyxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ25vdCBnZXQgbWV0aG9kJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyA0LjIuNi41XG4gICAgICAgICAgaWYgKG9wZXJhdGlvbi5vcHRpb25zICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICAgICAgaGVhZGVyOiAnQ2FjaGUuI2JhdGNoQ2FjaGVPcGVyYXRpb25zJyxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ29wdGlvbnMgbXVzdCBub3QgYmUgZGVmaW5lZCdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gNC4yLjYuNlxuICAgICAgICAgIHJlcXVlc3RSZXNwb25zZXMgPSB0aGlzLiNxdWVyeUNhY2hlKG9wZXJhdGlvbi5yZXF1ZXN0KVxuXG4gICAgICAgICAgLy8gNC4yLjYuN1xuICAgICAgICAgIGZvciAoY29uc3QgcmVxdWVzdFJlc3BvbnNlIG9mIHJlcXVlc3RSZXNwb25zZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IGNhY2hlLmluZGV4T2YocmVxdWVzdFJlc3BvbnNlKVxuICAgICAgICAgICAgYXNzZXJ0KGlkeCAhPT0gLTEpXG5cbiAgICAgICAgICAgIC8vIDQuMi42LjcuMVxuICAgICAgICAgICAgY2FjaGUuc3BsaWNlKGlkeCwgMSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyA0LjIuNi44XG4gICAgICAgICAgY2FjaGUucHVzaChbb3BlcmF0aW9uLnJlcXVlc3QsIG9wZXJhdGlvbi5yZXNwb25zZV0pXG5cbiAgICAgICAgICAvLyA0LjIuNi4xMFxuICAgICAgICAgIGFkZGVkSXRlbXMucHVzaChbb3BlcmF0aW9uLnJlcXVlc3QsIG9wZXJhdGlvbi5yZXNwb25zZV0pXG4gICAgICAgIH1cblxuICAgICAgICAvLyA0LjIuN1xuICAgICAgICByZXN1bHRMaXN0LnB1c2goW29wZXJhdGlvbi5yZXF1ZXN0LCBvcGVyYXRpb24ucmVzcG9uc2VdKVxuICAgICAgfVxuXG4gICAgICAvLyA0LjNcbiAgICAgIHJldHVybiByZXN1bHRMaXN0XG4gICAgfSBjYXRjaCAoZSkgeyAvLyA1LlxuICAgICAgLy8gNS4xXG4gICAgICB0aGlzLiNyZWxldmFudFJlcXVlc3RSZXNwb25zZUxpc3QubGVuZ3RoID0gMFxuXG4gICAgICAvLyA1LjJcbiAgICAgIHRoaXMuI3JlbGV2YW50UmVxdWVzdFJlc3BvbnNlTGlzdCA9IGJhY2t1cENhY2hlXG5cbiAgICAgIC8vIDUuM1xuICAgICAgdGhyb3cgZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9TZXJ2aWNlV29ya2VyLyNxdWVyeS1jYWNoZVxuICAgKiBAcGFyYW0ge2FueX0gcmVxdWVzdFF1ZXJ5XG4gICAqIEBwYXJhbSB7aW1wb3J0KCcuLi8uLi90eXBlcy9jYWNoZScpLkNhY2hlUXVlcnlPcHRpb25zfSBvcHRpb25zXG4gICAqIEBwYXJhbSB7cmVxdWVzdFJlc3BvbnNlTGlzdH0gdGFyZ2V0U3RvcmFnZVxuICAgKiBAcmV0dXJucyB7cmVxdWVzdFJlc3BvbnNlTGlzdH1cbiAgICovXG4gICNxdWVyeUNhY2hlIChyZXF1ZXN0UXVlcnksIG9wdGlvbnMsIHRhcmdldFN0b3JhZ2UpIHtcbiAgICAvKiogQHR5cGUge3JlcXVlc3RSZXNwb25zZUxpc3R9ICovXG4gICAgY29uc3QgcmVzdWx0TGlzdCA9IFtdXG5cbiAgICBjb25zdCBzdG9yYWdlID0gdGFyZ2V0U3RvcmFnZSA/PyB0aGlzLiNyZWxldmFudFJlcXVlc3RSZXNwb25zZUxpc3RcblxuICAgIGZvciAoY29uc3QgcmVxdWVzdFJlc3BvbnNlIG9mIHN0b3JhZ2UpIHtcbiAgICAgIGNvbnN0IFtjYWNoZWRSZXF1ZXN0LCBjYWNoZWRSZXNwb25zZV0gPSByZXF1ZXN0UmVzcG9uc2VcbiAgICAgIGlmICh0aGlzLiNyZXF1ZXN0TWF0Y2hlc0NhY2hlZEl0ZW0ocmVxdWVzdFF1ZXJ5LCBjYWNoZWRSZXF1ZXN0LCBjYWNoZWRSZXNwb25zZSwgb3B0aW9ucykpIHtcbiAgICAgICAgcmVzdWx0TGlzdC5wdXNoKHJlcXVlc3RSZXNwb25zZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0TGlzdFxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL1NlcnZpY2VXb3JrZXIvI3JlcXVlc3QtbWF0Y2hlcy1jYWNoZWQtaXRlbS1hbGdvcml0aG1cbiAgICogQHBhcmFtIHthbnl9IHJlcXVlc3RRdWVyeVxuICAgKiBAcGFyYW0ge2FueX0gcmVxdWVzdFxuICAgKiBAcGFyYW0ge2FueSB8IG51bGx9IHJlc3BvbnNlXG4gICAqIEBwYXJhbSB7aW1wb3J0KCcuLi8uLi90eXBlcy9jYWNoZScpLkNhY2hlUXVlcnlPcHRpb25zIHwgdW5kZWZpbmVkfSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgI3JlcXVlc3RNYXRjaGVzQ2FjaGVkSXRlbSAocmVxdWVzdFF1ZXJ5LCByZXF1ZXN0LCByZXNwb25zZSA9IG51bGwsIG9wdGlvbnMpIHtcbiAgICAvLyBpZiAob3B0aW9ucz8uaWdub3JlTWV0aG9kID09PSBmYWxzZSAmJiByZXF1ZXN0Lm1ldGhvZCA9PT0gJ0dFVCcpIHtcbiAgICAvLyAgIHJldHVybiBmYWxzZVxuICAgIC8vIH1cblxuICAgIGNvbnN0IHF1ZXJ5VVJMID0gbmV3IFVSTChyZXF1ZXN0UXVlcnkudXJsKVxuXG4gICAgY29uc3QgY2FjaGVkVVJMID0gbmV3IFVSTChyZXF1ZXN0LnVybClcblxuICAgIGlmIChvcHRpb25zPy5pZ25vcmVTZWFyY2gpIHtcbiAgICAgIGNhY2hlZFVSTC5zZWFyY2ggPSAnJ1xuXG4gICAgICBxdWVyeVVSTC5zZWFyY2ggPSAnJ1xuICAgIH1cblxuICAgIGlmICghdXJsRXF1YWxzKHF1ZXJ5VVJMLCBjYWNoZWRVUkwsIHRydWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICByZXNwb25zZSA9PSBudWxsIHx8XG4gICAgICBvcHRpb25zPy5pZ25vcmVWYXJ5IHx8XG4gICAgICAhcmVzcG9uc2UuaGVhZGVyc0xpc3QuY29udGFpbnMoJ3ZhcnknKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBjb25zdCBmaWVsZFZhbHVlcyA9IGdldEZpZWxkVmFsdWVzKHJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgndmFyeScpKVxuXG4gICAgZm9yIChjb25zdCBmaWVsZFZhbHVlIG9mIGZpZWxkVmFsdWVzKSB7XG4gICAgICBpZiAoZmllbGRWYWx1ZSA9PT0gJyonKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXF1ZXN0VmFsdWUgPSByZXF1ZXN0LmhlYWRlcnNMaXN0LmdldChmaWVsZFZhbHVlKVxuICAgICAgY29uc3QgcXVlcnlWYWx1ZSA9IHJlcXVlc3RRdWVyeS5oZWFkZXJzTGlzdC5nZXQoZmllbGRWYWx1ZSlcblxuICAgICAgLy8gSWYgb25lIGhhcyB0aGUgaGVhZGVyIGFuZCB0aGUgb3RoZXIgZG9lc24ndCwgb3Igb25lIGhhc1xuICAgICAgLy8gYSBkaWZmZXJlbnQgdmFsdWUgdGhhbiB0aGUgb3RoZXIsIHJldHVybiBmYWxzZVxuICAgICAgaWYgKHJlcXVlc3RWYWx1ZSAhPT0gcXVlcnlWYWx1ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgI2ludGVybmFsTWF0Y2hBbGwgKHJlcXVlc3QsIG9wdGlvbnMsIG1heFJlc3BvbnNlcyA9IEluZmluaXR5KSB7XG4gICAgLy8gMS5cbiAgICBsZXQgciA9IG51bGxcblxuICAgIC8vIDIuXG4gICAgaWYgKHJlcXVlc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7XG4gICAgICAgIC8vIDIuMS4xXG4gICAgICAgIHIgPSByZXF1ZXN0W2tTdGF0ZV1cblxuICAgICAgICAvLyAyLjEuMlxuICAgICAgICBpZiAoci5tZXRob2QgIT09ICdHRVQnICYmICFvcHRpb25zLmlnbm9yZU1ldGhvZCkge1xuICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXF1ZXN0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyAyLjIuMVxuICAgICAgICByID0gbmV3IFJlcXVlc3QocmVxdWVzdClba1N0YXRlXVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDUuXG4gICAgLy8gNS4xXG4gICAgY29uc3QgcmVzcG9uc2VzID0gW11cblxuICAgIC8vIDUuMlxuICAgIGlmIChyZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIDUuMi4xXG4gICAgICBmb3IgKGNvbnN0IHJlcXVlc3RSZXNwb25zZSBvZiB0aGlzLiNyZWxldmFudFJlcXVlc3RSZXNwb25zZUxpc3QpIHtcbiAgICAgICAgcmVzcG9uc2VzLnB1c2gocmVxdWVzdFJlc3BvbnNlWzFdKVxuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIDUuM1xuICAgICAgLy8gNS4zLjFcbiAgICAgIGNvbnN0IHJlcXVlc3RSZXNwb25zZXMgPSB0aGlzLiNxdWVyeUNhY2hlKHIsIG9wdGlvbnMpXG5cbiAgICAgIC8vIDUuMy4yXG4gICAgICBmb3IgKGNvbnN0IHJlcXVlc3RSZXNwb25zZSBvZiByZXF1ZXN0UmVzcG9uc2VzKSB7XG4gICAgICAgIHJlc3BvbnNlcy5wdXNoKHJlcXVlc3RSZXNwb25zZVsxXSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA1LjRcbiAgICAvLyBXZSBkb24ndCBpbXBsZW1lbnQgQ09ScyBzbyB3ZSBkb24ndCBuZWVkIHRvIGxvb3Agb3ZlciB0aGUgcmVzcG9uc2VzLCB5YXkhXG5cbiAgICAvLyA1LjUuMVxuICAgIGNvbnN0IHJlc3BvbnNlTGlzdCA9IFtdXG5cbiAgICAvLyA1LjUuMlxuICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgcmVzcG9uc2VzKSB7XG4gICAgICAvLyA1LjUuMi4xXG4gICAgICBjb25zdCByZXNwb25zZU9iamVjdCA9IGZyb21Jbm5lclJlc3BvbnNlKHJlc3BvbnNlLCAnaW1tdXRhYmxlJylcblxuICAgICAgcmVzcG9uc2VMaXN0LnB1c2gocmVzcG9uc2VPYmplY3QuY2xvbmUoKSlcblxuICAgICAgaWYgKHJlc3BvbnNlTGlzdC5sZW5ndGggPj0gbWF4UmVzcG9uc2VzKSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNi5cbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShyZXNwb25zZUxpc3QpXG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQ2FjaGUucHJvdG90eXBlLCB7XG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7XG4gICAgdmFsdWU6ICdDYWNoZScsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0sXG4gIG1hdGNoOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBtYXRjaEFsbDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgYWRkOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBhZGRBbGw6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHB1dDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgZGVsZXRlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBrZXlzOiBrRW51bWVyYWJsZVByb3BlcnR5XG59KVxuXG5jb25zdCBjYWNoZVF1ZXJ5T3B0aW9uQ29udmVydGVycyA9IFtcbiAge1xuICAgIGtleTogJ2lnbm9yZVNlYXJjaCcsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ib29sZWFuLFxuICAgIGRlZmF1bHRWYWx1ZTogKCkgPT4gZmFsc2VcbiAgfSxcbiAge1xuICAgIGtleTogJ2lnbm9yZU1ldGhvZCcsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ib29sZWFuLFxuICAgIGRlZmF1bHRWYWx1ZTogKCkgPT4gZmFsc2VcbiAgfSxcbiAge1xuICAgIGtleTogJ2lnbm9yZVZhcnknLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYm9vbGVhbixcbiAgICBkZWZhdWx0VmFsdWU6ICgpID0+IGZhbHNlXG4gIH1cbl1cblxud2ViaWRsLmNvbnZlcnRlcnMuQ2FjaGVRdWVyeU9wdGlvbnMgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihjYWNoZVF1ZXJ5T3B0aW9uQ29udmVydGVycylcblxud2ViaWRsLmNvbnZlcnRlcnMuTXVsdGlDYWNoZVF1ZXJ5T3B0aW9ucyA9IHdlYmlkbC5kaWN0aW9uYXJ5Q29udmVydGVyKFtcbiAgLi4uY2FjaGVRdWVyeU9wdGlvbkNvbnZlcnRlcnMsXG4gIHtcbiAgICBrZXk6ICdjYWNoZU5hbWUnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nXG4gIH1cbl0pXG5cbndlYmlkbC5jb252ZXJ0ZXJzLlJlc3BvbnNlID0gd2ViaWRsLmludGVyZmFjZUNvbnZlcnRlcihSZXNwb25zZSlcblxud2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPFJlcXVlc3RJbmZvPiddID0gd2ViaWRsLnNlcXVlbmNlQ29udmVydGVyKFxuICB3ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mb1xuKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQ2FjaGVcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IGtDb25zdHJ1Y3QgfSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IENhY2hlIH0gPSByZXF1aXJlKCcuL2NhY2hlJylcbmNvbnN0IHsgd2ViaWRsIH0gPSByZXF1aXJlKCcuLi9mZXRjaC93ZWJpZGwnKVxuY29uc3QgeyBrRW51bWVyYWJsZVByb3BlcnR5IH0gPSByZXF1aXJlKCcuLi8uLi9jb3JlL3V0aWwnKVxuXG5jbGFzcyBDYWNoZVN0b3JhZ2Uge1xuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vU2VydmljZVdvcmtlci8jZGZuLXJlbGV2YW50LW5hbWUtdG8tY2FjaGUtbWFwXG4gICAqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoJy4vY2FjaGUnKS5yZXF1ZXN0UmVzcG9uc2VMaXN0fVxuICAgKi9cbiAgI2NhY2hlcyA9IG5ldyBNYXAoKVxuXG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBpZiAoYXJndW1lbnRzWzBdICE9PSBrQ29uc3RydWN0KSB7XG4gICAgICB3ZWJpZGwuaWxsZWdhbENvbnN0cnVjdG9yKClcbiAgICB9XG5cbiAgICB3ZWJpZGwudXRpbC5tYXJrQXNVbmNsb25lYWJsZSh0aGlzKVxuICB9XG5cbiAgYXN5bmMgbWF0Y2ggKHJlcXVlc3QsIG9wdGlvbnMgPSB7fSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIENhY2hlU3RvcmFnZSlcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsICdDYWNoZVN0b3JhZ2UubWF0Y2gnKVxuXG4gICAgcmVxdWVzdCA9IHdlYmlkbC5jb252ZXJ0ZXJzLlJlcXVlc3RJbmZvKHJlcXVlc3QpXG4gICAgb3B0aW9ucyA9IHdlYmlkbC5jb252ZXJ0ZXJzLk11bHRpQ2FjaGVRdWVyeU9wdGlvbnMob3B0aW9ucylcblxuICAgIC8vIDEuXG4gICAgaWYgKG9wdGlvbnMuY2FjaGVOYW1lICE9IG51bGwpIHtcbiAgICAgIC8vIDEuMS4xLjFcbiAgICAgIGlmICh0aGlzLiNjYWNoZXMuaGFzKG9wdGlvbnMuY2FjaGVOYW1lKSkge1xuICAgICAgICAvLyAxLjEuMS4xLjFcbiAgICAgICAgY29uc3QgY2FjaGVMaXN0ID0gdGhpcy4jY2FjaGVzLmdldChvcHRpb25zLmNhY2hlTmFtZSlcbiAgICAgICAgY29uc3QgY2FjaGUgPSBuZXcgQ2FjaGUoa0NvbnN0cnVjdCwgY2FjaGVMaXN0KVxuXG4gICAgICAgIHJldHVybiBhd2FpdCBjYWNoZS5tYXRjaChyZXF1ZXN0LCBvcHRpb25zKVxuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIDIuXG4gICAgICAvLyAyLjJcbiAgICAgIGZvciAoY29uc3QgY2FjaGVMaXN0IG9mIHRoaXMuI2NhY2hlcy52YWx1ZXMoKSkge1xuICAgICAgICBjb25zdCBjYWNoZSA9IG5ldyBDYWNoZShrQ29uc3RydWN0LCBjYWNoZUxpc3QpXG5cbiAgICAgICAgLy8gMi4yLjEuMlxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNhY2hlLm1hdGNoKHJlcXVlc3QsIG9wdGlvbnMpXG5cbiAgICAgICAgaWYgKHJlc3BvbnNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9TZXJ2aWNlV29ya2VyLyNjYWNoZS1zdG9yYWdlLWhhc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FjaGVOYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgYXN5bmMgaGFzIChjYWNoZU5hbWUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBDYWNoZVN0b3JhZ2UpXG5cbiAgICBjb25zdCBwcmVmaXggPSAnQ2FjaGVTdG9yYWdlLmhhcydcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHByZWZpeClcblxuICAgIGNhY2hlTmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyhjYWNoZU5hbWUsIHByZWZpeCwgJ2NhY2hlTmFtZScpXG5cbiAgICAvLyAyLjEuMVxuICAgIC8vIDIuMlxuICAgIHJldHVybiB0aGlzLiNjYWNoZXMuaGFzKGNhY2hlTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9TZXJ2aWNlV29ya2VyLyNkb20tY2FjaGVzdG9yYWdlLW9wZW5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhY2hlTmFtZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDYWNoZT59XG4gICAqL1xuICBhc3luYyBvcGVuIChjYWNoZU5hbWUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBDYWNoZVN0b3JhZ2UpXG5cbiAgICBjb25zdCBwcmVmaXggPSAnQ2FjaGVTdG9yYWdlLm9wZW4nXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCBwcmVmaXgpXG5cbiAgICBjYWNoZU5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcoY2FjaGVOYW1lLCBwcmVmaXgsICdjYWNoZU5hbWUnKVxuXG4gICAgLy8gMi4xXG4gICAgaWYgKHRoaXMuI2NhY2hlcy5oYXMoY2FjaGVOYW1lKSkge1xuICAgICAgLy8gYXdhaXQgY2FjaGVzLm9wZW4oJ3YxJykgIT09IGF3YWl0IGNhY2hlcy5vcGVuKCd2MScpXG5cbiAgICAgIC8vIDIuMS4xXG4gICAgICBjb25zdCBjYWNoZSA9IHRoaXMuI2NhY2hlcy5nZXQoY2FjaGVOYW1lKVxuXG4gICAgICAvLyAyLjEuMS4xXG4gICAgICByZXR1cm4gbmV3IENhY2hlKGtDb25zdHJ1Y3QsIGNhY2hlKVxuICAgIH1cblxuICAgIC8vIDIuMlxuICAgIGNvbnN0IGNhY2hlID0gW11cblxuICAgIC8vIDIuM1xuICAgIHRoaXMuI2NhY2hlcy5zZXQoY2FjaGVOYW1lLCBjYWNoZSlcblxuICAgIC8vIDIuNFxuICAgIHJldHVybiBuZXcgQ2FjaGUoa0NvbnN0cnVjdCwgY2FjaGUpXG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vU2VydmljZVdvcmtlci8jY2FjaGUtc3RvcmFnZS1kZWxldGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhY2hlTmFtZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGRlbGV0ZSAoY2FjaGVOYW1lKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGVTdG9yYWdlKVxuXG4gICAgY29uc3QgcHJlZml4ID0gJ0NhY2hlU3RvcmFnZS5kZWxldGUnXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCBwcmVmaXgpXG5cbiAgICBjYWNoZU5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcoY2FjaGVOYW1lLCBwcmVmaXgsICdjYWNoZU5hbWUnKVxuXG4gICAgcmV0dXJuIHRoaXMuI2NhY2hlcy5kZWxldGUoY2FjaGVOYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL1NlcnZpY2VXb3JrZXIvI2NhY2hlLXN0b3JhZ2Uta2V5c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59XG4gICAqL1xuICBhc3luYyBrZXlzICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBDYWNoZVN0b3JhZ2UpXG5cbiAgICAvLyAyLjFcbiAgICBjb25zdCBrZXlzID0gdGhpcy4jY2FjaGVzLmtleXMoKVxuXG4gICAgLy8gMi4yXG4gICAgcmV0dXJuIFsuLi5rZXlzXVxuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKENhY2hlU3RvcmFnZS5wcm90b3R5cGUsIHtcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHtcbiAgICB2YWx1ZTogJ0NhY2hlU3RvcmFnZScsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0sXG4gIG1hdGNoOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBoYXM6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIG9wZW46IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGRlbGV0ZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAga2V5czoga0VudW1lcmFibGVQcm9wZXJ0eVxufSlcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIENhY2hlU3RvcmFnZVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbi8vIGh0dHBzOi8vd2ljZy5naXRodWIuaW8vY29va2llLXN0b3JlLyNjb29raWUtbWF4aW11bS1hdHRyaWJ1dGUtdmFsdWUtc2l6ZVxuY29uc3QgbWF4QXR0cmlidXRlVmFsdWVTaXplID0gMTAyNFxuXG4vLyBodHRwczovL3dpY2cuZ2l0aHViLmlvL2Nvb2tpZS1zdG9yZS8jY29va2llLW1heGltdW0tbmFtZS12YWx1ZS1wYWlyLXNpemVcbmNvbnN0IG1heE5hbWVWYWx1ZVBhaXJTaXplID0gNDA5NlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWF4QXR0cmlidXRlVmFsdWVTaXplLFxuICBtYXhOYW1lVmFsdWVQYWlyU2l6ZVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNDVExFeGNsdWRpbmdIdGFiICh2YWx1ZSkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgY29kZSA9IHZhbHVlLmNoYXJDb2RlQXQoaSlcblxuICAgIGlmIChcbiAgICAgIChjb2RlID49IDB4MDAgJiYgY29kZSA8PSAweDA4KSB8fFxuICAgICAgKGNvZGUgPj0gMHgwQSAmJiBjb2RlIDw9IDB4MUYpIHx8XG4gICAgICBjb2RlID09PSAweDdGXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyoqXG4gQ0hBUiAgICAgICAgICAgPSA8YW55IFVTLUFTQ0lJIGNoYXJhY3RlciAob2N0ZXRzIDAgLSAxMjcpPlxuIHRva2VuICAgICAgICAgID0gMSo8YW55IENIQVIgZXhjZXB0IENUTHMgb3Igc2VwYXJhdG9ycz5cbiBzZXBhcmF0b3JzICAgICA9IFwiKFwiIHwgXCIpXCIgfCBcIjxcIiB8IFwiPlwiIHwgXCJAXCJcbiAgICAgICAgICAgICAgICB8IFwiLFwiIHwgXCI7XCIgfCBcIjpcIiB8IFwiXFxcIiB8IDxcIj5cbiAgICAgICAgICAgICAgICB8IFwiL1wiIHwgXCJbXCIgfCBcIl1cIiB8IFwiP1wiIHwgXCI9XCJcbiAgICAgICAgICAgICAgICB8IFwie1wiIHwgXCJ9XCIgfCBTUCB8IEhUXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUNvb2tpZU5hbWUgKG5hbWUpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgY29kZSA9IG5hbWUuY2hhckNvZGVBdChpKVxuXG4gICAgaWYgKFxuICAgICAgY29kZSA8IDB4MjEgfHwgLy8gZXhjbHVkZSBDVExzICgwLTMxKSwgU1AgYW5kIEhUXG4gICAgICBjb2RlID4gMHg3RSB8fCAvLyBleGNsdWRlIG5vbi1hc2NpaSBhbmQgREVMXG4gICAgICBjb2RlID09PSAweDIyIHx8IC8vIFwiXG4gICAgICBjb2RlID09PSAweDI4IHx8IC8vIChcbiAgICAgIGNvZGUgPT09IDB4MjkgfHwgLy8gKVxuICAgICAgY29kZSA9PT0gMHgzQyB8fCAvLyA8XG4gICAgICBjb2RlID09PSAweDNFIHx8IC8vID5cbiAgICAgIGNvZGUgPT09IDB4NDAgfHwgLy8gQFxuICAgICAgY29kZSA9PT0gMHgyQyB8fCAvLyAsXG4gICAgICBjb2RlID09PSAweDNCIHx8IC8vIDtcbiAgICAgIGNvZGUgPT09IDB4M0EgfHwgLy8gOlxuICAgICAgY29kZSA9PT0gMHg1QyB8fCAvLyBcXFxuICAgICAgY29kZSA9PT0gMHgyRiB8fCAvLyAvXG4gICAgICBjb2RlID09PSAweDVCIHx8IC8vIFtcbiAgICAgIGNvZGUgPT09IDB4NUQgfHwgLy8gXVxuICAgICAgY29kZSA9PT0gMHgzRiB8fCAvLyA/XG4gICAgICBjb2RlID09PSAweDNEIHx8IC8vID1cbiAgICAgIGNvZGUgPT09IDB4N0IgfHwgLy8ge1xuICAgICAgY29kZSA9PT0gMHg3RCAvLyB9XG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29va2llIG5hbWUnKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiBjb29raWUtdmFsdWUgICAgICA9ICpjb29raWUtb2N0ZXQgLyAoIERRVU9URSAqY29va2llLW9jdGV0IERRVU9URSApXG4gY29va2llLW9jdGV0ICAgICAgPSAleDIxIC8gJXgyMy0yQiAvICV4MkQtM0EgLyAleDNDLTVCIC8gJXg1RC03RVxuICAgICAgICAgICAgICAgICAgICAgICA7IFVTLUFTQ0lJIGNoYXJhY3RlcnMgZXhjbHVkaW5nIENUTHMsXG4gICAgICAgICAgICAgICAgICAgICAgIDsgd2hpdGVzcGFjZSBEUVVPVEUsIGNvbW1hLCBzZW1pY29sb24sXG4gICAgICAgICAgICAgICAgICAgICAgIDsgYW5kIGJhY2tzbGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ29va2llVmFsdWUgKHZhbHVlKSB7XG4gIGxldCBsZW4gPSB2YWx1ZS5sZW5ndGhcbiAgbGV0IGkgPSAwXG5cbiAgLy8gaWYgdGhlIHZhbHVlIGlzIHdyYXBwZWQgaW4gRFFVT1RFXG4gIGlmICh2YWx1ZVswXSA9PT0gJ1wiJykge1xuICAgIGlmIChsZW4gPT09IDEgfHwgdmFsdWVbbGVuIC0gMV0gIT09ICdcIicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb29raWUgdmFsdWUnKVxuICAgIH1cbiAgICAtLWxlblxuICAgICsraVxuICB9XG5cbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICBjb25zdCBjb2RlID0gdmFsdWUuY2hhckNvZGVBdChpKyspXG5cbiAgICBpZiAoXG4gICAgICBjb2RlIDwgMHgyMSB8fCAvLyBleGNsdWRlIENUTHMgKDAtMzEpXG4gICAgICBjb2RlID4gMHg3RSB8fCAvLyBub24tYXNjaWkgYW5kIERFTCAoMTI3KVxuICAgICAgY29kZSA9PT0gMHgyMiB8fCAvLyBcIlxuICAgICAgY29kZSA9PT0gMHgyQyB8fCAvLyAsXG4gICAgICBjb2RlID09PSAweDNCIHx8IC8vIDtcbiAgICAgIGNvZGUgPT09IDB4NUMgLy8gXFxcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb29raWUgdmFsdWUnKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIHBhdGgtdmFsdWUgICAgICAgID0gPGFueSBDSEFSIGV4Y2VwdCBDVExzIG9yIFwiO1wiPlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVDb29raWVQYXRoIChwYXRoKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoaSlcblxuICAgIGlmIChcbiAgICAgIGNvZGUgPCAweDIwIHx8IC8vIGV4Y2x1ZGUgQ1RMcyAoMC0zMSlcbiAgICAgIGNvZGUgPT09IDB4N0YgfHwgLy8gREVMXG4gICAgICBjb2RlID09PSAweDNCIC8vIDtcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb29raWUgcGF0aCcpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogSSBoYXZlIG5vIGlkZWEgd2h5IHRoZXNlIHZhbHVlcyBhcmVuJ3QgYWxsb3dlZCB0byBiZSBob25lc3QsXG4gKiBidXQgRGVubyB0ZXN0cyB0aGVzZS4gLSBLaGFmcmFcbiAqIEBwYXJhbSB7c3RyaW5nfSBkb21haW5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVDb29raWVEb21haW4gKGRvbWFpbikge1xuICBpZiAoXG4gICAgZG9tYWluLnN0YXJ0c1dpdGgoJy0nKSB8fFxuICAgIGRvbWFpbi5lbmRzV2l0aCgnLicpIHx8XG4gICAgZG9tYWluLmVuZHNXaXRoKCctJylcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvb2tpZSBkb21haW4nKVxuICB9XG59XG5cbmNvbnN0IElNRkRheXMgPSBbXG4gICdTdW4nLCAnTW9uJywgJ1R1ZScsICdXZWQnLFxuICAnVGh1JywgJ0ZyaScsICdTYXQnXG5dXG5cbmNvbnN0IElNRk1vbnRocyA9IFtcbiAgJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJyxcbiAgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ1xuXVxuXG5jb25zdCBJTUZQYWRkZWROdW1iZXJzID0gQXJyYXkoNjEpLmZpbGwoMCkubWFwKChfLCBpKSA9PiBpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSlcblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM3MjMxI3NlY3Rpb24tNy4xLjEuMVxuICogQHBhcmFtIHtudW1iZXJ8RGF0ZX0gZGF0ZVxuICBJTUYtZml4ZGF0ZSAgPSBkYXktbmFtZSBcIixcIiBTUCBkYXRlMSBTUCB0aW1lLW9mLWRheSBTUCBHTVRcbiAgOyBmaXhlZCBsZW5ndGgvem9uZS9jYXBpdGFsaXphdGlvbiBzdWJzZXQgb2YgdGhlIGZvcm1hdFxuICA7IHNlZSBTZWN0aW9uIDMuMyBvZiBbUkZDNTMyMl1cblxuICBkYXktbmFtZSAgICAgPSAleDRELjZGLjZFIDsgXCJNb25cIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDU0Ljc1LjY1IDsgXCJUdWVcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDU3LjY1LjY0IDsgXCJXZWRcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDU0LjY4Ljc1IDsgXCJUaHVcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDQ2LjcyLjY5IDsgXCJGcmlcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDUzLjYxLjc0IDsgXCJTYXRcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDUzLjc1LjZFIDsgXCJTdW5cIiwgY2FzZS1zZW5zaXRpdmVcbiAgZGF0ZTEgICAgICAgID0gZGF5IFNQIG1vbnRoIFNQIHllYXJcbiAgICAgICAgICAgICAgICAgIDsgZS5nLiwgMDIgSnVuIDE5ODJcblxuICBkYXkgICAgICAgICAgPSAyRElHSVRcbiAgbW9udGggICAgICAgID0gJXg0QS42MS42RSA7IFwiSmFuXCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg0Ni42NS42MiA7IFwiRmViXCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg0RC42MS43MiA7IFwiTWFyXCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg0MS43MC43MiA7IFwiQXByXCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg0RC42MS43OSA7IFwiTWF5XCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg0QS43NS42RSA7IFwiSnVuXCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg0QS43NS42QyA7IFwiSnVsXCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg0MS43NS42NyA7IFwiQXVnXCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg1My42NS43MCA7IFwiU2VwXCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg0Ri42My43NCA7IFwiT2N0XCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg0RS42Ri43NiA7IFwiTm92XCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg0NC42NS42MyA7IFwiRGVjXCIsIGNhc2Utc2Vuc2l0aXZlXG4gIHllYXIgICAgICAgICA9IDRESUdJVFxuXG4gIEdNVCAgICAgICAgICA9ICV4NDcuNEQuNTQgOyBcIkdNVFwiLCBjYXNlLXNlbnNpdGl2ZVxuXG4gIHRpbWUtb2YtZGF5ICA9IGhvdXIgXCI6XCIgbWludXRlIFwiOlwiIHNlY29uZFxuICAgICAgICAgICAgICA7IDAwOjAwOjAwIC0gMjM6NTk6NjAgKGxlYXAgc2Vjb25kKVxuXG4gIGhvdXIgICAgICAgICA9IDJESUdJVFxuICBtaW51dGUgICAgICAgPSAyRElHSVRcbiAgc2Vjb25kICAgICAgID0gMkRJR0lUXG4gKi9cbmZ1bmN0aW9uIHRvSU1GRGF0ZSAoZGF0ZSkge1xuICBpZiAodHlwZW9mIGRhdGUgPT09ICdudW1iZXInKSB7XG4gICAgZGF0ZSA9IG5ldyBEYXRlKGRhdGUpXG4gIH1cblxuICByZXR1cm4gYCR7SU1GRGF5c1tkYXRlLmdldFVUQ0RheSgpXX0sICR7SU1GUGFkZGVkTnVtYmVyc1tkYXRlLmdldFVUQ0RhdGUoKV19ICR7SU1GTW9udGhzW2RhdGUuZ2V0VVRDTW9udGgoKV19ICR7ZGF0ZS5nZXRVVENGdWxsWWVhcigpfSAke0lNRlBhZGRlZE51bWJlcnNbZGF0ZS5nZXRVVENIb3VycygpXX06JHtJTUZQYWRkZWROdW1iZXJzW2RhdGUuZ2V0VVRDTWludXRlcygpXX06JHtJTUZQYWRkZWROdW1iZXJzW2RhdGUuZ2V0VVRDU2Vjb25kcygpXX0gR01UYFxufVxuXG4vKipcbiBtYXgtYWdlLWF2ICAgICAgICA9IFwiTWF4LUFnZT1cIiBub24temVyby1kaWdpdCAqRElHSVRcbiAgICAgICAgICAgICAgICAgICAgICAgOyBJbiBwcmFjdGljZSwgYm90aCBleHBpcmVzLWF2IGFuZCBtYXgtYWdlLWF2XG4gICAgICAgICAgICAgICAgICAgICAgIDsgYXJlIGxpbWl0ZWQgdG8gZGF0ZXMgcmVwcmVzZW50YWJsZSBieSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgOyB1c2VyIGFnZW50LlxuICogQHBhcmFtIHtudW1iZXJ9IG1heEFnZVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUNvb2tpZU1heEFnZSAobWF4QWdlKSB7XG4gIGlmIChtYXhBZ2UgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvb2tpZSBtYXgtYWdlJylcbiAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzYyNjUjc2VjdGlvbi00LjEuMVxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW5kZXgnKS5Db29raWV9IGNvb2tpZVxuICovXG5mdW5jdGlvbiBzdHJpbmdpZnkgKGNvb2tpZSkge1xuICBpZiAoY29va2llLm5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHZhbGlkYXRlQ29va2llTmFtZShjb29raWUubmFtZSlcbiAgdmFsaWRhdGVDb29raWVWYWx1ZShjb29raWUudmFsdWUpXG5cbiAgY29uc3Qgb3V0ID0gW2Ake2Nvb2tpZS5uYW1lfT0ke2Nvb2tpZS52YWx1ZX1gXVxuXG4gIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtaWV0Zi1odHRwYmlzLWNvb2tpZS1wcmVmaXhlcy0wMCNzZWN0aW9uLTMuMVxuICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1jb29raWUtcHJlZml4ZXMtMDAjc2VjdGlvbi0zLjJcbiAgaWYgKGNvb2tpZS5uYW1lLnN0YXJ0c1dpdGgoJ19fU2VjdXJlLScpKSB7XG4gICAgY29va2llLnNlY3VyZSA9IHRydWVcbiAgfVxuXG4gIGlmIChjb29raWUubmFtZS5zdGFydHNXaXRoKCdfX0hvc3QtJykpIHtcbiAgICBjb29raWUuc2VjdXJlID0gdHJ1ZVxuICAgIGNvb2tpZS5kb21haW4gPSBudWxsXG4gICAgY29va2llLnBhdGggPSAnLydcbiAgfVxuXG4gIGlmIChjb29raWUuc2VjdXJlKSB7XG4gICAgb3V0LnB1c2goJ1NlY3VyZScpXG4gIH1cblxuICBpZiAoY29va2llLmh0dHBPbmx5KSB7XG4gICAgb3V0LnB1c2goJ0h0dHBPbmx5JylcbiAgfVxuXG4gIGlmICh0eXBlb2YgY29va2llLm1heEFnZSA9PT0gJ251bWJlcicpIHtcbiAgICB2YWxpZGF0ZUNvb2tpZU1heEFnZShjb29raWUubWF4QWdlKVxuICAgIG91dC5wdXNoKGBNYXgtQWdlPSR7Y29va2llLm1heEFnZX1gKVxuICB9XG5cbiAgaWYgKGNvb2tpZS5kb21haW4pIHtcbiAgICB2YWxpZGF0ZUNvb2tpZURvbWFpbihjb29raWUuZG9tYWluKVxuICAgIG91dC5wdXNoKGBEb21haW49JHtjb29raWUuZG9tYWlufWApXG4gIH1cblxuICBpZiAoY29va2llLnBhdGgpIHtcbiAgICB2YWxpZGF0ZUNvb2tpZVBhdGgoY29va2llLnBhdGgpXG4gICAgb3V0LnB1c2goYFBhdGg9JHtjb29raWUucGF0aH1gKVxuICB9XG5cbiAgaWYgKGNvb2tpZS5leHBpcmVzICYmIGNvb2tpZS5leHBpcmVzLnRvU3RyaW5nKCkgIT09ICdJbnZhbGlkIERhdGUnKSB7XG4gICAgb3V0LnB1c2goYEV4cGlyZXM9JHt0b0lNRkRhdGUoY29va2llLmV4cGlyZXMpfWApXG4gIH1cblxuICBpZiAoY29va2llLnNhbWVTaXRlKSB7XG4gICAgb3V0LnB1c2goYFNhbWVTaXRlPSR7Y29va2llLnNhbWVTaXRlfWApXG4gIH1cblxuICBmb3IgKGNvbnN0IHBhcnQgb2YgY29va2llLnVucGFyc2VkKSB7XG4gICAgaWYgKCFwYXJ0LmluY2x1ZGVzKCc9JykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1bnBhcnNlZCcpXG4gICAgfVxuXG4gICAgY29uc3QgW2tleSwgLi4udmFsdWVdID0gcGFydC5zcGxpdCgnPScpXG5cbiAgICBvdXQucHVzaChgJHtrZXkudHJpbSgpfT0ke3ZhbHVlLmpvaW4oJz0nKX1gKVxuICB9XG5cbiAgcmV0dXJuIG91dC5qb2luKCc7ICcpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc0NUTEV4Y2x1ZGluZ0h0YWIsXG4gIHZhbGlkYXRlQ29va2llTmFtZSxcbiAgdmFsaWRhdGVDb29raWVQYXRoLFxuICB2YWxpZGF0ZUNvb2tpZVZhbHVlLFxuICB0b0lNRkRhdGUsXG4gIHN0cmluZ2lmeVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgbWF4TmFtZVZhbHVlUGFpclNpemUsIG1heEF0dHJpYnV0ZVZhbHVlU2l6ZSB9ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3QgeyBpc0NUTEV4Y2x1ZGluZ0h0YWIgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0IH0gPSByZXF1aXJlKCcuLi9mZXRjaC9kYXRhLXVybCcpXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdub2RlOmFzc2VydCcpXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFBhcnNlcyB0aGUgZmllbGQtdmFsdWUgYXR0cmlidXRlcyBvZiBhIHNldC1jb29raWUgaGVhZGVyIHN0cmluZy5cbiAqIEBzZWUgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9kcmFmdC1pZXRmLWh0dHBiaXMtcmZjNjI2NWJpcyNzZWN0aW9uLTUuNFxuICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICogQHJldHVybnMgaWYgdGhlIGhlYWRlciBpcyBpbnZhbGlkLCBudWxsIHdpbGwgYmUgcmV0dXJuZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VTZXRDb29raWUgKGhlYWRlcikge1xuICAvLyAxLiBJZiB0aGUgc2V0LWNvb2tpZS1zdHJpbmcgY29udGFpbnMgYSAleDAwLTA4IC8gJXgwQS0xRiAvICV4N0ZcbiAgLy8gICAgY2hhcmFjdGVyIChDVEwgY2hhcmFjdGVycyBleGNsdWRpbmcgSFRBQik6IEFib3J0IHRoZXNlIHN0ZXBzIGFuZFxuICAvLyAgICBpZ25vcmUgdGhlIHNldC1jb29raWUtc3RyaW5nIGVudGlyZWx5LlxuICBpZiAoaXNDVExFeGNsdWRpbmdIdGFiKGhlYWRlcikpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgbGV0IG5hbWVWYWx1ZVBhaXIgPSAnJ1xuICBsZXQgdW5wYXJzZWRBdHRyaWJ1dGVzID0gJydcbiAgbGV0IG5hbWUgPSAnJ1xuICBsZXQgdmFsdWUgPSAnJ1xuXG4gIC8vIDIuIElmIHRoZSBzZXQtY29va2llLXN0cmluZyBjb250YWlucyBhICV4M0IgKFwiO1wiKSBjaGFyYWN0ZXI6XG4gIGlmIChoZWFkZXIuaW5jbHVkZXMoJzsnKSkge1xuICAgIC8vIDEuIFRoZSBuYW1lLXZhbHVlLXBhaXIgc3RyaW5nIGNvbnNpc3RzIG9mIHRoZSBjaGFyYWN0ZXJzIHVwIHRvLFxuICAgIC8vICAgIGJ1dCBub3QgaW5jbHVkaW5nLCB0aGUgZmlyc3QgJXgzQiAoXCI7XCIpLCBhbmQgdGhlIHVucGFyc2VkLVxuICAgIC8vICAgIGF0dHJpYnV0ZXMgY29uc2lzdCBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSBzZXQtY29va2llLXN0cmluZ1xuICAgIC8vICAgIChpbmNsdWRpbmcgdGhlICV4M0IgKFwiO1wiKSBpbiBxdWVzdGlvbikuXG4gICAgY29uc3QgcG9zaXRpb24gPSB7IHBvc2l0aW9uOiAwIH1cblxuICAgIG5hbWVWYWx1ZVBhaXIgPSBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzRmFzdCgnOycsIGhlYWRlciwgcG9zaXRpb24pXG4gICAgdW5wYXJzZWRBdHRyaWJ1dGVzID0gaGVhZGVyLnNsaWNlKHBvc2l0aW9uLnBvc2l0aW9uKVxuICB9IGVsc2Uge1xuICAgIC8vIE90aGVyd2lzZTpcblxuICAgIC8vIDEuIFRoZSBuYW1lLXZhbHVlLXBhaXIgc3RyaW5nIGNvbnNpc3RzIG9mIGFsbCB0aGUgY2hhcmFjdGVyc1xuICAgIC8vICAgIGNvbnRhaW5lZCBpbiB0aGUgc2V0LWNvb2tpZS1zdHJpbmcsIGFuZCB0aGUgdW5wYXJzZWQtXG4gICAgLy8gICAgYXR0cmlidXRlcyBpcyB0aGUgZW1wdHkgc3RyaW5nLlxuICAgIG5hbWVWYWx1ZVBhaXIgPSBoZWFkZXJcbiAgfVxuXG4gIC8vIDMuIElmIHRoZSBuYW1lLXZhbHVlLXBhaXIgc3RyaW5nIGxhY2tzIGEgJXgzRCAoXCI9XCIpIGNoYXJhY3RlciwgdGhlblxuICAvLyAgICB0aGUgbmFtZSBzdHJpbmcgaXMgZW1wdHksIGFuZCB0aGUgdmFsdWUgc3RyaW5nIGlzIHRoZSB2YWx1ZSBvZlxuICAvLyAgICBuYW1lLXZhbHVlLXBhaXIuXG4gIGlmICghbmFtZVZhbHVlUGFpci5pbmNsdWRlcygnPScpKSB7XG4gICAgdmFsdWUgPSBuYW1lVmFsdWVQYWlyXG4gIH0gZWxzZSB7XG4gICAgLy8gICAgT3RoZXJ3aXNlLCB0aGUgbmFtZSBzdHJpbmcgY29uc2lzdHMgb2YgdGhlIGNoYXJhY3RlcnMgdXAgdG8sIGJ1dFxuICAgIC8vICAgIG5vdCBpbmNsdWRpbmcsIHRoZSBmaXJzdCAleDNEIChcIj1cIikgY2hhcmFjdGVyLCBhbmQgdGhlIChwb3NzaWJseVxuICAgIC8vICAgIGVtcHR5KSB2YWx1ZSBzdHJpbmcgY29uc2lzdHMgb2YgdGhlIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIGZpcnN0XG4gICAgLy8gICAgJXgzRCAoXCI9XCIpIGNoYXJhY3Rlci5cbiAgICBjb25zdCBwb3NpdGlvbiA9IHsgcG9zaXRpb246IDAgfVxuICAgIG5hbWUgPSBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzRmFzdChcbiAgICAgICc9JyxcbiAgICAgIG5hbWVWYWx1ZVBhaXIsXG4gICAgICBwb3NpdGlvblxuICAgIClcbiAgICB2YWx1ZSA9IG5hbWVWYWx1ZVBhaXIuc2xpY2UocG9zaXRpb24ucG9zaXRpb24gKyAxKVxuICB9XG5cbiAgLy8gNC4gUmVtb3ZlIGFueSBsZWFkaW5nIG9yIHRyYWlsaW5nIFdTUCBjaGFyYWN0ZXJzIGZyb20gdGhlIG5hbWVcbiAgLy8gICAgc3RyaW5nIGFuZCB0aGUgdmFsdWUgc3RyaW5nLlxuICBuYW1lID0gbmFtZS50cmltKClcbiAgdmFsdWUgPSB2YWx1ZS50cmltKClcblxuICAvLyA1LiBJZiB0aGUgc3VtIG9mIHRoZSBsZW5ndGhzIG9mIHRoZSBuYW1lIHN0cmluZyBhbmQgdGhlIHZhbHVlIHN0cmluZ1xuICAvLyAgICBpcyBtb3JlIHRoYW4gNDA5NiBvY3RldHMsIGFib3J0IHRoZXNlIHN0ZXBzIGFuZCBpZ25vcmUgdGhlIHNldC1cbiAgLy8gICAgY29va2llLXN0cmluZyBlbnRpcmVseS5cbiAgaWYgKG5hbWUubGVuZ3RoICsgdmFsdWUubGVuZ3RoID4gbWF4TmFtZVZhbHVlUGFpclNpemUpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLy8gNi4gVGhlIGNvb2tpZS1uYW1lIGlzIHRoZSBuYW1lIHN0cmluZywgYW5kIHRoZSBjb29raWUtdmFsdWUgaXMgdGhlXG4gIC8vICAgIHZhbHVlIHN0cmluZy5cbiAgcmV0dXJuIHtcbiAgICBuYW1lLCB2YWx1ZSwgLi4ucGFyc2VVbnBhcnNlZEF0dHJpYnV0ZXModW5wYXJzZWRBdHRyaWJ1dGVzKVxuICB9XG59XG5cbi8qKlxuICogUGFyc2VzIHRoZSByZW1haW5pbmcgYXR0cmlidXRlcyBvZiBhIHNldC1jb29raWUgaGVhZGVyXG4gKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtaWV0Zi1odHRwYmlzLXJmYzYyNjViaXMjc2VjdGlvbi01LjRcbiAqIEBwYXJhbSB7c3RyaW5nfSB1bnBhcnNlZEF0dHJpYnV0ZXNcbiAqIEBwYXJhbSB7W09iamVjdC48c3RyaW5nLCB1bmtub3duPl09e319IGNvb2tpZUF0dHJpYnV0ZUxpc3RcbiAqL1xuZnVuY3Rpb24gcGFyc2VVbnBhcnNlZEF0dHJpYnV0ZXMgKHVucGFyc2VkQXR0cmlidXRlcywgY29va2llQXR0cmlidXRlTGlzdCA9IHt9KSB7XG4gIC8vIDEuIElmIHRoZSB1bnBhcnNlZC1hdHRyaWJ1dGVzIHN0cmluZyBpcyBlbXB0eSwgc2tpcCB0aGUgcmVzdCBvZlxuICAvLyAgICB0aGVzZSBzdGVwcy5cbiAgaWYgKHVucGFyc2VkQXR0cmlidXRlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gY29va2llQXR0cmlidXRlTGlzdFxuICB9XG5cbiAgLy8gMi4gRGlzY2FyZCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSB1bnBhcnNlZC1hdHRyaWJ1dGVzICh3aGljaFxuICAvLyAgICB3aWxsIGJlIGEgJXgzQiAoXCI7XCIpIGNoYXJhY3RlcikuXG4gIGFzc2VydCh1bnBhcnNlZEF0dHJpYnV0ZXNbMF0gPT09ICc7JylcbiAgdW5wYXJzZWRBdHRyaWJ1dGVzID0gdW5wYXJzZWRBdHRyaWJ1dGVzLnNsaWNlKDEpXG5cbiAgbGV0IGNvb2tpZUF2ID0gJydcblxuICAvLyAzLiBJZiB0aGUgcmVtYWluaW5nIHVucGFyc2VkLWF0dHJpYnV0ZXMgY29udGFpbnMgYSAleDNCIChcIjtcIilcbiAgLy8gICAgY2hhcmFjdGVyOlxuICBpZiAodW5wYXJzZWRBdHRyaWJ1dGVzLmluY2x1ZGVzKCc7JykpIHtcbiAgICAvLyAxLiBDb25zdW1lIHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSB1bnBhcnNlZC1hdHRyaWJ1dGVzIHVwIHRvLCBidXRcbiAgICAvLyAgICBub3QgaW5jbHVkaW5nLCB0aGUgZmlyc3QgJXgzQiAoXCI7XCIpIGNoYXJhY3Rlci5cbiAgICBjb29raWVBdiA9IGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0KFxuICAgICAgJzsnLFxuICAgICAgdW5wYXJzZWRBdHRyaWJ1dGVzLFxuICAgICAgeyBwb3NpdGlvbjogMCB9XG4gICAgKVxuICAgIHVucGFyc2VkQXR0cmlidXRlcyA9IHVucGFyc2VkQXR0cmlidXRlcy5zbGljZShjb29raWVBdi5sZW5ndGgpXG4gIH0gZWxzZSB7XG4gICAgLy8gT3RoZXJ3aXNlOlxuXG4gICAgLy8gMS4gQ29uc3VtZSB0aGUgcmVtYWluZGVyIG9mIHRoZSB1bnBhcnNlZC1hdHRyaWJ1dGVzLlxuICAgIGNvb2tpZUF2ID0gdW5wYXJzZWRBdHRyaWJ1dGVzXG4gICAgdW5wYXJzZWRBdHRyaWJ1dGVzID0gJydcbiAgfVxuXG4gIC8vIExldCB0aGUgY29va2llLWF2IHN0cmluZyBiZSB0aGUgY2hhcmFjdGVycyBjb25zdW1lZCBpbiB0aGlzIHN0ZXAuXG5cbiAgbGV0IGF0dHJpYnV0ZU5hbWUgPSAnJ1xuICBsZXQgYXR0cmlidXRlVmFsdWUgPSAnJ1xuXG4gIC8vIDQuIElmIHRoZSBjb29raWUtYXYgc3RyaW5nIGNvbnRhaW5zIGEgJXgzRCAoXCI9XCIpIGNoYXJhY3RlcjpcbiAgaWYgKGNvb2tpZUF2LmluY2x1ZGVzKCc9JykpIHtcbiAgICAvLyAxLiBUaGUgKHBvc3NpYmx5IGVtcHR5KSBhdHRyaWJ1dGUtbmFtZSBzdHJpbmcgY29uc2lzdHMgb2YgdGhlXG4gICAgLy8gICAgY2hhcmFjdGVycyB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIHRoZSBmaXJzdCAleDNEIChcIj1cIilcbiAgICAvLyAgICBjaGFyYWN0ZXIsIGFuZCB0aGUgKHBvc3NpYmx5IGVtcHR5KSBhdHRyaWJ1dGUtdmFsdWUgc3RyaW5nXG4gICAgLy8gICAgY29uc2lzdHMgb2YgdGhlIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIGZpcnN0ICV4M0QgKFwiPVwiKVxuICAgIC8vICAgIGNoYXJhY3Rlci5cbiAgICBjb25zdCBwb3NpdGlvbiA9IHsgcG9zaXRpb246IDAgfVxuXG4gICAgYXR0cmlidXRlTmFtZSA9IGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0KFxuICAgICAgJz0nLFxuICAgICAgY29va2llQXYsXG4gICAgICBwb3NpdGlvblxuICAgIClcbiAgICBhdHRyaWJ1dGVWYWx1ZSA9IGNvb2tpZUF2LnNsaWNlKHBvc2l0aW9uLnBvc2l0aW9uICsgMSlcbiAgfSBlbHNlIHtcbiAgICAvLyBPdGhlcndpc2U6XG5cbiAgICAvLyAxLiBUaGUgYXR0cmlidXRlLW5hbWUgc3RyaW5nIGNvbnNpc3RzIG9mIHRoZSBlbnRpcmUgY29va2llLWF2XG4gICAgLy8gICAgc3RyaW5nLCBhbmQgdGhlIGF0dHJpYnV0ZS12YWx1ZSBzdHJpbmcgaXMgZW1wdHkuXG4gICAgYXR0cmlidXRlTmFtZSA9IGNvb2tpZUF2XG4gIH1cblxuICAvLyA1LiBSZW1vdmUgYW55IGxlYWRpbmcgb3IgdHJhaWxpbmcgV1NQIGNoYXJhY3RlcnMgZnJvbSB0aGUgYXR0cmlidXRlLVxuICAvLyAgICBuYW1lIHN0cmluZyBhbmQgdGhlIGF0dHJpYnV0ZS12YWx1ZSBzdHJpbmcuXG4gIGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lLnRyaW0oKVxuICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVZhbHVlLnRyaW0oKVxuXG4gIC8vIDYuIElmIHRoZSBhdHRyaWJ1dGUtdmFsdWUgaXMgbG9uZ2VyIHRoYW4gMTAyNCBvY3RldHMsIGlnbm9yZSB0aGVcbiAgLy8gICAgY29va2llLWF2IHN0cmluZyBhbmQgcmV0dXJuIHRvIFN0ZXAgMSBvZiB0aGlzIGFsZ29yaXRobS5cbiAgaWYgKGF0dHJpYnV0ZVZhbHVlLmxlbmd0aCA+IG1heEF0dHJpYnV0ZVZhbHVlU2l6ZSkge1xuICAgIHJldHVybiBwYXJzZVVucGFyc2VkQXR0cmlidXRlcyh1bnBhcnNlZEF0dHJpYnV0ZXMsIGNvb2tpZUF0dHJpYnV0ZUxpc3QpXG4gIH1cblxuICAvLyA3LiBQcm9jZXNzIHRoZSBhdHRyaWJ1dGUtbmFtZSBhbmQgYXR0cmlidXRlLXZhbHVlIGFjY29yZGluZyB0byB0aGVcbiAgLy8gICAgcmVxdWlyZW1lbnRzIGluIHRoZSBmb2xsb3dpbmcgc3Vic2VjdGlvbnMuICAoTm90aWNlIHRoYXRcbiAgLy8gICAgYXR0cmlidXRlcyB3aXRoIHVucmVjb2duaXplZCBhdHRyaWJ1dGUtbmFtZXMgYXJlIGlnbm9yZWQuKVxuICBjb25zdCBhdHRyaWJ1dGVOYW1lTG93ZXJjYXNlID0gYXR0cmlidXRlTmFtZS50b0xvd2VyQ2FzZSgpXG5cbiAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9kcmFmdC1pZXRmLWh0dHBiaXMtcmZjNjI2NWJpcyNzZWN0aW9uLTUuNC4xXG4gIC8vIElmIHRoZSBhdHRyaWJ1dGUtbmFtZSBjYXNlLWluc2Vuc2l0aXZlbHkgbWF0Y2hlcyB0aGUgc3RyaW5nXG4gIC8vIFwiRXhwaXJlc1wiLCB0aGUgdXNlciBhZ2VudCBNVVNUIHByb2Nlc3MgdGhlIGNvb2tpZS1hdiBhcyBmb2xsb3dzLlxuICBpZiAoYXR0cmlidXRlTmFtZUxvd2VyY2FzZSA9PT0gJ2V4cGlyZXMnKSB7XG4gICAgLy8gMS4gTGV0IHRoZSBleHBpcnktdGltZSBiZSB0aGUgcmVzdWx0IG9mIHBhcnNpbmcgdGhlIGF0dHJpYnV0ZS12YWx1ZVxuICAgIC8vICAgIGFzIGNvb2tpZS1kYXRlIChzZWUgU2VjdGlvbiA1LjEuMSkuXG4gICAgY29uc3QgZXhwaXJ5VGltZSA9IG5ldyBEYXRlKGF0dHJpYnV0ZVZhbHVlKVxuXG4gICAgLy8gMi4gSWYgdGhlIGF0dHJpYnV0ZS12YWx1ZSBmYWlsZWQgdG8gcGFyc2UgYXMgYSBjb29raWUgZGF0ZSwgaWdub3JlXG4gICAgLy8gICAgdGhlIGNvb2tpZS1hdi5cblxuICAgIGNvb2tpZUF0dHJpYnV0ZUxpc3QuZXhwaXJlcyA9IGV4cGlyeVRpbWVcbiAgfSBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lTG93ZXJjYXNlID09PSAnbWF4LWFnZScpIHtcbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1yZmM2MjY1YmlzI3NlY3Rpb24tNS40LjJcbiAgICAvLyBJZiB0aGUgYXR0cmlidXRlLW5hbWUgY2FzZS1pbnNlbnNpdGl2ZWx5IG1hdGNoZXMgdGhlIHN0cmluZyBcIk1heC1cbiAgICAvLyBBZ2VcIiwgdGhlIHVzZXIgYWdlbnQgTVVTVCBwcm9jZXNzIHRoZSBjb29raWUtYXYgYXMgZm9sbG93cy5cblxuICAgIC8vIDEuIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGF0dHJpYnV0ZS12YWx1ZSBpcyBub3QgYSBESUdJVCBvciBhXG4gICAgLy8gICAgXCItXCIgY2hhcmFjdGVyLCBpZ25vcmUgdGhlIGNvb2tpZS1hdi5cbiAgICBjb25zdCBjaGFyQ29kZSA9IGF0dHJpYnV0ZVZhbHVlLmNoYXJDb2RlQXQoMClcblxuICAgIGlmICgoY2hhckNvZGUgPCA0OCB8fCBjaGFyQ29kZSA+IDU3KSAmJiBhdHRyaWJ1dGVWYWx1ZVswXSAhPT0gJy0nKSB7XG4gICAgICByZXR1cm4gcGFyc2VVbnBhcnNlZEF0dHJpYnV0ZXModW5wYXJzZWRBdHRyaWJ1dGVzLCBjb29raWVBdHRyaWJ1dGVMaXN0KVxuICAgIH1cblxuICAgIC8vIDIuIElmIHRoZSByZW1haW5kZXIgb2YgYXR0cmlidXRlLXZhbHVlIGNvbnRhaW5zIGEgbm9uLURJR0lUXG4gICAgLy8gICAgY2hhcmFjdGVyLCBpZ25vcmUgdGhlIGNvb2tpZS1hdi5cbiAgICBpZiAoIS9eXFxkKyQvLnRlc3QoYXR0cmlidXRlVmFsdWUpKSB7XG4gICAgICByZXR1cm4gcGFyc2VVbnBhcnNlZEF0dHJpYnV0ZXModW5wYXJzZWRBdHRyaWJ1dGVzLCBjb29raWVBdHRyaWJ1dGVMaXN0KVxuICAgIH1cblxuICAgIC8vIDMuIExldCBkZWx0YS1zZWNvbmRzIGJlIHRoZSBhdHRyaWJ1dGUtdmFsdWUgY29udmVydGVkIHRvIGFuIGludGVnZXIuXG4gICAgY29uc3QgZGVsdGFTZWNvbmRzID0gTnVtYmVyKGF0dHJpYnV0ZVZhbHVlKVxuXG4gICAgLy8gNC4gTGV0IGNvb2tpZS1hZ2UtbGltaXQgYmUgdGhlIG1heGltdW0gYWdlIG9mIHRoZSBjb29raWUgKHdoaWNoXG4gICAgLy8gICAgU0hPVUxEIGJlIDQwMCBkYXlzIG9yIGxlc3MsIHNlZSBTZWN0aW9uIDQuMS4yLjIpLlxuXG4gICAgLy8gNS4gU2V0IGRlbHRhLXNlY29uZHMgdG8gdGhlIHNtYWxsZXIgb2YgaXRzIHByZXNlbnQgdmFsdWUgYW5kIGNvb2tpZS1cbiAgICAvLyAgICBhZ2UtbGltaXQuXG4gICAgLy8gZGVsdGFTZWNvbmRzID0gTWF0aC5taW4oZGVsdGFTZWNvbmRzICogMTAwMCwgbWF4RXhwaXJlc01zKVxuXG4gICAgLy8gNi4gSWYgZGVsdGEtc2Vjb25kcyBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVybyAoMCksIGxldCBleHBpcnktXG4gICAgLy8gICAgdGltZSBiZSB0aGUgZWFybGllc3QgcmVwcmVzZW50YWJsZSBkYXRlIGFuZCB0aW1lLiAgT3RoZXJ3aXNlLCBsZXRcbiAgICAvLyAgICB0aGUgZXhwaXJ5LXRpbWUgYmUgdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBwbHVzIGRlbHRhLXNlY29uZHNcbiAgICAvLyAgICBzZWNvbmRzLlxuICAgIC8vIGNvbnN0IGV4cGlyeVRpbWUgPSBkZWx0YVNlY29uZHMgPD0gMCA/IERhdGUubm93KCkgOiBEYXRlLm5vdygpICsgZGVsdGFTZWNvbmRzXG5cbiAgICAvLyA3LiBBcHBlbmQgYW4gYXR0cmlidXRlIHRvIHRoZSBjb29raWUtYXR0cmlidXRlLWxpc3Qgd2l0aCBhblxuICAgIC8vICAgIGF0dHJpYnV0ZS1uYW1lIG9mIE1heC1BZ2UgYW5kIGFuIGF0dHJpYnV0ZS12YWx1ZSBvZiBleHBpcnktdGltZS5cbiAgICBjb29raWVBdHRyaWJ1dGVMaXN0Lm1heEFnZSA9IGRlbHRhU2Vjb25kc1xuICB9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWVMb3dlcmNhc2UgPT09ICdkb21haW4nKSB7XG4gICAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9kcmFmdC1pZXRmLWh0dHBiaXMtcmZjNjI2NWJpcyNzZWN0aW9uLTUuNC4zXG4gICAgLy8gSWYgdGhlIGF0dHJpYnV0ZS1uYW1lIGNhc2UtaW5zZW5zaXRpdmVseSBtYXRjaGVzIHRoZSBzdHJpbmcgXCJEb21haW5cIixcbiAgICAvLyB0aGUgdXNlciBhZ2VudCBNVVNUIHByb2Nlc3MgdGhlIGNvb2tpZS1hdiBhcyBmb2xsb3dzLlxuXG4gICAgLy8gMS4gTGV0IGNvb2tpZS1kb21haW4gYmUgdGhlIGF0dHJpYnV0ZS12YWx1ZS5cbiAgICBsZXQgY29va2llRG9tYWluID0gYXR0cmlidXRlVmFsdWVcblxuICAgIC8vIDIuIElmIGNvb2tpZS1kb21haW4gc3RhcnRzIHdpdGggJXgyRSAoXCIuXCIpLCBsZXQgY29va2llLWRvbWFpbiBiZVxuICAgIC8vICAgIGNvb2tpZS1kb21haW4gd2l0aG91dCBpdHMgbGVhZGluZyAleDJFIChcIi5cIikuXG4gICAgaWYgKGNvb2tpZURvbWFpblswXSA9PT0gJy4nKSB7XG4gICAgICBjb29raWVEb21haW4gPSBjb29raWVEb21haW4uc2xpY2UoMSlcbiAgICB9XG5cbiAgICAvLyAzLiBDb252ZXJ0IHRoZSBjb29raWUtZG9tYWluIHRvIGxvd2VyIGNhc2UuXG4gICAgY29va2llRG9tYWluID0gY29va2llRG9tYWluLnRvTG93ZXJDYXNlKClcblxuICAgIC8vIDQuIEFwcGVuZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIGNvb2tpZS1hdHRyaWJ1dGUtbGlzdCB3aXRoIGFuXG4gICAgLy8gICAgYXR0cmlidXRlLW5hbWUgb2YgRG9tYWluIGFuZCBhbiBhdHRyaWJ1dGUtdmFsdWUgb2YgY29va2llLWRvbWFpbi5cbiAgICBjb29raWVBdHRyaWJ1dGVMaXN0LmRvbWFpbiA9IGNvb2tpZURvbWFpblxuICB9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWVMb3dlcmNhc2UgPT09ICdwYXRoJykge1xuICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtaWV0Zi1odHRwYmlzLXJmYzYyNjViaXMjc2VjdGlvbi01LjQuNFxuICAgIC8vIElmIHRoZSBhdHRyaWJ1dGUtbmFtZSBjYXNlLWluc2Vuc2l0aXZlbHkgbWF0Y2hlcyB0aGUgc3RyaW5nIFwiUGF0aFwiLFxuICAgIC8vIHRoZSB1c2VyIGFnZW50IE1VU1QgcHJvY2VzcyB0aGUgY29va2llLWF2IGFzIGZvbGxvd3MuXG5cbiAgICAvLyAxLiBJZiB0aGUgYXR0cmlidXRlLXZhbHVlIGlzIGVtcHR5IG9yIGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlXG4gICAgLy8gICAgYXR0cmlidXRlLXZhbHVlIGlzIG5vdCAleDJGIChcIi9cIik6XG4gICAgbGV0IGNvb2tpZVBhdGggPSAnJ1xuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZS5sZW5ndGggPT09IDAgfHwgYXR0cmlidXRlVmFsdWVbMF0gIT09ICcvJykge1xuICAgICAgLy8gMS4gTGV0IGNvb2tpZS1wYXRoIGJlIHRoZSBkZWZhdWx0LXBhdGguXG4gICAgICBjb29raWVQYXRoID0gJy8nXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE90aGVyd2lzZTpcblxuICAgICAgLy8gMS4gTGV0IGNvb2tpZS1wYXRoIGJlIHRoZSBhdHRyaWJ1dGUtdmFsdWUuXG4gICAgICBjb29raWVQYXRoID0gYXR0cmlidXRlVmFsdWVcbiAgICB9XG5cbiAgICAvLyAyLiBBcHBlbmQgYW4gYXR0cmlidXRlIHRvIHRoZSBjb29raWUtYXR0cmlidXRlLWxpc3Qgd2l0aCBhblxuICAgIC8vICAgIGF0dHJpYnV0ZS1uYW1lIG9mIFBhdGggYW5kIGFuIGF0dHJpYnV0ZS12YWx1ZSBvZiBjb29raWUtcGF0aC5cbiAgICBjb29raWVBdHRyaWJ1dGVMaXN0LnBhdGggPSBjb29raWVQYXRoXG4gIH0gZWxzZSBpZiAoYXR0cmlidXRlTmFtZUxvd2VyY2FzZSA9PT0gJ3NlY3VyZScpIHtcbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1yZmM2MjY1YmlzI3NlY3Rpb24tNS40LjVcbiAgICAvLyBJZiB0aGUgYXR0cmlidXRlLW5hbWUgY2FzZS1pbnNlbnNpdGl2ZWx5IG1hdGNoZXMgdGhlIHN0cmluZyBcIlNlY3VyZVwiLFxuICAgIC8vIHRoZSB1c2VyIGFnZW50IE1VU1QgYXBwZW5kIGFuIGF0dHJpYnV0ZSB0byB0aGUgY29va2llLWF0dHJpYnV0ZS1saXN0XG4gICAgLy8gd2l0aCBhbiBhdHRyaWJ1dGUtbmFtZSBvZiBTZWN1cmUgYW5kIGFuIGVtcHR5IGF0dHJpYnV0ZS12YWx1ZS5cblxuICAgIGNvb2tpZUF0dHJpYnV0ZUxpc3Quc2VjdXJlID0gdHJ1ZVxuICB9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWVMb3dlcmNhc2UgPT09ICdodHRwb25seScpIHtcbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1yZmM2MjY1YmlzI3NlY3Rpb24tNS40LjZcbiAgICAvLyBJZiB0aGUgYXR0cmlidXRlLW5hbWUgY2FzZS1pbnNlbnNpdGl2ZWx5IG1hdGNoZXMgdGhlIHN0cmluZ1xuICAgIC8vIFwiSHR0cE9ubHlcIiwgdGhlIHVzZXIgYWdlbnQgTVVTVCBhcHBlbmQgYW4gYXR0cmlidXRlIHRvIHRoZSBjb29raWUtXG4gICAgLy8gYXR0cmlidXRlLWxpc3Qgd2l0aCBhbiBhdHRyaWJ1dGUtbmFtZSBvZiBIdHRwT25seSBhbmQgYW4gZW1wdHlcbiAgICAvLyBhdHRyaWJ1dGUtdmFsdWUuXG5cbiAgICBjb29raWVBdHRyaWJ1dGVMaXN0Lmh0dHBPbmx5ID0gdHJ1ZVxuICB9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWVMb3dlcmNhc2UgPT09ICdzYW1lc2l0ZScpIHtcbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1yZmM2MjY1YmlzI3NlY3Rpb24tNS40LjdcbiAgICAvLyBJZiB0aGUgYXR0cmlidXRlLW5hbWUgY2FzZS1pbnNlbnNpdGl2ZWx5IG1hdGNoZXMgdGhlIHN0cmluZ1xuICAgIC8vIFwiU2FtZVNpdGVcIiwgdGhlIHVzZXIgYWdlbnQgTVVTVCBwcm9jZXNzIHRoZSBjb29raWUtYXYgYXMgZm9sbG93czpcblxuICAgIC8vIDEuIExldCBlbmZvcmNlbWVudCBiZSBcIkRlZmF1bHRcIi5cbiAgICBsZXQgZW5mb3JjZW1lbnQgPSAnRGVmYXVsdCdcblxuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlTG93ZXJjYXNlID0gYXR0cmlidXRlVmFsdWUudG9Mb3dlckNhc2UoKVxuICAgIC8vIDIuIElmIGNvb2tpZS1hdidzIGF0dHJpYnV0ZS12YWx1ZSBpcyBhIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2ggZm9yXG4gICAgLy8gICAgXCJOb25lXCIsIHNldCBlbmZvcmNlbWVudCB0byBcIk5vbmVcIi5cbiAgICBpZiAoYXR0cmlidXRlVmFsdWVMb3dlcmNhc2UuaW5jbHVkZXMoJ25vbmUnKSkge1xuICAgICAgZW5mb3JjZW1lbnQgPSAnTm9uZSdcbiAgICB9XG5cbiAgICAvLyAzLiBJZiBjb29raWUtYXYncyBhdHRyaWJ1dGUtdmFsdWUgaXMgYSBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoIGZvclxuICAgIC8vICAgIFwiU3RyaWN0XCIsIHNldCBlbmZvcmNlbWVudCB0byBcIlN0cmljdFwiLlxuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZUxvd2VyY2FzZS5pbmNsdWRlcygnc3RyaWN0JykpIHtcbiAgICAgIGVuZm9yY2VtZW50ID0gJ1N0cmljdCdcbiAgICB9XG5cbiAgICAvLyA0LiBJZiBjb29raWUtYXYncyBhdHRyaWJ1dGUtdmFsdWUgaXMgYSBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoIGZvclxuICAgIC8vICAgIFwiTGF4XCIsIHNldCBlbmZvcmNlbWVudCB0byBcIkxheFwiLlxuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZUxvd2VyY2FzZS5pbmNsdWRlcygnbGF4JykpIHtcbiAgICAgIGVuZm9yY2VtZW50ID0gJ0xheCdcbiAgICB9XG5cbiAgICAvLyA1LiBBcHBlbmQgYW4gYXR0cmlidXRlIHRvIHRoZSBjb29raWUtYXR0cmlidXRlLWxpc3Qgd2l0aCBhblxuICAgIC8vICAgIGF0dHJpYnV0ZS1uYW1lIG9mIFwiU2FtZVNpdGVcIiBhbmQgYW4gYXR0cmlidXRlLXZhbHVlIG9mXG4gICAgLy8gICAgZW5mb3JjZW1lbnQuXG4gICAgY29va2llQXR0cmlidXRlTGlzdC5zYW1lU2l0ZSA9IGVuZm9yY2VtZW50XG4gIH0gZWxzZSB7XG4gICAgY29va2llQXR0cmlidXRlTGlzdC51bnBhcnNlZCA/Pz0gW11cblxuICAgIGNvb2tpZUF0dHJpYnV0ZUxpc3QudW5wYXJzZWQucHVzaChgJHthdHRyaWJ1dGVOYW1lfT0ke2F0dHJpYnV0ZVZhbHVlfWApXG4gIH1cblxuICAvLyA4LiBSZXR1cm4gdG8gU3RlcCAxIG9mIHRoaXMgYWxnb3JpdGhtLlxuICByZXR1cm4gcGFyc2VVbnBhcnNlZEF0dHJpYnV0ZXModW5wYXJzZWRBdHRyaWJ1dGVzLCBjb29raWVBdHRyaWJ1dGVMaXN0KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcGFyc2VTZXRDb29raWUsXG4gIHBhcnNlVW5wYXJzZWRBdHRyaWJ1dGVzXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBwYXJzZVNldENvb2tpZSB9ID0gcmVxdWlyZSgnLi9wYXJzZScpXG5jb25zdCB7IHN0cmluZ2lmeSB9ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHsgd2ViaWRsIH0gPSByZXF1aXJlKCcuLi9mZXRjaC93ZWJpZGwnKVxuY29uc3QgeyBIZWFkZXJzIH0gPSByZXF1aXJlKCcuLi9mZXRjaC9oZWFkZXJzJylcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDb29raWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmFsdWVcbiAqIEBwcm9wZXJ0eSB7RGF0ZXxudW1iZXJ8dW5kZWZpbmVkfSBleHBpcmVzXG4gKiBAcHJvcGVydHkge251bWJlcnx1bmRlZmluZWR9IG1heEFnZVxuICogQHByb3BlcnR5IHtzdHJpbmd8dW5kZWZpbmVkfSBkb21haW5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfHVuZGVmaW5lZH0gcGF0aFxuICogQHByb3BlcnR5IHtib29sZWFufHVuZGVmaW5lZH0gc2VjdXJlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW58dW5kZWZpbmVkfSBodHRwT25seVxuICogQHByb3BlcnR5IHsnU3RyaWN0J3wnTGF4J3wnTm9uZSd9IHNhbWVTaXRlXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSB1bnBhcnNlZFxuICovXG5cbi8qKlxuICogQHBhcmFtIHtIZWFkZXJzfSBoZWFkZXJzXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn1cbiAqL1xuZnVuY3Rpb24gZ2V0Q29va2llcyAoaGVhZGVycykge1xuICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsICdnZXRDb29raWVzJylcblxuICB3ZWJpZGwuYnJhbmRDaGVjayhoZWFkZXJzLCBIZWFkZXJzLCB7IHN0cmljdDogZmFsc2UgfSlcblxuICBjb25zdCBjb29raWUgPSBoZWFkZXJzLmdldCgnY29va2llJylcbiAgY29uc3Qgb3V0ID0ge31cblxuICBpZiAoIWNvb2tpZSkge1xuICAgIHJldHVybiBvdXRcbiAgfVxuXG4gIGZvciAoY29uc3QgcGllY2Ugb2YgY29va2llLnNwbGl0KCc7JykpIHtcbiAgICBjb25zdCBbbmFtZSwgLi4udmFsdWVdID0gcGllY2Uuc3BsaXQoJz0nKVxuXG4gICAgb3V0W25hbWUudHJpbSgpXSA9IHZhbHVlLmpvaW4oJz0nKVxuICB9XG5cbiAgcmV0dXJuIG91dFxufVxuXG4vKipcbiAqIEBwYXJhbSB7SGVhZGVyc30gaGVhZGVyc1xuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7eyBwYXRoPzogc3RyaW5nLCBkb21haW4/OiBzdHJpbmcgfXx1bmRlZmluZWR9IGF0dHJpYnV0ZXNcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBkZWxldGVDb29raWUgKGhlYWRlcnMsIG5hbWUsIGF0dHJpYnV0ZXMpIHtcbiAgd2ViaWRsLmJyYW5kQ2hlY2soaGVhZGVycywgSGVhZGVycywgeyBzdHJpY3Q6IGZhbHNlIH0pXG5cbiAgY29uc3QgcHJlZml4ID0gJ2RlbGV0ZUNvb2tpZSdcbiAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAyLCBwcmVmaXgpXG5cbiAgbmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyhuYW1lLCBwcmVmaXgsICduYW1lJylcbiAgYXR0cmlidXRlcyA9IHdlYmlkbC5jb252ZXJ0ZXJzLkRlbGV0ZUNvb2tpZUF0dHJpYnV0ZXMoYXR0cmlidXRlcylcblxuICAvLyBNYXRjaGVzIGJlaGF2aW9yIG9mXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kZW5vbGFuZC9kZW5vX3N0ZC9ibG9iLzYzODI3YjE2MzMwYjgyNDg5YTA0NjE0MDI3YzMzYjc5MDRlMDhiZTUvaHR0cC9jb29raWUudHMjTDI3OFxuICBzZXRDb29raWUoaGVhZGVycywge1xuICAgIG5hbWUsXG4gICAgdmFsdWU6ICcnLFxuICAgIGV4cGlyZXM6IG5ldyBEYXRlKDApLFxuICAgIC4uLmF0dHJpYnV0ZXNcbiAgfSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0hlYWRlcnN9IGhlYWRlcnNcbiAqIEByZXR1cm5zIHtDb29raWVbXX1cbiAqL1xuZnVuY3Rpb24gZ2V0U2V0Q29va2llcyAoaGVhZGVycykge1xuICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsICdnZXRTZXRDb29raWVzJylcblxuICB3ZWJpZGwuYnJhbmRDaGVjayhoZWFkZXJzLCBIZWFkZXJzLCB7IHN0cmljdDogZmFsc2UgfSlcblxuICBjb25zdCBjb29raWVzID0gaGVhZGVycy5nZXRTZXRDb29raWUoKVxuXG4gIGlmICghY29va2llcykge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgcmV0dXJuIGNvb2tpZXMubWFwKChwYWlyKSA9PiBwYXJzZVNldENvb2tpZShwYWlyKSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0hlYWRlcnN9IGhlYWRlcnNcbiAqIEBwYXJhbSB7Q29va2llfSBjb29raWVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBzZXRDb29raWUgKGhlYWRlcnMsIGNvb2tpZSkge1xuICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDIsICdzZXRDb29raWUnKVxuXG4gIHdlYmlkbC5icmFuZENoZWNrKGhlYWRlcnMsIEhlYWRlcnMsIHsgc3RyaWN0OiBmYWxzZSB9KVxuXG4gIGNvb2tpZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkNvb2tpZShjb29raWUpXG5cbiAgY29uc3Qgc3RyID0gc3RyaW5naWZ5KGNvb2tpZSlcblxuICBpZiAoc3RyKSB7XG4gICAgaGVhZGVycy5hcHBlbmQoJ1NldC1Db29raWUnLCBzdHIpXG4gIH1cbn1cblxud2ViaWRsLmNvbnZlcnRlcnMuRGVsZXRlQ29va2llQXR0cmlidXRlcyA9IHdlYmlkbC5kaWN0aW9uYXJ5Q29udmVydGVyKFtcbiAge1xuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyksXG4gICAga2V5OiAncGF0aCcsXG4gICAgZGVmYXVsdFZhbHVlOiAoKSA9PiBudWxsXG4gIH0sXG4gIHtcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5udWxsYWJsZUNvbnZlcnRlcih3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcpLFxuICAgIGtleTogJ2RvbWFpbicsXG4gICAgZGVmYXVsdFZhbHVlOiAoKSA9PiBudWxsXG4gIH1cbl0pXG5cbndlYmlkbC5jb252ZXJ0ZXJzLkNvb2tpZSA9IHdlYmlkbC5kaWN0aW9uYXJ5Q29udmVydGVyKFtcbiAge1xuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nLFxuICAgIGtleTogJ25hbWUnXG4gIH0sXG4gIHtcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyxcbiAgICBrZXk6ICd2YWx1ZSdcbiAgfSxcbiAge1xuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKCh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzWyd1bnNpZ25lZCBsb25nIGxvbmcnXSh2YWx1ZSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlKVxuICAgIH0pLFxuICAgIGtleTogJ2V4cGlyZXMnLFxuICAgIGRlZmF1bHRWYWx1ZTogKCkgPT4gbnVsbFxuICB9LFxuICB7XG4gICAgY29udmVydGVyOiB3ZWJpZGwubnVsbGFibGVDb252ZXJ0ZXIod2ViaWRsLmNvbnZlcnRlcnNbJ2xvbmcgbG9uZyddKSxcbiAgICBrZXk6ICdtYXhBZ2UnLFxuICAgIGRlZmF1bHRWYWx1ZTogKCkgPT4gbnVsbFxuICB9LFxuICB7XG4gICAgY29udmVydGVyOiB3ZWJpZGwubnVsbGFibGVDb252ZXJ0ZXIod2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKSxcbiAgICBrZXk6ICdkb21haW4nLFxuICAgIGRlZmF1bHRWYWx1ZTogKCkgPT4gbnVsbFxuICB9LFxuICB7XG4gICAgY29udmVydGVyOiB3ZWJpZGwubnVsbGFibGVDb252ZXJ0ZXIod2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKSxcbiAgICBrZXk6ICdwYXRoJyxcbiAgICBkZWZhdWx0VmFsdWU6ICgpID0+IG51bGxcbiAgfSxcbiAge1xuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4pLFxuICAgIGtleTogJ3NlY3VyZScsXG4gICAgZGVmYXVsdFZhbHVlOiAoKSA9PiBudWxsXG4gIH0sXG4gIHtcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5udWxsYWJsZUNvbnZlcnRlcih3ZWJpZGwuY29udmVydGVycy5ib29sZWFuKSxcbiAgICBrZXk6ICdodHRwT25seScsXG4gICAgZGVmYXVsdFZhbHVlOiAoKSA9PiBudWxsXG4gIH0sXG4gIHtcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyxcbiAgICBrZXk6ICdzYW1lU2l0ZScsXG4gICAgYWxsb3dlZFZhbHVlczogWydTdHJpY3QnLCAnTGF4JywgJ05vbmUnXVxuICB9LFxuICB7XG4gICAgY29udmVydGVyOiB3ZWJpZGwuc2VxdWVuY2VDb252ZXJ0ZXIod2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKSxcbiAgICBrZXk6ICd1bnBhcnNlZCcsXG4gICAgZGVmYXVsdFZhbHVlOiAoKSA9PiBuZXcgQXJyYXkoMClcbiAgfVxuXSlcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvb2tpZXMsXG4gIGRlbGV0ZUNvb2tpZSxcbiAgZ2V0U2V0Q29va2llcyxcbiAgc2V0Q29va2llXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3dlYmlkbCcpXG5jb25zdCB7IGtFbnVtZXJhYmxlUHJvcGVydHkgfSA9IHJlcXVpcmUoJy4uLy4uL2NvcmUvdXRpbCcpXG5jb25zdCB7IGtDb25zdHJ1Y3QgfSA9IHJlcXVpcmUoJy4uLy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCB7IE1lc3NhZ2VQb3J0IH0gPSByZXF1aXJlKCdub2RlOndvcmtlcl90aHJlYWRzJylcblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2NvbW1zLmh0bWwjbWVzc2FnZWV2ZW50XG4gKi9cbmNsYXNzIE1lc3NhZ2VFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgI2V2ZW50SW5pdFxuXG4gIGNvbnN0cnVjdG9yICh0eXBlLCBldmVudEluaXREaWN0ID0ge30pIHtcbiAgICBpZiAodHlwZSA9PT0ga0NvbnN0cnVjdCkge1xuICAgICAgc3VwZXIoYXJndW1lbnRzWzFdLCBhcmd1bWVudHNbMl0pXG4gICAgICB3ZWJpZGwudXRpbC5tYXJrQXNVbmNsb25lYWJsZSh0aGlzKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcHJlZml4ID0gJ01lc3NhZ2VFdmVudCBjb25zdHJ1Y3RvcidcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHByZWZpeClcblxuICAgIHR5cGUgPSB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcodHlwZSwgcHJlZml4LCAndHlwZScpXG4gICAgZXZlbnRJbml0RGljdCA9IHdlYmlkbC5jb252ZXJ0ZXJzLk1lc3NhZ2VFdmVudEluaXQoZXZlbnRJbml0RGljdCwgcHJlZml4LCAnZXZlbnRJbml0RGljdCcpXG5cbiAgICBzdXBlcih0eXBlLCBldmVudEluaXREaWN0KVxuXG4gICAgdGhpcy4jZXZlbnRJbml0ID0gZXZlbnRJbml0RGljdFxuICAgIHdlYmlkbC51dGlsLm1hcmtBc1VuY2xvbmVhYmxlKHRoaXMpXG4gIH1cblxuICBnZXQgZGF0YSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgTWVzc2FnZUV2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5kYXRhXG4gIH1cblxuICBnZXQgb3JpZ2luICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBNZXNzYWdlRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRJbml0Lm9yaWdpblxuICB9XG5cbiAgZ2V0IGxhc3RFdmVudElkICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBNZXNzYWdlRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRJbml0Lmxhc3RFdmVudElkXG4gIH1cblxuICBnZXQgc291cmNlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBNZXNzYWdlRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRJbml0LnNvdXJjZVxuICB9XG5cbiAgZ2V0IHBvcnRzICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBNZXNzYWdlRXZlbnQpXG5cbiAgICBpZiAoIU9iamVjdC5pc0Zyb3plbih0aGlzLiNldmVudEluaXQucG9ydHMpKSB7XG4gICAgICBPYmplY3QuZnJlZXplKHRoaXMuI2V2ZW50SW5pdC5wb3J0cylcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRJbml0LnBvcnRzXG4gIH1cblxuICBpbml0TWVzc2FnZUV2ZW50IChcbiAgICB0eXBlLFxuICAgIGJ1YmJsZXMgPSBmYWxzZSxcbiAgICBjYW5jZWxhYmxlID0gZmFsc2UsXG4gICAgZGF0YSA9IG51bGwsXG4gICAgb3JpZ2luID0gJycsXG4gICAgbGFzdEV2ZW50SWQgPSAnJyxcbiAgICBzb3VyY2UgPSBudWxsLFxuICAgIHBvcnRzID0gW11cbiAgKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgTWVzc2FnZUV2ZW50KVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCAnTWVzc2FnZUV2ZW50LmluaXRNZXNzYWdlRXZlbnQnKVxuXG4gICAgcmV0dXJuIG5ldyBNZXNzYWdlRXZlbnQodHlwZSwge1xuICAgICAgYnViYmxlcywgY2FuY2VsYWJsZSwgZGF0YSwgb3JpZ2luLCBsYXN0RXZlbnRJZCwgc291cmNlLCBwb3J0c1xuICAgIH0pXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRmFzdE1lc3NhZ2VFdmVudCAodHlwZSwgaW5pdCkge1xuICAgIGNvbnN0IG1lc3NhZ2VFdmVudCA9IG5ldyBNZXNzYWdlRXZlbnQoa0NvbnN0cnVjdCwgdHlwZSwgaW5pdClcbiAgICBtZXNzYWdlRXZlbnQuI2V2ZW50SW5pdCA9IGluaXRcbiAgICBtZXNzYWdlRXZlbnQuI2V2ZW50SW5pdC5kYXRhID8/PSBudWxsXG4gICAgbWVzc2FnZUV2ZW50LiNldmVudEluaXQub3JpZ2luID8/PSAnJ1xuICAgIG1lc3NhZ2VFdmVudC4jZXZlbnRJbml0Lmxhc3RFdmVudElkID8/PSAnJ1xuICAgIG1lc3NhZ2VFdmVudC4jZXZlbnRJbml0LnNvdXJjZSA/Pz0gbnVsbFxuICAgIG1lc3NhZ2VFdmVudC4jZXZlbnRJbml0LnBvcnRzID8/PSBbXVxuICAgIHJldHVybiBtZXNzYWdlRXZlbnRcbiAgfVxufVxuXG5jb25zdCB7IGNyZWF0ZUZhc3RNZXNzYWdlRXZlbnQgfSA9IE1lc3NhZ2VFdmVudFxuZGVsZXRlIE1lc3NhZ2VFdmVudC5jcmVhdGVGYXN0TWVzc2FnZUV2ZW50XG5cbi8qKlxuICogQHNlZSBodHRwczovL3dlYnNvY2tldHMuc3BlYy53aGF0d2cub3JnLyN0aGUtY2xvc2VldmVudC1pbnRlcmZhY2VcbiAqL1xuY2xhc3MgQ2xvc2VFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgI2V2ZW50SW5pdFxuXG4gIGNvbnN0cnVjdG9yICh0eXBlLCBldmVudEluaXREaWN0ID0ge30pIHtcbiAgICBjb25zdCBwcmVmaXggPSAnQ2xvc2VFdmVudCBjb25zdHJ1Y3RvcidcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHByZWZpeClcblxuICAgIHR5cGUgPSB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcodHlwZSwgcHJlZml4LCAndHlwZScpXG4gICAgZXZlbnRJbml0RGljdCA9IHdlYmlkbC5jb252ZXJ0ZXJzLkNsb3NlRXZlbnRJbml0KGV2ZW50SW5pdERpY3QpXG5cbiAgICBzdXBlcih0eXBlLCBldmVudEluaXREaWN0KVxuXG4gICAgdGhpcy4jZXZlbnRJbml0ID0gZXZlbnRJbml0RGljdFxuICAgIHdlYmlkbC51dGlsLm1hcmtBc1VuY2xvbmVhYmxlKHRoaXMpXG4gIH1cblxuICBnZXQgd2FzQ2xlYW4gKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIENsb3NlRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRJbml0Lndhc0NsZWFuXG4gIH1cblxuICBnZXQgY29kZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2xvc2VFdmVudClcblxuICAgIHJldHVybiB0aGlzLiNldmVudEluaXQuY29kZVxuICB9XG5cbiAgZ2V0IHJlYXNvbiAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2xvc2VFdmVudClcblxuICAgIHJldHVybiB0aGlzLiNldmVudEluaXQucmVhc29uXG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvd2ViYXBwYXBpcy5odG1sI3RoZS1lcnJvcmV2ZW50LWludGVyZmFjZVxuY2xhc3MgRXJyb3JFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgI2V2ZW50SW5pdFxuXG4gIGNvbnN0cnVjdG9yICh0eXBlLCBldmVudEluaXREaWN0KSB7XG4gICAgY29uc3QgcHJlZml4ID0gJ0Vycm9yRXZlbnQgY29uc3RydWN0b3InXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCBwcmVmaXgpXG5cbiAgICBzdXBlcih0eXBlLCBldmVudEluaXREaWN0KVxuICAgIHdlYmlkbC51dGlsLm1hcmtBc1VuY2xvbmVhYmxlKHRoaXMpXG5cbiAgICB0eXBlID0gd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKHR5cGUsIHByZWZpeCwgJ3R5cGUnKVxuICAgIGV2ZW50SW5pdERpY3QgPSB3ZWJpZGwuY29udmVydGVycy5FcnJvckV2ZW50SW5pdChldmVudEluaXREaWN0ID8/IHt9KVxuXG4gICAgdGhpcy4jZXZlbnRJbml0ID0gZXZlbnRJbml0RGljdFxuICB9XG5cbiAgZ2V0IG1lc3NhZ2UgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEVycm9yRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRJbml0Lm1lc3NhZ2VcbiAgfVxuXG4gIGdldCBmaWxlbmFtZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRXJyb3JFdmVudClcblxuICAgIHJldHVybiB0aGlzLiNldmVudEluaXQuZmlsZW5hbWVcbiAgfVxuXG4gIGdldCBsaW5lbm8gKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEVycm9yRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRJbml0LmxpbmVub1xuICB9XG5cbiAgZ2V0IGNvbG5vICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBFcnJvckV2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5jb2xub1xuICB9XG5cbiAgZ2V0IGVycm9yICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBFcnJvckV2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5lcnJvclxuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE1lc3NhZ2VFdmVudC5wcm90b3R5cGUsIHtcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHtcbiAgICB2YWx1ZTogJ01lc3NhZ2VFdmVudCcsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0sXG4gIGRhdGE6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIG9yaWdpbjoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgbGFzdEV2ZW50SWQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHNvdXJjZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgcG9ydHM6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGluaXRNZXNzYWdlRXZlbnQ6IGtFbnVtZXJhYmxlUHJvcGVydHlcbn0pXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKENsb3NlRXZlbnQucHJvdG90eXBlLCB7XG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7XG4gICAgdmFsdWU6ICdDbG9zZUV2ZW50JyxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSxcbiAgcmVhc29uOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBjb2RlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICB3YXNDbGVhbjoga0VudW1lcmFibGVQcm9wZXJ0eVxufSlcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRXJyb3JFdmVudC5wcm90b3R5cGUsIHtcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHtcbiAgICB2YWx1ZTogJ0Vycm9yRXZlbnQnLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9LFxuICBtZXNzYWdlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBmaWxlbmFtZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgbGluZW5vOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBjb2xubzoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgZXJyb3I6IGtFbnVtZXJhYmxlUHJvcGVydHlcbn0pXG5cbndlYmlkbC5jb252ZXJ0ZXJzLk1lc3NhZ2VQb3J0ID0gd2ViaWRsLmludGVyZmFjZUNvbnZlcnRlcihNZXNzYWdlUG9ydClcblxud2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPE1lc3NhZ2VQb3J0PiddID0gd2ViaWRsLnNlcXVlbmNlQ29udmVydGVyKFxuICB3ZWJpZGwuY29udmVydGVycy5NZXNzYWdlUG9ydFxuKVxuXG5jb25zdCBldmVudEluaXQgPSBbXG4gIHtcbiAgICBrZXk6ICdidWJibGVzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4sXG4gICAgZGVmYXVsdFZhbHVlOiAoKSA9PiBmYWxzZVxuICB9LFxuICB7XG4gICAga2V5OiAnY2FuY2VsYWJsZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ib29sZWFuLFxuICAgIGRlZmF1bHRWYWx1ZTogKCkgPT4gZmFsc2VcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbXBvc2VkJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4sXG4gICAgZGVmYXVsdFZhbHVlOiAoKSA9PiBmYWxzZVxuICB9XG5dXG5cbndlYmlkbC5jb252ZXJ0ZXJzLk1lc3NhZ2VFdmVudEluaXQgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIC4uLmV2ZW50SW5pdCxcbiAge1xuICAgIGtleTogJ2RhdGEnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYW55LFxuICAgIGRlZmF1bHRWYWx1ZTogKCkgPT4gbnVsbFxuICB9LFxuICB7XG4gICAga2V5OiAnb3JpZ2luJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6ICgpID0+ICcnXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdsYXN0RXZlbnRJZCcsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiAoKSA9PiAnJ1xuICB9LFxuICB7XG4gICAga2V5OiAnc291cmNlJyxcbiAgICAvLyBOb2RlIGRvZXNuJ3QgaW1wbGVtZW50IFdpbmRvd1Byb3h5IG9yIFNlcnZpY2VXb3JrZXIsIHNvIHRoZSBvbmx5XG4gICAgLy8gdmFsaWQgdmFsdWUgZm9yIHNvdXJjZSBpcyBhIE1lc3NhZ2VQb3J0LlxuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKHdlYmlkbC5jb252ZXJ0ZXJzLk1lc3NhZ2VQb3J0KSxcbiAgICBkZWZhdWx0VmFsdWU6ICgpID0+IG51bGxcbiAgfSxcbiAge1xuICAgIGtleTogJ3BvcnRzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzWydzZXF1ZW5jZTxNZXNzYWdlUG9ydD4nXSxcbiAgICBkZWZhdWx0VmFsdWU6ICgpID0+IG5ldyBBcnJheSgwKVxuICB9XG5dKVxuXG53ZWJpZGwuY29udmVydGVycy5DbG9zZUV2ZW50SW5pdCA9IHdlYmlkbC5kaWN0aW9uYXJ5Q29udmVydGVyKFtcbiAgLi4uZXZlbnRJbml0LFxuICB7XG4gICAga2V5OiAnd2FzQ2xlYW4nLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYm9vbGVhbixcbiAgICBkZWZhdWx0VmFsdWU6ICgpID0+IGZhbHNlXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdjb2RlJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzWyd1bnNpZ25lZCBzaG9ydCddLFxuICAgIGRlZmF1bHRWYWx1ZTogKCkgPT4gMFxuICB9LFxuICB7XG4gICAga2V5OiAncmVhc29uJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6ICgpID0+ICcnXG4gIH1cbl0pXG5cbndlYmlkbC5jb252ZXJ0ZXJzLkVycm9yRXZlbnRJbml0ID0gd2ViaWRsLmRpY3Rpb25hcnlDb252ZXJ0ZXIoW1xuICAuLi5ldmVudEluaXQsXG4gIHtcbiAgICBrZXk6ICdtZXNzYWdlJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6ICgpID0+ICcnXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdmaWxlbmFtZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiAoKSA9PiAnJ1xuICB9LFxuICB7XG4gICAga2V5OiAnbGluZW5vJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzWyd1bnNpZ25lZCBsb25nJ10sXG4gICAgZGVmYXVsdFZhbHVlOiAoKSA9PiAwXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdjb2xubycsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVyc1sndW5zaWduZWQgbG9uZyddLFxuICAgIGRlZmF1bHRWYWx1ZTogKCkgPT4gMFxuICB9LFxuICB7XG4gICAga2V5OiAnZXJyb3InLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYW55XG4gIH1cbl0pXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBNZXNzYWdlRXZlbnQsXG4gIENsb3NlRXZlbnQsXG4gIEVycm9yRXZlbnQsXG4gIGNyZWF0ZUZhc3RNZXNzYWdlRXZlbnRcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG4vLyBUaGlzIGlzIGEgR2xvYmFsbHkgVW5pcXVlIElkZW50aWZpZXIgdW5pcXVlIHVzZWRcbi8vIHRvIHZhbGlkYXRlIHRoYXQgdGhlIGVuZHBvaW50IGFjY2VwdHMgd2Vic29ja2V0XG4vLyBjb25uZWN0aW9ucy5cbi8vIFNlZSBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNjQ1NS5odG1sI3NlY3Rpb24tMS4zXG5jb25zdCB1aWQgPSAnMjU4RUFGQTUtRTkxNC00N0RBLTk1Q0EtQzVBQjBEQzg1QjExJ1xuXG4vKiogQHR5cGUge1Byb3BlcnR5RGVzY3JpcHRvcn0gKi9cbmNvbnN0IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMgPSB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiBmYWxzZSxcbiAgY29uZmlndXJhYmxlOiBmYWxzZVxufVxuXG5jb25zdCBzdGF0ZXMgPSB7XG4gIENPTk5FQ1RJTkc6IDAsXG4gIE9QRU46IDEsXG4gIENMT1NJTkc6IDIsXG4gIENMT1NFRDogM1xufVxuXG5jb25zdCBzZW50Q2xvc2VGcmFtZVN0YXRlID0ge1xuICBOT1RfU0VOVDogMCxcbiAgUFJPQ0VTU0lORzogMSxcbiAgU0VOVDogMlxufVxuXG5jb25zdCBvcGNvZGVzID0ge1xuICBDT05USU5VQVRJT046IDB4MCxcbiAgVEVYVDogMHgxLFxuICBCSU5BUlk6IDB4MixcbiAgQ0xPU0U6IDB4OCxcbiAgUElORzogMHg5LFxuICBQT05HOiAweEFcbn1cblxuY29uc3QgbWF4VW5zaWduZWQxNkJpdCA9IDIgKiogMTYgLSAxIC8vIDY1NTM1XG5cbmNvbnN0IHBhcnNlclN0YXRlcyA9IHtcbiAgSU5GTzogMCxcbiAgUEFZTE9BRExFTkdUSF8xNjogMixcbiAgUEFZTE9BRExFTkdUSF82NDogMyxcbiAgUkVBRF9EQVRBOiA0XG59XG5cbmNvbnN0IGVtcHR5QnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKDApXG5cbmNvbnN0IHNlbmRIaW50cyA9IHtcbiAgc3RyaW5nOiAxLFxuICB0eXBlZEFycmF5OiAyLFxuICBhcnJheUJ1ZmZlcjogMyxcbiAgYmxvYjogNFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgdWlkLFxuICBzZW50Q2xvc2VGcmFtZVN0YXRlLFxuICBzdGF0aWNQcm9wZXJ0eURlc2NyaXB0b3JzLFxuICBzdGF0ZXMsXG4gIG9wY29kZXMsXG4gIG1heFVuc2lnbmVkMTZCaXQsXG4gIHBhcnNlclN0YXRlcyxcbiAgZW1wdHlCdWZmZXIsXG4gIHNlbmRIaW50c1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBrV2ViU29ja2V0VVJMOiBTeW1ib2woJ3VybCcpLFxuICBrUmVhZHlTdGF0ZTogU3ltYm9sKCdyZWFkeSBzdGF0ZScpLFxuICBrQ29udHJvbGxlcjogU3ltYm9sKCdjb250cm9sbGVyJyksXG4gIGtSZXNwb25zZTogU3ltYm9sKCdyZXNwb25zZScpLFxuICBrQmluYXJ5VHlwZTogU3ltYm9sKCdiaW5hcnkgdHlwZScpLFxuICBrU2VudENsb3NlOiBTeW1ib2woJ3NlbnQgY2xvc2UnKSxcbiAga1JlY2VpdmVkQ2xvc2U6IFN5bWJvbCgncmVjZWl2ZWQgY2xvc2UnKSxcbiAga0J5dGVQYXJzZXI6IFN5bWJvbCgnYnl0ZSBwYXJzZXInKVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsga1JlYWR5U3RhdGUsIGtDb250cm9sbGVyLCBrUmVzcG9uc2UsIGtCaW5hcnlUeXBlLCBrV2ViU29ja2V0VVJMIH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgeyBzdGF0ZXMsIG9wY29kZXMgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IHsgRXJyb3JFdmVudCwgY3JlYXRlRmFzdE1lc3NhZ2VFdmVudCB9ID0gcmVxdWlyZSgnLi9ldmVudHMnKVxuY29uc3QgeyBpc1V0ZjggfSA9IHJlcXVpcmUoJ25vZGU6YnVmZmVyJylcbmNvbnN0IHsgY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50c0Zhc3QsIHJlbW92ZUhUVFBXaGl0ZXNwYWNlIH0gPSByZXF1aXJlKCcuLi9mZXRjaC9kYXRhLXVybCcpXG5cbi8qIGdsb2JhbHMgQmxvYiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL3dlYnNvY2tldCcpLldlYlNvY2tldH0gd3NcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0Nvbm5lY3RpbmcgKHdzKSB7XG4gIC8vIElmIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBpcyBub3QgeWV0IGVzdGFibGlzaGVkLCBhbmQgdGhlIGNvbm5lY3Rpb25cbiAgLy8gaXMgbm90IHlldCBjbG9zZWQsIHRoZW4gdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIGlzIGluIHRoZSBDT05ORUNUSU5HIHN0YXRlLlxuICByZXR1cm4gd3Nba1JlYWR5U3RhdGVdID09PSBzdGF0ZXMuQ09OTkVDVElOR1xufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL3dlYnNvY2tldCcpLldlYlNvY2tldH0gd3NcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0VzdGFibGlzaGVkICh3cykge1xuICAvLyBJZiB0aGUgc2VydmVyJ3MgcmVzcG9uc2UgaXMgdmFsaWRhdGVkIGFzIHByb3ZpZGVkIGZvciBhYm92ZSwgaXQgaXNcbiAgLy8gc2FpZCB0aGF0IF9UaGUgV2ViU29ja2V0IENvbm5lY3Rpb24gaXMgRXN0YWJsaXNoZWRfIGFuZCB0aGF0IHRoZVxuICAvLyBXZWJTb2NrZXQgQ29ubmVjdGlvbiBpcyBpbiB0aGUgT1BFTiBzdGF0ZS5cbiAgcmV0dXJuIHdzW2tSZWFkeVN0YXRlXSA9PT0gc3RhdGVzLk9QRU5cbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi93ZWJzb2NrZXQnKS5XZWJTb2NrZXR9IHdzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNDbG9zaW5nICh3cykge1xuICAvLyBVcG9uIGVpdGhlciBzZW5kaW5nIG9yIHJlY2VpdmluZyBhIENsb3NlIGNvbnRyb2wgZnJhbWUsIGl0IGlzIHNhaWRcbiAgLy8gdGhhdCBfVGhlIFdlYlNvY2tldCBDbG9zaW5nIEhhbmRzaGFrZSBpcyBTdGFydGVkXyBhbmQgdGhhdCB0aGVcbiAgLy8gV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgaW4gdGhlIENMT1NJTkcgc3RhdGUuXG4gIHJldHVybiB3c1trUmVhZHlTdGF0ZV0gPT09IHN0YXRlcy5DTE9TSU5HXG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vd2Vic29ja2V0JykuV2ViU29ja2V0fSB3c1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzQ2xvc2VkICh3cykge1xuICByZXR1cm4gd3Nba1JlYWR5U3RhdGVdID09PSBzdGF0ZXMuQ0xPU0VEXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtZXZlbnQtZmlyZVxuICogQHBhcmFtIHtzdHJpbmd9IGVcbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IHRhcmdldFxuICogQHBhcmFtIHsoLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPHR5cGVvZiBFdmVudD4pID0+IEV2ZW50fSBldmVudEZhY3RvcnlcbiAqIEBwYXJhbSB7RXZlbnRJbml0IHwgdW5kZWZpbmVkfSBldmVudEluaXREaWN0XG4gKi9cbmZ1bmN0aW9uIGZpcmVFdmVudCAoZSwgdGFyZ2V0LCBldmVudEZhY3RvcnkgPSAodHlwZSwgaW5pdCkgPT4gbmV3IEV2ZW50KHR5cGUsIGluaXQpLCBldmVudEluaXREaWN0ID0ge30pIHtcbiAgLy8gMS4gSWYgZXZlbnRDb25zdHJ1Y3RvciBpcyBub3QgZ2l2ZW4sIHRoZW4gbGV0IGV2ZW50Q29uc3RydWN0b3IgYmUgRXZlbnQuXG5cbiAgLy8gMi4gTGV0IGV2ZW50IGJlIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYW4gZXZlbnQgZ2l2ZW4gZXZlbnRDb25zdHJ1Y3RvcixcbiAgLy8gICAgaW4gdGhlIHJlbGV2YW50IHJlYWxtIG9mIHRhcmdldC5cbiAgLy8gMy4gSW5pdGlhbGl6ZSBldmVudOKAmXMgdHlwZSBhdHRyaWJ1dGUgdG8gZS5cbiAgY29uc3QgZXZlbnQgPSBldmVudEZhY3RvcnkoZSwgZXZlbnRJbml0RGljdClcblxuICAvLyA0LiBJbml0aWFsaXplIGFueSBvdGhlciBJREwgYXR0cmlidXRlcyBvZiBldmVudCBhcyBkZXNjcmliZWQgaW4gdGhlXG4gIC8vICAgIGludm9jYXRpb24gb2YgdGhpcyBhbGdvcml0aG0uXG5cbiAgLy8gNS4gUmV0dXJuIHRoZSByZXN1bHQgb2YgZGlzcGF0Y2hpbmcgZXZlbnQgYXQgdGFyZ2V0LCB3aXRoIGxlZ2FjeSB0YXJnZXRcbiAgLy8gICAgb3ZlcnJpZGUgZmxhZyBzZXQgaWYgc2V0LlxuICB0YXJnZXQuZGlzcGF0Y2hFdmVudChldmVudClcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vd2Vic29ja2V0cy5zcGVjLndoYXR3Zy5vcmcvI2ZlZWRiYWNrLWZyb20tdGhlLXByb3RvY29sXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi93ZWJzb2NrZXQnKS5XZWJTb2NrZXR9IHdzXG4gKiBAcGFyYW0ge251bWJlcn0gdHlwZSBPcGNvZGVcbiAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIGFwcGxpY2F0aW9uIGRhdGFcbiAqL1xuZnVuY3Rpb24gd2Vic29ja2V0TWVzc2FnZVJlY2VpdmVkICh3cywgdHlwZSwgZGF0YSkge1xuICAvLyAxLiBJZiByZWFkeSBzdGF0ZSBpcyBub3QgT1BFTiAoMSksIHRoZW4gcmV0dXJuLlxuICBpZiAod3Nba1JlYWR5U3RhdGVdICE9PSBzdGF0ZXMuT1BFTikge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gMi4gTGV0IGRhdGFGb3JFdmVudCBiZSBkZXRlcm1pbmVkIGJ5IHN3aXRjaGluZyBvbiB0eXBlIGFuZCBiaW5hcnkgdHlwZTpcbiAgbGV0IGRhdGFGb3JFdmVudFxuXG4gIGlmICh0eXBlID09PSBvcGNvZGVzLlRFWFQpIHtcbiAgICAvLyAtPiB0eXBlIGluZGljYXRlcyB0aGF0IHRoZSBkYXRhIGlzIFRleHRcbiAgICAvLyAgICAgIGEgbmV3IERPTVN0cmluZyBjb250YWluaW5nIGRhdGFcbiAgICB0cnkge1xuICAgICAgZGF0YUZvckV2ZW50ID0gdXRmOERlY29kZShkYXRhKVxuICAgIH0gY2F0Y2gge1xuICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24od3MsICdSZWNlaXZlZCBpbnZhbGlkIFVURi04IGluIHRleHQgZnJhbWUuJylcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlID09PSBvcGNvZGVzLkJJTkFSWSkge1xuICAgIGlmICh3c1trQmluYXJ5VHlwZV0gPT09ICdibG9iJykge1xuICAgICAgLy8gLT4gdHlwZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZGF0YSBpcyBCaW5hcnkgYW5kIGJpbmFyeSB0eXBlIGlzIFwiYmxvYlwiXG4gICAgICAvLyAgICAgIGEgbmV3IEJsb2Igb2JqZWN0LCBjcmVhdGVkIGluIHRoZSByZWxldmFudCBSZWFsbSBvZiB0aGUgV2ViU29ja2V0XG4gICAgICAvLyAgICAgIG9iamVjdCwgdGhhdCByZXByZXNlbnRzIGRhdGEgYXMgaXRzIHJhdyBkYXRhXG4gICAgICBkYXRhRm9yRXZlbnQgPSBuZXcgQmxvYihbZGF0YV0pXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIC0+IHR5cGUgaW5kaWNhdGVzIHRoYXQgdGhlIGRhdGEgaXMgQmluYXJ5IGFuZCBiaW5hcnkgdHlwZSBpcyBcImFycmF5YnVmZmVyXCJcbiAgICAgIC8vICAgICAgYSBuZXcgQXJyYXlCdWZmZXIgb2JqZWN0LCBjcmVhdGVkIGluIHRoZSByZWxldmFudCBSZWFsbSBvZiB0aGVcbiAgICAgIC8vICAgICAgV2ViU29ja2V0IG9iamVjdCwgd2hvc2UgY29udGVudHMgYXJlIGRhdGFcbiAgICAgIGRhdGFGb3JFdmVudCA9IHRvQXJyYXlCdWZmZXIoZGF0YSlcbiAgICB9XG4gIH1cblxuICAvLyAzLiBGaXJlIGFuIGV2ZW50IG5hbWVkIG1lc3NhZ2UgYXQgdGhlIFdlYlNvY2tldCBvYmplY3QsIHVzaW5nIE1lc3NhZ2VFdmVudCxcbiAgLy8gICAgd2l0aCB0aGUgb3JpZ2luIGF0dHJpYnV0ZSBpbml0aWFsaXplZCB0byB0aGUgc2VyaWFsaXphdGlvbiBvZiB0aGUgV2ViU29ja2V0XG4gIC8vICAgIG9iamVjdOKAmXMgdXJsJ3Mgb3JpZ2luLCBhbmQgdGhlIGRhdGEgYXR0cmlidXRlIGluaXRpYWxpemVkIHRvIGRhdGFGb3JFdmVudC5cbiAgZmlyZUV2ZW50KCdtZXNzYWdlJywgd3MsIGNyZWF0ZUZhc3RNZXNzYWdlRXZlbnQsIHtcbiAgICBvcmlnaW46IHdzW2tXZWJTb2NrZXRVUkxdLm9yaWdpbixcbiAgICBkYXRhOiBkYXRhRm9yRXZlbnRcbiAgfSlcbn1cblxuZnVuY3Rpb24gdG9BcnJheUJ1ZmZlciAoYnVmZmVyKSB7XG4gIGlmIChidWZmZXIuYnl0ZUxlbmd0aCA9PT0gYnVmZmVyLmJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5idWZmZXJcbiAgfVxuICByZXR1cm4gYnVmZmVyLmJ1ZmZlci5zbGljZShidWZmZXIuYnl0ZU9mZnNldCwgYnVmZmVyLmJ5dGVPZmZzZXQgKyBidWZmZXIuYnl0ZUxlbmd0aClcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjQ1NVxuICogQHNlZSBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzI2MTZcbiAqIEBzZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9Mzk4NDA3XG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvdG9jb2xcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZFN1YnByb3RvY29sIChwcm90b2NvbCkge1xuICAvLyBJZiBwcmVzZW50LCB0aGlzIHZhbHVlIGluZGljYXRlcyBvbmVcbiAgLy8gb3IgbW9yZSBjb21tYS1zZXBhcmF0ZWQgc3VicHJvdG9jb2wgdGhlIGNsaWVudCB3aXNoZXMgdG8gc3BlYWssXG4gIC8vIG9yZGVyZWQgYnkgcHJlZmVyZW5jZS4gIFRoZSBlbGVtZW50cyB0aGF0IGNvbXByaXNlIHRoaXMgdmFsdWVcbiAgLy8gTVVTVCBiZSBub24tZW1wdHkgc3RyaW5ncyB3aXRoIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFUrMDAyMSB0b1xuICAvLyBVKzAwN0Ugbm90IGluY2x1ZGluZyBzZXBhcmF0b3IgY2hhcmFjdGVycyBhcyBkZWZpbmVkIGluXG4gIC8vIFtSRkMyNjE2XSBhbmQgTVVTVCBhbGwgYmUgdW5pcXVlIHN0cmluZ3MuXG4gIGlmIChwcm90b2NvbC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvdG9jb2wubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBjb2RlID0gcHJvdG9jb2wuY2hhckNvZGVBdChpKVxuXG4gICAgaWYgKFxuICAgICAgY29kZSA8IDB4MjEgfHwgLy8gQ1RMLCBjb250YWlucyBTUCAoMHgyMCkgYW5kIEhUICgweDA5KVxuICAgICAgY29kZSA+IDB4N0UgfHxcbiAgICAgIGNvZGUgPT09IDB4MjIgfHwgLy8gXCJcbiAgICAgIGNvZGUgPT09IDB4MjggfHwgLy8gKFxuICAgICAgY29kZSA9PT0gMHgyOSB8fCAvLyApXG4gICAgICBjb2RlID09PSAweDJDIHx8IC8vICxcbiAgICAgIGNvZGUgPT09IDB4MkYgfHwgLy8gL1xuICAgICAgY29kZSA9PT0gMHgzQSB8fCAvLyA6XG4gICAgICBjb2RlID09PSAweDNCIHx8IC8vIDtcbiAgICAgIGNvZGUgPT09IDB4M0MgfHwgLy8gPFxuICAgICAgY29kZSA9PT0gMHgzRCB8fCAvLyA9XG4gICAgICBjb2RlID09PSAweDNFIHx8IC8vID5cbiAgICAgIGNvZGUgPT09IDB4M0YgfHwgLy8gP1xuICAgICAgY29kZSA9PT0gMHg0MCB8fCAvLyBAXG4gICAgICBjb2RlID09PSAweDVCIHx8IC8vIFtcbiAgICAgIGNvZGUgPT09IDB4NUMgfHwgLy8gXFxcbiAgICAgIGNvZGUgPT09IDB4NUQgfHwgLy8gXVxuICAgICAgY29kZSA9PT0gMHg3QiB8fCAvLyB7XG4gICAgICBjb2RlID09PSAweDdEIC8vIH1cbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzY0NTUjc2VjdGlvbi03LTRcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRTdGF0dXNDb2RlIChjb2RlKSB7XG4gIGlmIChjb2RlID49IDEwMDAgJiYgY29kZSA8IDEwMTUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgY29kZSAhPT0gMTAwNCAmJiAvLyByZXNlcnZlZFxuICAgICAgY29kZSAhPT0gMTAwNSAmJiAvLyBcIk1VU1QgTk9UIGJlIHNldCBhcyBhIHN0YXR1cyBjb2RlXCJcbiAgICAgIGNvZGUgIT09IDEwMDYgLy8gXCJNVVNUIE5PVCBiZSBzZXQgYXMgYSBzdGF0dXMgY29kZVwiXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGNvZGUgPj0gMzAwMCAmJiBjb2RlIDw9IDQ5OTlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi93ZWJzb2NrZXQnKS5XZWJTb2NrZXR9IHdzXG4gKiBAcGFyYW0ge3N0cmluZ3x1bmRlZmluZWR9IHJlYXNvblxuICovXG5mdW5jdGlvbiBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbiAod3MsIHJlYXNvbikge1xuICBjb25zdCB7IFtrQ29udHJvbGxlcl06IGNvbnRyb2xsZXIsIFtrUmVzcG9uc2VdOiByZXNwb25zZSB9ID0gd3NcblxuICBjb250cm9sbGVyLmFib3J0KClcblxuICBpZiAocmVzcG9uc2U/LnNvY2tldCAmJiAhcmVzcG9uc2Uuc29ja2V0LmRlc3Ryb3llZCkge1xuICAgIHJlc3BvbnNlLnNvY2tldC5kZXN0cm95KClcbiAgfVxuXG4gIGlmIChyZWFzb24pIHtcbiAgICAvLyBUT0RPOiBwcm9jZXNzLm5leHRUaWNrXG4gICAgZmlyZUV2ZW50KCdlcnJvcicsIHdzLCAodHlwZSwgaW5pdCkgPT4gbmV3IEVycm9yRXZlbnQodHlwZSwgaW5pdCksIHtcbiAgICAgIGVycm9yOiBuZXcgRXJyb3IocmVhc29uKSxcbiAgICAgIG1lc3NhZ2U6IHJlYXNvblxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjQ1NSNzZWN0aW9uLTUuNVxuICogQHBhcmFtIHtudW1iZXJ9IG9wY29kZVxuICovXG5mdW5jdGlvbiBpc0NvbnRyb2xGcmFtZSAob3Bjb2RlKSB7XG4gIHJldHVybiAoXG4gICAgb3Bjb2RlID09PSBvcGNvZGVzLkNMT1NFIHx8XG4gICAgb3Bjb2RlID09PSBvcGNvZGVzLlBJTkcgfHxcbiAgICBvcGNvZGUgPT09IG9wY29kZXMuUE9OR1xuICApXG59XG5cbmZ1bmN0aW9uIGlzQ29udGludWF0aW9uRnJhbWUgKG9wY29kZSkge1xuICByZXR1cm4gb3Bjb2RlID09PSBvcGNvZGVzLkNPTlRJTlVBVElPTlxufVxuXG5mdW5jdGlvbiBpc1RleHRCaW5hcnlGcmFtZSAob3Bjb2RlKSB7XG4gIHJldHVybiBvcGNvZGUgPT09IG9wY29kZXMuVEVYVCB8fCBvcGNvZGUgPT09IG9wY29kZXMuQklOQVJZXG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRPcGNvZGUgKG9wY29kZSkge1xuICByZXR1cm4gaXNUZXh0QmluYXJ5RnJhbWUob3Bjb2RlKSB8fCBpc0NvbnRpbnVhdGlvbkZyYW1lKG9wY29kZSkgfHwgaXNDb250cm9sRnJhbWUob3Bjb2RlKVxufVxuXG4vKipcbiAqIFBhcnNlcyBhIFNlYy1XZWJTb2NrZXQtRXh0ZW5zaW9ucyBoZWFkZXIgdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXh0ZW5zaW9uc1xuICogQHJldHVybnMge01hcDxzdHJpbmcsIHN0cmluZz59XG4gKi9cbi8vIFRPRE8oQFV6bG9wYWssIEBLaGFmcmFEZXYpOiBtYWtlIGNvbXBsaWFudCBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzY0NTUjc2VjdGlvbi05LjFcbmZ1bmN0aW9uIHBhcnNlRXh0ZW5zaW9ucyAoZXh0ZW5zaW9ucykge1xuICBjb25zdCBwb3NpdGlvbiA9IHsgcG9zaXRpb246IDAgfVxuICBjb25zdCBleHRlbnNpb25MaXN0ID0gbmV3IE1hcCgpXG5cbiAgd2hpbGUgKHBvc2l0aW9uLnBvc2l0aW9uIDwgZXh0ZW5zaW9ucy5sZW5ndGgpIHtcbiAgICBjb25zdCBwYWlyID0gY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50c0Zhc3QoJzsnLCBleHRlbnNpb25zLCBwb3NpdGlvbilcbiAgICBjb25zdCBbbmFtZSwgdmFsdWUgPSAnJ10gPSBwYWlyLnNwbGl0KCc9JylcblxuICAgIGV4dGVuc2lvbkxpc3Quc2V0KFxuICAgICAgcmVtb3ZlSFRUUFdoaXRlc3BhY2UobmFtZSwgdHJ1ZSwgZmFsc2UpLFxuICAgICAgcmVtb3ZlSFRUUFdoaXRlc3BhY2UodmFsdWUsIGZhbHNlLCB0cnVlKVxuICAgIClcblxuICAgIHBvc2l0aW9uLnBvc2l0aW9uKytcbiAgfVxuXG4gIHJldHVybiBleHRlbnNpb25MaXN0XG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNzY5MiNzZWN0aW9uLTcuMS4yLjJcbiAqIEBkZXNjcmlwdGlvbiBcImNsaWVudC1tYXgtd2luZG93LWJpdHMgPSAxKkRJR0lUXCJcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICovXG5mdW5jdGlvbiBpc1ZhbGlkQ2xpZW50V2luZG93Qml0cyAodmFsdWUpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGJ5dGUgPSB2YWx1ZS5jaGFyQ29kZUF0KGkpXG5cbiAgICBpZiAoYnl0ZSA8IDB4MzAgfHwgYnl0ZSA+IDB4MzkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8vIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvaW50bC5odG1sI2RldGVjdGluZy1pbnRlcm5hdGlvbmFsaXphdGlvbi1zdXBwb3J0XG5jb25zdCBoYXNJbnRsID0gdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMuaWN1ID09PSAnc3RyaW5nJ1xuY29uc3QgZmF0YWxEZWNvZGVyID0gaGFzSW50bCA/IG5ldyBUZXh0RGVjb2RlcigndXRmLTgnLCB7IGZhdGFsOiB0cnVlIH0pIDogdW5kZWZpbmVkXG5cbi8qKlxuICogQ29udmVydHMgYSBCdWZmZXIgdG8gdXRmLTgsIGV2ZW4gb24gcGxhdGZvcm1zIHdpdGhvdXQgaWN1LlxuICogQHBhcmFtIHtCdWZmZXJ9IGJ1ZmZlclxuICovXG5jb25zdCB1dGY4RGVjb2RlID0gaGFzSW50bFxuICA/IGZhdGFsRGVjb2Rlci5kZWNvZGUuYmluZChmYXRhbERlY29kZXIpXG4gIDogZnVuY3Rpb24gKGJ1ZmZlcikge1xuICAgIGlmIChpc1V0ZjgoYnVmZmVyKSkge1xuICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygndXRmLTgnKVxuICAgIH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHV0Zi04IHJlY2VpdmVkLicpXG4gIH1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzQ29ubmVjdGluZyxcbiAgaXNFc3RhYmxpc2hlZCxcbiAgaXNDbG9zaW5nLFxuICBpc0Nsb3NlZCxcbiAgZmlyZUV2ZW50LFxuICBpc1ZhbGlkU3VicHJvdG9jb2wsXG4gIGlzVmFsaWRTdGF0dXNDb2RlLFxuICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbixcbiAgd2Vic29ja2V0TWVzc2FnZVJlY2VpdmVkLFxuICB1dGY4RGVjb2RlLFxuICBpc0NvbnRyb2xGcmFtZSxcbiAgaXNDb250aW51YXRpb25GcmFtZSxcbiAgaXNUZXh0QmluYXJ5RnJhbWUsXG4gIGlzVmFsaWRPcGNvZGUsXG4gIHBhcnNlRXh0ZW5zaW9ucyxcbiAgaXNWYWxpZENsaWVudFdpbmRvd0JpdHNcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IG1heFVuc2lnbmVkMTZCaXQgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcblxuY29uc3QgQlVGRkVSX1NJWkUgPSAxNjM4NlxuXG4vKiogQHR5cGUge2ltcG9ydCgnY3J5cHRvJyl9ICovXG5sZXQgY3J5cHRvXG5sZXQgYnVmZmVyID0gbnVsbFxubGV0IGJ1ZklkeCA9IEJVRkZFUl9TSVpFXG5cbnRyeSB7XG4gIGNyeXB0byA9IHJlcXVpcmUoJ25vZGU6Y3J5cHRvJylcbi8qIGM4IGlnbm9yZSBuZXh0IDMgKi9cbn0gY2F0Y2gge1xuICBjcnlwdG8gPSB7XG4gICAgLy8gbm90IGZ1bGwgY29tcGF0aWJpbGl0eSwgYnV0IG1pbmltdW0uXG4gICAgcmFuZG9tRmlsbFN5bmM6IGZ1bmN0aW9uIHJhbmRvbUZpbGxTeW5jIChidWZmZXIsIF9vZmZzZXQsIF9zaXplKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7ICsraSkge1xuICAgICAgICBidWZmZXJbaV0gPSBNYXRoLnJhbmRvbSgpICogMjU1IHwgMFxuICAgICAgfVxuICAgICAgcmV0dXJuIGJ1ZmZlclxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZU1hc2sgKCkge1xuICBpZiAoYnVmSWR4ID09PSBCVUZGRVJfU0laRSkge1xuICAgIGJ1ZklkeCA9IDBcbiAgICBjcnlwdG8ucmFuZG9tRmlsbFN5bmMoKGJ1ZmZlciA/Pz0gQnVmZmVyLmFsbG9jVW5zYWZlKEJVRkZFUl9TSVpFKSksIDAsIEJVRkZFUl9TSVpFKVxuICB9XG4gIHJldHVybiBbYnVmZmVyW2J1ZklkeCsrXSwgYnVmZmVyW2J1ZklkeCsrXSwgYnVmZmVyW2J1ZklkeCsrXSwgYnVmZmVyW2J1ZklkeCsrXV1cbn1cblxuY2xhc3MgV2Vic29ja2V0RnJhbWVTZW5kIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7QnVmZmVyfHVuZGVmaW5lZH0gZGF0YVxuICAgKi9cbiAgY29uc3RydWN0b3IgKGRhdGEpIHtcbiAgICB0aGlzLmZyYW1lRGF0YSA9IGRhdGFcbiAgfVxuXG4gIGNyZWF0ZUZyYW1lIChvcGNvZGUpIHtcbiAgICBjb25zdCBmcmFtZURhdGEgPSB0aGlzLmZyYW1lRGF0YVxuICAgIGNvbnN0IG1hc2tLZXkgPSBnZW5lcmF0ZU1hc2soKVxuICAgIGNvbnN0IGJvZHlMZW5ndGggPSBmcmFtZURhdGE/LmJ5dGVMZW5ndGggPz8gMFxuXG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgbGV0IHBheWxvYWRMZW5ndGggPSBib2R5TGVuZ3RoIC8vIDAtMTI1XG4gICAgbGV0IG9mZnNldCA9IDZcblxuICAgIGlmIChib2R5TGVuZ3RoID4gbWF4VW5zaWduZWQxNkJpdCkge1xuICAgICAgb2Zmc2V0ICs9IDggLy8gcGF5bG9hZCBsZW5ndGggaXMgbmV4dCA4IGJ5dGVzXG4gICAgICBwYXlsb2FkTGVuZ3RoID0gMTI3XG4gICAgfSBlbHNlIGlmIChib2R5TGVuZ3RoID4gMTI1KSB7XG4gICAgICBvZmZzZXQgKz0gMiAvLyBwYXlsb2FkIGxlbmd0aCBpcyBuZXh0IDIgYnl0ZXNcbiAgICAgIHBheWxvYWRMZW5ndGggPSAxMjZcbiAgICB9XG5cbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUoYm9keUxlbmd0aCArIG9mZnNldClcblxuICAgIC8vIENsZWFyIGZpcnN0IDIgYnl0ZXMsIGV2ZXJ5dGhpbmcgZWxzZSBpcyBvdmVyd3JpdHRlblxuICAgIGJ1ZmZlclswXSA9IGJ1ZmZlclsxXSA9IDBcbiAgICBidWZmZXJbMF0gfD0gMHg4MCAvLyBGSU5cbiAgICBidWZmZXJbMF0gPSAoYnVmZmVyWzBdICYgMHhGMCkgKyBvcGNvZGUgLy8gb3Bjb2RlXG5cbiAgICAvKiEgd3MuIE1JVCBMaWNlbnNlLiBFaW5hciBPdHRvIFN0YW5ndmlrIDxlaW5hcm9zQGdtYWlsLmNvbT4gKi9cbiAgICBidWZmZXJbb2Zmc2V0IC0gNF0gPSBtYXNrS2V5WzBdXG4gICAgYnVmZmVyW29mZnNldCAtIDNdID0gbWFza0tleVsxXVxuICAgIGJ1ZmZlcltvZmZzZXQgLSAyXSA9IG1hc2tLZXlbMl1cbiAgICBidWZmZXJbb2Zmc2V0IC0gMV0gPSBtYXNrS2V5WzNdXG5cbiAgICBidWZmZXJbMV0gPSBwYXlsb2FkTGVuZ3RoXG5cbiAgICBpZiAocGF5bG9hZExlbmd0aCA9PT0gMTI2KSB7XG4gICAgICBidWZmZXIud3JpdGVVSW50MTZCRShib2R5TGVuZ3RoLCAyKVxuICAgIH0gZWxzZSBpZiAocGF5bG9hZExlbmd0aCA9PT0gMTI3KSB7XG4gICAgICAvLyBDbGVhciBleHRlbmRlZCBwYXlsb2FkIGxlbmd0aFxuICAgICAgYnVmZmVyWzJdID0gYnVmZmVyWzNdID0gMFxuICAgICAgYnVmZmVyLndyaXRlVUludEJFKGJvZHlMZW5ndGgsIDQsIDYpXG4gICAgfVxuXG4gICAgYnVmZmVyWzFdIHw9IDB4ODAgLy8gTUFTS1xuXG4gICAgLy8gbWFzayBib2R5XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBib2R5TGVuZ3RoOyArK2kpIHtcbiAgICAgIGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGZyYW1lRGF0YVtpXSBeIG1hc2tLZXlbaSAmIDNdXG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZmZlclxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBXZWJzb2NrZXRGcmFtZVNlbmRcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IHVpZCwgc3RhdGVzLCBzZW50Q2xvc2VGcmFtZVN0YXRlLCBlbXB0eUJ1ZmZlciwgb3Bjb2RlcyB9ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3Qge1xuICBrUmVhZHlTdGF0ZSxcbiAga1NlbnRDbG9zZSxcbiAga0J5dGVQYXJzZXIsXG4gIGtSZWNlaXZlZENsb3NlLFxuICBrUmVzcG9uc2Vcbn0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgeyBmaXJlRXZlbnQsIGZhaWxXZWJzb2NrZXRDb25uZWN0aW9uLCBpc0Nsb3NpbmcsIGlzQ2xvc2VkLCBpc0VzdGFibGlzaGVkLCBwYXJzZUV4dGVuc2lvbnMgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IGNoYW5uZWxzIH0gPSByZXF1aXJlKCcuLi8uLi9jb3JlL2RpYWdub3N0aWNzJylcbmNvbnN0IHsgQ2xvc2VFdmVudCB9ID0gcmVxdWlyZSgnLi9ldmVudHMnKVxuY29uc3QgeyBtYWtlUmVxdWVzdCB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvcmVxdWVzdCcpXG5jb25zdCB7IGZldGNoaW5nIH0gPSByZXF1aXJlKCcuLi9mZXRjaC9pbmRleCcpXG5jb25zdCB7IEhlYWRlcnMsIGdldEhlYWRlcnNMaXN0IH0gPSByZXF1aXJlKCcuLi9mZXRjaC9oZWFkZXJzJylcbmNvbnN0IHsgZ2V0RGVjb2RlU3BsaXQgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3V0aWwnKVxuY29uc3QgeyBXZWJzb2NrZXRGcmFtZVNlbmQgfSA9IHJlcXVpcmUoJy4vZnJhbWUnKVxuXG4vKiogQHR5cGUge2ltcG9ydCgnY3J5cHRvJyl9ICovXG5sZXQgY3J5cHRvXG50cnkge1xuICBjcnlwdG8gPSByZXF1aXJlKCdub2RlOmNyeXB0bycpXG4vKiBjOCBpZ25vcmUgbmV4dCAzICovXG59IGNhdGNoIHtcblxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93ZWJzb2NrZXRzLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC13ZWJzb2NrZXQtZXN0YWJsaXNoXG4gKiBAcGFyYW0ge1VSTH0gdXJsXG4gKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gcHJvdG9jb2xzXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi93ZWJzb2NrZXQnKS5XZWJTb2NrZXR9IHdzXG4gKiBAcGFyYW0geyhyZXNwb25zZTogYW55LCBleHRlbnNpb25zOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPT4gdm9pZH0gb25Fc3RhYmxpc2hcbiAqIEBwYXJhbSB7UGFydGlhbDxpbXBvcnQoJy4uLy4uL3R5cGVzL3dlYnNvY2tldCcpLldlYlNvY2tldEluaXQ+fSBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIGVzdGFibGlzaFdlYlNvY2tldENvbm5lY3Rpb24gKHVybCwgcHJvdG9jb2xzLCBjbGllbnQsIHdzLCBvbkVzdGFibGlzaCwgb3B0aW9ucykge1xuICAvLyAxLiBMZXQgcmVxdWVzdFVSTCBiZSBhIGNvcHkgb2YgdXJsLCB3aXRoIGl0cyBzY2hlbWUgc2V0IHRvIFwiaHR0cFwiLCBpZiB1cmzigJlzXG4gIC8vICAgIHNjaGVtZSBpcyBcIndzXCIsIGFuZCB0byBcImh0dHBzXCIgb3RoZXJ3aXNlLlxuICBjb25zdCByZXF1ZXN0VVJMID0gdXJsXG5cbiAgcmVxdWVzdFVSTC5wcm90b2NvbCA9IHVybC5wcm90b2NvbCA9PT0gJ3dzOicgPyAnaHR0cDonIDogJ2h0dHBzOidcblxuICAvLyAyLiBMZXQgcmVxdWVzdCBiZSBhIG5ldyByZXF1ZXN0LCB3aG9zZSBVUkwgaXMgcmVxdWVzdFVSTCwgY2xpZW50IGlzIGNsaWVudCxcbiAgLy8gICAgc2VydmljZS13b3JrZXJzIG1vZGUgaXMgXCJub25lXCIsIHJlZmVycmVyIGlzIFwibm8tcmVmZXJyZXJcIiwgbW9kZSBpc1xuICAvLyAgICBcIndlYnNvY2tldFwiLCBjcmVkZW50aWFscyBtb2RlIGlzIFwiaW5jbHVkZVwiLCBjYWNoZSBtb2RlIGlzIFwibm8tc3RvcmVcIiAsXG4gIC8vICAgIGFuZCByZWRpcmVjdCBtb2RlIGlzIFwiZXJyb3JcIi5cbiAgY29uc3QgcmVxdWVzdCA9IG1ha2VSZXF1ZXN0KHtcbiAgICB1cmxMaXN0OiBbcmVxdWVzdFVSTF0sXG4gICAgY2xpZW50LFxuICAgIHNlcnZpY2VXb3JrZXJzOiAnbm9uZScsXG4gICAgcmVmZXJyZXI6ICduby1yZWZlcnJlcicsXG4gICAgbW9kZTogJ3dlYnNvY2tldCcsXG4gICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJyxcbiAgICBjYWNoZTogJ25vLXN0b3JlJyxcbiAgICByZWRpcmVjdDogJ2Vycm9yJ1xuICB9KVxuXG4gIC8vIE5vdGU6IHVuZGljaSBleHRlbnNpb24sIGFsbG93IHNldHRpbmcgY3VzdG9tIGhlYWRlcnMuXG4gIGlmIChvcHRpb25zLmhlYWRlcnMpIHtcbiAgICBjb25zdCBoZWFkZXJzTGlzdCA9IGdldEhlYWRlcnNMaXN0KG5ldyBIZWFkZXJzKG9wdGlvbnMuaGVhZGVycykpXG5cbiAgICByZXF1ZXN0LmhlYWRlcnNMaXN0ID0gaGVhZGVyc0xpc3RcbiAgfVxuXG4gIC8vIDMuIEFwcGVuZCAoYFVwZ3JhZGVgLCBgd2Vic29ja2V0YCkgdG8gcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gIC8vIDQuIEFwcGVuZCAoYENvbm5lY3Rpb25gLCBgVXBncmFkZWApIHRvIHJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICAvLyBOb3RlOiBib3RoIG9mIHRoZXNlIGFyZSBoYW5kbGVkIGJ5IHVuZGljaSBjdXJyZW50bHkuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2Jsb2IvNjhjMjY5YzQxNDRjNDQ2ZjNmMTIyMDk1MTMzOGRhZWY0YTZiNWVjNC9saWIvY2xpZW50LmpzI0wxMzk3XG5cbiAgLy8gNS4gTGV0IGtleVZhbHVlIGJlIGEgbm9uY2UgY29uc2lzdGluZyBvZiBhIHJhbmRvbWx5IHNlbGVjdGVkXG4gIC8vICAgIDE2LWJ5dGUgdmFsdWUgdGhhdCBoYXMgYmVlbiBmb3JnaXZpbmctYmFzZTY0LWVuY29kZWQgYW5kXG4gIC8vICAgIGlzb21vcnBoaWMgZW5jb2RlZC5cbiAgY29uc3Qga2V5VmFsdWUgPSBjcnlwdG8ucmFuZG9tQnl0ZXMoMTYpLnRvU3RyaW5nKCdiYXNlNjQnKVxuXG4gIC8vIDYuIEFwcGVuZCAoYFNlYy1XZWJTb2NrZXQtS2V5YCwga2V5VmFsdWUpIHRvIHJlcXVlc3TigJlzXG4gIC8vICAgIGhlYWRlciBsaXN0LlxuICByZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgnc2VjLXdlYnNvY2tldC1rZXknLCBrZXlWYWx1ZSlcblxuICAvLyA3LiBBcHBlbmQgKGBTZWMtV2ViU29ja2V0LVZlcnNpb25gLCBgMTNgKSB0byByZXF1ZXN04oCZc1xuICAvLyAgICBoZWFkZXIgbGlzdC5cbiAgcmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ3NlYy13ZWJzb2NrZXQtdmVyc2lvbicsICcxMycpXG5cbiAgLy8gOC4gRm9yIGVhY2ggcHJvdG9jb2wgaW4gcHJvdG9jb2xzLCBjb21iaW5lXG4gIC8vICAgIChgU2VjLVdlYlNvY2tldC1Qcm90b2NvbGAsIHByb3RvY29sKSBpbiByZXF1ZXN04oCZcyBoZWFkZXJcbiAgLy8gICAgbGlzdC5cbiAgZm9yIChjb25zdCBwcm90b2NvbCBvZiBwcm90b2NvbHMpIHtcbiAgICByZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgnc2VjLXdlYnNvY2tldC1wcm90b2NvbCcsIHByb3RvY29sKVxuICB9XG5cbiAgLy8gOS4gTGV0IHBlcm1lc3NhZ2VEZWZsYXRlIGJlIGEgdXNlci1hZ2VudCBkZWZpbmVkXG4gIC8vICAgIFwicGVybWVzc2FnZS1kZWZsYXRlXCIgZXh0ZW5zaW9uIGhlYWRlciB2YWx1ZS5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvZ2Vja28tZGV2L2Jsb2IvY2U3ODIzNGY1ZTY1M2E1ZDM5MTY4MTNmZjk5MGYwNTM1MTAyMjdiYy9uZXR3ZXJrL3Byb3RvY29sL3dlYnNvY2tldC9XZWJTb2NrZXRDaGFubmVsLmNwcCNMMjY3M1xuICBjb25zdCBwZXJtZXNzYWdlRGVmbGF0ZSA9ICdwZXJtZXNzYWdlLWRlZmxhdGU7IGNsaWVudF9tYXhfd2luZG93X2JpdHMnXG5cbiAgLy8gMTAuIEFwcGVuZCAoYFNlYy1XZWJTb2NrZXQtRXh0ZW5zaW9uc2AsIHBlcm1lc3NhZ2VEZWZsYXRlKSB0b1xuICAvLyAgICAgcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gIHJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdzZWMtd2Vic29ja2V0LWV4dGVuc2lvbnMnLCBwZXJtZXNzYWdlRGVmbGF0ZSlcblxuICAvLyAxMS4gRmV0Y2ggcmVxdWVzdCB3aXRoIHVzZVBhcmFsbGVsUXVldWUgc2V0IHRvIHRydWUsIGFuZFxuICAvLyAgICAgcHJvY2Vzc1Jlc3BvbnNlIGdpdmVuIHJlc3BvbnNlIGJlaW5nIHRoZXNlIHN0ZXBzOlxuICBjb25zdCBjb250cm9sbGVyID0gZmV0Y2hpbmcoe1xuICAgIHJlcXVlc3QsXG4gICAgdXNlUGFyYWxsZWxRdWV1ZTogdHJ1ZSxcbiAgICBkaXNwYXRjaGVyOiBvcHRpb25zLmRpc3BhdGNoZXIsXG4gICAgcHJvY2Vzc1Jlc3BvbnNlIChyZXNwb25zZSkge1xuICAgICAgLy8gMS4gSWYgcmVzcG9uc2UgaXMgYSBuZXR3b3JrIGVycm9yIG9yIGl0cyBzdGF0dXMgaXMgbm90IDEwMSxcbiAgICAgIC8vICAgIGZhaWwgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uLlxuICAgICAgaWYgKHJlc3BvbnNlLnR5cGUgPT09ICdlcnJvcicgfHwgcmVzcG9uc2Uuc3RhdHVzICE9PSAxMDEpIHtcbiAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24od3MsICdSZWNlaXZlZCBuZXR3b3JrIGVycm9yIG9yIG5vbi0xMDEgc3RhdHVzIGNvZGUuJylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIElmIHByb3RvY29scyBpcyBub3QgdGhlIGVtcHR5IGxpc3QgYW5kIGV4dHJhY3RpbmcgaGVhZGVyXG4gICAgICAvLyAgICBsaXN0IHZhbHVlcyBnaXZlbiBgU2VjLVdlYlNvY2tldC1Qcm90b2NvbGAgYW5kIHJlc3BvbnNl4oCZc1xuICAgICAgLy8gICAgaGVhZGVyIGxpc3QgcmVzdWx0cyBpbiBudWxsLCBmYWlsdXJlLCBvciB0aGUgZW1wdHkgYnl0ZVxuICAgICAgLy8gICAgc2VxdWVuY2UsIHRoZW4gZmFpbCB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gICAgICBpZiAocHJvdG9jb2xzLmxlbmd0aCAhPT0gMCAmJiAhcmVzcG9uc2UuaGVhZGVyc0xpc3QuZ2V0KCdTZWMtV2ViU29ja2V0LVByb3RvY29sJykpIHtcbiAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24od3MsICdTZXJ2ZXIgZGlkIG5vdCByZXNwb25kIHdpdGggc2VudCBwcm90b2NvbHMuJylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIEZvbGxvdyB0aGUgcmVxdWlyZW1lbnRzIHN0YXRlZCBzdGVwIDIgdG8gc3RlcCA2LCBpbmNsdXNpdmUsXG4gICAgICAvLyAgICBvZiB0aGUgbGFzdCBzZXQgb2Ygc3RlcHMgaW4gc2VjdGlvbiA0LjEgb2YgVGhlIFdlYlNvY2tldFxuICAgICAgLy8gICAgUHJvdG9jb2wgdG8gdmFsaWRhdGUgcmVzcG9uc2UuIFRoaXMgZWl0aGVyIHJlc3VsdHMgaW4gZmFpbFxuICAgICAgLy8gICAgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIG9yIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBpc1xuICAgICAgLy8gICAgZXN0YWJsaXNoZWQuXG5cbiAgICAgIC8vIDIuIElmIHRoZSByZXNwb25zZSBsYWNrcyBhbiB8VXBncmFkZXwgaGVhZGVyIGZpZWxkIG9yIHRoZSB8VXBncmFkZXxcbiAgICAgIC8vICAgIGhlYWRlciBmaWVsZCBjb250YWlucyBhIHZhbHVlIHRoYXQgaXMgbm90IGFuIEFTQ0lJIGNhc2UtXG4gICAgICAvLyAgICBpbnNlbnNpdGl2ZSBtYXRjaCBmb3IgdGhlIHZhbHVlIFwid2Vic29ja2V0XCIsIHRoZSBjbGllbnQgTVVTVFxuICAgICAgLy8gICAgX0ZhaWwgdGhlIFdlYlNvY2tldCBDb25uZWN0aW9uXy5cbiAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzTGlzdC5nZXQoJ1VwZ3JhZGUnKT8udG9Mb3dlckNhc2UoKSAhPT0gJ3dlYnNvY2tldCcpIHtcbiAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24od3MsICdTZXJ2ZXIgZGlkIG5vdCBzZXQgVXBncmFkZSBoZWFkZXIgdG8gXCJ3ZWJzb2NrZXRcIi4nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gMy4gSWYgdGhlIHJlc3BvbnNlIGxhY2tzIGEgfENvbm5lY3Rpb258IGhlYWRlciBmaWVsZCBvciB0aGVcbiAgICAgIC8vICAgIHxDb25uZWN0aW9ufCBoZWFkZXIgZmllbGQgZG9lc24ndCBjb250YWluIGEgdG9rZW4gdGhhdCBpcyBhblxuICAgICAgLy8gICAgQVNDSUkgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBmb3IgdGhlIHZhbHVlIFwiVXBncmFkZVwiLCB0aGUgY2xpZW50XG4gICAgICAvLyAgICBNVVNUIF9GYWlsIHRoZSBXZWJTb2NrZXQgQ29ubmVjdGlvbl8uXG4gICAgICBpZiAocmVzcG9uc2UuaGVhZGVyc0xpc3QuZ2V0KCdDb25uZWN0aW9uJyk/LnRvTG93ZXJDYXNlKCkgIT09ICd1cGdyYWRlJykge1xuICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih3cywgJ1NlcnZlciBkaWQgbm90IHNldCBDb25uZWN0aW9uIGhlYWRlciB0byBcInVwZ3JhZGVcIi4nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gNC4gSWYgdGhlIHJlc3BvbnNlIGxhY2tzIGEgfFNlYy1XZWJTb2NrZXQtQWNjZXB0fCBoZWFkZXIgZmllbGQgb3JcbiAgICAgIC8vICAgIHRoZSB8U2VjLVdlYlNvY2tldC1BY2NlcHR8IGNvbnRhaW5zIGEgdmFsdWUgb3RoZXIgdGhhbiB0aGVcbiAgICAgIC8vICAgIGJhc2U2NC1lbmNvZGVkIFNIQS0xIG9mIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSB8U2VjLVdlYlNvY2tldC1cbiAgICAgIC8vICAgIEtleXwgKGFzIGEgc3RyaW5nLCBub3QgYmFzZTY0LWRlY29kZWQpIHdpdGggdGhlIHN0cmluZyBcIjI1OEVBRkE1LVxuICAgICAgLy8gICAgRTkxNC00N0RBLTk1Q0EtQzVBQjBEQzg1QjExXCIgYnV0IGlnbm9yaW5nIGFueSBsZWFkaW5nIGFuZFxuICAgICAgLy8gICAgdHJhaWxpbmcgd2hpdGVzcGFjZSwgdGhlIGNsaWVudCBNVVNUIF9GYWlsIHRoZSBXZWJTb2NrZXRcbiAgICAgIC8vICAgIENvbm5lY3Rpb25fLlxuICAgICAgY29uc3Qgc2VjV1NBY2NlcHQgPSByZXNwb25zZS5oZWFkZXJzTGlzdC5nZXQoJ1NlYy1XZWJTb2NrZXQtQWNjZXB0JylcbiAgICAgIGNvbnN0IGRpZ2VzdCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGExJykudXBkYXRlKGtleVZhbHVlICsgdWlkKS5kaWdlc3QoJ2Jhc2U2NCcpXG4gICAgICBpZiAoc2VjV1NBY2NlcHQgIT09IGRpZ2VzdCkge1xuICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih3cywgJ0luY29ycmVjdCBoYXNoIHJlY2VpdmVkIGluIFNlYy1XZWJTb2NrZXQtQWNjZXB0IGhlYWRlci4nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gNS4gSWYgdGhlIHJlc3BvbnNlIGluY2x1ZGVzIGEgfFNlYy1XZWJTb2NrZXQtRXh0ZW5zaW9uc3wgaGVhZGVyXG4gICAgICAvLyAgICBmaWVsZCBhbmQgdGhpcyBoZWFkZXIgZmllbGQgaW5kaWNhdGVzIHRoZSB1c2Ugb2YgYW4gZXh0ZW5zaW9uXG4gICAgICAvLyAgICB0aGF0IHdhcyBub3QgcHJlc2VudCBpbiB0aGUgY2xpZW50J3MgaGFuZHNoYWtlICh0aGUgc2VydmVyIGhhc1xuICAgICAgLy8gICAgaW5kaWNhdGVkIGFuIGV4dGVuc2lvbiBub3QgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQpLCB0aGUgY2xpZW50XG4gICAgICAvLyAgICBNVVNUIF9GYWlsIHRoZSBXZWJTb2NrZXQgQ29ubmVjdGlvbl8uICAoVGhlIHBhcnNpbmcgb2YgdGhpc1xuICAgICAgLy8gICAgaGVhZGVyIGZpZWxkIHRvIGRldGVybWluZSB3aGljaCBleHRlbnNpb25zIGFyZSByZXF1ZXN0ZWQgaXNcbiAgICAgIC8vICAgIGRpc2N1c3NlZCBpbiBTZWN0aW9uIDkuMS4pXG4gICAgICBjb25zdCBzZWNFeHRlbnNpb24gPSByZXNwb25zZS5oZWFkZXJzTGlzdC5nZXQoJ1NlYy1XZWJTb2NrZXQtRXh0ZW5zaW9ucycpXG4gICAgICBsZXQgZXh0ZW5zaW9uc1xuXG4gICAgICBpZiAoc2VjRXh0ZW5zaW9uICE9PSBudWxsKSB7XG4gICAgICAgIGV4dGVuc2lvbnMgPSBwYXJzZUV4dGVuc2lvbnMoc2VjRXh0ZW5zaW9uKVxuXG4gICAgICAgIGlmICghZXh0ZW5zaW9ucy5oYXMoJ3Blcm1lc3NhZ2UtZGVmbGF0ZScpKSB7XG4gICAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24od3MsICdTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnMgaGVhZGVyIGRvZXMgbm90IG1hdGNoLicpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gNi4gSWYgdGhlIHJlc3BvbnNlIGluY2x1ZGVzIGEgfFNlYy1XZWJTb2NrZXQtUHJvdG9jb2x8IGhlYWRlciBmaWVsZFxuICAgICAgLy8gICAgYW5kIHRoaXMgaGVhZGVyIGZpZWxkIGluZGljYXRlcyB0aGUgdXNlIG9mIGEgc3VicHJvdG9jb2wgdGhhdCB3YXNcbiAgICAgIC8vICAgIG5vdCBwcmVzZW50IGluIHRoZSBjbGllbnQncyBoYW5kc2hha2UgKHRoZSBzZXJ2ZXIgaGFzIGluZGljYXRlZCBhXG4gICAgICAvLyAgICBzdWJwcm90b2NvbCBub3QgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQpLCB0aGUgY2xpZW50IE1VU1QgX0ZhaWxcbiAgICAgIC8vICAgIHRoZSBXZWJTb2NrZXQgQ29ubmVjdGlvbl8uXG4gICAgICBjb25zdCBzZWNQcm90b2NvbCA9IHJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgnU2VjLVdlYlNvY2tldC1Qcm90b2NvbCcpXG5cbiAgICAgIGlmIChzZWNQcm90b2NvbCAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCByZXF1ZXN0UHJvdG9jb2xzID0gZ2V0RGVjb2RlU3BsaXQoJ3NlYy13ZWJzb2NrZXQtcHJvdG9jb2wnLCByZXF1ZXN0LmhlYWRlcnNMaXN0KVxuXG4gICAgICAgIC8vIFRoZSBjbGllbnQgY2FuIHJlcXVlc3QgdGhhdCB0aGUgc2VydmVyIHVzZSBhIHNwZWNpZmljIHN1YnByb3RvY29sIGJ5XG4gICAgICAgIC8vIGluY2x1ZGluZyB0aGUgfFNlYy1XZWJTb2NrZXQtUHJvdG9jb2x8IGZpZWxkIGluIGl0cyBoYW5kc2hha2UuICBJZiBpdFxuICAgICAgICAvLyBpcyBzcGVjaWZpZWQsIHRoZSBzZXJ2ZXIgbmVlZHMgdG8gaW5jbHVkZSB0aGUgc2FtZSBmaWVsZCBhbmQgb25lIG9mXG4gICAgICAgIC8vIHRoZSBzZWxlY3RlZCBzdWJwcm90b2NvbCB2YWx1ZXMgaW4gaXRzIHJlc3BvbnNlIGZvciB0aGUgY29ubmVjdGlvbiB0b1xuICAgICAgICAvLyBiZSBlc3RhYmxpc2hlZC5cbiAgICAgICAgaWYgKCFyZXF1ZXN0UHJvdG9jb2xzLmluY2x1ZGVzKHNlY1Byb3RvY29sKSkge1xuICAgICAgICAgIGZhaWxXZWJzb2NrZXRDb25uZWN0aW9uKHdzLCAnUHJvdG9jb2wgd2FzIG5vdCBzZXQgaW4gdGhlIG9wZW5pbmcgaGFuZHNoYWtlLicpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzcG9uc2Uuc29ja2V0Lm9uKCdkYXRhJywgb25Tb2NrZXREYXRhKVxuICAgICAgcmVzcG9uc2Uuc29ja2V0Lm9uKCdjbG9zZScsIG9uU29ja2V0Q2xvc2UpXG4gICAgICByZXNwb25zZS5zb2NrZXQub24oJ2Vycm9yJywgb25Tb2NrZXRFcnJvcilcblxuICAgICAgaWYgKGNoYW5uZWxzLm9wZW4uaGFzU3Vic2NyaWJlcnMpIHtcbiAgICAgICAgY2hhbm5lbHMub3Blbi5wdWJsaXNoKHtcbiAgICAgICAgICBhZGRyZXNzOiByZXNwb25zZS5zb2NrZXQuYWRkcmVzcygpLFxuICAgICAgICAgIHByb3RvY29sOiBzZWNQcm90b2NvbCxcbiAgICAgICAgICBleHRlbnNpb25zOiBzZWNFeHRlbnNpb25cbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgb25Fc3RhYmxpc2gocmVzcG9uc2UsIGV4dGVuc2lvbnMpXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBjb250cm9sbGVyXG59XG5cbmZ1bmN0aW9uIGNsb3NlV2ViU29ja2V0Q29ubmVjdGlvbiAod3MsIGNvZGUsIHJlYXNvbiwgcmVhc29uQnl0ZUxlbmd0aCkge1xuICBpZiAoaXNDbG9zaW5nKHdzKSB8fCBpc0Nsb3NlZCh3cykpIHtcbiAgICAvLyBJZiB0aGlzJ3MgcmVhZHkgc3RhdGUgaXMgQ0xPU0lORyAoMikgb3IgQ0xPU0VEICgzKVxuICAgIC8vIERvIG5vdGhpbmcuXG4gIH0gZWxzZSBpZiAoIWlzRXN0YWJsaXNoZWQod3MpKSB7XG4gICAgLy8gSWYgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIGlzIG5vdCB5ZXQgZXN0YWJsaXNoZWRcbiAgICAvLyBGYWlsIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBhbmQgc2V0IHRoaXMncyByZWFkeSBzdGF0ZVxuICAgIC8vIHRvIENMT1NJTkcgKDIpLlxuICAgIGZhaWxXZWJzb2NrZXRDb25uZWN0aW9uKHdzLCAnQ29ubmVjdGlvbiB3YXMgY2xvc2VkIGJlZm9yZSBpdCB3YXMgZXN0YWJsaXNoZWQuJylcbiAgICB3c1trUmVhZHlTdGF0ZV0gPSBzdGF0ZXMuQ0xPU0lOR1xuICB9IGVsc2UgaWYgKHdzW2tTZW50Q2xvc2VdID09PSBzZW50Q2xvc2VGcmFtZVN0YXRlLk5PVF9TRU5UKSB7XG4gICAgLy8gSWYgdGhlIFdlYlNvY2tldCBjbG9zaW5nIGhhbmRzaGFrZSBoYXMgbm90IHlldCBiZWVuIHN0YXJ0ZWRcbiAgICAvLyBTdGFydCB0aGUgV2ViU29ja2V0IGNsb3NpbmcgaGFuZHNoYWtlIGFuZCBzZXQgdGhpcydzIHJlYWR5XG4gICAgLy8gc3RhdGUgdG8gQ0xPU0lORyAoMikuXG4gICAgLy8gLSBJZiBuZWl0aGVyIGNvZGUgbm9yIHJlYXNvbiBpcyBwcmVzZW50LCB0aGUgV2ViU29ja2V0IENsb3NlXG4gICAgLy8gICBtZXNzYWdlIG11c3Qgbm90IGhhdmUgYSBib2R5LlxuICAgIC8vIC0gSWYgY29kZSBpcyBwcmVzZW50LCB0aGVuIHRoZSBzdGF0dXMgY29kZSB0byB1c2UgaW4gdGhlXG4gICAgLy8gICBXZWJTb2NrZXQgQ2xvc2UgbWVzc2FnZSBtdXN0IGJlIHRoZSBpbnRlZ2VyIGdpdmVuIGJ5IGNvZGUuXG4gICAgLy8gLSBJZiByZWFzb24gaXMgYWxzbyBwcmVzZW50LCB0aGVuIHJlYXNvbkJ5dGVzIG11c3QgYmVcbiAgICAvLyAgIHByb3ZpZGVkIGluIHRoZSBDbG9zZSBtZXNzYWdlIGFmdGVyIHRoZSBzdGF0dXMgY29kZS5cblxuICAgIHdzW2tTZW50Q2xvc2VdID0gc2VudENsb3NlRnJhbWVTdGF0ZS5QUk9DRVNTSU5HXG5cbiAgICBjb25zdCBmcmFtZSA9IG5ldyBXZWJzb2NrZXRGcmFtZVNlbmQoKVxuXG4gICAgLy8gSWYgbmVpdGhlciBjb2RlIG5vciByZWFzb24gaXMgcHJlc2VudCwgdGhlIFdlYlNvY2tldCBDbG9zZVxuICAgIC8vIG1lc3NhZ2UgbXVzdCBub3QgaGF2ZSBhIGJvZHkuXG5cbiAgICAvLyBJZiBjb2RlIGlzIHByZXNlbnQsIHRoZW4gdGhlIHN0YXR1cyBjb2RlIHRvIHVzZSBpbiB0aGVcbiAgICAvLyBXZWJTb2NrZXQgQ2xvc2UgbWVzc2FnZSBtdXN0IGJlIHRoZSBpbnRlZ2VyIGdpdmVuIGJ5IGNvZGUuXG4gICAgaWYgKGNvZGUgIT09IHVuZGVmaW5lZCAmJiByZWFzb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZnJhbWUuZnJhbWVEYXRhID0gQnVmZmVyLmFsbG9jVW5zYWZlKDIpXG4gICAgICBmcmFtZS5mcmFtZURhdGEud3JpdGVVSW50MTZCRShjb2RlLCAwKVxuICAgIH0gZWxzZSBpZiAoY29kZSAhPT0gdW5kZWZpbmVkICYmIHJlYXNvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBJZiByZWFzb24gaXMgYWxzbyBwcmVzZW50LCB0aGVuIHJlYXNvbkJ5dGVzIG11c3QgYmVcbiAgICAgIC8vIHByb3ZpZGVkIGluIHRoZSBDbG9zZSBtZXNzYWdlIGFmdGVyIHRoZSBzdGF0dXMgY29kZS5cbiAgICAgIGZyYW1lLmZyYW1lRGF0YSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgyICsgcmVhc29uQnl0ZUxlbmd0aClcbiAgICAgIGZyYW1lLmZyYW1lRGF0YS53cml0ZVVJbnQxNkJFKGNvZGUsIDApXG4gICAgICAvLyB0aGUgYm9keSBNQVkgY29udGFpbiBVVEYtOC1lbmNvZGVkIGRhdGEgd2l0aCB2YWx1ZSAvcmVhc29uL1xuICAgICAgZnJhbWUuZnJhbWVEYXRhLndyaXRlKHJlYXNvbiwgMiwgJ3V0Zi04JylcbiAgICB9IGVsc2Uge1xuICAgICAgZnJhbWUuZnJhbWVEYXRhID0gZW1wdHlCdWZmZXJcbiAgICB9XG5cbiAgICAvKiogQHR5cGUge2ltcG9ydCgnc3RyZWFtJykuRHVwbGV4fSAqL1xuICAgIGNvbnN0IHNvY2tldCA9IHdzW2tSZXNwb25zZV0uc29ja2V0XG5cbiAgICBzb2NrZXQud3JpdGUoZnJhbWUuY3JlYXRlRnJhbWUob3Bjb2Rlcy5DTE9TRSkpXG5cbiAgICB3c1trU2VudENsb3NlXSA9IHNlbnRDbG9zZUZyYW1lU3RhdGUuU0VOVFxuXG4gICAgLy8gVXBvbiBlaXRoZXIgc2VuZGluZyBvciByZWNlaXZpbmcgYSBDbG9zZSBjb250cm9sIGZyYW1lLCBpdCBpcyBzYWlkXG4gICAgLy8gdGhhdCBfVGhlIFdlYlNvY2tldCBDbG9zaW5nIEhhbmRzaGFrZSBpcyBTdGFydGVkXyBhbmQgdGhhdCB0aGVcbiAgICAvLyBXZWJTb2NrZXQgY29ubmVjdGlvbiBpcyBpbiB0aGUgQ0xPU0lORyBzdGF0ZS5cbiAgICB3c1trUmVhZHlTdGF0ZV0gPSBzdGF0ZXMuQ0xPU0lOR1xuICB9IGVsc2Uge1xuICAgIC8vIE90aGVyd2lzZVxuICAgIC8vIFNldCB0aGlzJ3MgcmVhZHkgc3RhdGUgdG8gQ0xPU0lORyAoMikuXG4gICAgd3Nba1JlYWR5U3RhdGVdID0gc3RhdGVzLkNMT1NJTkdcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyfSBjaHVua1xuICovXG5mdW5jdGlvbiBvblNvY2tldERhdGEgKGNodW5rKSB7XG4gIGlmICghdGhpcy53c1trQnl0ZVBhcnNlcl0ud3JpdGUoY2h1bmspKSB7XG4gICAgdGhpcy5wYXVzZSgpXG4gIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vd2Vic29ja2V0cy5zcGVjLndoYXR3Zy5vcmcvI2ZlZWRiYWNrLWZyb20tdGhlLXByb3RvY29sXG4gKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjQ1NSNzZWN0aW9uLTcuMS40XG4gKi9cbmZ1bmN0aW9uIG9uU29ja2V0Q2xvc2UgKCkge1xuICBjb25zdCB7IHdzIH0gPSB0aGlzXG4gIGNvbnN0IHsgW2tSZXNwb25zZV06IHJlc3BvbnNlIH0gPSB3c1xuXG4gIHJlc3BvbnNlLnNvY2tldC5vZmYoJ2RhdGEnLCBvblNvY2tldERhdGEpXG4gIHJlc3BvbnNlLnNvY2tldC5vZmYoJ2Nsb3NlJywgb25Tb2NrZXRDbG9zZSlcbiAgcmVzcG9uc2Uuc29ja2V0Lm9mZignZXJyb3InLCBvblNvY2tldEVycm9yKVxuXG4gIC8vIElmIHRoZSBUQ1AgY29ubmVjdGlvbiB3YXMgY2xvc2VkIGFmdGVyIHRoZVxuICAvLyBXZWJTb2NrZXQgY2xvc2luZyBoYW5kc2hha2Ugd2FzIGNvbXBsZXRlZCwgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uXG4gIC8vIGlzIHNhaWQgdG8gaGF2ZSBiZWVuIGNsb3NlZCBfY2xlYW5seV8uXG4gIGNvbnN0IHdhc0NsZWFuID0gd3Nba1NlbnRDbG9zZV0gPT09IHNlbnRDbG9zZUZyYW1lU3RhdGUuU0VOVCAmJiB3c1trUmVjZWl2ZWRDbG9zZV1cblxuICBsZXQgY29kZSA9IDEwMDVcbiAgbGV0IHJlYXNvbiA9ICcnXG5cbiAgY29uc3QgcmVzdWx0ID0gd3Nba0J5dGVQYXJzZXJdLmNsb3NpbmdJbmZvXG5cbiAgaWYgKHJlc3VsdCAmJiAhcmVzdWx0LmVycm9yKSB7XG4gICAgY29kZSA9IHJlc3VsdC5jb2RlID8/IDEwMDVcbiAgICByZWFzb24gPSByZXN1bHQucmVhc29uXG4gIH0gZWxzZSBpZiAoIXdzW2tSZWNlaXZlZENsb3NlXSkge1xuICAgIC8vIElmIF9UaGUgV2ViU29ja2V0XG4gICAgLy8gQ29ubmVjdGlvbiBpcyBDbG9zZWRfIGFuZCBubyBDbG9zZSBjb250cm9sIGZyYW1lIHdhcyByZWNlaXZlZCBieSB0aGVcbiAgICAvLyBlbmRwb2ludCAoc3VjaCBhcyBjb3VsZCBvY2N1ciBpZiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgY29ubmVjdGlvblxuICAgIC8vIGlzIGxvc3QpLCBfVGhlIFdlYlNvY2tldCBDb25uZWN0aW9uIENsb3NlIENvZGVfIGlzIGNvbnNpZGVyZWQgdG8gYmVcbiAgICAvLyAxMDA2LlxuICAgIGNvZGUgPSAxMDA2XG4gIH1cblxuICAvLyAxLiBDaGFuZ2UgdGhlIHJlYWR5IHN0YXRlIHRvIENMT1NFRCAoMykuXG4gIHdzW2tSZWFkeVN0YXRlXSA9IHN0YXRlcy5DTE9TRURcblxuICAvLyAyLiBJZiB0aGUgdXNlciBhZ2VudCB3YXMgcmVxdWlyZWQgdG8gZmFpbCB0aGUgV2ViU29ja2V0XG4gIC8vICAgIGNvbm5lY3Rpb24sIG9yIGlmIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiB3YXMgY2xvc2VkXG4gIC8vICAgIGFmdGVyIGJlaW5nIGZsYWdnZWQgYXMgZnVsbCwgZmlyZSBhbiBldmVudCBuYW1lZCBlcnJvclxuICAvLyAgICBhdCB0aGUgV2ViU29ja2V0IG9iamVjdC5cbiAgLy8gVE9ET1xuXG4gIC8vIDMuIEZpcmUgYW4gZXZlbnQgbmFtZWQgY2xvc2UgYXQgdGhlIFdlYlNvY2tldCBvYmplY3QsXG4gIC8vICAgIHVzaW5nIENsb3NlRXZlbnQsIHdpdGggdGhlIHdhc0NsZWFuIGF0dHJpYnV0ZVxuICAvLyAgICBpbml0aWFsaXplZCB0byB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIGNsb3NlZCBjbGVhbmx5XG4gIC8vICAgIGFuZCBmYWxzZSBvdGhlcndpc2UsIHRoZSBjb2RlIGF0dHJpYnV0ZSBpbml0aWFsaXplZCB0b1xuICAvLyAgICB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gY2xvc2UgY29kZSwgYW5kIHRoZSByZWFzb25cbiAgLy8gICAgYXR0cmlidXRlIGluaXRpYWxpemVkIHRvIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgVVRGLThcbiAgLy8gICAgZGVjb2RlIHdpdGhvdXQgQk9NIHRvIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBjbG9zZVxuICAvLyAgICByZWFzb24uXG4gIC8vIFRPRE86IHByb2Nlc3MubmV4dFRpY2tcbiAgZmlyZUV2ZW50KCdjbG9zZScsIHdzLCAodHlwZSwgaW5pdCkgPT4gbmV3IENsb3NlRXZlbnQodHlwZSwgaW5pdCksIHtcbiAgICB3YXNDbGVhbiwgY29kZSwgcmVhc29uXG4gIH0pXG5cbiAgaWYgKGNoYW5uZWxzLmNsb3NlLmhhc1N1YnNjcmliZXJzKSB7XG4gICAgY2hhbm5lbHMuY2xvc2UucHVibGlzaCh7XG4gICAgICB3ZWJzb2NrZXQ6IHdzLFxuICAgICAgY29kZSxcbiAgICAgIHJlYXNvblxuICAgIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gb25Tb2NrZXRFcnJvciAoZXJyb3IpIHtcbiAgY29uc3QgeyB3cyB9ID0gdGhpc1xuXG4gIHdzW2tSZWFkeVN0YXRlXSA9IHN0YXRlcy5DTE9TSU5HXG5cbiAgaWYgKGNoYW5uZWxzLnNvY2tldEVycm9yLmhhc1N1YnNjcmliZXJzKSB7XG4gICAgY2hhbm5lbHMuc29ja2V0RXJyb3IucHVibGlzaChlcnJvcilcbiAgfVxuXG4gIHRoaXMuZGVzdHJveSgpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBlc3RhYmxpc2hXZWJTb2NrZXRDb25uZWN0aW9uLFxuICBjbG9zZVdlYlNvY2tldENvbm5lY3Rpb25cbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IGNyZWF0ZUluZmxhdGVSYXcsIFpfREVGQVVMVF9XSU5ET1dCSVRTIH0gPSByZXF1aXJlKCdub2RlOnpsaWInKVxuY29uc3QgeyBpc1ZhbGlkQ2xpZW50V2luZG93Qml0cyB9ID0gcmVxdWlyZSgnLi91dGlsJylcblxuY29uc3QgdGFpbCA9IEJ1ZmZlci5mcm9tKFsweDAwLCAweDAwLCAweGZmLCAweGZmXSlcbmNvbnN0IGtCdWZmZXIgPSBTeW1ib2woJ2tCdWZmZXInKVxuY29uc3Qga0xlbmd0aCA9IFN5bWJvbCgna0xlbmd0aCcpXG5cbmNsYXNzIFBlck1lc3NhZ2VEZWZsYXRlIHtcbiAgLyoqIEB0eXBlIHtpbXBvcnQoJ25vZGU6emxpYicpLkluZmxhdGVSYXd9ICovXG4gICNpbmZsYXRlXG5cbiAgI29wdGlvbnMgPSB7fVxuXG4gIGNvbnN0cnVjdG9yIChleHRlbnNpb25zKSB7XG4gICAgdGhpcy4jb3B0aW9ucy5zZXJ2ZXJOb0NvbnRleHRUYWtlb3ZlciA9IGV4dGVuc2lvbnMuaGFzKCdzZXJ2ZXJfbm9fY29udGV4dF90YWtlb3ZlcicpXG4gICAgdGhpcy4jb3B0aW9ucy5zZXJ2ZXJNYXhXaW5kb3dCaXRzID0gZXh0ZW5zaW9ucy5nZXQoJ3NlcnZlcl9tYXhfd2luZG93X2JpdHMnKVxuICB9XG5cbiAgZGVjb21wcmVzcyAoY2h1bmssIGZpbiwgY2FsbGJhY2spIHtcbiAgICAvLyBBbiBlbmRwb2ludCB1c2VzIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtIHRvIGRlY29tcHJlc3MgYSBtZXNzYWdlLlxuICAgIC8vIDEuICBBcHBlbmQgNCBvY3RldHMgb2YgMHgwMCAweDAwIDB4ZmYgMHhmZiB0byB0aGUgdGFpbCBlbmQgb2YgdGhlXG4gICAgLy8gICAgIHBheWxvYWQgb2YgdGhlIG1lc3NhZ2UuXG4gICAgLy8gMi4gIERlY29tcHJlc3MgdGhlIHJlc3VsdGluZyBkYXRhIHVzaW5nIERFRkxBVEUuXG5cbiAgICBpZiAoIXRoaXMuI2luZmxhdGUpIHtcbiAgICAgIGxldCB3aW5kb3dCaXRzID0gWl9ERUZBVUxUX1dJTkRPV0JJVFNcblxuICAgICAgaWYgKHRoaXMuI29wdGlvbnMuc2VydmVyTWF4V2luZG93Qml0cykgeyAvLyBlbXB0eSB2YWx1ZXMgZGVmYXVsdCB0byBaX0RFRkFVTFRfV0lORE9XQklUU1xuICAgICAgICBpZiAoIWlzVmFsaWRDbGllbnRXaW5kb3dCaXRzKHRoaXMuI29wdGlvbnMuc2VydmVyTWF4V2luZG93Qml0cykpIHtcbiAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoJ0ludmFsaWQgc2VydmVyX21heF93aW5kb3dfYml0cycpKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgd2luZG93Qml0cyA9IE51bWJlci5wYXJzZUludCh0aGlzLiNvcHRpb25zLnNlcnZlck1heFdpbmRvd0JpdHMpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuI2luZmxhdGUgPSBjcmVhdGVJbmZsYXRlUmF3KHsgd2luZG93Qml0cyB9KVxuICAgICAgdGhpcy4jaW5mbGF0ZVtrQnVmZmVyXSA9IFtdXG4gICAgICB0aGlzLiNpbmZsYXRlW2tMZW5ndGhdID0gMFxuXG4gICAgICB0aGlzLiNpbmZsYXRlLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgdGhpcy4jaW5mbGF0ZVtrQnVmZmVyXS5wdXNoKGRhdGEpXG4gICAgICAgIHRoaXMuI2luZmxhdGVba0xlbmd0aF0gKz0gZGF0YS5sZW5ndGhcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMuI2luZmxhdGUub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICB0aGlzLiNpbmZsYXRlID0gbnVsbFxuICAgICAgICBjYWxsYmFjayhlcnIpXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuI2luZmxhdGUud3JpdGUoY2h1bmspXG4gICAgaWYgKGZpbikge1xuICAgICAgdGhpcy4jaW5mbGF0ZS53cml0ZSh0YWlsKVxuICAgIH1cblxuICAgIHRoaXMuI2luZmxhdGUuZmx1c2goKCkgPT4ge1xuICAgICAgY29uc3QgZnVsbCA9IEJ1ZmZlci5jb25jYXQodGhpcy4jaW5mbGF0ZVtrQnVmZmVyXSwgdGhpcy4jaW5mbGF0ZVtrTGVuZ3RoXSlcblxuICAgICAgdGhpcy4jaW5mbGF0ZVtrQnVmZmVyXS5sZW5ndGggPSAwXG4gICAgICB0aGlzLiNpbmZsYXRlW2tMZW5ndGhdID0gMFxuXG4gICAgICBjYWxsYmFjayhudWxsLCBmdWxsKVxuICAgIH0pXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7IFBlck1lc3NhZ2VEZWZsYXRlIH1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IFdyaXRhYmxlIH0gPSByZXF1aXJlKCdub2RlOnN0cmVhbScpXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdub2RlOmFzc2VydCcpXG5jb25zdCB7IHBhcnNlclN0YXRlcywgb3Bjb2Rlcywgc3RhdGVzLCBlbXB0eUJ1ZmZlciwgc2VudENsb3NlRnJhbWVTdGF0ZSB9ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3QgeyBrUmVhZHlTdGF0ZSwga1NlbnRDbG9zZSwga1Jlc3BvbnNlLCBrUmVjZWl2ZWRDbG9zZSB9ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgY2hhbm5lbHMgfSA9IHJlcXVpcmUoJy4uLy4uL2NvcmUvZGlhZ25vc3RpY3MnKVxuY29uc3Qge1xuICBpc1ZhbGlkU3RhdHVzQ29kZSxcbiAgaXNWYWxpZE9wY29kZSxcbiAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24sXG4gIHdlYnNvY2tldE1lc3NhZ2VSZWNlaXZlZCxcbiAgdXRmOERlY29kZSxcbiAgaXNDb250cm9sRnJhbWUsXG4gIGlzVGV4dEJpbmFyeUZyYW1lLFxuICBpc0NvbnRpbnVhdGlvbkZyYW1lXG59ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHsgV2Vic29ja2V0RnJhbWVTZW5kIH0gPSByZXF1aXJlKCcuL2ZyYW1lJylcbmNvbnN0IHsgY2xvc2VXZWJTb2NrZXRDb25uZWN0aW9uIH0gPSByZXF1aXJlKCcuL2Nvbm5lY3Rpb24nKVxuY29uc3QgeyBQZXJNZXNzYWdlRGVmbGF0ZSB9ID0gcmVxdWlyZSgnLi9wZXJtZXNzYWdlLWRlZmxhdGUnKVxuXG4vLyBUaGlzIGNvZGUgd2FzIGluZmx1ZW5jZWQgYnkgd3MgcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuLy8gQ29weXJpZ2h0IChjKSAyMDExIEVpbmFyIE90dG8gU3Rhbmd2aWsgPGVpbmFyb3NAZ21haWwuY29tPlxuLy8gQ29weXJpZ2h0IChjKSAyMDEzIEFybm91dCBLYXplbWllciBhbmQgY29udHJpYnV0b3JzXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTYgTHVpZ2kgUGluY2EgYW5kIGNvbnRyaWJ1dG9yc1xuXG5jbGFzcyBCeXRlUGFyc2VyIGV4dGVuZHMgV3JpdGFibGUge1xuICAjYnVmZmVycyA9IFtdXG4gICNieXRlT2Zmc2V0ID0gMFxuICAjbG9vcCA9IGZhbHNlXG5cbiAgI3N0YXRlID0gcGFyc2VyU3RhdGVzLklORk9cblxuICAjaW5mbyA9IHt9XG4gICNmcmFnbWVudHMgPSBbXVxuXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgUGVyTWVzc2FnZURlZmxhdGU+fSAqL1xuICAjZXh0ZW5zaW9uc1xuXG4gIGNvbnN0cnVjdG9yICh3cywgZXh0ZW5zaW9ucykge1xuICAgIHN1cGVyKClcblxuICAgIHRoaXMud3MgPSB3c1xuICAgIHRoaXMuI2V4dGVuc2lvbnMgPSBleHRlbnNpb25zID09IG51bGwgPyBuZXcgTWFwKCkgOiBleHRlbnNpb25zXG5cbiAgICBpZiAodGhpcy4jZXh0ZW5zaW9ucy5oYXMoJ3Blcm1lc3NhZ2UtZGVmbGF0ZScpKSB7XG4gICAgICB0aGlzLiNleHRlbnNpb25zLnNldCgncGVybWVzc2FnZS1kZWZsYXRlJywgbmV3IFBlck1lc3NhZ2VEZWZsYXRlKGV4dGVuc2lvbnMpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gY2h1bmtcbiAgICogQHBhcmFtIHsoKSA9PiB2b2lkfSBjYWxsYmFja1xuICAgKi9cbiAgX3dyaXRlIChjaHVuaywgXywgY2FsbGJhY2spIHtcbiAgICB0aGlzLiNidWZmZXJzLnB1c2goY2h1bmspXG4gICAgdGhpcy4jYnl0ZU9mZnNldCArPSBjaHVuay5sZW5ndGhcbiAgICB0aGlzLiNsb29wID0gdHJ1ZVxuXG4gICAgdGhpcy5ydW4oY2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogUnVucyB3aGVuZXZlciBhIG5ldyBjaHVuayBpcyByZWNlaXZlZC5cbiAgICogQ2FsbGJhY2sgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZXJlIGFyZSBubyBtb3JlIGNodW5rcyBidWZmZXJpbmcsXG4gICAqIG9yIG5vdCBlbm91Z2ggYnl0ZXMgYXJlIGJ1ZmZlcmVkIHRvIHBhcnNlLlxuICAgKi9cbiAgcnVuIChjYWxsYmFjaykge1xuICAgIHdoaWxlICh0aGlzLiNsb29wKSB7XG4gICAgICBpZiAodGhpcy4jc3RhdGUgPT09IHBhcnNlclN0YXRlcy5JTkZPKSB7XG4gICAgICAgIC8vIElmIHRoZXJlIGFyZW4ndCBlbm91Z2ggYnl0ZXMgdG8gcGFyc2UgdGhlIHBheWxvYWQgbGVuZ3RoLCBldGMuXG4gICAgICAgIGlmICh0aGlzLiNieXRlT2Zmc2V0IDwgMikge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmNvbnN1bWUoMilcbiAgICAgICAgY29uc3QgZmluID0gKGJ1ZmZlclswXSAmIDB4ODApICE9PSAwXG4gICAgICAgIGNvbnN0IG9wY29kZSA9IGJ1ZmZlclswXSAmIDB4MEZcbiAgICAgICAgY29uc3QgbWFza2VkID0gKGJ1ZmZlclsxXSAmIDB4ODApID09PSAweDgwXG5cbiAgICAgICAgY29uc3QgZnJhZ21lbnRlZCA9ICFmaW4gJiYgb3Bjb2RlICE9PSBvcGNvZGVzLkNPTlRJTlVBVElPTlxuICAgICAgICBjb25zdCBwYXlsb2FkTGVuZ3RoID0gYnVmZmVyWzFdICYgMHg3RlxuXG4gICAgICAgIGNvbnN0IHJzdjEgPSBidWZmZXJbMF0gJiAweDQwXG4gICAgICAgIGNvbnN0IHJzdjIgPSBidWZmZXJbMF0gJiAweDIwXG4gICAgICAgIGNvbnN0IHJzdjMgPSBidWZmZXJbMF0gJiAweDEwXG5cbiAgICAgICAgaWYgKCFpc1ZhbGlkT3Bjb2RlKG9wY29kZSkpIHtcbiAgICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih0aGlzLndzLCAnSW52YWxpZCBvcGNvZGUgcmVjZWl2ZWQnKVxuICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWFza2VkKSB7XG4gICAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24odGhpcy53cywgJ0ZyYW1lIGNhbm5vdCBiZSBtYXNrZWQnKVxuICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBNVVNUIGJlIDAgdW5sZXNzIGFuIGV4dGVuc2lvbiBpcyBuZWdvdGlhdGVkIHRoYXQgZGVmaW5lcyBtZWFuaW5nc1xuICAgICAgICAvLyBmb3Igbm9uLXplcm8gdmFsdWVzLiAgSWYgYSBub256ZXJvIHZhbHVlIGlzIHJlY2VpdmVkIGFuZCBub25lIG9mXG4gICAgICAgIC8vIHRoZSBuZWdvdGlhdGVkIGV4dGVuc2lvbnMgZGVmaW5lcyB0aGUgbWVhbmluZyBvZiBzdWNoIGEgbm9uemVyb1xuICAgICAgICAvLyB2YWx1ZSwgdGhlIHJlY2VpdmluZyBlbmRwb2ludCBNVVNUIF9GYWlsIHRoZSBXZWJTb2NrZXRcbiAgICAgICAgLy8gQ29ubmVjdGlvbl8uXG4gICAgICAgIC8vIFRoaXMgZG9jdW1lbnQgYWxsb2NhdGVzIHRoZSBSU1YxIGJpdCBvZiB0aGUgV2ViU29ja2V0IGhlYWRlciBmb3JcbiAgICAgICAgLy8gUE1DRXMgYW5kIGNhbGxzIHRoZSBiaXQgdGhlIFwiUGVyLU1lc3NhZ2UgQ29tcHJlc3NlZFwiIGJpdC4gIE9uIGFcbiAgICAgICAgLy8gV2ViU29ja2V0IGNvbm5lY3Rpb24gd2hlcmUgYSBQTUNFIGlzIGluIHVzZSwgdGhpcyBiaXQgaW5kaWNhdGVzXG4gICAgICAgIC8vIHdoZXRoZXIgYSBtZXNzYWdlIGlzIGNvbXByZXNzZWQgb3Igbm90LlxuICAgICAgICBpZiAocnN2MSAhPT0gMCAmJiAhdGhpcy4jZXh0ZW5zaW9ucy5oYXMoJ3Blcm1lc3NhZ2UtZGVmbGF0ZScpKSB7XG4gICAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24odGhpcy53cywgJ0V4cGVjdGVkIFJTVjEgdG8gYmUgY2xlYXIuJylcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyc3YyICE9PSAwIHx8IHJzdjMgIT09IDApIHtcbiAgICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih0aGlzLndzLCAnUlNWMSwgUlNWMiwgUlNWMyBtdXN0IGJlIGNsZWFyJylcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmcmFnbWVudGVkICYmICFpc1RleHRCaW5hcnlGcmFtZShvcGNvZGUpKSB7XG4gICAgICAgICAgLy8gT25seSB0ZXh0IGFuZCBiaW5hcnkgZnJhbWVzIGNhbiBiZSBmcmFnbWVudGVkXG4gICAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24odGhpcy53cywgJ0ludmFsaWQgZnJhbWUgdHlwZSB3YXMgZnJhZ21lbnRlZC4nKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgd2UgYXJlIGFscmVhZHkgcGFyc2luZyBhIHRleHQvYmluYXJ5IGZyYW1lIGFuZCBkbyBub3QgcmVjZWl2ZSBlaXRoZXJcbiAgICAgICAgLy8gYSBjb250aW51YXRpb24gZnJhbWUgb3IgY2xvc2UgZnJhbWUsIGZhaWwgdGhlIGNvbm5lY3Rpb24uXG4gICAgICAgIGlmIChpc1RleHRCaW5hcnlGcmFtZShvcGNvZGUpICYmIHRoaXMuI2ZyYWdtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24odGhpcy53cywgJ0V4cGVjdGVkIGNvbnRpbnVhdGlvbiBmcmFtZScpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy4jaW5mby5mcmFnbWVudGVkICYmIGZyYWdtZW50ZWQpIHtcbiAgICAgICAgICAvLyBBIGZyYWdtZW50ZWQgZnJhbWUgY2FuJ3QgYmUgZnJhZ21lbnRlZCBpdHNlbGZcbiAgICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih0aGlzLndzLCAnRnJhZ21lbnRlZCBmcmFtZSBleGNlZWRlZCAxMjUgYnl0ZXMuJylcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFwiQWxsIGNvbnRyb2wgZnJhbWVzIE1VU1QgaGF2ZSBhIHBheWxvYWQgbGVuZ3RoIG9mIDEyNSBieXRlcyBvciBsZXNzXG4gICAgICAgIC8vIGFuZCBNVVNUIE5PVCBiZSBmcmFnbWVudGVkLlwiXG4gICAgICAgIGlmICgocGF5bG9hZExlbmd0aCA+IDEyNSB8fCBmcmFnbWVudGVkKSAmJiBpc0NvbnRyb2xGcmFtZShvcGNvZGUpKSB7XG4gICAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24odGhpcy53cywgJ0NvbnRyb2wgZnJhbWUgZWl0aGVyIHRvbyBsYXJnZSBvciBmcmFnbWVudGVkJylcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0NvbnRpbnVhdGlvbkZyYW1lKG9wY29kZSkgJiYgdGhpcy4jZnJhZ21lbnRzLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy4jaW5mby5jb21wcmVzc2VkKSB7XG4gICAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24odGhpcy53cywgJ1VuZXhwZWN0ZWQgY29udGludWF0aW9uIGZyYW1lJylcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXlsb2FkTGVuZ3RoIDw9IDEyNSkge1xuICAgICAgICAgIHRoaXMuI2luZm8ucGF5bG9hZExlbmd0aCA9IHBheWxvYWRMZW5ndGhcbiAgICAgICAgICB0aGlzLiNzdGF0ZSA9IHBhcnNlclN0YXRlcy5SRUFEX0RBVEFcbiAgICAgICAgfSBlbHNlIGlmIChwYXlsb2FkTGVuZ3RoID09PSAxMjYpIHtcbiAgICAgICAgICB0aGlzLiNzdGF0ZSA9IHBhcnNlclN0YXRlcy5QQVlMT0FETEVOR1RIXzE2XG4gICAgICAgIH0gZWxzZSBpZiAocGF5bG9hZExlbmd0aCA9PT0gMTI3KSB7XG4gICAgICAgICAgdGhpcy4jc3RhdGUgPSBwYXJzZXJTdGF0ZXMuUEFZTE9BRExFTkdUSF82NFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzVGV4dEJpbmFyeUZyYW1lKG9wY29kZSkpIHtcbiAgICAgICAgICB0aGlzLiNpbmZvLmJpbmFyeVR5cGUgPSBvcGNvZGVcbiAgICAgICAgICB0aGlzLiNpbmZvLmNvbXByZXNzZWQgPSByc3YxICE9PSAwXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLiNpbmZvLm9wY29kZSA9IG9wY29kZVxuICAgICAgICB0aGlzLiNpbmZvLm1hc2tlZCA9IG1hc2tlZFxuICAgICAgICB0aGlzLiNpbmZvLmZpbiA9IGZpblxuICAgICAgICB0aGlzLiNpbmZvLmZyYWdtZW50ZWQgPSBmcmFnbWVudGVkXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuI3N0YXRlID09PSBwYXJzZXJTdGF0ZXMuUEFZTE9BRExFTkdUSF8xNikge1xuICAgICAgICBpZiAodGhpcy4jYnl0ZU9mZnNldCA8IDIpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5jb25zdW1lKDIpXG5cbiAgICAgICAgdGhpcy4jaW5mby5wYXlsb2FkTGVuZ3RoID0gYnVmZmVyLnJlYWRVSW50MTZCRSgwKVxuICAgICAgICB0aGlzLiNzdGF0ZSA9IHBhcnNlclN0YXRlcy5SRUFEX0RBVEFcbiAgICAgIH0gZWxzZSBpZiAodGhpcy4jc3RhdGUgPT09IHBhcnNlclN0YXRlcy5QQVlMT0FETEVOR1RIXzY0KSB7XG4gICAgICAgIGlmICh0aGlzLiNieXRlT2Zmc2V0IDwgOCkge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmNvbnN1bWUoOClcbiAgICAgICAgY29uc3QgdXBwZXIgPSBidWZmZXIucmVhZFVJbnQzMkJFKDApXG5cbiAgICAgICAgLy8gMl4zMSBpcyB0aGUgbWF4aW11bSBieXRlcyBhbiBhcnJheWJ1ZmZlciBjYW4gY29udGFpblxuICAgICAgICAvLyBvbiAzMi1iaXQgc3lzdGVtcy4gQWx0aG91Z2gsIG9uIDY0LWJpdCBzeXN0ZW1zLCB0aGlzIGlzXG4gICAgICAgIC8vIDJeNTMtMSBieXRlcy5cbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvRXJyb3JzL0ludmFsaWRfYXJyYXlfbGVuZ3RoXG4gICAgICAgIC8vIGh0dHBzOi8vc291cmNlLmNocm9taXVtLm9yZy9jaHJvbWl1bS9jaHJvbWl1bS9zcmMvKy9tYWluOnY4L3NyYy9jb21tb24vZ2xvYmFscy5oO2RyYz0xOTQ2MjEyYWMwMTAwNjY4ZjE0ZWI5ZTI4NDNiZGQ4NDZlNTEwYTFlO2Jwdj0xO2JwdD0xO2w9MTI3NVxuICAgICAgICAvLyBodHRwczovL3NvdXJjZS5jaHJvbWl1bS5vcmcvY2hyb21pdW0vY2hyb21pdW0vc3JjLysvbWFpbjp2OC9zcmMvb2JqZWN0cy9qcy1hcnJheS1idWZmZXIuaDtsPTM0O2RyYz0xOTQ2MjEyYWMwMTAwNjY4ZjE0ZWI5ZTI4NDNiZGQ4NDZlNTEwYTFlXG4gICAgICAgIGlmICh1cHBlciA+IDIgKiogMzEgLSAxKSB7XG4gICAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24odGhpcy53cywgJ1JlY2VpdmVkIHBheWxvYWQgbGVuZ3RoID4gMl4zMSBieXRlcy4nKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG93ZXIgPSBidWZmZXIucmVhZFVJbnQzMkJFKDQpXG5cbiAgICAgICAgdGhpcy4jaW5mby5wYXlsb2FkTGVuZ3RoID0gKHVwcGVyIDw8IDgpICsgbG93ZXJcbiAgICAgICAgdGhpcy4jc3RhdGUgPSBwYXJzZXJTdGF0ZXMuUkVBRF9EQVRBXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuI3N0YXRlID09PSBwYXJzZXJTdGF0ZXMuUkVBRF9EQVRBKSB7XG4gICAgICAgIGlmICh0aGlzLiNieXRlT2Zmc2V0IDwgdGhpcy4jaW5mby5wYXlsb2FkTGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLmNvbnN1bWUodGhpcy4jaW5mby5wYXlsb2FkTGVuZ3RoKVxuXG4gICAgICAgIGlmIChpc0NvbnRyb2xGcmFtZSh0aGlzLiNpbmZvLm9wY29kZSkpIHtcbiAgICAgICAgICB0aGlzLiNsb29wID0gdGhpcy5wYXJzZUNvbnRyb2xGcmFtZShib2R5KVxuICAgICAgICAgIHRoaXMuI3N0YXRlID0gcGFyc2VyU3RhdGVzLklORk9cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIXRoaXMuI2luZm8uY29tcHJlc3NlZCkge1xuICAgICAgICAgICAgdGhpcy4jZnJhZ21lbnRzLnB1c2goYm9keSlcblxuICAgICAgICAgICAgLy8gSWYgdGhlIGZyYW1lIGlzIG5vdCBmcmFnbWVudGVkLCBhIG1lc3NhZ2UgaGFzIGJlZW4gcmVjZWl2ZWQuXG4gICAgICAgICAgICAvLyBJZiB0aGUgZnJhbWUgaXMgZnJhZ21lbnRlZCwgaXQgd2lsbCB0ZXJtaW5hdGUgd2l0aCBhIGZpbiBiaXQgc2V0XG4gICAgICAgICAgICAvLyBhbmQgYW4gb3Bjb2RlIG9mIDAgKGNvbnRpbnVhdGlvbiksIHRoZXJlZm9yZSB3ZSBoYW5kbGUgdGhhdCB3aGVuXG4gICAgICAgICAgICAvLyBwYXJzaW5nIGNvbnRpbnVhdGlvbiBmcmFtZXMsIG5vdCBoZXJlLlxuICAgICAgICAgICAgaWYgKCF0aGlzLiNpbmZvLmZyYWdtZW50ZWQgJiYgdGhpcy4jaW5mby5maW4pIHtcbiAgICAgICAgICAgICAgY29uc3QgZnVsbE1lc3NhZ2UgPSBCdWZmZXIuY29uY2F0KHRoaXMuI2ZyYWdtZW50cylcbiAgICAgICAgICAgICAgd2Vic29ja2V0TWVzc2FnZVJlY2VpdmVkKHRoaXMud3MsIHRoaXMuI2luZm8uYmluYXJ5VHlwZSwgZnVsbE1lc3NhZ2UpXG4gICAgICAgICAgICAgIHRoaXMuI2ZyYWdtZW50cy5sZW5ndGggPSAwXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuI3N0YXRlID0gcGFyc2VyU3RhdGVzLklORk9cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jZXh0ZW5zaW9ucy5nZXQoJ3Blcm1lc3NhZ2UtZGVmbGF0ZScpLmRlY29tcHJlc3MoYm9keSwgdGhpcy4jaW5mby5maW4sIChlcnJvciwgZGF0YSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjbG9zZVdlYlNvY2tldENvbm5lY3Rpb24odGhpcy53cywgMTAwNywgZXJyb3IubWVzc2FnZSwgZXJyb3IubWVzc2FnZS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB0aGlzLiNmcmFnbWVudHMucHVzaChkYXRhKVxuXG4gICAgICAgICAgICAgIGlmICghdGhpcy4jaW5mby5maW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNzdGF0ZSA9IHBhcnNlclN0YXRlcy5JTkZPXG4gICAgICAgICAgICAgICAgdGhpcy4jbG9vcCA9IHRydWVcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bihjYWxsYmFjaylcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHdlYnNvY2tldE1lc3NhZ2VSZWNlaXZlZCh0aGlzLndzLCB0aGlzLiNpbmZvLmJpbmFyeVR5cGUsIEJ1ZmZlci5jb25jYXQodGhpcy4jZnJhZ21lbnRzKSlcblxuICAgICAgICAgICAgICB0aGlzLiNsb29wID0gdHJ1ZVxuICAgICAgICAgICAgICB0aGlzLiNzdGF0ZSA9IHBhcnNlclN0YXRlcy5JTkZPXG4gICAgICAgICAgICAgIHRoaXMuI2ZyYWdtZW50cy5sZW5ndGggPSAwXG4gICAgICAgICAgICAgIHRoaXMucnVuKGNhbGxiYWNrKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgdGhpcy4jbG9vcCA9IGZhbHNlXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIG4gYnl0ZXMgZnJvbSB0aGUgYnVmZmVyZWQgQnVmZmVyc1xuICAgKiBAcGFyYW0ge251bWJlcn0gblxuICAgKiBAcmV0dXJucyB7QnVmZmVyfVxuICAgKi9cbiAgY29uc3VtZSAobikge1xuICAgIGlmIChuID4gdGhpcy4jYnl0ZU9mZnNldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsZWQgY29uc3VtZSgpIGJlZm9yZSBidWZmZXJzIHNhdGlhdGVkLicpXG4gICAgfSBlbHNlIGlmIChuID09PSAwKSB7XG4gICAgICByZXR1cm4gZW1wdHlCdWZmZXJcbiAgICB9XG5cbiAgICBpZiAodGhpcy4jYnVmZmVyc1swXS5sZW5ndGggPT09IG4pIHtcbiAgICAgIHRoaXMuI2J5dGVPZmZzZXQgLT0gdGhpcy4jYnVmZmVyc1swXS5sZW5ndGhcbiAgICAgIHJldHVybiB0aGlzLiNidWZmZXJzLnNoaWZ0KClcbiAgICB9XG5cbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobilcbiAgICBsZXQgb2Zmc2V0ID0gMFxuXG4gICAgd2hpbGUgKG9mZnNldCAhPT0gbikge1xuICAgICAgY29uc3QgbmV4dCA9IHRoaXMuI2J1ZmZlcnNbMF1cbiAgICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSBuZXh0XG5cbiAgICAgIGlmIChsZW5ndGggKyBvZmZzZXQgPT09IG4pIHtcbiAgICAgICAgYnVmZmVyLnNldCh0aGlzLiNidWZmZXJzLnNoaWZ0KCksIG9mZnNldClcbiAgICAgICAgYnJlYWtcbiAgICAgIH0gZWxzZSBpZiAobGVuZ3RoICsgb2Zmc2V0ID4gbikge1xuICAgICAgICBidWZmZXIuc2V0KG5leHQuc3ViYXJyYXkoMCwgbiAtIG9mZnNldCksIG9mZnNldClcbiAgICAgICAgdGhpcy4jYnVmZmVyc1swXSA9IG5leHQuc3ViYXJyYXkobiAtIG9mZnNldClcbiAgICAgICAgYnJlYWtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1ZmZlci5zZXQodGhpcy4jYnVmZmVycy5zaGlmdCgpLCBvZmZzZXQpXG4gICAgICAgIG9mZnNldCArPSBuZXh0Lmxlbmd0aFxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuI2J5dGVPZmZzZXQgLT0gblxuXG4gICAgcmV0dXJuIGJ1ZmZlclxuICB9XG5cbiAgcGFyc2VDbG9zZUJvZHkgKGRhdGEpIHtcbiAgICBhc3NlcnQoZGF0YS5sZW5ndGggIT09IDEpXG5cbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzY0NTUjc2VjdGlvbi03LjEuNVxuICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgY29kZVxuXG4gICAgaWYgKGRhdGEubGVuZ3RoID49IDIpIHtcbiAgICAgIC8vIF9UaGUgV2ViU29ja2V0IENvbm5lY3Rpb24gQ2xvc2UgQ29kZV8gaXNcbiAgICAgIC8vIGRlZmluZWQgYXMgdGhlIHN0YXR1cyBjb2RlIChTZWN0aW9uIDcuNCkgY29udGFpbmVkIGluIHRoZSBmaXJzdCBDbG9zZVxuICAgICAgLy8gY29udHJvbCBmcmFtZSByZWNlaXZlZCBieSB0aGUgYXBwbGljYXRpb25cbiAgICAgIGNvZGUgPSBkYXRhLnJlYWRVSW50MTZCRSgwKVxuICAgIH1cblxuICAgIGlmIChjb2RlICE9PSB1bmRlZmluZWQgJiYgIWlzVmFsaWRTdGF0dXNDb2RlKGNvZGUpKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiAxMDAyLCByZWFzb246ICdJbnZhbGlkIHN0YXR1cyBjb2RlJywgZXJyb3I6IHRydWUgfVxuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjQ1NSNzZWN0aW9uLTcuMS42XG4gICAgLyoqIEB0eXBlIHtCdWZmZXJ9ICovXG4gICAgbGV0IHJlYXNvbiA9IGRhdGEuc3ViYXJyYXkoMilcblxuICAgIC8vIFJlbW92ZSBCT01cbiAgICBpZiAocmVhc29uWzBdID09PSAweEVGICYmIHJlYXNvblsxXSA9PT0gMHhCQiAmJiByZWFzb25bMl0gPT09IDB4QkYpIHtcbiAgICAgIHJlYXNvbiA9IHJlYXNvbi5zdWJhcnJheSgzKVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZWFzb24gPSB1dGY4RGVjb2RlKHJlYXNvbilcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IDEwMDcsIHJlYXNvbjogJ0ludmFsaWQgVVRGLTgnLCBlcnJvcjogdHJ1ZSB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZSwgcmVhc29uLCBlcnJvcjogZmFsc2UgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBjb250cm9sIGZyYW1lcy5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IGJvZHlcbiAgICovXG4gIHBhcnNlQ29udHJvbEZyYW1lIChib2R5KSB7XG4gICAgY29uc3QgeyBvcGNvZGUsIHBheWxvYWRMZW5ndGggfSA9IHRoaXMuI2luZm9cblxuICAgIGlmIChvcGNvZGUgPT09IG9wY29kZXMuQ0xPU0UpIHtcbiAgICAgIGlmIChwYXlsb2FkTGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGZhaWxXZWJzb2NrZXRDb25uZWN0aW9uKHRoaXMud3MsICdSZWNlaXZlZCBjbG9zZSBmcmFtZSB3aXRoIGEgMS1ieXRlIGJvZHkuJylcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHRoaXMuI2luZm8uY2xvc2VJbmZvID0gdGhpcy5wYXJzZUNsb3NlQm9keShib2R5KVxuXG4gICAgICBpZiAodGhpcy4jaW5mby5jbG9zZUluZm8uZXJyb3IpIHtcbiAgICAgICAgY29uc3QgeyBjb2RlLCByZWFzb24gfSA9IHRoaXMuI2luZm8uY2xvc2VJbmZvXG5cbiAgICAgICAgY2xvc2VXZWJTb2NrZXRDb25uZWN0aW9uKHRoaXMud3MsIGNvZGUsIHJlYXNvbiwgcmVhc29uLmxlbmd0aClcbiAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24odGhpcy53cywgcmVhc29uKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMud3Nba1NlbnRDbG9zZV0gIT09IHNlbnRDbG9zZUZyYW1lU3RhdGUuU0VOVCkge1xuICAgICAgICAvLyBJZiBhbiBlbmRwb2ludCByZWNlaXZlcyBhIENsb3NlIGZyYW1lIGFuZCBkaWQgbm90IHByZXZpb3VzbHkgc2VuZCBhXG4gICAgICAgIC8vIENsb3NlIGZyYW1lLCB0aGUgZW5kcG9pbnQgTVVTVCBzZW5kIGEgQ2xvc2UgZnJhbWUgaW4gcmVzcG9uc2UuICAoV2hlblxuICAgICAgICAvLyBzZW5kaW5nIGEgQ2xvc2UgZnJhbWUgaW4gcmVzcG9uc2UsIHRoZSBlbmRwb2ludCB0eXBpY2FsbHkgZWNob3MgdGhlXG4gICAgICAgIC8vIHN0YXR1cyBjb2RlIGl0IHJlY2VpdmVkLilcbiAgICAgICAgbGV0IGJvZHkgPSBlbXB0eUJ1ZmZlclxuICAgICAgICBpZiAodGhpcy4jaW5mby5jbG9zZUluZm8uY29kZSkge1xuICAgICAgICAgIGJvZHkgPSBCdWZmZXIuYWxsb2NVbnNhZmUoMilcbiAgICAgICAgICBib2R5LndyaXRlVUludDE2QkUodGhpcy4jaW5mby5jbG9zZUluZm8uY29kZSwgMClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbG9zZUZyYW1lID0gbmV3IFdlYnNvY2tldEZyYW1lU2VuZChib2R5KVxuXG4gICAgICAgIHRoaXMud3Nba1Jlc3BvbnNlXS5zb2NrZXQud3JpdGUoXG4gICAgICAgICAgY2xvc2VGcmFtZS5jcmVhdGVGcmFtZShvcGNvZGVzLkNMT1NFKSxcbiAgICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWVycikge1xuICAgICAgICAgICAgICB0aGlzLndzW2tTZW50Q2xvc2VdID0gc2VudENsb3NlRnJhbWVTdGF0ZS5TRU5UXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8vIFVwb24gZWl0aGVyIHNlbmRpbmcgb3IgcmVjZWl2aW5nIGEgQ2xvc2UgY29udHJvbCBmcmFtZSwgaXQgaXMgc2FpZFxuICAgICAgLy8gdGhhdCBfVGhlIFdlYlNvY2tldCBDbG9zaW5nIEhhbmRzaGFrZSBpcyBTdGFydGVkXyBhbmQgdGhhdCB0aGVcbiAgICAgIC8vIFdlYlNvY2tldCBjb25uZWN0aW9uIGlzIGluIHRoZSBDTE9TSU5HIHN0YXRlLlxuICAgICAgdGhpcy53c1trUmVhZHlTdGF0ZV0gPSBzdGF0ZXMuQ0xPU0lOR1xuICAgICAgdGhpcy53c1trUmVjZWl2ZWRDbG9zZV0gPSB0cnVlXG5cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSBpZiAob3Bjb2RlID09PSBvcGNvZGVzLlBJTkcpIHtcbiAgICAgIC8vIFVwb24gcmVjZWlwdCBvZiBhIFBpbmcgZnJhbWUsIGFuIGVuZHBvaW50IE1VU1Qgc2VuZCBhIFBvbmcgZnJhbWUgaW5cbiAgICAgIC8vIHJlc3BvbnNlLCB1bmxlc3MgaXQgYWxyZWFkeSByZWNlaXZlZCBhIENsb3NlIGZyYW1lLlxuICAgICAgLy8gQSBQb25nIGZyYW1lIHNlbnQgaW4gcmVzcG9uc2UgdG8gYSBQaW5nIGZyYW1lIG11c3QgaGF2ZSBpZGVudGljYWxcbiAgICAgIC8vIFwiQXBwbGljYXRpb24gZGF0YVwiXG5cbiAgICAgIGlmICghdGhpcy53c1trUmVjZWl2ZWRDbG9zZV0pIHtcbiAgICAgICAgY29uc3QgZnJhbWUgPSBuZXcgV2Vic29ja2V0RnJhbWVTZW5kKGJvZHkpXG5cbiAgICAgICAgdGhpcy53c1trUmVzcG9uc2VdLnNvY2tldC53cml0ZShmcmFtZS5jcmVhdGVGcmFtZShvcGNvZGVzLlBPTkcpKVxuXG4gICAgICAgIGlmIChjaGFubmVscy5waW5nLmhhc1N1YnNjcmliZXJzKSB7XG4gICAgICAgICAgY2hhbm5lbHMucGluZy5wdWJsaXNoKHtcbiAgICAgICAgICAgIHBheWxvYWQ6IGJvZHlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcGNvZGUgPT09IG9wY29kZXMuUE9ORykge1xuICAgICAgLy8gQSBQb25nIGZyYW1lIE1BWSBiZSBzZW50IHVuc29saWNpdGVkLiAgVGhpcyBzZXJ2ZXMgYXMgYVxuICAgICAgLy8gdW5pZGlyZWN0aW9uYWwgaGVhcnRiZWF0LiAgQSByZXNwb25zZSB0byBhbiB1bnNvbGljaXRlZCBQb25nIGZyYW1lIGlzXG4gICAgICAvLyBub3QgZXhwZWN0ZWQuXG5cbiAgICAgIGlmIChjaGFubmVscy5wb25nLmhhc1N1YnNjcmliZXJzKSB7XG4gICAgICAgIGNoYW5uZWxzLnBvbmcucHVibGlzaCh7XG4gICAgICAgICAgcGF5bG9hZDogYm9keVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBnZXQgY2xvc2luZ0luZm8gKCkge1xuICAgIHJldHVybiB0aGlzLiNpbmZvLmNsb3NlSW5mb1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBCeXRlUGFyc2VyXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBXZWJzb2NrZXRGcmFtZVNlbmQgfSA9IHJlcXVpcmUoJy4vZnJhbWUnKVxuY29uc3QgeyBvcGNvZGVzLCBzZW5kSGludHMgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IEZpeGVkUXVldWUgPSByZXF1aXJlKCcuLi8uLi9kaXNwYXRjaGVyL2ZpeGVkLXF1ZXVlJylcblxuLyoqIEB0eXBlIHt0eXBlb2YgVWludDhBcnJheX0gKi9cbmNvbnN0IEZhc3RCdWZmZXIgPSBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VuZFF1ZXVlTm9kZVxuICogQHByb3BlcnR5IHtQcm9taXNlPHZvaWQ+IHwgbnVsbH0gcHJvbWlzZVxuICogQHByb3BlcnR5IHsoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpfSBjYWxsYmFja1xuICogQHByb3BlcnR5IHtCdWZmZXIgfCBudWxsfSBmcmFtZVxuICovXG5cbmNsYXNzIFNlbmRRdWV1ZSB7XG4gIC8qKlxuICAgKiBAdHlwZSB7Rml4ZWRRdWV1ZX1cbiAgICovXG4gICNxdWV1ZSA9IG5ldyBGaXhlZFF1ZXVlKClcblxuICAvKipcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICAjcnVubmluZyA9IGZhbHNlXG5cbiAgLyoqIEB0eXBlIHtpbXBvcnQoJ25vZGU6bmV0JykuU29ja2V0fSAqL1xuICAjc29ja2V0XG5cbiAgY29uc3RydWN0b3IgKHNvY2tldCkge1xuICAgIHRoaXMuI3NvY2tldCA9IHNvY2tldFxuICB9XG5cbiAgYWRkIChpdGVtLCBjYiwgaGludCkge1xuICAgIGlmIChoaW50ICE9PSBzZW5kSGludHMuYmxvYikge1xuICAgICAgY29uc3QgZnJhbWUgPSBjcmVhdGVGcmFtZShpdGVtLCBoaW50KVxuICAgICAgaWYgKCF0aGlzLiNydW5uaW5nKSB7XG4gICAgICAgIC8vIGZhc3QtcGF0aFxuICAgICAgICB0aGlzLiNzb2NrZXQud3JpdGUoZnJhbWUsIGNiKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyoqIEB0eXBlIHtTZW5kUXVldWVOb2RlfSAqL1xuICAgICAgICBjb25zdCBub2RlID0ge1xuICAgICAgICAgIHByb21pc2U6IG51bGwsXG4gICAgICAgICAgY2FsbGJhY2s6IGNiLFxuICAgICAgICAgIGZyYW1lXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jcXVldWUucHVzaChub2RlKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtTZW5kUXVldWVOb2RlfSAqL1xuICAgIGNvbnN0IG5vZGUgPSB7XG4gICAgICBwcm9taXNlOiBpdGVtLmFycmF5QnVmZmVyKCkudGhlbigoYWIpID0+IHtcbiAgICAgICAgbm9kZS5wcm9taXNlID0gbnVsbFxuICAgICAgICBub2RlLmZyYW1lID0gY3JlYXRlRnJhbWUoYWIsIGhpbnQpXG4gICAgICB9KSxcbiAgICAgIGNhbGxiYWNrOiBjYixcbiAgICAgIGZyYW1lOiBudWxsXG4gICAgfVxuXG4gICAgdGhpcy4jcXVldWUucHVzaChub2RlKVxuXG4gICAgaWYgKCF0aGlzLiNydW5uaW5nKSB7XG4gICAgICB0aGlzLiNydW4oKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jICNydW4gKCkge1xuICAgIHRoaXMuI3J1bm5pbmcgPSB0cnVlXG4gICAgY29uc3QgcXVldWUgPSB0aGlzLiNxdWV1ZVxuICAgIHdoaWxlICghcXVldWUuaXNFbXB0eSgpKSB7XG4gICAgICBjb25zdCBub2RlID0gcXVldWUuc2hpZnQoKVxuICAgICAgLy8gd2FpdCBwZW5kaW5nIHByb21pc2VcbiAgICAgIGlmIChub2RlLnByb21pc2UgIT09IG51bGwpIHtcbiAgICAgICAgYXdhaXQgbm9kZS5wcm9taXNlXG4gICAgICB9XG4gICAgICAvLyB3cml0ZVxuICAgICAgdGhpcy4jc29ja2V0LndyaXRlKG5vZGUuZnJhbWUsIG5vZGUuY2FsbGJhY2spXG4gICAgICAvLyBjbGVhbnVwXG4gICAgICBub2RlLmNhbGxiYWNrID0gbm9kZS5mcmFtZSA9IG51bGxcbiAgICB9XG4gICAgdGhpcy4jcnVubmluZyA9IGZhbHNlXG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRnJhbWUgKGRhdGEsIGhpbnQpIHtcbiAgcmV0dXJuIG5ldyBXZWJzb2NrZXRGcmFtZVNlbmQodG9CdWZmZXIoZGF0YSwgaGludCkpLmNyZWF0ZUZyYW1lKGhpbnQgPT09IHNlbmRIaW50cy5zdHJpbmcgPyBvcGNvZGVzLlRFWFQgOiBvcGNvZGVzLkJJTkFSWSlcbn1cblxuZnVuY3Rpb24gdG9CdWZmZXIgKGRhdGEsIGhpbnQpIHtcbiAgc3dpdGNoIChoaW50KSB7XG4gICAgY2FzZSBzZW5kSGludHMuc3RyaW5nOlxuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGRhdGEpXG4gICAgY2FzZSBzZW5kSGludHMuYXJyYXlCdWZmZXI6XG4gICAgY2FzZSBzZW5kSGludHMuYmxvYjpcbiAgICAgIHJldHVybiBuZXcgRmFzdEJ1ZmZlcihkYXRhKVxuICAgIGNhc2Ugc2VuZEhpbnRzLnR5cGVkQXJyYXk6XG4gICAgICByZXR1cm4gbmV3IEZhc3RCdWZmZXIoZGF0YS5idWZmZXIsIGRhdGEuYnl0ZU9mZnNldCwgZGF0YS5ieXRlTGVuZ3RoKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0geyBTZW5kUXVldWUgfVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgd2ViaWRsIH0gPSByZXF1aXJlKCcuLi9mZXRjaC93ZWJpZGwnKVxuY29uc3QgeyBVUkxTZXJpYWxpemVyIH0gPSByZXF1aXJlKCcuLi9mZXRjaC9kYXRhLXVybCcpXG5jb25zdCB7IGVudmlyb25tZW50U2V0dGluZ3NPYmplY3QgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3V0aWwnKVxuY29uc3QgeyBzdGF0aWNQcm9wZXJ0eURlc2NyaXB0b3JzLCBzdGF0ZXMsIHNlbnRDbG9zZUZyYW1lU3RhdGUsIHNlbmRIaW50cyB9ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3Qge1xuICBrV2ViU29ja2V0VVJMLFxuICBrUmVhZHlTdGF0ZSxcbiAga0NvbnRyb2xsZXIsXG4gIGtCaW5hcnlUeXBlLFxuICBrUmVzcG9uc2UsXG4gIGtTZW50Q2xvc2UsXG4gIGtCeXRlUGFyc2VyXG59ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHtcbiAgaXNDb25uZWN0aW5nLFxuICBpc0VzdGFibGlzaGVkLFxuICBpc0Nsb3NpbmcsXG4gIGlzVmFsaWRTdWJwcm90b2NvbCxcbiAgZmlyZUV2ZW50XG59ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHsgZXN0YWJsaXNoV2ViU29ja2V0Q29ubmVjdGlvbiwgY2xvc2VXZWJTb2NrZXRDb25uZWN0aW9uIH0gPSByZXF1aXJlKCcuL2Nvbm5lY3Rpb24nKVxuY29uc3QgeyBCeXRlUGFyc2VyIH0gPSByZXF1aXJlKCcuL3JlY2VpdmVyJylcbmNvbnN0IHsga0VudW1lcmFibGVQcm9wZXJ0eSwgaXNCbG9iTGlrZSB9ID0gcmVxdWlyZSgnLi4vLi4vY29yZS91dGlsJylcbmNvbnN0IHsgZ2V0R2xvYmFsRGlzcGF0Y2hlciB9ID0gcmVxdWlyZSgnLi4vLi4vZ2xvYmFsJylcbmNvbnN0IHsgdHlwZXMgfSA9IHJlcXVpcmUoJ25vZGU6dXRpbCcpXG5jb25zdCB7IEVycm9yRXZlbnQsIENsb3NlRXZlbnQgfSA9IHJlcXVpcmUoJy4vZXZlbnRzJylcbmNvbnN0IHsgU2VuZFF1ZXVlIH0gPSByZXF1aXJlKCcuL3NlbmRlcicpXG5cbi8vIGh0dHBzOi8vd2Vic29ja2V0cy5zcGVjLndoYXR3Zy5vcmcvI2ludGVyZmFjZS1kZWZpbml0aW9uXG5jbGFzcyBXZWJTb2NrZXQgZXh0ZW5kcyBFdmVudFRhcmdldCB7XG4gICNldmVudHMgPSB7XG4gICAgb3BlbjogbnVsbCxcbiAgICBlcnJvcjogbnVsbCxcbiAgICBjbG9zZTogbnVsbCxcbiAgICBtZXNzYWdlOiBudWxsXG4gIH1cblxuICAjYnVmZmVyZWRBbW91bnQgPSAwXG4gICNwcm90b2NvbCA9ICcnXG4gICNleHRlbnNpb25zID0gJydcblxuICAvKiogQHR5cGUge1NlbmRRdWV1ZX0gKi9cbiAgI3NlbmRRdWV1ZVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBwcm90b2NvbHNcbiAgICovXG4gIGNvbnN0cnVjdG9yICh1cmwsIHByb3RvY29scyA9IFtdKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgd2ViaWRsLnV0aWwubWFya0FzVW5jbG9uZWFibGUodGhpcylcblxuICAgIGNvbnN0IHByZWZpeCA9ICdXZWJTb2NrZXQgY29uc3RydWN0b3InXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCBwcmVmaXgpXG5cbiAgICBjb25zdCBvcHRpb25zID0gd2ViaWRsLmNvbnZlcnRlcnNbJ0RPTVN0cmluZyBvciBzZXF1ZW5jZTxET01TdHJpbmc+IG9yIFdlYlNvY2tldEluaXQnXShwcm90b2NvbHMsIHByZWZpeCwgJ29wdGlvbnMnKVxuXG4gICAgdXJsID0gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKHVybCwgcHJlZml4LCAndXJsJylcbiAgICBwcm90b2NvbHMgPSBvcHRpb25zLnByb3RvY29sc1xuXG4gICAgLy8gMS4gTGV0IGJhc2VVUkwgYmUgdGhpcydzIHJlbGV2YW50IHNldHRpbmdzIG9iamVjdCdzIEFQSSBiYXNlIFVSTC5cbiAgICBjb25zdCBiYXNlVVJMID0gZW52aXJvbm1lbnRTZXR0aW5nc09iamVjdC5zZXR0aW5nc09iamVjdC5iYXNlVXJsXG5cbiAgICAvLyAxLiBMZXQgdXJsUmVjb3JkIGJlIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIFVSTCBwYXJzZXIgdG8gdXJsIHdpdGggYmFzZVVSTC5cbiAgICBsZXQgdXJsUmVjb3JkXG5cbiAgICB0cnkge1xuICAgICAgdXJsUmVjb3JkID0gbmV3IFVSTCh1cmwsIGJhc2VVUkwpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gMy4gSWYgdXJsUmVjb3JkIGlzIGZhaWx1cmUsIHRoZW4gdGhyb3cgYSBcIlN5bnRheEVycm9yXCIgRE9NRXhjZXB0aW9uLlxuICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihlLCAnU3ludGF4RXJyb3InKVxuICAgIH1cblxuICAgIC8vIDQuIElmIHVybFJlY29yZOKAmXMgc2NoZW1lIGlzIFwiaHR0cFwiLCB0aGVuIHNldCB1cmxSZWNvcmTigJlzIHNjaGVtZSB0byBcIndzXCIuXG4gICAgaWYgKHVybFJlY29yZC5wcm90b2NvbCA9PT0gJ2h0dHA6Jykge1xuICAgICAgdXJsUmVjb3JkLnByb3RvY29sID0gJ3dzOidcbiAgICB9IGVsc2UgaWYgKHVybFJlY29yZC5wcm90b2NvbCA9PT0gJ2h0dHBzOicpIHtcbiAgICAgIC8vIDUuIE90aGVyd2lzZSwgaWYgdXJsUmVjb3Jk4oCZcyBzY2hlbWUgaXMgXCJodHRwc1wiLCBzZXQgdXJsUmVjb3Jk4oCZcyBzY2hlbWUgdG8gXCJ3c3NcIi5cbiAgICAgIHVybFJlY29yZC5wcm90b2NvbCA9ICd3c3M6J1xuICAgIH1cblxuICAgIC8vIDYuIElmIHVybFJlY29yZOKAmXMgc2NoZW1lIGlzIG5vdCBcIndzXCIgb3IgXCJ3c3NcIiwgdGhlbiB0aHJvdyBhIFwiU3ludGF4RXJyb3JcIiBET01FeGNlcHRpb24uXG4gICAgaWYgKHVybFJlY29yZC5wcm90b2NvbCAhPT0gJ3dzOicgJiYgdXJsUmVjb3JkLnByb3RvY29sICE9PSAnd3NzOicpIHtcbiAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oXG4gICAgICAgIGBFeHBlY3RlZCBhIHdzOiBvciB3c3M6IHByb3RvY29sLCBnb3QgJHt1cmxSZWNvcmQucHJvdG9jb2x9YCxcbiAgICAgICAgJ1N5bnRheEVycm9yJ1xuICAgICAgKVxuICAgIH1cblxuICAgIC8vIDcuIElmIHVybFJlY29yZOKAmXMgZnJhZ21lbnQgaXMgbm9uLW51bGwsIHRoZW4gdGhyb3cgYSBcIlN5bnRheEVycm9yXCJcbiAgICAvLyAgICBET01FeGNlcHRpb24uXG4gICAgaWYgKHVybFJlY29yZC5oYXNoIHx8IHVybFJlY29yZC5ocmVmLmVuZHNXaXRoKCcjJykpIHtcbiAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0dvdCBmcmFnbWVudCcsICdTeW50YXhFcnJvcicpXG4gICAgfVxuXG4gICAgLy8gOC4gSWYgcHJvdG9jb2xzIGlzIGEgc3RyaW5nLCBzZXQgcHJvdG9jb2xzIHRvIGEgc2VxdWVuY2UgY29uc2lzdGluZ1xuICAgIC8vICAgIG9mIGp1c3QgdGhhdCBzdHJpbmcuXG4gICAgaWYgKHR5cGVvZiBwcm90b2NvbHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwcm90b2NvbHMgPSBbcHJvdG9jb2xzXVxuICAgIH1cblxuICAgIC8vIDkuIElmIGFueSBvZiB0aGUgdmFsdWVzIGluIHByb3RvY29scyBvY2N1ciBtb3JlIHRoYW4gb25jZSBvciBvdGhlcndpc2VcbiAgICAvLyAgICBmYWlsIHRvIG1hdGNoIHRoZSByZXF1aXJlbWVudHMgZm9yIGVsZW1lbnRzIHRoYXQgY29tcHJpc2UgdGhlIHZhbHVlXG4gICAgLy8gICAgb2YgYFNlYy1XZWJTb2NrZXQtUHJvdG9jb2xgIGZpZWxkcyBhcyBkZWZpbmVkIGJ5IFRoZSBXZWJTb2NrZXRcbiAgICAvLyAgICBwcm90b2NvbCwgdGhlbiB0aHJvdyBhIFwiU3ludGF4RXJyb3JcIiBET01FeGNlcHRpb24uXG4gICAgaWYgKHByb3RvY29scy5sZW5ndGggIT09IG5ldyBTZXQocHJvdG9jb2xzLm1hcChwID0+IHAudG9Mb3dlckNhc2UoKSkpLnNpemUpIHtcbiAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ludmFsaWQgU2VjLVdlYlNvY2tldC1Qcm90b2NvbCB2YWx1ZScsICdTeW50YXhFcnJvcicpXG4gICAgfVxuXG4gICAgaWYgKHByb3RvY29scy5sZW5ndGggPiAwICYmICFwcm90b2NvbHMuZXZlcnkocCA9PiBpc1ZhbGlkU3VicHJvdG9jb2wocCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdJbnZhbGlkIFNlYy1XZWJTb2NrZXQtUHJvdG9jb2wgdmFsdWUnLCAnU3ludGF4RXJyb3InKVxuICAgIH1cblxuICAgIC8vIDEwLiBTZXQgdGhpcydzIHVybCB0byB1cmxSZWNvcmQuXG4gICAgdGhpc1trV2ViU29ja2V0VVJMXSA9IG5ldyBVUkwodXJsUmVjb3JkLmhyZWYpXG5cbiAgICAvLyAxMS4gTGV0IGNsaWVudCBiZSB0aGlzJ3MgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN0LlxuICAgIGNvbnN0IGNsaWVudCA9IGVudmlyb25tZW50U2V0dGluZ3NPYmplY3Quc2V0dGluZ3NPYmplY3RcblxuICAgIC8vIDEyLiBSdW4gdGhpcyBzdGVwIGluIHBhcmFsbGVsOlxuXG4gICAgLy8gICAgMS4gRXN0YWJsaXNoIGEgV2ViU29ja2V0IGNvbm5lY3Rpb24gZ2l2ZW4gdXJsUmVjb3JkLCBwcm90b2NvbHMsXG4gICAgLy8gICAgICAgYW5kIGNsaWVudC5cbiAgICB0aGlzW2tDb250cm9sbGVyXSA9IGVzdGFibGlzaFdlYlNvY2tldENvbm5lY3Rpb24oXG4gICAgICB1cmxSZWNvcmQsXG4gICAgICBwcm90b2NvbHMsXG4gICAgICBjbGllbnQsXG4gICAgICB0aGlzLFxuICAgICAgKHJlc3BvbnNlLCBleHRlbnNpb25zKSA9PiB0aGlzLiNvbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZChyZXNwb25zZSwgZXh0ZW5zaW9ucyksXG4gICAgICBvcHRpb25zXG4gICAgKVxuXG4gICAgLy8gRWFjaCBXZWJTb2NrZXQgb2JqZWN0IGhhcyBhbiBhc3NvY2lhdGVkIHJlYWR5IHN0YXRlLCB3aGljaCBpcyBhXG4gICAgLy8gbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgc3RhdGUgb2YgdGhlIGNvbm5lY3Rpb24uIEluaXRpYWxseSBpdCBtdXN0XG4gICAgLy8gYmUgQ09OTkVDVElORyAoMCkuXG4gICAgdGhpc1trUmVhZHlTdGF0ZV0gPSBXZWJTb2NrZXQuQ09OTkVDVElOR1xuXG4gICAgdGhpc1trU2VudENsb3NlXSA9IHNlbnRDbG9zZUZyYW1lU3RhdGUuTk9UX1NFTlRcblxuICAgIC8vIFRoZSBleHRlbnNpb25zIGF0dHJpYnV0ZSBtdXN0IGluaXRpYWxseSByZXR1cm4gdGhlIGVtcHR5IHN0cmluZy5cblxuICAgIC8vIFRoZSBwcm90b2NvbCBhdHRyaWJ1dGUgbXVzdCBpbml0aWFsbHkgcmV0dXJuIHRoZSBlbXB0eSBzdHJpbmcuXG5cbiAgICAvLyBFYWNoIFdlYlNvY2tldCBvYmplY3QgaGFzIGFuIGFzc29jaWF0ZWQgYmluYXJ5IHR5cGUsIHdoaWNoIGlzIGFcbiAgICAvLyBCaW5hcnlUeXBlLiBJbml0aWFsbHkgaXQgbXVzdCBiZSBcImJsb2JcIi5cbiAgICB0aGlzW2tCaW5hcnlUeXBlXSA9ICdibG9iJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93ZWJzb2NrZXRzLnNwZWMud2hhdHdnLm9yZy8jZG9tLXdlYnNvY2tldC1jbG9zZVxuICAgKiBAcGFyYW0ge251bWJlcnx1bmRlZmluZWR9IGNvZGVcbiAgICogQHBhcmFtIHtzdHJpbmd8dW5kZWZpbmVkfSByZWFzb25cbiAgICovXG4gIGNsb3NlIChjb2RlID0gdW5kZWZpbmVkLCByZWFzb24gPSB1bmRlZmluZWQpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICBjb25zdCBwcmVmaXggPSAnV2ViU29ja2V0LmNsb3NlJ1xuXG4gICAgaWYgKGNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29kZSA9IHdlYmlkbC5jb252ZXJ0ZXJzWyd1bnNpZ25lZCBzaG9ydCddKGNvZGUsIHByZWZpeCwgJ2NvZGUnLCB7IGNsYW1wOiB0cnVlIH0pXG4gICAgfVxuXG4gICAgaWYgKHJlYXNvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZWFzb24gPSB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcocmVhc29uLCBwcmVmaXgsICdyZWFzb24nKVxuICAgIH1cblxuICAgIC8vIDEuIElmIGNvZGUgaXMgcHJlc2VudCwgYnV0IGlzIG5laXRoZXIgYW4gaW50ZWdlciBlcXVhbCB0byAxMDAwIG5vciBhblxuICAgIC8vICAgIGludGVnZXIgaW4gdGhlIHJhbmdlIDMwMDAgdG8gNDk5OSwgaW5jbHVzaXZlLCB0aHJvdyBhblxuICAgIC8vICAgIFwiSW52YWxpZEFjY2Vzc0Vycm9yXCIgRE9NRXhjZXB0aW9uLlxuICAgIGlmIChjb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChjb2RlICE9PSAxMDAwICYmIChjb2RlIDwgMzAwMCB8fCBjb2RlID4gNDk5OSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignaW52YWxpZCBjb2RlJywgJ0ludmFsaWRBY2Nlc3NFcnJvcicpXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHJlYXNvbkJ5dGVMZW5ndGggPSAwXG5cbiAgICAvLyAyLiBJZiByZWFzb24gaXMgcHJlc2VudCwgdGhlbiBydW4gdGhlc2Ugc3Vic3RlcHM6XG4gICAgaWYgKHJlYXNvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyAxLiBMZXQgcmVhc29uQnl0ZXMgYmUgdGhlIHJlc3VsdCBvZiBlbmNvZGluZyByZWFzb24uXG4gICAgICAvLyAyLiBJZiByZWFzb25CeXRlcyBpcyBsb25nZXIgdGhhbiAxMjMgYnl0ZXMsIHRoZW4gdGhyb3cgYVxuICAgICAgLy8gICAgXCJTeW50YXhFcnJvclwiIERPTUV4Y2VwdGlvbi5cbiAgICAgIHJlYXNvbkJ5dGVMZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aChyZWFzb24pXG5cbiAgICAgIGlmIChyZWFzb25CeXRlTGVuZ3RoID4gMTIzKSB7XG4gICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oXG4gICAgICAgICAgYFJlYXNvbiBtdXN0IGJlIGxlc3MgdGhhbiAxMjMgYnl0ZXM7IHJlY2VpdmVkICR7cmVhc29uQnl0ZUxlbmd0aH1gLFxuICAgICAgICAgICdTeW50YXhFcnJvcidcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDMuIFJ1biB0aGUgZmlyc3QgbWF0Y2hpbmcgc3RlcHMgZnJvbSB0aGUgZm9sbG93aW5nIGxpc3Q6XG4gICAgY2xvc2VXZWJTb2NrZXRDb25uZWN0aW9uKHRoaXMsIGNvZGUsIHJlYXNvbiwgcmVhc29uQnl0ZUxlbmd0aClcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vd2Vic29ja2V0cy5zcGVjLndoYXR3Zy5vcmcvI2RvbS13ZWJzb2NrZXQtc2VuZFxuICAgKiBAcGFyYW0ge05vZGVKUy5UeXBlZEFycmF5fEFycmF5QnVmZmVyfEJsb2J8c3RyaW5nfSBkYXRhXG4gICAqL1xuICBzZW5kIChkYXRhKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgY29uc3QgcHJlZml4ID0gJ1dlYlNvY2tldC5zZW5kJ1xuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgcHJlZml4KVxuXG4gICAgZGF0YSA9IHdlYmlkbC5jb252ZXJ0ZXJzLldlYlNvY2tldFNlbmREYXRhKGRhdGEsIHByZWZpeCwgJ2RhdGEnKVxuXG4gICAgLy8gMS4gSWYgdGhpcydzIHJlYWR5IHN0YXRlIGlzIENPTk5FQ1RJTkcsIHRoZW4gdGhyb3cgYW5cbiAgICAvLyAgICBcIkludmFsaWRTdGF0ZUVycm9yXCIgRE9NRXhjZXB0aW9uLlxuICAgIGlmIChpc0Nvbm5lY3RpbmcodGhpcykpIHtcbiAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ1NlbnQgYmVmb3JlIGNvbm5lY3RlZC4nLCAnSW52YWxpZFN0YXRlRXJyb3InKVxuICAgIH1cblxuICAgIC8vIDIuIFJ1biB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHN0ZXBzIGZyb20gdGhlIGZvbGxvd2luZyBsaXN0OlxuICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjQ1NSNzZWN0aW9uLTYuMVxuICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjQ1NSNzZWN0aW9uLTUuMlxuXG4gICAgaWYgKCFpc0VzdGFibGlzaGVkKHRoaXMpIHx8IGlzQ2xvc2luZyh0aGlzKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gSWYgZGF0YSBpcyBhIHN0cmluZ1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIElmIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCBhbmQgdGhlIFdlYlNvY2tldFxuICAgICAgLy8gY2xvc2luZyBoYW5kc2hha2UgaGFzIG5vdCB5ZXQgc3RhcnRlZCwgdGhlbiB0aGUgdXNlciBhZ2VudFxuICAgICAgLy8gbXVzdCBzZW5kIGEgV2ViU29ja2V0IE1lc3NhZ2UgY29tcHJpc2VkIG9mIHRoZSBkYXRhIGFyZ3VtZW50XG4gICAgICAvLyB1c2luZyBhIHRleHQgZnJhbWUgb3Bjb2RlOyBpZiB0aGUgZGF0YSBjYW5ub3QgYmUgc2VudCwgZS5nLlxuICAgICAgLy8gYmVjYXVzZSBpdCB3b3VsZCBuZWVkIHRvIGJlIGJ1ZmZlcmVkIGJ1dCB0aGUgYnVmZmVyIGlzIGZ1bGwsXG4gICAgICAvLyB0aGUgdXNlciBhZ2VudCBtdXN0IGZsYWcgdGhlIFdlYlNvY2tldCBhcyBmdWxsIGFuZCB0aGVuIGNsb3NlXG4gICAgICAvLyB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24uIEFueSBpbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpdGggYVxuICAgICAgLy8gc3RyaW5nIGFyZ3VtZW50IHRoYXQgZG9lcyBub3QgdGhyb3cgYW4gZXhjZXB0aW9uIG11c3QgaW5jcmVhc2VcbiAgICAgIC8vIHRoZSBidWZmZXJlZEFtb3VudCBhdHRyaWJ1dGUgYnkgdGhlIG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG9cbiAgICAgIC8vIGV4cHJlc3MgdGhlIGFyZ3VtZW50IGFzIFVURi04LlxuXG4gICAgICBjb25zdCBsZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aChkYXRhKVxuXG4gICAgICB0aGlzLiNidWZmZXJlZEFtb3VudCArPSBsZW5ndGhcbiAgICAgIHRoaXMuI3NlbmRRdWV1ZS5hZGQoZGF0YSwgKCkgPT4ge1xuICAgICAgICB0aGlzLiNidWZmZXJlZEFtb3VudCAtPSBsZW5ndGhcbiAgICAgIH0sIHNlbmRIaW50cy5zdHJpbmcpXG4gICAgfSBlbHNlIGlmICh0eXBlcy5pc0FycmF5QnVmZmVyKGRhdGEpKSB7XG4gICAgICAvLyBJZiB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQsIGFuZCB0aGUgV2ViU29ja2V0XG4gICAgICAvLyBjbG9zaW5nIGhhbmRzaGFrZSBoYXMgbm90IHlldCBzdGFydGVkLCB0aGVuIHRoZSB1c2VyIGFnZW50IG11c3RcbiAgICAgIC8vIHNlbmQgYSBXZWJTb2NrZXQgTWVzc2FnZSBjb21wcmlzZWQgb2YgZGF0YSB1c2luZyBhIGJpbmFyeSBmcmFtZVxuICAgICAgLy8gb3Bjb2RlOyBpZiB0aGUgZGF0YSBjYW5ub3QgYmUgc2VudCwgZS5nLiBiZWNhdXNlIGl0IHdvdWxkIG5lZWRcbiAgICAgIC8vIHRvIGJlIGJ1ZmZlcmVkIGJ1dCB0aGUgYnVmZmVyIGlzIGZ1bGwsIHRoZSB1c2VyIGFnZW50IG11c3QgZmxhZ1xuICAgICAgLy8gdGhlIFdlYlNvY2tldCBhcyBmdWxsIGFuZCB0aGVuIGNsb3NlIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbi5cbiAgICAgIC8vIFRoZSBkYXRhIHRvIGJlIHNlbnQgaXMgdGhlIGRhdGEgc3RvcmVkIGluIHRoZSBidWZmZXIgZGVzY3JpYmVkXG4gICAgICAvLyBieSB0aGUgQXJyYXlCdWZmZXIgb2JqZWN0LiBBbnkgaW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aXRoIGFuXG4gICAgICAvLyBBcnJheUJ1ZmZlciBhcmd1bWVudCB0aGF0IGRvZXMgbm90IHRocm93IGFuIGV4Y2VwdGlvbiBtdXN0XG4gICAgICAvLyBpbmNyZWFzZSB0aGUgYnVmZmVyZWRBbW91bnQgYXR0cmlidXRlIGJ5IHRoZSBsZW5ndGggb2YgdGhlXG4gICAgICAvLyBBcnJheUJ1ZmZlciBpbiBieXRlcy5cblxuICAgICAgdGhpcy4jYnVmZmVyZWRBbW91bnQgKz0gZGF0YS5ieXRlTGVuZ3RoXG4gICAgICB0aGlzLiNzZW5kUXVldWUuYWRkKGRhdGEsICgpID0+IHtcbiAgICAgICAgdGhpcy4jYnVmZmVyZWRBbW91bnQgLT0gZGF0YS5ieXRlTGVuZ3RoXG4gICAgICB9LCBzZW5kSGludHMuYXJyYXlCdWZmZXIpXG4gICAgfSBlbHNlIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoZGF0YSkpIHtcbiAgICAgIC8vIElmIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCwgYW5kIHRoZSBXZWJTb2NrZXRcbiAgICAgIC8vIGNsb3NpbmcgaGFuZHNoYWtlIGhhcyBub3QgeWV0IHN0YXJ0ZWQsIHRoZW4gdGhlIHVzZXIgYWdlbnQgbXVzdFxuICAgICAgLy8gc2VuZCBhIFdlYlNvY2tldCBNZXNzYWdlIGNvbXByaXNlZCBvZiBkYXRhIHVzaW5nIGEgYmluYXJ5IGZyYW1lXG4gICAgICAvLyBvcGNvZGU7IGlmIHRoZSBkYXRhIGNhbm5vdCBiZSBzZW50LCBlLmcuIGJlY2F1c2UgaXQgd291bGQgbmVlZCB0b1xuICAgICAgLy8gYmUgYnVmZmVyZWQgYnV0IHRoZSBidWZmZXIgaXMgZnVsbCwgdGhlIHVzZXIgYWdlbnQgbXVzdCBmbGFnIHRoZVxuICAgICAgLy8gV2ViU29ja2V0IGFzIGZ1bGwgYW5kIHRoZW4gY2xvc2UgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uLiBUaGVcbiAgICAgIC8vIGRhdGEgdG8gYmUgc2VudCBpcyB0aGUgZGF0YSBzdG9yZWQgaW4gdGhlIHNlY3Rpb24gb2YgdGhlIGJ1ZmZlclxuICAgICAgLy8gZGVzY3JpYmVkIGJ5IHRoZSBBcnJheUJ1ZmZlciBvYmplY3QgdGhhdCBkYXRhIHJlZmVyZW5jZXMuIEFueVxuICAgICAgLy8gaW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aXRoIHRoaXMga2luZCBvZiBhcmd1bWVudCB0aGF0IGRvZXNcbiAgICAgIC8vIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gbXVzdCBpbmNyZWFzZSB0aGUgYnVmZmVyZWRBbW91bnQgYXR0cmlidXRlXG4gICAgICAvLyBieSB0aGUgbGVuZ3RoIG9mIGRhdGHigJlzIGJ1ZmZlciBpbiBieXRlcy5cblxuICAgICAgdGhpcy4jYnVmZmVyZWRBbW91bnQgKz0gZGF0YS5ieXRlTGVuZ3RoXG4gICAgICB0aGlzLiNzZW5kUXVldWUuYWRkKGRhdGEsICgpID0+IHtcbiAgICAgICAgdGhpcy4jYnVmZmVyZWRBbW91bnQgLT0gZGF0YS5ieXRlTGVuZ3RoXG4gICAgICB9LCBzZW5kSGludHMudHlwZWRBcnJheSlcbiAgICB9IGVsc2UgaWYgKGlzQmxvYkxpa2UoZGF0YSkpIHtcbiAgICAgIC8vIElmIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCwgYW5kIHRoZSBXZWJTb2NrZXRcbiAgICAgIC8vIGNsb3NpbmcgaGFuZHNoYWtlIGhhcyBub3QgeWV0IHN0YXJ0ZWQsIHRoZW4gdGhlIHVzZXIgYWdlbnQgbXVzdFxuICAgICAgLy8gc2VuZCBhIFdlYlNvY2tldCBNZXNzYWdlIGNvbXByaXNlZCBvZiBkYXRhIHVzaW5nIGEgYmluYXJ5IGZyYW1lXG4gICAgICAvLyBvcGNvZGU7IGlmIHRoZSBkYXRhIGNhbm5vdCBiZSBzZW50LCBlLmcuIGJlY2F1c2UgaXQgd291bGQgbmVlZCB0b1xuICAgICAgLy8gYmUgYnVmZmVyZWQgYnV0IHRoZSBidWZmZXIgaXMgZnVsbCwgdGhlIHVzZXIgYWdlbnQgbXVzdCBmbGFnIHRoZVxuICAgICAgLy8gV2ViU29ja2V0IGFzIGZ1bGwgYW5kIHRoZW4gY2xvc2UgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uLiBUaGUgZGF0YVxuICAgICAgLy8gdG8gYmUgc2VudCBpcyB0aGUgcmF3IGRhdGEgcmVwcmVzZW50ZWQgYnkgdGhlIEJsb2Igb2JqZWN0LiBBbnlcbiAgICAgIC8vIGludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2l0aCBhIEJsb2IgYXJndW1lbnQgdGhhdCBkb2VzIG5vdCB0aHJvd1xuICAgICAgLy8gYW4gZXhjZXB0aW9uIG11c3QgaW5jcmVhc2UgdGhlIGJ1ZmZlcmVkQW1vdW50IGF0dHJpYnV0ZSBieSB0aGUgc2l6ZVxuICAgICAgLy8gb2YgdGhlIEJsb2Igb2JqZWN04oCZcyByYXcgZGF0YSwgaW4gYnl0ZXMuXG5cbiAgICAgIHRoaXMuI2J1ZmZlcmVkQW1vdW50ICs9IGRhdGEuc2l6ZVxuICAgICAgdGhpcy4jc2VuZFF1ZXVlLmFkZChkYXRhLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuI2J1ZmZlcmVkQW1vdW50IC09IGRhdGEuc2l6ZVxuICAgICAgfSwgc2VuZEhpbnRzLmJsb2IpXG4gICAgfVxuICB9XG5cbiAgZ2V0IHJlYWR5U3RhdGUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIC8vIFRoZSByZWFkeVN0YXRlIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXMncyByZWFkeSBzdGF0ZS5cbiAgICByZXR1cm4gdGhpc1trUmVhZHlTdGF0ZV1cbiAgfVxuXG4gIGdldCBidWZmZXJlZEFtb3VudCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgcmV0dXJuIHRoaXMuI2J1ZmZlcmVkQW1vdW50XG4gIH1cblxuICBnZXQgdXJsICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICAvLyBUaGUgdXJsIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXMncyB1cmwsIHNlcmlhbGl6ZWQuXG4gICAgcmV0dXJuIFVSTFNlcmlhbGl6ZXIodGhpc1trV2ViU29ja2V0VVJMXSlcbiAgfVxuXG4gIGdldCBleHRlbnNpb25zICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXh0ZW5zaW9uc1xuICB9XG5cbiAgZ2V0IHByb3RvY29sICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICByZXR1cm4gdGhpcy4jcHJvdG9jb2xcbiAgfVxuXG4gIGdldCBvbm9wZW4gKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIHJldHVybiB0aGlzLiNldmVudHMub3BlblxuICB9XG5cbiAgc2V0IG9ub3BlbiAoZm4pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICBpZiAodGhpcy4jZXZlbnRzLm9wZW4pIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignb3BlbicsIHRoaXMuI2V2ZW50cy5vcGVuKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuI2V2ZW50cy5vcGVuID0gZm5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsIGZuKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNldmVudHMub3BlbiA9IG51bGxcbiAgICB9XG4gIH1cblxuICBnZXQgb25lcnJvciAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50cy5lcnJvclxuICB9XG5cbiAgc2V0IG9uZXJyb3IgKGZuKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgaWYgKHRoaXMuI2V2ZW50cy5lcnJvcikge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIHRoaXMuI2V2ZW50cy5lcnJvcilcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLiNldmVudHMuZXJyb3IgPSBmblxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGZuKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNldmVudHMuZXJyb3IgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgZ2V0IG9uY2xvc2UgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIHJldHVybiB0aGlzLiNldmVudHMuY2xvc2VcbiAgfVxuXG4gIHNldCBvbmNsb3NlIChmbikge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIGlmICh0aGlzLiNldmVudHMuY2xvc2UpIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCB0aGlzLiNldmVudHMuY2xvc2UpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy4jZXZlbnRzLmNsb3NlID0gZm5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jZXZlbnRzLmNsb3NlID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGdldCBvbm1lc3NhZ2UgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIHJldHVybiB0aGlzLiNldmVudHMubWVzc2FnZVxuICB9XG5cbiAgc2V0IG9ubWVzc2FnZSAoZm4pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICBpZiAodGhpcy4jZXZlbnRzLm1lc3NhZ2UpIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuI2V2ZW50cy5tZXNzYWdlKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuI2V2ZW50cy5tZXNzYWdlID0gZm5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZuKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNldmVudHMubWVzc2FnZSA9IG51bGxcbiAgICB9XG4gIH1cblxuICBnZXQgYmluYXJ5VHlwZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgcmV0dXJuIHRoaXNba0JpbmFyeVR5cGVdXG4gIH1cblxuICBzZXQgYmluYXJ5VHlwZSAodHlwZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIGlmICh0eXBlICE9PSAnYmxvYicgJiYgdHlwZSAhPT0gJ2FycmF5YnVmZmVyJykge1xuICAgICAgdGhpc1trQmluYXJ5VHlwZV0gPSAnYmxvYidcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1trQmluYXJ5VHlwZV0gPSB0eXBlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93ZWJzb2NrZXRzLnNwZWMud2hhdHdnLm9yZy8jZmVlZGJhY2stZnJvbS10aGUtcHJvdG9jb2xcbiAgICovXG4gICNvbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCAocmVzcG9uc2UsIHBhcnNlZEV4dGVuc2lvbnMpIHtcbiAgICAvLyBwcm9jZXNzUmVzcG9uc2UgaXMgY2FsbGVkIHdoZW4gdGhlIFwicmVzcG9uc2XigJlzIGhlYWRlciBsaXN0IGhhcyBiZWVuIHJlY2VpdmVkIGFuZCBpbml0aWFsaXplZC5cIlxuICAgIC8vIG9uY2UgdGhpcyBoYXBwZW5zLCB0aGUgY29ubmVjdGlvbiBpcyBvcGVuXG4gICAgdGhpc1trUmVzcG9uc2VdID0gcmVzcG9uc2VcblxuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBCeXRlUGFyc2VyKHRoaXMsIHBhcnNlZEV4dGVuc2lvbnMpXG4gICAgcGFyc2VyLm9uKCdkcmFpbicsIG9uUGFyc2VyRHJhaW4pXG4gICAgcGFyc2VyLm9uKCdlcnJvcicsIG9uUGFyc2VyRXJyb3IuYmluZCh0aGlzKSlcblxuICAgIHJlc3BvbnNlLnNvY2tldC53cyA9IHRoaXNcbiAgICB0aGlzW2tCeXRlUGFyc2VyXSA9IHBhcnNlclxuXG4gICAgdGhpcy4jc2VuZFF1ZXVlID0gbmV3IFNlbmRRdWV1ZShyZXNwb25zZS5zb2NrZXQpXG5cbiAgICAvLyAxLiBDaGFuZ2UgdGhlIHJlYWR5IHN0YXRlIHRvIE9QRU4gKDEpLlxuICAgIHRoaXNba1JlYWR5U3RhdGVdID0gc3RhdGVzLk9QRU5cblxuICAgIC8vIDIuIENoYW5nZSB0aGUgZXh0ZW5zaW9ucyBhdHRyaWJ1dGXigJlzIHZhbHVlIHRvIHRoZSBleHRlbnNpb25zIGluIHVzZSwgaWZcbiAgICAvLyAgICBpdCBpcyBub3QgdGhlIG51bGwgdmFsdWUuXG4gICAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM2NDU1I3NlY3Rpb24tOS4xXG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IHJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgnc2VjLXdlYnNvY2tldC1leHRlbnNpb25zJylcblxuICAgIGlmIChleHRlbnNpb25zICE9PSBudWxsKSB7XG4gICAgICB0aGlzLiNleHRlbnNpb25zID0gZXh0ZW5zaW9uc1xuICAgIH1cblxuICAgIC8vIDMuIENoYW5nZSB0aGUgcHJvdG9jb2wgYXR0cmlidXRl4oCZcyB2YWx1ZSB0byB0aGUgc3VicHJvdG9jb2wgaW4gdXNlLCBpZlxuICAgIC8vICAgIGl0IGlzIG5vdCB0aGUgbnVsbCB2YWx1ZS5cbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzY0NTUjc2VjdGlvbi0xLjlcbiAgICBjb25zdCBwcm90b2NvbCA9IHJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgnc2VjLXdlYnNvY2tldC1wcm90b2NvbCcpXG5cbiAgICBpZiAocHJvdG9jb2wgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuI3Byb3RvY29sID0gcHJvdG9jb2xcbiAgICB9XG5cbiAgICAvLyA0LiBGaXJlIGFuIGV2ZW50IG5hbWVkIG9wZW4gYXQgdGhlIFdlYlNvY2tldCBvYmplY3QuXG4gICAgZmlyZUV2ZW50KCdvcGVuJywgdGhpcylcbiAgfVxufVxuXG4vLyBodHRwczovL3dlYnNvY2tldHMuc3BlYy53aGF0d2cub3JnLyNkb20td2Vic29ja2V0LWNvbm5lY3RpbmdcbldlYlNvY2tldC5DT05ORUNUSU5HID0gV2ViU29ja2V0LnByb3RvdHlwZS5DT05ORUNUSU5HID0gc3RhdGVzLkNPTk5FQ1RJTkdcbi8vIGh0dHBzOi8vd2Vic29ja2V0cy5zcGVjLndoYXR3Zy5vcmcvI2RvbS13ZWJzb2NrZXQtb3BlblxuV2ViU29ja2V0Lk9QRU4gPSBXZWJTb2NrZXQucHJvdG90eXBlLk9QRU4gPSBzdGF0ZXMuT1BFTlxuLy8gaHR0cHM6Ly93ZWJzb2NrZXRzLnNwZWMud2hhdHdnLm9yZy8jZG9tLXdlYnNvY2tldC1jbG9zaW5nXG5XZWJTb2NrZXQuQ0xPU0lORyA9IFdlYlNvY2tldC5wcm90b3R5cGUuQ0xPU0lORyA9IHN0YXRlcy5DTE9TSU5HXG4vLyBodHRwczovL3dlYnNvY2tldHMuc3BlYy53aGF0d2cub3JnLyNkb20td2Vic29ja2V0LWNsb3NlZFxuV2ViU29ja2V0LkNMT1NFRCA9IFdlYlNvY2tldC5wcm90b3R5cGUuQ0xPU0VEID0gc3RhdGVzLkNMT1NFRFxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhXZWJTb2NrZXQucHJvdG90eXBlLCB7XG4gIENPTk5FQ1RJTkc6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIE9QRU46IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIENMT1NJTkc6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIENMT1NFRDogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgdXJsOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZWFkeVN0YXRlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBidWZmZXJlZEFtb3VudDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgb25vcGVuOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbmVycm9yOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbmNsb3NlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBjbG9zZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgb25tZXNzYWdlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBiaW5hcnlUeXBlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBzZW5kOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBleHRlbnNpb25zOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBwcm90b2NvbDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHtcbiAgICB2YWx1ZTogJ1dlYlNvY2tldCcsXG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9XG59KVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhXZWJTb2NrZXQsIHtcbiAgQ09OTkVDVElORzogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgT1BFTjogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgQ0xPU0lORzogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgQ0xPU0VEOiBzdGF0aWNQcm9wZXJ0eURlc2NyaXB0b3JzXG59KVxuXG53ZWJpZGwuY29udmVydGVyc1snc2VxdWVuY2U8RE9NU3RyaW5nPiddID0gd2ViaWRsLnNlcXVlbmNlQ29udmVydGVyKFxuICB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmdcbilcblxud2ViaWRsLmNvbnZlcnRlcnNbJ0RPTVN0cmluZyBvciBzZXF1ZW5jZTxET01TdHJpbmc+J10gPSBmdW5jdGlvbiAoViwgcHJlZml4LCBhcmd1bWVudCkge1xuICBpZiAod2ViaWRsLnV0aWwuVHlwZShWKSA9PT0gJ09iamVjdCcgJiYgU3ltYm9sLml0ZXJhdG9yIGluIFYpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPERPTVN0cmluZz4nXShWKVxuICB9XG5cbiAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyhWLCBwcmVmaXgsIGFyZ3VtZW50KVxufVxuXG4vLyBUaGlzIGltcGxlbWVudHMgdGhlIHByb3Bvc2FsIG1hZGUgaW4gaHR0cHM6Ly9naXRodWIuY29tL3doYXR3Zy93ZWJzb2NrZXRzL2lzc3Vlcy80Mlxud2ViaWRsLmNvbnZlcnRlcnMuV2ViU29ja2V0SW5pdCA9IHdlYmlkbC5kaWN0aW9uYXJ5Q29udmVydGVyKFtcbiAge1xuICAgIGtleTogJ3Byb3RvY29scycsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVyc1snRE9NU3RyaW5nIG9yIHNlcXVlbmNlPERPTVN0cmluZz4nXSxcbiAgICBkZWZhdWx0VmFsdWU6ICgpID0+IG5ldyBBcnJheSgwKVxuICB9LFxuICB7XG4gICAga2V5OiAnZGlzcGF0Y2hlcicsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5hbnksXG4gICAgZGVmYXVsdFZhbHVlOiAoKSA9PiBnZXRHbG9iYWxEaXNwYXRjaGVyKClcbiAgfSxcbiAge1xuICAgIGtleTogJ2hlYWRlcnMnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKHdlYmlkbC5jb252ZXJ0ZXJzLkhlYWRlcnNJbml0KVxuICB9XG5dKVxuXG53ZWJpZGwuY29udmVydGVyc1snRE9NU3RyaW5nIG9yIHNlcXVlbmNlPERPTVN0cmluZz4gb3IgV2ViU29ja2V0SW5pdCddID0gZnVuY3Rpb24gKFYpIHtcbiAgaWYgKHdlYmlkbC51dGlsLlR5cGUoVikgPT09ICdPYmplY3QnICYmICEoU3ltYm9sLml0ZXJhdG9yIGluIFYpKSB7XG4gICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLldlYlNvY2tldEluaXQoVilcbiAgfVxuXG4gIHJldHVybiB7IHByb3RvY29sczogd2ViaWRsLmNvbnZlcnRlcnNbJ0RPTVN0cmluZyBvciBzZXF1ZW5jZTxET01TdHJpbmc+J10oVikgfVxufVxuXG53ZWJpZGwuY29udmVydGVycy5XZWJTb2NrZXRTZW5kRGF0YSA9IGZ1bmN0aW9uIChWKSB7XG4gIGlmICh3ZWJpZGwudXRpbC5UeXBlKFYpID09PSAnT2JqZWN0Jykge1xuICAgIGlmIChpc0Jsb2JMaWtlKFYpKSB7XG4gICAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuQmxvYihWLCB7IHN0cmljdDogZmFsc2UgfSlcbiAgICB9XG5cbiAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KFYpIHx8IHR5cGVzLmlzQXJyYXlCdWZmZXIoVikpIHtcbiAgICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5CdWZmZXJTb3VyY2UoVilcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKFYpXG59XG5cbmZ1bmN0aW9uIG9uUGFyc2VyRHJhaW4gKCkge1xuICB0aGlzLndzW2tSZXNwb25zZV0uc29ja2V0LnJlc3VtZSgpXG59XG5cbmZ1bmN0aW9uIG9uUGFyc2VyRXJyb3IgKGVycikge1xuICBsZXQgbWVzc2FnZVxuICBsZXQgY29kZVxuXG4gIGlmIChlcnIgaW5zdGFuY2VvZiBDbG9zZUV2ZW50KSB7XG4gICAgbWVzc2FnZSA9IGVyci5yZWFzb25cbiAgICBjb2RlID0gZXJyLmNvZGVcbiAgfSBlbHNlIHtcbiAgICBtZXNzYWdlID0gZXJyLm1lc3NhZ2VcbiAgfVxuXG4gIGZpcmVFdmVudCgnZXJyb3InLCB0aGlzLCAoKSA9PiBuZXcgRXJyb3JFdmVudCgnZXJyb3InLCB7IGVycm9yOiBlcnIsIG1lc3NhZ2UgfSkpXG5cbiAgY2xvc2VXZWJTb2NrZXRDb25uZWN0aW9uKHRoaXMsIGNvZGUpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBXZWJTb2NrZXRcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSB2YWxpZCBMYXN0RXZlbnRJZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRMYXN0RXZlbnRJZCAodmFsdWUpIHtcbiAgLy8gTGFzdEV2ZW50SWQgc2hvdWxkIG5vdCBjb250YWluIFUrMDAwMCBOVUxMXG4gIHJldHVybiB2YWx1ZS5pbmRleE9mKCdcXHUwMDAwJykgPT09IC0xXG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIGJhc2UgMTAgZGlnaXQuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0FTQ0lJTnVtYmVyICh2YWx1ZSkge1xuICBpZiAodmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2VcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgIGlmICh2YWx1ZS5jaGFyQ29kZUF0KGkpIDwgMHgzMCB8fCB2YWx1ZS5jaGFyQ29kZUF0KGkpID4gMHgzOSkgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzI2NjRcbmZ1bmN0aW9uIGRlbGF5IChtcykge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKS51bnJlZigpXG4gIH0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc1ZhbGlkTGFzdEV2ZW50SWQsXG4gIGlzQVNDSUlOdW1iZXIsXG4gIGRlbGF5XG59XG4iLCIndXNlIHN0cmljdCdcbmNvbnN0IHsgVHJhbnNmb3JtIH0gPSByZXF1aXJlKCdub2RlOnN0cmVhbScpXG5jb25zdCB7IGlzQVNDSUlOdW1iZXIsIGlzVmFsaWRMYXN0RXZlbnRJZCB9ID0gcmVxdWlyZSgnLi91dGlsJylcblxuLyoqXG4gKiBAdHlwZSB7bnVtYmVyW119IEJPTVxuICovXG5jb25zdCBCT00gPSBbMHhFRiwgMHhCQiwgMHhCRl1cbi8qKlxuICogQHR5cGUgezEwfSBMRlxuICovXG5jb25zdCBMRiA9IDB4MEFcbi8qKlxuICogQHR5cGUgezEzfSBDUlxuICovXG5jb25zdCBDUiA9IDB4MERcbi8qKlxuICogQHR5cGUgezU4fSBDT0xPTlxuICovXG5jb25zdCBDT0xPTiA9IDB4M0Fcbi8qKlxuICogQHR5cGUgezMyfSBTUEFDRVxuICovXG5jb25zdCBTUEFDRSA9IDB4MjBcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFdmVudFNvdXJjZVN0cmVhbUV2ZW50XG4gKiBAdHlwZSB7b2JqZWN0fVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtldmVudF0gVGhlIGV2ZW50IHR5cGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RhdGFdIFRoZSBkYXRhIG9mIHRoZSBtZXNzYWdlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gQSB1bmlxdWUgSUQgZm9yIHRoZSBldmVudC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcmV0cnldIFRoZSByZWNvbm5lY3Rpb24gdGltZSwgaW4gbWlsbGlzZWNvbmRzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgZXZlbnRTb3VyY2VTZXR0aW5nc1xuICogQHR5cGUge29iamVjdH1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBsYXN0RXZlbnRJZCBUaGUgbGFzdCBldmVudCBJRCByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3JpZ2luIFRoZSBvcmlnaW4gb2YgdGhlIGV2ZW50IHNvdXJjZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSByZWNvbm5lY3Rpb25UaW1lIFRoZSByZWNvbm5lY3Rpb24gdGltZSwgaW4gbWlsbGlzZWNvbmRzLlxuICovXG5cbmNsYXNzIEV2ZW50U291cmNlU3RyZWFtIGV4dGVuZHMgVHJhbnNmb3JtIHtcbiAgLyoqXG4gICAqIEB0eXBlIHtldmVudFNvdXJjZVNldHRpbmdzfVxuICAgKi9cbiAgc3RhdGUgPSBudWxsXG5cbiAgLyoqXG4gICAqIExlYWRpbmcgYnl0ZS1vcmRlci1tYXJrIGNoZWNrLlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIGNoZWNrQk9NID0gdHJ1ZVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIGNybGZDaGVjayA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKi9cbiAgZXZlbnRFbmRDaGVjayA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIEB0eXBlIHtCdWZmZXJ9XG4gICAqL1xuICBidWZmZXIgPSBudWxsXG5cbiAgcG9zID0gMFxuXG4gIGV2ZW50ID0ge1xuICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICBldmVudDogdW5kZWZpbmVkLFxuICAgIGlkOiB1bmRlZmluZWQsXG4gICAgcmV0cnk6IHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBwYXJhbSB7ZXZlbnRTb3VyY2VTZXR0aW5nc30gb3B0aW9ucy5ldmVudFNvdXJjZVNldHRpbmdzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLnB1c2hdXG4gICAqL1xuICBjb25zdHJ1Y3RvciAob3B0aW9ucyA9IHt9KSB7XG4gICAgLy8gRW5hYmxlIG9iamVjdCBtb2RlIGFzIEV2ZW50U291cmNlU3RyZWFtIGVtaXRzIG9iamVjdHMgb2Ygc2hhcGVcbiAgICAvLyBFdmVudFNvdXJjZVN0cmVhbUV2ZW50XG4gICAgb3B0aW9ucy5yZWFkYWJsZU9iamVjdE1vZGUgPSB0cnVlXG5cbiAgICBzdXBlcihvcHRpb25zKVxuXG4gICAgdGhpcy5zdGF0ZSA9IG9wdGlvbnMuZXZlbnRTb3VyY2VTZXR0aW5ncyB8fCB7fVxuICAgIGlmIChvcHRpb25zLnB1c2gpIHtcbiAgICAgIHRoaXMucHVzaCA9IG9wdGlvbnMucHVzaFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gY2h1bmtcbiAgICogQHBhcmFtIHtzdHJpbmd9IF9lbmNvZGluZ1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF90cmFuc2Zvcm0gKGNodW5rLCBfZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gICAgaWYgKGNodW5rLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY2FsbGJhY2soKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gQ2FjaGUgdGhlIGNodW5rIGluIHRoZSBidWZmZXIsIGFzIHRoZSBkYXRhIG1pZ2h0IG5vdCBiZSBjb21wbGV0ZSB3aGlsZVxuICAgIC8vIHByb2Nlc3NpbmcgaXRcbiAgICAvLyBUT0RPOiBJbnZlc3RpZ2F0ZSBpZiB0aGVyZSBpcyBhIG1vcmUgcGVyZm9ybWFudCB3YXkgdG8gaGFuZGxlXG4gICAgLy8gaW5jb21pbmcgY2h1bmtzXG4gICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9pc3N1ZXMvMjYzMFxuICAgIGlmICh0aGlzLmJ1ZmZlcikge1xuICAgICAgdGhpcy5idWZmZXIgPSBCdWZmZXIuY29uY2F0KFt0aGlzLmJ1ZmZlciwgY2h1bmtdKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJ1ZmZlciA9IGNodW5rXG4gICAgfVxuXG4gICAgLy8gU3RyaXAgbGVhZGluZyBieXRlLW9yZGVyLW1hcmsgaWYgd2Ugb3BlbmVkIHRoZSBzdHJlYW0gYW5kIHN0YXJ0ZWRcbiAgICAvLyB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgaW5jb21pbmcgZGF0YVxuICAgIGlmICh0aGlzLmNoZWNrQk9NKSB7XG4gICAgICBzd2l0Y2ggKHRoaXMuYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZpcnN0IGJ5dGUgaXMgdGhlIHNhbWUgYXMgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIEJPTVxuICAgICAgICAgIGlmICh0aGlzLmJ1ZmZlclswXSA9PT0gQk9NWzBdKSB7XG4gICAgICAgICAgICAvLyBJZiBpdCBpcywgd2UgbmVlZCB0byB3YWl0IGZvciBtb3JlIGRhdGFcbiAgICAgICAgICAgIGNhbGxiYWNrKClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBTZXQgdGhlIGNoZWNrQk9NIGZsYWcgdG8gZmFsc2UgYXMgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgdGhlXG4gICAgICAgICAgLy8gQk9NIGFueW1vcmVcbiAgICAgICAgICB0aGlzLmNoZWNrQk9NID0gZmFsc2VcblxuICAgICAgICAgIC8vIFRoZSBidWZmZXIgb25seSBjb250YWlucyBvbmUgYnl0ZSBzbyB3ZSBuZWVkIHRvIHdhaXQgZm9yIG1vcmUgZGF0YVxuICAgICAgICAgIGNhbGxiYWNrKClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBmaXJzdCB0d28gYnl0ZXMgYXJlIHRoZSBzYW1lIGFzIHRoZSBmaXJzdCB0d28gYnl0ZXNcbiAgICAgICAgICAvLyBvZiB0aGUgQk9NXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5idWZmZXJbMF0gPT09IEJPTVswXSAmJlxuICAgICAgICAgICAgdGhpcy5idWZmZXJbMV0gPT09IEJPTVsxXVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gSWYgaXQgaXMsIHdlIG5lZWQgdG8gd2FpdCBmb3IgbW9yZSBkYXRhLCBiZWNhdXNlIHRoZSB0aGlyZCBieXRlXG4gICAgICAgICAgICAvLyBpcyBuZWVkZWQgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIHRoZSBCT00gb3Igbm90XG4gICAgICAgICAgICBjYWxsYmFjaygpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZXQgdGhlIGNoZWNrQk9NIGZsYWcgdG8gZmFsc2UgYXMgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgdGhlXG4gICAgICAgICAgLy8gQk9NIGFueW1vcmVcbiAgICAgICAgICB0aGlzLmNoZWNrQk9NID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZpcnN0IHRocmVlIGJ5dGVzIGFyZSB0aGUgc2FtZSBhcyB0aGUgZmlyc3QgdGhyZWVcbiAgICAgICAgICAvLyBieXRlcyBvZiB0aGUgQk9NXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5idWZmZXJbMF0gPT09IEJPTVswXSAmJlxuICAgICAgICAgICAgdGhpcy5idWZmZXJbMV0gPT09IEJPTVsxXSAmJlxuICAgICAgICAgICAgdGhpcy5idWZmZXJbMl0gPT09IEJPTVsyXVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gSWYgaXQgaXMsIHdlIGNhbiBkcm9wIHRoZSBidWZmZXJlZCBkYXRhLCBhcyBpdCBpcyBvbmx5IHRoZSBCT01cbiAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gQnVmZmVyLmFsbG9jKDApXG4gICAgICAgICAgICAvLyBTZXQgdGhlIGNoZWNrQk9NIGZsYWcgdG8gZmFsc2UgYXMgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgdGhlXG4gICAgICAgICAgICAvLyBCT00gYW55bW9yZVxuICAgICAgICAgICAgdGhpcy5jaGVja0JPTSA9IGZhbHNlXG5cbiAgICAgICAgICAgIC8vIEF3YWl0IG1vcmUgZGF0YVxuICAgICAgICAgICAgY2FsbGJhY2soKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIElmIGl0IGlzIG5vdCB0aGUgQk9NLCB3ZSBjYW4gc3RhcnQgcHJvY2Vzc2luZyB0aGUgZGF0YVxuICAgICAgICAgIHRoaXMuY2hlY2tCT00gPSBmYWxzZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gVGhlIGJ1ZmZlciBpcyBsb25nZXIgdGhhbiAzIGJ5dGVzLCBzbyB3ZSBjYW4gZHJvcCB0aGUgQk9NIGlmIGl0IGlzXG4gICAgICAgICAgLy8gcHJlc2VudFxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyWzBdID09PSBCT01bMF0gJiZcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyWzFdID09PSBCT01bMV0gJiZcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyWzJdID09PSBCT01bMl1cbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgQk9NIGZyb20gdGhlIGJ1ZmZlclxuICAgICAgICAgICAgdGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlci5zdWJhcnJheSgzKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNldCB0aGUgY2hlY2tCT00gZmxhZyB0byBmYWxzZSBhcyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciB0aGVcbiAgICAgICAgICB0aGlzLmNoZWNrQk9NID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIHdoaWxlICh0aGlzLnBvcyA8IHRoaXMuYnVmZmVyLmxlbmd0aCkge1xuICAgICAgLy8gSWYgdGhlIHByZXZpb3VzIGxpbmUgZW5kZWQgd2l0aCBhbiBlbmQtb2YtbGluZSwgd2UgbmVlZCB0byBjaGVja1xuICAgICAgLy8gaWYgdGhlIG5leHQgY2hhcmFjdGVyIGlzIGFsc28gYW4gZW5kLW9mLWxpbmUuXG4gICAgICBpZiAodGhpcy5ldmVudEVuZENoZWNrKSB7XG4gICAgICAgIC8vIElmIHRoZSB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgYW4gZW5kLW9mLWxpbmUsIHRoZW4gdGhlIGV2ZW50XG4gICAgICAgIC8vIGlzIGZpbmlzaGVkIGFuZCB3ZSBjYW4gcHJvY2VzcyBpdFxuXG4gICAgICAgIC8vIElmIHRoZSBwcmV2aW91cyBsaW5lIGVuZGVkIHdpdGggYSBjYXJyaWFnZSByZXR1cm4sIHdlIG5lZWQgdG9cbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGlzIGEgbGluZSBmZWVkIGFuZCByZW1vdmUgaXRcbiAgICAgICAgLy8gZnJvbSB0aGUgYnVmZmVyLlxuICAgICAgICBpZiAodGhpcy5jcmxmQ2hlY2spIHtcbiAgICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgYSBsaW5lIGZlZWQsIHdlIGNhbiByZW1vdmUgaXRcbiAgICAgICAgICAvLyBmcm9tIHRoZSBidWZmZXIgYW5kIHJlc2V0IHRoZSBjcmxmQ2hlY2sgZmxhZ1xuICAgICAgICAgIGlmICh0aGlzLmJ1ZmZlclt0aGlzLnBvc10gPT09IExGKSB7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IHRoaXMuYnVmZmVyLnN1YmFycmF5KHRoaXMucG9zICsgMSlcbiAgICAgICAgICAgIHRoaXMucG9zID0gMFxuICAgICAgICAgICAgdGhpcy5jcmxmQ2hlY2sgPSBmYWxzZVxuXG4gICAgICAgICAgICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBsaW5lIGZlZWQgaXMgbm90IHRoZSBlbmQgb2YgdGhlXG4gICAgICAgICAgICAvLyBldmVudC4gV2UgbmVlZCB0byBjaGVjayBpZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgYW5cbiAgICAgICAgICAgIC8vIGVuZC1vZi1saW5lIGNoYXJhY3RlciB0byBkZXRlcm1pbmUgaWYgdGhlIGV2ZW50IGlzXG4gICAgICAgICAgICAvLyBmaW5pc2hlZC4gV2Ugc2ltcGx5IGNvbnRpbnVlIHRoZSBsb29wIHRvIGNoZWNrIHRoZSBuZXh0XG4gICAgICAgICAgICAvLyBjaGFyYWN0ZXIuXG5cbiAgICAgICAgICAgIC8vIEFzIHdlIHJlbW92ZWQgdGhlIGxpbmUgZmVlZCBmcm9tIHRoZSBidWZmZXIgYW5kIHNldCB0aGVcbiAgICAgICAgICAgIC8vIGNybGZDaGVjayBmbGFnIHRvIGZhbHNlLCB3ZSBiYXNpY2FsbHkgZG9uJ3QgbWFrZSBhbnlcbiAgICAgICAgICAgIC8vIGRpc3RpbmN0aW9uIGJldHdlZW4gYSBsaW5lIGZlZWQgYW5kIGEgY2FycmlhZ2UgcmV0dXJuLlxuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jcmxmQ2hlY2sgPSBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyW3RoaXMucG9zXSA9PT0gTEYgfHwgdGhpcy5idWZmZXJbdGhpcy5wb3NdID09PSBDUikge1xuICAgICAgICAgIC8vIElmIHRoZSBjdXJyZW50IGNoYXJhY3RlciBpcyBhIGNhcnJpYWdlIHJldHVybiwgd2UgbmVlZCB0b1xuICAgICAgICAgIC8vIHNldCB0aGUgY3JsZkNoZWNrIGZsYWcgdG8gdHJ1ZSwgYXMgd2UgbmVlZCB0byBjaGVjayBpZiB0aGVcbiAgICAgICAgICAvLyBuZXh0IGNoYXJhY3RlciBpcyBhIGxpbmUgZmVlZCBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGZyb20gdGhlXG4gICAgICAgICAgLy8gYnVmZmVyXG4gICAgICAgICAgaWYgKHRoaXMuYnVmZmVyW3RoaXMucG9zXSA9PT0gQ1IpIHtcbiAgICAgICAgICAgIHRoaXMuY3JsZkNoZWNrID0gdHJ1ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuYnVmZmVyID0gdGhpcy5idWZmZXIuc3ViYXJyYXkodGhpcy5wb3MgKyAxKVxuICAgICAgICAgIHRoaXMucG9zID0gMFxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuZXZlbnQuZGF0YSAhPT0gdW5kZWZpbmVkIHx8IHRoaXMuZXZlbnQuZXZlbnQgfHwgdGhpcy5ldmVudC5pZCB8fCB0aGlzLmV2ZW50LnJldHJ5KSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NFdmVudCh0aGlzLmV2ZW50KVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNsZWFyRXZlbnQoKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGlzIG5vdCBhbiBlbmQtb2YtbGluZSwgdGhlbiB0aGUgZXZlbnRcbiAgICAgICAgLy8gaXMgbm90IGZpbmlzaGVkIGFuZCB3ZSBoYXZlIHRvIHJlc2V0IHRoZSBldmVudEVuZENoZWNrIGZsYWdcbiAgICAgICAgdGhpcy5ldmVudEVuZENoZWNrID0gZmFsc2VcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGlzIGFuIGVuZC1vZi1saW5lLCB3ZSBjYW4gcHJvY2VzcyB0aGVcbiAgICAgIC8vIGxpbmVcbiAgICAgIGlmICh0aGlzLmJ1ZmZlclt0aGlzLnBvc10gPT09IExGIHx8IHRoaXMuYnVmZmVyW3RoaXMucG9zXSA9PT0gQ1IpIHtcbiAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGlzIGEgY2FycmlhZ2UgcmV0dXJuLCB3ZSBuZWVkIHRvXG4gICAgICAgIC8vIHNldCB0aGUgY3JsZkNoZWNrIGZsYWcgdG8gdHJ1ZSwgYXMgd2UgbmVlZCB0byBjaGVjayBpZiB0aGVcbiAgICAgICAgLy8gbmV4dCBjaGFyYWN0ZXIgaXMgYSBsaW5lIGZlZWRcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyW3RoaXMucG9zXSA9PT0gQ1IpIHtcbiAgICAgICAgICB0aGlzLmNybGZDaGVjayA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluIGFueSBjYXNlLCB3ZSBjYW4gcHJvY2VzcyB0aGUgbGluZSBhcyB3ZSByZWFjaGVkIGFuXG4gICAgICAgIC8vIGVuZC1vZi1saW5lIGNoYXJhY3RlclxuICAgICAgICB0aGlzLnBhcnNlTGluZSh0aGlzLmJ1ZmZlci5zdWJhcnJheSgwLCB0aGlzLnBvcyksIHRoaXMuZXZlbnQpXG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBwcm9jZXNzZWQgbGluZSBmcm9tIHRoZSBidWZmZXJcbiAgICAgICAgdGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlci5zdWJhcnJheSh0aGlzLnBvcyArIDEpXG4gICAgICAgIC8vIFJlc2V0IHRoZSBwb3NpdGlvbiBhcyB3ZSByZW1vdmVkIHRoZSBwcm9jZXNzZWQgbGluZSBmcm9tIHRoZSBidWZmZXJcbiAgICAgICAgdGhpcy5wb3MgPSAwXG4gICAgICAgIC8vIEEgbGluZSB3YXMgcHJvY2Vzc2VkIGFuZCB0aGlzIGNvdWxkIGJlIHRoZSBlbmQgb2YgdGhlIGV2ZW50LiBXZSBuZWVkXG4gICAgICAgIC8vIHRvIGNoZWNrIGlmIHRoZSBuZXh0IGxpbmUgaXMgZW1wdHkgdG8gZGV0ZXJtaW5lIGlmIHRoZSBldmVudCBpc1xuICAgICAgICAvLyBmaW5pc2hlZC5cbiAgICAgICAgdGhpcy5ldmVudEVuZENoZWNrID0gdHJ1ZVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0aGlzLnBvcysrXG4gICAgfVxuXG4gICAgY2FsbGJhY2soKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBsaW5lXG4gICAqIEBwYXJhbSB7RXZlbnRTdHJlYW1FdmVudH0gZXZlbnRcbiAgICovXG4gIHBhcnNlTGluZSAobGluZSwgZXZlbnQpIHtcbiAgICAvLyBJZiB0aGUgbGluZSBpcyBlbXB0eSAoYSBibGFuayBsaW5lKVxuICAgIC8vIERpc3BhdGNoIHRoZSBldmVudCwgYXMgZGVmaW5lZCBiZWxvdy5cbiAgICAvLyBUaGlzIHdpbGwgYmUgaGFuZGxlZCBpbiB0aGUgX3RyYW5zZm9ybSBtZXRob2RcbiAgICBpZiAobGluZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIElmIHRoZSBsaW5lIHN0YXJ0cyB3aXRoIGEgVSswMDNBIENPTE9OIGNoYXJhY3RlciAoOilcbiAgICAvLyBJZ25vcmUgdGhlIGxpbmUuXG4gICAgY29uc3QgY29sb25Qb3NpdGlvbiA9IGxpbmUuaW5kZXhPZihDT0xPTilcbiAgICBpZiAoY29sb25Qb3NpdGlvbiA9PT0gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgbGV0IGZpZWxkID0gJydcbiAgICBsZXQgdmFsdWUgPSAnJ1xuXG4gICAgLy8gSWYgdGhlIGxpbmUgY29udGFpbnMgYSBVKzAwM0EgQ09MT04gY2hhcmFjdGVyICg6KVxuICAgIGlmIChjb2xvblBvc2l0aW9uICE9PSAtMSkge1xuICAgICAgLy8gQ29sbGVjdCB0aGUgY2hhcmFjdGVycyBvbiB0aGUgbGluZSBiZWZvcmUgdGhlIGZpcnN0IFUrMDAzQSBDT0xPTlxuICAgICAgLy8gY2hhcmFjdGVyICg6KSwgYW5kIGxldCBmaWVsZCBiZSB0aGF0IHN0cmluZy5cbiAgICAgIC8vIFRPRE86IEludmVzdGlnYXRlIGlmIHRoZXJlIGlzIGEgbW9yZSBwZXJmb3JtYW50IHdheSB0byBleHRyYWN0IHRoZVxuICAgICAgLy8gZmllbGRcbiAgICAgIC8vIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzI2MzBcbiAgICAgIGZpZWxkID0gbGluZS5zdWJhcnJheSgwLCBjb2xvblBvc2l0aW9uKS50b1N0cmluZygndXRmOCcpXG5cbiAgICAgIC8vIENvbGxlY3QgdGhlIGNoYXJhY3RlcnMgb24gdGhlIGxpbmUgYWZ0ZXIgdGhlIGZpcnN0IFUrMDAzQSBDT0xPTlxuICAgICAgLy8gY2hhcmFjdGVyICg6KSwgYW5kIGxldCB2YWx1ZSBiZSB0aGF0IHN0cmluZy5cbiAgICAgIC8vIElmIHZhbHVlIHN0YXJ0cyB3aXRoIGEgVSswMDIwIFNQQUNFIGNoYXJhY3RlciwgcmVtb3ZlIGl0IGZyb20gdmFsdWUuXG4gICAgICBsZXQgdmFsdWVTdGFydCA9IGNvbG9uUG9zaXRpb24gKyAxXG4gICAgICBpZiAobGluZVt2YWx1ZVN0YXJ0XSA9PT0gU1BBQ0UpIHtcbiAgICAgICAgKyt2YWx1ZVN0YXJ0XG4gICAgICB9XG4gICAgICAvLyBUT0RPOiBJbnZlc3RpZ2F0ZSBpZiB0aGVyZSBpcyBhIG1vcmUgcGVyZm9ybWFudCB3YXkgdG8gZXh0cmFjdCB0aGVcbiAgICAgIC8vIHZhbHVlXG4gICAgICAvLyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2lzc3Vlcy8yNjMwXG4gICAgICB2YWx1ZSA9IGxpbmUuc3ViYXJyYXkodmFsdWVTdGFydCkudG9TdHJpbmcoJ3V0ZjgnKVxuXG4gICAgICAvLyBPdGhlcndpc2UsIHRoZSBzdHJpbmcgaXMgbm90IGVtcHR5IGJ1dCBkb2VzIG5vdCBjb250YWluIGEgVSswMDNBIENPTE9OXG4gICAgICAvLyBjaGFyYWN0ZXIgKDopXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFByb2Nlc3MgdGhlIGZpZWxkIHVzaW5nIHRoZSBzdGVwcyBkZXNjcmliZWQgYmVsb3csIHVzaW5nIHRoZSB3aG9sZVxuICAgICAgLy8gbGluZSBhcyB0aGUgZmllbGQgbmFtZSwgYW5kIHRoZSBlbXB0eSBzdHJpbmcgYXMgdGhlIGZpZWxkIHZhbHVlLlxuICAgICAgZmllbGQgPSBsaW5lLnRvU3RyaW5nKCd1dGY4JylcbiAgICAgIHZhbHVlID0gJydcbiAgICB9XG5cbiAgICAvLyBNb2RpZnkgdGhlIGV2ZW50IHdpdGggdGhlIGZpZWxkIG5hbWUgYW5kIHZhbHVlLiBUaGUgdmFsdWUgaXMgYWxzb1xuICAgIC8vIGRlY29kZWQgYXMgVVRGLThcbiAgICBzd2l0Y2ggKGZpZWxkKSB7XG4gICAgICBjYXNlICdkYXRhJzpcbiAgICAgICAgaWYgKGV2ZW50W2ZpZWxkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZXZlbnRbZmllbGRdID0gdmFsdWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBldmVudFtmaWVsZF0gKz0gYFxcbiR7dmFsdWV9YFxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdyZXRyeSc6XG4gICAgICAgIGlmIChpc0FTQ0lJTnVtYmVyKHZhbHVlKSkge1xuICAgICAgICAgIGV2ZW50W2ZpZWxkXSA9IHZhbHVlXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ2lkJzpcbiAgICAgICAgaWYgKGlzVmFsaWRMYXN0RXZlbnRJZCh2YWx1ZSkpIHtcbiAgICAgICAgICBldmVudFtmaWVsZF0gPSB2YWx1ZVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdldmVudCc6XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZXZlbnRbZmllbGRdID0gdmFsdWVcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50U291cmNlU3RyZWFtRXZlbnR9IGV2ZW50XG4gICAqL1xuICBwcm9jZXNzRXZlbnQgKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnJldHJ5ICYmIGlzQVNDSUlOdW1iZXIoZXZlbnQucmV0cnkpKSB7XG4gICAgICB0aGlzLnN0YXRlLnJlY29ubmVjdGlvblRpbWUgPSBwYXJzZUludChldmVudC5yZXRyeSwgMTApXG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmlkICYmIGlzVmFsaWRMYXN0RXZlbnRJZChldmVudC5pZCkpIHtcbiAgICAgIHRoaXMuc3RhdGUubGFzdEV2ZW50SWQgPSBldmVudC5pZFxuICAgIH1cblxuICAgIC8vIG9ubHkgZGlzcGF0Y2ggZXZlbnQsIHdoZW4gZGF0YSBpcyBwcm92aWRlZFxuICAgIGlmIChldmVudC5kYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucHVzaCh7XG4gICAgICAgIHR5cGU6IGV2ZW50LmV2ZW50IHx8ICdtZXNzYWdlJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGRhdGE6IGV2ZW50LmRhdGEsXG4gICAgICAgICAgbGFzdEV2ZW50SWQ6IHRoaXMuc3RhdGUubGFzdEV2ZW50SWQsXG4gICAgICAgICAgb3JpZ2luOiB0aGlzLnN0YXRlLm9yaWdpblxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGNsZWFyRXZlbnQgKCkge1xuICAgIHRoaXMuZXZlbnQgPSB7XG4gICAgICBkYXRhOiB1bmRlZmluZWQsXG4gICAgICBldmVudDogdW5kZWZpbmVkLFxuICAgICAgaWQ6IHVuZGVmaW5lZCxcbiAgICAgIHJldHJ5OiB1bmRlZmluZWRcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEV2ZW50U291cmNlU3RyZWFtXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBwaXBlbGluZSB9ID0gcmVxdWlyZSgnbm9kZTpzdHJlYW0nKVxuY29uc3QgeyBmZXRjaGluZyB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gnKVxuY29uc3QgeyBtYWtlUmVxdWVzdCB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvcmVxdWVzdCcpXG5jb25zdCB7IHdlYmlkbCB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvd2ViaWRsJylcbmNvbnN0IHsgRXZlbnRTb3VyY2VTdHJlYW0gfSA9IHJlcXVpcmUoJy4vZXZlbnRzb3VyY2Utc3RyZWFtJylcbmNvbnN0IHsgcGFyc2VNSU1FVHlwZSB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvZGF0YS11cmwnKVxuY29uc3QgeyBjcmVhdGVGYXN0TWVzc2FnZUV2ZW50IH0gPSByZXF1aXJlKCcuLi93ZWJzb2NrZXQvZXZlbnRzJylcbmNvbnN0IHsgaXNOZXR3b3JrRXJyb3IgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3Jlc3BvbnNlJylcbmNvbnN0IHsgZGVsYXkgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IGtFbnVtZXJhYmxlUHJvcGVydHkgfSA9IHJlcXVpcmUoJy4uLy4uL2NvcmUvdXRpbCcpXG5jb25zdCB7IGVudmlyb25tZW50U2V0dGluZ3NPYmplY3QgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3V0aWwnKVxuXG5sZXQgZXhwZXJpbWVudGFsV2FybmVkID0gZmFsc2VcblxuLyoqXG4gKiBBIHJlY29ubmVjdGlvbiB0aW1lLCBpbiBtaWxsaXNlY29uZHMuIFRoaXMgbXVzdCBpbml0aWFsbHkgYmUgYW4gaW1wbGVtZW50YXRpb24tZGVmaW5lZCB2YWx1ZSxcbiAqIHByb2JhYmx5IGluIHRoZSByZWdpb24gb2YgYSBmZXcgc2Vjb25kcy5cbiAqXG4gKiBJbiBDb21wYXJpc29uOlxuICogLSBDaHJvbWUgdXNlcyAzMDAwbXMuXG4gKiAtIERlbm8gdXNlcyA1MDAwbXMuXG4gKlxuICogQHR5cGUgezMwMDB9XG4gKi9cbmNvbnN0IGRlZmF1bHRSZWNvbm5lY3Rpb25UaW1lID0gMzAwMFxuXG4vKipcbiAqIFRoZSByZWFkeVN0YXRlIGF0dHJpYnV0ZSByZXByZXNlbnRzIHRoZSBzdGF0ZSBvZiB0aGUgY29ubmVjdGlvbi5cbiAqIEBlbnVtXG4gKiBAcmVhZG9ubHlcbiAqIEBzZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2VydmVyLXNlbnQtZXZlbnRzLmh0bWwjZG9tLWV2ZW50c291cmNlLXJlYWR5c3RhdGUtZGV2XG4gKi9cblxuLyoqXG4gKiBUaGUgY29ubmVjdGlvbiBoYXMgbm90IHlldCBiZWVuIGVzdGFibGlzaGVkLCBvciBpdCB3YXMgY2xvc2VkIGFuZCB0aGUgdXNlclxuICogYWdlbnQgaXMgcmVjb25uZWN0aW5nLlxuICogQHR5cGUgezB9XG4gKi9cbmNvbnN0IENPTk5FQ1RJTkcgPSAwXG5cbi8qKlxuICogVGhlIHVzZXIgYWdlbnQgaGFzIGFuIG9wZW4gY29ubmVjdGlvbiBhbmQgaXMgZGlzcGF0Y2hpbmcgZXZlbnRzIGFzIGl0XG4gKiByZWNlaXZlcyB0aGVtLlxuICogQHR5cGUgezF9XG4gKi9cbmNvbnN0IE9QRU4gPSAxXG5cbi8qKlxuICogVGhlIGNvbm5lY3Rpb24gaXMgbm90IG9wZW4sIGFuZCB0aGUgdXNlciBhZ2VudCBpcyBub3QgdHJ5aW5nIHRvIHJlY29ubmVjdC5cbiAqIEB0eXBlIHsyfVxuICovXG5jb25zdCBDTE9TRUQgPSAyXG5cbi8qKlxuICogUmVxdWVzdHMgZm9yIHRoZSBlbGVtZW50IHdpbGwgaGF2ZSB0aGVpciBtb2RlIHNldCB0byBcImNvcnNcIiBhbmQgdGhlaXIgY3JlZGVudGlhbHMgbW9kZSBzZXQgdG8gXCJzYW1lLW9yaWdpblwiLlxuICogQHR5cGUgeydhbm9ueW1vdXMnfVxuICovXG5jb25zdCBBTk9OWU1PVVMgPSAnYW5vbnltb3VzJ1xuXG4vKipcbiAqIFJlcXVlc3RzIGZvciB0aGUgZWxlbWVudCB3aWxsIGhhdmUgdGhlaXIgbW9kZSBzZXQgdG8gXCJjb3JzXCIgYW5kIHRoZWlyIGNyZWRlbnRpYWxzIG1vZGUgc2V0IHRvIFwiaW5jbHVkZVwiLlxuICogQHR5cGUgeyd1c2UtY3JlZGVudGlhbHMnfVxuICovXG5jb25zdCBVU0VfQ1JFREVOVElBTFMgPSAndXNlLWNyZWRlbnRpYWxzJ1xuXG4vKipcbiAqIFRoZSBFdmVudFNvdXJjZSBpbnRlcmZhY2UgaXMgdXNlZCB0byByZWNlaXZlIHNlcnZlci1zZW50IGV2ZW50cy4gSXRcbiAqIGNvbm5lY3RzIHRvIGEgc2VydmVyIG92ZXIgSFRUUCBhbmQgcmVjZWl2ZXMgZXZlbnRzIGluIHRleHQvZXZlbnQtc3RyZWFtXG4gKiBmb3JtYXQgd2l0aG91dCBjbG9zaW5nIHRoZSBjb25uZWN0aW9uLlxuICogQGV4dGVuZHMge0V2ZW50VGFyZ2V0fVxuICogQHNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zZXJ2ZXItc2VudC1ldmVudHMuaHRtbCNzZXJ2ZXItc2VudC1ldmVudHNcbiAqIEBhcGkgcHVibGljXG4gKi9cbmNsYXNzIEV2ZW50U291cmNlIGV4dGVuZHMgRXZlbnRUYXJnZXQge1xuICAjZXZlbnRzID0ge1xuICAgIG9wZW46IG51bGwsXG4gICAgZXJyb3I6IG51bGwsXG4gICAgbWVzc2FnZTogbnVsbFxuICB9XG5cbiAgI3VybCA9IG51bGxcbiAgI3dpdGhDcmVkZW50aWFscyA9IGZhbHNlXG5cbiAgI3JlYWR5U3RhdGUgPSBDT05ORUNUSU5HXG5cbiAgI3JlcXVlc3QgPSBudWxsXG4gICNjb250cm9sbGVyID0gbnVsbFxuXG4gICNkaXNwYXRjaGVyXG5cbiAgLyoqXG4gICAqIEB0eXBlIHtpbXBvcnQoJy4vZXZlbnRzb3VyY2Utc3RyZWFtJykuZXZlbnRTb3VyY2VTZXR0aW5nc31cbiAgICovXG4gICNzdGF0ZVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEV2ZW50U291cmNlIG9iamVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcGFyYW0ge0V2ZW50U291cmNlSW5pdH0gW2V2ZW50U291cmNlSW5pdERpY3RdXG4gICAqIEBzZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2VydmVyLXNlbnQtZXZlbnRzLmh0bWwjdGhlLWV2ZW50c291cmNlLWludGVyZmFjZVxuICAgKi9cbiAgY29uc3RydWN0b3IgKHVybCwgZXZlbnRTb3VyY2VJbml0RGljdCA9IHt9KSB7XG4gICAgLy8gMS4gTGV0IGV2IGJlIGEgbmV3IEV2ZW50U291cmNlIG9iamVjdC5cbiAgICBzdXBlcigpXG5cbiAgICB3ZWJpZGwudXRpbC5tYXJrQXNVbmNsb25lYWJsZSh0aGlzKVxuXG4gICAgY29uc3QgcHJlZml4ID0gJ0V2ZW50U291cmNlIGNvbnN0cnVjdG9yJ1xuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgcHJlZml4KVxuXG4gICAgaWYgKCFleHBlcmltZW50YWxXYXJuZWQpIHtcbiAgICAgIGV4cGVyaW1lbnRhbFdhcm5lZCA9IHRydWVcbiAgICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcoJ0V2ZW50U291cmNlIGlzIGV4cGVyaW1lbnRhbCwgZXhwZWN0IHRoZW0gdG8gY2hhbmdlIGF0IGFueSB0aW1lLicsIHtcbiAgICAgICAgY29kZTogJ1VORElDSS1FUydcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdXJsID0gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKHVybCwgcHJlZml4LCAndXJsJylcbiAgICBldmVudFNvdXJjZUluaXREaWN0ID0gd2ViaWRsLmNvbnZlcnRlcnMuRXZlbnRTb3VyY2VJbml0RGljdChldmVudFNvdXJjZUluaXREaWN0LCBwcmVmaXgsICdldmVudFNvdXJjZUluaXREaWN0JylcblxuICAgIHRoaXMuI2Rpc3BhdGNoZXIgPSBldmVudFNvdXJjZUluaXREaWN0LmRpc3BhdGNoZXJcbiAgICB0aGlzLiNzdGF0ZSA9IHtcbiAgICAgIGxhc3RFdmVudElkOiAnJyxcbiAgICAgIHJlY29ubmVjdGlvblRpbWU6IGRlZmF1bHRSZWNvbm5lY3Rpb25UaW1lXG4gICAgfVxuXG4gICAgLy8gMi4gTGV0IHNldHRpbmdzIGJlIGV2J3MgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN0LlxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3dlYmFwcGFwaXMuaHRtbCNlbnZpcm9ubWVudC1zZXR0aW5ncy1vYmplY3RcbiAgICBjb25zdCBzZXR0aW5ncyA9IGVudmlyb25tZW50U2V0dGluZ3NPYmplY3RcblxuICAgIGxldCB1cmxSZWNvcmRcblxuICAgIHRyeSB7XG4gICAgICAvLyAzLiBMZXQgdXJsUmVjb3JkIGJlIHRoZSByZXN1bHQgb2YgZW5jb2RpbmctcGFyc2luZyBhIFVSTCBnaXZlbiB1cmwsIHJlbGF0aXZlIHRvIHNldHRpbmdzLlxuICAgICAgdXJsUmVjb3JkID0gbmV3IFVSTCh1cmwsIHNldHRpbmdzLnNldHRpbmdzT2JqZWN0LmJhc2VVcmwpXG4gICAgICB0aGlzLiNzdGF0ZS5vcmlnaW4gPSB1cmxSZWNvcmQub3JpZ2luXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gNC4gSWYgdXJsUmVjb3JkIGlzIGZhaWx1cmUsIHRoZW4gdGhyb3cgYSBcIlN5bnRheEVycm9yXCIgRE9NRXhjZXB0aW9uLlxuICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihlLCAnU3ludGF4RXJyb3InKVxuICAgIH1cblxuICAgIC8vIDUuIFNldCBldidzIHVybCB0byB1cmxSZWNvcmQuXG4gICAgdGhpcy4jdXJsID0gdXJsUmVjb3JkLmhyZWZcblxuICAgIC8vIDYuIExldCBjb3JzQXR0cmlidXRlU3RhdGUgYmUgQW5vbnltb3VzLlxuICAgIGxldCBjb3JzQXR0cmlidXRlU3RhdGUgPSBBTk9OWU1PVVNcblxuICAgIC8vIDcuIElmIHRoZSB2YWx1ZSBvZiBldmVudFNvdXJjZUluaXREaWN0J3Mgd2l0aENyZWRlbnRpYWxzIG1lbWJlciBpcyB0cnVlLFxuICAgIC8vIHRoZW4gc2V0IGNvcnNBdHRyaWJ1dGVTdGF0ZSB0byBVc2UgQ3JlZGVudGlhbHMgYW5kIHNldCBldidzXG4gICAgLy8gd2l0aENyZWRlbnRpYWxzIGF0dHJpYnV0ZSB0byB0cnVlLlxuICAgIGlmIChldmVudFNvdXJjZUluaXREaWN0LndpdGhDcmVkZW50aWFscykge1xuICAgICAgY29yc0F0dHJpYnV0ZVN0YXRlID0gVVNFX0NSRURFTlRJQUxTXG4gICAgICB0aGlzLiN3aXRoQ3JlZGVudGlhbHMgPSB0cnVlXG4gICAgfVxuXG4gICAgLy8gOC4gTGV0IHJlcXVlc3QgYmUgdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhIHBvdGVudGlhbC1DT1JTIHJlcXVlc3QgZ2l2ZW5cbiAgICAvLyB1cmxSZWNvcmQsIHRoZSBlbXB0eSBzdHJpbmcsIGFuZCBjb3JzQXR0cmlidXRlU3RhdGUuXG4gICAgY29uc3QgaW5pdFJlcXVlc3QgPSB7XG4gICAgICByZWRpcmVjdDogJ2ZvbGxvdycsXG4gICAgICBrZWVwYWxpdmU6IHRydWUsXG4gICAgICAvLyBAc2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3VybHMtYW5kLWZldGNoaW5nLmh0bWwjY29ycy1zZXR0aW5ncy1hdHRyaWJ1dGVzXG4gICAgICBtb2RlOiAnY29ycycsXG4gICAgICBjcmVkZW50aWFsczogY29yc0F0dHJpYnV0ZVN0YXRlID09PSAnYW5vbnltb3VzJ1xuICAgICAgICA/ICdzYW1lLW9yaWdpbidcbiAgICAgICAgOiAnb21pdCcsXG4gICAgICByZWZlcnJlcjogJ25vLXJlZmVycmVyJ1xuICAgIH1cblxuICAgIC8vIDkuIFNldCByZXF1ZXN0J3MgY2xpZW50IHRvIHNldHRpbmdzLlxuICAgIGluaXRSZXF1ZXN0LmNsaWVudCA9IGVudmlyb25tZW50U2V0dGluZ3NPYmplY3Quc2V0dGluZ3NPYmplY3RcblxuICAgIC8vIDEwLiBVc2VyIGFnZW50cyBtYXkgc2V0IChgQWNjZXB0YCwgYHRleHQvZXZlbnQtc3RyZWFtYCkgaW4gcmVxdWVzdCdzIGhlYWRlciBsaXN0LlxuICAgIGluaXRSZXF1ZXN0LmhlYWRlcnNMaXN0ID0gW1snYWNjZXB0JywgeyBuYW1lOiAnYWNjZXB0JywgdmFsdWU6ICd0ZXh0L2V2ZW50LXN0cmVhbScgfV1dXG5cbiAgICAvLyAxMS4gU2V0IHJlcXVlc3QncyBjYWNoZSBtb2RlIHRvIFwibm8tc3RvcmVcIi5cbiAgICBpbml0UmVxdWVzdC5jYWNoZSA9ICduby1zdG9yZSdcblxuICAgIC8vIDEyLiBTZXQgcmVxdWVzdCdzIGluaXRpYXRvciB0eXBlIHRvIFwib3RoZXJcIi5cbiAgICBpbml0UmVxdWVzdC5pbml0aWF0b3IgPSAnb3RoZXInXG5cbiAgICBpbml0UmVxdWVzdC51cmxMaXN0ID0gW25ldyBVUkwodGhpcy4jdXJsKV1cblxuICAgIC8vIDEzLiBTZXQgZXYncyByZXF1ZXN0IHRvIHJlcXVlc3QuXG4gICAgdGhpcy4jcmVxdWVzdCA9IG1ha2VSZXF1ZXN0KGluaXRSZXF1ZXN0KVxuXG4gICAgdGhpcy4jY29ubmVjdCgpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3RhdGUgb2YgdGhpcyBFdmVudFNvdXJjZSBvYmplY3QncyBjb25uZWN0aW9uLiBJdCBjYW4gaGF2ZSB0aGVcbiAgICogdmFsdWVzIGRlc2NyaWJlZCBiZWxvdy5cbiAgICogQHJldHVybnMgezB8MXwyfVxuICAgKiBAcmVhZG9ubHlcbiAgICovXG4gIGdldCByZWFkeVN0YXRlICgpIHtcbiAgICByZXR1cm4gdGhpcy4jcmVhZHlTdGF0ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIFVSTCBwcm92aWRpbmcgdGhlIGV2ZW50IHN0cmVhbS5cbiAgICogQHJlYWRvbmx5XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgdXJsICgpIHtcbiAgICByZXR1cm4gdGhpcy4jdXJsXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBFdmVudFNvdXJjZSBvYmplY3Qgd2FzXG4gICAqIGluc3RhbnRpYXRlZCB3aXRoIENPUlMgY3JlZGVudGlhbHMgc2V0ICh0cnVlKSwgb3Igbm90IChmYWxzZSwgdGhlIGRlZmF1bHQpLlxuICAgKi9cbiAgZ2V0IHdpdGhDcmVkZW50aWFscyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3dpdGhDcmVkZW50aWFsc1xuICB9XG5cbiAgI2Nvbm5lY3QgKCkge1xuICAgIGlmICh0aGlzLiNyZWFkeVN0YXRlID09PSBDTE9TRUQpIHJldHVyblxuXG4gICAgdGhpcy4jcmVhZHlTdGF0ZSA9IENPTk5FQ1RJTkdcblxuICAgIGNvbnN0IGZldGNoUGFyYW1zID0ge1xuICAgICAgcmVxdWVzdDogdGhpcy4jcmVxdWVzdCxcbiAgICAgIGRpc3BhdGNoZXI6IHRoaXMuI2Rpc3BhdGNoZXJcbiAgICB9XG5cbiAgICAvLyAxNC4gTGV0IHByb2Nlc3NFdmVudFNvdXJjZUVuZE9mQm9keSBnaXZlbiByZXNwb25zZSByZXMgYmUgdGhlIGZvbGxvd2luZyBzdGVwOiBpZiByZXMgaXMgbm90IGEgbmV0d29yayBlcnJvciwgdGhlbiByZWVzdGFibGlzaCB0aGUgY29ubmVjdGlvbi5cbiAgICBjb25zdCBwcm9jZXNzRXZlbnRTb3VyY2VFbmRPZkJvZHkgPSAocmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChpc05ldHdvcmtFcnJvcihyZXNwb25zZSkpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnZXJyb3InKSlcbiAgICAgICAgdGhpcy5jbG9zZSgpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuI3JlY29ubmVjdCgpXG4gICAgfVxuXG4gICAgLy8gMTUuIEZldGNoIHJlcXVlc3QsIHdpdGggcHJvY2Vzc1Jlc3BvbnNlRW5kT2ZCb2R5IHNldCB0byBwcm9jZXNzRXZlbnRTb3VyY2VFbmRPZkJvZHkuLi5cbiAgICBmZXRjaFBhcmFtcy5wcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHkgPSBwcm9jZXNzRXZlbnRTb3VyY2VFbmRPZkJvZHlcblxuICAgIC8vIGFuZCBwcm9jZXNzUmVzcG9uc2Ugc2V0IHRvIHRoZSBmb2xsb3dpbmcgc3RlcHMgZ2l2ZW4gcmVzcG9uc2UgcmVzOlxuICAgIGZldGNoUGFyYW1zLnByb2Nlc3NSZXNwb25zZSA9IChyZXNwb25zZSkgPT4ge1xuICAgICAgLy8gMS4gSWYgcmVzIGlzIGFuIGFib3J0ZWQgbmV0d29yayBlcnJvciwgdGhlbiBmYWlsIHRoZSBjb25uZWN0aW9uLlxuXG4gICAgICBpZiAoaXNOZXR3b3JrRXJyb3IocmVzcG9uc2UpKSB7XG4gICAgICAgIC8vIDEuIFdoZW4gYSB1c2VyIGFnZW50IGlzIHRvIGZhaWwgdGhlIGNvbm5lY3Rpb24sIHRoZSB1c2VyIGFnZW50XG4gICAgICAgIC8vIG11c3QgcXVldWUgYSB0YXNrIHdoaWNoLCBpZiB0aGUgcmVhZHlTdGF0ZSBhdHRyaWJ1dGUgaXMgc2V0IHRvIGFcbiAgICAgICAgLy8gdmFsdWUgb3RoZXIgdGhhbiBDTE9TRUQsIHNldHMgdGhlIHJlYWR5U3RhdGUgYXR0cmlidXRlIHRvIENMT1NFRFxuICAgICAgICAvLyBhbmQgZmlyZXMgYW4gZXZlbnQgbmFtZWQgZXJyb3IgYXQgdGhlIEV2ZW50U291cmNlIG9iamVjdC4gT25jZSB0aGVcbiAgICAgICAgLy8gdXNlciBhZ2VudCBoYXMgZmFpbGVkIHRoZSBjb25uZWN0aW9uLCBpdCBkb2VzIG5vdCBhdHRlbXB0IHRvXG4gICAgICAgIC8vIHJlY29ubmVjdC5cbiAgICAgICAgaWYgKHJlc3BvbnNlLmFib3J0ZWQpIHtcbiAgICAgICAgICB0aGlzLmNsb3NlKClcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdlcnJvcicpKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICAgIC8vIDIuIE90aGVyd2lzZSwgaWYgcmVzIGlzIGEgbmV0d29yayBlcnJvciwgdGhlbiByZWVzdGFibGlzaCB0aGVcbiAgICAgICAgICAvLyBjb25uZWN0aW9uLCB1bmxlc3MgdGhlIHVzZXIgYWdlbnQga25vd3MgdGhhdCB0byBiZSBmdXRpbGUsIGluXG4gICAgICAgICAgLy8gd2hpY2ggY2FzZSB0aGUgdXNlciBhZ2VudCBtYXkgZmFpbCB0aGUgY29ubmVjdGlvbi5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLiNyZWNvbm5lY3QoKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIE90aGVyd2lzZSwgaWYgcmVzJ3Mgc3RhdHVzIGlzIG5vdCAyMDAsIG9yIGlmIHJlcydzIGBDb250ZW50LVR5cGVgXG4gICAgICAvLyBpcyBub3QgYHRleHQvZXZlbnQtc3RyZWFtYCwgdGhlbiBmYWlsIHRoZSBjb25uZWN0aW9uLlxuICAgICAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzTGlzdC5nZXQoJ2NvbnRlbnQtdHlwZScsIHRydWUpXG4gICAgICBjb25zdCBtaW1lVHlwZSA9IGNvbnRlbnRUeXBlICE9PSBudWxsID8gcGFyc2VNSU1FVHlwZShjb250ZW50VHlwZSkgOiAnZmFpbHVyZSdcbiAgICAgIGNvbnN0IGNvbnRlbnRUeXBlVmFsaWQgPSBtaW1lVHlwZSAhPT0gJ2ZhaWx1cmUnICYmIG1pbWVUeXBlLmVzc2VuY2UgPT09ICd0ZXh0L2V2ZW50LXN0cmVhbSdcbiAgICAgIGlmIChcbiAgICAgICAgcmVzcG9uc2Uuc3RhdHVzICE9PSAyMDAgfHxcbiAgICAgICAgY29udGVudFR5cGVWYWxpZCA9PT0gZmFsc2VcbiAgICAgICkge1xuICAgICAgICB0aGlzLmNsb3NlKClcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnZXJyb3InKSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDQuIE90aGVyd2lzZSwgYW5ub3VuY2UgdGhlIGNvbm5lY3Rpb24gYW5kIGludGVycHJldCByZXMncyBib2R5XG4gICAgICAvLyBsaW5lIGJ5IGxpbmUuXG5cbiAgICAgIC8vIFdoZW4gYSB1c2VyIGFnZW50IGlzIHRvIGFubm91bmNlIHRoZSBjb25uZWN0aW9uLCB0aGUgdXNlciBhZ2VudFxuICAgICAgLy8gbXVzdCBxdWV1ZSBhIHRhc2sgd2hpY2gsIGlmIHRoZSByZWFkeVN0YXRlIGF0dHJpYnV0ZSBpcyBzZXQgdG8gYVxuICAgICAgLy8gdmFsdWUgb3RoZXIgdGhhbiBDTE9TRUQsIHNldHMgdGhlIHJlYWR5U3RhdGUgYXR0cmlidXRlIHRvIE9QRU5cbiAgICAgIC8vIGFuZCBmaXJlcyBhbiBldmVudCBuYW1lZCBvcGVuIGF0IHRoZSBFdmVudFNvdXJjZSBvYmplY3QuXG4gICAgICAvLyBAc2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3NlcnZlci1zZW50LWV2ZW50cy5odG1sI3NzZS1wcm9jZXNzaW5nLW1vZGVsXG4gICAgICB0aGlzLiNyZWFkeVN0YXRlID0gT1BFTlxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnb3BlbicpKVxuXG4gICAgICAvLyBJZiByZWRpcmVjdGVkIHRvIGEgZGlmZmVyZW50IG9yaWdpbiwgc2V0IHRoZSBvcmlnaW4gdG8gdGhlIG5ldyBvcmlnaW4uXG4gICAgICB0aGlzLiNzdGF0ZS5vcmlnaW4gPSByZXNwb25zZS51cmxMaXN0W3Jlc3BvbnNlLnVybExpc3QubGVuZ3RoIC0gMV0ub3JpZ2luXG5cbiAgICAgIGNvbnN0IGV2ZW50U291cmNlU3RyZWFtID0gbmV3IEV2ZW50U291cmNlU3RyZWFtKHtcbiAgICAgICAgZXZlbnRTb3VyY2VTZXR0aW5nczogdGhpcy4jc3RhdGUsXG4gICAgICAgIHB1c2g6IChldmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChjcmVhdGVGYXN0TWVzc2FnZUV2ZW50KFxuICAgICAgICAgICAgZXZlbnQudHlwZSxcbiAgICAgICAgICAgIGV2ZW50Lm9wdGlvbnNcbiAgICAgICAgICApKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBwaXBlbGluZShyZXNwb25zZS5ib2R5LnN0cmVhbSxcbiAgICAgICAgZXZlbnRTb3VyY2VTdHJlYW0sXG4gICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGVycm9yPy5hYm9ydGVkID09PSBmYWxzZVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZSgpXG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdlcnJvcicpKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICB0aGlzLiNjb250cm9sbGVyID0gZmV0Y2hpbmcoZmV0Y2hQYXJhbXMpXG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zZXJ2ZXItc2VudC1ldmVudHMuaHRtbCNzc2UtcHJvY2Vzc2luZy1tb2RlbFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jICNyZWNvbm5lY3QgKCkge1xuICAgIC8vIFdoZW4gYSB1c2VyIGFnZW50IGlzIHRvIHJlZXN0YWJsaXNoIHRoZSBjb25uZWN0aW9uLCB0aGUgdXNlciBhZ2VudCBtdXN0XG4gICAgLy8gcnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMuIFRoZXNlIHN0ZXBzIGFyZSBydW4gaW4gcGFyYWxsZWwsIG5vdCBhcyBwYXJ0IG9mXG4gICAgLy8gYSB0YXNrLiAoVGhlIHRhc2tzIHRoYXQgaXQgcXVldWVzLCBvZiBjb3Vyc2UsIGFyZSBydW4gbGlrZSBub3JtYWwgdGFza3NcbiAgICAvLyBhbmQgbm90IHRoZW1zZWx2ZXMgaW4gcGFyYWxsZWwuKVxuXG4gICAgLy8gMS4gUXVldWUgYSB0YXNrIHRvIHJ1biB0aGUgZm9sbG93aW5nIHN0ZXBzOlxuXG4gICAgLy8gICAxLiBJZiB0aGUgcmVhZHlTdGF0ZSBhdHRyaWJ1dGUgaXMgc2V0IHRvIENMT1NFRCwgYWJvcnQgdGhlIHRhc2suXG4gICAgaWYgKHRoaXMuI3JlYWR5U3RhdGUgPT09IENMT1NFRCkgcmV0dXJuXG5cbiAgICAvLyAgIDIuIFNldCB0aGUgcmVhZHlTdGF0ZSBhdHRyaWJ1dGUgdG8gQ09OTkVDVElORy5cbiAgICB0aGlzLiNyZWFkeVN0YXRlID0gQ09OTkVDVElOR1xuXG4gICAgLy8gICAzLiBGaXJlIGFuIGV2ZW50IG5hbWVkIGVycm9yIGF0IHRoZSBFdmVudFNvdXJjZSBvYmplY3QuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnZXJyb3InKSlcblxuICAgIC8vIDIuIFdhaXQgYSBkZWxheSBlcXVhbCB0byB0aGUgcmVjb25uZWN0aW9uIHRpbWUgb2YgdGhlIGV2ZW50IHNvdXJjZS5cbiAgICBhd2FpdCBkZWxheSh0aGlzLiNzdGF0ZS5yZWNvbm5lY3Rpb25UaW1lKVxuXG4gICAgLy8gNS4gUXVldWUgYSB0YXNrIHRvIHJ1biB0aGUgZm9sbG93aW5nIHN0ZXBzOlxuXG4gICAgLy8gICAxLiBJZiB0aGUgRXZlbnRTb3VyY2Ugb2JqZWN0J3MgcmVhZHlTdGF0ZSBhdHRyaWJ1dGUgaXMgbm90IHNldCB0b1xuICAgIC8vICAgICAgQ09OTkVDVElORywgdGhlbiByZXR1cm4uXG4gICAgaWYgKHRoaXMuI3JlYWR5U3RhdGUgIT09IENPTk5FQ1RJTkcpIHJldHVyblxuXG4gICAgLy8gICAyLiBMZXQgcmVxdWVzdCBiZSB0aGUgRXZlbnRTb3VyY2Ugb2JqZWN0J3MgcmVxdWVzdC5cbiAgICAvLyAgIDMuIElmIHRoZSBFdmVudFNvdXJjZSBvYmplY3QncyBsYXN0IGV2ZW50IElEIHN0cmluZyBpcyBub3QgdGhlIGVtcHR5XG4gICAgLy8gICAgICBzdHJpbmcsIHRoZW46XG4gICAgLy8gICAgICAxLiBMZXQgbGFzdEV2ZW50SURWYWx1ZSBiZSB0aGUgRXZlbnRTb3VyY2Ugb2JqZWN0J3MgbGFzdCBldmVudCBJRFxuICAgIC8vICAgICAgICAgc3RyaW5nLCBlbmNvZGVkIGFzIFVURi04LlxuICAgIC8vICAgICAgMi4gU2V0IChgTGFzdC1FdmVudC1JRGAsIGxhc3RFdmVudElEVmFsdWUpIGluIHJlcXVlc3QncyBoZWFkZXJcbiAgICAvLyAgICAgICAgIGxpc3QuXG4gICAgaWYgKHRoaXMuI3N0YXRlLmxhc3RFdmVudElkLmxlbmd0aCkge1xuICAgICAgdGhpcy4jcmVxdWVzdC5oZWFkZXJzTGlzdC5zZXQoJ2xhc3QtZXZlbnQtaWQnLCB0aGlzLiNzdGF0ZS5sYXN0RXZlbnRJZCwgdHJ1ZSlcbiAgICB9XG5cbiAgICAvLyAgIDQuIEZldGNoIHJlcXVlc3QgYW5kIHByb2Nlc3MgdGhlIHJlc3BvbnNlIG9idGFpbmVkIGluIHRoaXMgZmFzaGlvbiwgaWYgYW55LCBhcyBkZXNjcmliZWQgZWFybGllciBpbiB0aGlzIHNlY3Rpb24uXG4gICAgdGhpcy4jY29ubmVjdCgpXG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBjb25uZWN0aW9uLCBpZiBhbnksIGFuZCBzZXRzIHRoZSByZWFkeVN0YXRlIGF0dHJpYnV0ZSB0b1xuICAgKiBDTE9TRUQuXG4gICAqL1xuICBjbG9zZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRXZlbnRTb3VyY2UpXG5cbiAgICBpZiAodGhpcy4jcmVhZHlTdGF0ZSA9PT0gQ0xPU0VEKSByZXR1cm5cbiAgICB0aGlzLiNyZWFkeVN0YXRlID0gQ0xPU0VEXG4gICAgdGhpcy4jY29udHJvbGxlci5hYm9ydCgpXG4gICAgdGhpcy4jcmVxdWVzdCA9IG51bGxcbiAgfVxuXG4gIGdldCBvbm9wZW4gKCkge1xuICAgIHJldHVybiB0aGlzLiNldmVudHMub3BlblxuICB9XG5cbiAgc2V0IG9ub3BlbiAoZm4pIHtcbiAgICBpZiAodGhpcy4jZXZlbnRzLm9wZW4pIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignb3BlbicsIHRoaXMuI2V2ZW50cy5vcGVuKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuI2V2ZW50cy5vcGVuID0gZm5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsIGZuKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNldmVudHMub3BlbiA9IG51bGxcbiAgICB9XG4gIH1cblxuICBnZXQgb25tZXNzYWdlICgpIHtcbiAgICByZXR1cm4gdGhpcy4jZXZlbnRzLm1lc3NhZ2VcbiAgfVxuXG4gIHNldCBvbm1lc3NhZ2UgKGZuKSB7XG4gICAgaWYgKHRoaXMuI2V2ZW50cy5tZXNzYWdlKSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLiNldmVudHMubWVzc2FnZSlcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLiNldmVudHMubWVzc2FnZSA9IGZuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jZXZlbnRzLm1lc3NhZ2UgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgZ2V0IG9uZXJyb3IgKCkge1xuICAgIHJldHVybiB0aGlzLiNldmVudHMuZXJyb3JcbiAgfVxuXG4gIHNldCBvbmVycm9yIChmbikge1xuICAgIGlmICh0aGlzLiNldmVudHMuZXJyb3IpIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCB0aGlzLiNldmVudHMuZXJyb3IpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy4jZXZlbnRzLmVycm9yID0gZm5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jZXZlbnRzLmVycm9yID0gbnVsbFxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBjb25zdGFudHNQcm9wZXJ0eURlc2NyaXB0b3JzID0ge1xuICBDT05ORUNUSU5HOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogQ09OTkVDVElORyxcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSxcbiAgT1BFTjoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgdmFsdWU6IE9QRU4sXG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0sXG4gIENMT1NFRDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgdmFsdWU6IENMT1NFRCxcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhFdmVudFNvdXJjZSwgY29uc3RhbnRzUHJvcGVydHlEZXNjcmlwdG9ycylcbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEV2ZW50U291cmNlLnByb3RvdHlwZSwgY29uc3RhbnRzUHJvcGVydHlEZXNjcmlwdG9ycylcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRXZlbnRTb3VyY2UucHJvdG90eXBlLCB7XG4gIGNsb3NlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbmVycm9yOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbm1lc3NhZ2U6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIG9ub3Blbjoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgcmVhZHlTdGF0ZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgdXJsOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICB3aXRoQ3JlZGVudGlhbHM6IGtFbnVtZXJhYmxlUHJvcGVydHlcbn0pXG5cbndlYmlkbC5jb252ZXJ0ZXJzLkV2ZW50U291cmNlSW5pdERpY3QgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIHtcbiAgICBrZXk6ICd3aXRoQ3JlZGVudGlhbHMnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYm9vbGVhbixcbiAgICBkZWZhdWx0VmFsdWU6ICgpID0+IGZhbHNlXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdkaXNwYXRjaGVyJywgLy8gdW5kaWNpIG9ubHlcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmFueVxuICB9XG5dKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgRXZlbnRTb3VyY2UsXG4gIGRlZmF1bHRSZWNvbm5lY3Rpb25UaW1lXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgQ2xpZW50ID0gcmVxdWlyZSgnLi9saWIvZGlzcGF0Y2hlci9jbGllbnQnKVxuY29uc3QgRGlzcGF0Y2hlciA9IHJlcXVpcmUoJy4vbGliL2Rpc3BhdGNoZXIvZGlzcGF0Y2hlcicpXG5jb25zdCBQb29sID0gcmVxdWlyZSgnLi9saWIvZGlzcGF0Y2hlci9wb29sJylcbmNvbnN0IEJhbGFuY2VkUG9vbCA9IHJlcXVpcmUoJy4vbGliL2Rpc3BhdGNoZXIvYmFsYW5jZWQtcG9vbCcpXG5jb25zdCBBZ2VudCA9IHJlcXVpcmUoJy4vbGliL2Rpc3BhdGNoZXIvYWdlbnQnKVxuY29uc3QgUHJveHlBZ2VudCA9IHJlcXVpcmUoJy4vbGliL2Rpc3BhdGNoZXIvcHJveHktYWdlbnQnKVxuY29uc3QgRW52SHR0cFByb3h5QWdlbnQgPSByZXF1aXJlKCcuL2xpYi9kaXNwYXRjaGVyL2Vudi1odHRwLXByb3h5LWFnZW50JylcbmNvbnN0IFJldHJ5QWdlbnQgPSByZXF1aXJlKCcuL2xpYi9kaXNwYXRjaGVyL3JldHJ5LWFnZW50JylcbmNvbnN0IGVycm9ycyA9IHJlcXVpcmUoJy4vbGliL2NvcmUvZXJyb3JzJylcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuL2xpYi9jb3JlL3V0aWwnKVxuY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciB9ID0gZXJyb3JzXG5jb25zdCBhcGkgPSByZXF1aXJlKCcuL2xpYi9hcGknKVxuY29uc3QgYnVpbGRDb25uZWN0b3IgPSByZXF1aXJlKCcuL2xpYi9jb3JlL2Nvbm5lY3QnKVxuY29uc3QgTW9ja0NsaWVudCA9IHJlcXVpcmUoJy4vbGliL21vY2svbW9jay1jbGllbnQnKVxuY29uc3QgTW9ja0FnZW50ID0gcmVxdWlyZSgnLi9saWIvbW9jay9tb2NrLWFnZW50JylcbmNvbnN0IE1vY2tQb29sID0gcmVxdWlyZSgnLi9saWIvbW9jay9tb2NrLXBvb2wnKVxuY29uc3QgbW9ja0Vycm9ycyA9IHJlcXVpcmUoJy4vbGliL21vY2svbW9jay1lcnJvcnMnKVxuY29uc3QgUmV0cnlIYW5kbGVyID0gcmVxdWlyZSgnLi9saWIvaGFuZGxlci9yZXRyeS1oYW5kbGVyJylcbmNvbnN0IHsgZ2V0R2xvYmFsRGlzcGF0Y2hlciwgc2V0R2xvYmFsRGlzcGF0Y2hlciB9ID0gcmVxdWlyZSgnLi9saWIvZ2xvYmFsJylcbmNvbnN0IERlY29yYXRvckhhbmRsZXIgPSByZXF1aXJlKCcuL2xpYi9oYW5kbGVyL2RlY29yYXRvci1oYW5kbGVyJylcbmNvbnN0IFJlZGlyZWN0SGFuZGxlciA9IHJlcXVpcmUoJy4vbGliL2hhbmRsZXIvcmVkaXJlY3QtaGFuZGxlcicpXG5jb25zdCBjcmVhdGVSZWRpcmVjdEludGVyY2VwdG9yID0gcmVxdWlyZSgnLi9saWIvaW50ZXJjZXB0b3IvcmVkaXJlY3QtaW50ZXJjZXB0b3InKVxuXG5PYmplY3QuYXNzaWduKERpc3BhdGNoZXIucHJvdG90eXBlLCBhcGkpXG5cbm1vZHVsZS5leHBvcnRzLkRpc3BhdGNoZXIgPSBEaXNwYXRjaGVyXG5tb2R1bGUuZXhwb3J0cy5DbGllbnQgPSBDbGllbnRcbm1vZHVsZS5leHBvcnRzLlBvb2wgPSBQb29sXG5tb2R1bGUuZXhwb3J0cy5CYWxhbmNlZFBvb2wgPSBCYWxhbmNlZFBvb2xcbm1vZHVsZS5leHBvcnRzLkFnZW50ID0gQWdlbnRcbm1vZHVsZS5leHBvcnRzLlByb3h5QWdlbnQgPSBQcm94eUFnZW50XG5tb2R1bGUuZXhwb3J0cy5FbnZIdHRwUHJveHlBZ2VudCA9IEVudkh0dHBQcm94eUFnZW50XG5tb2R1bGUuZXhwb3J0cy5SZXRyeUFnZW50ID0gUmV0cnlBZ2VudFxubW9kdWxlLmV4cG9ydHMuUmV0cnlIYW5kbGVyID0gUmV0cnlIYW5kbGVyXG5cbm1vZHVsZS5leHBvcnRzLkRlY29yYXRvckhhbmRsZXIgPSBEZWNvcmF0b3JIYW5kbGVyXG5tb2R1bGUuZXhwb3J0cy5SZWRpcmVjdEhhbmRsZXIgPSBSZWRpcmVjdEhhbmRsZXJcbm1vZHVsZS5leHBvcnRzLmNyZWF0ZVJlZGlyZWN0SW50ZXJjZXB0b3IgPSBjcmVhdGVSZWRpcmVjdEludGVyY2VwdG9yXG5tb2R1bGUuZXhwb3J0cy5pbnRlcmNlcHRvcnMgPSB7XG4gIHJlZGlyZWN0OiByZXF1aXJlKCcuL2xpYi9pbnRlcmNlcHRvci9yZWRpcmVjdCcpLFxuICByZXRyeTogcmVxdWlyZSgnLi9saWIvaW50ZXJjZXB0b3IvcmV0cnknKSxcbiAgZHVtcDogcmVxdWlyZSgnLi9saWIvaW50ZXJjZXB0b3IvZHVtcCcpLFxuICBkbnM6IHJlcXVpcmUoJy4vbGliL2ludGVyY2VwdG9yL2RucycpXG59XG5cbm1vZHVsZS5leHBvcnRzLmJ1aWxkQ29ubmVjdG9yID0gYnVpbGRDb25uZWN0b3Jcbm1vZHVsZS5leHBvcnRzLmVycm9ycyA9IGVycm9yc1xubW9kdWxlLmV4cG9ydHMudXRpbCA9IHtcbiAgcGFyc2VIZWFkZXJzOiB1dGlsLnBhcnNlSGVhZGVycyxcbiAgaGVhZGVyTmFtZVRvU3RyaW5nOiB1dGlsLmhlYWRlck5hbWVUb1N0cmluZ1xufVxuXG5mdW5jdGlvbiBtYWtlRGlzcGF0Y2hlciAoZm4pIHtcbiAgcmV0dXJuICh1cmwsIG9wdHMsIGhhbmRsZXIpID0+IHtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGhhbmRsZXIgPSBvcHRzXG4gICAgICBvcHRzID0gbnVsbFxuICAgIH1cblxuICAgIGlmICghdXJsIHx8ICh0eXBlb2YgdXJsICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgdXJsICE9PSAnb2JqZWN0JyAmJiAhKHVybCBpbnN0YW5jZW9mIFVSTCkpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgdXJsJylcbiAgICB9XG5cbiAgICBpZiAob3B0cyAhPSBudWxsICYmIHR5cGVvZiBvcHRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9wdHMnKVxuICAgIH1cblxuICAgIGlmIChvcHRzICYmIG9wdHMucGF0aCAhPSBudWxsKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdHMucGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9wdHMucGF0aCcpXG4gICAgICB9XG5cbiAgICAgIGxldCBwYXRoID0gb3B0cy5wYXRoXG4gICAgICBpZiAoIW9wdHMucGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgcGF0aCA9IGAvJHtwYXRofWBcbiAgICAgIH1cblxuICAgICAgdXJsID0gbmV3IFVSTCh1dGlsLnBhcnNlT3JpZ2luKHVybCkub3JpZ2luICsgcGF0aClcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFvcHRzKSB7XG4gICAgICAgIG9wdHMgPSB0eXBlb2YgdXJsID09PSAnb2JqZWN0JyA/IHVybCA6IHt9XG4gICAgICB9XG5cbiAgICAgIHVybCA9IHV0aWwucGFyc2VVUkwodXJsKVxuICAgIH1cblxuICAgIGNvbnN0IHsgYWdlbnQsIGRpc3BhdGNoZXIgPSBnZXRHbG9iYWxEaXNwYXRjaGVyKCkgfSA9IG9wdHNcblxuICAgIGlmIChhZ2VudCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCd1bnN1cHBvcnRlZCBvcHRzLmFnZW50LiBEaWQgeW91IG1lYW4gb3B0cy5jbGllbnQ/JylcbiAgICB9XG5cbiAgICByZXR1cm4gZm4uY2FsbChkaXNwYXRjaGVyLCB7XG4gICAgICAuLi5vcHRzLFxuICAgICAgb3JpZ2luOiB1cmwub3JpZ2luLFxuICAgICAgcGF0aDogdXJsLnNlYXJjaCA/IGAke3VybC5wYXRobmFtZX0ke3VybC5zZWFyY2h9YCA6IHVybC5wYXRobmFtZSxcbiAgICAgIG1ldGhvZDogb3B0cy5tZXRob2QgfHwgKG9wdHMuYm9keSA/ICdQVVQnIDogJ0dFVCcpXG4gICAgfSwgaGFuZGxlcilcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cy5zZXRHbG9iYWxEaXNwYXRjaGVyID0gc2V0R2xvYmFsRGlzcGF0Y2hlclxubW9kdWxlLmV4cG9ydHMuZ2V0R2xvYmFsRGlzcGF0Y2hlciA9IGdldEdsb2JhbERpc3BhdGNoZXJcblxuY29uc3QgZmV0Y2hJbXBsID0gcmVxdWlyZSgnLi9saWIvd2ViL2ZldGNoJykuZmV0Y2hcbm1vZHVsZS5leHBvcnRzLmZldGNoID0gYXN5bmMgZnVuY3Rpb24gZmV0Y2ggKGluaXQsIG9wdGlvbnMgPSB1bmRlZmluZWQpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZmV0Y2hJbXBsKGluaXQsIG9wdGlvbnMpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIgJiYgdHlwZW9mIGVyciA9PT0gJ29iamVjdCcpIHtcbiAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVycilcbiAgICB9XG5cbiAgICB0aHJvdyBlcnJcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMuSGVhZGVycyA9IHJlcXVpcmUoJy4vbGliL3dlYi9mZXRjaC9oZWFkZXJzJykuSGVhZGVyc1xubW9kdWxlLmV4cG9ydHMuUmVzcG9uc2UgPSByZXF1aXJlKCcuL2xpYi93ZWIvZmV0Y2gvcmVzcG9uc2UnKS5SZXNwb25zZVxubW9kdWxlLmV4cG9ydHMuUmVxdWVzdCA9IHJlcXVpcmUoJy4vbGliL3dlYi9mZXRjaC9yZXF1ZXN0JykuUmVxdWVzdFxubW9kdWxlLmV4cG9ydHMuRm9ybURhdGEgPSByZXF1aXJlKCcuL2xpYi93ZWIvZmV0Y2gvZm9ybWRhdGEnKS5Gb3JtRGF0YVxubW9kdWxlLmV4cG9ydHMuRmlsZSA9IGdsb2JhbFRoaXMuRmlsZSA/PyByZXF1aXJlKCdub2RlOmJ1ZmZlcicpLkZpbGVcbm1vZHVsZS5leHBvcnRzLkZpbGVSZWFkZXIgPSByZXF1aXJlKCcuL2xpYi93ZWIvZmlsZWFwaS9maWxlcmVhZGVyJykuRmlsZVJlYWRlclxuXG5jb25zdCB7IHNldEdsb2JhbE9yaWdpbiwgZ2V0R2xvYmFsT3JpZ2luIH0gPSByZXF1aXJlKCcuL2xpYi93ZWIvZmV0Y2gvZ2xvYmFsJylcblxubW9kdWxlLmV4cG9ydHMuc2V0R2xvYmFsT3JpZ2luID0gc2V0R2xvYmFsT3JpZ2luXG5tb2R1bGUuZXhwb3J0cy5nZXRHbG9iYWxPcmlnaW4gPSBnZXRHbG9iYWxPcmlnaW5cblxuY29uc3QgeyBDYWNoZVN0b3JhZ2UgfSA9IHJlcXVpcmUoJy4vbGliL3dlYi9jYWNoZS9jYWNoZXN0b3JhZ2UnKVxuY29uc3QgeyBrQ29uc3RydWN0IH0gPSByZXF1aXJlKCcuL2xpYi93ZWIvY2FjaGUvc3ltYm9scycpXG5cbi8vIENhY2hlICYgQ2FjaGVTdG9yYWdlIGFyZSB0aWdodGx5IGNvdXBsZWQgd2l0aCBmZXRjaC4gRXZlbiBpZiBpdCBtYXkgcnVuXG4vLyBpbiBhbiBvbGRlciB2ZXJzaW9uIG9mIE5vZGUsIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgdXNlIHdpdGhvdXQgZmV0Y2guXG5tb2R1bGUuZXhwb3J0cy5jYWNoZXMgPSBuZXcgQ2FjaGVTdG9yYWdlKGtDb25zdHJ1Y3QpXG5cbmNvbnN0IHsgZGVsZXRlQ29va2llLCBnZXRDb29raWVzLCBnZXRTZXRDb29raWVzLCBzZXRDb29raWUgfSA9IHJlcXVpcmUoJy4vbGliL3dlYi9jb29raWVzJylcblxubW9kdWxlLmV4cG9ydHMuZGVsZXRlQ29va2llID0gZGVsZXRlQ29va2llXG5tb2R1bGUuZXhwb3J0cy5nZXRDb29raWVzID0gZ2V0Q29va2llc1xubW9kdWxlLmV4cG9ydHMuZ2V0U2V0Q29va2llcyA9IGdldFNldENvb2tpZXNcbm1vZHVsZS5leHBvcnRzLnNldENvb2tpZSA9IHNldENvb2tpZVxuXG5jb25zdCB7IHBhcnNlTUlNRVR5cGUsIHNlcmlhbGl6ZUFNaW1lVHlwZSB9ID0gcmVxdWlyZSgnLi9saWIvd2ViL2ZldGNoL2RhdGEtdXJsJylcblxubW9kdWxlLmV4cG9ydHMucGFyc2VNSU1FVHlwZSA9IHBhcnNlTUlNRVR5cGVcbm1vZHVsZS5leHBvcnRzLnNlcmlhbGl6ZUFNaW1lVHlwZSA9IHNlcmlhbGl6ZUFNaW1lVHlwZVxuXG5jb25zdCB7IENsb3NlRXZlbnQsIEVycm9yRXZlbnQsIE1lc3NhZ2VFdmVudCB9ID0gcmVxdWlyZSgnLi9saWIvd2ViL3dlYnNvY2tldC9ldmVudHMnKVxubW9kdWxlLmV4cG9ydHMuV2ViU29ja2V0ID0gcmVxdWlyZSgnLi9saWIvd2ViL3dlYnNvY2tldC93ZWJzb2NrZXQnKS5XZWJTb2NrZXRcbm1vZHVsZS5leHBvcnRzLkNsb3NlRXZlbnQgPSBDbG9zZUV2ZW50XG5tb2R1bGUuZXhwb3J0cy5FcnJvckV2ZW50ID0gRXJyb3JFdmVudFxubW9kdWxlLmV4cG9ydHMuTWVzc2FnZUV2ZW50ID0gTWVzc2FnZUV2ZW50XG5cbm1vZHVsZS5leHBvcnRzLnJlcXVlc3QgPSBtYWtlRGlzcGF0Y2hlcihhcGkucmVxdWVzdClcbm1vZHVsZS5leHBvcnRzLnN0cmVhbSA9IG1ha2VEaXNwYXRjaGVyKGFwaS5zdHJlYW0pXG5tb2R1bGUuZXhwb3J0cy5waXBlbGluZSA9IG1ha2VEaXNwYXRjaGVyKGFwaS5waXBlbGluZSlcbm1vZHVsZS5leHBvcnRzLmNvbm5lY3QgPSBtYWtlRGlzcGF0Y2hlcihhcGkuY29ubmVjdClcbm1vZHVsZS5leHBvcnRzLnVwZ3JhZGUgPSBtYWtlRGlzcGF0Y2hlcihhcGkudXBncmFkZSlcblxubW9kdWxlLmV4cG9ydHMuTW9ja0NsaWVudCA9IE1vY2tDbGllbnRcbm1vZHVsZS5leHBvcnRzLk1vY2tQb29sID0gTW9ja1Bvb2xcbm1vZHVsZS5leHBvcnRzLk1vY2tBZ2VudCA9IE1vY2tBZ2VudFxubW9kdWxlLmV4cG9ydHMubW9ja0Vycm9ycyA9IG1vY2tFcnJvcnNcblxuY29uc3QgeyBFdmVudFNvdXJjZSB9ID0gcmVxdWlyZSgnLi9saWIvd2ViL2V2ZW50c291cmNlL2V2ZW50c291cmNlJylcblxubW9kdWxlLmV4cG9ydHMuRXZlbnRTb3VyY2UgPSBFdmVudFNvdXJjZVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG93bktleXMgPSBmdW5jdGlvbihvKSB7XG4gICAgICAgIG93bktleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiAobykge1xuICAgICAgICAgICAgdmFyIGFyID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBrIGluIG8pIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgaykpIGFyW2FyLmxlbmd0aF0gPSBrO1xuICAgICAgICAgICAgcmV0dXJuIGFyO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gb3duS2V5cyhvKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAobW9kKSB7XG4gICAgICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrID0gb3duS2V5cyhtb2QpLCBpID0gMDsgaSA8IGsubGVuZ3RoOyBpKyspIGlmIChrW2ldICE9PSBcImRlZmF1bHRcIikgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrW2ldKTtcbiAgICAgICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xufSkoKTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5IdHRwQ2xpZW50ID0gZXhwb3J0cy5IdHRwQ2xpZW50UmVzcG9uc2UgPSBleHBvcnRzLkh0dHBDbGllbnRFcnJvciA9IGV4cG9ydHMuTWVkaWFUeXBlcyA9IGV4cG9ydHMuSGVhZGVycyA9IGV4cG9ydHMuSHR0cENvZGVzID0gdm9pZCAwO1xuZXhwb3J0cy5nZXRQcm94eVVybCA9IGdldFByb3h5VXJsO1xuZXhwb3J0cy5pc0h0dHBzID0gaXNIdHRwcztcbmNvbnN0IGh0dHAgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcImh0dHBcIikpO1xuY29uc3QgaHR0cHMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcImh0dHBzXCIpKTtcbmNvbnN0IHBtID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL3Byb3h5XCIpKTtcbmNvbnN0IHR1bm5lbCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwidHVubmVsXCIpKTtcbmNvbnN0IHVuZGljaV8xID0gcmVxdWlyZShcInVuZGljaVwiKTtcbnZhciBIdHRwQ29kZXM7XG4oZnVuY3Rpb24gKEh0dHBDb2Rlcykge1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJPS1wiXSA9IDIwMF0gPSBcIk9LXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIk11bHRpcGxlQ2hvaWNlc1wiXSA9IDMwMF0gPSBcIk11bHRpcGxlQ2hvaWNlc1wiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJNb3ZlZFBlcm1hbmVudGx5XCJdID0gMzAxXSA9IFwiTW92ZWRQZXJtYW5lbnRseVwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJSZXNvdXJjZU1vdmVkXCJdID0gMzAyXSA9IFwiUmVzb3VyY2VNb3ZlZFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJTZWVPdGhlclwiXSA9IDMwM10gPSBcIlNlZU90aGVyXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIk5vdE1vZGlmaWVkXCJdID0gMzA0XSA9IFwiTm90TW9kaWZpZWRcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiVXNlUHJveHlcIl0gPSAzMDVdID0gXCJVc2VQcm94eVwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJTd2l0Y2hQcm94eVwiXSA9IDMwNl0gPSBcIlN3aXRjaFByb3h5XCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIlRlbXBvcmFyeVJlZGlyZWN0XCJdID0gMzA3XSA9IFwiVGVtcG9yYXJ5UmVkaXJlY3RcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiUGVybWFuZW50UmVkaXJlY3RcIl0gPSAzMDhdID0gXCJQZXJtYW5lbnRSZWRpcmVjdFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJCYWRSZXF1ZXN0XCJdID0gNDAwXSA9IFwiQmFkUmVxdWVzdFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJVbmF1dGhvcml6ZWRcIl0gPSA0MDFdID0gXCJVbmF1dGhvcml6ZWRcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiUGF5bWVudFJlcXVpcmVkXCJdID0gNDAyXSA9IFwiUGF5bWVudFJlcXVpcmVkXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIkZvcmJpZGRlblwiXSA9IDQwM10gPSBcIkZvcmJpZGRlblwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJOb3RGb3VuZFwiXSA9IDQwNF0gPSBcIk5vdEZvdW5kXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIk1ldGhvZE5vdEFsbG93ZWRcIl0gPSA0MDVdID0gXCJNZXRob2ROb3RBbGxvd2VkXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIk5vdEFjY2VwdGFibGVcIl0gPSA0MDZdID0gXCJOb3RBY2NlcHRhYmxlXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIlByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZFwiXSA9IDQwN10gPSBcIlByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJSZXF1ZXN0VGltZW91dFwiXSA9IDQwOF0gPSBcIlJlcXVlc3RUaW1lb3V0XCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIkNvbmZsaWN0XCJdID0gNDA5XSA9IFwiQ29uZmxpY3RcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiR29uZVwiXSA9IDQxMF0gPSBcIkdvbmVcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiVG9vTWFueVJlcXVlc3RzXCJdID0gNDI5XSA9IFwiVG9vTWFueVJlcXVlc3RzXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIkludGVybmFsU2VydmVyRXJyb3JcIl0gPSA1MDBdID0gXCJJbnRlcm5hbFNlcnZlckVycm9yXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIk5vdEltcGxlbWVudGVkXCJdID0gNTAxXSA9IFwiTm90SW1wbGVtZW50ZWRcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiQmFkR2F0ZXdheVwiXSA9IDUwMl0gPSBcIkJhZEdhdGV3YXlcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiU2VydmljZVVuYXZhaWxhYmxlXCJdID0gNTAzXSA9IFwiU2VydmljZVVuYXZhaWxhYmxlXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIkdhdGV3YXlUaW1lb3V0XCJdID0gNTA0XSA9IFwiR2F0ZXdheVRpbWVvdXRcIjtcbn0pKEh0dHBDb2RlcyB8fCAoZXhwb3J0cy5IdHRwQ29kZXMgPSBIdHRwQ29kZXMgPSB7fSkpO1xudmFyIEhlYWRlcnM7XG4oZnVuY3Rpb24gKEhlYWRlcnMpIHtcbiAgICBIZWFkZXJzW1wiQWNjZXB0XCJdID0gXCJhY2NlcHRcIjtcbiAgICBIZWFkZXJzW1wiQ29udGVudFR5cGVcIl0gPSBcImNvbnRlbnQtdHlwZVwiO1xufSkoSGVhZGVycyB8fCAoZXhwb3J0cy5IZWFkZXJzID0gSGVhZGVycyA9IHt9KSk7XG52YXIgTWVkaWFUeXBlcztcbihmdW5jdGlvbiAoTWVkaWFUeXBlcykge1xuICAgIE1lZGlhVHlwZXNbXCJBcHBsaWNhdGlvbkpzb25cIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbn0pKE1lZGlhVHlwZXMgfHwgKGV4cG9ydHMuTWVkaWFUeXBlcyA9IE1lZGlhVHlwZXMgPSB7fSkpO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBwcm94eSBVUkwsIGRlcGVuZGluZyB1cG9uIHRoZSBzdXBwbGllZCB1cmwgYW5kIHByb3h5IGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqIEBwYXJhbSBzZXJ2ZXJVcmwgIFRoZSBzZXJ2ZXIgVVJMIHdoZXJlIHRoZSByZXF1ZXN0IHdpbGwgYmUgc2VudC4gRm9yIGV4YW1wbGUsIGh0dHBzOi8vYXBpLmdpdGh1Yi5jb21cbiAqL1xuZnVuY3Rpb24gZ2V0UHJveHlVcmwoc2VydmVyVXJsKSB7XG4gICAgY29uc3QgcHJveHlVcmwgPSBwbS5nZXRQcm94eVVybChuZXcgVVJMKHNlcnZlclVybCkpO1xuICAgIHJldHVybiBwcm94eVVybCA/IHByb3h5VXJsLmhyZWYgOiAnJztcbn1cbmNvbnN0IEh0dHBSZWRpcmVjdENvZGVzID0gW1xuICAgIEh0dHBDb2Rlcy5Nb3ZlZFBlcm1hbmVudGx5LFxuICAgIEh0dHBDb2Rlcy5SZXNvdXJjZU1vdmVkLFxuICAgIEh0dHBDb2Rlcy5TZWVPdGhlcixcbiAgICBIdHRwQ29kZXMuVGVtcG9yYXJ5UmVkaXJlY3QsXG4gICAgSHR0cENvZGVzLlBlcm1hbmVudFJlZGlyZWN0XG5dO1xuY29uc3QgSHR0cFJlc3BvbnNlUmV0cnlDb2RlcyA9IFtcbiAgICBIdHRwQ29kZXMuQmFkR2F0ZXdheSxcbiAgICBIdHRwQ29kZXMuU2VydmljZVVuYXZhaWxhYmxlLFxuICAgIEh0dHBDb2Rlcy5HYXRld2F5VGltZW91dFxuXTtcbmNvbnN0IFJldHJ5YWJsZUh0dHBWZXJicyA9IFsnT1BUSU9OUycsICdHRVQnLCAnREVMRVRFJywgJ0hFQUQnXTtcbmNvbnN0IEV4cG9uZW50aWFsQmFja29mZkNlaWxpbmcgPSAxMDtcbmNvbnN0IEV4cG9uZW50aWFsQmFja29mZlRpbWVTbGljZSA9IDU7XG5jbGFzcyBIdHRwQ2xpZW50RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgc3RhdHVzQ29kZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5uYW1lID0gJ0h0dHBDbGllbnRFcnJvcic7XG4gICAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBIdHRwQ2xpZW50RXJyb3IucHJvdG90eXBlKTtcbiAgICB9XG59XG5leHBvcnRzLkh0dHBDbGllbnRFcnJvciA9IEh0dHBDbGllbnRFcnJvcjtcbmNsYXNzIEh0dHBDbGllbnRSZXNwb25zZSB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIH1cbiAgICByZWFkQm9keSgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGxldCBvdXRwdXQgPSBCdWZmZXIuYWxsb2MoMCk7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlLm9uKCdkYXRhJywgKGNodW5rKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEJ1ZmZlci5jb25jYXQoW291dHB1dCwgY2h1bmtdKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2Uub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShvdXRwdXQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZWFkQm9keUJ1ZmZlcigpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rcyA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZS5vbignZGF0YScsIChjaHVuaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoQnVmZmVyLmNvbmNhdChjaHVua3MpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5IdHRwQ2xpZW50UmVzcG9uc2UgPSBIdHRwQ2xpZW50UmVzcG9uc2U7XG5mdW5jdGlvbiBpc0h0dHBzKHJlcXVlc3RVcmwpIHtcbiAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHJlcXVlc3RVcmwpO1xuICAgIHJldHVybiBwYXJzZWRVcmwucHJvdG9jb2wgPT09ICdodHRwczonO1xufVxuY2xhc3MgSHR0cENsaWVudCB7XG4gICAgY29uc3RydWN0b3IodXNlckFnZW50LCBoYW5kbGVycywgcmVxdWVzdE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5faWdub3JlU3NsRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fYWxsb3dSZWRpcmVjdHMgPSB0cnVlO1xuICAgICAgICB0aGlzLl9hbGxvd1JlZGlyZWN0RG93bmdyYWRlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX21heFJlZGlyZWN0cyA9IDUwO1xuICAgICAgICB0aGlzLl9hbGxvd1JldHJpZXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fbWF4UmV0cmllcyA9IDE7XG4gICAgICAgIHRoaXMuX2tlZXBBbGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9kaXNwb3NlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnVzZXJBZ2VudCA9IHRoaXMuX2dldFVzZXJBZ2VudFdpdGhPcmNoZXN0cmF0aW9uSWQodXNlckFnZW50KTtcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IGhhbmRsZXJzIHx8IFtdO1xuICAgICAgICB0aGlzLnJlcXVlc3RPcHRpb25zID0gcmVxdWVzdE9wdGlvbnM7XG4gICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKHJlcXVlc3RPcHRpb25zLmlnbm9yZVNzbEVycm9yICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pZ25vcmVTc2xFcnJvciA9IHJlcXVlc3RPcHRpb25zLmlnbm9yZVNzbEVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fc29ja2V0VGltZW91dCA9IHJlcXVlc3RPcHRpb25zLnNvY2tldFRpbWVvdXQ7XG4gICAgICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMuYWxsb3dSZWRpcmVjdHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FsbG93UmVkaXJlY3RzID0gcmVxdWVzdE9wdGlvbnMuYWxsb3dSZWRpcmVjdHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMuYWxsb3dSZWRpcmVjdERvd25ncmFkZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWxsb3dSZWRpcmVjdERvd25ncmFkZSA9IHJlcXVlc3RPcHRpb25zLmFsbG93UmVkaXJlY3REb3duZ3JhZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMubWF4UmVkaXJlY3RzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhSZWRpcmVjdHMgPSBNYXRoLm1heChyZXF1ZXN0T3B0aW9ucy5tYXhSZWRpcmVjdHMsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlcXVlc3RPcHRpb25zLmtlZXBBbGl2ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fa2VlcEFsaXZlID0gcmVxdWVzdE9wdGlvbnMua2VlcEFsaXZlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlcXVlc3RPcHRpb25zLmFsbG93UmV0cmllcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWxsb3dSZXRyaWVzID0gcmVxdWVzdE9wdGlvbnMuYWxsb3dSZXRyaWVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlcXVlc3RPcHRpb25zLm1heFJldHJpZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21heFJldHJpZXMgPSByZXF1ZXN0T3B0aW9ucy5tYXhSZXRyaWVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIG9wdGlvbnMocmVxdWVzdFVybCwgYWRkaXRpb25hbEhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ09QVElPTlMnLCByZXF1ZXN0VXJsLCBudWxsLCBhZGRpdGlvbmFsSGVhZGVycyB8fCB7fSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQocmVxdWVzdFVybCwgYWRkaXRpb25hbEhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0dFVCcsIHJlcXVlc3RVcmwsIG51bGwsIGFkZGl0aW9uYWxIZWFkZXJzIHx8IHt9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGRlbChyZXF1ZXN0VXJsLCBhZGRpdGlvbmFsSGVhZGVycykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnREVMRVRFJywgcmVxdWVzdFVybCwgbnVsbCwgYWRkaXRpb25hbEhlYWRlcnMgfHwge30pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcG9zdChyZXF1ZXN0VXJsLCBkYXRhLCBhZGRpdGlvbmFsSGVhZGVycykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnUE9TVCcsIHJlcXVlc3RVcmwsIGRhdGEsIGFkZGl0aW9uYWxIZWFkZXJzIHx8IHt9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBhdGNoKHJlcXVlc3RVcmwsIGRhdGEsIGFkZGl0aW9uYWxIZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdQQVRDSCcsIHJlcXVlc3RVcmwsIGRhdGEsIGFkZGl0aW9uYWxIZWFkZXJzIHx8IHt9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1dChyZXF1ZXN0VXJsLCBkYXRhLCBhZGRpdGlvbmFsSGVhZGVycykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnUFVUJywgcmVxdWVzdFVybCwgZGF0YSwgYWRkaXRpb25hbEhlYWRlcnMgfHwge30pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaGVhZChyZXF1ZXN0VXJsLCBhZGRpdGlvbmFsSGVhZGVycykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnSEVBRCcsIHJlcXVlc3RVcmwsIG51bGwsIGFkZGl0aW9uYWxIZWFkZXJzIHx8IHt9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNlbmRTdHJlYW0odmVyYiwgcmVxdWVzdFVybCwgc3RyZWFtLCBhZGRpdGlvbmFsSGVhZGVycykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdCh2ZXJiLCByZXF1ZXN0VXJsLCBzdHJlYW0sIGFkZGl0aW9uYWxIZWFkZXJzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSB0eXBlZCBvYmplY3QgZnJvbSBhbiBlbmRwb2ludFxuICAgICAqIEJlIGF3YXJlIHRoYXQgbm90IGZvdW5kIHJldHVybnMgYSBudWxsLiAgT3RoZXIgZXJyb3JzICg0eHgsIDV4eCkgcmVqZWN0IHRoZSBwcm9taXNlXG4gICAgICovXG4gICAgZ2V0SnNvbihyZXF1ZXN0VXJsXzEpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCBhcmd1bWVudHMsIHZvaWQgMCwgZnVuY3Rpb24qIChyZXF1ZXN0VXJsLCBhZGRpdGlvbmFsSGVhZGVycyA9IHt9KSB7XG4gICAgICAgICAgICBhZGRpdGlvbmFsSGVhZGVyc1tIZWFkZXJzLkFjY2VwdF0gPSB0aGlzLl9nZXRFeGlzdGluZ09yRGVmYXVsdEhlYWRlcihhZGRpdGlvbmFsSGVhZGVycywgSGVhZGVycy5BY2NlcHQsIE1lZGlhVHlwZXMuQXBwbGljYXRpb25Kc29uKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IHlpZWxkIHRoaXMuZ2V0KHJlcXVlc3RVcmwsIGFkZGl0aW9uYWxIZWFkZXJzKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzUmVzcG9uc2UocmVzLCB0aGlzLnJlcXVlc3RPcHRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBvc3RKc29uKHJlcXVlc3RVcmxfMSwgb2JqXzEpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCBhcmd1bWVudHMsIHZvaWQgMCwgZnVuY3Rpb24qIChyZXF1ZXN0VXJsLCBvYmosIGFkZGl0aW9uYWxIZWFkZXJzID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnN0cmluZ2lmeShvYmosIG51bGwsIDIpO1xuICAgICAgICAgICAgYWRkaXRpb25hbEhlYWRlcnNbSGVhZGVycy5BY2NlcHRdID0gdGhpcy5fZ2V0RXhpc3RpbmdPckRlZmF1bHRIZWFkZXIoYWRkaXRpb25hbEhlYWRlcnMsIEhlYWRlcnMuQWNjZXB0LCBNZWRpYVR5cGVzLkFwcGxpY2F0aW9uSnNvbik7XG4gICAgICAgICAgICBhZGRpdGlvbmFsSGVhZGVyc1tIZWFkZXJzLkNvbnRlbnRUeXBlXSA9XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2V0RXhpc3RpbmdPckRlZmF1bHRDb250ZW50VHlwZUhlYWRlcihhZGRpdGlvbmFsSGVhZGVycywgTWVkaWFUeXBlcy5BcHBsaWNhdGlvbkpzb24pO1xuICAgICAgICAgICAgY29uc3QgcmVzID0geWllbGQgdGhpcy5wb3N0KHJlcXVlc3RVcmwsIGRhdGEsIGFkZGl0aW9uYWxIZWFkZXJzKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzUmVzcG9uc2UocmVzLCB0aGlzLnJlcXVlc3RPcHRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1dEpzb24ocmVxdWVzdFVybF8xLCBvYmpfMSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIGFyZ3VtZW50cywgdm9pZCAwLCBmdW5jdGlvbiogKHJlcXVlc3RVcmwsIG9iaiwgYWRkaXRpb25hbEhlYWRlcnMgPSB7fSkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMik7XG4gICAgICAgICAgICBhZGRpdGlvbmFsSGVhZGVyc1tIZWFkZXJzLkFjY2VwdF0gPSB0aGlzLl9nZXRFeGlzdGluZ09yRGVmYXVsdEhlYWRlcihhZGRpdGlvbmFsSGVhZGVycywgSGVhZGVycy5BY2NlcHQsIE1lZGlhVHlwZXMuQXBwbGljYXRpb25Kc29uKTtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxIZWFkZXJzW0hlYWRlcnMuQ29udGVudFR5cGVdID1cbiAgICAgICAgICAgICAgICB0aGlzLl9nZXRFeGlzdGluZ09yRGVmYXVsdENvbnRlbnRUeXBlSGVhZGVyKGFkZGl0aW9uYWxIZWFkZXJzLCBNZWRpYVR5cGVzLkFwcGxpY2F0aW9uSnNvbik7XG4gICAgICAgICAgICBjb25zdCByZXMgPSB5aWVsZCB0aGlzLnB1dChyZXF1ZXN0VXJsLCBkYXRhLCBhZGRpdGlvbmFsSGVhZGVycyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1Jlc3BvbnNlKHJlcywgdGhpcy5yZXF1ZXN0T3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwYXRjaEpzb24ocmVxdWVzdFVybF8xLCBvYmpfMSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIGFyZ3VtZW50cywgdm9pZCAwLCBmdW5jdGlvbiogKHJlcXVlc3RVcmwsIG9iaiwgYWRkaXRpb25hbEhlYWRlcnMgPSB7fSkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMik7XG4gICAgICAgICAgICBhZGRpdGlvbmFsSGVhZGVyc1tIZWFkZXJzLkFjY2VwdF0gPSB0aGlzLl9nZXRFeGlzdGluZ09yRGVmYXVsdEhlYWRlcihhZGRpdGlvbmFsSGVhZGVycywgSGVhZGVycy5BY2NlcHQsIE1lZGlhVHlwZXMuQXBwbGljYXRpb25Kc29uKTtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxIZWFkZXJzW0hlYWRlcnMuQ29udGVudFR5cGVdID1cbiAgICAgICAgICAgICAgICB0aGlzLl9nZXRFeGlzdGluZ09yRGVmYXVsdENvbnRlbnRUeXBlSGVhZGVyKGFkZGl0aW9uYWxIZWFkZXJzLCBNZWRpYVR5cGVzLkFwcGxpY2F0aW9uSnNvbik7XG4gICAgICAgICAgICBjb25zdCByZXMgPSB5aWVsZCB0aGlzLnBhdGNoKHJlcXVlc3RVcmwsIGRhdGEsIGFkZGl0aW9uYWxIZWFkZXJzKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzUmVzcG9uc2UocmVzLCB0aGlzLnJlcXVlc3RPcHRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1ha2VzIGEgcmF3IGh0dHAgcmVxdWVzdC5cbiAgICAgKiBBbGwgb3RoZXIgbWV0aG9kcyBzdWNoIGFzIGdldCwgcG9zdCwgcGF0Y2gsIGFuZCByZXF1ZXN0IHVsdGltYXRlbHkgY2FsbCB0aGlzLlxuICAgICAqIFByZWZlciBnZXQsIGRlbCwgcG9zdCBhbmQgcGF0Y2hcbiAgICAgKi9cbiAgICByZXF1ZXN0KHZlcmIsIHJlcXVlc3RVcmwsIGRhdGEsIGhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9kaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2xpZW50IGhhcyBhbHJlYWR5IGJlZW4gZGlzcG9zZWQuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHJlcXVlc3RVcmwpO1xuICAgICAgICAgICAgbGV0IGluZm8gPSB0aGlzLl9wcmVwYXJlUmVxdWVzdCh2ZXJiLCBwYXJzZWRVcmwsIGhlYWRlcnMpO1xuICAgICAgICAgICAgLy8gT25seSBwZXJmb3JtIHJldHJpZXMgb24gcmVhZHMgc2luY2Ugd3JpdGVzIG1heSBub3QgYmUgaWRlbXBvdGVudC5cbiAgICAgICAgICAgIGNvbnN0IG1heFRyaWVzID0gdGhpcy5fYWxsb3dSZXRyaWVzICYmIFJldHJ5YWJsZUh0dHBWZXJicy5pbmNsdWRlcyh2ZXJiKVxuICAgICAgICAgICAgICAgID8gdGhpcy5fbWF4UmV0cmllcyArIDFcbiAgICAgICAgICAgICAgICA6IDE7XG4gICAgICAgICAgICBsZXQgbnVtVHJpZXMgPSAwO1xuICAgICAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlID0geWllbGQgdGhpcy5yZXF1ZXN0UmF3KGluZm8sIGRhdGEpO1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGl0J3MgYW4gYXV0aGVudGljYXRpb24gY2hhbGxlbmdlXG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlICYmXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1lc3NhZ2UgJiZcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UubWVzc2FnZS5zdGF0dXNDb2RlID09PSBIdHRwQ29kZXMuVW5hdXRob3JpemVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhdXRoZW50aWNhdGlvbkhhbmRsZXI7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiB0aGlzLmhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlci5jYW5IYW5kbGVBdXRoZW50aWNhdGlvbihyZXNwb25zZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbkhhbmRsZXIgPSBoYW5kbGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdXRoZW50aWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdXRoZW50aWNhdGlvbkhhbmRsZXIuaGFuZGxlQXV0aGVudGljYXRpb24odGhpcywgaW5mbywgZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHJlY2VpdmVkIGFuIHVuYXV0aG9yaXplZCByZXNwb25zZSBidXQgaGF2ZSBubyBoYW5kbGVycyB0byBoYW5kbGUgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQgdGhlIHJlc3BvbnNlIHJldHVybiB0byB0aGUgY2FsbGVyLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCByZWRpcmVjdHNSZW1haW5pbmcgPSB0aGlzLl9tYXhSZWRpcmVjdHM7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHJlc3BvbnNlLm1lc3NhZ2Uuc3RhdHVzQ29kZSAmJlxuICAgICAgICAgICAgICAgICAgICBIdHRwUmVkaXJlY3RDb2Rlcy5pbmNsdWRlcyhyZXNwb25zZS5tZXNzYWdlLnN0YXR1c0NvZGUpICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FsbG93UmVkaXJlY3RzICYmXG4gICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0c1JlbWFpbmluZyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVkaXJlY3RVcmwgPSByZXNwb25zZS5tZXNzYWdlLmhlYWRlcnNbJ2xvY2F0aW9uJ107XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVkaXJlY3RVcmwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlJ3Mgbm8gbG9jYXRpb24gdG8gcmVkaXJlY3QgdG8sIHdlIHdvbid0XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRSZWRpcmVjdFVybCA9IG5ldyBVUkwocmVkaXJlY3RVcmwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VkVXJsLnByb3RvY29sID09PSAnaHR0cHM6JyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkVXJsLnByb3RvY29sICE9PSBwYXJzZWRSZWRpcmVjdFVybC5wcm90b2NvbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuX2FsbG93UmVkaXJlY3REb3duZ3JhZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVkaXJlY3QgZnJvbSBIVFRQUyB0byBIVFRQIHByb3RvY29sLiBUaGlzIGRvd25ncmFkZSBpcyBub3QgYWxsb3dlZCBmb3Igc2VjdXJpdHkgcmVhc29ucy4gSWYgeW91IHdhbnQgdG8gYWxsb3cgdGhpcyBiZWhhdmlvciwgc2V0IHRoZSBhbGxvd1JlZGlyZWN0RG93bmdyYWRlIG9wdGlvbiB0byB0cnVlLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gZmluaXNoIHJlYWRpbmcgdGhlIHJlc3BvbnNlIGJlZm9yZSByZWFzc2lnbmluZyByZXNwb25zZVxuICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCB3aWxsIGxlYWsgdGhlIG9wZW4gc29ja2V0LlxuICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXNwb25zZS5yZWFkQm9keSgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBzdHJpcCBhdXRob3JpemF0aW9uIGhlYWRlciBpZiByZWRpcmVjdGVkIHRvIGEgZGlmZmVyZW50IGhvc3RuYW1lXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZWRSZWRpcmVjdFVybC5ob3N0bmFtZSAhPT0gcGFyc2VkVXJsLmhvc3RuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhlYWRlciBpbiBoZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVhZGVyIG5hbWVzIGFyZSBjYXNlIGluc2Vuc2l0aXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlci50b0xvd2VyQ2FzZSgpID09PSAnYXV0aG9yaXphdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGhlYWRlcnNbaGVhZGVyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gbGV0J3MgbWFrZSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBuZXcgcmVkaXJlY3RVcmxcbiAgICAgICAgICAgICAgICAgICAgaW5mbyA9IHRoaXMuX3ByZXBhcmVSZXF1ZXN0KHZlcmIsIHBhcnNlZFJlZGlyZWN0VXJsLCBoZWFkZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCB0aGlzLnJlcXVlc3RSYXcoaW5mbywgZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0c1JlbWFpbmluZy0tO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm1lc3NhZ2Uuc3RhdHVzQ29kZSB8fFxuICAgICAgICAgICAgICAgICAgICAhSHR0cFJlc3BvbnNlUmV0cnlDb2Rlcy5pbmNsdWRlcyhyZXNwb25zZS5tZXNzYWdlLnN0YXR1c0NvZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIG5vdCBhIHJldHJ5IGNvZGUsIHJldHVybiBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIHJldHJ5aW5nXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbnVtVHJpZXMgKz0gMTtcbiAgICAgICAgICAgICAgICBpZiAobnVtVHJpZXMgPCBtYXhUcmllcykge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXNwb25zZS5yZWFkQm9keSgpO1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCB0aGlzLl9wZXJmb3JtRXhwb25lbnRpYWxCYWNrb2ZmKG51bVRyaWVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlIChudW1UcmllcyA8IG1heFRyaWVzKTtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE5lZWRzIHRvIGJlIGNhbGxlZCBpZiBrZWVwQWxpdmUgaXMgc2V0IHRvIHRydWUgaW4gcmVxdWVzdCBvcHRpb25zLlxuICAgICAqL1xuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9hZ2VudCkge1xuICAgICAgICAgICAgdGhpcy5fYWdlbnQuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmF3IHJlcXVlc3QuXG4gICAgICogQHBhcmFtIGluZm9cbiAgICAgKiBAcGFyYW0gZGF0YVxuICAgICAqL1xuICAgIHJlcXVlc3RSYXcoaW5mbywgZGF0YSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjYWxsYmFja0ZvclJlc3VsdChlcnIsIHJlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghcmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBgZXJyYCBpcyBub3QgcGFzc2VkLCB0aGVuIGByZXNgIG11c3QgYmUgcGFzc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignVW5rbm93biBlcnJvcicpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RSYXdXaXRoQ2FsbGJhY2soaW5mbywgZGF0YSwgY2FsbGJhY2tGb3JSZXN1bHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSYXcgcmVxdWVzdCB3aXRoIGNhbGxiYWNrLlxuICAgICAqIEBwYXJhbSBpbmZvXG4gICAgICogQHBhcmFtIGRhdGFcbiAgICAgKiBAcGFyYW0gb25SZXN1bHRcbiAgICAgKi9cbiAgICByZXF1ZXN0UmF3V2l0aENhbGxiYWNrKGluZm8sIGRhdGEsIG9uUmVzdWx0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICghaW5mby5vcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICBpbmZvLm9wdGlvbnMuaGVhZGVycyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5mby5vcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtTGVuZ3RoJ10gPSBCdWZmZXIuYnl0ZUxlbmd0aChkYXRhLCAndXRmOCcpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjYWxsYmFja0NhbGxlZCA9IGZhbHNlO1xuICAgICAgICBmdW5jdGlvbiBoYW5kbGVSZXN1bHQoZXJyLCByZXMpIHtcbiAgICAgICAgICAgIGlmICghY2FsbGJhY2tDYWxsZWQpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja0NhbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgb25SZXN1bHQoZXJyLCByZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcSA9IGluZm8uaHR0cE1vZHVsZS5yZXF1ZXN0KGluZm8ub3B0aW9ucywgKG1zZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gbmV3IEh0dHBDbGllbnRSZXNwb25zZShtc2cpO1xuICAgICAgICAgICAgaGFuZGxlUmVzdWx0KHVuZGVmaW5lZCwgcmVzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBzb2NrZXQ7XG4gICAgICAgIHJlcS5vbignc29ja2V0Jywgc29jayA9PiB7XG4gICAgICAgICAgICBzb2NrZXQgPSBzb2NrO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gSWYgd2UgZXZlciBnZXQgZGlzY29ubmVjdGVkLCB3ZSB3YW50IHRoZSBzb2NrZXQgdG8gdGltZW91dCBldmVudHVhbGx5XG4gICAgICAgIHJlcS5zZXRUaW1lb3V0KHRoaXMuX3NvY2tldFRpbWVvdXQgfHwgMyAqIDYwMDAwLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoc29ja2V0KSB7XG4gICAgICAgICAgICAgICAgc29ja2V0LmVuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFuZGxlUmVzdWx0KG5ldyBFcnJvcihgUmVxdWVzdCB0aW1lb3V0OiAke2luZm8ub3B0aW9ucy5wYXRofWApKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAvLyBlcnIgaGFzIHN0YXR1c0NvZGUgcHJvcGVydHlcbiAgICAgICAgICAgIC8vIHJlcyBzaG91bGQgaGF2ZSBoZWFkZXJzXG4gICAgICAgICAgICBoYW5kbGVSZXN1bHQoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChkYXRhICYmIHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmVxLndyaXRlKGRhdGEsICd1dGY4Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEgJiYgdHlwZW9mIGRhdGEgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBkYXRhLm9uKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXEuZW5kKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRhdGEucGlwZShyZXEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVxLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYW4gaHR0cCBhZ2VudC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3UgbmVlZCBhbiBodHRwIGFnZW50IHRoYXQgaGFuZGxlc1xuICAgICAqIHJvdXRpbmcgdGhyb3VnaCBhIHByb3h5IHNlcnZlciAtIGRlcGVuZGluZyB1cG9uIHRoZSB1cmwgYW5kIHByb3h5IGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAgICAgKiBAcGFyYW0gc2VydmVyVXJsICBUaGUgc2VydmVyIFVSTCB3aGVyZSB0aGUgcmVxdWVzdCB3aWxsIGJlIHNlbnQuIEZvciBleGFtcGxlLCBodHRwczovL2FwaS5naXRodWIuY29tXG4gICAgICovXG4gICAgZ2V0QWdlbnQoc2VydmVyVXJsKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwoc2VydmVyVXJsKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEFnZW50KHBhcnNlZFVybCk7XG4gICAgfVxuICAgIGdldEFnZW50RGlzcGF0Y2hlcihzZXJ2ZXJVcmwpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTChzZXJ2ZXJVcmwpO1xuICAgICAgICBjb25zdCBwcm94eVVybCA9IHBtLmdldFByb3h5VXJsKHBhcnNlZFVybCk7XG4gICAgICAgIGNvbnN0IHVzZVByb3h5ID0gcHJveHlVcmwgJiYgcHJveHlVcmwuaG9zdG5hbWU7XG4gICAgICAgIGlmICghdXNlUHJveHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0UHJveHlBZ2VudERpc3BhdGNoZXIocGFyc2VkVXJsLCBwcm94eVVybCk7XG4gICAgfVxuICAgIF9wcmVwYXJlUmVxdWVzdChtZXRob2QsIHJlcXVlc3RVcmwsIGhlYWRlcnMpIHtcbiAgICAgICAgY29uc3QgaW5mbyA9IHt9O1xuICAgICAgICBpbmZvLnBhcnNlZFVybCA9IHJlcXVlc3RVcmw7XG4gICAgICAgIGNvbnN0IHVzaW5nU3NsID0gaW5mby5wYXJzZWRVcmwucHJvdG9jb2wgPT09ICdodHRwczonO1xuICAgICAgICBpbmZvLmh0dHBNb2R1bGUgPSB1c2luZ1NzbCA/IGh0dHBzIDogaHR0cDtcbiAgICAgICAgY29uc3QgZGVmYXVsdFBvcnQgPSB1c2luZ1NzbCA/IDQ0MyA6IDgwO1xuICAgICAgICBpbmZvLm9wdGlvbnMgPSB7fTtcbiAgICAgICAgaW5mby5vcHRpb25zLmhvc3QgPSBpbmZvLnBhcnNlZFVybC5ob3N0bmFtZTtcbiAgICAgICAgaW5mby5vcHRpb25zLnBvcnQgPSBpbmZvLnBhcnNlZFVybC5wb3J0XG4gICAgICAgICAgICA/IHBhcnNlSW50KGluZm8ucGFyc2VkVXJsLnBvcnQpXG4gICAgICAgICAgICA6IGRlZmF1bHRQb3J0O1xuICAgICAgICBpbmZvLm9wdGlvbnMucGF0aCA9XG4gICAgICAgICAgICAoaW5mby5wYXJzZWRVcmwucGF0aG5hbWUgfHwgJycpICsgKGluZm8ucGFyc2VkVXJsLnNlYXJjaCB8fCAnJyk7XG4gICAgICAgIGluZm8ub3B0aW9ucy5tZXRob2QgPSBtZXRob2Q7XG4gICAgICAgIGluZm8ub3B0aW9ucy5oZWFkZXJzID0gdGhpcy5fbWVyZ2VIZWFkZXJzKGhlYWRlcnMpO1xuICAgICAgICBpZiAodGhpcy51c2VyQWdlbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaW5mby5vcHRpb25zLmhlYWRlcnNbJ3VzZXItYWdlbnQnXSA9IHRoaXMudXNlckFnZW50O1xuICAgICAgICB9XG4gICAgICAgIGluZm8ub3B0aW9ucy5hZ2VudCA9IHRoaXMuX2dldEFnZW50KGluZm8ucGFyc2VkVXJsKTtcbiAgICAgICAgLy8gZ2l2ZXMgaGFuZGxlcnMgYW4gb3Bwb3J0dW5pdHkgdG8gcGFydGljaXBhdGVcbiAgICAgICAgaWYgKHRoaXMuaGFuZGxlcnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiB0aGlzLmhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlci5wcmVwYXJlUmVxdWVzdChpbmZvLm9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cbiAgICBfbWVyZ2VIZWFkZXJzKGhlYWRlcnMpIHtcbiAgICAgICAgaWYgKHRoaXMucmVxdWVzdE9wdGlvbnMgJiYgdGhpcy5yZXF1ZXN0T3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgbG93ZXJjYXNlS2V5cyh0aGlzLnJlcXVlc3RPcHRpb25zLmhlYWRlcnMpLCBsb3dlcmNhc2VLZXlzKGhlYWRlcnMgfHwge30pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG93ZXJjYXNlS2V5cyhoZWFkZXJzIHx8IHt9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhbiBleGlzdGluZyBoZWFkZXIgdmFsdWUgb3IgcmV0dXJucyBhIGRlZmF1bHQuXG4gICAgICogSGFuZGxlcyBjb252ZXJ0aW5nIG51bWJlciBoZWFkZXIgdmFsdWVzIHRvIHN0cmluZ3Mgc2luY2UgSFRUUCBoZWFkZXJzIG11c3QgYmUgc3RyaW5ncy5cbiAgICAgKiBOb3RlOiBUaGlzIHJldHVybnMgc3RyaW5nIHwgc3RyaW5nW10gc2luY2Ugc29tZSBoZWFkZXJzIGNhbiBoYXZlIG11bHRpcGxlIHZhbHVlcy5cbiAgICAgKiBGb3IgaGVhZGVycyB0aGF0IG11c3QgYWx3YXlzIGJlIGEgc2luZ2xlIHN0cmluZyAobGlrZSBDb250ZW50LVR5cGUpLCB1c2UgdGhlXG4gICAgICogc3BlY2lhbGl6ZWQgX2dldEV4aXN0aW5nT3JEZWZhdWx0Q29udGVudFR5cGVIZWFkZXIgbWV0aG9kIGluc3RlYWQuXG4gICAgICovXG4gICAgX2dldEV4aXN0aW5nT3JEZWZhdWx0SGVhZGVyKGFkZGl0aW9uYWxIZWFkZXJzLCBoZWFkZXIsIF9kZWZhdWx0KSB7XG4gICAgICAgIGxldCBjbGllbnRIZWFkZXI7XG4gICAgICAgIGlmICh0aGlzLnJlcXVlc3RPcHRpb25zICYmIHRoaXMucmVxdWVzdE9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyVmFsdWUgPSBsb3dlcmNhc2VLZXlzKHRoaXMucmVxdWVzdE9wdGlvbnMuaGVhZGVycylbaGVhZGVyXTtcbiAgICAgICAgICAgIGlmIChoZWFkZXJWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGNsaWVudEhlYWRlciA9XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBoZWFkZXJWYWx1ZSA9PT0gJ251bWJlcicgPyBoZWFkZXJWYWx1ZS50b1N0cmluZygpIDogaGVhZGVyVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWRkaXRpb25hbFZhbHVlID0gYWRkaXRpb25hbEhlYWRlcnNbaGVhZGVyXTtcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGFkZGl0aW9uYWxWYWx1ZSA9PT0gJ251bWJlcidcbiAgICAgICAgICAgICAgICA/IGFkZGl0aW9uYWxWYWx1ZS50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgOiBhZGRpdGlvbmFsVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNsaWVudEhlYWRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gY2xpZW50SGVhZGVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfZGVmYXVsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBfZ2V0RXhpc3RpbmdPckRlZmF1bHRIZWFkZXIgZm9yIENvbnRlbnQtVHlwZSBoZWFkZXIuXG4gICAgICogQWx3YXlzIHJldHVybnMgYSBzaW5nbGUgc3RyaW5nIChub3QgYW4gYXJyYXkpIHNpbmNlIENvbnRlbnQtVHlwZSBzaG91bGQgYmUgYSBzaW5nbGUgdmFsdWUuXG4gICAgICogQ29udmVydHMgYXJyYXlzIHRvIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmdzIGFuZCBudW1iZXJzIHRvIHN0cmluZ3MgdG8gZW5zdXJlIHR5cGUgc2FmZXR5LlxuICAgICAqIFRoaXMgd2FzIHNwbGl0IGZyb20gX2dldEV4aXN0aW5nT3JEZWZhdWx0SGVhZGVyIHRvIHByb3ZpZGUgc3RyaWN0ZXIgdHlwaW5nIGZvciBjYWxsZXJzXG4gICAgICogdGhhdCBhc3NpZ24gdGhlIHJlc3VsdCB0byBwbGFjZXMgZXhwZWN0aW5nIGEgc3RyaW5nIChlLmcuLCBhZGRpdGlvbmFsSGVhZGVyc1tIZWFkZXJzLkNvbnRlbnRUeXBlXSkuXG4gICAgICovXG4gICAgX2dldEV4aXN0aW5nT3JEZWZhdWx0Q29udGVudFR5cGVIZWFkZXIoYWRkaXRpb25hbEhlYWRlcnMsIF9kZWZhdWx0KSB7XG4gICAgICAgIGxldCBjbGllbnRIZWFkZXI7XG4gICAgICAgIGlmICh0aGlzLnJlcXVlc3RPcHRpb25zICYmIHRoaXMucmVxdWVzdE9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyVmFsdWUgPSBsb3dlcmNhc2VLZXlzKHRoaXMucmVxdWVzdE9wdGlvbnMuaGVhZGVycylbSGVhZGVycy5Db250ZW50VHlwZV07XG4gICAgICAgICAgICBpZiAoaGVhZGVyVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGhlYWRlclZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgICAgICBjbGllbnRIZWFkZXIgPSBTdHJpbmcoaGVhZGVyVmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGhlYWRlclZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBjbGllbnRIZWFkZXIgPSBoZWFkZXJWYWx1ZS5qb2luKCcsICcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2xpZW50SGVhZGVyID0gaGVhZGVyVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxWYWx1ZSA9IGFkZGl0aW9uYWxIZWFkZXJzW0hlYWRlcnMuQ29udGVudFR5cGVdO1xuICAgICAgICAvLyBSZXR1cm4gdGhlIGZpcnN0IG5vbi11bmRlZmluZWQgdmFsdWUsIGNvbnZlcnRpbmcgbnVtYmVycyBvciBhcnJheXMgdG8gc3RyaW5ncyBpZiBuZWNlc3NhcnlcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGFkZGl0aW9uYWxWYWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGFkZGl0aW9uYWxWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFkZGl0aW9uYWxWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkaXRpb25hbFZhbHVlLmpvaW4oJywgJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkaXRpb25hbFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjbGllbnRIZWFkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNsaWVudEhlYWRlcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX2RlZmF1bHQ7XG4gICAgfVxuICAgIF9nZXRBZ2VudChwYXJzZWRVcmwpIHtcbiAgICAgICAgbGV0IGFnZW50O1xuICAgICAgICBjb25zdCBwcm94eVVybCA9IHBtLmdldFByb3h5VXJsKHBhcnNlZFVybCk7XG4gICAgICAgIGNvbnN0IHVzZVByb3h5ID0gcHJveHlVcmwgJiYgcHJveHlVcmwuaG9zdG5hbWU7XG4gICAgICAgIGlmICh0aGlzLl9rZWVwQWxpdmUgJiYgdXNlUHJveHkpIHtcbiAgICAgICAgICAgIGFnZW50ID0gdGhpcy5fcHJveHlBZ2VudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXVzZVByb3h5KSB7XG4gICAgICAgICAgICBhZ2VudCA9IHRoaXMuX2FnZW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGFnZW50IGlzIGFscmVhZHkgYXNzaWduZWQgdXNlIHRoYXQgYWdlbnQuXG4gICAgICAgIGlmIChhZ2VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGFnZW50O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVzaW5nU3NsID0gcGFyc2VkVXJsLnByb3RvY29sID09PSAnaHR0cHM6JztcbiAgICAgICAgbGV0IG1heFNvY2tldHMgPSAxMDA7XG4gICAgICAgIGlmICh0aGlzLnJlcXVlc3RPcHRpb25zKSB7XG4gICAgICAgICAgICBtYXhTb2NrZXRzID0gdGhpcy5yZXF1ZXN0T3B0aW9ucy5tYXhTb2NrZXRzIHx8IGh0dHAuZ2xvYmFsQWdlbnQubWF4U29ja2V0cztcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGlzIGlzIGB1c2VQcm94eWAgYWdhaW4sIGJ1dCB3ZSBuZWVkIHRvIGNoZWNrIGBwcm94eVVSbGAgZGlyZWN0bHkgZm9yIFR5cGVTY3JpcHRzJ3MgZmxvdyBhbmFseXNpcy5cbiAgICAgICAgaWYgKHByb3h5VXJsICYmIHByb3h5VXJsLmhvc3RuYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBhZ2VudE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgbWF4U29ja2V0cyxcbiAgICAgICAgICAgICAgICBrZWVwQWxpdmU6IHRoaXMuX2tlZXBBbGl2ZSxcbiAgICAgICAgICAgICAgICBwcm94eTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCAoKHByb3h5VXJsLnVzZXJuYW1lIHx8IHByb3h5VXJsLnBhc3N3b3JkKSAmJiB7XG4gICAgICAgICAgICAgICAgICAgIHByb3h5QXV0aDogYCR7cHJveHlVcmwudXNlcm5hbWV9OiR7cHJveHlVcmwucGFzc3dvcmR9YFxuICAgICAgICAgICAgICAgIH0pKSwgeyBob3N0OiBwcm94eVVybC5ob3N0bmFtZSwgcG9ydDogcHJveHlVcmwucG9ydCB9KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCB0dW5uZWxBZ2VudDtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJIdHRwcyA9IHByb3h5VXJsLnByb3RvY29sID09PSAnaHR0cHM6JztcbiAgICAgICAgICAgIGlmICh1c2luZ1NzbCkge1xuICAgICAgICAgICAgICAgIHR1bm5lbEFnZW50ID0gb3Zlckh0dHBzID8gdHVubmVsLmh0dHBzT3Zlckh0dHBzIDogdHVubmVsLmh0dHBzT3Zlckh0dHA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0dW5uZWxBZ2VudCA9IG92ZXJIdHRwcyA/IHR1bm5lbC5odHRwT3Zlckh0dHBzIDogdHVubmVsLmh0dHBPdmVySHR0cDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFnZW50ID0gdHVubmVsQWdlbnQoYWdlbnRPcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuX3Byb3h5QWdlbnQgPSBhZ2VudDtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiB0dW5uZWxpbmcgYWdlbnQgaXNuJ3QgYXNzaWduZWQgY3JlYXRlIGEgbmV3IGFnZW50XG4gICAgICAgIGlmICghYWdlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IGtlZXBBbGl2ZTogdGhpcy5fa2VlcEFsaXZlLCBtYXhTb2NrZXRzIH07XG4gICAgICAgICAgICBhZ2VudCA9IHVzaW5nU3NsID8gbmV3IGh0dHBzLkFnZW50KG9wdGlvbnMpIDogbmV3IGh0dHAuQWdlbnQob3B0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLl9hZ2VudCA9IGFnZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICh1c2luZ1NzbCAmJiB0aGlzLl9pZ25vcmVTc2xFcnJvcikge1xuICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0byBzZXQgTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRD0wIHNpbmNlIHRoYXQgd2lsbCBhZmZlY3QgcmVxdWVzdCBmb3IgZW50aXJlIHByb2Nlc3NcbiAgICAgICAgICAgIC8vIGh0dHAuUmVxdWVzdE9wdGlvbnMgZG9lc24ndCBleHBvc2UgYSB3YXkgdG8gbW9kaWZ5IFJlcXVlc3RPcHRpb25zLmFnZW50Lm9wdGlvbnNcbiAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gY2FzdCBpdCB0byBhbnkgYW5kIGNoYW5nZSBpdCBkaXJlY3RseVxuICAgICAgICAgICAgYWdlbnQub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oYWdlbnQub3B0aW9ucyB8fCB7fSwge1xuICAgICAgICAgICAgICAgIHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZ2VudDtcbiAgICB9XG4gICAgX2dldFByb3h5QWdlbnREaXNwYXRjaGVyKHBhcnNlZFVybCwgcHJveHlVcmwpIHtcbiAgICAgICAgbGV0IHByb3h5QWdlbnQ7XG4gICAgICAgIGlmICh0aGlzLl9rZWVwQWxpdmUpIHtcbiAgICAgICAgICAgIHByb3h5QWdlbnQgPSB0aGlzLl9wcm94eUFnZW50RGlzcGF0Y2hlcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBhZ2VudCBpcyBhbHJlYWR5IGFzc2lnbmVkIHVzZSB0aGF0IGFnZW50LlxuICAgICAgICBpZiAocHJveHlBZ2VudCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb3h5QWdlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXNpbmdTc2wgPSBwYXJzZWRVcmwucHJvdG9jb2wgPT09ICdodHRwczonO1xuICAgICAgICBwcm94eUFnZW50ID0gbmV3IHVuZGljaV8xLlByb3h5QWdlbnQoT2JqZWN0LmFzc2lnbih7IHVyaTogcHJveHlVcmwuaHJlZiwgcGlwZWxpbmluZzogIXRoaXMuX2tlZXBBbGl2ZSA/IDAgOiAxIH0sICgocHJveHlVcmwudXNlcm5hbWUgfHwgcHJveHlVcmwucGFzc3dvcmQpICYmIHtcbiAgICAgICAgICAgIHRva2VuOiBgQmFzaWMgJHtCdWZmZXIuZnJvbShgJHtwcm94eVVybC51c2VybmFtZX06JHtwcm94eVVybC5wYXNzd29yZH1gKS50b1N0cmluZygnYmFzZTY0Jyl9YFxuICAgICAgICB9KSkpO1xuICAgICAgICB0aGlzLl9wcm94eUFnZW50RGlzcGF0Y2hlciA9IHByb3h5QWdlbnQ7XG4gICAgICAgIGlmICh1c2luZ1NzbCAmJiB0aGlzLl9pZ25vcmVTc2xFcnJvcikge1xuICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0byBzZXQgTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRD0wIHNpbmNlIHRoYXQgd2lsbCBhZmZlY3QgcmVxdWVzdCBmb3IgZW50aXJlIHByb2Nlc3NcbiAgICAgICAgICAgIC8vIGh0dHAuUmVxdWVzdE9wdGlvbnMgZG9lc24ndCBleHBvc2UgYSB3YXkgdG8gbW9kaWZ5IFJlcXVlc3RPcHRpb25zLmFnZW50Lm9wdGlvbnNcbiAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gY2FzdCBpdCB0byBhbnkgYW5kIGNoYW5nZSBpdCBkaXJlY3RseVxuICAgICAgICAgICAgcHJveHlBZ2VudC5vcHRpb25zID0gT2JqZWN0LmFzc2lnbihwcm94eUFnZW50Lm9wdGlvbnMucmVxdWVzdFRscyB8fCB7fSwge1xuICAgICAgICAgICAgICAgIHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm94eUFnZW50O1xuICAgIH1cbiAgICBfZ2V0VXNlckFnZW50V2l0aE9yY2hlc3RyYXRpb25JZCh1c2VyQWdlbnQpIHtcbiAgICAgICAgY29uc3QgYmFzZVVzZXJBZ2VudCA9IHVzZXJBZ2VudCB8fCAnYWN0aW9ucy9odHRwLWNsaWVudCc7XG4gICAgICAgIGNvbnN0IG9yY2hJZCA9IHByb2Nlc3MuZW52WydBQ1RJT05TX09SQ0hFU1RSQVRJT05fSUQnXTtcbiAgICAgICAgaWYgKG9yY2hJZCkge1xuICAgICAgICAgICAgLy8gU2FuaXRpemUgdGhlIG9yY2hlc3RyYXRpb24gSUQgdG8gZW5zdXJlIGl0IGNvbnRhaW5zIG9ubHkgdmFsaWQgY2hhcmFjdGVyc1xuICAgICAgICAgICAgLy8gVmFsaWQgY2hhcmFjdGVyczogMC05LCBhLXosIF8sIC0sIC5cbiAgICAgICAgICAgIGNvbnN0IHNhbml0aXplZElkID0gb3JjaElkLnJlcGxhY2UoL1teYS16MC05Xy4tXS9naSwgJ18nKTtcbiAgICAgICAgICAgIHJldHVybiBgJHtiYXNlVXNlckFnZW50fSBhY3Rpb25zX29yY2hlc3RyYXRpb25faWQvJHtzYW5pdGl6ZWRJZH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiYXNlVXNlckFnZW50O1xuICAgIH1cbiAgICBfcGVyZm9ybUV4cG9uZW50aWFsQmFja29mZihyZXRyeU51bWJlcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0cnlOdW1iZXIgPSBNYXRoLm1pbihFeHBvbmVudGlhbEJhY2tvZmZDZWlsaW5nLCByZXRyeU51bWJlcik7XG4gICAgICAgICAgICBjb25zdCBtcyA9IEV4cG9uZW50aWFsQmFja29mZlRpbWVTbGljZSAqIE1hdGgucG93KDIsIHJldHJ5TnVtYmVyKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCBtcykpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX3Byb2Nlc3NSZXNwb25zZShyZXMsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9IHJlcy5tZXNzYWdlLnN0YXR1c0NvZGUgfHwgMDtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7fVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy8gbm90IGZvdW5kIGxlYWRzIHRvIG51bGwgb2JqIHJldHVybmVkXG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1c0NvZGUgPT09IEh0dHBDb2Rlcy5Ob3RGb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSByZXN1bHQgZnJvbSB0aGUgYm9keVxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRhdGVUaW1lRGVzZXJpYWxpemVyKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGEgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKGEudmFsdWVPZigpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IG9iajtcbiAgICAgICAgICAgICAgICBsZXQgY29udGVudHM7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudHMgPSB5aWVsZCByZXMucmVhZEJvZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRzICYmIGNvbnRlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZGVzZXJpYWxpemVEYXRlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IEpTT04ucGFyc2UoY29udGVudHMsIGRhdGVUaW1lRGVzZXJpYWxpemVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IEpTT04ucGFyc2UoY29udGVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UucmVzdWx0ID0gb2JqO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMgPSByZXMubWVzc2FnZS5oZWFkZXJzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEludmFsaWQgcmVzb3VyY2UgKGNvbnRlbnRzIG5vdCBqc29uKTsgIGxlYXZpbmcgcmVzdWx0IG9iaiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIG5vdGUgdGhhdCAzeHggcmVkaXJlY3RzIGFyZSBoYW5kbGVkIGJ5IHRoZSBodHRwIGxheWVyLlxuICAgICAgICAgICAgICAgIGlmIChzdGF0dXNDb2RlID4gMjk5KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtc2c7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIGV4Y2VwdGlvbi9lcnJvciBpbiBib2R5LCBhdHRlbXB0IHRvIGdldCBiZXR0ZXIgZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiAmJiBvYmoubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gb2JqLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29udGVudHMgJiYgY29udGVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgbWF5IGJlIHRoZSBjYXNlIHRoYXQgdGhlIGV4Y2VwdGlvbiBpcyBpbiB0aGUgYm9keSBtZXNzYWdlIGFzIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gY29udGVudHM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBgRmFpbGVkIHJlcXVlc3Q6ICgke3N0YXR1c0NvZGV9KWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEh0dHBDbGllbnRFcnJvcihtc2csIHN0YXR1c0NvZGUpO1xuICAgICAgICAgICAgICAgICAgICBlcnIucmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5IdHRwQ2xpZW50ID0gSHR0cENsaWVudDtcbmNvbnN0IGxvd2VyY2FzZUtleXMgPSAob2JqKSA9PiBPYmplY3Qua2V5cyhvYmopLnJlZHVjZSgoYywgaykgPT4gKChjW2sudG9Mb3dlckNhc2UoKV0gPSBvYmpba10pLCBjKSwge30pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUGVyc29uYWxBY2Nlc3NUb2tlbkNyZWRlbnRpYWxIYW5kbGVyID0gZXhwb3J0cy5CZWFyZXJDcmVkZW50aWFsSGFuZGxlciA9IGV4cG9ydHMuQmFzaWNDcmVkZW50aWFsSGFuZGxlciA9IHZvaWQgMDtcbmNsYXNzIEJhc2ljQ3JlZGVudGlhbEhhbmRsZXIge1xuICAgIGNvbnN0cnVjdG9yKHVzZXJuYW1lLCBwYXNzd29yZCkge1xuICAgICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7XG4gICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDtcbiAgICB9XG4gICAgcHJlcGFyZVJlcXVlc3Qob3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1RoZSByZXF1ZXN0IGhhcyBubyBoZWFkZXJzJyk7XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBgQmFzaWMgJHtCdWZmZXIuZnJvbShgJHt0aGlzLnVzZXJuYW1lfToke3RoaXMucGFzc3dvcmR9YCkudG9TdHJpbmcoJ2Jhc2U2NCcpfWA7XG4gICAgfVxuICAgIC8vIFRoaXMgaGFuZGxlciBjYW5ub3QgaGFuZGxlIDQwMVxuICAgIGNhbkhhbmRsZUF1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGhhbmRsZUF1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5CYXNpY0NyZWRlbnRpYWxIYW5kbGVyID0gQmFzaWNDcmVkZW50aWFsSGFuZGxlcjtcbmNsYXNzIEJlYXJlckNyZWRlbnRpYWxIYW5kbGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih0b2tlbikge1xuICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gICAgfVxuICAgIC8vIGN1cnJlbnRseSBpbXBsZW1lbnRzIHByZS1hdXRob3JpemF0aW9uXG4gICAgLy8gVE9ETzogc3VwcG9ydCBwcmVBdXRoID0gZmFsc2Ugd2hlcmUgaXQgaG9va3Mgb24gNDAxXG4gICAgcHJlcGFyZVJlcXVlc3Qob3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1RoZSByZXF1ZXN0IGhhcyBubyBoZWFkZXJzJyk7XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBgQmVhcmVyICR7dGhpcy50b2tlbn1gO1xuICAgIH1cbiAgICAvLyBUaGlzIGhhbmRsZXIgY2Fubm90IGhhbmRsZSA0MDFcbiAgICBjYW5IYW5kbGVBdXRoZW50aWNhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBoYW5kbGVBdXRoZW50aWNhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuQmVhcmVyQ3JlZGVudGlhbEhhbmRsZXIgPSBCZWFyZXJDcmVkZW50aWFsSGFuZGxlcjtcbmNsYXNzIFBlcnNvbmFsQWNjZXNzVG9rZW5DcmVkZW50aWFsSGFuZGxlciB7XG4gICAgY29uc3RydWN0b3IodG9rZW4pIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICAgIH1cbiAgICAvLyBjdXJyZW50bHkgaW1wbGVtZW50cyBwcmUtYXV0aG9yaXphdGlvblxuICAgIC8vIFRPRE86IHN1cHBvcnQgcHJlQXV0aCA9IGZhbHNlIHdoZXJlIGl0IGhvb2tzIG9uIDQwMVxuICAgIHByZXBhcmVSZXF1ZXN0KG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCFvcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdUaGUgcmVxdWVzdCBoYXMgbm8gaGVhZGVycycpO1xuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnMuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gYEJhc2ljICR7QnVmZmVyLmZyb20oYFBBVDoke3RoaXMudG9rZW59YCkudG9TdHJpbmcoJ2Jhc2U2NCcpfWA7XG4gICAgfVxuICAgIC8vIFRoaXMgaGFuZGxlciBjYW5ub3QgaGFuZGxlIDQwMVxuICAgIGNhbkhhbmRsZUF1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGhhbmRsZUF1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5QZXJzb25hbEFjY2Vzc1Rva2VuQ3JlZGVudGlhbEhhbmRsZXIgPSBQZXJzb25hbEFjY2Vzc1Rva2VuQ3JlZGVudGlhbEhhbmRsZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hdXRoLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk9pZGNDbGllbnQgPSB2b2lkIDA7XG5jb25zdCBodHRwX2NsaWVudF8xID0gcmVxdWlyZShcIkBhY3Rpb25zL2h0dHAtY2xpZW50XCIpO1xuY29uc3QgYXV0aF8xID0gcmVxdWlyZShcIkBhY3Rpb25zL2h0dHAtY2xpZW50L2xpYi9hdXRoXCIpO1xuY29uc3QgY29yZV8xID0gcmVxdWlyZShcIi4vY29yZVwiKTtcbmNsYXNzIE9pZGNDbGllbnQge1xuICAgIHN0YXRpYyBjcmVhdGVIdHRwQ2xpZW50KGFsbG93UmV0cnkgPSB0cnVlLCBtYXhSZXRyeSA9IDEwKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgICAgICAgYWxsb3dSZXRyaWVzOiBhbGxvd1JldHJ5LFxuICAgICAgICAgICAgbWF4UmV0cmllczogbWF4UmV0cnlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG5ldyBodHRwX2NsaWVudF8xLkh0dHBDbGllbnQoJ2FjdGlvbnMvb2lkYy1jbGllbnQnLCBbbmV3IGF1dGhfMS5CZWFyZXJDcmVkZW50aWFsSGFuZGxlcihPaWRjQ2xpZW50LmdldFJlcXVlc3RUb2tlbigpKV0sIHJlcXVlc3RPcHRpb25zKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFJlcXVlc3RUb2tlbigpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSBwcm9jZXNzLmVudlsnQUNUSU9OU19JRF9UT0tFTl9SRVFVRVNUX1RPS0VOJ107XG4gICAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGdldCBBQ1RJT05TX0lEX1RPS0VOX1JFUVVFU1RfVE9LRU4gZW52IHZhcmlhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0SURUb2tlblVybCgpIHtcbiAgICAgICAgY29uc3QgcnVudGltZVVybCA9IHByb2Nlc3MuZW52WydBQ1RJT05TX0lEX1RPS0VOX1JFUVVFU1RfVVJMJ107XG4gICAgICAgIGlmICghcnVudGltZVVybCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZ2V0IEFDVElPTlNfSURfVE9LRU5fUkVRVUVTVF9VUkwgZW52IHZhcmlhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJ1bnRpbWVVcmw7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRDYWxsKGlkX3Rva2VuX3VybCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgY29uc3QgaHR0cGNsaWVudCA9IE9pZGNDbGllbnQuY3JlYXRlSHR0cENsaWVudCgpO1xuICAgICAgICAgICAgY29uc3QgcmVzID0geWllbGQgaHR0cGNsaWVudFxuICAgICAgICAgICAgICAgIC5nZXRKc29uKGlkX3Rva2VuX3VybClcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGdldCBJRCBUb2tlbi4gXFxuIFxuICAgICAgICBFcnJvciBDb2RlIDogJHtlcnJvci5zdGF0dXNDb2RlfVxcbiBcbiAgICAgICAgRXJyb3IgTWVzc2FnZTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBpZF90b2tlbiA9IChfYSA9IHJlcy5yZXN1bHQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZTtcbiAgICAgICAgICAgIGlmICghaWRfdG9rZW4pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jlc3BvbnNlIGpzb24gYm9keSBkbyBub3QgaGF2ZSBJRCBUb2tlbiBmaWVsZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGlkX3Rva2VuO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGdldElEVG9rZW4oYXVkaWVuY2UpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gTmV3IElEIFRva2VuIGlzIHJlcXVlc3RlZCBmcm9tIGFjdGlvbiBzZXJ2aWNlXG4gICAgICAgICAgICAgICAgbGV0IGlkX3Rva2VuX3VybCA9IE9pZGNDbGllbnQuZ2V0SURUb2tlblVybCgpO1xuICAgICAgICAgICAgICAgIGlmIChhdWRpZW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGVkQXVkaWVuY2UgPSBlbmNvZGVVUklDb21wb25lbnQoYXVkaWVuY2UpO1xuICAgICAgICAgICAgICAgICAgICBpZF90b2tlbl91cmwgPSBgJHtpZF90b2tlbl91cmx9JmF1ZGllbmNlPSR7ZW5jb2RlZEF1ZGllbmNlfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICgwLCBjb3JlXzEuZGVidWcpKGBJRCB0b2tlbiB1cmwgaXMgJHtpZF90b2tlbl91cmx9YCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaWRfdG9rZW4gPSB5aWVsZCBPaWRjQ2xpZW50LmdldENhbGwoaWRfdG9rZW5fdXJsKTtcbiAgICAgICAgICAgICAgICAoMCwgY29yZV8xLnNldFNlY3JldCkoaWRfdG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybiBpZF90b2tlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgbWVzc2FnZTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLk9pZGNDbGllbnQgPSBPaWRjQ2xpZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b2lkYy11dGlscy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zdW1tYXJ5ID0gZXhwb3J0cy5tYXJrZG93blN1bW1hcnkgPSBleHBvcnRzLlNVTU1BUllfRE9DU19VUkwgPSBleHBvcnRzLlNVTU1BUllfRU5WX1ZBUiA9IHZvaWQgMDtcbmNvbnN0IG9zXzEgPSByZXF1aXJlKFwib3NcIik7XG5jb25zdCBmc18xID0gcmVxdWlyZShcImZzXCIpO1xuY29uc3QgeyBhY2Nlc3MsIGFwcGVuZEZpbGUsIHdyaXRlRmlsZSB9ID0gZnNfMS5wcm9taXNlcztcbmV4cG9ydHMuU1VNTUFSWV9FTlZfVkFSID0gJ0dJVEhVQl9TVEVQX1NVTU1BUlknO1xuZXhwb3J0cy5TVU1NQVJZX0RPQ1NfVVJMID0gJ2h0dHBzOi8vZG9jcy5naXRodWIuY29tL2FjdGlvbnMvdXNpbmctd29ya2Zsb3dzL3dvcmtmbG93LWNvbW1hbmRzLWZvci1naXRodWItYWN0aW9ucyNhZGRpbmctYS1qb2Itc3VtbWFyeSc7XG5jbGFzcyBTdW1tYXJ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fYnVmZmVyID0gJyc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBzdW1tYXJ5IGZpbGUgcGF0aCBmcm9tIHRoZSBlbnZpcm9ubWVudCwgcmVqZWN0cyBpZiBlbnYgdmFyIGlzIG5vdCBmb3VuZCBvciBmaWxlIGRvZXMgbm90IGV4aXN0XG4gICAgICogQWxzbyBjaGVja3Mgci93IHBlcm1pc3Npb25zLlxuICAgICAqXG4gICAgICogQHJldHVybnMgc3RlcCBzdW1tYXJ5IGZpbGUgcGF0aFxuICAgICAqL1xuICAgIGZpbGVQYXRoKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2ZpbGVQYXRoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGVQYXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcGF0aEZyb21FbnYgPSBwcm9jZXNzLmVudltleHBvcnRzLlNVTU1BUllfRU5WX1ZBUl07XG4gICAgICAgICAgICBpZiAoIXBhdGhGcm9tRW52KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZmluZCBlbnZpcm9ubWVudCB2YXJpYWJsZSBmb3IgJCR7ZXhwb3J0cy5TVU1NQVJZX0VOVl9WQVJ9LiBDaGVjayBpZiB5b3VyIHJ1bnRpbWUgZW52aXJvbm1lbnQgc3VwcG9ydHMgam9iIHN1bW1hcmllcy5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgeWllbGQgYWNjZXNzKHBhdGhGcm9tRW52LCBmc18xLmNvbnN0YW50cy5SX09LIHwgZnNfMS5jb25zdGFudHMuV19PSyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoX2EpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBhY2Nlc3Mgc3VtbWFyeSBmaWxlOiAnJHtwYXRoRnJvbUVudn0nLiBDaGVjayBpZiB0aGUgZmlsZSBoYXMgY29ycmVjdCByZWFkL3dyaXRlIHBlcm1pc3Npb25zLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZmlsZVBhdGggPSBwYXRoRnJvbUVudjtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9maWxlUGF0aDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyYXBzIGNvbnRlbnQgaW4gYW4gSFRNTCB0YWcsIGFkZGluZyBhbnkgSFRNTCBhdHRyaWJ1dGVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnIEhUTUwgdGFnIHRvIHdyYXBcbiAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IGNvbnRlbnQgY29udGVudCB3aXRoaW4gdGhlIHRhZ1xuICAgICAqIEBwYXJhbSB7W2F0dHJpYnV0ZTogc3RyaW5nXTogc3RyaW5nfSBhdHRycyBrZXktdmFsdWUgbGlzdCBvZiBIVE1MIGF0dHJpYnV0ZXMgdG8gYWRkXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBjb250ZW50IHdyYXBwZWQgaW4gSFRNTCBlbGVtZW50XG4gICAgICovXG4gICAgd3JhcCh0YWcsIGNvbnRlbnQsIGF0dHJzID0ge30pIHtcbiAgICAgICAgY29uc3QgaHRtbEF0dHJzID0gT2JqZWN0LmVudHJpZXMoYXR0cnMpXG4gICAgICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IGAgJHtrZXl9PVwiJHt2YWx1ZX1cImApXG4gICAgICAgICAgICAuam9pbignJyk7XG4gICAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGA8JHt0YWd9JHtodG1sQXR0cnN9PmA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGA8JHt0YWd9JHtodG1sQXR0cnN9PiR7Y29udGVudH08LyR7dGFnfT5gO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgdGV4dCBpbiB0aGUgYnVmZmVyIHRvIHRoZSBzdW1tYXJ5IGJ1ZmZlciBmaWxlIGFuZCBlbXB0aWVzIGJ1ZmZlci4gV2lsbCBhcHBlbmQgYnkgZGVmYXVsdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3VtbWFyeVdyaXRlT3B0aW9uc30gW29wdGlvbnNdIChvcHRpb25hbCkgb3B0aW9ucyBmb3Igd3JpdGUgb3BlcmF0aW9uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTdW1tYXJ5Pn0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHdyaXRlKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJ3cml0ZSA9ICEhKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5vdmVyd3JpdGUpO1xuICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSB5aWVsZCB0aGlzLmZpbGVQYXRoKCk7XG4gICAgICAgICAgICBjb25zdCB3cml0ZUZ1bmMgPSBvdmVyd3JpdGUgPyB3cml0ZUZpbGUgOiBhcHBlbmRGaWxlO1xuICAgICAgICAgICAgeWllbGQgd3JpdGVGdW5jKGZpbGVQYXRoLCB0aGlzLl9idWZmZXIsIHsgZW5jb2Rpbmc6ICd1dGY4JyB9KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtcHR5QnVmZmVyKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIHN1bW1hcnkgYnVmZmVyIGFuZCB3aXBlcyB0aGUgc3VtbWFyeSBmaWxlXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGNsZWFyKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1wdHlCdWZmZXIoKS53cml0ZSh7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3VtbWFyeSBidWZmZXIgYXMgYSBzdHJpbmdcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IHN0cmluZyBvZiBzdW1tYXJ5IGJ1ZmZlclxuICAgICAqL1xuICAgIHN0cmluZ2lmeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2J1ZmZlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHN1bW1hcnkgYnVmZmVyIGlzIGVtcHR5XG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVufSB0cnVlIGlmIHRoZSBidWZmZXIgaXMgZW1wdHlcbiAgICAgKi9cbiAgICBpc0VtcHR5QnVmZmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnVmZmVyLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSBzdW1tYXJ5IGJ1ZmZlciB3aXRob3V0IHdyaXRpbmcgdG8gc3VtbWFyeSBmaWxlXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGVtcHR5QnVmZmVyKCkge1xuICAgICAgICB0aGlzLl9idWZmZXIgPSAnJztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgcmF3IHRleHQgdG8gdGhlIHN1bW1hcnkgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBjb250ZW50IHRvIGFkZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FkZEVPTD1mYWxzZV0gKG9wdGlvbmFsKSBhcHBlbmQgYW4gRU9MIHRvIHRoZSByYXcgdGV4dCAoZGVmYXVsdDogZmFsc2UpXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZFJhdyh0ZXh0LCBhZGRFT0wgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLl9idWZmZXIgKz0gdGV4dDtcbiAgICAgICAgcmV0dXJuIGFkZEVPTCA/IHRoaXMuYWRkRU9MKCkgOiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBvcGVyYXRpbmcgc3lzdGVtLXNwZWNpZmljIGVuZC1vZi1saW5lIG1hcmtlciB0byB0aGUgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZEVPTCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmF3KG9zXzEuRU9MKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBIVE1MIGNvZGVibG9jayB0byB0aGUgc3VtbWFyeSBidWZmZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIGNvbnRlbnQgdG8gcmVuZGVyIHdpdGhpbiBmZW5jZWQgY29kZSBibG9ja1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYW5nIChvcHRpb25hbCkgbGFuZ3VhZ2UgdG8gc3ludGF4IGhpZ2hsaWdodCBjb2RlXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZENvZGVCbG9jayhjb2RlLCBsYW5nKSB7XG4gICAgICAgIGNvbnN0IGF0dHJzID0gT2JqZWN0LmFzc2lnbih7fSwgKGxhbmcgJiYgeyBsYW5nIH0pKTtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMud3JhcCgncHJlJywgdGhpcy53cmFwKCdjb2RlJywgY29kZSksIGF0dHJzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmF3KGVsZW1lbnQpLmFkZEVPTCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIEhUTUwgbGlzdCB0byB0aGUgc3VtbWFyeSBidWZmZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IGl0ZW1zIGxpc3Qgb2YgaXRlbXMgdG8gcmVuZGVyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3JkZXJlZD1mYWxzZV0gKG9wdGlvbmFsKSBpZiB0aGUgcmVuZGVyZWQgbGlzdCBzaG91bGQgYmUgb3JkZXJlZCBvciBub3QgKGRlZmF1bHQ6IGZhbHNlKVxuICAgICAqXG4gICAgICogQHJldHVybnMge1N1bW1hcnl9IHN1bW1hcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGRMaXN0KGl0ZW1zLCBvcmRlcmVkID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgdGFnID0gb3JkZXJlZCA/ICdvbCcgOiAndWwnO1xuICAgICAgICBjb25zdCBsaXN0SXRlbXMgPSBpdGVtcy5tYXAoaXRlbSA9PiB0aGlzLndyYXAoJ2xpJywgaXRlbSkpLmpvaW4oJycpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy53cmFwKHRhZywgbGlzdEl0ZW1zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmF3KGVsZW1lbnQpLmFkZEVPTCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIEhUTUwgdGFibGUgdG8gdGhlIHN1bW1hcnkgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N1bW1hcnlUYWJsZUNlbGxbXX0gcm93cyB0YWJsZSByb3dzXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZFRhYmxlKHJvd3MpIHtcbiAgICAgICAgY29uc3QgdGFibGVCb2R5ID0gcm93c1xuICAgICAgICAgICAgLm1hcChyb3cgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2VsbHMgPSByb3dcbiAgICAgICAgICAgICAgICAubWFwKGNlbGwgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2VsbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcCgndGQnLCBjZWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgeyBoZWFkZXIsIGRhdGEsIGNvbHNwYW4sIHJvd3NwYW4gfSA9IGNlbGw7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFnID0gaGVhZGVyID8gJ3RoJyA6ICd0ZCc7XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0cnMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIChjb2xzcGFuICYmIHsgY29sc3BhbiB9KSksIChyb3dzcGFuICYmIHsgcm93c3BhbiB9KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcCh0YWcsIGRhdGEsIGF0dHJzKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmpvaW4oJycpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcCgndHInLCBjZWxscyk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbignJyk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLndyYXAoJ3RhYmxlJywgdGFibGVCb2R5KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmF3KGVsZW1lbnQpLmFkZEVPTCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY29sbGFwc2FibGUgSFRNTCBkZXRhaWxzIGVsZW1lbnQgdG8gdGhlIHN1bW1hcnkgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgdGV4dCBmb3IgdGhlIGNsb3NlZCBzdGF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IGNvbGxhcHNhYmxlIGNvbnRlbnRcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkRGV0YWlscyhsYWJlbCwgY29udGVudCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy53cmFwKCdkZXRhaWxzJywgdGhpcy53cmFwKCdzdW1tYXJ5JywgbGFiZWwpICsgY29udGVudCk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFJhdyhlbGVtZW50KS5hZGRFT0woKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBIVE1MIGltYWdlIHRhZyB0byB0aGUgc3VtbWFyeSBidWZmZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzcmMgcGF0aCB0byB0aGUgaW1hZ2UgeW91IHRvIGVtYmVkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFsdCB0ZXh0IGRlc2NyaXB0aW9uIG9mIHRoZSBpbWFnZVxuICAgICAqIEBwYXJhbSB7U3VtbWFyeUltYWdlT3B0aW9uc30gb3B0aW9ucyAob3B0aW9uYWwpIGFkZGl0aW9uIGltYWdlIGF0dHJpYnV0ZXNcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkSW1hZ2Uoc3JjLCBhbHQsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBjb25zdCBhdHRycyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgKHdpZHRoICYmIHsgd2lkdGggfSkpLCAoaGVpZ2h0ICYmIHsgaGVpZ2h0IH0pKTtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMud3JhcCgnaW1nJywgbnVsbCwgT2JqZWN0LmFzc2lnbih7IHNyYywgYWx0IH0sIGF0dHJzKSk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFJhdyhlbGVtZW50KS5hZGRFT0woKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBIVE1MIHNlY3Rpb24gaGVhZGluZyBlbGVtZW50XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBoZWFkaW5nIHRleHRcbiAgICAgKiBAcGFyYW0ge251bWJlciB8IHN0cmluZ30gW2xldmVsPTFdIChvcHRpb25hbCkgdGhlIGhlYWRpbmcgbGV2ZWwsIGRlZmF1bHQ6IDFcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkSGVhZGluZyh0ZXh0LCBsZXZlbCkge1xuICAgICAgICBjb25zdCB0YWcgPSBgaCR7bGV2ZWx9YDtcbiAgICAgICAgY29uc3QgYWxsb3dlZFRhZyA9IFsnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnaDUnLCAnaDYnXS5pbmNsdWRlcyh0YWcpXG4gICAgICAgICAgICA/IHRhZ1xuICAgICAgICAgICAgOiAnaDEnO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy53cmFwKGFsbG93ZWRUYWcsIHRleHQpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSYXcoZWxlbWVudCkuYWRkRU9MKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gSFRNTCB0aGVtYXRpYyBicmVhayAoPGhyPikgdG8gdGhlIHN1bW1hcnkgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZFNlcGFyYXRvcigpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMud3JhcCgnaHInLCBudWxsKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmF3KGVsZW1lbnQpLmFkZEVPTCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIEhUTUwgbGluZSBicmVhayAoPGJyPikgdG8gdGhlIHN1bW1hcnkgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZEJyZWFrKCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy53cmFwKCdicicsIG51bGwpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSYXcoZWxlbWVudCkuYWRkRU9MKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gSFRNTCBibG9ja3F1b3RlIHRvIHRoZSBzdW1tYXJ5IGJ1ZmZlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgcXVvdGUgdGV4dFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjaXRlIChvcHRpb25hbCkgY2l0YXRpb24gdXJsXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZFF1b3RlKHRleHQsIGNpdGUpIHtcbiAgICAgICAgY29uc3QgYXR0cnMgPSBPYmplY3QuYXNzaWduKHt9LCAoY2l0ZSAmJiB7IGNpdGUgfSkpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy53cmFwKCdibG9ja3F1b3RlJywgdGV4dCwgYXR0cnMpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSYXcoZWxlbWVudCkuYWRkRU9MKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gSFRNTCBhbmNob3IgdGFnIHRvIHRoZSBzdW1tYXJ5IGJ1ZmZlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgbGluayB0ZXh0L2NvbnRlbnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaHJlZiBoeXBlcmxpbmtcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkTGluayh0ZXh0LCBocmVmKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLndyYXAoJ2EnLCB0ZXh0LCB7IGhyZWYgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFJhdyhlbGVtZW50KS5hZGRFT0woKTtcbiAgICB9XG59XG5jb25zdCBfc3VtbWFyeSA9IG5ldyBTdW1tYXJ5KCk7XG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBgY29yZS5zdW1tYXJ5YFxuICovXG5leHBvcnRzLm1hcmtkb3duU3VtbWFyeSA9IF9zdW1tYXJ5O1xuZXhwb3J0cy5zdW1tYXJ5ID0gX3N1bW1hcnk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdW1tYXJ5LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBvd25LZXlzID0gZnVuY3Rpb24obykge1xuICAgICAgICBvd25LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgIHZhciBhciA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgayBpbiBvKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIGspKSBhclthci5sZW5ndGhdID0gaztcbiAgICAgICAgICAgIHJldHVybiBhcjtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG93bktleXMobyk7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1vZCkge1xuICAgICAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayA9IG93bktleXMobW9kKSwgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSBpZiAoa1tpXSAhPT0gXCJkZWZhdWx0XCIpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwga1tpXSk7XG4gICAgICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbn0pKCk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnRvUG9zaXhQYXRoID0gdG9Qb3NpeFBhdGg7XG5leHBvcnRzLnRvV2luMzJQYXRoID0gdG9XaW4zMlBhdGg7XG5leHBvcnRzLnRvUGxhdGZvcm1QYXRoID0gdG9QbGF0Zm9ybVBhdGg7XG5jb25zdCBwYXRoID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJwYXRoXCIpKTtcbi8qKlxuICogdG9Qb3NpeFBhdGggY29udmVydHMgdGhlIGdpdmVuIHBhdGggdG8gdGhlIHBvc2l4IGZvcm0uIE9uIFdpbmRvd3MsIFxcXFwgd2lsbCBiZVxuICogcmVwbGFjZWQgd2l0aCAvLlxuICpcbiAqIEBwYXJhbSBwdGguIFBhdGggdG8gdHJhbnNmb3JtLlxuICogQHJldHVybiBzdHJpbmcgUG9zaXggcGF0aC5cbiAqL1xuZnVuY3Rpb24gdG9Qb3NpeFBhdGgocHRoKSB7XG4gICAgcmV0dXJuIHB0aC5yZXBsYWNlKC9bXFxcXF0vZywgJy8nKTtcbn1cbi8qKlxuICogdG9XaW4zMlBhdGggY29udmVydHMgdGhlIGdpdmVuIHBhdGggdG8gdGhlIHdpbjMyIGZvcm0uIE9uIExpbnV4LCAvIHdpbGwgYmVcbiAqIHJlcGxhY2VkIHdpdGggXFxcXC5cbiAqXG4gKiBAcGFyYW0gcHRoLiBQYXRoIHRvIHRyYW5zZm9ybS5cbiAqIEByZXR1cm4gc3RyaW5nIFdpbjMyIHBhdGguXG4gKi9cbmZ1bmN0aW9uIHRvV2luMzJQYXRoKHB0aCkge1xuICAgIHJldHVybiBwdGgucmVwbGFjZSgvWy9dL2csICdcXFxcJyk7XG59XG4vKipcbiAqIHRvUGxhdGZvcm1QYXRoIGNvbnZlcnRzIHRoZSBnaXZlbiBwYXRoIHRvIGEgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aC4gSXQgZG9lc1xuICogdGhpcyBieSByZXBsYWNpbmcgaW5zdGFuY2VzIG9mIC8gYW5kIFxcIHdpdGggdGhlIHBsYXRmb3JtLXNwZWNpZmljIHBhdGhcbiAqIHNlcGFyYXRvci5cbiAqXG4gKiBAcGFyYW0gcHRoIFRoZSBwYXRoIHRvIHBsYXRmb3JtaXplLlxuICogQHJldHVybiBzdHJpbmcgVGhlIHBsYXRmb3JtLXNwZWNpZmljIHBhdGguXG4gKi9cbmZ1bmN0aW9uIHRvUGxhdGZvcm1QYXRoKHB0aCkge1xuICAgIHJldHVybiBwdGgucmVwbGFjZSgvWy9cXFxcXS9nLCBwYXRoLnNlcCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXRoLXV0aWxzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBvd25LZXlzID0gZnVuY3Rpb24obykge1xuICAgICAgICBvd25LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgIHZhciBhciA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgayBpbiBvKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIGspKSBhclthci5sZW5ndGhdID0gaztcbiAgICAgICAgICAgIHJldHVybiBhcjtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG93bktleXMobyk7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1vZCkge1xuICAgICAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayA9IG93bktleXMobW9kKSwgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSBpZiAoa1tpXSAhPT0gXCJkZWZhdWx0XCIpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwga1tpXSk7XG4gICAgICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbn0pKCk7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfYTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUkVBRE9OTFkgPSBleHBvcnRzLlVWX0ZTX09fRVhMT0NLID0gZXhwb3J0cy5JU19XSU5ET1dTID0gZXhwb3J0cy51bmxpbmsgPSBleHBvcnRzLnN5bWxpbmsgPSBleHBvcnRzLnN0YXQgPSBleHBvcnRzLnJtZGlyID0gZXhwb3J0cy5ybSA9IGV4cG9ydHMucmVuYW1lID0gZXhwb3J0cy5yZWFkZGlyID0gZXhwb3J0cy5vcGVuID0gZXhwb3J0cy5ta2RpciA9IGV4cG9ydHMubHN0YXQgPSBleHBvcnRzLmNvcHlGaWxlID0gZXhwb3J0cy5jaG1vZCA9IHZvaWQgMDtcbmV4cG9ydHMucmVhZGxpbmsgPSByZWFkbGluaztcbmV4cG9ydHMuZXhpc3RzID0gZXhpc3RzO1xuZXhwb3J0cy5pc0RpcmVjdG9yeSA9IGlzRGlyZWN0b3J5O1xuZXhwb3J0cy5pc1Jvb3RlZCA9IGlzUm9vdGVkO1xuZXhwb3J0cy50cnlHZXRFeGVjdXRhYmxlUGF0aCA9IHRyeUdldEV4ZWN1dGFibGVQYXRoO1xuZXhwb3J0cy5nZXRDbWRQYXRoID0gZ2V0Q21kUGF0aDtcbmNvbnN0IGZzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJmc1wiKSk7XG5jb25zdCBwYXRoID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJwYXRoXCIpKTtcbl9hID0gZnMucHJvbWlzZXNcbi8vIGV4cG9ydCBjb25zdCB7b3Blbn0gPSAnZnMnXG4sIGV4cG9ydHMuY2htb2QgPSBfYS5jaG1vZCwgZXhwb3J0cy5jb3B5RmlsZSA9IF9hLmNvcHlGaWxlLCBleHBvcnRzLmxzdGF0ID0gX2EubHN0YXQsIGV4cG9ydHMubWtkaXIgPSBfYS5ta2RpciwgZXhwb3J0cy5vcGVuID0gX2Eub3BlbiwgZXhwb3J0cy5yZWFkZGlyID0gX2EucmVhZGRpciwgZXhwb3J0cy5yZW5hbWUgPSBfYS5yZW5hbWUsIGV4cG9ydHMucm0gPSBfYS5ybSwgZXhwb3J0cy5ybWRpciA9IF9hLnJtZGlyLCBleHBvcnRzLnN0YXQgPSBfYS5zdGF0LCBleHBvcnRzLnN5bWxpbmsgPSBfYS5zeW1saW5rLCBleHBvcnRzLnVubGluayA9IF9hLnVubGluaztcbi8vIGV4cG9ydCBjb25zdCB7b3Blbn0gPSAnZnMnXG5leHBvcnRzLklTX1dJTkRPV1MgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInO1xuLyoqXG4gKiBDdXN0b20gaW1wbGVtZW50YXRpb24gb2YgcmVhZGxpbmsgdG8gZW5zdXJlIFdpbmRvd3MganVuY3Rpb25zXG4gKiBtYWludGFpbiB0cmFpbGluZyBiYWNrc2xhc2ggZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBOb2RlLmpzIDwgMjRcbiAqXG4gKiBJbiBOb2RlLmpzIDIwLCBXaW5kb3dzIGp1bmN0aW9ucyAoZGlyZWN0b3J5IHN5bWxpbmtzKSBhbHdheXMgcmV0dXJuZWQgcGF0aHNcbiAqIHdpdGggdHJhaWxpbmcgYmFja3NsYXNoZXMuIE5vZGUuanMgMjQgcmVtb3ZlZCB0aGlzIGJlaGF2aW9yLCB3aGljaCBicmVha3NcbiAqIGNvZGUgdGhhdCByZWxpZWQgb24gdGhpcyBmb3JtYXQgZm9yIHBhdGggb3BlcmF0aW9ucy5cbiAqXG4gKiBUaGlzIGltcGxlbWVudGF0aW9uIHJlc3RvcmVzIHRoZSBOb2RlIDIwIGJlaGF2aW9yIGJ5IGFkZGluZyBhIHRyYWlsaW5nXG4gKiBiYWNrc2xhc2ggdG8gYWxsIGp1bmN0aW9uIHJlc3VsdHMgb24gV2luZG93cy5cbiAqL1xuZnVuY3Rpb24gcmVhZGxpbmsoZnNQYXRoKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgZnMucHJvbWlzZXMucmVhZGxpbmsoZnNQYXRoKTtcbiAgICAgICAgLy8gT24gV2luZG93cywgcmVzdG9yZSBOb2RlIDIwIGJlaGF2aW9yOiBhZGQgdHJhaWxpbmcgYmFja3NsYXNoIHRvIGFsbCByZXN1bHRzXG4gICAgICAgIC8vIHNpbmNlIGp1bmN0aW9ucyBvbiBXaW5kb3dzIGFyZSBhbHdheXMgZGlyZWN0b3J5IGxpbmtzXG4gICAgICAgIGlmIChleHBvcnRzLklTX1dJTkRPV1MgJiYgIXJlc3VsdC5lbmRzV2l0aCgnXFxcXCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7cmVzdWx0fVxcXFxgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG59XG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvZDAxNTNhZWUzNjc0MjJkMDg1ODEwNWFiZWMxODZkYTRkZmYwYTBjNS9kZXBzL3V2L2luY2x1ZGUvdXYvd2luLmgjTDY5MVxuZXhwb3J0cy5VVl9GU19PX0VYTE9DSyA9IDB4MTAwMDAwMDA7XG5leHBvcnRzLlJFQURPTkxZID0gZnMuY29uc3RhbnRzLk9fUkRPTkxZO1xuZnVuY3Rpb24gZXhpc3RzKGZzUGF0aCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB5aWVsZCAoMCwgZXhwb3J0cy5zdGF0KShmc1BhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBpc0RpcmVjdG9yeShmc1BhdGhfMSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgYXJndW1lbnRzLCB2b2lkIDAsIGZ1bmN0aW9uKiAoZnNQYXRoLCB1c2VTdGF0ID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSB1c2VTdGF0ID8geWllbGQgKDAsIGV4cG9ydHMuc3RhdCkoZnNQYXRoKSA6IHlpZWxkICgwLCBleHBvcnRzLmxzdGF0KShmc1BhdGgpO1xuICAgICAgICByZXR1cm4gc3RhdHMuaXNEaXJlY3RvcnkoKTtcbiAgICB9KTtcbn1cbi8qKlxuICogT24gT1NYL0xpbnV4LCB0cnVlIGlmIHBhdGggc3RhcnRzIHdpdGggJy8nLiBPbiBXaW5kb3dzLCB0cnVlIGZvciBwYXRocyBsaWtlOlxuICogXFwsIFxcaGVsbG8sIFxcXFxoZWxsb1xcc2hhcmUsIEM6LCBhbmQgQzpcXGhlbGxvIChhbmQgY29ycmVzcG9uZGluZyBhbHRlcm5hdGUgc2VwYXJhdG9yIGNhc2VzKS5cbiAqL1xuZnVuY3Rpb24gaXNSb290ZWQocCkge1xuICAgIHAgPSBub3JtYWxpemVTZXBhcmF0b3JzKHApO1xuICAgIGlmICghcCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lzUm9vdGVkKCkgcGFyYW1ldGVyIFwicFwiIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgIH1cbiAgICBpZiAoZXhwb3J0cy5JU19XSU5ET1dTKSB7XG4gICAgICAgIHJldHVybiAocC5zdGFydHNXaXRoKCdcXFxcJykgfHwgL15bQS1aXTovaS50ZXN0KHApIC8vIGUuZy4gXFwgb3IgXFxoZWxsbyBvciBcXFxcaGVsbG9cbiAgICAgICAgKTsgLy8gZS5nLiBDOiBvciBDOlxcaGVsbG9cbiAgICB9XG4gICAgcmV0dXJuIHAuc3RhcnRzV2l0aCgnLycpO1xufVxuLyoqXG4gKiBCZXN0IGVmZm9ydCBhdHRlbXB0IHRvIGRldGVybWluZSB3aGV0aGVyIGEgZmlsZSBleGlzdHMgYW5kIGlzIGV4ZWN1dGFibGUuXG4gKiBAcGFyYW0gZmlsZVBhdGggICAgZmlsZSBwYXRoIHRvIGNoZWNrXG4gKiBAcGFyYW0gZXh0ZW5zaW9ucyAgYWRkaXRpb25hbCBmaWxlIGV4dGVuc2lvbnMgdG8gdHJ5XG4gKiBAcmV0dXJuIGlmIGZpbGUgZXhpc3RzIGFuZCBpcyBleGVjdXRhYmxlLCByZXR1cm5zIHRoZSBmaWxlIHBhdGguIG90aGVyd2lzZSBlbXB0eSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIHRyeUdldEV4ZWN1dGFibGVQYXRoKGZpbGVQYXRoLCBleHRlbnNpb25zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHN0YXRzID0gdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gdGVzdCBmaWxlIGV4aXN0c1xuICAgICAgICAgICAgc3RhdHMgPSB5aWVsZCAoMCwgZXhwb3J0cy5zdGF0KShmaWxlUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGVyci5jb2RlICE9PSAnRU5PRU5UJykge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFVuZXhwZWN0ZWQgZXJyb3IgYXR0ZW1wdGluZyB0byBkZXRlcm1pbmUgaWYgZXhlY3V0YWJsZSBmaWxlIGV4aXN0cyAnJHtmaWxlUGF0aH0nOiAke2Vycn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdHMgJiYgc3RhdHMuaXNGaWxlKCkpIHtcbiAgICAgICAgICAgIGlmIChleHBvcnRzLklTX1dJTkRPV1MpIHtcbiAgICAgICAgICAgICAgICAvLyBvbiBXaW5kb3dzLCB0ZXN0IGZvciB2YWxpZCBleHRlbnNpb25cbiAgICAgICAgICAgICAgICBjb25zdCB1cHBlckV4dCA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9ucy5zb21lKHZhbGlkRXh0ID0+IHZhbGlkRXh0LnRvVXBwZXJDYXNlKCkgPT09IHVwcGVyRXh0KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZVBhdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzVW5peEV4ZWN1dGFibGUoc3RhdHMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlUGF0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdHJ5IGVhY2ggZXh0ZW5zaW9uXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsRmlsZVBhdGggPSBmaWxlUGF0aDtcbiAgICAgICAgZm9yIChjb25zdCBleHRlbnNpb24gb2YgZXh0ZW5zaW9ucykge1xuICAgICAgICAgICAgZmlsZVBhdGggPSBvcmlnaW5hbEZpbGVQYXRoICsgZXh0ZW5zaW9uO1xuICAgICAgICAgICAgc3RhdHMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHN0YXRzID0geWllbGQgKDAsIGV4cG9ydHMuc3RhdCkoZmlsZVBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChlcnIuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFVuZXhwZWN0ZWQgZXJyb3IgYXR0ZW1wdGluZyB0byBkZXRlcm1pbmUgaWYgZXhlY3V0YWJsZSBmaWxlIGV4aXN0cyAnJHtmaWxlUGF0aH0nOiAke2Vycn1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhdHMgJiYgc3RhdHMuaXNGaWxlKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXhwb3J0cy5JU19XSU5ET1dTKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHByZXNlcnZlIHRoZSBjYXNlIG9mIHRoZSBhY3R1YWwgZmlsZSAoc2luY2UgYW4gZXh0ZW5zaW9uIHdhcyBhcHBlbmRlZClcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpcmVjdG9yeSA9IHBhdGguZGlybmFtZShmaWxlUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cHBlck5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhY3R1YWxOYW1lIG9mIHlpZWxkICgwLCBleHBvcnRzLnJlYWRkaXIpKGRpcmVjdG9yeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBwZXJOYW1lID09PSBhY3R1YWxOYW1lLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyZWN0b3J5LCBhY3R1YWxOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgVW5leHBlY3RlZCBlcnJvciBhdHRlbXB0aW5nIHRvIGRldGVybWluZSB0aGUgYWN0dWFsIGNhc2Ugb2YgdGhlIGZpbGUgJyR7ZmlsZVBhdGh9JzogJHtlcnJ9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVQYXRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVW5peEV4ZWN1dGFibGUoc3RhdHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZVBhdGg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplU2VwYXJhdG9ycyhwKSB7XG4gICAgcCA9IHAgfHwgJyc7XG4gICAgaWYgKGV4cG9ydHMuSVNfV0lORE9XUykge1xuICAgICAgICAvLyBjb252ZXJ0IHNsYXNoZXMgb24gV2luZG93c1xuICAgICAgICBwID0gcC5yZXBsYWNlKC9cXC8vZywgJ1xcXFwnKTtcbiAgICAgICAgLy8gcmVtb3ZlIHJlZHVuZGFudCBzbGFzaGVzXG4gICAgICAgIHJldHVybiBwLnJlcGxhY2UoL1xcXFxcXFxcKy9nLCAnXFxcXCcpO1xuICAgIH1cbiAgICAvLyByZW1vdmUgcmVkdW5kYW50IHNsYXNoZXNcbiAgICByZXR1cm4gcC5yZXBsYWNlKC9cXC9cXC8rL2csICcvJyk7XG59XG4vLyBvbiBNYWMvTGludXgsIHRlc3QgdGhlIGV4ZWN1dGUgYml0XG4vLyAgICAgUiAgIFcgIFggIFIgIFcgWCBSIFcgWFxuLy8gICAyNTYgMTI4IDY0IDMyIDE2IDggNCAyIDFcbmZ1bmN0aW9uIGlzVW5peEV4ZWN1dGFibGUoc3RhdHMpIHtcbiAgICByZXR1cm4gKChzdGF0cy5tb2RlICYgMSkgPiAwIHx8XG4gICAgICAgICgoc3RhdHMubW9kZSAmIDgpID4gMCAmJlxuICAgICAgICAgICAgcHJvY2Vzcy5nZXRnaWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgc3RhdHMuZ2lkID09PSBwcm9jZXNzLmdldGdpZCgpKSB8fFxuICAgICAgICAoKHN0YXRzLm1vZGUgJiA2NCkgPiAwICYmXG4gICAgICAgICAgICBwcm9jZXNzLmdldHVpZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBzdGF0cy51aWQgPT09IHByb2Nlc3MuZ2V0dWlkKCkpKTtcbn1cbi8vIEdldCB0aGUgcGF0aCBvZiBjbWQuZXhlIGluIHdpbmRvd3NcbmZ1bmN0aW9uIGdldENtZFBhdGgoKSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiAoX2EgPSBwcm9jZXNzLmVudlsnQ09NU1BFQyddKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBgY21kLmV4ZWA7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pby11dGlsLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBvd25LZXlzID0gZnVuY3Rpb24obykge1xuICAgICAgICBvd25LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgIHZhciBhciA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgayBpbiBvKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIGspKSBhclthci5sZW5ndGhdID0gaztcbiAgICAgICAgICAgIHJldHVybiBhcjtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG93bktleXMobyk7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1vZCkge1xuICAgICAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayA9IG93bktleXMobW9kKSwgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSBpZiAoa1tpXSAhPT0gXCJkZWZhdWx0XCIpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwga1tpXSk7XG4gICAgICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbn0pKCk7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3AgPSBjcDtcbmV4cG9ydHMubXYgPSBtdjtcbmV4cG9ydHMucm1SRiA9IHJtUkY7XG5leHBvcnRzLm1rZGlyUCA9IG1rZGlyUDtcbmV4cG9ydHMud2hpY2ggPSB3aGljaDtcbmV4cG9ydHMuZmluZEluUGF0aCA9IGZpbmRJblBhdGg7XG5jb25zdCBhc3NlcnRfMSA9IHJlcXVpcmUoXCJhc3NlcnRcIik7XG5jb25zdCBwYXRoID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJwYXRoXCIpKTtcbmNvbnN0IGlvVXRpbCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9pby11dGlsXCIpKTtcbi8qKlxuICogQ29waWVzIGEgZmlsZSBvciBmb2xkZXIuXG4gKiBCYXNlZCBvZmYgb2Ygc2hlbGxqcyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9zaGVsbGpzL3NoZWxsanMvYmxvYi85MjM3ZjY2YzUyZTVkYWE0MDQ1OGY5NGY5NTY1ZTE4ZTgxMzJmNWE2L3NyYy9jcC5qc1xuICpcbiAqIEBwYXJhbSAgICAgc291cmNlICAgIHNvdXJjZSBwYXRoXG4gKiBAcGFyYW0gICAgIGRlc3QgICAgICBkZXN0aW5hdGlvbiBwYXRoXG4gKiBAcGFyYW0gICAgIG9wdGlvbnMgICBvcHRpb25hbC4gU2VlIENvcHlPcHRpb25zLlxuICovXG5mdW5jdGlvbiBjcChzb3VyY2VfMSwgZGVzdF8xKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCBhcmd1bWVudHMsIHZvaWQgMCwgZnVuY3Rpb24qIChzb3VyY2UsIGRlc3QsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IGZvcmNlLCByZWN1cnNpdmUsIGNvcHlTb3VyY2VEaXJlY3RvcnkgfSA9IHJlYWRDb3B5T3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZGVzdFN0YXQgPSAoeWllbGQgaW9VdGlsLmV4aXN0cyhkZXN0KSkgPyB5aWVsZCBpb1V0aWwuc3RhdChkZXN0KSA6IG51bGw7XG4gICAgICAgIC8vIERlc3QgaXMgYW4gZXhpc3RpbmcgZmlsZSwgYnV0IG5vdCBmb3JjaW5nXG4gICAgICAgIGlmIChkZXN0U3RhdCAmJiBkZXN0U3RhdC5pc0ZpbGUoKSAmJiAhZm9yY2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBkZXN0IGlzIGFuIGV4aXN0aW5nIGRpcmVjdG9yeSwgc2hvdWxkIGNvcHkgaW5zaWRlLlxuICAgICAgICBjb25zdCBuZXdEZXN0ID0gZGVzdFN0YXQgJiYgZGVzdFN0YXQuaXNEaXJlY3RvcnkoKSAmJiBjb3B5U291cmNlRGlyZWN0b3J5XG4gICAgICAgICAgICA/IHBhdGguam9pbihkZXN0LCBwYXRoLmJhc2VuYW1lKHNvdXJjZSkpXG4gICAgICAgICAgICA6IGRlc3Q7XG4gICAgICAgIGlmICghKHlpZWxkIGlvVXRpbC5leGlzdHMoc291cmNlKSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeTogJHtzb3VyY2V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlU3RhdCA9IHlpZWxkIGlvVXRpbC5zdGF0KHNvdXJjZSk7XG4gICAgICAgIGlmIChzb3VyY2VTdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgIGlmICghcmVjdXJzaXZlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY29weS4gJHtzb3VyY2V9IGlzIGEgZGlyZWN0b3J5LCBidXQgdHJpZWQgdG8gY29weSB3aXRob3V0IHJlY3Vyc2l2ZSBmbGFnLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgeWllbGQgY3BEaXJSZWN1cnNpdmUoc291cmNlLCBuZXdEZXN0LCAwLCBmb3JjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAocGF0aC5yZWxhdGl2ZShzb3VyY2UsIG5ld0Rlc3QpID09PSAnJykge1xuICAgICAgICAgICAgICAgIC8vIGEgZmlsZSBjYW5ub3QgYmUgY29waWVkIHRvIGl0c2VsZlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7bmV3RGVzdH0nIGFuZCAnJHtzb3VyY2V9JyBhcmUgdGhlIHNhbWUgZmlsZWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeWllbGQgY29weUZpbGUoc291cmNlLCBuZXdEZXN0LCBmb3JjZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8qKlxuICogTW92ZXMgYSBwYXRoLlxuICpcbiAqIEBwYXJhbSAgICAgc291cmNlICAgIHNvdXJjZSBwYXRoXG4gKiBAcGFyYW0gICAgIGRlc3QgICAgICBkZXN0aW5hdGlvbiBwYXRoXG4gKiBAcGFyYW0gICAgIG9wdGlvbnMgICBvcHRpb25hbC4gU2VlIE1vdmVPcHRpb25zLlxuICovXG5mdW5jdGlvbiBtdihzb3VyY2VfMSwgZGVzdF8xKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCBhcmd1bWVudHMsIHZvaWQgMCwgZnVuY3Rpb24qIChzb3VyY2UsIGRlc3QsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoeWllbGQgaW9VdGlsLmV4aXN0cyhkZXN0KSkge1xuICAgICAgICAgICAgbGV0IGRlc3RFeGlzdHMgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHlpZWxkIGlvVXRpbC5pc0RpcmVjdG9yeShkZXN0KSkge1xuICAgICAgICAgICAgICAgIC8vIElmIGRlc3QgaXMgZGlyZWN0b3J5IGNvcHkgc3JjIGludG8gZGVzdFxuICAgICAgICAgICAgICAgIGRlc3QgPSBwYXRoLmpvaW4oZGVzdCwgcGF0aC5iYXNlbmFtZShzb3VyY2UpKTtcbiAgICAgICAgICAgICAgICBkZXN0RXhpc3RzID0geWllbGQgaW9VdGlsLmV4aXN0cyhkZXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkZXN0RXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZm9yY2UgPT0gbnVsbCB8fCBvcHRpb25zLmZvcmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHJtUkYoZGVzdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Rlc3RpbmF0aW9uIGFscmVhZHkgZXhpc3RzJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHlpZWxkIG1rZGlyUChwYXRoLmRpcm5hbWUoZGVzdCkpO1xuICAgICAgICB5aWVsZCBpb1V0aWwucmVuYW1lKHNvdXJjZSwgZGVzdCk7XG4gICAgfSk7XG59XG4vKipcbiAqIFJlbW92ZSBhIHBhdGggcmVjdXJzaXZlbHkgd2l0aCBmb3JjZVxuICpcbiAqIEBwYXJhbSBpbnB1dFBhdGggcGF0aCB0byByZW1vdmVcbiAqL1xuZnVuY3Rpb24gcm1SRihpbnB1dFBhdGgpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBpZiAoaW9VdGlsLklTX1dJTkRPV1MpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGZvciBpbnZhbGlkIGNoYXJhY3RlcnNcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3dpbmRvd3Mvd2luMzIvZmlsZWlvL25hbWluZy1hLWZpbGVcbiAgICAgICAgICAgIGlmICgvWypcIjw+fF0vLnRlc3QoaW5wdXRQYXRoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmlsZSBwYXRoIG11c3Qgbm90IGNvbnRhaW4gYCpgLCBgXCJgLCBgPGAsIGA+YCBvciBgfGAgb24gV2luZG93cycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBub3RlIGlmIHBhdGggZG9lcyBub3QgZXhpc3QsIGVycm9yIGlzIHNpbGVudFxuICAgICAgICAgICAgeWllbGQgaW9VdGlsLnJtKGlucHV0UGF0aCwge1xuICAgICAgICAgICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgICAgICAgICAgIG1heFJldHJpZXM6IDMsXG4gICAgICAgICAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHJldHJ5RGVsYXk6IDMwMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIHdhcyB1bmFibGUgdG8gYmUgcmVtb3ZlZCAke2Vycn1gKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuLyoqXG4gKiBNYWtlIGEgZGlyZWN0b3J5LiAgQ3JlYXRlcyB0aGUgZnVsbCBwYXRoIHdpdGggZm9sZGVycyBpbiBiZXR3ZWVuXG4gKiBXaWxsIHRocm93IGlmIGl0IGZhaWxzXG4gKlxuICogQHBhcmFtICAgZnNQYXRoICAgICAgICBwYXRoIHRvIGNyZWF0ZVxuICogQHJldHVybnMgUHJvbWlzZTx2b2lkPlxuICovXG5mdW5jdGlvbiBta2RpclAoZnNQYXRoKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgKDAsIGFzc2VydF8xLm9rKShmc1BhdGgsICdhIHBhdGggYXJndW1lbnQgbXVzdCBiZSBwcm92aWRlZCcpO1xuICAgICAgICB5aWVsZCBpb1V0aWwubWtkaXIoZnNQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9KTtcbn1cbi8qKlxuICogUmV0dXJucyBwYXRoIG9mIGEgdG9vbCBoYWQgdGhlIHRvb2wgYWN0dWFsbHkgYmVlbiBpbnZva2VkLiAgUmVzb2x2ZXMgdmlhIHBhdGhzLlxuICogSWYgeW91IGNoZWNrIGFuZCB0aGUgdG9vbCBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCB0aHJvdy5cbiAqXG4gKiBAcGFyYW0gICAgIHRvb2wgICAgICAgICAgICAgIG5hbWUgb2YgdGhlIHRvb2xcbiAqIEBwYXJhbSAgICAgY2hlY2sgICAgICAgICAgICAgd2hldGhlciB0byBjaGVjayBpZiB0b29sIGV4aXN0c1xuICogQHJldHVybnMgICBQcm9taXNlPHN0cmluZz4gICBwYXRoIHRvIHRvb2xcbiAqL1xuZnVuY3Rpb24gd2hpY2godG9vbCwgY2hlY2spIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBpZiAoIXRvb2wpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInBhcmFtZXRlciAndG9vbCcgaXMgcmVxdWlyZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVjdXJzaXZlIHdoZW4gY2hlY2s9dHJ1ZVxuICAgICAgICBpZiAoY2hlY2spIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHdoaWNoKHRvb2wsIGZhbHNlKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGlvVXRpbC5JU19XSU5ET1dTKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvY2F0ZSBleGVjdXRhYmxlIGZpbGU6ICR7dG9vbH0uIFBsZWFzZSB2ZXJpZnkgZWl0aGVyIHRoZSBmaWxlIHBhdGggZXhpc3RzIG9yIHRoZSBmaWxlIGNhbiBiZSBmb3VuZCB3aXRoaW4gYSBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5IHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLiBBbHNvIHZlcmlmeSB0aGUgZmlsZSBoYXMgYSB2YWxpZCBleHRlbnNpb24gZm9yIGFuIGV4ZWN1dGFibGUgZmlsZS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvY2F0ZSBleGVjdXRhYmxlIGZpbGU6ICR7dG9vbH0uIFBsZWFzZSB2ZXJpZnkgZWl0aGVyIHRoZSBmaWxlIHBhdGggZXhpc3RzIG9yIHRoZSBmaWxlIGNhbiBiZSBmb3VuZCB3aXRoaW4gYSBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5IHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLiBBbHNvIGNoZWNrIHRoZSBmaWxlIG1vZGUgdG8gdmVyaWZ5IHRoZSBmaWxlIGlzIGV4ZWN1dGFibGUuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXRjaGVzID0geWllbGQgZmluZEluUGF0aCh0b29sKTtcbiAgICAgICAgaWYgKG1hdGNoZXMgJiYgbWF0Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlc1swXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfSk7XG59XG4vKipcbiAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgZ2l2ZW4gdG9vbCBvbiB0aGUgc3lzdGVtIHBhdGguXG4gKlxuICogQHJldHVybnMgICBQcm9taXNlPHN0cmluZ1tdPiAgdGhlIHBhdGhzIG9mIHRoZSB0b29sXG4gKi9cbmZ1bmN0aW9uIGZpbmRJblBhdGgodG9vbCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGlmICghdG9vbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicGFyYW1ldGVyICd0b29sJyBpcyByZXF1aXJlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBidWlsZCB0aGUgbGlzdCBvZiBleHRlbnNpb25zIHRvIHRyeVxuICAgICAgICBjb25zdCBleHRlbnNpb25zID0gW107XG4gICAgICAgIGlmIChpb1V0aWwuSVNfV0lORE9XUyAmJiBwcm9jZXNzLmVudlsnUEFUSEVYVCddKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGV4dGVuc2lvbiBvZiBwcm9jZXNzLmVudlsnUEFUSEVYVCddLnNwbGl0KHBhdGguZGVsaW1pdGVyKSkge1xuICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5wdXNoKGV4dGVuc2lvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGl0J3Mgcm9vdGVkLCByZXR1cm4gaXQgaWYgZXhpc3RzLiBvdGhlcndpc2UgcmV0dXJuIGVtcHR5LlxuICAgICAgICBpZiAoaW9VdGlsLmlzUm9vdGVkKHRvb2wpKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHlpZWxkIGlvVXRpbC50cnlHZXRFeGVjdXRhYmxlUGF0aCh0b29sLCBleHRlbnNpb25zKTtcbiAgICAgICAgICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbZmlsZVBhdGhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGFueSBwYXRoIHNlcGFyYXRvcnMsIHJldHVybiBlbXB0eVxuICAgICAgICBpZiAodG9vbC5pbmNsdWRlcyhwYXRoLnNlcCkpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBidWlsZCB0aGUgbGlzdCBvZiBkaXJlY3Rvcmllc1xuICAgICAgICAvL1xuICAgICAgICAvLyBOb3RlLCB0ZWNobmljYWxseSBcIndoZXJlXCIgY2hlY2tzIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBvbiBXaW5kb3dzLiBGcm9tIGEgdG9vbGtpdCBwZXJzcGVjdGl2ZSxcbiAgICAgICAgLy8gaXQgZmVlbHMgbGlrZSB3ZSBzaG91bGQgbm90IGRvIHRoaXMuIENoZWNraW5nIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBzZWVtcyBsaWtlIG1vcmUgb2YgYSB1c2VcbiAgICAgICAgLy8gY2FzZSBvZiBhIHNoZWxsLCBhbmQgdGhlIHdoaWNoKCkgZnVuY3Rpb24gZXhwb3NlZCBieSB0aGUgdG9vbGtpdCBzaG91bGQgc3RyaXZlIGZvciBjb25zaXN0ZW5jeVxuICAgICAgICAvLyBhY3Jvc3MgcGxhdGZvcm1zLlxuICAgICAgICBjb25zdCBkaXJlY3RvcmllcyA9IFtdO1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuUEFUSCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwIG9mIHByb2Nlc3MuZW52LlBBVEguc3BsaXQocGF0aC5kZWxpbWl0ZXIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHApIHtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3JpZXMucHVzaChwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gZmluZCBhbGwgbWF0Y2hlc1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZGlyZWN0b3J5IG9mIGRpcmVjdG9yaWVzKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHlpZWxkIGlvVXRpbC50cnlHZXRFeGVjdXRhYmxlUGF0aChwYXRoLmpvaW4oZGlyZWN0b3J5LCB0b29sKSwgZXh0ZW5zaW9ucyk7XG4gICAgICAgICAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXRjaGVzO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gcmVhZENvcHlPcHRpb25zKG9wdGlvbnMpIHtcbiAgICBjb25zdCBmb3JjZSA9IG9wdGlvbnMuZm9yY2UgPT0gbnVsbCA/IHRydWUgOiBvcHRpb25zLmZvcmNlO1xuICAgIGNvbnN0IHJlY3Vyc2l2ZSA9IEJvb2xlYW4ob3B0aW9ucy5yZWN1cnNpdmUpO1xuICAgIGNvbnN0IGNvcHlTb3VyY2VEaXJlY3RvcnkgPSBvcHRpb25zLmNvcHlTb3VyY2VEaXJlY3RvcnkgPT0gbnVsbFxuICAgICAgICA/IHRydWVcbiAgICAgICAgOiBCb29sZWFuKG9wdGlvbnMuY29weVNvdXJjZURpcmVjdG9yeSk7XG4gICAgcmV0dXJuIHsgZm9yY2UsIHJlY3Vyc2l2ZSwgY29weVNvdXJjZURpcmVjdG9yeSB9O1xufVxuZnVuY3Rpb24gY3BEaXJSZWN1cnNpdmUoc291cmNlRGlyLCBkZXN0RGlyLCBjdXJyZW50RGVwdGgsIGZvcmNlKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgLy8gRW5zdXJlIHRoZXJlIGlzIG5vdCBhIHJ1biBhd2F5IHJlY3Vyc2l2ZSBjb3B5XG4gICAgICAgIGlmIChjdXJyZW50RGVwdGggPj0gMjU1KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjdXJyZW50RGVwdGgrKztcbiAgICAgICAgeWllbGQgbWtkaXJQKGRlc3REaXIpO1xuICAgICAgICBjb25zdCBmaWxlcyA9IHlpZWxkIGlvVXRpbC5yZWFkZGlyKHNvdXJjZURpcik7XG4gICAgICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNyY0ZpbGUgPSBgJHtzb3VyY2VEaXJ9LyR7ZmlsZU5hbWV9YDtcbiAgICAgICAgICAgIGNvbnN0IGRlc3RGaWxlID0gYCR7ZGVzdERpcn0vJHtmaWxlTmFtZX1gO1xuICAgICAgICAgICAgY29uc3Qgc3JjRmlsZVN0YXQgPSB5aWVsZCBpb1V0aWwubHN0YXQoc3JjRmlsZSk7XG4gICAgICAgICAgICBpZiAoc3JjRmlsZVN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgICAgIC8vIFJlY3Vyc2VcbiAgICAgICAgICAgICAgICB5aWVsZCBjcERpclJlY3Vyc2l2ZShzcmNGaWxlLCBkZXN0RmlsZSwgY3VycmVudERlcHRoLCBmb3JjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBjb3B5RmlsZShzcmNGaWxlLCBkZXN0RmlsZSwgZm9yY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENoYW5nZSB0aGUgbW9kZSBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgZGlyZWN0b3J5XG4gICAgICAgIHlpZWxkIGlvVXRpbC5jaG1vZChkZXN0RGlyLCAoeWllbGQgaW9VdGlsLnN0YXQoc291cmNlRGlyKSkubW9kZSk7XG4gICAgfSk7XG59XG4vLyBCdWZmZXJlZCBmaWxlIGNvcHlcbmZ1bmN0aW9uIGNvcHlGaWxlKHNyY0ZpbGUsIGRlc3RGaWxlLCBmb3JjZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGlmICgoeWllbGQgaW9VdGlsLmxzdGF0KHNyY0ZpbGUpKS5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAgICAgICAvLyB1bmxpbmsvcmUtbGluayBpdFxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB5aWVsZCBpb1V0aWwubHN0YXQoZGVzdEZpbGUpO1xuICAgICAgICAgICAgICAgIHlpZWxkIGlvVXRpbC51bmxpbmsoZGVzdEZpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBUcnkgdG8gb3ZlcnJpZGUgZmlsZSBwZXJtaXNzaW9uXG4gICAgICAgICAgICAgICAgaWYgKGUuY29kZSA9PT0gJ0VQRVJNJykge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBpb1V0aWwuY2htb2QoZGVzdEZpbGUsICcwNjY2Jyk7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGlvVXRpbC51bmxpbmsoZGVzdEZpbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBvdGhlciBlcnJvcnMgPSBpdCBkb2Vzbid0IGV4aXN0LCBubyB3b3JrIHRvIGRvXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDb3B5IG92ZXIgc3ltbGlua1xuICAgICAgICAgICAgY29uc3Qgc3ltbGlua0Z1bGwgPSB5aWVsZCBpb1V0aWwucmVhZGxpbmsoc3JjRmlsZSk7XG4gICAgICAgICAgICB5aWVsZCBpb1V0aWwuc3ltbGluayhzeW1saW5rRnVsbCwgZGVzdEZpbGUsIGlvVXRpbC5JU19XSU5ET1dTID8gJ2p1bmN0aW9uJyA6IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCEoeWllbGQgaW9VdGlsLmV4aXN0cyhkZXN0RmlsZSkpIHx8IGZvcmNlKSB7XG4gICAgICAgICAgICB5aWVsZCBpb1V0aWwuY29weUZpbGUoc3JjRmlsZSwgZGVzdEZpbGUpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pby5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgb3duS2V5cyA9IGZ1bmN0aW9uKG8pIHtcbiAgICAgICAgb3duS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgICB2YXIgYXIgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gbykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBrKSkgYXJbYXIubGVuZ3RoXSA9IGs7XG4gICAgICAgICAgICByZXR1cm4gYXI7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBvd25LZXlzKG8pO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChtb2QpIHtcbiAgICAgICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgPSBvd25LZXlzKG1vZCksIGkgPSAwOyBpIDwgay5sZW5ndGg7IGkrKykgaWYgKGtbaV0gIT09IFwiZGVmYXVsdFwiKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGtbaV0pO1xuICAgICAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG59KSgpO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlRvb2xSdW5uZXIgPSB2b2lkIDA7XG5leHBvcnRzLmFyZ1N0cmluZ1RvQXJyYXkgPSBhcmdTdHJpbmdUb0FycmF5O1xuY29uc3Qgb3MgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIm9zXCIpKTtcbmNvbnN0IGV2ZW50cyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiZXZlbnRzXCIpKTtcbmNvbnN0IGNoaWxkID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJjaGlsZF9wcm9jZXNzXCIpKTtcbmNvbnN0IHBhdGggPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInBhdGhcIikpO1xuY29uc3QgaW8gPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIkBhY3Rpb25zL2lvXCIpKTtcbmNvbnN0IGlvVXRpbCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiQGFjdGlvbnMvaW8vbGliL2lvLXV0aWxcIikpO1xuY29uc3QgdGltZXJzXzEgPSByZXF1aXJlKFwidGltZXJzXCIpO1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kICovXG5jb25zdCBJU19XSU5ET1dTID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcbi8qXG4gKiBDbGFzcyBmb3IgcnVubmluZyBjb21tYW5kIGxpbmUgdG9vbHMuIEhhbmRsZXMgcXVvdGluZyBhbmQgYXJnIHBhcnNpbmcgaW4gYSBwbGF0Zm9ybSBhZ25vc3RpYyB3YXkuXG4gKi9cbmNsYXNzIFRvb2xSdW5uZXIgZXh0ZW5kcyBldmVudHMuRXZlbnRFbWl0dGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih0b29sUGF0aCwgYXJncywgb3B0aW9ucykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBpZiAoIXRvb2xQYXRoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXJhbWV0ZXIgJ3Rvb2xQYXRoJyBjYW5ub3QgYmUgbnVsbCBvciBlbXB0eS5cIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50b29sUGF0aCA9IHRvb2xQYXRoO1xuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzIHx8IFtdO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIH1cbiAgICBfZGVidWcobWVzc2FnZSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxpc3RlbmVycyAmJiB0aGlzLm9wdGlvbnMubGlzdGVuZXJzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMubGlzdGVuZXJzLmRlYnVnKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9nZXRDb21tYW5kU3RyaW5nKG9wdGlvbnMsIG5vUHJlZml4KSB7XG4gICAgICAgIGNvbnN0IHRvb2xQYXRoID0gdGhpcy5fZ2V0U3Bhd25GaWxlTmFtZSgpO1xuICAgICAgICBjb25zdCBhcmdzID0gdGhpcy5fZ2V0U3Bhd25BcmdzKG9wdGlvbnMpO1xuICAgICAgICBsZXQgY21kID0gbm9QcmVmaXggPyAnJyA6ICdbY29tbWFuZF0nOyAvLyBvbWl0IHByZWZpeCB3aGVuIHBpcGVkIHRvIGEgc2Vjb25kIHRvb2xcbiAgICAgICAgaWYgKElTX1dJTkRPV1MpIHtcbiAgICAgICAgICAgIC8vIFdpbmRvd3MgKyBjbWQgZmlsZVxuICAgICAgICAgICAgaWYgKHRoaXMuX2lzQ21kRmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgY21kICs9IHRvb2xQYXRoO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYSBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNtZCArPSBgICR7YX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdpbmRvd3MgKyB2ZXJiYXRpbVxuICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9ucy53aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHMpIHtcbiAgICAgICAgICAgICAgICBjbWQgKz0gYFwiJHt0b29sUGF0aH1cImA7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBhIG9mIGFyZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgY21kICs9IGAgJHthfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gV2luZG93cyAocmVndWxhcilcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNtZCArPSB0aGlzLl93aW5kb3dzUXVvdGVDbWRBcmcodG9vbFBhdGgpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYSBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNtZCArPSBgICR7dGhpcy5fd2luZG93c1F1b3RlQ21kQXJnKGEpfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gT1NYL0xpbnV4IC0gdGhpcyBjYW4gbGlrZWx5IGJlIGltcHJvdmVkIHdpdGggc29tZSBmb3JtIG9mIHF1b3RpbmcuXG4gICAgICAgICAgICAvLyBjcmVhdGluZyBwcm9jZXNzZXMgb24gVW5peCBpcyBmdW5kYW1lbnRhbGx5IGRpZmZlcmVudCB0aGFuIFdpbmRvd3MuXG4gICAgICAgICAgICAvLyBvbiBVbml4LCBleGVjdnAoKSB0YWtlcyBhbiBhcmcgYXJyYXkuXG4gICAgICAgICAgICBjbWQgKz0gdG9vbFBhdGg7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGEgb2YgYXJncykge1xuICAgICAgICAgICAgICAgIGNtZCArPSBgICR7YX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbWQ7XG4gICAgfVxuICAgIF9wcm9jZXNzTGluZUJ1ZmZlcihkYXRhLCBzdHJCdWZmZXIsIG9uTGluZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHMgPSBzdHJCdWZmZXIgKyBkYXRhLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBsZXQgbiA9IHMuaW5kZXhPZihvcy5FT0wpO1xuICAgICAgICAgICAgd2hpbGUgKG4gPiAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBzLnN1YnN0cmluZygwLCBuKTtcbiAgICAgICAgICAgICAgICBvbkxpbmUobGluZSk7XG4gICAgICAgICAgICAgICAgLy8gdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyAuLi5cbiAgICAgICAgICAgICAgICBzID0gcy5zdWJzdHJpbmcobiArIG9zLkVPTC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIG4gPSBzLmluZGV4T2Yob3MuRU9MKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIHN0cmVhbWluZyBsaW5lcyB0byBjb25zb2xlIGlzIGJlc3QgZWZmb3J0LiAgRG9uJ3QgZmFpbCBhIGJ1aWxkLlxuICAgICAgICAgICAgdGhpcy5fZGVidWcoYGVycm9yIHByb2Nlc3NpbmcgbGluZS4gRmFpbGVkIHdpdGggZXJyb3IgJHtlcnJ9YCk7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2dldFNwYXduRmlsZU5hbWUoKSB7XG4gICAgICAgIGlmIChJU19XSU5ET1dTKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5faXNDbWRGaWxlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnZbJ0NPTVNQRUMnXSB8fCAnY21kLmV4ZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudG9vbFBhdGg7XG4gICAgfVxuICAgIF9nZXRTcGF3bkFyZ3Mob3B0aW9ucykge1xuICAgICAgICBpZiAoSVNfV0lORE9XUykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2lzQ21kRmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGFyZ2xpbmUgPSBgL0QgL1MgL0MgXCIke3RoaXMuX3dpbmRvd3NRdW90ZUNtZEFyZyh0aGlzLnRvb2xQYXRoKX1gO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYSBvZiB0aGlzLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnbGluZSArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgIGFyZ2xpbmUgKz0gb3B0aW9ucy53aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl93aW5kb3dzUXVvdGVDbWRBcmcoYSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFyZ2xpbmUgKz0gJ1wiJztcbiAgICAgICAgICAgICAgICByZXR1cm4gW2FyZ2xpbmVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmFyZ3M7XG4gICAgfVxuICAgIF9lbmRzV2l0aChzdHIsIGVuZCkge1xuICAgICAgICByZXR1cm4gc3RyLmVuZHNXaXRoKGVuZCk7XG4gICAgfVxuICAgIF9pc0NtZEZpbGUoKSB7XG4gICAgICAgIGNvbnN0IHVwcGVyVG9vbFBhdGggPSB0aGlzLnRvb2xQYXRoLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiAodGhpcy5fZW5kc1dpdGgodXBwZXJUb29sUGF0aCwgJy5DTUQnKSB8fFxuICAgICAgICAgICAgdGhpcy5fZW5kc1dpdGgodXBwZXJUb29sUGF0aCwgJy5CQVQnKSk7XG4gICAgfVxuICAgIF93aW5kb3dzUXVvdGVDbWRBcmcoYXJnKSB7XG4gICAgICAgIC8vIGZvciAuZXhlLCBhcHBseSB0aGUgbm9ybWFsIHF1b3RpbmcgcnVsZXMgdGhhdCBsaWJ1diBhcHBsaWVzXG4gICAgICAgIGlmICghdGhpcy5faXNDbWRGaWxlKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91dlF1b3RlQ21kQXJnKGFyZyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlIGFwcGx5IHF1b3RpbmcgcnVsZXMgc3BlY2lmaWMgdG8gdGhlIGNtZC5leGUgY29tbWFuZCBsaW5lIHBhcnNlci5cbiAgICAgICAgLy8gdGhlIGxpYnV2IHJ1bGVzIGFyZSBnZW5lcmljIGFuZCBhcmUgbm90IGRlc2lnbmVkIHNwZWNpZmljYWxseSBmb3IgY21kLmV4ZVxuICAgICAgICAvLyBjb21tYW5kIGxpbmUgcGFyc2VyLlxuICAgICAgICAvL1xuICAgICAgICAvLyBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgY21kLmV4ZSBjb21tYW5kIGxpbmUgcGFyc2VyLCByZWZlciB0b1xuICAgICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQwOTQ2OTkvaG93LWRvZXMtdGhlLXdpbmRvd3MtY29tbWFuZC1pbnRlcnByZXRlci1jbWQtZXhlLXBhcnNlLXNjcmlwdHMvNzk3MDkxMiM3OTcwOTEyXG4gICAgICAgIC8vIG5lZWQgcXVvdGVzIGZvciBlbXB0eSBhcmdcbiAgICAgICAgaWYgKCFhcmcpIHtcbiAgICAgICAgICAgIHJldHVybiAnXCJcIic7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFyZyBuZWVkcyB0byBiZSBxdW90ZWRcbiAgICAgICAgY29uc3QgY21kU3BlY2lhbENoYXJzID0gW1xuICAgICAgICAgICAgJyAnLFxuICAgICAgICAgICAgJ1xcdCcsXG4gICAgICAgICAgICAnJicsXG4gICAgICAgICAgICAnKCcsXG4gICAgICAgICAgICAnKScsXG4gICAgICAgICAgICAnWycsXG4gICAgICAgICAgICAnXScsXG4gICAgICAgICAgICAneycsXG4gICAgICAgICAgICAnfScsXG4gICAgICAgICAgICAnXicsXG4gICAgICAgICAgICAnPScsXG4gICAgICAgICAgICAnOycsXG4gICAgICAgICAgICAnIScsXG4gICAgICAgICAgICBcIidcIixcbiAgICAgICAgICAgICcrJyxcbiAgICAgICAgICAgICcsJyxcbiAgICAgICAgICAgICdgJyxcbiAgICAgICAgICAgICd+JyxcbiAgICAgICAgICAgICd8JyxcbiAgICAgICAgICAgICc8JyxcbiAgICAgICAgICAgICc+JyxcbiAgICAgICAgICAgICdcIidcbiAgICAgICAgXTtcbiAgICAgICAgbGV0IG5lZWRzUXVvdGVzID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgY2hhciBvZiBhcmcpIHtcbiAgICAgICAgICAgIGlmIChjbWRTcGVjaWFsQ2hhcnMuc29tZSh4ID0+IHggPT09IGNoYXIpKSB7XG4gICAgICAgICAgICAgICAgbmVlZHNRdW90ZXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHNob3J0LWNpcmN1aXQgaWYgcXVvdGVzIG5vdCBuZWVkZWRcbiAgICAgICAgaWYgKCFuZWVkc1F1b3Rlcykge1xuICAgICAgICAgICAgcmV0dXJuIGFyZztcbiAgICAgICAgfVxuICAgICAgICAvLyB0aGUgZm9sbG93aW5nIHF1b3RpbmcgcnVsZXMgYXJlIHZlcnkgc2ltaWxhciB0byB0aGUgcnVsZXMgdGhhdCBieSBsaWJ1diBhcHBsaWVzLlxuICAgICAgICAvL1xuICAgICAgICAvLyAxKSB3cmFwIHRoZSBzdHJpbmcgaW4gcXVvdGVzXG4gICAgICAgIC8vXG4gICAgICAgIC8vIDIpIGRvdWJsZS11cCBxdW90ZXMgLSBpLmUuIFwiID0+IFwiXCJcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgbGlidXYgcXVvdGluZyBydWxlcy4gbGlidXYgcmVwbGFjZXMgXCIgd2l0aCBcXFwiLCB3aGljaCB1bmZvcnR1bmF0ZWx5XG4gICAgICAgIC8vICAgIGRvZXNuJ3Qgd29yayB3ZWxsIHdpdGggYSBjbWQuZXhlIGNvbW1hbmQgbGluZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgbm90ZSwgcmVwbGFjaW5nIFwiIHdpdGggXCJcIiBhbHNvIHdvcmtzIHdlbGwgaWYgdGhlIGFyZyBpcyBwYXNzZWQgdG8gYSBkb3duc3RyZWFtIC5ORVQgY29uc29sZSBhcHAuXG4gICAgICAgIC8vICAgIGZvciBleGFtcGxlLCB0aGUgY29tbWFuZCBsaW5lOlxuICAgICAgICAvLyAgICAgICAgICBmb28uZXhlIFwibXlhcmc6XCJcIm15IHZhbFwiXCJcIlxuICAgICAgICAvLyAgICBpcyBwYXJzZWQgYnkgYSAuTkVUIGNvbnNvbGUgYXBwIGludG8gYW4gYXJnIGFycmF5OlxuICAgICAgICAvLyAgICAgICAgICBbIFwibXlhcmc6XFxcIm15IHZhbFxcXCJcIiBdXG4gICAgICAgIC8vICAgIHdoaWNoIGlzIHRoZSBzYW1lIGVuZCByZXN1bHQgd2hlbiBhcHBseWluZyBsaWJ1diBxdW90aW5nIHJ1bGVzLiBhbHRob3VnaCB0aGUgYWN0dWFsXG4gICAgICAgIC8vICAgIGNvbW1hbmQgbGluZSBmcm9tIGxpYnV2IHF1b3RpbmcgcnVsZXMgd291bGQgbG9vayBsaWtlOlxuICAgICAgICAvLyAgICAgICAgICBmb28uZXhlIFwibXlhcmc6XFxcIm15IHZhbFxcXCJcIlxuICAgICAgICAvL1xuICAgICAgICAvLyAzKSBkb3VibGUtdXAgc2xhc2hlcyB0aGF0IHByZWNlZGUgYSBxdW90ZSxcbiAgICAgICAgLy8gICAgZS5nLiAgaGVsbG8gXFx3b3JsZCAgICA9PiBcImhlbGxvIFxcd29ybGRcIlxuICAgICAgICAvLyAgICAgICAgICBoZWxsb1xcXCJ3b3JsZCAgICA9PiBcImhlbGxvXFxcXFwiXCJ3b3JsZFwiXG4gICAgICAgIC8vICAgICAgICAgIGhlbGxvXFxcXFwid29ybGQgICA9PiBcImhlbGxvXFxcXFxcXFxcIlwid29ybGRcIlxuICAgICAgICAvLyAgICAgICAgICBoZWxsbyB3b3JsZFxcICAgID0+IFwiaGVsbG8gd29ybGRcXFxcXCJcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgdGVjaG5pY2FsbHkgdGhpcyBpcyBub3QgcmVxdWlyZWQgZm9yIGEgY21kLmV4ZSBjb21tYW5kIGxpbmUsIG9yIHRoZSBiYXRjaCBhcmd1bWVudCBwYXJzZXIuXG4gICAgICAgIC8vICAgIHRoZSByZWFzb25zIGZvciBpbmNsdWRpbmcgdGhpcyBhcyBhIC5jbWQgcXVvdGluZyBydWxlIGFyZTpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgYSkgdGhpcyBpcyBvcHRpbWl6ZWQgZm9yIHRoZSBzY2VuYXJpbyB3aGVyZSB0aGUgYXJndW1lbnQgaXMgcGFzc2VkIGZyb20gdGhlIC5jbWQgZmlsZSB0byBhblxuICAgICAgICAvLyAgICAgICBleHRlcm5hbCBwcm9ncmFtLiBtYW55IHByb2dyYW1zIChlLmcuIC5ORVQgY29uc29sZSBhcHBzKSByZWx5IG9uIHRoZSBzbGFzaC1kb3VibGluZyBydWxlLlxuICAgICAgICAvL1xuICAgICAgICAvLyAgICBiKSBpdCdzIHdoYXQgd2UndmUgYmVlbiBkb2luZyBwcmV2aW91c2x5IChieSBkZWZlcnJpbmcgdG8gbm9kZSBkZWZhdWx0IGJlaGF2aW9yKSBhbmQgd2VcbiAgICAgICAgLy8gICAgICAgaGF2ZW4ndCBoZWFyZCBhbnkgY29tcGxhaW50cyBhYm91dCB0aGF0IGFzcGVjdC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gbm90ZSwgYSB3ZWFrbmVzcyBvZiB0aGUgcXVvdGluZyBydWxlcyBjaG9zZW4gaGVyZSwgaXMgdGhhdCAlIGlzIG5vdCBlc2NhcGVkLiBpbiBmYWN0LCAlIGNhbm5vdCBiZVxuICAgICAgICAvLyBlc2NhcGVkIHdoZW4gdXNlZCBvbiB0aGUgY29tbWFuZCBsaW5lIGRpcmVjdGx5IC0gZXZlbiB0aG91Z2ggd2l0aGluIGEgLmNtZCBmaWxlICUgY2FuIGJlIGVzY2FwZWRcbiAgICAgICAgLy8gYnkgdXNpbmcgJSUuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIHRoZSBzYXZpbmcgZ3JhY2UgaXMsIG9uIHRoZSBjb21tYW5kIGxpbmUsICV2YXIlIGlzIGxlZnQgYXMtaXMgaWYgdmFyIGlzIG5vdCBkZWZpbmVkLiB0aGlzIGNvbnRyYXN0c1xuICAgICAgICAvLyB0aGUgbGluZSBwYXJzaW5nIHJ1bGVzIHdpdGhpbiBhIC5jbWQgZmlsZSwgd2hlcmUgaWYgdmFyIGlzIG5vdCBkZWZpbmVkIGl0IGlzIHJlcGxhY2VkIHdpdGggbm90aGluZy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gb25lIG9wdGlvbiB0aGF0IHdhcyBleHBsb3JlZCB3YXMgcmVwbGFjaW5nICUgd2l0aCBeJSAtIGkuZS4gJXZhciUgPT4gXiV2YXJeJS4gdGhpcyBoYWNrIHdvdWxkXG4gICAgICAgIC8vIG9mdGVuIHdvcmssIHNpbmNlIGl0IGlzIHVubGlrZWx5IHRoYXQgdmFyXiB3b3VsZCBleGlzdCwgYW5kIHRoZSBeIGNoYXJhY3RlciBpcyByZW1vdmVkIHdoZW4gdGhlXG4gICAgICAgIC8vIHZhcmlhYmxlIGlzIHVzZWQuIHRoZSBwcm9ibGVtLCBob3dldmVyLCBpcyB0aGF0IF4gaXMgbm90IHJlbW92ZWQgd2hlbiAlKiBpcyB1c2VkIHRvIHBhc3MgdGhlIGFyZ3NcbiAgICAgICAgLy8gdG8gYW4gZXh0ZXJuYWwgcHJvZ3JhbS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gYW4gdW5leHBsb3JlZCBwb3RlbnRpYWwgc29sdXRpb24gZm9yIHRoZSAlIGVzY2FwaW5nIHByb2JsZW0sIGlzIHRvIGNyZWF0ZSBhIHdyYXBwZXIgLmNtZCBmaWxlLlxuICAgICAgICAvLyAlIGNhbiBiZSBlc2NhcGVkIHdpdGhpbiBhIC5jbWQgZmlsZS5cbiAgICAgICAgbGV0IHJldmVyc2UgPSAnXCInO1xuICAgICAgICBsZXQgcXVvdGVIaXQgPSB0cnVlO1xuICAgICAgICBmb3IgKGxldCBpID0gYXJnLmxlbmd0aDsgaSA+IDA7IGktLSkge1xuICAgICAgICAgICAgLy8gd2FsayB0aGUgc3RyaW5nIGluIHJldmVyc2VcbiAgICAgICAgICAgIHJldmVyc2UgKz0gYXJnW2kgLSAxXTtcbiAgICAgICAgICAgIGlmIChxdW90ZUhpdCAmJiBhcmdbaSAtIDFdID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgICAgICByZXZlcnNlICs9ICdcXFxcJzsgLy8gZG91YmxlIHRoZSBzbGFzaFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnW2kgLSAxXSA9PT0gJ1wiJykge1xuICAgICAgICAgICAgICAgIHF1b3RlSGl0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXZlcnNlICs9ICdcIic7IC8vIGRvdWJsZSB0aGUgcXVvdGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHF1b3RlSGl0ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV2ZXJzZSArPSAnXCInO1xuICAgICAgICByZXR1cm4gcmV2ZXJzZS5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpO1xuICAgIH1cbiAgICBfdXZRdW90ZUNtZEFyZyhhcmcpIHtcbiAgICAgICAgLy8gVG9vbCBydW5uZXIgd3JhcHMgY2hpbGRfcHJvY2Vzcy5zcGF3bigpIGFuZCBuZWVkcyB0byBhcHBseSB0aGUgc2FtZSBxdW90aW5nIGFzXG4gICAgICAgIC8vIE5vZGUgaW4gY2VydGFpbiBjYXNlcyB3aGVyZSB0aGUgdW5kb2N1bWVudGVkIHNwYXduIG9wdGlvbiB3aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHNcbiAgICAgICAgLy8gaXMgdXNlZC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gU2luY2UgdGhpcyBmdW5jdGlvbiBpcyBhIHBvcnQgb2YgcXVvdGVfY21kX2FyZyBmcm9tIE5vZGUgNC54ICh0ZWNobmljYWxseSwgbGliIFVWLFxuICAgICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvdjQueC9kZXBzL3V2L3NyYy93aW4vcHJvY2Vzcy5jIGZvciBkZXRhaWxzKSxcbiAgICAgICAgLy8gcGFzdGluZyBjb3B5cmlnaHQgbm90aWNlIGZyb20gTm9kZSB3aXRoaW4gdGhpcyBmdW5jdGlvbjpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gICAgICAgIC8vICAgICAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbiAgICAgICAgLy8gICAgICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuICAgICAgICAvLyAgICAgIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuICAgICAgICAvLyAgICAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gICAgICAgIC8vICAgICAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICAgICAgICAvLyAgICAgIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAgICAgICAgLy8gICAgICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAgICAgICAgLy8gICAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAgICAgICAgLy8gICAgICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gICAgICAgIC8vICAgICAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkdcbiAgICAgICAgLy8gICAgICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTXG4gICAgICAgIC8vICAgICAgSU4gVEhFIFNPRlRXQVJFLlxuICAgICAgICBpZiAoIWFyZykge1xuICAgICAgICAgICAgLy8gTmVlZCBkb3VibGUgcXVvdGF0aW9uIGZvciBlbXB0eSBhcmd1bWVudFxuICAgICAgICAgICAgcmV0dXJuICdcIlwiJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFyZy5pbmNsdWRlcygnICcpICYmICFhcmcuaW5jbHVkZXMoJ1xcdCcpICYmICFhcmcuaW5jbHVkZXMoJ1wiJykpIHtcbiAgICAgICAgICAgIC8vIE5vIHF1b3RhdGlvbiBuZWVkZWRcbiAgICAgICAgICAgIHJldHVybiBhcmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhcmcuaW5jbHVkZXMoJ1wiJykgJiYgIWFyZy5pbmNsdWRlcygnXFxcXCcpKSB7XG4gICAgICAgICAgICAvLyBObyBlbWJlZGRlZCBkb3VibGUgcXVvdGVzIG9yIGJhY2tzbGFzaGVzLCBzbyBJIGNhbiBqdXN0IHdyYXBcbiAgICAgICAgICAgIC8vIHF1b3RlIG1hcmtzIGFyb3VuZCB0aGUgd2hvbGUgdGhpbmcuXG4gICAgICAgICAgICByZXR1cm4gYFwiJHthcmd9XCJgO1xuICAgICAgICB9XG4gICAgICAgIC8vIEV4cGVjdGVkIGlucHV0L291dHB1dDpcbiAgICAgICAgLy8gICBpbnB1dCA6IGhlbGxvXCJ3b3JsZFxuICAgICAgICAvLyAgIG91dHB1dDogXCJoZWxsb1xcXCJ3b3JsZFwiXG4gICAgICAgIC8vICAgaW5wdXQgOiBoZWxsb1wiXCJ3b3JsZFxuICAgICAgICAvLyAgIG91dHB1dDogXCJoZWxsb1xcXCJcXFwid29ybGRcIlxuICAgICAgICAvLyAgIGlucHV0IDogaGVsbG9cXHdvcmxkXG4gICAgICAgIC8vICAgb3V0cHV0OiBoZWxsb1xcd29ybGRcbiAgICAgICAgLy8gICBpbnB1dCA6IGhlbGxvXFxcXHdvcmxkXG4gICAgICAgIC8vICAgb3V0cHV0OiBoZWxsb1xcXFx3b3JsZFxuICAgICAgICAvLyAgIGlucHV0IDogaGVsbG9cXFwid29ybGRcbiAgICAgICAgLy8gICBvdXRwdXQ6IFwiaGVsbG9cXFxcXFxcIndvcmxkXCJcbiAgICAgICAgLy8gICBpbnB1dCA6IGhlbGxvXFxcXFwid29ybGRcbiAgICAgICAgLy8gICBvdXRwdXQ6IFwiaGVsbG9cXFxcXFxcXFxcXCJ3b3JsZFwiXG4gICAgICAgIC8vICAgaW5wdXQgOiBoZWxsbyB3b3JsZFxcXG4gICAgICAgIC8vICAgb3V0cHV0OiBcImhlbGxvIHdvcmxkXFxcXFwiIC0gbm90ZSB0aGUgY29tbWVudCBpbiBsaWJ1diBhY3R1YWxseSByZWFkcyBcImhlbGxvIHdvcmxkXFxcIlxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGl0IGFwcGVhcnMgdGhlIGNvbW1lbnQgaXMgd3JvbmcsIGl0IHNob3VsZCBiZSBcImhlbGxvIHdvcmxkXFxcXFwiXG4gICAgICAgIGxldCByZXZlcnNlID0gJ1wiJztcbiAgICAgICAgbGV0IHF1b3RlSGl0ID0gdHJ1ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGFyZy5sZW5ndGg7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICAgIC8vIHdhbGsgdGhlIHN0cmluZyBpbiByZXZlcnNlXG4gICAgICAgICAgICByZXZlcnNlICs9IGFyZ1tpIC0gMV07XG4gICAgICAgICAgICBpZiAocXVvdGVIaXQgJiYgYXJnW2kgLSAxXSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICAgICAgcmV2ZXJzZSArPSAnXFxcXCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhcmdbaSAtIDFdID09PSAnXCInKSB7XG4gICAgICAgICAgICAgICAgcXVvdGVIaXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldmVyc2UgKz0gJ1xcXFwnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcXVvdGVIaXQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXZlcnNlICs9ICdcIic7XG4gICAgICAgIHJldHVybiByZXZlcnNlLnNwbGl0KCcnKS5yZXZlcnNlKCkuam9pbignJyk7XG4gICAgfVxuICAgIF9jbG9uZUV4ZWNPcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGN3ZDogb3B0aW9ucy5jd2QgfHwgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgIGVudjogb3B0aW9ucy5lbnYgfHwgcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgICBzaWxlbnQ6IG9wdGlvbnMuc2lsZW50IHx8IGZhbHNlLFxuICAgICAgICAgICAgd2luZG93c1ZlcmJhdGltQXJndW1lbnRzOiBvcHRpb25zLndpbmRvd3NWZXJiYXRpbUFyZ3VtZW50cyB8fCBmYWxzZSxcbiAgICAgICAgICAgIGZhaWxPblN0ZEVycjogb3B0aW9ucy5mYWlsT25TdGRFcnIgfHwgZmFsc2UsXG4gICAgICAgICAgICBpZ25vcmVSZXR1cm5Db2RlOiBvcHRpb25zLmlnbm9yZVJldHVybkNvZGUgfHwgZmFsc2UsXG4gICAgICAgICAgICBkZWxheTogb3B0aW9ucy5kZWxheSB8fCAxMDAwMFxuICAgICAgICB9O1xuICAgICAgICByZXN1bHQub3V0U3RyZWFtID0gb3B0aW9ucy5vdXRTdHJlYW0gfHwgcHJvY2Vzcy5zdGRvdXQ7XG4gICAgICAgIHJlc3VsdC5lcnJTdHJlYW0gPSBvcHRpb25zLmVyclN0cmVhbSB8fCBwcm9jZXNzLnN0ZGVycjtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgX2dldFNwYXduT3B0aW9ucyhvcHRpb25zLCB0b29sUGF0aCkge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICAgIHJlc3VsdC5jd2QgPSBvcHRpb25zLmN3ZDtcbiAgICAgICAgcmVzdWx0LmVudiA9IG9wdGlvbnMuZW52O1xuICAgICAgICByZXN1bHRbJ3dpbmRvd3NWZXJiYXRpbUFyZ3VtZW50cyddID1cbiAgICAgICAgICAgIG9wdGlvbnMud2luZG93c1ZlcmJhdGltQXJndW1lbnRzIHx8IHRoaXMuX2lzQ21kRmlsZSgpO1xuICAgICAgICBpZiAob3B0aW9ucy53aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHMpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hcmd2MCA9IGBcIiR7dG9vbFBhdGh9XCJgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWMgYSB0b29sLlxuICAgICAqIE91dHB1dCB3aWxsIGJlIHN0cmVhbWVkIHRvIHRoZSBsaXZlIGNvbnNvbGUuXG4gICAgICogUmV0dXJucyBwcm9taXNlIHdpdGggcmV0dXJuIGNvZGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSAgICAgdG9vbCAgICAgcGF0aCB0byB0b29sIHRvIGV4ZWNcbiAgICAgKiBAcGFyYW0gICAgIG9wdGlvbnMgIG9wdGlvbmFsIGV4ZWMgb3B0aW9ucy4gIFNlZSBFeGVjT3B0aW9uc1xuICAgICAqIEByZXR1cm5zICAgbnVtYmVyXG4gICAgICovXG4gICAgZXhlYygpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIC8vIHJvb3QgdGhlIHRvb2wgcGF0aCBpZiBpdCBpcyB1bnJvb3RlZCBhbmQgY29udGFpbnMgcmVsYXRpdmUgcGF0aGluZ1xuICAgICAgICAgICAgaWYgKCFpb1V0aWwuaXNSb290ZWQodGhpcy50b29sUGF0aCkgJiZcbiAgICAgICAgICAgICAgICAodGhpcy50b29sUGF0aC5pbmNsdWRlcygnLycpIHx8XG4gICAgICAgICAgICAgICAgICAgIChJU19XSU5ET1dTICYmIHRoaXMudG9vbFBhdGguaW5jbHVkZXMoJ1xcXFwnKSkpKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJlZmVyIG9wdGlvbnMuY3dkIGlmIGl0IGlzIHNwZWNpZmllZCwgaG93ZXZlciBvcHRpb25zLmN3ZCBtYXkgYWxzbyBuZWVkIHRvIGJlIHJvb3RlZFxuICAgICAgICAgICAgICAgIHRoaXMudG9vbFBhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgdGhpcy5vcHRpb25zLmN3ZCB8fCBwcm9jZXNzLmN3ZCgpLCB0aGlzLnRvb2xQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmIHRoZSB0b29sIGlzIG9ubHkgYSBmaWxlIG5hbWUsIHRoZW4gcmVzb2x2ZSBpdCBmcm9tIHRoZSBQQVRIXG4gICAgICAgICAgICAvLyBvdGhlcndpc2UgdmVyaWZ5IGl0IGV4aXN0cyAoYWRkIGV4dGVuc2lvbiBvbiBXaW5kb3dzIGlmIG5lY2Vzc2FyeSlcbiAgICAgICAgICAgIHRoaXMudG9vbFBhdGggPSB5aWVsZCBpby53aGljaCh0aGlzLnRvb2xQYXRoLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoYGV4ZWMgdG9vbDogJHt0aGlzLnRvb2xQYXRofWApO1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKCdhcmd1bWVudHM6Jyk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgdGhpcy5hcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKGAgICAke2FyZ31gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uc05vbk51bGwgPSB0aGlzLl9jbG9uZUV4ZWNPcHRpb25zKHRoaXMub3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zTm9uTnVsbC5zaWxlbnQgJiYgb3B0aW9uc05vbk51bGwub3V0U3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnNOb25OdWxsLm91dFN0cmVhbS53cml0ZSh0aGlzLl9nZXRDb21tYW5kU3RyaW5nKG9wdGlvbnNOb25OdWxsKSArIG9zLkVPTCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gbmV3IEV4ZWNTdGF0ZShvcHRpb25zTm9uTnVsbCwgdGhpcy50b29sUGF0aCk7XG4gICAgICAgICAgICAgICAgc3RhdGUub24oJ2RlYnVnJywgKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVidWcobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jd2QgJiYgISh5aWVsZCBpb1V0aWwuZXhpc3RzKHRoaXMub3B0aW9ucy5jd2QpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgVGhlIGN3ZDogJHt0aGlzLm9wdGlvbnMuY3dkfSBkb2VzIG5vdCBleGlzdCFgKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gdGhpcy5fZ2V0U3Bhd25GaWxlTmFtZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNwID0gY2hpbGQuc3Bhd24oZmlsZU5hbWUsIHRoaXMuX2dldFNwYXduQXJncyhvcHRpb25zTm9uTnVsbCksIHRoaXMuX2dldFNwYXduT3B0aW9ucyh0aGlzLm9wdGlvbnMsIGZpbGVOYW1lKSk7XG4gICAgICAgICAgICAgICAgbGV0IHN0ZGJ1ZmZlciA9ICcnO1xuICAgICAgICAgICAgICAgIGlmIChjcC5zdGRvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY3Auc3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubGlzdGVuZXJzICYmIHRoaXMub3B0aW9ucy5saXN0ZW5lcnMuc3Rkb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxpc3RlbmVycy5zdGRvdXQoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnNOb25OdWxsLnNpbGVudCAmJiBvcHRpb25zTm9uTnVsbC5vdXRTdHJlYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zTm9uTnVsbC5vdXRTdHJlYW0ud3JpdGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGRidWZmZXIgPSB0aGlzLl9wcm9jZXNzTGluZUJ1ZmZlcihkYXRhLCBzdGRidWZmZXIsIChsaW5lKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5saXN0ZW5lcnMgJiYgdGhpcy5vcHRpb25zLmxpc3RlbmVycy5zdGRsaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5saXN0ZW5lcnMuc3RkbGluZShsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBlcnJidWZmZXIgPSAnJztcbiAgICAgICAgICAgICAgICBpZiAoY3Auc3RkZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNwLnN0ZGVyci5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wcm9jZXNzU3RkZXJyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubGlzdGVuZXJzICYmIHRoaXMub3B0aW9ucy5saXN0ZW5lcnMuc3RkZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxpc3RlbmVycy5zdGRlcnIoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnNOb25OdWxsLnNpbGVudCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNOb25OdWxsLmVyclN0cmVhbSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNOb25OdWxsLm91dFN0cmVhbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBvcHRpb25zTm9uTnVsbC5mYWlsT25TdGRFcnJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBvcHRpb25zTm9uTnVsbC5lcnJTdHJlYW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBvcHRpb25zTm9uTnVsbC5vdXRTdHJlYW07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcy53cml0ZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVycmJ1ZmZlciA9IHRoaXMuX3Byb2Nlc3NMaW5lQnVmZmVyKGRhdGEsIGVycmJ1ZmZlciwgKGxpbmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxpc3RlbmVycyAmJiB0aGlzLm9wdGlvbnMubGlzdGVuZXJzLmVycmxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxpc3RlbmVycy5lcnJsaW5lKGxpbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3Aub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wcm9jZXNzRXJyb3IgPSBlcnIubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUucHJvY2Vzc0V4aXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnByb2Nlc3NDbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5DaGVja0NvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY3Aub24oJ2V4aXQnLCAoY29kZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wcm9jZXNzRXhpdENvZGUgPSBjb2RlO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wcm9jZXNzRXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoYEV4aXQgY29kZSAke2NvZGV9IHJlY2VpdmVkIGZyb20gdG9vbCAnJHt0aGlzLnRvb2xQYXRofSdgKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUuQ2hlY2tDb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNwLm9uKCdjbG9zZScsIChjb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnByb2Nlc3NFeGl0Q29kZSA9IGNvZGU7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnByb2Nlc3NFeGl0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wcm9jZXNzQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoYFNURElPIHN0cmVhbXMgaGF2ZSBjbG9zZWQgZm9yIHRvb2wgJyR7dGhpcy50b29sUGF0aH0nYCk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLkNoZWNrQ29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzdGF0ZS5vbignZG9uZScsIChlcnJvciwgZXhpdENvZGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZGJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3N0ZGxpbmUnLCBzdGRidWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJidWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJsaW5lJywgZXJyYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjcC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShleGl0Q29kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmlucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3Auc3RkaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2hpbGQgcHJvY2VzcyBtaXNzaW5nIHN0ZGluJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3Auc3RkaW4uZW5kKHRoaXMub3B0aW9ucy5pbnB1dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLlRvb2xSdW5uZXIgPSBUb29sUnVubmVyO1xuLyoqXG4gKiBDb252ZXJ0IGFuIGFyZyBzdHJpbmcgdG8gYW4gYXJyYXkgb2YgYXJncy4gSGFuZGxlcyBlc2NhcGluZ1xuICpcbiAqIEBwYXJhbSAgICBhcmdTdHJpbmcgICBzdHJpbmcgb2YgYXJndW1lbnRzXG4gKiBAcmV0dXJucyAgc3RyaW5nW10gICAgYXJyYXkgb2YgYXJndW1lbnRzXG4gKi9cbmZ1bmN0aW9uIGFyZ1N0cmluZ1RvQXJyYXkoYXJnU3RyaW5nKSB7XG4gICAgY29uc3QgYXJncyA9IFtdO1xuICAgIGxldCBpblF1b3RlcyA9IGZhbHNlO1xuICAgIGxldCBlc2NhcGVkID0gZmFsc2U7XG4gICAgbGV0IGFyZyA9ICcnO1xuICAgIGZ1bmN0aW9uIGFwcGVuZChjKSB7XG4gICAgICAgIC8vIHdlIG9ubHkgZXNjYXBlIGRvdWJsZSBxdW90ZXMuXG4gICAgICAgIGlmIChlc2NhcGVkICYmIGMgIT09ICdcIicpIHtcbiAgICAgICAgICAgIGFyZyArPSAnXFxcXCc7XG4gICAgICAgIH1cbiAgICAgICAgYXJnICs9IGM7XG4gICAgICAgIGVzY2FwZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdTdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYyA9IGFyZ1N0cmluZy5jaGFyQXQoaSk7XG4gICAgICAgIGlmIChjID09PSAnXCInKSB7XG4gICAgICAgICAgICBpZiAoIWVzY2FwZWQpIHtcbiAgICAgICAgICAgICAgICBpblF1b3RlcyA9ICFpblF1b3RlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFwcGVuZChjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjID09PSAnXFxcXCcgJiYgZXNjYXBlZCkge1xuICAgICAgICAgICAgYXBwZW5kKGMpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGMgPT09ICdcXFxcJyAmJiBpblF1b3Rlcykge1xuICAgICAgICAgICAgZXNjYXBlZCA9IHRydWU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYyA9PT0gJyAnICYmICFpblF1b3Rlcykge1xuICAgICAgICAgICAgaWYgKGFyZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgYXJncy5wdXNoKGFyZyk7XG4gICAgICAgICAgICAgICAgYXJnID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBhcHBlbmQoYyk7XG4gICAgfVxuICAgIGlmIChhcmcubGVuZ3RoID4gMCkge1xuICAgICAgICBhcmdzLnB1c2goYXJnLnRyaW0oKSk7XG4gICAgfVxuICAgIHJldHVybiBhcmdzO1xufVxuY2xhc3MgRXhlY1N0YXRlIGV4dGVuZHMgZXZlbnRzLkV2ZW50RW1pdHRlciB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucywgdG9vbFBhdGgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wcm9jZXNzQ2xvc2VkID0gZmFsc2U7IC8vIHRyYWNrcyB3aGV0aGVyIHRoZSBwcm9jZXNzIGhhcyBleGl0ZWQgYW5kIHN0ZGlvIGlzIGNsb3NlZFxuICAgICAgICB0aGlzLnByb2Nlc3NFcnJvciA9ICcnO1xuICAgICAgICB0aGlzLnByb2Nlc3NFeGl0Q29kZSA9IDA7XG4gICAgICAgIHRoaXMucHJvY2Vzc0V4aXRlZCA9IGZhbHNlOyAvLyB0cmFja3Mgd2hldGhlciB0aGUgcHJvY2VzcyBoYXMgZXhpdGVkXG4gICAgICAgIHRoaXMucHJvY2Vzc1N0ZGVyciA9IGZhbHNlOyAvLyB0cmFja3Mgd2hldGhlciBzdGRlcnIgd2FzIHdyaXR0ZW4gdG9cbiAgICAgICAgdGhpcy5kZWxheSA9IDEwMDAwOyAvLyAxMCBzZWNvbmRzXG4gICAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRpbWVvdXQgPSBudWxsO1xuICAgICAgICBpZiAoIXRvb2xQYXRoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Rvb2xQYXRoIG11c3Qgbm90IGJlIGVtcHR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy50b29sUGF0aCA9IHRvb2xQYXRoO1xuICAgICAgICBpZiAob3B0aW9ucy5kZWxheSkge1xuICAgICAgICAgICAgdGhpcy5kZWxheSA9IG9wdGlvbnMuZGVsYXk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgQ2hlY2tDb21wbGV0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnByb2Nlc3NDbG9zZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldFJlc3VsdCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucHJvY2Vzc0V4aXRlZCkge1xuICAgICAgICAgICAgdGhpcy50aW1lb3V0ID0gKDAsIHRpbWVyc18xLnNldFRpbWVvdXQpKEV4ZWNTdGF0ZS5IYW5kbGVUaW1lb3V0LCB0aGlzLmRlbGF5LCB0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfZGVidWcobWVzc2FnZSkge1xuICAgICAgICB0aGlzLmVtaXQoJ2RlYnVnJywgbWVzc2FnZSk7XG4gICAgfVxuICAgIF9zZXRSZXN1bHQoKSB7XG4gICAgICAgIC8vIGRldGVybWluZSB3aGV0aGVyIHRoZXJlIGlzIGFuIGVycm9yXG4gICAgICAgIGxldCBlcnJvcjtcbiAgICAgICAgaWYgKHRoaXMucHJvY2Vzc0V4aXRlZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvY2Vzc0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoYFRoZXJlIHdhcyBhbiBlcnJvciB3aGVuIGF0dGVtcHRpbmcgdG8gZXhlY3V0ZSB0aGUgcHJvY2VzcyAnJHt0aGlzLnRvb2xQYXRofScuIFRoaXMgbWF5IGluZGljYXRlIHRoZSBwcm9jZXNzIGZhaWxlZCB0byBzdGFydC4gRXJyb3I6ICR7dGhpcy5wcm9jZXNzRXJyb3J9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnByb2Nlc3NFeGl0Q29kZSAhPT0gMCAmJiAhdGhpcy5vcHRpb25zLmlnbm9yZVJldHVybkNvZGUpIHtcbiAgICAgICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihgVGhlIHByb2Nlc3MgJyR7dGhpcy50b29sUGF0aH0nIGZhaWxlZCB3aXRoIGV4aXQgY29kZSAke3RoaXMucHJvY2Vzc0V4aXRDb2RlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5wcm9jZXNzU3RkZXJyICYmIHRoaXMub3B0aW9ucy5mYWlsT25TdGRFcnIpIHtcbiAgICAgICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihgVGhlIHByb2Nlc3MgJyR7dGhpcy50b29sUGF0aH0nIGZhaWxlZCBiZWNhdXNlIG9uZSBvciBtb3JlIGxpbmVzIHdlcmUgd3JpdHRlbiB0byB0aGUgU1RERVJSIHN0cmVhbWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNsZWFyIHRoZSB0aW1lb3V0XG4gICAgICAgIGlmICh0aGlzLnRpbWVvdXQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuICAgICAgICAgICAgdGhpcy50aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuICAgICAgICB0aGlzLmVtaXQoJ2RvbmUnLCBlcnJvciwgdGhpcy5wcm9jZXNzRXhpdENvZGUpO1xuICAgIH1cbiAgICBzdGF0aWMgSGFuZGxlVGltZW91dChzdGF0ZSkge1xuICAgICAgICBpZiAoc3RhdGUuZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3RhdGUucHJvY2Vzc0Nsb3NlZCAmJiBzdGF0ZS5wcm9jZXNzRXhpdGVkKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gYFRoZSBTVERJTyBzdHJlYW1zIGRpZCBub3QgY2xvc2Ugd2l0aGluICR7c3RhdGUuZGVsYXkgLyAxMDAwfSBzZWNvbmRzIG9mIHRoZSBleGl0IGV2ZW50IGZyb20gcHJvY2VzcyAnJHtzdGF0ZS50b29sUGF0aH0nLiBUaGlzIG1heSBpbmRpY2F0ZSBhIGNoaWxkIHByb2Nlc3MgaW5oZXJpdGVkIHRoZSBTVERJTyBzdHJlYW1zIGFuZCBoYXMgbm90IHlldCBleGl0ZWQuYDtcbiAgICAgICAgICAgIHN0YXRlLl9kZWJ1ZyhtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5fc2V0UmVzdWx0KCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dG9vbHJ1bm5lci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgb3duS2V5cyA9IGZ1bmN0aW9uKG8pIHtcbiAgICAgICAgb3duS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgICB2YXIgYXIgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gbykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBrKSkgYXJbYXIubGVuZ3RoXSA9IGs7XG4gICAgICAgICAgICByZXR1cm4gYXI7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBvd25LZXlzKG8pO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChtb2QpIHtcbiAgICAgICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgPSBvd25LZXlzKG1vZCksIGkgPSAwOyBpIDwgay5sZW5ndGg7IGkrKykgaWYgKGtbaV0gIT09IFwiZGVmYXVsdFwiKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGtbaV0pO1xuICAgICAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG59KSgpO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmV4ZWMgPSBleGVjO1xuZXhwb3J0cy5nZXRFeGVjT3V0cHV0ID0gZ2V0RXhlY091dHB1dDtcbmNvbnN0IHN0cmluZ19kZWNvZGVyXzEgPSByZXF1aXJlKFwic3RyaW5nX2RlY29kZXJcIik7XG5jb25zdCB0ciA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi90b29scnVubmVyXCIpKTtcbi8qKlxuICogRXhlYyBhIGNvbW1hbmQuXG4gKiBPdXRwdXQgd2lsbCBiZSBzdHJlYW1lZCB0byB0aGUgbGl2ZSBjb25zb2xlLlxuICogUmV0dXJucyBwcm9taXNlIHdpdGggcmV0dXJuIGNvZGVcbiAqXG4gKiBAcGFyYW0gICAgIGNvbW1hbmRMaW5lICAgICAgICBjb21tYW5kIHRvIGV4ZWN1dGUgKGNhbiBpbmNsdWRlIGFkZGl0aW9uYWwgYXJncykuIE11c3QgYmUgY29ycmVjdGx5IGVzY2FwZWQuXG4gKiBAcGFyYW0gICAgIGFyZ3MgICAgICAgICAgICAgICBvcHRpb25hbCBhcmd1bWVudHMgZm9yIHRvb2wuIEVzY2FwaW5nIGlzIGhhbmRsZWQgYnkgdGhlIGxpYi5cbiAqIEBwYXJhbSAgICAgb3B0aW9ucyAgICAgICAgICAgIG9wdGlvbmFsIGV4ZWMgb3B0aW9ucy4gIFNlZSBFeGVjT3B0aW9uc1xuICogQHJldHVybnMgICBQcm9taXNlPG51bWJlcj4gICAgZXhpdCBjb2RlXG4gKi9cbmZ1bmN0aW9uIGV4ZWMoY29tbWFuZExpbmUsIGFyZ3MsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBjb21tYW5kQXJncyA9IHRyLmFyZ1N0cmluZ1RvQXJyYXkoY29tbWFuZExpbmUpO1xuICAgICAgICBpZiAoY29tbWFuZEFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhcmFtZXRlciAnY29tbWFuZExpbmUnIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5LmApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFBhdGggdG8gdG9vbCB0byBleGVjdXRlIHNob3VsZCBiZSBmaXJzdCBhcmdcbiAgICAgICAgY29uc3QgdG9vbFBhdGggPSBjb21tYW5kQXJnc1swXTtcbiAgICAgICAgYXJncyA9IGNvbW1hbmRBcmdzLnNsaWNlKDEpLmNvbmNhdChhcmdzIHx8IFtdKTtcbiAgICAgICAgY29uc3QgcnVubmVyID0gbmV3IHRyLlRvb2xSdW5uZXIodG9vbFBhdGgsIGFyZ3MsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gcnVubmVyLmV4ZWMoKTtcbiAgICB9KTtcbn1cbi8qKlxuICogRXhlYyBhIGNvbW1hbmQgYW5kIGdldCB0aGUgb3V0cHV0LlxuICogT3V0cHV0IHdpbGwgYmUgc3RyZWFtZWQgdG8gdGhlIGxpdmUgY29uc29sZS5cbiAqIFJldHVybnMgcHJvbWlzZSB3aXRoIHRoZSBleGl0IGNvZGUgYW5kIGNvbGxlY3RlZCBzdGRvdXQgYW5kIHN0ZGVyclxuICpcbiAqIEBwYXJhbSAgICAgY29tbWFuZExpbmUgICAgICAgICAgIGNvbW1hbmQgdG8gZXhlY3V0ZSAoY2FuIGluY2x1ZGUgYWRkaXRpb25hbCBhcmdzKS4gTXVzdCBiZSBjb3JyZWN0bHkgZXNjYXBlZC5cbiAqIEBwYXJhbSAgICAgYXJncyAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50cyBmb3IgdG9vbC4gRXNjYXBpbmcgaXMgaGFuZGxlZCBieSB0aGUgbGliLlxuICogQHBhcmFtICAgICBvcHRpb25zICAgICAgICAgICAgICAgb3B0aW9uYWwgZXhlYyBvcHRpb25zLiAgU2VlIEV4ZWNPcHRpb25zXG4gKiBAcmV0dXJucyAgIFByb21pc2U8RXhlY091dHB1dD4gICBleGl0IGNvZGUsIHN0ZG91dCwgYW5kIHN0ZGVyclxuICovXG5mdW5jdGlvbiBnZXRFeGVjT3V0cHV0KGNvbW1hbmRMaW5lLCBhcmdzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgbGV0IHN0ZG91dCA9ICcnO1xuICAgICAgICBsZXQgc3RkZXJyID0gJyc7XG4gICAgICAgIC8vVXNpbmcgc3RyaW5nIGRlY29kZXIgY292ZXJzIHRoZSBjYXNlIHdoZXJlIGEgbXVsdC1ieXRlIGNoYXJhY3RlciBpcyBzcGxpdFxuICAgICAgICBjb25zdCBzdGRvdXREZWNvZGVyID0gbmV3IHN0cmluZ19kZWNvZGVyXzEuU3RyaW5nRGVjb2RlcigndXRmOCcpO1xuICAgICAgICBjb25zdCBzdGRlcnJEZWNvZGVyID0gbmV3IHN0cmluZ19kZWNvZGVyXzEuU3RyaW5nRGVjb2RlcigndXRmOCcpO1xuICAgICAgICBjb25zdCBvcmlnaW5hbFN0ZG91dExpc3RlbmVyID0gKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmxpc3RlbmVycykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnN0ZG91dDtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxTdGRFcnJMaXN0ZW5lciA9IChfYiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5saXN0ZW5lcnMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5zdGRlcnI7XG4gICAgICAgIGNvbnN0IHN0ZEVyckxpc3RlbmVyID0gKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHN0ZGVyciArPSBzdGRlcnJEZWNvZGVyLndyaXRlKGRhdGEpO1xuICAgICAgICAgICAgaWYgKG9yaWdpbmFsU3RkRXJyTGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbFN0ZEVyckxpc3RlbmVyKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBzdGRPdXRMaXN0ZW5lciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICBzdGRvdXQgKz0gc3Rkb3V0RGVjb2Rlci53cml0ZShkYXRhKTtcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbFN0ZG91dExpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxTdGRvdXRMaXN0ZW5lcihkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubGlzdGVuZXJzKSwgeyBzdGRvdXQ6IHN0ZE91dExpc3RlbmVyLCBzdGRlcnI6IHN0ZEVyckxpc3RlbmVyIH0pO1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IHlpZWxkIGV4ZWMoY29tbWFuZExpbmUsIGFyZ3MsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyksIHsgbGlzdGVuZXJzIH0pKTtcbiAgICAgICAgLy9mbHVzaCBhbnkgcmVtYWluaW5nIGNoYXJhY3RlcnNcbiAgICAgICAgc3Rkb3V0ICs9IHN0ZG91dERlY29kZXIuZW5kKCk7XG4gICAgICAgIHN0ZGVyciArPSBzdGRlcnJEZWNvZGVyLmVuZCgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXhpdENvZGUsXG4gICAgICAgICAgICBzdGRvdXQsXG4gICAgICAgICAgICBzdGRlcnJcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWV4ZWMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG93bktleXMgPSBmdW5jdGlvbihvKSB7XG4gICAgICAgIG93bktleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiAobykge1xuICAgICAgICAgICAgdmFyIGFyID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBrIGluIG8pIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgaykpIGFyW2FyLmxlbmd0aF0gPSBrO1xuICAgICAgICAgICAgcmV0dXJuIGFyO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gb3duS2V5cyhvKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAobW9kKSB7XG4gICAgICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrID0gb3duS2V5cyhtb2QpLCBpID0gMDsgaSA8IGsubGVuZ3RoOyBpKyspIGlmIChrW2ldICE9PSBcImRlZmF1bHRcIikgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrW2ldKTtcbiAgICAgICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xufSkoKTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pc0xpbnV4ID0gZXhwb3J0cy5pc01hY09TID0gZXhwb3J0cy5pc1dpbmRvd3MgPSBleHBvcnRzLmFyY2ggPSBleHBvcnRzLnBsYXRmb3JtID0gdm9pZCAwO1xuZXhwb3J0cy5nZXREZXRhaWxzID0gZ2V0RGV0YWlscztcbmNvbnN0IG9zXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIm9zXCIpKTtcbmNvbnN0IGV4ZWMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIkBhY3Rpb25zL2V4ZWNcIikpO1xuY29uc3QgZ2V0V2luZG93c0luZm8gPSAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCB7IHN0ZG91dDogdmVyc2lvbiB9ID0geWllbGQgZXhlYy5nZXRFeGVjT3V0cHV0KCdwb3dlcnNoZWxsIC1jb21tYW5kIFwiKEdldC1DaW1JbnN0YW5jZSAtQ2xhc3NOYW1lIFdpbjMyX09wZXJhdGluZ1N5c3RlbSkuVmVyc2lvblwiJywgdW5kZWZpbmVkLCB7XG4gICAgICAgIHNpbGVudDogdHJ1ZVxuICAgIH0pO1xuICAgIGNvbnN0IHsgc3Rkb3V0OiBuYW1lIH0gPSB5aWVsZCBleGVjLmdldEV4ZWNPdXRwdXQoJ3Bvd2Vyc2hlbGwgLWNvbW1hbmQgXCIoR2V0LUNpbUluc3RhbmNlIC1DbGFzc05hbWUgV2luMzJfT3BlcmF0aW5nU3lzdGVtKS5DYXB0aW9uXCInLCB1bmRlZmluZWQsIHtcbiAgICAgICAgc2lsZW50OiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogbmFtZS50cmltKCksXG4gICAgICAgIHZlcnNpb246IHZlcnNpb24udHJpbSgpXG4gICAgfTtcbn0pO1xuY29uc3QgZ2V0TWFjT3NJbmZvID0gKCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgIGNvbnN0IHsgc3Rkb3V0IH0gPSB5aWVsZCBleGVjLmdldEV4ZWNPdXRwdXQoJ3N3X3ZlcnMnLCB1bmRlZmluZWQsIHtcbiAgICAgICAgc2lsZW50OiB0cnVlXG4gICAgfSk7XG4gICAgY29uc3QgdmVyc2lvbiA9IChfYiA9IChfYSA9IHN0ZG91dC5tYXRjaCgvUHJvZHVjdFZlcnNpb246XFxzKiguKykvKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hWzFdKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcbiAgICBjb25zdCBuYW1lID0gKF9kID0gKF9jID0gc3Rkb3V0Lm1hdGNoKC9Qcm9kdWN0TmFtZTpcXHMqKC4rKS8pKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2NbMV0pICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6ICcnO1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHZlcnNpb25cbiAgICB9O1xufSk7XG5jb25zdCBnZXRMaW51eEluZm8gPSAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCB7IHN0ZG91dCB9ID0geWllbGQgZXhlYy5nZXRFeGVjT3V0cHV0KCdsc2JfcmVsZWFzZScsIFsnLWknLCAnLXInLCAnLXMnXSwge1xuICAgICAgICBzaWxlbnQ6IHRydWVcbiAgICB9KTtcbiAgICBjb25zdCBbbmFtZSwgdmVyc2lvbl0gPSBzdGRvdXQudHJpbSgpLnNwbGl0KCdcXG4nKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lLFxuICAgICAgICB2ZXJzaW9uXG4gICAgfTtcbn0pO1xuZXhwb3J0cy5wbGF0Zm9ybSA9IG9zXzEuZGVmYXVsdC5wbGF0Zm9ybSgpO1xuZXhwb3J0cy5hcmNoID0gb3NfMS5kZWZhdWx0LmFyY2goKTtcbmV4cG9ydHMuaXNXaW5kb3dzID0gZXhwb3J0cy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcbmV4cG9ydHMuaXNNYWNPUyA9IGV4cG9ydHMucGxhdGZvcm0gPT09ICdkYXJ3aW4nO1xuZXhwb3J0cy5pc0xpbnV4ID0gZXhwb3J0cy5wbGF0Zm9ybSA9PT0gJ2xpbnV4JztcbmZ1bmN0aW9uIGdldERldGFpbHMoKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgKHlpZWxkIChleHBvcnRzLmlzV2luZG93c1xuICAgICAgICAgICAgPyBnZXRXaW5kb3dzSW5mbygpXG4gICAgICAgICAgICA6IGV4cG9ydHMuaXNNYWNPU1xuICAgICAgICAgICAgICAgID8gZ2V0TWFjT3NJbmZvKClcbiAgICAgICAgICAgICAgICA6IGdldExpbnV4SW5mbygpKSkpLCB7IHBsYXRmb3JtOiBleHBvcnRzLnBsYXRmb3JtLFxuICAgICAgICAgICAgYXJjaDogZXhwb3J0cy5hcmNoLFxuICAgICAgICAgICAgaXNXaW5kb3dzOiBleHBvcnRzLmlzV2luZG93cyxcbiAgICAgICAgICAgIGlzTWFjT1M6IGV4cG9ydHMuaXNNYWNPUyxcbiAgICAgICAgICAgIGlzTGludXg6IGV4cG9ydHMuaXNMaW51eCB9KTtcbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBsYXRmb3JtLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBvd25LZXlzID0gZnVuY3Rpb24obykge1xuICAgICAgICBvd25LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgIHZhciBhciA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgayBpbiBvKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIGspKSBhclthci5sZW5ndGhdID0gaztcbiAgICAgICAgICAgIHJldHVybiBhcjtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG93bktleXMobyk7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1vZCkge1xuICAgICAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayA9IG93bktleXMobW9kKSwgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSBpZiAoa1tpXSAhPT0gXCJkZWZhdWx0XCIpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwga1tpXSk7XG4gICAgICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbn0pKCk7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucGxhdGZvcm0gPSBleHBvcnRzLnRvUGxhdGZvcm1QYXRoID0gZXhwb3J0cy50b1dpbjMyUGF0aCA9IGV4cG9ydHMudG9Qb3NpeFBhdGggPSBleHBvcnRzLm1hcmtkb3duU3VtbWFyeSA9IGV4cG9ydHMuc3VtbWFyeSA9IGV4cG9ydHMuRXhpdENvZGUgPSB2b2lkIDA7XG5leHBvcnRzLmV4cG9ydFZhcmlhYmxlID0gZXhwb3J0VmFyaWFibGU7XG5leHBvcnRzLnNldFNlY3JldCA9IHNldFNlY3JldDtcbmV4cG9ydHMuYWRkUGF0aCA9IGFkZFBhdGg7XG5leHBvcnRzLmdldElucHV0ID0gZ2V0SW5wdXQ7XG5leHBvcnRzLmdldE11bHRpbGluZUlucHV0ID0gZ2V0TXVsdGlsaW5lSW5wdXQ7XG5leHBvcnRzLmdldEJvb2xlYW5JbnB1dCA9IGdldEJvb2xlYW5JbnB1dDtcbmV4cG9ydHMuc2V0T3V0cHV0ID0gc2V0T3V0cHV0O1xuZXhwb3J0cy5zZXRDb21tYW5kRWNobyA9IHNldENvbW1hbmRFY2hvO1xuZXhwb3J0cy5zZXRGYWlsZWQgPSBzZXRGYWlsZWQ7XG5leHBvcnRzLmlzRGVidWcgPSBpc0RlYnVnO1xuZXhwb3J0cy5kZWJ1ZyA9IGRlYnVnO1xuZXhwb3J0cy5lcnJvciA9IGVycm9yO1xuZXhwb3J0cy53YXJuaW5nID0gd2FybmluZztcbmV4cG9ydHMubm90aWNlID0gbm90aWNlO1xuZXhwb3J0cy5pbmZvID0gaW5mbztcbmV4cG9ydHMuc3RhcnRHcm91cCA9IHN0YXJ0R3JvdXA7XG5leHBvcnRzLmVuZEdyb3VwID0gZW5kR3JvdXA7XG5leHBvcnRzLmdyb3VwID0gZ3JvdXA7XG5leHBvcnRzLnNhdmVTdGF0ZSA9IHNhdmVTdGF0ZTtcbmV4cG9ydHMuZ2V0U3RhdGUgPSBnZXRTdGF0ZTtcbmV4cG9ydHMuZ2V0SURUb2tlbiA9IGdldElEVG9rZW47XG5jb25zdCBjb21tYW5kXzEgPSByZXF1aXJlKFwiLi9jb21tYW5kXCIpO1xuY29uc3QgZmlsZV9jb21tYW5kXzEgPSByZXF1aXJlKFwiLi9maWxlLWNvbW1hbmRcIik7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG5jb25zdCBvcyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwib3NcIikpO1xuY29uc3QgcGF0aCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwicGF0aFwiKSk7XG5jb25zdCBvaWRjX3V0aWxzXzEgPSByZXF1aXJlKFwiLi9vaWRjLXV0aWxzXCIpO1xuLyoqXG4gKiBUaGUgY29kZSB0byBleGl0IGFuIGFjdGlvblxuICovXG52YXIgRXhpdENvZGU7XG4oZnVuY3Rpb24gKEV4aXRDb2RlKSB7XG4gICAgLyoqXG4gICAgICogQSBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgYWN0aW9uIHdhcyBzdWNjZXNzZnVsXG4gICAgICovXG4gICAgRXhpdENvZGVbRXhpdENvZGVbXCJTdWNjZXNzXCJdID0gMF0gPSBcIlN1Y2Nlc3NcIjtcbiAgICAvKipcbiAgICAgKiBBIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBhY3Rpb24gd2FzIGEgZmFpbHVyZVxuICAgICAqL1xuICAgIEV4aXRDb2RlW0V4aXRDb2RlW1wiRmFpbHVyZVwiXSA9IDFdID0gXCJGYWlsdXJlXCI7XG59KShFeGl0Q29kZSB8fCAoZXhwb3J0cy5FeGl0Q29kZSA9IEV4aXRDb2RlID0ge30pKTtcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFZhcmlhYmxlc1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLyoqXG4gKiBTZXRzIGVudiB2YXJpYWJsZSBmb3IgdGhpcyBhY3Rpb24gYW5kIGZ1dHVyZSBhY3Rpb25zIGluIHRoZSBqb2JcbiAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBzZXRcbiAqIEBwYXJhbSB2YWwgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZS4gTm9uLXN0cmluZyB2YWx1ZXMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgdmlhIEpTT04uc3RyaW5naWZ5XG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5mdW5jdGlvbiBleHBvcnRWYXJpYWJsZShuYW1lLCB2YWwpIHtcbiAgICBjb25zdCBjb252ZXJ0ZWRWYWwgPSAoMCwgdXRpbHNfMS50b0NvbW1hbmRWYWx1ZSkodmFsKTtcbiAgICBwcm9jZXNzLmVudltuYW1lXSA9IGNvbnZlcnRlZFZhbDtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHByb2Nlc3MuZW52WydHSVRIVUJfRU5WJ10gfHwgJyc7XG4gICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICAgIHJldHVybiAoMCwgZmlsZV9jb21tYW5kXzEuaXNzdWVGaWxlQ29tbWFuZCkoJ0VOVicsICgwLCBmaWxlX2NvbW1hbmRfMS5wcmVwYXJlS2V5VmFsdWVNZXNzYWdlKShuYW1lLCB2YWwpKTtcbiAgICB9XG4gICAgKDAsIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQpKCdzZXQtZW52JywgeyBuYW1lIH0sIGNvbnZlcnRlZFZhbCk7XG59XG4vKipcbiAqIFJlZ2lzdGVycyBhIHNlY3JldCB3aGljaCB3aWxsIGdldCBtYXNrZWQgZnJvbSBsb2dzXG4gKlxuICogQHBhcmFtIHNlY3JldCAtIFZhbHVlIG9mIHRoZSBzZWNyZXQgdG8gYmUgbWFza2VkXG4gKiBAcmVtYXJrc1xuICogVGhpcyBmdW5jdGlvbiBpbnN0cnVjdHMgdGhlIEFjdGlvbnMgcnVubmVyIHRvIG1hc2sgdGhlIHNwZWNpZmllZCB2YWx1ZSBpbiBhbnlcbiAqIGxvZ3MgcHJvZHVjZWQgZHVyaW5nIHRoZSB3b3JrZmxvdyBydW4uIE9uY2UgcmVnaXN0ZXJlZCwgdGhlIHNlY3JldCB2YWx1ZSB3aWxsXG4gKiBiZSByZXBsYWNlZCB3aXRoIGFzdGVyaXNrcyAoKioqKSB3aGVuZXZlciBpdCBhcHBlYXJzIGluIGNvbnNvbGUgb3V0cHV0LCBsb2dzLFxuICogb3IgZXJyb3IgbWVzc2FnZXMuXG4gKlxuICogVGhpcyBpcyB1c2VmdWwgZm9yIHByb3RlY3Rpbmcgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIHN1Y2ggYXM6XG4gKiAtIEFQSSBrZXlzXG4gKiAtIEFjY2VzcyB0b2tlbnNcbiAqIC0gQXV0aGVudGljYXRpb24gY3JlZGVudGlhbHNcbiAqIC0gVVJMIHBhcmFtZXRlcnMgY29udGFpbmluZyBzaWduYXR1cmVzIChTQVMgdG9rZW5zKVxuICpcbiAqIE5vdGUgdGhhdCBtYXNraW5nIG9ubHkgYWZmZWN0cyBmdXR1cmUgbG9nczsgYW55IHByZXZpb3VzIGFwcGVhcmFuY2VzIG9mIHRoZVxuICogc2VjcmV0IGluIGxvZ3MgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIHJlbWFpbiB1bm1hc2tlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gUmVnaXN0ZXIgYW4gQVBJIHRva2VuIGFzIGEgc2VjcmV0XG4gKiBjb25zdCBhcGlUb2tlbiA9IFwiYWJjMTIzeHl6NDU2XCI7XG4gKiBzZXRTZWNyZXQoYXBpVG9rZW4pO1xuICpcbiAqIC8vIE5vdyBhbnkgbG9ncyBjb250YWluaW5nIHRoaXMgdmFsdWUgd2lsbCBzaG93ICoqKiBpbnN0ZWFkXG4gKiBjb25zb2xlLmxvZyhgVXNpbmcgdG9rZW46ICR7YXBpVG9rZW59YCk7IC8vIE91dHB1dHM6IFwiVXNpbmcgdG9rZW46ICoqKlwiXG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gc2V0U2VjcmV0KHNlY3JldCkge1xuICAgICgwLCBjb21tYW5kXzEuaXNzdWVDb21tYW5kKSgnYWRkLW1hc2snLCB7fSwgc2VjcmV0KTtcbn1cbi8qKlxuICogUHJlcGVuZHMgaW5wdXRQYXRoIHRvIHRoZSBQQVRIIChmb3IgdGhpcyBhY3Rpb24gYW5kIGZ1dHVyZSBhY3Rpb25zKVxuICogQHBhcmFtIGlucHV0UGF0aFxuICovXG5mdW5jdGlvbiBhZGRQYXRoKGlucHV0UGF0aCkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcHJvY2Vzcy5lbnZbJ0dJVEhVQl9QQVRIJ10gfHwgJyc7XG4gICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICAgICgwLCBmaWxlX2NvbW1hbmRfMS5pc3N1ZUZpbGVDb21tYW5kKSgnUEFUSCcsIGlucHV0UGF0aCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAoMCwgY29tbWFuZF8xLmlzc3VlQ29tbWFuZCkoJ2FkZC1wYXRoJywge30sIGlucHV0UGF0aCk7XG4gICAgfVxuICAgIHByb2Nlc3MuZW52WydQQVRIJ10gPSBgJHtpbnB1dFBhdGh9JHtwYXRoLmRlbGltaXRlcn0ke3Byb2Nlc3MuZW52WydQQVRIJ119YDtcbn1cbi8qKlxuICogR2V0cyB0aGUgdmFsdWUgb2YgYW4gaW5wdXQuXG4gKiBVbmxlc3MgdHJpbVdoaXRlc3BhY2UgaXMgc2V0IHRvIGZhbHNlIGluIElucHV0T3B0aW9ucywgdGhlIHZhbHVlIGlzIGFsc28gdHJpbW1lZC5cbiAqIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSB2YWx1ZSBpcyBub3QgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gICAgIG5hbWUgICAgIG5hbWUgb2YgdGhlIGlucHV0IHRvIGdldFxuICogQHBhcmFtICAgICBvcHRpb25zICBvcHRpb25hbC4gU2VlIElucHV0T3B0aW9ucy5cbiAqIEByZXR1cm5zICAgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGdldElucHV0KG5hbWUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB2YWwgPSBwcm9jZXNzLmVudltgSU5QVVRfJHtuYW1lLnJlcGxhY2UoLyAvZywgJ18nKS50b1VwcGVyQ2FzZSgpfWBdIHx8ICcnO1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMucmVxdWlyZWQgJiYgIXZhbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IHJlcXVpcmVkIGFuZCBub3Qgc3VwcGxpZWQ6ICR7bmFtZX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy50cmltV2hpdGVzcGFjZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG4gICAgcmV0dXJuIHZhbC50cmltKCk7XG59XG4vKipcbiAqIEdldHMgdGhlIHZhbHVlcyBvZiBhbiBtdWx0aWxpbmUgaW5wdXQuICBFYWNoIHZhbHVlIGlzIGFsc28gdHJpbW1lZC5cbiAqXG4gKiBAcGFyYW0gICAgIG5hbWUgICAgIG5hbWUgb2YgdGhlIGlucHV0IHRvIGdldFxuICogQHBhcmFtICAgICBvcHRpb25zICBvcHRpb25hbC4gU2VlIElucHV0T3B0aW9ucy5cbiAqIEByZXR1cm5zICAgc3RyaW5nW11cbiAqXG4gKi9cbmZ1bmN0aW9uIGdldE11bHRpbGluZUlucHV0KG5hbWUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBpbnB1dHMgPSBnZXRJbnB1dChuYW1lLCBvcHRpb25zKVxuICAgICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAgIC5maWx0ZXIoeCA9PiB4ICE9PSAnJyk7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy50cmltV2hpdGVzcGFjZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0cztcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0cy5tYXAoaW5wdXQgPT4gaW5wdXQudHJpbSgpKTtcbn1cbi8qKlxuICogR2V0cyB0aGUgaW5wdXQgdmFsdWUgb2YgdGhlIGJvb2xlYW4gdHlwZSBpbiB0aGUgWUFNTCAxLjIgXCJjb3JlIHNjaGVtYVwiIHNwZWNpZmljYXRpb24uXG4gKiBTdXBwb3J0IGJvb2xlYW4gaW5wdXQgbGlzdDogYHRydWUgfCBUcnVlIHwgVFJVRSB8IGZhbHNlIHwgRmFsc2UgfCBGQUxTRWAgLlxuICogVGhlIHJldHVybiB2YWx1ZSBpcyBhbHNvIGluIGJvb2xlYW4gdHlwZS5cbiAqIHJlZjogaHR0cHM6Ly95YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjaWQyODA0OTIzXG4gKlxuICogQHBhcmFtICAgICBuYW1lICAgICBuYW1lIG9mIHRoZSBpbnB1dCB0byBnZXRcbiAqIEBwYXJhbSAgICAgb3B0aW9ucyAgb3B0aW9uYWwuIFNlZSBJbnB1dE9wdGlvbnMuXG4gKiBAcmV0dXJucyAgIGJvb2xlYW5cbiAqL1xuZnVuY3Rpb24gZ2V0Qm9vbGVhbklucHV0KG5hbWUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB0cnVlVmFsdWUgPSBbJ3RydWUnLCAnVHJ1ZScsICdUUlVFJ107XG4gICAgY29uc3QgZmFsc2VWYWx1ZSA9IFsnZmFsc2UnLCAnRmFsc2UnLCAnRkFMU0UnXTtcbiAgICBjb25zdCB2YWwgPSBnZXRJbnB1dChuYW1lLCBvcHRpb25zKTtcbiAgICBpZiAodHJ1ZVZhbHVlLmluY2x1ZGVzKHZhbCkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmIChmYWxzZVZhbHVlLmluY2x1ZGVzKHZhbCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnB1dCBkb2VzIG5vdCBtZWV0IFlBTUwgMS4yIFwiQ29yZSBTY2hlbWFcIiBzcGVjaWZpY2F0aW9uOiAke25hbWV9XFxuYCArXG4gICAgICAgIGBTdXBwb3J0IGJvb2xlYW4gaW5wdXQgbGlzdDogXFxgdHJ1ZSB8IFRydWUgfCBUUlVFIHwgZmFsc2UgfCBGYWxzZSB8IEZBTFNFXFxgYCk7XG59XG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIG9mIGFuIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0gICAgIG5hbWUgICAgIG5hbWUgb2YgdGhlIG91dHB1dCB0byBzZXRcbiAqIEBwYXJhbSAgICAgdmFsdWUgICAgdmFsdWUgdG8gc3RvcmUuIE5vbi1zdHJpbmcgdmFsdWVzIHdpbGwgYmUgY29udmVydGVkIHRvIGEgc3RyaW5nIHZpYSBKU09OLnN0cmluZ2lmeVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZnVuY3Rpb24gc2V0T3V0cHV0KG5hbWUsIHZhbHVlKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwcm9jZXNzLmVudlsnR0lUSFVCX09VVFBVVCddIHx8ICcnO1xuICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgICByZXR1cm4gKDAsIGZpbGVfY29tbWFuZF8xLmlzc3VlRmlsZUNvbW1hbmQpKCdPVVRQVVQnLCAoMCwgZmlsZV9jb21tYW5kXzEucHJlcGFyZUtleVZhbHVlTWVzc2FnZSkobmFtZSwgdmFsdWUpKTtcbiAgICB9XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3MuRU9MKTtcbiAgICAoMCwgY29tbWFuZF8xLmlzc3VlQ29tbWFuZCkoJ3NldC1vdXRwdXQnLCB7IG5hbWUgfSwgKDAsIHV0aWxzXzEudG9Db21tYW5kVmFsdWUpKHZhbHVlKSk7XG59XG4vKipcbiAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGVjaG9pbmcgb2YgY29tbWFuZHMgaW50byBzdGRvdXQgZm9yIHRoZSByZXN0IG9mIHRoZSBzdGVwLlxuICogRWNob2luZyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGlmIEFDVElPTlNfU1RFUF9ERUJVRyBpcyBub3Qgc2V0LlxuICpcbiAqL1xuZnVuY3Rpb24gc2V0Q29tbWFuZEVjaG8oZW5hYmxlZCkge1xuICAgICgwLCBjb21tYW5kXzEuaXNzdWUpKCdlY2hvJywgZW5hYmxlZCA/ICdvbicgOiAnb2ZmJyk7XG59XG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZXN1bHRzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vKipcbiAqIFNldHMgdGhlIGFjdGlvbiBzdGF0dXMgdG8gZmFpbGVkLlxuICogV2hlbiB0aGUgYWN0aW9uIGV4aXRzIGl0IHdpbGwgYmUgd2l0aCBhbiBleGl0IGNvZGUgb2YgMVxuICogQHBhcmFtIG1lc3NhZ2UgYWRkIGVycm9yIGlzc3VlIG1lc3NhZ2VcbiAqL1xuZnVuY3Rpb24gc2V0RmFpbGVkKG1lc3NhZ2UpIHtcbiAgICBwcm9jZXNzLmV4aXRDb2RlID0gRXhpdENvZGUuRmFpbHVyZTtcbiAgICBlcnJvcihtZXNzYWdlKTtcbn1cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIExvZ2dpbmcgQ29tbWFuZHNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8qKlxuICogR2V0cyB3aGV0aGVyIEFjdGlvbnMgU3RlcCBEZWJ1ZyBpcyBvbiBvciBub3RcbiAqL1xuZnVuY3Rpb24gaXNEZWJ1ZygpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnZbJ1JVTk5FUl9ERUJVRyddID09PSAnMSc7XG59XG4vKipcbiAqIFdyaXRlcyBkZWJ1ZyBtZXNzYWdlIHRvIHVzZXIgbG9nXG4gKiBAcGFyYW0gbWVzc2FnZSBkZWJ1ZyBtZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIGRlYnVnKG1lc3NhZ2UpIHtcbiAgICAoMCwgY29tbWFuZF8xLmlzc3VlQ29tbWFuZCkoJ2RlYnVnJywge30sIG1lc3NhZ2UpO1xufVxuLyoqXG4gKiBBZGRzIGFuIGVycm9yIGlzc3VlXG4gKiBAcGFyYW0gbWVzc2FnZSBlcnJvciBpc3N1ZSBtZXNzYWdlLiBFcnJvcnMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gc3RyaW5nIHZpYSB0b1N0cmluZygpXG4gKiBAcGFyYW0gcHJvcGVydGllcyBvcHRpb25hbCBwcm9wZXJ0aWVzIHRvIGFkZCB0byB0aGUgYW5ub3RhdGlvbi5cbiAqL1xuZnVuY3Rpb24gZXJyb3IobWVzc2FnZSwgcHJvcGVydGllcyA9IHt9KSB7XG4gICAgKDAsIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQpKCdlcnJvcicsICgwLCB1dGlsc18xLnRvQ29tbWFuZFByb3BlcnRpZXMpKHByb3BlcnRpZXMpLCBtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IgPyBtZXNzYWdlLnRvU3RyaW5nKCkgOiBtZXNzYWdlKTtcbn1cbi8qKlxuICogQWRkcyBhIHdhcm5pbmcgaXNzdWVcbiAqIEBwYXJhbSBtZXNzYWdlIHdhcm5pbmcgaXNzdWUgbWVzc2FnZS4gRXJyb3JzIHdpbGwgYmUgY29udmVydGVkIHRvIHN0cmluZyB2aWEgdG9TdHJpbmcoKVxuICogQHBhcmFtIHByb3BlcnRpZXMgb3B0aW9uYWwgcHJvcGVydGllcyB0byBhZGQgdG8gdGhlIGFubm90YXRpb24uXG4gKi9cbmZ1bmN0aW9uIHdhcm5pbmcobWVzc2FnZSwgcHJvcGVydGllcyA9IHt9KSB7XG4gICAgKDAsIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQpKCd3YXJuaW5nJywgKDAsIHV0aWxzXzEudG9Db21tYW5kUHJvcGVydGllcykocHJvcGVydGllcyksIG1lc3NhZ2UgaW5zdGFuY2VvZiBFcnJvciA/IG1lc3NhZ2UudG9TdHJpbmcoKSA6IG1lc3NhZ2UpO1xufVxuLyoqXG4gKiBBZGRzIGEgbm90aWNlIGlzc3VlXG4gKiBAcGFyYW0gbWVzc2FnZSBub3RpY2UgaXNzdWUgbWVzc2FnZS4gRXJyb3JzIHdpbGwgYmUgY29udmVydGVkIHRvIHN0cmluZyB2aWEgdG9TdHJpbmcoKVxuICogQHBhcmFtIHByb3BlcnRpZXMgb3B0aW9uYWwgcHJvcGVydGllcyB0byBhZGQgdG8gdGhlIGFubm90YXRpb24uXG4gKi9cbmZ1bmN0aW9uIG5vdGljZShtZXNzYWdlLCBwcm9wZXJ0aWVzID0ge30pIHtcbiAgICAoMCwgY29tbWFuZF8xLmlzc3VlQ29tbWFuZCkoJ25vdGljZScsICgwLCB1dGlsc18xLnRvQ29tbWFuZFByb3BlcnRpZXMpKHByb3BlcnRpZXMpLCBtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IgPyBtZXNzYWdlLnRvU3RyaW5nKCkgOiBtZXNzYWdlKTtcbn1cbi8qKlxuICogV3JpdGVzIGluZm8gdG8gbG9nIHdpdGggY29uc29sZS5sb2cuXG4gKiBAcGFyYW0gbWVzc2FnZSBpbmZvIG1lc3NhZ2VcbiAqL1xuZnVuY3Rpb24gaW5mbyhtZXNzYWdlKSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUobWVzc2FnZSArIG9zLkVPTCk7XG59XG4vKipcbiAqIEJlZ2luIGFuIG91dHB1dCBncm91cC5cbiAqXG4gKiBPdXRwdXQgdW50aWwgdGhlIG5leHQgYGdyb3VwRW5kYCB3aWxsIGJlIGZvbGRhYmxlIGluIHRoaXMgZ3JvdXBcbiAqXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgb3V0cHV0IGdyb3VwXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0R3JvdXAobmFtZSkge1xuICAgICgwLCBjb21tYW5kXzEuaXNzdWUpKCdncm91cCcsIG5hbWUpO1xufVxuLyoqXG4gKiBFbmQgYW4gb3V0cHV0IGdyb3VwLlxuICovXG5mdW5jdGlvbiBlbmRHcm91cCgpIHtcbiAgICAoMCwgY29tbWFuZF8xLmlzc3VlKSgnZW5kZ3JvdXAnKTtcbn1cbi8qKlxuICogV3JhcCBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gY2FsbCBpbiBhIGdyb3VwLlxuICpcbiAqIFJldHVybnMgdGhlIHNhbWUgdHlwZSBhcyB0aGUgZnVuY3Rpb24gaXRzZWxmLlxuICpcbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBncm91cFxuICogQHBhcmFtIGZuIFRoZSBmdW5jdGlvbiB0byB3cmFwIGluIHRoZSBncm91cFxuICovXG5mdW5jdGlvbiBncm91cChuYW1lLCBmbikge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHN0YXJ0R3JvdXAobmFtZSk7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXN1bHQgPSB5aWVsZCBmbigpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgZW5kR3JvdXAoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xufVxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV3JhcHBlciBhY3Rpb24gc3RhdGVcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8qKlxuICogU2F2ZXMgc3RhdGUgZm9yIGN1cnJlbnQgYWN0aW9uLCB0aGUgc3RhdGUgY2FuIG9ubHkgYmUgcmV0cmlldmVkIGJ5IHRoaXMgYWN0aW9uJ3MgcG9zdCBqb2IgZXhlY3V0aW9uLlxuICpcbiAqIEBwYXJhbSAgICAgbmFtZSAgICAgbmFtZSBvZiB0aGUgc3RhdGUgdG8gc3RvcmVcbiAqIEBwYXJhbSAgICAgdmFsdWUgICAgdmFsdWUgdG8gc3RvcmUuIE5vbi1zdHJpbmcgdmFsdWVzIHdpbGwgYmUgY29udmVydGVkIHRvIGEgc3RyaW5nIHZpYSBKU09OLnN0cmluZ2lmeVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZnVuY3Rpb24gc2F2ZVN0YXRlKG5hbWUsIHZhbHVlKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwcm9jZXNzLmVudlsnR0lUSFVCX1NUQVRFJ10gfHwgJyc7XG4gICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICAgIHJldHVybiAoMCwgZmlsZV9jb21tYW5kXzEuaXNzdWVGaWxlQ29tbWFuZCkoJ1NUQVRFJywgKDAsIGZpbGVfY29tbWFuZF8xLnByZXBhcmVLZXlWYWx1ZU1lc3NhZ2UpKG5hbWUsIHZhbHVlKSk7XG4gICAgfVxuICAgICgwLCBjb21tYW5kXzEuaXNzdWVDb21tYW5kKSgnc2F2ZS1zdGF0ZScsIHsgbmFtZSB9LCAoMCwgdXRpbHNfMS50b0NvbW1hbmRWYWx1ZSkodmFsdWUpKTtcbn1cbi8qKlxuICogR2V0cyB0aGUgdmFsdWUgb2YgYW4gc3RhdGUgc2V0IGJ5IHRoaXMgYWN0aW9uJ3MgbWFpbiBleGVjdXRpb24uXG4gKlxuICogQHBhcmFtICAgICBuYW1lICAgICBuYW1lIG9mIHRoZSBzdGF0ZSB0byBnZXRcbiAqIEByZXR1cm5zICAgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGdldFN0YXRlKG5hbWUpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnZbYFNUQVRFXyR7bmFtZX1gXSB8fCAnJztcbn1cbmZ1bmN0aW9uIGdldElEVG9rZW4oYXVkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgcmV0dXJuIHlpZWxkIG9pZGNfdXRpbHNfMS5PaWRjQ2xpZW50LmdldElEVG9rZW4oYXVkKTtcbiAgICB9KTtcbn1cbi8qKlxuICogU3VtbWFyeSBleHBvcnRzXG4gKi9cbnZhciBzdW1tYXJ5XzEgPSByZXF1aXJlKFwiLi9zdW1tYXJ5XCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwic3VtbWFyeVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc3VtbWFyeV8xLnN1bW1hcnk7IH0gfSk7XG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBjb3JlLnN1bW1hcnlcbiAqL1xudmFyIHN1bW1hcnlfMiA9IHJlcXVpcmUoXCIuL3N1bW1hcnlcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJtYXJrZG93blN1bW1hcnlcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHN1bW1hcnlfMi5tYXJrZG93blN1bW1hcnk7IH0gfSk7XG4vKipcbiAqIFBhdGggZXhwb3J0c1xuICovXG52YXIgcGF0aF91dGlsc18xID0gcmVxdWlyZShcIi4vcGF0aC11dGlsc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInRvUG9zaXhQYXRoXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBwYXRoX3V0aWxzXzEudG9Qb3NpeFBhdGg7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ0b1dpbjMyUGF0aFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcGF0aF91dGlsc18xLnRvV2luMzJQYXRoOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidG9QbGF0Zm9ybVBhdGhcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHBhdGhfdXRpbHNfMS50b1BsYXRmb3JtUGF0aDsgfSB9KTtcbi8qKlxuICogUGxhdGZvcm0gdXRpbGl0aWVzIGV4cG9ydHNcbiAqL1xuZXhwb3J0cy5wbGF0Zm9ybSA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9wbGF0Zm9ybVwiKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb3JlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Db250ZXh0ID0gdm9pZCAwO1xuY29uc3QgZnNfMSA9IHJlcXVpcmUoXCJmc1wiKTtcbmNvbnN0IG9zXzEgPSByZXF1aXJlKFwib3NcIik7XG5jbGFzcyBDb250ZXh0IHtcbiAgICAvKipcbiAgICAgKiBIeWRyYXRlIHRoZSBjb250ZXh0IGZyb20gdGhlIGVudmlyb25tZW50XG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICB0aGlzLnBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LkdJVEhVQl9FVkVOVF9QQVRIKSB7XG4gICAgICAgICAgICBpZiAoKDAsIGZzXzEuZXhpc3RzU3luYykocHJvY2Vzcy5lbnYuR0lUSFVCX0VWRU5UX1BBVEgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXlsb2FkID0gSlNPTi5wYXJzZSgoMCwgZnNfMS5yZWFkRmlsZVN5bmMpKHByb2Nlc3MuZW52LkdJVEhVQl9FVkVOVF9QQVRILCB7IGVuY29kaW5nOiAndXRmOCcgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IHByb2Nlc3MuZW52LkdJVEhVQl9FVkVOVF9QQVRIO1xuICAgICAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGBHSVRIVUJfRVZFTlRfUEFUSCAke3BhdGh9IGRvZXMgbm90IGV4aXN0JHtvc18xLkVPTH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV2ZW50TmFtZSA9IHByb2Nlc3MuZW52LkdJVEhVQl9FVkVOVF9OQU1FO1xuICAgICAgICB0aGlzLnNoYSA9IHByb2Nlc3MuZW52LkdJVEhVQl9TSEE7XG4gICAgICAgIHRoaXMucmVmID0gcHJvY2Vzcy5lbnYuR0lUSFVCX1JFRjtcbiAgICAgICAgdGhpcy53b3JrZmxvdyA9IHByb2Nlc3MuZW52LkdJVEhVQl9XT1JLRkxPVztcbiAgICAgICAgdGhpcy5hY3Rpb24gPSBwcm9jZXNzLmVudi5HSVRIVUJfQUNUSU9OO1xuICAgICAgICB0aGlzLmFjdG9yID0gcHJvY2Vzcy5lbnYuR0lUSFVCX0FDVE9SO1xuICAgICAgICB0aGlzLmpvYiA9IHByb2Nlc3MuZW52LkdJVEhVQl9KT0I7XG4gICAgICAgIHRoaXMucnVuQXR0ZW1wdCA9IHBhcnNlSW50KHByb2Nlc3MuZW52LkdJVEhVQl9SVU5fQVRURU1QVCwgMTApO1xuICAgICAgICB0aGlzLnJ1bk51bWJlciA9IHBhcnNlSW50KHByb2Nlc3MuZW52LkdJVEhVQl9SVU5fTlVNQkVSLCAxMCk7XG4gICAgICAgIHRoaXMucnVuSWQgPSBwYXJzZUludChwcm9jZXNzLmVudi5HSVRIVUJfUlVOX0lELCAxMCk7XG4gICAgICAgIHRoaXMuYXBpVXJsID0gKF9hID0gcHJvY2Vzcy5lbnYuR0lUSFVCX0FQSV9VUkwpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGBodHRwczovL2FwaS5naXRodWIuY29tYDtcbiAgICAgICAgdGhpcy5zZXJ2ZXJVcmwgPSAoX2IgPSBwcm9jZXNzLmVudi5HSVRIVUJfU0VSVkVSX1VSTCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogYGh0dHBzOi8vZ2l0aHViLmNvbWA7XG4gICAgICAgIHRoaXMuZ3JhcGhxbFVybCA9XG4gICAgICAgICAgICAoX2MgPSBwcm9jZXNzLmVudi5HSVRIVUJfR1JBUEhRTF9VUkwpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGBodHRwczovL2FwaS5naXRodWIuY29tL2dyYXBocWxgO1xuICAgIH1cbiAgICBnZXQgaXNzdWUoKSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLnBheWxvYWQ7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRoaXMucmVwbyksIHsgbnVtYmVyOiAocGF5bG9hZC5pc3N1ZSB8fCBwYXlsb2FkLnB1bGxfcmVxdWVzdCB8fCBwYXlsb2FkKS5udW1iZXIgfSk7XG4gICAgfVxuICAgIGdldCByZXBvKCkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuR0lUSFVCX1JFUE9TSVRPUlkpIHtcbiAgICAgICAgICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBwcm9jZXNzLmVudi5HSVRIVUJfUkVQT1NJVE9SWS5zcGxpdCgnLycpO1xuICAgICAgICAgICAgcmV0dXJuIHsgb3duZXIsIHJlcG8gfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXlsb2FkLnJlcG9zaXRvcnkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb3duZXI6IHRoaXMucGF5bG9hZC5yZXBvc2l0b3J5Lm93bmVyLmxvZ2luLFxuICAgICAgICAgICAgICAgIHJlcG86IHRoaXMucGF5bG9hZC5yZXBvc2l0b3J5Lm5hbWVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY29udGV4dC5yZXBvIHJlcXVpcmVzIGEgR0lUSFVCX1JFUE9TSVRPUlkgZW52aXJvbm1lbnQgdmFyaWFibGUgbGlrZSAnb3duZXIvcmVwbydcIik7XG4gICAgfVxufVxuZXhwb3J0cy5Db250ZXh0ID0gQ29udGV4dDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnRleHQuanMubWFwIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIGtDbG9zZTogU3ltYm9sKCdjbG9zZScpLFxuICBrRGVzdHJveTogU3ltYm9sKCdkZXN0cm95JyksXG4gIGtEaXNwYXRjaDogU3ltYm9sKCdkaXNwYXRjaCcpLFxuICBrVXJsOiBTeW1ib2woJ3VybCcpLFxuICBrV3JpdGluZzogU3ltYm9sKCd3cml0aW5nJyksXG4gIGtSZXN1bWluZzogU3ltYm9sKCdyZXN1bWluZycpLFxuICBrUXVldWU6IFN5bWJvbCgncXVldWUnKSxcbiAga0Nvbm5lY3Q6IFN5bWJvbCgnY29ubmVjdCcpLFxuICBrQ29ubmVjdGluZzogU3ltYm9sKCdjb25uZWN0aW5nJyksXG4gIGtIZWFkZXJzTGlzdDogU3ltYm9sKCdoZWFkZXJzIGxpc3QnKSxcbiAga0tlZXBBbGl2ZURlZmF1bHRUaW1lb3V0OiBTeW1ib2woJ2RlZmF1bHQga2VlcCBhbGl2ZSB0aW1lb3V0JyksXG4gIGtLZWVwQWxpdmVNYXhUaW1lb3V0OiBTeW1ib2woJ21heCBrZWVwIGFsaXZlIHRpbWVvdXQnKSxcbiAga0tlZXBBbGl2ZVRpbWVvdXRUaHJlc2hvbGQ6IFN5bWJvbCgna2VlcCBhbGl2ZSB0aW1lb3V0IHRocmVzaG9sZCcpLFxuICBrS2VlcEFsaXZlVGltZW91dFZhbHVlOiBTeW1ib2woJ2tlZXAgYWxpdmUgdGltZW91dCcpLFxuICBrS2VlcEFsaXZlOiBTeW1ib2woJ2tlZXAgYWxpdmUnKSxcbiAga0hlYWRlcnNUaW1lb3V0OiBTeW1ib2woJ2hlYWRlcnMgdGltZW91dCcpLFxuICBrQm9keVRpbWVvdXQ6IFN5bWJvbCgnYm9keSB0aW1lb3V0JyksXG4gIGtTZXJ2ZXJOYW1lOiBTeW1ib2woJ3NlcnZlciBuYW1lJyksXG4gIGtMb2NhbEFkZHJlc3M6IFN5bWJvbCgnbG9jYWwgYWRkcmVzcycpLFxuICBrSG9zdDogU3ltYm9sKCdob3N0JyksXG4gIGtOb1JlZjogU3ltYm9sKCdubyByZWYnKSxcbiAga0JvZHlVc2VkOiBTeW1ib2woJ3VzZWQnKSxcbiAga1J1bm5pbmc6IFN5bWJvbCgncnVubmluZycpLFxuICBrQmxvY2tpbmc6IFN5bWJvbCgnYmxvY2tpbmcnKSxcbiAga1BlbmRpbmc6IFN5bWJvbCgncGVuZGluZycpLFxuICBrU2l6ZTogU3ltYm9sKCdzaXplJyksXG4gIGtCdXN5OiBTeW1ib2woJ2J1c3knKSxcbiAga1F1ZXVlZDogU3ltYm9sKCdxdWV1ZWQnKSxcbiAga0ZyZWU6IFN5bWJvbCgnZnJlZScpLFxuICBrQ29ubmVjdGVkOiBTeW1ib2woJ2Nvbm5lY3RlZCcpLFxuICBrQ2xvc2VkOiBTeW1ib2woJ2Nsb3NlZCcpLFxuICBrTmVlZERyYWluOiBTeW1ib2woJ25lZWQgZHJhaW4nKSxcbiAga1Jlc2V0OiBTeW1ib2woJ3Jlc2V0JyksXG4gIGtEZXN0cm95ZWQ6IFN5bWJvbC5mb3IoJ25vZGVqcy5zdHJlYW0uZGVzdHJveWVkJyksXG4gIGtNYXhIZWFkZXJzU2l6ZTogU3ltYm9sKCdtYXggaGVhZGVycyBzaXplJyksXG4gIGtSdW5uaW5nSWR4OiBTeW1ib2woJ3J1bm5pbmcgaW5kZXgnKSxcbiAga1BlbmRpbmdJZHg6IFN5bWJvbCgncGVuZGluZyBpbmRleCcpLFxuICBrRXJyb3I6IFN5bWJvbCgnZXJyb3InKSxcbiAga0NsaWVudHM6IFN5bWJvbCgnY2xpZW50cycpLFxuICBrQ2xpZW50OiBTeW1ib2woJ2NsaWVudCcpLFxuICBrUGFyc2VyOiBTeW1ib2woJ3BhcnNlcicpLFxuICBrT25EZXN0cm95ZWQ6IFN5bWJvbCgnZGVzdHJveSBjYWxsYmFja3MnKSxcbiAga1BpcGVsaW5pbmc6IFN5bWJvbCgncGlwZWxpbmluZycpLFxuICBrU29ja2V0OiBTeW1ib2woJ3NvY2tldCcpLFxuICBrSG9zdEhlYWRlcjogU3ltYm9sKCdob3N0IGhlYWRlcicpLFxuICBrQ29ubmVjdG9yOiBTeW1ib2woJ2Nvbm5lY3RvcicpLFxuICBrU3RyaWN0Q29udGVudExlbmd0aDogU3ltYm9sKCdzdHJpY3QgY29udGVudCBsZW5ndGgnKSxcbiAga01heFJlZGlyZWN0aW9uczogU3ltYm9sKCdtYXhSZWRpcmVjdGlvbnMnKSxcbiAga01heFJlcXVlc3RzOiBTeW1ib2woJ21heFJlcXVlc3RzUGVyQ2xpZW50JyksXG4gIGtQcm94eTogU3ltYm9sKCdwcm94eSBhZ2VudCBvcHRpb25zJyksXG4gIGtDb3VudGVyOiBTeW1ib2woJ3NvY2tldCByZXF1ZXN0IGNvdW50ZXInKSxcbiAga0ludGVyY2VwdG9yczogU3ltYm9sKCdkaXNwYXRjaCBpbnRlcmNlcHRvcnMnKSxcbiAga01heFJlc3BvbnNlU2l6ZTogU3ltYm9sKCdtYXggcmVzcG9uc2Ugc2l6ZScpLFxuICBrSFRUUDJTZXNzaW9uOiBTeW1ib2woJ2h0dHAyU2Vzc2lvbicpLFxuICBrSFRUUDJTZXNzaW9uU3RhdGU6IFN5bWJvbCgnaHR0cDJTZXNzaW9uIHN0YXRlJyksXG4gIGtIVFRQMkJ1aWxkUmVxdWVzdDogU3ltYm9sKCdodHRwMiBidWlsZCByZXF1ZXN0JyksXG4gIGtIVFRQMUJ1aWxkUmVxdWVzdDogU3ltYm9sKCdodHRwMSBidWlsZCByZXF1ZXN0JyksXG4gIGtIVFRQMkNvcHlIZWFkZXJzOiBTeW1ib2woJ2h0dHAyIGNvcHkgaGVhZGVycycpLFxuICBrSFRUUENvbm5WZXJzaW9uOiBTeW1ib2woJ2h0dHAgY29ubmVjdGlvbiB2ZXJzaW9uJyksXG4gIGtSZXRyeUhhbmRsZXJEZWZhdWx0UmV0cnk6IFN5bWJvbCgncmV0cnkgYWdlbnQgZGVmYXVsdCByZXRyeScpLFxuICBrQ29uc3RydWN0OiBTeW1ib2woJ2NvbnN0cnVjdGFibGUnKVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNsYXNzIFVuZGljaUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgdGhpcy5uYW1lID0gJ1VuZGljaUVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSJ1xuICB9XG59XG5cbmNsYXNzIENvbm5lY3RUaW1lb3V0RXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBDb25uZWN0VGltZW91dEVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdDb25uZWN0VGltZW91dEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ0Nvbm5lY3QgVGltZW91dCBFcnJvcidcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9DT05ORUNUX1RJTUVPVVQnXG4gIH1cbn1cblxuY2xhc3MgSGVhZGVyc1RpbWVvdXRFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEhlYWRlcnNUaW1lb3V0RXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ0hlYWRlcnNUaW1lb3V0RXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnSGVhZGVycyBUaW1lb3V0IEVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0hFQURFUlNfVElNRU9VVCdcbiAgfVxufVxuXG5jbGFzcyBIZWFkZXJzT3ZlcmZsb3dFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEhlYWRlcnNPdmVyZmxvd0Vycm9yKVxuICAgIHRoaXMubmFtZSA9ICdIZWFkZXJzT3ZlcmZsb3dFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdIZWFkZXJzIE92ZXJmbG93IEVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0hFQURFUlNfT1ZFUkZMT1cnXG4gIH1cbn1cblxuY2xhc3MgQm9keVRpbWVvdXRFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEJvZHlUaW1lb3V0RXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ0JvZHlUaW1lb3V0RXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnQm9keSBUaW1lb3V0IEVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0JPRFlfVElNRU9VVCdcbiAgfVxufVxuXG5jbGFzcyBSZXNwb25zZVN0YXR1c0NvZGVFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UsIHN0YXR1c0NvZGUsIGhlYWRlcnMsIGJvZHkpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFJlc3BvbnNlU3RhdHVzQ29kZUVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdSZXNwb25zZVN0YXR1c0NvZGVFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdSZXNwb25zZSBTdGF0dXMgQ29kZSBFcnJvcidcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9SRVNQT05TRV9TVEFUVVNfQ09ERSdcbiAgICB0aGlzLmJvZHkgPSBib2R5XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXNDb2RlXG4gICAgdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZVxuICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnNcbiAgfVxufVxuXG5jbGFzcyBJbnZhbGlkQXJndW1lbnRFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEludmFsaWRBcmd1bWVudEVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdJbnZhbGlkQXJndW1lbnRFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdJbnZhbGlkIEFyZ3VtZW50IEVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0lOVkFMSURfQVJHJ1xuICB9XG59XG5cbmNsYXNzIEludmFsaWRSZXR1cm5WYWx1ZUVycm9yIGV4dGVuZHMgVW5kaWNpRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgSW52YWxpZFJldHVyblZhbHVlRXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ0ludmFsaWRSZXR1cm5WYWx1ZUVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ0ludmFsaWQgUmV0dXJuIFZhbHVlIEVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0lOVkFMSURfUkVUVVJOX1ZBTFVFJ1xuICB9XG59XG5cbmNsYXNzIFJlcXVlc3RBYm9ydGVkRXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBSZXF1ZXN0QWJvcnRlZEVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdBYm9ydEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1JlcXVlc3QgYWJvcnRlZCdcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9BQk9SVEVEJ1xuICB9XG59XG5cbmNsYXNzIEluZm9ybWF0aW9uYWxFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEluZm9ybWF0aW9uYWxFcnJvcilcbiAgICB0aGlzLm5hbWUgPSAnSW5mb3JtYXRpb25hbEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1JlcXVlc3QgaW5mb3JtYXRpb24nXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfSU5GTydcbiAgfVxufVxuXG5jbGFzcyBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ1JlcXVlc3RDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdSZXF1ZXN0IGJvZHkgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGNvbnRlbnQtbGVuZ3RoIGhlYWRlcidcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9SRVFfQ09OVEVOVF9MRU5HVEhfTUlTTUFUQ0gnXG4gIH1cbn1cblxuY2xhc3MgUmVzcG9uc2VDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFJlc3BvbnNlQ29udGVudExlbmd0aE1pc21hdGNoRXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ1Jlc3BvbnNlQ29udGVudExlbmd0aE1pc21hdGNoRXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnUmVzcG9uc2UgYm9keSBsZW5ndGggZG9lcyBub3QgbWF0Y2ggY29udGVudC1sZW5ndGggaGVhZGVyJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX1JFU19DT05URU5UX0xFTkdUSF9NSVNNQVRDSCdcbiAgfVxufVxuXG5jbGFzcyBDbGllbnREZXN0cm95ZWRFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIENsaWVudERlc3Ryb3llZEVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdDbGllbnREZXN0cm95ZWRFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdUaGUgY2xpZW50IGlzIGRlc3Ryb3llZCdcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9ERVNUUk9ZRUQnXG4gIH1cbn1cblxuY2xhc3MgQ2xpZW50Q2xvc2VkRXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBDbGllbnRDbG9zZWRFcnJvcilcbiAgICB0aGlzLm5hbWUgPSAnQ2xpZW50Q2xvc2VkRXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnVGhlIGNsaWVudCBpcyBjbG9zZWQnXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfQ0xPU0VEJ1xuICB9XG59XG5cbmNsYXNzIFNvY2tldEVycm9yIGV4dGVuZHMgVW5kaWNpRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSwgc29ja2V0KSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBTb2NrZXRFcnJvcilcbiAgICB0aGlzLm5hbWUgPSAnU29ja2V0RXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnU29ja2V0IGVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX1NPQ0tFVCdcbiAgICB0aGlzLnNvY2tldCA9IHNvY2tldFxuICB9XG59XG5cbmNsYXNzIE5vdFN1cHBvcnRlZEVycm9yIGV4dGVuZHMgVW5kaWNpRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgTm90U3VwcG9ydGVkRXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ05vdFN1cHBvcnRlZEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ05vdCBzdXBwb3J0ZWQgZXJyb3InXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfTk9UX1NVUFBPUlRFRCdcbiAgfVxufVxuXG5jbGFzcyBCYWxhbmNlZFBvb2xNaXNzaW5nVXBzdHJlYW1FcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIE5vdFN1cHBvcnRlZEVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdNaXNzaW5nVXBzdHJlYW1FcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdObyB1cHN0cmVhbSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgQmFsYW5jZWRQb29sJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0JQTF9NSVNTSU5HX1VQU1RSRUFNJ1xuICB9XG59XG5cbmNsYXNzIEhUVFBQYXJzZXJFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UsIGNvZGUsIGRhdGEpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEhUVFBQYXJzZXJFcnJvcilcbiAgICB0aGlzLm5hbWUgPSAnSFRUUFBhcnNlckVycm9yJ1xuICAgIHRoaXMuY29kZSA9IGNvZGUgPyBgSFBFXyR7Y29kZX1gIDogdW5kZWZpbmVkXG4gICAgdGhpcy5kYXRhID0gZGF0YSA/IGRhdGEudG9TdHJpbmcoKSA6IHVuZGVmaW5lZFxuICB9XG59XG5cbmNsYXNzIFJlc3BvbnNlRXhjZWVkZWRNYXhTaXplRXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBSZXNwb25zZUV4Y2VlZGVkTWF4U2l6ZUVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdSZXNwb25zZUV4Y2VlZGVkTWF4U2l6ZUVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1Jlc3BvbnNlIGNvbnRlbnQgZXhjZWVkZWQgbWF4IHNpemUnXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfUkVTX0VYQ0VFREVEX01BWF9TSVpFJ1xuICB9XG59XG5cbmNsYXNzIFJlcXVlc3RSZXRyeUVycm9yIGV4dGVuZHMgVW5kaWNpRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSwgY29kZSwgeyBoZWFkZXJzLCBkYXRhIH0pIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFJlcXVlc3RSZXRyeUVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdSZXF1ZXN0UmV0cnlFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdSZXF1ZXN0IHJldHJ5IGVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX1JFUV9SRVRSWSdcbiAgICB0aGlzLnN0YXR1c0NvZGUgPSBjb2RlXG4gICAgdGhpcy5kYXRhID0gZGF0YVxuICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnNcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgSFRUUFBhcnNlckVycm9yLFxuICBVbmRpY2lFcnJvcixcbiAgSGVhZGVyc1RpbWVvdXRFcnJvcixcbiAgSGVhZGVyc092ZXJmbG93RXJyb3IsXG4gIEJvZHlUaW1lb3V0RXJyb3IsXG4gIFJlcXVlc3RDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcixcbiAgQ29ubmVjdFRpbWVvdXRFcnJvcixcbiAgUmVzcG9uc2VTdGF0dXNDb2RlRXJyb3IsXG4gIEludmFsaWRBcmd1bWVudEVycm9yLFxuICBJbnZhbGlkUmV0dXJuVmFsdWVFcnJvcixcbiAgUmVxdWVzdEFib3J0ZWRFcnJvcixcbiAgQ2xpZW50RGVzdHJveWVkRXJyb3IsXG4gIENsaWVudENsb3NlZEVycm9yLFxuICBJbmZvcm1hdGlvbmFsRXJyb3IsXG4gIFNvY2tldEVycm9yLFxuICBOb3RTdXBwb3J0ZWRFcnJvcixcbiAgUmVzcG9uc2VDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcixcbiAgQmFsYW5jZWRQb29sTWlzc2luZ1Vwc3RyZWFtRXJyb3IsXG4gIFJlc3BvbnNlRXhjZWVkZWRNYXhTaXplRXJyb3IsXG4gIFJlcXVlc3RSZXRyeUVycm9yXG59XG4iLCIndXNlIHN0cmljdCdcblxuLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+fSAqL1xuY29uc3QgaGVhZGVyTmFtZUxvd2VyQ2FzZWRSZWNvcmQgPSB7fVxuXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVFRQL0hlYWRlcnNcbmNvbnN0IHdlbGxrbm93bkhlYWRlck5hbWVzID0gW1xuICAnQWNjZXB0JyxcbiAgJ0FjY2VwdC1FbmNvZGluZycsXG4gICdBY2NlcHQtTGFuZ3VhZ2UnLFxuICAnQWNjZXB0LVJhbmdlcycsXG4gICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFscycsXG4gICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzJyxcbiAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHMnLFxuICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJyxcbiAgJ0FjY2Vzcy1Db250cm9sLUV4cG9zZS1IZWFkZXJzJyxcbiAgJ0FjY2Vzcy1Db250cm9sLU1heC1BZ2UnLFxuICAnQWNjZXNzLUNvbnRyb2wtUmVxdWVzdC1IZWFkZXJzJyxcbiAgJ0FjY2Vzcy1Db250cm9sLVJlcXVlc3QtTWV0aG9kJyxcbiAgJ0FnZScsXG4gICdBbGxvdycsXG4gICdBbHQtU3ZjJyxcbiAgJ0FsdC1Vc2VkJyxcbiAgJ0F1dGhvcml6YXRpb24nLFxuICAnQ2FjaGUtQ29udHJvbCcsXG4gICdDbGVhci1TaXRlLURhdGEnLFxuICAnQ29ubmVjdGlvbicsXG4gICdDb250ZW50LURpc3Bvc2l0aW9uJyxcbiAgJ0NvbnRlbnQtRW5jb2RpbmcnLFxuICAnQ29udGVudC1MYW5ndWFnZScsXG4gICdDb250ZW50LUxlbmd0aCcsXG4gICdDb250ZW50LUxvY2F0aW9uJyxcbiAgJ0NvbnRlbnQtUmFuZ2UnLFxuICAnQ29udGVudC1TZWN1cml0eS1Qb2xpY3knLFxuICAnQ29udGVudC1TZWN1cml0eS1Qb2xpY3ktUmVwb3J0LU9ubHknLFxuICAnQ29udGVudC1UeXBlJyxcbiAgJ0Nvb2tpZScsXG4gICdDcm9zcy1PcmlnaW4tRW1iZWRkZXItUG9saWN5JyxcbiAgJ0Nyb3NzLU9yaWdpbi1PcGVuZXItUG9saWN5JyxcbiAgJ0Nyb3NzLU9yaWdpbi1SZXNvdXJjZS1Qb2xpY3knLFxuICAnRGF0ZScsXG4gICdEZXZpY2UtTWVtb3J5JyxcbiAgJ0Rvd25saW5rJyxcbiAgJ0VDVCcsXG4gICdFVGFnJyxcbiAgJ0V4cGVjdCcsXG4gICdFeHBlY3QtQ1QnLFxuICAnRXhwaXJlcycsXG4gICdGb3J3YXJkZWQnLFxuICAnRnJvbScsXG4gICdIb3N0JyxcbiAgJ0lmLU1hdGNoJyxcbiAgJ0lmLU1vZGlmaWVkLVNpbmNlJyxcbiAgJ0lmLU5vbmUtTWF0Y2gnLFxuICAnSWYtUmFuZ2UnLFxuICAnSWYtVW5tb2RpZmllZC1TaW5jZScsXG4gICdLZWVwLUFsaXZlJyxcbiAgJ0xhc3QtTW9kaWZpZWQnLFxuICAnTGluaycsXG4gICdMb2NhdGlvbicsXG4gICdNYXgtRm9yd2FyZHMnLFxuICAnT3JpZ2luJyxcbiAgJ1Blcm1pc3Npb25zLVBvbGljeScsXG4gICdQcmFnbWEnLFxuICAnUHJveHktQXV0aGVudGljYXRlJyxcbiAgJ1Byb3h5LUF1dGhvcml6YXRpb24nLFxuICAnUlRUJyxcbiAgJ1JhbmdlJyxcbiAgJ1JlZmVyZXInLFxuICAnUmVmZXJyZXItUG9saWN5JyxcbiAgJ1JlZnJlc2gnLFxuICAnUmV0cnktQWZ0ZXInLFxuICAnU2VjLVdlYlNvY2tldC1BY2NlcHQnLFxuICAnU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zJyxcbiAgJ1NlYy1XZWJTb2NrZXQtS2V5JyxcbiAgJ1NlYy1XZWJTb2NrZXQtUHJvdG9jb2wnLFxuICAnU2VjLVdlYlNvY2tldC1WZXJzaW9uJyxcbiAgJ1NlcnZlcicsXG4gICdTZXJ2ZXItVGltaW5nJyxcbiAgJ1NlcnZpY2UtV29ya2VyLUFsbG93ZWQnLFxuICAnU2VydmljZS1Xb3JrZXItTmF2aWdhdGlvbi1QcmVsb2FkJyxcbiAgJ1NldC1Db29raWUnLFxuICAnU291cmNlTWFwJyxcbiAgJ1N0cmljdC1UcmFuc3BvcnQtU2VjdXJpdHknLFxuICAnU3VwcG9ydHMtTG9hZGluZy1Nb2RlJyxcbiAgJ1RFJyxcbiAgJ1RpbWluZy1BbGxvdy1PcmlnaW4nLFxuICAnVHJhaWxlcicsXG4gICdUcmFuc2Zlci1FbmNvZGluZycsXG4gICdVcGdyYWRlJyxcbiAgJ1VwZ3JhZGUtSW5zZWN1cmUtUmVxdWVzdHMnLFxuICAnVXNlci1BZ2VudCcsXG4gICdWYXJ5JyxcbiAgJ1ZpYScsXG4gICdXV1ctQXV0aGVudGljYXRlJyxcbiAgJ1gtQ29udGVudC1UeXBlLU9wdGlvbnMnLFxuICAnWC1ETlMtUHJlZmV0Y2gtQ29udHJvbCcsXG4gICdYLUZyYW1lLU9wdGlvbnMnLFxuICAnWC1QZXJtaXR0ZWQtQ3Jvc3MtRG9tYWluLVBvbGljaWVzJyxcbiAgJ1gtUG93ZXJlZC1CeScsXG4gICdYLVJlcXVlc3RlZC1XaXRoJyxcbiAgJ1gtWFNTLVByb3RlY3Rpb24nXG5dXG5cbmZvciAobGV0IGkgPSAwOyBpIDwgd2VsbGtub3duSGVhZGVyTmFtZXMubGVuZ3RoOyArK2kpIHtcbiAgY29uc3Qga2V5ID0gd2VsbGtub3duSGVhZGVyTmFtZXNbaV1cbiAgY29uc3QgbG93ZXJDYXNlZEtleSA9IGtleS50b0xvd2VyQ2FzZSgpXG4gIGhlYWRlck5hbWVMb3dlckNhc2VkUmVjb3JkW2tleV0gPSBoZWFkZXJOYW1lTG93ZXJDYXNlZFJlY29yZFtsb3dlckNhc2VkS2V5XSA9XG4gICAgbG93ZXJDYXNlZEtleVxufVxuXG4vLyBOb3RlOiBvYmplY3QgcHJvdG90eXBlcyBzaG91bGQgbm90IGJlIGFibGUgdG8gYmUgcmVmZXJlbmNlZC4gZS5nLiBgT2JqZWN0I2hhc093blByb3BlcnR5YC5cbk9iamVjdC5zZXRQcm90b3R5cGVPZihoZWFkZXJOYW1lTG93ZXJDYXNlZFJlY29yZCwgbnVsbClcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHdlbGxrbm93bkhlYWRlck5hbWVzLFxuICBoZWFkZXJOYW1lTG93ZXJDYXNlZFJlY29yZFxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5jb25zdCB7IGtEZXN0cm95ZWQsIGtCb2R5VXNlZCB9ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgSW5jb21pbmdNZXNzYWdlIH0gPSByZXF1aXJlKCdodHRwJylcbmNvbnN0IHN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpXG5jb25zdCBuZXQgPSByZXF1aXJlKCduZXQnKVxuY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciB9ID0gcmVxdWlyZSgnLi9lcnJvcnMnKVxuY29uc3QgeyBCbG9iIH0gPSByZXF1aXJlKCdidWZmZXInKVxuY29uc3Qgbm9kZVV0aWwgPSByZXF1aXJlKCd1dGlsJylcbmNvbnN0IHsgc3RyaW5naWZ5IH0gPSByZXF1aXJlKCdxdWVyeXN0cmluZycpXG5jb25zdCB7IGhlYWRlck5hbWVMb3dlckNhc2VkUmVjb3JkIH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5cbmNvbnN0IFtub2RlTWFqb3IsIG5vZGVNaW5vcl0gPSBwcm9jZXNzLnZlcnNpb25zLm5vZGUuc3BsaXQoJy4nKS5tYXAodiA9PiBOdW1iZXIodikpXG5cbmZ1bmN0aW9uIG5vcCAoKSB7fVxuXG5mdW5jdGlvbiBpc1N0cmVhbSAob2JqKSB7XG4gIHJldHVybiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG9iai5waXBlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmoub24gPT09ICdmdW5jdGlvbidcbn1cblxuLy8gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL25vZGUtZmV0Y2gvZmV0Y2gtYmxvYi9ibG9iLzhhYjU4N2QzNDA4MGRlOTQxNDBiNTRmMDcxNjg0NTFlN2QwYjY1NWUvaW5kZXguanMjTDIyOS1MMjQxIChNSVQgTGljZW5zZSlcbmZ1bmN0aW9uIGlzQmxvYkxpa2UgKG9iamVjdCkge1xuICByZXR1cm4gKEJsb2IgJiYgb2JqZWN0IGluc3RhbmNlb2YgQmxvYikgfHwgKFxuICAgIG9iamVjdCAmJlxuICAgIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmXG4gICAgKHR5cGVvZiBvYmplY3Quc3RyZWFtID09PSAnZnVuY3Rpb24nIHx8XG4gICAgICB0eXBlb2Ygb2JqZWN0LmFycmF5QnVmZmVyID09PSAnZnVuY3Rpb24nKSAmJlxuICAgIC9eKEJsb2J8RmlsZSkkLy50ZXN0KG9iamVjdFtTeW1ib2wudG9TdHJpbmdUYWddKVxuICApXG59XG5cbmZ1bmN0aW9uIGJ1aWxkVVJMICh1cmwsIHF1ZXJ5UGFyYW1zKSB7XG4gIGlmICh1cmwuaW5jbHVkZXMoJz8nKSB8fCB1cmwuaW5jbHVkZXMoJyMnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUXVlcnkgcGFyYW1zIGNhbm5vdCBiZSBwYXNzZWQgd2hlbiB1cmwgYWxyZWFkeSBjb250YWlucyBcIj9cIiBvciBcIiNcIi4nKVxuICB9XG5cbiAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnkocXVlcnlQYXJhbXMpXG5cbiAgaWYgKHN0cmluZ2lmaWVkKSB7XG4gICAgdXJsICs9ICc/JyArIHN0cmluZ2lmaWVkXG4gIH1cblxuICByZXR1cm4gdXJsXG59XG5cbmZ1bmN0aW9uIHBhcnNlVVJMICh1cmwpIHtcbiAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgdXJsID0gbmV3IFVSTCh1cmwpXG5cbiAgICBpZiAoIS9eaHR0cHM/Oi8udGVzdCh1cmwub3JpZ2luIHx8IHVybC5wcm90b2NvbCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignSW52YWxpZCBVUkwgcHJvdG9jb2w6IHRoZSBVUkwgbXVzdCBzdGFydCB3aXRoIGBodHRwOmAgb3IgYGh0dHBzOmAuJylcbiAgICB9XG5cbiAgICByZXR1cm4gdXJsXG4gIH1cblxuICBpZiAoIXVybCB8fCB0eXBlb2YgdXJsICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignSW52YWxpZCBVUkw6IFRoZSBVUkwgYXJndW1lbnQgbXVzdCBiZSBhIG5vbi1udWxsIG9iamVjdC4nKVxuICB9XG5cbiAgaWYgKCEvXmh0dHBzPzovLnRlc3QodXJsLm9yaWdpbiB8fCB1cmwucHJvdG9jb2wpKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdJbnZhbGlkIFVSTCBwcm90b2NvbDogdGhlIFVSTCBtdXN0IHN0YXJ0IHdpdGggYGh0dHA6YCBvciBgaHR0cHM6YC4nKVxuICB9XG5cbiAgaWYgKCEodXJsIGluc3RhbmNlb2YgVVJMKSkge1xuICAgIGlmICh1cmwucG9ydCAhPSBudWxsICYmIHVybC5wb3J0ICE9PSAnJyAmJiAhTnVtYmVyLmlzRmluaXRlKHBhcnNlSW50KHVybC5wb3J0KSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignSW52YWxpZCBVUkw6IHBvcnQgbXVzdCBiZSBhIHZhbGlkIGludGVnZXIgb3IgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZWdlci4nKVxuICAgIH1cblxuICAgIGlmICh1cmwucGF0aCAhPSBudWxsICYmIHR5cGVvZiB1cmwucGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignSW52YWxpZCBVUkwgcGF0aDogdGhlIHBhdGggbXVzdCBiZSBhIHN0cmluZyBvciBudWxsL3VuZGVmaW5lZC4nKVxuICAgIH1cblxuICAgIGlmICh1cmwucGF0aG5hbWUgIT0gbnVsbCAmJiB0eXBlb2YgdXJsLnBhdGhuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdJbnZhbGlkIFVSTCBwYXRobmFtZTogdGhlIHBhdGhuYW1lIG11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbC91bmRlZmluZWQuJylcbiAgICB9XG5cbiAgICBpZiAodXJsLmhvc3RuYW1lICE9IG51bGwgJiYgdHlwZW9mIHVybC5ob3N0bmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignSW52YWxpZCBVUkwgaG9zdG5hbWU6IHRoZSBob3N0bmFtZSBtdXN0IGJlIGEgc3RyaW5nIG9yIG51bGwvdW5kZWZpbmVkLicpXG4gICAgfVxuXG4gICAgaWYgKHVybC5vcmlnaW4gIT0gbnVsbCAmJiB0eXBlb2YgdXJsLm9yaWdpbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignSW52YWxpZCBVUkwgb3JpZ2luOiB0aGUgb3JpZ2luIG11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbC91bmRlZmluZWQuJylcbiAgICB9XG5cbiAgICBjb25zdCBwb3J0ID0gdXJsLnBvcnQgIT0gbnVsbFxuICAgICAgPyB1cmwucG9ydFxuICAgICAgOiAodXJsLnByb3RvY29sID09PSAnaHR0cHM6JyA/IDQ0MyA6IDgwKVxuICAgIGxldCBvcmlnaW4gPSB1cmwub3JpZ2luICE9IG51bGxcbiAgICAgID8gdXJsLm9yaWdpblxuICAgICAgOiBgJHt1cmwucHJvdG9jb2x9Ly8ke3VybC5ob3N0bmFtZX06JHtwb3J0fWBcbiAgICBsZXQgcGF0aCA9IHVybC5wYXRoICE9IG51bGxcbiAgICAgID8gdXJsLnBhdGhcbiAgICAgIDogYCR7dXJsLnBhdGhuYW1lIHx8ICcnfSR7dXJsLnNlYXJjaCB8fCAnJ31gXG5cbiAgICBpZiAob3JpZ2luLmVuZHNXaXRoKCcvJykpIHtcbiAgICAgIG9yaWdpbiA9IG9yaWdpbi5zdWJzdHJpbmcoMCwgb3JpZ2luLmxlbmd0aCAtIDEpXG4gICAgfVxuXG4gICAgaWYgKHBhdGggJiYgIXBhdGguc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgICBwYXRoID0gYC8ke3BhdGh9YFxuICAgIH1cbiAgICAvLyBuZXcgVVJMKHBhdGgsIG9yaWdpbikgaXMgdW5zYWZlIHdoZW4gYHBhdGhgIGNvbnRhaW5zIGFuIGFic29sdXRlIFVSTFxuICAgIC8vIEZyb20gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1VSTC9VUkw6XG4gICAgLy8gSWYgZmlyc3QgcGFyYW1ldGVyIGlzIGEgcmVsYXRpdmUgVVJMLCBzZWNvbmQgcGFyYW0gaXMgcmVxdWlyZWQsIGFuZCB3aWxsIGJlIHVzZWQgYXMgdGhlIGJhc2UgVVJMLlxuICAgIC8vIElmIGZpcnN0IHBhcmFtZXRlciBpcyBhbiBhYnNvbHV0ZSBVUkwsIGEgZ2l2ZW4gc2Vjb25kIHBhcmFtIHdpbGwgYmUgaWdub3JlZC5cbiAgICB1cmwgPSBuZXcgVVJMKG9yaWdpbiArIHBhdGgpXG4gIH1cblxuICByZXR1cm4gdXJsXG59XG5cbmZ1bmN0aW9uIHBhcnNlT3JpZ2luICh1cmwpIHtcbiAgdXJsID0gcGFyc2VVUkwodXJsKVxuXG4gIGlmICh1cmwucGF0aG5hbWUgIT09ICcvJyB8fCB1cmwuc2VhcmNoIHx8IHVybC5oYXNoKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIHVybCcpXG4gIH1cblxuICByZXR1cm4gdXJsXG59XG5cbmZ1bmN0aW9uIGdldEhvc3RuYW1lIChob3N0KSB7XG4gIGlmIChob3N0WzBdID09PSAnWycpIHtcbiAgICBjb25zdCBpZHggPSBob3N0LmluZGV4T2YoJ10nKVxuXG4gICAgYXNzZXJ0KGlkeCAhPT0gLTEpXG4gICAgcmV0dXJuIGhvc3Quc3Vic3RyaW5nKDEsIGlkeClcbiAgfVxuXG4gIGNvbnN0IGlkeCA9IGhvc3QuaW5kZXhPZignOicpXG4gIGlmIChpZHggPT09IC0xKSByZXR1cm4gaG9zdFxuXG4gIHJldHVybiBob3N0LnN1YnN0cmluZygwLCBpZHgpXG59XG5cbi8vIElQIGFkZHJlc3NlcyBhcmUgbm90IHZhbGlkIHNlcnZlciBuYW1lcyBwZXIgUkZDNjA2NlxuLy8gPiBDdXJyZW50bHksIHRoZSBvbmx5IHNlcnZlciBuYW1lcyBzdXBwb3J0ZWQgYXJlIEROUyBob3N0bmFtZXNcbmZ1bmN0aW9uIGdldFNlcnZlck5hbWUgKGhvc3QpIHtcbiAgaWYgKCFob3N0KSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGFzc2VydC5zdHJpY3RFcXVhbCh0eXBlb2YgaG9zdCwgJ3N0cmluZycpXG5cbiAgY29uc3Qgc2VydmVybmFtZSA9IGdldEhvc3RuYW1lKGhvc3QpXG4gIGlmIChuZXQuaXNJUChzZXJ2ZXJuYW1lKSkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgcmV0dXJuIHNlcnZlcm5hbWVcbn1cblxuZnVuY3Rpb24gZGVlcENsb25lIChvYmopIHtcbiAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSlcbn1cblxuZnVuY3Rpb24gaXNBc3luY0l0ZXJhYmxlIChvYmopIHtcbiAgcmV0dXJuICEhKG9iaiAhPSBudWxsICYmIHR5cGVvZiBvYmpbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nKVxufVxuXG5mdW5jdGlvbiBpc0l0ZXJhYmxlIChvYmopIHtcbiAgcmV0dXJuICEhKG9iaiAhPSBudWxsICYmICh0eXBlb2Ygb2JqW1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIG9ialtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPT09ICdmdW5jdGlvbicpKVxufVxuXG5mdW5jdGlvbiBib2R5TGVuZ3RoIChib2R5KSB7XG4gIGlmIChib2R5ID09IG51bGwpIHtcbiAgICByZXR1cm4gMFxuICB9IGVsc2UgaWYgKGlzU3RyZWFtKGJvZHkpKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBib2R5Ll9yZWFkYWJsZVN0YXRlXG4gICAgcmV0dXJuIHN0YXRlICYmIHN0YXRlLm9iamVjdE1vZGUgPT09IGZhbHNlICYmIHN0YXRlLmVuZGVkID09PSB0cnVlICYmIE51bWJlci5pc0Zpbml0ZShzdGF0ZS5sZW5ndGgpXG4gICAgICA/IHN0YXRlLmxlbmd0aFxuICAgICAgOiBudWxsXG4gIH0gZWxzZSBpZiAoaXNCbG9iTGlrZShib2R5KSkge1xuICAgIHJldHVybiBib2R5LnNpemUgIT0gbnVsbCA/IGJvZHkuc2l6ZSA6IG51bGxcbiAgfSBlbHNlIGlmIChpc0J1ZmZlcihib2R5KSkge1xuICAgIHJldHVybiBib2R5LmJ5dGVMZW5ndGhcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIGlzRGVzdHJveWVkIChzdHJlYW0pIHtcbiAgcmV0dXJuICFzdHJlYW0gfHwgISEoc3RyZWFtLmRlc3Ryb3llZCB8fCBzdHJlYW1ba0Rlc3Ryb3llZF0pXG59XG5cbmZ1bmN0aW9uIGlzUmVhZGFibGVBYm9ydGVkIChzdHJlYW0pIHtcbiAgY29uc3Qgc3RhdGUgPSBzdHJlYW0gJiYgc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gIHJldHVybiBpc0Rlc3Ryb3llZChzdHJlYW0pICYmIHN0YXRlICYmICFzdGF0ZS5lbmRFbWl0dGVkXG59XG5cbmZ1bmN0aW9uIGRlc3Ryb3kgKHN0cmVhbSwgZXJyKSB7XG4gIGlmIChzdHJlYW0gPT0gbnVsbCB8fCAhaXNTdHJlYW0oc3RyZWFtKSB8fCBpc0Rlc3Ryb3llZChzdHJlYW0pKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAodHlwZW9mIHN0cmVhbS5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihzdHJlYW0pLmNvbnN0cnVjdG9yID09PSBJbmNvbWluZ01lc3NhZ2UpIHtcbiAgICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL3B1bGwvMzg1MDUvZmlsZXNcbiAgICAgIHN0cmVhbS5zb2NrZXQgPSBudWxsXG4gICAgfVxuXG4gICAgc3RyZWFtLmRlc3Ryb3koZXJyKVxuICB9IGVsc2UgaWYgKGVycikge1xuICAgIHByb2Nlc3MubmV4dFRpY2soKHN0cmVhbSwgZXJyKSA9PiB7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpXG4gICAgfSwgc3RyZWFtLCBlcnIpXG4gIH1cblxuICBpZiAoc3RyZWFtLmRlc3Ryb3llZCAhPT0gdHJ1ZSkge1xuICAgIHN0cmVhbVtrRGVzdHJveWVkXSA9IHRydWVcbiAgfVxufVxuXG5jb25zdCBLRUVQQUxJVkVfVElNRU9VVF9FWFBSID0gL3RpbWVvdXQ9KFxcZCspL1xuZnVuY3Rpb24gcGFyc2VLZWVwQWxpdmVUaW1lb3V0ICh2YWwpIHtcbiAgY29uc3QgbSA9IHZhbC50b1N0cmluZygpLm1hdGNoKEtFRVBBTElWRV9USU1FT1VUX0VYUFIpXG4gIHJldHVybiBtID8gcGFyc2VJbnQobVsxXSwgMTApICogMTAwMCA6IG51bGxcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYSBoZWFkZXIgbmFtZSBhbmQgcmV0dXJucyBpdHMgbG93ZXJjYXNlIHZhbHVlLlxuICogQHBhcmFtIHtzdHJpbmcgfCBCdWZmZXJ9IHZhbHVlIEhlYWRlciBuYW1lXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBoZWFkZXJOYW1lVG9TdHJpbmcgKHZhbHVlKSB7XG4gIHJldHVybiBoZWFkZXJOYW1lTG93ZXJDYXNlZFJlY29yZFt2YWx1ZV0gfHwgdmFsdWUudG9Mb3dlckNhc2UoKVxufVxuXG5mdW5jdGlvbiBwYXJzZUhlYWRlcnMgKGhlYWRlcnMsIG9iaiA9IHt9KSB7XG4gIC8vIEZvciBIMiBzdXBwb3J0XG4gIGlmICghQXJyYXkuaXNBcnJheShoZWFkZXJzKSkgcmV0dXJuIGhlYWRlcnNcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICBjb25zdCBrZXkgPSBoZWFkZXJzW2ldLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKVxuICAgIGxldCB2YWwgPSBvYmpba2V5XVxuXG4gICAgaWYgKCF2YWwpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGhlYWRlcnNbaSArIDFdKSkge1xuICAgICAgICBvYmpba2V5XSA9IGhlYWRlcnNbaSArIDFdLm1hcCh4ID0+IHgudG9TdHJpbmcoJ3V0ZjgnKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9ialtrZXldID0gaGVhZGVyc1tpICsgMV0udG9TdHJpbmcoJ3V0ZjgnKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICB2YWwgPSBbdmFsXVxuICAgICAgICBvYmpba2V5XSA9IHZhbFxuICAgICAgfVxuICAgICAgdmFsLnB1c2goaGVhZGVyc1tpICsgMV0udG9TdHJpbmcoJ3V0ZjgnKSlcbiAgICB9XG4gIH1cblxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL3B1bGwvNDY1MjhcbiAgaWYgKCdjb250ZW50LWxlbmd0aCcgaW4gb2JqICYmICdjb250ZW50LWRpc3Bvc2l0aW9uJyBpbiBvYmopIHtcbiAgICBvYmpbJ2NvbnRlbnQtZGlzcG9zaXRpb24nXSA9IEJ1ZmZlci5mcm9tKG9ialsnY29udGVudC1kaXNwb3NpdGlvbiddKS50b1N0cmluZygnbGF0aW4xJylcbiAgfVxuXG4gIHJldHVybiBvYmpcbn1cblxuZnVuY3Rpb24gcGFyc2VSYXdIZWFkZXJzIChoZWFkZXJzKSB7XG4gIGNvbnN0IHJldCA9IFtdXG4gIGxldCBoYXNDb250ZW50TGVuZ3RoID0gZmFsc2VcbiAgbGV0IGNvbnRlbnREaXNwb3NpdGlvbklkeCA9IC0xXG5cbiAgZm9yIChsZXQgbiA9IDA7IG4gPCBoZWFkZXJzLmxlbmd0aDsgbiArPSAyKSB7XG4gICAgY29uc3Qga2V5ID0gaGVhZGVyc1tuICsgMF0udG9TdHJpbmcoKVxuICAgIGNvbnN0IHZhbCA9IGhlYWRlcnNbbiArIDFdLnRvU3RyaW5nKCd1dGY4JylcblxuICAgIGlmIChrZXkubGVuZ3RoID09PSAxNCAmJiAoa2V5ID09PSAnY29udGVudC1sZW5ndGgnIHx8IGtleS50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC1sZW5ndGgnKSkge1xuICAgICAgcmV0LnB1c2goa2V5LCB2YWwpXG4gICAgICBoYXNDb250ZW50TGVuZ3RoID0gdHJ1ZVxuICAgIH0gZWxzZSBpZiAoa2V5Lmxlbmd0aCA9PT0gMTkgJiYgKGtleSA9PT0gJ2NvbnRlbnQtZGlzcG9zaXRpb24nIHx8IGtleS50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC1kaXNwb3NpdGlvbicpKSB7XG4gICAgICBjb250ZW50RGlzcG9zaXRpb25JZHggPSByZXQucHVzaChrZXksIHZhbCkgLSAxXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldC5wdXNoKGtleSwgdmFsKVxuICAgIH1cbiAgfVxuXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvcHVsbC80NjUyOFxuICBpZiAoaGFzQ29udGVudExlbmd0aCAmJiBjb250ZW50RGlzcG9zaXRpb25JZHggIT09IC0xKSB7XG4gICAgcmV0W2NvbnRlbnREaXNwb3NpdGlvbklkeF0gPSBCdWZmZXIuZnJvbShyZXRbY29udGVudERpc3Bvc2l0aW9uSWR4XSkudG9TdHJpbmcoJ2xhdGluMScpXG4gIH1cblxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGlzQnVmZmVyIChidWZmZXIpIHtcbiAgLy8gU2VlLCBodHRwczovL2dpdGh1Yi5jb20vbWNvbGxpbmEvdW5kaWNpL3B1bGwvMzE5XG4gIHJldHVybiBidWZmZXIgaW5zdGFuY2VvZiBVaW50OEFycmF5IHx8IEJ1ZmZlci5pc0J1ZmZlcihidWZmZXIpXG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlSGFuZGxlciAoaGFuZGxlciwgbWV0aG9kLCB1cGdyYWRlKSB7XG4gIGlmICghaGFuZGxlciB8fCB0eXBlb2YgaGFuZGxlciAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2hhbmRsZXIgbXVzdCBiZSBhbiBvYmplY3QnKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBoYW5kbGVyLm9uQ29ubmVjdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvbkNvbm5lY3QgbWV0aG9kJylcbiAgfVxuXG4gIGlmICh0eXBlb2YgaGFuZGxlci5vbkVycm9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9uRXJyb3IgbWV0aG9kJylcbiAgfVxuXG4gIGlmICh0eXBlb2YgaGFuZGxlci5vbkJvZHlTZW50ICE9PSAnZnVuY3Rpb24nICYmIGhhbmRsZXIub25Cb2R5U2VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9uQm9keVNlbnQgbWV0aG9kJylcbiAgfVxuXG4gIGlmICh1cGdyYWRlIHx8IG1ldGhvZCA9PT0gJ0NPTk5FQ1QnKSB7XG4gICAgaWYgKHR5cGVvZiBoYW5kbGVyLm9uVXBncmFkZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9uVXBncmFkZSBtZXRob2QnKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIGhhbmRsZXIub25IZWFkZXJzICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgb25IZWFkZXJzIG1ldGhvZCcpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBoYW5kbGVyLm9uRGF0YSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9uRGF0YSBtZXRob2QnKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaGFuZGxlci5vbkNvbXBsZXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgb25Db21wbGV0ZSBtZXRob2QnKVxuICAgIH1cbiAgfVxufVxuXG4vLyBBIGJvZHkgaXMgZGlzdHVyYmVkIGlmIGl0IGhhcyBiZWVuIHJlYWQgZnJvbSBhbmQgaXQgY2Fubm90XG4vLyBiZSByZS11c2VkIHdpdGhvdXQgbG9zaW5nIHN0YXRlIG9yIGRhdGEuXG5mdW5jdGlvbiBpc0Rpc3R1cmJlZCAoYm9keSkge1xuICByZXR1cm4gISEoYm9keSAmJiAoXG4gICAgc3RyZWFtLmlzRGlzdHVyYmVkXG4gICAgICA/IHN0cmVhbS5pc0Rpc3R1cmJlZChib2R5KSB8fCBib2R5W2tCb2R5VXNlZF0gLy8gVE9ETyAoZml4KTogV2h5IGlzIGJvZHlba0JvZHlVc2VkXSBuZWVkZWQ/XG4gICAgICA6IGJvZHlba0JvZHlVc2VkXSB8fFxuICAgICAgICBib2R5LnJlYWRhYmxlRGlkUmVhZCB8fFxuICAgICAgICAoYm9keS5fcmVhZGFibGVTdGF0ZSAmJiBib2R5Ll9yZWFkYWJsZVN0YXRlLmRhdGFFbWl0dGVkKSB8fFxuICAgICAgICBpc1JlYWRhYmxlQWJvcnRlZChib2R5KVxuICApKVxufVxuXG5mdW5jdGlvbiBpc0Vycm9yZWQgKGJvZHkpIHtcbiAgcmV0dXJuICEhKGJvZHkgJiYgKFxuICAgIHN0cmVhbS5pc0Vycm9yZWRcbiAgICAgID8gc3RyZWFtLmlzRXJyb3JlZChib2R5KVxuICAgICAgOiAvc3RhdGU6ICdlcnJvcmVkJy8udGVzdChub2RlVXRpbC5pbnNwZWN0KGJvZHkpXG4gICAgICApKSlcbn1cblxuZnVuY3Rpb24gaXNSZWFkYWJsZSAoYm9keSkge1xuICByZXR1cm4gISEoYm9keSAmJiAoXG4gICAgc3RyZWFtLmlzUmVhZGFibGVcbiAgICAgID8gc3RyZWFtLmlzUmVhZGFibGUoYm9keSlcbiAgICAgIDogL3N0YXRlOiAncmVhZGFibGUnLy50ZXN0KG5vZGVVdGlsLmluc3BlY3QoYm9keSlcbiAgICAgICkpKVxufVxuXG5mdW5jdGlvbiBnZXRTb2NrZXRJbmZvIChzb2NrZXQpIHtcbiAgcmV0dXJuIHtcbiAgICBsb2NhbEFkZHJlc3M6IHNvY2tldC5sb2NhbEFkZHJlc3MsXG4gICAgbG9jYWxQb3J0OiBzb2NrZXQubG9jYWxQb3J0LFxuICAgIHJlbW90ZUFkZHJlc3M6IHNvY2tldC5yZW1vdGVBZGRyZXNzLFxuICAgIHJlbW90ZVBvcnQ6IHNvY2tldC5yZW1vdGVQb3J0LFxuICAgIHJlbW90ZUZhbWlseTogc29ja2V0LnJlbW90ZUZhbWlseSxcbiAgICB0aW1lb3V0OiBzb2NrZXQudGltZW91dCxcbiAgICBieXRlc1dyaXR0ZW46IHNvY2tldC5ieXRlc1dyaXR0ZW4sXG4gICAgYnl0ZXNSZWFkOiBzb2NrZXQuYnl0ZXNSZWFkXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gKiBjb252ZXJ0SXRlcmFibGVUb0J1ZmZlciAoaXRlcmFibGUpIHtcbiAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBpdGVyYWJsZSkge1xuICAgIHlpZWxkIEJ1ZmZlci5pc0J1ZmZlcihjaHVuaykgPyBjaHVuayA6IEJ1ZmZlci5mcm9tKGNodW5rKVxuICB9XG59XG5cbmxldCBSZWFkYWJsZVN0cmVhbVxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1Gcm9tIChpdGVyYWJsZSkge1xuICBpZiAoIVJlYWRhYmxlU3RyZWFtKSB7XG4gICAgUmVhZGFibGVTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0vd2ViJykuUmVhZGFibGVTdHJlYW1cbiAgfVxuXG4gIGlmIChSZWFkYWJsZVN0cmVhbS5mcm9tKSB7XG4gICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtLmZyb20oY29udmVydEl0ZXJhYmxlVG9CdWZmZXIoaXRlcmFibGUpKVxuICB9XG5cbiAgbGV0IGl0ZXJhdG9yXG4gIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oXG4gICAge1xuICAgICAgYXN5bmMgc3RhcnQgKCkge1xuICAgICAgICBpdGVyYXRvciA9IGl0ZXJhYmxlW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpXG4gICAgICB9LFxuICAgICAgYXN5bmMgcHVsbCAoY29udHJvbGxlcikge1xuICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCBpdGVyYXRvci5uZXh0KClcbiAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKClcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkgPyB2YWx1ZSA6IEJ1ZmZlci5mcm9tKHZhbHVlKVxuICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShuZXcgVWludDhBcnJheShidWYpKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLmRlc2lyZWRTaXplID4gMFxuICAgICAgfSxcbiAgICAgIGFzeW5jIGNhbmNlbCAocmVhc29uKSB7XG4gICAgICAgIGF3YWl0IGl0ZXJhdG9yLnJldHVybigpXG4gICAgICB9XG4gICAgfSxcbiAgICAwXG4gIClcbn1cblxuLy8gVGhlIGNodW5rIHNob3VsZCBiZSBhIEZvcm1EYXRhIGluc3RhbmNlIGFuZCBjb250YWluc1xuLy8gYWxsIHRoZSByZXF1aXJlZCBtZXRob2RzLlxuZnVuY3Rpb24gaXNGb3JtRGF0YUxpa2UgKG9iamVjdCkge1xuICByZXR1cm4gKFxuICAgIG9iamVjdCAmJlxuICAgIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmXG4gICAgdHlwZW9mIG9iamVjdC5hcHBlbmQgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2Ygb2JqZWN0LmRlbGV0ZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBvYmplY3QuZ2V0ID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIG9iamVjdC5nZXRBbGwgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2Ygb2JqZWN0LmhhcyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBvYmplY3Quc2V0ID09PSAnZnVuY3Rpb24nICYmXG4gICAgb2JqZWN0W1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdGb3JtRGF0YSdcbiAgKVxufVxuXG5mdW5jdGlvbiB0aHJvd0lmQWJvcnRlZCAoc2lnbmFsKSB7XG4gIGlmICghc2lnbmFsKSB7IHJldHVybiB9XG4gIGlmICh0eXBlb2Ygc2lnbmFsLnRocm93SWZBYm9ydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc2lnbmFsLnRocm93SWZBYm9ydGVkKClcbiAgfSBlbHNlIHtcbiAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIC8vIERPTUV4Y2VwdGlvbiBub3QgYXZhaWxhYmxlIDwgdjE3LjAuMFxuICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKCdUaGUgb3BlcmF0aW9uIHdhcyBhYm9ydGVkJylcbiAgICAgIGVyci5uYW1lID0gJ0Fib3J0RXJyb3InXG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkQWJvcnRMaXN0ZW5lciAoc2lnbmFsLCBsaXN0ZW5lcikge1xuICBpZiAoJ2FkZEV2ZW50TGlzdGVuZXInIGluIHNpZ25hbCkge1xuICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGxpc3RlbmVyLCB7IG9uY2U6IHRydWUgfSlcbiAgICByZXR1cm4gKCkgPT4gc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgbGlzdGVuZXIpXG4gIH1cbiAgc2lnbmFsLmFkZExpc3RlbmVyKCdhYm9ydCcsIGxpc3RlbmVyKVxuICByZXR1cm4gKCkgPT4gc2lnbmFsLnJlbW92ZUxpc3RlbmVyKCdhYm9ydCcsIGxpc3RlbmVyKVxufVxuXG5jb25zdCBoYXNUb1dlbGxGb3JtZWQgPSAhIVN0cmluZy5wcm90b3R5cGUudG9XZWxsRm9ybWVkXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbFxuICovXG5mdW5jdGlvbiB0b1VTVlN0cmluZyAodmFsKSB7XG4gIGlmIChoYXNUb1dlbGxGb3JtZWQpIHtcbiAgICByZXR1cm4gYCR7dmFsfWAudG9XZWxsRm9ybWVkKClcbiAgfSBlbHNlIGlmIChub2RlVXRpbC50b1VTVlN0cmluZykge1xuICAgIHJldHVybiBub2RlVXRpbC50b1VTVlN0cmluZyh2YWwpXG4gIH1cblxuICByZXR1cm4gYCR7dmFsfWBcbn1cblxuLy8gUGFyc2VkIGFjY29yZGluZ2x5IHRvIFJGQyA5MTEwXG4vLyBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjOTExMCNmaWVsZC5jb250ZW50LXJhbmdlXG5mdW5jdGlvbiBwYXJzZVJhbmdlSGVhZGVyIChyYW5nZSkge1xuICBpZiAocmFuZ2UgPT0gbnVsbCB8fCByYW5nZSA9PT0gJycpIHJldHVybiB7IHN0YXJ0OiAwLCBlbmQ6IG51bGwsIHNpemU6IG51bGwgfVxuXG4gIGNvbnN0IG0gPSByYW5nZSA/IHJhbmdlLm1hdGNoKC9eYnl0ZXMgKFxcZCspLShcXGQrKVxcLyhcXGQrKT8kLykgOiBudWxsXG4gIHJldHVybiBtXG4gICAgPyB7XG4gICAgICAgIHN0YXJ0OiBwYXJzZUludChtWzFdKSxcbiAgICAgICAgZW5kOiBtWzJdID8gcGFyc2VJbnQobVsyXSkgOiBudWxsLFxuICAgICAgICBzaXplOiBtWzNdID8gcGFyc2VJbnQobVszXSkgOiBudWxsXG4gICAgICB9XG4gICAgOiBudWxsXG59XG5cbmNvbnN0IGtFbnVtZXJhYmxlUHJvcGVydHkgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5rRW51bWVyYWJsZVByb3BlcnR5LmVudW1lcmFibGUgPSB0cnVlXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBub3AsXG4gIGlzRGlzdHVyYmVkLFxuICBpc0Vycm9yZWQsXG4gIGlzUmVhZGFibGUsXG4gIHRvVVNWU3RyaW5nLFxuICBpc1JlYWRhYmxlQWJvcnRlZCxcbiAgaXNCbG9iTGlrZSxcbiAgcGFyc2VPcmlnaW4sXG4gIHBhcnNlVVJMLFxuICBnZXRTZXJ2ZXJOYW1lLFxuICBpc1N0cmVhbSxcbiAgaXNJdGVyYWJsZSxcbiAgaXNBc3luY0l0ZXJhYmxlLFxuICBpc0Rlc3Ryb3llZCxcbiAgaGVhZGVyTmFtZVRvU3RyaW5nLFxuICBwYXJzZVJhd0hlYWRlcnMsXG4gIHBhcnNlSGVhZGVycyxcbiAgcGFyc2VLZWVwQWxpdmVUaW1lb3V0LFxuICBkZXN0cm95LFxuICBib2R5TGVuZ3RoLFxuICBkZWVwQ2xvbmUsXG4gIFJlYWRhYmxlU3RyZWFtRnJvbSxcbiAgaXNCdWZmZXIsXG4gIHZhbGlkYXRlSGFuZGxlcixcbiAgZ2V0U29ja2V0SW5mbyxcbiAgaXNGb3JtRGF0YUxpa2UsXG4gIGJ1aWxkVVJMLFxuICB0aHJvd0lmQWJvcnRlZCxcbiAgYWRkQWJvcnRMaXN0ZW5lcixcbiAgcGFyc2VSYW5nZUhlYWRlcixcbiAgbm9kZU1ham9yLFxuICBub2RlTWlub3IsXG4gIG5vZGVIYXNBdXRvU2VsZWN0RmFtaWx5OiBub2RlTWFqb3IgPiAxOCB8fCAobm9kZU1ham9yID09PSAxOCAmJiBub2RlTWlub3IgPj0gMTMpLFxuICBzYWZlSFRUUE1ldGhvZHM6IFsnR0VUJywgJ0hFQUQnLCAnT1BUSU9OUycsICdUUkFDRSddXG59XG4iLCIndXNlIHN0cmljdCdcblxubGV0IGZhc3ROb3cgPSBEYXRlLm5vdygpXG5sZXQgZmFzdE5vd1RpbWVvdXRcblxuY29uc3QgZmFzdFRpbWVycyA9IFtdXG5cbmZ1bmN0aW9uIG9uVGltZW91dCAoKSB7XG4gIGZhc3ROb3cgPSBEYXRlLm5vdygpXG5cbiAgbGV0IGxlbiA9IGZhc3RUaW1lcnMubGVuZ3RoXG4gIGxldCBpZHggPSAwXG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBjb25zdCB0aW1lciA9IGZhc3RUaW1lcnNbaWR4XVxuXG4gICAgaWYgKHRpbWVyLnN0YXRlID09PSAwKSB7XG4gICAgICB0aW1lci5zdGF0ZSA9IGZhc3ROb3cgKyB0aW1lci5kZWxheVxuICAgIH0gZWxzZSBpZiAodGltZXIuc3RhdGUgPiAwICYmIGZhc3ROb3cgPj0gdGltZXIuc3RhdGUpIHtcbiAgICAgIHRpbWVyLnN0YXRlID0gLTFcbiAgICAgIHRpbWVyLmNhbGxiYWNrKHRpbWVyLm9wYXF1ZSlcbiAgICB9XG5cbiAgICBpZiAodGltZXIuc3RhdGUgPT09IC0xKSB7XG4gICAgICB0aW1lci5zdGF0ZSA9IC0yXG4gICAgICBpZiAoaWR4ICE9PSBsZW4gLSAxKSB7XG4gICAgICAgIGZhc3RUaW1lcnNbaWR4XSA9IGZhc3RUaW1lcnMucG9wKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZhc3RUaW1lcnMucG9wKClcbiAgICAgIH1cbiAgICAgIGxlbiAtPSAxXG4gICAgfSBlbHNlIHtcbiAgICAgIGlkeCArPSAxXG4gICAgfVxuICB9XG5cbiAgaWYgKGZhc3RUaW1lcnMubGVuZ3RoID4gMCkge1xuICAgIHJlZnJlc2hUaW1lb3V0KClcbiAgfVxufVxuXG5mdW5jdGlvbiByZWZyZXNoVGltZW91dCAoKSB7XG4gIGlmIChmYXN0Tm93VGltZW91dCAmJiBmYXN0Tm93VGltZW91dC5yZWZyZXNoKSB7XG4gICAgZmFzdE5vd1RpbWVvdXQucmVmcmVzaCgpXG4gIH0gZWxzZSB7XG4gICAgY2xlYXJUaW1lb3V0KGZhc3ROb3dUaW1lb3V0KVxuICAgIGZhc3ROb3dUaW1lb3V0ID0gc2V0VGltZW91dChvblRpbWVvdXQsIDFlMylcbiAgICBpZiAoZmFzdE5vd1RpbWVvdXQudW5yZWYpIHtcbiAgICAgIGZhc3ROb3dUaW1lb3V0LnVucmVmKClcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgVGltZW91dCB7XG4gIGNvbnN0cnVjdG9yIChjYWxsYmFjaywgZGVsYXksIG9wYXF1ZSkge1xuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHRoaXMuZGVsYXkgPSBkZWxheVxuICAgIHRoaXMub3BhcXVlID0gb3BhcXVlXG5cbiAgICAvLyAgLTIgbm90IGluIHRpbWVyIGxpc3RcbiAgICAvLyAgLTEgaW4gdGltZXIgbGlzdCBidXQgaW5hY3RpdmVcbiAgICAvLyAgIDAgaW4gdGltZXIgbGlzdCB3YWl0aW5nIGZvciB0aW1lXG4gICAgLy8gPiAwIGluIHRpbWVyIGxpc3Qgd2FpdGluZyBmb3IgdGltZSB0byBleHBpcmVcbiAgICB0aGlzLnN0YXRlID0gLTJcblxuICAgIHRoaXMucmVmcmVzaCgpXG4gIH1cblxuICByZWZyZXNoICgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gLTIpIHtcbiAgICAgIGZhc3RUaW1lcnMucHVzaCh0aGlzKVxuICAgICAgaWYgKCFmYXN0Tm93VGltZW91dCB8fCBmYXN0VGltZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZWZyZXNoVGltZW91dCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZSA9IDBcbiAgfVxuXG4gIGNsZWFyICgpIHtcbiAgICB0aGlzLnN0YXRlID0gLTFcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0VGltZW91dCAoY2FsbGJhY2ssIGRlbGF5LCBvcGFxdWUpIHtcbiAgICByZXR1cm4gZGVsYXkgPCAxZTNcbiAgICAgID8gc2V0VGltZW91dChjYWxsYmFjaywgZGVsYXksIG9wYXF1ZSlcbiAgICAgIDogbmV3IFRpbWVvdXQoY2FsbGJhY2ssIGRlbGF5LCBvcGFxdWUpXG4gIH0sXG4gIGNsZWFyVGltZW91dCAodGltZW91dCkge1xuICAgIGlmICh0aW1lb3V0IGluc3RhbmNlb2YgVGltZW91dCkge1xuICAgICAgdGltZW91dC5jbGVhcigpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KVxuICAgIH1cbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogQ29weXJpZ2h0IEJyaWFuIFdoaXRlLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21zY2RleC9zdHJlYW1zZWFyY2hcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuICogZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbiAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuICogc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lOR1xuICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HU1xuICogSU4gVEhFIFNPRlRXQVJFLlxuICpcbiAqIEJhc2VkIGhlYXZpbHkgb24gdGhlIFN0cmVhbWluZyBCb3llci1Nb29yZS1Ib3JzcG9vbCBDKysgaW1wbGVtZW50YXRpb25cbiAqIGJ5IEhvbmdsaSBMYWkgYXQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9Gb29CYXJXaWRnZXQvYm95ZXItbW9vcmUtaG9yc3Bvb2xcbiAqL1xuY29uc3QgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnbm9kZTpldmVudHMnKS5FdmVudEVtaXR0ZXJcbmNvbnN0IGluaGVyaXRzID0gcmVxdWlyZSgnbm9kZTp1dGlsJykuaW5oZXJpdHNcblxuZnVuY3Rpb24gU0JNSCAobmVlZGxlKSB7XG4gIGlmICh0eXBlb2YgbmVlZGxlID09PSAnc3RyaW5nJykge1xuICAgIG5lZWRsZSA9IEJ1ZmZlci5mcm9tKG5lZWRsZSlcbiAgfVxuXG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKG5lZWRsZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgbmVlZGxlIGhhcyB0byBiZSBhIFN0cmluZyBvciBhIEJ1ZmZlci4nKVxuICB9XG5cbiAgY29uc3QgbmVlZGxlTGVuZ3RoID0gbmVlZGxlLmxlbmd0aFxuXG4gIGlmIChuZWVkbGVMZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBuZWVkbGUgY2Fubm90IGJlIGFuIGVtcHR5IFN0cmluZy9CdWZmZXIuJylcbiAgfVxuXG4gIGlmIChuZWVkbGVMZW5ndGggPiAyNTYpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBuZWVkbGUgY2Fubm90IGhhdmUgYSBsZW5ndGggYmlnZ2VyIHRoYW4gMjU2LicpXG4gIH1cblxuICB0aGlzLm1heE1hdGNoZXMgPSBJbmZpbml0eVxuICB0aGlzLm1hdGNoZXMgPSAwXG5cbiAgdGhpcy5fb2NjID0gbmV3IEFycmF5KDI1NilcbiAgICAuZmlsbChuZWVkbGVMZW5ndGgpIC8vIEluaXRpYWxpemUgb2NjdXJyZW5jZSB0YWJsZS5cbiAgdGhpcy5fbG9va2JlaGluZF9zaXplID0gMFxuICB0aGlzLl9uZWVkbGUgPSBuZWVkbGVcbiAgdGhpcy5fYnVmcG9zID0gMFxuXG4gIHRoaXMuX2xvb2tiZWhpbmQgPSBCdWZmZXIuYWxsb2MobmVlZGxlTGVuZ3RoKVxuXG4gIC8vIFBvcHVsYXRlIG9jY3VycmVuY2UgdGFibGUgd2l0aCBhbmFseXNpcyBvZiB0aGUgbmVlZGxlLFxuICAvLyBpZ25vcmluZyBsYXN0IGxldHRlci5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZWVkbGVMZW5ndGggLSAxOyArK2kpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby12YXJcbiAgICB0aGlzLl9vY2NbbmVlZGxlW2ldXSA9IG5lZWRsZUxlbmd0aCAtIDEgLSBpXG4gIH1cbn1cbmluaGVyaXRzKFNCTUgsIEV2ZW50RW1pdHRlcilcblxuU0JNSC5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX2xvb2tiZWhpbmRfc2l6ZSA9IDBcbiAgdGhpcy5tYXRjaGVzID0gMFxuICB0aGlzLl9idWZwb3MgPSAwXG59XG5cblNCTUgucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIHBvcykge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIHtcbiAgICBjaHVuayA9IEJ1ZmZlci5mcm9tKGNodW5rLCAnYmluYXJ5JylcbiAgfVxuICBjb25zdCBjaGxlbiA9IGNodW5rLmxlbmd0aFxuICB0aGlzLl9idWZwb3MgPSBwb3MgfHwgMFxuICBsZXQgclxuICB3aGlsZSAociAhPT0gY2hsZW4gJiYgdGhpcy5tYXRjaGVzIDwgdGhpcy5tYXhNYXRjaGVzKSB7IHIgPSB0aGlzLl9zYm1oX2ZlZWQoY2h1bmspIH1cbiAgcmV0dXJuIHJcbn1cblxuU0JNSC5wcm90b3R5cGUuX3NibWhfZmVlZCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIGNvbnN0IGxlbiA9IGRhdGEubGVuZ3RoXG4gIGNvbnN0IG5lZWRsZSA9IHRoaXMuX25lZWRsZVxuICBjb25zdCBuZWVkbGVMZW5ndGggPSBuZWVkbGUubGVuZ3RoXG4gIGNvbnN0IGxhc3ROZWVkbGVDaGFyID0gbmVlZGxlW25lZWRsZUxlbmd0aCAtIDFdXG5cbiAgLy8gUG9zaXRpdmU6IHBvaW50cyB0byBhIHBvc2l0aW9uIGluIGBkYXRhYFxuICAvLyAgICAgICAgICAgcG9zID09IDMgcG9pbnRzIHRvIGRhdGFbM11cbiAgLy8gTmVnYXRpdmU6IHBvaW50cyB0byBhIHBvc2l0aW9uIGluIHRoZSBsb29rYmVoaW5kIGJ1ZmZlclxuICAvLyAgICAgICAgICAgcG9zID09IC0yIHBvaW50cyB0byBsb29rYmVoaW5kW2xvb2tiZWhpbmRfc2l6ZSAtIDJdXG4gIGxldCBwb3MgPSAtdGhpcy5fbG9va2JlaGluZF9zaXplXG4gIGxldCBjaFxuXG4gIGlmIChwb3MgPCAwKSB7XG4gICAgLy8gTG9va2JlaGluZCBidWZmZXIgaXMgbm90IGVtcHR5LiBQZXJmb3JtIEJveWVyLU1vb3JlLUhvcnNwb29sXG4gICAgLy8gc2VhcmNoIHdpdGggY2hhcmFjdGVyIGxvb2t1cCBjb2RlIHRoYXQgY29uc2lkZXJzIGJvdGggdGhlXG4gICAgLy8gbG9va2JlaGluZCBidWZmZXIgYW5kIHRoZSBjdXJyZW50IHJvdW5kJ3MgaGF5c3RhY2sgZGF0YS5cbiAgICAvL1xuICAgIC8vIExvb3AgdW50aWxcbiAgICAvLyAgIHRoZXJlIGlzIGEgbWF0Y2guXG4gICAgLy8gb3IgdW50aWxcbiAgICAvLyAgIHdlJ3ZlIG1vdmVkIHBhc3QgdGhlIHBvc2l0aW9uIHRoYXQgcmVxdWlyZXMgdGhlXG4gICAgLy8gICBsb29rYmVoaW5kIGJ1ZmZlci4gSW4gdGhpcyBjYXNlIHdlIHN3aXRjaCB0byB0aGVcbiAgICAvLyAgIG9wdGltaXplZCBsb29wLlxuICAgIC8vIG9yIHVudGlsXG4gICAgLy8gICB0aGUgY2hhcmFjdGVyIHRvIGxvb2sgYXQgbGllcyBvdXRzaWRlIHRoZSBoYXlzdGFjay5cbiAgICB3aGlsZSAocG9zIDwgMCAmJiBwb3MgPD0gbGVuIC0gbmVlZGxlTGVuZ3RoKSB7XG4gICAgICBjaCA9IHRoaXMuX3NibWhfbG9va3VwX2NoYXIoZGF0YSwgcG9zICsgbmVlZGxlTGVuZ3RoIC0gMSlcblxuICAgICAgaWYgKFxuICAgICAgICBjaCA9PT0gbGFzdE5lZWRsZUNoYXIgJiZcbiAgICAgICAgdGhpcy5fc2JtaF9tZW1jbXAoZGF0YSwgcG9zLCBuZWVkbGVMZW5ndGggLSAxKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuX2xvb2tiZWhpbmRfc2l6ZSA9IDBcbiAgICAgICAgKyt0aGlzLm1hdGNoZXNcbiAgICAgICAgdGhpcy5lbWl0KCdpbmZvJywgdHJ1ZSlcblxuICAgICAgICByZXR1cm4gKHRoaXMuX2J1ZnBvcyA9IHBvcyArIG5lZWRsZUxlbmd0aClcbiAgICAgIH1cbiAgICAgIHBvcyArPSB0aGlzLl9vY2NbY2hdXG4gICAgfVxuXG4gICAgLy8gTm8gbWF0Y2guXG5cbiAgICBpZiAocG9zIDwgMCkge1xuICAgICAgLy8gVGhlcmUncyB0b28gZmV3IGRhdGEgZm9yIEJveWVyLU1vb3JlLUhvcnNwb29sIHRvIHJ1bixcbiAgICAgIC8vIHNvIGxldCdzIHVzZSBhIGRpZmZlcmVudCBhbGdvcml0aG0gdG8gc2tpcCBhcyBtdWNoIGFzXG4gICAgICAvLyB3ZSBjYW4uXG4gICAgICAvLyBGb3J3YXJkIHBvcyB1bnRpbFxuICAgICAgLy8gICB0aGUgdHJhaWxpbmcgcGFydCBvZiBsb29rYmVoaW5kICsgZGF0YVxuICAgICAgLy8gICBsb29rcyBsaWtlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5lZWRsZVxuICAgICAgLy8gb3IgdW50aWxcbiAgICAgIC8vICAgcG9zID09IDBcbiAgICAgIHdoaWxlIChwb3MgPCAwICYmICF0aGlzLl9zYm1oX21lbWNtcChkYXRhLCBwb3MsIGxlbiAtIHBvcykpIHsgKytwb3MgfVxuICAgIH1cblxuICAgIGlmIChwb3MgPj0gMCkge1xuICAgICAgLy8gRGlzY2FyZCBsb29rYmVoaW5kIGJ1ZmZlci5cbiAgICAgIHRoaXMuZW1pdCgnaW5mbycsIGZhbHNlLCB0aGlzLl9sb29rYmVoaW5kLCAwLCB0aGlzLl9sb29rYmVoaW5kX3NpemUpXG4gICAgICB0aGlzLl9sb29rYmVoaW5kX3NpemUgPSAwXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEN1dCBvZmYgcGFydCBvZiB0aGUgbG9va2JlaGluZCBidWZmZXIgdGhhdCBoYXNcbiAgICAgIC8vIGJlZW4gcHJvY2Vzc2VkIGFuZCBhcHBlbmQgdGhlIGVudGlyZSBoYXlzdGFja1xuICAgICAgLy8gaW50byBpdC5cbiAgICAgIGNvbnN0IGJ5dGVzVG9DdXRPZmYgPSB0aGlzLl9sb29rYmVoaW5kX3NpemUgKyBwb3NcbiAgICAgIGlmIChieXRlc1RvQ3V0T2ZmID4gMCkge1xuICAgICAgICAvLyBUaGUgY3V0IG9mZiBkYXRhIGlzIGd1YXJhbnRlZWQgbm90IHRvIGNvbnRhaW4gdGhlIG5lZWRsZS5cbiAgICAgICAgdGhpcy5lbWl0KCdpbmZvJywgZmFsc2UsIHRoaXMuX2xvb2tiZWhpbmQsIDAsIGJ5dGVzVG9DdXRPZmYpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2xvb2tiZWhpbmQuY29weSh0aGlzLl9sb29rYmVoaW5kLCAwLCBieXRlc1RvQ3V0T2ZmLFxuICAgICAgICB0aGlzLl9sb29rYmVoaW5kX3NpemUgLSBieXRlc1RvQ3V0T2ZmKVxuICAgICAgdGhpcy5fbG9va2JlaGluZF9zaXplIC09IGJ5dGVzVG9DdXRPZmZcblxuICAgICAgZGF0YS5jb3B5KHRoaXMuX2xvb2tiZWhpbmQsIHRoaXMuX2xvb2tiZWhpbmRfc2l6ZSlcbiAgICAgIHRoaXMuX2xvb2tiZWhpbmRfc2l6ZSArPSBsZW5cblxuICAgICAgdGhpcy5fYnVmcG9zID0gbGVuXG4gICAgICByZXR1cm4gbGVuXG4gICAgfVxuICB9XG5cbiAgcG9zICs9IChwb3MgPj0gMCkgKiB0aGlzLl9idWZwb3NcblxuICAvLyBMb29rYmVoaW5kIGJ1ZmZlciBpcyBub3cgZW1wdHkuIFdlIG9ubHkgbmVlZCB0byBjaGVjayBpZiB0aGVcbiAgLy8gbmVlZGxlIGlzIGluIHRoZSBoYXlzdGFjay5cbiAgaWYgKGRhdGEuaW5kZXhPZihuZWVkbGUsIHBvcykgIT09IC0xKSB7XG4gICAgcG9zID0gZGF0YS5pbmRleE9mKG5lZWRsZSwgcG9zKVxuICAgICsrdGhpcy5tYXRjaGVzXG4gICAgaWYgKHBvcyA+IDApIHsgdGhpcy5lbWl0KCdpbmZvJywgdHJ1ZSwgZGF0YSwgdGhpcy5fYnVmcG9zLCBwb3MpIH0gZWxzZSB7IHRoaXMuZW1pdCgnaW5mbycsIHRydWUpIH1cblxuICAgIHJldHVybiAodGhpcy5fYnVmcG9zID0gcG9zICsgbmVlZGxlTGVuZ3RoKVxuICB9IGVsc2Uge1xuICAgIHBvcyA9IGxlbiAtIG5lZWRsZUxlbmd0aFxuICB9XG5cbiAgLy8gVGhlcmUgd2FzIG5vIG1hdGNoLiBJZiB0aGVyZSdzIHRyYWlsaW5nIGhheXN0YWNrIGRhdGEgdGhhdCB3ZSBjYW5ub3RcbiAgLy8gbWF0Y2ggeWV0IHVzaW5nIHRoZSBCb3llci1Nb29yZS1Ib3JzcG9vbCBhbGdvcml0aG0gKGJlY2F1c2UgdGhlIHRyYWlsaW5nXG4gIC8vIGRhdGEgaXMgbGVzcyB0aGFuIHRoZSBuZWVkbGUgc2l6ZSkgdGhlbiBtYXRjaCB1c2luZyBhIG1vZGlmaWVkXG4gIC8vIGFsZ29yaXRobSB0aGF0IHN0YXJ0cyBtYXRjaGluZyBmcm9tIHRoZSBiZWdpbm5pbmcgaW5zdGVhZCBvZiB0aGUgZW5kLlxuICAvLyBXaGF0ZXZlciB0cmFpbGluZyBkYXRhIGlzIGxlZnQgYWZ0ZXIgcnVubmluZyB0aGlzIGFsZ29yaXRobSBpcyBhZGRlZCB0b1xuICAvLyB0aGUgbG9va2JlaGluZCBidWZmZXIuXG4gIHdoaWxlIChcbiAgICBwb3MgPCBsZW4gJiZcbiAgICAoXG4gICAgICBkYXRhW3Bvc10gIT09IG5lZWRsZVswXSB8fFxuICAgICAgKFxuICAgICAgICAoQnVmZmVyLmNvbXBhcmUoXG4gICAgICAgICAgZGF0YS5zdWJhcnJheShwb3MsIHBvcyArIGxlbiAtIHBvcyksXG4gICAgICAgICAgbmVlZGxlLnN1YmFycmF5KDAsIGxlbiAtIHBvcylcbiAgICAgICAgKSAhPT0gMClcbiAgICAgIClcbiAgICApXG4gICkge1xuICAgICsrcG9zXG4gIH1cbiAgaWYgKHBvcyA8IGxlbikge1xuICAgIGRhdGEuY29weSh0aGlzLl9sb29rYmVoaW5kLCAwLCBwb3MsIHBvcyArIChsZW4gLSBwb3MpKVxuICAgIHRoaXMuX2xvb2tiZWhpbmRfc2l6ZSA9IGxlbiAtIHBvc1xuICB9XG5cbiAgLy8gRXZlcnl0aGluZyB1bnRpbCBwb3MgaXMgZ3VhcmFudGVlZCBub3QgdG8gY29udGFpbiBuZWVkbGUgZGF0YS5cbiAgaWYgKHBvcyA+IDApIHsgdGhpcy5lbWl0KCdpbmZvJywgZmFsc2UsIGRhdGEsIHRoaXMuX2J1ZnBvcywgcG9zIDwgbGVuID8gcG9zIDogbGVuKSB9XG5cbiAgdGhpcy5fYnVmcG9zID0gbGVuXG4gIHJldHVybiBsZW5cbn1cblxuU0JNSC5wcm90b3R5cGUuX3NibWhfbG9va3VwX2NoYXIgPSBmdW5jdGlvbiAoZGF0YSwgcG9zKSB7XG4gIHJldHVybiAocG9zIDwgMClcbiAgICA/IHRoaXMuX2xvb2tiZWhpbmRbdGhpcy5fbG9va2JlaGluZF9zaXplICsgcG9zXVxuICAgIDogZGF0YVtwb3NdXG59XG5cblNCTUgucHJvdG90eXBlLl9zYm1oX21lbWNtcCA9IGZ1bmN0aW9uIChkYXRhLCBwb3MsIGxlbikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdmFyXG4gICAgaWYgKHRoaXMuX3NibWhfbG9va3VwX2NoYXIoZGF0YSwgcG9zICsgaSkgIT09IHRoaXMuX25lZWRsZVtpXSkgeyByZXR1cm4gZmFsc2UgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbm1vZHVsZS5leHBvcnRzID0gU0JNSFxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGluaGVyaXRzID0gcmVxdWlyZSgnbm9kZTp1dGlsJykuaW5oZXJpdHNcbmNvbnN0IFJlYWRhYmxlU3RyZWFtID0gcmVxdWlyZSgnbm9kZTpzdHJlYW0nKS5SZWFkYWJsZVxuXG5mdW5jdGlvbiBQYXJ0U3RyZWFtIChvcHRzKSB7XG4gIFJlYWRhYmxlU3RyZWFtLmNhbGwodGhpcywgb3B0cylcbn1cbmluaGVyaXRzKFBhcnRTdHJlYW0sIFJlYWRhYmxlU3RyZWFtKVxuXG5QYXJ0U3RyZWFtLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7fVxuXG5tb2R1bGUuZXhwb3J0cyA9IFBhcnRTdHJlYW1cbiIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldExpbWl0IChsaW1pdHMsIG5hbWUsIGRlZmF1bHRMaW1pdCkge1xuICBpZiAoXG4gICAgIWxpbWl0cyB8fFxuICAgIGxpbWl0c1tuYW1lXSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgbGltaXRzW25hbWVdID09PSBudWxsXG4gICkgeyByZXR1cm4gZGVmYXVsdExpbWl0IH1cblxuICBpZiAoXG4gICAgdHlwZW9mIGxpbWl0c1tuYW1lXSAhPT0gJ251bWJlcicgfHxcbiAgICBpc05hTihsaW1pdHNbbmFtZV0pXG4gICkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdMaW1pdCAnICsgbmFtZSArICcgaXMgbm90IGEgdmFsaWQgbnVtYmVyJykgfVxuXG4gIHJldHVybiBsaW1pdHNbbmFtZV1cbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdub2RlOmV2ZW50cycpLkV2ZW50RW1pdHRlclxuY29uc3QgaW5oZXJpdHMgPSByZXF1aXJlKCdub2RlOnV0aWwnKS5pbmhlcml0c1xuY29uc3QgZ2V0TGltaXQgPSByZXF1aXJlKCcuLi8uLi8uLi9saWIvdXRpbHMvZ2V0TGltaXQnKVxuXG5jb25zdCBTdHJlYW1TZWFyY2ggPSByZXF1aXJlKCcuLi8uLi9zdHJlYW1zZWFyY2gvc2JtaCcpXG5cbmNvbnN0IEJfRENSTEYgPSBCdWZmZXIuZnJvbSgnXFxyXFxuXFxyXFxuJylcbmNvbnN0IFJFX0NSTEYgPSAvXFxyXFxuL2dcbmNvbnN0IFJFX0hEUiA9IC9eKFteOl0rKTpbIFxcdF0/KFtcXHgwMC1cXHhGRl0rKT8kLyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnRyb2wtcmVnZXhcblxuZnVuY3Rpb24gSGVhZGVyUGFyc2VyIChjZmcpIHtcbiAgRXZlbnRFbWl0dGVyLmNhbGwodGhpcylcblxuICBjZmcgPSBjZmcgfHwge31cbiAgY29uc3Qgc2VsZiA9IHRoaXNcbiAgdGhpcy5ucmVhZCA9IDBcbiAgdGhpcy5tYXhlZCA9IGZhbHNlXG4gIHRoaXMubnBhaXJzID0gMFxuICB0aGlzLm1heEhlYWRlclBhaXJzID0gZ2V0TGltaXQoY2ZnLCAnbWF4SGVhZGVyUGFpcnMnLCAyMDAwKVxuICB0aGlzLm1heEhlYWRlclNpemUgPSBnZXRMaW1pdChjZmcsICdtYXhIZWFkZXJTaXplJywgODAgKiAxMDI0KVxuICB0aGlzLmJ1ZmZlciA9ICcnXG4gIHRoaXMuaGVhZGVyID0ge31cbiAgdGhpcy5maW5pc2hlZCA9IGZhbHNlXG4gIHRoaXMuc3MgPSBuZXcgU3RyZWFtU2VhcmNoKEJfRENSTEYpXG4gIHRoaXMuc3Mub24oJ2luZm8nLCBmdW5jdGlvbiAoaXNNYXRjaCwgZGF0YSwgc3RhcnQsIGVuZCkge1xuICAgIGlmIChkYXRhICYmICFzZWxmLm1heGVkKSB7XG4gICAgICBpZiAoc2VsZi5ucmVhZCArIGVuZCAtIHN0YXJ0ID49IHNlbGYubWF4SGVhZGVyU2l6ZSkge1xuICAgICAgICBlbmQgPSBzZWxmLm1heEhlYWRlclNpemUgLSBzZWxmLm5yZWFkICsgc3RhcnRcbiAgICAgICAgc2VsZi5ucmVhZCA9IHNlbGYubWF4SGVhZGVyU2l6ZVxuICAgICAgICBzZWxmLm1heGVkID0gdHJ1ZVxuICAgICAgfSBlbHNlIHsgc2VsZi5ucmVhZCArPSAoZW5kIC0gc3RhcnQpIH1cblxuICAgICAgc2VsZi5idWZmZXIgKz0gZGF0YS50b1N0cmluZygnYmluYXJ5Jywgc3RhcnQsIGVuZClcbiAgICB9XG4gICAgaWYgKGlzTWF0Y2gpIHsgc2VsZi5fZmluaXNoKCkgfVxuICB9KVxufVxuaW5oZXJpdHMoSGVhZGVyUGFyc2VyLCBFdmVudEVtaXR0ZXIpXG5cbkhlYWRlclBhcnNlci5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIGNvbnN0IHIgPSB0aGlzLnNzLnB1c2goZGF0YSlcbiAgaWYgKHRoaXMuZmluaXNoZWQpIHsgcmV0dXJuIHIgfVxufVxuXG5IZWFkZXJQYXJzZXIucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmZpbmlzaGVkID0gZmFsc2VcbiAgdGhpcy5idWZmZXIgPSAnJ1xuICB0aGlzLmhlYWRlciA9IHt9XG4gIHRoaXMuc3MucmVzZXQoKVxufVxuXG5IZWFkZXJQYXJzZXIucHJvdG90eXBlLl9maW5pc2ggPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmJ1ZmZlcikgeyB0aGlzLl9wYXJzZUhlYWRlcigpIH1cbiAgdGhpcy5zcy5tYXRjaGVzID0gdGhpcy5zcy5tYXhNYXRjaGVzXG4gIGNvbnN0IGhlYWRlciA9IHRoaXMuaGVhZGVyXG4gIHRoaXMuaGVhZGVyID0ge31cbiAgdGhpcy5idWZmZXIgPSAnJ1xuICB0aGlzLmZpbmlzaGVkID0gdHJ1ZVxuICB0aGlzLm5yZWFkID0gdGhpcy5ucGFpcnMgPSAwXG4gIHRoaXMubWF4ZWQgPSBmYWxzZVxuICB0aGlzLmVtaXQoJ2hlYWRlcicsIGhlYWRlcilcbn1cblxuSGVhZGVyUGFyc2VyLnByb3RvdHlwZS5fcGFyc2VIZWFkZXIgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLm5wYWlycyA9PT0gdGhpcy5tYXhIZWFkZXJQYWlycykgeyByZXR1cm4gfVxuXG4gIGNvbnN0IGxpbmVzID0gdGhpcy5idWZmZXIuc3BsaXQoUkVfQ1JMRilcbiAgY29uc3QgbGVuID0gbGluZXMubGVuZ3RoXG4gIGxldCBtLCBoXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXZhclxuICAgIGlmIChsaW5lc1tpXS5sZW5ndGggPT09IDApIHsgY29udGludWUgfVxuICAgIGlmIChsaW5lc1tpXVswXSA9PT0gJ1xcdCcgfHwgbGluZXNbaV1bMF0gPT09ICcgJykge1xuICAgICAgLy8gZm9sZGVkIGhlYWRlciBjb250ZW50XG4gICAgICAvLyBSRkMyODIyIHNheXMgdG8ganVzdCByZW1vdmUgdGhlIENSTEYgYW5kIG5vdCB0aGUgd2hpdGVzcGFjZSBmb2xsb3dpbmdcbiAgICAgIC8vIGl0LCBzbyB3ZSBmb2xsb3cgdGhlIFJGQyBhbmQgaW5jbHVkZSB0aGUgbGVhZGluZyB3aGl0ZXNwYWNlIC4uLlxuICAgICAgaWYgKGgpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJbaF1bdGhpcy5oZWFkZXJbaF0ubGVuZ3RoIC0gMV0gKz0gbGluZXNbaV1cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwb3NDb2xvbiA9IGxpbmVzW2ldLmluZGV4T2YoJzonKVxuICAgIGlmIChcbiAgICAgIHBvc0NvbG9uID09PSAtMSB8fFxuICAgICAgcG9zQ29sb24gPT09IDBcbiAgICApIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBtID0gUkVfSERSLmV4ZWMobGluZXNbaV0pXG4gICAgaCA9IG1bMV0udG9Mb3dlckNhc2UoKVxuICAgIHRoaXMuaGVhZGVyW2hdID0gdGhpcy5oZWFkZXJbaF0gfHwgW11cbiAgICB0aGlzLmhlYWRlcltoXS5wdXNoKChtWzJdIHx8ICcnKSlcbiAgICBpZiAoKyt0aGlzLm5wYWlycyA9PT0gdGhpcy5tYXhIZWFkZXJQYWlycykgeyBicmVhayB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBIZWFkZXJQYXJzZXJcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBXcml0YWJsZVN0cmVhbSA9IHJlcXVpcmUoJ25vZGU6c3RyZWFtJykuV3JpdGFibGVcbmNvbnN0IGluaGVyaXRzID0gcmVxdWlyZSgnbm9kZTp1dGlsJykuaW5oZXJpdHNcblxuY29uc3QgU3RyZWFtU2VhcmNoID0gcmVxdWlyZSgnLi4vLi4vc3RyZWFtc2VhcmNoL3NibWgnKVxuXG5jb25zdCBQYXJ0U3RyZWFtID0gcmVxdWlyZSgnLi9QYXJ0U3RyZWFtJylcbmNvbnN0IEhlYWRlclBhcnNlciA9IHJlcXVpcmUoJy4vSGVhZGVyUGFyc2VyJylcblxuY29uc3QgREFTSCA9IDQ1XG5jb25zdCBCX09ORURBU0ggPSBCdWZmZXIuZnJvbSgnLScpXG5jb25zdCBCX0NSTEYgPSBCdWZmZXIuZnJvbSgnXFxyXFxuJylcbmNvbnN0IEVNUFRZX0ZOID0gZnVuY3Rpb24gKCkge31cblxuZnVuY3Rpb24gRGljZXIgKGNmZykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRGljZXIpKSB7IHJldHVybiBuZXcgRGljZXIoY2ZnKSB9XG4gIFdyaXRhYmxlU3RyZWFtLmNhbGwodGhpcywgY2ZnKVxuXG4gIGlmICghY2ZnIHx8ICghY2ZnLmhlYWRlckZpcnN0ICYmIHR5cGVvZiBjZmcuYm91bmRhcnkgIT09ICdzdHJpbmcnKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdCb3VuZGFyeSByZXF1aXJlZCcpIH1cblxuICBpZiAodHlwZW9mIGNmZy5ib3VuZGFyeSA9PT0gJ3N0cmluZycpIHsgdGhpcy5zZXRCb3VuZGFyeShjZmcuYm91bmRhcnkpIH0gZWxzZSB7IHRoaXMuX2JwYXJzZXIgPSB1bmRlZmluZWQgfVxuXG4gIHRoaXMuX2hlYWRlckZpcnN0ID0gY2ZnLmhlYWRlckZpcnN0XG5cbiAgdGhpcy5fZGFzaGVzID0gMFxuICB0aGlzLl9wYXJ0cyA9IDBcbiAgdGhpcy5fZmluaXNoZWQgPSBmYWxzZVxuICB0aGlzLl9yZWFsRmluaXNoID0gZmFsc2VcbiAgdGhpcy5faXNQcmVhbWJsZSA9IHRydWVcbiAgdGhpcy5fanVzdE1hdGNoZWQgPSBmYWxzZVxuICB0aGlzLl9maXJzdFdyaXRlID0gdHJ1ZVxuICB0aGlzLl9pbkhlYWRlciA9IHRydWVcbiAgdGhpcy5fcGFydCA9IHVuZGVmaW5lZFxuICB0aGlzLl9jYiA9IHVuZGVmaW5lZFxuICB0aGlzLl9pZ25vcmVEYXRhID0gZmFsc2VcbiAgdGhpcy5fcGFydE9wdHMgPSB7IGhpZ2hXYXRlck1hcms6IGNmZy5wYXJ0SHdtIH1cbiAgdGhpcy5fcGF1c2UgPSBmYWxzZVxuXG4gIGNvbnN0IHNlbGYgPSB0aGlzXG4gIHRoaXMuX2hwYXJzZXIgPSBuZXcgSGVhZGVyUGFyc2VyKGNmZylcbiAgdGhpcy5faHBhcnNlci5vbignaGVhZGVyJywgZnVuY3Rpb24gKGhlYWRlcikge1xuICAgIHNlbGYuX2luSGVhZGVyID0gZmFsc2VcbiAgICBzZWxmLl9wYXJ0LmVtaXQoJ2hlYWRlcicsIGhlYWRlcilcbiAgfSlcbn1cbmluaGVyaXRzKERpY2VyLCBXcml0YWJsZVN0cmVhbSlcblxuRGljZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiAoZXYpIHtcbiAgaWYgKGV2ID09PSAnZmluaXNoJyAmJiAhdGhpcy5fcmVhbEZpbmlzaCkge1xuICAgIGlmICghdGhpcy5fZmluaXNoZWQpIHtcbiAgICAgIGNvbnN0IHNlbGYgPSB0aGlzXG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignVW5leHBlY3RlZCBlbmQgb2YgbXVsdGlwYXJ0IGRhdGEnKSlcbiAgICAgICAgaWYgKHNlbGYuX3BhcnQgJiYgIXNlbGYuX2lnbm9yZURhdGEpIHtcbiAgICAgICAgICBjb25zdCB0eXBlID0gKHNlbGYuX2lzUHJlYW1ibGUgPyAnUHJlYW1ibGUnIDogJ1BhcnQnKVxuICAgICAgICAgIHNlbGYuX3BhcnQuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IodHlwZSArICcgdGVybWluYXRlZCBlYXJseSBkdWUgdG8gdW5leHBlY3RlZCBlbmQgb2YgbXVsdGlwYXJ0IGRhdGEnKSlcbiAgICAgICAgICBzZWxmLl9wYXJ0LnB1c2gobnVsbClcbiAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNlbGYuX3JlYWxGaW5pc2ggPSB0cnVlXG4gICAgICAgICAgICBzZWxmLmVtaXQoJ2ZpbmlzaCcpXG4gICAgICAgICAgICBzZWxmLl9yZWFsRmluaXNoID0gZmFsc2VcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHNlbGYuX3JlYWxGaW5pc2ggPSB0cnVlXG4gICAgICAgIHNlbGYuZW1pdCgnZmluaXNoJylcbiAgICAgICAgc2VsZi5fcmVhbEZpbmlzaCA9IGZhbHNlXG4gICAgICB9KVxuICAgIH1cbiAgfSBlbHNlIHsgV3JpdGFibGVTdHJlYW0ucHJvdG90eXBlLmVtaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKSB9XG59XG5cbkRpY2VyLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoZGF0YSwgZW5jb2RpbmcsIGNiKSB7XG4gIC8vIGlnbm9yZSB1bmV4cGVjdGVkIGRhdGEgKGUuZy4gZXh0cmEgdHJhaWxlciBkYXRhIGFmdGVyIGZpbmlzaGVkKVxuICBpZiAoIXRoaXMuX2hwYXJzZXIgJiYgIXRoaXMuX2JwYXJzZXIpIHsgcmV0dXJuIGNiKCkgfVxuXG4gIGlmICh0aGlzLl9oZWFkZXJGaXJzdCAmJiB0aGlzLl9pc1ByZWFtYmxlKSB7XG4gICAgaWYgKCF0aGlzLl9wYXJ0KSB7XG4gICAgICB0aGlzLl9wYXJ0ID0gbmV3IFBhcnRTdHJlYW0odGhpcy5fcGFydE9wdHMpXG4gICAgICBpZiAodGhpcy5saXN0ZW5lckNvdW50KCdwcmVhbWJsZScpICE9PSAwKSB7IHRoaXMuZW1pdCgncHJlYW1ibGUnLCB0aGlzLl9wYXJ0KSB9IGVsc2UgeyB0aGlzLl9pZ25vcmUoKSB9XG4gICAgfVxuICAgIGNvbnN0IHIgPSB0aGlzLl9ocGFyc2VyLnB1c2goZGF0YSlcbiAgICBpZiAoIXRoaXMuX2luSGVhZGVyICYmIHIgIT09IHVuZGVmaW5lZCAmJiByIDwgZGF0YS5sZW5ndGgpIHsgZGF0YSA9IGRhdGEuc2xpY2UocikgfSBlbHNlIHsgcmV0dXJuIGNiKCkgfVxuICB9XG5cbiAgLy8gYWxsb3dzIGZvciBcImVhc2llclwiIHRlc3RpbmdcbiAgaWYgKHRoaXMuX2ZpcnN0V3JpdGUpIHtcbiAgICB0aGlzLl9icGFyc2VyLnB1c2goQl9DUkxGKVxuICAgIHRoaXMuX2ZpcnN0V3JpdGUgPSBmYWxzZVxuICB9XG5cbiAgdGhpcy5fYnBhcnNlci5wdXNoKGRhdGEpXG5cbiAgaWYgKHRoaXMuX3BhdXNlKSB7IHRoaXMuX2NiID0gY2IgfSBlbHNlIHsgY2IoKSB9XG59XG5cbkRpY2VyLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5fcGFydCA9IHVuZGVmaW5lZFxuICB0aGlzLl9icGFyc2VyID0gdW5kZWZpbmVkXG4gIHRoaXMuX2hwYXJzZXIgPSB1bmRlZmluZWRcbn1cblxuRGljZXIucHJvdG90eXBlLnNldEJvdW5kYXJ5ID0gZnVuY3Rpb24gKGJvdW5kYXJ5KSB7XG4gIGNvbnN0IHNlbGYgPSB0aGlzXG4gIHRoaXMuX2JwYXJzZXIgPSBuZXcgU3RyZWFtU2VhcmNoKCdcXHJcXG4tLScgKyBib3VuZGFyeSlcbiAgdGhpcy5fYnBhcnNlci5vbignaW5mbycsIGZ1bmN0aW9uIChpc01hdGNoLCBkYXRhLCBzdGFydCwgZW5kKSB7XG4gICAgc2VsZi5fb25pbmZvKGlzTWF0Y2gsIGRhdGEsIHN0YXJ0LCBlbmQpXG4gIH0pXG59XG5cbkRpY2VyLnByb3RvdHlwZS5faWdub3JlID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5fcGFydCAmJiAhdGhpcy5faWdub3JlRGF0YSkge1xuICAgIHRoaXMuX2lnbm9yZURhdGEgPSB0cnVlXG4gICAgdGhpcy5fcGFydC5vbignZXJyb3InLCBFTVBUWV9GTilcbiAgICAvLyB3ZSBtdXN0IHBlcmZvcm0gc29tZSBraW5kIG9mIHJlYWQgb24gdGhlIHN0cmVhbSBldmVuIHRob3VnaCB3ZSBhcmVcbiAgICAvLyBpZ25vcmluZyB0aGUgZGF0YSwgb3RoZXJ3aXNlIG5vZGUncyBSZWFkYWJsZSBzdHJlYW0gd2lsbCBub3QgZW1pdCAnZW5kJ1xuICAgIC8vIGFmdGVyIHB1c2hpbmcgbnVsbCB0byB0aGUgc3RyZWFtXG4gICAgdGhpcy5fcGFydC5yZXN1bWUoKVxuICB9XG59XG5cbkRpY2VyLnByb3RvdHlwZS5fb25pbmZvID0gZnVuY3Rpb24gKGlzTWF0Y2gsIGRhdGEsIHN0YXJ0LCBlbmQpIHtcbiAgbGV0IGJ1ZjsgY29uc3Qgc2VsZiA9IHRoaXM7IGxldCBpID0gMDsgbGV0IHI7IGxldCBzaG91bGRXcml0ZU1vcmUgPSB0cnVlXG5cbiAgaWYgKCF0aGlzLl9wYXJ0ICYmIHRoaXMuX2p1c3RNYXRjaGVkICYmIGRhdGEpIHtcbiAgICB3aGlsZSAodGhpcy5fZGFzaGVzIDwgMiAmJiAoc3RhcnQgKyBpKSA8IGVuZCkge1xuICAgICAgaWYgKGRhdGFbc3RhcnQgKyBpXSA9PT0gREFTSCkge1xuICAgICAgICArK2lcbiAgICAgICAgKyt0aGlzLl9kYXNoZXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLl9kYXNoZXMpIHsgYnVmID0gQl9PTkVEQVNIIH1cbiAgICAgICAgdGhpcy5fZGFzaGVzID0gMFxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5fZGFzaGVzID09PSAyKSB7XG4gICAgICBpZiAoKHN0YXJ0ICsgaSkgPCBlbmQgJiYgdGhpcy5saXN0ZW5lckNvdW50KCd0cmFpbGVyJykgIT09IDApIHsgdGhpcy5lbWl0KCd0cmFpbGVyJywgZGF0YS5zbGljZShzdGFydCArIGksIGVuZCkpIH1cbiAgICAgIHRoaXMucmVzZXQoKVxuICAgICAgdGhpcy5fZmluaXNoZWQgPSB0cnVlXG4gICAgICAvLyBubyBtb3JlIHBhcnRzIHdpbGwgYmUgYWRkZWRcbiAgICAgIGlmIChzZWxmLl9wYXJ0cyA9PT0gMCkge1xuICAgICAgICBzZWxmLl9yZWFsRmluaXNoID0gdHJ1ZVxuICAgICAgICBzZWxmLmVtaXQoJ2ZpbmlzaCcpXG4gICAgICAgIHNlbGYuX3JlYWxGaW5pc2ggPSBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5fZGFzaGVzKSB7IHJldHVybiB9XG4gIH1cbiAgaWYgKHRoaXMuX2p1c3RNYXRjaGVkKSB7IHRoaXMuX2p1c3RNYXRjaGVkID0gZmFsc2UgfVxuICBpZiAoIXRoaXMuX3BhcnQpIHtcbiAgICB0aGlzLl9wYXJ0ID0gbmV3IFBhcnRTdHJlYW0odGhpcy5fcGFydE9wdHMpXG4gICAgdGhpcy5fcGFydC5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICBzZWxmLl91bnBhdXNlKClcbiAgICB9XG4gICAgaWYgKHRoaXMuX2lzUHJlYW1ibGUgJiYgdGhpcy5saXN0ZW5lckNvdW50KCdwcmVhbWJsZScpICE9PSAwKSB7XG4gICAgICB0aGlzLmVtaXQoJ3ByZWFtYmxlJywgdGhpcy5fcGFydClcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2lzUHJlYW1ibGUgIT09IHRydWUgJiYgdGhpcy5saXN0ZW5lckNvdW50KCdwYXJ0JykgIT09IDApIHtcbiAgICAgIHRoaXMuZW1pdCgncGFydCcsIHRoaXMuX3BhcnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2lnbm9yZSgpXG4gICAgfVxuICAgIGlmICghdGhpcy5faXNQcmVhbWJsZSkgeyB0aGlzLl9pbkhlYWRlciA9IHRydWUgfVxuICB9XG4gIGlmIChkYXRhICYmIHN0YXJ0IDwgZW5kICYmICF0aGlzLl9pZ25vcmVEYXRhKSB7XG4gICAgaWYgKHRoaXMuX2lzUHJlYW1ibGUgfHwgIXRoaXMuX2luSGVhZGVyKSB7XG4gICAgICBpZiAoYnVmKSB7IHNob3VsZFdyaXRlTW9yZSA9IHRoaXMuX3BhcnQucHVzaChidWYpIH1cbiAgICAgIHNob3VsZFdyaXRlTW9yZSA9IHRoaXMuX3BhcnQucHVzaChkYXRhLnNsaWNlKHN0YXJ0LCBlbmQpKVxuICAgICAgaWYgKCFzaG91bGRXcml0ZU1vcmUpIHsgdGhpcy5fcGF1c2UgPSB0cnVlIH1cbiAgICB9IGVsc2UgaWYgKCF0aGlzLl9pc1ByZWFtYmxlICYmIHRoaXMuX2luSGVhZGVyKSB7XG4gICAgICBpZiAoYnVmKSB7IHRoaXMuX2hwYXJzZXIucHVzaChidWYpIH1cbiAgICAgIHIgPSB0aGlzLl9ocGFyc2VyLnB1c2goZGF0YS5zbGljZShzdGFydCwgZW5kKSlcbiAgICAgIGlmICghdGhpcy5faW5IZWFkZXIgJiYgciAhPT0gdW5kZWZpbmVkICYmIHIgPCBlbmQpIHsgdGhpcy5fb25pbmZvKGZhbHNlLCBkYXRhLCBzdGFydCArIHIsIGVuZCkgfVxuICAgIH1cbiAgfVxuICBpZiAoaXNNYXRjaCkge1xuICAgIHRoaXMuX2hwYXJzZXIucmVzZXQoKVxuICAgIGlmICh0aGlzLl9pc1ByZWFtYmxlKSB7IHRoaXMuX2lzUHJlYW1ibGUgPSBmYWxzZSB9IGVsc2Uge1xuICAgICAgaWYgKHN0YXJ0ICE9PSBlbmQpIHtcbiAgICAgICAgKyt0aGlzLl9wYXJ0c1xuICAgICAgICB0aGlzLl9wYXJ0Lm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKC0tc2VsZi5fcGFydHMgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChzZWxmLl9maW5pc2hlZCkge1xuICAgICAgICAgICAgICBzZWxmLl9yZWFsRmluaXNoID0gdHJ1ZVxuICAgICAgICAgICAgICBzZWxmLmVtaXQoJ2ZpbmlzaCcpXG4gICAgICAgICAgICAgIHNlbGYuX3JlYWxGaW5pc2ggPSBmYWxzZVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2VsZi5fdW5wYXVzZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9wYXJ0LnB1c2gobnVsbClcbiAgICB0aGlzLl9wYXJ0ID0gdW5kZWZpbmVkXG4gICAgdGhpcy5faWdub3JlRGF0YSA9IGZhbHNlXG4gICAgdGhpcy5fanVzdE1hdGNoZWQgPSB0cnVlXG4gICAgdGhpcy5fZGFzaGVzID0gMFxuICB9XG59XG5cbkRpY2VyLnByb3RvdHlwZS5fdW5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLl9wYXVzZSkgeyByZXR1cm4gfVxuXG4gIHRoaXMuX3BhdXNlID0gZmFsc2VcbiAgaWYgKHRoaXMuX2NiKSB7XG4gICAgY29uc3QgY2IgPSB0aGlzLl9jYlxuICAgIHRoaXMuX2NiID0gdW5kZWZpbmVkXG4gICAgY2IoKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRGljZXJcbiIsIid1c2Ugc3RyaWN0J1xuXG4vLyBOb2RlIGhhcyBhbHdheXMgdXRmLThcbmNvbnN0IHV0ZjhEZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCd1dGYtOCcpXG5jb25zdCB0ZXh0RGVjb2RlcnMgPSBuZXcgTWFwKFtcbiAgWyd1dGYtOCcsIHV0ZjhEZWNvZGVyXSxcbiAgWyd1dGY4JywgdXRmOERlY29kZXJdXG5dKVxuXG5mdW5jdGlvbiBnZXREZWNvZGVyIChjaGFyc2V0KSB7XG4gIGxldCBsY1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoY2hhcnNldCkge1xuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICAgIHJldHVybiBkZWNvZGVycy51dGY4XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYXNjaWknOiAvLyBUT0RPOiBNYWtlIHRoZXNlIGEgc2VwYXJhdGUsIHN0cmljdCBkZWNvZGVyP1xuICAgICAgY2FzZSAndXMtYXNjaWknOlxuICAgICAgY2FzZSAnaXNvLTg4NTktMSc6XG4gICAgICBjYXNlICdpc284ODU5LTEnOlxuICAgICAgY2FzZSAnaXNvODg1OTEnOlxuICAgICAgY2FzZSAnaXNvXzg4NTktMSc6XG4gICAgICBjYXNlICd3aW5kb3dzLTEyNTInOlxuICAgICAgY2FzZSAnaXNvXzg4NTktMToxOTg3JzpcbiAgICAgIGNhc2UgJ2NwMTI1Mic6XG4gICAgICBjYXNlICd4LWNwMTI1Mic6XG4gICAgICAgIHJldHVybiBkZWNvZGVycy5sYXRpbjFcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICAgIHJldHVybiBkZWNvZGVycy51dGYxNmxlXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gZGVjb2RlcnMuYmFzZTY0XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobGMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGxjID0gdHJ1ZVxuICAgICAgICAgIGNoYXJzZXQgPSBjaGFyc2V0LnRvTG93ZXJDYXNlKClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWNvZGVycy5vdGhlci5iaW5kKGNoYXJzZXQpXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGRlY29kZXJzID0ge1xuICB1dGY4OiAoZGF0YSwgc291cmNlRW5jb2RpbmcpID0+IHtcbiAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICBkYXRhID0gQnVmZmVyLmZyb20oZGF0YSwgc291cmNlRW5jb2RpbmcpXG4gICAgfVxuICAgIHJldHVybiBkYXRhLnV0ZjhTbGljZSgwLCBkYXRhLmxlbmd0aClcbiAgfSxcblxuICBsYXRpbjE6IChkYXRhLCBzb3VyY2VFbmNvZGluZykgPT4ge1xuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBkYXRhXG4gICAgfVxuICAgIHJldHVybiBkYXRhLmxhdGluMVNsaWNlKDAsIGRhdGEubGVuZ3RoKVxuICB9LFxuXG4gIHV0ZjE2bGU6IChkYXRhLCBzb3VyY2VFbmNvZGluZykgPT4ge1xuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGRhdGEgPSBCdWZmZXIuZnJvbShkYXRhLCBzb3VyY2VFbmNvZGluZylcbiAgICB9XG4gICAgcmV0dXJuIGRhdGEudWNzMlNsaWNlKDAsIGRhdGEubGVuZ3RoKVxuICB9LFxuXG4gIGJhc2U2NDogKGRhdGEsIHNvdXJjZUVuY29kaW5nKSA9PiB7XG4gICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgZGF0YSA9IEJ1ZmZlci5mcm9tKGRhdGEsIHNvdXJjZUVuY29kaW5nKVxuICAgIH1cbiAgICByZXR1cm4gZGF0YS5iYXNlNjRTbGljZSgwLCBkYXRhLmxlbmd0aClcbiAgfSxcblxuICBvdGhlcjogKGRhdGEsIHNvdXJjZUVuY29kaW5nKSA9PiB7XG4gICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgZGF0YSA9IEJ1ZmZlci5mcm9tKGRhdGEsIHNvdXJjZUVuY29kaW5nKVxuICAgIH1cblxuICAgIGlmICh0ZXh0RGVjb2RlcnMuaGFzKHRoaXMudG9TdHJpbmcoKSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB0ZXh0RGVjb2RlcnMuZ2V0KHRoaXMpLmRlY29kZShkYXRhKVxuICAgICAgfSBjYXRjaCB7fVxuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnXG4gICAgICA/IGRhdGFcbiAgICAgIDogZGF0YS50b1N0cmluZygpXG4gIH1cbn1cblxuZnVuY3Rpb24gZGVjb2RlVGV4dCAodGV4dCwgc291cmNlRW5jb2RpbmcsIGRlc3RFbmNvZGluZykge1xuICBpZiAodGV4dCkge1xuICAgIHJldHVybiBnZXREZWNvZGVyKGRlc3RFbmNvZGluZykodGV4dCwgc291cmNlRW5jb2RpbmcpXG4gIH1cbiAgcmV0dXJuIHRleHRcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkZWNvZGVUZXh0XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBvYmplY3QtcHJvcGVydHktbmV3bGluZSAqL1xuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGRlY29kZVRleHQgPSByZXF1aXJlKCcuL2RlY29kZVRleHQnKVxuXG5jb25zdCBSRV9FTkNPREVEID0gLyVbYS1mQS1GMC05XVthLWZBLUYwLTldL2dcblxuY29uc3QgRW5jb2RlZExvb2t1cCA9IHtcbiAgJyUwMCc6ICdcXHgwMCcsICclMDEnOiAnXFx4MDEnLCAnJTAyJzogJ1xceDAyJywgJyUwMyc6ICdcXHgwMycsICclMDQnOiAnXFx4MDQnLFxuICAnJTA1JzogJ1xceDA1JywgJyUwNic6ICdcXHgwNicsICclMDcnOiAnXFx4MDcnLCAnJTA4JzogJ1xceDA4JywgJyUwOSc6ICdcXHgwOScsXG4gICclMGEnOiAnXFx4MGEnLCAnJTBBJzogJ1xceDBhJywgJyUwYic6ICdcXHgwYicsICclMEInOiAnXFx4MGInLCAnJTBjJzogJ1xceDBjJyxcbiAgJyUwQyc6ICdcXHgwYycsICclMGQnOiAnXFx4MGQnLCAnJTBEJzogJ1xceDBkJywgJyUwZSc6ICdcXHgwZScsICclMEUnOiAnXFx4MGUnLFxuICAnJTBmJzogJ1xceDBmJywgJyUwRic6ICdcXHgwZicsICclMTAnOiAnXFx4MTAnLCAnJTExJzogJ1xceDExJywgJyUxMic6ICdcXHgxMicsXG4gICclMTMnOiAnXFx4MTMnLCAnJTE0JzogJ1xceDE0JywgJyUxNSc6ICdcXHgxNScsICclMTYnOiAnXFx4MTYnLCAnJTE3JzogJ1xceDE3JyxcbiAgJyUxOCc6ICdcXHgxOCcsICclMTknOiAnXFx4MTknLCAnJTFhJzogJ1xceDFhJywgJyUxQSc6ICdcXHgxYScsICclMWInOiAnXFx4MWInLFxuICAnJTFCJzogJ1xceDFiJywgJyUxYyc6ICdcXHgxYycsICclMUMnOiAnXFx4MWMnLCAnJTFkJzogJ1xceDFkJywgJyUxRCc6ICdcXHgxZCcsXG4gICclMWUnOiAnXFx4MWUnLCAnJTFFJzogJ1xceDFlJywgJyUxZic6ICdcXHgxZicsICclMUYnOiAnXFx4MWYnLCAnJTIwJzogJ1xceDIwJyxcbiAgJyUyMSc6ICdcXHgyMScsICclMjInOiAnXFx4MjInLCAnJTIzJzogJ1xceDIzJywgJyUyNCc6ICdcXHgyNCcsICclMjUnOiAnXFx4MjUnLFxuICAnJTI2JzogJ1xceDI2JywgJyUyNyc6ICdcXHgyNycsICclMjgnOiAnXFx4MjgnLCAnJTI5JzogJ1xceDI5JywgJyUyYSc6ICdcXHgyYScsXG4gICclMkEnOiAnXFx4MmEnLCAnJTJiJzogJ1xceDJiJywgJyUyQic6ICdcXHgyYicsICclMmMnOiAnXFx4MmMnLCAnJTJDJzogJ1xceDJjJyxcbiAgJyUyZCc6ICdcXHgyZCcsICclMkQnOiAnXFx4MmQnLCAnJTJlJzogJ1xceDJlJywgJyUyRSc6ICdcXHgyZScsICclMmYnOiAnXFx4MmYnLFxuICAnJTJGJzogJ1xceDJmJywgJyUzMCc6ICdcXHgzMCcsICclMzEnOiAnXFx4MzEnLCAnJTMyJzogJ1xceDMyJywgJyUzMyc6ICdcXHgzMycsXG4gICclMzQnOiAnXFx4MzQnLCAnJTM1JzogJ1xceDM1JywgJyUzNic6ICdcXHgzNicsICclMzcnOiAnXFx4MzcnLCAnJTM4JzogJ1xceDM4JyxcbiAgJyUzOSc6ICdcXHgzOScsICclM2EnOiAnXFx4M2EnLCAnJTNBJzogJ1xceDNhJywgJyUzYic6ICdcXHgzYicsICclM0InOiAnXFx4M2InLFxuICAnJTNjJzogJ1xceDNjJywgJyUzQyc6ICdcXHgzYycsICclM2QnOiAnXFx4M2QnLCAnJTNEJzogJ1xceDNkJywgJyUzZSc6ICdcXHgzZScsXG4gICclM0UnOiAnXFx4M2UnLCAnJTNmJzogJ1xceDNmJywgJyUzRic6ICdcXHgzZicsICclNDAnOiAnXFx4NDAnLCAnJTQxJzogJ1xceDQxJyxcbiAgJyU0Mic6ICdcXHg0MicsICclNDMnOiAnXFx4NDMnLCAnJTQ0JzogJ1xceDQ0JywgJyU0NSc6ICdcXHg0NScsICclNDYnOiAnXFx4NDYnLFxuICAnJTQ3JzogJ1xceDQ3JywgJyU0OCc6ICdcXHg0OCcsICclNDknOiAnXFx4NDknLCAnJTRhJzogJ1xceDRhJywgJyU0QSc6ICdcXHg0YScsXG4gICclNGInOiAnXFx4NGInLCAnJTRCJzogJ1xceDRiJywgJyU0Yyc6ICdcXHg0YycsICclNEMnOiAnXFx4NGMnLCAnJTRkJzogJ1xceDRkJyxcbiAgJyU0RCc6ICdcXHg0ZCcsICclNGUnOiAnXFx4NGUnLCAnJTRFJzogJ1xceDRlJywgJyU0Zic6ICdcXHg0ZicsICclNEYnOiAnXFx4NGYnLFxuICAnJTUwJzogJ1xceDUwJywgJyU1MSc6ICdcXHg1MScsICclNTInOiAnXFx4NTInLCAnJTUzJzogJ1xceDUzJywgJyU1NCc6ICdcXHg1NCcsXG4gICclNTUnOiAnXFx4NTUnLCAnJTU2JzogJ1xceDU2JywgJyU1Nyc6ICdcXHg1NycsICclNTgnOiAnXFx4NTgnLCAnJTU5JzogJ1xceDU5JyxcbiAgJyU1YSc6ICdcXHg1YScsICclNUEnOiAnXFx4NWEnLCAnJTViJzogJ1xceDViJywgJyU1Qic6ICdcXHg1YicsICclNWMnOiAnXFx4NWMnLFxuICAnJTVDJzogJ1xceDVjJywgJyU1ZCc6ICdcXHg1ZCcsICclNUQnOiAnXFx4NWQnLCAnJTVlJzogJ1xceDVlJywgJyU1RSc6ICdcXHg1ZScsXG4gICclNWYnOiAnXFx4NWYnLCAnJTVGJzogJ1xceDVmJywgJyU2MCc6ICdcXHg2MCcsICclNjEnOiAnXFx4NjEnLCAnJTYyJzogJ1xceDYyJyxcbiAgJyU2Myc6ICdcXHg2MycsICclNjQnOiAnXFx4NjQnLCAnJTY1JzogJ1xceDY1JywgJyU2Nic6ICdcXHg2NicsICclNjcnOiAnXFx4NjcnLFxuICAnJTY4JzogJ1xceDY4JywgJyU2OSc6ICdcXHg2OScsICclNmEnOiAnXFx4NmEnLCAnJTZBJzogJ1xceDZhJywgJyU2Yic6ICdcXHg2YicsXG4gICclNkInOiAnXFx4NmInLCAnJTZjJzogJ1xceDZjJywgJyU2Qyc6ICdcXHg2YycsICclNmQnOiAnXFx4NmQnLCAnJTZEJzogJ1xceDZkJyxcbiAgJyU2ZSc6ICdcXHg2ZScsICclNkUnOiAnXFx4NmUnLCAnJTZmJzogJ1xceDZmJywgJyU2Ric6ICdcXHg2ZicsICclNzAnOiAnXFx4NzAnLFxuICAnJTcxJzogJ1xceDcxJywgJyU3Mic6ICdcXHg3MicsICclNzMnOiAnXFx4NzMnLCAnJTc0JzogJ1xceDc0JywgJyU3NSc6ICdcXHg3NScsXG4gICclNzYnOiAnXFx4NzYnLCAnJTc3JzogJ1xceDc3JywgJyU3OCc6ICdcXHg3OCcsICclNzknOiAnXFx4NzknLCAnJTdhJzogJ1xceDdhJyxcbiAgJyU3QSc6ICdcXHg3YScsICclN2InOiAnXFx4N2InLCAnJTdCJzogJ1xceDdiJywgJyU3Yyc6ICdcXHg3YycsICclN0MnOiAnXFx4N2MnLFxuICAnJTdkJzogJ1xceDdkJywgJyU3RCc6ICdcXHg3ZCcsICclN2UnOiAnXFx4N2UnLCAnJTdFJzogJ1xceDdlJywgJyU3Zic6ICdcXHg3ZicsXG4gICclN0YnOiAnXFx4N2YnLCAnJTgwJzogJ1xceDgwJywgJyU4MSc6ICdcXHg4MScsICclODInOiAnXFx4ODInLCAnJTgzJzogJ1xceDgzJyxcbiAgJyU4NCc6ICdcXHg4NCcsICclODUnOiAnXFx4ODUnLCAnJTg2JzogJ1xceDg2JywgJyU4Nyc6ICdcXHg4NycsICclODgnOiAnXFx4ODgnLFxuICAnJTg5JzogJ1xceDg5JywgJyU4YSc6ICdcXHg4YScsICclOEEnOiAnXFx4OGEnLCAnJThiJzogJ1xceDhiJywgJyU4Qic6ICdcXHg4YicsXG4gICclOGMnOiAnXFx4OGMnLCAnJThDJzogJ1xceDhjJywgJyU4ZCc6ICdcXHg4ZCcsICclOEQnOiAnXFx4OGQnLCAnJThlJzogJ1xceDhlJyxcbiAgJyU4RSc6ICdcXHg4ZScsICclOGYnOiAnXFx4OGYnLCAnJThGJzogJ1xceDhmJywgJyU5MCc6ICdcXHg5MCcsICclOTEnOiAnXFx4OTEnLFxuICAnJTkyJzogJ1xceDkyJywgJyU5Myc6ICdcXHg5MycsICclOTQnOiAnXFx4OTQnLCAnJTk1JzogJ1xceDk1JywgJyU5Nic6ICdcXHg5NicsXG4gICclOTcnOiAnXFx4OTcnLCAnJTk4JzogJ1xceDk4JywgJyU5OSc6ICdcXHg5OScsICclOWEnOiAnXFx4OWEnLCAnJTlBJzogJ1xceDlhJyxcbiAgJyU5Yic6ICdcXHg5YicsICclOUInOiAnXFx4OWInLCAnJTljJzogJ1xceDljJywgJyU5Qyc6ICdcXHg5YycsICclOWQnOiAnXFx4OWQnLFxuICAnJTlEJzogJ1xceDlkJywgJyU5ZSc6ICdcXHg5ZScsICclOUUnOiAnXFx4OWUnLCAnJTlmJzogJ1xceDlmJywgJyU5Ric6ICdcXHg5ZicsXG4gICclYTAnOiAnXFx4YTAnLCAnJUEwJzogJ1xceGEwJywgJyVhMSc6ICdcXHhhMScsICclQTEnOiAnXFx4YTEnLCAnJWEyJzogJ1xceGEyJyxcbiAgJyVBMic6ICdcXHhhMicsICclYTMnOiAnXFx4YTMnLCAnJUEzJzogJ1xceGEzJywgJyVhNCc6ICdcXHhhNCcsICclQTQnOiAnXFx4YTQnLFxuICAnJWE1JzogJ1xceGE1JywgJyVBNSc6ICdcXHhhNScsICclYTYnOiAnXFx4YTYnLCAnJUE2JzogJ1xceGE2JywgJyVhNyc6ICdcXHhhNycsXG4gICclQTcnOiAnXFx4YTcnLCAnJWE4JzogJ1xceGE4JywgJyVBOCc6ICdcXHhhOCcsICclYTknOiAnXFx4YTknLCAnJUE5JzogJ1xceGE5JyxcbiAgJyVhYSc6ICdcXHhhYScsICclQWEnOiAnXFx4YWEnLCAnJWFBJzogJ1xceGFhJywgJyVBQSc6ICdcXHhhYScsICclYWInOiAnXFx4YWInLFxuICAnJUFiJzogJ1xceGFiJywgJyVhQic6ICdcXHhhYicsICclQUInOiAnXFx4YWInLCAnJWFjJzogJ1xceGFjJywgJyVBYyc6ICdcXHhhYycsXG4gICclYUMnOiAnXFx4YWMnLCAnJUFDJzogJ1xceGFjJywgJyVhZCc6ICdcXHhhZCcsICclQWQnOiAnXFx4YWQnLCAnJWFEJzogJ1xceGFkJyxcbiAgJyVBRCc6ICdcXHhhZCcsICclYWUnOiAnXFx4YWUnLCAnJUFlJzogJ1xceGFlJywgJyVhRSc6ICdcXHhhZScsICclQUUnOiAnXFx4YWUnLFxuICAnJWFmJzogJ1xceGFmJywgJyVBZic6ICdcXHhhZicsICclYUYnOiAnXFx4YWYnLCAnJUFGJzogJ1xceGFmJywgJyViMCc6ICdcXHhiMCcsXG4gICclQjAnOiAnXFx4YjAnLCAnJWIxJzogJ1xceGIxJywgJyVCMSc6ICdcXHhiMScsICclYjInOiAnXFx4YjInLCAnJUIyJzogJ1xceGIyJyxcbiAgJyViMyc6ICdcXHhiMycsICclQjMnOiAnXFx4YjMnLCAnJWI0JzogJ1xceGI0JywgJyVCNCc6ICdcXHhiNCcsICclYjUnOiAnXFx4YjUnLFxuICAnJUI1JzogJ1xceGI1JywgJyViNic6ICdcXHhiNicsICclQjYnOiAnXFx4YjYnLCAnJWI3JzogJ1xceGI3JywgJyVCNyc6ICdcXHhiNycsXG4gICclYjgnOiAnXFx4YjgnLCAnJUI4JzogJ1xceGI4JywgJyViOSc6ICdcXHhiOScsICclQjknOiAnXFx4YjknLCAnJWJhJzogJ1xceGJhJyxcbiAgJyVCYSc6ICdcXHhiYScsICclYkEnOiAnXFx4YmEnLCAnJUJBJzogJ1xceGJhJywgJyViYic6ICdcXHhiYicsICclQmInOiAnXFx4YmInLFxuICAnJWJCJzogJ1xceGJiJywgJyVCQic6ICdcXHhiYicsICclYmMnOiAnXFx4YmMnLCAnJUJjJzogJ1xceGJjJywgJyViQyc6ICdcXHhiYycsXG4gICclQkMnOiAnXFx4YmMnLCAnJWJkJzogJ1xceGJkJywgJyVCZCc6ICdcXHhiZCcsICclYkQnOiAnXFx4YmQnLCAnJUJEJzogJ1xceGJkJyxcbiAgJyViZSc6ICdcXHhiZScsICclQmUnOiAnXFx4YmUnLCAnJWJFJzogJ1xceGJlJywgJyVCRSc6ICdcXHhiZScsICclYmYnOiAnXFx4YmYnLFxuICAnJUJmJzogJ1xceGJmJywgJyViRic6ICdcXHhiZicsICclQkYnOiAnXFx4YmYnLCAnJWMwJzogJ1xceGMwJywgJyVDMCc6ICdcXHhjMCcsXG4gICclYzEnOiAnXFx4YzEnLCAnJUMxJzogJ1xceGMxJywgJyVjMic6ICdcXHhjMicsICclQzInOiAnXFx4YzInLCAnJWMzJzogJ1xceGMzJyxcbiAgJyVDMyc6ICdcXHhjMycsICclYzQnOiAnXFx4YzQnLCAnJUM0JzogJ1xceGM0JywgJyVjNSc6ICdcXHhjNScsICclQzUnOiAnXFx4YzUnLFxuICAnJWM2JzogJ1xceGM2JywgJyVDNic6ICdcXHhjNicsICclYzcnOiAnXFx4YzcnLCAnJUM3JzogJ1xceGM3JywgJyVjOCc6ICdcXHhjOCcsXG4gICclQzgnOiAnXFx4YzgnLCAnJWM5JzogJ1xceGM5JywgJyVDOSc6ICdcXHhjOScsICclY2EnOiAnXFx4Y2EnLCAnJUNhJzogJ1xceGNhJyxcbiAgJyVjQSc6ICdcXHhjYScsICclQ0EnOiAnXFx4Y2EnLCAnJWNiJzogJ1xceGNiJywgJyVDYic6ICdcXHhjYicsICclY0InOiAnXFx4Y2InLFxuICAnJUNCJzogJ1xceGNiJywgJyVjYyc6ICdcXHhjYycsICclQ2MnOiAnXFx4Y2MnLCAnJWNDJzogJ1xceGNjJywgJyVDQyc6ICdcXHhjYycsXG4gICclY2QnOiAnXFx4Y2QnLCAnJUNkJzogJ1xceGNkJywgJyVjRCc6ICdcXHhjZCcsICclQ0QnOiAnXFx4Y2QnLCAnJWNlJzogJ1xceGNlJyxcbiAgJyVDZSc6ICdcXHhjZScsICclY0UnOiAnXFx4Y2UnLCAnJUNFJzogJ1xceGNlJywgJyVjZic6ICdcXHhjZicsICclQ2YnOiAnXFx4Y2YnLFxuICAnJWNGJzogJ1xceGNmJywgJyVDRic6ICdcXHhjZicsICclZDAnOiAnXFx4ZDAnLCAnJUQwJzogJ1xceGQwJywgJyVkMSc6ICdcXHhkMScsXG4gICclRDEnOiAnXFx4ZDEnLCAnJWQyJzogJ1xceGQyJywgJyVEMic6ICdcXHhkMicsICclZDMnOiAnXFx4ZDMnLCAnJUQzJzogJ1xceGQzJyxcbiAgJyVkNCc6ICdcXHhkNCcsICclRDQnOiAnXFx4ZDQnLCAnJWQ1JzogJ1xceGQ1JywgJyVENSc6ICdcXHhkNScsICclZDYnOiAnXFx4ZDYnLFxuICAnJUQ2JzogJ1xceGQ2JywgJyVkNyc6ICdcXHhkNycsICclRDcnOiAnXFx4ZDcnLCAnJWQ4JzogJ1xceGQ4JywgJyVEOCc6ICdcXHhkOCcsXG4gICclZDknOiAnXFx4ZDknLCAnJUQ5JzogJ1xceGQ5JywgJyVkYSc6ICdcXHhkYScsICclRGEnOiAnXFx4ZGEnLCAnJWRBJzogJ1xceGRhJyxcbiAgJyVEQSc6ICdcXHhkYScsICclZGInOiAnXFx4ZGInLCAnJURiJzogJ1xceGRiJywgJyVkQic6ICdcXHhkYicsICclREInOiAnXFx4ZGInLFxuICAnJWRjJzogJ1xceGRjJywgJyVEYyc6ICdcXHhkYycsICclZEMnOiAnXFx4ZGMnLCAnJURDJzogJ1xceGRjJywgJyVkZCc6ICdcXHhkZCcsXG4gICclRGQnOiAnXFx4ZGQnLCAnJWREJzogJ1xceGRkJywgJyVERCc6ICdcXHhkZCcsICclZGUnOiAnXFx4ZGUnLCAnJURlJzogJ1xceGRlJyxcbiAgJyVkRSc6ICdcXHhkZScsICclREUnOiAnXFx4ZGUnLCAnJWRmJzogJ1xceGRmJywgJyVEZic6ICdcXHhkZicsICclZEYnOiAnXFx4ZGYnLFxuICAnJURGJzogJ1xceGRmJywgJyVlMCc6ICdcXHhlMCcsICclRTAnOiAnXFx4ZTAnLCAnJWUxJzogJ1xceGUxJywgJyVFMSc6ICdcXHhlMScsXG4gICclZTInOiAnXFx4ZTInLCAnJUUyJzogJ1xceGUyJywgJyVlMyc6ICdcXHhlMycsICclRTMnOiAnXFx4ZTMnLCAnJWU0JzogJ1xceGU0JyxcbiAgJyVFNCc6ICdcXHhlNCcsICclZTUnOiAnXFx4ZTUnLCAnJUU1JzogJ1xceGU1JywgJyVlNic6ICdcXHhlNicsICclRTYnOiAnXFx4ZTYnLFxuICAnJWU3JzogJ1xceGU3JywgJyVFNyc6ICdcXHhlNycsICclZTgnOiAnXFx4ZTgnLCAnJUU4JzogJ1xceGU4JywgJyVlOSc6ICdcXHhlOScsXG4gICclRTknOiAnXFx4ZTknLCAnJWVhJzogJ1xceGVhJywgJyVFYSc6ICdcXHhlYScsICclZUEnOiAnXFx4ZWEnLCAnJUVBJzogJ1xceGVhJyxcbiAgJyVlYic6ICdcXHhlYicsICclRWInOiAnXFx4ZWInLCAnJWVCJzogJ1xceGViJywgJyVFQic6ICdcXHhlYicsICclZWMnOiAnXFx4ZWMnLFxuICAnJUVjJzogJ1xceGVjJywgJyVlQyc6ICdcXHhlYycsICclRUMnOiAnXFx4ZWMnLCAnJWVkJzogJ1xceGVkJywgJyVFZCc6ICdcXHhlZCcsXG4gICclZUQnOiAnXFx4ZWQnLCAnJUVEJzogJ1xceGVkJywgJyVlZSc6ICdcXHhlZScsICclRWUnOiAnXFx4ZWUnLCAnJWVFJzogJ1xceGVlJyxcbiAgJyVFRSc6ICdcXHhlZScsICclZWYnOiAnXFx4ZWYnLCAnJUVmJzogJ1xceGVmJywgJyVlRic6ICdcXHhlZicsICclRUYnOiAnXFx4ZWYnLFxuICAnJWYwJzogJ1xceGYwJywgJyVGMCc6ICdcXHhmMCcsICclZjEnOiAnXFx4ZjEnLCAnJUYxJzogJ1xceGYxJywgJyVmMic6ICdcXHhmMicsXG4gICclRjInOiAnXFx4ZjInLCAnJWYzJzogJ1xceGYzJywgJyVGMyc6ICdcXHhmMycsICclZjQnOiAnXFx4ZjQnLCAnJUY0JzogJ1xceGY0JyxcbiAgJyVmNSc6ICdcXHhmNScsICclRjUnOiAnXFx4ZjUnLCAnJWY2JzogJ1xceGY2JywgJyVGNic6ICdcXHhmNicsICclZjcnOiAnXFx4ZjcnLFxuICAnJUY3JzogJ1xceGY3JywgJyVmOCc6ICdcXHhmOCcsICclRjgnOiAnXFx4ZjgnLCAnJWY5JzogJ1xceGY5JywgJyVGOSc6ICdcXHhmOScsXG4gICclZmEnOiAnXFx4ZmEnLCAnJUZhJzogJ1xceGZhJywgJyVmQSc6ICdcXHhmYScsICclRkEnOiAnXFx4ZmEnLCAnJWZiJzogJ1xceGZiJyxcbiAgJyVGYic6ICdcXHhmYicsICclZkInOiAnXFx4ZmInLCAnJUZCJzogJ1xceGZiJywgJyVmYyc6ICdcXHhmYycsICclRmMnOiAnXFx4ZmMnLFxuICAnJWZDJzogJ1xceGZjJywgJyVGQyc6ICdcXHhmYycsICclZmQnOiAnXFx4ZmQnLCAnJUZkJzogJ1xceGZkJywgJyVmRCc6ICdcXHhmZCcsXG4gICclRkQnOiAnXFx4ZmQnLCAnJWZlJzogJ1xceGZlJywgJyVGZSc6ICdcXHhmZScsICclZkUnOiAnXFx4ZmUnLCAnJUZFJzogJ1xceGZlJyxcbiAgJyVmZic6ICdcXHhmZicsICclRmYnOiAnXFx4ZmYnLCAnJWZGJzogJ1xceGZmJywgJyVGRic6ICdcXHhmZidcbn1cblxuZnVuY3Rpb24gZW5jb2RlZFJlcGxhY2VyIChtYXRjaCkge1xuICByZXR1cm4gRW5jb2RlZExvb2t1cFttYXRjaF1cbn1cblxuY29uc3QgU1RBVEVfS0VZID0gMFxuY29uc3QgU1RBVEVfVkFMVUUgPSAxXG5jb25zdCBTVEFURV9DSEFSU0VUID0gMlxuY29uc3QgU1RBVEVfTEFORyA9IDNcblxuZnVuY3Rpb24gcGFyc2VQYXJhbXMgKHN0cikge1xuICBjb25zdCByZXMgPSBbXVxuICBsZXQgc3RhdGUgPSBTVEFURV9LRVlcbiAgbGV0IGNoYXJzZXQgPSAnJ1xuICBsZXQgaW5xdW90ZSA9IGZhbHNlXG4gIGxldCBlc2NhcGluZyA9IGZhbHNlXG4gIGxldCBwID0gMFxuICBsZXQgdG1wID0gJydcbiAgY29uc3QgbGVuID0gc3RyLmxlbmd0aFxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby12YXJcbiAgICBjb25zdCBjaGFyID0gc3RyW2ldXG4gICAgaWYgKGNoYXIgPT09ICdcXFxcJyAmJiBpbnF1b3RlKSB7XG4gICAgICBpZiAoZXNjYXBpbmcpIHsgZXNjYXBpbmcgPSBmYWxzZSB9IGVsc2Uge1xuICAgICAgICBlc2NhcGluZyA9IHRydWVcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNoYXIgPT09ICdcIicpIHtcbiAgICAgIGlmICghZXNjYXBpbmcpIHtcbiAgICAgICAgaWYgKGlucXVvdGUpIHtcbiAgICAgICAgICBpbnF1b3RlID0gZmFsc2VcbiAgICAgICAgICBzdGF0ZSA9IFNUQVRFX0tFWVxuICAgICAgICB9IGVsc2UgeyBpbnF1b3RlID0gdHJ1ZSB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgeyBlc2NhcGluZyA9IGZhbHNlIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVzY2FwaW5nICYmIGlucXVvdGUpIHsgdG1wICs9ICdcXFxcJyB9XG4gICAgICBlc2NhcGluZyA9IGZhbHNlXG4gICAgICBpZiAoKHN0YXRlID09PSBTVEFURV9DSEFSU0VUIHx8IHN0YXRlID09PSBTVEFURV9MQU5HKSAmJiBjaGFyID09PSBcIidcIikge1xuICAgICAgICBpZiAoc3RhdGUgPT09IFNUQVRFX0NIQVJTRVQpIHtcbiAgICAgICAgICBzdGF0ZSA9IFNUQVRFX0xBTkdcbiAgICAgICAgICBjaGFyc2V0ID0gdG1wLnN1YnN0cmluZygxKVxuICAgICAgICB9IGVsc2UgeyBzdGF0ZSA9IFNUQVRFX1ZBTFVFIH1cbiAgICAgICAgdG1wID0gJydcbiAgICAgICAgY29udGludWVcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IFNUQVRFX0tFWSAmJlxuICAgICAgICAoY2hhciA9PT0gJyonIHx8IGNoYXIgPT09ICc9JykgJiZcbiAgICAgICAgcmVzLmxlbmd0aCkge1xuICAgICAgICBzdGF0ZSA9IGNoYXIgPT09ICcqJ1xuICAgICAgICAgID8gU1RBVEVfQ0hBUlNFVFxuICAgICAgICAgIDogU1RBVEVfVkFMVUVcbiAgICAgICAgcmVzW3BdID0gW3RtcCwgdW5kZWZpbmVkXVxuICAgICAgICB0bXAgPSAnJ1xuICAgICAgICBjb250aW51ZVxuICAgICAgfSBlbHNlIGlmICghaW5xdW90ZSAmJiBjaGFyID09PSAnOycpIHtcbiAgICAgICAgc3RhdGUgPSBTVEFURV9LRVlcbiAgICAgICAgaWYgKGNoYXJzZXQpIHtcbiAgICAgICAgICBpZiAodG1wLmxlbmd0aCkge1xuICAgICAgICAgICAgdG1wID0gZGVjb2RlVGV4dCh0bXAucmVwbGFjZShSRV9FTkNPREVELCBlbmNvZGVkUmVwbGFjZXIpLFxuICAgICAgICAgICAgICAnYmluYXJ5JyxcbiAgICAgICAgICAgICAgY2hhcnNldClcbiAgICAgICAgICB9XG4gICAgICAgICAgY2hhcnNldCA9ICcnXG4gICAgICAgIH0gZWxzZSBpZiAodG1wLmxlbmd0aCkge1xuICAgICAgICAgIHRtcCA9IGRlY29kZVRleHQodG1wLCAnYmluYXJ5JywgJ3V0ZjgnKVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNbcF0gPT09IHVuZGVmaW5lZCkgeyByZXNbcF0gPSB0bXAgfSBlbHNlIHsgcmVzW3BdWzFdID0gdG1wIH1cbiAgICAgICAgdG1wID0gJydcbiAgICAgICAgKytwXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYgKCFpbnF1b3RlICYmIChjaGFyID09PSAnICcgfHwgY2hhciA9PT0gJ1xcdCcpKSB7IGNvbnRpbnVlIH1cbiAgICB9XG4gICAgdG1wICs9IGNoYXJcbiAgfVxuICBpZiAoY2hhcnNldCAmJiB0bXAubGVuZ3RoKSB7XG4gICAgdG1wID0gZGVjb2RlVGV4dCh0bXAucmVwbGFjZShSRV9FTkNPREVELCBlbmNvZGVkUmVwbGFjZXIpLFxuICAgICAgJ2JpbmFyeScsXG4gICAgICBjaGFyc2V0KVxuICB9IGVsc2UgaWYgKHRtcCkge1xuICAgIHRtcCA9IGRlY29kZVRleHQodG1wLCAnYmluYXJ5JywgJ3V0ZjgnKVxuICB9XG5cbiAgaWYgKHJlc1twXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRtcCkgeyByZXNbcF0gPSB0bXAgfVxuICB9IGVsc2UgeyByZXNbcF1bMV0gPSB0bXAgfVxuXG4gIHJldHVybiByZXNcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZVBhcmFtc1xuIiwiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYmFzZW5hbWUgKHBhdGgpIHtcbiAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykgeyByZXR1cm4gJycgfVxuICBmb3IgKHZhciBpID0gcGF0aC5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXZhclxuICAgIHN3aXRjaCAocGF0aC5jaGFyQ29kZUF0KGkpKSB7XG4gICAgICBjYXNlIDB4MkY6IC8vICcvJ1xuICAgICAgY2FzZSAweDVDOiAvLyAnXFwnXG4gICAgICAgIHBhdGggPSBwYXRoLnNsaWNlKGkgKyAxKVxuICAgICAgICByZXR1cm4gKHBhdGggPT09ICcuLicgfHwgcGF0aCA9PT0gJy4nID8gJycgOiBwYXRoKVxuICAgIH1cbiAgfVxuICByZXR1cm4gKHBhdGggPT09ICcuLicgfHwgcGF0aCA9PT0gJy4nID8gJycgOiBwYXRoKVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbi8vIFRPRE86XG4vLyAgKiBzdXBwb3J0IDEgbmVzdGVkIG11bHRpcGFydCBsZXZlbFxuLy8gICAgKHNlZSBzZWNvbmQgbXVsdGlwYXJ0IGV4YW1wbGUgaGVyZTpcbi8vICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNDAxL2ludGVyYWN0L2Zvcm1zLmh0bWwjZGlkeC1tdWx0aXBhcnRmb3JtLWRhdGEpXG4vLyAgKiBzdXBwb3J0IGxpbWl0cy5maWVsZE5hbWVTaXplXG4vLyAgICAgLS0gdGhpcyB3aWxsIHJlcXVpcmUgbW9kaWZpY2F0aW9ucyB0byB1dGlscy5wYXJzZVBhcmFtc1xuXG5jb25zdCB7IFJlYWRhYmxlIH0gPSByZXF1aXJlKCdub2RlOnN0cmVhbScpXG5jb25zdCB7IGluaGVyaXRzIH0gPSByZXF1aXJlKCdub2RlOnV0aWwnKVxuXG5jb25zdCBEaWNlciA9IHJlcXVpcmUoJy4uLy4uL2RlcHMvZGljZXIvbGliL0RpY2VyJylcblxuY29uc3QgcGFyc2VQYXJhbXMgPSByZXF1aXJlKCcuLi91dGlscy9wYXJzZVBhcmFtcycpXG5jb25zdCBkZWNvZGVUZXh0ID0gcmVxdWlyZSgnLi4vdXRpbHMvZGVjb2RlVGV4dCcpXG5jb25zdCBiYXNlbmFtZSA9IHJlcXVpcmUoJy4uL3V0aWxzL2Jhc2VuYW1lJylcbmNvbnN0IGdldExpbWl0ID0gcmVxdWlyZSgnLi4vdXRpbHMvZ2V0TGltaXQnKVxuXG5jb25zdCBSRV9CT1VOREFSWSA9IC9eYm91bmRhcnkkL2lcbmNvbnN0IFJFX0ZJRUxEID0gL15mb3JtLWRhdGEkL2lcbmNvbnN0IFJFX0NIQVJTRVQgPSAvXmNoYXJzZXQkL2lcbmNvbnN0IFJFX0ZJTEVOQU1FID0gL15maWxlbmFtZSQvaVxuY29uc3QgUkVfTkFNRSA9IC9ebmFtZSQvaVxuXG5NdWx0aXBhcnQuZGV0ZWN0ID0gL15tdWx0aXBhcnRcXC9mb3JtLWRhdGEvaVxuZnVuY3Rpb24gTXVsdGlwYXJ0IChib3ksIGNmZykge1xuICBsZXQgaVxuICBsZXQgbGVuXG4gIGNvbnN0IHNlbGYgPSB0aGlzXG4gIGxldCBib3VuZGFyeVxuICBjb25zdCBsaW1pdHMgPSBjZmcubGltaXRzXG4gIGNvbnN0IGlzUGFydEFGaWxlID0gY2ZnLmlzUGFydEFGaWxlIHx8ICgoZmllbGROYW1lLCBjb250ZW50VHlwZSwgZmlsZU5hbWUpID0+IChjb250ZW50VHlwZSA9PT0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgfHwgZmlsZU5hbWUgIT09IHVuZGVmaW5lZCkpXG4gIGNvbnN0IHBhcnNlZENvblR5cGUgPSBjZmcucGFyc2VkQ29uVHlwZSB8fCBbXVxuICBjb25zdCBkZWZDaGFyc2V0ID0gY2ZnLmRlZkNoYXJzZXQgfHwgJ3V0ZjgnXG4gIGNvbnN0IHByZXNlcnZlUGF0aCA9IGNmZy5wcmVzZXJ2ZVBhdGhcbiAgY29uc3QgZmlsZU9wdHMgPSB7IGhpZ2hXYXRlck1hcms6IGNmZy5maWxlSHdtIH1cblxuICBmb3IgKGkgPSAwLCBsZW4gPSBwYXJzZWRDb25UeXBlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGFyc2VkQ29uVHlwZVtpXSkgJiZcbiAgICAgIFJFX0JPVU5EQVJZLnRlc3QocGFyc2VkQ29uVHlwZVtpXVswXSkpIHtcbiAgICAgIGJvdW5kYXJ5ID0gcGFyc2VkQ29uVHlwZVtpXVsxXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjaGVja0ZpbmlzaGVkICgpIHtcbiAgICBpZiAobmVuZHMgPT09IDAgJiYgZmluaXNoZWQgJiYgIWJveS5fZG9uZSkge1xuICAgICAgZmluaXNoZWQgPSBmYWxzZVxuICAgICAgc2VsZi5lbmQoKVxuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgYm91bmRhcnkgIT09ICdzdHJpbmcnKSB7IHRocm93IG5ldyBFcnJvcignTXVsdGlwYXJ0OiBCb3VuZGFyeSBub3QgZm91bmQnKSB9XG5cbiAgY29uc3QgZmllbGRTaXplTGltaXQgPSBnZXRMaW1pdChsaW1pdHMsICdmaWVsZFNpemUnLCAxICogMTAyNCAqIDEwMjQpXG4gIGNvbnN0IGZpbGVTaXplTGltaXQgPSBnZXRMaW1pdChsaW1pdHMsICdmaWxlU2l6ZScsIEluZmluaXR5KVxuICBjb25zdCBmaWxlc0xpbWl0ID0gZ2V0TGltaXQobGltaXRzLCAnZmlsZXMnLCBJbmZpbml0eSlcbiAgY29uc3QgZmllbGRzTGltaXQgPSBnZXRMaW1pdChsaW1pdHMsICdmaWVsZHMnLCBJbmZpbml0eSlcbiAgY29uc3QgcGFydHNMaW1pdCA9IGdldExpbWl0KGxpbWl0cywgJ3BhcnRzJywgSW5maW5pdHkpXG4gIGNvbnN0IGhlYWRlclBhaXJzTGltaXQgPSBnZXRMaW1pdChsaW1pdHMsICdoZWFkZXJQYWlycycsIDIwMDApXG4gIGNvbnN0IGhlYWRlclNpemVMaW1pdCA9IGdldExpbWl0KGxpbWl0cywgJ2hlYWRlclNpemUnLCA4MCAqIDEwMjQpXG5cbiAgbGV0IG5maWxlcyA9IDBcbiAgbGV0IG5maWVsZHMgPSAwXG4gIGxldCBuZW5kcyA9IDBcbiAgbGV0IGN1ckZpbGVcbiAgbGV0IGN1ckZpZWxkXG4gIGxldCBmaW5pc2hlZCA9IGZhbHNlXG5cbiAgdGhpcy5fbmVlZERyYWluID0gZmFsc2VcbiAgdGhpcy5fcGF1c2UgPSBmYWxzZVxuICB0aGlzLl9jYiA9IHVuZGVmaW5lZFxuICB0aGlzLl9ucGFydHMgPSAwXG4gIHRoaXMuX2JveSA9IGJveVxuXG4gIGNvbnN0IHBhcnNlckNmZyA9IHtcbiAgICBib3VuZGFyeSxcbiAgICBtYXhIZWFkZXJQYWlyczogaGVhZGVyUGFpcnNMaW1pdCxcbiAgICBtYXhIZWFkZXJTaXplOiBoZWFkZXJTaXplTGltaXQsXG4gICAgcGFydEh3bTogZmlsZU9wdHMuaGlnaFdhdGVyTWFyayxcbiAgICBoaWdoV2F0ZXJNYXJrOiBjZmcuaGlnaFdhdGVyTWFya1xuICB9XG5cbiAgdGhpcy5wYXJzZXIgPSBuZXcgRGljZXIocGFyc2VyQ2ZnKVxuICB0aGlzLnBhcnNlci5vbignZHJhaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgc2VsZi5fbmVlZERyYWluID0gZmFsc2VcbiAgICBpZiAoc2VsZi5fY2IgJiYgIXNlbGYuX3BhdXNlKSB7XG4gICAgICBjb25zdCBjYiA9IHNlbGYuX2NiXG4gICAgICBzZWxmLl9jYiA9IHVuZGVmaW5lZFxuICAgICAgY2IoKVxuICAgIH1cbiAgfSkub24oJ3BhcnQnLCBmdW5jdGlvbiBvblBhcnQgKHBhcnQpIHtcbiAgICBpZiAoKytzZWxmLl9ucGFydHMgPiBwYXJ0c0xpbWl0KSB7XG4gICAgICBzZWxmLnBhcnNlci5yZW1vdmVMaXN0ZW5lcigncGFydCcsIG9uUGFydClcbiAgICAgIHNlbGYucGFyc2VyLm9uKCdwYXJ0Jywgc2tpcFBhcnQpXG4gICAgICBib3kuaGl0UGFydHNMaW1pdCA9IHRydWVcbiAgICAgIGJveS5lbWl0KCdwYXJ0c0xpbWl0JylcbiAgICAgIHJldHVybiBza2lwUGFydChwYXJ0KVxuICAgIH1cblxuICAgIC8vIGhhY2sgYmVjYXVzZSBzdHJlYW1zMiBfYWx3YXlzXyBkb2Vzbid0IGVtaXQgJ2VuZCcgdW50aWwgbmV4dFRpY2ssIHNvIGxldFxuICAgIC8vIHVzIGVtaXQgJ2VuZCcgZWFybHkgc2luY2Ugd2Uga25vdyB0aGUgcGFydCBoYXMgZW5kZWQgaWYgd2UgYXJlIGFscmVhZHlcbiAgICAvLyBzZWVpbmcgdGhlIG5leHQgcGFydFxuICAgIGlmIChjdXJGaWVsZCkge1xuICAgICAgY29uc3QgZmllbGQgPSBjdXJGaWVsZFxuICAgICAgZmllbGQuZW1pdCgnZW5kJylcbiAgICAgIGZpZWxkLnJlbW92ZUFsbExpc3RlbmVycygnZW5kJylcbiAgICB9XG5cbiAgICBwYXJ0Lm9uKCdoZWFkZXInLCBmdW5jdGlvbiAoaGVhZGVyKSB7XG4gICAgICBsZXQgY29udHlwZVxuICAgICAgbGV0IGZpZWxkbmFtZVxuICAgICAgbGV0IHBhcnNlZFxuICAgICAgbGV0IGNoYXJzZXRcbiAgICAgIGxldCBlbmNvZGluZ1xuICAgICAgbGV0IGZpbGVuYW1lXG4gICAgICBsZXQgbnNpemUgPSAwXG5cbiAgICAgIGlmIChoZWFkZXJbJ2NvbnRlbnQtdHlwZSddKSB7XG4gICAgICAgIHBhcnNlZCA9IHBhcnNlUGFyYW1zKGhlYWRlclsnY29udGVudC10eXBlJ11bMF0pXG4gICAgICAgIGlmIChwYXJzZWRbMF0pIHtcbiAgICAgICAgICBjb250eXBlID0gcGFyc2VkWzBdLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBwYXJzZWQubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChSRV9DSEFSU0VULnRlc3QocGFyc2VkW2ldWzBdKSkge1xuICAgICAgICAgICAgICBjaGFyc2V0ID0gcGFyc2VkW2ldWzFdLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNvbnR5cGUgPT09IHVuZGVmaW5lZCkgeyBjb250eXBlID0gJ3RleHQvcGxhaW4nIH1cbiAgICAgIGlmIChjaGFyc2V0ID09PSB1bmRlZmluZWQpIHsgY2hhcnNldCA9IGRlZkNoYXJzZXQgfVxuXG4gICAgICBpZiAoaGVhZGVyWydjb250ZW50LWRpc3Bvc2l0aW9uJ10pIHtcbiAgICAgICAgcGFyc2VkID0gcGFyc2VQYXJhbXMoaGVhZGVyWydjb250ZW50LWRpc3Bvc2l0aW9uJ11bMF0pXG4gICAgICAgIGlmICghUkVfRklFTEQudGVzdChwYXJzZWRbMF0pKSB7IHJldHVybiBza2lwUGFydChwYXJ0KSB9XG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHBhcnNlZC5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgIGlmIChSRV9OQU1FLnRlc3QocGFyc2VkW2ldWzBdKSkge1xuICAgICAgICAgICAgZmllbGRuYW1lID0gcGFyc2VkW2ldWzFdXG4gICAgICAgICAgfSBlbHNlIGlmIChSRV9GSUxFTkFNRS50ZXN0KHBhcnNlZFtpXVswXSkpIHtcbiAgICAgICAgICAgIGZpbGVuYW1lID0gcGFyc2VkW2ldWzFdXG4gICAgICAgICAgICBpZiAoIXByZXNlcnZlUGF0aCkgeyBmaWxlbmFtZSA9IGJhc2VuYW1lKGZpbGVuYW1lKSB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgeyByZXR1cm4gc2tpcFBhcnQocGFydCkgfVxuXG4gICAgICBpZiAoaGVhZGVyWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10pIHsgZW5jb2RpbmcgPSBoZWFkZXJbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXVswXS50b0xvd2VyQ2FzZSgpIH0gZWxzZSB7IGVuY29kaW5nID0gJzdiaXQnIH1cblxuICAgICAgbGV0IG9uRGF0YSxcbiAgICAgICAgb25FbmRcblxuICAgICAgaWYgKGlzUGFydEFGaWxlKGZpZWxkbmFtZSwgY29udHlwZSwgZmlsZW5hbWUpKSB7XG4gICAgICAgIC8vIGZpbGUvYmluYXJ5IGZpZWxkXG4gICAgICAgIGlmIChuZmlsZXMgPT09IGZpbGVzTGltaXQpIHtcbiAgICAgICAgICBpZiAoIWJveS5oaXRGaWxlc0xpbWl0KSB7XG4gICAgICAgICAgICBib3kuaGl0RmlsZXNMaW1pdCA9IHRydWVcbiAgICAgICAgICAgIGJveS5lbWl0KCdmaWxlc0xpbWl0JylcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHNraXBQYXJ0KHBhcnQpXG4gICAgICAgIH1cblxuICAgICAgICArK25maWxlc1xuXG4gICAgICAgIGlmIChib3kubGlzdGVuZXJDb3VudCgnZmlsZScpID09PSAwKSB7XG4gICAgICAgICAgc2VsZi5wYXJzZXIuX2lnbm9yZSgpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICArK25lbmRzXG4gICAgICAgIGNvbnN0IGZpbGUgPSBuZXcgRmlsZVN0cmVhbShmaWxlT3B0cylcbiAgICAgICAgY3VyRmlsZSA9IGZpbGVcbiAgICAgICAgZmlsZS5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC0tbmVuZHNcbiAgICAgICAgICBzZWxmLl9wYXVzZSA9IGZhbHNlXG4gICAgICAgICAgY2hlY2tGaW5pc2hlZCgpXG4gICAgICAgICAgaWYgKHNlbGYuX2NiICYmICFzZWxmLl9uZWVkRHJhaW4pIHtcbiAgICAgICAgICAgIGNvbnN0IGNiID0gc2VsZi5fY2JcbiAgICAgICAgICAgIHNlbGYuX2NiID0gdW5kZWZpbmVkXG4gICAgICAgICAgICBjYigpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBmaWxlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICBpZiAoIXNlbGYuX3BhdXNlKSB7IHJldHVybiB9XG4gICAgICAgICAgc2VsZi5fcGF1c2UgPSBmYWxzZVxuICAgICAgICAgIGlmIChzZWxmLl9jYiAmJiAhc2VsZi5fbmVlZERyYWluKSB7XG4gICAgICAgICAgICBjb25zdCBjYiA9IHNlbGYuX2NiXG4gICAgICAgICAgICBzZWxmLl9jYiA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgY2IoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBib3kuZW1pdCgnZmlsZScsIGZpZWxkbmFtZSwgZmlsZSwgZmlsZW5hbWUsIGVuY29kaW5nLCBjb250eXBlKVxuXG4gICAgICAgIG9uRGF0YSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgaWYgKChuc2l6ZSArPSBkYXRhLmxlbmd0aCkgPiBmaWxlU2l6ZUxpbWl0KSB7XG4gICAgICAgICAgICBjb25zdCBleHRyYWxlbiA9IGZpbGVTaXplTGltaXQgLSBuc2l6ZSArIGRhdGEubGVuZ3RoXG4gICAgICAgICAgICBpZiAoZXh0cmFsZW4gPiAwKSB7IGZpbGUucHVzaChkYXRhLnNsaWNlKDAsIGV4dHJhbGVuKSkgfVxuICAgICAgICAgICAgZmlsZS50cnVuY2F0ZWQgPSB0cnVlXG4gICAgICAgICAgICBmaWxlLmJ5dGVzUmVhZCA9IGZpbGVTaXplTGltaXRcbiAgICAgICAgICAgIHBhcnQucmVtb3ZlQWxsTGlzdGVuZXJzKCdkYXRhJylcbiAgICAgICAgICAgIGZpbGUuZW1pdCgnbGltaXQnKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfSBlbHNlIGlmICghZmlsZS5wdXNoKGRhdGEpKSB7IHNlbGYuX3BhdXNlID0gdHJ1ZSB9XG5cbiAgICAgICAgICBmaWxlLmJ5dGVzUmVhZCA9IG5zaXplXG4gICAgICAgIH1cblxuICAgICAgICBvbkVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjdXJGaWxlID0gdW5kZWZpbmVkXG4gICAgICAgICAgZmlsZS5wdXNoKG51bGwpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG5vbi1maWxlIGZpZWxkXG4gICAgICAgIGlmIChuZmllbGRzID09PSBmaWVsZHNMaW1pdCkge1xuICAgICAgICAgIGlmICghYm95LmhpdEZpZWxkc0xpbWl0KSB7XG4gICAgICAgICAgICBib3kuaGl0RmllbGRzTGltaXQgPSB0cnVlXG4gICAgICAgICAgICBib3kuZW1pdCgnZmllbGRzTGltaXQnKVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gc2tpcFBhcnQocGFydClcbiAgICAgICAgfVxuXG4gICAgICAgICsrbmZpZWxkc1xuICAgICAgICArK25lbmRzXG4gICAgICAgIGxldCBidWZmZXIgPSAnJ1xuICAgICAgICBsZXQgdHJ1bmNhdGVkID0gZmFsc2VcbiAgICAgICAgY3VyRmllbGQgPSBwYXJ0XG5cbiAgICAgICAgb25EYXRhID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICBpZiAoKG5zaXplICs9IGRhdGEubGVuZ3RoKSA+IGZpZWxkU2l6ZUxpbWl0KSB7XG4gICAgICAgICAgICBjb25zdCBleHRyYWxlbiA9IChmaWVsZFNpemVMaW1pdCAtIChuc2l6ZSAtIGRhdGEubGVuZ3RoKSlcbiAgICAgICAgICAgIGJ1ZmZlciArPSBkYXRhLnRvU3RyaW5nKCdiaW5hcnknLCAwLCBleHRyYWxlbilcbiAgICAgICAgICAgIHRydW5jYXRlZCA9IHRydWVcbiAgICAgICAgICAgIHBhcnQucmVtb3ZlQWxsTGlzdGVuZXJzKCdkYXRhJylcbiAgICAgICAgICB9IGVsc2UgeyBidWZmZXIgKz0gZGF0YS50b1N0cmluZygnYmluYXJ5JykgfVxuICAgICAgICB9XG5cbiAgICAgICAgb25FbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY3VyRmllbGQgPSB1bmRlZmluZWRcbiAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCkgeyBidWZmZXIgPSBkZWNvZGVUZXh0KGJ1ZmZlciwgJ2JpbmFyeScsIGNoYXJzZXQpIH1cbiAgICAgICAgICBib3kuZW1pdCgnZmllbGQnLCBmaWVsZG5hbWUsIGJ1ZmZlciwgZmFsc2UsIHRydW5jYXRlZCwgZW5jb2RpbmcsIGNvbnR5cGUpXG4gICAgICAgICAgLS1uZW5kc1xuICAgICAgICAgIGNoZWNrRmluaXNoZWQoKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8qIEFzIG9mIG5vZGVAMmVmZTRhYjc2MTY2NiAodjAuMTAuMjkrL3YwLjExLjE0KyksIGJ1c2JveSBoYWQgYmVjb21lXG4gICAgICAgICBicm9rZW4uIFN0cmVhbXMyL3N0cmVhbXMzIGlzIGEgaHVnZSBibGFjayBib3ggb2YgY29uZnVzaW9uLCBidXRcbiAgICAgICAgIHNvbWVob3cgb3ZlcnJpZGluZyB0aGUgc3luYyBzdGF0ZSBzZWVtcyB0byBmaXggdGhpbmdzIGFnYWluIChhbmQgc3RpbGxcbiAgICAgICAgIHNlZW1zIHRvIHdvcmsgZm9yIHByZXZpb3VzIG5vZGUgdmVyc2lvbnMpLlxuICAgICAgKi9cbiAgICAgIHBhcnQuX3JlYWRhYmxlU3RhdGUuc3luYyA9IGZhbHNlXG5cbiAgICAgIHBhcnQub24oJ2RhdGEnLCBvbkRhdGEpXG4gICAgICBwYXJ0Lm9uKCdlbmQnLCBvbkVuZClcbiAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoY3VyRmlsZSkgeyBjdXJGaWxlLmVtaXQoJ2Vycm9yJywgZXJyKSB9XG4gICAgfSlcbiAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgIGJveS5lbWl0KCdlcnJvcicsIGVycilcbiAgfSkub24oJ2ZpbmlzaCcsIGZ1bmN0aW9uICgpIHtcbiAgICBmaW5pc2hlZCA9IHRydWVcbiAgICBjaGVja0ZpbmlzaGVkKClcbiAgfSlcbn1cblxuTXVsdGlwYXJ0LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgY2IpIHtcbiAgY29uc3QgciA9IHRoaXMucGFyc2VyLndyaXRlKGNodW5rKVxuICBpZiAociAmJiAhdGhpcy5fcGF1c2UpIHtcbiAgICBjYigpXG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fbmVlZERyYWluID0gIXJcbiAgICB0aGlzLl9jYiA9IGNiXG4gIH1cbn1cblxuTXVsdGlwYXJ0LnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHNlbGYgPSB0aGlzXG5cbiAgaWYgKHNlbGYucGFyc2VyLndyaXRhYmxlKSB7XG4gICAgc2VsZi5wYXJzZXIuZW5kKClcbiAgfSBlbHNlIGlmICghc2VsZi5fYm95Ll9kb25lKSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLl9ib3kuX2RvbmUgPSB0cnVlXG4gICAgICBzZWxmLl9ib3kuZW1pdCgnZmluaXNoJylcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIHNraXBQYXJ0IChwYXJ0KSB7XG4gIHBhcnQucmVzdW1lKClcbn1cblxuZnVuY3Rpb24gRmlsZVN0cmVhbSAob3B0cykge1xuICBSZWFkYWJsZS5jYWxsKHRoaXMsIG9wdHMpXG5cbiAgdGhpcy5ieXRlc1JlYWQgPSAwXG5cbiAgdGhpcy50cnVuY2F0ZWQgPSBmYWxzZVxufVxuXG5pbmhlcml0cyhGaWxlU3RyZWFtLCBSZWFkYWJsZSlcblxuRmlsZVN0cmVhbS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge31cblxubW9kdWxlLmV4cG9ydHMgPSBNdWx0aXBhcnRcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBSRV9QTFVTID0gL1xcKy9nXG5cbmNvbnN0IEhFWCA9IFtcbiAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCxcbiAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCxcbiAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCxcbiAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCxcbiAgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCxcbiAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCxcbiAgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCxcbiAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMFxuXVxuXG5mdW5jdGlvbiBEZWNvZGVyICgpIHtcbiAgdGhpcy5idWZmZXIgPSB1bmRlZmluZWRcbn1cbkRlY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKHN0cikge1xuICAvLyBSZXBsYWNlICcrJyB3aXRoICcgJyBiZWZvcmUgZGVjb2RpbmdcbiAgc3RyID0gc3RyLnJlcGxhY2UoUkVfUExVUywgJyAnKVxuICBsZXQgcmVzID0gJydcbiAgbGV0IGkgPSAwOyBsZXQgcCA9IDA7IGNvbnN0IGxlbiA9IHN0ci5sZW5ndGhcbiAgZm9yICg7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzLmJ1ZmZlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIUhFWFtzdHIuY2hhckNvZGVBdChpKV0pIHtcbiAgICAgICAgcmVzICs9ICclJyArIHRoaXMuYnVmZmVyXG4gICAgICAgIHRoaXMuYnVmZmVyID0gdW5kZWZpbmVkXG4gICAgICAgIC0taSAvLyByZXRyeSBjaGFyYWN0ZXJcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYnVmZmVyICs9IHN0cltpXVxuICAgICAgICArK3BcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KHRoaXMuYnVmZmVyLCAxNikpXG4gICAgICAgICAgdGhpcy5idWZmZXIgPSB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSAnJScpIHtcbiAgICAgIGlmIChpID4gcCkge1xuICAgICAgICByZXMgKz0gc3RyLnN1YnN0cmluZyhwLCBpKVxuICAgICAgICBwID0gaVxuICAgICAgfVxuICAgICAgdGhpcy5idWZmZXIgPSAnJ1xuICAgICAgKytwXG4gICAgfVxuICB9XG4gIGlmIChwIDwgbGVuICYmIHRoaXMuYnVmZmVyID09PSB1bmRlZmluZWQpIHsgcmVzICs9IHN0ci5zdWJzdHJpbmcocCkgfVxuICByZXR1cm4gcmVzXG59XG5EZWNvZGVyLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5idWZmZXIgPSB1bmRlZmluZWRcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBEZWNvZGVyXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgRGVjb2RlciA9IHJlcXVpcmUoJy4uL3V0aWxzL0RlY29kZXInKVxuY29uc3QgZGVjb2RlVGV4dCA9IHJlcXVpcmUoJy4uL3V0aWxzL2RlY29kZVRleHQnKVxuY29uc3QgZ2V0TGltaXQgPSByZXF1aXJlKCcuLi91dGlscy9nZXRMaW1pdCcpXG5cbmNvbnN0IFJFX0NIQVJTRVQgPSAvXmNoYXJzZXQkL2lcblxuVXJsRW5jb2RlZC5kZXRlY3QgPSAvXmFwcGxpY2F0aW9uXFwveC13d3ctZm9ybS11cmxlbmNvZGVkL2lcbmZ1bmN0aW9uIFVybEVuY29kZWQgKGJveSwgY2ZnKSB7XG4gIGNvbnN0IGxpbWl0cyA9IGNmZy5saW1pdHNcbiAgY29uc3QgcGFyc2VkQ29uVHlwZSA9IGNmZy5wYXJzZWRDb25UeXBlXG4gIHRoaXMuYm95ID0gYm95XG5cbiAgdGhpcy5maWVsZFNpemVMaW1pdCA9IGdldExpbWl0KGxpbWl0cywgJ2ZpZWxkU2l6ZScsIDEgKiAxMDI0ICogMTAyNClcbiAgdGhpcy5maWVsZE5hbWVTaXplTGltaXQgPSBnZXRMaW1pdChsaW1pdHMsICdmaWVsZE5hbWVTaXplJywgMTAwKVxuICB0aGlzLmZpZWxkc0xpbWl0ID0gZ2V0TGltaXQobGltaXRzLCAnZmllbGRzJywgSW5maW5pdHkpXG5cbiAgbGV0IGNoYXJzZXRcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHBhcnNlZENvblR5cGUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby12YXJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJzZWRDb25UeXBlW2ldKSAmJlxuICAgICAgICBSRV9DSEFSU0VULnRlc3QocGFyc2VkQ29uVHlwZVtpXVswXSkpIHtcbiAgICAgIGNoYXJzZXQgPSBwYXJzZWRDb25UeXBlW2ldWzFdLnRvTG93ZXJDYXNlKClcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKGNoYXJzZXQgPT09IHVuZGVmaW5lZCkgeyBjaGFyc2V0ID0gY2ZnLmRlZkNoYXJzZXQgfHwgJ3V0ZjgnIH1cblxuICB0aGlzLmRlY29kZXIgPSBuZXcgRGVjb2RlcigpXG4gIHRoaXMuY2hhcnNldCA9IGNoYXJzZXRcbiAgdGhpcy5fZmllbGRzID0gMFxuICB0aGlzLl9zdGF0ZSA9ICdrZXknXG4gIHRoaXMuX2NoZWNraW5nQnl0ZXMgPSB0cnVlXG4gIHRoaXMuX2J5dGVzS2V5ID0gMFxuICB0aGlzLl9ieXRlc1ZhbCA9IDBcbiAgdGhpcy5fa2V5ID0gJydcbiAgdGhpcy5fdmFsID0gJydcbiAgdGhpcy5fa2V5VHJ1bmMgPSBmYWxzZVxuICB0aGlzLl92YWxUcnVuYyA9IGZhbHNlXG4gIHRoaXMuX2hpdExpbWl0ID0gZmFsc2Vcbn1cblxuVXJsRW5jb2RlZC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoZGF0YSwgY2IpIHtcbiAgaWYgKHRoaXMuX2ZpZWxkcyA9PT0gdGhpcy5maWVsZHNMaW1pdCkge1xuICAgIGlmICghdGhpcy5ib3kuaGl0RmllbGRzTGltaXQpIHtcbiAgICAgIHRoaXMuYm95LmhpdEZpZWxkc0xpbWl0ID0gdHJ1ZVxuICAgICAgdGhpcy5ib3kuZW1pdCgnZmllbGRzTGltaXQnKVxuICAgIH1cbiAgICByZXR1cm4gY2IoKVxuICB9XG5cbiAgbGV0IGlkeGVxOyBsZXQgaWR4YW1wOyBsZXQgaTsgbGV0IHAgPSAwOyBjb25zdCBsZW4gPSBkYXRhLmxlbmd0aFxuXG4gIHdoaWxlIChwIDwgbGVuKSB7XG4gICAgaWYgKHRoaXMuX3N0YXRlID09PSAna2V5Jykge1xuICAgICAgaWR4ZXEgPSBpZHhhbXAgPSB1bmRlZmluZWRcbiAgICAgIGZvciAoaSA9IHA7IGkgPCBsZW47ICsraSkge1xuICAgICAgICBpZiAoIXRoaXMuX2NoZWNraW5nQnl0ZXMpIHsgKytwIH1cbiAgICAgICAgaWYgKGRhdGFbaV0gPT09IDB4M0QvKiA9ICovKSB7XG4gICAgICAgICAgaWR4ZXEgPSBpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhW2ldID09PSAweDI2LyogJiAqLykge1xuICAgICAgICAgIGlkeGFtcCA9IGlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaGVja2luZ0J5dGVzICYmIHRoaXMuX2J5dGVzS2V5ID09PSB0aGlzLmZpZWxkTmFtZVNpemVMaW1pdCkge1xuICAgICAgICAgIHRoaXMuX2hpdExpbWl0ID0gdHJ1ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fY2hlY2tpbmdCeXRlcykgeyArK3RoaXMuX2J5dGVzS2V5IH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlkeGVxICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8ga2V5IHdpdGggYXNzaWdubWVudFxuICAgICAgICBpZiAoaWR4ZXEgPiBwKSB7IHRoaXMuX2tleSArPSB0aGlzLmRlY29kZXIud3JpdGUoZGF0YS50b1N0cmluZygnYmluYXJ5JywgcCwgaWR4ZXEpKSB9XG4gICAgICAgIHRoaXMuX3N0YXRlID0gJ3ZhbCdcblxuICAgICAgICB0aGlzLl9oaXRMaW1pdCA9IGZhbHNlXG4gICAgICAgIHRoaXMuX2NoZWNraW5nQnl0ZXMgPSB0cnVlXG4gICAgICAgIHRoaXMuX3ZhbCA9ICcnXG4gICAgICAgIHRoaXMuX2J5dGVzVmFsID0gMFxuICAgICAgICB0aGlzLl92YWxUcnVuYyA9IGZhbHNlXG4gICAgICAgIHRoaXMuZGVjb2Rlci5yZXNldCgpXG5cbiAgICAgICAgcCA9IGlkeGVxICsgMVxuICAgICAgfSBlbHNlIGlmIChpZHhhbXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBrZXkgd2l0aCBubyBhc3NpZ25tZW50XG4gICAgICAgICsrdGhpcy5fZmllbGRzXG4gICAgICAgIGxldCBrZXk7IGNvbnN0IGtleVRydW5jID0gdGhpcy5fa2V5VHJ1bmNcbiAgICAgICAgaWYgKGlkeGFtcCA+IHApIHsga2V5ID0gKHRoaXMuX2tleSArPSB0aGlzLmRlY29kZXIud3JpdGUoZGF0YS50b1N0cmluZygnYmluYXJ5JywgcCwgaWR4YW1wKSkpIH0gZWxzZSB7IGtleSA9IHRoaXMuX2tleSB9XG5cbiAgICAgICAgdGhpcy5faGl0TGltaXQgPSBmYWxzZVxuICAgICAgICB0aGlzLl9jaGVja2luZ0J5dGVzID0gdHJ1ZVxuICAgICAgICB0aGlzLl9rZXkgPSAnJ1xuICAgICAgICB0aGlzLl9ieXRlc0tleSA9IDBcbiAgICAgICAgdGhpcy5fa2V5VHJ1bmMgPSBmYWxzZVxuICAgICAgICB0aGlzLmRlY29kZXIucmVzZXQoKVxuXG4gICAgICAgIGlmIChrZXkubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5ib3kuZW1pdCgnZmllbGQnLCBkZWNvZGVUZXh0KGtleSwgJ2JpbmFyeScsIHRoaXMuY2hhcnNldCksXG4gICAgICAgICAgICAnJyxcbiAgICAgICAgICAgIGtleVRydW5jLFxuICAgICAgICAgICAgZmFsc2UpXG4gICAgICAgIH1cblxuICAgICAgICBwID0gaWR4YW1wICsgMVxuICAgICAgICBpZiAodGhpcy5fZmllbGRzID09PSB0aGlzLmZpZWxkc0xpbWl0KSB7IHJldHVybiBjYigpIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5faGl0TGltaXQpIHtcbiAgICAgICAgLy8gd2UgbWF5IG5vdCBoYXZlIGhpdCB0aGUgYWN0dWFsIGxpbWl0IGlmIHRoZXJlIGFyZSBlbmNvZGVkIGJ5dGVzLi4uXG4gICAgICAgIGlmIChpID4gcCkgeyB0aGlzLl9rZXkgKz0gdGhpcy5kZWNvZGVyLndyaXRlKGRhdGEudG9TdHJpbmcoJ2JpbmFyeScsIHAsIGkpKSB9XG4gICAgICAgIHAgPSBpXG4gICAgICAgIGlmICgodGhpcy5fYnl0ZXNLZXkgPSB0aGlzLl9rZXkubGVuZ3RoKSA9PT0gdGhpcy5maWVsZE5hbWVTaXplTGltaXQpIHtcbiAgICAgICAgICAvLyB5ZXAsIHdlIGFjdHVhbGx5IGRpZCBoaXQgdGhlIGxpbWl0XG4gICAgICAgICAgdGhpcy5fY2hlY2tpbmdCeXRlcyA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5fa2V5VHJ1bmMgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwIDwgbGVuKSB7IHRoaXMuX2tleSArPSB0aGlzLmRlY29kZXIud3JpdGUoZGF0YS50b1N0cmluZygnYmluYXJ5JywgcCkpIH1cbiAgICAgICAgcCA9IGxlblxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZHhhbXAgPSB1bmRlZmluZWRcbiAgICAgIGZvciAoaSA9IHA7IGkgPCBsZW47ICsraSkge1xuICAgICAgICBpZiAoIXRoaXMuX2NoZWNraW5nQnl0ZXMpIHsgKytwIH1cbiAgICAgICAgaWYgKGRhdGFbaV0gPT09IDB4MjYvKiAmICovKSB7XG4gICAgICAgICAgaWR4YW1wID0gaVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2NoZWNraW5nQnl0ZXMgJiYgdGhpcy5fYnl0ZXNWYWwgPT09IHRoaXMuZmllbGRTaXplTGltaXQpIHtcbiAgICAgICAgICB0aGlzLl9oaXRMaW1pdCA9IHRydWVcbiAgICAgICAgICBicmVha1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2NoZWNraW5nQnl0ZXMpIHsgKyt0aGlzLl9ieXRlc1ZhbCB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpZHhhbXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICArK3RoaXMuX2ZpZWxkc1xuICAgICAgICBpZiAoaWR4YW1wID4gcCkgeyB0aGlzLl92YWwgKz0gdGhpcy5kZWNvZGVyLndyaXRlKGRhdGEudG9TdHJpbmcoJ2JpbmFyeScsIHAsIGlkeGFtcCkpIH1cbiAgICAgICAgdGhpcy5ib3kuZW1pdCgnZmllbGQnLCBkZWNvZGVUZXh0KHRoaXMuX2tleSwgJ2JpbmFyeScsIHRoaXMuY2hhcnNldCksXG4gICAgICAgICAgZGVjb2RlVGV4dCh0aGlzLl92YWwsICdiaW5hcnknLCB0aGlzLmNoYXJzZXQpLFxuICAgICAgICAgIHRoaXMuX2tleVRydW5jLFxuICAgICAgICAgIHRoaXMuX3ZhbFRydW5jKVxuICAgICAgICB0aGlzLl9zdGF0ZSA9ICdrZXknXG5cbiAgICAgICAgdGhpcy5faGl0TGltaXQgPSBmYWxzZVxuICAgICAgICB0aGlzLl9jaGVja2luZ0J5dGVzID0gdHJ1ZVxuICAgICAgICB0aGlzLl9rZXkgPSAnJ1xuICAgICAgICB0aGlzLl9ieXRlc0tleSA9IDBcbiAgICAgICAgdGhpcy5fa2V5VHJ1bmMgPSBmYWxzZVxuICAgICAgICB0aGlzLmRlY29kZXIucmVzZXQoKVxuXG4gICAgICAgIHAgPSBpZHhhbXAgKyAxXG4gICAgICAgIGlmICh0aGlzLl9maWVsZHMgPT09IHRoaXMuZmllbGRzTGltaXQpIHsgcmV0dXJuIGNiKCkgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLl9oaXRMaW1pdCkge1xuICAgICAgICAvLyB3ZSBtYXkgbm90IGhhdmUgaGl0IHRoZSBhY3R1YWwgbGltaXQgaWYgdGhlcmUgYXJlIGVuY29kZWQgYnl0ZXMuLi5cbiAgICAgICAgaWYgKGkgPiBwKSB7IHRoaXMuX3ZhbCArPSB0aGlzLmRlY29kZXIud3JpdGUoZGF0YS50b1N0cmluZygnYmluYXJ5JywgcCwgaSkpIH1cbiAgICAgICAgcCA9IGlcbiAgICAgICAgaWYgKCh0aGlzLl92YWwgPT09ICcnICYmIHRoaXMuZmllbGRTaXplTGltaXQgPT09IDApIHx8XG4gICAgICAgICAgICAodGhpcy5fYnl0ZXNWYWwgPSB0aGlzLl92YWwubGVuZ3RoKSA9PT0gdGhpcy5maWVsZFNpemVMaW1pdCkge1xuICAgICAgICAgIC8vIHllcCwgd2UgYWN0dWFsbHkgZGlkIGhpdCB0aGUgbGltaXRcbiAgICAgICAgICB0aGlzLl9jaGVja2luZ0J5dGVzID0gZmFsc2VcbiAgICAgICAgICB0aGlzLl92YWxUcnVuYyA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHAgPCBsZW4pIHsgdGhpcy5fdmFsICs9IHRoaXMuZGVjb2Rlci53cml0ZShkYXRhLnRvU3RyaW5nKCdiaW5hcnknLCBwKSkgfVxuICAgICAgICBwID0gbGVuXG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNiKClcbn1cblxuVXJsRW5jb2RlZC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5ib3kuX2RvbmUpIHsgcmV0dXJuIH1cblxuICBpZiAodGhpcy5fc3RhdGUgPT09ICdrZXknICYmIHRoaXMuX2tleS5sZW5ndGggPiAwKSB7XG4gICAgdGhpcy5ib3kuZW1pdCgnZmllbGQnLCBkZWNvZGVUZXh0KHRoaXMuX2tleSwgJ2JpbmFyeScsIHRoaXMuY2hhcnNldCksXG4gICAgICAnJyxcbiAgICAgIHRoaXMuX2tleVRydW5jLFxuICAgICAgZmFsc2UpXG4gIH0gZWxzZSBpZiAodGhpcy5fc3RhdGUgPT09ICd2YWwnKSB7XG4gICAgdGhpcy5ib3kuZW1pdCgnZmllbGQnLCBkZWNvZGVUZXh0KHRoaXMuX2tleSwgJ2JpbmFyeScsIHRoaXMuY2hhcnNldCksXG4gICAgICBkZWNvZGVUZXh0KHRoaXMuX3ZhbCwgJ2JpbmFyeScsIHRoaXMuY2hhcnNldCksXG4gICAgICB0aGlzLl9rZXlUcnVuYyxcbiAgICAgIHRoaXMuX3ZhbFRydW5jKVxuICB9XG4gIHRoaXMuYm95Ll9kb25lID0gdHJ1ZVxuICB0aGlzLmJveS5lbWl0KCdmaW5pc2gnKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFVybEVuY29kZWRcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBXcml0YWJsZVN0cmVhbSA9IHJlcXVpcmUoJ25vZGU6c3RyZWFtJykuV3JpdGFibGVcbmNvbnN0IHsgaW5oZXJpdHMgfSA9IHJlcXVpcmUoJ25vZGU6dXRpbCcpXG5jb25zdCBEaWNlciA9IHJlcXVpcmUoJy4uL2RlcHMvZGljZXIvbGliL0RpY2VyJylcblxuY29uc3QgTXVsdGlwYXJ0UGFyc2VyID0gcmVxdWlyZSgnLi90eXBlcy9tdWx0aXBhcnQnKVxuY29uc3QgVXJsZW5jb2RlZFBhcnNlciA9IHJlcXVpcmUoJy4vdHlwZXMvdXJsZW5jb2RlZCcpXG5jb25zdCBwYXJzZVBhcmFtcyA9IHJlcXVpcmUoJy4vdXRpbHMvcGFyc2VQYXJhbXMnKVxuXG5mdW5jdGlvbiBCdXNib3kgKG9wdHMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEJ1c2JveSkpIHsgcmV0dXJuIG5ldyBCdXNib3kob3B0cykgfVxuXG4gIGlmICh0eXBlb2Ygb3B0cyAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCdXNib3kgZXhwZWN0ZWQgYW4gb3B0aW9ucy1PYmplY3QuJylcbiAgfVxuICBpZiAodHlwZW9mIG9wdHMuaGVhZGVycyAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCdXNib3kgZXhwZWN0ZWQgYW4gb3B0aW9ucy1PYmplY3Qgd2l0aCBoZWFkZXJzLWF0dHJpYnV0ZS4nKVxuICB9XG4gIGlmICh0eXBlb2Ygb3B0cy5oZWFkZXJzWydjb250ZW50LXR5cGUnXSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIENvbnRlbnQtVHlwZS1oZWFkZXIuJylcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBoZWFkZXJzLFxuICAgIC4uLnN0cmVhbU9wdGlvbnNcbiAgfSA9IG9wdHNcblxuICB0aGlzLm9wdHMgPSB7XG4gICAgYXV0b0Rlc3Ryb3k6IGZhbHNlLFxuICAgIC4uLnN0cmVhbU9wdGlvbnNcbiAgfVxuICBXcml0YWJsZVN0cmVhbS5jYWxsKHRoaXMsIHRoaXMub3B0cylcblxuICB0aGlzLl9kb25lID0gZmFsc2VcbiAgdGhpcy5fcGFyc2VyID0gdGhpcy5nZXRQYXJzZXJCeUhlYWRlcnMoaGVhZGVycylcbiAgdGhpcy5fZmluaXNoZWQgPSBmYWxzZVxufVxuaW5oZXJpdHMoQnVzYm95LCBXcml0YWJsZVN0cmVhbSlcblxuQnVzYm95LnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gKGV2KSB7XG4gIGlmIChldiA9PT0gJ2ZpbmlzaCcpIHtcbiAgICBpZiAoIXRoaXMuX2RvbmUpIHtcbiAgICAgIHRoaXMuX3BhcnNlcj8uZW5kKClcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSBpZiAodGhpcy5fZmluaXNoZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLl9maW5pc2hlZCA9IHRydWVcbiAgfVxuICBXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUuZW1pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1c2JveS5wcm90b3R5cGUuZ2V0UGFyc2VyQnlIZWFkZXJzID0gZnVuY3Rpb24gKGhlYWRlcnMpIHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VQYXJhbXMoaGVhZGVyc1snY29udGVudC10eXBlJ10pXG5cbiAgY29uc3QgY2ZnID0ge1xuICAgIGRlZkNoYXJzZXQ6IHRoaXMub3B0cy5kZWZDaGFyc2V0LFxuICAgIGZpbGVId206IHRoaXMub3B0cy5maWxlSHdtLFxuICAgIGhlYWRlcnMsXG4gICAgaGlnaFdhdGVyTWFyazogdGhpcy5vcHRzLmhpZ2hXYXRlck1hcmssXG4gICAgaXNQYXJ0QUZpbGU6IHRoaXMub3B0cy5pc1BhcnRBRmlsZSxcbiAgICBsaW1pdHM6IHRoaXMub3B0cy5saW1pdHMsXG4gICAgcGFyc2VkQ29uVHlwZTogcGFyc2VkLFxuICAgIHByZXNlcnZlUGF0aDogdGhpcy5vcHRzLnByZXNlcnZlUGF0aFxuICB9XG5cbiAgaWYgKE11bHRpcGFydFBhcnNlci5kZXRlY3QudGVzdChwYXJzZWRbMF0pKSB7XG4gICAgcmV0dXJuIG5ldyBNdWx0aXBhcnRQYXJzZXIodGhpcywgY2ZnKVxuICB9XG4gIGlmIChVcmxlbmNvZGVkUGFyc2VyLmRldGVjdC50ZXN0KHBhcnNlZFswXSkpIHtcbiAgICByZXR1cm4gbmV3IFVybGVuY29kZWRQYXJzZXIodGhpcywgY2ZnKVxuICB9XG4gIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgQ29udGVudC1UeXBlLicpXG59XG5cbkJ1c2JveS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhpcy5fcGFyc2VyLndyaXRlKGNodW5rLCBjYilcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBCdXNib3lcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBCdXNib3lcbm1vZHVsZS5leHBvcnRzLkJ1c2JveSA9IEJ1c2JveVxuXG5tb2R1bGUuZXhwb3J0cy5EaWNlciA9IERpY2VyXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBNZXNzYWdlQ2hhbm5lbCwgcmVjZWl2ZU1lc3NhZ2VPblBvcnQgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJylcblxuY29uc3QgY29yc1NhZmVMaXN0ZWRNZXRob2RzID0gWydHRVQnLCAnSEVBRCcsICdQT1NUJ11cbmNvbnN0IGNvcnNTYWZlTGlzdGVkTWV0aG9kc1NldCA9IG5ldyBTZXQoY29yc1NhZmVMaXN0ZWRNZXRob2RzKVxuXG5jb25zdCBudWxsQm9keVN0YXR1cyA9IFsxMDEsIDIwNCwgMjA1LCAzMDRdXG5cbmNvbnN0IHJlZGlyZWN0U3RhdHVzID0gWzMwMSwgMzAyLCAzMDMsIDMwNywgMzA4XVxuY29uc3QgcmVkaXJlY3RTdGF0dXNTZXQgPSBuZXcgU2V0KHJlZGlyZWN0U3RhdHVzKVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jYmxvY2stYmFkLXBvcnRcbmNvbnN0IGJhZFBvcnRzID0gW1xuICAnMScsICc3JywgJzknLCAnMTEnLCAnMTMnLCAnMTUnLCAnMTcnLCAnMTknLCAnMjAnLCAnMjEnLCAnMjInLCAnMjMnLCAnMjUnLCAnMzcnLCAnNDInLCAnNDMnLCAnNTMnLCAnNjknLCAnNzcnLCAnNzknLFxuICAnODcnLCAnOTUnLCAnMTAxJywgJzEwMicsICcxMDMnLCAnMTA0JywgJzEwOScsICcxMTAnLCAnMTExJywgJzExMycsICcxMTUnLCAnMTE3JywgJzExOScsICcxMjMnLCAnMTM1JywgJzEzNycsXG4gICcxMzknLCAnMTQzJywgJzE2MScsICcxNzknLCAnMzg5JywgJzQyNycsICc0NjUnLCAnNTEyJywgJzUxMycsICc1MTQnLCAnNTE1JywgJzUyNicsICc1MzAnLCAnNTMxJywgJzUzMicsXG4gICc1NDAnLCAnNTQ4JywgJzU1NCcsICc1NTYnLCAnNTYzJywgJzU4NycsICc2MDEnLCAnNjM2JywgJzk4OScsICc5OTAnLCAnOTkzJywgJzk5NScsICcxNzE5JywgJzE3MjAnLCAnMTcyMycsXG4gICcyMDQ5JywgJzM2NTknLCAnNDA0NScsICc1MDYwJywgJzUwNjEnLCAnNjAwMCcsICc2NTY2JywgJzY2NjUnLCAnNjY2NicsICc2NjY3JywgJzY2NjgnLCAnNjY2OScsICc2Njk3JyxcbiAgJzEwMDgwJ1xuXVxuXG5jb25zdCBiYWRQb3J0c1NldCA9IG5ldyBTZXQoYmFkUG9ydHMpXG5cbi8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtcmVmZXJyZXItcG9saWN5LyNyZWZlcnJlci1wb2xpY2llc1xuY29uc3QgcmVmZXJyZXJQb2xpY3kgPSBbXG4gICcnLFxuICAnbm8tcmVmZXJyZXInLFxuICAnbm8tcmVmZXJyZXItd2hlbi1kb3duZ3JhZGUnLFxuICAnc2FtZS1vcmlnaW4nLFxuICAnb3JpZ2luJyxcbiAgJ3N0cmljdC1vcmlnaW4nLFxuICAnb3JpZ2luLXdoZW4tY3Jvc3Mtb3JpZ2luJyxcbiAgJ3N0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4nLFxuICAndW5zYWZlLXVybCdcbl1cbmNvbnN0IHJlZmVycmVyUG9saWN5U2V0ID0gbmV3IFNldChyZWZlcnJlclBvbGljeSlcblxuY29uc3QgcmVxdWVzdFJlZGlyZWN0ID0gWydmb2xsb3cnLCAnbWFudWFsJywgJ2Vycm9yJ11cblxuY29uc3Qgc2FmZU1ldGhvZHMgPSBbJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnLCAnVFJBQ0UnXVxuY29uc3Qgc2FmZU1ldGhvZHNTZXQgPSBuZXcgU2V0KHNhZmVNZXRob2RzKVxuXG5jb25zdCByZXF1ZXN0TW9kZSA9IFsnbmF2aWdhdGUnLCAnc2FtZS1vcmlnaW4nLCAnbm8tY29ycycsICdjb3JzJ11cblxuY29uc3QgcmVxdWVzdENyZWRlbnRpYWxzID0gWydvbWl0JywgJ3NhbWUtb3JpZ2luJywgJ2luY2x1ZGUnXVxuXG5jb25zdCByZXF1ZXN0Q2FjaGUgPSBbXG4gICdkZWZhdWx0JyxcbiAgJ25vLXN0b3JlJyxcbiAgJ3JlbG9hZCcsXG4gICduby1jYWNoZScsXG4gICdmb3JjZS1jYWNoZScsXG4gICdvbmx5LWlmLWNhY2hlZCdcbl1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI3JlcXVlc3QtYm9keS1oZWFkZXItbmFtZVxuY29uc3QgcmVxdWVzdEJvZHlIZWFkZXIgPSBbXG4gICdjb250ZW50LWVuY29kaW5nJyxcbiAgJ2NvbnRlbnQtbGFuZ3VhZ2UnLFxuICAnY29udGVudC1sb2NhdGlvbicsXG4gICdjb250ZW50LXR5cGUnLFxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzIwMjFcbiAgLy8gJ0NvbnRlbnQtTGVuZ3RoJyBpcyBhIGZvcmJpZGRlbiBoZWFkZXIgbmFtZSwgd2hpY2ggaXMgdHlwaWNhbGx5XG4gIC8vIHJlbW92ZWQgaW4gdGhlIEhlYWRlcnMgaW1wbGVtZW50YXRpb24uIEhvd2V2ZXIsIHVuZGljaSBkb2Vzbid0XG4gIC8vIGZpbHRlciBvdXQgaGVhZGVycywgc28gd2UgYWRkIGl0IGhlcmUuXG4gICdjb250ZW50LWxlbmd0aCdcbl1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2VudW1kZWYtcmVxdWVzdGR1cGxleFxuY29uc3QgcmVxdWVzdER1cGxleCA9IFtcbiAgJ2hhbGYnXG5dXG5cbi8vIGh0dHA6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2ZvcmJpZGRlbi1tZXRob2RcbmNvbnN0IGZvcmJpZGRlbk1ldGhvZHMgPSBbJ0NPTk5FQ1QnLCAnVFJBQ0UnLCAnVFJBQ0snXVxuY29uc3QgZm9yYmlkZGVuTWV0aG9kc1NldCA9IG5ldyBTZXQoZm9yYmlkZGVuTWV0aG9kcylcblxuY29uc3Qgc3VicmVzb3VyY2UgPSBbXG4gICdhdWRpbycsXG4gICdhdWRpb3dvcmtsZXQnLFxuICAnZm9udCcsXG4gICdpbWFnZScsXG4gICdtYW5pZmVzdCcsXG4gICdwYWludHdvcmtsZXQnLFxuICAnc2NyaXB0JyxcbiAgJ3N0eWxlJyxcbiAgJ3RyYWNrJyxcbiAgJ3ZpZGVvJyxcbiAgJ3hzbHQnLFxuICAnJ1xuXVxuY29uc3Qgc3VicmVzb3VyY2VTZXQgPSBuZXcgU2V0KHN1YnJlc291cmNlKVxuXG4vKiogQHR5cGUge2dsb2JhbFRoaXNbJ0RPTUV4Y2VwdGlvbiddfSAqL1xuY29uc3QgRE9NRXhjZXB0aW9uID0gZ2xvYmFsVGhpcy5ET01FeGNlcHRpb24gPz8gKCgpID0+IHtcbiAgLy8gRE9NRXhjZXB0aW9uIHdhcyBvbmx5IG1hZGUgYSBnbG9iYWwgaW4gTm9kZSB2MTcuMC4wLFxuICAvLyBidXQgZmV0Y2ggc3VwcG9ydHMgPj0gdjE2LjguXG4gIHRyeSB7XG4gICAgYXRvYignficpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZXJyKS5jb25zdHJ1Y3RvclxuICB9XG59KSgpXG5cbmxldCBjaGFubmVsXG5cbi8qKiBAdHlwZSB7Z2xvYmFsVGhpc1snc3RydWN0dXJlZENsb25lJ119ICovXG5jb25zdCBzdHJ1Y3R1cmVkQ2xvbmUgPVxuICBnbG9iYWxUaGlzLnN0cnVjdHVyZWRDbG9uZSA/P1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi9iMjdhZTI0ZGNjNDI1MWJhZDcyNmQ5ZDg0YmFmNjc4ZDFmNzA3ZmVkL2xpYi9pbnRlcm5hbC9zdHJ1Y3R1cmVkX2Nsb25lLmpzXG4gIC8vIHN0cnVjdHVyZWRDbG9uZSB3YXMgYWRkZWQgaW4gdjE3LjAuMCwgYnV0IGZldGNoIHN1cHBvcnRzIHYxNi44XG4gIGZ1bmN0aW9uIHN0cnVjdHVyZWRDbG9uZSAodmFsdWUsIG9wdGlvbnMgPSB1bmRlZmluZWQpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWlzc2luZyBhcmd1bWVudCcpXG4gICAgfVxuXG4gICAgaWYgKCFjaGFubmVsKSB7XG4gICAgICBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKClcbiAgICB9XG4gICAgY2hhbm5lbC5wb3J0MS51bnJlZigpXG4gICAgY2hhbm5lbC5wb3J0Mi51bnJlZigpXG4gICAgY2hhbm5lbC5wb3J0MS5wb3N0TWVzc2FnZSh2YWx1ZSwgb3B0aW9ucz8udHJhbnNmZXIpXG4gICAgcmV0dXJuIHJlY2VpdmVNZXNzYWdlT25Qb3J0KGNoYW5uZWwucG9ydDIpLm1lc3NhZ2VcbiAgfVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgRE9NRXhjZXB0aW9uLFxuICBzdHJ1Y3R1cmVkQ2xvbmUsXG4gIHN1YnJlc291cmNlLFxuICBmb3JiaWRkZW5NZXRob2RzLFxuICByZXF1ZXN0Qm9keUhlYWRlcixcbiAgcmVmZXJyZXJQb2xpY3ksXG4gIHJlcXVlc3RSZWRpcmVjdCxcbiAgcmVxdWVzdE1vZGUsXG4gIHJlcXVlc3RDcmVkZW50aWFscyxcbiAgcmVxdWVzdENhY2hlLFxuICByZWRpcmVjdFN0YXR1cyxcbiAgY29yc1NhZmVMaXN0ZWRNZXRob2RzLFxuICBudWxsQm9keVN0YXR1cyxcbiAgc2FmZU1ldGhvZHMsXG4gIGJhZFBvcnRzLFxuICByZXF1ZXN0RHVwbGV4LFxuICBzdWJyZXNvdXJjZVNldCxcbiAgYmFkUG9ydHNTZXQsXG4gIHJlZGlyZWN0U3RhdHVzU2V0LFxuICBjb3JzU2FmZUxpc3RlZE1ldGhvZHNTZXQsXG4gIHNhZmVNZXRob2RzU2V0LFxuICBmb3JiaWRkZW5NZXRob2RzU2V0LFxuICByZWZlcnJlclBvbGljeVNldFxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbi8vIEluIGNhc2Ugb2YgYnJlYWtpbmcgY2hhbmdlcywgaW5jcmVhc2UgdGhlIHZlcnNpb25cbi8vIG51bWJlciB0byBhdm9pZCBjb25mbGljdHMuXG5jb25zdCBnbG9iYWxPcmlnaW4gPSBTeW1ib2wuZm9yKCd1bmRpY2kuZ2xvYmFsT3JpZ2luLjEnKVxuXG5mdW5jdGlvbiBnZXRHbG9iYWxPcmlnaW4gKCkge1xuICByZXR1cm4gZ2xvYmFsVGhpc1tnbG9iYWxPcmlnaW5dXG59XG5cbmZ1bmN0aW9uIHNldEdsb2JhbE9yaWdpbiAobmV3T3JpZ2luKSB7XG4gIGlmIChuZXdPcmlnaW4gPT09IHVuZGVmaW5lZCkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnbG9iYWxUaGlzLCBnbG9iYWxPcmlnaW4sIHtcbiAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZVxuICAgIH0pXG5cbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHBhcnNlZFVSTCA9IG5ldyBVUkwobmV3T3JpZ2luKVxuXG4gIGlmIChwYXJzZWRVUkwucHJvdG9jb2wgIT09ICdodHRwOicgJiYgcGFyc2VkVVJMLnByb3RvY29sICE9PSAnaHR0cHM6Jykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE9ubHkgaHR0cCAmIGh0dHBzIHVybHMgYXJlIGFsbG93ZWQsIHJlY2VpdmVkICR7cGFyc2VkVVJMLnByb3RvY29sfWApXG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZ2xvYmFsVGhpcywgZ2xvYmFsT3JpZ2luLCB7XG4gICAgdmFsdWU6IHBhcnNlZFVSTCxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlXG4gIH0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRHbG9iYWxPcmlnaW4sXG4gIHNldEdsb2JhbE9yaWdpblxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgcmVkaXJlY3RTdGF0dXNTZXQsIHJlZmVycmVyUG9saWN5U2V0OiByZWZlcnJlclBvbGljeVRva2VucywgYmFkUG9ydHNTZXQgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IHsgZ2V0R2xvYmFsT3JpZ2luIH0gPSByZXF1aXJlKCcuL2dsb2JhbCcpXG5jb25zdCB7IHBlcmZvcm1hbmNlIH0gPSByZXF1aXJlKCdwZXJmX2hvb2tzJylcbmNvbnN0IHsgaXNCbG9iTGlrZSwgdG9VU1ZTdHJpbmcsIFJlYWRhYmxlU3RyZWFtRnJvbSB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5jb25zdCB7IGlzVWludDhBcnJheSB9ID0gcmVxdWlyZSgndXRpbC90eXBlcycpXG5cbmxldCBzdXBwb3J0ZWRIYXNoZXMgPSBbXVxuXG4vLyBodHRwczovL25vZGVqcy5vcmcvYXBpL2NyeXB0by5odG1sI2RldGVybWluaW5nLWlmLWNyeXB0by1zdXBwb3J0LWlzLXVuYXZhaWxhYmxlXG4vKiogQHR5cGUge2ltcG9ydCgnY3J5cHRvJyl8dW5kZWZpbmVkfSAqL1xubGV0IGNyeXB0b1xuXG50cnkge1xuICBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKVxuICBjb25zdCBwb3NzaWJsZVJlbGV2YW50SGFzaGVzID0gWydzaGEyNTYnLCAnc2hhMzg0JywgJ3NoYTUxMiddXG4gIHN1cHBvcnRlZEhhc2hlcyA9IGNyeXB0by5nZXRIYXNoZXMoKS5maWx0ZXIoKGhhc2gpID0+IHBvc3NpYmxlUmVsZXZhbnRIYXNoZXMuaW5jbHVkZXMoaGFzaCkpXG4vKiBjOCBpZ25vcmUgbmV4dCAzICovXG59IGNhdGNoIHtcbn1cblxuZnVuY3Rpb24gcmVzcG9uc2VVUkwgKHJlc3BvbnNlKSB7XG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXNwb25zZXNcbiAgLy8gQSByZXNwb25zZSBoYXMgYW4gYXNzb2NpYXRlZCBVUkwuIEl0IGlzIGEgcG9pbnRlciB0byB0aGUgbGFzdCBVUkxcbiAgLy8gaW4gcmVzcG9uc2XigJlzIFVSTCBsaXN0IGFuZCBudWxsIGlmIHJlc3BvbnNl4oCZcyBVUkwgbGlzdCBpcyBlbXB0eS5cbiAgY29uc3QgdXJsTGlzdCA9IHJlc3BvbnNlLnVybExpc3RcbiAgY29uc3QgbGVuZ3RoID0gdXJsTGlzdC5sZW5ndGhcbiAgcmV0dXJuIGxlbmd0aCA9PT0gMCA/IG51bGwgOiB1cmxMaXN0W2xlbmd0aCAtIDFdLnRvU3RyaW5nKClcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtcmVzcG9uc2UtbG9jYXRpb24tdXJsXG5mdW5jdGlvbiByZXNwb25zZUxvY2F0aW9uVVJMIChyZXNwb25zZSwgcmVxdWVzdEZyYWdtZW50KSB7XG4gIC8vIDEuIElmIHJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgbm90IGEgcmVkaXJlY3Qgc3RhdHVzLCB0aGVuIHJldHVybiBudWxsLlxuICBpZiAoIXJlZGlyZWN0U3RhdHVzU2V0LmhhcyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8vIDIuIExldCBsb2NhdGlvbiBiZSB0aGUgcmVzdWx0IG9mIGV4dHJhY3RpbmcgaGVhZGVyIGxpc3QgdmFsdWVzIGdpdmVuXG4gIC8vIGBMb2NhdGlvbmAgYW5kIHJlc3BvbnNl4oCZcyBoZWFkZXIgbGlzdC5cbiAgbGV0IGxvY2F0aW9uID0gcmVzcG9uc2UuaGVhZGVyc0xpc3QuZ2V0KCdsb2NhdGlvbicpXG5cbiAgLy8gMy4gSWYgbG9jYXRpb24gaXMgYSBoZWFkZXIgdmFsdWUsIHRoZW4gc2V0IGxvY2F0aW9uIHRvIHRoZSByZXN1bHQgb2ZcbiAgLy8gICAgcGFyc2luZyBsb2NhdGlvbiB3aXRoIHJlc3BvbnNl4oCZcyBVUkwuXG4gIGlmIChsb2NhdGlvbiAhPT0gbnVsbCAmJiBpc1ZhbGlkSGVhZGVyVmFsdWUobG9jYXRpb24pKSB7XG4gICAgbG9jYXRpb24gPSBuZXcgVVJMKGxvY2F0aW9uLCByZXNwb25zZVVSTChyZXNwb25zZSkpXG4gIH1cblxuICAvLyA0LiBJZiBsb2NhdGlvbiBpcyBhIFVSTCB3aG9zZSBmcmFnbWVudCBpcyBudWxsLCB0aGVuIHNldCBsb2NhdGlvbuKAmXNcbiAgLy8gZnJhZ21lbnQgdG8gcmVxdWVzdEZyYWdtZW50LlxuICBpZiAobG9jYXRpb24gJiYgIWxvY2F0aW9uLmhhc2gpIHtcbiAgICBsb2NhdGlvbi5oYXNoID0gcmVxdWVzdEZyYWdtZW50XG4gIH1cblxuICAvLyA1LiBSZXR1cm4gbG9jYXRpb24uXG4gIHJldHVybiBsb2NhdGlvblxufVxuXG4vKiogQHJldHVybnMge1VSTH0gKi9cbmZ1bmN0aW9uIHJlcXVlc3RDdXJyZW50VVJMIChyZXF1ZXN0KSB7XG4gIHJldHVybiByZXF1ZXN0LnVybExpc3RbcmVxdWVzdC51cmxMaXN0Lmxlbmd0aCAtIDFdXG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RCYWRQb3J0IChyZXF1ZXN0KSB7XG4gIC8vIDEuIExldCB1cmwgYmUgcmVxdWVzdOKAmXMgY3VycmVudCBVUkwuXG4gIGNvbnN0IHVybCA9IHJlcXVlc3RDdXJyZW50VVJMKHJlcXVlc3QpXG5cbiAgLy8gMi4gSWYgdXJs4oCZcyBzY2hlbWUgaXMgYW4gSFRUUChTKSBzY2hlbWUgYW5kIHVybOKAmXMgcG9ydCBpcyBhIGJhZCBwb3J0LFxuICAvLyB0aGVuIHJldHVybiBibG9ja2VkLlxuICBpZiAodXJsSXNIdHRwSHR0cHNTY2hlbWUodXJsKSAmJiBiYWRQb3J0c1NldC5oYXModXJsLnBvcnQpKSB7XG4gICAgcmV0dXJuICdibG9ja2VkJ1xuICB9XG5cbiAgLy8gMy4gUmV0dXJuIGFsbG93ZWQuXG4gIHJldHVybiAnYWxsb3dlZCdcbn1cblxuZnVuY3Rpb24gaXNFcnJvckxpa2UgKG9iamVjdCkge1xuICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgRXJyb3IgfHwgKFxuICAgIG9iamVjdD8uY29uc3RydWN0b3I/Lm5hbWUgPT09ICdFcnJvcicgfHxcbiAgICBvYmplY3Q/LmNvbnN0cnVjdG9yPy5uYW1lID09PSAnRE9NRXhjZXB0aW9uJ1xuICApXG59XG5cbi8vIENoZWNrIHdoZXRoZXIgfHN0YXR1c1RleHR8IGlzIGEgQnl0ZVN0cmluZyBhbmRcbi8vIG1hdGNoZXMgdGhlIFJlYXNvbi1QaHJhc2UgdG9rZW4gcHJvZHVjdGlvbi5cbi8vIFJGQyAyNjE2OiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjYxNlxuLy8gUkZDIDcyMzA6IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMwXG4vLyBcInJlYXNvbi1waHJhc2UgPSAqKCBIVEFCIC8gU1AgLyBWQ0hBUiAvIG9icy10ZXh0IClcIlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Nocm9taXVtL2Nocm9taXVtL2Jsb2IvOTQuMC40NjA0LjEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS9mZXRjaC9yZXNwb25zZS5jYyNMMTE2XG5mdW5jdGlvbiBpc1ZhbGlkUmVhc29uUGhyYXNlIChzdGF0dXNUZXh0KSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhdHVzVGV4dC5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IGMgPSBzdGF0dXNUZXh0LmNoYXJDb2RlQXQoaSlcbiAgICBpZiAoXG4gICAgICAhKFxuICAgICAgICAoXG4gICAgICAgICAgYyA9PT0gMHgwOSB8fCAvLyBIVEFCXG4gICAgICAgICAgKGMgPj0gMHgyMCAmJiBjIDw9IDB4N2UpIHx8IC8vIFNQIC8gVkNIQVJcbiAgICAgICAgICAoYyA+PSAweDgwICYmIGMgPD0gMHhmZilcbiAgICAgICAgKSAvLyBvYnMtdGV4dFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMi42XG4gKiBAcGFyYW0ge251bWJlcn0gY1xuICovXG5mdW5jdGlvbiBpc1Rva2VuQ2hhckNvZGUgKGMpIHtcbiAgc3dpdGNoIChjKSB7XG4gICAgY2FzZSAweDIyOlxuICAgIGNhc2UgMHgyODpcbiAgICBjYXNlIDB4Mjk6XG4gICAgY2FzZSAweDJjOlxuICAgIGNhc2UgMHgyZjpcbiAgICBjYXNlIDB4M2E6XG4gICAgY2FzZSAweDNiOlxuICAgIGNhc2UgMHgzYzpcbiAgICBjYXNlIDB4M2Q6XG4gICAgY2FzZSAweDNlOlxuICAgIGNhc2UgMHgzZjpcbiAgICBjYXNlIDB4NDA6XG4gICAgY2FzZSAweDViOlxuICAgIGNhc2UgMHg1YzpcbiAgICBjYXNlIDB4NWQ6XG4gICAgY2FzZSAweDdiOlxuICAgIGNhc2UgMHg3ZDpcbiAgICAgIC8vIERRVU9URSBhbmQgXCIoKSwvOjs8PT4/QFtcXF17fVwiXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gVkNIQVIgJXgyMS03RVxuICAgICAgcmV0dXJuIGMgPj0gMHgyMSAmJiBjIDw9IDB4N2VcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGFyYWN0ZXJzXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRIVFRQVG9rZW4gKGNoYXJhY3RlcnMpIHtcbiAgaWYgKGNoYXJhY3RlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFyYWN0ZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCFpc1Rva2VuQ2hhckNvZGUoY2hhcmFjdGVycy5jaGFyQ29kZUF0KGkpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaGVhZGVyLW5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwb3RlbnRpYWxWYWx1ZVxuICovXG5mdW5jdGlvbiBpc1ZhbGlkSGVhZGVyTmFtZSAocG90ZW50aWFsVmFsdWUpIHtcbiAgcmV0dXJuIGlzVmFsaWRIVFRQVG9rZW4ocG90ZW50aWFsVmFsdWUpXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaGVhZGVyLXZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gcG90ZW50aWFsVmFsdWVcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZEhlYWRlclZhbHVlIChwb3RlbnRpYWxWYWx1ZSkge1xuICAvLyAtIEhhcyBubyBsZWFkaW5nIG9yIHRyYWlsaW5nIEhUVFAgdGFiIG9yIHNwYWNlIGJ5dGVzLlxuICAvLyAtIENvbnRhaW5zIG5vIDB4MDAgKE5VTCkgb3IgSFRUUCBuZXdsaW5lIGJ5dGVzLlxuICBpZiAoXG4gICAgcG90ZW50aWFsVmFsdWUuc3RhcnRzV2l0aCgnXFx0JykgfHxcbiAgICBwb3RlbnRpYWxWYWx1ZS5zdGFydHNXaXRoKCcgJykgfHxcbiAgICBwb3RlbnRpYWxWYWx1ZS5lbmRzV2l0aCgnXFx0JykgfHxcbiAgICBwb3RlbnRpYWxWYWx1ZS5lbmRzV2l0aCgnICcpXG4gICkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKFxuICAgIHBvdGVudGlhbFZhbHVlLmluY2x1ZGVzKCdcXDAnKSB8fFxuICAgIHBvdGVudGlhbFZhbHVlLmluY2x1ZGVzKCdcXHInKSB8fFxuICAgIHBvdGVudGlhbFZhbHVlLmluY2x1ZGVzKCdcXG4nKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtcmVmZXJyZXItcG9saWN5LyNzZXQtcmVxdWVzdHMtcmVmZXJyZXItcG9saWN5LW9uLXJlZGlyZWN0XG5mdW5jdGlvbiBzZXRSZXF1ZXN0UmVmZXJyZXJQb2xpY3lPblJlZGlyZWN0IChyZXF1ZXN0LCBhY3R1YWxSZXNwb25zZSkge1xuICAvLyAgR2l2ZW4gYSByZXF1ZXN0IHJlcXVlc3QgYW5kIGEgcmVzcG9uc2UgYWN0dWFsUmVzcG9uc2UsIHRoaXMgYWxnb3JpdGhtXG4gIC8vICB1cGRhdGVzIHJlcXVlc3TigJlzIHJlZmVycmVyIHBvbGljeSBhY2NvcmRpbmcgdG8gdGhlIFJlZmVycmVyLVBvbGljeVxuICAvLyAgaGVhZGVyIChpZiBhbnkpIGluIGFjdHVhbFJlc3BvbnNlLlxuXG4gIC8vIDEuIExldCBwb2xpY3kgYmUgdGhlIHJlc3VsdCBvZiBleGVjdXRpbmcgwqcgOC4xIFBhcnNlIGEgcmVmZXJyZXIgcG9saWN5XG4gIC8vIGZyb20gYSBSZWZlcnJlci1Qb2xpY3kgaGVhZGVyIG9uIGFjdHVhbFJlc3BvbnNlLlxuXG4gIC8vIDguMSBQYXJzZSBhIHJlZmVycmVyIHBvbGljeSBmcm9tIGEgUmVmZXJyZXItUG9saWN5IGhlYWRlclxuICAvLyAxLiBMZXQgcG9saWN5LXRva2VucyBiZSB0aGUgcmVzdWx0IG9mIGV4dHJhY3RpbmcgaGVhZGVyIGxpc3QgdmFsdWVzIGdpdmVuIGBSZWZlcnJlci1Qb2xpY3lgIGFuZCByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3QuXG4gIGNvbnN0IHsgaGVhZGVyc0xpc3QgfSA9IGFjdHVhbFJlc3BvbnNlXG4gIC8vIDIuIExldCBwb2xpY3kgYmUgdGhlIGVtcHR5IHN0cmluZy5cbiAgLy8gMy4gRm9yIGVhY2ggdG9rZW4gaW4gcG9saWN5LXRva2VucywgaWYgdG9rZW4gaXMgYSByZWZlcnJlciBwb2xpY3kgYW5kIHRva2VuIGlzIG5vdCB0aGUgZW1wdHkgc3RyaW5nLCB0aGVuIHNldCBwb2xpY3kgdG8gdG9rZW4uXG4gIC8vIDQuIFJldHVybiBwb2xpY3kuXG4gIGNvbnN0IHBvbGljeUhlYWRlciA9IChoZWFkZXJzTGlzdC5nZXQoJ3JlZmVycmVyLXBvbGljeScpID8/ICcnKS5zcGxpdCgnLCcpXG5cbiAgLy8gTm90ZTogQXMgdGhlIHJlZmVycmVyLXBvbGljeSBjYW4gY29udGFpbiBtdWx0aXBsZSBwb2xpY2llc1xuICAvLyBzZXBhcmF0ZWQgYnkgY29tbWEsIHdlIG5lZWQgdG8gbG9vcCB0aHJvdWdoIGFsbCBvZiB0aGVtXG4gIC8vIGFuZCBwaWNrIHRoZSBmaXJzdCB2YWxpZCBvbmUuXG4gIC8vIFJlZjogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9IZWFkZXJzL1JlZmVycmVyLVBvbGljeSNzcGVjaWZ5X2FfZmFsbGJhY2tfcG9saWN5XG4gIGxldCBwb2xpY3kgPSAnJ1xuICBpZiAocG9saWN5SGVhZGVyLmxlbmd0aCA+IDApIHtcbiAgICAvLyBUaGUgcmlnaHQtbW9zdCBwb2xpY3kgdGFrZXMgcHJlY2VkZW5jZS5cbiAgICAvLyBUaGUgbGVmdC1tb3N0IHBvbGljeSBpcyB0aGUgZmFsbGJhY2suXG4gICAgZm9yIChsZXQgaSA9IHBvbGljeUhlYWRlci5sZW5ndGg7IGkgIT09IDA7IGktLSkge1xuICAgICAgY29uc3QgdG9rZW4gPSBwb2xpY3lIZWFkZXJbaSAtIDFdLnRyaW0oKVxuICAgICAgaWYgKHJlZmVycmVyUG9saWN5VG9rZW5zLmhhcyh0b2tlbikpIHtcbiAgICAgICAgcG9saWN5ID0gdG9rZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyAyLiBJZiBwb2xpY3kgaXMgbm90IHRoZSBlbXB0eSBzdHJpbmcsIHRoZW4gc2V0IHJlcXVlc3TigJlzIHJlZmVycmVyIHBvbGljeSB0byBwb2xpY3kuXG4gIGlmIChwb2xpY3kgIT09ICcnKSB7XG4gICAgcmVxdWVzdC5yZWZlcnJlclBvbGljeSA9IHBvbGljeVxuICB9XG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjcm9zcy1vcmlnaW4tcmVzb3VyY2UtcG9saWN5LWNoZWNrXG5mdW5jdGlvbiBjcm9zc09yaWdpblJlc291cmNlUG9saWN5Q2hlY2sgKCkge1xuICAvLyBUT0RPXG4gIHJldHVybiAnYWxsb3dlZCdcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtY29ycy1jaGVja1xuZnVuY3Rpb24gY29yc0NoZWNrICgpIHtcbiAgLy8gVE9ET1xuICByZXR1cm4gJ3N1Y2Nlc3MnXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LXRhby1jaGVja1xuZnVuY3Rpb24gVEFPQ2hlY2sgKCkge1xuICAvLyBUT0RPXG4gIHJldHVybiAnc3VjY2Vzcydcbn1cblxuZnVuY3Rpb24gYXBwZW5kRmV0Y2hNZXRhZGF0YSAoaHR0cFJlcXVlc3QpIHtcbiAgLy8gIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtZmV0Y2gtbWV0YWRhdGEvI3NlYy1mZXRjaC1kZXN0LWhlYWRlclxuICAvLyAgVE9ET1xuXG4gIC8vICBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLWZldGNoLW1ldGFkYXRhLyNzZWMtZmV0Y2gtbW9kZS1oZWFkZXJcblxuICAvLyAgMS4gQXNzZXJ0OiBy4oCZcyB1cmwgaXMgYSBwb3RlbnRpYWxseSB0cnVzdHdvcnRoeSBVUkwuXG4gIC8vICBUT0RPXG5cbiAgLy8gIDIuIExldCBoZWFkZXIgYmUgYSBTdHJ1Y3R1cmVkIEhlYWRlciB3aG9zZSB2YWx1ZSBpcyBhIHRva2VuLlxuICBsZXQgaGVhZGVyID0gbnVsbFxuXG4gIC8vICAzLiBTZXQgaGVhZGVy4oCZcyB2YWx1ZSB0byBy4oCZcyBtb2RlLlxuICBoZWFkZXIgPSBodHRwUmVxdWVzdC5tb2RlXG5cbiAgLy8gIDQuIFNldCBhIHN0cnVjdHVyZWQgZmllbGQgdmFsdWUgYFNlYy1GZXRjaC1Nb2RlYC9oZWFkZXIgaW4gcuKAmXMgaGVhZGVyIGxpc3QuXG4gIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LnNldCgnc2VjLWZldGNoLW1vZGUnLCBoZWFkZXIpXG5cbiAgLy8gIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtZmV0Y2gtbWV0YWRhdGEvI3NlYy1mZXRjaC1zaXRlLWhlYWRlclxuICAvLyAgVE9ET1xuXG4gIC8vICBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLWZldGNoLW1ldGFkYXRhLyNzZWMtZmV0Y2gtdXNlci1oZWFkZXJcbiAgLy8gIFRPRE9cbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2FwcGVuZC1hLXJlcXVlc3Qtb3JpZ2luLWhlYWRlclxuZnVuY3Rpb24gYXBwZW5kUmVxdWVzdE9yaWdpbkhlYWRlciAocmVxdWVzdCkge1xuICAvLyAxLiBMZXQgc2VyaWFsaXplZE9yaWdpbiBiZSB0aGUgcmVzdWx0IG9mIGJ5dGUtc2VyaWFsaXppbmcgYSByZXF1ZXN0IG9yaWdpbiB3aXRoIHJlcXVlc3QuXG4gIGxldCBzZXJpYWxpemVkT3JpZ2luID0gcmVxdWVzdC5vcmlnaW5cblxuICAvLyAyLiBJZiByZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZyBpcyBcImNvcnNcIiBvciByZXF1ZXN04oCZcyBtb2RlIGlzIFwid2Vic29ja2V0XCIsIHRoZW4gYXBwZW5kIChgT3JpZ2luYCwgc2VyaWFsaXplZE9yaWdpbikgdG8gcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gIGlmIChyZXF1ZXN0LnJlc3BvbnNlVGFpbnRpbmcgPT09ICdjb3JzJyB8fCByZXF1ZXN0Lm1vZGUgPT09ICd3ZWJzb2NrZXQnKSB7XG4gICAgaWYgKHNlcmlhbGl6ZWRPcmlnaW4pIHtcbiAgICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdvcmlnaW4nLCBzZXJpYWxpemVkT3JpZ2luKVxuICAgIH1cblxuICAvLyAzLiBPdGhlcndpc2UsIGlmIHJlcXVlc3TigJlzIG1ldGhvZCBpcyBuZWl0aGVyIGBHRVRgIG5vciBgSEVBRGAsIHRoZW46XG4gIH0gZWxzZSBpZiAocmVxdWVzdC5tZXRob2QgIT09ICdHRVQnICYmIHJlcXVlc3QubWV0aG9kICE9PSAnSEVBRCcpIHtcbiAgICAvLyAxLiBTd2l0Y2ggb24gcmVxdWVzdOKAmXMgcmVmZXJyZXIgcG9saWN5OlxuICAgIHN3aXRjaCAocmVxdWVzdC5yZWZlcnJlclBvbGljeSkge1xuICAgICAgY2FzZSAnbm8tcmVmZXJyZXInOlxuICAgICAgICAvLyBTZXQgc2VyaWFsaXplZE9yaWdpbiB0byBgbnVsbGAuXG4gICAgICAgIHNlcmlhbGl6ZWRPcmlnaW4gPSBudWxsXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICduby1yZWZlcnJlci13aGVuLWRvd25ncmFkZSc6XG4gICAgICBjYXNlICdzdHJpY3Qtb3JpZ2luJzpcbiAgICAgIGNhc2UgJ3N0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4nOlxuICAgICAgICAvLyBJZiByZXF1ZXN04oCZcyBvcmlnaW4gaXMgYSB0dXBsZSBvcmlnaW4sIGl0cyBzY2hlbWUgaXMgXCJodHRwc1wiLCBhbmQgcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIHNjaGVtZSBpcyBub3QgXCJodHRwc1wiLCB0aGVuIHNldCBzZXJpYWxpemVkT3JpZ2luIHRvIGBudWxsYC5cbiAgICAgICAgaWYgKHJlcXVlc3Qub3JpZ2luICYmIHVybEhhc0h0dHBzU2NoZW1lKHJlcXVlc3Qub3JpZ2luKSAmJiAhdXJsSGFzSHR0cHNTY2hlbWUocmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdCkpKSB7XG4gICAgICAgICAgc2VyaWFsaXplZE9yaWdpbiA9IG51bGxcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnc2FtZS1vcmlnaW4nOlxuICAgICAgICAvLyBJZiByZXF1ZXN04oCZcyBvcmlnaW4gaXMgbm90IHNhbWUgb3JpZ2luIHdpdGggcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIG9yaWdpbiwgdGhlbiBzZXQgc2VyaWFsaXplZE9yaWdpbiB0byBgbnVsbGAuXG4gICAgICAgIGlmICghc2FtZU9yaWdpbihyZXF1ZXN0LCByZXF1ZXN0Q3VycmVudFVSTChyZXF1ZXN0KSkpIHtcbiAgICAgICAgICBzZXJpYWxpemVkT3JpZ2luID0gbnVsbFxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBEbyBub3RoaW5nLlxuICAgIH1cblxuICAgIGlmIChzZXJpYWxpemVkT3JpZ2luKSB7XG4gICAgICAvLyAyLiBBcHBlbmQgKGBPcmlnaW5gLCBzZXJpYWxpemVkT3JpZ2luKSB0byByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdvcmlnaW4nLCBzZXJpYWxpemVkT3JpZ2luKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb2Fyc2VuZWRTaGFyZWRDdXJyZW50VGltZSAoY3Jvc3NPcmlnaW5Jc29sYXRlZENhcGFiaWxpdHkpIHtcbiAgLy8gVE9ET1xuICByZXR1cm4gcGVyZm9ybWFuY2Uubm93KClcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NyZWF0ZS1hbi1vcGFxdWUtdGltaW5nLWluZm9cbmZ1bmN0aW9uIGNyZWF0ZU9wYXF1ZVRpbWluZ0luZm8gKHRpbWluZ0luZm8pIHtcbiAgcmV0dXJuIHtcbiAgICBzdGFydFRpbWU6IHRpbWluZ0luZm8uc3RhcnRUaW1lID8/IDAsXG4gICAgcmVkaXJlY3RTdGFydFRpbWU6IDAsXG4gICAgcmVkaXJlY3RFbmRUaW1lOiAwLFxuICAgIHBvc3RSZWRpcmVjdFN0YXJ0VGltZTogdGltaW5nSW5mby5zdGFydFRpbWUgPz8gMCxcbiAgICBmaW5hbFNlcnZpY2VXb3JrZXJTdGFydFRpbWU6IDAsXG4gICAgZmluYWxOZXR3b3JrUmVzcG9uc2VTdGFydFRpbWU6IDAsXG4gICAgZmluYWxOZXR3b3JrUmVxdWVzdFN0YXJ0VGltZTogMCxcbiAgICBlbmRUaW1lOiAwLFxuICAgIGVuY29kZWRCb2R5U2l6ZTogMCxcbiAgICBkZWNvZGVkQm9keVNpemU6IDAsXG4gICAgZmluYWxDb25uZWN0aW9uVGltaW5nSW5mbzogbnVsbFxuICB9XG59XG5cbi8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL29yaWdpbi5odG1sI3BvbGljeS1jb250YWluZXJcbmZ1bmN0aW9uIG1ha2VQb2xpY3lDb250YWluZXIgKCkge1xuICAvLyBOb3RlOiB0aGUgZmV0Y2ggc3BlYyBkb2Vzbid0IG1ha2UgdXNlIG9mIGVtYmVkZGVyIHBvbGljeSBvciBDU1AgbGlzdFxuICByZXR1cm4ge1xuICAgIHJlZmVycmVyUG9saWN5OiAnc3RyaWN0LW9yaWdpbi13aGVuLWNyb3NzLW9yaWdpbidcbiAgfVxufVxuXG4vLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9vcmlnaW4uaHRtbCNjbG9uZS1hLXBvbGljeS1jb250YWluZXJcbmZ1bmN0aW9uIGNsb25lUG9saWN5Q29udGFpbmVyIChwb2xpY3lDb250YWluZXIpIHtcbiAgcmV0dXJuIHtcbiAgICByZWZlcnJlclBvbGljeTogcG9saWN5Q29udGFpbmVyLnJlZmVycmVyUG9saWN5XG4gIH1cbn1cblxuLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmFwcHNlYy1yZWZlcnJlci1wb2xpY3kvI2RldGVybWluZS1yZXF1ZXN0cy1yZWZlcnJlclxuZnVuY3Rpb24gZGV0ZXJtaW5lUmVxdWVzdHNSZWZlcnJlciAocmVxdWVzdCkge1xuICAvLyAxLiBMZXQgcG9saWN5IGJlIHJlcXVlc3QncyByZWZlcnJlciBwb2xpY3kuXG4gIGNvbnN0IHBvbGljeSA9IHJlcXVlc3QucmVmZXJyZXJQb2xpY3lcblxuICAvLyBOb3RlOiBwb2xpY3kgY2Fubm90IChzaG91bGRuJ3QpIGJlIG51bGwgb3IgYW4gZW1wdHkgc3RyaW5nLlxuICBhc3NlcnQocG9saWN5KVxuXG4gIC8vIDIuIExldCBlbnZpcm9ubWVudCBiZSByZXF1ZXN04oCZcyBjbGllbnQuXG5cbiAgbGV0IHJlZmVycmVyU291cmNlID0gbnVsbFxuXG4gIC8vIDMuIFN3aXRjaCBvbiByZXF1ZXN04oCZcyByZWZlcnJlcjpcbiAgaWYgKHJlcXVlc3QucmVmZXJyZXIgPT09ICdjbGllbnQnKSB7XG4gICAgLy8gTm90ZTogbm9kZSBpc24ndCBhIGJyb3dzZXIgYW5kIGRvZXNuJ3QgaW1wbGVtZW50IGRvY3VtZW50L2lmcmFtZXMsXG4gICAgLy8gc28gd2UgYnlwYXNzIHRoaXMgc3RlcCBhbmQgcmVwbGFjZSBpdCB3aXRoIG91ciBvd24uXG5cbiAgICBjb25zdCBnbG9iYWxPcmlnaW4gPSBnZXRHbG9iYWxPcmlnaW4oKVxuXG4gICAgaWYgKCFnbG9iYWxPcmlnaW4gfHwgZ2xvYmFsT3JpZ2luLm9yaWdpbiA9PT0gJ251bGwnKSB7XG4gICAgICByZXR1cm4gJ25vLXJlZmVycmVyJ1xuICAgIH1cblxuICAgIC8vIG5vdGU6IHdlIG5lZWQgdG8gY2xvbmUgaXQgYXMgaXQncyBtdXRhdGVkXG4gICAgcmVmZXJyZXJTb3VyY2UgPSBuZXcgVVJMKGdsb2JhbE9yaWdpbilcbiAgfSBlbHNlIGlmIChyZXF1ZXN0LnJlZmVycmVyIGluc3RhbmNlb2YgVVJMKSB7XG4gICAgLy8gTGV0IHJlZmVycmVyU291cmNlIGJlIHJlcXVlc3TigJlzIHJlZmVycmVyLlxuICAgIHJlZmVycmVyU291cmNlID0gcmVxdWVzdC5yZWZlcnJlclxuICB9XG5cbiAgLy8gNC4gTGV0IHJlcXVlc3TigJlzIHJlZmVycmVyVVJMIGJlIHRoZSByZXN1bHQgb2Ygc3RyaXBwaW5nIHJlZmVycmVyU291cmNlIGZvclxuICAvLyAgICB1c2UgYXMgYSByZWZlcnJlci5cbiAgbGV0IHJlZmVycmVyVVJMID0gc3RyaXBVUkxGb3JSZWZlcnJlcihyZWZlcnJlclNvdXJjZSlcblxuICAvLyA1LiBMZXQgcmVmZXJyZXJPcmlnaW4gYmUgdGhlIHJlc3VsdCBvZiBzdHJpcHBpbmcgcmVmZXJyZXJTb3VyY2UgZm9yIHVzZSBhc1xuICAvLyAgICBhIHJlZmVycmVyLCB3aXRoIHRoZSBvcmlnaW4tb25seSBmbGFnIHNldCB0byB0cnVlLlxuICBjb25zdCByZWZlcnJlck9yaWdpbiA9IHN0cmlwVVJMRm9yUmVmZXJyZXIocmVmZXJyZXJTb3VyY2UsIHRydWUpXG5cbiAgLy8gNi4gSWYgdGhlIHJlc3VsdCBvZiBzZXJpYWxpemluZyByZWZlcnJlclVSTCBpcyBhIHN0cmluZyB3aG9zZSBsZW5ndGggaXNcbiAgLy8gICAgZ3JlYXRlciB0aGFuIDQwOTYsIHNldCByZWZlcnJlclVSTCB0byByZWZlcnJlck9yaWdpbi5cbiAgaWYgKHJlZmVycmVyVVJMLnRvU3RyaW5nKCkubGVuZ3RoID4gNDA5Nikge1xuICAgIHJlZmVycmVyVVJMID0gcmVmZXJyZXJPcmlnaW5cbiAgfVxuXG4gIGNvbnN0IGFyZVNhbWVPcmlnaW4gPSBzYW1lT3JpZ2luKHJlcXVlc3QsIHJlZmVycmVyVVJMKVxuICBjb25zdCBpc05vblBvdGVudGlhbGx5VHJ1c3RXb3J0aHkgPSBpc1VSTFBvdGVudGlhbGx5VHJ1c3R3b3J0aHkocmVmZXJyZXJVUkwpICYmXG4gICAgIWlzVVJMUG90ZW50aWFsbHlUcnVzdHdvcnRoeShyZXF1ZXN0LnVybClcblxuICAvLyA4LiBFeGVjdXRlIHRoZSBzd2l0Y2ggc3RhdGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSB2YWx1ZSBvZiBwb2xpY3k6XG4gIHN3aXRjaCAocG9saWN5KSB7XG4gICAgY2FzZSAnb3JpZ2luJzogcmV0dXJuIHJlZmVycmVyT3JpZ2luICE9IG51bGwgPyByZWZlcnJlck9yaWdpbiA6IHN0cmlwVVJMRm9yUmVmZXJyZXIocmVmZXJyZXJTb3VyY2UsIHRydWUpXG4gICAgY2FzZSAndW5zYWZlLXVybCc6IHJldHVybiByZWZlcnJlclVSTFxuICAgIGNhc2UgJ3NhbWUtb3JpZ2luJzpcbiAgICAgIHJldHVybiBhcmVTYW1lT3JpZ2luID8gcmVmZXJyZXJPcmlnaW4gOiAnbm8tcmVmZXJyZXInXG4gICAgY2FzZSAnb3JpZ2luLXdoZW4tY3Jvc3Mtb3JpZ2luJzpcbiAgICAgIHJldHVybiBhcmVTYW1lT3JpZ2luID8gcmVmZXJyZXJVUkwgOiByZWZlcnJlck9yaWdpblxuICAgIGNhc2UgJ3N0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4nOiB7XG4gICAgICBjb25zdCBjdXJyZW50VVJMID0gcmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdClcblxuICAgICAgLy8gMS4gSWYgdGhlIG9yaWdpbiBvZiByZWZlcnJlclVSTCBhbmQgdGhlIG9yaWdpbiBvZiByZXF1ZXN04oCZcyBjdXJyZW50XG4gICAgICAvLyAgICBVUkwgYXJlIHRoZSBzYW1lLCB0aGVuIHJldHVybiByZWZlcnJlclVSTC5cbiAgICAgIGlmIChzYW1lT3JpZ2luKHJlZmVycmVyVVJMLCBjdXJyZW50VVJMKSkge1xuICAgICAgICByZXR1cm4gcmVmZXJyZXJVUkxcbiAgICAgIH1cblxuICAgICAgLy8gMi4gSWYgcmVmZXJyZXJVUkwgaXMgYSBwb3RlbnRpYWxseSB0cnVzdHdvcnRoeSBVUkwgYW5kIHJlcXVlc3TigJlzXG4gICAgICAvLyAgICBjdXJyZW50IFVSTCBpcyBub3QgYSBwb3RlbnRpYWxseSB0cnVzdHdvcnRoeSBVUkwsIHRoZW4gcmV0dXJuIG5vXG4gICAgICAvLyAgICByZWZlcnJlci5cbiAgICAgIGlmIChpc1VSTFBvdGVudGlhbGx5VHJ1c3R3b3J0aHkocmVmZXJyZXJVUkwpICYmICFpc1VSTFBvdGVudGlhbGx5VHJ1c3R3b3J0aHkoY3VycmVudFVSTCkpIHtcbiAgICAgICAgcmV0dXJuICduby1yZWZlcnJlcidcbiAgICAgIH1cblxuICAgICAgLy8gMy4gUmV0dXJuIHJlZmVycmVyT3JpZ2luLlxuICAgICAgcmV0dXJuIHJlZmVycmVyT3JpZ2luXG4gICAgfVxuICAgIGNhc2UgJ3N0cmljdC1vcmlnaW4nOiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAvKipcbiAgICAgICAgICogMS4gSWYgcmVmZXJyZXJVUkwgaXMgYSBwb3RlbnRpYWxseSB0cnVzdHdvcnRoeSBVUkwgYW5kXG4gICAgICAgICAqIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJMIGlzIG5vdCBhIHBvdGVudGlhbGx5IHRydXN0d29ydGh5IFVSTCxcbiAgICAgICAgICogdGhlbiByZXR1cm4gbm8gcmVmZXJyZXIuXG4gICAgICAgICAqIDIuIFJldHVybiByZWZlcnJlck9yaWdpblxuICAgICAgICAqL1xuICAgIGNhc2UgJ25vLXJlZmVycmVyLXdoZW4tZG93bmdyYWRlJzogLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgLyoqXG4gICAgICAgKiAxLiBJZiByZWZlcnJlclVSTCBpcyBhIHBvdGVudGlhbGx5IHRydXN0d29ydGh5IFVSTCBhbmRcbiAgICAgICAqIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJMIGlzIG5vdCBhIHBvdGVudGlhbGx5IHRydXN0d29ydGh5IFVSTCxcbiAgICAgICAqIHRoZW4gcmV0dXJuIG5vIHJlZmVycmVyLlxuICAgICAgICogMi4gUmV0dXJuIHJlZmVycmVyT3JpZ2luXG4gICAgICAqL1xuXG4gICAgZGVmYXVsdDogLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgcmV0dXJuIGlzTm9uUG90ZW50aWFsbHlUcnVzdFdvcnRoeSA/ICduby1yZWZlcnJlcicgOiByZWZlcnJlck9yaWdpblxuICB9XG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLXJlZmVycmVyLXBvbGljeS8jc3RyaXAtdXJsXG4gKiBAcGFyYW0ge1VSTH0gdXJsXG4gKiBAcGFyYW0ge2Jvb2xlYW58dW5kZWZpbmVkfSBvcmlnaW5Pbmx5XG4gKi9cbmZ1bmN0aW9uIHN0cmlwVVJMRm9yUmVmZXJyZXIgKHVybCwgb3JpZ2luT25seSkge1xuICAvLyAxLiBBc3NlcnQ6IHVybCBpcyBhIFVSTC5cbiAgYXNzZXJ0KHVybCBpbnN0YW5jZW9mIFVSTClcblxuICAvLyAyLiBJZiB1cmzigJlzIHNjaGVtZSBpcyBhIGxvY2FsIHNjaGVtZSwgdGhlbiByZXR1cm4gbm8gcmVmZXJyZXIuXG4gIGlmICh1cmwucHJvdG9jb2wgPT09ICdmaWxlOicgfHwgdXJsLnByb3RvY29sID09PSAnYWJvdXQ6JyB8fCB1cmwucHJvdG9jb2wgPT09ICdibGFuazonKSB7XG4gICAgcmV0dXJuICduby1yZWZlcnJlcidcbiAgfVxuXG4gIC8vIDMuIFNldCB1cmzigJlzIHVzZXJuYW1lIHRvIHRoZSBlbXB0eSBzdHJpbmcuXG4gIHVybC51c2VybmFtZSA9ICcnXG5cbiAgLy8gNC4gU2V0IHVybOKAmXMgcGFzc3dvcmQgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAgdXJsLnBhc3N3b3JkID0gJydcblxuICAvLyA1LiBTZXQgdXJs4oCZcyBmcmFnbWVudCB0byBudWxsLlxuICB1cmwuaGFzaCA9ICcnXG5cbiAgLy8gNi4gSWYgdGhlIG9yaWdpbi1vbmx5IGZsYWcgaXMgdHJ1ZSwgdGhlbjpcbiAgaWYgKG9yaWdpbk9ubHkpIHtcbiAgICAvLyAxLiBTZXQgdXJs4oCZcyBwYXRoIHRvIMKrIHRoZSBlbXB0eSBzdHJpbmcgwrsuXG4gICAgdXJsLnBhdGhuYW1lID0gJydcblxuICAgIC8vIDIuIFNldCB1cmzigJlzIHF1ZXJ5IHRvIG51bGwuXG4gICAgdXJsLnNlYXJjaCA9ICcnXG4gIH1cblxuICAvLyA3LiBSZXR1cm4gdXJsLlxuICByZXR1cm4gdXJsXG59XG5cbmZ1bmN0aW9uIGlzVVJMUG90ZW50aWFsbHlUcnVzdHdvcnRoeSAodXJsKSB7XG4gIGlmICghKHVybCBpbnN0YW5jZW9mIFVSTCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIElmIGNoaWxkIG9mIGFib3V0LCByZXR1cm4gdHJ1ZVxuICBpZiAodXJsLmhyZWYgPT09ICdhYm91dDpibGFuaycgfHwgdXJsLmhyZWYgPT09ICdhYm91dDpzcmNkb2MnKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIElmIHNjaGVtZSBpcyBkYXRhLCByZXR1cm4gdHJ1ZVxuICBpZiAodXJsLnByb3RvY29sID09PSAnZGF0YTonKSByZXR1cm4gdHJ1ZVxuXG4gIC8vIElmIGZpbGUsIHJldHVybiB0cnVlXG4gIGlmICh1cmwucHJvdG9jb2wgPT09ICdmaWxlOicpIHJldHVybiB0cnVlXG5cbiAgcmV0dXJuIGlzT3JpZ2luUG90ZW50aWFsbHlUcnVzdHdvcnRoeSh1cmwub3JpZ2luKVxuXG4gIGZ1bmN0aW9uIGlzT3JpZ2luUG90ZW50aWFsbHlUcnVzdHdvcnRoeSAob3JpZ2luKSB7XG4gICAgLy8gSWYgb3JpZ2luIGlzIGV4cGxpY2l0bHkgbnVsbCwgcmV0dXJuIGZhbHNlXG4gICAgaWYgKG9yaWdpbiA9PSBudWxsIHx8IG9yaWdpbiA9PT0gJ251bGwnKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IG9yaWdpbkFzVVJMID0gbmV3IFVSTChvcmlnaW4pXG5cbiAgICAvLyBJZiBzZWN1cmUsIHJldHVybiB0cnVlXG4gICAgaWYgKG9yaWdpbkFzVVJMLnByb3RvY29sID09PSAnaHR0cHM6JyB8fCBvcmlnaW5Bc1VSTC5wcm90b2NvbCA9PT0gJ3dzczonKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIC8vIElmIGxvY2FsaG9zdCBvciB2YXJpYW50cywgcmV0dXJuIHRydWVcbiAgICBpZiAoL14xMjcoPzpcXC5bMC05XSspezAsMn1cXC5bMC05XSskfF5cXFsoPzowKjopKj86PzAqMVxcXSQvLnRlc3Qob3JpZ2luQXNVUkwuaG9zdG5hbWUpIHx8XG4gICAgIChvcmlnaW5Bc1VSTC5ob3N0bmFtZSA9PT0gJ2xvY2FsaG9zdCcgfHwgb3JpZ2luQXNVUkwuaG9zdG5hbWUuaW5jbHVkZXMoJ2xvY2FsaG9zdC4nKSkgfHxcbiAgICAgKG9yaWdpbkFzVVJMLmhvc3RuYW1lLmVuZHNXaXRoKCcubG9jYWxob3N0JykpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIC8vIElmIGFueSBvdGhlciwgcmV0dXJuIGZhbHNlXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtc3VicmVzb3VyY2UtaW50ZWdyaXR5LyNkb2VzLXJlc3BvbnNlLW1hdGNoLW1ldGFkYXRhbGlzdFxuICogQHBhcmFtIHtVaW50OEFycmF5fSBieXRlc1xuICogQHBhcmFtIHtzdHJpbmd9IG1ldGFkYXRhTGlzdFxuICovXG5mdW5jdGlvbiBieXRlc01hdGNoIChieXRlcywgbWV0YWRhdGFMaXN0KSB7XG4gIC8vIElmIG5vZGUgaXMgbm90IGJ1aWx0IHdpdGggT3BlblNTTCBzdXBwb3J0LCB3ZSBjYW5ub3QgY2hlY2tcbiAgLy8gYSByZXF1ZXN0J3MgaW50ZWdyaXR5LCBzbyBhbGxvdyBpdCBieSBkZWZhdWx0ICh0aGUgc3BlYyB3aWxsXG4gIC8vIGFsbG93IHJlcXVlc3RzIGlmIGFuIGludmFsaWQgaGFzaCBpcyBnaXZlbiwgYXMgcHJlY2VkZW5jZSkuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZjogb25seSBpZiBub2RlIGlzIGJ1aWx0IHdpdGggLS13aXRob3V0LXNzbCAqL1xuICBpZiAoY3J5cHRvID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gMS4gTGV0IHBhcnNlZE1ldGFkYXRhIGJlIHRoZSByZXN1bHQgb2YgcGFyc2luZyBtZXRhZGF0YUxpc3QuXG4gIGNvbnN0IHBhcnNlZE1ldGFkYXRhID0gcGFyc2VNZXRhZGF0YShtZXRhZGF0YUxpc3QpXG5cbiAgLy8gMi4gSWYgcGFyc2VkTWV0YWRhdGEgaXMgbm8gbWV0YWRhdGEsIHJldHVybiB0cnVlLlxuICBpZiAocGFyc2VkTWV0YWRhdGEgPT09ICdubyBtZXRhZGF0YScpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gMy4gSWYgcmVzcG9uc2UgaXMgbm90IGVsaWdpYmxlIGZvciBpbnRlZ3JpdHkgdmFsaWRhdGlvbiwgcmV0dXJuIGZhbHNlLlxuICAvLyBUT0RPXG5cbiAgLy8gNC4gSWYgcGFyc2VkTWV0YWRhdGEgaXMgdGhlIGVtcHR5IHNldCwgcmV0dXJuIHRydWUuXG4gIGlmIChwYXJzZWRNZXRhZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gNS4gTGV0IG1ldGFkYXRhIGJlIHRoZSByZXN1bHQgb2YgZ2V0dGluZyB0aGUgc3Ryb25nZXN0XG4gIC8vICAgIG1ldGFkYXRhIGZyb20gcGFyc2VkTWV0YWRhdGEuXG4gIGNvbnN0IHN0cm9uZ2VzdCA9IGdldFN0cm9uZ2VzdE1ldGFkYXRhKHBhcnNlZE1ldGFkYXRhKVxuICBjb25zdCBtZXRhZGF0YSA9IGZpbHRlck1ldGFkYXRhTGlzdEJ5QWxnb3JpdGhtKHBhcnNlZE1ldGFkYXRhLCBzdHJvbmdlc3QpXG5cbiAgLy8gNi4gRm9yIGVhY2ggaXRlbSBpbiBtZXRhZGF0YTpcbiAgZm9yIChjb25zdCBpdGVtIG9mIG1ldGFkYXRhKSB7XG4gICAgLy8gMS4gTGV0IGFsZ29yaXRobSBiZSB0aGUgYWxnIGNvbXBvbmVudCBvZiBpdGVtLlxuICAgIGNvbnN0IGFsZ29yaXRobSA9IGl0ZW0uYWxnb1xuXG4gICAgLy8gMi4gTGV0IGV4cGVjdGVkVmFsdWUgYmUgdGhlIHZhbCBjb21wb25lbnQgb2YgaXRlbS5cbiAgICBjb25zdCBleHBlY3RlZFZhbHVlID0gaXRlbS5oYXNoXG5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3dlYi1wbGF0Zm9ybS10ZXN0cy93cHQvY29tbWl0L2U0YzVjYzdhNWU0ODA5MzIyMDUyOGRmZGQxYzQwMTJkYzM4MzdhMGVcbiAgICAvLyBcImJlIGxpYmVyYWwgd2l0aCBwYWRkaW5nXCIuIFRoaXMgaXMgYW5ub3lpbmcsIGFuZCBpdCdzIG5vdCBldmVuIGluIHRoZSBzcGVjLlxuXG4gICAgLy8gMy4gTGV0IGFjdHVhbFZhbHVlIGJlIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgYWxnb3JpdGhtIHRvIGJ5dGVzLlxuICAgIGxldCBhY3R1YWxWYWx1ZSA9IGNyeXB0by5jcmVhdGVIYXNoKGFsZ29yaXRobSkudXBkYXRlKGJ5dGVzKS5kaWdlc3QoJ2Jhc2U2NCcpXG5cbiAgICBpZiAoYWN0dWFsVmFsdWVbYWN0dWFsVmFsdWUubGVuZ3RoIC0gMV0gPT09ICc9Jykge1xuICAgICAgaWYgKGFjdHVhbFZhbHVlW2FjdHVhbFZhbHVlLmxlbmd0aCAtIDJdID09PSAnPScpIHtcbiAgICAgICAgYWN0dWFsVmFsdWUgPSBhY3R1YWxWYWx1ZS5zbGljZSgwLCAtMilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdHVhbFZhbHVlID0gYWN0dWFsVmFsdWUuc2xpY2UoMCwgLTEpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNC4gSWYgYWN0dWFsVmFsdWUgaXMgYSBjYXNlLXNlbnNpdGl2ZSBtYXRjaCBmb3IgZXhwZWN0ZWRWYWx1ZSxcbiAgICAvLyAgICByZXR1cm4gdHJ1ZS5cbiAgICBpZiAoY29tcGFyZUJhc2U2NE1peGVkKGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICAvLyA3LiBSZXR1cm4gZmFsc2UuXG4gIHJldHVybiBmYWxzZVxufVxuXG4vLyBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLXN1YnJlc291cmNlLWludGVncml0eS8jZ3JhbW1hcmRlZi1oYXNoLXdpdGgtb3B0aW9uc1xuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUDIvI3NvdXJjZS1saXN0LXN5bnRheFxuLy8gaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzUyMzQjYXBwZW5kaXgtQi4xXG5jb25zdCBwYXJzZUhhc2hXaXRoT3B0aW9ucyA9IC8oPzxhbGdvPnNoYTI1NnxzaGEzODR8c2hhNTEyKS0oKD88aGFzaD5bQS1aYS16MC05Ky9dK3xbQS1aYS16MC05Xy1dKyk9ezAsMn0oPzpcXHN8JCkoICtbIS1+XSopPyk/L2lcblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtc3VicmVzb3VyY2UtaW50ZWdyaXR5LyNwYXJzZS1tZXRhZGF0YVxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGFkYXRhXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTWV0YWRhdGEgKG1ldGFkYXRhKSB7XG4gIC8vIDEuIExldCByZXN1bHQgYmUgdGhlIGVtcHR5IHNldC5cbiAgLyoqIEB0eXBlIHt7IGFsZ286IHN0cmluZywgaGFzaDogc3RyaW5nIH1bXX0gKi9cbiAgY29uc3QgcmVzdWx0ID0gW11cblxuICAvLyAyLiBMZXQgZW1wdHkgYmUgZXF1YWwgdG8gdHJ1ZS5cbiAgbGV0IGVtcHR5ID0gdHJ1ZVxuXG4gIC8vIDMuIEZvciBlYWNoIHRva2VuIHJldHVybmVkIGJ5IHNwbGl0dGluZyBtZXRhZGF0YSBvbiBzcGFjZXM6XG4gIGZvciAoY29uc3QgdG9rZW4gb2YgbWV0YWRhdGEuc3BsaXQoJyAnKSkge1xuICAgIC8vIDEuIFNldCBlbXB0eSB0byBmYWxzZS5cbiAgICBlbXB0eSA9IGZhbHNlXG5cbiAgICAvLyAyLiBQYXJzZSB0b2tlbiBhcyBhIGhhc2gtd2l0aC1vcHRpb25zLlxuICAgIGNvbnN0IHBhcnNlZFRva2VuID0gcGFyc2VIYXNoV2l0aE9wdGlvbnMuZXhlYyh0b2tlbilcblxuICAgIC8vIDMuIElmIHRva2VuIGRvZXMgbm90IHBhcnNlLCBjb250aW51ZSB0byB0aGUgbmV4dCB0b2tlbi5cbiAgICBpZiAoXG4gICAgICBwYXJzZWRUb2tlbiA9PT0gbnVsbCB8fFxuICAgICAgcGFyc2VkVG9rZW4uZ3JvdXBzID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHBhcnNlZFRva2VuLmdyb3Vwcy5hbGdvID09PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIC8vIE5vdGU6IENocm9taXVtIGJsb2NrcyB0aGUgcmVxdWVzdCBhdCB0aGlzIHBvaW50LCBidXQgRmlyZWZveFxuICAgICAgLy8gZ2l2ZXMgYSB3YXJuaW5nIHRoYXQgYW4gaW52YWxpZCBpbnRlZ3JpdHkgd2FzIGdpdmVuLiBUaGVcbiAgICAgIC8vIGNvcnJlY3QgYmVoYXZpb3IgaXMgdG8gaWdub3JlIHRoZXNlLCBhbmQgc3Vic2VxdWVudGx5IG5vdFxuICAgICAgLy8gY2hlY2sgdGhlIGludGVncml0eSBvZiB0aGUgcmVzb3VyY2UuXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIDQuIExldCBhbGdvcml0aG0gYmUgdGhlIGhhc2gtYWxnbyBjb21wb25lbnQgb2YgdG9rZW4uXG4gICAgY29uc3QgYWxnb3JpdGhtID0gcGFyc2VkVG9rZW4uZ3JvdXBzLmFsZ28udG9Mb3dlckNhc2UoKVxuXG4gICAgLy8gNS4gSWYgYWxnb3JpdGhtIGlzIGEgaGFzaCBmdW5jdGlvbiByZWNvZ25pemVkIGJ5IHRoZSB1c2VyXG4gICAgLy8gICAgYWdlbnQsIGFkZCB0aGUgcGFyc2VkIHRva2VuIHRvIHJlc3VsdC5cbiAgICBpZiAoc3VwcG9ydGVkSGFzaGVzLmluY2x1ZGVzKGFsZ29yaXRobSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHBhcnNlZFRva2VuLmdyb3VwcylcbiAgICB9XG4gIH1cblxuICAvLyA0LiBSZXR1cm4gbm8gbWV0YWRhdGEgaWYgZW1wdHkgaXMgdHJ1ZSwgb3RoZXJ3aXNlIHJldHVybiByZXN1bHQuXG4gIGlmIChlbXB0eSA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiAnbm8gbWV0YWRhdGEnXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogQHBhcmFtIHt7IGFsZ286ICdzaGEyNTYnIHwgJ3NoYTM4NCcgfCAnc2hhNTEyJyB9W119IG1ldGFkYXRhTGlzdFxuICovXG5mdW5jdGlvbiBnZXRTdHJvbmdlc3RNZXRhZGF0YSAobWV0YWRhdGFMaXN0KSB7XG4gIC8vIExldCBhbGdvcml0aG0gYmUgdGhlIGFsZ28gY29tcG9uZW50IG9mIHRoZSBmaXJzdCBpdGVtIGluIG1ldGFkYXRhTGlzdC5cbiAgLy8gQ2FuIGJlIHNoYTI1NlxuICBsZXQgYWxnb3JpdGhtID0gbWV0YWRhdGFMaXN0WzBdLmFsZ29cbiAgLy8gSWYgdGhlIGFsZ29yaXRobSBpcyBzaGE1MTIsIHRoZW4gaXQgaXMgdGhlIHN0cm9uZ2VzdFxuICAvLyBhbmQgd2UgY2FuIHJldHVybiBpbW1lZGlhdGVseVxuICBpZiAoYWxnb3JpdGhtWzNdID09PSAnNScpIHtcbiAgICByZXR1cm4gYWxnb3JpdGhtXG4gIH1cblxuICBmb3IgKGxldCBpID0gMTsgaSA8IG1ldGFkYXRhTGlzdC5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gbWV0YWRhdGFMaXN0W2ldXG4gICAgLy8gSWYgdGhlIGFsZ29yaXRobSBpcyBzaGE1MTIsIHRoZW4gaXQgaXMgdGhlIHN0cm9uZ2VzdFxuICAgIC8vIGFuZCB3ZSBjYW4gYnJlYWsgdGhlIGxvb3AgaW1tZWRpYXRlbHlcbiAgICBpZiAobWV0YWRhdGEuYWxnb1szXSA9PT0gJzUnKSB7XG4gICAgICBhbGdvcml0aG0gPSAnc2hhNTEyJ1xuICAgICAgYnJlYWtcbiAgICAvLyBJZiB0aGUgYWxnb3JpdGhtIGlzIHNoYTM4NCwgdGhlbiBhIHBvdGVudGlhbCBzaGEyNTYgb3Igc2hhMzg0IGlzIGlnbm9yZWRcbiAgICB9IGVsc2UgaWYgKGFsZ29yaXRobVszXSA9PT0gJzMnKSB7XG4gICAgICBjb250aW51ZVxuICAgIC8vIGFsZ29yaXRobSBpcyBzaGEyNTYsIGNoZWNrIGlmIGFsZ29yaXRobSBpcyBzaGEzODQgYW5kIGlmIHNvLCBzZXQgaXQgYXNcbiAgICAvLyB0aGUgc3Ryb25nZXN0XG4gICAgfSBlbHNlIGlmIChtZXRhZGF0YS5hbGdvWzNdID09PSAnMycpIHtcbiAgICAgIGFsZ29yaXRobSA9ICdzaGEzODQnXG4gICAgfVxuICB9XG4gIHJldHVybiBhbGdvcml0aG1cbn1cblxuZnVuY3Rpb24gZmlsdGVyTWV0YWRhdGFMaXN0QnlBbGdvcml0aG0gKG1ldGFkYXRhTGlzdCwgYWxnb3JpdGhtKSB7XG4gIGlmIChtZXRhZGF0YUxpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIG1ldGFkYXRhTGlzdFxuICB9XG5cbiAgbGV0IHBvcyA9IDBcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXRhZGF0YUxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobWV0YWRhdGFMaXN0W2ldLmFsZ28gPT09IGFsZ29yaXRobSkge1xuICAgICAgbWV0YWRhdGFMaXN0W3BvcysrXSA9IG1ldGFkYXRhTGlzdFtpXVxuICAgIH1cbiAgfVxuXG4gIG1ldGFkYXRhTGlzdC5sZW5ndGggPSBwb3NcblxuICByZXR1cm4gbWV0YWRhdGFMaXN0XG59XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIGJhc2U2NCBzdHJpbmdzLCBhbGxvd2luZyBmb3IgYmFzZTY0dXJsXG4gKiBpbiB0aGUgc2Vjb25kIHN0cmluZy5cbiAqXG4qIEBwYXJhbSB7c3RyaW5nfSBhY3R1YWxWYWx1ZSBhbHdheXMgYmFzZTY0XG4gKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRWYWx1ZSBiYXNlNjQgb3IgYmFzZTY0dXJsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJhc2U2NE1peGVkIChhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSkge1xuICBpZiAoYWN0dWFsVmFsdWUubGVuZ3RoICE9PSBleHBlY3RlZFZhbHVlLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYWN0dWFsVmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoYWN0dWFsVmFsdWVbaV0gIT09IGV4cGVjdGVkVmFsdWVbaV0pIHtcbiAgICAgIGlmIChcbiAgICAgICAgKGFjdHVhbFZhbHVlW2ldID09PSAnKycgJiYgZXhwZWN0ZWRWYWx1ZVtpXSA9PT0gJy0nKSB8fFxuICAgICAgICAoYWN0dWFsVmFsdWVbaV0gPT09ICcvJyAmJiBleHBlY3RlZFZhbHVlW2ldID09PSAnXycpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtdXBncmFkZS1pbnNlY3VyZS1yZXF1ZXN0cy8jdXBncmFkZS1yZXF1ZXN0XG5mdW5jdGlvbiB0cnlVcGdyYWRlUmVxdWVzdFRvQVBvdGVudGlhbGx5VHJ1c3R3b3J0aHlVUkwgKHJlcXVlc3QpIHtcbiAgLy8gVE9ET1xufVxuXG4vKipcbiAqIEBsaW5rIHtodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9vcmlnaW4uaHRtbCNzYW1lLW9yaWdpbn1cbiAqIEBwYXJhbSB7VVJMfSBBXG4gKiBAcGFyYW0ge1VSTH0gQlxuICovXG5mdW5jdGlvbiBzYW1lT3JpZ2luIChBLCBCKSB7XG4gIC8vIDEuIElmIEEgYW5kIEIgYXJlIHRoZSBzYW1lIG9wYXF1ZSBvcmlnaW4sIHRoZW4gcmV0dXJuIHRydWUuXG4gIGlmIChBLm9yaWdpbiA9PT0gQi5vcmlnaW4gJiYgQS5vcmlnaW4gPT09ICdudWxsJykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvLyAyLiBJZiBBIGFuZCBCIGFyZSBib3RoIHR1cGxlIG9yaWdpbnMgYW5kIHRoZWlyIHNjaGVtZXMsXG4gIC8vICAgIGhvc3RzLCBhbmQgcG9ydCBhcmUgaWRlbnRpY2FsLCB0aGVuIHJldHVybiB0cnVlLlxuICBpZiAoQS5wcm90b2NvbCA9PT0gQi5wcm90b2NvbCAmJiBBLmhvc3RuYW1lID09PSBCLmhvc3RuYW1lICYmIEEucG9ydCA9PT0gQi5wb3J0KSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIDMuIFJldHVybiBmYWxzZS5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZURlZmVycmVkUHJvbWlzZSAoKSB7XG4gIGxldCByZXNcbiAgbGV0IHJlalxuICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHJlcyA9IHJlc29sdmVcbiAgICByZWogPSByZWplY3RcbiAgfSlcblxuICByZXR1cm4geyBwcm9taXNlLCByZXNvbHZlOiByZXMsIHJlamVjdDogcmVqIH1cbn1cblxuZnVuY3Rpb24gaXNBYm9ydGVkIChmZXRjaFBhcmFtcykge1xuICByZXR1cm4gZmV0Y2hQYXJhbXMuY29udHJvbGxlci5zdGF0ZSA9PT0gJ2Fib3J0ZWQnXG59XG5cbmZ1bmN0aW9uIGlzQ2FuY2VsbGVkIChmZXRjaFBhcmFtcykge1xuICByZXR1cm4gZmV0Y2hQYXJhbXMuY29udHJvbGxlci5zdGF0ZSA9PT0gJ2Fib3J0ZWQnIHx8XG4gICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5zdGF0ZSA9PT0gJ3Rlcm1pbmF0ZWQnXG59XG5cbmNvbnN0IG5vcm1hbGl6ZU1ldGhvZFJlY29yZCA9IHtcbiAgZGVsZXRlOiAnREVMRVRFJyxcbiAgREVMRVRFOiAnREVMRVRFJyxcbiAgZ2V0OiAnR0VUJyxcbiAgR0VUOiAnR0VUJyxcbiAgaGVhZDogJ0hFQUQnLFxuICBIRUFEOiAnSEVBRCcsXG4gIG9wdGlvbnM6ICdPUFRJT05TJyxcbiAgT1BUSU9OUzogJ09QVElPTlMnLFxuICBwb3N0OiAnUE9TVCcsXG4gIFBPU1Q6ICdQT1NUJyxcbiAgcHV0OiAnUFVUJyxcbiAgUFVUOiAnUFVUJ1xufVxuXG4vLyBOb3RlOiBvYmplY3QgcHJvdG90eXBlcyBzaG91bGQgbm90IGJlIGFibGUgdG8gYmUgcmVmZXJlbmNlZC4gZS5nLiBgT2JqZWN0I2hhc093blByb3BlcnR5YC5cbk9iamVjdC5zZXRQcm90b3R5cGVPZihub3JtYWxpemVNZXRob2RSZWNvcmQsIG51bGwpXG5cbi8qKlxuICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1tZXRob2Qtbm9ybWFsaXplXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZU1ldGhvZCAobWV0aG9kKSB7XG4gIHJldHVybiBub3JtYWxpemVNZXRob2RSZWNvcmRbbWV0aG9kLnRvTG93ZXJDYXNlKCldID8/IG1ldGhvZFxufVxuXG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jc2VyaWFsaXplLWEtamF2YXNjcmlwdC12YWx1ZS10by1hLWpzb24tc3RyaW5nXG5mdW5jdGlvbiBzZXJpYWxpemVKYXZhc2NyaXB0VmFsdWVUb0pTT05TdHJpbmcgKHZhbHVlKSB7XG4gIC8vIDEuIExldCByZXN1bHQgYmUgPyBDYWxsKCVKU09OLnN0cmluZ2lmeSUsIHVuZGVmaW5lZCwgwqsgdmFsdWUgwrspLlxuICBjb25zdCByZXN1bHQgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcblxuICAvLyAyLiBJZiByZXN1bHQgaXMgdW5kZWZpbmVkLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdWYWx1ZSBpcyBub3QgSlNPTiBzZXJpYWxpemFibGUnKVxuICB9XG5cbiAgLy8gMy4gQXNzZXJ0OiByZXN1bHQgaXMgYSBzdHJpbmcuXG4gIGFzc2VydCh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJylcblxuICAvLyA0LiBSZXR1cm4gcmVzdWx0LlxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJTI1aXRlcmF0b3Jwcm90b3R5cGUlMjUtb2JqZWN0XG5jb25zdCBlc0l0ZXJhdG9yUHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZihbXVtTeW1ib2wuaXRlcmF0b3JdKCkpKVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNkZm4taXRlcmF0b3ItcHJvdG90eXBlLW9iamVjdFxuICogQHBhcmFtIHsoKSA9PiB1bmtub3duW119IGl0ZXJhdG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBuYW1lIG9mIHRoZSBpbnN0YW5jZVxuICogQHBhcmFtIHsna2V5J3wndmFsdWUnfCdrZXkrdmFsdWUnfSBraW5kXG4gKi9cbmZ1bmN0aW9uIG1ha2VJdGVyYXRvciAoaXRlcmF0b3IsIG5hbWUsIGtpbmQpIHtcbiAgY29uc3Qgb2JqZWN0ID0ge1xuICAgIGluZGV4OiAwLFxuICAgIGtpbmQsXG4gICAgdGFyZ2V0OiBpdGVyYXRvclxuICB9XG5cbiAgY29uc3QgaSA9IHtcbiAgICBuZXh0ICgpIHtcbiAgICAgIC8vIDEuIExldCBpbnRlcmZhY2UgYmUgdGhlIGludGVyZmFjZSBmb3Igd2hpY2ggdGhlIGl0ZXJhdG9yIHByb3RvdHlwZSBvYmplY3QgZXhpc3RzLlxuXG4gICAgICAvLyAyLiBMZXQgdGhpc1ZhbHVlIGJlIHRoZSB0aGlzIHZhbHVlLlxuXG4gICAgICAvLyAzLiBMZXQgb2JqZWN0IGJlID8gVG9PYmplY3QodGhpc1ZhbHVlKS5cblxuICAgICAgLy8gNC4gSWYgb2JqZWN0IGlzIGEgcGxhdGZvcm0gb2JqZWN0LCB0aGVuIHBlcmZvcm0gYSBzZWN1cml0eVxuICAgICAgLy8gICAgY2hlY2ssIHBhc3Npbmc6XG5cbiAgICAgIC8vIDUuIElmIG9iamVjdCBpcyBub3QgYSBkZWZhdWx0IGl0ZXJhdG9yIG9iamVjdCBmb3IgaW50ZXJmYWNlLFxuICAgICAgLy8gICAgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykgIT09IGkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBgJ25leHQnIGNhbGxlZCBvbiBhbiBvYmplY3QgdGhhdCBkb2VzIG5vdCBpbXBsZW1lbnQgaW50ZXJmYWNlICR7bmFtZX0gSXRlcmF0b3IuYFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8vIDYuIExldCBpbmRleCBiZSBvYmplY3TigJlzIGluZGV4LlxuICAgICAgLy8gNy4gTGV0IGtpbmQgYmUgb2JqZWN04oCZcyBraW5kLlxuICAgICAgLy8gOC4gTGV0IHZhbHVlcyBiZSBvYmplY3TigJlzIHRhcmdldCdzIHZhbHVlIHBhaXJzIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgIGNvbnN0IHsgaW5kZXgsIGtpbmQsIHRhcmdldCB9ID0gb2JqZWN0XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0YXJnZXQoKVxuXG4gICAgICAvLyA5LiBMZXQgbGVuIGJlIHRoZSBsZW5ndGggb2YgdmFsdWVzLlxuICAgICAgY29uc3QgbGVuID0gdmFsdWVzLmxlbmd0aFxuXG4gICAgICAvLyAxMC4gSWYgaW5kZXggaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGxlbiwgdGhlbiByZXR1cm5cbiAgICAgIC8vICAgICBDcmVhdGVJdGVyUmVzdWx0T2JqZWN0KHVuZGVmaW5lZCwgdHJ1ZSkuXG4gICAgICBpZiAoaW5kZXggPj0gbGVuKSB7XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfVxuICAgICAgfVxuXG4gICAgICAvLyAxMS4gTGV0IHBhaXIgYmUgdGhlIGVudHJ5IGluIHZhbHVlcyBhdCBpbmRleCBpbmRleC5cbiAgICAgIGNvbnN0IHBhaXIgPSB2YWx1ZXNbaW5kZXhdXG5cbiAgICAgIC8vIDEyLiBTZXQgb2JqZWN04oCZcyBpbmRleCB0byBpbmRleCArIDEuXG4gICAgICBvYmplY3QuaW5kZXggPSBpbmRleCArIDFcblxuICAgICAgLy8gMTMuIFJldHVybiB0aGUgaXRlcmF0b3IgcmVzdWx0IGZvciBwYWlyIGFuZCBraW5kLlxuICAgICAgcmV0dXJuIGl0ZXJhdG9yUmVzdWx0KHBhaXIsIGtpbmQpXG4gICAgfSxcbiAgICAvLyBUaGUgY2xhc3Mgc3RyaW5nIG9mIGFuIGl0ZXJhdG9yIHByb3RvdHlwZSBvYmplY3QgZm9yIGEgZ2l2ZW4gaW50ZXJmYWNlIGlzIHRoZVxuICAgIC8vIHJlc3VsdCBvZiBjb25jYXRlbmF0aW5nIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBpbnRlcmZhY2UgYW5kIHRoZSBzdHJpbmcgXCIgSXRlcmF0b3JcIi5cbiAgICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogYCR7bmFtZX0gSXRlcmF0b3JgXG4gIH1cblxuICAvLyBUaGUgW1tQcm90b3R5cGVdXSBpbnRlcm5hbCBzbG90IG9mIGFuIGl0ZXJhdG9yIHByb3RvdHlwZSBvYmplY3QgbXVzdCBiZSAlSXRlcmF0b3JQcm90b3R5cGUlLlxuICBPYmplY3Quc2V0UHJvdG90eXBlT2YoaSwgZXNJdGVyYXRvclByb3RvdHlwZSlcbiAgLy8gZXNJdGVyYXRvclByb3RvdHlwZSBuZWVkcyB0byBiZSB0aGUgcHJvdG90eXBlIG9mIGlcbiAgLy8gd2hpY2ggaXMgdGhlIHByb3RvdHlwZSBvZiBhbiBlbXB0eSBvYmplY3QuIFllcywgaXQncyBjb25mdXNpbmcuXG4gIHJldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2Yoe30sIGkpXG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jaXRlcmF0b3ItcmVzdWx0XG5mdW5jdGlvbiBpdGVyYXRvclJlc3VsdCAocGFpciwga2luZCkge1xuICBsZXQgcmVzdWx0XG5cbiAgLy8gMS4gTGV0IHJlc3VsdCBiZSBhIHZhbHVlIGRldGVybWluZWQgYnkgdGhlIHZhbHVlIG9mIGtpbmQ6XG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgJ2tleSc6IHtcbiAgICAgIC8vIDEuIExldCBpZGxLZXkgYmUgcGFpcuKAmXMga2V5LlxuICAgICAgLy8gMi4gTGV0IGtleSBiZSB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgaWRsS2V5IHRvIGFuXG4gICAgICAvLyAgICBFQ01BU2NyaXB0IHZhbHVlLlxuICAgICAgLy8gMy4gcmVzdWx0IGlzIGtleS5cbiAgICAgIHJlc3VsdCA9IHBhaXJbMF1cbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIGNhc2UgJ3ZhbHVlJzoge1xuICAgICAgLy8gMS4gTGV0IGlkbFZhbHVlIGJlIHBhaXLigJlzIHZhbHVlLlxuICAgICAgLy8gMi4gTGV0IHZhbHVlIGJlIHRoZSByZXN1bHQgb2YgY29udmVydGluZyBpZGxWYWx1ZSB0b1xuICAgICAgLy8gICAgYW4gRUNNQVNjcmlwdCB2YWx1ZS5cbiAgICAgIC8vIDMuIHJlc3VsdCBpcyB2YWx1ZS5cbiAgICAgIHJlc3VsdCA9IHBhaXJbMV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIGNhc2UgJ2tleSt2YWx1ZSc6IHtcbiAgICAgIC8vIDEuIExldCBpZGxLZXkgYmUgcGFpcuKAmXMga2V5LlxuICAgICAgLy8gMi4gTGV0IGlkbFZhbHVlIGJlIHBhaXLigJlzIHZhbHVlLlxuICAgICAgLy8gMy4gTGV0IGtleSBiZSB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgaWRsS2V5IHRvIGFuXG4gICAgICAvLyAgICBFQ01BU2NyaXB0IHZhbHVlLlxuICAgICAgLy8gNC4gTGV0IHZhbHVlIGJlIHRoZSByZXN1bHQgb2YgY29udmVydGluZyBpZGxWYWx1ZSB0b1xuICAgICAgLy8gICAgYW4gRUNNQVNjcmlwdCB2YWx1ZS5cbiAgICAgIC8vIDUuIExldCBhcnJheSBiZSAhIEFycmF5Q3JlYXRlKDIpLlxuICAgICAgLy8gNi4gQ2FsbCAhIENyZWF0ZURhdGFQcm9wZXJ0eShhcnJheSwgXCIwXCIsIGtleSkuXG4gICAgICAvLyA3LiBDYWxsICEgQ3JlYXRlRGF0YVByb3BlcnR5KGFycmF5LCBcIjFcIiwgdmFsdWUpLlxuICAgICAgLy8gOC4gcmVzdWx0IGlzIGFycmF5LlxuICAgICAgcmVzdWx0ID0gcGFpclxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICAvLyAyLiBSZXR1cm4gQ3JlYXRlSXRlclJlc3VsdE9iamVjdChyZXN1bHQsIGZhbHNlKS5cbiAgcmV0dXJuIHsgdmFsdWU6IHJlc3VsdCwgZG9uZTogZmFsc2UgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2JvZHktZnVsbHktcmVhZFxuICovXG5hc3luYyBmdW5jdGlvbiBmdWxseVJlYWRCb2R5IChib2R5LCBwcm9jZXNzQm9keSwgcHJvY2Vzc0JvZHlFcnJvcikge1xuICAvLyAxLiBJZiB0YXNrRGVzdGluYXRpb24gaXMgbnVsbCwgdGhlbiBzZXQgdGFza0Rlc3RpbmF0aW9uIHRvXG4gIC8vICAgIHRoZSByZXN1bHQgb2Ygc3RhcnRpbmcgYSBuZXcgcGFyYWxsZWwgcXVldWUuXG5cbiAgLy8gMi4gTGV0IHN1Y2Nlc3NTdGVwcyBnaXZlbiBhIGJ5dGUgc2VxdWVuY2UgYnl0ZXMgYmUgdG8gcXVldWUgYVxuICAvLyAgICBmZXRjaCB0YXNrIHRvIHJ1biBwcm9jZXNzQm9keSBnaXZlbiBieXRlcywgd2l0aCB0YXNrRGVzdGluYXRpb24uXG4gIGNvbnN0IHN1Y2Nlc3NTdGVwcyA9IHByb2Nlc3NCb2R5XG5cbiAgLy8gMy4gTGV0IGVycm9yU3RlcHMgYmUgdG8gcXVldWUgYSBmZXRjaCB0YXNrIHRvIHJ1biBwcm9jZXNzQm9keUVycm9yLFxuICAvLyAgICB3aXRoIHRhc2tEZXN0aW5hdGlvbi5cbiAgY29uc3QgZXJyb3JTdGVwcyA9IHByb2Nlc3NCb2R5RXJyb3JcblxuICAvLyA0LiBMZXQgcmVhZGVyIGJlIHRoZSByZXN1bHQgb2YgZ2V0dGluZyBhIHJlYWRlciBmb3IgYm9keeKAmXMgc3RyZWFtLlxuICAvLyAgICBJZiB0aGF0IHRocmV3IGFuIGV4Y2VwdGlvbiwgdGhlbiBydW4gZXJyb3JTdGVwcyB3aXRoIHRoYXRcbiAgLy8gICAgZXhjZXB0aW9uIGFuZCByZXR1cm4uXG4gIGxldCByZWFkZXJcblxuICB0cnkge1xuICAgIHJlYWRlciA9IGJvZHkuc3RyZWFtLmdldFJlYWRlcigpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBlcnJvclN0ZXBzKGUpXG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyA1LiBSZWFkIGFsbCBieXRlcyBmcm9tIHJlYWRlciwgZ2l2ZW4gc3VjY2Vzc1N0ZXBzIGFuZCBlcnJvclN0ZXBzLlxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRBbGxCeXRlcyhyZWFkZXIpXG4gICAgc3VjY2Vzc1N0ZXBzKHJlc3VsdClcbiAgfSBjYXRjaCAoZSkge1xuICAgIGVycm9yU3RlcHMoZSlcbiAgfVxufVxuXG4vKiogQHR5cGUge1JlYWRhYmxlU3RyZWFtfSAqL1xubGV0IFJlYWRhYmxlU3RyZWFtID0gZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbVxuXG5mdW5jdGlvbiBpc1JlYWRhYmxlU3RyZWFtTGlrZSAoc3RyZWFtKSB7XG4gIGlmICghUmVhZGFibGVTdHJlYW0pIHtcbiAgICBSZWFkYWJsZVN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbS93ZWInKS5SZWFkYWJsZVN0cmVhbVxuICB9XG5cbiAgcmV0dXJuIHN0cmVhbSBpbnN0YW5jZW9mIFJlYWRhYmxlU3RyZWFtIHx8IChcbiAgICBzdHJlYW1bU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gJ1JlYWRhYmxlU3RyZWFtJyAmJlxuICAgIHR5cGVvZiBzdHJlYW0udGVlID09PSAnZnVuY3Rpb24nXG4gIClcbn1cblxuY29uc3QgTUFYSU1VTV9BUkdVTUVOVF9MRU5HVEggPSA2NTUzNVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI2lzb21vcnBoaWMtZGVjb2RlXG4gKiBAcGFyYW0ge251bWJlcltdfFVpbnQ4QXJyYXl9IGlucHV0XG4gKi9cbmZ1bmN0aW9uIGlzb21vcnBoaWNEZWNvZGUgKGlucHV0KSB7XG4gIC8vIDEuIFRvIGlzb21vcnBoaWMgZGVjb2RlIGEgYnl0ZSBzZXF1ZW5jZSBpbnB1dCwgcmV0dXJuIGEgc3RyaW5nIHdob3NlIGNvZGUgcG9pbnRcbiAgLy8gICAgbGVuZ3RoIGlzIGVxdWFsIHRvIGlucHV04oCZcyBsZW5ndGggYW5kIHdob3NlIGNvZGUgcG9pbnRzIGhhdmUgdGhlIHNhbWUgdmFsdWVzXG4gIC8vICAgIGFzIHRoZSB2YWx1ZXMgb2YgaW5wdXTigJlzIGJ5dGVzLCBpbiB0aGUgc2FtZSBvcmRlci5cblxuICBpZiAoaW5wdXQubGVuZ3RoIDwgTUFYSU1VTV9BUkdVTUVOVF9MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5pbnB1dClcbiAgfVxuXG4gIHJldHVybiBpbnB1dC5yZWR1Y2UoKHByZXZpb3VzLCBjdXJyZW50KSA9PiBwcmV2aW91cyArIFN0cmluZy5mcm9tQ2hhckNvZGUoY3VycmVudCksICcnKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVhZGFibGVTdHJlYW1Db250cm9sbGVyPFVpbnQ4QXJyYXk+fSBjb250cm9sbGVyXG4gKi9cbmZ1bmN0aW9uIHJlYWRhYmxlU3RyZWFtQ2xvc2UgKGNvbnRyb2xsZXIpIHtcbiAgdHJ5IHtcbiAgICBjb250cm9sbGVyLmNsb3NlKClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gVE9ETzogYWRkIGNvbW1lbnQgZXhwbGFpbmluZyB3aHkgdGhpcyBlcnJvciBvY2N1cnMuXG4gICAgaWYgKCFlcnIubWVzc2FnZS5pbmNsdWRlcygnQ29udHJvbGxlciBpcyBhbHJlYWR5IGNsb3NlZCcpKSB7XG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNpc29tb3JwaGljLWVuY29kZVxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0XG4gKi9cbmZ1bmN0aW9uIGlzb21vcnBoaWNFbmNvZGUgKGlucHV0KSB7XG4gIC8vIDEuIEFzc2VydDogaW5wdXQgY29udGFpbnMgbm8gY29kZSBwb2ludHMgZ3JlYXRlciB0aGFuIFUrMDBGRi5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgIGFzc2VydChpbnB1dC5jaGFyQ29kZUF0KGkpIDw9IDB4RkYpXG4gIH1cblxuICAvLyAyLiBSZXR1cm4gYSBieXRlIHNlcXVlbmNlIHdob3NlIGxlbmd0aCBpcyBlcXVhbCB0byBpbnB1dOKAmXMgY29kZVxuICAvLyAgICBwb2ludCBsZW5ndGggYW5kIHdob3NlIGJ5dGVzIGhhdmUgdGhlIHNhbWUgdmFsdWVzIGFzIHRoZVxuICAvLyAgICB2YWx1ZXMgb2YgaW5wdXTigJlzIGNvZGUgcG9pbnRzLCBpbiB0aGUgc2FtZSBvcmRlclxuICByZXR1cm4gaW5wdXRcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vc3RyZWFtcy5zcGVjLndoYXR3Zy5vcmcvI3JlYWRhYmxlc3RyZWFtZGVmYXVsdHJlYWRlci1yZWFkLWFsbC1ieXRlc1xuICogQHNlZSBodHRwczovL3N0cmVhbXMuc3BlYy53aGF0d2cub3JnLyNyZWFkLWxvb3BcbiAqIEBwYXJhbSB7UmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyfSByZWFkZXJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZEFsbEJ5dGVzIChyZWFkZXIpIHtcbiAgY29uc3QgYnl0ZXMgPSBbXVxuICBsZXQgYnl0ZUxlbmd0aCA9IDBcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IHsgZG9uZSwgdmFsdWU6IGNodW5rIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpXG5cbiAgICBpZiAoZG9uZSkge1xuICAgICAgLy8gMS4gQ2FsbCBzdWNjZXNzU3RlcHMgd2l0aCBieXRlcy5cbiAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGJ5dGVzLCBieXRlTGVuZ3RoKVxuICAgIH1cblxuICAgIC8vIDEuIElmIGNodW5rIGlzIG5vdCBhIFVpbnQ4QXJyYXkgb2JqZWN0LCBjYWxsIGZhaWx1cmVTdGVwc1xuICAgIC8vICAgIHdpdGggYSBUeXBlRXJyb3IgYW5kIGFib3J0IHRoZXNlIHN0ZXBzLlxuICAgIGlmICghaXNVaW50OEFycmF5KGNodW5rKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVjZWl2ZWQgbm9uLVVpbnQ4QXJyYXkgY2h1bmsnKVxuICAgIH1cblxuICAgIC8vIDIuIEFwcGVuZCB0aGUgYnl0ZXMgcmVwcmVzZW50ZWQgYnkgY2h1bmsgdG8gYnl0ZXMuXG4gICAgYnl0ZXMucHVzaChjaHVuaylcbiAgICBieXRlTGVuZ3RoICs9IGNodW5rLmxlbmd0aFxuXG4gICAgLy8gMy4gUmVhZC1sb29wIGdpdmVuIHJlYWRlciwgYnl0ZXMsIHN1Y2Nlc3NTdGVwcywgYW5kIGZhaWx1cmVTdGVwcy5cbiAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2lzLWxvY2FsXG4gKiBAcGFyYW0ge1VSTH0gdXJsXG4gKi9cbmZ1bmN0aW9uIHVybElzTG9jYWwgKHVybCkge1xuICBhc3NlcnQoJ3Byb3RvY29sJyBpbiB1cmwpIC8vIGVuc3VyZSBpdCdzIGEgdXJsIG9iamVjdFxuXG4gIGNvbnN0IHByb3RvY29sID0gdXJsLnByb3RvY29sXG5cbiAgcmV0dXJuIHByb3RvY29sID09PSAnYWJvdXQ6JyB8fCBwcm90b2NvbCA9PT0gJ2Jsb2I6JyB8fCBwcm90b2NvbCA9PT0gJ2RhdGE6J1xufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfFVSTH0gdXJsXG4gKi9cbmZ1bmN0aW9uIHVybEhhc0h0dHBzU2NoZW1lICh1cmwpIHtcbiAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHVybC5zdGFydHNXaXRoKCdodHRwczonKVxuICB9XG5cbiAgcmV0dXJuIHVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOidcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNodHRwLXNjaGVtZVxuICogQHBhcmFtIHtVUkx9IHVybFxuICovXG5mdW5jdGlvbiB1cmxJc0h0dHBIdHRwc1NjaGVtZSAodXJsKSB7XG4gIGFzc2VydCgncHJvdG9jb2wnIGluIHVybCkgLy8gZW5zdXJlIGl0J3MgYSB1cmwgb2JqZWN0XG5cbiAgY29uc3QgcHJvdG9jb2wgPSB1cmwucHJvdG9jb2xcblxuICByZXR1cm4gcHJvdG9jb2wgPT09ICdodHRwOicgfHwgcHJvdG9jb2wgPT09ICdodHRwczonXG59XG5cbi8qKlxuICogRmV0Y2ggc3VwcG9ydHMgbm9kZSA+PSAxNi44LjAsIGJ1dCBPYmplY3QuaGFzT3duIHdhcyBhZGRlZCBpbiB2MTYuOS4wLlxuICovXG5jb25zdCBoYXNPd24gPSBPYmplY3QuaGFzT3duIHx8ICgoZGljdCwga2V5KSA9PiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGljdCwga2V5KSlcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzQWJvcnRlZCxcbiAgaXNDYW5jZWxsZWQsXG4gIGNyZWF0ZURlZmVycmVkUHJvbWlzZSxcbiAgUmVhZGFibGVTdHJlYW1Gcm9tLFxuICB0b1VTVlN0cmluZyxcbiAgdHJ5VXBncmFkZVJlcXVlc3RUb0FQb3RlbnRpYWxseVRydXN0d29ydGh5VVJMLFxuICBjb2Fyc2VuZWRTaGFyZWRDdXJyZW50VGltZSxcbiAgZGV0ZXJtaW5lUmVxdWVzdHNSZWZlcnJlcixcbiAgbWFrZVBvbGljeUNvbnRhaW5lcixcbiAgY2xvbmVQb2xpY3lDb250YWluZXIsXG4gIGFwcGVuZEZldGNoTWV0YWRhdGEsXG4gIGFwcGVuZFJlcXVlc3RPcmlnaW5IZWFkZXIsXG4gIFRBT0NoZWNrLFxuICBjb3JzQ2hlY2ssXG4gIGNyb3NzT3JpZ2luUmVzb3VyY2VQb2xpY3lDaGVjayxcbiAgY3JlYXRlT3BhcXVlVGltaW5nSW5mbyxcbiAgc2V0UmVxdWVzdFJlZmVycmVyUG9saWN5T25SZWRpcmVjdCxcbiAgaXNWYWxpZEhUVFBUb2tlbixcbiAgcmVxdWVzdEJhZFBvcnQsXG4gIHJlcXVlc3RDdXJyZW50VVJMLFxuICByZXNwb25zZVVSTCxcbiAgcmVzcG9uc2VMb2NhdGlvblVSTCxcbiAgaXNCbG9iTGlrZSxcbiAgaXNVUkxQb3RlbnRpYWxseVRydXN0d29ydGh5LFxuICBpc1ZhbGlkUmVhc29uUGhyYXNlLFxuICBzYW1lT3JpZ2luLFxuICBub3JtYWxpemVNZXRob2QsXG4gIHNlcmlhbGl6ZUphdmFzY3JpcHRWYWx1ZVRvSlNPTlN0cmluZyxcbiAgbWFrZUl0ZXJhdG9yLFxuICBpc1ZhbGlkSGVhZGVyTmFtZSxcbiAgaXNWYWxpZEhlYWRlclZhbHVlLFxuICBoYXNPd24sXG4gIGlzRXJyb3JMaWtlLFxuICBmdWxseVJlYWRCb2R5LFxuICBieXRlc01hdGNoLFxuICBpc1JlYWRhYmxlU3RyZWFtTGlrZSxcbiAgcmVhZGFibGVTdHJlYW1DbG9zZSxcbiAgaXNvbW9ycGhpY0VuY29kZSxcbiAgaXNvbW9ycGhpY0RlY29kZSxcbiAgdXJsSXNMb2NhbCxcbiAgdXJsSGFzSHR0cHNTY2hlbWUsXG4gIHVybElzSHR0cEh0dHBzU2NoZW1lLFxuICByZWFkQWxsQnl0ZXMsXG4gIG5vcm1hbGl6ZU1ldGhvZFJlY29yZCxcbiAgcGFyc2VNZXRhZGF0YVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBrVXJsOiBTeW1ib2woJ3VybCcpLFxuICBrSGVhZGVyczogU3ltYm9sKCdoZWFkZXJzJyksXG4gIGtTaWduYWw6IFN5bWJvbCgnc2lnbmFsJyksXG4gIGtTdGF0ZTogU3ltYm9sKCdzdGF0ZScpLFxuICBrR3VhcmQ6IFN5bWJvbCgnZ3VhcmQnKSxcbiAga1JlYWxtOiBTeW1ib2woJ3JlYWxtJylcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IHR5cGVzIH0gPSByZXF1aXJlKCd1dGlsJylcbmNvbnN0IHsgaGFzT3duLCB0b1VTVlN0cmluZyB9ID0gcmVxdWlyZSgnLi91dGlsJylcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4uLy4uL3R5cGVzL3dlYmlkbCcpLldlYmlkbH0gKi9cbmNvbnN0IHdlYmlkbCA9IHt9XG53ZWJpZGwuY29udmVydGVycyA9IHt9XG53ZWJpZGwudXRpbCA9IHt9XG53ZWJpZGwuZXJyb3JzID0ge31cblxud2ViaWRsLmVycm9ycy5leGNlcHRpb24gPSBmdW5jdGlvbiAobWVzc2FnZSkge1xuICByZXR1cm4gbmV3IFR5cGVFcnJvcihgJHttZXNzYWdlLmhlYWRlcn06ICR7bWVzc2FnZS5tZXNzYWdlfWApXG59XG5cbndlYmlkbC5lcnJvcnMuY29udmVyc2lvbkZhaWxlZCA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gIGNvbnN0IHBsdXJhbCA9IGNvbnRleHQudHlwZXMubGVuZ3RoID09PSAxID8gJycgOiAnIG9uZSBvZidcbiAgY29uc3QgbWVzc2FnZSA9XG4gICAgYCR7Y29udGV4dC5hcmd1bWVudH0gY291bGQgbm90IGJlIGNvbnZlcnRlZCB0b2AgK1xuICAgIGAke3BsdXJhbH06ICR7Y29udGV4dC50eXBlcy5qb2luKCcsICcpfS5gXG5cbiAgcmV0dXJuIHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICBoZWFkZXI6IGNvbnRleHQucHJlZml4LFxuICAgIG1lc3NhZ2VcbiAgfSlcbn1cblxud2ViaWRsLmVycm9ycy5pbnZhbGlkQXJndW1lbnQgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICByZXR1cm4gd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgIGhlYWRlcjogY29udGV4dC5wcmVmaXgsXG4gICAgbWVzc2FnZTogYFwiJHtjb250ZXh0LnZhbHVlfVwiIGlzIGFuIGludmFsaWQgJHtjb250ZXh0LnR5cGV9LmBcbiAgfSlcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNpbXBsZW1lbnRzXG53ZWJpZGwuYnJhbmRDaGVjayA9IGZ1bmN0aW9uIChWLCBJLCBvcHRzID0gdW5kZWZpbmVkKSB7XG4gIGlmIChvcHRzPy5zdHJpY3QgIT09IGZhbHNlICYmICEoViBpbnN0YW5jZW9mIEkpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSWxsZWdhbCBpbnZvY2F0aW9uJylcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gVj8uW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09IEkucHJvdG90eXBlW1N5bWJvbC50b1N0cmluZ1RhZ11cbiAgfVxufVxuXG53ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayA9IGZ1bmN0aW9uICh7IGxlbmd0aCB9LCBtaW4sIGN0eCkge1xuICBpZiAobGVuZ3RoIDwgbWluKSB7XG4gICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgbWVzc2FnZTogYCR7bWlufSBhcmd1bWVudCR7bWluICE9PSAxID8gJ3MnIDogJyd9IHJlcXVpcmVkLCBgICtcbiAgICAgICAgICAgICAgIGBidXQke2xlbmd0aCA/ICcgb25seScgOiAnJ30gJHtsZW5ndGh9IGZvdW5kLmAsXG4gICAgICAuLi5jdHhcbiAgICB9KVxuICB9XG59XG5cbndlYmlkbC5pbGxlZ2FsQ29uc3RydWN0b3IgPSBmdW5jdGlvbiAoKSB7XG4gIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICBoZWFkZXI6ICdUeXBlRXJyb3InLFxuICAgIG1lc3NhZ2U6ICdJbGxlZ2FsIGNvbnN0cnVjdG9yJ1xuICB9KVxufVxuXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtZGF0YS10eXBlcy1hbmQtdmFsdWVzXG53ZWJpZGwudXRpbC5UeXBlID0gZnVuY3Rpb24gKFYpIHtcbiAgc3dpdGNoICh0eXBlb2YgVikge1xuICAgIGNhc2UgJ3VuZGVmaW5lZCc6IHJldHVybiAnVW5kZWZpbmVkJ1xuICAgIGNhc2UgJ2Jvb2xlYW4nOiByZXR1cm4gJ0Jvb2xlYW4nXG4gICAgY2FzZSAnc3RyaW5nJzogcmV0dXJuICdTdHJpbmcnXG4gICAgY2FzZSAnc3ltYm9sJzogcmV0dXJuICdTeW1ib2wnXG4gICAgY2FzZSAnbnVtYmVyJzogcmV0dXJuICdOdW1iZXInXG4gICAgY2FzZSAnYmlnaW50JzogcmV0dXJuICdCaWdJbnQnXG4gICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgIGNhc2UgJ29iamVjdCc6IHtcbiAgICAgIGlmIChWID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnTnVsbCdcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdPYmplY3QnXG4gICAgfVxuICB9XG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jYWJzdHJhY3Qtb3BkZWYtY29udmVydHRvaW50XG53ZWJpZGwudXRpbC5Db252ZXJ0VG9JbnQgPSBmdW5jdGlvbiAoViwgYml0TGVuZ3RoLCBzaWduZWRuZXNzLCBvcHRzID0ge30pIHtcbiAgbGV0IHVwcGVyQm91bmRcbiAgbGV0IGxvd2VyQm91bmRcblxuICAvLyAxLiBJZiBiaXRMZW5ndGggaXMgNjQsIHRoZW46XG4gIGlmIChiaXRMZW5ndGggPT09IDY0KSB7XG4gICAgLy8gMS4gTGV0IHVwcGVyQm91bmQgYmUgMl41MyDiiJIgMS5cbiAgICB1cHBlckJvdW5kID0gTWF0aC5wb3coMiwgNTMpIC0gMVxuXG4gICAgLy8gMi4gSWYgc2lnbmVkbmVzcyBpcyBcInVuc2lnbmVkXCIsIHRoZW4gbGV0IGxvd2VyQm91bmQgYmUgMC5cbiAgICBpZiAoc2lnbmVkbmVzcyA9PT0gJ3Vuc2lnbmVkJykge1xuICAgICAgbG93ZXJCb3VuZCA9IDBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gMy4gT3RoZXJ3aXNlIGxldCBsb3dlckJvdW5kIGJlIOKIkjJeNTMgKyAxLlxuICAgICAgbG93ZXJCb3VuZCA9IE1hdGgucG93KC0yLCA1MykgKyAxXG4gICAgfVxuICB9IGVsc2UgaWYgKHNpZ25lZG5lc3MgPT09ICd1bnNpZ25lZCcpIHtcbiAgICAvLyAyLiBPdGhlcndpc2UsIGlmIHNpZ25lZG5lc3MgaXMgXCJ1bnNpZ25lZFwiLCB0aGVuOlxuXG4gICAgLy8gMS4gTGV0IGxvd2VyQm91bmQgYmUgMC5cbiAgICBsb3dlckJvdW5kID0gMFxuXG4gICAgLy8gMi4gTGV0IHVwcGVyQm91bmQgYmUgMl5iaXRMZW5ndGgg4oiSIDEuXG4gICAgdXBwZXJCb3VuZCA9IE1hdGgucG93KDIsIGJpdExlbmd0aCkgLSAxXG4gIH0gZWxzZSB7XG4gICAgLy8gMy4gT3RoZXJ3aXNlOlxuXG4gICAgLy8gMS4gTGV0IGxvd2VyQm91bmQgYmUgLTJeYml0TGVuZ3RoIOKIkiAxLlxuICAgIGxvd2VyQm91bmQgPSBNYXRoLnBvdygtMiwgYml0TGVuZ3RoKSAtIDFcblxuICAgIC8vIDIuIExldCB1cHBlckJvdW5kIGJlIDJeYml0TGVuZ3RoIOKIkiAxIOKIkiAxLlxuICAgIHVwcGVyQm91bmQgPSBNYXRoLnBvdygyLCBiaXRMZW5ndGggLSAxKSAtIDFcbiAgfVxuXG4gIC8vIDQuIExldCB4IGJlID8gVG9OdW1iZXIoVikuXG4gIGxldCB4ID0gTnVtYmVyKFYpXG5cbiAgLy8gNS4gSWYgeCBpcyDiiJIwLCB0aGVuIHNldCB4IHRvICswLlxuICBpZiAoeCA9PT0gMCkge1xuICAgIHggPSAwXG4gIH1cblxuICAvLyA2LiBJZiB0aGUgY29udmVyc2lvbiBpcyB0byBhbiBJREwgdHlwZSBhc3NvY2lhdGVkXG4gIC8vICAgIHdpdGggdGhlIFtFbmZvcmNlUmFuZ2VdIGV4dGVuZGVkIGF0dHJpYnV0ZSwgdGhlbjpcbiAgaWYgKG9wdHMuZW5mb3JjZVJhbmdlID09PSB0cnVlKSB7XG4gICAgLy8gMS4gSWYgeCBpcyBOYU4sICviiJ4sIG9yIOKIkuKIniwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAoXG4gICAgICBOdW1iZXIuaXNOYU4oeCkgfHxcbiAgICAgIHggPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSB8fFxuICAgICAgeCA9PT0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZXG4gICAgKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgIGhlYWRlcjogJ0ludGVnZXIgY29udmVyc2lvbicsXG4gICAgICAgIG1lc3NhZ2U6IGBDb3VsZCBub3QgY29udmVydCAke1Z9IHRvIGFuIGludGVnZXIuYFxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyAyLiBTZXQgeCB0byBJbnRlZ2VyUGFydCh4KS5cbiAgICB4ID0gd2ViaWRsLnV0aWwuSW50ZWdlclBhcnQoeClcblxuICAgIC8vIDMuIElmIHggPCBsb3dlckJvdW5kIG9yIHggPiB1cHBlckJvdW5kLCB0aGVuXG4gICAgLy8gICAgdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKHggPCBsb3dlckJvdW5kIHx8IHggPiB1cHBlckJvdW5kKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgIGhlYWRlcjogJ0ludGVnZXIgY29udmVyc2lvbicsXG4gICAgICAgIG1lc3NhZ2U6IGBWYWx1ZSBtdXN0IGJlIGJldHdlZW4gJHtsb3dlckJvdW5kfS0ke3VwcGVyQm91bmR9LCBnb3QgJHt4fS5gXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDQuIFJldHVybiB4LlxuICAgIHJldHVybiB4XG4gIH1cblxuICAvLyA3LiBJZiB4IGlzIG5vdCBOYU4gYW5kIHRoZSBjb252ZXJzaW9uIGlzIHRvIGFuIElETFxuICAvLyAgICB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGUgW0NsYW1wXSBleHRlbmRlZFxuICAvLyAgICBhdHRyaWJ1dGUsIHRoZW46XG4gIGlmICghTnVtYmVyLmlzTmFOKHgpICYmIG9wdHMuY2xhbXAgPT09IHRydWUpIHtcbiAgICAvLyAxLiBTZXQgeCB0byBtaW4obWF4KHgsIGxvd2VyQm91bmQpLCB1cHBlckJvdW5kKS5cbiAgICB4ID0gTWF0aC5taW4oTWF0aC5tYXgoeCwgbG93ZXJCb3VuZCksIHVwcGVyQm91bmQpXG5cbiAgICAvLyAyLiBSb3VuZCB4IHRvIHRoZSBuZWFyZXN0IGludGVnZXIsIGNob29zaW5nIHRoZVxuICAgIC8vICAgIGV2ZW4gaW50ZWdlciBpZiBpdCBsaWVzIGhhbGZ3YXkgYmV0d2VlbiB0d28sXG4gICAgLy8gICAgYW5kIGNob29zaW5nICswIHJhdGhlciB0aGFuIOKIkjAuXG4gICAgaWYgKE1hdGguZmxvb3IoeCkgJSAyID09PSAwKSB7XG4gICAgICB4ID0gTWF0aC5mbG9vcih4KVxuICAgIH0gZWxzZSB7XG4gICAgICB4ID0gTWF0aC5jZWlsKHgpXG4gICAgfVxuXG4gICAgLy8gMy4gUmV0dXJuIHguXG4gICAgcmV0dXJuIHhcbiAgfVxuXG4gIC8vIDguIElmIHggaXMgTmFOLCArMCwgK+KIniwgb3Ig4oiS4oieLCB0aGVuIHJldHVybiArMC5cbiAgaWYgKFxuICAgIE51bWJlci5pc05hTih4KSB8fFxuICAgICh4ID09PSAwICYmIE9iamVjdC5pcygwLCB4KSkgfHxcbiAgICB4ID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgfHxcbiAgICB4ID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFlcbiAgKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuXG4gIC8vIDkuIFNldCB4IHRvIEludGVnZXJQYXJ0KHgpLlxuICB4ID0gd2ViaWRsLnV0aWwuSW50ZWdlclBhcnQoeClcblxuICAvLyAxMC4gU2V0IHggdG8geCBtb2R1bG8gMl5iaXRMZW5ndGguXG4gIHggPSB4ICUgTWF0aC5wb3coMiwgYml0TGVuZ3RoKVxuXG4gIC8vIDExLiBJZiBzaWduZWRuZXNzIGlzIFwic2lnbmVkXCIgYW5kIHgg4omlIDJeYml0TGVuZ3RoIOKIkiAxLFxuICAvLyAgICB0aGVuIHJldHVybiB4IOKIkiAyXmJpdExlbmd0aC5cbiAgaWYgKHNpZ25lZG5lc3MgPT09ICdzaWduZWQnICYmIHggPj0gTWF0aC5wb3coMiwgYml0TGVuZ3RoKSAtIDEpIHtcbiAgICByZXR1cm4geCAtIE1hdGgucG93KDIsIGJpdExlbmd0aClcbiAgfVxuXG4gIC8vIDEyLiBPdGhlcndpc2UsIHJldHVybiB4LlxuICByZXR1cm4geFxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2Fic3RyYWN0LW9wZGVmLWludGVnZXJwYXJ0XG53ZWJpZGwudXRpbC5JbnRlZ2VyUGFydCA9IGZ1bmN0aW9uIChuKSB7XG4gIC8vIDEuIExldCByIGJlIGZsb29yKGFicyhuKSkuXG4gIGNvbnN0IHIgPSBNYXRoLmZsb29yKE1hdGguYWJzKG4pKVxuXG4gIC8vIDIuIElmIG4gPCAwLCB0aGVuIHJldHVybiAtMSDDlyByLlxuICBpZiAobiA8IDApIHtcbiAgICByZXR1cm4gLTEgKiByXG4gIH1cblxuICAvLyAzLiBPdGhlcndpc2UsIHJldHVybiByLlxuICByZXR1cm4gclxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2VzLXNlcXVlbmNlXG53ZWJpZGwuc2VxdWVuY2VDb252ZXJ0ZXIgPSBmdW5jdGlvbiAoY29udmVydGVyKSB7XG4gIHJldHVybiAoVikgPT4ge1xuICAgIC8vIDEuIElmIFR5cGUoVikgaXMgbm90IE9iamVjdCwgdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKHdlYmlkbC51dGlsLlR5cGUoVikgIT09ICdPYmplY3QnKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgIGhlYWRlcjogJ1NlcXVlbmNlJyxcbiAgICAgICAgbWVzc2FnZTogYFZhbHVlIG9mIHR5cGUgJHt3ZWJpZGwudXRpbC5UeXBlKFYpfSBpcyBub3QgYW4gT2JqZWN0LmBcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gMi4gTGV0IG1ldGhvZCBiZSA/IEdldE1ldGhvZChWLCBAQGl0ZXJhdG9yKS5cbiAgICAvKiogQHR5cGUge0dlbmVyYXRvcn0gKi9cbiAgICBjb25zdCBtZXRob2QgPSBWPy5bU3ltYm9sLml0ZXJhdG9yXT8uKClcbiAgICBjb25zdCBzZXEgPSBbXVxuXG4gICAgLy8gMy4gSWYgbWV0aG9kIGlzIHVuZGVmaW5lZCwgdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKFxuICAgICAgbWV0aG9kID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHR5cGVvZiBtZXRob2QubmV4dCAhPT0gJ2Z1bmN0aW9uJ1xuICAgICkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6ICdTZXF1ZW5jZScsXG4gICAgICAgIG1lc3NhZ2U6ICdPYmplY3QgaXMgbm90IGFuIGl0ZXJhdG9yLidcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNjcmVhdGUtc2VxdWVuY2UtZnJvbS1pdGVyYWJsZVxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBtZXRob2QubmV4dCgpXG5cbiAgICAgIGlmIChkb25lKSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIHNlcS5wdXNoKGNvbnZlcnRlcih2YWx1ZSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHNlcVxuICB9XG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jZXMtdG8tcmVjb3JkXG53ZWJpZGwucmVjb3JkQ29udmVydGVyID0gZnVuY3Rpb24gKGtleUNvbnZlcnRlciwgdmFsdWVDb252ZXJ0ZXIpIHtcbiAgcmV0dXJuIChPKSA9PiB7XG4gICAgLy8gMS4gSWYgVHlwZShPKSBpcyBub3QgT2JqZWN0LCB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAod2ViaWRsLnV0aWwuVHlwZShPKSAhPT0gJ09iamVjdCcpIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgaGVhZGVyOiAnUmVjb3JkJyxcbiAgICAgICAgbWVzc2FnZTogYFZhbHVlIG9mIHR5cGUgJHt3ZWJpZGwudXRpbC5UeXBlKE8pfSBpcyBub3QgYW4gT2JqZWN0LmBcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gMi4gTGV0IHJlc3VsdCBiZSBhIG5ldyBlbXB0eSBpbnN0YW5jZSBvZiByZWNvcmQ8SywgVj4uXG4gICAgY29uc3QgcmVzdWx0ID0ge31cblxuICAgIGlmICghdHlwZXMuaXNQcm94eShPKSkge1xuICAgICAgLy8gT2JqZWN0LmtleXMgb25seSByZXR1cm5zIGVudW1lcmFibGUgcHJvcGVydGllc1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKE8pXG5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgLy8gMS4gTGV0IHR5cGVkS2V5IGJlIGtleSBjb252ZXJ0ZWQgdG8gYW4gSURMIHZhbHVlIG9mIHR5cGUgSy5cbiAgICAgICAgY29uc3QgdHlwZWRLZXkgPSBrZXlDb252ZXJ0ZXIoa2V5KVxuXG4gICAgICAgIC8vIDIuIExldCB2YWx1ZSBiZSA/IEdldChPLCBrZXkpLlxuICAgICAgICAvLyAzLiBMZXQgdHlwZWRWYWx1ZSBiZSB2YWx1ZSBjb252ZXJ0ZWQgdG8gYW4gSURMIHZhbHVlIG9mIHR5cGUgVi5cbiAgICAgICAgY29uc3QgdHlwZWRWYWx1ZSA9IHZhbHVlQ29udmVydGVyKE9ba2V5XSlcblxuICAgICAgICAvLyA0LiBTZXQgcmVzdWx0W3R5cGVkS2V5XSB0byB0eXBlZFZhbHVlLlxuICAgICAgICByZXN1bHRbdHlwZWRLZXldID0gdHlwZWRWYWx1ZVxuICAgICAgfVxuXG4gICAgICAvLyA1LiBSZXR1cm4gcmVzdWx0LlxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIC8vIDMuIExldCBrZXlzIGJlID8gTy5bW093blByb3BlcnR5S2V5c11dKCkuXG4gICAgY29uc3Qga2V5cyA9IFJlZmxlY3Qub3duS2V5cyhPKVxuXG4gICAgLy8gNC4gRm9yIGVhY2gga2V5IG9mIGtleXMuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgLy8gMS4gTGV0IGRlc2MgYmUgPyBPLltbR2V0T3duUHJvcGVydHldXShrZXkpLlxuICAgICAgY29uc3QgZGVzYyA9IFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIGtleSlcblxuICAgICAgLy8gMi4gSWYgZGVzYyBpcyBub3QgdW5kZWZpbmVkIGFuZCBkZXNjLltbRW51bWVyYWJsZV1dIGlzIHRydWU6XG4gICAgICBpZiAoZGVzYz8uZW51bWVyYWJsZSkge1xuICAgICAgICAvLyAxLiBMZXQgdHlwZWRLZXkgYmUga2V5IGNvbnZlcnRlZCB0byBhbiBJREwgdmFsdWUgb2YgdHlwZSBLLlxuICAgICAgICBjb25zdCB0eXBlZEtleSA9IGtleUNvbnZlcnRlcihrZXkpXG5cbiAgICAgICAgLy8gMi4gTGV0IHZhbHVlIGJlID8gR2V0KE8sIGtleSkuXG4gICAgICAgIC8vIDMuIExldCB0eXBlZFZhbHVlIGJlIHZhbHVlIGNvbnZlcnRlZCB0byBhbiBJREwgdmFsdWUgb2YgdHlwZSBWLlxuICAgICAgICBjb25zdCB0eXBlZFZhbHVlID0gdmFsdWVDb252ZXJ0ZXIoT1trZXldKVxuXG4gICAgICAgIC8vIDQuIFNldCByZXN1bHRbdHlwZWRLZXldIHRvIHR5cGVkVmFsdWUuXG4gICAgICAgIHJlc3VsdFt0eXBlZEtleV0gPSB0eXBlZFZhbHVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNS4gUmV0dXJuIHJlc3VsdC5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbn1cblxud2ViaWRsLmludGVyZmFjZUNvbnZlcnRlciA9IGZ1bmN0aW9uIChpKSB7XG4gIHJldHVybiAoViwgb3B0cyA9IHt9KSA9PiB7XG4gICAgaWYgKG9wdHMuc3RyaWN0ICE9PSBmYWxzZSAmJiAhKFYgaW5zdGFuY2VvZiBpKSkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6IGkubmFtZSxcbiAgICAgICAgbWVzc2FnZTogYEV4cGVjdGVkICR7Vn0gdG8gYmUgYW4gaW5zdGFuY2Ugb2YgJHtpLm5hbWV9LmBcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIFZcbiAgfVxufVxuXG53ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlciA9IGZ1bmN0aW9uIChjb252ZXJ0ZXJzKSB7XG4gIHJldHVybiAoZGljdGlvbmFyeSkgPT4ge1xuICAgIGNvbnN0IHR5cGUgPSB3ZWJpZGwudXRpbC5UeXBlKGRpY3Rpb25hcnkpXG4gICAgY29uc3QgZGljdCA9IHt9XG5cbiAgICBpZiAodHlwZSA9PT0gJ051bGwnIHx8IHR5cGUgPT09ICdVbmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gZGljdFxuICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gJ09iamVjdCcpIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgaGVhZGVyOiAnRGljdGlvbmFyeScsXG4gICAgICAgIG1lc3NhZ2U6IGBFeHBlY3RlZCAke2RpY3Rpb25hcnl9IHRvIGJlIG9uZSBvZjogTnVsbCwgVW5kZWZpbmVkLCBPYmplY3QuYFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG9wdGlvbnMgb2YgY29udmVydGVycykge1xuICAgICAgY29uc3QgeyBrZXksIGRlZmF1bHRWYWx1ZSwgcmVxdWlyZWQsIGNvbnZlcnRlciB9ID0gb3B0aW9uc1xuXG4gICAgICBpZiAocmVxdWlyZWQgPT09IHRydWUpIHtcbiAgICAgICAgaWYgKCFoYXNPd24oZGljdGlvbmFyeSwga2V5KSkge1xuICAgICAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICAgIGhlYWRlcjogJ0RpY3Rpb25hcnknLFxuICAgICAgICAgICAgbWVzc2FnZTogYE1pc3NpbmcgcmVxdWlyZWQga2V5IFwiJHtrZXl9XCIuYFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IHZhbHVlID0gZGljdGlvbmFyeVtrZXldXG4gICAgICBjb25zdCBoYXNEZWZhdWx0ID0gaGFzT3duKG9wdGlvbnMsICdkZWZhdWx0VmFsdWUnKVxuXG4gICAgICAvLyBPbmx5IHVzZSBkZWZhdWx0VmFsdWUgaWYgdmFsdWUgaXMgdW5kZWZpbmVkIGFuZFxuICAgICAgLy8gYSBkZWZhdWx0VmFsdWUgb3B0aW9ucyB3YXMgcHJvdmlkZWQuXG4gICAgICBpZiAoaGFzRGVmYXVsdCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlID8/IGRlZmF1bHRWYWx1ZVxuICAgICAgfVxuXG4gICAgICAvLyBBIGtleSBjYW4gYmUgb3B0aW9uYWwgYW5kIGhhdmUgbm8gZGVmYXVsdCB2YWx1ZS5cbiAgICAgIC8vIFdoZW4gdGhpcyBoYXBwZW5zLCBkbyBub3QgcGVyZm9ybSBhIGNvbnZlcnNpb24sXG4gICAgICAvLyBhbmQgZG8gbm90IGFzc2lnbiB0aGUga2V5IGEgdmFsdWUuXG4gICAgICBpZiAocmVxdWlyZWQgfHwgaGFzRGVmYXVsdCB8fCB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhbHVlID0gY29udmVydGVyKHZhbHVlKVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBvcHRpb25zLmFsbG93ZWRWYWx1ZXMgJiZcbiAgICAgICAgICAhb3B0aW9ucy5hbGxvd2VkVmFsdWVzLmluY2x1ZGVzKHZhbHVlKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgICBoZWFkZXI6ICdEaWN0aW9uYXJ5JyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGAke3ZhbHVlfSBpcyBub3QgYW4gYWNjZXB0ZWQgdHlwZS4gRXhwZWN0ZWQgb25lIG9mICR7b3B0aW9ucy5hbGxvd2VkVmFsdWVzLmpvaW4oJywgJyl9LmBcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgZGljdFtrZXldID0gdmFsdWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGljdFxuICB9XG59XG5cbndlYmlkbC5udWxsYWJsZUNvbnZlcnRlciA9IGZ1bmN0aW9uIChjb252ZXJ0ZXIpIHtcbiAgcmV0dXJuIChWKSA9PiB7XG4gICAgaWYgKFYgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBWXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnZlcnRlcihWKVxuICB9XG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jZXMtRE9NU3RyaW5nXG53ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcgPSBmdW5jdGlvbiAoViwgb3B0cyA9IHt9KSB7XG4gIC8vIDEuIElmIFYgaXMgbnVsbCBhbmQgdGhlIGNvbnZlcnNpb24gaXMgdG8gYW4gSURMIHR5cGVcbiAgLy8gICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBbTGVnYWN5TnVsbFRvRW1wdHlTdHJpbmddXG4gIC8vICAgIGV4dGVuZGVkIGF0dHJpYnV0ZSwgdGhlbiByZXR1cm4gdGhlIERPTVN0cmluZyB2YWx1ZVxuICAvLyAgICB0aGF0IHJlcHJlc2VudHMgdGhlIGVtcHR5IHN0cmluZy5cbiAgaWYgKFYgPT09IG51bGwgJiYgb3B0cy5sZWdhY3lOdWxsVG9FbXB0eVN0cmluZykge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgLy8gMi4gTGV0IHggYmUgPyBUb1N0cmluZyhWKS5cbiAgaWYgKHR5cGVvZiBWID09PSAnc3ltYm9sJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NvdWxkIG5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgc3ltYm9sIHRvIHN0cmluZy4nKVxuICB9XG5cbiAgLy8gMy4gUmV0dXJuIHRoZSBJREwgRE9NU3RyaW5nIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGVcbiAgLy8gICAgc2FtZSBzZXF1ZW5jZSBvZiBjb2RlIHVuaXRzIGFzIHRoZSBvbmUgdGhlXG4gIC8vICAgIEVDTUFTY3JpcHQgU3RyaW5nIHZhbHVlIHggcmVwcmVzZW50cy5cbiAgcmV0dXJuIFN0cmluZyhWKVxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2VzLUJ5dGVTdHJpbmdcbndlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmcgPSBmdW5jdGlvbiAoVikge1xuICAvLyAxLiBMZXQgeCBiZSA/IFRvU3RyaW5nKFYpLlxuICAvLyBOb3RlOiBET01TdHJpbmcgY29udmVydGVyIHBlcmZvcm0gPyBUb1N0cmluZyhWKVxuICBjb25zdCB4ID0gd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKFYpXG5cbiAgLy8gMi4gSWYgdGhlIHZhbHVlIG9mIGFueSBlbGVtZW50IG9mIHggaXMgZ3JlYXRlciB0aGFuXG4gIC8vICAgIDI1NSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHgubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgaWYgKHguY2hhckNvZGVBdChpbmRleCkgPiAyNTUpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdDYW5ub3QgY29udmVydCBhcmd1bWVudCB0byBhIEJ5dGVTdHJpbmcgYmVjYXVzZSB0aGUgY2hhcmFjdGVyIGF0ICcgK1xuICAgICAgICBgaW5kZXggJHtpbmRleH0gaGFzIGEgdmFsdWUgb2YgJHt4LmNoYXJDb2RlQXQoaW5kZXgpfSB3aGljaCBpcyBncmVhdGVyIHRoYW4gMjU1LmBcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICAvLyAzLiBSZXR1cm4gYW4gSURMIEJ5dGVTdHJpbmcgdmFsdWUgd2hvc2UgbGVuZ3RoIGlzIHRoZVxuICAvLyAgICBsZW5ndGggb2YgeCwgYW5kIHdoZXJlIHRoZSB2YWx1ZSBvZiBlYWNoIGVsZW1lbnQgaXNcbiAgLy8gICAgdGhlIHZhbHVlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgeC5cbiAgcmV0dXJuIHhcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNlcy1VU1ZTdHJpbmdcbndlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyA9IHRvVVNWU3RyaW5nXG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jZXMtYm9vbGVhblxud2ViaWRsLmNvbnZlcnRlcnMuYm9vbGVhbiA9IGZ1bmN0aW9uIChWKSB7XG4gIC8vIDEuIExldCB4IGJlIHRoZSByZXN1bHQgb2YgY29tcHV0aW5nIFRvQm9vbGVhbihWKS5cbiAgY29uc3QgeCA9IEJvb2xlYW4oVilcblxuICAvLyAyLiBSZXR1cm4gdGhlIElETCBib29sZWFuIHZhbHVlIHRoYXQgaXMgdGhlIG9uZSB0aGF0IHJlcHJlc2VudHNcbiAgLy8gICAgdGhlIHNhbWUgdHJ1dGggdmFsdWUgYXMgdGhlIEVDTUFTY3JpcHQgQm9vbGVhbiB2YWx1ZSB4LlxuICByZXR1cm4geFxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2VzLWFueVxud2ViaWRsLmNvbnZlcnRlcnMuYW55ID0gZnVuY3Rpb24gKFYpIHtcbiAgcmV0dXJuIFZcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNlcy1sb25nLWxvbmdcbndlYmlkbC5jb252ZXJ0ZXJzWydsb25nIGxvbmcnXSA9IGZ1bmN0aW9uIChWKSB7XG4gIC8vIDEuIExldCB4IGJlID8gQ29udmVydFRvSW50KFYsIDY0LCBcInNpZ25lZFwiKS5cbiAgY29uc3QgeCA9IHdlYmlkbC51dGlsLkNvbnZlcnRUb0ludChWLCA2NCwgJ3NpZ25lZCcpXG5cbiAgLy8gMi4gUmV0dXJuIHRoZSBJREwgbG9uZyBsb25nIHZhbHVlIHRoYXQgcmVwcmVzZW50c1xuICAvLyAgICB0aGUgc2FtZSBudW1lcmljIHZhbHVlIGFzIHguXG4gIHJldHVybiB4XG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jZXMtdW5zaWduZWQtbG9uZy1sb25nXG53ZWJpZGwuY29udmVydGVyc1sndW5zaWduZWQgbG9uZyBsb25nJ10gPSBmdW5jdGlvbiAoVikge1xuICAvLyAxLiBMZXQgeCBiZSA/IENvbnZlcnRUb0ludChWLCA2NCwgXCJ1bnNpZ25lZFwiKS5cbiAgY29uc3QgeCA9IHdlYmlkbC51dGlsLkNvbnZlcnRUb0ludChWLCA2NCwgJ3Vuc2lnbmVkJylcblxuICAvLyAyLiBSZXR1cm4gdGhlIElETCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUgdGhhdFxuICAvLyAgICByZXByZXNlbnRzIHRoZSBzYW1lIG51bWVyaWMgdmFsdWUgYXMgeC5cbiAgcmV0dXJuIHhcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNlcy11bnNpZ25lZC1sb25nXG53ZWJpZGwuY29udmVydGVyc1sndW5zaWduZWQgbG9uZyddID0gZnVuY3Rpb24gKFYpIHtcbiAgLy8gMS4gTGV0IHggYmUgPyBDb252ZXJ0VG9JbnQoViwgMzIsIFwidW5zaWduZWRcIikuXG4gIGNvbnN0IHggPSB3ZWJpZGwudXRpbC5Db252ZXJ0VG9JbnQoViwgMzIsICd1bnNpZ25lZCcpXG5cbiAgLy8gMi4gUmV0dXJuIHRoZSBJREwgdW5zaWduZWQgbG9uZyB2YWx1ZSB0aGF0XG4gIC8vICAgIHJlcHJlc2VudHMgdGhlIHNhbWUgbnVtZXJpYyB2YWx1ZSBhcyB4LlxuICByZXR1cm4geFxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2VzLXVuc2lnbmVkLXNob3J0XG53ZWJpZGwuY29udmVydGVyc1sndW5zaWduZWQgc2hvcnQnXSA9IGZ1bmN0aW9uIChWLCBvcHRzKSB7XG4gIC8vIDEuIExldCB4IGJlID8gQ29udmVydFRvSW50KFYsIDE2LCBcInVuc2lnbmVkXCIpLlxuICBjb25zdCB4ID0gd2ViaWRsLnV0aWwuQ29udmVydFRvSW50KFYsIDE2LCAndW5zaWduZWQnLCBvcHRzKVxuXG4gIC8vIDIuIFJldHVybiB0aGUgSURMIHVuc2lnbmVkIHNob3J0IHZhbHVlIHRoYXQgcmVwcmVzZW50c1xuICAvLyAgICB0aGUgc2FtZSBudW1lcmljIHZhbHVlIGFzIHguXG4gIHJldHVybiB4XG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jaWRsLUFycmF5QnVmZmVyXG53ZWJpZGwuY29udmVydGVycy5BcnJheUJ1ZmZlciA9IGZ1bmN0aW9uIChWLCBvcHRzID0ge30pIHtcbiAgLy8gMS4gSWYgVHlwZShWKSBpcyBub3QgT2JqZWN0LCBvciBWIGRvZXMgbm90IGhhdmUgYW5cbiAgLy8gICAgW1tBcnJheUJ1ZmZlckRhdGFdXSBpbnRlcm5hbCBzbG90LCB0aGVuIHRocm93IGFcbiAgLy8gICAgVHlwZUVycm9yLlxuICAvLyBzZWU6IGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvcGVydGllcy1vZi10aGUtYXJyYXlidWZmZXItaW5zdGFuY2VzXG4gIC8vIHNlZTogaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9wZXJ0aWVzLW9mLXRoZS1zaGFyZWRhcnJheWJ1ZmZlci1pbnN0YW5jZXNcbiAgaWYgKFxuICAgIHdlYmlkbC51dGlsLlR5cGUoVikgIT09ICdPYmplY3QnIHx8XG4gICAgIXR5cGVzLmlzQW55QXJyYXlCdWZmZXIoVilcbiAgKSB7XG4gICAgdGhyb3cgd2ViaWRsLmVycm9ycy5jb252ZXJzaW9uRmFpbGVkKHtcbiAgICAgIHByZWZpeDogYCR7Vn1gLFxuICAgICAgYXJndW1lbnQ6IGAke1Z9YCxcbiAgICAgIHR5cGVzOiBbJ0FycmF5QnVmZmVyJ11cbiAgICB9KVxuICB9XG5cbiAgLy8gMi4gSWYgdGhlIGNvbnZlcnNpb24gaXMgbm90IHRvIGFuIElETCB0eXBlIGFzc29jaWF0ZWRcbiAgLy8gICAgd2l0aCB0aGUgW0FsbG93U2hhcmVkXSBleHRlbmRlZCBhdHRyaWJ1dGUsIGFuZFxuICAvLyAgICBJc1NoYXJlZEFycmF5QnVmZmVyKFYpIGlzIHRydWUsIHRoZW4gdGhyb3cgYVxuICAvLyAgICBUeXBlRXJyb3IuXG4gIGlmIChvcHRzLmFsbG93U2hhcmVkID09PSBmYWxzZSAmJiB0eXBlcy5pc1NoYXJlZEFycmF5QnVmZmVyKFYpKSB7XG4gICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgaGVhZGVyOiAnQXJyYXlCdWZmZXInLFxuICAgICAgbWVzc2FnZTogJ1NoYXJlZEFycmF5QnVmZmVyIGlzIG5vdCBhbGxvd2VkLidcbiAgICB9KVxuICB9XG5cbiAgLy8gMy4gSWYgdGhlIGNvbnZlcnNpb24gaXMgbm90IHRvIGFuIElETCB0eXBlIGFzc29jaWF0ZWRcbiAgLy8gICAgd2l0aCB0aGUgW0FsbG93UmVzaXphYmxlXSBleHRlbmRlZCBhdHRyaWJ1dGUsIGFuZFxuICAvLyAgICBJc1Jlc2l6YWJsZUFycmF5QnVmZmVyKFYpIGlzIHRydWUsIHRoZW4gdGhyb3cgYVxuICAvLyAgICBUeXBlRXJyb3IuXG4gIC8vIE5vdGU6IHJlc2l6YWJsZSBBcnJheUJ1ZmZlcnMgYXJlIGN1cnJlbnRseSBhIHByb3Bvc2FsLlxuXG4gIC8vIDQuIFJldHVybiB0aGUgSURMIEFycmF5QnVmZmVyIHZhbHVlIHRoYXQgaXMgYVxuICAvLyAgICByZWZlcmVuY2UgdG8gdGhlIHNhbWUgb2JqZWN0IGFzIFYuXG4gIHJldHVybiBWXG59XG5cbndlYmlkbC5jb252ZXJ0ZXJzLlR5cGVkQXJyYXkgPSBmdW5jdGlvbiAoViwgVCwgb3B0cyA9IHt9KSB7XG4gIC8vIDEuIExldCBUIGJlIHRoZSBJREwgdHlwZSBWIGlzIGJlaW5nIGNvbnZlcnRlZCB0by5cblxuICAvLyAyLiBJZiBUeXBlKFYpIGlzIG5vdCBPYmplY3QsIG9yIFYgZG9lcyBub3QgaGF2ZSBhXG4gIC8vICAgIFtbVHlwZWRBcnJheU5hbWVdXSBpbnRlcm5hbCBzbG90IHdpdGggYSB2YWx1ZVxuICAvLyAgICBlcXVhbCB0byBU4oCZcyBuYW1lLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICBpZiAoXG4gICAgd2ViaWRsLnV0aWwuVHlwZShWKSAhPT0gJ09iamVjdCcgfHxcbiAgICAhdHlwZXMuaXNUeXBlZEFycmF5KFYpIHx8XG4gICAgVi5jb25zdHJ1Y3Rvci5uYW1lICE9PSBULm5hbWVcbiAgKSB7XG4gICAgdGhyb3cgd2ViaWRsLmVycm9ycy5jb252ZXJzaW9uRmFpbGVkKHtcbiAgICAgIHByZWZpeDogYCR7VC5uYW1lfWAsXG4gICAgICBhcmd1bWVudDogYCR7Vn1gLFxuICAgICAgdHlwZXM6IFtULm5hbWVdXG4gICAgfSlcbiAgfVxuXG4gIC8vIDMuIElmIHRoZSBjb252ZXJzaW9uIGlzIG5vdCB0byBhbiBJREwgdHlwZSBhc3NvY2lhdGVkXG4gIC8vICAgIHdpdGggdGhlIFtBbGxvd1NoYXJlZF0gZXh0ZW5kZWQgYXR0cmlidXRlLCBhbmRcbiAgLy8gICAgSXNTaGFyZWRBcnJheUJ1ZmZlcihWLltbVmlld2VkQXJyYXlCdWZmZXJdXSkgaXNcbiAgLy8gICAgdHJ1ZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgaWYgKG9wdHMuYWxsb3dTaGFyZWQgPT09IGZhbHNlICYmIHR5cGVzLmlzU2hhcmVkQXJyYXlCdWZmZXIoVi5idWZmZXIpKSB7XG4gICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgaGVhZGVyOiAnQXJyYXlCdWZmZXInLFxuICAgICAgbWVzc2FnZTogJ1NoYXJlZEFycmF5QnVmZmVyIGlzIG5vdCBhbGxvd2VkLidcbiAgICB9KVxuICB9XG5cbiAgLy8gNC4gSWYgdGhlIGNvbnZlcnNpb24gaXMgbm90IHRvIGFuIElETCB0eXBlIGFzc29jaWF0ZWRcbiAgLy8gICAgd2l0aCB0aGUgW0FsbG93UmVzaXphYmxlXSBleHRlbmRlZCBhdHRyaWJ1dGUsIGFuZFxuICAvLyAgICBJc1Jlc2l6YWJsZUFycmF5QnVmZmVyKFYuW1tWaWV3ZWRBcnJheUJ1ZmZlcl1dKSBpc1xuICAvLyAgICB0cnVlLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAvLyBOb3RlOiByZXNpemFibGUgYXJyYXkgYnVmZmVycyBhcmUgY3VycmVudGx5IGEgcHJvcG9zYWxcblxuICAvLyA1LiBSZXR1cm4gdGhlIElETCB2YWx1ZSBvZiB0eXBlIFQgdGhhdCBpcyBhIHJlZmVyZW5jZVxuICAvLyAgICB0byB0aGUgc2FtZSBvYmplY3QgYXMgVi5cbiAgcmV0dXJuIFZcbn1cblxud2ViaWRsLmNvbnZlcnRlcnMuRGF0YVZpZXcgPSBmdW5jdGlvbiAoViwgb3B0cyA9IHt9KSB7XG4gIC8vIDEuIElmIFR5cGUoVikgaXMgbm90IE9iamVjdCwgb3IgViBkb2VzIG5vdCBoYXZlIGFcbiAgLy8gICAgW1tEYXRhVmlld11dIGludGVybmFsIHNsb3QsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gIGlmICh3ZWJpZGwudXRpbC5UeXBlKFYpICE9PSAnT2JqZWN0JyB8fCAhdHlwZXMuaXNEYXRhVmlldyhWKSkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgIGhlYWRlcjogJ0RhdGFWaWV3JyxcbiAgICAgIG1lc3NhZ2U6ICdPYmplY3QgaXMgbm90IGEgRGF0YVZpZXcuJ1xuICAgIH0pXG4gIH1cblxuICAvLyAyLiBJZiB0aGUgY29udmVyc2lvbiBpcyBub3QgdG8gYW4gSURMIHR5cGUgYXNzb2NpYXRlZFxuICAvLyAgICB3aXRoIHRoZSBbQWxsb3dTaGFyZWRdIGV4dGVuZGVkIGF0dHJpYnV0ZSwgYW5kXG4gIC8vICAgIElzU2hhcmVkQXJyYXlCdWZmZXIoVi5bW1ZpZXdlZEFycmF5QnVmZmVyXV0pIGlzIHRydWUsXG4gIC8vICAgIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gIGlmIChvcHRzLmFsbG93U2hhcmVkID09PSBmYWxzZSAmJiB0eXBlcy5pc1NoYXJlZEFycmF5QnVmZmVyKFYuYnVmZmVyKSkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgIGhlYWRlcjogJ0FycmF5QnVmZmVyJyxcbiAgICAgIG1lc3NhZ2U6ICdTaGFyZWRBcnJheUJ1ZmZlciBpcyBub3QgYWxsb3dlZC4nXG4gICAgfSlcbiAgfVxuXG4gIC8vIDMuIElmIHRoZSBjb252ZXJzaW9uIGlzIG5vdCB0byBhbiBJREwgdHlwZSBhc3NvY2lhdGVkXG4gIC8vICAgIHdpdGggdGhlIFtBbGxvd1Jlc2l6YWJsZV0gZXh0ZW5kZWQgYXR0cmlidXRlLCBhbmRcbiAgLy8gICAgSXNSZXNpemFibGVBcnJheUJ1ZmZlcihWLltbVmlld2VkQXJyYXlCdWZmZXJdXSkgaXNcbiAgLy8gICAgdHJ1ZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgLy8gTm90ZTogcmVzaXphYmxlIEFycmF5QnVmZmVycyBhcmUgY3VycmVudGx5IGEgcHJvcG9zYWxcblxuICAvLyA0LiBSZXR1cm4gdGhlIElETCBEYXRhVmlldyB2YWx1ZSB0aGF0IGlzIGEgcmVmZXJlbmNlXG4gIC8vICAgIHRvIHRoZSBzYW1lIG9iamVjdCBhcyBWLlxuICByZXR1cm4gVlxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI0J1ZmZlclNvdXJjZVxud2ViaWRsLmNvbnZlcnRlcnMuQnVmZmVyU291cmNlID0gZnVuY3Rpb24gKFYsIG9wdHMgPSB7fSkge1xuICBpZiAodHlwZXMuaXNBbnlBcnJheUJ1ZmZlcihWKSkge1xuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5BcnJheUJ1ZmZlcihWLCBvcHRzKVxuICB9XG5cbiAgaWYgKHR5cGVzLmlzVHlwZWRBcnJheShWKSkge1xuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5UeXBlZEFycmF5KFYsIFYuY29uc3RydWN0b3IpXG4gIH1cblxuICBpZiAodHlwZXMuaXNEYXRhVmlldyhWKSkge1xuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5EYXRhVmlldyhWLCBvcHRzKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQ291bGQgbm90IGNvbnZlcnQgJHtWfSB0byBhIEJ1ZmZlclNvdXJjZS5gKVxufVxuXG53ZWJpZGwuY29udmVydGVyc1snc2VxdWVuY2U8Qnl0ZVN0cmluZz4nXSA9IHdlYmlkbC5zZXF1ZW5jZUNvbnZlcnRlcihcbiAgd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZ1xuKVxuXG53ZWJpZGwuY29udmVydGVyc1snc2VxdWVuY2U8c2VxdWVuY2U8Qnl0ZVN0cmluZz4+J10gPSB3ZWJpZGwuc2VxdWVuY2VDb252ZXJ0ZXIoXG4gIHdlYmlkbC5jb252ZXJ0ZXJzWydzZXF1ZW5jZTxCeXRlU3RyaW5nPiddXG4pXG5cbndlYmlkbC5jb252ZXJ0ZXJzWydyZWNvcmQ8Qnl0ZVN0cmluZywgQnl0ZVN0cmluZz4nXSA9IHdlYmlkbC5yZWNvcmRDb252ZXJ0ZXIoXG4gIHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmcsXG4gIHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmdcbilcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHdlYmlkbFxufVxuIiwiY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsgYXRvYiB9ID0gcmVxdWlyZSgnYnVmZmVyJylcbmNvbnN0IHsgaXNvbW9ycGhpY0RlY29kZSB9ID0gcmVxdWlyZSgnLi91dGlsJylcblxuY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpXG5cbi8qKlxuICogQHNlZSBodHRwczovL21pbWVzbmlmZi5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtdG9rZW4tY29kZS1wb2ludFxuICovXG5jb25zdCBIVFRQX1RPS0VOX0NPREVQT0lOVFMgPSAvXlshIyQlJicqKy0uXl98fkEtWmEtejAtOV0rJC9cbmNvbnN0IEhUVFBfV0hJVEVTUEFDRV9SRUdFWCA9IC8oXFx1MDAwQXxcXHUwMDBEfFxcdTAwMDl8XFx1MDAyMCkvIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbi8qKlxuICogQHNlZSBodHRwczovL21pbWVzbmlmZi5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtcXVvdGVkLXN0cmluZy10b2tlbi1jb2RlLXBvaW50XG4gKi9cbmNvbnN0IEhUVFBfUVVPVEVEX1NUUklOR19UT0tFTlMgPSAvW1xcdTAwMDl8XFx1MDAyMC1cXHUwMDdFfFxcdTAwODAtXFx1MDBGRl0vIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RhdGEtdXJsLXByb2Nlc3NvclxuLyoqIEBwYXJhbSB7VVJMfSBkYXRhVVJMICovXG5mdW5jdGlvbiBkYXRhVVJMUHJvY2Vzc29yIChkYXRhVVJMKSB7XG4gIC8vIDEuIEFzc2VydDogZGF0YVVSTOKAmXMgc2NoZW1lIGlzIFwiZGF0YVwiLlxuICBhc3NlcnQoZGF0YVVSTC5wcm90b2NvbCA9PT0gJ2RhdGE6JylcblxuICAvLyAyLiBMZXQgaW5wdXQgYmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nIHRoZSBVUkxcbiAgLy8gc2VyaWFsaXplciBvbiBkYXRhVVJMIHdpdGggZXhjbHVkZSBmcmFnbWVudFxuICAvLyBzZXQgdG8gdHJ1ZS5cbiAgbGV0IGlucHV0ID0gVVJMU2VyaWFsaXplcihkYXRhVVJMLCB0cnVlKVxuXG4gIC8vIDMuIFJlbW92ZSB0aGUgbGVhZGluZyBcImRhdGE6XCIgc3RyaW5nIGZyb20gaW5wdXQuXG4gIGlucHV0ID0gaW5wdXQuc2xpY2UoNSlcblxuICAvLyA0LiBMZXQgcG9zaXRpb24gcG9pbnQgYXQgdGhlIHN0YXJ0IG9mIGlucHV0LlxuICBjb25zdCBwb3NpdGlvbiA9IHsgcG9zaXRpb246IDAgfVxuXG4gIC8vIDUuIExldCBtaW1lVHlwZSBiZSB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmcgYVxuICAvLyBzZXF1ZW5jZSBvZiBjb2RlIHBvaW50cyB0aGF0IGFyZSBub3QgZXF1YWxcbiAgLy8gdG8gVSswMDJDICgsKSwgZ2l2ZW4gcG9zaXRpb24uXG4gIGxldCBtaW1lVHlwZSA9IGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0KFxuICAgICcsJyxcbiAgICBpbnB1dCxcbiAgICBwb3NpdGlvblxuICApXG5cbiAgLy8gNi4gU3RyaXAgbGVhZGluZyBhbmQgdHJhaWxpbmcgQVNDSUkgd2hpdGVzcGFjZVxuICAvLyBmcm9tIG1pbWVUeXBlLlxuICAvLyBVbmRpY2kgaW1wbGVtZW50YXRpb24gbm90ZTogd2UgbmVlZCB0byBzdG9yZSB0aGVcbiAgLy8gbGVuZ3RoIGJlY2F1c2UgaWYgdGhlIG1pbWV0eXBlIGhhcyBzcGFjZXMgcmVtb3ZlZCxcbiAgLy8gdGhlIHdyb25nIGFtb3VudCB3aWxsIGJlIHNsaWNlZCBmcm9tIHRoZSBpbnB1dCBpblxuICAvLyBzdGVwICM5XG4gIGNvbnN0IG1pbWVUeXBlTGVuZ3RoID0gbWltZVR5cGUubGVuZ3RoXG4gIG1pbWVUeXBlID0gcmVtb3ZlQVNDSUlXaGl0ZXNwYWNlKG1pbWVUeXBlLCB0cnVlLCB0cnVlKVxuXG4gIC8vIDcuIElmIHBvc2l0aW9uIGlzIHBhc3QgdGhlIGVuZCBvZiBpbnB1dCwgdGhlblxuICAvLyByZXR1cm4gZmFpbHVyZVxuICBpZiAocG9zaXRpb24ucG9zaXRpb24gPj0gaW5wdXQubGVuZ3RoKSB7XG4gICAgcmV0dXJuICdmYWlsdXJlJ1xuICB9XG5cbiAgLy8gOC4gQWR2YW5jZSBwb3NpdGlvbiBieSAxLlxuICBwb3NpdGlvbi5wb3NpdGlvbisrXG5cbiAgLy8gOS4gTGV0IGVuY29kZWRCb2R5IGJlIHRoZSByZW1haW5kZXIgb2YgaW5wdXQuXG4gIGNvbnN0IGVuY29kZWRCb2R5ID0gaW5wdXQuc2xpY2UobWltZVR5cGVMZW5ndGggKyAxKVxuXG4gIC8vIDEwLiBMZXQgYm9keSBiZSB0aGUgcGVyY2VudC1kZWNvZGluZyBvZiBlbmNvZGVkQm9keS5cbiAgbGV0IGJvZHkgPSBzdHJpbmdQZXJjZW50RGVjb2RlKGVuY29kZWRCb2R5KVxuXG4gIC8vIDExLiBJZiBtaW1lVHlwZSBlbmRzIHdpdGggVSswMDNCICg7KSwgZm9sbG93ZWQgYnlcbiAgLy8gemVybyBvciBtb3JlIFUrMDAyMCBTUEFDRSwgZm9sbG93ZWQgYnkgYW4gQVNDSUlcbiAgLy8gY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBmb3IgXCJiYXNlNjRcIiwgdGhlbjpcbiAgaWYgKC87KFxcdTAwMjApezAsfWJhc2U2NCQvaS50ZXN0KG1pbWVUeXBlKSkge1xuICAgIC8vIDEuIExldCBzdHJpbmdCb2R5IGJlIHRoZSBpc29tb3JwaGljIGRlY29kZSBvZiBib2R5LlxuICAgIGNvbnN0IHN0cmluZ0JvZHkgPSBpc29tb3JwaGljRGVjb2RlKGJvZHkpXG5cbiAgICAvLyAyLiBTZXQgYm9keSB0byB0aGUgZm9yZ2l2aW5nLWJhc2U2NCBkZWNvZGUgb2ZcbiAgICAvLyBzdHJpbmdCb2R5LlxuICAgIGJvZHkgPSBmb3JnaXZpbmdCYXNlNjQoc3RyaW5nQm9keSlcblxuICAgIC8vIDMuIElmIGJvZHkgaXMgZmFpbHVyZSwgdGhlbiByZXR1cm4gZmFpbHVyZS5cbiAgICBpZiAoYm9keSA9PT0gJ2ZhaWx1cmUnKSB7XG4gICAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gICAgfVxuXG4gICAgLy8gNC4gUmVtb3ZlIHRoZSBsYXN0IDYgY29kZSBwb2ludHMgZnJvbSBtaW1lVHlwZS5cbiAgICBtaW1lVHlwZSA9IG1pbWVUeXBlLnNsaWNlKDAsIC02KVxuXG4gICAgLy8gNS4gUmVtb3ZlIHRyYWlsaW5nIFUrMDAyMCBTUEFDRSBjb2RlIHBvaW50cyBmcm9tIG1pbWVUeXBlLFxuICAgIC8vIGlmIGFueS5cbiAgICBtaW1lVHlwZSA9IG1pbWVUeXBlLnJlcGxhY2UoLyhcXHUwMDIwKSskLywgJycpXG5cbiAgICAvLyA2LiBSZW1vdmUgdGhlIGxhc3QgVSswMDNCICg7KSBjb2RlIHBvaW50IGZyb20gbWltZVR5cGUuXG4gICAgbWltZVR5cGUgPSBtaW1lVHlwZS5zbGljZSgwLCAtMSlcbiAgfVxuXG4gIC8vIDEyLiBJZiBtaW1lVHlwZSBzdGFydHMgd2l0aCBVKzAwM0IgKDspLCB0aGVuIHByZXBlbmRcbiAgLy8gXCJ0ZXh0L3BsYWluXCIgdG8gbWltZVR5cGUuXG4gIGlmIChtaW1lVHlwZS5zdGFydHNXaXRoKCc7JykpIHtcbiAgICBtaW1lVHlwZSA9ICd0ZXh0L3BsYWluJyArIG1pbWVUeXBlXG4gIH1cblxuICAvLyAxMy4gTGV0IG1pbWVUeXBlUmVjb3JkIGJlIHRoZSByZXN1bHQgb2YgcGFyc2luZ1xuICAvLyBtaW1lVHlwZS5cbiAgbGV0IG1pbWVUeXBlUmVjb3JkID0gcGFyc2VNSU1FVHlwZShtaW1lVHlwZSlcblxuICAvLyAxNC4gSWYgbWltZVR5cGVSZWNvcmQgaXMgZmFpbHVyZSwgdGhlbiBzZXRcbiAgLy8gbWltZVR5cGVSZWNvcmQgdG8gdGV4dC9wbGFpbjtjaGFyc2V0PVVTLUFTQ0lJLlxuICBpZiAobWltZVR5cGVSZWNvcmQgPT09ICdmYWlsdXJlJykge1xuICAgIG1pbWVUeXBlUmVjb3JkID0gcGFyc2VNSU1FVHlwZSgndGV4dC9wbGFpbjtjaGFyc2V0PVVTLUFTQ0lJJylcbiAgfVxuXG4gIC8vIDE1LiBSZXR1cm4gYSBuZXcgZGF0YTogVVJMIHN0cnVjdCB3aG9zZSBNSU1FXG4gIC8vIHR5cGUgaXMgbWltZVR5cGVSZWNvcmQgYW5kIGJvZHkgaXMgYm9keS5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RhdGEtdXJsLXN0cnVjdFxuICByZXR1cm4geyBtaW1lVHlwZTogbWltZVR5cGVSZWNvcmQsIGJvZHkgfVxufVxuXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtdXJsLXNlcmlhbGl6ZXJcbi8qKlxuICogQHBhcmFtIHtVUkx9IHVybFxuICogQHBhcmFtIHtib29sZWFufSBleGNsdWRlRnJhZ21lbnRcbiAqL1xuZnVuY3Rpb24gVVJMU2VyaWFsaXplciAodXJsLCBleGNsdWRlRnJhZ21lbnQgPSBmYWxzZSkge1xuICBpZiAoIWV4Y2x1ZGVGcmFnbWVudCkge1xuICAgIHJldHVybiB1cmwuaHJlZlxuICB9XG5cbiAgY29uc3QgaHJlZiA9IHVybC5ocmVmXG4gIGNvbnN0IGhhc2hMZW5ndGggPSB1cmwuaGFzaC5sZW5ndGhcblxuICByZXR1cm4gaGFzaExlbmd0aCA9PT0gMCA/IGhyZWYgOiBocmVmLnN1YnN0cmluZygwLCBocmVmLmxlbmd0aCAtIGhhc2hMZW5ndGgpXG59XG5cbi8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNjb2xsZWN0LWEtc2VxdWVuY2Utb2YtY29kZS1wb2ludHNcbi8qKlxuICogQHBhcmFtIHsoY2hhcjogc3RyaW5nKSA9PiBib29sZWFufSBjb25kaXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dFxuICogQHBhcmFtIHt7IHBvc2l0aW9uOiBudW1iZXIgfX0gcG9zaXRpb25cbiAqL1xuZnVuY3Rpb24gY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50cyAoY29uZGl0aW9uLCBpbnB1dCwgcG9zaXRpb24pIHtcbiAgLy8gMS4gTGV0IHJlc3VsdCBiZSB0aGUgZW1wdHkgc3RyaW5nLlxuICBsZXQgcmVzdWx0ID0gJydcblxuICAvLyAyLiBXaGlsZSBwb3NpdGlvbiBkb2VzbuKAmXQgcG9pbnQgcGFzdCB0aGUgZW5kIG9mIGlucHV0IGFuZCB0aGVcbiAgLy8gY29kZSBwb2ludCBhdCBwb3NpdGlvbiB3aXRoaW4gaW5wdXQgbWVldHMgdGhlIGNvbmRpdGlvbiBjb25kaXRpb246XG4gIHdoaWxlIChwb3NpdGlvbi5wb3NpdGlvbiA8IGlucHV0Lmxlbmd0aCAmJiBjb25kaXRpb24oaW5wdXRbcG9zaXRpb24ucG9zaXRpb25dKSkge1xuICAgIC8vIDEuIEFwcGVuZCB0aGF0IGNvZGUgcG9pbnQgdG8gdGhlIGVuZCBvZiByZXN1bHQuXG4gICAgcmVzdWx0ICs9IGlucHV0W3Bvc2l0aW9uLnBvc2l0aW9uXVxuXG4gICAgLy8gMi4gQWR2YW5jZSBwb3NpdGlvbiBieSAxLlxuICAgIHBvc2l0aW9uLnBvc2l0aW9uKytcbiAgfVxuXG4gIC8vIDMuIFJldHVybiByZXN1bHQuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBBIGZhc3RlciBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzIHRoYXQgb25seSB3b3JrcyB3aGVuIGNvbXBhcmluZyBhIHNpbmdsZSBjaGFyYWN0ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hhclxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0XG4gKiBAcGFyYW0ge3sgcG9zaXRpb246IG51bWJlciB9fSBwb3NpdGlvblxuICovXG5mdW5jdGlvbiBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzRmFzdCAoY2hhciwgaW5wdXQsIHBvc2l0aW9uKSB7XG4gIGNvbnN0IGlkeCA9IGlucHV0LmluZGV4T2YoY2hhciwgcG9zaXRpb24ucG9zaXRpb24pXG4gIGNvbnN0IHN0YXJ0ID0gcG9zaXRpb24ucG9zaXRpb25cblxuICBpZiAoaWR4ID09PSAtMSkge1xuICAgIHBvc2l0aW9uLnBvc2l0aW9uID0gaW5wdXQubGVuZ3RoXG4gICAgcmV0dXJuIGlucHV0LnNsaWNlKHN0YXJ0KVxuICB9XG5cbiAgcG9zaXRpb24ucG9zaXRpb24gPSBpZHhcbiAgcmV0dXJuIGlucHV0LnNsaWNlKHN0YXJ0LCBwb3NpdGlvbi5wb3NpdGlvbilcbn1cblxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNzdHJpbmctcGVyY2VudC1kZWNvZGVcbi8qKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQgKi9cbmZ1bmN0aW9uIHN0cmluZ1BlcmNlbnREZWNvZGUgKGlucHV0KSB7XG4gIC8vIDEuIExldCBieXRlcyBiZSB0aGUgVVRGLTggZW5jb2Rpbmcgb2YgaW5wdXQuXG4gIGNvbnN0IGJ5dGVzID0gZW5jb2Rlci5lbmNvZGUoaW5wdXQpXG5cbiAgLy8gMi4gUmV0dXJuIHRoZSBwZXJjZW50LWRlY29kaW5nIG9mIGJ5dGVzLlxuICByZXR1cm4gcGVyY2VudERlY29kZShieXRlcylcbn1cblxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNwZXJjZW50LWRlY29kZVxuLyoqIEBwYXJhbSB7VWludDhBcnJheX0gaW5wdXQgKi9cbmZ1bmN0aW9uIHBlcmNlbnREZWNvZGUgKGlucHV0KSB7XG4gIC8vIDEuIExldCBvdXRwdXQgYmUgYW4gZW1wdHkgYnl0ZSBzZXF1ZW5jZS5cbiAgLyoqIEB0eXBlIHtudW1iZXJbXX0gKi9cbiAgY29uc3Qgb3V0cHV0ID0gW11cblxuICAvLyAyLiBGb3IgZWFjaCBieXRlIGJ5dGUgaW4gaW5wdXQ6XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBieXRlID0gaW5wdXRbaV1cblxuICAgIC8vIDEuIElmIGJ5dGUgaXMgbm90IDB4MjUgKCUpLCB0aGVuIGFwcGVuZCBieXRlIHRvIG91dHB1dC5cbiAgICBpZiAoYnl0ZSAhPT0gMHgyNSkge1xuICAgICAgb3V0cHV0LnB1c2goYnl0ZSlcblxuICAgIC8vIDIuIE90aGVyd2lzZSwgaWYgYnl0ZSBpcyAweDI1ICglKSBhbmQgdGhlIG5leHQgdHdvIGJ5dGVzXG4gICAgLy8gYWZ0ZXIgYnl0ZSBpbiBpbnB1dCBhcmUgbm90IGluIHRoZSByYW5nZXNcbiAgICAvLyAweDMwICgwKSB0byAweDM5ICg5KSwgMHg0MSAoQSkgdG8gMHg0NiAoRiksXG4gICAgLy8gYW5kIDB4NjEgKGEpIHRvIDB4NjYgKGYpLCBhbGwgaW5jbHVzaXZlLCBhcHBlbmQgYnl0ZVxuICAgIC8vIHRvIG91dHB1dC5cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgYnl0ZSA9PT0gMHgyNSAmJlxuICAgICAgIS9eWzAtOUEtRmEtZl17Mn0kL2kudGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGlucHV0W2kgKyAxXSwgaW5wdXRbaSArIDJdKSlcbiAgICApIHtcbiAgICAgIG91dHB1dC5wdXNoKDB4MjUpXG5cbiAgICAvLyAzLiBPdGhlcndpc2U6XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDEuIExldCBieXRlUG9pbnQgYmUgdGhlIHR3byBieXRlcyBhZnRlciBieXRlIGluIGlucHV0LFxuICAgICAgLy8gZGVjb2RlZCwgYW5kIHRoZW4gaW50ZXJwcmV0ZWQgYXMgaGV4YWRlY2ltYWwgbnVtYmVyLlxuICAgICAgY29uc3QgbmV4dFR3b0J5dGVzID0gU3RyaW5nLmZyb21DaGFyQ29kZShpbnB1dFtpICsgMV0sIGlucHV0W2kgKyAyXSlcbiAgICAgIGNvbnN0IGJ5dGVQb2ludCA9IE51bWJlci5wYXJzZUludChuZXh0VHdvQnl0ZXMsIDE2KVxuXG4gICAgICAvLyAyLiBBcHBlbmQgYSBieXRlIHdob3NlIHZhbHVlIGlzIGJ5dGVQb2ludCB0byBvdXRwdXQuXG4gICAgICBvdXRwdXQucHVzaChieXRlUG9pbnQpXG5cbiAgICAgIC8vIDMuIFNraXAgdGhlIG5leHQgdHdvIGJ5dGVzIGluIGlucHV0LlxuICAgICAgaSArPSAyXG4gICAgfVxuICB9XG5cbiAgLy8gMy4gUmV0dXJuIG91dHB1dC5cbiAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShvdXRwdXQpXG59XG5cbi8vIGh0dHBzOi8vbWltZXNuaWZmLnNwZWMud2hhdHdnLm9yZy8jcGFyc2UtYS1taW1lLXR5cGVcbi8qKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQgKi9cbmZ1bmN0aW9uIHBhcnNlTUlNRVR5cGUgKGlucHV0KSB7XG4gIC8vIDEuIFJlbW92ZSBhbnkgbGVhZGluZyBhbmQgdHJhaWxpbmcgSFRUUCB3aGl0ZXNwYWNlXG4gIC8vIGZyb20gaW5wdXQuXG4gIGlucHV0ID0gcmVtb3ZlSFRUUFdoaXRlc3BhY2UoaW5wdXQsIHRydWUsIHRydWUpXG5cbiAgLy8gMi4gTGV0IHBvc2l0aW9uIGJlIGEgcG9zaXRpb24gdmFyaWFibGUgZm9yIGlucHV0LFxuICAvLyBpbml0aWFsbHkgcG9pbnRpbmcgYXQgdGhlIHN0YXJ0IG9mIGlucHV0LlxuICBjb25zdCBwb3NpdGlvbiA9IHsgcG9zaXRpb246IDAgfVxuXG4gIC8vIDMuIExldCB0eXBlIGJlIHRoZSByZXN1bHQgb2YgY29sbGVjdGluZyBhIHNlcXVlbmNlXG4gIC8vIG9mIGNvZGUgcG9pbnRzIHRoYXQgYXJlIG5vdCBVKzAwMkYgKC8pIGZyb21cbiAgLy8gaW5wdXQsIGdpdmVuIHBvc2l0aW9uLlxuICBjb25zdCB0eXBlID0gY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50c0Zhc3QoXG4gICAgJy8nLFxuICAgIGlucHV0LFxuICAgIHBvc2l0aW9uXG4gIClcblxuICAvLyA0LiBJZiB0eXBlIGlzIHRoZSBlbXB0eSBzdHJpbmcgb3IgZG9lcyBub3Qgc29sZWx5XG4gIC8vIGNvbnRhaW4gSFRUUCB0b2tlbiBjb2RlIHBvaW50cywgdGhlbiByZXR1cm4gZmFpbHVyZS5cbiAgLy8gaHR0cHM6Ly9taW1lc25pZmYuc3BlYy53aGF0d2cub3JnLyNodHRwLXRva2VuLWNvZGUtcG9pbnRcbiAgaWYgKHR5cGUubGVuZ3RoID09PSAwIHx8ICFIVFRQX1RPS0VOX0NPREVQT0lOVFMudGVzdCh0eXBlKSkge1xuICAgIHJldHVybiAnZmFpbHVyZSdcbiAgfVxuXG4gIC8vIDUuIElmIHBvc2l0aW9uIGlzIHBhc3QgdGhlIGVuZCBvZiBpbnB1dCwgdGhlbiByZXR1cm5cbiAgLy8gZmFpbHVyZVxuICBpZiAocG9zaXRpb24ucG9zaXRpb24gPiBpbnB1dC5sZW5ndGgpIHtcbiAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gIH1cblxuICAvLyA2LiBBZHZhbmNlIHBvc2l0aW9uIGJ5IDEuIChUaGlzIHNraXBzIHBhc3QgVSswMDJGICgvKS4pXG4gIHBvc2l0aW9uLnBvc2l0aW9uKytcblxuICAvLyA3LiBMZXQgc3VidHlwZSBiZSB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmcgYSBzZXF1ZW5jZSBvZlxuICAvLyBjb2RlIHBvaW50cyB0aGF0IGFyZSBub3QgVSswMDNCICg7KSBmcm9tIGlucHV0LCBnaXZlblxuICAvLyBwb3NpdGlvbi5cbiAgbGV0IHN1YnR5cGUgPSBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzRmFzdChcbiAgICAnOycsXG4gICAgaW5wdXQsXG4gICAgcG9zaXRpb25cbiAgKVxuXG4gIC8vIDguIFJlbW92ZSBhbnkgdHJhaWxpbmcgSFRUUCB3aGl0ZXNwYWNlIGZyb20gc3VidHlwZS5cbiAgc3VidHlwZSA9IHJlbW92ZUhUVFBXaGl0ZXNwYWNlKHN1YnR5cGUsIGZhbHNlLCB0cnVlKVxuXG4gIC8vIDkuIElmIHN1YnR5cGUgaXMgdGhlIGVtcHR5IHN0cmluZyBvciBkb2VzIG5vdCBzb2xlbHlcbiAgLy8gY29udGFpbiBIVFRQIHRva2VuIGNvZGUgcG9pbnRzLCB0aGVuIHJldHVybiBmYWlsdXJlLlxuICBpZiAoc3VidHlwZS5sZW5ndGggPT09IDAgfHwgIUhUVFBfVE9LRU5fQ09ERVBPSU5UUy50ZXN0KHN1YnR5cGUpKSB7XG4gICAgcmV0dXJuICdmYWlsdXJlJ1xuICB9XG5cbiAgY29uc3QgdHlwZUxvd2VyY2FzZSA9IHR5cGUudG9Mb3dlckNhc2UoKVxuICBjb25zdCBzdWJ0eXBlTG93ZXJjYXNlID0gc3VidHlwZS50b0xvd2VyQ2FzZSgpXG5cbiAgLy8gMTAuIExldCBtaW1lVHlwZSBiZSBhIG5ldyBNSU1FIHR5cGUgcmVjb3JkIHdob3NlIHR5cGVcbiAgLy8gaXMgdHlwZSwgaW4gQVNDSUkgbG93ZXJjYXNlLCBhbmQgc3VidHlwZSBpcyBzdWJ0eXBlLFxuICAvLyBpbiBBU0NJSSBsb3dlcmNhc2UuXG4gIC8vIGh0dHBzOi8vbWltZXNuaWZmLnNwZWMud2hhdHdnLm9yZy8jbWltZS10eXBlXG4gIGNvbnN0IG1pbWVUeXBlID0ge1xuICAgIHR5cGU6IHR5cGVMb3dlcmNhc2UsXG4gICAgc3VidHlwZTogc3VidHlwZUxvd2VyY2FzZSxcbiAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHN0cmluZz59ICovXG4gICAgcGFyYW1ldGVyczogbmV3IE1hcCgpLFxuICAgIC8vIGh0dHBzOi8vbWltZXNuaWZmLnNwZWMud2hhdHdnLm9yZy8jbWltZS10eXBlLWVzc2VuY2VcbiAgICBlc3NlbmNlOiBgJHt0eXBlTG93ZXJjYXNlfS8ke3N1YnR5cGVMb3dlcmNhc2V9YFxuICB9XG5cbiAgLy8gMTEuIFdoaWxlIHBvc2l0aW9uIGlzIG5vdCBwYXN0IHRoZSBlbmQgb2YgaW5wdXQ6XG4gIHdoaWxlIChwb3NpdGlvbi5wb3NpdGlvbiA8IGlucHV0Lmxlbmd0aCkge1xuICAgIC8vIDEuIEFkdmFuY2UgcG9zaXRpb24gYnkgMS4gKFRoaXMgc2tpcHMgcGFzdCBVKzAwM0IgKDspLilcbiAgICBwb3NpdGlvbi5wb3NpdGlvbisrXG5cbiAgICAvLyAyLiBDb2xsZWN0IGEgc2VxdWVuY2Ugb2YgY29kZSBwb2ludHMgdGhhdCBhcmUgSFRUUFxuICAgIC8vIHdoaXRlc3BhY2UgZnJvbSBpbnB1dCBnaXZlbiBwb3NpdGlvbi5cbiAgICBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzKFxuICAgICAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtd2hpdGVzcGFjZVxuICAgICAgY2hhciA9PiBIVFRQX1dISVRFU1BBQ0VfUkVHRVgudGVzdChjaGFyKSxcbiAgICAgIGlucHV0LFxuICAgICAgcG9zaXRpb25cbiAgICApXG5cbiAgICAvLyAzLiBMZXQgcGFyYW1ldGVyTmFtZSBiZSB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmcgYVxuICAgIC8vIHNlcXVlbmNlIG9mIGNvZGUgcG9pbnRzIHRoYXQgYXJlIG5vdCBVKzAwM0IgKDspXG4gICAgLy8gb3IgVSswMDNEICg9KSBmcm9tIGlucHV0LCBnaXZlbiBwb3NpdGlvbi5cbiAgICBsZXQgcGFyYW1ldGVyTmFtZSA9IGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHMoXG4gICAgICAoY2hhcikgPT4gY2hhciAhPT0gJzsnICYmIGNoYXIgIT09ICc9JyxcbiAgICAgIGlucHV0LFxuICAgICAgcG9zaXRpb25cbiAgICApXG5cbiAgICAvLyA0LiBTZXQgcGFyYW1ldGVyTmFtZSB0byBwYXJhbWV0ZXJOYW1lLCBpbiBBU0NJSVxuICAgIC8vIGxvd2VyY2FzZS5cbiAgICBwYXJhbWV0ZXJOYW1lID0gcGFyYW1ldGVyTmFtZS50b0xvd2VyQ2FzZSgpXG5cbiAgICAvLyA1LiBJZiBwb3NpdGlvbiBpcyBub3QgcGFzdCB0aGUgZW5kIG9mIGlucHV0LCB0aGVuOlxuICAgIGlmIChwb3NpdGlvbi5wb3NpdGlvbiA8IGlucHV0Lmxlbmd0aCkge1xuICAgICAgLy8gMS4gSWYgdGhlIGNvZGUgcG9pbnQgYXQgcG9zaXRpb24gd2l0aGluIGlucHV0IGlzXG4gICAgICAvLyBVKzAwM0IgKDspLCB0aGVuIGNvbnRpbnVlLlxuICAgICAgaWYgKGlucHV0W3Bvc2l0aW9uLnBvc2l0aW9uXSA9PT0gJzsnKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIEFkdmFuY2UgcG9zaXRpb24gYnkgMS4gKFRoaXMgc2tpcHMgcGFzdCBVKzAwM0QgKD0pLilcbiAgICAgIHBvc2l0aW9uLnBvc2l0aW9uKytcbiAgICB9XG5cbiAgICAvLyA2LiBJZiBwb3NpdGlvbiBpcyBwYXN0IHRoZSBlbmQgb2YgaW5wdXQsIHRoZW4gYnJlYWsuXG4gICAgaWYgKHBvc2l0aW9uLnBvc2l0aW9uID4gaW5wdXQubGVuZ3RoKSB7XG4gICAgICBicmVha1xuICAgIH1cblxuICAgIC8vIDcuIExldCBwYXJhbWV0ZXJWYWx1ZSBiZSBudWxsLlxuICAgIGxldCBwYXJhbWV0ZXJWYWx1ZSA9IG51bGxcblxuICAgIC8vIDguIElmIHRoZSBjb2RlIHBvaW50IGF0IHBvc2l0aW9uIHdpdGhpbiBpbnB1dCBpc1xuICAgIC8vIFUrMDAyMiAoXCIpLCB0aGVuOlxuICAgIGlmIChpbnB1dFtwb3NpdGlvbi5wb3NpdGlvbl0gPT09ICdcIicpIHtcbiAgICAgIC8vIDEuIFNldCBwYXJhbWV0ZXJWYWx1ZSB0byB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmdcbiAgICAgIC8vIGFuIEhUVFAgcXVvdGVkIHN0cmluZyBmcm9tIGlucHV0LCBnaXZlbiBwb3NpdGlvblxuICAgICAgLy8gYW5kIHRoZSBleHRyYWN0LXZhbHVlIGZsYWcuXG4gICAgICBwYXJhbWV0ZXJWYWx1ZSA9IGNvbGxlY3RBbkhUVFBRdW90ZWRTdHJpbmcoaW5wdXQsIHBvc2l0aW9uLCB0cnVlKVxuXG4gICAgICAvLyAyLiBDb2xsZWN0IGEgc2VxdWVuY2Ugb2YgY29kZSBwb2ludHMgdGhhdCBhcmUgbm90XG4gICAgICAvLyBVKzAwM0IgKDspIGZyb20gaW5wdXQsIGdpdmVuIHBvc2l0aW9uLlxuICAgICAgY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50c0Zhc3QoXG4gICAgICAgICc7JyxcbiAgICAgICAgaW5wdXQsXG4gICAgICAgIHBvc2l0aW9uXG4gICAgICApXG5cbiAgICAvLyA5LiBPdGhlcndpc2U6XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDEuIFNldCBwYXJhbWV0ZXJWYWx1ZSB0byB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmdcbiAgICAgIC8vIGEgc2VxdWVuY2Ugb2YgY29kZSBwb2ludHMgdGhhdCBhcmUgbm90IFUrMDAzQiAoOylcbiAgICAgIC8vIGZyb20gaW5wdXQsIGdpdmVuIHBvc2l0aW9uLlxuICAgICAgcGFyYW1ldGVyVmFsdWUgPSBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzRmFzdChcbiAgICAgICAgJzsnLFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgcG9zaXRpb25cbiAgICAgIClcblxuICAgICAgLy8gMi4gUmVtb3ZlIGFueSB0cmFpbGluZyBIVFRQIHdoaXRlc3BhY2UgZnJvbSBwYXJhbWV0ZXJWYWx1ZS5cbiAgICAgIHBhcmFtZXRlclZhbHVlID0gcmVtb3ZlSFRUUFdoaXRlc3BhY2UocGFyYW1ldGVyVmFsdWUsIGZhbHNlLCB0cnVlKVxuXG4gICAgICAvLyAzLiBJZiBwYXJhbWV0ZXJWYWx1ZSBpcyB0aGUgZW1wdHkgc3RyaW5nLCB0aGVuIGNvbnRpbnVlLlxuICAgICAgaWYgKHBhcmFtZXRlclZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDEwLiBJZiBhbGwgb2YgdGhlIGZvbGxvd2luZyBhcmUgdHJ1ZVxuICAgIC8vIC0gcGFyYW1ldGVyTmFtZSBpcyBub3QgdGhlIGVtcHR5IHN0cmluZ1xuICAgIC8vIC0gcGFyYW1ldGVyTmFtZSBzb2xlbHkgY29udGFpbnMgSFRUUCB0b2tlbiBjb2RlIHBvaW50c1xuICAgIC8vIC0gcGFyYW1ldGVyVmFsdWUgc29sZWx5IGNvbnRhaW5zIEhUVFAgcXVvdGVkLXN0cmluZyB0b2tlbiBjb2RlIHBvaW50c1xuICAgIC8vIC0gbWltZVR5cGXigJlzIHBhcmFtZXRlcnNbcGFyYW1ldGVyTmFtZV0gZG9lcyBub3QgZXhpc3RcbiAgICAvLyB0aGVuIHNldCBtaW1lVHlwZeKAmXMgcGFyYW1ldGVyc1twYXJhbWV0ZXJOYW1lXSB0byBwYXJhbWV0ZXJWYWx1ZS5cbiAgICBpZiAoXG4gICAgICBwYXJhbWV0ZXJOYW1lLmxlbmd0aCAhPT0gMCAmJlxuICAgICAgSFRUUF9UT0tFTl9DT0RFUE9JTlRTLnRlc3QocGFyYW1ldGVyTmFtZSkgJiZcbiAgICAgIChwYXJhbWV0ZXJWYWx1ZS5sZW5ndGggPT09IDAgfHwgSFRUUF9RVU9URURfU1RSSU5HX1RPS0VOUy50ZXN0KHBhcmFtZXRlclZhbHVlKSkgJiZcbiAgICAgICFtaW1lVHlwZS5wYXJhbWV0ZXJzLmhhcyhwYXJhbWV0ZXJOYW1lKVxuICAgICkge1xuICAgICAgbWltZVR5cGUucGFyYW1ldGVycy5zZXQocGFyYW1ldGVyTmFtZSwgcGFyYW1ldGVyVmFsdWUpXG4gICAgfVxuICB9XG5cbiAgLy8gMTIuIFJldHVybiBtaW1lVHlwZS5cbiAgcmV0dXJuIG1pbWVUeXBlXG59XG5cbi8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNmb3JnaXZpbmctYmFzZTY0LWRlY29kZVxuLyoqIEBwYXJhbSB7c3RyaW5nfSBkYXRhICovXG5mdW5jdGlvbiBmb3JnaXZpbmdCYXNlNjQgKGRhdGEpIHtcbiAgLy8gMS4gUmVtb3ZlIGFsbCBBU0NJSSB3aGl0ZXNwYWNlIGZyb20gZGF0YS5cbiAgZGF0YSA9IGRhdGEucmVwbGFjZSgvW1xcdTAwMDlcXHUwMDBBXFx1MDAwQ1xcdTAwMERcXHUwMDIwXS9nLCAnJykgIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcblxuICAvLyAyLiBJZiBkYXRh4oCZcyBjb2RlIHBvaW50IGxlbmd0aCBkaXZpZGVzIGJ5IDQgbGVhdmluZ1xuICAvLyBubyByZW1haW5kZXIsIHRoZW46XG4gIGlmIChkYXRhLmxlbmd0aCAlIDQgPT09IDApIHtcbiAgICAvLyAxLiBJZiBkYXRhIGVuZHMgd2l0aCBvbmUgb3IgdHdvIFUrMDAzRCAoPSkgY29kZSBwb2ludHMsXG4gICAgLy8gdGhlbiByZW1vdmUgdGhlbSBmcm9tIGRhdGEuXG4gICAgZGF0YSA9IGRhdGEucmVwbGFjZSgvPT89JC8sICcnKVxuICB9XG5cbiAgLy8gMy4gSWYgZGF0YeKAmXMgY29kZSBwb2ludCBsZW5ndGggZGl2aWRlcyBieSA0IGxlYXZpbmdcbiAgLy8gYSByZW1haW5kZXIgb2YgMSwgdGhlbiByZXR1cm4gZmFpbHVyZS5cbiAgaWYgKGRhdGEubGVuZ3RoICUgNCA9PT0gMSkge1xuICAgIHJldHVybiAnZmFpbHVyZSdcbiAgfVxuXG4gIC8vIDQuIElmIGRhdGEgY29udGFpbnMgYSBjb2RlIHBvaW50IHRoYXQgaXMgbm90IG9uZSBvZlxuICAvLyAgVSswMDJCICgrKVxuICAvLyAgVSswMDJGICgvKVxuICAvLyAgQVNDSUkgYWxwaGFudW1lcmljXG4gIC8vIHRoZW4gcmV0dXJuIGZhaWx1cmUuXG4gIGlmICgvW14rLzAtOUEtWmEtel0vLnRlc3QoZGF0YSkpIHtcbiAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gIH1cblxuICBjb25zdCBiaW5hcnkgPSBhdG9iKGRhdGEpXG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYmluYXJ5Lmxlbmd0aClcblxuICBmb3IgKGxldCBieXRlID0gMDsgYnl0ZSA8IGJpbmFyeS5sZW5ndGg7IGJ5dGUrKykge1xuICAgIGJ5dGVzW2J5dGVdID0gYmluYXJ5LmNoYXJDb2RlQXQoYnl0ZSlcbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29sbGVjdC1hbi1odHRwLXF1b3RlZC1zdHJpbmdcbi8vIHRlc3RzOiBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZXhhbXBsZS1odHRwLXF1b3RlZC1zdHJpbmdcbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0XG4gKiBAcGFyYW0ge3sgcG9zaXRpb246IG51bWJlciB9fSBwb3NpdGlvblxuICogQHBhcmFtIHtib29sZWFuP30gZXh0cmFjdFZhbHVlXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RBbkhUVFBRdW90ZWRTdHJpbmcgKGlucHV0LCBwb3NpdGlvbiwgZXh0cmFjdFZhbHVlKSB7XG4gIC8vIDEuIExldCBwb3NpdGlvblN0YXJ0IGJlIHBvc2l0aW9uLlxuICBjb25zdCBwb3NpdGlvblN0YXJ0ID0gcG9zaXRpb24ucG9zaXRpb25cblxuICAvLyAyLiBMZXQgdmFsdWUgYmUgdGhlIGVtcHR5IHN0cmluZy5cbiAgbGV0IHZhbHVlID0gJydcblxuICAvLyAzLiBBc3NlcnQ6IHRoZSBjb2RlIHBvaW50IGF0IHBvc2l0aW9uIHdpdGhpbiBpbnB1dFxuICAvLyBpcyBVKzAwMjIgKFwiKS5cbiAgYXNzZXJ0KGlucHV0W3Bvc2l0aW9uLnBvc2l0aW9uXSA9PT0gJ1wiJylcblxuICAvLyA0LiBBZHZhbmNlIHBvc2l0aW9uIGJ5IDEuXG4gIHBvc2l0aW9uLnBvc2l0aW9uKytcblxuICAvLyA1LiBXaGlsZSB0cnVlOlxuICB3aGlsZSAodHJ1ZSkge1xuICAgIC8vIDEuIEFwcGVuZCB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmcgYSBzZXF1ZW5jZSBvZiBjb2RlIHBvaW50c1xuICAgIC8vIHRoYXQgYXJlIG5vdCBVKzAwMjIgKFwiKSBvciBVKzAwNUMgKFxcKSBmcm9tIGlucHV0LCBnaXZlblxuICAgIC8vIHBvc2l0aW9uLCB0byB2YWx1ZS5cbiAgICB2YWx1ZSArPSBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzKFxuICAgICAgKGNoYXIpID0+IGNoYXIgIT09ICdcIicgJiYgY2hhciAhPT0gJ1xcXFwnLFxuICAgICAgaW5wdXQsXG4gICAgICBwb3NpdGlvblxuICAgIClcblxuICAgIC8vIDIuIElmIHBvc2l0aW9uIGlzIHBhc3QgdGhlIGVuZCBvZiBpbnB1dCwgdGhlbiBicmVhay5cbiAgICBpZiAocG9zaXRpb24ucG9zaXRpb24gPj0gaW5wdXQubGVuZ3RoKSB7XG4gICAgICBicmVha1xuICAgIH1cblxuICAgIC8vIDMuIExldCBxdW90ZU9yQmFja3NsYXNoIGJlIHRoZSBjb2RlIHBvaW50IGF0IHBvc2l0aW9uIHdpdGhpblxuICAgIC8vIGlucHV0LlxuICAgIGNvbnN0IHF1b3RlT3JCYWNrc2xhc2ggPSBpbnB1dFtwb3NpdGlvbi5wb3NpdGlvbl1cblxuICAgIC8vIDQuIEFkdmFuY2UgcG9zaXRpb24gYnkgMS5cbiAgICBwb3NpdGlvbi5wb3NpdGlvbisrXG5cbiAgICAvLyA1LiBJZiBxdW90ZU9yQmFja3NsYXNoIGlzIFUrMDA1QyAoXFwpLCB0aGVuOlxuICAgIGlmIChxdW90ZU9yQmFja3NsYXNoID09PSAnXFxcXCcpIHtcbiAgICAgIC8vIDEuIElmIHBvc2l0aW9uIGlzIHBhc3QgdGhlIGVuZCBvZiBpbnB1dCwgdGhlbiBhcHBlbmRcbiAgICAgIC8vIFUrMDA1QyAoXFwpIHRvIHZhbHVlIGFuZCBicmVhay5cbiAgICAgIGlmIChwb3NpdGlvbi5wb3NpdGlvbiA+PSBpbnB1dC5sZW5ndGgpIHtcbiAgICAgICAgdmFsdWUgKz0gJ1xcXFwnXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIEFwcGVuZCB0aGUgY29kZSBwb2ludCBhdCBwb3NpdGlvbiB3aXRoaW4gaW5wdXQgdG8gdmFsdWUuXG4gICAgICB2YWx1ZSArPSBpbnB1dFtwb3NpdGlvbi5wb3NpdGlvbl1cblxuICAgICAgLy8gMy4gQWR2YW5jZSBwb3NpdGlvbiBieSAxLlxuICAgICAgcG9zaXRpb24ucG9zaXRpb24rK1xuXG4gICAgLy8gNi4gT3RoZXJ3aXNlOlxuICAgIH0gZWxzZSB7XG4gICAgICAvLyAxLiBBc3NlcnQ6IHF1b3RlT3JCYWNrc2xhc2ggaXMgVSswMDIyIChcIikuXG4gICAgICBhc3NlcnQocXVvdGVPckJhY2tzbGFzaCA9PT0gJ1wiJylcblxuICAgICAgLy8gMi4gQnJlYWsuXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIC8vIDYuIElmIHRoZSBleHRyYWN0LXZhbHVlIGZsYWcgaXMgc2V0LCB0aGVuIHJldHVybiB2YWx1ZS5cbiAgaWYgKGV4dHJhY3RWYWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLy8gNy4gUmV0dXJuIHRoZSBjb2RlIHBvaW50cyBmcm9tIHBvc2l0aW9uU3RhcnQgdG8gcG9zaXRpb24sXG4gIC8vIGluY2x1c2l2ZSwgd2l0aGluIGlucHV0LlxuICByZXR1cm4gaW5wdXQuc2xpY2UocG9zaXRpb25TdGFydCwgcG9zaXRpb24ucG9zaXRpb24pXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL21pbWVzbmlmZi5zcGVjLndoYXR3Zy5vcmcvI3NlcmlhbGl6ZS1hLW1pbWUtdHlwZVxuICovXG5mdW5jdGlvbiBzZXJpYWxpemVBTWltZVR5cGUgKG1pbWVUeXBlKSB7XG4gIGFzc2VydChtaW1lVHlwZSAhPT0gJ2ZhaWx1cmUnKVxuICBjb25zdCB7IHBhcmFtZXRlcnMsIGVzc2VuY2UgfSA9IG1pbWVUeXBlXG5cbiAgLy8gMS4gTGV0IHNlcmlhbGl6YXRpb24gYmUgdGhlIGNvbmNhdGVuYXRpb24gb2YgbWltZVR5cGXigJlzXG4gIC8vICAgIHR5cGUsIFUrMDAyRiAoLyksIGFuZCBtaW1lVHlwZeKAmXMgc3VidHlwZS5cbiAgbGV0IHNlcmlhbGl6YXRpb24gPSBlc3NlbmNlXG5cbiAgLy8gMi4gRm9yIGVhY2ggbmFtZSDihpIgdmFsdWUgb2YgbWltZVR5cGXigJlzIHBhcmFtZXRlcnM6XG4gIGZvciAobGV0IFtuYW1lLCB2YWx1ZV0gb2YgcGFyYW1ldGVycy5lbnRyaWVzKCkpIHtcbiAgICAvLyAxLiBBcHBlbmQgVSswMDNCICg7KSB0byBzZXJpYWxpemF0aW9uLlxuICAgIHNlcmlhbGl6YXRpb24gKz0gJzsnXG5cbiAgICAvLyAyLiBBcHBlbmQgbmFtZSB0byBzZXJpYWxpemF0aW9uLlxuICAgIHNlcmlhbGl6YXRpb24gKz0gbmFtZVxuXG4gICAgLy8gMy4gQXBwZW5kIFUrMDAzRCAoPSkgdG8gc2VyaWFsaXphdGlvbi5cbiAgICBzZXJpYWxpemF0aW9uICs9ICc9J1xuXG4gICAgLy8gNC4gSWYgdmFsdWUgZG9lcyBub3Qgc29sZWx5IGNvbnRhaW4gSFRUUCB0b2tlbiBjb2RlXG4gICAgLy8gICAgcG9pbnRzIG9yIHZhbHVlIGlzIHRoZSBlbXB0eSBzdHJpbmcsIHRoZW46XG4gICAgaWYgKCFIVFRQX1RPS0VOX0NPREVQT0lOVFMudGVzdCh2YWx1ZSkpIHtcbiAgICAgIC8vIDEuIFByZWNlZGUgZWFjaCBvY2N1cmVuY2Ugb2YgVSswMDIyIChcIikgb3JcbiAgICAgIC8vICAgIFUrMDA1QyAoXFwpIGluIHZhbHVlIHdpdGggVSswMDVDIChcXCkuXG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoLyhcXFxcfFwiKS9nLCAnXFxcXCQxJylcblxuICAgICAgLy8gMi4gUHJlcGVuZCBVKzAwMjIgKFwiKSB0byB2YWx1ZS5cbiAgICAgIHZhbHVlID0gJ1wiJyArIHZhbHVlXG5cbiAgICAgIC8vIDMuIEFwcGVuZCBVKzAwMjIgKFwiKSB0byB2YWx1ZS5cbiAgICAgIHZhbHVlICs9ICdcIidcbiAgICB9XG5cbiAgICAvLyA1LiBBcHBlbmQgdmFsdWUgdG8gc2VyaWFsaXphdGlvbi5cbiAgICBzZXJpYWxpemF0aW9uICs9IHZhbHVlXG4gIH1cblxuICAvLyAzLiBSZXR1cm4gc2VyaWFsaXphdGlvbi5cbiAgcmV0dXJuIHNlcmlhbGl6YXRpb25cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNodHRwLXdoaXRlc3BhY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGFyXG4gKi9cbmZ1bmN0aW9uIGlzSFRUUFdoaXRlU3BhY2UgKGNoYXIpIHtcbiAgcmV0dXJuIGNoYXIgPT09ICdcXHInIHx8IGNoYXIgPT09ICdcXG4nIHx8IGNoYXIgPT09ICdcXHQnIHx8IGNoYXIgPT09ICcgJ1xufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtd2hpdGVzcGFjZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICovXG5mdW5jdGlvbiByZW1vdmVIVFRQV2hpdGVzcGFjZSAoc3RyLCBsZWFkaW5nID0gdHJ1ZSwgdHJhaWxpbmcgPSB0cnVlKSB7XG4gIGxldCBsZWFkID0gMFxuICBsZXQgdHJhaWwgPSBzdHIubGVuZ3RoIC0gMVxuXG4gIGlmIChsZWFkaW5nKSB7XG4gICAgZm9yICg7IGxlYWQgPCBzdHIubGVuZ3RoICYmIGlzSFRUUFdoaXRlU3BhY2Uoc3RyW2xlYWRdKTsgbGVhZCsrKTtcbiAgfVxuXG4gIGlmICh0cmFpbGluZykge1xuICAgIGZvciAoOyB0cmFpbCA+IDAgJiYgaXNIVFRQV2hpdGVTcGFjZShzdHJbdHJhaWxdKTsgdHJhaWwtLSk7XG4gIH1cblxuICByZXR1cm4gc3RyLnNsaWNlKGxlYWQsIHRyYWlsICsgMSlcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNhc2NpaS13aGl0ZXNwYWNlXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hhclxuICovXG5mdW5jdGlvbiBpc0FTQ0lJV2hpdGVzcGFjZSAoY2hhcikge1xuICByZXR1cm4gY2hhciA9PT0gJ1xccicgfHwgY2hhciA9PT0gJ1xcbicgfHwgY2hhciA9PT0gJ1xcdCcgfHwgY2hhciA9PT0gJ1xcZicgfHwgY2hhciA9PT0gJyAnXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jc3RyaXAtbGVhZGluZy1hbmQtdHJhaWxpbmctYXNjaWktd2hpdGVzcGFjZVxuICovXG5mdW5jdGlvbiByZW1vdmVBU0NJSVdoaXRlc3BhY2UgKHN0ciwgbGVhZGluZyA9IHRydWUsIHRyYWlsaW5nID0gdHJ1ZSkge1xuICBsZXQgbGVhZCA9IDBcbiAgbGV0IHRyYWlsID0gc3RyLmxlbmd0aCAtIDFcblxuICBpZiAobGVhZGluZykge1xuICAgIGZvciAoOyBsZWFkIDwgc3RyLmxlbmd0aCAmJiBpc0FTQ0lJV2hpdGVzcGFjZShzdHJbbGVhZF0pOyBsZWFkKyspO1xuICB9XG5cbiAgaWYgKHRyYWlsaW5nKSB7XG4gICAgZm9yICg7IHRyYWlsID4gMCAmJiBpc0FTQ0lJV2hpdGVzcGFjZShzdHJbdHJhaWxdKTsgdHJhaWwtLSk7XG4gIH1cblxuICByZXR1cm4gc3RyLnNsaWNlKGxlYWQsIHRyYWlsICsgMSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRhdGFVUkxQcm9jZXNzb3IsXG4gIFVSTFNlcmlhbGl6ZXIsXG4gIGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHMsXG4gIGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0LFxuICBzdHJpbmdQZXJjZW50RGVjb2RlLFxuICBwYXJzZU1JTUVUeXBlLFxuICBjb2xsZWN0QW5IVFRQUXVvdGVkU3RyaW5nLFxuICBzZXJpYWxpemVBTWltZVR5cGVcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IEJsb2IsIEZpbGU6IE5hdGl2ZUZpbGUgfSA9IHJlcXVpcmUoJ2J1ZmZlcicpXG5jb25zdCB7IHR5cGVzIH0gPSByZXF1aXJlKCd1dGlsJylcbmNvbnN0IHsga1N0YXRlIH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgeyBpc0Jsb2JMaWtlIH0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4vd2ViaWRsJylcbmNvbnN0IHsgcGFyc2VNSU1FVHlwZSwgc2VyaWFsaXplQU1pbWVUeXBlIH0gPSByZXF1aXJlKCcuL2RhdGFVUkwnKVxuY29uc3QgeyBrRW51bWVyYWJsZVByb3BlcnR5IH0gPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpXG5cbmNsYXNzIEZpbGUgZXh0ZW5kcyBCbG9iIHtcbiAgY29uc3RydWN0b3IgKGZpbGVCaXRzLCBmaWxlTmFtZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgLy8gVGhlIEZpbGUgY29uc3RydWN0b3IgaXMgaW52b2tlZCB3aXRoIHR3byBvciB0aHJlZSBwYXJhbWV0ZXJzLCBkZXBlbmRpbmdcbiAgICAvLyBvbiB3aGV0aGVyIHRoZSBvcHRpb25hbCBkaWN0aW9uYXJ5IHBhcmFtZXRlciBpcyB1c2VkLiBXaGVuIHRoZSBGaWxlKClcbiAgICAvLyBjb25zdHJ1Y3RvciBpcyBpbnZva2VkLCB1c2VyIGFnZW50cyBtdXN0IHJ1biB0aGUgZm9sbG93aW5nIHN0ZXBzOlxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMiwgeyBoZWFkZXI6ICdGaWxlIGNvbnN0cnVjdG9yJyB9KVxuXG4gICAgZmlsZUJpdHMgPSB3ZWJpZGwuY29udmVydGVyc1snc2VxdWVuY2U8QmxvYlBhcnQ+J10oZmlsZUJpdHMpXG4gICAgZmlsZU5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcoZmlsZU5hbWUpXG4gICAgb3B0aW9ucyA9IHdlYmlkbC5jb252ZXJ0ZXJzLkZpbGVQcm9wZXJ0eUJhZyhvcHRpb25zKVxuXG4gICAgLy8gMS4gTGV0IGJ5dGVzIGJlIHRoZSByZXN1bHQgb2YgcHJvY2Vzc2luZyBibG9iIHBhcnRzIGdpdmVuIGZpbGVCaXRzIGFuZFxuICAgIC8vIG9wdGlvbnMuXG4gICAgLy8gTm90ZTogQmxvYiBoYW5kbGVzIHRoaXMgZm9yIHVzXG5cbiAgICAvLyAyLiBMZXQgbiBiZSB0aGUgZmlsZU5hbWUgYXJndW1lbnQgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgIGNvbnN0IG4gPSBmaWxlTmFtZVxuXG4gICAgLy8gMy4gUHJvY2VzcyBGaWxlUHJvcGVydHlCYWcgZGljdGlvbmFyeSBhcmd1bWVudCBieSBydW5uaW5nIHRoZSBmb2xsb3dpbmdcbiAgICAvLyBzdWJzdGVwczpcblxuICAgIC8vICAgIDEuIElmIHRoZSB0eXBlIG1lbWJlciBpcyBwcm92aWRlZCBhbmQgaXMgbm90IHRoZSBlbXB0eSBzdHJpbmcsIGxldCB0XG4gICAgLy8gICAgYmUgc2V0IHRvIHRoZSB0eXBlIGRpY3Rpb25hcnkgbWVtYmVyLiBJZiB0IGNvbnRhaW5zIGFueSBjaGFyYWN0ZXJzXG4gICAgLy8gICAgb3V0c2lkZSB0aGUgcmFuZ2UgVSswMDIwIHRvIFUrMDA3RSwgdGhlbiBzZXQgdCB0byB0aGUgZW1wdHkgc3RyaW5nXG4gICAgLy8gICAgYW5kIHJldHVybiBmcm9tIHRoZXNlIHN1YnN0ZXBzLlxuICAgIC8vICAgIDIuIENvbnZlcnQgZXZlcnkgY2hhcmFjdGVyIGluIHQgdG8gQVNDSUkgbG93ZXJjYXNlLlxuICAgIGxldCB0ID0gb3B0aW9ucy50eXBlXG4gICAgbGV0IGRcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sYWJlbHNcbiAgICBzdWJzdGVwOiB7XG4gICAgICBpZiAodCkge1xuICAgICAgICB0ID0gcGFyc2VNSU1FVHlwZSh0KVxuXG4gICAgICAgIGlmICh0ID09PSAnZmFpbHVyZScpIHtcbiAgICAgICAgICB0ID0gJydcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbGFiZWxzXG4gICAgICAgICAgYnJlYWsgc3Vic3RlcFxuICAgICAgICB9XG5cbiAgICAgICAgdCA9IHNlcmlhbGl6ZUFNaW1lVHlwZSh0KS50b0xvd2VyQ2FzZSgpXG4gICAgICB9XG5cbiAgICAgIC8vICAgIDMuIElmIHRoZSBsYXN0TW9kaWZpZWQgbWVtYmVyIGlzIHByb3ZpZGVkLCBsZXQgZCBiZSBzZXQgdG8gdGhlXG4gICAgICAvLyAgICBsYXN0TW9kaWZpZWQgZGljdGlvbmFyeSBtZW1iZXIuIElmIGl0IGlzIG5vdCBwcm92aWRlZCwgc2V0IGQgdG8gdGhlXG4gICAgICAvLyAgICBjdXJyZW50IGRhdGUgYW5kIHRpbWUgcmVwcmVzZW50ZWQgYXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2VcbiAgICAgIC8vICAgIHRoZSBVbml4IEVwb2NoICh3aGljaCBpcyB0aGUgZXF1aXZhbGVudCBvZiBEYXRlLm5vdygpIFtFQ01BLTI2Ml0pLlxuICAgICAgZCA9IG9wdGlvbnMubGFzdE1vZGlmaWVkXG4gICAgfVxuXG4gICAgLy8gNC4gUmV0dXJuIGEgbmV3IEZpbGUgb2JqZWN0IEYgc3VjaCB0aGF0OlxuICAgIC8vIEYgcmVmZXJzIHRvIHRoZSBieXRlcyBieXRlIHNlcXVlbmNlLlxuICAgIC8vIEYuc2l6ZSBpcyBzZXQgdG8gdGhlIG51bWJlciBvZiB0b3RhbCBieXRlcyBpbiBieXRlcy5cbiAgICAvLyBGLm5hbWUgaXMgc2V0IHRvIG4uXG4gICAgLy8gRi50eXBlIGlzIHNldCB0byB0LlxuICAgIC8vIEYubGFzdE1vZGlmaWVkIGlzIHNldCB0byBkLlxuXG4gICAgc3VwZXIocHJvY2Vzc0Jsb2JQYXJ0cyhmaWxlQml0cywgb3B0aW9ucyksIHsgdHlwZTogdCB9KVxuICAgIHRoaXNba1N0YXRlXSA9IHtcbiAgICAgIG5hbWU6IG4sXG4gICAgICBsYXN0TW9kaWZpZWQ6IGQsXG4gICAgICB0eXBlOiB0XG4gICAgfVxuICB9XG5cbiAgZ2V0IG5hbWUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGUpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLm5hbWVcbiAgfVxuXG4gIGdldCBsYXN0TW9kaWZpZWQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGUpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmxhc3RNb2RpZmllZFxuICB9XG5cbiAgZ2V0IHR5cGUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGUpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLnR5cGVcbiAgfVxufVxuXG5jbGFzcyBGaWxlTGlrZSB7XG4gIGNvbnN0cnVjdG9yIChibG9iTGlrZSwgZmlsZU5hbWUsIG9wdGlvbnMgPSB7fSkge1xuICAgIC8vIFRPRE86IGFyZ3VtZW50IGlkbCB0eXBlIGNoZWNrXG5cbiAgICAvLyBUaGUgRmlsZSBjb25zdHJ1Y3RvciBpcyBpbnZva2VkIHdpdGggdHdvIG9yIHRocmVlIHBhcmFtZXRlcnMsIGRlcGVuZGluZ1xuICAgIC8vIG9uIHdoZXRoZXIgdGhlIG9wdGlvbmFsIGRpY3Rpb25hcnkgcGFyYW1ldGVyIGlzIHVzZWQuIFdoZW4gdGhlIEZpbGUoKVxuICAgIC8vIGNvbnN0cnVjdG9yIGlzIGludm9rZWQsIHVzZXIgYWdlbnRzIG11c3QgcnVuIHRoZSBmb2xsb3dpbmcgc3RlcHM6XG5cbiAgICAvLyAxLiBMZXQgYnl0ZXMgYmUgdGhlIHJlc3VsdCBvZiBwcm9jZXNzaW5nIGJsb2IgcGFydHMgZ2l2ZW4gZmlsZUJpdHMgYW5kXG4gICAgLy8gb3B0aW9ucy5cblxuICAgIC8vIDIuIExldCBuIGJlIHRoZSBmaWxlTmFtZSBhcmd1bWVudCB0byB0aGUgY29uc3RydWN0b3IuXG4gICAgY29uc3QgbiA9IGZpbGVOYW1lXG5cbiAgICAvLyAzLiBQcm9jZXNzIEZpbGVQcm9wZXJ0eUJhZyBkaWN0aW9uYXJ5IGFyZ3VtZW50IGJ5IHJ1bm5pbmcgdGhlIGZvbGxvd2luZ1xuICAgIC8vIHN1YnN0ZXBzOlxuXG4gICAgLy8gICAgMS4gSWYgdGhlIHR5cGUgbWVtYmVyIGlzIHByb3ZpZGVkIGFuZCBpcyBub3QgdGhlIGVtcHR5IHN0cmluZywgbGV0IHRcbiAgICAvLyAgICBiZSBzZXQgdG8gdGhlIHR5cGUgZGljdGlvbmFyeSBtZW1iZXIuIElmIHQgY29udGFpbnMgYW55IGNoYXJhY3RlcnNcbiAgICAvLyAgICBvdXRzaWRlIHRoZSByYW5nZSBVKzAwMjAgdG8gVSswMDdFLCB0aGVuIHNldCB0IHRvIHRoZSBlbXB0eSBzdHJpbmdcbiAgICAvLyAgICBhbmQgcmV0dXJuIGZyb20gdGhlc2Ugc3Vic3RlcHMuXG4gICAgLy8gICAgVE9ET1xuICAgIGNvbnN0IHQgPSBvcHRpb25zLnR5cGVcblxuICAgIC8vICAgIDIuIENvbnZlcnQgZXZlcnkgY2hhcmFjdGVyIGluIHQgdG8gQVNDSUkgbG93ZXJjYXNlLlxuICAgIC8vICAgIFRPRE9cblxuICAgIC8vICAgIDMuIElmIHRoZSBsYXN0TW9kaWZpZWQgbWVtYmVyIGlzIHByb3ZpZGVkLCBsZXQgZCBiZSBzZXQgdG8gdGhlXG4gICAgLy8gICAgbGFzdE1vZGlmaWVkIGRpY3Rpb25hcnkgbWVtYmVyLiBJZiBpdCBpcyBub3QgcHJvdmlkZWQsIHNldCBkIHRvIHRoZVxuICAgIC8vICAgIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSByZXByZXNlbnRlZCBhcyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZVxuICAgIC8vICAgIHRoZSBVbml4IEVwb2NoICh3aGljaCBpcyB0aGUgZXF1aXZhbGVudCBvZiBEYXRlLm5vdygpIFtFQ01BLTI2Ml0pLlxuICAgIGNvbnN0IGQgPSBvcHRpb25zLmxhc3RNb2RpZmllZCA/PyBEYXRlLm5vdygpXG5cbiAgICAvLyA0LiBSZXR1cm4gYSBuZXcgRmlsZSBvYmplY3QgRiBzdWNoIHRoYXQ6XG4gICAgLy8gRiByZWZlcnMgdG8gdGhlIGJ5dGVzIGJ5dGUgc2VxdWVuY2UuXG4gICAgLy8gRi5zaXplIGlzIHNldCB0byB0aGUgbnVtYmVyIG9mIHRvdGFsIGJ5dGVzIGluIGJ5dGVzLlxuICAgIC8vIEYubmFtZSBpcyBzZXQgdG8gbi5cbiAgICAvLyBGLnR5cGUgaXMgc2V0IHRvIHQuXG4gICAgLy8gRi5sYXN0TW9kaWZpZWQgaXMgc2V0IHRvIGQuXG5cbiAgICB0aGlzW2tTdGF0ZV0gPSB7XG4gICAgICBibG9iTGlrZSxcbiAgICAgIG5hbWU6IG4sXG4gICAgICB0eXBlOiB0LFxuICAgICAgbGFzdE1vZGlmaWVkOiBkXG4gICAgfVxuICB9XG5cbiAgc3RyZWFtICguLi5hcmdzKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZUxpa2UpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmJsb2JMaWtlLnN0cmVhbSguLi5hcmdzKVxuICB9XG5cbiAgYXJyYXlCdWZmZXIgKC4uLmFyZ3MpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlTGlrZSlcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uYmxvYkxpa2UuYXJyYXlCdWZmZXIoLi4uYXJncylcbiAgfVxuXG4gIHNsaWNlICguLi5hcmdzKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZUxpa2UpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmJsb2JMaWtlLnNsaWNlKC4uLmFyZ3MpXG4gIH1cblxuICB0ZXh0ICguLi5hcmdzKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZUxpa2UpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmJsb2JMaWtlLnRleHQoLi4uYXJncylcbiAgfVxuXG4gIGdldCBzaXplICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlTGlrZSlcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uYmxvYkxpa2Uuc2l6ZVxuICB9XG5cbiAgZ2V0IHR5cGUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVMaWtlKVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5ibG9iTGlrZS50eXBlXG4gIH1cblxuICBnZXQgbmFtZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZUxpa2UpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLm5hbWVcbiAgfVxuXG4gIGdldCBsYXN0TW9kaWZpZWQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVMaWtlKVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5sYXN0TW9kaWZpZWRcbiAgfVxuXG4gIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSAoKSB7XG4gICAgcmV0dXJuICdGaWxlJ1xuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEZpbGUucHJvdG90eXBlLCB7XG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7XG4gICAgdmFsdWU6ICdGaWxlJyxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSxcbiAgbmFtZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgbGFzdE1vZGlmaWVkOiBrRW51bWVyYWJsZVByb3BlcnR5XG59KVxuXG53ZWJpZGwuY29udmVydGVycy5CbG9iID0gd2ViaWRsLmludGVyZmFjZUNvbnZlcnRlcihCbG9iKVxuXG53ZWJpZGwuY29udmVydGVycy5CbG9iUGFydCA9IGZ1bmN0aW9uIChWLCBvcHRzKSB7XG4gIGlmICh3ZWJpZGwudXRpbC5UeXBlKFYpID09PSAnT2JqZWN0Jykge1xuICAgIGlmIChpc0Jsb2JMaWtlKFYpKSB7XG4gICAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuQmxvYihWLCB7IHN0cmljdDogZmFsc2UgfSlcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBBcnJheUJ1ZmZlci5pc1ZpZXcoVikgfHxcbiAgICAgIHR5cGVzLmlzQW55QXJyYXlCdWZmZXIoVilcbiAgICApIHtcbiAgICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5CdWZmZXJTb3VyY2UoViwgb3B0cylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKFYsIG9wdHMpXG59XG5cbndlYmlkbC5jb252ZXJ0ZXJzWydzZXF1ZW5jZTxCbG9iUGFydD4nXSA9IHdlYmlkbC5zZXF1ZW5jZUNvbnZlcnRlcihcbiAgd2ViaWRsLmNvbnZlcnRlcnMuQmxvYlBhcnRcbilcblxuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0ZpbGVBUEkvI2Rmbi1GaWxlUHJvcGVydHlCYWdcbndlYmlkbC5jb252ZXJ0ZXJzLkZpbGVQcm9wZXJ0eUJhZyA9IHdlYmlkbC5kaWN0aW9uYXJ5Q29udmVydGVyKFtcbiAge1xuICAgIGtleTogJ2xhc3RNb2RpZmllZCcsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVyc1snbG9uZyBsb25nJ10sXG4gICAgZ2V0IGRlZmF1bHRWYWx1ZSAoKSB7XG4gICAgICByZXR1cm4gRGF0ZS5ub3coKVxuICAgIH1cbiAgfSxcbiAge1xuICAgIGtleTogJ3R5cGUnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZTogJydcbiAgfSxcbiAge1xuICAgIGtleTogJ2VuZGluZ3MnLFxuICAgIGNvbnZlcnRlcjogKHZhbHVlKSA9PiB7XG4gICAgICB2YWx1ZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyh2YWx1ZSlcbiAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKVxuXG4gICAgICBpZiAodmFsdWUgIT09ICduYXRpdmUnKSB7XG4gICAgICAgIHZhbHVlID0gJ3RyYW5zcGFyZW50J1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9LFxuICAgIGRlZmF1bHRWYWx1ZTogJ3RyYW5zcGFyZW50J1xuICB9XG5dKVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL0ZpbGVBUEkvI3Byb2Nlc3MtYmxvYi1wYXJ0c1xuICogQHBhcmFtIHsoTm9kZUpTLlR5cGVkQXJyYXl8QmxvYnxzdHJpbmcpW119IHBhcnRzXG4gKiBAcGFyYW0ge3sgdHlwZTogc3RyaW5nLCBlbmRpbmdzOiBzdHJpbmcgfX0gb3B0aW9uc1xuICovXG5mdW5jdGlvbiBwcm9jZXNzQmxvYlBhcnRzIChwYXJ0cywgb3B0aW9ucykge1xuICAvLyAxLiBMZXQgYnl0ZXMgYmUgYW4gZW1wdHkgc2VxdWVuY2Ugb2YgYnl0ZXMuXG4gIC8qKiBAdHlwZSB7Tm9kZUpTLlR5cGVkQXJyYXlbXX0gKi9cbiAgY29uc3QgYnl0ZXMgPSBbXVxuXG4gIC8vIDIuIEZvciBlYWNoIGVsZW1lbnQgaW4gcGFydHM6XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBwYXJ0cykge1xuICAgIC8vIDEuIElmIGVsZW1lbnQgaXMgYSBVU1ZTdHJpbmcsIHJ1biB0aGUgZm9sbG93aW5nIHN1YnN0ZXBzOlxuICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIDEuIExldCBzIGJlIGVsZW1lbnQuXG4gICAgICBsZXQgcyA9IGVsZW1lbnRcblxuICAgICAgLy8gMi4gSWYgdGhlIGVuZGluZ3MgbWVtYmVyIG9mIG9wdGlvbnMgaXMgXCJuYXRpdmVcIiwgc2V0IHNcbiAgICAgIC8vICAgIHRvIHRoZSByZXN1bHQgb2YgY29udmVydGluZyBsaW5lIGVuZGluZ3MgdG8gbmF0aXZlXG4gICAgICAvLyAgICBvZiBlbGVtZW50LlxuICAgICAgaWYgKG9wdGlvbnMuZW5kaW5ncyA9PT0gJ25hdGl2ZScpIHtcbiAgICAgICAgcyA9IGNvbnZlcnRMaW5lRW5kaW5nc05hdGl2ZShzKVxuICAgICAgfVxuXG4gICAgICAvLyAzLiBBcHBlbmQgdGhlIHJlc3VsdCBvZiBVVEYtOCBlbmNvZGluZyBzIHRvIGJ5dGVzLlxuICAgICAgYnl0ZXMucHVzaChlbmNvZGVyLmVuY29kZShzKSlcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdHlwZXMuaXNBbnlBcnJheUJ1ZmZlcihlbGVtZW50KSB8fFxuICAgICAgdHlwZXMuaXNUeXBlZEFycmF5KGVsZW1lbnQpXG4gICAgKSB7XG4gICAgICAvLyAyLiBJZiBlbGVtZW50IGlzIGEgQnVmZmVyU291cmNlLCBnZXQgYSBjb3B5IG9mIHRoZVxuICAgICAgLy8gICAgYnl0ZXMgaGVsZCBieSB0aGUgYnVmZmVyIHNvdXJjZSwgYW5kIGFwcGVuZCB0aG9zZVxuICAgICAgLy8gICAgYnl0ZXMgdG8gYnl0ZXMuXG4gICAgICBpZiAoIWVsZW1lbnQuYnVmZmVyKSB7IC8vIEFycmF5QnVmZmVyXG4gICAgICAgIGJ5dGVzLnB1c2gobmV3IFVpbnQ4QXJyYXkoZWxlbWVudCkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBieXRlcy5wdXNoKFxuICAgICAgICAgIG5ldyBVaW50OEFycmF5KGVsZW1lbnQuYnVmZmVyLCBlbGVtZW50LmJ5dGVPZmZzZXQsIGVsZW1lbnQuYnl0ZUxlbmd0aClcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNCbG9iTGlrZShlbGVtZW50KSkge1xuICAgICAgLy8gMy4gSWYgZWxlbWVudCBpcyBhIEJsb2IsIGFwcGVuZCB0aGUgYnl0ZXMgaXQgcmVwcmVzZW50c1xuICAgICAgLy8gICAgdG8gYnl0ZXMuXG4gICAgICBieXRlcy5wdXNoKGVsZW1lbnQpXG4gICAgfVxuICB9XG5cbiAgLy8gMy4gUmV0dXJuIGJ5dGVzLlxuICByZXR1cm4gYnl0ZXNcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9GaWxlQVBJLyNjb252ZXJ0LWxpbmUtZW5kaW5ncy10by1uYXRpdmVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRMaW5lRW5kaW5nc05hdGl2ZSAocykge1xuICAvLyAxLiBMZXQgbmF0aXZlIGxpbmUgZW5kaW5nIGJlIGJlIHRoZSBjb2RlIHBvaW50IFUrMDAwQSBMRi5cbiAgbGV0IG5hdGl2ZUxpbmVFbmRpbmcgPSAnXFxuJ1xuXG4gIC8vIDIuIElmIHRoZSB1bmRlcmx5aW5nIHBsYXRmb3Jt4oCZcyBjb252ZW50aW9ucyBhcmUgdG9cbiAgLy8gICAgcmVwcmVzZW50IG5ld2xpbmVzIGFzIGEgY2FycmlhZ2UgcmV0dXJuIGFuZCBsaW5lIGZlZWRcbiAgLy8gICAgc2VxdWVuY2UsIHNldCBuYXRpdmUgbGluZSBlbmRpbmcgdG8gdGhlIGNvZGUgcG9pbnRcbiAgLy8gICAgVSswMDBEIENSIGZvbGxvd2VkIGJ5IHRoZSBjb2RlIHBvaW50IFUrMDAwQSBMRi5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICBuYXRpdmVMaW5lRW5kaW5nID0gJ1xcclxcbidcbiAgfVxuXG4gIHJldHVybiBzLnJlcGxhY2UoL1xccj9cXG4vZywgbmF0aXZlTGluZUVuZGluZylcbn1cblxuLy8gSWYgdGhpcyBmdW5jdGlvbiBpcyBtb3ZlZCB0byAuL3V0aWwuanMsIHNvbWUgdG9vbHMgKHN1Y2ggYXNcbi8vIHJvbGx1cCkgd2lsbCB3YXJuIGFib3V0IGNpcmN1bGFyIGRlcGVuZGVuY2llcy4gU2VlOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzE2MjlcbmZ1bmN0aW9uIGlzRmlsZUxpa2UgKG9iamVjdCkge1xuICByZXR1cm4gKFxuICAgIChOYXRpdmVGaWxlICYmIG9iamVjdCBpbnN0YW5jZW9mIE5hdGl2ZUZpbGUpIHx8XG4gICAgb2JqZWN0IGluc3RhbmNlb2YgRmlsZSB8fCAoXG4gICAgICBvYmplY3QgJiZcbiAgICAgICh0eXBlb2Ygb2JqZWN0LnN0cmVhbSA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgdHlwZW9mIG9iamVjdC5hcnJheUJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJykgJiZcbiAgICAgIG9iamVjdFtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnRmlsZSdcbiAgICApXG4gIClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7IEZpbGUsIEZpbGVMaWtlLCBpc0ZpbGVMaWtlIH1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IGlzQmxvYkxpa2UsIHRvVVNWU3RyaW5nLCBtYWtlSXRlcmF0b3IgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IGtTdGF0ZSB9ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgRmlsZTogVW5kaWNpRmlsZSwgRmlsZUxpa2UsIGlzRmlsZUxpa2UgfSA9IHJlcXVpcmUoJy4vZmlsZScpXG5jb25zdCB7IHdlYmlkbCB9ID0gcmVxdWlyZSgnLi93ZWJpZGwnKVxuY29uc3QgeyBCbG9iLCBGaWxlOiBOYXRpdmVGaWxlIH0gPSByZXF1aXJlKCdidWZmZXInKVxuXG4vKiogQHR5cGUge2dsb2JhbFRoaXNbJ0ZpbGUnXX0gKi9cbmNvbnN0IEZpbGUgPSBOYXRpdmVGaWxlID8/IFVuZGljaUZpbGVcblxuLy8gaHR0cHM6Ly94aHIuc3BlYy53aGF0d2cub3JnLyNmb3JtZGF0YVxuY2xhc3MgRm9ybURhdGEge1xuICBjb25zdHJ1Y3RvciAoZm9ybSkge1xuICAgIGlmIChmb3JtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuY29udmVyc2lvbkZhaWxlZCh7XG4gICAgICAgIHByZWZpeDogJ0Zvcm1EYXRhIGNvbnN0cnVjdG9yJyxcbiAgICAgICAgYXJndW1lbnQ6ICdBcmd1bWVudCAxJyxcbiAgICAgICAgdHlwZXM6IFsndW5kZWZpbmVkJ11cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpc1trU3RhdGVdID0gW11cbiAgfVxuXG4gIGFwcGVuZCAobmFtZSwgdmFsdWUsIGZpbGVuYW1lID0gdW5kZWZpbmVkKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRm9ybURhdGEpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDIsIHsgaGVhZGVyOiAnRm9ybURhdGEuYXBwZW5kJyB9KVxuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgIWlzQmxvYkxpa2UodmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBcIkZhaWxlZCB0byBleGVjdXRlICdhcHBlbmQnIG9uICdGb3JtRGF0YSc6IHBhcmFtZXRlciAyIGlzIG5vdCBvZiB0eXBlICdCbG9iJ1wiXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gMS4gTGV0IHZhbHVlIGJlIHZhbHVlIGlmIGdpdmVuOyBvdGhlcndpc2UgYmxvYlZhbHVlLlxuXG4gICAgbmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhuYW1lKVxuICAgIHZhbHVlID0gaXNCbG9iTGlrZSh2YWx1ZSlcbiAgICAgID8gd2ViaWRsLmNvbnZlcnRlcnMuQmxvYih2YWx1ZSwgeyBzdHJpY3Q6IGZhbHNlIH0pXG4gICAgICA6IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyh2YWx1ZSlcbiAgICBmaWxlbmFtZSA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDNcbiAgICAgID8gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKGZpbGVuYW1lKVxuICAgICAgOiB1bmRlZmluZWRcblxuICAgIC8vIDIuIExldCBlbnRyeSBiZSB0aGUgcmVzdWx0IG9mIGNyZWF0aW5nIGFuIGVudHJ5IHdpdGhcbiAgICAvLyBuYW1lLCB2YWx1ZSwgYW5kIGZpbGVuYW1lIGlmIGdpdmVuLlxuICAgIGNvbnN0IGVudHJ5ID0gbWFrZUVudHJ5KG5hbWUsIHZhbHVlLCBmaWxlbmFtZSlcblxuICAgIC8vIDMuIEFwcGVuZCBlbnRyeSB0byB0aGlz4oCZcyBlbnRyeSBsaXN0LlxuICAgIHRoaXNba1N0YXRlXS5wdXNoKGVudHJ5KVxuICB9XG5cbiAgZGVsZXRlIChuYW1lKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRm9ybURhdGEpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnRm9ybURhdGEuZGVsZXRlJyB9KVxuXG4gICAgbmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhuYW1lKVxuXG4gICAgLy8gVGhlIGRlbGV0ZShuYW1lKSBtZXRob2Qgc3RlcHMgYXJlIHRvIHJlbW92ZSBhbGwgZW50cmllcyB3aG9zZSBuYW1lXG4gICAgLy8gaXMgbmFtZSBmcm9tIHRoaXPigJlzIGVudHJ5IGxpc3QuXG4gICAgdGhpc1trU3RhdGVdID0gdGhpc1trU3RhdGVdLmZpbHRlcihlbnRyeSA9PiBlbnRyeS5uYW1lICE9PSBuYW1lKVxuICB9XG5cbiAgZ2V0IChuYW1lKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRm9ybURhdGEpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnRm9ybURhdGEuZ2V0JyB9KVxuXG4gICAgbmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhuYW1lKVxuXG4gICAgLy8gMS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgd2hvc2UgbmFtZSBpcyBuYW1lIGluIHRoaXPigJlzIGVudHJ5IGxpc3QsXG4gICAgLy8gdGhlbiByZXR1cm4gbnVsbC5cbiAgICBjb25zdCBpZHggPSB0aGlzW2tTdGF0ZV0uZmluZEluZGV4KChlbnRyeSkgPT4gZW50cnkubmFtZSA9PT0gbmFtZSlcbiAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICAvLyAyLiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBlbnRyeSB3aG9zZSBuYW1lIGlzIG5hbWUgZnJvbVxuICAgIC8vIHRoaXPigJlzIGVudHJ5IGxpc3QuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXVtpZHhdLnZhbHVlXG4gIH1cblxuICBnZXRBbGwgKG5hbWUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGb3JtRGF0YSlcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdGb3JtRGF0YS5nZXRBbGwnIH0pXG5cbiAgICBuYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKG5hbWUpXG5cbiAgICAvLyAxLiBJZiB0aGVyZSBpcyBubyBlbnRyeSB3aG9zZSBuYW1lIGlzIG5hbWUgaW4gdGhpc+KAmXMgZW50cnkgbGlzdCxcbiAgICAvLyB0aGVuIHJldHVybiB0aGUgZW1wdHkgbGlzdC5cbiAgICAvLyAyLiBSZXR1cm4gdGhlIHZhbHVlcyBvZiBhbGwgZW50cmllcyB3aG9zZSBuYW1lIGlzIG5hbWUsIGluIG9yZGVyLFxuICAgIC8vIGZyb20gdGhpc+KAmXMgZW50cnkgbGlzdC5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdXG4gICAgICAuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkubmFtZSA9PT0gbmFtZSlcbiAgICAgIC5tYXAoKGVudHJ5KSA9PiBlbnRyeS52YWx1ZSlcbiAgfVxuXG4gIGhhcyAobmFtZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZvcm1EYXRhKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0Zvcm1EYXRhLmhhcycgfSlcblxuICAgIG5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcobmFtZSlcblxuICAgIC8vIFRoZSBoYXMobmFtZSkgbWV0aG9kIHN0ZXBzIGFyZSB0byByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhbiBlbnRyeVxuICAgIC8vIHdob3NlIG5hbWUgaXMgbmFtZSBpbiB0aGlz4oCZcyBlbnRyeSBsaXN0OyBvdGhlcndpc2UgZmFsc2UuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5maW5kSW5kZXgoKGVudHJ5KSA9PiBlbnRyeS5uYW1lID09PSBuYW1lKSAhPT0gLTFcbiAgfVxuXG4gIHNldCAobmFtZSwgdmFsdWUsIGZpbGVuYW1lID0gdW5kZWZpbmVkKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRm9ybURhdGEpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDIsIHsgaGVhZGVyOiAnRm9ybURhdGEuc2V0JyB9KVxuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgIWlzQmxvYkxpa2UodmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBcIkZhaWxlZCB0byBleGVjdXRlICdzZXQnIG9uICdGb3JtRGF0YSc6IHBhcmFtZXRlciAyIGlzIG5vdCBvZiB0eXBlICdCbG9iJ1wiXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gVGhlIHNldChuYW1lLCB2YWx1ZSkgYW5kIHNldChuYW1lLCBibG9iVmFsdWUsIGZpbGVuYW1lKSBtZXRob2Qgc3RlcHNcbiAgICAvLyBhcmU6XG5cbiAgICAvLyAxLiBMZXQgdmFsdWUgYmUgdmFsdWUgaWYgZ2l2ZW47IG90aGVyd2lzZSBibG9iVmFsdWUuXG5cbiAgICBuYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKG5hbWUpXG4gICAgdmFsdWUgPSBpc0Jsb2JMaWtlKHZhbHVlKVxuICAgICAgPyB3ZWJpZGwuY29udmVydGVycy5CbG9iKHZhbHVlLCB7IHN0cmljdDogZmFsc2UgfSlcbiAgICAgIDogd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKHZhbHVlKVxuICAgIGZpbGVuYW1lID0gYXJndW1lbnRzLmxlbmd0aCA9PT0gM1xuICAgICAgPyB0b1VTVlN0cmluZyhmaWxlbmFtZSlcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAvLyAyLiBMZXQgZW50cnkgYmUgdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhbiBlbnRyeSB3aXRoIG5hbWUsIHZhbHVlLCBhbmRcbiAgICAvLyBmaWxlbmFtZSBpZiBnaXZlbi5cbiAgICBjb25zdCBlbnRyeSA9IG1ha2VFbnRyeShuYW1lLCB2YWx1ZSwgZmlsZW5hbWUpXG5cbiAgICAvLyAzLiBJZiB0aGVyZSBhcmUgZW50cmllcyBpbiB0aGlz4oCZcyBlbnRyeSBsaXN0IHdob3NlIG5hbWUgaXMgbmFtZSwgdGhlblxuICAgIC8vIHJlcGxhY2UgdGhlIGZpcnN0IHN1Y2ggZW50cnkgd2l0aCBlbnRyeSBhbmQgcmVtb3ZlIHRoZSBvdGhlcnMuXG4gICAgY29uc3QgaWR4ID0gdGhpc1trU3RhdGVdLmZpbmRJbmRleCgoZW50cnkpID0+IGVudHJ5Lm5hbWUgPT09IG5hbWUpXG4gICAgaWYgKGlkeCAhPT0gLTEpIHtcbiAgICAgIHRoaXNba1N0YXRlXSA9IFtcbiAgICAgICAgLi4udGhpc1trU3RhdGVdLnNsaWNlKDAsIGlkeCksXG4gICAgICAgIGVudHJ5LFxuICAgICAgICAuLi50aGlzW2tTdGF0ZV0uc2xpY2UoaWR4ICsgMSkuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkubmFtZSAhPT0gbmFtZSlcbiAgICAgIF1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gNC4gT3RoZXJ3aXNlLCBhcHBlbmQgZW50cnkgdG8gdGhpc+KAmXMgZW50cnkgbGlzdC5cbiAgICAgIHRoaXNba1N0YXRlXS5wdXNoKGVudHJ5KVxuICAgIH1cbiAgfVxuXG4gIGVudHJpZXMgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZvcm1EYXRhKVxuXG4gICAgcmV0dXJuIG1ha2VJdGVyYXRvcihcbiAgICAgICgpID0+IHRoaXNba1N0YXRlXS5tYXAocGFpciA9PiBbcGFpci5uYW1lLCBwYWlyLnZhbHVlXSksXG4gICAgICAnRm9ybURhdGEnLFxuICAgICAgJ2tleSt2YWx1ZSdcbiAgICApXG4gIH1cblxuICBrZXlzICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGb3JtRGF0YSlcblxuICAgIHJldHVybiBtYWtlSXRlcmF0b3IoXG4gICAgICAoKSA9PiB0aGlzW2tTdGF0ZV0ubWFwKHBhaXIgPT4gW3BhaXIubmFtZSwgcGFpci52YWx1ZV0pLFxuICAgICAgJ0Zvcm1EYXRhJyxcbiAgICAgICdrZXknXG4gICAgKVxuICB9XG5cbiAgdmFsdWVzICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGb3JtRGF0YSlcblxuICAgIHJldHVybiBtYWtlSXRlcmF0b3IoXG4gICAgICAoKSA9PiB0aGlzW2tTdGF0ZV0ubWFwKHBhaXIgPT4gW3BhaXIubmFtZSwgcGFpci52YWx1ZV0pLFxuICAgICAgJ0Zvcm1EYXRhJyxcbiAgICAgICd2YWx1ZSdcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsodmFsdWU6IHN0cmluZywga2V5OiBzdHJpbmcsIHNlbGY6IEZvcm1EYXRhKSA9PiB2b2lkfSBjYWxsYmFja0ZuXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gdGhpc0FyZ1xuICAgKi9cbiAgZm9yRWFjaCAoY2FsbGJhY2tGbiwgdGhpc0FyZyA9IGdsb2JhbFRoaXMpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGb3JtRGF0YSlcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdGb3JtRGF0YS5mb3JFYWNoJyB9KVxuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFja0ZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBcIkZhaWxlZCB0byBleGVjdXRlICdmb3JFYWNoJyBvbiAnRm9ybURhdGEnOiBwYXJhbWV0ZXIgMSBpcyBub3Qgb2YgdHlwZSAnRnVuY3Rpb24nLlwiXG4gICAgICApXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcykge1xuICAgICAgY2FsbGJhY2tGbi5hcHBseSh0aGlzQXJnLCBbdmFsdWUsIGtleSwgdGhpc10pXG4gICAgfVxuICB9XG59XG5cbkZvcm1EYXRhLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gRm9ybURhdGEucHJvdG90eXBlLmVudHJpZXNcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRm9ybURhdGEucHJvdG90eXBlLCB7XG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7XG4gICAgdmFsdWU6ICdGb3JtRGF0YScsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH1cbn0pXG5cbi8qKlxuICogQHNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3JtLWNvbnRyb2wtaW5mcmFzdHJ1Y3R1cmUuaHRtbCNjcmVhdGUtYW4tZW50cnlcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ3xCbG9ifSB2YWx1ZVxuICogQHBhcmFtIHs/c3RyaW5nfSBmaWxlbmFtZVxuICogQHJldHVybnNcbiAqL1xuZnVuY3Rpb24gbWFrZUVudHJ5IChuYW1lLCB2YWx1ZSwgZmlsZW5hbWUpIHtcbiAgLy8gMS4gU2V0IG5hbWUgdG8gdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIG5hbWUgaW50byBhIHNjYWxhciB2YWx1ZSBzdHJpbmcuXG4gIC8vIFwiVG8gY29udmVydCBhIHN0cmluZyBpbnRvIGEgc2NhbGFyIHZhbHVlIHN0cmluZywgcmVwbGFjZSBhbnkgc3Vycm9nYXRlc1xuICAvLyAgd2l0aCBVK0ZGRkQuXCJcbiAgLy8gc2VlOiBodHRwczovL25vZGVqcy5vcmcvZGlzdC9sYXRlc3QtdjE4LngvZG9jcy9hcGkvYnVmZmVyLmh0bWwjYnVmdG9zdHJpbmdlbmNvZGluZy1zdGFydC1lbmRcbiAgbmFtZSA9IEJ1ZmZlci5mcm9tKG5hbWUpLnRvU3RyaW5nKCd1dGY4JylcblxuICAvLyAyLiBJZiB2YWx1ZSBpcyBhIHN0cmluZywgdGhlbiBzZXQgdmFsdWUgdG8gdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nXG4gIC8vICAgIHZhbHVlIGludG8gYSBzY2FsYXIgdmFsdWUgc3RyaW5nLlxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHZhbHVlID0gQnVmZmVyLmZyb20odmFsdWUpLnRvU3RyaW5nKCd1dGY4JylcbiAgfSBlbHNlIHtcbiAgICAvLyAzLiBPdGhlcndpc2U6XG5cbiAgICAvLyAxLiBJZiB2YWx1ZSBpcyBub3QgYSBGaWxlIG9iamVjdCwgdGhlbiBzZXQgdmFsdWUgdG8gYSBuZXcgRmlsZSBvYmplY3QsXG4gICAgLy8gICAgcmVwcmVzZW50aW5nIHRoZSBzYW1lIGJ5dGVzLCB3aG9zZSBuYW1lIGF0dHJpYnV0ZSB2YWx1ZSBpcyBcImJsb2JcIlxuICAgIGlmICghaXNGaWxlTGlrZSh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUgaW5zdGFuY2VvZiBCbG9iXG4gICAgICAgID8gbmV3IEZpbGUoW3ZhbHVlXSwgJ2Jsb2InLCB7IHR5cGU6IHZhbHVlLnR5cGUgfSlcbiAgICAgICAgOiBuZXcgRmlsZUxpa2UodmFsdWUsICdibG9iJywgeyB0eXBlOiB2YWx1ZS50eXBlIH0pXG4gICAgfVxuXG4gICAgLy8gMi4gSWYgZmlsZW5hbWUgaXMgZ2l2ZW4sIHRoZW4gc2V0IHZhbHVlIHRvIGEgbmV3IEZpbGUgb2JqZWN0LFxuICAgIC8vICAgIHJlcHJlc2VudGluZyB0aGUgc2FtZSBieXRlcywgd2hvc2UgbmFtZSBhdHRyaWJ1dGUgaXMgZmlsZW5hbWUuXG4gICAgaWYgKGZpbGVuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8qKiBAdHlwZSB7RmlsZVByb3BlcnR5QmFnfSAqL1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgdHlwZTogdmFsdWUudHlwZSxcbiAgICAgICAgbGFzdE1vZGlmaWVkOiB2YWx1ZS5sYXN0TW9kaWZpZWRcbiAgICAgIH1cblxuICAgICAgdmFsdWUgPSAoTmF0aXZlRmlsZSAmJiB2YWx1ZSBpbnN0YW5jZW9mIE5hdGl2ZUZpbGUpIHx8IHZhbHVlIGluc3RhbmNlb2YgVW5kaWNpRmlsZVxuICAgICAgICA/IG5ldyBGaWxlKFt2YWx1ZV0sIGZpbGVuYW1lLCBvcHRpb25zKVxuICAgICAgICA6IG5ldyBGaWxlTGlrZSh2YWx1ZSwgZmlsZW5hbWUsIG9wdGlvbnMpXG4gICAgfVxuICB9XG5cbiAgLy8gNC4gUmV0dXJuIGFuIGVudHJ5IHdob3NlIG5hbWUgaXMgbmFtZSBhbmQgd2hvc2UgdmFsdWUgaXMgdmFsdWUuXG4gIHJldHVybiB7IG5hbWUsIHZhbHVlIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7IEZvcm1EYXRhIH1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBCdXNib3kgPSByZXF1aXJlKCdAZmFzdGlmeS9idXNib3knKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5jb25zdCB7XG4gIFJlYWRhYmxlU3RyZWFtRnJvbSxcbiAgaXNCbG9iTGlrZSxcbiAgaXNSZWFkYWJsZVN0cmVhbUxpa2UsXG4gIHJlYWRhYmxlU3RyZWFtQ2xvc2UsXG4gIGNyZWF0ZURlZmVycmVkUHJvbWlzZSxcbiAgZnVsbHlSZWFkQm9keVxufSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IEZvcm1EYXRhIH0gPSByZXF1aXJlKCcuL2Zvcm1kYXRhJylcbmNvbnN0IHsga1N0YXRlIH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4vd2ViaWRsJylcbmNvbnN0IHsgRE9NRXhjZXB0aW9uLCBzdHJ1Y3R1cmVkQ2xvbmUgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IHsgQmxvYiwgRmlsZTogTmF0aXZlRmlsZSB9ID0gcmVxdWlyZSgnYnVmZmVyJylcbmNvbnN0IHsga0JvZHlVc2VkIH0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsgaXNFcnJvcmVkIH0gPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBpc1VpbnQ4QXJyYXksIGlzQXJyYXlCdWZmZXIgfSA9IHJlcXVpcmUoJ3V0aWwvdHlwZXMnKVxuY29uc3QgeyBGaWxlOiBVbmRpY2lGaWxlIH0gPSByZXF1aXJlKCcuL2ZpbGUnKVxuY29uc3QgeyBwYXJzZU1JTUVUeXBlLCBzZXJpYWxpemVBTWltZVR5cGUgfSA9IHJlcXVpcmUoJy4vZGF0YVVSTCcpXG5cbmxldCByYW5kb21cbnRyeSB7XG4gIGNvbnN0IGNyeXB0byA9IHJlcXVpcmUoJ25vZGU6Y3J5cHRvJylcbiAgcmFuZG9tID0gKG1heCkgPT4gY3J5cHRvLnJhbmRvbUludCgwLCBtYXgpXG59IGNhdGNoIHtcbiAgcmFuZG9tID0gKG1heCkgPT4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbShtYXgpKVxufVxuXG5sZXQgUmVhZGFibGVTdHJlYW0gPSBnbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtXG5cbi8qKiBAdHlwZSB7Z2xvYmFsVGhpc1snRmlsZSddfSAqL1xuY29uc3QgRmlsZSA9IE5hdGl2ZUZpbGUgPz8gVW5kaWNpRmlsZVxuY29uc3QgdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKVxuY29uc3QgdGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1ib2R5aW5pdC1leHRyYWN0XG5mdW5jdGlvbiBleHRyYWN0Qm9keSAob2JqZWN0LCBrZWVwYWxpdmUgPSBmYWxzZSkge1xuICBpZiAoIVJlYWRhYmxlU3RyZWFtKSB7XG4gICAgUmVhZGFibGVTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0vd2ViJykuUmVhZGFibGVTdHJlYW1cbiAgfVxuXG4gIC8vIDEuIExldCBzdHJlYW0gYmUgbnVsbC5cbiAgbGV0IHN0cmVhbSA9IG51bGxcblxuICAvLyAyLiBJZiBvYmplY3QgaXMgYSBSZWFkYWJsZVN0cmVhbSBvYmplY3QsIHRoZW4gc2V0IHN0cmVhbSB0byBvYmplY3QuXG4gIGlmIChvYmplY3QgaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbSkge1xuICAgIHN0cmVhbSA9IG9iamVjdFxuICB9IGVsc2UgaWYgKGlzQmxvYkxpa2Uob2JqZWN0KSkge1xuICAgIC8vIDMuIE90aGVyd2lzZSwgaWYgb2JqZWN0IGlzIGEgQmxvYiBvYmplY3QsIHNldCBzdHJlYW0gdG8gdGhlXG4gICAgLy8gICAgcmVzdWx0IG9mIHJ1bm5pbmcgb2JqZWN04oCZcyBnZXQgc3RyZWFtLlxuICAgIHN0cmVhbSA9IG9iamVjdC5zdHJlYW0oKVxuICB9IGVsc2Uge1xuICAgIC8vIDQuIE90aGVyd2lzZSwgc2V0IHN0cmVhbSB0byBhIG5ldyBSZWFkYWJsZVN0cmVhbSBvYmplY3QsIGFuZCBzZXRcbiAgICAvLyAgICB1cCBzdHJlYW0uXG4gICAgc3RyZWFtID0gbmV3IFJlYWRhYmxlU3RyZWFtKHtcbiAgICAgIGFzeW5jIHB1bGwgKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKFxuICAgICAgICAgIHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnID8gdGV4dEVuY29kZXIuZW5jb2RlKHNvdXJjZSkgOiBzb3VyY2VcbiAgICAgICAgKVxuICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiByZWFkYWJsZVN0cmVhbUNsb3NlKGNvbnRyb2xsZXIpKVxuICAgICAgfSxcbiAgICAgIHN0YXJ0ICgpIHt9LFxuICAgICAgdHlwZTogdW5kZWZpbmVkXG4gICAgfSlcbiAgfVxuXG4gIC8vIDUuIEFzc2VydDogc3RyZWFtIGlzIGEgUmVhZGFibGVTdHJlYW0gb2JqZWN0LlxuICBhc3NlcnQoaXNSZWFkYWJsZVN0cmVhbUxpa2Uoc3RyZWFtKSlcblxuICAvLyA2LiBMZXQgYWN0aW9uIGJlIG51bGwuXG4gIGxldCBhY3Rpb24gPSBudWxsXG5cbiAgLy8gNy4gTGV0IHNvdXJjZSBiZSBudWxsLlxuICBsZXQgc291cmNlID0gbnVsbFxuXG4gIC8vIDguIExldCBsZW5ndGggYmUgbnVsbC5cbiAgbGV0IGxlbmd0aCA9IG51bGxcblxuICAvLyA5LiBMZXQgdHlwZSBiZSBudWxsLlxuICBsZXQgdHlwZSA9IG51bGxcblxuICAvLyAxMC4gU3dpdGNoIG9uIG9iamVjdDpcbiAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gU2V0IHNvdXJjZSB0byB0aGUgVVRGLTggZW5jb2Rpbmcgb2Ygb2JqZWN0LlxuICAgIC8vIE5vdGU6IHNldHRpbmcgc291cmNlIHRvIGEgVWludDhBcnJheSBoZXJlIGJyZWFrcyBzb21lIG1vY2tpbmcgYXNzdW1wdGlvbnMuXG4gICAgc291cmNlID0gb2JqZWN0XG5cbiAgICAvLyBTZXQgdHlwZSB0byBgdGV4dC9wbGFpbjtjaGFyc2V0PVVURi04YC5cbiAgICB0eXBlID0gJ3RleHQvcGxhaW47Y2hhcnNldD1VVEYtOCdcbiAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXMpIHtcbiAgICAvLyBVUkxTZWFyY2hQYXJhbXNcblxuICAgIC8vIHNwZWMgc2F5cyB0byBydW4gYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIG9uIGJvZHkubGlzdFxuICAgIC8vIHRoaXMgaXMgaW1wbGVtZW50ZWQgaW4gTm9kZS5qcyBhcyBhcGFydCBvZiBhbiBVUkxTZWFyY2hQYXJhbXMgaW5zdGFuY2UgdG9TdHJpbmcgbWV0aG9kXG4gICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi9lNDZjNjgwYmYyYjIxMWJiZDUyY2Y5NTljYTE3ZWU5OGM3ZjY1N2Y1L2xpYi9pbnRlcm5hbC91cmwuanMjTDQ5MFxuICAgIC8vIGFuZCBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi9lNDZjNjgwYmYyYjIxMWJiZDUyY2Y5NTljYTE3ZWU5OGM3ZjY1N2Y1L2xpYi9pbnRlcm5hbC91cmwuanMjTDExMDBcblxuICAgIC8vIFNldCBzb3VyY2UgdG8gdGhlIHJlc3VsdCBvZiBydW5uaW5nIHRoZSBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgc2VyaWFsaXplciB3aXRoIG9iamVjdOKAmXMgbGlzdC5cbiAgICBzb3VyY2UgPSBvYmplY3QudG9TdHJpbmcoKVxuXG4gICAgLy8gU2V0IHR5cGUgdG8gYGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04YC5cbiAgICB0eXBlID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04J1xuICB9IGVsc2UgaWYgKGlzQXJyYXlCdWZmZXIob2JqZWN0KSkge1xuICAgIC8vIEJ1ZmZlclNvdXJjZS9BcnJheUJ1ZmZlclxuXG4gICAgLy8gU2V0IHNvdXJjZSB0byBhIGNvcHkgb2YgdGhlIGJ5dGVzIGhlbGQgYnkgb2JqZWN0LlxuICAgIHNvdXJjZSA9IG5ldyBVaW50OEFycmF5KG9iamVjdC5zbGljZSgpKVxuICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhvYmplY3QpKSB7XG4gICAgLy8gQnVmZmVyU291cmNlL0FycmF5QnVmZmVyVmlld1xuXG4gICAgLy8gU2V0IHNvdXJjZSB0byBhIGNvcHkgb2YgdGhlIGJ5dGVzIGhlbGQgYnkgb2JqZWN0LlxuICAgIHNvdXJjZSA9IG5ldyBVaW50OEFycmF5KG9iamVjdC5idWZmZXIuc2xpY2Uob2JqZWN0LmJ5dGVPZmZzZXQsIG9iamVjdC5ieXRlT2Zmc2V0ICsgb2JqZWN0LmJ5dGVMZW5ndGgpKVxuICB9IGVsc2UgaWYgKHV0aWwuaXNGb3JtRGF0YUxpa2Uob2JqZWN0KSkge1xuICAgIGNvbnN0IGJvdW5kYXJ5ID0gYC0tLS1mb3JtZGF0YS11bmRpY2ktMCR7YCR7cmFuZG9tKDFlMTEpfWAucGFkU3RhcnQoMTEsICcwJyl9YFxuICAgIGNvbnN0IHByZWZpeCA9IGAtLSR7Ym91bmRhcnl9XFxyXFxuQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhYFxuXG4gICAgLyohIGZvcm1kYXRhLXBvbHlmaWxsLiBNSVQgTGljZW5zZS4gSmltbXkgV8OkcnRpbmcgPGh0dHBzOi8vamltbXkud2FydGluZy5zZS9vcGVuc291cmNlPiAqL1xuICAgIGNvbnN0IGVzY2FwZSA9IChzdHIpID0+XG4gICAgICBzdHIucmVwbGFjZSgvXFxuL2csICclMEEnKS5yZXBsYWNlKC9cXHIvZywgJyUwRCcpLnJlcGxhY2UoL1wiL2csICclMjInKVxuICAgIGNvbnN0IG5vcm1hbGl6ZUxpbmVmZWVkcyA9ICh2YWx1ZSkgPT4gdmFsdWUucmVwbGFjZSgvXFxyP1xcbnxcXHIvZywgJ1xcclxcbicpXG5cbiAgICAvLyBTZXQgYWN0aW9uIHRvIHRoaXMgc3RlcDogcnVuIHRoZSBtdWx0aXBhcnQvZm9ybS1kYXRhXG4gICAgLy8gZW5jb2RpbmcgYWxnb3JpdGhtLCB3aXRoIG9iamVjdOKAmXMgZW50cnkgbGlzdCBhbmQgVVRGLTguXG4gICAgLy8gLSBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgYm9keSBpcyBpbW11dGFibGUgYW5kIGNhbid0IGJlIGNoYW5nZWQgYWZ0ZXJ3b3Jkc1xuICAgIC8vIC0gVGhhdCB0aGUgY29udGVudC1sZW5ndGggaXMgY2FsY3VsYXRlZCBpbiBhZHZhbmNlLlxuICAgIC8vIC0gQW5kIHRoYXQgYWxsIHBhcnRzIGFyZSBwcmUtZW5jb2RlZCBhbmQgcmVhZHkgdG8gYmUgc2VudC5cblxuICAgIGNvbnN0IGJsb2JQYXJ0cyA9IFtdXG4gICAgY29uc3Qgcm4gPSBuZXcgVWludDhBcnJheShbMTMsIDEwXSkgLy8gJ1xcclxcbidcbiAgICBsZW5ndGggPSAwXG4gICAgbGV0IGhhc1Vua25vd25TaXplVmFsdWUgPSBmYWxzZVxuXG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIG9iamVjdCkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgY2h1bmsgPSB0ZXh0RW5jb2Rlci5lbmNvZGUocHJlZml4ICtcbiAgICAgICAgICBgOyBuYW1lPVwiJHtlc2NhcGUobm9ybWFsaXplTGluZWZlZWRzKG5hbWUpKX1cImAgK1xuICAgICAgICAgIGBcXHJcXG5cXHJcXG4ke25vcm1hbGl6ZUxpbmVmZWVkcyh2YWx1ZSl9XFxyXFxuYClcbiAgICAgICAgYmxvYlBhcnRzLnB1c2goY2h1bmspXG4gICAgICAgIGxlbmd0aCArPSBjaHVuay5ieXRlTGVuZ3RoXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjaHVuayA9IHRleHRFbmNvZGVyLmVuY29kZShgJHtwcmVmaXh9OyBuYW1lPVwiJHtlc2NhcGUobm9ybWFsaXplTGluZWZlZWRzKG5hbWUpKX1cImAgK1xuICAgICAgICAgICh2YWx1ZS5uYW1lID8gYDsgZmlsZW5hbWU9XCIke2VzY2FwZSh2YWx1ZS5uYW1lKX1cImAgOiAnJykgKyAnXFxyXFxuJyArXG4gICAgICAgICAgYENvbnRlbnQtVHlwZTogJHtcbiAgICAgICAgICAgIHZhbHVlLnR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbiAgICAgICAgICB9XFxyXFxuXFxyXFxuYClcbiAgICAgICAgYmxvYlBhcnRzLnB1c2goY2h1bmssIHZhbHVlLCBybilcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5zaXplID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIGxlbmd0aCArPSBjaHVuay5ieXRlTGVuZ3RoICsgdmFsdWUuc2l6ZSArIHJuLmJ5dGVMZW5ndGhcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoYXNVbmtub3duU2l6ZVZhbHVlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY2h1bmsgPSB0ZXh0RW5jb2Rlci5lbmNvZGUoYC0tJHtib3VuZGFyeX0tLWApXG4gICAgYmxvYlBhcnRzLnB1c2goY2h1bmspXG4gICAgbGVuZ3RoICs9IGNodW5rLmJ5dGVMZW5ndGhcbiAgICBpZiAoaGFzVW5rbm93blNpemVWYWx1ZSkge1xuICAgICAgbGVuZ3RoID0gbnVsbFxuICAgIH1cblxuICAgIC8vIFNldCBzb3VyY2UgdG8gb2JqZWN0LlxuICAgIHNvdXJjZSA9IG9iamVjdFxuXG4gICAgYWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gKiAoKSB7XG4gICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgYmxvYlBhcnRzKSB7XG4gICAgICAgIGlmIChwYXJ0LnN0cmVhbSkge1xuICAgICAgICAgIHlpZWxkICogcGFydC5zdHJlYW0oKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHlpZWxkIHBhcnRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCB0eXBlIHRvIGBtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT1gLFxuICAgIC8vIGZvbGxvd2VkIGJ5IHRoZSBtdWx0aXBhcnQvZm9ybS1kYXRhIGJvdW5kYXJ5IHN0cmluZyBnZW5lcmF0ZWRcbiAgICAvLyBieSB0aGUgbXVsdGlwYXJ0L2Zvcm0tZGF0YSBlbmNvZGluZyBhbGdvcml0aG0uXG4gICAgdHlwZSA9ICdtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0nICsgYm91bmRhcnlcbiAgfSBlbHNlIGlmIChpc0Jsb2JMaWtlKG9iamVjdCkpIHtcbiAgICAvLyBCbG9iXG5cbiAgICAvLyBTZXQgc291cmNlIHRvIG9iamVjdC5cbiAgICBzb3VyY2UgPSBvYmplY3RcblxuICAgIC8vIFNldCBsZW5ndGggdG8gb2JqZWN04oCZcyBzaXplLlxuICAgIGxlbmd0aCA9IG9iamVjdC5zaXplXG5cbiAgICAvLyBJZiBvYmplY3TigJlzIHR5cGUgYXR0cmlidXRlIGlzIG5vdCB0aGUgZW1wdHkgYnl0ZSBzZXF1ZW5jZSwgc2V0XG4gICAgLy8gdHlwZSB0byBpdHMgdmFsdWUuXG4gICAgaWYgKG9iamVjdC50eXBlKSB7XG4gICAgICB0eXBlID0gb2JqZWN0LnR5cGVcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIG9iamVjdFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBJZiBrZWVwYWxpdmUgaXMgdHJ1ZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAoa2VlcGFsaXZlKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdrZWVwYWxpdmUnKVxuICAgIH1cblxuICAgIC8vIElmIG9iamVjdCBpcyBkaXN0dXJiZWQgb3IgbG9ja2VkLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmICh1dGlsLmlzRGlzdHVyYmVkKG9iamVjdCkgfHwgb2JqZWN0LmxvY2tlZCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgJ1Jlc3BvbnNlIGJvZHkgb2JqZWN0IHNob3VsZCBub3QgYmUgZGlzdHVyYmVkIG9yIGxvY2tlZCdcbiAgICAgIClcbiAgICB9XG5cbiAgICBzdHJlYW0gPVxuICAgICAgb2JqZWN0IGluc3RhbmNlb2YgUmVhZGFibGVTdHJlYW0gPyBvYmplY3QgOiBSZWFkYWJsZVN0cmVhbUZyb20ob2JqZWN0KVxuICB9XG5cbiAgLy8gMTEuIElmIHNvdXJjZSBpcyBhIGJ5dGUgc2VxdWVuY2UsIHRoZW4gc2V0IGFjdGlvbiB0byBhXG4gIC8vIHN0ZXAgdGhhdCByZXR1cm5zIHNvdXJjZSBhbmQgbGVuZ3RoIHRvIHNvdXJjZeKAmXMgbGVuZ3RoLlxuICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycgfHwgdXRpbC5pc0J1ZmZlcihzb3VyY2UpKSB7XG4gICAgbGVuZ3RoID0gQnVmZmVyLmJ5dGVMZW5ndGgoc291cmNlKVxuICB9XG5cbiAgLy8gMTIuIElmIGFjdGlvbiBpcyBub24tbnVsbCwgdGhlbiBydW4gdGhlc2Ugc3RlcHMgaW4gaW4gcGFyYWxsZWw6XG4gIGlmIChhY3Rpb24gIT0gbnVsbCkge1xuICAgIC8vIFJ1biBhY3Rpb24uXG4gICAgbGV0IGl0ZXJhdG9yXG4gICAgc3RyZWFtID0gbmV3IFJlYWRhYmxlU3RyZWFtKHtcbiAgICAgIGFzeW5jIHN0YXJ0ICgpIHtcbiAgICAgICAgaXRlcmF0b3IgPSBhY3Rpb24ob2JqZWN0KVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKVxuICAgICAgfSxcbiAgICAgIGFzeW5jIHB1bGwgKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgY29uc3QgeyB2YWx1ZSwgZG9uZSB9ID0gYXdhaXQgaXRlcmF0b3IubmV4dCgpXG4gICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgLy8gV2hlbiBydW5uaW5nIGFjdGlvbiBpcyBkb25lLCBjbG9zZSBzdHJlYW0uXG4gICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXaGVuZXZlciBvbmUgb3IgbW9yZSBieXRlcyBhcmUgYXZhaWxhYmxlIGFuZCBzdHJlYW0gaXMgbm90IGVycm9yZWQsXG4gICAgICAgICAgLy8gZW5xdWV1ZSBhIFVpbnQ4QXJyYXkgd3JhcHBpbmcgYW4gQXJyYXlCdWZmZXIgY29udGFpbmluZyB0aGUgYXZhaWxhYmxlXG4gICAgICAgICAgLy8gYnl0ZXMgaW50byBzdHJlYW0uXG4gICAgICAgICAgaWYgKCFpc0Vycm9yZWQoc3RyZWFtKSkge1xuICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKG5ldyBVaW50OEFycmF5KHZhbHVlKSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuZGVzaXJlZFNpemUgPiAwXG4gICAgICB9LFxuICAgICAgYXN5bmMgY2FuY2VsIChyZWFzb24pIHtcbiAgICAgICAgYXdhaXQgaXRlcmF0b3IucmV0dXJuKClcbiAgICAgIH0sXG4gICAgICB0eXBlOiB1bmRlZmluZWRcbiAgICB9KVxuICB9XG5cbiAgLy8gMTMuIExldCBib2R5IGJlIGEgYm9keSB3aG9zZSBzdHJlYW0gaXMgc3RyZWFtLCBzb3VyY2UgaXMgc291cmNlLFxuICAvLyBhbmQgbGVuZ3RoIGlzIGxlbmd0aC5cbiAgY29uc3QgYm9keSA9IHsgc3RyZWFtLCBzb3VyY2UsIGxlbmd0aCB9XG5cbiAgLy8gMTQuIFJldHVybiAoYm9keSwgdHlwZSkuXG4gIHJldHVybiBbYm9keSwgdHlwZV1cbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2JvZHlpbml0LXNhZmVseS1leHRyYWN0XG5mdW5jdGlvbiBzYWZlbHlFeHRyYWN0Qm9keSAob2JqZWN0LCBrZWVwYWxpdmUgPSBmYWxzZSkge1xuICBpZiAoIVJlYWRhYmxlU3RyZWFtKSB7XG4gICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICBSZWFkYWJsZVN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbS93ZWInKS5SZWFkYWJsZVN0cmVhbVxuICB9XG5cbiAgLy8gVG8gc2FmZWx5IGV4dHJhY3QgYSBib2R5IGFuZCBhIGBDb250ZW50LVR5cGVgIHZhbHVlIGZyb21cbiAgLy8gYSBieXRlIHNlcXVlbmNlIG9yIEJvZHlJbml0IG9iamVjdCBvYmplY3QsIHJ1biB0aGVzZSBzdGVwczpcblxuICAvLyAxLiBJZiBvYmplY3QgaXMgYSBSZWFkYWJsZVN0cmVhbSBvYmplY3QsIHRoZW46XG4gIGlmIChvYmplY3QgaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbSkge1xuICAgIC8vIEFzc2VydDogb2JqZWN0IGlzIG5laXRoZXIgZGlzdHVyYmVkIG5vciBsb2NrZWQuXG4gICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICBhc3NlcnQoIXV0aWwuaXNEaXN0dXJiZWQob2JqZWN0KSwgJ1RoZSBib2R5IGhhcyBhbHJlYWR5IGJlZW4gY29uc3VtZWQuJylcbiAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgIGFzc2VydCghb2JqZWN0LmxvY2tlZCwgJ1RoZSBzdHJlYW0gaXMgbG9ja2VkLicpXG4gIH1cblxuICAvLyAyLiBSZXR1cm4gdGhlIHJlc3VsdHMgb2YgZXh0cmFjdGluZyBvYmplY3QuXG4gIHJldHVybiBleHRyYWN0Qm9keShvYmplY3QsIGtlZXBhbGl2ZSlcbn1cblxuZnVuY3Rpb24gY2xvbmVCb2R5IChib2R5KSB7XG4gIC8vIFRvIGNsb25lIGEgYm9keSBib2R5LCBydW4gdGhlc2Ugc3RlcHM6XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtYm9keS1jbG9uZVxuXG4gIC8vIDEuIExldCDCqyBvdXQxLCBvdXQyIMK7IGJlIHRoZSByZXN1bHQgb2YgdGVlaW5nIGJvZHnigJlzIHN0cmVhbS5cbiAgY29uc3QgW291dDEsIG91dDJdID0gYm9keS5zdHJlYW0udGVlKClcbiAgY29uc3Qgb3V0MkNsb25lID0gc3RydWN0dXJlZENsb25lKG91dDIsIHsgdHJhbnNmZXI6IFtvdXQyXSB9KVxuICAvLyBUaGlzLCBmb3Igd2hhdGV2ZXIgcmVhc29ucywgdW5yZWZzIG91dDJDbG9uZSB3aGljaCBhbGxvd3NcbiAgLy8gdGhlIHByb2Nlc3MgdG8gZXhpdCBieSBpdHNlbGYuXG4gIGNvbnN0IFssIGZpbmFsQ2xvbmVdID0gb3V0MkNsb25lLnRlZSgpXG5cbiAgLy8gMi4gU2V0IGJvZHnigJlzIHN0cmVhbSB0byBvdXQxLlxuICBib2R5LnN0cmVhbSA9IG91dDFcblxuICAvLyAzLiBSZXR1cm4gYSBib2R5IHdob3NlIHN0cmVhbSBpcyBvdXQyIGFuZCBvdGhlciBtZW1iZXJzIGFyZSBjb3BpZWQgZnJvbSBib2R5LlxuICByZXR1cm4ge1xuICAgIHN0cmVhbTogZmluYWxDbG9uZSxcbiAgICBsZW5ndGg6IGJvZHkubGVuZ3RoLFxuICAgIHNvdXJjZTogYm9keS5zb3VyY2VcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiAqIGNvbnN1bWVCb2R5IChib2R5KSB7XG4gIGlmIChib2R5KSB7XG4gICAgaWYgKGlzVWludDhBcnJheShib2R5KSkge1xuICAgICAgeWllbGQgYm9keVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzdHJlYW0gPSBib2R5LnN0cmVhbVxuXG4gICAgICBpZiAodXRpbC5pc0Rpc3R1cmJlZChzdHJlYW0pKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBib2R5IGhhcyBhbHJlYWR5IGJlZW4gY29uc3VtZWQuJylcbiAgICAgIH1cblxuICAgICAgaWYgKHN0cmVhbS5sb2NrZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHN0cmVhbSBpcyBsb2NrZWQuJylcbiAgICAgIH1cblxuICAgICAgLy8gQ29tcGF0LlxuICAgICAgc3RyZWFtW2tCb2R5VXNlZF0gPSB0cnVlXG5cbiAgICAgIHlpZWxkICogc3RyZWFtXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRocm93SWZBYm9ydGVkIChzdGF0ZSkge1xuICBpZiAoc3RhdGUuYWJvcnRlZCkge1xuICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuJywgJ0Fib3J0RXJyb3InKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJvZHlNaXhpbk1ldGhvZHMgKGluc3RhbmNlKSB7XG4gIGNvbnN0IG1ldGhvZHMgPSB7XG4gICAgYmxvYiAoKSB7XG4gICAgICAvLyBUaGUgYmxvYigpIG1ldGhvZCBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoZSByZXN1bHQgb2ZcbiAgICAgIC8vIHJ1bm5pbmcgY29uc3VtZSBib2R5IHdpdGggdGhpcyBhbmQgdGhlIGZvbGxvd2luZyBzdGVwXG4gICAgICAvLyBnaXZlbiBhIGJ5dGUgc2VxdWVuY2UgYnl0ZXM6IHJldHVybiBhIEJsb2Igd2hvc2VcbiAgICAgIC8vIGNvbnRlbnRzIGFyZSBieXRlcyBhbmQgd2hvc2UgdHlwZSBhdHRyaWJ1dGUgaXMgdGhpc+KAmXNcbiAgICAgIC8vIE1JTUUgdHlwZS5cbiAgICAgIHJldHVybiBzcGVjQ29uc3VtZUJvZHkodGhpcywgKGJ5dGVzKSA9PiB7XG4gICAgICAgIGxldCBtaW1lVHlwZSA9IGJvZHlNaW1lVHlwZSh0aGlzKVxuXG4gICAgICAgIGlmIChtaW1lVHlwZSA9PT0gJ2ZhaWx1cmUnKSB7XG4gICAgICAgICAgbWltZVR5cGUgPSAnJ1xuICAgICAgICB9IGVsc2UgaWYgKG1pbWVUeXBlKSB7XG4gICAgICAgICAgbWltZVR5cGUgPSBzZXJpYWxpemVBTWltZVR5cGUobWltZVR5cGUpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXR1cm4gYSBCbG9iIHdob3NlIGNvbnRlbnRzIGFyZSBieXRlcyBhbmQgdHlwZSBhdHRyaWJ1dGVcbiAgICAgICAgLy8gaXMgbWltZVR5cGUuXG4gICAgICAgIHJldHVybiBuZXcgQmxvYihbYnl0ZXNdLCB7IHR5cGU6IG1pbWVUeXBlIH0pXG4gICAgICB9LCBpbnN0YW5jZSlcbiAgICB9LFxuXG4gICAgYXJyYXlCdWZmZXIgKCkge1xuICAgICAgLy8gVGhlIGFycmF5QnVmZmVyKCkgbWV0aG9kIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhlIHJlc3VsdFxuICAgICAgLy8gb2YgcnVubmluZyBjb25zdW1lIGJvZHkgd2l0aCB0aGlzIGFuZCB0aGUgZm9sbG93aW5nIHN0ZXBcbiAgICAgIC8vIGdpdmVuIGEgYnl0ZSBzZXF1ZW5jZSBieXRlczogcmV0dXJuIGEgbmV3IEFycmF5QnVmZmVyXG4gICAgICAvLyB3aG9zZSBjb250ZW50cyBhcmUgYnl0ZXMuXG4gICAgICByZXR1cm4gc3BlY0NvbnN1bWVCb2R5KHRoaXMsIChieXRlcykgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMpLmJ1ZmZlclxuICAgICAgfSwgaW5zdGFuY2UpXG4gICAgfSxcblxuICAgIHRleHQgKCkge1xuICAgICAgLy8gVGhlIHRleHQoKSBtZXRob2Qgc3RlcHMgYXJlIHRvIHJldHVybiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmdcbiAgICAgIC8vIGNvbnN1bWUgYm9keSB3aXRoIHRoaXMgYW5kIFVURi04IGRlY29kZS5cbiAgICAgIHJldHVybiBzcGVjQ29uc3VtZUJvZHkodGhpcywgdXRmOERlY29kZUJ5dGVzLCBpbnN0YW5jZSlcbiAgICB9LFxuXG4gICAganNvbiAoKSB7XG4gICAgICAvLyBUaGUganNvbigpIG1ldGhvZCBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoZSByZXN1bHQgb2YgcnVubmluZ1xuICAgICAgLy8gY29uc3VtZSBib2R5IHdpdGggdGhpcyBhbmQgcGFyc2UgSlNPTiBmcm9tIGJ5dGVzLlxuICAgICAgcmV0dXJuIHNwZWNDb25zdW1lQm9keSh0aGlzLCBwYXJzZUpTT05Gcm9tQnl0ZXMsIGluc3RhbmNlKVxuICAgIH0sXG5cbiAgICBhc3luYyBmb3JtRGF0YSAoKSB7XG4gICAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBpbnN0YW5jZSlcblxuICAgICAgdGhyb3dJZkFib3J0ZWQodGhpc1trU3RhdGVdKVxuXG4gICAgICBjb25zdCBjb250ZW50VHlwZSA9IHRoaXMuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpXG5cbiAgICAgIC8vIElmIG1pbWVUeXBl4oCZcyBlc3NlbmNlIGlzIFwibXVsdGlwYXJ0L2Zvcm0tZGF0YVwiLCB0aGVuOlxuICAgICAgaWYgKC9tdWx0aXBhcnRcXC9mb3JtLWRhdGEvLnRlc3QoY29udGVudFR5cGUpKSB7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fVxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLmhlYWRlcnMpIGhlYWRlcnNba2V5LnRvTG93ZXJDYXNlKCldID0gdmFsdWVcblxuICAgICAgICBjb25zdCByZXNwb25zZUZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcblxuICAgICAgICBsZXQgYnVzYm95XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBidXNib3kgPSBuZXcgQnVzYm95KHtcbiAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICBwcmVzZXJ2ZVBhdGg6IHRydWVcbiAgICAgICAgICB9KVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKGAke2Vycn1gLCAnQWJvcnRFcnJvcicpXG4gICAgICAgIH1cblxuICAgICAgICBidXNib3kub24oJ2ZpZWxkJywgKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgcmVzcG9uc2VGb3JtRGF0YS5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICAgIH0pXG4gICAgICAgIGJ1c2JveS5vbignZmlsZScsIChuYW1lLCB2YWx1ZSwgZmlsZW5hbWUsIGVuY29kaW5nLCBtaW1lVHlwZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNodW5rcyA9IFtdXG5cbiAgICAgICAgICBpZiAoZW5jb2RpbmcgPT09ICdiYXNlNjQnIHx8IGVuY29kaW5nLnRvTG93ZXJDYXNlKCkgPT09ICdiYXNlNjQnKSB7XG4gICAgICAgICAgICBsZXQgYmFzZTY0Y2h1bmsgPSAnJ1xuXG4gICAgICAgICAgICB2YWx1ZS5vbignZGF0YScsIChjaHVuaykgPT4ge1xuICAgICAgICAgICAgICBiYXNlNjRjaHVuayArPSBjaHVuay50b1N0cmluZygpLnJlcGxhY2UoL1tcXHJcXG5dL2dtLCAnJylcblxuICAgICAgICAgICAgICBjb25zdCBlbmQgPSBiYXNlNjRjaHVuay5sZW5ndGggLSBiYXNlNjRjaHVuay5sZW5ndGggJSA0XG4gICAgICAgICAgICAgIGNodW5rcy5wdXNoKEJ1ZmZlci5mcm9tKGJhc2U2NGNodW5rLnNsaWNlKDAsIGVuZCksICdiYXNlNjQnKSlcblxuICAgICAgICAgICAgICBiYXNlNjRjaHVuayA9IGJhc2U2NGNodW5rLnNsaWNlKGVuZClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB2YWx1ZS5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgICBjaHVua3MucHVzaChCdWZmZXIuZnJvbShiYXNlNjRjaHVuaywgJ2Jhc2U2NCcpKVxuICAgICAgICAgICAgICByZXNwb25zZUZvcm1EYXRhLmFwcGVuZChuYW1lLCBuZXcgRmlsZShjaHVua3MsIGZpbGVuYW1lLCB7IHR5cGU6IG1pbWVUeXBlIH0pKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICAgICAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdmFsdWUub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgcmVzcG9uc2VGb3JtRGF0YS5hcHBlbmQobmFtZSwgbmV3IEZpbGUoY2h1bmtzLCBmaWxlbmFtZSwgeyB0eXBlOiBtaW1lVHlwZSB9KSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IGJ1c2JveVJlc29sdmUgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgYnVzYm95Lm9uKCdmaW5pc2gnLCByZXNvbHZlKVxuICAgICAgICAgIGJ1c2JveS5vbignZXJyb3InLCAoZXJyKSA9PiByZWplY3QobmV3IFR5cGVFcnJvcihlcnIpKSlcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAodGhpcy5ib2R5ICE9PSBudWxsKSBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIGNvbnN1bWVCb2R5KHRoaXNba1N0YXRlXS5ib2R5KSkgYnVzYm95LndyaXRlKGNodW5rKVxuICAgICAgICBidXNib3kuZW5kKClcbiAgICAgICAgYXdhaXQgYnVzYm95UmVzb2x2ZVxuXG4gICAgICAgIHJldHVybiByZXNwb25zZUZvcm1EYXRhXG4gICAgICB9IGVsc2UgaWYgKC9hcHBsaWNhdGlvblxcL3gtd3d3LWZvcm0tdXJsZW5jb2RlZC8udGVzdChjb250ZW50VHlwZSkpIHtcbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBpZiBtaW1lVHlwZeKAmXMgZXNzZW5jZSBpcyBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiLCB0aGVuOlxuXG4gICAgICAgIC8vIDEuIExldCBlbnRyaWVzIGJlIHRoZSByZXN1bHQgb2YgcGFyc2luZyBieXRlcy5cbiAgICAgICAgbGV0IGVudHJpZXNcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsZXQgdGV4dCA9ICcnXG4gICAgICAgICAgLy8gYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIHBhcnNlciB3aWxsIGtlZXAgdGhlIEJPTS5cbiAgICAgICAgICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtdXJsZW5jb2RlZC1wYXJzZXJcbiAgICAgICAgICAvLyBOb3RlIHRoYXQgc3RyZWFtaW5nIGRlY29kZXIgaXMgc3RhdGVmdWwgYW5kIGNhbm5vdCBiZSByZXVzZWRcbiAgICAgICAgICBjb25zdCBzdHJlYW1pbmdEZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCd1dGYtOCcsIHsgaWdub3JlQk9NOiB0cnVlIH0pXG5cbiAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIGNvbnN1bWVCb2R5KHRoaXNba1N0YXRlXS5ib2R5KSkge1xuICAgICAgICAgICAgaWYgKCFpc1VpbnQ4QXJyYXkoY2h1bmspKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFVpbnQ4QXJyYXkgY2h1bmsnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGV4dCArPSBzdHJlYW1pbmdEZWNvZGVyLmRlY29kZShjaHVuaywgeyBzdHJlYW06IHRydWUgfSlcbiAgICAgICAgICB9XG4gICAgICAgICAgdGV4dCArPSBzdHJlYW1pbmdEZWNvZGVyLmRlY29kZSgpXG4gICAgICAgICAgZW50cmllcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXModGV4dClcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHQ6IFVuY2xlYXIgd2hlbiBuZXcgVVJMU2VhcmNoUGFyYW1zIGNhbiBmYWlsIG9uIGEgc3RyaW5nLlxuICAgICAgICAgIC8vIDIuIElmIGVudHJpZXMgaXMgZmFpbHVyZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBUeXBlRXJyb3IoKSwgeyBjYXVzZTogZXJyIH0pXG4gICAgICAgIH1cblxuICAgICAgICAvLyAzLiBSZXR1cm4gYSBuZXcgRm9ybURhdGEgb2JqZWN0IHdob3NlIGVudHJpZXMgYXJlIGVudHJpZXMuXG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvcm1EYXRhXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXYWl0IGEgdGljayBiZWZvcmUgY2hlY2tpbmcgaWYgdGhlIHJlcXVlc3QgaGFzIGJlZW4gYWJvcnRlZC5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBhIFR5cGVFcnJvciBjYW4gYmUgdGhyb3duIHdoZW4gYW4gQWJvcnRFcnJvciBzaG91bGQuXG4gICAgICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZSgpXG5cbiAgICAgICAgdGhyb3dJZkFib3J0ZWQodGhpc1trU3RhdGVdKVxuXG4gICAgICAgIC8vIE90aGVyd2lzZSwgdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICBoZWFkZXI6IGAke2luc3RhbmNlLm5hbWV9LmZvcm1EYXRhYCxcbiAgICAgICAgICBtZXNzYWdlOiAnQ291bGQgbm90IHBhcnNlIGNvbnRlbnQgYXMgRm9ybURhdGEuJ1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXRob2RzXG59XG5cbmZ1bmN0aW9uIG1peGluQm9keSAocHJvdG90eXBlKSB7XG4gIE9iamVjdC5hc3NpZ24ocHJvdG90eXBlLnByb3RvdHlwZSwgYm9keU1peGluTWV0aG9kcyhwcm90b3R5cGUpKVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtYm9keS1jb25zdW1lLWJvZHlcbiAqIEBwYXJhbSB7UmVzcG9uc2V8UmVxdWVzdH0gb2JqZWN0XG4gKiBAcGFyYW0geyh2YWx1ZTogdW5rbm93bikgPT4gdW5rbm93bn0gY29udmVydEJ5dGVzVG9KU1ZhbHVlXG4gKiBAcGFyYW0ge1Jlc3BvbnNlfFJlcXVlc3R9IGluc3RhbmNlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNwZWNDb25zdW1lQm9keSAob2JqZWN0LCBjb252ZXJ0Qnl0ZXNUb0pTVmFsdWUsIGluc3RhbmNlKSB7XG4gIHdlYmlkbC5icmFuZENoZWNrKG9iamVjdCwgaW5zdGFuY2UpXG5cbiAgdGhyb3dJZkFib3J0ZWQob2JqZWN0W2tTdGF0ZV0pXG5cbiAgLy8gMS4gSWYgb2JqZWN0IGlzIHVudXNhYmxlLCB0aGVuIHJldHVybiBhIHByb21pc2UgcmVqZWN0ZWRcbiAgLy8gICAgd2l0aCBhIFR5cGVFcnJvci5cbiAgaWYgKGJvZHlVbnVzYWJsZShvYmplY3Rba1N0YXRlXS5ib2R5KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0JvZHkgaXMgdW51c2FibGUnKVxuICB9XG5cbiAgLy8gMi4gTGV0IHByb21pc2UgYmUgYSBuZXcgcHJvbWlzZS5cbiAgY29uc3QgcHJvbWlzZSA9IGNyZWF0ZURlZmVycmVkUHJvbWlzZSgpXG5cbiAgLy8gMy4gTGV0IGVycm9yU3RlcHMgZ2l2ZW4gZXJyb3IgYmUgdG8gcmVqZWN0IHByb21pc2Ugd2l0aCBlcnJvci5cbiAgY29uc3QgZXJyb3JTdGVwcyA9IChlcnJvcikgPT4gcHJvbWlzZS5yZWplY3QoZXJyb3IpXG5cbiAgLy8gNC4gTGV0IHN1Y2Nlc3NTdGVwcyBnaXZlbiBhIGJ5dGUgc2VxdWVuY2UgZGF0YSBiZSB0byByZXNvbHZlXG4gIC8vICAgIHByb21pc2Ugd2l0aCB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgY29udmVydEJ5dGVzVG9KU1ZhbHVlXG4gIC8vICAgIHdpdGggZGF0YS4gSWYgdGhhdCB0aHJldyBhbiBleGNlcHRpb24sIHRoZW4gcnVuIGVycm9yU3RlcHNcbiAgLy8gICAgd2l0aCB0aGF0IGV4Y2VwdGlvbi5cbiAgY29uc3Qgc3VjY2Vzc1N0ZXBzID0gKGRhdGEpID0+IHtcbiAgICB0cnkge1xuICAgICAgcHJvbWlzZS5yZXNvbHZlKGNvbnZlcnRCeXRlc1RvSlNWYWx1ZShkYXRhKSlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvclN0ZXBzKGUpXG4gICAgfVxuICB9XG5cbiAgLy8gNS4gSWYgb2JqZWN04oCZcyBib2R5IGlzIG51bGwsIHRoZW4gcnVuIHN1Y2Nlc3NTdGVwcyB3aXRoIGFuXG4gIC8vICAgIGVtcHR5IGJ5dGUgc2VxdWVuY2UuXG4gIGlmIChvYmplY3Rba1N0YXRlXS5ib2R5ID09IG51bGwpIHtcbiAgICBzdWNjZXNzU3RlcHMobmV3IFVpbnQ4QXJyYXkoKSlcbiAgICByZXR1cm4gcHJvbWlzZS5wcm9taXNlXG4gIH1cblxuICAvLyA2LiBPdGhlcndpc2UsIGZ1bGx5IHJlYWQgb2JqZWN04oCZcyBib2R5IGdpdmVuIHN1Y2Nlc3NTdGVwcyxcbiAgLy8gICAgZXJyb3JTdGVwcywgYW5kIG9iamVjdOKAmXMgcmVsZXZhbnQgZ2xvYmFsIG9iamVjdC5cbiAgYXdhaXQgZnVsbHlSZWFkQm9keShvYmplY3Rba1N0YXRlXS5ib2R5LCBzdWNjZXNzU3RlcHMsIGVycm9yU3RlcHMpXG5cbiAgLy8gNy4gUmV0dXJuIHByb21pc2UuXG4gIHJldHVybiBwcm9taXNlLnByb21pc2Vcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2JvZHktdW51c2FibGVcbmZ1bmN0aW9uIGJvZHlVbnVzYWJsZSAoYm9keSkge1xuICAvLyBBbiBvYmplY3QgaW5jbHVkaW5nIHRoZSBCb2R5IGludGVyZmFjZSBtaXhpbiBpc1xuICAvLyBzYWlkIHRvIGJlIHVudXNhYmxlIGlmIGl0cyBib2R5IGlzIG5vbi1udWxsIGFuZFxuICAvLyBpdHMgYm9keeKAmXMgc3RyZWFtIGlzIGRpc3R1cmJlZCBvciBsb2NrZWQuXG4gIHJldHVybiBib2R5ICE9IG51bGwgJiYgKGJvZHkuc3RyZWFtLmxvY2tlZCB8fCB1dGlsLmlzRGlzdHVyYmVkKGJvZHkuc3RyZWFtKSlcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZW5jb2Rpbmcuc3BlYy53aGF0d2cub3JnLyN1dGYtOC1kZWNvZGVcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXJcbiAqL1xuZnVuY3Rpb24gdXRmOERlY29kZUJ5dGVzIChidWZmZXIpIHtcbiAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIDEuIExldCBidWZmZXIgYmUgdGhlIHJlc3VsdCBvZiBwZWVraW5nIHRocmVlIGJ5dGVzIGZyb21cbiAgLy8gICAgaW9RdWV1ZSwgY29udmVydGVkIHRvIGEgYnl0ZSBzZXF1ZW5jZS5cblxuICAvLyAyLiBJZiBidWZmZXIgaXMgMHhFRiAweEJCIDB4QkYsIHRoZW4gcmVhZCB0aHJlZVxuICAvLyAgICBieXRlcyBmcm9tIGlvUXVldWUuIChEbyBub3RoaW5nIHdpdGggdGhvc2UgYnl0ZXMuKVxuICBpZiAoYnVmZmVyWzBdID09PSAweEVGICYmIGJ1ZmZlclsxXSA9PT0gMHhCQiAmJiBidWZmZXJbMl0gPT09IDB4QkYpIHtcbiAgICBidWZmZXIgPSBidWZmZXIuc3ViYXJyYXkoMylcbiAgfVxuXG4gIC8vIDMuIFByb2Nlc3MgYSBxdWV1ZSB3aXRoIGFuIGluc3RhbmNlIG9mIFVURi044oCZc1xuICAvLyAgICBkZWNvZGVyLCBpb1F1ZXVlLCBvdXRwdXQsIGFuZCBcInJlcGxhY2VtZW50XCIuXG4gIGNvbnN0IG91dHB1dCA9IHRleHREZWNvZGVyLmRlY29kZShidWZmZXIpXG5cbiAgLy8gNC4gUmV0dXJuIG91dHB1dC5cbiAgcmV0dXJuIG91dHB1dFxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI3BhcnNlLWpzb24tYnl0ZXMtdG8tYS1qYXZhc2NyaXB0LXZhbHVlXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ5dGVzXG4gKi9cbmZ1bmN0aW9uIHBhcnNlSlNPTkZyb21CeXRlcyAoYnl0ZXMpIHtcbiAgcmV0dXJuIEpTT04ucGFyc2UodXRmOERlY29kZUJ5dGVzKGJ5dGVzKSlcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWJvZHktbWltZS10eXBlXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9yZXNwb25zZScpLlJlc3BvbnNlfGltcG9ydCgnLi9yZXF1ZXN0JykuUmVxdWVzdH0gb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGJvZHlNaW1lVHlwZSAob2JqZWN0KSB7XG4gIGNvbnN0IHsgaGVhZGVyc0xpc3QgfSA9IG9iamVjdFtrU3RhdGVdXG4gIGNvbnN0IGNvbnRlbnRUeXBlID0gaGVhZGVyc0xpc3QuZ2V0KCdjb250ZW50LXR5cGUnKVxuXG4gIGlmIChjb250ZW50VHlwZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiAnZmFpbHVyZSdcbiAgfVxuXG4gIHJldHVybiBwYXJzZU1JTUVUeXBlKGNvbnRlbnRUeXBlKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZXh0cmFjdEJvZHksXG4gIHNhZmVseUV4dHJhY3RCb2R5LFxuICBjbG9uZUJvZHksXG4gIG1peGluQm9keVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHtcbiAgSW52YWxpZEFyZ3VtZW50RXJyb3IsXG4gIE5vdFN1cHBvcnRlZEVycm9yXG59ID0gcmVxdWlyZSgnLi9lcnJvcnMnKVxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsga0hUVFAyQnVpbGRSZXF1ZXN0LCBrSFRUUDJDb3B5SGVhZGVycywga0hUVFAxQnVpbGRSZXF1ZXN0IH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpXG5cbi8vIHRva2VuUmVnRXhwIGFuZCBoZWFkZXJDaGFyUmVnZXggaGF2ZSBiZWVuIGxpZnRlZCBmcm9tXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi9tYWluL2xpYi9faHR0cF9jb21tb24uanNcblxuLyoqXG4gKiBWZXJpZmllcyB0aGF0IHRoZSBnaXZlbiB2YWwgaXMgYSB2YWxpZCBIVFRQIHRva2VuXG4gKiBwZXIgdGhlIHJ1bGVzIGRlZmluZWQgaW4gUkZDIDcyMzBcbiAqIFNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMi42XG4gKi9cbmNvbnN0IHRva2VuUmVnRXhwID0gL15bXFxeX2BhLXpBLVpcXC0wLTkhIyQlJicqKy58fl0rJC9cblxuLyoqXG4gKiBNYXRjaGVzIGlmIHZhbCBjb250YWlucyBhbiBpbnZhbGlkIGZpZWxkLXZjaGFyXG4gKiAgZmllbGQtdmFsdWUgICAgPSAqKCBmaWVsZC1jb250ZW50IC8gb2JzLWZvbGQgKVxuICogIGZpZWxkLWNvbnRlbnQgID0gZmllbGQtdmNoYXIgWyAxKiggU1AgLyBIVEFCICkgZmllbGQtdmNoYXIgXVxuICogIGZpZWxkLXZjaGFyICAgID0gVkNIQVIgLyBvYnMtdGV4dFxuICovXG5jb25zdCBoZWFkZXJDaGFyUmVnZXggPSAvW15cXHRcXHgyMC1cXHg3ZVxceDgwLVxceGZmXS9cblxuLy8gVmVyaWZpZXMgdGhhdCBhIGdpdmVuIHBhdGggaXMgdmFsaWQgZG9lcyBub3QgY29udGFpbiBjb250cm9sIGNoYXJzIFxceDAwIHRvIFxceDIwXG5jb25zdCBpbnZhbGlkUGF0aFJlZ2V4ID0gL1teXFx1MDAyMS1cXHUwMGZmXS9cblxuY29uc3Qga0hhbmRsZXIgPSBTeW1ib2woJ2hhbmRsZXInKVxuXG5jb25zdCBjaGFubmVscyA9IHt9XG5cbmxldCBleHRyYWN0Qm9keVxuXG50cnkge1xuICBjb25zdCBkaWFnbm9zdGljc0NoYW5uZWwgPSByZXF1aXJlKCdkaWFnbm9zdGljc19jaGFubmVsJylcbiAgY2hhbm5lbHMuY3JlYXRlID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTpyZXF1ZXN0OmNyZWF0ZScpXG4gIGNoYW5uZWxzLmJvZHlTZW50ID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTpyZXF1ZXN0OmJvZHlTZW50JylcbiAgY2hhbm5lbHMuaGVhZGVycyA9IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6cmVxdWVzdDpoZWFkZXJzJylcbiAgY2hhbm5lbHMudHJhaWxlcnMgPSBkaWFnbm9zdGljc0NoYW5uZWwuY2hhbm5lbCgndW5kaWNpOnJlcXVlc3Q6dHJhaWxlcnMnKVxuICBjaGFubmVscy5lcnJvciA9IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6cmVxdWVzdDplcnJvcicpXG59IGNhdGNoIHtcbiAgY2hhbm5lbHMuY3JlYXRlID0geyBoYXNTdWJzY3JpYmVyczogZmFsc2UgfVxuICBjaGFubmVscy5ib2R5U2VudCA9IHsgaGFzU3Vic2NyaWJlcnM6IGZhbHNlIH1cbiAgY2hhbm5lbHMuaGVhZGVycyA9IHsgaGFzU3Vic2NyaWJlcnM6IGZhbHNlIH1cbiAgY2hhbm5lbHMudHJhaWxlcnMgPSB7IGhhc1N1YnNjcmliZXJzOiBmYWxzZSB9XG4gIGNoYW5uZWxzLmVycm9yID0geyBoYXNTdWJzY3JpYmVyczogZmFsc2UgfVxufVxuXG5jbGFzcyBSZXF1ZXN0IHtcbiAgY29uc3RydWN0b3IgKG9yaWdpbiwge1xuICAgIHBhdGgsXG4gICAgbWV0aG9kLFxuICAgIGJvZHksXG4gICAgaGVhZGVycyxcbiAgICBxdWVyeSxcbiAgICBpZGVtcG90ZW50LFxuICAgIGJsb2NraW5nLFxuICAgIHVwZ3JhZGUsXG4gICAgaGVhZGVyc1RpbWVvdXQsXG4gICAgYm9keVRpbWVvdXQsXG4gICAgcmVzZXQsXG4gICAgdGhyb3dPbkVycm9yLFxuICAgIGV4cGVjdENvbnRpbnVlXG4gIH0sIGhhbmRsZXIpIHtcbiAgICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3BhdGggbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHBhdGhbMF0gIT09ICcvJyAmJlxuICAgICAgIShwYXRoLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSB8fCBwYXRoLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpICYmXG4gICAgICBtZXRob2QgIT09ICdDT05ORUNUJ1xuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdwYXRoIG11c3QgYmUgYW4gYWJzb2x1dGUgVVJMIG9yIHN0YXJ0IHdpdGggYSBzbGFzaCcpXG4gICAgfSBlbHNlIGlmIChpbnZhbGlkUGF0aFJlZ2V4LmV4ZWMocGF0aCkgIT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCByZXF1ZXN0IHBhdGgnKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbWV0aG9kICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdtZXRob2QgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfSBlbHNlIGlmICh0b2tlblJlZ0V4cC5leGVjKG1ldGhvZCkgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCByZXF1ZXN0IG1ldGhvZCcpXG4gICAgfVxuXG4gICAgaWYgKHVwZ3JhZGUgJiYgdHlwZW9mIHVwZ3JhZGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3VwZ3JhZGUgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuXG4gICAgaWYgKGhlYWRlcnNUaW1lb3V0ICE9IG51bGwgJiYgKCFOdW1iZXIuaXNGaW5pdGUoaGVhZGVyc1RpbWVvdXQpIHx8IGhlYWRlcnNUaW1lb3V0IDwgMCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBoZWFkZXJzVGltZW91dCcpXG4gICAgfVxuXG4gICAgaWYgKGJvZHlUaW1lb3V0ICE9IG51bGwgJiYgKCFOdW1iZXIuaXNGaW5pdGUoYm9keVRpbWVvdXQpIHx8IGJvZHlUaW1lb3V0IDwgMCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBib2R5VGltZW91dCcpXG4gICAgfVxuXG4gICAgaWYgKHJlc2V0ICE9IG51bGwgJiYgdHlwZW9mIHJlc2V0ICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCByZXNldCcpXG4gICAgfVxuXG4gICAgaWYgKGV4cGVjdENvbnRpbnVlICE9IG51bGwgJiYgdHlwZW9mIGV4cGVjdENvbnRpbnVlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBleHBlY3RDb250aW51ZScpXG4gICAgfVxuXG4gICAgdGhpcy5oZWFkZXJzVGltZW91dCA9IGhlYWRlcnNUaW1lb3V0XG5cbiAgICB0aGlzLmJvZHlUaW1lb3V0ID0gYm9keVRpbWVvdXRcblxuICAgIHRoaXMudGhyb3dPbkVycm9yID0gdGhyb3dPbkVycm9yID09PSB0cnVlXG5cbiAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZFxuXG4gICAgdGhpcy5hYm9ydCA9IG51bGxcblxuICAgIGlmIChib2R5ID09IG51bGwpIHtcbiAgICAgIHRoaXMuYm9keSA9IG51bGxcbiAgICB9IGVsc2UgaWYgKHV0aWwuaXNTdHJlYW0oYm9keSkpIHtcbiAgICAgIHRoaXMuYm9keSA9IGJvZHlcblxuICAgICAgY29uc3QgclN0YXRlID0gdGhpcy5ib2R5Ll9yZWFkYWJsZVN0YXRlXG4gICAgICBpZiAoIXJTdGF0ZSB8fCAhclN0YXRlLmF1dG9EZXN0cm95KSB7XG4gICAgICAgIHRoaXMuZW5kSGFuZGxlciA9IGZ1bmN0aW9uIGF1dG9EZXN0cm95ICgpIHtcbiAgICAgICAgICB1dGlsLmRlc3Ryb3kodGhpcylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJvZHkub24oJ2VuZCcsIHRoaXMuZW5kSGFuZGxlcilcbiAgICAgIH1cblxuICAgICAgdGhpcy5lcnJvckhhbmRsZXIgPSBlcnIgPT4ge1xuICAgICAgICBpZiAodGhpcy5hYm9ydCkge1xuICAgICAgICAgIHRoaXMuYWJvcnQoZXJyKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZXJyb3IgPSBlcnJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5ib2R5Lm9uKCdlcnJvcicsIHRoaXMuZXJyb3JIYW5kbGVyKVxuICAgIH0gZWxzZSBpZiAodXRpbC5pc0J1ZmZlcihib2R5KSkge1xuICAgICAgdGhpcy5ib2R5ID0gYm9keS5ieXRlTGVuZ3RoID8gYm9keSA6IG51bGxcbiAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhib2R5KSkge1xuICAgICAgdGhpcy5ib2R5ID0gYm9keS5idWZmZXIuYnl0ZUxlbmd0aCA/IEJ1ZmZlci5mcm9tKGJvZHkuYnVmZmVyLCBib2R5LmJ5dGVPZmZzZXQsIGJvZHkuYnl0ZUxlbmd0aCkgOiBudWxsXG4gICAgfSBlbHNlIGlmIChib2R5IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgIHRoaXMuYm9keSA9IGJvZHkuYnl0ZUxlbmd0aCA/IEJ1ZmZlci5mcm9tKGJvZHkpIDogbnVsbFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLmJvZHkgPSBib2R5Lmxlbmd0aCA/IEJ1ZmZlci5mcm9tKGJvZHkpIDogbnVsbFxuICAgIH0gZWxzZSBpZiAodXRpbC5pc0Zvcm1EYXRhTGlrZShib2R5KSB8fCB1dGlsLmlzSXRlcmFibGUoYm9keSkgfHwgdXRpbC5pc0Jsb2JMaWtlKGJvZHkpKSB7XG4gICAgICB0aGlzLmJvZHkgPSBib2R5XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignYm9keSBtdXN0IGJlIGEgc3RyaW5nLCBhIEJ1ZmZlciwgYSBSZWFkYWJsZSBzdHJlYW0sIGFuIGl0ZXJhYmxlLCBvciBhbiBhc3luYyBpdGVyYWJsZScpXG4gICAgfVxuXG4gICAgdGhpcy5jb21wbGV0ZWQgPSBmYWxzZVxuXG4gICAgdGhpcy5hYm9ydGVkID0gZmFsc2VcblxuICAgIHRoaXMudXBncmFkZSA9IHVwZ3JhZGUgfHwgbnVsbFxuXG4gICAgdGhpcy5wYXRoID0gcXVlcnkgPyB1dGlsLmJ1aWxkVVJMKHBhdGgsIHF1ZXJ5KSA6IHBhdGhcblxuICAgIHRoaXMub3JpZ2luID0gb3JpZ2luXG5cbiAgICB0aGlzLmlkZW1wb3RlbnQgPSBpZGVtcG90ZW50ID09IG51bGxcbiAgICAgID8gbWV0aG9kID09PSAnSEVBRCcgfHwgbWV0aG9kID09PSAnR0VUJ1xuICAgICAgOiBpZGVtcG90ZW50XG5cbiAgICB0aGlzLmJsb2NraW5nID0gYmxvY2tpbmcgPT0gbnVsbCA/IGZhbHNlIDogYmxvY2tpbmdcblxuICAgIHRoaXMucmVzZXQgPSByZXNldCA9PSBudWxsID8gbnVsbCA6IHJlc2V0XG5cbiAgICB0aGlzLmhvc3QgPSBudWxsXG5cbiAgICB0aGlzLmNvbnRlbnRMZW5ndGggPSBudWxsXG5cbiAgICB0aGlzLmNvbnRlbnRUeXBlID0gbnVsbFxuXG4gICAgdGhpcy5oZWFkZXJzID0gJydcblxuICAgIC8vIE9ubHkgZm9yIEgyXG4gICAgdGhpcy5leHBlY3RDb250aW51ZSA9IGV4cGVjdENvbnRpbnVlICE9IG51bGwgPyBleHBlY3RDb250aW51ZSA6IGZhbHNlXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgICAgaWYgKGhlYWRlcnMubGVuZ3RoICUgMiAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2hlYWRlcnMgYXJyYXkgbXVzdCBiZSBldmVuJylcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICBwcm9jZXNzSGVhZGVyKHRoaXMsIGhlYWRlcnNbaV0sIGhlYWRlcnNbaSArIDFdKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaGVhZGVycyAmJiB0eXBlb2YgaGVhZGVycyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhoZWFkZXJzKVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV1cbiAgICAgICAgcHJvY2Vzc0hlYWRlcih0aGlzLCBrZXksIGhlYWRlcnNba2V5XSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGhlYWRlcnMgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdoZWFkZXJzIG11c3QgYmUgYW4gb2JqZWN0IG9yIGFuIGFycmF5JylcbiAgICB9XG5cbiAgICBpZiAodXRpbC5pc0Zvcm1EYXRhTGlrZSh0aGlzLmJvZHkpKSB7XG4gICAgICBpZiAodXRpbC5ub2RlTWFqb3IgPCAxNiB8fCAodXRpbC5ub2RlTWFqb3IgPT09IDE2ICYmIHV0aWwubm9kZU1pbm9yIDwgOCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdGb3JtLURhdGEgYm9kaWVzIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBub2RlIHYxNi44IGFuZCBuZXdlci4nKVxuICAgICAgfVxuXG4gICAgICBpZiAoIWV4dHJhY3RCb2R5KSB7XG4gICAgICAgIGV4dHJhY3RCb2R5ID0gcmVxdWlyZSgnLi4vZmV0Y2gvYm9keS5qcycpLmV4dHJhY3RCb2R5XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFtib2R5U3RyZWFtLCBjb250ZW50VHlwZV0gPSBleHRyYWN0Qm9keShib2R5KVxuICAgICAgaWYgKHRoaXMuY29udGVudFR5cGUgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmNvbnRlbnRUeXBlID0gY29udGVudFR5cGVcbiAgICAgICAgdGhpcy5oZWFkZXJzICs9IGBjb250ZW50LXR5cGU6ICR7Y29udGVudFR5cGV9XFxyXFxuYFxuICAgICAgfVxuICAgICAgdGhpcy5ib2R5ID0gYm9keVN0cmVhbS5zdHJlYW1cbiAgICAgIHRoaXMuY29udGVudExlbmd0aCA9IGJvZHlTdHJlYW0ubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh1dGlsLmlzQmxvYkxpa2UoYm9keSkgJiYgdGhpcy5jb250ZW50VHlwZSA9PSBudWxsICYmIGJvZHkudHlwZSkge1xuICAgICAgdGhpcy5jb250ZW50VHlwZSA9IGJvZHkudHlwZVxuICAgICAgdGhpcy5oZWFkZXJzICs9IGBjb250ZW50LXR5cGU6ICR7Ym9keS50eXBlfVxcclxcbmBcbiAgICB9XG5cbiAgICB1dGlsLnZhbGlkYXRlSGFuZGxlcihoYW5kbGVyLCBtZXRob2QsIHVwZ3JhZGUpXG5cbiAgICB0aGlzLnNlcnZlcm5hbWUgPSB1dGlsLmdldFNlcnZlck5hbWUodGhpcy5ob3N0KVxuXG4gICAgdGhpc1trSGFuZGxlcl0gPSBoYW5kbGVyXG5cbiAgICBpZiAoY2hhbm5lbHMuY3JlYXRlLmhhc1N1YnNjcmliZXJzKSB7XG4gICAgICBjaGFubmVscy5jcmVhdGUucHVibGlzaCh7IHJlcXVlc3Q6IHRoaXMgfSlcbiAgICB9XG4gIH1cblxuICBvbkJvZHlTZW50IChjaHVuaykge1xuICAgIGlmICh0aGlzW2tIYW5kbGVyXS5vbkJvZHlTZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdGhpc1trSGFuZGxlcl0ub25Cb2R5U2VudChjaHVuaylcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmFib3J0KGVycilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvblJlcXVlc3RTZW50ICgpIHtcbiAgICBpZiAoY2hhbm5lbHMuYm9keVNlbnQuaGFzU3Vic2NyaWJlcnMpIHtcbiAgICAgIGNoYW5uZWxzLmJvZHlTZW50LnB1Ymxpc2goeyByZXF1ZXN0OiB0aGlzIH0pXG4gICAgfVxuXG4gICAgaWYgKHRoaXNba0hhbmRsZXJdLm9uUmVxdWVzdFNlbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB0aGlzW2tIYW5kbGVyXS5vblJlcXVlc3RTZW50KClcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmFib3J0KGVycilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkNvbm5lY3QgKGFib3J0KSB7XG4gICAgYXNzZXJ0KCF0aGlzLmFib3J0ZWQpXG4gICAgYXNzZXJ0KCF0aGlzLmNvbXBsZXRlZClcblxuICAgIGlmICh0aGlzLmVycm9yKSB7XG4gICAgICBhYm9ydCh0aGlzLmVycm9yKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFib3J0ID0gYWJvcnRcbiAgICAgIHJldHVybiB0aGlzW2tIYW5kbGVyXS5vbkNvbm5lY3QoYWJvcnQpXG4gICAgfVxuICB9XG5cbiAgb25IZWFkZXJzIChzdGF0dXNDb2RlLCBoZWFkZXJzLCByZXN1bWUsIHN0YXR1c1RleHQpIHtcbiAgICBhc3NlcnQoIXRoaXMuYWJvcnRlZClcbiAgICBhc3NlcnQoIXRoaXMuY29tcGxldGVkKVxuXG4gICAgaWYgKGNoYW5uZWxzLmhlYWRlcnMuaGFzU3Vic2NyaWJlcnMpIHtcbiAgICAgIGNoYW5uZWxzLmhlYWRlcnMucHVibGlzaCh7IHJlcXVlc3Q6IHRoaXMsIHJlc3BvbnNlOiB7IHN0YXR1c0NvZGUsIGhlYWRlcnMsIHN0YXR1c1RleHQgfSB9KVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpc1trSGFuZGxlcl0ub25IZWFkZXJzKHN0YXR1c0NvZGUsIGhlYWRlcnMsIHJlc3VtZSwgc3RhdHVzVGV4dClcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuYWJvcnQoZXJyKVxuICAgIH1cbiAgfVxuXG4gIG9uRGF0YSAoY2h1bmspIHtcbiAgICBhc3NlcnQoIXRoaXMuYWJvcnRlZClcbiAgICBhc3NlcnQoIXRoaXMuY29tcGxldGVkKVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzW2tIYW5kbGVyXS5vbkRhdGEoY2h1bmspXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmFib3J0KGVycilcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIG9uVXBncmFkZSAoc3RhdHVzQ29kZSwgaGVhZGVycywgc29ja2V0KSB7XG4gICAgYXNzZXJ0KCF0aGlzLmFib3J0ZWQpXG4gICAgYXNzZXJ0KCF0aGlzLmNvbXBsZXRlZClcblxuICAgIHJldHVybiB0aGlzW2tIYW5kbGVyXS5vblVwZ3JhZGUoc3RhdHVzQ29kZSwgaGVhZGVycywgc29ja2V0KVxuICB9XG5cbiAgb25Db21wbGV0ZSAodHJhaWxlcnMpIHtcbiAgICB0aGlzLm9uRmluYWxseSgpXG5cbiAgICBhc3NlcnQoIXRoaXMuYWJvcnRlZClcblxuICAgIHRoaXMuY29tcGxldGVkID0gdHJ1ZVxuICAgIGlmIChjaGFubmVscy50cmFpbGVycy5oYXNTdWJzY3JpYmVycykge1xuICAgICAgY2hhbm5lbHMudHJhaWxlcnMucHVibGlzaCh7IHJlcXVlc3Q6IHRoaXMsIHRyYWlsZXJzIH0pXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzW2tIYW5kbGVyXS5vbkNvbXBsZXRlKHRyYWlsZXJzKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gVE9ETyAoZml4KTogVGhpcyBtaWdodCBiZSBhIGJhZCBpZGVhP1xuICAgICAgdGhpcy5vbkVycm9yKGVycilcbiAgICB9XG4gIH1cblxuICBvbkVycm9yIChlcnJvcikge1xuICAgIHRoaXMub25GaW5hbGx5KClcblxuICAgIGlmIChjaGFubmVscy5lcnJvci5oYXNTdWJzY3JpYmVycykge1xuICAgICAgY2hhbm5lbHMuZXJyb3IucHVibGlzaCh7IHJlcXVlc3Q6IHRoaXMsIGVycm9yIH0pXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWJvcnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMuYWJvcnRlZCA9IHRydWVcblxuICAgIHJldHVybiB0aGlzW2tIYW5kbGVyXS5vbkVycm9yKGVycm9yKVxuICB9XG5cbiAgb25GaW5hbGx5ICgpIHtcbiAgICBpZiAodGhpcy5lcnJvckhhbmRsZXIpIHtcbiAgICAgIHRoaXMuYm9keS5vZmYoJ2Vycm9yJywgdGhpcy5lcnJvckhhbmRsZXIpXG4gICAgICB0aGlzLmVycm9ySGFuZGxlciA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAodGhpcy5lbmRIYW5kbGVyKSB7XG4gICAgICB0aGlzLmJvZHkub2ZmKCdlbmQnLCB0aGlzLmVuZEhhbmRsZXIpXG4gICAgICB0aGlzLmVuZEhhbmRsZXIgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLy8gVE9ETzogYWRqdXN0IHRvIHN1cHBvcnQgSDJcbiAgYWRkSGVhZGVyIChrZXksIHZhbHVlKSB7XG4gICAgcHJvY2Vzc0hlYWRlcih0aGlzLCBrZXksIHZhbHVlKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzdGF0aWMgW2tIVFRQMUJ1aWxkUmVxdWVzdF0gKG9yaWdpbiwgb3B0cywgaGFuZGxlcikge1xuICAgIC8vIFRPRE86IE1pZ3JhdGUgaGVhZGVyIHBhcnNpbmcgaGVyZSwgdG8gbWFrZSBSZXF1ZXN0c1xuICAgIC8vIEhUVFAgYWdub3N0aWNcbiAgICByZXR1cm4gbmV3IFJlcXVlc3Qob3JpZ2luLCBvcHRzLCBoYW5kbGVyKVxuICB9XG5cbiAgc3RhdGljIFtrSFRUUDJCdWlsZFJlcXVlc3RdIChvcmlnaW4sIG9wdHMsIGhhbmRsZXIpIHtcbiAgICBjb25zdCBoZWFkZXJzID0gb3B0cy5oZWFkZXJzXG4gICAgb3B0cyA9IHsgLi4ub3B0cywgaGVhZGVyczogbnVsbCB9XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3Qob3JpZ2luLCBvcHRzLCBoYW5kbGVyKVxuXG4gICAgcmVxdWVzdC5oZWFkZXJzID0ge31cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGhlYWRlcnMpKSB7XG4gICAgICBpZiAoaGVhZGVycy5sZW5ndGggJSAyICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaGVhZGVycyBhcnJheSBtdXN0IGJlIGV2ZW4nKVxuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIHByb2Nlc3NIZWFkZXIocmVxdWVzdCwgaGVhZGVyc1tpXSwgaGVhZGVyc1tpICsgMV0sIHRydWUpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChoZWFkZXJzICYmIHR5cGVvZiBoZWFkZXJzID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGhlYWRlcnMpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXVxuICAgICAgICBwcm9jZXNzSGVhZGVyKHJlcXVlc3QsIGtleSwgaGVhZGVyc1trZXldLCB0cnVlKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaGVhZGVycyAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2hlYWRlcnMgbXVzdCBiZSBhbiBvYmplY3Qgb3IgYW4gYXJyYXknKVxuICAgIH1cblxuICAgIHJldHVybiByZXF1ZXN0XG4gIH1cblxuICBzdGF0aWMgW2tIVFRQMkNvcHlIZWFkZXJzXSAocmF3KSB7XG4gICAgY29uc3QgcmF3SGVhZGVycyA9IHJhdy5zcGxpdCgnXFxyXFxuJylcbiAgICBjb25zdCBoZWFkZXJzID0ge31cblxuICAgIGZvciAoY29uc3QgaGVhZGVyIG9mIHJhd0hlYWRlcnMpIHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGhlYWRlci5zcGxpdCgnOiAnKVxuXG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGggPT09IDApIGNvbnRpbnVlXG5cbiAgICAgIGlmIChoZWFkZXJzW2tleV0pIGhlYWRlcnNba2V5XSArPSBgLCR7dmFsdWV9YFxuICAgICAgZWxzZSBoZWFkZXJzW2tleV0gPSB2YWx1ZVxuICAgIH1cblxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0hlYWRlclZhbHVlIChrZXksIHZhbCwgc2tpcEFwcGVuZCkge1xuICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKGBpbnZhbGlkICR7a2V5fSBoZWFkZXJgKVxuICB9XG5cbiAgdmFsID0gdmFsICE9IG51bGwgPyBgJHt2YWx9YCA6ICcnXG5cbiAgaWYgKGhlYWRlckNoYXJSZWdleC5leGVjKHZhbCkgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoYGludmFsaWQgJHtrZXl9IGhlYWRlcmApXG4gIH1cblxuICByZXR1cm4gc2tpcEFwcGVuZCA/IHZhbCA6IGAke2tleX06ICR7dmFsfVxcclxcbmBcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0hlYWRlciAocmVxdWVzdCwga2V5LCB2YWwsIHNraXBBcHBlbmQgPSBmYWxzZSkge1xuICBpZiAodmFsICYmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWwpKSkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihgaW52YWxpZCAke2tleX0gaGVhZGVyYClcbiAgfSBlbHNlIGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKFxuICAgIHJlcXVlc3QuaG9zdCA9PT0gbnVsbCAmJlxuICAgIGtleS5sZW5ndGggPT09IDQgJiZcbiAgICBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2hvc3QnXG4gICkge1xuICAgIGlmIChoZWFkZXJDaGFyUmVnZXguZXhlYyh2YWwpICE9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoYGludmFsaWQgJHtrZXl9IGhlYWRlcmApXG4gICAgfVxuICAgIC8vIENvbnN1bWVkIGJ5IENsaWVudFxuICAgIHJlcXVlc3QuaG9zdCA9IHZhbFxuICB9IGVsc2UgaWYgKFxuICAgIHJlcXVlc3QuY29udGVudExlbmd0aCA9PT0gbnVsbCAmJlxuICAgIGtleS5sZW5ndGggPT09IDE0ICYmXG4gICAga2V5LnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LWxlbmd0aCdcbiAgKSB7XG4gICAgcmVxdWVzdC5jb250ZW50TGVuZ3RoID0gcGFyc2VJbnQodmFsLCAxMClcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShyZXF1ZXN0LmNvbnRlbnRMZW5ndGgpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgY29udGVudC1sZW5ndGggaGVhZGVyJylcbiAgICB9XG4gIH0gZWxzZSBpZiAoXG4gICAgcmVxdWVzdC5jb250ZW50VHlwZSA9PT0gbnVsbCAmJlxuICAgIGtleS5sZW5ndGggPT09IDEyICYmXG4gICAga2V5LnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LXR5cGUnXG4gICkge1xuICAgIHJlcXVlc3QuY29udGVudFR5cGUgPSB2YWxcbiAgICBpZiAoc2tpcEFwcGVuZCkgcmVxdWVzdC5oZWFkZXJzW2tleV0gPSBwcm9jZXNzSGVhZGVyVmFsdWUoa2V5LCB2YWwsIHNraXBBcHBlbmQpXG4gICAgZWxzZSByZXF1ZXN0LmhlYWRlcnMgKz0gcHJvY2Vzc0hlYWRlclZhbHVlKGtleSwgdmFsKVxuICB9IGVsc2UgaWYgKFxuICAgIGtleS5sZW5ndGggPT09IDE3ICYmXG4gICAga2V5LnRvTG93ZXJDYXNlKCkgPT09ICd0cmFuc2Zlci1lbmNvZGluZydcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIHRyYW5zZmVyLWVuY29kaW5nIGhlYWRlcicpXG4gIH0gZWxzZSBpZiAoXG4gICAga2V5Lmxlbmd0aCA9PT0gMTAgJiZcbiAgICBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2Nvbm5lY3Rpb24nXG4gICkge1xuICAgIGNvbnN0IHZhbHVlID0gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyB2YWwudG9Mb3dlckNhc2UoKSA6IG51bGxcbiAgICBpZiAodmFsdWUgIT09ICdjbG9zZScgJiYgdmFsdWUgIT09ICdrZWVwLWFsaXZlJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGNvbm5lY3Rpb24gaGVhZGVyJylcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnY2xvc2UnKSB7XG4gICAgICByZXF1ZXN0LnJlc2V0ID0gdHJ1ZVxuICAgIH1cbiAgfSBlbHNlIGlmIChcbiAgICBrZXkubGVuZ3RoID09PSAxMCAmJlxuICAgIGtleS50b0xvd2VyQ2FzZSgpID09PSAna2VlcC1hbGl2ZSdcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGtlZXAtYWxpdmUgaGVhZGVyJylcbiAgfSBlbHNlIGlmIChcbiAgICBrZXkubGVuZ3RoID09PSA3ICYmXG4gICAga2V5LnRvTG93ZXJDYXNlKCkgPT09ICd1cGdyYWRlJ1xuICApIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgdXBncmFkZSBoZWFkZXInKVxuICB9IGVsc2UgaWYgKFxuICAgIGtleS5sZW5ndGggPT09IDYgJiZcbiAgICBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2V4cGVjdCdcbiAgKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEVycm9yKCdleHBlY3QgaGVhZGVyIG5vdCBzdXBwb3J0ZWQnKVxuICB9IGVsc2UgaWYgKHRva2VuUmVnRXhwLmV4ZWMoa2V5KSA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBoZWFkZXIga2V5JylcbiAgfSBlbHNlIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc2tpcEFwcGVuZCkge1xuICAgICAgICAgIGlmIChyZXF1ZXN0LmhlYWRlcnNba2V5XSkgcmVxdWVzdC5oZWFkZXJzW2tleV0gKz0gYCwke3Byb2Nlc3NIZWFkZXJWYWx1ZShrZXksIHZhbFtpXSwgc2tpcEFwcGVuZCl9YFxuICAgICAgICAgIGVsc2UgcmVxdWVzdC5oZWFkZXJzW2tleV0gPSBwcm9jZXNzSGVhZGVyVmFsdWUoa2V5LCB2YWxbaV0sIHNraXBBcHBlbmQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVxdWVzdC5oZWFkZXJzICs9IHByb2Nlc3NIZWFkZXJWYWx1ZShrZXksIHZhbFtpXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2tpcEFwcGVuZCkgcmVxdWVzdC5oZWFkZXJzW2tleV0gPSBwcm9jZXNzSGVhZGVyVmFsdWUoa2V5LCB2YWwsIHNraXBBcHBlbmQpXG4gICAgICBlbHNlIHJlcXVlc3QuaGVhZGVycyArPSBwcm9jZXNzSGVhZGVyVmFsdWUoa2V5LCB2YWwpXG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmVxdWVzdFxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ2V2ZW50cycpXG5cbmNsYXNzIERpc3BhdGNoZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBkaXNwYXRjaCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKVxuICB9XG5cbiAgY2xvc2UgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJylcbiAgfVxuXG4gIGRlc3Ryb3kgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJylcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IERpc3BhdGNoZXJcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBEaXNwYXRjaGVyID0gcmVxdWlyZSgnLi9kaXNwYXRjaGVyJylcbmNvbnN0IHtcbiAgQ2xpZW50RGVzdHJveWVkRXJyb3IsXG4gIENsaWVudENsb3NlZEVycm9yLFxuICBJbnZhbGlkQXJndW1lbnRFcnJvclxufSA9IHJlcXVpcmUoJy4vY29yZS9lcnJvcnMnKVxuY29uc3QgeyBrRGVzdHJveSwga0Nsb3NlLCBrRGlzcGF0Y2gsIGtJbnRlcmNlcHRvcnMgfSA9IHJlcXVpcmUoJy4vY29yZS9zeW1ib2xzJylcblxuY29uc3Qga0Rlc3Ryb3llZCA9IFN5bWJvbCgnZGVzdHJveWVkJylcbmNvbnN0IGtDbG9zZWQgPSBTeW1ib2woJ2Nsb3NlZCcpXG5jb25zdCBrT25EZXN0cm95ZWQgPSBTeW1ib2woJ29uRGVzdHJveWVkJylcbmNvbnN0IGtPbkNsb3NlZCA9IFN5bWJvbCgnb25DbG9zZWQnKVxuY29uc3Qga0ludGVyY2VwdGVkRGlzcGF0Y2ggPSBTeW1ib2woJ0ludGVyY2VwdGVkIERpc3BhdGNoJylcblxuY2xhc3MgRGlzcGF0Y2hlckJhc2UgZXh0ZW5kcyBEaXNwYXRjaGVyIHtcbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHN1cGVyKClcblxuICAgIHRoaXNba0Rlc3Ryb3llZF0gPSBmYWxzZVxuICAgIHRoaXNba09uRGVzdHJveWVkXSA9IG51bGxcbiAgICB0aGlzW2tDbG9zZWRdID0gZmFsc2VcbiAgICB0aGlzW2tPbkNsb3NlZF0gPSBbXVxuICB9XG5cbiAgZ2V0IGRlc3Ryb3llZCAoKSB7XG4gICAgcmV0dXJuIHRoaXNba0Rlc3Ryb3llZF1cbiAgfVxuXG4gIGdldCBjbG9zZWQgKCkge1xuICAgIHJldHVybiB0aGlzW2tDbG9zZWRdXG4gIH1cblxuICBnZXQgaW50ZXJjZXB0b3JzICgpIHtcbiAgICByZXR1cm4gdGhpc1trSW50ZXJjZXB0b3JzXVxuICB9XG5cbiAgc2V0IGludGVyY2VwdG9ycyAobmV3SW50ZXJjZXB0b3JzKSB7XG4gICAgaWYgKG5ld0ludGVyY2VwdG9ycykge1xuICAgICAgZm9yIChsZXQgaSA9IG5ld0ludGVyY2VwdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCBpbnRlcmNlcHRvciA9IHRoaXNba0ludGVyY2VwdG9yc11baV1cbiAgICAgICAgaWYgKHR5cGVvZiBpbnRlcmNlcHRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW50ZXJjZXB0b3IgbXVzdCBiZSBhbiBmdW5jdGlvbicpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzW2tJbnRlcmNlcHRvcnNdID0gbmV3SW50ZXJjZXB0b3JzXG4gIH1cblxuICBjbG9zZSAoY2FsbGJhY2spIHtcbiAgICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5jbG9zZSgoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZShkYXRhKVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgY2FsbGJhY2snKVxuICAgIH1cblxuICAgIGlmICh0aGlzW2tEZXN0cm95ZWRdKSB7XG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBjYWxsYmFjayhuZXcgQ2xpZW50RGVzdHJveWVkRXJyb3IoKSwgbnVsbCkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpc1trQ2xvc2VkXSkge1xuICAgICAgaWYgKHRoaXNba09uQ2xvc2VkXSkge1xuICAgICAgICB0aGlzW2tPbkNsb3NlZF0ucHVzaChjYWxsYmFjaylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IGNhbGxiYWNrKG51bGwsIG51bGwpKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpc1trQ2xvc2VkXSA9IHRydWVcbiAgICB0aGlzW2tPbkNsb3NlZF0ucHVzaChjYWxsYmFjaylcblxuICAgIGNvbnN0IG9uQ2xvc2VkID0gKCkgPT4ge1xuICAgICAgY29uc3QgY2FsbGJhY2tzID0gdGhpc1trT25DbG9zZWRdXG4gICAgICB0aGlzW2tPbkNsb3NlZF0gPSBudWxsXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjYWxsYmFja3NbaV0obnVsbCwgbnVsbClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTaG91bGQgbm90IGVycm9yLlxuICAgIHRoaXNba0Nsb3NlXSgpXG4gICAgICAudGhlbigoKSA9PiB0aGlzLmRlc3Ryb3koKSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgcXVldWVNaWNyb3Rhc2sob25DbG9zZWQpXG4gICAgICB9KVxuICB9XG5cbiAgZGVzdHJveSAoZXJyLCBjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgZXJyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IGVyclxuICAgICAgZXJyID0gbnVsbFxuICAgIH1cblxuICAgIGlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLmRlc3Ryb3koZXJyLCAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGVyciA/IC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBzaG91bGQgbmV2ZXIgZXJyb3IgKi8gcmVqZWN0KGVycikgOiByZXNvbHZlKGRhdGEpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBjYWxsYmFjaycpXG4gICAgfVxuXG4gICAgaWYgKHRoaXNba0Rlc3Ryb3llZF0pIHtcbiAgICAgIGlmICh0aGlzW2tPbkRlc3Ryb3llZF0pIHtcbiAgICAgICAgdGhpc1trT25EZXN0cm95ZWRdLnB1c2goY2FsbGJhY2spXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBjYWxsYmFjayhudWxsLCBudWxsKSlcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghZXJyKSB7XG4gICAgICBlcnIgPSBuZXcgQ2xpZW50RGVzdHJveWVkRXJyb3IoKVxuICAgIH1cblxuICAgIHRoaXNba0Rlc3Ryb3llZF0gPSB0cnVlXG4gICAgdGhpc1trT25EZXN0cm95ZWRdID0gdGhpc1trT25EZXN0cm95ZWRdIHx8IFtdXG4gICAgdGhpc1trT25EZXN0cm95ZWRdLnB1c2goY2FsbGJhY2spXG5cbiAgICBjb25zdCBvbkRlc3Ryb3llZCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IHRoaXNba09uRGVzdHJveWVkXVxuICAgICAgdGhpc1trT25EZXN0cm95ZWRdID0gbnVsbFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2FsbGJhY2tzW2ldKG51bGwsIG51bGwpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2hvdWxkIG5vdCBlcnJvci5cbiAgICB0aGlzW2tEZXN0cm95XShlcnIpLnRoZW4oKCkgPT4ge1xuICAgICAgcXVldWVNaWNyb3Rhc2sob25EZXN0cm95ZWQpXG4gICAgfSlcbiAgfVxuXG4gIFtrSW50ZXJjZXB0ZWREaXNwYXRjaF0gKG9wdHMsIGhhbmRsZXIpIHtcbiAgICBpZiAoIXRoaXNba0ludGVyY2VwdG9yc10gfHwgdGhpc1trSW50ZXJjZXB0b3JzXS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXNba0ludGVyY2VwdGVkRGlzcGF0Y2hdID0gdGhpc1trRGlzcGF0Y2hdXG4gICAgICByZXR1cm4gdGhpc1trRGlzcGF0Y2hdKG9wdHMsIGhhbmRsZXIpXG4gICAgfVxuXG4gICAgbGV0IGRpc3BhdGNoID0gdGhpc1trRGlzcGF0Y2hdLmJpbmQodGhpcylcbiAgICBmb3IgKGxldCBpID0gdGhpc1trSW50ZXJjZXB0b3JzXS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgZGlzcGF0Y2ggPSB0aGlzW2tJbnRlcmNlcHRvcnNdW2ldKGRpc3BhdGNoKVxuICAgIH1cbiAgICB0aGlzW2tJbnRlcmNlcHRlZERpc3BhdGNoXSA9IGRpc3BhdGNoXG4gICAgcmV0dXJuIGRpc3BhdGNoKG9wdHMsIGhhbmRsZXIpXG4gIH1cblxuICBkaXNwYXRjaCAob3B0cywgaGFuZGxlcikge1xuICAgIGlmICghaGFuZGxlciB8fCB0eXBlb2YgaGFuZGxlciAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaGFuZGxlciBtdXN0IGJlIGFuIG9iamVjdCcpXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmICghb3B0cyB8fCB0eXBlb2Ygb3B0cyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdvcHRzIG11c3QgYmUgYW4gb2JqZWN0LicpXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzW2tEZXN0cm95ZWRdIHx8IHRoaXNba09uRGVzdHJveWVkXSkge1xuICAgICAgICB0aHJvdyBuZXcgQ2xpZW50RGVzdHJveWVkRXJyb3IoKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpc1trQ2xvc2VkXSkge1xuICAgICAgICB0aHJvdyBuZXcgQ2xpZW50Q2xvc2VkRXJyb3IoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpc1trSW50ZXJjZXB0ZWREaXNwYXRjaF0ob3B0cywgaGFuZGxlcilcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmICh0eXBlb2YgaGFuZGxlci5vbkVycm9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvbkVycm9yIG1ldGhvZCcpXG4gICAgICB9XG5cbiAgICAgIGhhbmRsZXIub25FcnJvcihlcnIpXG5cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IERpc3BhdGNoZXJCYXNlXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgbmV0ID0gcmVxdWlyZSgnbmV0JylcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IsIENvbm5lY3RUaW1lb3V0RXJyb3IgfSA9IHJlcXVpcmUoJy4vZXJyb3JzJylcblxubGV0IHRscyAvLyBpbmNsdWRlIHRscyBjb25kaXRpb25hbGx5IHNpbmNlIGl0IGlzIG5vdCBhbHdheXMgYXZhaWxhYmxlXG5cbi8vIFRPRE86IHNlc3Npb24gcmUtdXNlIGRvZXMgbm90IHdhaXQgZm9yIHRoZSBmaXJzdFxuLy8gY29ubmVjdGlvbiB0byByZXNvbHZlIHRoZSBzZXNzaW9uIGFuZCBtaWdodCB0aGVyZWZvcmVcbi8vIHJlc29sdmUgdGhlIHNhbWUgc2VydmVybmFtZSBtdWx0aXBsZSB0aW1lcyBldmVuIHdoZW5cbi8vIHJlLXVzZSBpcyBlbmFibGVkLlxuXG5sZXQgU2Vzc2lvbkNhY2hlXG4vLyBGSVhNRTogcmVtb3ZlIHdvcmthcm91bmQgd2hlbiB0aGUgTm9kZSBidWcgaXMgZml4ZWRcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvNDkzNDQjaXNzdWVjb21tZW50LTE3NDE3NzYzMDhcbmlmIChnbG9iYWwuRmluYWxpemF0aW9uUmVnaXN0cnkgJiYgIXByb2Nlc3MuZW52Lk5PREVfVjhfQ09WRVJBR0UpIHtcbiAgU2Vzc2lvbkNhY2hlID0gY2xhc3MgV2Vha1Nlc3Npb25DYWNoZSB7XG4gICAgY29uc3RydWN0b3IgKG1heENhY2hlZFNlc3Npb25zKSB7XG4gICAgICB0aGlzLl9tYXhDYWNoZWRTZXNzaW9ucyA9IG1heENhY2hlZFNlc3Npb25zXG4gICAgICB0aGlzLl9zZXNzaW9uQ2FjaGUgPSBuZXcgTWFwKClcbiAgICAgIHRoaXMuX3Nlc3Npb25SZWdpc3RyeSA9IG5ldyBnbG9iYWwuRmluYWxpemF0aW9uUmVnaXN0cnkoKGtleSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fc2Vzc2lvbkNhY2hlLnNpemUgPCB0aGlzLl9tYXhDYWNoZWRTZXNzaW9ucykge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVmID0gdGhpcy5fc2Vzc2lvbkNhY2hlLmdldChrZXkpXG4gICAgICAgIGlmIChyZWYgIT09IHVuZGVmaW5lZCAmJiByZWYuZGVyZWYoKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5fc2Vzc2lvbkNhY2hlLmRlbGV0ZShrZXkpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZ2V0IChzZXNzaW9uS2V5KSB7XG4gICAgICBjb25zdCByZWYgPSB0aGlzLl9zZXNzaW9uQ2FjaGUuZ2V0KHNlc3Npb25LZXkpXG4gICAgICByZXR1cm4gcmVmID8gcmVmLmRlcmVmKCkgOiBudWxsXG4gICAgfVxuXG4gICAgc2V0IChzZXNzaW9uS2V5LCBzZXNzaW9uKSB7XG4gICAgICBpZiAodGhpcy5fbWF4Q2FjaGVkU2Vzc2lvbnMgPT09IDApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3Nlc3Npb25DYWNoZS5zZXQoc2Vzc2lvbktleSwgbmV3IFdlYWtSZWYoc2Vzc2lvbikpXG4gICAgICB0aGlzLl9zZXNzaW9uUmVnaXN0cnkucmVnaXN0ZXIoc2Vzc2lvbiwgc2Vzc2lvbktleSlcbiAgICB9XG4gIH1cbn0gZWxzZSB7XG4gIFNlc3Npb25DYWNoZSA9IGNsYXNzIFNpbXBsZVNlc3Npb25DYWNoZSB7XG4gICAgY29uc3RydWN0b3IgKG1heENhY2hlZFNlc3Npb25zKSB7XG4gICAgICB0aGlzLl9tYXhDYWNoZWRTZXNzaW9ucyA9IG1heENhY2hlZFNlc3Npb25zXG4gICAgICB0aGlzLl9zZXNzaW9uQ2FjaGUgPSBuZXcgTWFwKClcbiAgICB9XG5cbiAgICBnZXQgKHNlc3Npb25LZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXNzaW9uQ2FjaGUuZ2V0KHNlc3Npb25LZXkpXG4gICAgfVxuXG4gICAgc2V0IChzZXNzaW9uS2V5LCBzZXNzaW9uKSB7XG4gICAgICBpZiAodGhpcy5fbWF4Q2FjaGVkU2Vzc2lvbnMgPT09IDApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9zZXNzaW9uQ2FjaGUuc2l6ZSA+PSB0aGlzLl9tYXhDYWNoZWRTZXNzaW9ucykge1xuICAgICAgICAvLyByZW1vdmUgdGhlIG9sZGVzdCBzZXNzaW9uXG4gICAgICAgIGNvbnN0IHsgdmFsdWU6IG9sZGVzdEtleSB9ID0gdGhpcy5fc2Vzc2lvbkNhY2hlLmtleXMoKS5uZXh0KClcbiAgICAgICAgdGhpcy5fc2Vzc2lvbkNhY2hlLmRlbGV0ZShvbGRlc3RLZXkpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3Nlc3Npb25DYWNoZS5zZXQoc2Vzc2lvbktleSwgc2Vzc2lvbilcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRDb25uZWN0b3IgKHsgYWxsb3dIMiwgbWF4Q2FjaGVkU2Vzc2lvbnMsIHNvY2tldFBhdGgsIHRpbWVvdXQsIC4uLm9wdHMgfSkge1xuICBpZiAobWF4Q2FjaGVkU2Vzc2lvbnMgIT0gbnVsbCAmJiAoIU51bWJlci5pc0ludGVnZXIobWF4Q2FjaGVkU2Vzc2lvbnMpIHx8IG1heENhY2hlZFNlc3Npb25zIDwgMCkpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ21heENhY2hlZFNlc3Npb25zIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIG9yIHplcm8nKVxuICB9XG5cbiAgY29uc3Qgb3B0aW9ucyA9IHsgcGF0aDogc29ja2V0UGF0aCwgLi4ub3B0cyB9XG4gIGNvbnN0IHNlc3Npb25DYWNoZSA9IG5ldyBTZXNzaW9uQ2FjaGUobWF4Q2FjaGVkU2Vzc2lvbnMgPT0gbnVsbCA/IDEwMCA6IG1heENhY2hlZFNlc3Npb25zKVxuICB0aW1lb3V0ID0gdGltZW91dCA9PSBudWxsID8gMTBlMyA6IHRpbWVvdXRcbiAgYWxsb3dIMiA9IGFsbG93SDIgIT0gbnVsbCA/IGFsbG93SDIgOiBmYWxzZVxuICByZXR1cm4gZnVuY3Rpb24gY29ubmVjdCAoeyBob3N0bmFtZSwgaG9zdCwgcHJvdG9jb2wsIHBvcnQsIHNlcnZlcm5hbWUsIGxvY2FsQWRkcmVzcywgaHR0cFNvY2tldCB9LCBjYWxsYmFjaykge1xuICAgIGxldCBzb2NrZXRcbiAgICBpZiAocHJvdG9jb2wgPT09ICdodHRwczonKSB7XG4gICAgICBpZiAoIXRscykge1xuICAgICAgICB0bHMgPSByZXF1aXJlKCd0bHMnKVxuICAgICAgfVxuICAgICAgc2VydmVybmFtZSA9IHNlcnZlcm5hbWUgfHwgb3B0aW9ucy5zZXJ2ZXJuYW1lIHx8IHV0aWwuZ2V0U2VydmVyTmFtZShob3N0KSB8fCBudWxsXG5cbiAgICAgIGNvbnN0IHNlc3Npb25LZXkgPSBzZXJ2ZXJuYW1lIHx8IGhvc3RuYW1lXG4gICAgICBjb25zdCBzZXNzaW9uID0gc2Vzc2lvbkNhY2hlLmdldChzZXNzaW9uS2V5KSB8fCBudWxsXG5cbiAgICAgIGFzc2VydChzZXNzaW9uS2V5KVxuXG4gICAgICBzb2NrZXQgPSB0bHMuY29ubmVjdCh7XG4gICAgICAgIGhpZ2hXYXRlck1hcms6IDE2Mzg0LCAvLyBUTFMgaW4gbm9kZSBjYW4ndCBoYXZlIGJpZ2dlciBIV00gYW55d2F5Li4uXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIHNlcnZlcm5hbWUsXG4gICAgICAgIHNlc3Npb24sXG4gICAgICAgIGxvY2FsQWRkcmVzcyxcbiAgICAgICAgLy8gVE9ETyhIVFRQLzIpOiBBZGQgc3VwcG9ydCBmb3IgaDJjXG4gICAgICAgIEFMUE5Qcm90b2NvbHM6IGFsbG93SDIgPyBbJ2h0dHAvMS4xJywgJ2gyJ10gOiBbJ2h0dHAvMS4xJ10sXG4gICAgICAgIHNvY2tldDogaHR0cFNvY2tldCwgLy8gdXBncmFkZSBzb2NrZXQgY29ubmVjdGlvblxuICAgICAgICBwb3J0OiBwb3J0IHx8IDQ0MyxcbiAgICAgICAgaG9zdDogaG9zdG5hbWVcbiAgICAgIH0pXG5cbiAgICAgIHNvY2tldFxuICAgICAgICAub24oJ3Nlc3Npb24nLCBmdW5jdGlvbiAoc2Vzc2lvbikge1xuICAgICAgICAgIC8vIFRPRE8gKGZpeCk6IENhbiBhIHNlc3Npb24gYmVjb21lIGludmFsaWQgb25jZSBlc3RhYmxpc2hlZD8gRG9uJ3QgdGhpbmsgc28/XG4gICAgICAgICAgc2Vzc2lvbkNhY2hlLnNldChzZXNzaW9uS2V5LCBzZXNzaW9uKVxuICAgICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoIWh0dHBTb2NrZXQsICdodHRwU29ja2V0IGNhbiBvbmx5IGJlIHNlbnQgb24gVExTIHVwZGF0ZScpXG4gICAgICBzb2NrZXQgPSBuZXQuY29ubmVjdCh7XG4gICAgICAgIGhpZ2hXYXRlck1hcms6IDY0ICogMTAyNCwgLy8gU2FtZSBhcyBub2RlanMgZnMgc3RyZWFtcy5cbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgbG9jYWxBZGRyZXNzLFxuICAgICAgICBwb3J0OiBwb3J0IHx8IDgwLFxuICAgICAgICBob3N0OiBob3N0bmFtZVxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBTZXQgVENQIGtlZXAgYWxpdmUgb3B0aW9ucyBvbiB0aGUgc29ja2V0IGhlcmUgaW5zdGVhZCBvZiBpbiBjb25uZWN0KCkgZm9yIHRoZSBjYXNlIG9mIGFzc2lnbmluZyB0aGUgc29ja2V0XG4gICAgaWYgKG9wdGlvbnMua2VlcEFsaXZlID09IG51bGwgfHwgb3B0aW9ucy5rZWVwQWxpdmUpIHtcbiAgICAgIGNvbnN0IGtlZXBBbGl2ZUluaXRpYWxEZWxheSA9IG9wdGlvbnMua2VlcEFsaXZlSW5pdGlhbERlbGF5ID09PSB1bmRlZmluZWQgPyA2MGUzIDogb3B0aW9ucy5rZWVwQWxpdmVJbml0aWFsRGVsYXlcbiAgICAgIHNvY2tldC5zZXRLZWVwQWxpdmUodHJ1ZSwga2VlcEFsaXZlSW5pdGlhbERlbGF5KVxuICAgIH1cblxuICAgIGNvbnN0IGNhbmNlbFRpbWVvdXQgPSBzZXR1cFRpbWVvdXQoKCkgPT4gb25Db25uZWN0VGltZW91dChzb2NrZXQpLCB0aW1lb3V0KVxuXG4gICAgc29ja2V0XG4gICAgICAuc2V0Tm9EZWxheSh0cnVlKVxuICAgICAgLm9uY2UocHJvdG9jb2wgPT09ICdodHRwczonID8gJ3NlY3VyZUNvbm5lY3QnIDogJ2Nvbm5lY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNhbmNlbFRpbWVvdXQoKVxuXG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgIGNvbnN0IGNiID0gY2FsbGJhY2tcbiAgICAgICAgICBjYWxsYmFjayA9IG51bGxcbiAgICAgICAgICBjYihudWxsLCB0aGlzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgY2FuY2VsVGltZW91dCgpXG5cbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgY29uc3QgY2IgPSBjYWxsYmFja1xuICAgICAgICAgIGNhbGxiYWNrID0gbnVsbFxuICAgICAgICAgIGNiKGVycilcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgIHJldHVybiBzb2NrZXRcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXR1cFRpbWVvdXQgKG9uQ29ubmVjdFRpbWVvdXQsIHRpbWVvdXQpIHtcbiAgaWYgKCF0aW1lb3V0KSB7XG4gICAgcmV0dXJuICgpID0+IHt9XG4gIH1cblxuICBsZXQgczEgPSBudWxsXG4gIGxldCBzMiA9IG51bGxcbiAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgLy8gc2V0SW1tZWRpYXRlIGlzIGFkZGVkIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIHByaW90b3Jpc2Ugc29ja2V0IGVycm9yIGV2ZW50cyBvdmVyIHRpbWVvdXRzXG4gICAgczEgPSBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgICAgLy8gV2luZG93cyBuZWVkcyBhbiBleHRyYSBzZXRJbW1lZGlhdGUgcHJvYmFibHkgZHVlIHRvIGltcGxlbWVudGF0aW9uIGRpZmZlcmVuY2VzIGluIHRoZSBzb2NrZXQgbG9naWNcbiAgICAgICAgczIgPSBzZXRJbW1lZGlhdGUoKCkgPT4gb25Db25uZWN0VGltZW91dCgpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25Db25uZWN0VGltZW91dCgpXG4gICAgICB9XG4gICAgfSlcbiAgfSwgdGltZW91dClcbiAgcmV0dXJuICgpID0+IHtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dElkKVxuICAgIGNsZWFySW1tZWRpYXRlKHMxKVxuICAgIGNsZWFySW1tZWRpYXRlKHMyKVxuICB9XG59XG5cbmZ1bmN0aW9uIG9uQ29ubmVjdFRpbWVvdXQgKHNvY2tldCkge1xuICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgQ29ubmVjdFRpbWVvdXRFcnJvcigpKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJ1aWxkQ29ubmVjdG9yXG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZW51bVRvTWFwID0gdm9pZCAwO1xuZnVuY3Rpb24gZW51bVRvTWFwKG9iaikge1xuICAgIGNvbnN0IHJlcyA9IHt9O1xuICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXNba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMuZW51bVRvTWFwID0gZW51bVRvTWFwO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNQRUNJQUxfSEVBREVSUyA9IGV4cG9ydHMuSEVBREVSX1NUQVRFID0gZXhwb3J0cy5NSU5PUiA9IGV4cG9ydHMuTUFKT1IgPSBleHBvcnRzLkNPTk5FQ1RJT05fVE9LRU5fQ0hBUlMgPSBleHBvcnRzLkhFQURFUl9DSEFSUyA9IGV4cG9ydHMuVE9LRU4gPSBleHBvcnRzLlNUUklDVF9UT0tFTiA9IGV4cG9ydHMuSEVYID0gZXhwb3J0cy5VUkxfQ0hBUiA9IGV4cG9ydHMuU1RSSUNUX1VSTF9DSEFSID0gZXhwb3J0cy5VU0VSSU5GT19DSEFSUyA9IGV4cG9ydHMuTUFSSyA9IGV4cG9ydHMuQUxQSEFOVU0gPSBleHBvcnRzLk5VTSA9IGV4cG9ydHMuSEVYX01BUCA9IGV4cG9ydHMuTlVNX01BUCA9IGV4cG9ydHMuQUxQSEEgPSBleHBvcnRzLkZJTklTSCA9IGV4cG9ydHMuSF9NRVRIT0RfTUFQID0gZXhwb3J0cy5NRVRIT0RfTUFQID0gZXhwb3J0cy5NRVRIT0RTX1JUU1AgPSBleHBvcnRzLk1FVEhPRFNfSUNFID0gZXhwb3J0cy5NRVRIT0RTX0hUVFAgPSBleHBvcnRzLk1FVEhPRFMgPSBleHBvcnRzLkxFTklFTlRfRkxBR1MgPSBleHBvcnRzLkZMQUdTID0gZXhwb3J0cy5UWVBFID0gZXhwb3J0cy5FUlJPUiA9IHZvaWQgMDtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbi8vIEMgaGVhZGVyc1xudmFyIEVSUk9SO1xuKGZ1bmN0aW9uIChFUlJPUikge1xuICAgIEVSUk9SW0VSUk9SW1wiT0tcIl0gPSAwXSA9IFwiT0tcIjtcbiAgICBFUlJPUltFUlJPUltcIklOVEVSTkFMXCJdID0gMV0gPSBcIklOVEVSTkFMXCI7XG4gICAgRVJST1JbRVJST1JbXCJTVFJJQ1RcIl0gPSAyXSA9IFwiU1RSSUNUXCI7XG4gICAgRVJST1JbRVJST1JbXCJMRl9FWFBFQ1RFRFwiXSA9IDNdID0gXCJMRl9FWFBFQ1RFRFwiO1xuICAgIEVSUk9SW0VSUk9SW1wiVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSFwiXSA9IDRdID0gXCJVTkVYUEVDVEVEX0NPTlRFTlRfTEVOR1RIXCI7XG4gICAgRVJST1JbRVJST1JbXCJDTE9TRURfQ09OTkVDVElPTlwiXSA9IDVdID0gXCJDTE9TRURfQ09OTkVDVElPTlwiO1xuICAgIEVSUk9SW0VSUk9SW1wiSU5WQUxJRF9NRVRIT0RcIl0gPSA2XSA9IFwiSU5WQUxJRF9NRVRIT0RcIjtcbiAgICBFUlJPUltFUlJPUltcIklOVkFMSURfVVJMXCJdID0gN10gPSBcIklOVkFMSURfVVJMXCI7XG4gICAgRVJST1JbRVJST1JbXCJJTlZBTElEX0NPTlNUQU5UXCJdID0gOF0gPSBcIklOVkFMSURfQ09OU1RBTlRcIjtcbiAgICBFUlJPUltFUlJPUltcIklOVkFMSURfVkVSU0lPTlwiXSA9IDldID0gXCJJTlZBTElEX1ZFUlNJT05cIjtcbiAgICBFUlJPUltFUlJPUltcIklOVkFMSURfSEVBREVSX1RPS0VOXCJdID0gMTBdID0gXCJJTlZBTElEX0hFQURFUl9UT0tFTlwiO1xuICAgIEVSUk9SW0VSUk9SW1wiSU5WQUxJRF9DT05URU5UX0xFTkdUSFwiXSA9IDExXSA9IFwiSU5WQUxJRF9DT05URU5UX0xFTkdUSFwiO1xuICAgIEVSUk9SW0VSUk9SW1wiSU5WQUxJRF9DSFVOS19TSVpFXCJdID0gMTJdID0gXCJJTlZBTElEX0NIVU5LX1NJWkVcIjtcbiAgICBFUlJPUltFUlJPUltcIklOVkFMSURfU1RBVFVTXCJdID0gMTNdID0gXCJJTlZBTElEX1NUQVRVU1wiO1xuICAgIEVSUk9SW0VSUk9SW1wiSU5WQUxJRF9FT0ZfU1RBVEVcIl0gPSAxNF0gPSBcIklOVkFMSURfRU9GX1NUQVRFXCI7XG4gICAgRVJST1JbRVJST1JbXCJJTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HXCJdID0gMTVdID0gXCJJTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HXCI7XG4gICAgRVJST1JbRVJST1JbXCJDQl9NRVNTQUdFX0JFR0lOXCJdID0gMTZdID0gXCJDQl9NRVNTQUdFX0JFR0lOXCI7XG4gICAgRVJST1JbRVJST1JbXCJDQl9IRUFERVJTX0NPTVBMRVRFXCJdID0gMTddID0gXCJDQl9IRUFERVJTX0NPTVBMRVRFXCI7XG4gICAgRVJST1JbRVJST1JbXCJDQl9NRVNTQUdFX0NPTVBMRVRFXCJdID0gMThdID0gXCJDQl9NRVNTQUdFX0NPTVBMRVRFXCI7XG4gICAgRVJST1JbRVJST1JbXCJDQl9DSFVOS19IRUFERVJcIl0gPSAxOV0gPSBcIkNCX0NIVU5LX0hFQURFUlwiO1xuICAgIEVSUk9SW0VSUk9SW1wiQ0JfQ0hVTktfQ09NUExFVEVcIl0gPSAyMF0gPSBcIkNCX0NIVU5LX0NPTVBMRVRFXCI7XG4gICAgRVJST1JbRVJST1JbXCJQQVVTRURcIl0gPSAyMV0gPSBcIlBBVVNFRFwiO1xuICAgIEVSUk9SW0VSUk9SW1wiUEFVU0VEX1VQR1JBREVcIl0gPSAyMl0gPSBcIlBBVVNFRF9VUEdSQURFXCI7XG4gICAgRVJST1JbRVJST1JbXCJQQVVTRURfSDJfVVBHUkFERVwiXSA9IDIzXSA9IFwiUEFVU0VEX0gyX1VQR1JBREVcIjtcbiAgICBFUlJPUltFUlJPUltcIlVTRVJcIl0gPSAyNF0gPSBcIlVTRVJcIjtcbn0pKEVSUk9SID0gZXhwb3J0cy5FUlJPUiB8fCAoZXhwb3J0cy5FUlJPUiA9IHt9KSk7XG52YXIgVFlQRTtcbihmdW5jdGlvbiAoVFlQRSkge1xuICAgIFRZUEVbVFlQRVtcIkJPVEhcIl0gPSAwXSA9IFwiQk9USFwiO1xuICAgIFRZUEVbVFlQRVtcIlJFUVVFU1RcIl0gPSAxXSA9IFwiUkVRVUVTVFwiO1xuICAgIFRZUEVbVFlQRVtcIlJFU1BPTlNFXCJdID0gMl0gPSBcIlJFU1BPTlNFXCI7XG59KShUWVBFID0gZXhwb3J0cy5UWVBFIHx8IChleHBvcnRzLlRZUEUgPSB7fSkpO1xudmFyIEZMQUdTO1xuKGZ1bmN0aW9uIChGTEFHUykge1xuICAgIEZMQUdTW0ZMQUdTW1wiQ09OTkVDVElPTl9LRUVQX0FMSVZFXCJdID0gMV0gPSBcIkNPTk5FQ1RJT05fS0VFUF9BTElWRVwiO1xuICAgIEZMQUdTW0ZMQUdTW1wiQ09OTkVDVElPTl9DTE9TRVwiXSA9IDJdID0gXCJDT05ORUNUSU9OX0NMT1NFXCI7XG4gICAgRkxBR1NbRkxBR1NbXCJDT05ORUNUSU9OX1VQR1JBREVcIl0gPSA0XSA9IFwiQ09OTkVDVElPTl9VUEdSQURFXCI7XG4gICAgRkxBR1NbRkxBR1NbXCJDSFVOS0VEXCJdID0gOF0gPSBcIkNIVU5LRURcIjtcbiAgICBGTEFHU1tGTEFHU1tcIlVQR1JBREVcIl0gPSAxNl0gPSBcIlVQR1JBREVcIjtcbiAgICBGTEFHU1tGTEFHU1tcIkNPTlRFTlRfTEVOR1RIXCJdID0gMzJdID0gXCJDT05URU5UX0xFTkdUSFwiO1xuICAgIEZMQUdTW0ZMQUdTW1wiU0tJUEJPRFlcIl0gPSA2NF0gPSBcIlNLSVBCT0RZXCI7XG4gICAgRkxBR1NbRkxBR1NbXCJUUkFJTElOR1wiXSA9IDEyOF0gPSBcIlRSQUlMSU5HXCI7XG4gICAgLy8gMSA8PCA4IGlzIHVudXNlZFxuICAgIEZMQUdTW0ZMQUdTW1wiVFJBTlNGRVJfRU5DT0RJTkdcIl0gPSA1MTJdID0gXCJUUkFOU0ZFUl9FTkNPRElOR1wiO1xufSkoRkxBR1MgPSBleHBvcnRzLkZMQUdTIHx8IChleHBvcnRzLkZMQUdTID0ge30pKTtcbnZhciBMRU5JRU5UX0ZMQUdTO1xuKGZ1bmN0aW9uIChMRU5JRU5UX0ZMQUdTKSB7XG4gICAgTEVOSUVOVF9GTEFHU1tMRU5JRU5UX0ZMQUdTW1wiSEVBREVSU1wiXSA9IDFdID0gXCJIRUFERVJTXCI7XG4gICAgTEVOSUVOVF9GTEFHU1tMRU5JRU5UX0ZMQUdTW1wiQ0hVTktFRF9MRU5HVEhcIl0gPSAyXSA9IFwiQ0hVTktFRF9MRU5HVEhcIjtcbiAgICBMRU5JRU5UX0ZMQUdTW0xFTklFTlRfRkxBR1NbXCJLRUVQX0FMSVZFXCJdID0gNF0gPSBcIktFRVBfQUxJVkVcIjtcbn0pKExFTklFTlRfRkxBR1MgPSBleHBvcnRzLkxFTklFTlRfRkxBR1MgfHwgKGV4cG9ydHMuTEVOSUVOVF9GTEFHUyA9IHt9KSk7XG52YXIgTUVUSE9EUztcbihmdW5jdGlvbiAoTUVUSE9EUykge1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkRFTEVURVwiXSA9IDBdID0gXCJERUxFVEVcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJHRVRcIl0gPSAxXSA9IFwiR0VUXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiSEVBRFwiXSA9IDJdID0gXCJIRUFEXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUE9TVFwiXSA9IDNdID0gXCJQT1NUXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUFVUXCJdID0gNF0gPSBcIlBVVFwiO1xuICAgIC8qIHBhdGhvbG9naWNhbCAqL1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkNPTk5FQ1RcIl0gPSA1XSA9IFwiQ09OTkVDVFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIk9QVElPTlNcIl0gPSA2XSA9IFwiT1BUSU9OU1wiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlRSQUNFXCJdID0gN10gPSBcIlRSQUNFXCI7XG4gICAgLyogV2ViREFWICovXG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiQ09QWVwiXSA9IDhdID0gXCJDT1BZXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiTE9DS1wiXSA9IDldID0gXCJMT0NLXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiTUtDT0xcIl0gPSAxMF0gPSBcIk1LQ09MXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiTU9WRVwiXSA9IDExXSA9IFwiTU9WRVwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlBST1BGSU5EXCJdID0gMTJdID0gXCJQUk9QRklORFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlBST1BQQVRDSFwiXSA9IDEzXSA9IFwiUFJPUFBBVENIXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiU0VBUkNIXCJdID0gMTRdID0gXCJTRUFSQ0hcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJVTkxPQ0tcIl0gPSAxNV0gPSBcIlVOTE9DS1wiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkJJTkRcIl0gPSAxNl0gPSBcIkJJTkRcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJSRUJJTkRcIl0gPSAxN10gPSBcIlJFQklORFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlVOQklORFwiXSA9IDE4XSA9IFwiVU5CSU5EXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiQUNMXCJdID0gMTldID0gXCJBQ0xcIjtcbiAgICAvKiBzdWJ2ZXJzaW9uICovXG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUkVQT1JUXCJdID0gMjBdID0gXCJSRVBPUlRcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJNS0FDVElWSVRZXCJdID0gMjFdID0gXCJNS0FDVElWSVRZXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiQ0hFQ0tPVVRcIl0gPSAyMl0gPSBcIkNIRUNLT1VUXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiTUVSR0VcIl0gPSAyM10gPSBcIk1FUkdFXCI7XG4gICAgLyogdXBucCAqL1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIk0tU0VBUkNIXCJdID0gMjRdID0gXCJNLVNFQVJDSFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIk5PVElGWVwiXSA9IDI1XSA9IFwiTk9USUZZXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiU1VCU0NSSUJFXCJdID0gMjZdID0gXCJTVUJTQ1JJQkVcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJVTlNVQlNDUklCRVwiXSA9IDI3XSA9IFwiVU5TVUJTQ1JJQkVcIjtcbiAgICAvKiBSRkMtNTc4OSAqL1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlBBVENIXCJdID0gMjhdID0gXCJQQVRDSFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlBVUkdFXCJdID0gMjldID0gXCJQVVJHRVwiO1xuICAgIC8qIENhbERBViAqL1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIk1LQ0FMRU5EQVJcIl0gPSAzMF0gPSBcIk1LQ0FMRU5EQVJcIjtcbiAgICAvKiBSRkMtMjA2OCwgc2VjdGlvbiAxOS42LjEuMiAqL1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkxJTktcIl0gPSAzMV0gPSBcIkxJTktcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJVTkxJTktcIl0gPSAzMl0gPSBcIlVOTElOS1wiO1xuICAgIC8qIGljZWNhc3QgKi9cbiAgICBNRVRIT0RTW01FVEhPRFNbXCJTT1VSQ0VcIl0gPSAzM10gPSBcIlNPVVJDRVwiO1xuICAgIC8qIFJGQy03NTQwLCBzZWN0aW9uIDExLjYgKi9cbiAgICBNRVRIT0RTW01FVEhPRFNbXCJQUklcIl0gPSAzNF0gPSBcIlBSSVwiO1xuICAgIC8qIFJGQy0yMzI2IFJUU1AgKi9cbiAgICBNRVRIT0RTW01FVEhPRFNbXCJERVNDUklCRVwiXSA9IDM1XSA9IFwiREVTQ1JJQkVcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJBTk5PVU5DRVwiXSA9IDM2XSA9IFwiQU5OT1VOQ0VcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJTRVRVUFwiXSA9IDM3XSA9IFwiU0VUVVBcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJQTEFZXCJdID0gMzhdID0gXCJQTEFZXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUEFVU0VcIl0gPSAzOV0gPSBcIlBBVVNFXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiVEVBUkRPV05cIl0gPSA0MF0gPSBcIlRFQVJET1dOXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiR0VUX1BBUkFNRVRFUlwiXSA9IDQxXSA9IFwiR0VUX1BBUkFNRVRFUlwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlNFVF9QQVJBTUVURVJcIl0gPSA0Ml0gPSBcIlNFVF9QQVJBTUVURVJcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJSRURJUkVDVFwiXSA9IDQzXSA9IFwiUkVESVJFQ1RcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJSRUNPUkRcIl0gPSA0NF0gPSBcIlJFQ09SRFwiO1xuICAgIC8qIFJBT1AgKi9cbiAgICBNRVRIT0RTW01FVEhPRFNbXCJGTFVTSFwiXSA9IDQ1XSA9IFwiRkxVU0hcIjtcbn0pKE1FVEhPRFMgPSBleHBvcnRzLk1FVEhPRFMgfHwgKGV4cG9ydHMuTUVUSE9EUyA9IHt9KSk7XG5leHBvcnRzLk1FVEhPRFNfSFRUUCA9IFtcbiAgICBNRVRIT0RTLkRFTEVURSxcbiAgICBNRVRIT0RTLkdFVCxcbiAgICBNRVRIT0RTLkhFQUQsXG4gICAgTUVUSE9EUy5QT1NULFxuICAgIE1FVEhPRFMuUFVULFxuICAgIE1FVEhPRFMuQ09OTkVDVCxcbiAgICBNRVRIT0RTLk9QVElPTlMsXG4gICAgTUVUSE9EUy5UUkFDRSxcbiAgICBNRVRIT0RTLkNPUFksXG4gICAgTUVUSE9EUy5MT0NLLFxuICAgIE1FVEhPRFMuTUtDT0wsXG4gICAgTUVUSE9EUy5NT1ZFLFxuICAgIE1FVEhPRFMuUFJPUEZJTkQsXG4gICAgTUVUSE9EUy5QUk9QUEFUQ0gsXG4gICAgTUVUSE9EUy5TRUFSQ0gsXG4gICAgTUVUSE9EUy5VTkxPQ0ssXG4gICAgTUVUSE9EUy5CSU5ELFxuICAgIE1FVEhPRFMuUkVCSU5ELFxuICAgIE1FVEhPRFMuVU5CSU5ELFxuICAgIE1FVEhPRFMuQUNMLFxuICAgIE1FVEhPRFMuUkVQT1JULFxuICAgIE1FVEhPRFMuTUtBQ1RJVklUWSxcbiAgICBNRVRIT0RTLkNIRUNLT1VULFxuICAgIE1FVEhPRFMuTUVSR0UsXG4gICAgTUVUSE9EU1snTS1TRUFSQ0gnXSxcbiAgICBNRVRIT0RTLk5PVElGWSxcbiAgICBNRVRIT0RTLlNVQlNDUklCRSxcbiAgICBNRVRIT0RTLlVOU1VCU0NSSUJFLFxuICAgIE1FVEhPRFMuUEFUQ0gsXG4gICAgTUVUSE9EUy5QVVJHRSxcbiAgICBNRVRIT0RTLk1LQ0FMRU5EQVIsXG4gICAgTUVUSE9EUy5MSU5LLFxuICAgIE1FVEhPRFMuVU5MSU5LLFxuICAgIE1FVEhPRFMuUFJJLFxuICAgIC8vIFRPRE8oaW5kdXRueSk6IHNob3VsZCB3ZSBhbGxvdyBpdCB3aXRoIEhUVFA/XG4gICAgTUVUSE9EUy5TT1VSQ0UsXG5dO1xuZXhwb3J0cy5NRVRIT0RTX0lDRSA9IFtcbiAgICBNRVRIT0RTLlNPVVJDRSxcbl07XG5leHBvcnRzLk1FVEhPRFNfUlRTUCA9IFtcbiAgICBNRVRIT0RTLk9QVElPTlMsXG4gICAgTUVUSE9EUy5ERVNDUklCRSxcbiAgICBNRVRIT0RTLkFOTk9VTkNFLFxuICAgIE1FVEhPRFMuU0VUVVAsXG4gICAgTUVUSE9EUy5QTEFZLFxuICAgIE1FVEhPRFMuUEFVU0UsXG4gICAgTUVUSE9EUy5URUFSRE9XTixcbiAgICBNRVRIT0RTLkdFVF9QQVJBTUVURVIsXG4gICAgTUVUSE9EUy5TRVRfUEFSQU1FVEVSLFxuICAgIE1FVEhPRFMuUkVESVJFQ1QsXG4gICAgTUVUSE9EUy5SRUNPUkQsXG4gICAgTUVUSE9EUy5GTFVTSCxcbiAgICAvLyBGb3IgQWlyUGxheVxuICAgIE1FVEhPRFMuR0VULFxuICAgIE1FVEhPRFMuUE9TVCxcbl07XG5leHBvcnRzLk1FVEhPRF9NQVAgPSB1dGlsc18xLmVudW1Ub01hcChNRVRIT0RTKTtcbmV4cG9ydHMuSF9NRVRIT0RfTUFQID0ge307XG5PYmplY3Qua2V5cyhleHBvcnRzLk1FVEhPRF9NQVApLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGlmICgvXkgvLnRlc3Qoa2V5KSkge1xuICAgICAgICBleHBvcnRzLkhfTUVUSE9EX01BUFtrZXldID0gZXhwb3J0cy5NRVRIT0RfTUFQW2tleV07XG4gICAgfVxufSk7XG52YXIgRklOSVNIO1xuKGZ1bmN0aW9uIChGSU5JU0gpIHtcbiAgICBGSU5JU0hbRklOSVNIW1wiU0FGRVwiXSA9IDBdID0gXCJTQUZFXCI7XG4gICAgRklOSVNIW0ZJTklTSFtcIlNBRkVfV0lUSF9DQlwiXSA9IDFdID0gXCJTQUZFX1dJVEhfQ0JcIjtcbiAgICBGSU5JU0hbRklOSVNIW1wiVU5TQUZFXCJdID0gMl0gPSBcIlVOU0FGRVwiO1xufSkoRklOSVNIID0gZXhwb3J0cy5GSU5JU0ggfHwgKGV4cG9ydHMuRklOSVNIID0ge30pKTtcbmV4cG9ydHMuQUxQSEEgPSBbXTtcbmZvciAobGV0IGkgPSAnQScuY2hhckNvZGVBdCgwKTsgaSA8PSAnWicuY2hhckNvZGVBdCgwKTsgaSsrKSB7XG4gICAgLy8gVXBwZXIgY2FzZVxuICAgIGV4cG9ydHMuQUxQSEEucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGkpKTtcbiAgICAvLyBMb3dlciBjYXNlXG4gICAgZXhwb3J0cy5BTFBIQS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoaSArIDB4MjApKTtcbn1cbmV4cG9ydHMuTlVNX01BUCA9IHtcbiAgICAwOiAwLCAxOiAxLCAyOiAyLCAzOiAzLCA0OiA0LFxuICAgIDU6IDUsIDY6IDYsIDc6IDcsIDg6IDgsIDk6IDksXG59O1xuZXhwb3J0cy5IRVhfTUFQID0ge1xuICAgIDA6IDAsIDE6IDEsIDI6IDIsIDM6IDMsIDQ6IDQsXG4gICAgNTogNSwgNjogNiwgNzogNywgODogOCwgOTogOSxcbiAgICBBOiAwWEEsIEI6IDBYQiwgQzogMFhDLCBEOiAwWEQsIEU6IDBYRSwgRjogMFhGLFxuICAgIGE6IDB4YSwgYjogMHhiLCBjOiAweGMsIGQ6IDB4ZCwgZTogMHhlLCBmOiAweGYsXG59O1xuZXhwb3J0cy5OVU0gPSBbXG4gICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLFxuXTtcbmV4cG9ydHMuQUxQSEFOVU0gPSBleHBvcnRzLkFMUEhBLmNvbmNhdChleHBvcnRzLk5VTSk7XG5leHBvcnRzLk1BUksgPSBbJy0nLCAnXycsICcuJywgJyEnLCAnficsICcqJywgJ1xcJycsICcoJywgJyknXTtcbmV4cG9ydHMuVVNFUklORk9fQ0hBUlMgPSBleHBvcnRzLkFMUEhBTlVNXG4gICAgLmNvbmNhdChleHBvcnRzLk1BUkspXG4gICAgLmNvbmNhdChbJyUnLCAnOycsICc6JywgJyYnLCAnPScsICcrJywgJyQnLCAnLCddKTtcbi8vIFRPRE8oaW5kdXRueSk6IHVzZSBSRkNcbmV4cG9ydHMuU1RSSUNUX1VSTF9DSEFSID0gW1xuICAgICchJywgJ1wiJywgJyQnLCAnJScsICcmJywgJ1xcJycsXG4gICAgJygnLCAnKScsICcqJywgJysnLCAnLCcsICctJywgJy4nLCAnLycsXG4gICAgJzonLCAnOycsICc8JywgJz0nLCAnPicsXG4gICAgJ0AnLCAnWycsICdcXFxcJywgJ10nLCAnXicsICdfJyxcbiAgICAnYCcsXG4gICAgJ3snLCAnfCcsICd9JywgJ34nLFxuXS5jb25jYXQoZXhwb3J0cy5BTFBIQU5VTSk7XG5leHBvcnRzLlVSTF9DSEFSID0gZXhwb3J0cy5TVFJJQ1RfVVJMX0NIQVJcbiAgICAuY29uY2F0KFsnXFx0JywgJ1xcZiddKTtcbi8vIEFsbCBjaGFyYWN0ZXJzIHdpdGggMHg4MCBiaXQgc2V0IHRvIDFcbmZvciAobGV0IGkgPSAweDgwOyBpIDw9IDB4ZmY7IGkrKykge1xuICAgIGV4cG9ydHMuVVJMX0NIQVIucHVzaChpKTtcbn1cbmV4cG9ydHMuSEVYID0gZXhwb3J0cy5OVU0uY29uY2F0KFsnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnXSk7XG4vKiBUb2tlbnMgYXMgZGVmaW5lZCBieSByZmMgMjYxNi4gQWxzbyBsb3dlcmNhc2VzIHRoZW0uXG4gKiAgICAgICAgdG9rZW4gICAgICAgPSAxKjxhbnkgQ0hBUiBleGNlcHQgQ1RMcyBvciBzZXBhcmF0b3JzPlxuICogICAgIHNlcGFyYXRvcnMgICAgID0gXCIoXCIgfCBcIilcIiB8IFwiPFwiIHwgXCI+XCIgfCBcIkBcIlxuICogICAgICAgICAgICAgICAgICAgIHwgXCIsXCIgfCBcIjtcIiB8IFwiOlwiIHwgXCJcXFwiIHwgPFwiPlxuICogICAgICAgICAgICAgICAgICAgIHwgXCIvXCIgfCBcIltcIiB8IFwiXVwiIHwgXCI/XCIgfCBcIj1cIlxuICogICAgICAgICAgICAgICAgICAgIHwgXCJ7XCIgfCBcIn1cIiB8IFNQIHwgSFRcbiAqL1xuZXhwb3J0cy5TVFJJQ1RfVE9LRU4gPSBbXG4gICAgJyEnLCAnIycsICckJywgJyUnLCAnJicsICdcXCcnLFxuICAgICcqJywgJysnLCAnLScsICcuJyxcbiAgICAnXicsICdfJywgJ2AnLFxuICAgICd8JywgJ34nLFxuXS5jb25jYXQoZXhwb3J0cy5BTFBIQU5VTSk7XG5leHBvcnRzLlRPS0VOID0gZXhwb3J0cy5TVFJJQ1RfVE9LRU4uY29uY2F0KFsnICddKTtcbi8qXG4gKiBWZXJpZnkgdGhhdCBhIGNoYXIgaXMgYSB2YWxpZCB2aXNpYmxlIChwcmludGFibGUpIFVTLUFTQ0lJXG4gKiBjaGFyYWN0ZXIgb3IgJXg4MC1GRlxuICovXG5leHBvcnRzLkhFQURFUl9DSEFSUyA9IFsnXFx0J107XG5mb3IgKGxldCBpID0gMzI7IGkgPD0gMjU1OyBpKyspIHtcbiAgICBpZiAoaSAhPT0gMTI3KSB7XG4gICAgICAgIGV4cG9ydHMuSEVBREVSX0NIQVJTLnB1c2goaSk7XG4gICAgfVxufVxuLy8gJywnID0gXFx4NDRcbmV4cG9ydHMuQ09OTkVDVElPTl9UT0tFTl9DSEFSUyA9IGV4cG9ydHMuSEVBREVSX0NIQVJTLmZpbHRlcigoYykgPT4gYyAhPT0gNDQpO1xuZXhwb3J0cy5NQUpPUiA9IGV4cG9ydHMuTlVNX01BUDtcbmV4cG9ydHMuTUlOT1IgPSBleHBvcnRzLk1BSk9SO1xudmFyIEhFQURFUl9TVEFURTtcbihmdW5jdGlvbiAoSEVBREVSX1NUQVRFKSB7XG4gICAgSEVBREVSX1NUQVRFW0hFQURFUl9TVEFURVtcIkdFTkVSQUxcIl0gPSAwXSA9IFwiR0VORVJBTFwiO1xuICAgIEhFQURFUl9TVEFURVtIRUFERVJfU1RBVEVbXCJDT05ORUNUSU9OXCJdID0gMV0gPSBcIkNPTk5FQ1RJT05cIjtcbiAgICBIRUFERVJfU1RBVEVbSEVBREVSX1NUQVRFW1wiQ09OVEVOVF9MRU5HVEhcIl0gPSAyXSA9IFwiQ09OVEVOVF9MRU5HVEhcIjtcbiAgICBIRUFERVJfU1RBVEVbSEVBREVSX1NUQVRFW1wiVFJBTlNGRVJfRU5DT0RJTkdcIl0gPSAzXSA9IFwiVFJBTlNGRVJfRU5DT0RJTkdcIjtcbiAgICBIRUFERVJfU1RBVEVbSEVBREVSX1NUQVRFW1wiVVBHUkFERVwiXSA9IDRdID0gXCJVUEdSQURFXCI7XG4gICAgSEVBREVSX1NUQVRFW0hFQURFUl9TVEFURVtcIkNPTk5FQ1RJT05fS0VFUF9BTElWRVwiXSA9IDVdID0gXCJDT05ORUNUSU9OX0tFRVBfQUxJVkVcIjtcbiAgICBIRUFERVJfU1RBVEVbSEVBREVSX1NUQVRFW1wiQ09OTkVDVElPTl9DTE9TRVwiXSA9IDZdID0gXCJDT05ORUNUSU9OX0NMT1NFXCI7XG4gICAgSEVBREVSX1NUQVRFW0hFQURFUl9TVEFURVtcIkNPTk5FQ1RJT05fVVBHUkFERVwiXSA9IDddID0gXCJDT05ORUNUSU9OX1VQR1JBREVcIjtcbiAgICBIRUFERVJfU1RBVEVbSEVBREVSX1NUQVRFW1wiVFJBTlNGRVJfRU5DT0RJTkdfQ0hVTktFRFwiXSA9IDhdID0gXCJUUkFOU0ZFUl9FTkNPRElOR19DSFVOS0VEXCI7XG59KShIRUFERVJfU1RBVEUgPSBleHBvcnRzLkhFQURFUl9TVEFURSB8fCAoZXhwb3J0cy5IRUFERVJfU1RBVEUgPSB7fSkpO1xuZXhwb3J0cy5TUEVDSUFMX0hFQURFUlMgPSB7XG4gICAgJ2Nvbm5lY3Rpb24nOiBIRUFERVJfU1RBVEUuQ09OTkVDVElPTixcbiAgICAnY29udGVudC1sZW5ndGgnOiBIRUFERVJfU1RBVEUuQ09OVEVOVF9MRU5HVEgsXG4gICAgJ3Byb3h5LWNvbm5lY3Rpb24nOiBIRUFERVJfU1RBVEUuQ09OTkVDVElPTixcbiAgICAndHJhbnNmZXItZW5jb2RpbmcnOiBIRUFERVJfU1RBVEUuVFJBTlNGRVJfRU5DT0RJTkcsXG4gICAgJ3VwZ3JhZGUnOiBIRUFERVJfU1RBVEUuVVBHUkFERSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdGFudHMuanMubWFwIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBrQm9keVVzZWQgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciB9ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMnKVxuY29uc3QgRUUgPSByZXF1aXJlKCdldmVudHMnKVxuXG5jb25zdCByZWRpcmVjdGFibGVTdGF0dXNDb2RlcyA9IFszMDAsIDMwMSwgMzAyLCAzMDMsIDMwNywgMzA4XVxuXG5jb25zdCBrQm9keSA9IFN5bWJvbCgnYm9keScpXG5cbmNsYXNzIEJvZHlBc3luY0l0ZXJhYmxlIHtcbiAgY29uc3RydWN0b3IgKGJvZHkpIHtcbiAgICB0aGlzW2tCb2R5XSA9IGJvZHlcbiAgICB0aGlzW2tCb2R5VXNlZF0gPSBmYWxzZVxuICB9XG5cbiAgYXN5bmMgKiBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdICgpIHtcbiAgICBhc3NlcnQoIXRoaXNba0JvZHlVc2VkXSwgJ2Rpc3R1cmJlZCcpXG4gICAgdGhpc1trQm9keVVzZWRdID0gdHJ1ZVxuICAgIHlpZWxkICogdGhpc1trQm9keV1cbiAgfVxufVxuXG5jbGFzcyBSZWRpcmVjdEhhbmRsZXIge1xuICBjb25zdHJ1Y3RvciAoZGlzcGF0Y2gsIG1heFJlZGlyZWN0aW9ucywgb3B0cywgaGFuZGxlcikge1xuICAgIGlmIChtYXhSZWRpcmVjdGlvbnMgIT0gbnVsbCAmJiAoIU51bWJlci5pc0ludGVnZXIobWF4UmVkaXJlY3Rpb25zKSB8fCBtYXhSZWRpcmVjdGlvbnMgPCAwKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdtYXhSZWRpcmVjdGlvbnMgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpXG4gICAgfVxuXG4gICAgdXRpbC52YWxpZGF0ZUhhbmRsZXIoaGFuZGxlciwgb3B0cy5tZXRob2QsIG9wdHMudXBncmFkZSlcblxuICAgIHRoaXMuZGlzcGF0Y2ggPSBkaXNwYXRjaFxuICAgIHRoaXMubG9jYXRpb24gPSBudWxsXG4gICAgdGhpcy5hYm9ydCA9IG51bGxcbiAgICB0aGlzLm9wdHMgPSB7IC4uLm9wdHMsIG1heFJlZGlyZWN0aW9uczogMCB9IC8vIG9wdHMgbXVzdCBiZSBhIGNvcHlcbiAgICB0aGlzLm1heFJlZGlyZWN0aW9ucyA9IG1heFJlZGlyZWN0aW9uc1xuICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXJcbiAgICB0aGlzLmhpc3RvcnkgPSBbXVxuXG4gICAgaWYgKHV0aWwuaXNTdHJlYW0odGhpcy5vcHRzLmJvZHkpKSB7XG4gICAgICAvLyBUT0RPIChmaXgpOiBQcm92aWRlIHNvbWUgd2F5IGZvciB0aGUgdXNlciB0byBjYWNoZSB0aGUgZmlsZSB0byBlLmcuIC90bXBcbiAgICAgIC8vIHNvIHRoYXQgaXQgY2FuIGJlIGRpc3BhdGNoZWQgYWdhaW4/XG4gICAgICAvLyBUT0RPIChmaXgpOiBEbyB3ZSBuZWVkIDEwMC1leHBlY3Qgc3VwcG9ydCB0byBwcm92aWRlIGEgd2F5IHRvIGRvIHRoaXMgcHJvcGVybHk/XG4gICAgICBpZiAodXRpbC5ib2R5TGVuZ3RoKHRoaXMub3B0cy5ib2R5KSA9PT0gMCkge1xuICAgICAgICB0aGlzLm9wdHMuYm9keVxuICAgICAgICAgIC5vbignZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGFzc2VydChmYWxzZSlcbiAgICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHRoaXMub3B0cy5ib2R5LnJlYWRhYmxlRGlkUmVhZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRoaXMub3B0cy5ib2R5W2tCb2R5VXNlZF0gPSBmYWxzZVxuICAgICAgICBFRS5wcm90b3R5cGUub24uY2FsbCh0aGlzLm9wdHMuYm9keSwgJ2RhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpc1trQm9keVVzZWRdID0gdHJ1ZVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRzLmJvZHkgJiYgdHlwZW9mIHRoaXMub3B0cy5ib2R5LnBpcGVUbyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gVE9ETyAoZml4KTogV2UgY2FuJ3QgYWNjZXNzIFJlYWRhYmxlU3RyZWFtIGludGVybmFsIHN0YXRlXG4gICAgICAvLyB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgaXQgaGFzIGJlZW4gZGlzdHVyYmVkLiBUaGlzIGlzIGp1c3RcbiAgICAgIC8vIGEgd29ya2Fyb3VuZC5cbiAgICAgIHRoaXMub3B0cy5ib2R5ID0gbmV3IEJvZHlBc3luY0l0ZXJhYmxlKHRoaXMub3B0cy5ib2R5KVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLm9wdHMuYm9keSAmJlxuICAgICAgdHlwZW9mIHRoaXMub3B0cy5ib2R5ICE9PSAnc3RyaW5nJyAmJlxuICAgICAgIUFycmF5QnVmZmVyLmlzVmlldyh0aGlzLm9wdHMuYm9keSkgJiZcbiAgICAgIHV0aWwuaXNJdGVyYWJsZSh0aGlzLm9wdHMuYm9keSlcbiAgICApIHtcbiAgICAgIC8vIFRPRE86IFNob3VsZCB3ZSBhbGxvdyByZS11c2luZyBpdGVyYWJsZSBpZiAhdGhpcy5vcHRzLmlkZW1wb3RlbnRcbiAgICAgIC8vIG9yIHRocm91Z2ggc29tZSBvdGhlciBmbGFnP1xuICAgICAgdGhpcy5vcHRzLmJvZHkgPSBuZXcgQm9keUFzeW5jSXRlcmFibGUodGhpcy5vcHRzLmJvZHkpXG4gICAgfVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCkge1xuICAgIHRoaXMuYWJvcnQgPSBhYm9ydFxuICAgIHRoaXMuaGFuZGxlci5vbkNvbm5lY3QoYWJvcnQsIHsgaGlzdG9yeTogdGhpcy5oaXN0b3J5IH0pXG4gIH1cblxuICBvblVwZ3JhZGUgKHN0YXR1c0NvZGUsIGhlYWRlcnMsIHNvY2tldCkge1xuICAgIHRoaXMuaGFuZGxlci5vblVwZ3JhZGUoc3RhdHVzQ29kZSwgaGVhZGVycywgc29ja2V0KVxuICB9XG5cbiAgb25FcnJvciAoZXJyb3IpIHtcbiAgICB0aGlzLmhhbmRsZXIub25FcnJvcihlcnJvcilcbiAgfVxuXG4gIG9uSGVhZGVycyAoc3RhdHVzQ29kZSwgaGVhZGVycywgcmVzdW1lLCBzdGF0dXNUZXh0KSB7XG4gICAgdGhpcy5sb2NhdGlvbiA9IHRoaXMuaGlzdG9yeS5sZW5ndGggPj0gdGhpcy5tYXhSZWRpcmVjdGlvbnMgfHwgdXRpbC5pc0Rpc3R1cmJlZCh0aGlzLm9wdHMuYm9keSlcbiAgICAgID8gbnVsbFxuICAgICAgOiBwYXJzZUxvY2F0aW9uKHN0YXR1c0NvZGUsIGhlYWRlcnMpXG5cbiAgICBpZiAodGhpcy5vcHRzLm9yaWdpbikge1xuICAgICAgdGhpcy5oaXN0b3J5LnB1c2gobmV3IFVSTCh0aGlzLm9wdHMucGF0aCwgdGhpcy5vcHRzLm9yaWdpbikpXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmxvY2F0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uSGVhZGVycyhzdGF0dXNDb2RlLCBoZWFkZXJzLCByZXN1bWUsIHN0YXR1c1RleHQpXG4gICAgfVxuXG4gICAgY29uc3QgeyBvcmlnaW4sIHBhdGhuYW1lLCBzZWFyY2ggfSA9IHV0aWwucGFyc2VVUkwobmV3IFVSTCh0aGlzLmxvY2F0aW9uLCB0aGlzLm9wdHMub3JpZ2luICYmIG5ldyBVUkwodGhpcy5vcHRzLnBhdGgsIHRoaXMub3B0cy5vcmlnaW4pKSlcbiAgICBjb25zdCBwYXRoID0gc2VhcmNoID8gYCR7cGF0aG5hbWV9JHtzZWFyY2h9YCA6IHBhdGhuYW1lXG5cbiAgICAvLyBSZW1vdmUgaGVhZGVycyByZWZlcnJpbmcgdG8gdGhlIG9yaWdpbmFsIFVSTC5cbiAgICAvLyBCeSBkZWZhdWx0IGl0IGlzIEhvc3Qgb25seSwgdW5sZXNzIGl0J3MgYSAzMDMgKHNlZSBiZWxvdyksIHdoaWNoIHJlbW92ZXMgYWxzbyBhbGwgQ29udGVudC0qIGhlYWRlcnMuXG4gICAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjRcbiAgICB0aGlzLm9wdHMuaGVhZGVycyA9IGNsZWFuUmVxdWVzdEhlYWRlcnModGhpcy5vcHRzLmhlYWRlcnMsIHN0YXR1c0NvZGUgPT09IDMwMywgdGhpcy5vcHRzLm9yaWdpbiAhPT0gb3JpZ2luKVxuICAgIHRoaXMub3B0cy5wYXRoID0gcGF0aFxuICAgIHRoaXMub3B0cy5vcmlnaW4gPSBvcmlnaW5cbiAgICB0aGlzLm9wdHMubWF4UmVkaXJlY3Rpb25zID0gMFxuICAgIHRoaXMub3B0cy5xdWVyeSA9IG51bGxcblxuICAgIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi40LjRcbiAgICAvLyBJbiBjYXNlIG9mIEhUVFAgMzAzLCBhbHdheXMgcmVwbGFjZSBtZXRob2QgdG8gYmUgZWl0aGVyIEhFQUQgb3IgR0VUXG4gICAgaWYgKHN0YXR1c0NvZGUgPT09IDMwMyAmJiB0aGlzLm9wdHMubWV0aG9kICE9PSAnSEVBRCcpIHtcbiAgICAgIHRoaXMub3B0cy5tZXRob2QgPSAnR0VUJ1xuICAgICAgdGhpcy5vcHRzLmJvZHkgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgb25EYXRhIChjaHVuaykge1xuICAgIGlmICh0aGlzLmxvY2F0aW9uKSB7XG4gICAgICAvKlxuICAgICAgICBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNFxuXG4gICAgICAgIFRMRFI6IHVuZGljaSBhbHdheXMgaWdub3JlcyAzeHggcmVzcG9uc2UgYm9kaWVzLlxuXG4gICAgICAgIFJlZGlyZWN0aW9uIGlzIHVzZWQgdG8gc2VydmUgdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBmcm9tIGFub3RoZXIgVVJMLCBzbyBpdCBpcyBhc3N1bWVzIHRoYXRcbiAgICAgICAgbm8gYm9keSBpcyBnZW5lcmF0ZWQgKGFuZCB0aHVzIGNhbiBiZSBpZ25vcmVkKS4gRXZlbiB0aG91Z2ggZ2VuZXJhdGluZyBhIGJvZHkgaXMgbm90IHByb2hpYml0ZWQuXG5cbiAgICAgICAgRm9yIHN0YXR1cyAzMDEsIDMwMiwgMzAzLCAzMDcgYW5kIDMwOCAodGhlIGxhdHRlciBmcm9tIFJGQyA3MjM4KSwgdGhlIHNwZWNzIG1lbnRpb24gdGhhdCB0aGUgYm9keSB1c3VhbGx5XG4gICAgICAgICh3aGljaCBtZWFucyBpdCdzIG9wdGlvbmFsIGFuZCBub3QgbWFuZGF0ZWQpIGNvbnRhaW4ganVzdCBhbiBoeXBlcmxpbmsgdG8gdGhlIHZhbHVlIG9mXG4gICAgICAgIHRoZSBMb2NhdGlvbiByZXNwb25zZSBoZWFkZXIsIHNvIHRoZSBib2R5IGNhbiBiZSBpZ25vcmVkIHNhZmVseS5cblxuICAgICAgICBGb3Igc3RhdHVzIDMwMCwgd2hpY2ggaXMgXCJNdWx0aXBsZSBDaG9pY2VzXCIsIHRoZSBzcGVjIG1lbnRpb25zIGJvdGggZ2VuZXJhdGluZyBhIExvY2F0aW9uXG4gICAgICAgIHJlc3BvbnNlIGhlYWRlciBBTkQgYSByZXNwb25zZSBib2R5IHdpdGggdGhlIG90aGVyIHBvc3NpYmxlIGxvY2F0aW9uIHRvIGZvbGxvdy5cbiAgICAgICAgU2luY2UgdGhlIHNwZWMgZXhwbGljaXRpbHkgY2hvb3NlcyBub3QgdG8gc3BlY2lmeSBhIGZvcm1hdCBmb3Igc3VjaCBib2R5IGFuZCBsZWF2ZSBpdCB0b1xuICAgICAgICBzZXJ2ZXJzIGFuZCBicm93c2VycyBpbXBsZW1lbnRvcnMsIHdlIGlnbm9yZSB0aGUgYm9keSBhcyB0aGVyZSBpcyBubyBzcGVjaWZpZWQgd2F5IHRvIGV2ZW50dWFsbHkgcGFyc2UgaXQuXG4gICAgICAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uRGF0YShjaHVuaylcbiAgICB9XG4gIH1cblxuICBvbkNvbXBsZXRlICh0cmFpbGVycykge1xuICAgIGlmICh0aGlzLmxvY2F0aW9uKSB7XG4gICAgICAvKlxuICAgICAgICBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNFxuXG4gICAgICAgIFRMRFI6IHVuZGljaSBhbHdheXMgaWdub3JlcyAzeHggcmVzcG9uc2UgdHJhaWxlcnMgYXMgdGhleSBhcmUgbm90IGV4cGVjdGVkIGluIGNhc2Ugb2YgcmVkaXJlY3Rpb25zXG4gICAgICAgIGFuZCBuZWl0aGVyIGFyZSB1c2VmdWwgaWYgcHJlc2VudC5cblxuICAgICAgICBTZWUgY29tbWVudCBvbiBvbkRhdGEgbWV0aG9kIGFib3ZlIGZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9ucy5cbiAgICAgICovXG5cbiAgICAgIHRoaXMubG9jYXRpb24gPSBudWxsXG4gICAgICB0aGlzLmFib3J0ID0gbnVsbFxuXG4gICAgICB0aGlzLmRpc3BhdGNoKHRoaXMub3B0cywgdGhpcylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oYW5kbGVyLm9uQ29tcGxldGUodHJhaWxlcnMpXG4gICAgfVxuICB9XG5cbiAgb25Cb2R5U2VudCAoY2h1bmspIHtcbiAgICBpZiAodGhpcy5oYW5kbGVyLm9uQm9keVNlbnQpIHtcbiAgICAgIHRoaXMuaGFuZGxlci5vbkJvZHlTZW50KGNodW5rKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUxvY2F0aW9uIChzdGF0dXNDb2RlLCBoZWFkZXJzKSB7XG4gIGlmIChyZWRpcmVjdGFibGVTdGF0dXNDb2Rlcy5pbmRleE9mKHN0YXR1c0NvZGUpID09PSAtMSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICBpZiAoaGVhZGVyc1tpXS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT09ICdsb2NhdGlvbicpIHtcbiAgICAgIHJldHVybiBoZWFkZXJzW2kgKyAxXVxuICAgIH1cbiAgfVxufVxuXG4vLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNC40XG5mdW5jdGlvbiBzaG91bGRSZW1vdmVIZWFkZXIgKGhlYWRlciwgcmVtb3ZlQ29udGVudCwgdW5rbm93bk9yaWdpbikge1xuICBpZiAoaGVhZGVyLmxlbmd0aCA9PT0gNCkge1xuICAgIHJldHVybiB1dGlsLmhlYWRlck5hbWVUb1N0cmluZyhoZWFkZXIpID09PSAnaG9zdCdcbiAgfVxuICBpZiAocmVtb3ZlQ29udGVudCAmJiB1dGlsLmhlYWRlck5hbWVUb1N0cmluZyhoZWFkZXIpLnN0YXJ0c1dpdGgoJ2NvbnRlbnQtJykpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIGlmICh1bmtub3duT3JpZ2luICYmIChoZWFkZXIubGVuZ3RoID09PSAxMyB8fCBoZWFkZXIubGVuZ3RoID09PSA2IHx8IGhlYWRlci5sZW5ndGggPT09IDE5KSkge1xuICAgIGNvbnN0IG5hbWUgPSB1dGlsLmhlYWRlck5hbWVUb1N0cmluZyhoZWFkZXIpXG4gICAgcmV0dXJuIG5hbWUgPT09ICdhdXRob3JpemF0aW9uJyB8fCBuYW1lID09PSAnY29va2llJyB8fCBuYW1lID09PSAncHJveHktYXV0aG9yaXphdGlvbidcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjRcbmZ1bmN0aW9uIGNsZWFuUmVxdWVzdEhlYWRlcnMgKGhlYWRlcnMsIHJlbW92ZUNvbnRlbnQsIHVua25vd25PcmlnaW4pIHtcbiAgY29uc3QgcmV0ID0gW11cbiAgaWYgKEFycmF5LmlzQXJyYXkoaGVhZGVycykpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIGlmICghc2hvdWxkUmVtb3ZlSGVhZGVyKGhlYWRlcnNbaV0sIHJlbW92ZUNvbnRlbnQsIHVua25vd25PcmlnaW4pKSB7XG4gICAgICAgIHJldC5wdXNoKGhlYWRlcnNbaV0sIGhlYWRlcnNbaSArIDFdKVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChoZWFkZXJzICYmIHR5cGVvZiBoZWFkZXJzID09PSAnb2JqZWN0Jykge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGhlYWRlcnMpKSB7XG4gICAgICBpZiAoIXNob3VsZFJlbW92ZUhlYWRlcihrZXksIHJlbW92ZUNvbnRlbnQsIHVua25vd25PcmlnaW4pKSB7XG4gICAgICAgIHJldC5wdXNoKGtleSwgaGVhZGVyc1trZXldKVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBhc3NlcnQoaGVhZGVycyA9PSBudWxsLCAnaGVhZGVycyBtdXN0IGJlIGFuIG9iamVjdCBvciBhbiBhcnJheScpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlZGlyZWN0SGFuZGxlclxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFJlZGlyZWN0SGFuZGxlciA9IHJlcXVpcmUoJy4uL2hhbmRsZXIvUmVkaXJlY3RIYW5kbGVyJylcblxuZnVuY3Rpb24gY3JlYXRlUmVkaXJlY3RJbnRlcmNlcHRvciAoeyBtYXhSZWRpcmVjdGlvbnM6IGRlZmF1bHRNYXhSZWRpcmVjdGlvbnMgfSkge1xuICByZXR1cm4gKGRpc3BhdGNoKSA9PiB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIEludGVyY2VwdCAob3B0cywgaGFuZGxlcikge1xuICAgICAgY29uc3QgeyBtYXhSZWRpcmVjdGlvbnMgPSBkZWZhdWx0TWF4UmVkaXJlY3Rpb25zIH0gPSBvcHRzXG5cbiAgICAgIGlmICghbWF4UmVkaXJlY3Rpb25zKSB7XG4gICAgICAgIHJldHVybiBkaXNwYXRjaChvcHRzLCBoYW5kbGVyKVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWRpcmVjdEhhbmRsZXIgPSBuZXcgUmVkaXJlY3RIYW5kbGVyKGRpc3BhdGNoLCBtYXhSZWRpcmVjdGlvbnMsIG9wdHMsIGhhbmRsZXIpXG4gICAgICBvcHRzID0geyAuLi5vcHRzLCBtYXhSZWRpcmVjdGlvbnM6IDAgfSAvLyBTdG9wIHN1YiBkaXNwYXRjaGVyIGZyb20gYWxzbyByZWRpcmVjdGluZy5cbiAgICAgIHJldHVybiBkaXNwYXRjaChvcHRzLCByZWRpcmVjdEhhbmRsZXIpXG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlUmVkaXJlY3RJbnRlcmNlcHRvclxuIiwibW9kdWxlLmV4cG9ydHMgPSAnQUdGemJRRUFBQUFCTUFoZ0FYOEJmMkFEZjM5L0FYOWdCSDkvZjM4QmYyQUFBR0FEZjM5L0FHQUJmd0JnQW45L0FHQUdmMzkvZjM5L0FBTExBUWdEWlc1MkdIZGhjMjFmYjI1ZmFHVmhaR1Z5YzE5amIyMXdiR1YwWlFBQ0EyVnVkaFYzWVhOdFgyOXVYMjFsYzNOaFoyVmZZbVZuYVc0QUFBTmxibllMZDJGemJWOXZibDkxY213QUFRTmxibllPZDJGemJWOXZibDl6ZEdGMGRYTUFBUU5sYm5ZVWQyRnpiVjl2Ymw5b1pXRmtaWEpmWm1sbGJHUUFBUU5sYm5ZVWQyRnpiVjl2Ymw5b1pXRmtaWEpmZG1Gc2RXVUFBUU5sYm5ZTWQyRnpiVjl2Ymw5aWIyUjVBQUVEWlc1MkdIZGhjMjFmYjI1ZmJXVnpjMkZuWlY5amIyMXdiR1YwWlFBQUEwWkZBd01FQUFBRkFBQUFBQUFBQlFFRkFBVUZCUUFBQmdBQUFBQUdCZ1lHQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUFCQUFBQkFRY0FBQVVGQXdBQkJBVUJjQUVTRWdVREFRQUNCZ2dCZndGQmdOUUVDd2ZSQlNJR2JXVnRiM0o1QWdBTFgybHVhWFJwWVd4cGVtVUFDUmxmWDJsdVpHbHlaV04wWDJaMWJtTjBhVzl1WDNSaFlteGxBUUFMYkd4b2RIUndYMmx1YVhRQUNoaHNiR2gwZEhCZmMyaHZkV3hrWDJ0bFpYQmZZV3hwZG1VQVFReHNiR2gwZEhCZllXeHNiMk1BREFadFlXeHNiMk1BUmd0c2JHaDBkSEJmWm5KbFpRQU5CR1p5WldVQVNBOXNiR2gwZEhCZloyVjBYM1I1Y0dVQURoVnNiR2gwZEhCZloyVjBYMmgwZEhCZmJXRnFiM0lBRHhWc2JHaDBkSEJmWjJWMFgyaDBkSEJmYldsdWIzSUFFQkZzYkdoMGRIQmZaMlYwWDIxbGRHaHZaQUFSRm14c2FIUjBjRjluWlhSZmMzUmhkSFZ6WDJOdlpHVUFFaEpzYkdoMGRIQmZaMlYwWDNWd1ozSmhaR1VBRXd4c2JHaDBkSEJmY21WelpYUUFGQTVzYkdoMGRIQmZaWGhsWTNWMFpRQVZGR3hzYUhSMGNGOXpaWFIwYVc1bmMxOXBibWwwQUJZTmJHeG9kSFJ3WDJacGJtbHphQUFYREd4c2FIUjBjRjl3WVhWelpRQVlEV3hzYUhSMGNGOXlaWE4xYldVQUdSdHNiR2gwZEhCZmNtVnpkVzFsWDJGbWRHVnlYM1Z3WjNKaFpHVUFHaEJzYkdoMGRIQmZaMlYwWDJWeWNtNXZBQnNYYkd4b2RIUndYMmRsZEY5bGNuSnZjbDl5WldGemIyNEFIQmRzYkdoMGRIQmZjMlYwWDJWeWNtOXlYM0psWVhOdmJnQWRGR3hzYUhSMGNGOW5aWFJmWlhKeWIzSmZjRzl6QUI0UmJHeG9kSFJ3WDJWeWNtNXZYMjVoYldVQUh4SnNiR2gwZEhCZmJXVjBhRzlrWDI1aGJXVUFJQkpzYkdoMGRIQmZjM1JoZEhWelgyNWhiV1VBSVJwc2JHaDBkSEJmYzJWMFgyeGxibWxsYm5SZmFHVmhaR1Z5Y3dBaUlXeHNhSFIwY0Y5elpYUmZiR1Z1YVdWdWRGOWphSFZ1YTJWa1gyeGxibWQwYUFBakhXeHNhSFIwY0Y5elpYUmZiR1Z1YVdWdWRGOXJaV1Z3WDJGc2FYWmxBQ1FrYkd4b2RIUndYM05sZEY5c1pXNXBaVzUwWDNSeVlXNXpabVZ5WDJWdVkyOWthVzVuQUNVWWJHeG9kSFJ3WDIxbGMzTmhaMlZmYm1WbFpITmZaVzltQUQ4SkZ3RUFRUUVMRVFFQ0F3UUZDd1lITlRrM01TOHRKeXNwQ3NMZ0FrVUNBQXNJQUJDSWdJQ0FBQXNaQUNBQUVNS0FnSUFBR2lBQUlBSTJBamdnQUNBQk9nQW9DeHdBSUFBZ0FDOEJNaUFBTFFBdUlBQVF3WUNBZ0FBUWdJQ0FnQUFMS2dFQmYwSEFBQkRHZ0lDQUFDSUJFTUtBZ0lBQUdpQUJRWUNJZ0lBQU5nSTRJQUVnQURvQUtDQUJDd29BSUFBUXlJQ0FnQUFMQndBZ0FDMEFLQXNIQUNBQUxRQXFDd2NBSUFBdEFDc0xCd0FnQUMwQUtRc0hBQ0FBTHdFeUN3Y0FJQUF0QUM0TFJRRUVmeUFBS0FJWUlRRWdBQzBBTFNFQ0lBQXRBQ2doQXlBQUtBSTRJUVFnQUJEQ2dJQ0FBQm9nQUNBRU5nSTRJQUFnQXpvQUtDQUFJQUk2QUMwZ0FDQUJOZ0lZQ3hFQUlBQWdBU0FCSUFKcUVNT0FnSUFBQ3hBQUlBQkJBRUhjQUJETWdJQ0FBQm9MWndFQmYwRUFJUUVDUUNBQUtBSU1EUUFDUUFKQUFrQUNRQ0FBTFFBdkRnTUJBQU1DQ3lBQUtBSTRJZ0ZGRFFBZ0FTZ0NMQ0lCUlEwQUlBQWdBUkdBZ0lDQUFBQWlBUTBEQzBFQUR3c1F5b0NBZ0FBQUN5QUFRY09XZ0lBQU5nSVFRUTRoQVFzZ0FRc2VBQUpBSUFBb0Fnd05BQ0FBUWRHYmdJQUFOZ0lRSUFCQkZUWUNEQXNMRmdBQ1FDQUFLQUlNUVJWSERRQWdBRUVBTmdJTUN3c1dBQUpBSUFBb0FneEJGa2NOQUNBQVFRQTJBZ3dMQ3djQUlBQW9BZ3dMQndBZ0FDZ0NFQXNKQUNBQUlBRTJBaEFMQndBZ0FDZ0NGQXNpQUFKQUlBQkJKRWtOQUJES2dJQ0FBQUFMSUFCQkFuUkJvTE9BZ0FCcUtBSUFDeUlBQWtBZ0FFRXVTUTBBRU1xQWdJQUFBQXNnQUVFQ2RFR3d0SUNBQUdvb0FnQUw3Z3NCQVg5QjY2aUFnQUFoQVFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBQkJuSDlxRHZRRFkySUFBV0ZoWVdGaFlRSURCQVZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaEJnY0lDUW9MREEwT0QyRmhZV0ZoRUdGaFlXRmhZV0ZoWVdGaEVXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlSSVRGQlVXRnhnWkdodGhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhIQjBlSHlBaElpTWtKU1luS0NrcUt5d3RMaTh3TVRJek5EVTJZVGM0T1RwaFlXRmhZV0ZoWVR0aFlXRThZV0ZoWVQwK1AyRmhZV0ZoWVdGaFFHRmhRV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVVKRFJFVkdSMGhKU2t0TVRVNVBVRkZTVTJGaFlXRmhZV0ZoVkZWV1YxaFpXbHRoWEYxaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmVZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhYMkJoQzBIaHA0Q0FBQThMUWFTaGdJQUFEd3RCeTZ5QWdBQVBDMEgrc1lDQUFBOExRY0NrZ0lBQUR3dEJxNlNBZ0FBUEMwR05xSUNBQUE4TFFlS21nSUFBRHd0QmdMQ0FnQUFQQzBHNXI0Q0FBQThMUWRla2dJQUFEd3RCNzUrQWdBQVBDMEhobjRDQUFBOExRZnFmZ0lBQUR3dEI4cUNBZ0FBUEMwR29yNENBQUE4TFFhNnlnSUFBRHd0QmlMQ0FnQUFQQzBIc3A0Q0FBQThMUVlLaWdJQUFEd3RCanAyQWdBQVBDMEhRcm9DQUFBOExRY3FqZ0lBQUR3dEJ4YktBZ0FBUEMwSGZuSUNBQUE4TFFkS2NnSUFBRHd0QnhLQ0FnQUFQQzBIWG9JQ0FBQThMUWFLZmdJQUFEd3RCN2E2QWdBQVBDMEdyc0lDQUFBOExRZFNsZ0lBQUR3dEJ6SzZBZ0FBUEMwSDZyb0NBQUE4TFFmeXJnSUFBRHd0QjByQ0FnQUFQQzBIeG5ZQ0FBQThMUWJ1Z2dJQUFEd3RCOTZ1QWdBQVBDMEdRc1lDQUFBOExRZGV4Z0lBQUR3dEJvcTJBZ0FBUEMwSFVwNENBQUE4TFFlQ3JnSUFBRHd0Qm42eUFnQUFQQzBIcnNZQ0FBQThMUWRXZmdJQUFEd3RCeXJHQWdBQVBDMEhlcFlDQUFBOExRZFNlZ0lBQUR3dEI5SnlBZ0FBUEMwR25zb0NBQUE4TFFiR2RnSUFBRHd0Qm9KMkFnQUFQQzBHNXNZQ0FBQThMUWJ5d2dJQUFEd3RCa3FHQWdBQVBDMEd6cG9DQUFBOExRZW1zZ0lBQUR3dEJySjZBZ0FBUEMwSFVxNENBQUE4TFFmZW1nSUFBRHd0QmdLYUFnQUFQQzBHd29ZQ0FBQThMUWY2ZWdJQUFEd3RCamFPQWdBQVBDMEdKcllDQUFBOExRZmVpZ0lBQUR3dEJvTEdBZ0FBUEMwR3VuNENBQUE4TFFjYWxnSUFBRHd0QjZKNkFnQUFQQzBHVG9vQ0FBQThMUWNLdmdJQUFEd3RCdzUyQWdBQVBDMEdMcklDQUFBOExRZUdkZ0lBQUR3dEJqYStBZ0FBUEMwSHFvWUNBQUE4TFFiU3RnSUFBRHd0QjBxK0FnQUFQQzBIZnNvQ0FBQThMUWRLeWdJQUFEd3RCOExDQWdBQVBDMEdwb29DQUFBOExRZm1qZ0lBQUR3dEJtWjZBZ0FBUEMwRzFySUNBQUE4TFFadXdnSUFBRHd0QmtyS0FnQUFQQzBHMnE0Q0FBQThMUWNLaWdJQUFEd3RCK0xLQWdBQVBDMEdlcFlDQUFBOExRZENpZ0lBQUR3dEJ1cDZBZ0FBUEMwR0Jub0NBQUE4TEVNcUFnSUFBQUF0QjFxR0FnQUFoQVFzZ0FRc1dBQ0FBSUFBdEFDMUIvZ0Z4SUFGQkFFZHlPZ0F0Q3hrQUlBQWdBQzBBTFVIOUFYRWdBVUVBUjBFQmRISTZBQzBMR1FBZ0FDQUFMUUF0UWZzQmNTQUJRUUJIUVFKMGNqb0FMUXNaQUNBQUlBQXRBQzFCOXdGeElBRkJBRWRCQTNSeU9nQXRDeTRCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FnQWlCRVVOQUNBQUlBUVJnSUNBZ0FBQUlRTUxJQU1MU1FFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NCQ0lFUlEwQUlBQWdBU0FDSUFGcklBUVJnWUNBZ0FBQUlnTkJmMGNOQUNBQVFjYVJnSUFBTmdJUVFSZ2hBd3NnQXdzdUFRSi9RUUFoQXdKQUlBQW9BamdpQkVVTkFDQUVLQUl3SWdSRkRRQWdBQ0FFRVlDQWdJQUFBQ0VEQ3lBREMwa0JBbjlCQUNFREFrQWdBQ2dDT0NJRVJRMEFJQVFvQWdnaUJFVU5BQ0FBSUFFZ0FpQUJheUFFRVlHQWdJQUFBQ0lEUVg5SERRQWdBRUgyaW9DQUFEWUNFRUVZSVFNTElBTUxMZ0VDZjBFQUlRTUNRQ0FBS0FJNElnUkZEUUFnQkNnQ05DSUVSUTBBSUFBZ0JCR0FnSUNBQUFBaEF3c2dBd3RKQVFKL1FRQWhBd0pBSUFBb0FqZ2lCRVVOQUNBRUtBSU1JZ1JGRFFBZ0FDQUJJQUlnQVdzZ0JCR0JnSUNBQUFBaUEwRi9SdzBBSUFCQjdacUFnQUEyQWhCQkdDRURDeUFEQ3k0QkFuOUJBQ0VEQWtBZ0FDZ0NPQ0lFUlEwQUlBUW9BamdpQkVVTkFDQUFJQVFSZ0lDQWdBQUFJUU1MSUFNTFNRRUNmMEVBSVFNQ1FDQUFLQUk0SWdSRkRRQWdCQ2dDRUNJRVJRMEFJQUFnQVNBQ0lBRnJJQVFSZ1lDQWdBQUFJZ05CZjBjTkFDQUFRWldRZ0lBQU5nSVFRUmdoQXdzZ0F3c3VBUUovUVFBaEF3SkFJQUFvQWpnaUJFVU5BQ0FFS0FJOElnUkZEUUFnQUNBRUVZQ0FnSUFBQUNFREN5QURDMGtCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FoUWlCRVVOQUNBQUlBRWdBaUFCYXlBRUVZR0FnSUFBQUNJRFFYOUhEUUFnQUVHcW00Q0FBRFlDRUVFWUlRTUxJQU1MTGdFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NRQ0lFUlEwQUlBQWdCQkdBZ0lDQUFBQWhBd3NnQXd0SkFRSi9RUUFoQXdKQUlBQW9BamdpQkVVTkFDQUVLQUlZSWdSRkRRQWdBQ0FCSUFJZ0FXc2dCQkdCZ0lDQUFBQWlBMEYvUncwQUlBQkI3Wk9BZ0FBMkFoQkJHQ0VEQ3lBREN5NEJBbjlCQUNFREFrQWdBQ2dDT0NJRVJRMEFJQVFvQWtRaUJFVU5BQ0FBSUFRUmdJQ0FnQUFBSVFNTElBTUxMZ0VDZjBFQUlRTUNRQ0FBS0FJNElnUkZEUUFnQkNnQ0pDSUVSUTBBSUFBZ0JCR0FnSUNBQUFBaEF3c2dBd3N1QVFKL1FRQWhBd0pBSUFBb0FqZ2lCRVVOQUNBRUtBSXNJZ1JGRFFBZ0FDQUVFWUNBZ0lBQUFDRURDeUFEQzBrQkFuOUJBQ0VEQWtBZ0FDZ0NPQ0lFUlEwQUlBUW9BaWdpQkVVTkFDQUFJQUVnQWlBQmF5QUVFWUdBZ0lBQUFDSURRWDlIRFFBZ0FFSDJpSUNBQURZQ0VFRVlJUU1MSUFNTExnRUNmMEVBSVFNQ1FDQUFLQUk0SWdSRkRRQWdCQ2dDVUNJRVJRMEFJQUFnQkJHQWdJQ0FBQUFoQXdzZ0F3dEpBUUovUVFBaEF3SkFJQUFvQWpnaUJFVU5BQ0FFS0FJY0lnUkZEUUFnQUNBQklBSWdBV3NnQkJHQmdJQ0FBQUFpQTBGL1J3MEFJQUJCd3BtQWdBQTJBaEJCR0NFREN5QURDeTRCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FrZ2lCRVVOQUNBQUlBUVJnSUNBZ0FBQUlRTUxJQU1MU1FFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NJQ0lFUlEwQUlBQWdBU0FDSUFGcklBUVJnWUNBZ0FBQUlnTkJmMGNOQUNBQVFaU1VnSUFBTmdJUVFSZ2hBd3NnQXdzdUFRSi9RUUFoQXdKQUlBQW9BamdpQkVVTkFDQUVLQUpNSWdSRkRRQWdBQ0FFRVlDQWdJQUFBQ0VEQ3lBREN5NEJBbjlCQUNFREFrQWdBQ2dDT0NJRVJRMEFJQVFvQWxRaUJFVU5BQ0FBSUFRUmdJQ0FnQUFBSVFNTElBTUxMZ0VDZjBFQUlRTUNRQ0FBS0FJNElnUkZEUUFnQkNnQ1dDSUVSUTBBSUFBZ0JCR0FnSUNBQUFBaEF3c2dBd3RGQVFGL0FrQUNRQ0FBTHdFd1FSUnhRUlJIRFFCQkFTRURJQUF0QUNoQkFVWU5BU0FBTHdFeVFlVUFSaUVEREFFTElBQXRBQ2xCQlVZaEF3c2dBQ0FET2dBdVFRQUwvZ0VCQTM5QkFTRURBa0FnQUM4Qk1DSUVRUWh4RFFBZ0FDa0RJRUlBVWlFREN3SkFBa0FnQUMwQUxrVU5BRUVCSVFVZ0FDMEFLVUVGUmcwQlFRRWhCU0FFUWNBQWNVVWdBM0ZCQVVjTkFRdEJBQ0VGSUFSQndBQnhEUUJCQWlFRklBUkIvLzhEY1NJRFFRaHhEUUFDUUNBRFFZQUVjVVVOQUFKQUlBQXRBQ2hCQVVjTkFDQUFMUUF0UVFweERRQkJCUThMUVFRUEN3SkFJQU5CSUhFTkFBSkFJQUF0QUNoQkFVWU5BQ0FBTHdFeVFmLy9BM0VpQUVHY2YycEI1QUJKRFFBZ0FFSE1BVVlOQUNBQVFiQUNSZzBBUVFRaEJTQUVRU2h4UlEwQ0lBTkJpQVJ4UVlBRVJnMENDMEVBRHd0QkFFRURJQUFwQXlCUUd5RUZDeUFGQzJJQkFuOUJBQ0VCQWtBZ0FDMEFLRUVCUmcwQUlBQXZBVEpCLy84RGNTSUNRWngvYWtIa0FFa05BQ0FDUWN3QlJnMEFJQUpCc0FKR0RRQWdBQzhCTUNJQVFjQUFjUTBBUVFFaEFTQUFRWWdFY1VHQUJFWU5BQ0FBUVNoeFJTRUJDeUFCQzZjQkFRTi9Ba0FDUUFKQUlBQXRBQ3BGRFFBZ0FDMEFLMFVOQUVFQUlRTWdBQzhCTUNJRVFRSnhSUTBCREFJTFFRQWhBeUFBTHdFd0lnUkJBWEZGRFFFTFFRRWhBeUFBTFFBb1FRRkdEUUFnQUM4Qk1rSC8vd054SWdWQm5IOXFRZVFBU1EwQUlBVkJ6QUZHRFFBZ0JVR3dBa1lOQUNBRVFjQUFjUTBBUVFBaEF5QUVRWWdFY1VHQUJFWU5BQ0FFUVNoeFFRQkhJUU1MSUFCQkFEc0JNQ0FBUVFBNkFDOGdBd3VaQVFFQ2Z3SkFBa0FDUUNBQUxRQXFSUTBBSUFBdEFDdEZEUUJCQUNFQklBQXZBVEFpQWtFQ2NVVU5BUXdDQzBFQUlRRWdBQzhCTUNJQ1FRRnhSUTBCQzBFQklRRWdBQzBBS0VFQlJnMEFJQUF2QVRKQi8vOERjU0lBUVp4L2FrSGtBRWtOQUNBQVFjd0JSZzBBSUFCQnNBSkdEUUFnQWtIQUFIRU5BRUVBSVFFZ0FrR0lCSEZCZ0FSR0RRQWdBa0VvY1VFQVJ5RUJDeUFCQzFrQUlBQkJHR3BDQURjREFDQUFRZ0EzQXdBZ0FFRTRha0lBTndNQUlBQkJNR3BDQURjREFDQUFRU2hxUWdBM0F3QWdBRUVnYWtJQU53TUFJQUJCRUdwQ0FEY0RBQ0FBUVFocVFnQTNBd0FnQUVIZEFUWUNIRUVBQzNzQkFYOENRQ0FBS0FJTUlnTU5BQUpBSUFBb0FnUkZEUUFnQUNBQk5nSUVDd0pBSUFBZ0FTQUNFTVNBZ0lBQUlnTU5BQ0FBS0FJTUR3c2dBQ0FETmdJY1FRQWhBeUFBS0FJRUlnRkZEUUFnQUNBQklBSWdBQ2dDQ0JHQmdJQ0FBQUFpQVVVTkFDQUFJQUkyQWhRZ0FDQUJOZ0lNSUFFaEF3c2dBd3ZrOHdFRERuOERmZ1IvSTRDQWdJQUFRUkJySWdNa2dJQ0FnQUFnQVNFRUlBRWhCU0FCSVFZZ0FTRUhJQUVoQ0NBQklRa2dBU0VLSUFFaEN5QUJJUXdnQVNFTklBRWhEaUFCSVE4Q1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0FDZ0NIQ0lRUVg5cUR0MEIyZ0VCMlFFQ0F3UUZCZ2NJQ1FvTERBME8yQUVQRU5jQkVSTFdBUk1VRlJZWEdCa2FHK0FCM3dFY0hSN1ZBUjhnSVNJakpDWFVBU1luS0NrcUt5elRBZElCTFM3UkFkQUJMekF4TWpNME5UWTNPRGs2T3p3OVBqOUFRVUpEUkVWRzJ3RkhTRWxLendIT0FVdk5BVXpNQVUxT1QxQlJVbE5VVlZaWFdGbGFXMXhkWGw5Z1lXSmpaR1ZtWjJocGFtdHNiVzV2Y0hGeWMzUjFkbmQ0ZVhwN2ZIMStmNEFCZ1FHQ0FZTUJoQUdGQVlZQmh3R0lBWWtCaWdHTEFZd0JqUUdPQVk4QmtBR1JBWklCa3dHVUFaVUJsZ0dYQVpnQm1RR2FBWnNCbkFHZEFaNEJud0dnQWFFQm9nR2pBYVFCcFFHbUFhY0JxQUdwQWFvQnF3R3NBYTBCcmdHdkFiQUJzUUd5QWJNQnRBRzFBYllCdHdITEFjb0J1QUhKQWJrQnlBRzZBYnNCdkFHOUFiNEJ2d0hBQWNFQndnSERBY1FCeFFIR0FRRGNBUXRCQUNFUURNWUJDMEVPSVJBTXhRRUxRUTBoRUF6RUFRdEJEeUVRRE1NQkMwRVFJUkFNd2dFTFFSTWhFQXpCQVF0QkZDRVFETUFCQzBFVklSQU12d0VMUVJZaEVBeStBUXRCRnlFUURMMEJDMEVZSVJBTXZBRUxRUmtoRUF5N0FRdEJHaUVRRExvQkMwRWJJUkFNdVFFTFFSd2hFQXk0QVF0QkNDRVFETGNCQzBFZElSQU10Z0VMUVNBaEVBeTFBUXRCSHlFUURMUUJDMEVISVJBTXN3RUxRU0VoRUF5eUFRdEJJaUVRRExFQkMwRWVJUkFNc0FFTFFTTWhFQXl2QVF0QkVpRVFESzRCQzBFUklSQU1yUUVMUVNRaEVBeXNBUXRCSlNFUURLc0JDMEVtSVJBTXFnRUxRU2NoRUF5cEFRdEJ3d0VoRUF5b0FRdEJLU0VRREtjQkMwRXJJUkFNcGdFTFFTd2hFQXlsQVF0QkxTRVFES1FCQzBFdUlSQU1vd0VMUVM4aEVBeWlBUXRCeEFFaEVBeWhBUXRCTUNFUURLQUJDMEUwSVJBTW53RUxRUXdoRUF5ZUFRdEJNU0VRREowQkMwRXlJUkFNbkFFTFFUTWhFQXliQVF0Qk9TRVFESm9CQzBFMUlSQU1tUUVMUWNVQklSQU1tQUVMUVFzaEVBeVhBUXRCT2lFUURKWUJDMEUySVJBTWxRRUxRUW9oRUF5VUFRdEJOeUVRREpNQkMwRTRJUkFNa2dFTFFUd2hFQXlSQVF0Qk95RVFESkFCQzBFOUlSQU1qd0VMUVFraEVBeU9BUXRCS0NFUURJMEJDMEUrSVJBTWpBRUxRVDhoRUF5TEFRdEJ3QUFoRUF5S0FRdEJ3UUFoRUF5SkFRdEJ3Z0FoRUF5SUFRdEJ3d0FoRUF5SEFRdEJ4QUFoRUF5R0FRdEJ4UUFoRUF5RkFRdEJ4Z0FoRUF5RUFRdEJLaUVRRElNQkMwSEhBQ0VRRElJQkMwSElBQ0VRRElFQkMwSEpBQ0VRRElBQkMwSEtBQ0VRREg4TFFjc0FJUkFNZmd0QnpRQWhFQXg5QzBITUFDRVFESHdMUWM0QUlSQU1ld3RCendBaEVBeDZDMEhRQUNFUURIa0xRZEVBSVJBTWVBdEIwZ0FoRUF4M0MwSFRBQ0VRREhZTFFkUUFJUkFNZFF0QjFnQWhFQXgwQzBIVkFDRVFESE1MUVFZaEVBeHlDMEhYQUNFUURIRUxRUVVoRUF4d0MwSFlBQ0VRREc4TFFRUWhFQXh1QzBIWkFDRVFERzBMUWRvQUlSQU1iQXRCMndBaEVBeHJDMEhjQUNFUURHb0xRUU1oRUF4cEMwSGRBQ0VRREdnTFFkNEFJUkFNWnd0QjN3QWhFQXhtQzBIaEFDRVFER1VMUWVBQUlSQU1aQXRCNGdBaEVBeGpDMEhqQUNFUURHSUxRUUloRUF4aEMwSGtBQ0VRREdBTFFlVUFJUkFNWHd0QjVnQWhFQXhlQzBIbkFDRVFERjBMUWVnQUlSQU1YQXRCNlFBaEVBeGJDMEhxQUNFUURGb0xRZXNBSVJBTVdRdEI3QUFoRUF4WUMwSHRBQ0VRREZjTFFlNEFJUkFNVmd0Qjd3QWhFQXhWQzBId0FDRVFERlFMUWZFQUlSQU1Vd3RCOGdBaEVBeFNDMEh6QUNFUURGRUxRZlFBSVJBTVVBdEI5UUFoRUF4UEMwSDJBQ0VRREU0TFFmY0FJUkFNVFF0QitBQWhFQXhNQzBINUFDRVFERXNMUWZvQUlSQU1TZ3RCK3dBaEVBeEpDMEg4QUNFUURFZ0xRZjBBSVJBTVJ3dEIvZ0FoRUF4R0MwSC9BQ0VRREVVTFFZQUJJUkFNUkF0QmdRRWhFQXhEQzBHQ0FTRVFERUlMUVlNQklSQU1RUXRCaEFFaEVBeEFDMEdGQVNFUUREOExRWVlCSVJBTVBndEJod0VoRUF3OUMwR0lBU0VRRER3TFFZa0JJUkFNT3d0QmlnRWhFQXc2QzBHTEFTRVFERGtMUVl3QklSQU1PQXRCalFFaEVBdzNDMEdPQVNFUUREWUxRWThCSVJBTU5RdEJrQUVoRUF3MEMwR1JBU0VRRERNTFFaSUJJUkFNTWd0Qmt3RWhFQXd4QzBHVUFTRVFEREFMUVpVQklSQU1Md3RCbGdFaEVBd3VDMEdYQVNFUURDMExRWmdCSVJBTUxBdEJtUUVoRUF3ckMwR2FBU0VRRENvTFFac0JJUkFNS1F0Qm5BRWhFQXdvQzBHZEFTRVFEQ2NMUVo0QklSQU1KZ3RCbndFaEVBd2xDMEdnQVNFUURDUUxRYUVCSVJBTUl3dEJvZ0VoRUF3aUMwR2pBU0VRRENFTFFhUUJJUkFNSUF0QnBRRWhFQXdmQzBHbUFTRVFEQjRMUWFjQklSQU1IUXRCcUFFaEVBd2NDMEdwQVNFUURCc0xRYW9CSVJBTUdndEJxd0VoRUF3WkMwR3NBU0VRREJnTFFhMEJJUkFNRnd0QnJnRWhFQXdXQzBFQklSQU1GUXRCcndFaEVBd1VDMEd3QVNFUURCTUxRYkVCSVJBTUVndEJzd0VoRUF3UkMwR3lBU0VRREJBTFFiUUJJUkFNRHd0QnRRRWhFQXdPQzBHMkFTRVFEQTBMUWJjQklSQU1EQXRCdUFFaEVBd0xDMEc1QVNFUURBb0xRYm9CSVJBTUNRdEJ1d0VoRUF3SUMwSEdBU0VRREFjTFFid0JJUkFNQmd0QnZRRWhFQXdGQzBHK0FTRVFEQVFMUWI4QklSQU1Bd3RCd0FFaEVBd0NDMEhDQVNFUURBRUxRY0VCSVJBTEEwQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FRRHNjQkFBRUNBd1FGQmdjSUNRb0xEQTBPRHhBUkVoTVVGUllYR0JrYUd4d2VIeUFoSXlVb1AwQkJSRVZHUjBoSlNrdE1UVTlRVVZKVDNnTlhXVnRjWFdCaVpXWm5hR2xxYTJ4dGIzQnhjbk4wZFhaM2VIbDZlM3g5Zm9BQmdnR0ZBWVlCaHdHSkFZc0JqQUdOQVk0Qmp3R1FBWkVCbEFHVkFaWUJsd0dZQVprQm1nR2JBWndCblFHZUFaOEJvQUdoQWFJQm93R2tBYVVCcGdHbkFhZ0JxUUdxQWFzQnJBR3RBYTRCcndHd0FiRUJzZ0d6QWJRQnRRRzJBYmNCdUFHNUFib0J1d0c4QWIwQnZnRy9BY0FCd1FIQ0FjTUJ4QUhGQWNZQnh3SElBY2tCeWdITEFjd0J6UUhPQWM4QjBBSFJBZElCMHdIVUFkVUIxZ0hYQWRnQjJRSGFBZHNCM0FIZEFkNEI0QUhoQWVJQjR3SGtBZVVCNWdIbkFlZ0I2UUhxQWVzQjdBSHRBZTRCN3dId0FmRUI4Z0h6QVprQ3BBS3dBdjRDL2dJTElBRWlCQ0FDUnczekFVSGRBU0VRRFA4REN5QUJJaEFnQWtjTjNRRkJ3d0VoRUF6K0F3c2dBU0lCSUFKSERaQUJRZmNBSVJBTS9RTUxJQUVpQVNBQ1J3MkdBVUh2QUNFUURQd0RDeUFCSWdFZ0FrY05mMEhxQUNFUURQc0RDeUFCSWdFZ0FrY05lMEhvQUNFUURQb0RDeUFCSWdFZ0FrY05lRUhtQUNFUURQa0RDeUFCSWdFZ0FrY05Ha0VZSVJBTStBTUxJQUVpQVNBQ1J3MFVRUkloRUF6M0F3c2dBU0lCSUFKSERWbEJ4UUFoRUF6MkF3c2dBU0lCSUFKSERVcEJQeUVRRFBVREN5QUJJZ0VnQWtjTlNFRThJUkFNOUFNTElBRWlBU0FDUncxQlFURWhFQXp6QXdzZ0FDMEFMa0VCUmczckF3eUhBZ3NnQUNBQklnRWdBaERBZ0lDQUFFRUJSdzNtQVNBQVFnQTNBeUFNNXdFTElBQWdBU0lCSUFJUXRJQ0FnQUFpRUEzbkFTQUJJUUVNOVFJTEFrQWdBU0lCSUFKSERRQkJCaUVRRFBBREN5QUFJQUZCQVdvaUFTQUNFTHVBZ0lBQUloQU42QUVnQVNFQkRERUxJQUJDQURjRElFRVNJUkFNMVFNTElBRWlFQ0FDUncwclFSMGhFQXp0QXdzQ1FDQUJJZ0VnQWtZTkFDQUJRUUZxSVFGQkVDRVFETlFEQzBFSElSQU03QU1MSUFCQ0FDQUFLUU1nSWhFZ0FpQUJJaEJyclNJU2ZTSVRJQk1nRVZZYk53TWdJQkVnRWxZaUZFVU41UUZCQ0NFUURPc0RDd0pBSUFFaUFTQUNSZzBBSUFCQmlZQ0FnQUEyQWdnZ0FDQUJOZ0lFSUFFaEFVRVVJUkFNMGdNTFFRa2hFQXpxQXdzZ0FTRUJJQUFwQXlCUURlUUJJQUVoQVF6eUFnc0NRQ0FCSWdFZ0FrY05BRUVMSVJBTTZRTUxJQUFnQVVFQmFpSUJJQUlRdG9DQWdBQWlFQTNsQVNBQklRRU04Z0lMSUFBZ0FTSUJJQUlRdUlDQWdBQWlFQTNsQVNBQklRRU04Z0lMSUFBZ0FTSUJJQUlRdUlDQWdBQWlFQTNtQVNBQklRRU1EUXNnQUNBQklnRWdBaEM2Z0lDQUFDSVFEZWNCSUFFaEFRendBZ3NDUUNBQklnRWdBa2NOQUVFUElSQU01UU1MSUFFdEFBQWlFRUU3UmcwSUlCQkJEVWNONkFFZ0FVRUJhaUVCRE84Q0N5QUFJQUVpQVNBQ0VMcUFnSUFBSWhBTjZBRWdBU0VCRFBJQ0N3TkFBa0FnQVMwQUFFSHd0WUNBQUdvdEFBQWlFRUVCUmcwQUlCQkJBa2NONndFZ0FDZ0NCQ0VRSUFCQkFEWUNCQ0FBSUJBZ0FVRUJhaUlCRUxtQWdJQUFJaEFONmdFZ0FTRUJEUFFDQ3lBQlFRRnFJZ0VnQWtjTkFBdEJFaUVRRE9JREN5QUFJQUVpQVNBQ0VMcUFnSUFBSWhBTjZRRWdBU0VCREFvTElBRWlBU0FDUncwR1FSc2hFQXpnQXdzQ1FDQUJJZ0VnQWtjTkFFRVdJUkFNNEFNTElBQkJpb0NBZ0FBMkFnZ2dBQ0FCTmdJRUlBQWdBU0FDRUxpQWdJQUFJaEFONmdFZ0FTRUJRU0FoRUF6R0F3c0NRQ0FCSWdFZ0FrWU5BQU5BQWtBZ0FTMEFBRUh3dDRDQUFHb3RBQUFpRUVFQ1JnMEFBa0FnRUVGL2FnNEU1UUhzQVFEckFld0JDeUFCUVFGcUlRRkJDQ0VRRE1nREN5QUJRUUZxSWdFZ0FrY05BQXRCRlNFUUROOERDMEVWSVJBTTNnTUxBMEFDUUNBQkxRQUFRZkM1Z0lBQWFpMEFBQ0lRUVFKR0RRQWdFRUYvYWc0RTNnSHNBZUFCNndIc0FRc2dBVUVCYWlJQklBSkhEUUFMUVJnaEVBemRBd3NDUUNBQklnRWdBa1lOQUNBQVFZdUFnSUFBTmdJSUlBQWdBVFlDQkNBQklRRkJCeUVRRE1RREMwRVpJUkFNM0FNTElBRkJBV29oQVF3Q0N3SkFJQUVpRkNBQ1J3MEFRUm9oRUF6YkF3c2dGQ0VCQWtBZ0ZDMEFBRUZ6YWc0VTNRTHVBdTRDN2dMdUF1NEM3Z0x1QXU0QzdnTHVBdTRDN2dMdUF1NEM3Z0x1QXU0QzdnSUE3Z0lMUVFBaEVDQUFRUUEyQWh3Z0FFR3ZpNENBQURZQ0VDQUFRUUkyQWd3Z0FDQVVRUUZxTmdJVUROb0RDd0pBSUFFdEFBQWlFRUU3UmcwQUlCQkJEVWNONkFFZ0FVRUJhaUVCRE9VQ0N5QUJRUUZxSVFFTFFTSWhFQXkvQXdzQ1FDQUJJaEFnQWtjTkFFRWNJUkFNMkFNTFFnQWhFU0FRSVFFZ0VDMEFBRUZRYWc0MzV3SG1BUUVDQXdRRkJnY0lBQUFBQUFBQUFBa0tDd3dORGdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRHhBUkVoTVVBQXRCSGlFUURMMERDMElDSVJFTTVRRUxRZ01oRVF6a0FRdENCQ0VSRE9NQkMwSUZJUkVNNGdFTFFnWWhFUXpoQVF0Q0J5RVJET0FCQzBJSUlSRU0zd0VMUWdraEVRemVBUXRDQ2lFUkROMEJDMElMSVJFTTNBRUxRZ3doRVF6YkFRdENEU0VSRE5vQkMwSU9JUkVNMlFFTFFnOGhFUXpZQVF0Q0NpRVJETmNCQzBJTElSRU0xZ0VMUWd3aEVRelZBUXRDRFNFUkROUUJDMElPSVJFTTB3RUxRZzhoRVF6U0FRdENBQ0VSQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQVFMUUFBUVZCcURqZmxBZVFCQUFFQ0F3UUZCZ2ZtQWVZQjVnSG1BZVlCNWdIbUFRZ0pDZ3NNRGVZQjVnSG1BZVlCNWdIbUFlWUI1Z0htQWVZQjVnSG1BZVlCNWdIbUFlWUI1Z0htQWVZQjVnSG1BZVlCNWdIbUFlWUI1Z0VPRHhBUkVoUG1BUXRDQWlFUkRPUUJDMElESVJFTTR3RUxRZ1FoRVF6aUFRdENCU0VSRE9FQkMwSUdJUkVNNEFFTFFnY2hFUXpmQVF0Q0NDRVJETjRCQzBJSklSRU0zUUVMUWdvaEVRemNBUXRDQ3lFUkROc0JDMElNSVJFTTJnRUxRZzBoRVF6WkFRdENEaUVSRE5nQkMwSVBJUkVNMXdFTFFnb2hFUXpXQVF0Q0N5RVJETlVCQzBJTUlSRU0xQUVMUWcwaEVRelRBUXRDRGlFUkROSUJDMElQSVJFTTBRRUxJQUJDQUNBQUtRTWdJaEVnQWlBQkloQnJyU0lTZlNJVElCTWdFVlliTndNZ0lCRWdFbFlpRkVVTjBnRkJIeUVRRE1BREN3SkFJQUVpQVNBQ1JnMEFJQUJCaVlDQWdBQTJBZ2dnQUNBQk5nSUVJQUVoQVVFa0lSQU1wd01MUVNBaEVBeS9Bd3NnQUNBQkloQWdBaEMrZ0lDQUFFRi9hZzRGdGdFQXhRSUIwUUhTQVF0QkVTRVFES1FEQ3lBQVFRRTZBQzhnRUNFQkRMc0RDeUFCSWdFZ0FrY04wZ0ZCSkNFUURMc0RDeUFCSWcwZ0FrY05Ia0hHQUNFUURMb0RDeUFBSUFFaUFTQUNFTEtBZ0lBQUloQU4xQUVnQVNFQkRMVUJDeUFCSWhBZ0FrY05Ka0hRQUNFUURMZ0RDd0pBSUFFaUFTQUNSdzBBUVNnaEVBeTRBd3NnQUVFQU5nSUVJQUJCaklDQWdBQTJBZ2dnQUNBQklBRVFzWUNBZ0FBaUVBM1RBU0FCSVFFTTJBRUxBa0FnQVNJUUlBSkhEUUJCS1NFUURMY0RDeUFRTFFBQUlnRkJJRVlORkNBQlFRbEhEZE1CSUJCQkFXb2hBUXdWQ3dKQUlBRWlBU0FDUmcwQUlBRkJBV29oQVF3WEMwRXFJUkFNdFFNTEFrQWdBU0lRSUFKSERRQkJLeUVRRExVREN3SkFJQkF0QUFBaUFVRUpSZzBBSUFGQklFY04xUUVMSUFBdEFDeEJDRVlOMHdFZ0VDRUJESkVEQ3dKQUlBRWlBU0FDUncwQVFTd2hFQXkwQXdzZ0FTMEFBRUVLUnczVkFTQUJRUUZxSVFFTXlRSUxJQUVpRGlBQ1J3M1ZBVUV2SVJBTXNnTUxBMEFDUUNBQkxRQUFJaEJCSUVZTkFBSkFJQkJCZG1vT0JBRGNBZHdCQU5vQkN5QUJJUUVNNEFFTElBRkJBV29pQVNBQ1J3MEFDMEV4SVJBTXNRTUxRVEloRUNBQkloUWdBa1lOc0FNZ0FpQVVheUFBS0FJQUlnRnFJUlVnRkNBQmEwRURhaUVXQWtBRFFDQVVMUUFBSWhkQklISWdGeUFYUWI5L2FrSC9BWEZCR2trYlFmOEJjU0FCUWZDN2dJQUFhaTBBQUVjTkFRSkFJQUZCQTBjTkFFRUdJUUVNbGdNTElBRkJBV29oQVNBVVFRRnFJaFFnQWtjTkFBc2dBQ0FWTmdJQURMRURDeUFBUVFBMkFnQWdGQ0VCRE5rQkMwRXpJUkFnQVNJVUlBSkdEYThESUFJZ0ZHc2dBQ2dDQUNJQmFpRVZJQlFnQVd0QkNHb2hGZ0pBQTBBZ0ZDMEFBQ0lYUVNCeUlCY2dGMEcvZjJwQi93RnhRUnBKRzBIL0FYRWdBVUgwdTRDQUFHb3RBQUJIRFFFQ1FDQUJRUWhIRFFCQkJTRUJESlVEQ3lBQlFRRnFJUUVnRkVFQmFpSVVJQUpIRFFBTElBQWdGVFlDQUF5d0F3c2dBRUVBTmdJQUlCUWhBUXpZQVF0Qk5DRVFJQUVpRkNBQ1JnMnVBeUFDSUJScklBQW9BZ0FpQVdvaEZTQVVJQUZyUVFWcUlSWUNRQU5BSUJRdEFBQWlGMEVnY2lBWElCZEJ2MzlxUWY4QmNVRWFTUnRCL3dGeElBRkIwTUtBZ0FCcUxRQUFSdzBCQWtBZ0FVRUZSdzBBUVFjaEFReVVBd3NnQVVFQmFpRUJJQlJCQVdvaUZDQUNSdzBBQ3lBQUlCVTJBZ0FNcndNTElBQkJBRFlDQUNBVUlRRU0xd0VMQWtBZ0FTSUJJQUpHRFFBRFFBSkFJQUV0QUFCQmdMNkFnQUJxTFFBQUloQkJBVVlOQUNBUVFRSkdEUW9nQVNFQkROMEJDeUFCUVFGcUlnRWdBa2NOQUF0Qk1DRVFESzREQzBFd0lSQU1yUU1MQWtBZ0FTSUJJQUpHRFFBRFFBSkFJQUV0QUFBaUVFRWdSZzBBSUJCQmRtb09CTmtCMmdIYUFka0IyZ0VMSUFGQkFXb2lBU0FDUncwQUMwRTRJUkFNclFNTFFUZ2hFQXlzQXdzRFFBSkFJQUV0QUFBaUVFRWdSZzBBSUJCQkNVY05Bd3NnQVVFQmFpSUJJQUpIRFFBTFFUd2hFQXlyQXdzRFFBSkFJQUV0QUFBaUVFRWdSZzBBQWtBQ1FDQVFRWFpxRGdUYUFRRUIyZ0VBQ3lBUVFTeEdEZHNCQ3lBQklRRU1CQXNnQVVFQmFpSUJJQUpIRFFBTFFUOGhFQXlxQXdzZ0FTRUJETnNCQzBIQUFDRVFJQUVpRkNBQ1JnMm9BeUFDSUJScklBQW9BZ0FpQVdvaEZpQVVJQUZyUVFacUlSY0NRQU5BSUJRdEFBQkJJSElnQVVHQXdJQ0FBR290QUFCSERRRWdBVUVHUmcyT0F5QUJRUUZxSVFFZ0ZFRUJhaUlVSUFKSERRQUxJQUFnRmpZQ0FBeXBBd3NnQUVFQU5nSUFJQlFoQVF0Qk5pRVFESTREQ3dKQUlBRWlEeUFDUncwQVFjRUFJUkFNcHdNTElBQkJqSUNBZ0FBMkFnZ2dBQ0FQTmdJRUlBOGhBU0FBTFFBc1FYOXFEZ1ROQWRVQjF3SFpBWWNEQ3lBQlFRRnFJUUVNekFFTEFrQWdBU0lCSUFKR0RRQURRQUpBSUFFdEFBQWlFRUVnY2lBUUlCQkJ2MzlxUWY4QmNVRWFTUnRCL3dGeEloQkJDVVlOQUNBUVFTQkdEUUFDUUFKQUFrQUNRQ0FRUVoxL2FnNFRBQU1EQXdNREF3TUJBd01EQXdNREF3TURBZ01MSUFGQkFXb2hBVUV4SVJBTWtRTUxJQUZCQVdvaEFVRXlJUkFNa0FNTElBRkJBV29oQVVFeklSQU1qd01MSUFFaEFRelFBUXNnQVVFQmFpSUJJQUpIRFFBTFFUVWhFQXlsQXd0Qk5TRVFES1FEQ3dKQUlBRWlBU0FDUmcwQUEwQUNRQ0FCTFFBQVFZQzhnSUFBYWkwQUFFRUJSZzBBSUFFaEFRelRBUXNnQVVFQmFpSUJJQUpIRFFBTFFUMGhFQXlrQXd0QlBTRVFES01EQ3lBQUlBRWlBU0FDRUxDQWdJQUFJaEFOMWdFZ0FTRUJEQUVMSUJCQkFXb2hBUXRCUENFUURJY0RDd0pBSUFFaUFTQUNSdzBBUWNJQUlSQU1vQU1MQWtBRFFBSkFJQUV0QUFCQmQyb09HQUFDL2dMK0FvUUQvZ0wrQXY0Qy9nTCtBdjRDL2dMK0F2NEMvZ0wrQXY0Qy9nTCtBdjRDL2dMK0F2NENBUDRDQ3lBQlFRRnFJZ0VnQWtjTkFBdEJ3Z0FoRUF5Z0F3c2dBVUVCYWlFQklBQXRBQzFCQVhGRkRiMEJJQUVoQVF0QkxDRVFESVVEQ3lBQklnRWdBa2NOMHdGQnhBQWhFQXlkQXdzRFFBSkFJQUV0QUFCQmtNQ0FnQUJxTFFBQVFRRkdEUUFnQVNFQkRMY0NDeUFCUVFGcUlnRWdBa2NOQUF0QnhRQWhFQXljQXdzZ0RTMEFBQ0lRUVNCR0RiTUJJQkJCT2tjTmdRTWdBQ2dDQkNFQklBQkJBRFlDQkNBQUlBRWdEUkN2Z0lDQUFDSUJEZEFCSUExQkFXb2hBUXl6QWd0Qnh3QWhFQ0FCSWcwZ0FrWU5tZ01nQWlBTmF5QUFLQUlBSWdGcUlSWWdEU0FCYTBFRmFpRVhBMEFnRFMwQUFDSVVRU0J5SUJRZ0ZFRy9mMnBCL3dGeFFScEpHMEgvQVhFZ0FVR1F3b0NBQUdvdEFBQkhEWUFESUFGQkJVWU45QUlnQVVFQmFpRUJJQTFCQVdvaURTQUNSdzBBQ3lBQUlCWTJBZ0FNbWdNTFFjZ0FJUkFnQVNJTklBSkdEWmtESUFJZ0RXc2dBQ2dDQUNJQmFpRVdJQTBnQVd0QkNXb2hGd05BSUEwdEFBQWlGRUVnY2lBVUlCUkJ2MzlxUWY4QmNVRWFTUnRCL3dGeElBRkJsc0tBZ0FCcUxRQUFSdzMvQWdKQUlBRkJDVWNOQUVFQ0lRRU05UUlMSUFGQkFXb2hBU0FOUVFGcUlnMGdBa2NOQUFzZ0FDQVdOZ0lBREprREN3SkFJQUVpRFNBQ1J3MEFRY2tBSVJBTW1RTUxBa0FDUUNBTkxRQUFJZ0ZCSUhJZ0FTQUJRYjkvYWtIL0FYRkJHa2tiUWY4QmNVR1NmMm9PQndDQUE0QURnQU9BQTRBREFZQURDeUFOUVFGcUlRRkJQaUVRRElBREN5QU5RUUZxSVFGQlB5RVFEUDhDQzBIS0FDRVFJQUVpRFNBQ1JnMlhBeUFDSUExcklBQW9BZ0FpQVdvaEZpQU5JQUZyUVFGcUlSY0RRQ0FOTFFBQUloUkJJSElnRkNBVVFiOS9ha0gvQVhGQkdra2JRZjhCY1NBQlFhRENnSUFBYWkwQUFFY04vUUlnQVVFQlJnM3dBaUFCUVFGcUlRRWdEVUVCYWlJTklBSkhEUUFMSUFBZ0ZqWUNBQXlYQXd0Qnl3QWhFQ0FCSWcwZ0FrWU5sZ01nQWlBTmF5QUFLQUlBSWdGcUlSWWdEU0FCYTBFT2FpRVhBMEFnRFMwQUFDSVVRU0J5SUJRZ0ZFRy9mMnBCL3dGeFFScEpHMEgvQVhFZ0FVR2l3b0NBQUdvdEFBQkhEZndDSUFGQkRrWU44QUlnQVVFQmFpRUJJQTFCQVdvaURTQUNSdzBBQ3lBQUlCWTJBZ0FNbGdNTFFjd0FJUkFnQVNJTklBSkdEWlVESUFJZ0RXc2dBQ2dDQUNJQmFpRVdJQTBnQVd0QkQyb2hGd05BSUEwdEFBQWlGRUVnY2lBVUlCUkJ2MzlxUWY4QmNVRWFTUnRCL3dGeElBRkJ3TUtBZ0FCcUxRQUFSdzM3QWdKQUlBRkJEMGNOQUVFRElRRU04UUlMSUFGQkFXb2hBU0FOUVFGcUlnMGdBa2NOQUFzZ0FDQVdOZ0lBREpVREMwSE5BQ0VRSUFFaURTQUNSZzJVQXlBQ0lBMXJJQUFvQWdBaUFXb2hGaUFOSUFGclFRVnFJUmNEUUNBTkxRQUFJaFJCSUhJZ0ZDQVVRYjkvYWtIL0FYRkJHa2tiUWY4QmNTQUJRZERDZ0lBQWFpMEFBRWNOK2dJQ1FDQUJRUVZIRFFCQkJDRUJEUEFDQ3lBQlFRRnFJUUVnRFVFQmFpSU5JQUpIRFFBTElBQWdGallDQUF5VUF3c0NRQ0FCSWcwZ0FrY05BRUhPQUNFUURKUURDd0pBQWtBQ1FBSkFJQTB0QUFBaUFVRWdjaUFCSUFGQnYzOXFRZjhCY1VFYVNSdEIvd0Z4UVoxL2FnNFRBUDBDL1FMOUF2MEMvUUw5QXYwQy9RTDlBdjBDL1FMOUFnSDlBdjBDL1FJQ0EvMENDeUFOUVFGcUlRRkJ3UUFoRUF6OUFnc2dEVUVCYWlFQlFjSUFJUkFNL0FJTElBMUJBV29oQVVIREFDRVFEUHNDQ3lBTlFRRnFJUUZCeEFBaEVBejZBZ3NDUUNBQklnRWdBa1lOQUNBQVFZMkFnSUFBTmdJSUlBQWdBVFlDQkNBQklRRkJ4UUFoRUF6NkFndEJ6d0FoRUF5U0F3c2dFQ0VCQWtBQ1FDQVFMUUFBUVhacURnUUJxQUtvQWdDb0Fnc2dFRUVCYWlFQkMwRW5JUkFNK0FJTEFrQWdBU0lCSUFKSERRQkIwUUFoRUF5UkF3c0NRQ0FCTFFBQVFTQkdEUUFnQVNFQkRJMEJDeUFCUVFGcUlRRWdBQzBBTFVFQmNVVU54d0VnQVNFQkRJd0JDeUFCSWhjZ0FrY055QUZCMGdBaEVBeVBBd3RCMHdBaEVDQUJJaFFnQWtZTmpnTWdBaUFVYXlBQUtBSUFJZ0ZxSVJZZ0ZDQUJhMEVCYWlFWEEwQWdGQzBBQUNBQlFkYkNnSUFBYWkwQUFFY056QUVnQVVFQlJnM0hBU0FCUVFGcUlRRWdGRUVCYWlJVUlBSkhEUUFMSUFBZ0ZqWUNBQXlPQXdzQ1FDQUJJZ0VnQWtjTkFFSFZBQ0VRREk0REN5QUJMUUFBUVFwSERjd0JJQUZCQVdvaEFRekhBUXNDUUNBQklnRWdBa2NOQUVIV0FDRVFESTBEQ3dKQUFrQWdBUzBBQUVGMmFnNEVBTTBCelFFQnpRRUxJQUZCQVdvaEFRekhBUXNnQVVFQmFpRUJRY29BSVJBTTh3SUxJQUFnQVNJQklBSVFyb0NBZ0FBaUVBM0xBU0FCSVFGQnpRQWhFQXp5QWdzZ0FDMEFLVUVpUmcyRkF3eW1BZ3NDUUNBQklnRWdBa2NOQUVIYkFDRVFESW9EQzBFQUlSUkJBU0VYUVFFaEZrRUFJUkFDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQVMwQUFFRlFhZzRLMUFIVEFRQUJBZ01FQlFZSTFRRUxRUUloRUF3R0MwRURJUkFNQlF0QkJDRVFEQVFMUVFVaEVBd0RDMEVHSVJBTUFndEJCeUVRREFFTFFRZ2hFQXRCQUNFWFFRQWhGa0VBSVJRTXpBRUxRUWtoRUVFQklSUkJBQ0VYUVFBaEZnekxBUXNDUUNBQklnRWdBa2NOQUVIZEFDRVFESWtEQ3lBQkxRQUFRUzVIRGN3QklBRkJBV29oQVF5bUFnc2dBU0lCSUFKSERjd0JRZDhBSVJBTWh3TUxBa0FnQVNJQklBSkdEUUFnQUVHT2dJQ0FBRFlDQ0NBQUlBRTJBZ1FnQVNFQlFkQUFJUkFNN2dJTFFlQUFJUkFNaGdNTFFlRUFJUkFnQVNJQklBSkdEWVVESUFJZ0FXc2dBQ2dDQUNJVWFpRVdJQUVnRkd0QkEyb2hGd05BSUFFdEFBQWdGRUhpd29DQUFHb3RBQUJIRGMwQklCUkJBMFlOekFFZ0ZFRUJhaUVVSUFGQkFXb2lBU0FDUncwQUN5QUFJQlkyQWdBTWhRTUxRZUlBSVJBZ0FTSUJJQUpHRFlRRElBSWdBV3NnQUNnQ0FDSVVhaUVXSUFFZ0ZHdEJBbW9oRndOQUlBRXRBQUFnRkVIbXdvQ0FBR290QUFCSERjd0JJQlJCQWtZTnpnRWdGRUVCYWlFVUlBRkJBV29pQVNBQ1J3MEFDeUFBSUJZMkFnQU1oQU1MUWVNQUlSQWdBU0lCSUFKR0RZTURJQUlnQVdzZ0FDZ0NBQ0lVYWlFV0lBRWdGR3RCQTJvaEZ3TkFJQUV0QUFBZ0ZFSHB3b0NBQUdvdEFBQkhEY3NCSUJSQkEwWU56Z0VnRkVFQmFpRVVJQUZCQVdvaUFTQUNSdzBBQ3lBQUlCWTJBZ0FNZ3dNTEFrQWdBU0lCSUFKSERRQkI1UUFoRUF5REF3c2dBQ0FCUVFGcUlnRWdBaENvZ0lDQUFDSVFEYzBCSUFFaEFVSFdBQ0VRRE9rQ0N3SkFJQUVpQVNBQ1JnMEFBMEFDUUNBQkxRQUFJaEJCSUVZTkFBSkFBa0FDUUNBUVFiaC9hZzRMQUFIUEFjOEJ6d0hQQWM4Qnp3SFBBYzhCQXM4QkN5QUJRUUZxSVFGQjBnQWhFQXp0QWdzZ0FVRUJhaUVCUWRNQUlSQU03QUlMSUFGQkFXb2hBVUhVQUNFUURPc0NDeUFCUVFGcUlnRWdBa2NOQUF0QjVBQWhFQXlDQXd0QjVBQWhFQXlCQXdzRFFBSkFJQUV0QUFCQjhNS0FnQUJxTFFBQUloQkJBVVlOQUNBUVFYNXFEZ1BQQWRBQjBRSFNBUXNnQVVFQmFpSUJJQUpIRFFBTFFlWUFJUkFNZ0FNTEFrQWdBU0lCSUFKR0RRQWdBVUVCYWlFQkRBTUxRZWNBSVJBTS93SUxBMEFDUUNBQkxRQUFRZkRFZ0lBQWFpMEFBQ0lRUVFGR0RRQUNRQ0FRUVg1cURnVFNBZE1CMUFFQTFRRUxJQUVoQVVIWEFDRVFET2NDQ3lBQlFRRnFJZ0VnQWtjTkFBdEI2QUFoRUF6K0Fnc0NRQ0FCSWdFZ0FrY05BRUhwQUNFUURQNENDd0pBSUFFdEFBQWlFRUYyYWc0YXVnSFZBZFVCdkFIVkFkVUIxUUhWQWRVQjFRSFZBZFVCMVFIVkFkVUIxUUhWQWRVQjFRSFZBZFVCMVFIS0FkVUIxUUVBMHdFTElBRkJBV29oQVF0QkJpRVFET01DQ3dOQUFrQWdBUzBBQUVId3hvQ0FBR290QUFCQkFVWU5BQ0FCSVFFTW5nSUxJQUZCQVdvaUFTQUNSdzBBQzBIcUFDRVFEUHNDQ3dKQUlBRWlBU0FDUmcwQUlBRkJBV29oQVF3REMwSHJBQ0VRRFBvQ0N3SkFJQUVpQVNBQ1J3MEFRZXdBSVJBTStnSUxJQUZCQVdvaEFRd0JDd0pBSUFFaUFTQUNSdzBBUWUwQUlSQU0rUUlMSUFGQkFXb2hBUXRCQkNFUURONENDd0pBSUFFaUZDQUNSdzBBUWU0QUlSQU05d0lMSUJRaEFRSkFBa0FDUUNBVUxRQUFRZkRJZ0lBQWFpMEFBRUYvYWc0SDFBSFZBZFlCQUp3Q0FRTFhBUXNnRkVFQmFpRUJEQW9MSUJSQkFXb2hBUXpOQVF0QkFDRVFJQUJCQURZQ0hDQUFRWnVTZ0lBQU5nSVFJQUJCQnpZQ0RDQUFJQlJCQVdvMkFoUU05Z0lMQWtBRFFBSkFJQUV0QUFCQjhNaUFnQUJxTFFBQUloQkJCRVlOQUFKQUFrQWdFRUYvYWc0SDBnSFRBZFFCMlFFQUJBSFpBUXNnQVNFQlFkb0FJUkFNNEFJTElBRkJBV29oQVVIY0FDRVFETjhDQ3lBQlFRRnFJZ0VnQWtjTkFBdEI3d0FoRUF6MkFnc2dBVUVCYWlFQkRNc0JDd0pBSUFFaUZDQUNSdzBBUWZBQUlSQU05UUlMSUJRdEFBQkJMMGNOMUFFZ0ZFRUJhaUVCREFZTEFrQWdBU0lVSUFKSERRQkI4UUFoRUF6MEFnc0NRQ0FVTFFBQUlnRkJMMGNOQUNBVVFRRnFJUUZCM1FBaEVBemJBZ3NnQVVGMmFpSUVRUlpMRGRNQlFRRWdCSFJCaVlDQUFuRkZEZE1CRE1vQ0N3SkFJQUVpQVNBQ1JnMEFJQUZCQVdvaEFVSGVBQ0VRRE5vQ0MwSHlBQ0VRRFBJQ0N3SkFJQUVpRkNBQ1J3MEFRZlFBSVJBTThnSUxJQlFoQVFKQUlCUXRBQUJCOE15QWdBQnFMUUFBUVg5cURnUEpBcFFDQU5RQkMwSGhBQ0VRRE5nQ0N3SkFJQUVpRkNBQ1JnMEFBMEFDUUNBVUxRQUFRZkRLZ0lBQWFpMEFBQ0lCUVFOR0RRQUNRQ0FCUVg5cURnTExBZ0RWQVFzZ0ZDRUJRZDhBSVJBTTJnSUxJQlJCQVdvaUZDQUNSdzBBQzBIekFDRVFEUEVDQzBIekFDRVFEUEFDQ3dKQUlBRWlBU0FDUmcwQUlBQkJqNENBZ0FBMkFnZ2dBQ0FCTmdJRUlBRWhBVUhnQUNFUUROY0NDMEgxQUNFUURPOENDd0pBSUFFaUFTQUNSdzBBUWZZQUlSQU03d0lMSUFCQmo0Q0FnQUEyQWdnZ0FDQUJOZ0lFSUFFaEFRdEJBeUVRRE5RQ0N3TkFJQUV0QUFCQklFY053d0lnQVVFQmFpSUJJQUpIRFFBTFFmY0FJUkFNN0FJTEFrQWdBU0lCSUFKSERRQkIrQUFoRUF6c0Fnc2dBUzBBQUVFZ1J3M09BU0FCUVFGcUlRRU03d0VMSUFBZ0FTSUJJQUlRcklDQWdBQWlFQTNPQVNBQklRRU1qZ0lMQWtBZ0FTSUVJQUpIRFFCQitnQWhFQXpxQWdzZ0JDMEFBRUhNQUVjTjBRRWdCRUVCYWlFQlFSTWhFQXpQQVFzQ1FDQUJJZ1FnQWtjTkFFSDdBQ0VRRE9rQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUVZxSVJBRFFDQUVMUUFBSUFGQjhNNkFnQUJxTFFBQVJ3M1FBU0FCUVFWR0RjNEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRZnNBSVJBTTZBSUxBa0FnQVNJRUlBSkhEUUJCL0FBaEVBem9BZ3NDUUFKQUlBUXRBQUJCdlg5cURnd0EwUUhSQWRFQjBRSFJBZEVCMFFIUkFkRUIwUUVCMFFFTElBUkJBV29oQVVIbUFDRVFETThDQ3lBRVFRRnFJUUZCNXdBaEVBek9BZ3NDUUNBQklnUWdBa2NOQUVIOUFDRVFET2NDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRSnFJUkFDUUFOQUlBUXRBQUFnQVVIdHo0Q0FBR290QUFCSERjOEJJQUZCQWtZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFSDlBQ0VRRE9jQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVJBaEVBek1BUXNDUUNBQklnUWdBa2NOQUVIK0FDRVFET1lDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRVnFJUkFDUUFOQUlBUXRBQUFnQVVIMnpvQ0FBR290QUFCSERjNEJJQUZCQlVZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFSCtBQ0VRRE9ZQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVJZaEVBekxBUXNDUUNBQklnUWdBa2NOQUVIL0FDRVFET1VDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRTnFJUkFDUUFOQUlBUXRBQUFnQVVIOHpvQ0FBR290QUFCSERjMEJJQUZCQTBZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFSC9BQ0VRRE9VQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVFVaEVBektBUXNDUUNBQklnUWdBa2NOQUVHQUFTRVFET1FDQ3lBRUxRQUFRZGtBUnczTEFTQUVRUUZxSVFGQkNDRVFETWtCQ3dKQUlBRWlCQ0FDUncwQVFZRUJJUkFNNHdJTEFrQUNRQ0FFTFFBQVFiSi9hZzREQU13QkFjd0JDeUFFUVFGcUlRRkI2d0FoRUF6S0Fnc2dCRUVCYWlFQlFld0FJUkFNeVFJTEFrQWdBU0lFSUFKSERRQkJnZ0VoRUF6aUFnc0NRQUpBSUFRdEFBQkJ1SDlxRGdnQXl3SExBY3NCeXdITEFjc0JBY3NCQ3lBRVFRRnFJUUZCNmdBaEVBekpBZ3NnQkVFQmFpRUJRZTBBSVJBTXlBSUxBa0FnQVNJRUlBSkhEUUJCZ3dFaEVBemhBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSQWdCQ0FCYTBFQ2FpRVVBa0FEUUNBRUxRQUFJQUZCZ00rQWdBQnFMUUFBUnczSkFTQUJRUUpHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQkEyQWdCQmd3RWhFQXpoQWd0QkFDRVFJQUJCQURZQ0FDQVVRUUZxSVFFTXhnRUxBa0FnQVNJRUlBSkhEUUJCaEFFaEVBemdBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFRWFpRVFBa0FEUUNBRUxRQUFJQUZCZzgrQWdBQnFMUUFBUnczSUFTQUJRUVJHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQmhBRWhFQXpnQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVqSVJBTXhRRUxBa0FnQVNJRUlBSkhEUUJCaFFFaEVBemZBZ3NDUUFKQUlBUXRBQUJCdEg5cURnZ0F5QUhJQWNnQnlBSElBY2dCQWNnQkN5QUVRUUZxSVFGQjd3QWhFQXpHQWdzZ0JFRUJhaUVCUWZBQUlSQU14UUlMQWtBZ0FTSUVJQUpIRFFCQmhnRWhFQXplQWdzZ0JDMEFBRUhGQUVjTnhRRWdCRUVCYWlFQkRJTUNDd0pBSUFFaUJDQUNSdzBBUVljQklSQU0zUUlMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkEyb2hFQUpBQTBBZ0JDMEFBQ0FCUVlqUGdJQUFhaTBBQUVjTnhRRWdBVUVEUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFZY0JJUkFNM1FJTElBQkJBRFlDQUNBUVFRRnFJUUZCTFNFUURNSUJDd0pBSUFFaUJDQUNSdzBBUVlnQklSQU0zQUlMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkNHb2hFQUpBQTBBZ0JDMEFBQ0FCUWREUGdJQUFhaTBBQUVjTnhBRWdBVUVJUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFZZ0JJUkFNM0FJTElBQkJBRFlDQUNBUVFRRnFJUUZCS1NFUURNRUJDd0pBSUFFaUFTQUNSdzBBUVlrQklSQU0yd0lMUVFFaEVDQUJMUUFBUWQ4QVJ3M0FBU0FCUVFGcUlRRU1nUUlMQWtBZ0FTSUVJQUpIRFFCQmlnRWhFQXphQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUJhaUVRQTBBZ0JDMEFBQ0FCUVl6UGdJQUFhaTBBQUVjTndRRWdBVUVCUmcydkFpQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR0tBU0VRRE5rQ0N3SkFJQUVpQkNBQ1J3MEFRWXNCSVJBTTJRSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQW1vaEVBSkFBMEFnQkMwQUFDQUJRWTdQZ0lBQWFpMEFBRWNOd1FFZ0FVRUNSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUVlzQklSQU0yUUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJBaUVRREw0QkN3SkFJQUVpQkNBQ1J3MEFRWXdCSVJBTTJBSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQVdvaEVBSkFBMEFnQkMwQUFDQUJRZkRQZ0lBQWFpMEFBRWNOd0FFZ0FVRUJSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUVl3QklSQU0yQUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJIeUVRREwwQkN3SkFJQUVpQkNBQ1J3MEFRWTBCSVJBTTF3SUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQVdvaEVBSkFBMEFnQkMwQUFDQUJRZkxQZ0lBQWFpMEFBRWNOdndFZ0FVRUJSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUVkwQklSQU0xd0lMSUFCQkFEWUNBQ0FRUVFGcUlRRkJDU0VRREx3QkN3SkFJQUVpQkNBQ1J3MEFRWTRCSVJBTTFnSUxBa0FDUUNBRUxRQUFRYmQvYWc0SEFMOEJ2d0cvQWI4QnZ3RUJ2d0VMSUFSQkFXb2hBVUg0QUNFUURMMENDeUFFUVFGcUlRRkIrUUFoRUF5OEFnc0NRQ0FCSWdRZ0FrY05BRUdQQVNFUUROVUNDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFWcUlSQUNRQU5BSUFRdEFBQWdBVUdSejRDQUFHb3RBQUJIRGIwQklBRkJCVVlOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHUEFTRVFETlVDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUmdoRUF5NkFRc0NRQ0FCSWdRZ0FrY05BRUdRQVNFUUROUUNDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFKcUlSQUNRQU5BSUFRdEFBQWdBVUdYejRDQUFHb3RBQUJIRGJ3QklBRkJBa1lOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHUUFTRVFETlFDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUmNoRUF5NUFRc0NRQ0FCSWdRZ0FrY05BRUdSQVNFUUROTUNDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFacUlSQUNRQU5BSUFRdEFBQWdBVUdhejRDQUFHb3RBQUJIRGJzQklBRkJCa1lOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHUkFTRVFETk1DQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUlVoRUF5NEFRc0NRQ0FCSWdRZ0FrY05BRUdTQVNFUUROSUNDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFWcUlSQUNRQU5BSUFRdEFBQWdBVUdoejRDQUFHb3RBQUJIRGJvQklBRkJCVVlOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHU0FTRVFETklDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUjRoRUF5M0FRc0NRQ0FCSWdRZ0FrY05BRUdUQVNFUURORUNDeUFFTFFBQVFjd0FSdzI0QVNBRVFRRnFJUUZCQ2lFUURMWUJDd0pBSUFRZ0FrY05BRUdVQVNFUUROQUNDd0pBQWtBZ0JDMEFBRUcvZjJvT0R3QzVBYmtCdVFHNUFia0J1UUc1QWJrQnVRRzVBYmtCdVFHNUFRRzVBUXNnQkVFQmFpRUJRZjRBSVJBTXR3SUxJQVJCQVdvaEFVSC9BQ0VRRExZQ0N3SkFJQVFnQWtjTkFFR1ZBU0VRRE04Q0N3SkFBa0FnQkMwQUFFRy9mMm9PQXdDNEFRRzRBUXNnQkVFQmFpRUJRZjBBSVJBTXRnSUxJQVJCQVdvaEJFR0FBU0VRRExVQ0N3SkFJQVFnQWtjTkFFR1dBU0VRRE00Q0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUUZxSVJBQ1FBTkFJQVF0QUFBZ0FVR256NENBQUdvdEFBQkhEYllCSUFGQkFVWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUdXQVNFUURNNENDeUFBUVFBMkFnQWdFRUVCYWlFQlFRc2hFQXl6QVFzQ1FDQUVJQUpIRFFCQmx3RWhFQXpOQWdzQ1FBSkFBa0FDUUNBRUxRQUFRVk5xRGlNQXVBRzRBYmdCdUFHNEFiZ0J1QUc0QWJnQnVBRzRBYmdCdUFHNEFiZ0J1QUc0QWJnQnVBRzRBYmdCdUFHNEFRRzRBYmdCdUFHNEFiZ0JBcmdCdUFHNEFRTzRBUXNnQkVFQmFpRUJRZnNBSVJBTXRnSUxJQVJCQVdvaEFVSDhBQ0VRRExVQ0N5QUVRUUZxSVFSQmdRRWhFQXkwQWdzZ0JFRUJhaUVFUVlJQklSQU1zd0lMQWtBZ0JDQUNSdzBBUVpnQklSQU16QUlMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkJHb2hFQUpBQTBBZ0JDMEFBQ0FCUWFuUGdJQUFhaTBBQUVjTnRBRWdBVUVFUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFaZ0JJUkFNekFJTElBQkJBRFlDQUNBUVFRRnFJUUZCR1NFUURMRUJDd0pBSUFRZ0FrY05BRUdaQVNFUURNc0NDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFWcUlSQUNRQU5BSUFRdEFBQWdBVUd1ejRDQUFHb3RBQUJIRGJNQklBRkJCVVlOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHWkFTRVFETXNDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUVloRUF5d0FRc0NRQ0FFSUFKSERRQkJtZ0VoRUF6S0Fnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVCYWlFUUFrQURRQ0FFTFFBQUlBRkJ0TStBZ0FCcUxRQUFSdzJ5QVNBQlFRRkdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCbWdFaEVBektBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRWNJUkFNcndFTEFrQWdCQ0FDUncwQVFac0JJUkFNeVFJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBV29oRUFKQUEwQWdCQzBBQUNBQlFiYlBnSUFBYWkwQUFFY05zUUVnQVVFQlJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRWnNCSVJBTXlRSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkp5RVFESzRCQ3dKQUlBUWdBa2NOQUVHY0FTRVFETWdDQ3dKQUFrQWdCQzBBQUVHc2Yyb09BZ0FCc1FFTElBUkJBV29oQkVHR0FTRVFESzhDQ3lBRVFRRnFJUVJCaHdFaEVBeXVBZ3NDUUNBRUlBSkhEUUJCblFFaEVBekhBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFQmFpRVFBa0FEUUNBRUxRQUFJQUZCdU0rQWdBQnFMUUFBUncydkFTQUJRUUZHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQm5RRWhFQXpIQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVtSVJBTXJBRUxBa0FnQkNBQ1J3MEFRWjRCSVJBTXhnSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQVdvaEVBSkFBMEFnQkMwQUFDQUJRYnJQZ0lBQWFpMEFBRWNOcmdFZ0FVRUJSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUVo0QklSQU14Z0lMSUFCQkFEWUNBQ0FRUVFGcUlRRkJBeUVRREtzQkN3SkFJQVFnQWtjTkFFR2ZBU0VRRE1VQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUUpxSVJBQ1FBTkFJQVF0QUFBZ0FVSHR6NENBQUdvdEFBQkhEYTBCSUFGQkFrWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUdmQVNFUURNVUNDeUFBUVFBMkFnQWdFRUVCYWlFQlFRd2hFQXlxQVFzQ1FDQUVJQUpIRFFCQm9BRWhFQXpFQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRURhaUVRQWtBRFFDQUVMUUFBSUFGQnZNK0FnQUJxTFFBQVJ3MnNBU0FCUVFOR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJvQUVoRUF6RUFnc2dBRUVBTmdJQUlCQkJBV29oQVVFTklSQU1xUUVMQWtBZ0JDQUNSdzBBUWFFQklSQU13d0lMQWtBQ1FDQUVMUUFBUWJwL2FnNExBS3dCckFHc0Fhd0JyQUdzQWF3QnJBR3NBUUdzQVFzZ0JFRUJhaUVFUVlzQklSQU1xZ0lMSUFSQkFXb2hCRUdNQVNFUURLa0NDd0pBSUFRZ0FrY05BRUdpQVNFUURNSUNDeUFFTFFBQVFkQUFSdzJwQVNBRVFRRnFJUVFNNlFFTEFrQWdCQ0FDUncwQVFhTUJJUkFNd1FJTEFrQUNRQ0FFTFFBQVFiZC9hZzRIQWFvQnFnR3FBYW9CcWdFQXFnRUxJQVJCQVdvaEJFR09BU0VRREtnQ0N5QUVRUUZxSVFGQklpRVFES1lCQ3dKQUlBUWdBa2NOQUVHa0FTRVFETUFDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRRnFJUkFDUUFOQUlBUXRBQUFnQVVIQXo0Q0FBR290QUFCSERhZ0JJQUZCQVVZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR2tBU0VRRE1BQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVIwaEVBeWxBUXNDUUNBRUlBSkhEUUJCcFFFaEVBeS9BZ3NDUUFKQUlBUXRBQUJCcm45cURnTUFxQUVCcUFFTElBUkJBV29oQkVHUUFTRVFES1lDQ3lBRVFRRnFJUUZCQkNFUURLUUJDd0pBSUFRZ0FrY05BRUdtQVNFUURMNENDd0pBQWtBQ1FBSkFBa0FnQkMwQUFFRy9mMm9PRlFDcUFhb0JxZ0dxQWFvQnFnR3FBYW9CcWdHcUFRR3FBYW9CQXFvQnFnRURxZ0dxQVFTcUFRc2dCRUVCYWlFRVFZZ0JJUkFNcUFJTElBUkJBV29oQkVHSkFTRVFES2NDQ3lBRVFRRnFJUVJCaWdFaEVBeW1BZ3NnQkVFQmFpRUVRWThCSVJBTXBRSUxJQVJCQVdvaEJFR1JBU0VRREtRQ0N3SkFJQVFnQWtjTkFFR25BU0VRREwwQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUUpxSVJBQ1FBTkFJQVF0QUFBZ0FVSHR6NENBQUdvdEFBQkhEYVVCSUFGQkFrWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUduQVNFUURMMENDeUFBUVFBMkFnQWdFRUVCYWlFQlFSRWhFQXlpQVFzQ1FDQUVJQUpIRFFCQnFBRWhFQXk4QWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUNhaUVRQWtBRFFDQUVMUUFBSUFGQndzK0FnQUJxTFFBQVJ3MmtBU0FCUVFKR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJxQUVoRUF5OEFnc2dBRUVBTmdJQUlCQkJBV29oQVVFc0lSQU1vUUVMQWtBZ0JDQUNSdzBBUWFrQklSQU11d0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkJHb2hFQUpBQTBBZ0JDMEFBQ0FCUWNYUGdJQUFhaTBBQUVjTm93RWdBVUVFUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFha0JJUkFNdXdJTElBQkJBRFlDQUNBUVFRRnFJUUZCS3lFUURLQUJDd0pBSUFRZ0FrY05BRUdxQVNFUURMb0NDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFKcUlSQUNRQU5BSUFRdEFBQWdBVUhLejRDQUFHb3RBQUJIRGFJQklBRkJBa1lOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHcUFTRVFETG9DQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUlFoRUF5ZkFRc0NRQ0FFSUFKSERRQkJxd0VoRUF5NUFnc0NRQUpBQWtBQ1FDQUVMUUFBUWI1L2FnNFBBQUVDcEFHa0FhUUJwQUdrQWFRQnBBR2tBYVFCcEFHa0FRT2tBUXNnQkVFQmFpRUVRWk1CSVJBTW9nSUxJQVJCQVdvaEJFR1VBU0VRREtFQ0N5QUVRUUZxSVFSQmxRRWhFQXlnQWdzZ0JFRUJhaUVFUVpZQklSQU1ud0lMQWtBZ0JDQUNSdzBBUWF3QklSQU11QUlMSUFRdEFBQkJ4UUJIRFo4QklBUkJBV29oQkF6Z0FRc0NRQ0FFSUFKSERRQkJyUUVoRUF5M0Fnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVDYWlFUUFrQURRQ0FFTFFBQUlBRkJ6YytBZ0FCcUxRQUFSdzJmQVNBQlFRSkdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCclFFaEVBeTNBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRU9JUkFNbkFFTEFrQWdCQ0FDUncwQVFhNEJJUkFNdGdJTElBUXRBQUJCMEFCSERaMEJJQVJCQVdvaEFVRWxJUkFNbXdFTEFrQWdCQ0FDUncwQVFhOEJJUkFNdFFJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJDR29oRUFKQUEwQWdCQzBBQUNBQlFkRFBnSUFBYWkwQUFFY05uUUVnQVVFSVJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRYThCSVJBTXRRSUxJQUJCQURZQ0FDQVFRUUZxSVFGQktpRVFESm9CQ3dKQUlBUWdBa2NOQUVHd0FTRVFETFFDQ3dKQUFrQWdCQzBBQUVHcmYyb09Dd0NkQVowQm5RR2RBWjBCblFHZEFaMEJuUUVCblFFTElBUkJBV29oQkVHYUFTRVFESnNDQ3lBRVFRRnFJUVJCbXdFaEVBeWFBZ3NDUUNBRUlBSkhEUUJCc1FFaEVBeXpBZ3NDUUFKQUlBUXRBQUJCdjM5cURoUUFuQUdjQVp3Qm5BR2NBWndCbkFHY0Fad0JuQUdjQVp3Qm5BR2NBWndCbkFHY0Fad0JBWndCQ3lBRVFRRnFJUVJCbVFFaEVBeWFBZ3NnQkVFQmFpRUVRWndCSVJBTW1RSUxBa0FnQkNBQ1J3MEFRYklCSVJBTXNnSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQTJvaEVBSkFBMEFnQkMwQUFDQUJRZG5QZ0lBQWFpMEFBRWNObWdFZ0FVRURSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUWJJQklSQU1zZ0lMSUFCQkFEWUNBQ0FRUVFGcUlRRkJJU0VRREpjQkN3SkFJQVFnQWtjTkFFR3pBU0VRRExFQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUVpxSVJBQ1FBTkFJQVF0QUFBZ0FVSGR6NENBQUdvdEFBQkhEWmtCSUFGQkJrWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUd6QVNFUURMRUNDeUFBUVFBMkFnQWdFRUVCYWlFQlFSb2hFQXlXQVFzQ1FDQUVJQUpIRFFCQnRBRWhFQXl3QWdzQ1FBSkFBa0FnQkMwQUFFRzdmMm9PRVFDYUFab0JtZ0dhQVpvQm1nR2FBWm9CbWdFQm1nR2FBWm9CbWdHYUFRS2FBUXNnQkVFQmFpRUVRWjBCSVJBTW1BSUxJQVJCQVdvaEJFR2VBU0VRREpjQ0N5QUVRUUZxSVFSQm53RWhFQXlXQWdzQ1FDQUVJQUpIRFFCQnRRRWhFQXl2QWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUZhaUVRQWtBRFFDQUVMUUFBSUFGQjVNK0FnQUJxTFFBQVJ3MlhBU0FCUVFWR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJ0UUVoRUF5dkFnc2dBRUVBTmdJQUlCQkJBV29oQVVFb0lSQU1sQUVMQWtBZ0JDQUNSdzBBUWJZQklSQU1yZ0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFtb2hFQUpBQTBBZ0JDMEFBQ0FCUWVyUGdJQUFhaTBBQUVjTmxnRWdBVUVDUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFiWUJJUkFNcmdJTElBQkJBRFlDQUNBUVFRRnFJUUZCQnlFUURKTUJDd0pBSUFRZ0FrY05BRUczQVNFUURLMENDd0pBQWtBZ0JDMEFBRUc3ZjJvT0RnQ1dBWllCbGdHV0FaWUJsZ0dXQVpZQmxnR1dBWllCbGdFQmxnRUxJQVJCQVdvaEJFR2hBU0VRREpRQ0N5QUVRUUZxSVFSQm9nRWhFQXlUQWdzQ1FDQUVJQUpIRFFCQnVBRWhFQXlzQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUNhaUVRQWtBRFFDQUVMUUFBSUFGQjdjK0FnQUJxTFFBQVJ3MlVBU0FCUVFKR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJ1QUVoRUF5c0Fnc2dBRUVBTmdJQUlCQkJBV29oQVVFU0lSQU1rUUVMQWtBZ0JDQUNSdzBBUWJrQklSQU1xd0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFXb2hFQUpBQTBBZ0JDMEFBQ0FCUWZEUGdJQUFhaTBBQUVjTmt3RWdBVUVCUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFia0JJUkFNcXdJTElBQkJBRFlDQUNBUVFRRnFJUUZCSUNFUURKQUJDd0pBSUFRZ0FrY05BRUc2QVNFUURLb0NDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFGcUlSQUNRQU5BSUFRdEFBQWdBVUh5ejRDQUFHb3RBQUJIRFpJQklBRkJBVVlOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHNkFTRVFES29DQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUThoRUF5UEFRc0NRQ0FFSUFKSERRQkJ1d0VoRUF5cEFnc0NRQUpBSUFRdEFBQkJ0MzlxRGdjQWtnR1NBWklCa2dHU0FRR1NBUXNnQkVFQmFpRUVRYVVCSVJBTWtBSUxJQVJCQVdvaEJFR21BU0VRREk4Q0N3SkFJQVFnQWtjTkFFRzhBU0VRREtnQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUWRxSVJBQ1FBTkFJQVF0QUFBZ0FVSDB6NENBQUdvdEFBQkhEWkFCSUFGQkIwWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUc4QVNFUURLZ0NDeUFBUVFBMkFnQWdFRUVCYWlFQlFSc2hFQXlOQVFzQ1FDQUVJQUpIRFFCQnZRRWhFQXluQWdzQ1FBSkFBa0FnQkMwQUFFRytmMm9PRWdDUkFaRUJrUUdSQVpFQmtRR1JBWkVCa1FFQmtRR1JBWkVCa1FHUkFaRUJBcEVCQ3lBRVFRRnFJUVJCcEFFaEVBeVBBZ3NnQkVFQmFpRUVRYWNCSVJBTWpnSUxJQVJCQVdvaEJFR29BU0VRREkwQ0N3SkFJQVFnQWtjTkFFRytBU0VRREtZQ0N5QUVMUUFBUWM0QVJ3Mk5BU0FFUVFGcUlRUU16d0VMQWtBZ0JDQUNSdzBBUWI4QklSQU1wUUlMQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdCQzBBQUVHL2Yyb09GUUFCQWdPY0FRUUZCcHdCbkFHY0FRY0lDUW9MbkFFTURRNFBuQUVMSUFSQkFXb2hBVUhvQUNFUURKb0NDeUFFUVFGcUlRRkI2UUFoRUF5WkFnc2dCRUVCYWlFQlFlNEFJUkFNbUFJTElBUkJBV29oQVVIeUFDRVFESmNDQ3lBRVFRRnFJUUZCOHdBaEVBeVdBZ3NnQkVFQmFpRUJRZllBSVJBTWxRSUxJQVJCQVdvaEFVSDNBQ0VRREpRQ0N5QUVRUUZxSVFGQitnQWhFQXlUQWdzZ0JFRUJhaUVFUVlNQklSQU1rZ0lMSUFSQkFXb2hCRUdFQVNFUURKRUNDeUFFUVFGcUlRUkJoUUVoRUF5UUFnc2dCRUVCYWlFRVFaSUJJUkFNandJTElBUkJBV29oQkVHWUFTRVFESTRDQ3lBRVFRRnFJUVJCb0FFaEVBeU5BZ3NnQkVFQmFpRUVRYU1CSVJBTWpBSUxJQVJCQVdvaEJFR3FBU0VRRElzQ0N3SkFJQVFnQWtZTkFDQUFRWkNBZ0lBQU5nSUlJQUFnQkRZQ0JFR3JBU0VRRElzQ0MwSEFBU0VRREtNQ0N5QUFJQVVnQWhDcWdJQ0FBQ0lCRFlzQklBVWhBUXhjQ3dKQUlBWWdBa1lOQUNBR1FRRnFJUVVNalFFTFFjSUJJUkFNb1FJTEEwQUNRQ0FRTFFBQVFYWnFEZ1NNQVFBQWp3RUFDeUFRUVFGcUloQWdBa2NOQUF0Qnd3RWhFQXlnQWdzQ1FDQUhJQUpHRFFBZ0FFR1JnSUNBQURZQ0NDQUFJQWMyQWdRZ0J5RUJRUUVoRUF5SEFndEJ4QUVoRUF5ZkFnc0NRQ0FISUFKSERRQkJ4UUVoRUF5ZkFnc0NRQUpBSUFjdEFBQkJkbW9PQkFIT0FjNEJBTTRCQ3lBSFFRRnFJUVlNalFFTElBZEJBV29oQlF5SkFRc0NRQ0FISUFKSERRQkJ4Z0VoRUF5ZUFnc0NRQUpBSUFjdEFBQkJkbW9PRndHUEFZOEJBWThCandHUEFZOEJqd0dQQVk4Qmp3R1BBWThCandHUEFZOEJqd0dQQVk4Qmp3R1BBUUNQQVFzZ0IwRUJhaUVIQzBHd0FTRVFESVFDQ3dKQUlBZ2dBa2NOQUVISUFTRVFESjBDQ3lBSUxRQUFRU0JIRFkwQklBQkJBRHNCTWlBSVFRRnFJUUZCc3dFaEVBeURBZ3NnQVNFWEFrQURRQ0FYSWdjZ0FrWU5BU0FITFFBQVFWQnFRZjhCY1NJUVFRcFBEY3dCQWtBZ0FDOEJNaUlVUVprelN3MEFJQUFnRkVFS2JDSVVPd0V5SUJCQi8vOERjeUFVUWY3L0EzRkpEUUFnQjBFQmFpRVhJQUFnRkNBUWFpSVFPd0V5SUJCQi8vOERjVUhvQjBrTkFRc0xRUUFoRUNBQVFRQTJBaHdnQUVIQmlZQ0FBRFlDRUNBQVFRMDJBZ3dnQUNBSFFRRnFOZ0lVREp3Q0MwSEhBU0VRREpzQ0N5QUFJQWdnQWhDdWdJQ0FBQ0lRUlEzS0FTQVFRUlZIRFl3QklBQkJ5QUUyQWh3Z0FDQUlOZ0lVSUFCQnlaZUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBeWFBZ3NDUUNBSklBSkhEUUJCekFFaEVBeWFBZ3RCQUNFVVFRRWhGMEVCSVJaQkFDRVFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQWt0QUFCQlVHb09DcFlCbFFFQUFRSURCQVVHQ0pjQkMwRUNJUkFNQmd0QkF5RVFEQVVMUVFRaEVBd0VDMEVGSVJBTUF3dEJCaUVRREFJTFFRY2hFQXdCQzBFSUlSQUxRUUFoRjBFQUlSWkJBQ0VVREk0QkMwRUpJUkJCQVNFVVFRQWhGMEVBSVJZTWpRRUxBa0FnQ2lBQ1J3MEFRYzRCSVJBTW1RSUxJQW90QUFCQkxrY05qZ0VnQ2tFQmFpRUpETW9CQ3lBTElBSkhEWTRCUWRBQklSQU1sd0lMQWtBZ0N5QUNSZzBBSUFCQmpvQ0FnQUEyQWdnZ0FDQUxOZ0lFUWJjQklSQU0vZ0VMUWRFQklSQU1sZ0lMQWtBZ0JDQUNSdzBBUWRJQklSQU1sZ0lMSUFJZ0JHc2dBQ2dDQUNJUWFpRVVJQVFnRUd0QkJHb2hDd05BSUFRdEFBQWdFRUg4ejRDQUFHb3RBQUJIRFk0QklCQkJCRVlONlFFZ0VFRUJhaUVRSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQjBnRWhFQXlWQWdzZ0FDQU1JQUlRcklDQWdBQWlBUTJOQVNBTUlRRU11QUVMQWtBZ0JDQUNSdzBBUWRRQklSQU1sQUlMSUFJZ0JHc2dBQ2dDQUNJUWFpRVVJQVFnRUd0QkFXb2hEQU5BSUFRdEFBQWdFRUdCMElDQUFHb3RBQUJIRFk4QklCQkJBVVlOamdFZ0VFRUJhaUVRSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQjFBRWhFQXlUQWdzQ1FDQUVJQUpIRFFCQjFnRWhFQXlUQWdzZ0FpQUVheUFBS0FJQUloQnFJUlFnQkNBUWEwRUNhaUVMQTBBZ0JDMEFBQ0FRUVlQUWdJQUFhaTBBQUVjTmpnRWdFRUVDUmcyUUFTQVFRUUZxSVJBZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFSFdBU0VRREpJQ0N3SkFJQVFnQWtjTkFFSFhBU0VRREpJQ0N3SkFBa0FnQkMwQUFFRzdmMm9PRUFDUEFZOEJqd0dQQVk4Qmp3R1BBWThCandHUEFZOEJqd0dQQVk4QkFZOEJDeUFFUVFGcUlRUkJ1d0VoRUF6NUFRc2dCRUVCYWlFRVFid0JJUkFNK0FFTEFrQWdCQ0FDUncwQVFkZ0JJUkFNa1FJTElBUXRBQUJCeUFCSERZd0JJQVJCQVdvaEJBekVBUXNDUUNBRUlBSkdEUUFnQUVHUWdJQ0FBRFlDQ0NBQUlBUTJBZ1JCdmdFaEVBejNBUXRCMlFFaEVBeVBBZ3NDUUNBRUlBSkhEUUJCMmdFaEVBeVBBZ3NnQkMwQUFFSElBRVlOd3dFZ0FFRUJPZ0FvRExrQkN5QUFRUUk2QUM4Z0FDQUVJQUlRcG9DQWdBQWlFQTJOQVVIQ0FTRVFEUFFCQ3lBQUxRQW9RWDlxRGdLM0Fia0J1QUVMQTBBQ1FDQUVMUUFBUVhacURnUUFqZ0dPQVFDT0FRc2dCRUVCYWlJRUlBSkhEUUFMUWQwQklSQU1pd0lMSUFCQkFEb0FMeUFBTFFBdFFRUnhSUTJFQWdzZ0FFRUFPZ0F2SUFCQkFUb0FOQ0FCSVFFTWpBRUxJQkJCRlVZTjJnRWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFhZU9nSUFBTmdJUUlBQkJFallDREVFQUlSQU1pQUlMQWtBZ0FDQVFJQUlRdElDQWdBQWlCQTBBSUJBaEFReUJBZ3NDUUNBRVFSVkhEUUFnQUVFRE5nSWNJQUFnRURZQ0ZDQUFRYkNZZ0lBQU5nSVFJQUJCRlRZQ0RFRUFJUkFNaUFJTElBQkJBRFlDSENBQUlCQTJBaFFnQUVHbmpvQ0FBRFlDRUNBQVFSSTJBZ3hCQUNFUURJY0NDeUFRUVJWR0RkWUJJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSGFqWUNBQURZQ0VDQUFRUlEyQWd4QkFDRVFESVlDQ3lBQUtBSUVJUmNnQUVFQU5nSUVJQkFnRWFkcUloWWhBU0FBSUJjZ0VDQVdJQlFiSWhBUXRZQ0FnQUFpRkVVTmpRRWdBRUVITmdJY0lBQWdFRFlDRkNBQUlCUTJBZ3hCQUNFUURJVUNDeUFBSUFBdkFUQkJnQUZ5T3dFd0lBRWhBUXRCS2lFUURPb0JDeUFRUVJWR0RkRUJJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFR0RqSUNBQURZQ0VDQUFRUk0yQWd4QkFDRVFESUlDQ3lBUVFSVkdEYzhCSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUdhajRDQUFEWUNFQ0FBUVNJMkFneEJBQ0VRRElFQ0N5QUFLQUlFSVJBZ0FFRUFOZ0lFQWtBZ0FDQVFJQUVRdDRDQWdBQWlFQTBBSUFGQkFXb2hBUXlOQVFzZ0FFRU1OZ0ljSUFBZ0VEWUNEQ0FBSUFGQkFXbzJBaFJCQUNFUURJQUNDeUFRUVJWR0Rjd0JJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFR2FqNENBQURZQ0VDQUFRU0kyQWd4QkFDRVFEUDhCQ3lBQUtBSUVJUkFnQUVFQU5nSUVBa0FnQUNBUUlBRVF0NENBZ0FBaUVBMEFJQUZCQVdvaEFReU1BUXNnQUVFTk5nSWNJQUFnRURZQ0RDQUFJQUZCQVdvMkFoUkJBQ0VRRFA0QkN5QVFRUlZHRGNrQklBQkJBRFlDSENBQUlBRTJBaFFnQUVIR2pJQ0FBRFlDRUNBQVFTTTJBZ3hCQUNFUURQMEJDeUFBS0FJRUlSQWdBRUVBTmdJRUFrQWdBQ0FRSUFFUXVZQ0FnQUFpRUEwQUlBRkJBV29oQVF5TEFRc2dBRUVPTmdJY0lBQWdFRFlDRENBQUlBRkJBV28yQWhSQkFDRVFEUHdCQ3lBQVFRQTJBaHdnQUNBQk5nSVVJQUJCd0pXQWdBQTJBaEFnQUVFQ05nSU1RUUFoRUF6N0FRc2dFRUVWUmczRkFTQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQnhveUFnQUEyQWhBZ0FFRWpOZ0lNUVFBaEVBejZBUXNnQUVFUU5nSWNJQUFnQVRZQ0ZDQUFJQkEyQWd4QkFDRVFEUGtCQ3lBQUtBSUVJUVFnQUVFQU5nSUVBa0FnQUNBRUlBRVF1WUNBZ0FBaUJBMEFJQUZCQVdvaEFRenhBUXNnQUVFUk5nSWNJQUFnQkRZQ0RDQUFJQUZCQVdvMkFoUkJBQ0VRRFBnQkN5QVFRUlZHRGNFQklBQkJBRFlDSENBQUlBRTJBaFFnQUVIR2pJQ0FBRFlDRUNBQVFTTTJBZ3hCQUNFUURQY0JDeUFBS0FJRUlSQWdBRUVBTmdJRUFrQWdBQ0FRSUFFUXVZQ0FnQUFpRUEwQUlBRkJBV29oQVF5SUFRc2dBRUVUTmdJY0lBQWdFRFlDRENBQUlBRkJBV28yQWhSQkFDRVFEUFlCQ3lBQUtBSUVJUVFnQUVFQU5nSUVBa0FnQUNBRUlBRVF1WUNBZ0FBaUJBMEFJQUZCQVdvaEFRenRBUXNnQUVFVU5nSWNJQUFnQkRZQ0RDQUFJQUZCQVdvMkFoUkJBQ0VRRFBVQkN5QVFRUlZHRGIwQklBQkJBRFlDSENBQUlBRTJBaFFnQUVHYWo0Q0FBRFlDRUNBQVFTSTJBZ3hCQUNFUURQUUJDeUFBS0FJRUlSQWdBRUVBTmdJRUFrQWdBQ0FRSUFFUXQ0Q0FnQUFpRUEwQUlBRkJBV29oQVF5R0FRc2dBRUVXTmdJY0lBQWdFRFlDRENBQUlBRkJBV28yQWhSQkFDRVFEUE1CQ3lBQUtBSUVJUVFnQUVFQU5nSUVBa0FnQUNBRUlBRVF0NENBZ0FBaUJBMEFJQUZCQVdvaEFRenBBUXNnQUVFWE5nSWNJQUFnQkRZQ0RDQUFJQUZCQVdvMkFoUkJBQ0VRRFBJQkN5QUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQnpaT0FnQUEyQWhBZ0FFRU1OZ0lNUVFBaEVBenhBUXRDQVNFUkN5QVFRUUZxSVFFQ1FDQUFLUU1nSWhKQy8vLy8vLy8vLy84UFZnMEFJQUFnRWtJRWhpQVJoRGNESUNBQklRRU1oQUVMSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUd0aVlDQUFEWUNFQ0FBUVF3MkFneEJBQ0VRRE84QkN5QUFRUUEyQWh3Z0FDQVFOZ0lVSUFCQnpaT0FnQUEyQWhBZ0FFRU1OZ0lNUVFBaEVBenVBUXNnQUNnQ0JDRVhJQUJCQURZQ0JDQVFJQkduYWlJV0lRRWdBQ0FYSUJBZ0ZpQVVHeUlRRUxXQWdJQUFJaFJGRFhNZ0FFRUZOZ0ljSUFBZ0VEWUNGQ0FBSUJRMkFneEJBQ0VRRE8wQkN5QUFRUUEyQWh3Z0FDQVFOZ0lVSUFCQnFweUFnQUEyQWhBZ0FFRVBOZ0lNUVFBaEVBenNBUXNnQUNBUUlBSVF0SUNBZ0FBaUFRMEJJQkFoQVF0QkRpRVFETkVCQ3dKQUlBRkJGVWNOQUNBQVFRSTJBaHdnQUNBUU5nSVVJQUJCc0ppQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF6cUFRc2dBRUVBTmdJY0lBQWdFRFlDRkNBQVFhZU9nSUFBTmdJUUlBQkJFallDREVFQUlSQU02UUVMSUFGQkFXb2hFQUpBSUFBdkFUQWlBVUdBQVhGRkRRQUNRQ0FBSUJBZ0FoQzdnSUNBQUNJQkRRQWdFQ0VCREhBTElBRkJGVWNOdWdFZ0FFRUZOZ0ljSUFBZ0VEWUNGQ0FBUWZtWGdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTTZRRUxBa0FnQVVHZ0JIRkJvQVJIRFFBZ0FDMEFMVUVDY1EwQUlBQkJBRFlDSENBQUlCQTJBaFFnQUVHV2s0Q0FBRFlDRUNBQVFRUTJBZ3hCQUNFUURPa0JDeUFBSUJBZ0FoQzlnSUNBQUJvZ0VDRUJBa0FDUUFKQUFrQUNRQ0FBSUJBZ0FoQ3pnSUNBQUE0V0FnRUFCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVBd1FMSUFCQkFUb0FMZ3NnQUNBQUx3RXdRY0FBY2pzQk1DQVFJUUVMUVNZaEVBelJBUXNnQUVFak5nSWNJQUFnRURZQ0ZDQUFRYVdXZ0lBQU5nSVFJQUJCRlRZQ0RFRUFJUkFNNlFFTElBQkJBRFlDSENBQUlCQTJBaFFnQUVIVmk0Q0FBRFlDRUNBQVFSRTJBZ3hCQUNFUURPZ0JDeUFBTFFBdFFRRnhSUTBCUWNNQklSQU16Z0VMQWtBZ0RTQUNSZzBBQTBBQ1FDQU5MUUFBUVNCR0RRQWdEU0VCRE1RQkN5QU5RUUZxSWcwZ0FrY05BQXRCSlNFUURPY0JDMEVsSVJBTTVnRUxJQUFvQWdRaEJDQUFRUUEyQWdRZ0FDQUVJQTBRcjRDQWdBQWlCRVVOclFFZ0FFRW1OZ0ljSUFBZ0JEWUNEQ0FBSUExQkFXbzJBaFJCQUNFUURPVUJDeUFRUVJWR0Rhc0JJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSDlqWUNBQURZQ0VDQUFRUjAyQWd4QkFDRVFET1FCQ3lBQVFTYzJBaHdnQUNBQk5nSVVJQUFnRURZQ0RFRUFJUkFNNHdFTElCQWhBVUVCSVJRQ1FBSkFBa0FDUUFKQUFrQUNRQ0FBTFFBc1FYNXFEZ2NHQlFVREFRSUFCUXNnQUNBQUx3RXdRUWh5T3dFd0RBTUxRUUloRkF3QkMwRUVJUlFMSUFCQkFUb0FMQ0FBSUFBdkFUQWdGSEk3QVRBTElCQWhBUXRCS3lFUURNb0JDeUFBUVFBMkFod2dBQ0FRTmdJVUlBQkJxNUtBZ0FBMkFoQWdBRUVMTmdJTVFRQWhFQXppQVFzZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWVHUGdJQUFOZ0lRSUFCQkNqWUNERUVBSVJBTTRRRUxJQUJCQURvQUxDQVFJUUVNdlFFTElCQWhBVUVCSVJRQ1FBSkFBa0FDUUFKQUlBQXRBQ3hCZTJvT0JBTUJBZ0FGQ3lBQUlBQXZBVEJCQ0hJN0FUQU1Bd3RCQWlFVURBRUxRUVFoRkFzZ0FFRUJPZ0FzSUFBZ0FDOEJNQ0FVY2pzQk1Bc2dFQ0VCQzBFcElSQU14UUVMSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUh3bElDQUFEWUNFQ0FBUVFNMkFneEJBQ0VRRE4wQkN3SkFJQTR0QUFCQkRVY05BQ0FBS0FJRUlRRWdBRUVBTmdJRUFrQWdBQ0FCSUE0UXNZQ0FnQUFpQVEwQUlBNUJBV29oQVF4MUN5QUFRU3cyQWh3Z0FDQUJOZ0lNSUFBZ0RrRUJhallDRkVFQUlSQU0zUUVMSUFBdEFDMUJBWEZGRFFGQnhBRWhFQXpEQVFzQ1FDQU9JQUpIRFFCQkxTRVFETndCQ3dKQUFrQURRQUpBSUE0dEFBQkJkbW9PQkFJQUFBTUFDeUFPUVFGcUlnNGdBa2NOQUF0QkxTRVFETjBCQ3lBQUtBSUVJUUVnQUVFQU5nSUVBa0FnQUNBQklBNFFzWUNBZ0FBaUFRMEFJQTRoQVF4MEN5QUFRU3cyQWh3Z0FDQU9OZ0lVSUFBZ0FUWUNERUVBSVJBTTNBRUxJQUFvQWdRaEFTQUFRUUEyQWdRQ1FDQUFJQUVnRGhDeGdJQ0FBQ0lCRFFBZ0RrRUJhaUVCREhNTElBQkJMRFlDSENBQUlBRTJBZ3dnQUNBT1FRRnFOZ0lVUVFBaEVBemJBUXNnQUNnQ0JDRUVJQUJCQURZQ0JDQUFJQVFnRGhDeGdJQ0FBQ0lFRGFBQklBNGhBUXpPQVFzZ0VFRXNSdzBCSUFGQkFXb2hFRUVCSVFFQ1FBSkFBa0FDUUFKQUlBQXRBQ3hCZTJvT0JBTUJBZ1FBQ3lBUUlRRU1CQXRCQWlFQkRBRUxRUVFoQVFzZ0FFRUJPZ0FzSUFBZ0FDOEJNQ0FCY2pzQk1DQVFJUUVNQVFzZ0FDQUFMd0V3UVFoeU93RXdJQkFoQVF0Qk9TRVFETDhCQ3lBQVFRQTZBQ3dnQVNFQkMwRTBJUkFNdlFFTElBQWdBQzhCTUVFZ2Nqc0JNQ0FCSVFFTUFnc2dBQ2dDQkNFRUlBQkJBRFlDQkFKQUlBQWdCQ0FCRUxHQWdJQUFJZ1FOQUNBQklRRU14d0VMSUFCQk56WUNIQ0FBSUFFMkFoUWdBQ0FFTmdJTVFRQWhFQXpVQVFzZ0FFRUlPZ0FzSUFFaEFRdEJNQ0VRRExrQkN3SkFJQUF0QUNoQkFVWU5BQ0FCSVFFTUJBc2dBQzBBTFVFSWNVVU5rd0VnQVNFQkRBTUxJQUF0QURCQklIRU5sQUZCeFFFaEVBeTNBUXNDUUNBUElBSkdEUUFDUUFOQUFrQWdEeTBBQUVGUWFpSUJRZjhCY1VFS1NRMEFJQThoQVVFMUlSQU11Z0VMSUFBcEF5QWlFVUtacytiTW1iUG16QmxXRFFFZ0FDQVJRZ3ArSWhFM0F5QWdFU0FCclVML0FZTWlFa0ovaFZZTkFTQUFJQkVnRW53M0F5QWdEMEVCYWlJUElBSkhEUUFMUVRraEVBelJBUXNnQUNnQ0JDRUNJQUJCQURZQ0JDQUFJQUlnRDBFQmFpSUVFTEdBZ0lBQUlnSU5sUUVnQkNFQkRNTUJDMEU1SVJBTXp3RUxBa0FnQUM4Qk1DSUJRUWh4UlEwQUlBQXRBQ2hCQVVjTkFDQUFMUUF0UVFoeFJRMlFBUXNnQUNBQlFmZjdBM0ZCZ0FSeU93RXdJQThoQVF0Qk55RVFETFFCQ3lBQUlBQXZBVEJCRUhJN0FUQU1xd0VMSUJCQkZVWU5pd0VnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRZkNPZ0lBQU5nSVFJQUJCSERZQ0RFRUFJUkFNeXdFTElBQkJ3d0EyQWh3Z0FDQUJOZ0lNSUFBZ0RVRUJhallDRkVFQUlSQU15Z0VMQWtBZ0FTMEFBRUU2UncwQUlBQW9BZ1FoRUNBQVFRQTJBZ1FDUUNBQUlCQWdBUkN2Z0lDQUFDSVFEUUFnQVVFQmFpRUJER01MSUFCQnd3QTJBaHdnQUNBUU5nSU1JQUFnQVVFQmFqWUNGRUVBSVJBTXlnRUxJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFR3hrWUNBQURZQ0VDQUFRUW8yQWd4QkFDRVFETWtCQ3lBQVFRQTJBaHdnQUNBQk5nSVVJQUJCb0ptQWdBQTJBaEFnQUVFZU5nSU1RUUFoRUF6SUFRc2dBRUVBTmdJQUN5QUFRWUFTT3dFcUlBQWdGMEVCYWlJQklBSVFxSUNBZ0FBaUVBMEJJQUVoQVF0Qnh3QWhFQXlzQVFzZ0VFRVZSdzJEQVNBQVFkRUFOZ0ljSUFBZ0FUWUNGQ0FBUWVPWGdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTXhBRUxJQUFvQWdRaEVDQUFRUUEyQWdRQ1FDQUFJQkFnQVJDbmdJQ0FBQ0lRRFFBZ0FTRUJERjRMSUFCQjBnQTJBaHdnQUNBQk5nSVVJQUFnRURZQ0RFRUFJUkFNd3dFTElBQkJBRFlDSENBQUlCUTJBaFFnQUVIQnFJQ0FBRFlDRUNBQVFRYzJBZ3dnQUVFQU5nSUFRUUFoRUF6Q0FRc2dBQ2dDQkNFUUlBQkJBRFlDQkFKQUlBQWdFQ0FCRUtlQWdJQUFJaEFOQUNBQklRRU1YUXNnQUVIVEFEWUNIQ0FBSUFFMkFoUWdBQ0FRTmdJTVFRQWhFQXpCQVF0QkFDRVFJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFR0FrWUNBQURZQ0VDQUFRUWsyQWd3TXdBRUxJQkJCRlVZTmZTQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQmxJMkFnQUEyQWhBZ0FFRWhOZ0lNUVFBaEVBeS9BUXRCQVNFV1FRQWhGMEVBSVJSQkFTRVFDeUFBSUJBNkFDc2dBVUVCYWlFQkFrQUNRQ0FBTFFBdFFSQnhEUUFDUUFKQUFrQWdBQzBBS2c0REFRQUNCQXNnRmtVTkF3d0NDeUFVRFFFTUFnc2dGMFVOQVFzZ0FDZ0NCQ0VRSUFCQkFEWUNCQUpBSUFBZ0VDQUJFSzJBZ0lBQUloQU5BQ0FCSVFFTVhBc2dBRUhZQURZQ0hDQUFJQUUyQWhRZ0FDQVFOZ0lNUVFBaEVBeStBUXNnQUNnQ0JDRUVJQUJCQURZQ0JBSkFJQUFnQkNBQkVLMkFnSUFBSWdRTkFDQUJJUUVNclFFTElBQkIyUUEyQWh3Z0FDQUJOZ0lVSUFBZ0JEWUNERUVBSVJBTXZRRUxJQUFvQWdRaEJDQUFRUUEyQWdRQ1FDQUFJQVFnQVJDdGdJQ0FBQ0lFRFFBZ0FTRUJES3NCQ3lBQVFkb0FOZ0ljSUFBZ0FUWUNGQ0FBSUFRMkFneEJBQ0VRREx3QkN5QUFLQUlFSVFRZ0FFRUFOZ0lFQWtBZ0FDQUVJQUVRcllDQWdBQWlCQTBBSUFFaEFReXBBUXNnQUVIY0FEWUNIQ0FBSUFFMkFoUWdBQ0FFTmdJTVFRQWhFQXk3QVFzQ1FDQUJMUUFBUVZCcUloQkIvd0Z4UVFwUERRQWdBQ0FRT2dBcUlBRkJBV29oQVVIUEFDRVFES0lCQ3lBQUtBSUVJUVFnQUVFQU5nSUVBa0FnQUNBRUlBRVFyWUNBZ0FBaUJBMEFJQUVoQVF5bkFRc2dBRUhlQURZQ0hDQUFJQUUyQWhRZ0FDQUVOZ0lNUVFBaEVBeTZBUXNnQUVFQU5nSUFJQmRCQVdvaEFRSkFJQUF0QUNsQkkwOE5BQ0FCSVFFTVdRc2dBRUVBTmdJY0lBQWdBVFlDRkNBQVFkT0pnSUFBTmdJUUlBQkJDRFlDREVFQUlSQU11UUVMSUFCQkFEWUNBQXRCQUNFUUlBQkJBRFlDSENBQUlBRTJBaFFnQUVHUXM0Q0FBRFlDRUNBQVFRZzJBZ3dNdHdFTElBQkJBRFlDQUNBWFFRRnFJUUVDUUNBQUxRQXBRU0ZIRFFBZ0FTRUJERllMSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUdiaW9DQUFEWUNFQ0FBUVFnMkFneEJBQ0VRRExZQkN5QUFRUUEyQWdBZ0YwRUJhaUVCQWtBZ0FDMEFLU0lRUVYxcVFRdFBEUUFnQVNFQkRGVUxBa0FnRUVFR1N3MEFRUUVnRUhSQnlnQnhSUTBBSUFFaEFReFZDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWZlSmdJQUFOZ0lRSUFCQkNEWUNEQXkxQVFzZ0VFRVZSZzF4SUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUc1allDQUFEWUNFQ0FBUVJvMkFneEJBQ0VRRExRQkN5QUFLQUlFSVJBZ0FFRUFOZ0lFQWtBZ0FDQVFJQUVRcDRDQWdBQWlFQTBBSUFFaEFReFVDeUFBUWVVQU5nSWNJQUFnQVRZQ0ZDQUFJQkEyQWd4QkFDRVFETE1CQ3lBQUtBSUVJUkFnQUVFQU5nSUVBa0FnQUNBUUlBRVFwNENBZ0FBaUVBMEFJQUVoQVF4TkN5QUFRZElBTmdJY0lBQWdBVFlDRkNBQUlCQTJBZ3hCQUNFUURMSUJDeUFBS0FJRUlSQWdBRUVBTmdJRUFrQWdBQ0FRSUFFUXA0Q0FnQUFpRUEwQUlBRWhBUXhOQ3lBQVFkTUFOZ0ljSUFBZ0FUWUNGQ0FBSUJBMkFneEJBQ0VRRExFQkN5QUFLQUlFSVJBZ0FFRUFOZ0lFQWtBZ0FDQVFJQUVRcDRDQWdBQWlFQTBBSUFFaEFReFJDeUFBUWVVQU5nSWNJQUFnQVRZQ0ZDQUFJQkEyQWd4QkFDRVFETEFCQ3lBQVFRQTJBaHdnQUNBQk5nSVVJQUJCeG9xQWdBQTJBaEFnQUVFSE5nSU1RUUFoRUF5dkFRc2dBQ2dDQkNFUUlBQkJBRFlDQkFKQUlBQWdFQ0FCRUtlQWdJQUFJaEFOQUNBQklRRU1TUXNnQUVIU0FEWUNIQ0FBSUFFMkFoUWdBQ0FRTmdJTVFRQWhFQXl1QVFzZ0FDZ0NCQ0VRSUFCQkFEWUNCQUpBSUFBZ0VDQUJFS2VBZ0lBQUloQU5BQ0FCSVFFTVNRc2dBRUhUQURZQ0hDQUFJQUUyQWhRZ0FDQVFOZ0lNUVFBaEVBeXRBUXNnQUNnQ0JDRVFJQUJCQURZQ0JBSkFJQUFnRUNBQkVLZUFnSUFBSWhBTkFDQUJJUUVNVFFzZ0FFSGxBRFlDSENBQUlBRTJBaFFnQUNBUU5nSU1RUUFoRUF5c0FRc2dBRUVBTmdJY0lBQWdBVFlDRkNBQVFkeUlnSUFBTmdJUUlBQkJCellDREVFQUlSQU1xd0VMSUJCQlAwY05BU0FCUVFGcUlRRUxRUVVoRUF5UUFRdEJBQ0VRSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUg5a29DQUFEWUNFQ0FBUVFjMkFnd01xQUVMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQ25nSUNBQUNJUURRQWdBU0VCREVJTElBQkIwZ0EyQWh3Z0FDQUJOZ0lVSUFBZ0VEWUNERUVBSVJBTXB3RUxJQUFvQWdRaEVDQUFRUUEyQWdRQ1FDQUFJQkFnQVJDbmdJQ0FBQ0lRRFFBZ0FTRUJERUlMSUFCQjB3QTJBaHdnQUNBQk5nSVVJQUFnRURZQ0RFRUFJUkFNcGdFTElBQW9BZ1FoRUNBQVFRQTJBZ1FDUUNBQUlCQWdBUkNuZ0lDQUFDSVFEUUFnQVNFQkRFWUxJQUJCNVFBMkFod2dBQ0FCTmdJVUlBQWdFRFlDREVFQUlSQU1wUUVMSUFBb0FnUWhBU0FBUVFBMkFnUUNRQ0FBSUFFZ0ZCQ25nSUNBQUNJQkRRQWdGQ0VCREQ4TElBQkIwZ0EyQWh3Z0FDQVVOZ0lVSUFBZ0FUWUNERUVBSVJBTXBBRUxJQUFvQWdRaEFTQUFRUUEyQWdRQ1FDQUFJQUVnRkJDbmdJQ0FBQ0lCRFFBZ0ZDRUJERDhMSUFCQjB3QTJBaHdnQUNBVU5nSVVJQUFnQVRZQ0RFRUFJUkFNb3dFTElBQW9BZ1FoQVNBQVFRQTJBZ1FDUUNBQUlBRWdGQkNuZ0lDQUFDSUJEUUFnRkNFQkRFTUxJQUJCNVFBMkFod2dBQ0FVTmdJVUlBQWdBVFlDREVFQUlSQU1vZ0VMSUFCQkFEWUNIQ0FBSUJRMkFoUWdBRUhEajRDQUFEWUNFQ0FBUVFjMkFneEJBQ0VRREtFQkN5QUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQnc0K0FnQUEyQWhBZ0FFRUhOZ0lNUVFBaEVBeWdBUXRCQUNFUUlBQkJBRFlDSENBQUlCUTJBaFFnQUVHTW5JQ0FBRFlDRUNBQVFRYzJBZ3dNbndFTElBQkJBRFlDSENBQUlCUTJBaFFnQUVHTW5JQ0FBRFlDRUNBQVFRYzJBZ3hCQUNFUURKNEJDeUFBUVFBMkFod2dBQ0FVTmdJVUlBQkIvcEdBZ0FBMkFoQWdBRUVITmdJTVFRQWhFQXlkQVFzZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUVk2YmdJQUFOZ0lRSUFCQkJqWUNERUVBSVJBTW5BRUxJQkJCRlVZTlZ5QUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQnpJNkFnQUEyQWhBZ0FFRWdOZ0lNUVFBaEVBeWJBUXNnQUVFQU5nSUFJQkJCQVdvaEFVRWtJUkFMSUFBZ0VEb0FLU0FBS0FJRUlSQWdBRUVBTmdJRUlBQWdFQ0FCRUt1QWdJQUFJaEFOVkNBQklRRU1QZ3NnQUVFQU5nSUFDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0JEWUNGQ0FBUWZHYmdJQUFOZ0lRSUFCQkJqWUNEQXlYQVFzZ0FVRVZSZzFRSUFCQkFEWUNIQ0FBSUFVMkFoUWdBRUh3aklDQUFEWUNFQ0FBUVJzMkFneEJBQ0VRREpZQkN5QUFLQUlFSVFVZ0FFRUFOZ0lFSUFBZ0JTQVFFS21BZ0lBQUlnVU5BU0FRUVFGcUlRVUxRYTBCSVJBTWV3c2dBRUhCQVRZQ0hDQUFJQVUyQWd3Z0FDQVFRUUZxTmdJVVFRQWhFQXlUQVFzZ0FDZ0NCQ0VHSUFCQkFEWUNCQ0FBSUFZZ0VCQ3BnSUNBQUNJR0RRRWdFRUVCYWlFR0MwR3VBU0VRREhnTElBQkJ3Z0UyQWh3Z0FDQUdOZ0lNSUFBZ0VFRUJhallDRkVFQUlSQU1rQUVMSUFCQkFEWUNIQ0FBSUFjMkFoUWdBRUdYaTRDQUFEWUNFQ0FBUVEwMkFneEJBQ0VRREk4QkN5QUFRUUEyQWh3Z0FDQUlOZ0lVSUFCQjQ1Q0FnQUEyQWhBZ0FFRUpOZ0lNUVFBaEVBeU9BUXNnQUVFQU5nSWNJQUFnQ0RZQ0ZDQUFRWlNOZ0lBQU5nSVFJQUJCSVRZQ0RFRUFJUkFNalFFTFFRRWhGa0VBSVJkQkFDRVVRUUVoRUFzZ0FDQVFPZ0FySUFsQkFXb2hDQUpBQWtBZ0FDMEFMVUVRY1EwQUFrQUNRQUpBSUFBdEFDb09Bd0VBQWdRTElCWkZEUU1NQWdzZ0ZBMEJEQUlMSUJkRkRRRUxJQUFvQWdRaEVDQUFRUUEyQWdRZ0FDQVFJQWdRcllDQWdBQWlFRVVOUFNBQVFja0JOZ0ljSUFBZ0NEWUNGQ0FBSUJBMkFneEJBQ0VRREl3QkN5QUFLQUlFSVFRZ0FFRUFOZ0lFSUFBZ0JDQUlFSzJBZ0lBQUlnUkZEWFlnQUVIS0FUWUNIQ0FBSUFnMkFoUWdBQ0FFTmdJTVFRQWhFQXlMQVFzZ0FDZ0NCQ0VFSUFCQkFEWUNCQ0FBSUFRZ0NSQ3RnSUNBQUNJRVJRMTBJQUJCeXdFMkFod2dBQ0FKTmdJVUlBQWdCRFlDREVFQUlSQU1pZ0VMSUFBb0FnUWhCQ0FBUVFBMkFnUWdBQ0FFSUFvUXJZQ0FnQUFpQkVVTmNpQUFRYzBCTmdJY0lBQWdDallDRkNBQUlBUTJBZ3hCQUNFUURJa0JDd0pBSUFzdEFBQkJVR29pRUVIL0FYRkJDazhOQUNBQUlCQTZBQ29nQzBFQmFpRUtRYllCSVJBTWNBc2dBQ2dDQkNFRUlBQkJBRFlDQkNBQUlBUWdDeEN0Z0lDQUFDSUVSUTF3SUFCQnp3RTJBaHdnQUNBTE5nSVVJQUFnQkRZQ0RFRUFJUkFNaUFFTElBQkJBRFlDSENBQUlBUTJBaFFnQUVHUXM0Q0FBRFlDRUNBQVFRZzJBZ3dnQUVFQU5nSUFRUUFoRUF5SEFRc2dBVUVWUmcwL0lBQkJBRFlDSENBQUlBdzJBaFFnQUVITWpvQ0FBRFlDRUNBQVFTQTJBZ3hCQUNFUURJWUJDeUFBUVlFRU93RW9JQUFvQWdRaEVDQUFRZ0EzQXdBZ0FDQVFJQXhCQVdvaURCQ3JnSUNBQUNJUVJRMDRJQUJCMHdFMkFod2dBQ0FNTmdJVUlBQWdFRFlDREVFQUlSQU1oUUVMSUFCQkFEWUNBQXRCQUNFUUlBQkJBRFlDSENBQUlBUTJBaFFnQUVIWW00Q0FBRFlDRUNBQVFRZzJBZ3dNZ3dFTElBQW9BZ1FoRUNBQVFnQTNBd0FnQUNBUUlBdEJBV29pQ3hDcmdJQ0FBQ0lRRFFGQnhnRWhFQXhwQ3lBQVFRSTZBQ2dNVlFzZ0FFSFZBVFlDSENBQUlBczJBaFFnQUNBUU5nSU1RUUFoRUF5QUFRc2dFRUVWUmcwM0lBQkJBRFlDSENBQUlBUTJBaFFnQUVHa2pJQ0FBRFlDRUNBQVFSQTJBZ3hCQUNFUURIOExJQUF0QURSQkFVY05OQ0FBSUFRZ0FoQzhnSUNBQUNJUVJRMDBJQkJCRlVjTk5TQUFRZHdCTmdJY0lBQWdCRFlDRkNBQVFkV1dnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1mZ3RCQUNFUUlBQkJBRFlDSENBQVFhK0xnSUFBTmdJUUlBQkJBallDRENBQUlCUkJBV28yQWhRTWZRdEJBQ0VRREdNTFFRSWhFQXhpQzBFTklSQU1ZUXRCRHlFUURHQUxRU1VoRUF4ZkMwRVRJUkFNWGd0QkZTRVFERjBMUVJZaEVBeGNDMEVYSVJBTVd3dEJHQ0VRREZvTFFSa2hFQXhaQzBFYUlSQU1XQXRCR3lFUURGY0xRUndoRUF4V0MwRWRJUkFNVlF0Qkh5RVFERlFMUVNFaEVBeFRDMEVqSVJBTVVndEJ4Z0FoRUF4UkMwRXVJUkFNVUF0Qkx5RVFERThMUVRzaEVBeE9DMEU5SVJBTVRRdEJ5QUFoRUF4TUMwSEpBQ0VRREVzTFFjc0FJUkFNU2d0QnpBQWhFQXhKQzBIT0FDRVFERWdMUWRFQUlSQU1Sd3RCMVFBaEVBeEdDMEhZQUNFUURFVUxRZGtBSVJBTVJBdEIyd0FoRUF4REMwSGtBQ0VRREVJTFFlVUFJUkFNUVF0QjhRQWhFQXhBQzBIMEFDRVFERDhMUVkwQklSQU1QZ3RCbHdFaEVBdzlDMEdwQVNFUUREd0xRYXdCSVJBTU93dEJ3QUVoRUF3NkMwRzVBU0VRRERrTFFhOEJJUkFNT0F0QnNRRWhFQXczQzBHeUFTRVFERFlMUWJRQklSQU1OUXRCdFFFaEVBdzBDMEc2QVNFUURETUxRYjBCSVJBTU1ndEJ2d0VoRUF3eEMwSEJBU0VRRERBTElBQkJBRFlDSENBQUlBUTJBaFFnQUVIcGk0Q0FBRFlDRUNBQVFSODJBZ3hCQUNFUURFZ0xJQUJCMndFMkFod2dBQ0FFTmdJVUlBQkIrcGFBZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXhIQ3lBQVFmZ0FOZ0ljSUFBZ0REWUNGQ0FBUWNxWWdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTVJnc2dBRUhSQURZQ0hDQUFJQVUyQWhRZ0FFR3dsNENBQURZQ0VDQUFRUlUyQWd4QkFDRVFERVVMSUFCQitRQTJBaHdnQUNBQk5nSVVJQUFnRURZQ0RFRUFJUkFNUkFzZ0FFSDRBRFlDSENBQUlBRTJBaFFnQUVIS21JQ0FBRFlDRUNBQVFSVTJBZ3hCQUNFUURFTUxJQUJCNUFBMkFod2dBQ0FCTmdJVUlBQkI0NWVBZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXhDQ3lBQVFkY0FOZ0ljSUFBZ0FUWUNGQ0FBUWNtWGdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTVFRc2dBRUVBTmdJY0lBQWdBVFlDRkNBQVFibU5nSUFBTmdJUUlBQkJHallDREVFQUlSQU1RQXNnQUVIQ0FEWUNIQ0FBSUFFMkFoUWdBRUhqbUlDQUFEWUNFQ0FBUVJVMkFneEJBQ0VRREQ4TElBQkJBRFlDQkNBQUlBOGdEeEN4Z0lDQUFDSUVSUTBCSUFCQk9qWUNIQ0FBSUFRMkFnd2dBQ0FQUVFGcU5nSVVRUUFoRUF3K0N5QUFLQUlFSVFRZ0FFRUFOZ0lFQWtBZ0FDQUVJQUVRc1lDQWdBQWlCRVVOQUNBQVFUczJBaHdnQUNBRU5nSU1JQUFnQVVFQmFqWUNGRUVBSVJBTVBnc2dBVUVCYWlFQkRDMExJQTlCQVdvaEFRd3RDeUFBUVFBMkFod2dBQ0FQTmdJVUlBQkI1SktBZ0FBMkFoQWdBRUVFTmdJTVFRQWhFQXc3Q3lBQVFUWTJBaHdnQUNBRU5nSVVJQUFnQWpZQ0RFRUFJUkFNT2dzZ0FFRXVOZ0ljSUFBZ0RqWUNGQ0FBSUFRMkFneEJBQ0VRRERrTElBQkIwQUEyQWh3Z0FDQUJOZ0lVSUFCQmtaaUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBdzRDeUFOUVFGcUlRRU1MQXNnQUVFVk5nSWNJQUFnQVRZQ0ZDQUFRWUtaZ0lBQU5nSVFJQUJCRlRZQ0RFRUFJUkFNTmdzZ0FFRWJOZ0ljSUFBZ0FUWUNGQ0FBUVpHWGdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTU5Rc2dBRUVQTmdJY0lBQWdBVFlDRkNBQVFaR1hnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1OQXNnQUVFTE5nSWNJQUFnQVRZQ0ZDQUFRWkdYZ0lBQU5nSVFJQUJCRlRZQ0RFRUFJUkFNTXdzZ0FFRWFOZ0ljSUFBZ0FUWUNGQ0FBUVlLWmdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTU1nc2dBRUVMTmdJY0lBQWdBVFlDRkNBQVFZS1pnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1NUXNnQUVFS05nSWNJQUFnQVRZQ0ZDQUFRZVNXZ0lBQU5nSVFJQUJCRlRZQ0RFRUFJUkFNTUFzZ0FFRWVOZ0ljSUFBZ0FUWUNGQ0FBUWZtWGdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTUx3c2dBRUVBTmdJY0lBQWdFRFlDRkNBQVFkcU5nSUFBTmdJUUlBQkJGRFlDREVFQUlSQU1MZ3NnQUVFRU5nSWNJQUFnQVRZQ0ZDQUFRYkNZZ0lBQU5nSVFJQUJCRlRZQ0RFRUFJUkFNTFFzZ0FFRUFOZ0lBSUF0QkFXb2hDd3RCdUFFaEVBd1NDeUFBUVFBMkFnQWdFRUVCYWlFQlFmVUFJUkFNRVFzZ0FTRUJBa0FnQUMwQUtVRUZSdzBBUWVNQUlSQU1FUXRCNGdBaEVBd1FDMEVBSVJBZ0FFRUFOZ0ljSUFCQjVKR0FnQUEyQWhBZ0FFRUhOZ0lNSUFBZ0ZFRUJhallDRkF3b0N5QUFRUUEyQWdBZ0YwRUJhaUVCUWNBQUlSQU1EZ3RCQVNFQkN5QUFJQUU2QUN3Z0FFRUFOZ0lBSUJkQkFXb2hBUXRCS0NFUURBc0xJQUVoQVF0Qk9DRVFEQWtMQWtBZ0FTSVBJQUpHRFFBRFFBSkFJQTh0QUFCQmdMNkFnQUJxTFFBQUlnRkJBVVlOQUNBQlFRSkhEUU1nRDBFQmFpRUJEQVFMSUE5QkFXb2lEeUFDUncwQUMwRStJUkFNSWd0QlBpRVFEQ0VMSUFCQkFEb0FMQ0FQSVFFTUFRdEJDeUVRREFZTFFUb2hFQXdGQ3lBQlFRRnFJUUZCTFNFUURBUUxJQUFnQVRvQUxDQUFRUUEyQWdBZ0ZrRUJhaUVCUVF3aEVBd0RDeUFBUVFBMkFnQWdGMEVCYWlFQlFRb2hFQXdDQ3lBQVFRQTJBZ0FMSUFCQkFEb0FMQ0FOSVFGQkNTRVFEQUFMQzBFQUlSQWdBRUVBTmdJY0lBQWdDellDRkNBQVFjMlFnSUFBTmdJUUlBQkJDVFlDREF3WEMwRUFJUkFnQUVFQU5nSWNJQUFnQ2pZQ0ZDQUFRZW1LZ0lBQU5nSVFJQUJCQ1RZQ0RBd1dDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0NUWUNGQ0FBUWJlUWdJQUFOZ0lRSUFCQkNUWUNEQXdWQzBFQUlSQWdBRUVBTmdJY0lBQWdDRFlDRkNBQVFaeVJnSUFBTmdJUUlBQkJDVFlDREF3VUMwRUFJUkFnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRYzJRZ0lBQU5nSVFJQUJCQ1RZQ0RBd1RDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWVtS2dJQUFOZ0lRSUFCQkNUWUNEQXdTQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFiZVFnSUFBTmdJUUlBQkJDVFlDREF3UkMwRUFJUkFnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRWnlSZ0lBQU5nSVFJQUJCQ1RZQ0RBd1FDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUVplVmdJQUFOZ0lRSUFCQkR6WUNEQXdQQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFaZVZnSUFBTmdJUUlBQkJEellDREF3T0MwRUFJUkFnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRY0NTZ0lBQU5nSVFJQUJCQ3pZQ0RBd05DMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUVpXSmdJQUFOZ0lRSUFCQkN6WUNEQXdNQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFlR1BnSUFBTmdJUUlBQkJDallDREF3TEMwRUFJUkFnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRZnVQZ0lBQU5nSVFJQUJCQ2pZQ0RBd0tDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWZHWmdJQUFOZ0lRSUFCQkFqWUNEQXdKQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFjU1VnSUFBTmdJUUlBQkJBallDREF3SUMwRUFJUkFnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRZktWZ0lBQU5nSVFJQUJCQWpZQ0RBd0hDeUFBUVFJMkFod2dBQ0FCTmdJVUlBQkJuSnFBZ0FBMkFoQWdBRUVXTmdJTVFRQWhFQXdHQzBFQklSQU1CUXRCMUFBaEVDQUJJZ1FnQWtZTkJDQURRUWhxSUFBZ0JDQUNRZGpDZ0lBQVFRb1F4WUNBZ0FBZ0F5Z0NEQ0VFSUFNb0FnZ09Bd0VFQWdBTEVNcUFnSUFBQUFzZ0FFRUFOZ0ljSUFCQnRacUFnQUEyQWhBZ0FFRVhOZ0lNSUFBZ0JFRUJhallDRkVFQUlSQU1BZ3NnQUVFQU5nSWNJQUFnQkRZQ0ZDQUFRY3FhZ0lBQU5nSVFJQUJCQ1RZQ0RFRUFJUkFNQVFzQ1FDQUJJZ1FnQWtjTkFFRWlJUkFNQVFzZ0FFR0pnSUNBQURZQ0NDQUFJQVEyQWdSQklTRVFDeUFEUVJCcUpJQ0FnSUFBSUJBTHJ3RUJBbjhnQVNnQ0FDRUdBa0FDUUNBQ0lBTkdEUUFnQkNBR2FpRUVJQVlnQTJvZ0Ftc2hCeUFDSUFaQmYzTWdCV29pQm1vaEJRTkFBa0FnQWkwQUFDQUVMUUFBUmcwQVFRSWhCQXdEQ3dKQUlBWU5BRUVBSVFRZ0JTRUNEQU1MSUFaQmYyb2hCaUFFUVFGcUlRUWdBa0VCYWlJQ0lBTkhEUUFMSUFjaEJpQURJUUlMSUFCQkFUWUNBQ0FCSUFZMkFnQWdBQ0FDTmdJRUR3c2dBVUVBTmdJQUlBQWdCRFlDQUNBQUlBSTJBZ1FMQ2dBZ0FCREhnSUNBQUF2eU5nRUxmeU9BZ0lDQUFFRVFheUlCSklDQWdJQUFBa0JCQUNnQ29OQ0FnQUFOQUVFQUVNdUFnSUFBUVlEVWhJQUFheUlDUWRrQVNRMEFRUUFoQXdKQVFRQW9BdURUZ0lBQUlnUU5BRUVBUW44M0F1elRnSUFBUVFCQ2dJQ0VnSUNBd0FBM0F1VFRnSUFBUVFBZ0FVRUlha0Z3Y1VIWXF0V3FCWE1pQkRZQzROT0FnQUJCQUVFQU5nTDAwNENBQUVFQVFRQTJBc1RUZ0lBQUMwRUFJQUkyQXN6VGdJQUFRUUJCZ05TRWdBQTJBc2pUZ0lBQVFRQkJnTlNFZ0FBMkFwalFnSUFBUVFBZ0JEWUNyTkNBZ0FCQkFFRi9OZ0tvMElDQUFBTkFJQU5CeE5DQWdBQnFJQU5CdU5DQWdBQnFJZ1EyQWdBZ0JDQURRYkRRZ0lBQWFpSUZOZ0lBSUFOQnZOQ0FnQUJxSUFVMkFnQWdBMEhNMElDQUFHb2dBMEhBMElDQUFHb2lCVFlDQUNBRklBUTJBZ0FnQTBIVTBJQ0FBR29nQTBISTBJQ0FBR29pQkRZQ0FDQUVJQVUyQWdBZ0EwSFEwSUNBQUdvZ0JEWUNBQ0FEUVNCcUlnTkJnQUpIRFFBTFFZRFVoSUFBUVhoQmdOU0VnQUJyUVE5eFFRQkJnTlNFZ0FCQkNHcEJEM0ViSWdOcUlnUkJCR29nQWtGSWFpSUZJQU5ySWdOQkFYSTJBZ0JCQUVFQUtBTHcwNENBQURZQ3BOQ0FnQUJCQUNBRE5nS1UwSUNBQUVFQUlBUTJBcURRZ0lBQVFZRFVoSUFBSUFWcVFUZzJBZ1FMQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQUJCN0FGTERRQUNRRUVBS0FLSTBJQ0FBQ0lHUVJBZ0FFRVRha0Z3Y1NBQVFRdEpHeUlDUVFOMklnUjJJZ05CQTNGRkRRQUNRQUpBSUFOQkFYRWdCSEpCQVhNaUJVRURkQ0lFUWJEUWdJQUFhaUlESUFSQnVOQ0FnQUJxS0FJQUlnUW9BZ2dpQWtjTkFFRUFJQVpCZmlBRmQzRTJBb2pRZ0lBQURBRUxJQU1nQWpZQ0NDQUNJQU0yQWd3TElBUkJDR29oQXlBRUlBVkJBM1FpQlVFRGNqWUNCQ0FFSUFWcUlnUWdCQ2dDQkVFQmNqWUNCQXdNQ3lBQ1FRQW9BcERRZ0lBQUlnZE5EUUVDUUNBRFJRMEFBa0FDUUNBRElBUjBRUUlnQkhRaUEwRUFJQU5yY25FaUEwRUFJQU5yY1VGL2FpSURJQU5CREhaQkVIRWlBM1lpQkVFRmRrRUljU0lGSUFOeUlBUWdCWFlpQTBFQ2RrRUVjU0lFY2lBRElBUjJJZ05CQVhaQkFuRWlCSElnQXlBRWRpSURRUUYyUVFGeElnUnlJQU1nQkhacUlnUkJBM1FpQTBHdzBJQ0FBR29pQlNBRFFialFnSUFBYWlnQ0FDSURLQUlJSWdCSERRQkJBQ0FHUVg0Z0JIZHhJZ1kyQW9qUWdJQUFEQUVMSUFVZ0FEWUNDQ0FBSUFVMkFnd0xJQU1nQWtFRGNqWUNCQ0FESUFSQkEzUWlCR29nQkNBQ2F5SUZOZ0lBSUFNZ0Ftb2lBQ0FGUVFGeU5nSUVBa0FnQjBVTkFDQUhRWGh4UWJEUWdJQUFhaUVDUVFBb0FwelFnSUFBSVFRQ1FBSkFJQVpCQVNBSFFRTjJkQ0lJY1EwQVFRQWdCaUFJY2pZQ2lOQ0FnQUFnQWlFSURBRUxJQUlvQWdnaENBc2dDQ0FFTmdJTUlBSWdCRFlDQ0NBRUlBSTJBZ3dnQkNBSU5nSUlDeUFEUVFocUlRTkJBQ0FBTmdLYzBJQ0FBRUVBSUFVMkFwRFFnSUFBREF3TFFRQW9Bb3pRZ0lBQUlnbEZEUUVnQ1VFQUlBbHJjVUYvYWlJRElBTkJESFpCRUhFaUEzWWlCRUVGZGtFSWNTSUZJQU55SUFRZ0JYWWlBMEVDZGtFRWNTSUVjaUFESUFSMklnTkJBWFpCQW5FaUJISWdBeUFFZGlJRFFRRjJRUUZ4SWdSeUlBTWdCSFpxUVFKMFFialNnSUFBYWlnQ0FDSUFLQUlFUVhoeElBSnJJUVFnQUNFRkFrQURRQUpBSUFVb0FoQWlBdzBBSUFWQkZHb29BZ0FpQTBVTkFnc2dBeWdDQkVGNGNTQUNheUlGSUFRZ0JTQUVTU0lGR3lFRUlBTWdBQ0FGR3lFQUlBTWhCUXdBQ3dzZ0FDZ0NHQ0VLQWtBZ0FDZ0NEQ0lJSUFCR0RRQWdBQ2dDQ0NJRFFRQW9BcGpRZ0lBQVNSb2dDQ0FETmdJSUlBTWdDRFlDREF3TEN3SkFJQUJCRkdvaUJTZ0NBQ0lERFFBZ0FDZ0NFQ0lEUlEwRElBQkJFR29oQlFzRFFDQUZJUXNnQXlJSVFSUnFJZ1VvQWdBaUF3MEFJQWhCRUdvaEJTQUlLQUlRSWdNTkFBc2dDMEVBTmdJQURBb0xRWDhoQWlBQVFiOS9TdzBBSUFCQkUyb2lBMEZ3Y1NFQ1FRQW9Bb3pRZ0lBQUlnZEZEUUJCQUNFTEFrQWdBa0dBQWtrTkFFRWZJUXNnQWtILy8vOEhTdzBBSUFOQkNIWWlBeUFEUVlEK1AycEJFSFpCQ0hFaUEzUWlCQ0FFUVlEZ0gycEJFSFpCQkhFaUJIUWlCU0FGUVlDQUQycEJFSFpCQW5FaUJYUkJEM1lnQXlBRWNpQUZjbXNpQTBFQmRDQUNJQU5CRldwMlFRRnhja0VjYWlFTEMwRUFJQUpySVFRQ1FBSkFBa0FDUUNBTFFRSjBRYmpTZ0lBQWFpZ0NBQ0lGRFFCQkFDRURRUUFoQ0F3QkMwRUFJUU1nQWtFQVFSa2dDMEVCZG1zZ0MwRWZSaHQwSVFCQkFDRUlBMEFDUUNBRktBSUVRWGh4SUFKcklnWWdCRThOQUNBR0lRUWdCU0VJSUFZTkFFRUFJUVFnQlNFSUlBVWhBd3dEQ3lBRElBVkJGR29vQWdBaUJpQUdJQVVnQUVFZGRrRUVjV3BCRUdvb0FnQWlCVVliSUFNZ0Joc2hBeUFBUVFGMElRQWdCUTBBQ3dzQ1FDQURJQWh5RFFCQkFDRUlRUUlnQzNRaUEwRUFJQU5yY2lBSGNTSURSUTBESUFOQkFDQURhM0ZCZjJvaUF5QURRUXgyUVJCeElnTjJJZ1ZCQlhaQkNIRWlBQ0FEY2lBRklBQjJJZ05CQW5aQkJIRWlCWElnQXlBRmRpSURRUUYyUVFKeElnVnlJQU1nQlhZaUEwRUJka0VCY1NJRmNpQURJQVYyYWtFQ2RFRzQwb0NBQUdvb0FnQWhBd3NnQTBVTkFRc0RRQ0FES0FJRVFYaHhJQUpySWdZZ0JFa2hBQUpBSUFNb0FoQWlCUTBBSUFOQkZHb29BZ0FoQlFzZ0JpQUVJQUFiSVFRZ0F5QUlJQUFiSVFnZ0JTRURJQVVOQUFzTElBaEZEUUFnQkVFQUtBS1EwSUNBQUNBQ2EwOE5BQ0FJS0FJWUlRc0NRQ0FJS0FJTUlnQWdDRVlOQUNBSUtBSUlJZ05CQUNnQ21OQ0FnQUJKR2lBQUlBTTJBZ2dnQXlBQU5nSU1EQWtMQWtBZ0NFRVVhaUlGS0FJQUlnTU5BQ0FJS0FJUUlnTkZEUU1nQ0VFUWFpRUZDd05BSUFVaEJpQURJZ0JCRkdvaUJTZ0NBQ0lERFFBZ0FFRVFhaUVGSUFBb0FoQWlBdzBBQ3lBR1FRQTJBZ0FNQ0FzQ1FFRUFLQUtRMElDQUFDSURJQUpKRFFCQkFDZ0NuTkNBZ0FBaEJBSkFBa0FnQXlBQ2F5SUZRUkJKRFFBZ0JDQUNhaUlBSUFWQkFYSTJBZ1JCQUNBRk5nS1EwSUNBQUVFQUlBQTJBcHpRZ0lBQUlBUWdBMm9nQlRZQ0FDQUVJQUpCQTNJMkFnUU1BUXNnQkNBRFFRTnlOZ0lFSUFRZ0Eyb2lBeUFES0FJRVFRRnlOZ0lFUVFCQkFEWUNuTkNBZ0FCQkFFRUFOZ0tRMElDQUFBc2dCRUVJYWlFRERBb0xBa0JCQUNnQ2xOQ0FnQUFpQUNBQ1RRMEFRUUFvQXFEUWdJQUFJZ01nQW1vaUJDQUFJQUpySWdWQkFYSTJBZ1JCQUNBRk5nS1UwSUNBQUVFQUlBUTJBcURRZ0lBQUlBTWdBa0VEY2pZQ0JDQURRUWhxSVFNTUNnc0NRQUpBUVFBb0F1RFRnSUFBUlEwQVFRQW9BdWpUZ0lBQUlRUU1BUXRCQUVKL053THMwNENBQUVFQVFvQ0FoSUNBZ01BQU53TGswNENBQUVFQUlBRkJER3BCY0hGQjJLclZxZ1Z6TmdMZzA0Q0FBRUVBUVFBMkF2VFRnSUFBUVFCQkFEWUN4Tk9BZ0FCQmdJQUVJUVFMUVFBaEF3SkFJQVFnQWtISEFHb2lCMm9pQmtFQUlBUnJJZ3R4SWdnZ0Frc05BRUVBUVRBMkF2alRnSUFBREFvTEFrQkJBQ2dDd05PQWdBQWlBMFVOQUFKQVFRQW9BcmpUZ0lBQUlnUWdDR29pQlNBRVRRMEFJQVVnQTAwTkFRdEJBQ0VEUVFCQk1EWUMrTk9BZ0FBTUNndEJBQzBBeE5PQWdBQkJCSEVOQkFKQUFrQUNRRUVBS0FLZzBJQ0FBQ0lFUlEwQVFjalRnSUFBSVFNRFFBSkFJQU1vQWdBaUJTQUVTdzBBSUFVZ0F5Z0NCR29nQkVzTkF3c2dBeWdDQ0NJRERRQUxDMEVBRU11QWdJQUFJZ0JCZjBZTkJTQUlJUVlDUUVFQUtBTGswNENBQUNJRFFYOXFJZ1FnQUhGRkRRQWdDQ0FBYXlBRUlBQnFRUUFnQTJ0eGFpRUdDeUFHSUFKTkRRVWdCa0grLy8vL0Iwc05CUUpBUVFBb0FzRFRnSUFBSWdORkRRQkJBQ2dDdU5PQWdBQWlCQ0FHYWlJRklBUk5EUVlnQlNBRFN3MEdDeUFHRU11QWdJQUFJZ01nQUVjTkFRd0hDeUFHSUFCcklBdHhJZ1pCL3YvLy93ZExEUVFnQmhETGdJQ0FBQ0lBSUFNb0FnQWdBeWdDQkdwR0RRTWdBQ0VEQ3dKQUlBTkJmMFlOQUNBQ1FjZ0FhaUFHVFEwQUFrQWdCeUFHYTBFQUtBTG8wNENBQUNJRWFrRUFJQVJyY1NJRVFmNy8vLzhIVFEwQUlBTWhBQXdIQ3dKQUlBUVF5NENBZ0FCQmYwWU5BQ0FFSUFacUlRWWdBeUVBREFjTFFRQWdCbXNReTRDQWdBQWFEQVFMSUFNaEFDQURRWDlIRFFVTUF3dEJBQ0VJREFjTFFRQWhBQXdGQ3lBQVFYOUhEUUlMUVFCQkFDZ0N4Tk9BZ0FCQkJISTJBc1RUZ0lBQUN5QUlRZjcvLy84SFN3MEJJQWdReTRDQWdBQWhBRUVBRU11QWdJQUFJUU1nQUVGL1JnMEJJQU5CZjBZTkFTQUFJQU5QRFFFZ0F5QUFheUlHSUFKQk9HcE5EUUVMUVFCQkFDZ0N1Tk9BZ0FBZ0Jtb2lBellDdU5PQWdBQUNRQ0FEUVFBb0FyelRnSUFBVFEwQVFRQWdBellDdk5PQWdBQUxBa0FDUUFKQUFrQkJBQ2dDb05DQWdBQWlCRVVOQUVISTA0Q0FBQ0VEQTBBZ0FDQURLQUlBSWdVZ0F5Z0NCQ0lJYWtZTkFpQURLQUlJSWdNTkFBd0RDd3NDUUFKQVFRQW9BcGpRZ0lBQUlnTkZEUUFnQUNBRFR3MEJDMEVBSUFBMkFwalFnSUFBQzBFQUlRTkJBQ0FHTmdMTTA0Q0FBRUVBSUFBMkFzalRnSUFBUVFCQmZ6WUNxTkNBZ0FCQkFFRUFLQUxnMDRDQUFEWUNyTkNBZ0FCQkFFRUFOZ0xVMDRDQUFBTkFJQU5CeE5DQWdBQnFJQU5CdU5DQWdBQnFJZ1EyQWdBZ0JDQURRYkRRZ0lBQWFpSUZOZ0lBSUFOQnZOQ0FnQUJxSUFVMkFnQWdBMEhNMElDQUFHb2dBMEhBMElDQUFHb2lCVFlDQUNBRklBUTJBZ0FnQTBIVTBJQ0FBR29nQTBISTBJQ0FBR29pQkRZQ0FDQUVJQVUyQWdBZ0EwSFEwSUNBQUdvZ0JEWUNBQ0FEUVNCcUlnTkJnQUpIRFFBTElBQkJlQ0FBYTBFUGNVRUFJQUJCQ0dwQkQzRWJJZ05xSWdRZ0JrRklhaUlGSUFOcklnTkJBWEkyQWdSQkFFRUFLQUx3MDRDQUFEWUNwTkNBZ0FCQkFDQUROZ0tVMElDQUFFRUFJQVEyQXFEUWdJQUFJQUFnQldwQk9EWUNCQXdDQ3lBRExRQU1RUWh4RFFBZ0JDQUZTUTBBSUFRZ0FFOE5BQ0FFUVhnZ0JHdEJEM0ZCQUNBRVFRaHFRUTl4R3lJRmFpSUFRUUFvQXBUUWdJQUFJQVpxSWdzZ0JXc2lCVUVCY2pZQ0JDQURJQWdnQm1vMkFnUkJBRUVBS0FMdzA0Q0FBRFlDcE5DQWdBQkJBQ0FGTmdLVTBJQ0FBRUVBSUFBMkFxRFFnSUFBSUFRZ0MycEJPRFlDQkF3QkN3SkFJQUJCQUNnQ21OQ0FnQUFpQ0U4TkFFRUFJQUEyQXBqUWdJQUFJQUFoQ0FzZ0FDQUdhaUVGUWNqVGdJQUFJUU1DUUFKQUFrQUNRQUpBQWtBQ1FBTkFJQU1vQWdBZ0JVWU5BU0FES0FJSUlnTU5BQXdDQ3dzZ0F5MEFERUVJY1VVTkFRdEJ5Tk9BZ0FBaEF3TkFBa0FnQXlnQ0FDSUZJQVJMRFFBZ0JTQURLQUlFYWlJRklBUkxEUU1MSUFNb0FnZ2hBd3dBQ3dzZ0F5QUFOZ0lBSUFNZ0F5Z0NCQ0FHYWpZQ0JDQUFRWGdnQUd0QkQzRkJBQ0FBUVFocVFROXhHMm9pQ3lBQ1FRTnlOZ0lFSUFWQmVDQUZhMEVQY1VFQUlBVkJDR3BCRDNFYmFpSUdJQXNnQW1vaUFtc2hBd0pBSUFZZ0JFY05BRUVBSUFJMkFxRFFnSUFBUVFCQkFDZ0NsTkNBZ0FBZ0Eyb2lBellDbE5DQWdBQWdBaUFEUVFGeU5nSUVEQU1MQWtBZ0JrRUFLQUtjMElDQUFFY05BRUVBSUFJMkFwelFnSUFBUVFCQkFDZ0NrTkNBZ0FBZ0Eyb2lBellDa05DQWdBQWdBaUFEUVFGeU5nSUVJQUlnQTJvZ0F6WUNBQXdEQ3dKQUlBWW9BZ1FpQkVFRGNVRUJSdzBBSUFSQmVIRWhCd0pBQWtBZ0JFSC9BVXNOQUNBR0tBSUlJZ1VnQkVFRGRpSUlRUU4wUWJEUWdJQUFhaUlBUmhvQ1FDQUdLQUlNSWdRZ0JVY05BRUVBUVFBb0FvalFnSUFBUVg0Z0NIZHhOZ0tJMElDQUFBd0NDeUFFSUFCR0dpQUVJQVUyQWdnZ0JTQUVOZ0lNREFFTElBWW9BaGdoQ1FKQUFrQWdCaWdDRENJQUlBWkdEUUFnQmlnQ0NDSUVJQWhKR2lBQUlBUTJBZ2dnQkNBQU5nSU1EQUVMQWtBZ0JrRVVhaUlFS0FJQUlnVU5BQ0FHUVJCcUlnUW9BZ0FpQlEwQVFRQWhBQXdCQ3dOQUlBUWhDQ0FGSWdCQkZHb2lCQ2dDQUNJRkRRQWdBRUVRYWlFRUlBQW9BaEFpQlEwQUN5QUlRUUEyQWdBTElBbEZEUUFDUUFKQUlBWWdCaWdDSENJRlFRSjBRYmpTZ0lBQWFpSUVLQUlBUncwQUlBUWdBRFlDQUNBQURRRkJBRUVBS0FLTTBJQ0FBRUYrSUFWM2NUWUNqTkNBZ0FBTUFnc2dDVUVRUVJRZ0NTZ0NFQ0FHUmh0cUlBQTJBZ0FnQUVVTkFRc2dBQ0FKTmdJWUFrQWdCaWdDRUNJRVJRMEFJQUFnQkRZQ0VDQUVJQUEyQWhnTElBWW9BaFFpQkVVTkFDQUFRUlJxSUFRMkFnQWdCQ0FBTmdJWUN5QUhJQU5xSVFNZ0JpQUhhaUlHS0FJRUlRUUxJQVlnQkVGK2NUWUNCQ0FDSUFOcUlBTTJBZ0FnQWlBRFFRRnlOZ0lFQWtBZ0EwSC9BVXNOQUNBRFFYaHhRYkRRZ0lBQWFpRUVBa0FDUUVFQUtBS0kwSUNBQUNJRlFRRWdBMEVEZG5RaUEzRU5BRUVBSUFVZ0EzSTJBb2pRZ0lBQUlBUWhBd3dCQ3lBRUtBSUlJUU1MSUFNZ0FqWUNEQ0FFSUFJMkFnZ2dBaUFFTmdJTUlBSWdBellDQ0F3REMwRWZJUVFDUUNBRFFmLy8vd2RMRFFBZ0EwRUlkaUlFSUFSQmdQNC9ha0VRZGtFSWNTSUVkQ0lGSUFWQmdPQWZha0VRZGtFRWNTSUZkQ0lBSUFCQmdJQVBha0VRZGtFQ2NTSUFkRUVQZGlBRUlBVnlJQUJ5YXlJRVFRRjBJQU1nQkVFVmFuWkJBWEZ5UVJ4cUlRUUxJQUlnQkRZQ0hDQUNRZ0EzQWhBZ0JFRUNkRUc0MG9DQUFHb2hCUUpBUVFBb0FvelFnSUFBSWdCQkFTQUVkQ0lJY1EwQUlBVWdBallDQUVFQUlBQWdDSEkyQW96UWdJQUFJQUlnQlRZQ0dDQUNJQUkyQWdnZ0FpQUNOZ0lNREFNTElBTkJBRUVaSUFSQkFYWnJJQVJCSDBZYmRDRUVJQVVvQWdBaEFBTkFJQUFpQlNnQ0JFRjRjU0FEUmcwQ0lBUkJIWFloQUNBRVFRRjBJUVFnQlNBQVFRUnhha0VRYWlJSUtBSUFJZ0FOQUFzZ0NDQUNOZ0lBSUFJZ0JUWUNHQ0FDSUFJMkFnd2dBaUFDTmdJSURBSUxJQUJCZUNBQWEwRVBjVUVBSUFCQkNHcEJEM0ViSWdOcUlnc2dCa0ZJYWlJSUlBTnJJZ05CQVhJMkFnUWdBQ0FJYWtFNE5nSUVJQVFnQlVFM0lBVnJRUTl4UVFBZ0JVRkpha0VQY1J0cVFVRnFJZ2dnQ0NBRVFSQnFTUnNpQ0VFak5nSUVRUUJCQUNnQzhOT0FnQUEyQXFUUWdJQUFRUUFnQXpZQ2xOQ0FnQUJCQUNBTE5nS2cwSUNBQUNBSVFSQnFRUUFwQXREVGdJQUFOd0lBSUFoQkFDa0N5Tk9BZ0FBM0FnaEJBQ0FJUVFocU5nTFEwNENBQUVFQUlBWTJBc3pUZ0lBQVFRQWdBRFlDeU5PQWdBQkJBRUVBTmdMVTA0Q0FBQ0FJUVNScUlRTURRQ0FEUVFjMkFnQWdBMEVFYWlJRElBVkpEUUFMSUFnZ0JFWU5BeUFJSUFnb0FnUkJmbkUyQWdRZ0NDQUlJQVJySWdBMkFnQWdCQ0FBUVFGeU5nSUVBa0FnQUVIL0FVc05BQ0FBUVhoeFFiRFFnSUFBYWlFREFrQUNRRUVBS0FLSTBJQ0FBQ0lGUVFFZ0FFRURkblFpQUhFTkFFRUFJQVVnQUhJMkFvalFnSUFBSUFNaEJRd0JDeUFES0FJSUlRVUxJQVVnQkRZQ0RDQURJQVEyQWdnZ0JDQUROZ0lNSUFRZ0JUWUNDQXdFQzBFZklRTUNRQ0FBUWYvLy93ZExEUUFnQUVFSWRpSURJQU5CZ1A0L2FrRVFka0VJY1NJRGRDSUZJQVZCZ09BZmFrRVFka0VFY1NJRmRDSUlJQWhCZ0lBUGFrRVFka0VDY1NJSWRFRVBkaUFESUFWeUlBaHlheUlEUVFGMElBQWdBMEVWYW5aQkFYRnlRUnhxSVFNTElBUWdBellDSENBRVFnQTNBaEFnQTBFQ2RFRzQwb0NBQUdvaEJRSkFRUUFvQW96UWdJQUFJZ2hCQVNBRGRDSUdjUTBBSUFVZ0JEWUNBRUVBSUFnZ0JuSTJBb3pRZ0lBQUlBUWdCVFlDR0NBRUlBUTJBZ2dnQkNBRU5nSU1EQVFMSUFCQkFFRVpJQU5CQVhacklBTkJIMFliZENFRElBVW9BZ0FoQ0FOQUlBZ2lCU2dDQkVGNGNTQUFSZzBESUFOQkhYWWhDQ0FEUVFGMElRTWdCU0FJUVFSeGFrRVFhaUlHS0FJQUlnZ05BQXNnQmlBRU5nSUFJQVFnQlRZQ0dDQUVJQVEyQWd3Z0JDQUVOZ0lJREFNTElBVW9BZ2dpQXlBQ05nSU1JQVVnQWpZQ0NDQUNRUUEyQWhnZ0FpQUZOZ0lNSUFJZ0F6WUNDQXNnQzBFSWFpRUREQVVMSUFVb0FnZ2lBeUFFTmdJTUlBVWdCRFlDQ0NBRVFRQTJBaGdnQkNBRk5nSU1JQVFnQXpZQ0NBdEJBQ2dDbE5DQWdBQWlBeUFDVFEwQVFRQW9BcURRZ0lBQUlnUWdBbW9pQlNBRElBSnJJZ05CQVhJMkFnUkJBQ0FETmdLVTBJQ0FBRUVBSUFVMkFxRFFnSUFBSUFRZ0FrRURjallDQkNBRVFRaHFJUU1NQXd0QkFDRURRUUJCTURZQytOT0FnQUFNQWdzQ1FDQUxSUTBBQWtBQ1FDQUlJQWdvQWh3aUJVRUNkRUc0MG9DQUFHb2lBeWdDQUVjTkFDQURJQUEyQWdBZ0FBMEJRUUFnQjBGK0lBVjNjU0lITmdLTTBJQ0FBQXdDQ3lBTFFSQkJGQ0FMS0FJUUlBaEdHMm9nQURZQ0FDQUFSUTBCQ3lBQUlBczJBaGdDUUNBSUtBSVFJZ05GRFFBZ0FDQUROZ0lRSUFNZ0FEWUNHQXNnQ0VFVWFpZ0NBQ0lEUlEwQUlBQkJGR29nQXpZQ0FDQURJQUEyQWhnTEFrQUNRQ0FFUVE5TERRQWdDQ0FFSUFKcUlnTkJBM0kyQWdRZ0NDQURhaUlESUFNb0FnUkJBWEkyQWdRTUFRc2dDQ0FDYWlJQUlBUkJBWEkyQWdRZ0NDQUNRUU55TmdJRUlBQWdCR29nQkRZQ0FBSkFJQVJCL3dGTERRQWdCRUY0Y1VHdzBJQ0FBR29oQXdKQUFrQkJBQ2dDaU5DQWdBQWlCVUVCSUFSQkEzWjBJZ1J4RFFCQkFDQUZJQVJ5TmdLSTBJQ0FBQ0FESVFRTUFRc2dBeWdDQ0NFRUN5QUVJQUEyQWd3Z0F5QUFOZ0lJSUFBZ0F6WUNEQ0FBSUFRMkFnZ01BUXRCSHlFREFrQWdCRUgvLy84SFN3MEFJQVJCQ0hZaUF5QURRWUQrUDJwQkVIWkJDSEVpQTNRaUJTQUZRWURnSDJwQkVIWkJCSEVpQlhRaUFpQUNRWUNBRDJwQkVIWkJBbkVpQW5SQkQzWWdBeUFGY2lBQ2Ntc2lBMEVCZENBRUlBTkJGV3AyUVFGeGNrRWNhaUVEQ3lBQUlBTTJBaHdnQUVJQU53SVFJQU5CQW5SQnVOS0FnQUJxSVFVQ1FDQUhRUUVnQTNRaUFuRU5BQ0FGSUFBMkFnQkJBQ0FISUFKeU5nS00wSUNBQUNBQUlBVTJBaGdnQUNBQU5nSUlJQUFnQURZQ0RBd0JDeUFFUVFCQkdTQURRUUYyYXlBRFFSOUdHM1FoQXlBRktBSUFJUUlDUUFOQUlBSWlCU2dDQkVGNGNTQUVSZzBCSUFOQkhYWWhBaUFEUVFGMElRTWdCU0FDUVFSeGFrRVFhaUlHS0FJQUlnSU5BQXNnQmlBQU5nSUFJQUFnQlRZQ0dDQUFJQUEyQWd3Z0FDQUFOZ0lJREFFTElBVW9BZ2dpQXlBQU5nSU1JQVVnQURZQ0NDQUFRUUEyQWhnZ0FDQUZOZ0lNSUFBZ0F6WUNDQXNnQ0VFSWFpRUREQUVMQWtBZ0NrVU5BQUpBQWtBZ0FDQUFLQUljSWdWQkFuUkJ1TktBZ0FCcUlnTW9BZ0JIRFFBZ0F5QUlOZ0lBSUFnTkFVRUFJQWxCZmlBRmQzRTJBb3pRZ0lBQURBSUxJQXBCRUVFVUlBb29BaEFnQUVZYmFpQUlOZ0lBSUFoRkRRRUxJQWdnQ2pZQ0dBSkFJQUFvQWhBaUEwVU5BQ0FJSUFNMkFoQWdBeUFJTmdJWUN5QUFRUlJxS0FJQUlnTkZEUUFnQ0VFVWFpQUROZ0lBSUFNZ0NEWUNHQXNDUUFKQUlBUkJEMHNOQUNBQUlBUWdBbW9pQTBFRGNqWUNCQ0FBSUFOcUlnTWdBeWdDQkVFQmNqWUNCQXdCQ3lBQUlBSnFJZ1VnQkVFQmNqWUNCQ0FBSUFKQkEzSTJBZ1FnQlNBRWFpQUVOZ0lBQWtBZ0IwVU5BQ0FIUVhoeFFiRFFnSUFBYWlFQ1FRQW9BcHpRZ0lBQUlRTUNRQUpBUVFFZ0IwRURkblFpQ0NBR2NRMEFRUUFnQ0NBR2NqWUNpTkNBZ0FBZ0FpRUlEQUVMSUFJb0FnZ2hDQXNnQ0NBRE5nSU1JQUlnQXpZQ0NDQURJQUkyQWd3Z0F5QUlOZ0lJQzBFQUlBVTJBcHpRZ0lBQVFRQWdCRFlDa05DQWdBQUxJQUJCQ0dvaEF3c2dBVUVRYWlTQWdJQ0FBQ0FEQ3dvQUlBQVF5WUNBZ0FBTDRnMEJCMzhDUUNBQVJRMEFJQUJCZUdvaUFTQUFRWHhxS0FJQUlnSkJlSEVpQUdvaEF3SkFJQUpCQVhFTkFDQUNRUU54UlEwQklBRWdBU2dDQUNJQ2F5SUJRUUFvQXBqUWdJQUFJZ1JKRFFFZ0FpQUFhaUVBQWtBZ0FVRUFLQUtjMElDQUFFWU5BQUpBSUFKQi93RkxEUUFnQVNnQ0NDSUVJQUpCQTNZaUJVRURkRUd3MElDQUFHb2lCa1lhQWtBZ0FTZ0NEQ0lDSUFSSERRQkJBRUVBS0FLSTBJQ0FBRUYrSUFWM2NUWUNpTkNBZ0FBTUF3c2dBaUFHUmhvZ0FpQUVOZ0lJSUFRZ0FqWUNEQXdDQ3lBQktBSVlJUWNDUUFKQUlBRW9BZ3dpQmlBQlJnMEFJQUVvQWdnaUFpQUVTUm9nQmlBQ05nSUlJQUlnQmpZQ0RBd0JDd0pBSUFGQkZHb2lBaWdDQUNJRURRQWdBVUVRYWlJQ0tBSUFJZ1FOQUVFQUlRWU1BUXNEUUNBQ0lRVWdCQ0lHUVJScUlnSW9BZ0FpQkEwQUlBWkJFR29oQWlBR0tBSVFJZ1FOQUFzZ0JVRUFOZ0lBQ3lBSFJRMEJBa0FDUUNBQklBRW9BaHdpQkVFQ2RFRzQwb0NBQUdvaUFpZ0NBRWNOQUNBQ0lBWTJBZ0FnQmcwQlFRQkJBQ2dDak5DQWdBQkJmaUFFZDNFMkFvelFnSUFBREFNTElBZEJFRUVVSUFjb0FoQWdBVVliYWlBR05nSUFJQVpGRFFJTElBWWdCellDR0FKQUlBRW9BaEFpQWtVTkFDQUdJQUkyQWhBZ0FpQUdOZ0lZQ3lBQktBSVVJZ0pGRFFFZ0JrRVVhaUFDTmdJQUlBSWdCallDR0F3QkN5QURLQUlFSWdKQkEzRkJBMGNOQUNBRElBSkJmbkUyQWdSQkFDQUFOZ0tRMElDQUFDQUJJQUJxSUFBMkFnQWdBU0FBUVFGeU5nSUVEd3NnQVNBRFR3MEFJQU1vQWdRaUFrRUJjVVVOQUFKQUFrQWdBa0VDY1EwQUFrQWdBMEVBS0FLZzBJQ0FBRWNOQUVFQUlBRTJBcURRZ0lBQVFRQkJBQ2dDbE5DQWdBQWdBR29pQURZQ2xOQ0FnQUFnQVNBQVFRRnlOZ0lFSUFGQkFDZ0NuTkNBZ0FCSERRTkJBRUVBTmdLUTBJQ0FBRUVBUVFBMkFwelFnSUFBRHdzQ1FDQURRUUFvQXB6UWdJQUFSdzBBUVFBZ0FUWUNuTkNBZ0FCQkFFRUFLQUtRMElDQUFDQUFhaUlBTmdLUTBJQ0FBQ0FCSUFCQkFYSTJBZ1FnQVNBQWFpQUFOZ0lBRHdzZ0FrRjRjU0FBYWlFQUFrQUNRQ0FDUWY4QlN3MEFJQU1vQWdnaUJDQUNRUU4ySWdWQkEzUkJzTkNBZ0FCcUlnWkdHZ0pBSUFNb0Fnd2lBaUFFUncwQVFRQkJBQ2dDaU5DQWdBQkJmaUFGZDNFMkFvalFnSUFBREFJTElBSWdCa1lhSUFJZ0JEWUNDQ0FFSUFJMkFnd01BUXNnQXlnQ0dDRUhBa0FDUUNBREtBSU1JZ1lnQTBZTkFDQURLQUlJSWdKQkFDZ0NtTkNBZ0FCSkdpQUdJQUkyQWdnZ0FpQUdOZ0lNREFFTEFrQWdBMEVVYWlJQ0tBSUFJZ1FOQUNBRFFSQnFJZ0lvQWdBaUJBMEFRUUFoQmd3QkN3TkFJQUloQlNBRUlnWkJGR29pQWlnQ0FDSUVEUUFnQmtFUWFpRUNJQVlvQWhBaUJBMEFDeUFGUVFBMkFnQUxJQWRGRFFBQ1FBSkFJQU1nQXlnQ0hDSUVRUUowUWJqU2dJQUFhaUlDS0FJQVJ3MEFJQUlnQmpZQ0FDQUdEUUZCQUVFQUtBS00wSUNBQUVGK0lBUjNjVFlDak5DQWdBQU1BZ3NnQjBFUVFSUWdCeWdDRUNBRFJodHFJQVkyQWdBZ0JrVU5BUXNnQmlBSE5nSVlBa0FnQXlnQ0VDSUNSUTBBSUFZZ0FqWUNFQ0FDSUFZMkFoZ0xJQU1vQWhRaUFrVU5BQ0FHUVJScUlBSTJBZ0FnQWlBR05nSVlDeUFCSUFCcUlBQTJBZ0FnQVNBQVFRRnlOZ0lFSUFGQkFDZ0NuTkNBZ0FCSERRRkJBQ0FBTmdLUTBJQ0FBQThMSUFNZ0FrRitjVFlDQkNBQklBQnFJQUEyQWdBZ0FTQUFRUUZ5TmdJRUN3SkFJQUJCL3dGTERRQWdBRUY0Y1VHdzBJQ0FBR29oQWdKQUFrQkJBQ2dDaU5DQWdBQWlCRUVCSUFCQkEzWjBJZ0J4RFFCQkFDQUVJQUJ5TmdLSTBJQ0FBQ0FDSVFBTUFRc2dBaWdDQ0NFQUN5QUFJQUUyQWd3Z0FpQUJOZ0lJSUFFZ0FqWUNEQ0FCSUFBMkFnZ1BDMEVmSVFJQ1FDQUFRZi8vL3dkTERRQWdBRUVJZGlJQ0lBSkJnUDQvYWtFUWRrRUljU0lDZENJRUlBUkJnT0FmYWtFUWRrRUVjU0lFZENJR0lBWkJnSUFQYWtFUWRrRUNjU0lHZEVFUGRpQUNJQVJ5SUFaeWF5SUNRUUYwSUFBZ0FrRVZhblpCQVhGeVFSeHFJUUlMSUFFZ0FqWUNIQ0FCUWdBM0FoQWdBa0VDZEVHNDBvQ0FBR29oQkFKQUFrQkJBQ2dDak5DQWdBQWlCa0VCSUFKMElnTnhEUUFnQkNBQk5nSUFRUUFnQmlBRGNqWUNqTkNBZ0FBZ0FTQUVOZ0lZSUFFZ0FUWUNDQ0FCSUFFMkFnd01BUXNnQUVFQVFSa2dBa0VCZG1zZ0FrRWZSaHQwSVFJZ0JDZ0NBQ0VHQWtBRFFDQUdJZ1FvQWdSQmVIRWdBRVlOQVNBQ1FSMTJJUVlnQWtFQmRDRUNJQVFnQmtFRWNXcEJFR29pQXlnQ0FDSUdEUUFMSUFNZ0FUWUNBQ0FCSUFRMkFoZ2dBU0FCTmdJTUlBRWdBVFlDQ0F3QkN5QUVLQUlJSWdBZ0FUWUNEQ0FFSUFFMkFnZ2dBVUVBTmdJWUlBRWdCRFlDRENBQklBQTJBZ2dMUVFCQkFDZ0NxTkNBZ0FCQmYyb2lBVUYvSUFFYk5nS28wSUNBQUFzTEJBQUFBQXRPQUFKQUlBQU5BRDhBUVJCMER3c0NRQ0FBUWYvL0EzRU5BQ0FBUVg5TURRQUNRQ0FBUVJCMlFBQWlBRUYvUncwQVFRQkJNRFlDK05PQWdBQkJmdzhMSUFCQkVIUVBDeERLZ0lDQUFBQUw4Z0lDQTM4QmZnSkFJQUpGRFFBZ0FDQUJPZ0FBSUFJZ0FHb2lBMEYvYWlBQk9nQUFJQUpCQTBrTkFDQUFJQUU2QUFJZ0FDQUJPZ0FCSUFOQmZXb2dBVG9BQUNBRFFYNXFJQUU2QUFBZ0FrRUhTUTBBSUFBZ0FUb0FBeUFEUVh4cUlBRTZBQUFnQWtFSlNRMEFJQUJCQUNBQWEwRURjU0lFYWlJRElBRkIvd0Z4UVlHQ2hBaHNJZ0UyQWdBZ0F5QUNJQVJyUVh4eElnUnFJZ0pCZkdvZ0FUWUNBQ0FFUVFsSkRRQWdBeUFCTmdJSUlBTWdBVFlDQkNBQ1FYaHFJQUUyQWdBZ0FrRjBhaUFCTmdJQUlBUkJHVWtOQUNBRElBRTJBaGdnQXlBQk5nSVVJQU1nQVRZQ0VDQURJQUUyQWd3Z0FrRndhaUFCTmdJQUlBSkJiR29nQVRZQ0FDQUNRV2hxSUFFMkFnQWdBa0ZrYWlBQk5nSUFJQVFnQTBFRWNVRVljaUlGYXlJQ1FTQkpEUUFnQWExQ2dZQ0FnQkIrSVFZZ0F5QUZhaUVCQTBBZ0FTQUdOd01ZSUFFZ0JqY0RFQ0FCSUFZM0F3Z2dBU0FHTndNQUlBRkJJR29oQVNBQ1FXQnFJZ0pCSDBzTkFBc0xJQUFMQzQ1SUFRQkJnQWdMaGtnQkFBQUFBZ0FBQUFNQUFBQUFBQUFBQUFBQUFBUUFBQUFGQUFBQUFBQUFBQUFBQUFBR0FBQUFCd0FBQUFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFbHVkbUZzYVdRZ1kyaGhjaUJwYmlCMWNtd2djWFZsY25rQVUzQmhiaUJqWVd4c1ltRmpheUJsY25KdmNpQnBiaUJ2Ymw5aWIyUjVBRU52Ym5SbGJuUXRUR1Z1WjNSb0lHOTJaWEptYkc5M0FFTm9kVzVySUhOcGVtVWdiM1psY21ac2IzY0FVbVZ6Y0c5dWMyVWdiM1psY21ac2IzY0FTVzUyWVd4cFpDQnRaWFJvYjJRZ1ptOXlJRWhVVkZBdmVDNTRJSEpsY1hWbGMzUUFTVzUyWVd4cFpDQnRaWFJvYjJRZ1ptOXlJRkpVVTFBdmVDNTRJSEpsY1hWbGMzUUFSWGh3WldOMFpXUWdVMDlWVWtORklHMWxkR2h2WkNCbWIzSWdTVU5GTDNndWVDQnlaWEYxWlhOMEFFbHVkbUZzYVdRZ1kyaGhjaUJwYmlCMWNtd2dabkpoWjIxbGJuUWdjM1JoY25RQVJYaHdaV04wWldRZ1pHOTBBRk53WVc0Z1kyRnNiR0poWTJzZ1pYSnliM0lnYVc0Z2IyNWZjM1JoZEhWekFFbHVkbUZzYVdRZ2NtVnpjRzl1YzJVZ2MzUmhkSFZ6QUVsdWRtRnNhV1FnWTJoaGNtRmpkR1Z5SUdsdUlHTm9kVzVySUdWNGRHVnVjMmx2Ym5NQVZYTmxjaUJqWVd4c1ltRmpheUJsY25KdmNnQmdiMjVmY21WelpYUmdJR05oYkd4aVlXTnJJR1Z5Y205eUFHQnZibDlqYUhWdWExOW9aV0ZrWlhKZ0lHTmhiR3hpWVdOcklHVnljbTl5QUdCdmJsOXRaWE56WVdkbFgySmxaMmx1WUNCallXeHNZbUZqYXlCbGNuSnZjZ0JnYjI1ZlkyaDFibXRmWlhoMFpXNXphVzl1WDNaaGJIVmxZQ0JqWVd4c1ltRmpheUJsY25KdmNnQmdiMjVmYzNSaGRIVnpYMk52YlhCc1pYUmxZQ0JqWVd4c1ltRmpheUJsY25KdmNnQmdiMjVmZG1WeWMybHZibDlqYjIxd2JHVjBaV0FnWTJGc2JHSmhZMnNnWlhKeWIzSUFZRzl1WDNWeWJGOWpiMjF3YkdWMFpXQWdZMkZzYkdKaFkyc2daWEp5YjNJQVlHOXVYMk5vZFc1clgyTnZiWEJzWlhSbFlDQmpZV3hzWW1GamF5Qmxjbkp2Y2dCZ2IyNWZhR1ZoWkdWeVgzWmhiSFZsWDJOdmJYQnNaWFJsWUNCallXeHNZbUZqYXlCbGNuSnZjZ0JnYjI1ZmJXVnpjMkZuWlY5amIyMXdiR1YwWldBZ1kyRnNiR0poWTJzZ1pYSnliM0lBWUc5dVgyMWxkR2h2WkY5amIyMXdiR1YwWldBZ1kyRnNiR0poWTJzZ1pYSnliM0lBWUc5dVgyaGxZV1JsY2w5bWFXVnNaRjlqYjIxd2JHVjBaV0FnWTJGc2JHSmhZMnNnWlhKeWIzSUFZRzl1WDJOb2RXNXJYMlY0ZEdWdWMybHZibDl1WVcxbFlDQmpZV3hzWW1GamF5Qmxjbkp2Y2dCVmJtVjRjR1ZqZEdWa0lHTm9ZWElnYVc0Z2RYSnNJSE5sY25abGNnQkpiblpoYkdsa0lHaGxZV1JsY2lCMllXeDFaU0JqYUdGeUFFbHVkbUZzYVdRZ2FHVmhaR1Z5SUdacFpXeGtJR05vWVhJQVUzQmhiaUJqWVd4c1ltRmpheUJsY25KdmNpQnBiaUJ2Ymw5MlpYSnphVzl1QUVsdWRtRnNhV1FnYldsdWIzSWdkbVZ5YzJsdmJnQkpiblpoYkdsa0lHMWhhbTl5SUhabGNuTnBiMjRBUlhod1pXTjBaV1FnYzNCaFkyVWdZV1owWlhJZ2RtVnljMmx2YmdCRmVIQmxZM1JsWkNCRFVreEdJR0ZtZEdWeUlIWmxjbk5wYjI0QVNXNTJZV3hwWkNCSVZGUlFJSFpsY25OcGIyNEFTVzUyWVd4cFpDQm9aV0ZrWlhJZ2RHOXJaVzRBVTNCaGJpQmpZV3hzWW1GamF5Qmxjbkp2Y2lCcGJpQnZibDkxY213QVNXNTJZV3hwWkNCamFHRnlZV04wWlhKeklHbHVJSFZ5YkFCVmJtVjRjR1ZqZEdWa0lITjBZWEowSUdOb1lYSWdhVzRnZFhKc0FFUnZkV0pzWlNCQUlHbHVJSFZ5YkFCRmJYQjBlU0JEYjI1MFpXNTBMVXhsYm1kMGFBQkpiblpoYkdsa0lHTm9ZWEpoWTNSbGNpQnBiaUJEYjI1MFpXNTBMVXhsYm1kMGFBQkVkWEJzYVdOaGRHVWdRMjl1ZEdWdWRDMU1aVzVuZEdnQVNXNTJZV3hwWkNCamFHRnlJR2x1SUhWeWJDQndZWFJvQUVOdmJuUmxiblF0VEdWdVozUm9JR05oYmlkMElHSmxJSEJ5WlhObGJuUWdkMmwwYUNCVWNtRnVjMlpsY2kxRmJtTnZaR2x1WndCSmJuWmhiR2xrSUdOb1lYSmhZM1JsY2lCcGJpQmphSFZ1YXlCemFYcGxBRk53WVc0Z1kyRnNiR0poWTJzZ1pYSnliM0lnYVc0Z2IyNWZhR1ZoWkdWeVgzWmhiSFZsQUZOd1lXNGdZMkZzYkdKaFkyc2daWEp5YjNJZ2FXNGdiMjVmWTJoMWJtdGZaWGgwWlc1emFXOXVYM1poYkhWbEFFbHVkbUZzYVdRZ1kyaGhjbUZqZEdWeUlHbHVJR05vZFc1cklHVjRkR1Z1YzJsdmJuTWdkbUZzZFdVQVRXbHpjMmx1WnlCbGVIQmxZM1JsWkNCTVJpQmhablJsY2lCb1pXRmtaWElnZG1Gc2RXVUFTVzUyWVd4cFpDQmdWSEpoYm5ObVpYSXRSVzVqYjJScGJtZGdJR2hsWVdSbGNpQjJZV3gxWlFCSmJuWmhiR2xrSUdOb1lYSmhZM1JsY2lCcGJpQmphSFZ1YXlCbGVIUmxibk5wYjI1eklIRjFiM1JsSUhaaGJIVmxBRWx1ZG1Gc2FXUWdZMmhoY21GamRHVnlJR2x1SUdOb2RXNXJJR1Y0ZEdWdWMybHZibk1nY1hWdmRHVmtJSFpoYkhWbEFGQmhkWE5sWkNCaWVTQnZibDlvWldGa1pYSnpYMk52YlhCc1pYUmxBRWx1ZG1Gc2FXUWdSVTlHSUhOMFlYUmxBRzl1WDNKbGMyVjBJSEJoZFhObEFHOXVYMk5vZFc1clgyaGxZV1JsY2lCd1lYVnpaUUJ2Ymw5dFpYTnpZV2RsWDJKbFoybHVJSEJoZFhObEFHOXVYMk5vZFc1clgyVjRkR1Z1YzJsdmJsOTJZV3gxWlNCd1lYVnpaUUJ2Ymw5emRHRjBkWE5mWTI5dGNHeGxkR1VnY0dGMWMyVUFiMjVmZG1WeWMybHZibDlqYjIxd2JHVjBaU0J3WVhWelpRQnZibDkxY214ZlkyOXRjR3hsZEdVZ2NHRjFjMlVBYjI1ZlkyaDFibXRmWTI5dGNHeGxkR1VnY0dGMWMyVUFiMjVmYUdWaFpHVnlYM1poYkhWbFgyTnZiWEJzWlhSbElIQmhkWE5sQUc5dVgyMWxjM05oWjJWZlkyOXRjR3hsZEdVZ2NHRjFjMlVBYjI1ZmJXVjBhRzlrWDJOdmJYQnNaWFJsSUhCaGRYTmxBRzl1WDJobFlXUmxjbDltYVdWc1pGOWpiMjF3YkdWMFpTQndZWFZ6WlFCdmJsOWphSFZ1YTE5bGVIUmxibk5wYjI1ZmJtRnRaU0J3WVhWelpRQlZibVY0Y0dWamRHVmtJSE53WVdObElHRm1kR1Z5SUhOMFlYSjBJR3hwYm1VQVUzQmhiaUJqWVd4c1ltRmpheUJsY25KdmNpQnBiaUJ2Ymw5amFIVnVhMTlsZUhSbGJuTnBiMjVmYm1GdFpRQkpiblpoYkdsa0lHTm9ZWEpoWTNSbGNpQnBiaUJqYUhWdWF5QmxlSFJsYm5OcGIyNXpJRzVoYldVQVVHRjFjMlVnYjI0Z1EwOU9Ua1ZEVkM5VmNHZHlZV1JsQUZCaGRYTmxJRzl1SUZCU1NTOVZjR2R5WVdSbEFFVjRjR1ZqZEdWa0lFaFVWRkF2TWlCRGIyNXVaV04wYVc5dUlGQnlaV1poWTJVQVUzQmhiaUJqWVd4c1ltRmpheUJsY25KdmNpQnBiaUJ2Ymw5dFpYUm9iMlFBUlhod1pXTjBaV1FnYzNCaFkyVWdZV1owWlhJZ2JXVjBhRzlrQUZOd1lXNGdZMkZzYkdKaFkyc2daWEp5YjNJZ2FXNGdiMjVmYUdWaFpHVnlYMlpwWld4a0FGQmhkWE5sWkFCSmJuWmhiR2xrSUhkdmNtUWdaVzVqYjNWdWRHVnlaV1FBU1c1MllXeHBaQ0J0WlhSb2IyUWdaVzVqYjNWdWRHVnlaV1FBVlc1bGVIQmxZM1JsWkNCamFHRnlJR2x1SUhWeWJDQnpZMmhsYldFQVVtVnhkV1Z6ZENCb1lYTWdhVzUyWVd4cFpDQmdWSEpoYm5ObVpYSXRSVzVqYjJScGJtZGdBRk5YU1ZSRFNGOVFVazlZV1FCVlUwVmZVRkpQV0ZrQVRVdEJRMVJKVmtsVVdRQlZUbEJTVDBORlUxTkJRa3hGWDBWT1ZFbFVXUUJEVDFCWkFFMVBWa1ZFWDFCRlVrMUJUa1ZPVkV4WkFGUlBUMTlGUVZKTVdRQk9UMVJKUmxrQVJrRkpURVZFWDBSRlVFVk9SRVZPUTFrQVFrRkVYMGRCVkVWWFFWa0FVRXhCV1FCUVZWUUFRMGhGUTB0UFZWUUFSMEZVUlZkQldWOVVTVTFGVDFWVUFGSkZVVlZGVTFSZlZFbE5SVTlWVkFCT1JWUlhUMUpMWDBOUFRrNUZRMVJmVkVsTlJVOVZWQUJEVDA1T1JVTlVTVTlPWDFSSlRVVlBWVlFBVEU5SFNVNWZWRWxOUlU5VlZBQk9SVlJYVDFKTFgxSkZRVVJmVkVsTlJVOVZWQUJRVDFOVUFFMUpVMFJKVWtWRFZFVkVYMUpGVVZWRlUxUUFRMHhKUlU1VVgwTk1UMU5GUkY5U1JWRlZSVk5VQUVOTVNVVk9WRjlEVEU5VFJVUmZURTlCUkY5Q1FVeEJUa05GUkY5U1JWRlZSVk5VQUVKQlJGOVNSVkZWUlZOVUFFaFVWRkJmVWtWUlZVVlRWRjlUUlU1VVgxUlBYMGhVVkZCVFgxQlBVbFFBVWtWUVQxSlVBRWxOWDBGZlZFVkJVRTlVQUZKRlUwVlVYME5QVGxSRlRsUUFUazlmUTA5T1ZFVk9WQUJRUVZKVVNVRk1YME5QVGxSRlRsUUFTRkJGWDBsT1ZrRk1TVVJmUTA5T1UxUkJUbFFBU0ZCRlgwTkNYMUpGVTBWVUFFZEZWQUJJVUVWZlUxUlNTVU5VQUVOUFRrWk1TVU5VQUZSRlRWQlBVa0ZTV1Y5U1JVUkpVa1ZEVkFCUVJWSk5RVTVGVGxSZlVrVkVTVkpGUTFRQVEwOU9Ua1ZEVkFCTlZVeFVTVjlUVkVGVVZWTUFTRkJGWDBsT1ZrRk1TVVJmVTFSQlZGVlRBRlJQVDE5TlFVNVpYMUpGVVZWRlUxUlRBRVZCVWt4WlgwaEpUbFJUQUZWT1FWWkJTVXhCUWt4RlgwWlBVbDlNUlVkQlRGOVNSVUZUVDA1VEFFOVFWRWxQVGxNQVUxZEpWRU5JU1U1SFgxQlNUMVJQUTA5TVV3QldRVkpKUVU1VVgwRk1VMDlmVGtWSFQxUkpRVlJGVXdCTlZVeFVTVkJNUlY5RFNFOUpRMFZUQUVsT1ZFVlNUa0ZNWDFORlVsWkZVbDlGVWxKUFVnQlhSVUpmVTBWU1ZrVlNYMVZPUzA1UFYwNWZSVkpTVDFJQVVrRkpURWRWVGw5RlVsSlBVZ0JKUkVWT1ZFbFVXVjlRVWs5V1NVUkZVbDlCVlZSSVJVNVVTVU5CVkVsUFRsOUZVbEpQVWdCVFUweGZRMFZTVkVsR1NVTkJWRVZmUlZKU1QxSUFTVTVXUVV4SlJGOVlYMFpQVWxkQlVrUkZSRjlHVDFJQVUwVlVYMUJCVWtGTlJWUkZVZ0JIUlZSZlVFRlNRVTFGVkVWU0FFaFFSVjlWVTBWU0FGTkZSVjlQVkVoRlVnQklVRVZmUTBKZlEwaFZUa3RmU0VWQlJFVlNBRTFMUTBGTVJVNUVRVklBVTBWVVZWQUFWMFZDWDFORlVsWkZVbDlKVTE5RVQxZE9BRlJGUVZKRVQxZE9BRWhRUlY5RFRFOVRSVVJmUTA5T1RrVkRWRWxQVGdCSVJWVlNTVk5VU1VOZlJWaFFTVkpCVkVsUFRnQkVTVk5EVDA1T1JVTlVSVVJmVDFCRlVrRlVTVTlPQUU1UFRsOUJWVlJJVDFKSlZFRlVTVlpGWDBsT1JrOVNUVUZVU1U5T0FFaFFSVjlKVGxaQlRFbEVYMVpGVWxOSlQwNEFTRkJGWDBOQ1gwMUZVMU5CUjBWZlFrVkhTVTRBVTBsVVJWOUpVMTlHVWs5YVJVNEFTRkJGWDBsT1ZrRk1TVVJmU0VWQlJFVlNYMVJQUzBWT0FFbE9Wa0ZNU1VSZlZFOUxSVTRBUms5U1FrbEVSRVZPQUVWT1NFRk9RMFZmV1U5VlVsOURRVXhOQUVoUVJWOUpUbFpCVEVsRVgxVlNUQUJDVEU5RFMwVkVYMEpaWDFCQlVrVk9WRUZNWDBOUFRsUlNUMHdBVFV0RFQwd0FRVU5NQUVoUVJWOUpUbFJGVWs1QlRBQlNSVkZWUlZOVVgwaEZRVVJGVWw5R1NVVk1SRk5mVkU5UFgweEJVa2RGWDFWT1QwWkdTVU5KUVV3QVNGQkZYMDlMQUZWT1RFbE9Td0JWVGt4UFEwc0FVRkpKQUZKRlZGSlpYMWRKVkVnQVNGQkZYMGxPVmtGTVNVUmZRMDlPVkVWT1ZGOU1SVTVIVkVnQVNGQkZYMVZPUlZoUVJVTlVSVVJmUTA5T1ZFVk9WRjlNUlU1SFZFZ0FSa3hWVTBnQVVGSlBVRkJCVkVOSUFFMHRVMFZCVWtOSUFGVlNTVjlVVDA5ZlRFOU9Sd0JRVWs5RFJWTlRTVTVIQUUxSlUwTkZURXhCVGtWUFZWTmZVRVZTVTBsVFZFVk9WRjlYUVZKT1NVNUhBRTFKVTBORlRFeEJUa1ZQVlZOZlYwRlNUa2xPUndCSVVFVmZTVTVXUVV4SlJGOVVVa0ZPVTBaRlVsOUZUa05QUkVsT1J3QkZlSEJsWTNSbFpDQkRVa3hHQUVoUVJWOUpUbFpCVEVsRVgwTklWVTVMWDFOSldrVUFUVTlXUlFCRFQwNVVTVTVWUlFCSVVFVmZRMEpmVTFSQlZGVlRYME5QVFZCTVJWUkZBRWhRUlY5RFFsOUlSVUZFUlZKVFgwTlBUVkJNUlZSRkFFaFFSVjlEUWw5V1JWSlRTVTlPWDBOUFRWQk1SVlJGQUVoUVJWOURRbDlWVWt4ZlEwOU5VRXhGVkVVQVNGQkZYME5DWDBOSVZVNUxYME5QVFZCTVJWUkZBRWhRUlY5RFFsOUlSVUZFUlZKZlZrRk1WVVZmUTA5TlVFeEZWRVVBU0ZCRlgwTkNYME5JVlU1TFgwVllWRVZPVTBsUFRsOVdRVXhWUlY5RFQwMVFURVZVUlFCSVVFVmZRMEpmUTBoVlRrdGZSVmhVUlU1VFNVOU9YMDVCVFVWZlEwOU5VRXhGVkVVQVNGQkZYME5DWDAxRlUxTkJSMFZmUTA5TlVFeEZWRVVBU0ZCRlgwTkNYMDFGVkVoUFJGOURUMDFRVEVWVVJRQklVRVZmUTBKZlNFVkJSRVZTWDBaSlJVeEVYME5QVFZCTVJWUkZBRVJGVEVWVVJRQklVRVZmU1U1V1FVeEpSRjlGVDBaZlUxUkJWRVVBU1U1V1FVeEpSRjlUVTB4ZlEwVlNWRWxHU1VOQlZFVUFVRUZWVTBVQVRrOWZVa1ZUVUU5T1UwVUFWVTVUVlZCUVQxSlVSVVJmVFVWRVNVRmZWRmxRUlFCSFQwNUZBRTVQVkY5QlEwTkZVRlJCUWt4RkFGTkZVbFpKUTBWZlZVNUJWa0ZKVEVGQ1RFVUFVa0ZPUjBWZlRrOVVYMU5CVkVsVFJrbEJRa3hGQUU5U1NVZEpUbDlKVTE5VlRsSkZRVU5JUVVKTVJRQlNSVk5RVDA1VFJWOUpVMTlUVkVGTVJRQlFWVkpIUlFCTlJWSkhSUUJTUlZGVlJWTlVYMGhGUVVSRlVsOUdTVVZNUkZOZlZFOVBYMHhCVWtkRkFGSkZVVlZGVTFSZlNFVkJSRVZTWDFSUFQxOU1RVkpIUlFCUVFWbE1UMEZFWDFSUFQxOU1RVkpIUlFCSlRsTlZSa1pKUTBsRlRsUmZVMVJQVWtGSFJRQklVRVZmVUVGVlUwVkVYMVZRUjFKQlJFVUFTRkJGWDFCQlZWTkZSRjlJTWw5VlVFZFNRVVJGQUZOUFZWSkRSUUJCVGs1UFZVNURSUUJVVWtGRFJRQklVRVZmVlU1RldGQkZRMVJGUkY5VFVFRkRSUUJFUlZORFVrbENSUUJWVGxOVlFsTkRVa2xDUlFCU1JVTlBVa1FBU0ZCRlgwbE9Wa0ZNU1VSZlRVVlVTRTlFQUU1UFZGOUdUMVZPUkFCUVVrOVFSa2xPUkFCVlRrSkpUa1FBVWtWQ1NVNUVBRlZPUVZWVVNFOVNTVnBGUkFCTlJWUklUMFJmVGs5VVgwRk1URTlYUlVRQVNGUlVVRjlXUlZKVFNVOU9YMDVQVkY5VFZWQlFUMUpVUlVRQVFVeFNSVUZFV1Y5U1JWQlBVbFJGUkFCQlEwTkZVRlJGUkFCT1QxUmZTVTFRVEVWTlJVNVVSVVFBVEU5UFVGOUVSVlJGUTFSRlJBQklVRVZmUTFKZlJWaFFSVU5VUlVRQVNGQkZYMHhHWDBWWVVFVkRWRVZFQUVOU1JVRlVSVVFBU1UxZlZWTkZSQUJJVUVWZlVFRlZVMFZFQUZSSlRVVlBWVlJmVDBORFZWSkZSQUJRUVZsTlJVNVVYMUpGVVZWSlVrVkVBRkJTUlVOUFRrUkpWRWxQVGw5U1JWRlZTVkpGUkFCUVVrOVlXVjlCVlZSSVJVNVVTVU5CVkVsUFRsOVNSVkZWU1ZKRlJBQk9SVlJYVDFKTFgwRlZWRWhGVGxSSlEwRlVTVTlPWDFKRlVWVkpVa1ZFQUV4RlRrZFVTRjlTUlZGVlNWSkZSQUJUVTB4ZlEwVlNWRWxHU1VOQlZFVmZVa1ZSVlVsU1JVUUFWVkJIVWtGRVJWOVNSVkZWU1ZKRlJBQlFRVWRGWDBWWVVFbFNSVVFBVUZKRlEwOU9SRWxVU1U5T1gwWkJTVXhGUkFCRldGQkZRMVJCVkVsUFRsOUdRVWxNUlVRQVVrVldRVXhKUkVGVVNVOU9YMFpCU1V4RlJBQlRVMHhmU0VGT1JGTklRVXRGWDBaQlNVeEZSQUJNVDBOTFJVUUFWRkpCVGxOR1QxSk5RVlJKVDA1ZlFWQlFURWxGUkFCT1QxUmZUVTlFU1VaSlJVUUFUazlVWDBWWVZFVk9SRVZFQUVKQlRrUlhTVVJVU0Y5TVNVMUpWRjlGV0VORlJVUkZSQUJUU1ZSRlgwbFRYMDlXUlZKTVQwRkVSVVFBU0VWQlJBQkZlSEJsWTNSbFpDQklWRlJRTHdBQVhoTUFBQ1lUQUFBd0VBQUE4QmNBQUowVEFBQVZFZ0FBT1JjQUFQQVNBQUFLRUFBQWRSSUFBSzBTQUFDQ0V3QUFUeFFBQUg4UUFBQ2dGUUFBSXhRQUFJa1NBQUNMRkFBQVRSVUFBTlFSQUFEUEZBQUFFQmdBQU1rV0FBRGNGZ0FBd1JFQUFPQVhBQUM3RkFBQWRCUUFBSHdWQUFEbEZBQUFDQmNBQUI4UUFBQmxGUUFBb3hRQUFDZ1ZBQUFDRlFBQW1SVUFBQ3dRQUFDTEdRQUFUdzhBQU5RT0FBQnFFQUFBemhBQUFBSVhBQUNKRGdBQWJoTUFBQndUQUFCbUZBQUFWaGNBQU1FVEFBRE5Fd0FBYkJNQUFHZ1hBQUJtRndBQVh4Y0FBQ0lUQUFET0R3QUFhUTRBQU5nT0FBQmpGZ0FBeXhNQUFLb09BQUFvRndBQUpoY0FBTVVUQUFCZEZnQUE2QkVBQUdjVEFBQmxFd0FBOGhZQUFITVRBQUFkRndBQStSWUFBUE1SQUFEUERnQUF6aFVBQUF3U0FBQ3pFUUFBcFJFQUFHRVFBQUF5RndBQXV4TUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFRSUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVBQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQUFBQUFBQUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlEQWdJQ0FnSUFBQUlDQUFJQ0FBSUNBZ0lDQWdJQ0FnSUFCQUFBQUFBQUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQUFBQUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0FDQUFJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0FBSUNBZ0lDQUFBQ0FnQUNBZ0FDQWdJQ0FnSUNBZ0lDQUFNQUJBQUFBQUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBQUFBQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQUFnQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBYkc5elpXVmxjQzFoYkdsMlpRQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVBQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVCQVFFQkFRRUJBUUVCQVFJQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFBRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJZMmgxYm10bFpBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVFFQUFRRUJBUUVBQUFFQkFBRUJBQUVCQVFFQkFRRUJBUUVBQUFBQUFBQUFBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUFBQUFCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQkFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJsWTNScGIyNWxiblF0YkdWdVozUm9iMjV5YjNoNUxXTnZibTVsWTNScGIyNEFBQUFBQUFBQUFBQUFBQUFBQUFCeVlXNXpabVZ5TFdWdVkyOWthVzVuY0dkeVlXUmxEUW9OQ2cwS1UwME5DZzBLVkZSUUwwTkZMMVJUVUM4QUFBQUFBQUFBQUFBQUFBQUJBZ0FCQXdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQUFBQUFBQUFBQUFBQVFJQUFRTUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBUUVGQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRQUFBQUFBQUFBQUFBRUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQkFBRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRQUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUFBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVBQUFBQUFBQUFBQUFBQVFBQUFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTUVBQUFFQkFRRUJBUUVCQVFFQkFVRUJBUUVCQVFFQkFRRUJBUUFCQUFHQndRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFBRUFBUUFCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlBQUFBQUFBQURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3QUFBQUFBQUFNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRQUFBQUFBQUFBQUFBSUFBQUFBQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01BQUFBQUFBQURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCT1QxVk9RMFZGUTB0UFZWUk9SVU5VUlZSRlExSkpRa1ZNVlZOSVJWUkZRVVJUUlVGU1EwaFNSMFZEVkVsV1NWUlpURVZPUkVGU1ZrVlBWRWxHV1ZCVVNVOU9VME5JVTBWQldWTlVRVlJEU0VkRlQxSkVTVkpGUTFSUFVsUlNRMGhRUVZKQlRVVlVSVkpWVWtORlFsTkRVa2xDUlVGU1JFOVhUa0ZEUlVsT1JFNUxRMHRWUWxORFVrbENSVWhVVkZBdlFVUlVVQzg9J1xuIiwibW9kdWxlLmV4cG9ydHMgPSAnQUdGemJRRUFBQUFCTUFoZ0FYOEJmMkFEZjM5L0FYOWdCSDkvZjM4QmYyQUFBR0FEZjM5L0FHQUJmd0JnQW45L0FHQUdmMzkvZjM5L0FBTExBUWdEWlc1MkdIZGhjMjFmYjI1ZmFHVmhaR1Z5YzE5amIyMXdiR1YwWlFBQ0EyVnVkaFYzWVhOdFgyOXVYMjFsYzNOaFoyVmZZbVZuYVc0QUFBTmxibllMZDJGemJWOXZibDkxY213QUFRTmxibllPZDJGemJWOXZibDl6ZEdGMGRYTUFBUU5sYm5ZVWQyRnpiVjl2Ymw5b1pXRmtaWEpmWm1sbGJHUUFBUU5sYm5ZVWQyRnpiVjl2Ymw5b1pXRmtaWEpmZG1Gc2RXVUFBUU5sYm5ZTWQyRnpiVjl2Ymw5aWIyUjVBQUVEWlc1MkdIZGhjMjFmYjI1ZmJXVnpjMkZuWlY5amIyMXdiR1YwWlFBQUEwWkZBd01FQUFBRkFBQUFBQUFBQlFFRkFBVUZCUUFBQmdBQUFBQUdCZ1lHQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUFCQUFBQkFRY0FBQVVGQXdBQkJBVUJjQUVTRWdVREFRQUNCZ2dCZndGQmdOUUVDd2ZSQlNJR2JXVnRiM0o1QWdBTFgybHVhWFJwWVd4cGVtVUFDUmxmWDJsdVpHbHlaV04wWDJaMWJtTjBhVzl1WDNSaFlteGxBUUFMYkd4b2RIUndYMmx1YVhRQUNoaHNiR2gwZEhCZmMyaHZkV3hrWDJ0bFpYQmZZV3hwZG1VQVFReHNiR2gwZEhCZllXeHNiMk1BREFadFlXeHNiMk1BUmd0c2JHaDBkSEJmWm5KbFpRQU5CR1p5WldVQVNBOXNiR2gwZEhCZloyVjBYM1I1Y0dVQURoVnNiR2gwZEhCZloyVjBYMmgwZEhCZmJXRnFiM0lBRHhWc2JHaDBkSEJmWjJWMFgyaDBkSEJmYldsdWIzSUFFQkZzYkdoMGRIQmZaMlYwWDIxbGRHaHZaQUFSRm14c2FIUjBjRjluWlhSZmMzUmhkSFZ6WDJOdlpHVUFFaEpzYkdoMGRIQmZaMlYwWDNWd1ozSmhaR1VBRXd4c2JHaDBkSEJmY21WelpYUUFGQTVzYkdoMGRIQmZaWGhsWTNWMFpRQVZGR3hzYUhSMGNGOXpaWFIwYVc1bmMxOXBibWwwQUJZTmJHeG9kSFJ3WDJacGJtbHphQUFYREd4c2FIUjBjRjl3WVhWelpRQVlEV3hzYUhSMGNGOXlaWE4xYldVQUdSdHNiR2gwZEhCZmNtVnpkVzFsWDJGbWRHVnlYM1Z3WjNKaFpHVUFHaEJzYkdoMGRIQmZaMlYwWDJWeWNtNXZBQnNYYkd4b2RIUndYMmRsZEY5bGNuSnZjbDl5WldGemIyNEFIQmRzYkdoMGRIQmZjMlYwWDJWeWNtOXlYM0psWVhOdmJnQWRGR3hzYUhSMGNGOW5aWFJmWlhKeWIzSmZjRzl6QUI0UmJHeG9kSFJ3WDJWeWNtNXZYMjVoYldVQUh4SnNiR2gwZEhCZmJXVjBhRzlrWDI1aGJXVUFJQkpzYkdoMGRIQmZjM1JoZEhWelgyNWhiV1VBSVJwc2JHaDBkSEJmYzJWMFgyeGxibWxsYm5SZmFHVmhaR1Z5Y3dBaUlXeHNhSFIwY0Y5elpYUmZiR1Z1YVdWdWRGOWphSFZ1YTJWa1gyeGxibWQwYUFBakhXeHNhSFIwY0Y5elpYUmZiR1Z1YVdWdWRGOXJaV1Z3WDJGc2FYWmxBQ1FrYkd4b2RIUndYM05sZEY5c1pXNXBaVzUwWDNSeVlXNXpabVZ5WDJWdVkyOWthVzVuQUNVWWJHeG9kSFJ3WDIxbGMzTmhaMlZmYm1WbFpITmZaVzltQUQ4SkZ3RUFRUUVMRVFFQ0F3UUZDd1lITlRrM01TOHRKeXNwQ3JMZ0FrVUNBQXNJQUJDSWdJQ0FBQXNaQUNBQUVNS0FnSUFBR2lBQUlBSTJBamdnQUNBQk9nQW9DeHdBSUFBZ0FDOEJNaUFBTFFBdUlBQVF3WUNBZ0FBUWdJQ0FnQUFMS2dFQmYwSEFBQkRHZ0lDQUFDSUJFTUtBZ0lBQUdpQUJRWUNJZ0lBQU5nSTRJQUVnQURvQUtDQUJDd29BSUFBUXlJQ0FnQUFMQndBZ0FDMEFLQXNIQUNBQUxRQXFDd2NBSUFBdEFDc0xCd0FnQUMwQUtRc0hBQ0FBTHdFeUN3Y0FJQUF0QUM0TFJRRUVmeUFBS0FJWUlRRWdBQzBBTFNFQ0lBQXRBQ2doQXlBQUtBSTRJUVFnQUJEQ2dJQ0FBQm9nQUNBRU5nSTRJQUFnQXpvQUtDQUFJQUk2QUMwZ0FDQUJOZ0lZQ3hFQUlBQWdBU0FCSUFKcUVNT0FnSUFBQ3hBQUlBQkJBRUhjQUJETWdJQ0FBQm9MWndFQmYwRUFJUUVDUUNBQUtBSU1EUUFDUUFKQUFrQUNRQ0FBTFFBdkRnTUJBQU1DQ3lBQUtBSTRJZ0ZGRFFBZ0FTZ0NMQ0lCUlEwQUlBQWdBUkdBZ0lDQUFBQWlBUTBEQzBFQUR3c1F5b0NBZ0FBQUN5QUFRY09XZ0lBQU5nSVFRUTRoQVFzZ0FRc2VBQUpBSUFBb0Fnd05BQ0FBUWRHYmdJQUFOZ0lRSUFCQkZUWUNEQXNMRmdBQ1FDQUFLQUlNUVJWSERRQWdBRUVBTmdJTUN3c1dBQUpBSUFBb0FneEJGa2NOQUNBQVFRQTJBZ3dMQ3djQUlBQW9BZ3dMQndBZ0FDZ0NFQXNKQUNBQUlBRTJBaEFMQndBZ0FDZ0NGQXNpQUFKQUlBQkJKRWtOQUJES2dJQ0FBQUFMSUFCQkFuUkJvTE9BZ0FCcUtBSUFDeUlBQWtBZ0FFRXVTUTBBRU1xQWdJQUFBQXNnQUVFQ2RFR3d0SUNBQUdvb0FnQUw3Z3NCQVg5QjY2aUFnQUFoQVFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBQkJuSDlxRHZRRFkySUFBV0ZoWVdGaFlRSURCQVZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaEJnY0lDUW9MREEwT0QyRmhZV0ZoRUdGaFlXRmhZV0ZoWVdGaEVXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlSSVRGQlVXRnhnWkdodGhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhIQjBlSHlBaElpTWtKU1luS0NrcUt5d3RMaTh3TVRJek5EVTJZVGM0T1RwaFlXRmhZV0ZoWVR0aFlXRThZV0ZoWVQwK1AyRmhZV0ZoWVdGaFFHRmhRV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVVKRFJFVkdSMGhKU2t0TVRVNVBVRkZTVTJGaFlXRmhZV0ZoVkZWV1YxaFpXbHRoWEYxaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmVZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhYMkJoQzBIaHA0Q0FBQThMUWFTaGdJQUFEd3RCeTZ5QWdBQVBDMEgrc1lDQUFBOExRY0NrZ0lBQUR3dEJxNlNBZ0FBUEMwR05xSUNBQUE4TFFlS21nSUFBRHd0QmdMQ0FnQUFQQzBHNXI0Q0FBQThMUWRla2dJQUFEd3RCNzUrQWdBQVBDMEhobjRDQUFBOExRZnFmZ0lBQUR3dEI4cUNBZ0FBUEMwR29yNENBQUE4TFFhNnlnSUFBRHd0QmlMQ0FnQUFQQzBIc3A0Q0FBQThMUVlLaWdJQUFEd3RCanAyQWdBQVBDMEhRcm9DQUFBOExRY3FqZ0lBQUR3dEJ4YktBZ0FBUEMwSGZuSUNBQUE4TFFkS2NnSUFBRHd0QnhLQ0FnQUFQQzBIWG9JQ0FBQThMUWFLZmdJQUFEd3RCN2E2QWdBQVBDMEdyc0lDQUFBOExRZFNsZ0lBQUR3dEJ6SzZBZ0FBUEMwSDZyb0NBQUE4TFFmeXJnSUFBRHd0QjByQ0FnQUFQQzBIeG5ZQ0FBQThMUWJ1Z2dJQUFEd3RCOTZ1QWdBQVBDMEdRc1lDQUFBOExRZGV4Z0lBQUR3dEJvcTJBZ0FBUEMwSFVwNENBQUE4TFFlQ3JnSUFBRHd0Qm42eUFnQUFQQzBIcnNZQ0FBQThMUWRXZmdJQUFEd3RCeXJHQWdBQVBDMEhlcFlDQUFBOExRZFNlZ0lBQUR3dEI5SnlBZ0FBUEMwR25zb0NBQUE4TFFiR2RnSUFBRHd0Qm9KMkFnQUFQQzBHNXNZQ0FBQThMUWJ5d2dJQUFEd3RCa3FHQWdBQVBDMEd6cG9DQUFBOExRZW1zZ0lBQUR3dEJySjZBZ0FBUEMwSFVxNENBQUE4TFFmZW1nSUFBRHd0QmdLYUFnQUFQQzBHd29ZQ0FBQThMUWY2ZWdJQUFEd3RCamFPQWdBQVBDMEdKcllDQUFBOExRZmVpZ0lBQUR3dEJvTEdBZ0FBUEMwR3VuNENBQUE4TFFjYWxnSUFBRHd0QjZKNkFnQUFQQzBHVG9vQ0FBQThMUWNLdmdJQUFEd3RCdzUyQWdBQVBDMEdMcklDQUFBOExRZUdkZ0lBQUR3dEJqYStBZ0FBUEMwSHFvWUNBQUE4TFFiU3RnSUFBRHd0QjBxK0FnQUFQQzBIZnNvQ0FBQThMUWRLeWdJQUFEd3RCOExDQWdBQVBDMEdwb29DQUFBOExRZm1qZ0lBQUR3dEJtWjZBZ0FBUEMwRzFySUNBQUE4TFFadXdnSUFBRHd0QmtyS0FnQUFQQzBHMnE0Q0FBQThMUWNLaWdJQUFEd3RCK0xLQWdBQVBDMEdlcFlDQUFBOExRZENpZ0lBQUR3dEJ1cDZBZ0FBUEMwR0Jub0NBQUE4TEVNcUFnSUFBQUF0QjFxR0FnQUFoQVFzZ0FRc1dBQ0FBSUFBdEFDMUIvZ0Z4SUFGQkFFZHlPZ0F0Q3hrQUlBQWdBQzBBTFVIOUFYRWdBVUVBUjBFQmRISTZBQzBMR1FBZ0FDQUFMUUF0UWZzQmNTQUJRUUJIUVFKMGNqb0FMUXNaQUNBQUlBQXRBQzFCOXdGeElBRkJBRWRCQTNSeU9nQXRDeTRCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FnQWlCRVVOQUNBQUlBUVJnSUNBZ0FBQUlRTUxJQU1MU1FFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NCQ0lFUlEwQUlBQWdBU0FDSUFGcklBUVJnWUNBZ0FBQUlnTkJmMGNOQUNBQVFjYVJnSUFBTmdJUVFSZ2hBd3NnQXdzdUFRSi9RUUFoQXdKQUlBQW9BamdpQkVVTkFDQUVLQUl3SWdSRkRRQWdBQ0FFRVlDQWdJQUFBQ0VEQ3lBREMwa0JBbjlCQUNFREFrQWdBQ2dDT0NJRVJRMEFJQVFvQWdnaUJFVU5BQ0FBSUFFZ0FpQUJheUFFRVlHQWdJQUFBQ0lEUVg5SERRQWdBRUgyaW9DQUFEWUNFRUVZSVFNTElBTUxMZ0VDZjBFQUlRTUNRQ0FBS0FJNElnUkZEUUFnQkNnQ05DSUVSUTBBSUFBZ0JCR0FnSUNBQUFBaEF3c2dBd3RKQVFKL1FRQWhBd0pBSUFBb0FqZ2lCRVVOQUNBRUtBSU1JZ1JGRFFBZ0FDQUJJQUlnQVdzZ0JCR0JnSUNBQUFBaUEwRi9SdzBBSUFCQjdacUFnQUEyQWhCQkdDRURDeUFEQ3k0QkFuOUJBQ0VEQWtBZ0FDZ0NPQ0lFUlEwQUlBUW9BamdpQkVVTkFDQUFJQVFSZ0lDQWdBQUFJUU1MSUFNTFNRRUNmMEVBSVFNQ1FDQUFLQUk0SWdSRkRRQWdCQ2dDRUNJRVJRMEFJQUFnQVNBQ0lBRnJJQVFSZ1lDQWdBQUFJZ05CZjBjTkFDQUFRWldRZ0lBQU5nSVFRUmdoQXdzZ0F3c3VBUUovUVFBaEF3SkFJQUFvQWpnaUJFVU5BQ0FFS0FJOElnUkZEUUFnQUNBRUVZQ0FnSUFBQUNFREN5QURDMGtCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FoUWlCRVVOQUNBQUlBRWdBaUFCYXlBRUVZR0FnSUFBQUNJRFFYOUhEUUFnQUVHcW00Q0FBRFlDRUVFWUlRTUxJQU1MTGdFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NRQ0lFUlEwQUlBQWdCQkdBZ0lDQUFBQWhBd3NnQXd0SkFRSi9RUUFoQXdKQUlBQW9BamdpQkVVTkFDQUVLQUlZSWdSRkRRQWdBQ0FCSUFJZ0FXc2dCQkdCZ0lDQUFBQWlBMEYvUncwQUlBQkI3Wk9BZ0FBMkFoQkJHQ0VEQ3lBREN5NEJBbjlCQUNFREFrQWdBQ2dDT0NJRVJRMEFJQVFvQWtRaUJFVU5BQ0FBSUFRUmdJQ0FnQUFBSVFNTElBTUxMZ0VDZjBFQUlRTUNRQ0FBS0FJNElnUkZEUUFnQkNnQ0pDSUVSUTBBSUFBZ0JCR0FnSUNBQUFBaEF3c2dBd3N1QVFKL1FRQWhBd0pBSUFBb0FqZ2lCRVVOQUNBRUtBSXNJZ1JGRFFBZ0FDQUVFWUNBZ0lBQUFDRURDeUFEQzBrQkFuOUJBQ0VEQWtBZ0FDZ0NPQ0lFUlEwQUlBUW9BaWdpQkVVTkFDQUFJQUVnQWlBQmF5QUVFWUdBZ0lBQUFDSURRWDlIRFFBZ0FFSDJpSUNBQURZQ0VFRVlJUU1MSUFNTExnRUNmMEVBSVFNQ1FDQUFLQUk0SWdSRkRRQWdCQ2dDVUNJRVJRMEFJQUFnQkJHQWdJQ0FBQUFoQXdzZ0F3dEpBUUovUVFBaEF3SkFJQUFvQWpnaUJFVU5BQ0FFS0FJY0lnUkZEUUFnQUNBQklBSWdBV3NnQkJHQmdJQ0FBQUFpQTBGL1J3MEFJQUJCd3BtQWdBQTJBaEJCR0NFREN5QURDeTRCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FrZ2lCRVVOQUNBQUlBUVJnSUNBZ0FBQUlRTUxJQU1MU1FFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NJQ0lFUlEwQUlBQWdBU0FDSUFGcklBUVJnWUNBZ0FBQUlnTkJmMGNOQUNBQVFaU1VnSUFBTmdJUVFSZ2hBd3NnQXdzdUFRSi9RUUFoQXdKQUlBQW9BamdpQkVVTkFDQUVLQUpNSWdSRkRRQWdBQ0FFRVlDQWdJQUFBQ0VEQ3lBREN5NEJBbjlCQUNFREFrQWdBQ2dDT0NJRVJRMEFJQVFvQWxRaUJFVU5BQ0FBSUFRUmdJQ0FnQUFBSVFNTElBTUxMZ0VDZjBFQUlRTUNRQ0FBS0FJNElnUkZEUUFnQkNnQ1dDSUVSUTBBSUFBZ0JCR0FnSUNBQUFBaEF3c2dBd3RGQVFGL0FrQUNRQ0FBTHdFd1FSUnhRUlJIRFFCQkFTRURJQUF0QUNoQkFVWU5BU0FBTHdFeVFlVUFSaUVEREFFTElBQXRBQ2xCQlVZaEF3c2dBQ0FET2dBdVFRQUwvZ0VCQTM5QkFTRURBa0FnQUM4Qk1DSUVRUWh4RFFBZ0FDa0RJRUlBVWlFREN3SkFBa0FnQUMwQUxrVU5BRUVCSVFVZ0FDMEFLVUVGUmcwQlFRRWhCU0FFUWNBQWNVVWdBM0ZCQVVjTkFRdEJBQ0VGSUFSQndBQnhEUUJCQWlFRklBUkIvLzhEY1NJRFFRaHhEUUFDUUNBRFFZQUVjVVVOQUFKQUlBQXRBQ2hCQVVjTkFDQUFMUUF0UVFweERRQkJCUThMUVFRUEN3SkFJQU5CSUhFTkFBSkFJQUF0QUNoQkFVWU5BQ0FBTHdFeVFmLy9BM0VpQUVHY2YycEI1QUJKRFFBZ0FFSE1BVVlOQUNBQVFiQUNSZzBBUVFRaEJTQUVRU2h4UlEwQ0lBTkJpQVJ4UVlBRVJnMENDMEVBRHd0QkFFRURJQUFwQXlCUUd5RUZDeUFGQzJJQkFuOUJBQ0VCQWtBZ0FDMEFLRUVCUmcwQUlBQXZBVEpCLy84RGNTSUNRWngvYWtIa0FFa05BQ0FDUWN3QlJnMEFJQUpCc0FKR0RRQWdBQzhCTUNJQVFjQUFjUTBBUVFFaEFTQUFRWWdFY1VHQUJFWU5BQ0FBUVNoeFJTRUJDeUFCQzZjQkFRTi9Ba0FDUUFKQUlBQXRBQ3BGRFFBZ0FDMEFLMFVOQUVFQUlRTWdBQzhCTUNJRVFRSnhSUTBCREFJTFFRQWhBeUFBTHdFd0lnUkJBWEZGRFFFTFFRRWhBeUFBTFFBb1FRRkdEUUFnQUM4Qk1rSC8vd054SWdWQm5IOXFRZVFBU1EwQUlBVkJ6QUZHRFFBZ0JVR3dBa1lOQUNBRVFjQUFjUTBBUVFBaEF5QUVRWWdFY1VHQUJFWU5BQ0FFUVNoeFFRQkhJUU1MSUFCQkFEc0JNQ0FBUVFBNkFDOGdBd3VaQVFFQ2Z3SkFBa0FDUUNBQUxRQXFSUTBBSUFBdEFDdEZEUUJCQUNFQklBQXZBVEFpQWtFQ2NVVU5BUXdDQzBFQUlRRWdBQzhCTUNJQ1FRRnhSUTBCQzBFQklRRWdBQzBBS0VFQlJnMEFJQUF2QVRKQi8vOERjU0lBUVp4L2FrSGtBRWtOQUNBQVFjd0JSZzBBSUFCQnNBSkdEUUFnQWtIQUFIRU5BRUVBSVFFZ0FrR0lCSEZCZ0FSR0RRQWdBa0VvY1VFQVJ5RUJDeUFCQzBrQkFYc2dBRUVRYXYwTUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNJQi9Rc0RBQ0FBSUFIOUN3TUFJQUJCTUdvZ0FmMExBd0FnQUVFZ2FpQUIvUXNEQUNBQVFkMEJOZ0ljUVFBTGV3RUJmd0pBSUFBb0Fnd2lBdzBBQWtBZ0FDZ0NCRVVOQUNBQUlBRTJBZ1FMQWtBZ0FDQUJJQUlReElDQWdBQWlBdzBBSUFBb0Fnd1BDeUFBSUFNMkFoeEJBQ0VESUFBb0FnUWlBVVVOQUNBQUlBRWdBaUFBS0FJSUVZR0FnSUFBQUNJQlJRMEFJQUFnQWpZQ0ZDQUFJQUUyQWd3Z0FTRURDeUFEQytUekFRTU9md04rQkg4amdJQ0FnQUJCRUdzaUF5U0FnSUNBQUNBQklRUWdBU0VGSUFFaEJpQUJJUWNnQVNFSUlBRWhDU0FCSVFvZ0FTRUxJQUVoRENBQklRMGdBU0VPSUFFaER3SkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUFLQUljSWhCQmYyb08zUUhhQVFIWkFRSURCQVVHQndnSkNnc01EUTdZQVE4UTF3RVJFdFlCRXhRVkZoY1lHUm9iNEFIZkFSd2RIdFVCSHlBaElpTWtKZFFCSmljb0tTb3JMTk1CMGdFdEx0RUIwQUV2TURFeU16UTFOamM0T1RvN1BEMCtQMEJCUWtORVJVYmJBVWRJU1VyUEFjNEJTODBCVE13QlRVNVBVRkZTVTFSVlZsZFlXVnBiWEYxZVgyQmhZbU5rWldabmFHbHFhMnh0Ym05d2NYSnpkSFYyZDNoNWVudDhmWDUvZ0FHQkFZSUJnd0dFQVlVQmhnR0hBWWdCaVFHS0FZc0JqQUdOQVk0Qmp3R1FBWkVCa2dHVEFaUUJsUUdXQVpjQm1BR1pBWm9CbXdHY0FaMEJuZ0dmQWFBQm9RR2lBYU1CcEFHbEFhWUJwd0dvQWFrQnFnR3JBYXdCclFHdUFhOEJzQUd4QWJJQnN3RzBBYlVCdGdHM0Fjc0J5Z0c0QWNrQnVRSElBYm9CdXdHOEFiMEJ2Z0cvQWNBQndRSENBY01CeEFIRkFjWUJBTndCQzBFQUlSQU14Z0VMUVE0aEVBekZBUXRCRFNFUURNUUJDMEVQSVJBTXd3RUxRUkFoRUF6Q0FRdEJFeUVRRE1FQkMwRVVJUkFNd0FFTFFSVWhFQXkvQVF0QkZpRVFETDRCQzBFWElSQU12UUVMUVJnaEVBeThBUXRCR1NFUURMc0JDMEVhSVJBTXVnRUxRUnNoRUF5NUFRdEJIQ0VRRExnQkMwRUlJUkFNdHdFTFFSMGhFQXkyQVF0QklDRVFETFVCQzBFZklSQU10QUVMUVFjaEVBeXpBUXRCSVNFUURMSUJDMEVpSVJBTXNRRUxRUjRoRUF5d0FRdEJJeUVRREs4QkMwRVNJUkFNcmdFTFFSRWhFQXl0QVF0QkpDRVFES3dCQzBFbElSQU1xd0VMUVNZaEVBeXFBUXRCSnlFUURLa0JDMEhEQVNFUURLZ0JDMEVwSVJBTXB3RUxRU3NoRUF5bUFRdEJMQ0VRREtVQkMwRXRJUkFNcEFFTFFTNGhFQXlqQVF0Qkx5RVFES0lCQzBIRUFTRVFES0VCQzBFd0lSQU1vQUVMUVRRaEVBeWZBUXRCRENFUURKNEJDMEV4SVJBTW5RRUxRVEloRUF5Y0FRdEJNeUVRREpzQkMwRTVJUkFNbWdFTFFUVWhFQXlaQVF0QnhRRWhFQXlZQVF0QkN5RVFESmNCQzBFNklSQU1sZ0VMUVRZaEVBeVZBUXRCQ2lFUURKUUJDMEUzSVJBTWt3RUxRVGdoRUF5U0FRdEJQQ0VRREpFQkMwRTdJUkFNa0FFTFFUMGhFQXlQQVF0QkNTRVFESTRCQzBFb0lSQU1qUUVMUVQ0aEVBeU1BUXRCUHlFUURJc0JDMEhBQUNFUURJb0JDMEhCQUNFUURJa0JDMEhDQUNFUURJZ0JDMEhEQUNFUURJY0JDMEhFQUNFUURJWUJDMEhGQUNFUURJVUJDMEhHQUNFUURJUUJDMEVxSVJBTWd3RUxRY2NBSVJBTWdnRUxRY2dBSVJBTWdRRUxRY2tBSVJBTWdBRUxRY29BSVJBTWZ3dEJ5d0FoRUF4K0MwSE5BQ0VRREgwTFFjd0FJUkFNZkF0QnpnQWhFQXg3QzBIUEFDRVFESG9MUWRBQUlSQU1lUXRCMFFBaEVBeDRDMEhTQUNFUURIY0xRZE1BSVJBTWRndEIxQUFoRUF4MUMwSFdBQ0VRREhRTFFkVUFJUkFNY3d0QkJpRVFESElMUWRjQUlSQU1jUXRCQlNFUURIQUxRZGdBSVJBTWJ3dEJCQ0VRREc0TFFka0FJUkFNYlF0QjJnQWhFQXhzQzBIYkFDRVFER3NMUWR3QUlSQU1hZ3RCQXlFUURHa0xRZDBBSVJBTWFBdEIzZ0FoRUF4bkMwSGZBQ0VRREdZTFFlRUFJUkFNWlF0QjRBQWhFQXhrQzBIaUFDRVFER01MUWVNQUlSQU1ZZ3RCQWlFUURHRUxRZVFBSVJBTVlBdEI1UUFoRUF4ZkMwSG1BQ0VRREY0TFFlY0FJUkFNWFF0QjZBQWhFQXhjQzBIcEFDRVFERnNMUWVvQUlSQU1XZ3RCNndBaEVBeFpDMEhzQUNFUURGZ0xRZTBBSVJBTVZ3dEI3Z0FoRUF4V0MwSHZBQ0VRREZVTFFmQUFJUkFNVkF0QjhRQWhFQXhUQzBIeUFDRVFERklMUWZNQUlSQU1VUXRCOUFBaEVBeFFDMEgxQUNFUURFOExRZllBSVJBTVRndEI5d0FoRUF4TkMwSDRBQ0VRREV3TFFma0FJUkFNU3d0QitnQWhFQXhLQzBIN0FDRVFERWtMUWZ3QUlSQU1TQXRCL1FBaEVBeEhDMEgrQUNFUURFWUxRZjhBSVJBTVJRdEJnQUVoRUF4RUMwR0JBU0VRREVNTFFZSUJJUkFNUWd0Qmd3RWhFQXhCQzBHRUFTRVFERUFMUVlVQklSQU1Qd3RCaGdFaEVBdytDMEdIQVNFUUREMExRWWdCSVJBTVBBdEJpUUVoRUF3N0MwR0tBU0VRRERvTFFZc0JJUkFNT1F0QmpBRWhFQXc0QzBHTkFTRVFERGNMUVk0QklSQU1OZ3RCandFaEVBdzFDMEdRQVNFUUREUUxRWkVCSVJBTU13dEJrZ0VoRUF3eUMwR1RBU0VRRERFTFFaUUJJUkFNTUF0QmxRRWhFQXd2QzBHV0FTRVFEQzRMUVpjQklSQU1MUXRCbUFFaEVBd3NDMEdaQVNFUURDc0xRWm9CSVJBTUtndEJtd0VoRUF3cEMwR2NBU0VRRENnTFFaMEJJUkFNSnd0Qm5nRWhFQXdtQzBHZkFTRVFEQ1VMUWFBQklSQU1KQXRCb1FFaEVBd2pDMEdpQVNFUURDSUxRYU1CSVJBTUlRdEJwQUVoRUF3Z0MwR2xBU0VRREI4TFFhWUJJUkFNSGd0QnB3RWhFQXdkQzBHb0FTRVFEQndMUWFrQklSQU1Hd3RCcWdFaEVBd2FDMEdyQVNFUURCa0xRYXdCSVJBTUdBdEJyUUVoRUF3WEMwR3VBU0VRREJZTFFRRWhFQXdWQzBHdkFTRVFEQlFMUWJBQklSQU1Fd3RCc1FFaEVBd1NDMEd6QVNFUURCRUxRYklCSVJBTUVBdEJ0QUVoRUF3UEMwRzFBU0VRREE0TFFiWUJJUkFNRFF0QnR3RWhFQXdNQzBHNEFTRVFEQXNMUWJrQklSQU1DZ3RCdWdFaEVBd0pDMEc3QVNFUURBZ0xRY1lCSVJBTUJ3dEJ2QUVoRUF3R0MwRzlBU0VRREFVTFFiNEJJUkFNQkF0QnZ3RWhFQXdEQzBIQUFTRVFEQUlMUWNJQklSQU1BUXRCd1FFaEVBc0RRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUJBT3h3RUFBUUlEQkFVR0J3Z0pDZ3NNRFE0UEVCRVNFeFFWRmhjWUdSb2JIQjRmSUNFakpTZy9RRUZFUlVaSFNFbEtTMHhOVDFCUlVsUGVBMWRaVzF4ZFlHSmxabWRvYVdwcmJHMXZjSEZ5YzNSMWRuZDRlWHA3ZkgxK2dBR0NBWVVCaGdHSEFZa0Jpd0dNQVkwQmpnR1BBWkFCa1FHVUFaVUJsZ0dYQVpnQm1RR2FBWnNCbkFHZEFaNEJud0dnQWFFQm9nR2pBYVFCcFFHbUFhY0JxQUdwQWFvQnF3R3NBYTBCcmdHdkFiQUJzUUd5QWJNQnRBRzFBYllCdHdHNEFia0J1Z0c3QWJ3QnZRRytBYjhCd0FIQkFjSUJ3d0hFQWNVQnhnSEhBY2dCeVFIS0Fjc0J6QUhOQWM0Qnp3SFFBZEVCMGdIVEFkUUIxUUhXQWRjQjJBSFpBZG9CMndIY0FkMEIzZ0hnQWVFQjRnSGpBZVFCNVFIbUFlY0I2QUhwQWVvQjZ3SHNBZTBCN2dIdkFmQUI4UUh5QWZNQm1RS2tBckFDL2dMK0Fnc2dBU0lFSUFKSERmTUJRZDBCSVJBTS93TUxJQUVpRUNBQ1J3M2RBVUhEQVNFUURQNERDeUFCSWdFZ0FrY05rQUZCOXdBaEVBejlBd3NnQVNJQklBSkhEWVlCUWU4QUlSQU0vQU1MSUFFaUFTQUNSdzEvUWVvQUlSQU0rd01MSUFFaUFTQUNSdzE3UWVnQUlSQU0rZ01MSUFFaUFTQUNSdzE0UWVZQUlSQU0rUU1MSUFFaUFTQUNSdzBhUVJnaEVBejRBd3NnQVNJQklBSkhEUlJCRWlFUURQY0RDeUFCSWdFZ0FrY05XVUhGQUNFUURQWURDeUFCSWdFZ0FrY05Ta0UvSVJBTTlRTUxJQUVpQVNBQ1J3MUlRVHdoRUF6MEF3c2dBU0lCSUFKSERVRkJNU0VRRFBNREN5QUFMUUF1UVFGR0Rlc0RESWNDQ3lBQUlBRWlBU0FDRU1DQWdJQUFRUUZIRGVZQklBQkNBRGNESUF6bkFRc2dBQ0FCSWdFZ0FoQzBnSUNBQUNJUURlY0JJQUVoQVF6MUFnc0NRQ0FCSWdFZ0FrY05BRUVHSVJBTThBTUxJQUFnQVVFQmFpSUJJQUlRdTRDQWdBQWlFQTNvQVNBQklRRU1NUXNnQUVJQU53TWdRUkloRUF6VkF3c2dBU0lRSUFKSERTdEJIU0VRRE8wREN3SkFJQUVpQVNBQ1JnMEFJQUZCQVdvaEFVRVFJUkFNMUFNTFFRY2hFQXpzQXdzZ0FFSUFJQUFwQXlBaUVTQUNJQUVpRUd1dEloSjlJaE1nRXlBUlZoczNBeUFnRVNBU1ZpSVVSUTNsQVVFSUlSQU02d01MQWtBZ0FTSUJJQUpHRFFBZ0FFR0pnSUNBQURZQ0NDQUFJQUUyQWdRZ0FTRUJRUlFoRUF6U0F3dEJDU0VRRE9vREN5QUJJUUVnQUNrRElGQU41QUVnQVNFQkRQSUNDd0pBSUFFaUFTQUNSdzBBUVFzaEVBenBBd3NnQUNBQlFRRnFJZ0VnQWhDMmdJQ0FBQ0lRRGVVQklBRWhBUXp5QWdzZ0FDQUJJZ0VnQWhDNGdJQ0FBQ0lRRGVVQklBRWhBUXp5QWdzZ0FDQUJJZ0VnQWhDNGdJQ0FBQ0lRRGVZQklBRWhBUXdOQ3lBQUlBRWlBU0FDRUxxQWdJQUFJaEFONXdFZ0FTRUJEUEFDQ3dKQUlBRWlBU0FDUncwQVFROGhFQXpsQXdzZ0FTMEFBQ0lRUVR0R0RRZ2dFRUVOUnczb0FTQUJRUUZxSVFFTTd3SUxJQUFnQVNJQklBSVF1b0NBZ0FBaUVBM29BU0FCSVFFTThnSUxBMEFDUUNBQkxRQUFRZkMxZ0lBQWFpMEFBQ0lRUVFGR0RRQWdFRUVDUnczckFTQUFLQUlFSVJBZ0FFRUFOZ0lFSUFBZ0VDQUJRUUZxSWdFUXVZQ0FnQUFpRUEzcUFTQUJJUUVNOUFJTElBRkJBV29pQVNBQ1J3MEFDMEVTSVJBTTRnTUxJQUFnQVNJQklBSVF1b0NBZ0FBaUVBM3BBU0FCSVFFTUNnc2dBU0lCSUFKSERRWkJHeUVRRE9BREN3SkFJQUVpQVNBQ1J3MEFRUlloRUF6Z0F3c2dBRUdLZ0lDQUFEWUNDQ0FBSUFFMkFnUWdBQ0FCSUFJUXVJQ0FnQUFpRUEzcUFTQUJJUUZCSUNFUURNWURDd0pBSUFFaUFTQUNSZzBBQTBBQ1FDQUJMUUFBUWZDM2dJQUFhaTBBQUNJUVFRSkdEUUFDUUNBUVFYOXFEZ1RsQWV3QkFPc0I3QUVMSUFGQkFXb2hBVUVJSVJBTXlBTUxJQUZCQVdvaUFTQUNSdzBBQzBFVklSQU0zd01MUVJVaEVBemVBd3NEUUFKQUlBRXRBQUJCOExtQWdBQnFMUUFBSWhCQkFrWU5BQ0FRUVg5cURnVGVBZXdCNEFIckFld0JDeUFCUVFGcUlnRWdBa2NOQUF0QkdDRVFETjBEQ3dKQUlBRWlBU0FDUmcwQUlBQkJpNENBZ0FBMkFnZ2dBQ0FCTmdJRUlBRWhBVUVISVJBTXhBTUxRUmtoRUF6Y0F3c2dBVUVCYWlFQkRBSUxBa0FnQVNJVUlBSkhEUUJCR2lFUUROc0RDeUFVSVFFQ1FDQVVMUUFBUVhOcURoVGRBdTRDN2dMdUF1NEM3Z0x1QXU0QzdnTHVBdTRDN2dMdUF1NEM3Z0x1QXU0QzdnTHVBZ0R1QWd0QkFDRVFJQUJCQURZQ0hDQUFRYStMZ0lBQU5nSVFJQUJCQWpZQ0RDQUFJQlJCQVdvMkFoUU0yZ01MQWtBZ0FTMEFBQ0lRUVR0R0RRQWdFRUVOUnczb0FTQUJRUUZxSVFFTTVRSUxJQUZCQVdvaEFRdEJJaUVRREw4REN3SkFJQUVpRUNBQ1J3MEFRUndoRUF6WUF3dENBQ0VSSUJBaEFTQVFMUUFBUVZCcURqZm5BZVlCQVFJREJBVUdCd2dBQUFBQUFBQUFDUW9MREEwT0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUEVCRVNFeFFBQzBFZUlSQU12UU1MUWdJaEVRemxBUXRDQXlFUkRPUUJDMElFSVJFTTR3RUxRZ1VoRVF6aUFRdENCaUVSRE9FQkMwSUhJUkVNNEFFTFFnZ2hFUXpmQVF0Q0NTRVJETjRCQzBJS0lSRU0zUUVMUWdzaEVRemNBUXRDRENFUkROc0JDMElOSVJFTTJnRUxRZzRoRVF6WkFRdENEeUVSRE5nQkMwSUtJUkVNMXdFTFFnc2hFUXpXQVF0Q0RDRVJETlVCQzBJTklSRU0xQUVMUWc0aEVRelRBUXRDRHlFUkROSUJDMElBSVJFQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQkF0QUFCQlVHb09OK1VCNUFFQUFRSURCQVVHQitZQjVnSG1BZVlCNWdIbUFlWUJDQWtLQ3d3TjVnSG1BZVlCNWdIbUFlWUI1Z0htQWVZQjVnSG1BZVlCNWdIbUFlWUI1Z0htQWVZQjVnSG1BZVlCNWdIbUFlWUI1Z0htQVE0UEVCRVNFK1lCQzBJQ0lSRU01QUVMUWdNaEVRempBUXRDQkNFUkRPSUJDMElGSVJFTTRRRUxRZ1loRVF6Z0FRdENCeUVSRE44QkMwSUlJUkVNM2dFTFFna2hFUXpkQVF0Q0NpRVJETndCQzBJTElSRU0yd0VMUWd3aEVRemFBUXRDRFNFUkROa0JDMElPSVJFTTJBRUxRZzhoRVF6WEFRdENDaUVSRE5ZQkMwSUxJUkVNMVFFTFFnd2hFUXpVQVF0Q0RTRVJETk1CQzBJT0lSRU0wZ0VMUWc4aEVRelJBUXNnQUVJQUlBQXBBeUFpRVNBQ0lBRWlFR3V0SWhKOUloTWdFeUFSVmhzM0F5QWdFU0FTVmlJVVJRM1NBVUVmSVJBTXdBTUxBa0FnQVNJQklBSkdEUUFnQUVHSmdJQ0FBRFlDQ0NBQUlBRTJBZ1FnQVNFQlFTUWhFQXluQXd0QklDRVFETDhEQ3lBQUlBRWlFQ0FDRUw2QWdJQUFRWDlxRGdXMkFRREZBZ0hSQWRJQkMwRVJJUkFNcEFNTElBQkJBVG9BTHlBUUlRRU11d01MSUFFaUFTQUNSdzNTQVVFa0lSQU11d01MSUFFaURTQUNSdzBlUWNZQUlSQU11Z01MSUFBZ0FTSUJJQUlRc29DQWdBQWlFQTNVQVNBQklRRU10UUVMSUFFaUVDQUNSdzBtUWRBQUlSQU11QU1MQWtBZ0FTSUJJQUpIRFFCQktDRVFETGdEQ3lBQVFRQTJBZ1FnQUVHTWdJQ0FBRFlDQ0NBQUlBRWdBUkN4Z0lDQUFDSVFEZE1CSUFFaEFRellBUXNDUUNBQkloQWdBa2NOQUVFcElSQU10d01MSUJBdEFBQWlBVUVnUmcwVUlBRkJDVWNOMHdFZ0VFRUJhaUVCREJVTEFrQWdBU0lCSUFKR0RRQWdBVUVCYWlFQkRCY0xRU29oRUF5MUF3c0NRQ0FCSWhBZ0FrY05BRUVySVJBTXRRTUxBa0FnRUMwQUFDSUJRUWxHRFFBZ0FVRWdSdzNWQVFzZ0FDMEFMRUVJUmczVEFTQVFJUUVNa1FNTEFrQWdBU0lCSUFKSERRQkJMQ0VRRExRREN5QUJMUUFBUVFwSERkVUJJQUZCQVdvaEFRekpBZ3NnQVNJT0lBSkhEZFVCUVM4aEVBeXlBd3NEUUFKQUlBRXRBQUFpRUVFZ1JnMEFBa0FnRUVGMmFnNEVBTndCM0FFQTJnRUxJQUVoQVF6Z0FRc2dBVUVCYWlJQklBSkhEUUFMUVRFaEVBeXhBd3RCTWlFUUlBRWlGQ0FDUmcyd0F5QUNJQlJySUFBb0FnQWlBV29oRlNBVUlBRnJRUU5xSVJZQ1FBTkFJQlF0QUFBaUYwRWdjaUFYSUJkQnYzOXFRZjhCY1VFYVNSdEIvd0Z4SUFGQjhMdUFnQUJxTFFBQVJ3MEJBa0FnQVVFRFJ3MEFRUVloQVF5V0F3c2dBVUVCYWlFQklCUkJBV29pRkNBQ1J3MEFDeUFBSUJVMkFnQU1zUU1MSUFCQkFEWUNBQ0FVSVFFTTJRRUxRVE1oRUNBQkloUWdBa1lOcndNZ0FpQVVheUFBS0FJQUlnRnFJUlVnRkNBQmEwRUlhaUVXQWtBRFFDQVVMUUFBSWhkQklISWdGeUFYUWI5L2FrSC9BWEZCR2trYlFmOEJjU0FCUWZTN2dJQUFhaTBBQUVjTkFRSkFJQUZCQ0VjTkFFRUZJUUVNbFFNTElBRkJBV29oQVNBVVFRRnFJaFFnQWtjTkFBc2dBQ0FWTmdJQURMQURDeUFBUVFBMkFnQWdGQ0VCRE5nQkMwRTBJUkFnQVNJVUlBSkdEYTRESUFJZ0ZHc2dBQ2dDQUNJQmFpRVZJQlFnQVd0QkJXb2hGZ0pBQTBBZ0ZDMEFBQ0lYUVNCeUlCY2dGMEcvZjJwQi93RnhRUnBKRzBIL0FYRWdBVUhRd29DQUFHb3RBQUJIRFFFQ1FDQUJRUVZIRFFCQkJ5RUJESlFEQ3lBQlFRRnFJUUVnRkVFQmFpSVVJQUpIRFFBTElBQWdGVFlDQUF5dkF3c2dBRUVBTmdJQUlCUWhBUXpYQVFzQ1FDQUJJZ0VnQWtZTkFBTkFBa0FnQVMwQUFFR0F2b0NBQUdvdEFBQWlFRUVCUmcwQUlCQkJBa1lOQ2lBQklRRU0zUUVMSUFGQkFXb2lBU0FDUncwQUMwRXdJUkFNcmdNTFFUQWhFQXl0QXdzQ1FDQUJJZ0VnQWtZTkFBTkFBa0FnQVMwQUFDSVFRU0JHRFFBZ0VFRjJhZzRFMlFIYUFkb0IyUUhhQVFzZ0FVRUJhaUlCSUFKSERRQUxRVGdoRUF5dEF3dEJPQ0VRREt3REN3TkFBa0FnQVMwQUFDSVFRU0JHRFFBZ0VFRUpSdzBEQ3lBQlFRRnFJZ0VnQWtjTkFBdEJQQ0VRREtzREN3TkFBa0FnQVMwQUFDSVFRU0JHRFFBQ1FBSkFJQkJCZG1vT0JOb0JBUUhhQVFBTElCQkJMRVlOMndFTElBRWhBUXdFQ3lBQlFRRnFJZ0VnQWtjTkFBdEJQeUVRREtvREN5QUJJUUVNMndFTFFjQUFJUkFnQVNJVUlBSkdEYWdESUFJZ0ZHc2dBQ2dDQUNJQmFpRVdJQlFnQVd0QkJtb2hGd0pBQTBBZ0ZDMEFBRUVnY2lBQlFZREFnSUFBYWkwQUFFY05BU0FCUVFaR0RZNERJQUZCQVdvaEFTQVVRUUZxSWhRZ0FrY05BQXNnQUNBV05nSUFES2tEQ3lBQVFRQTJBZ0FnRkNFQkMwRTJJUkFNamdNTEFrQWdBU0lQSUFKSERRQkJ3UUFoRUF5bkF3c2dBRUdNZ0lDQUFEWUNDQ0FBSUE4MkFnUWdEeUVCSUFBdEFDeEJmMm9PQk0wQjFRSFhBZGtCaHdNTElBRkJBV29oQVF6TUFRc0NRQ0FCSWdFZ0FrWU5BQU5BQWtBZ0FTMEFBQ0lRUVNCeUlCQWdFRUcvZjJwQi93RnhRUnBKRzBIL0FYRWlFRUVKUmcwQUlCQkJJRVlOQUFKQUFrQUNRQUpBSUJCQm5YOXFEaE1BQXdNREF3TURBd0VEQXdNREF3TURBd01DQXdzZ0FVRUJhaUVCUVRFaEVBeVJBd3NnQVVFQmFpRUJRVEloRUF5UUF3c2dBVUVCYWlFQlFUTWhFQXlQQXdzZ0FTRUJETkFCQ3lBQlFRRnFJZ0VnQWtjTkFBdEJOU0VRREtVREMwRTFJUkFNcEFNTEFrQWdBU0lCSUFKR0RRQURRQUpBSUFFdEFBQkJnTHlBZ0FCcUxRQUFRUUZHRFFBZ0FTRUJETk1CQ3lBQlFRRnFJZ0VnQWtjTkFBdEJQU0VRREtRREMwRTlJUkFNb3dNTElBQWdBU0lCSUFJUXNJQ0FnQUFpRUEzV0FTQUJJUUVNQVFzZ0VFRUJhaUVCQzBFOElSQU1od01MQWtBZ0FTSUJJQUpIRFFCQndnQWhFQXlnQXdzQ1FBTkFBa0FnQVMwQUFFRjNhZzRZQUFMK0F2NENoQVArQXY0Qy9nTCtBdjRDL2dMK0F2NEMvZ0wrQXY0Qy9nTCtBdjRDL2dMK0F2NEMvZ0lBL2dJTElBRkJBV29pQVNBQ1J3MEFDMEhDQUNFUURLQURDeUFCUVFGcUlRRWdBQzBBTFVFQmNVVU52UUVnQVNFQkMwRXNJUkFNaFFNTElBRWlBU0FDUnczVEFVSEVBQ0VRREowREN3TkFBa0FnQVMwQUFFR1F3SUNBQUdvdEFBQkJBVVlOQUNBQklRRU10d0lMSUFGQkFXb2lBU0FDUncwQUMwSEZBQ0VRREp3REN5QU5MUUFBSWhCQklFWU5zd0VnRUVFNlJ3MkJBeUFBS0FJRUlRRWdBRUVBTmdJRUlBQWdBU0FORUsrQWdJQUFJZ0VOMEFFZ0RVRUJhaUVCRExNQ0MwSEhBQ0VRSUFFaURTQUNSZzJhQXlBQ0lBMXJJQUFvQWdBaUFXb2hGaUFOSUFGclFRVnFJUmNEUUNBTkxRQUFJaFJCSUhJZ0ZDQVVRYjkvYWtIL0FYRkJHa2tiUWY4QmNTQUJRWkRDZ0lBQWFpMEFBRWNOZ0FNZ0FVRUZSZzMwQWlBQlFRRnFJUUVnRFVFQmFpSU5JQUpIRFFBTElBQWdGallDQUF5YUF3dEJ5QUFoRUNBQklnMGdBa1lObVFNZ0FpQU5heUFBS0FJQUlnRnFJUllnRFNBQmEwRUphaUVYQTBBZ0RTMEFBQ0lVUVNCeUlCUWdGRUcvZjJwQi93RnhRUnBKRzBIL0FYRWdBVUdXd29DQUFHb3RBQUJIRGY4Q0FrQWdBVUVKUncwQVFRSWhBUXoxQWdzZ0FVRUJhaUVCSUExQkFXb2lEU0FDUncwQUN5QUFJQlkyQWdBTW1RTUxBa0FnQVNJTklBSkhEUUJCeVFBaEVBeVpBd3NDUUFKQUlBMHRBQUFpQVVFZ2NpQUJJQUZCdjM5cVFmOEJjVUVhU1J0Qi93RnhRWkovYWc0SEFJQURnQU9BQTRBRGdBTUJnQU1MSUExQkFXb2hBVUUrSVJBTWdBTUxJQTFCQVdvaEFVRS9JUkFNL3dJTFFjb0FJUkFnQVNJTklBSkdEWmNESUFJZ0RXc2dBQ2dDQUNJQmFpRVdJQTBnQVd0QkFXb2hGd05BSUEwdEFBQWlGRUVnY2lBVUlCUkJ2MzlxUWY4QmNVRWFTUnRCL3dGeElBRkJvTUtBZ0FCcUxRQUFSdzM5QWlBQlFRRkdEZkFDSUFGQkFXb2hBU0FOUVFGcUlnMGdBa2NOQUFzZ0FDQVdOZ0lBREpjREMwSExBQ0VRSUFFaURTQUNSZzJXQXlBQ0lBMXJJQUFvQWdBaUFXb2hGaUFOSUFGclFRNXFJUmNEUUNBTkxRQUFJaFJCSUhJZ0ZDQVVRYjkvYWtIL0FYRkJHa2tiUWY4QmNTQUJRYUxDZ0lBQWFpMEFBRWNOL0FJZ0FVRU9SZzN3QWlBQlFRRnFJUUVnRFVFQmFpSU5JQUpIRFFBTElBQWdGallDQUF5V0F3dEJ6QUFoRUNBQklnMGdBa1lObFFNZ0FpQU5heUFBS0FJQUlnRnFJUllnRFNBQmEwRVBhaUVYQTBBZ0RTMEFBQ0lVUVNCeUlCUWdGRUcvZjJwQi93RnhRUnBKRzBIL0FYRWdBVUhBd29DQUFHb3RBQUJIRGZzQ0FrQWdBVUVQUncwQVFRTWhBUXp4QWdzZ0FVRUJhaUVCSUExQkFXb2lEU0FDUncwQUN5QUFJQlkyQWdBTWxRTUxRYzBBSVJBZ0FTSU5JQUpHRFpRRElBSWdEV3NnQUNnQ0FDSUJhaUVXSUEwZ0FXdEJCV29oRndOQUlBMHRBQUFpRkVFZ2NpQVVJQlJCdjM5cVFmOEJjVUVhU1J0Qi93RnhJQUZCME1LQWdBQnFMUUFBUnczNkFnSkFJQUZCQlVjTkFFRUVJUUVNOEFJTElBRkJBV29oQVNBTlFRRnFJZzBnQWtjTkFBc2dBQ0FXTmdJQURKUURDd0pBSUFFaURTQUNSdzBBUWM0QUlSQU1sQU1MQWtBQ1FBSkFBa0FnRFMwQUFDSUJRU0J5SUFFZ0FVRy9mMnBCL3dGeFFScEpHMEgvQVhGQm5YOXFEaE1BL1FMOUF2MEMvUUw5QXYwQy9RTDlBdjBDL1FMOUF2MENBZjBDL1FMOUFnSUQvUUlMSUExQkFXb2hBVUhCQUNFUURQMENDeUFOUVFGcUlRRkJ3Z0FoRUF6OEFnc2dEVUVCYWlFQlFjTUFJUkFNK3dJTElBMUJBV29oQVVIRUFDRVFEUG9DQ3dKQUlBRWlBU0FDUmcwQUlBQkJqWUNBZ0FBMkFnZ2dBQ0FCTmdJRUlBRWhBVUhGQUNFUURQb0NDMEhQQUNFUURKSURDeUFRSVFFQ1FBSkFJQkF0QUFCQmRtb09CQUdvQXFnQ0FLZ0NDeUFRUVFGcUlRRUxRU2NoRUF6NEFnc0NRQ0FCSWdFZ0FrY05BRUhSQUNFUURKRURDd0pBSUFFdEFBQkJJRVlOQUNBQklRRU1qUUVMSUFGQkFXb2hBU0FBTFFBdFFRRnhSUTNIQVNBQklRRU1qQUVMSUFFaUZ5QUNSdzNJQVVIU0FDRVFESThEQzBIVEFDRVFJQUVpRkNBQ1JnMk9BeUFDSUJScklBQW9BZ0FpQVdvaEZpQVVJQUZyUVFGcUlSY0RRQ0FVTFFBQUlBRkIxc0tBZ0FCcUxRQUFSdzNNQVNBQlFRRkdEY2NCSUFGQkFXb2hBU0FVUVFGcUloUWdBa2NOQUFzZ0FDQVdOZ0lBREk0REN3SkFJQUVpQVNBQ1J3MEFRZFVBSVJBTWpnTUxJQUV0QUFCQkNrY056QUVnQVVFQmFpRUJETWNCQ3dKQUlBRWlBU0FDUncwQVFkWUFJUkFNalFNTEFrQUNRQ0FCTFFBQVFYWnFEZ1FBelFITkFRSE5BUXNnQVVFQmFpRUJETWNCQ3lBQlFRRnFJUUZCeWdBaEVBenpBZ3NnQUNBQklnRWdBaEN1Z0lDQUFDSVFEY3NCSUFFaEFVSE5BQ0VRRFBJQ0N5QUFMUUFwUVNKR0RZVURES1lDQ3dKQUlBRWlBU0FDUncwQVFkc0FJUkFNaWdNTFFRQWhGRUVCSVJkQkFTRVdRUUFoRUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQkxRQUFRVkJxRGdyVUFkTUJBQUVDQXdRRkJnalZBUXRCQWlFUURBWUxRUU1oRUF3RkMwRUVJUkFNQkF0QkJTRVFEQU1MUVFZaEVBd0NDMEVISVJBTUFRdEJDQ0VRQzBFQUlSZEJBQ0VXUVFBaEZBek1BUXRCQ1NFUVFRRWhGRUVBSVJkQkFDRVdETXNCQ3dKQUlBRWlBU0FDUncwQVFkMEFJUkFNaVFNTElBRXRBQUJCTGtjTnpBRWdBVUVCYWlFQkRLWUNDeUFCSWdFZ0FrY056QUZCM3dBaEVBeUhBd3NDUUNBQklnRWdBa1lOQUNBQVFZNkFnSUFBTmdJSUlBQWdBVFlDQkNBQklRRkIwQUFoRUF6dUFndEI0QUFoRUF5R0F3dEI0UUFoRUNBQklnRWdBa1lOaFFNZ0FpQUJheUFBS0FJQUloUnFJUllnQVNBVWEwRURhaUVYQTBBZ0FTMEFBQ0FVUWVMQ2dJQUFhaTBBQUVjTnpRRWdGRUVEUmczTUFTQVVRUUZxSVJRZ0FVRUJhaUlCSUFKSERRQUxJQUFnRmpZQ0FBeUZBd3RCNGdBaEVDQUJJZ0VnQWtZTmhBTWdBaUFCYXlBQUtBSUFJaFJxSVJZZ0FTQVVhMEVDYWlFWEEwQWdBUzBBQUNBVVFlYkNnSUFBYWkwQUFFY056QUVnRkVFQ1JnM09BU0FVUVFGcUlSUWdBVUVCYWlJQklBSkhEUUFMSUFBZ0ZqWUNBQXlFQXd0QjR3QWhFQ0FCSWdFZ0FrWU5nd01nQWlBQmF5QUFLQUlBSWhScUlSWWdBU0FVYTBFRGFpRVhBMEFnQVMwQUFDQVVRZW5DZ0lBQWFpMEFBRWNOeXdFZ0ZFRURSZzNPQVNBVVFRRnFJUlFnQVVFQmFpSUJJQUpIRFFBTElBQWdGallDQUF5REF3c0NRQ0FCSWdFZ0FrY05BRUhsQUNFUURJTURDeUFBSUFGQkFXb2lBU0FDRUtpQWdJQUFJaEFOelFFZ0FTRUJRZFlBSVJBTTZRSUxBa0FnQVNJQklBSkdEUUFEUUFKQUlBRXRBQUFpRUVFZ1JnMEFBa0FDUUFKQUlCQkJ1SDlxRGdzQUFjOEJ6d0hQQWM4Qnp3SFBBYzhCendFQ3p3RUxJQUZCQVdvaEFVSFNBQ0VRRE8wQ0N5QUJRUUZxSVFGQjB3QWhFQXpzQWdzZ0FVRUJhaUVCUWRRQUlSQU02d0lMSUFGQkFXb2lBU0FDUncwQUMwSGtBQ0VRRElJREMwSGtBQ0VRRElFREN3TkFBa0FnQVMwQUFFSHd3b0NBQUdvdEFBQWlFRUVCUmcwQUlCQkJmbW9PQTg4QjBBSFJBZElCQ3lBQlFRRnFJZ0VnQWtjTkFBdEI1Z0FoRUF5QUF3c0NRQ0FCSWdFZ0FrWU5BQ0FCUVFGcUlRRU1Bd3RCNXdBaEVBei9BZ3NEUUFKQUlBRXRBQUJCOE1TQWdBQnFMUUFBSWhCQkFVWU5BQUpBSUJCQmZtb09CTklCMHdIVUFRRFZBUXNnQVNFQlFkY0FJUkFNNXdJTElBRkJBV29pQVNBQ1J3MEFDMEhvQUNFUURQNENDd0pBSUFFaUFTQUNSdzBBUWVrQUlSQU0vZ0lMQWtBZ0FTMEFBQ0lRUVhacURocTZBZFVCMVFHOEFkVUIxUUhWQWRVQjFRSFZBZFVCMVFIVkFkVUIxUUhWQWRVQjFRSFZBZFVCMVFIVkFjb0IxUUhWQVFEVEFRc2dBVUVCYWlFQkMwRUdJUkFNNHdJTEEwQUNRQ0FCTFFBQVFmREdnSUFBYWkwQUFFRUJSZzBBSUFFaEFReWVBZ3NnQVVFQmFpSUJJQUpIRFFBTFFlb0FJUkFNK3dJTEFrQWdBU0lCSUFKR0RRQWdBVUVCYWlFQkRBTUxRZXNBSVJBTStnSUxBa0FnQVNJQklBSkhEUUJCN0FBaEVBejZBZ3NnQVVFQmFpRUJEQUVMQWtBZ0FTSUJJQUpIRFFCQjdRQWhFQXo1QWdzZ0FVRUJhaUVCQzBFRUlSQU0zZ0lMQWtBZ0FTSVVJQUpIRFFCQjdnQWhFQXozQWdzZ0ZDRUJBa0FDUUFKQUlCUXRBQUJCOE1pQWdBQnFMUUFBUVg5cURnZlVBZFVCMWdFQW5BSUJBdGNCQ3lBVVFRRnFJUUVNQ2dzZ0ZFRUJhaUVCRE0wQkMwRUFJUkFnQUVFQU5nSWNJQUJCbTVLQWdBQTJBaEFnQUVFSE5nSU1JQUFnRkVFQmFqWUNGQXoyQWdzQ1FBTkFBa0FnQVMwQUFFSHd5SUNBQUdvdEFBQWlFRUVFUmcwQUFrQUNRQ0FRUVg5cURnZlNBZE1CMUFIWkFRQUVBZGtCQ3lBQklRRkIyZ0FoRUF6Z0Fnc2dBVUVCYWlFQlFkd0FJUkFNM3dJTElBRkJBV29pQVNBQ1J3MEFDMEh2QUNFUURQWUNDeUFCUVFGcUlRRU15d0VMQWtBZ0FTSVVJQUpIRFFCQjhBQWhFQXoxQWdzZ0ZDMEFBRUV2UnczVUFTQVVRUUZxSVFFTUJnc0NRQ0FCSWhRZ0FrY05BRUh4QUNFUURQUUNDd0pBSUJRdEFBQWlBVUV2UncwQUlCUkJBV29oQVVIZEFDRVFETnNDQ3lBQlFYWnFJZ1JCRmtzTjB3RkJBU0FFZEVHSmdJQUNjVVVOMHdFTXlnSUxBa0FnQVNJQklBSkdEUUFnQVVFQmFpRUJRZDRBSVJBTTJnSUxRZklBSVJBTThnSUxBa0FnQVNJVUlBSkhEUUJCOUFBaEVBenlBZ3NnRkNFQkFrQWdGQzBBQUVId3pJQ0FBR290QUFCQmYyb09BOGtDbEFJQTFBRUxRZUVBSVJBTTJBSUxBa0FnQVNJVUlBSkdEUUFEUUFKQUlCUXRBQUJCOE1xQWdBQnFMUUFBSWdGQkEwWU5BQUpBSUFGQmYyb09Bc3NDQU5VQkN5QVVJUUZCM3dBaEVBemFBZ3NnRkVFQmFpSVVJQUpIRFFBTFFmTUFJUkFNOFFJTFFmTUFJUkFNOEFJTEFrQWdBU0lCSUFKR0RRQWdBRUdQZ0lDQUFEWUNDQ0FBSUFFMkFnUWdBU0VCUWVBQUlSQU0xd0lMUWZVQUlSQU03d0lMQWtBZ0FTSUJJQUpIRFFCQjlnQWhFQXp2QWdzZ0FFR1BnSUNBQURZQ0NDQUFJQUUyQWdRZ0FTRUJDMEVESVJBTTFBSUxBMEFnQVMwQUFFRWdSdzNEQWlBQlFRRnFJZ0VnQWtjTkFBdEI5d0FoRUF6c0Fnc0NRQ0FCSWdFZ0FrY05BRUg0QUNFUURPd0NDeUFCTFFBQVFTQkhEYzRCSUFGQkFXb2hBUXp2QVFzZ0FDQUJJZ0VnQWhDc2dJQ0FBQ0lRRGM0QklBRWhBUXlPQWdzQ1FDQUJJZ1FnQWtjTkFFSDZBQ0VRRE9vQ0N5QUVMUUFBUWN3QVJ3M1JBU0FFUVFGcUlRRkJFeUVRRE04QkN3SkFJQUVpQkNBQ1J3MEFRZnNBSVJBTTZRSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQldvaEVBTkFJQVF0QUFBZ0FVSHd6b0NBQUdvdEFBQkhEZEFCSUFGQkJVWU56Z0VnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCK3dBaEVBem9BZ3NDUUNBQklnUWdBa2NOQUVIOEFDRVFET2dDQ3dKQUFrQWdCQzBBQUVHOWYyb09EQURSQWRFQjBRSFJBZEVCMFFIUkFkRUIwUUhSQVFIUkFRc2dCRUVCYWlFQlFlWUFJUkFNendJTElBUkJBV29oQVVIbkFDRVFETTRDQ3dKQUlBRWlCQ0FDUncwQVFmMEFJUkFNNXdJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBbW9oRUFKQUEwQWdCQzBBQUNBQlFlM1BnSUFBYWkwQUFFY056d0VnQVVFQ1JnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRZjBBSVJBTTV3SUxJQUJCQURZQ0FDQVFRUUZxSVFGQkVDRVFETXdCQ3dKQUlBRWlCQ0FDUncwQVFmNEFJUkFNNWdJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJCV29oRUFKQUEwQWdCQzBBQUNBQlFmYk9nSUFBYWkwQUFFY056Z0VnQVVFRlJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRZjRBSVJBTTVnSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkZpRVFETXNCQ3dKQUlBRWlCQ0FDUncwQVFmOEFJUkFNNVFJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBMm9oRUFKQUEwQWdCQzBBQUNBQlFmek9nSUFBYWkwQUFFY056UUVnQVVFRFJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRZjhBSVJBTTVRSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkJTRVFETW9CQ3dKQUlBRWlCQ0FDUncwQVFZQUJJUkFNNUFJTElBUXRBQUJCMlFCSERjc0JJQVJCQVdvaEFVRUlJUkFNeVFFTEFrQWdBU0lFSUFKSERRQkJnUUVoRUF6akFnc0NRQUpBSUFRdEFBQkJzbjlxRGdNQXpBRUJ6QUVMSUFSQkFXb2hBVUhyQUNFUURNb0NDeUFFUVFGcUlRRkI3QUFoRUF6SkFnc0NRQ0FCSWdRZ0FrY05BRUdDQVNFUURPSUNDd0pBQWtBZ0JDMEFBRUc0ZjJvT0NBRExBY3NCeXdITEFjc0J5d0VCeXdFTElBUkJBV29oQVVIcUFDRVFETWtDQ3lBRVFRRnFJUUZCN1FBaEVBeklBZ3NDUUNBQklnUWdBa2NOQUVHREFTRVFET0VDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hFQ0FFSUFGclFRSnFJUlFDUUFOQUlBUXRBQUFnQVVHQXo0Q0FBR290QUFCSERja0JJQUZCQWtZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRURZQ0FFR0RBU0VRRE9FQ0MwRUFJUkFnQUVFQU5nSUFJQlJCQVdvaEFRekdBUXNDUUNBQklnUWdBa2NOQUVHRUFTRVFET0FDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRUnFJUkFDUUFOQUlBUXRBQUFnQVVHRHo0Q0FBR290QUFCSERjZ0JJQUZCQkVZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR0VBU0VRRE9BQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVNNaEVBekZBUXNDUUNBQklnUWdBa2NOQUVHRkFTRVFETjhDQ3dKQUFrQWdCQzBBQUVHMGYyb09DQURJQWNnQnlBSElBY2dCeUFFQnlBRUxJQVJCQVdvaEFVSHZBQ0VRRE1ZQ0N5QUVRUUZxSVFGQjhBQWhFQXpGQWdzQ1FDQUJJZ1FnQWtjTkFFR0dBU0VRRE40Q0N5QUVMUUFBUWNVQVJ3M0ZBU0FFUVFGcUlRRU1nd0lMQWtBZ0FTSUVJQUpIRFFCQmh3RWhFQXpkQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRURhaUVRQWtBRFFDQUVMUUFBSUFGQmlNK0FnQUJxTFFBQVJ3M0ZBU0FCUVFOR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJod0VoRUF6ZEFnc2dBRUVBTmdJQUlCQkJBV29oQVVFdElSQU13Z0VMQWtBZ0FTSUVJQUpIRFFCQmlBRWhFQXpjQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUlhaUVRQWtBRFFDQUVMUUFBSUFGQjBNK0FnQUJxTFFBQVJ3M0VBU0FCUVFoR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJpQUVoRUF6Y0Fnc2dBRUVBTmdJQUlCQkJBV29oQVVFcElSQU13UUVMQWtBZ0FTSUJJQUpIRFFCQmlRRWhFQXpiQWd0QkFTRVFJQUV0QUFCQjN3QkhEY0FCSUFGQkFXb2hBUXlCQWdzQ1FDQUJJZ1FnQWtjTkFFR0tBU0VRRE5vQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUUZxSVJBRFFDQUVMUUFBSUFGQmpNK0FnQUJxTFFBQVJ3M0JBU0FCUVFGR0RhOENJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRWW9CSVJBTTJRSUxBa0FnQVNJRUlBSkhEUUJCaXdFaEVBelpBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFQ2FpRVFBa0FEUUNBRUxRQUFJQUZCanMrQWdBQnFMUUFBUnczQkFTQUJRUUpHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQml3RWhFQXpaQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVDSVJBTXZnRUxBa0FnQVNJRUlBSkhEUUJCakFFaEVBellBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFQmFpRVFBa0FEUUNBRUxRQUFJQUZCOE0rQWdBQnFMUUFBUnczQUFTQUJRUUZHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQmpBRWhFQXpZQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVmSVJBTXZRRUxBa0FnQVNJRUlBSkhEUUJCalFFaEVBelhBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFQmFpRVFBa0FEUUNBRUxRQUFJQUZCOHMrQWdBQnFMUUFBUncyL0FTQUJRUUZHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQmpRRWhFQXpYQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVKSVJBTXZBRUxBa0FnQVNJRUlBSkhEUUJCamdFaEVBeldBZ3NDUUFKQUlBUXRBQUJCdDM5cURnY0F2d0cvQWI4QnZ3Ry9BUUcvQVFzZ0JFRUJhaUVCUWZnQUlSQU12UUlMSUFSQkFXb2hBVUg1QUNFUURMd0NDd0pBSUFFaUJDQUNSdzBBUVk4QklSQU0xUUlMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkJXb2hFQUpBQTBBZ0JDMEFBQ0FCUVpIUGdJQUFhaTBBQUVjTnZRRWdBVUVGUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFZOEJJUkFNMVFJTElBQkJBRFlDQUNBUVFRRnFJUUZCR0NFUURMb0JDd0pBSUFFaUJDQUNSdzBBUVpBQklSQU0xQUlMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFtb2hFQUpBQTBBZ0JDMEFBQ0FCUVpmUGdJQUFhaTBBQUVjTnZBRWdBVUVDUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFaQUJJUkFNMUFJTElBQkJBRFlDQUNBUVFRRnFJUUZCRnlFUURMa0JDd0pBSUFFaUJDQUNSdzBBUVpFQklSQU0wd0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkJtb2hFQUpBQTBBZ0JDMEFBQ0FCUVpyUGdJQUFhaTBBQUVjTnV3RWdBVUVHUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFaRUJJUkFNMHdJTElBQkJBRFlDQUNBUVFRRnFJUUZCRlNFUURMZ0JDd0pBSUFFaUJDQUNSdzBBUVpJQklSQU0wZ0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkJXb2hFQUpBQTBBZ0JDMEFBQ0FCUWFIUGdJQUFhaTBBQUVjTnVnRWdBVUVGUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFaSUJJUkFNMGdJTElBQkJBRFlDQUNBUVFRRnFJUUZCSGlFUURMY0JDd0pBSUFFaUJDQUNSdzBBUVpNQklSQU0wUUlMSUFRdEFBQkJ6QUJIRGJnQklBUkJBV29oQVVFS0lSQU10Z0VMQWtBZ0JDQUNSdzBBUVpRQklSQU0wQUlMQWtBQ1FDQUVMUUFBUWI5L2FnNFBBTGtCdVFHNUFia0J1UUc1QWJrQnVRRzVBYmtCdVFHNUFia0JBYmtCQ3lBRVFRRnFJUUZCL2dBaEVBeTNBZ3NnQkVFQmFpRUJRZjhBSVJBTXRnSUxBa0FnQkNBQ1J3MEFRWlVCSVJBTXp3SUxBa0FDUUNBRUxRQUFRYjkvYWc0REFMZ0JBYmdCQ3lBRVFRRnFJUUZCL1FBaEVBeTJBZ3NnQkVFQmFpRUVRWUFCSVJBTXRRSUxBa0FnQkNBQ1J3MEFRWllCSVJBTXpnSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQVdvaEVBSkFBMEFnQkMwQUFDQUJRYWZQZ0lBQWFpMEFBRWNOdGdFZ0FVRUJSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUVpZQklSQU16Z0lMSUFCQkFEWUNBQ0FRUVFGcUlRRkJDeUVRRExNQkN3SkFJQVFnQWtjTkFFR1hBU0VRRE0wQ0N3SkFBa0FDUUFKQUlBUXRBQUJCVTJvT0l3QzRBYmdCdUFHNEFiZ0J1QUc0QWJnQnVBRzRBYmdCdUFHNEFiZ0J1QUc0QWJnQnVBRzRBYmdCdUFHNEFiZ0JBYmdCdUFHNEFiZ0J1QUVDdUFHNEFiZ0JBN2dCQ3lBRVFRRnFJUUZCK3dBaEVBeTJBZ3NnQkVFQmFpRUJRZndBSVJBTXRRSUxJQVJCQVdvaEJFR0JBU0VRRExRQ0N5QUVRUUZxSVFSQmdnRWhFQXl6QWdzQ1FDQUVJQUpIRFFCQm1BRWhFQXpNQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUVhaUVRQWtBRFFDQUVMUUFBSUFGQnFjK0FnQUJxTFFBQVJ3MjBBU0FCUVFSR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJtQUVoRUF6TUFnc2dBRUVBTmdJQUlCQkJBV29oQVVFWklSQU1zUUVMQWtBZ0JDQUNSdzBBUVprQklSQU15d0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkJXb2hFQUpBQTBBZ0JDMEFBQ0FCUWE3UGdJQUFhaTBBQUVjTnN3RWdBVUVGUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFaa0JJUkFNeXdJTElBQkJBRFlDQUNBUVFRRnFJUUZCQmlFUURMQUJDd0pBSUFRZ0FrY05BRUdhQVNFUURNb0NDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFGcUlSQUNRQU5BSUFRdEFBQWdBVUcwejRDQUFHb3RBQUJIRGJJQklBRkJBVVlOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHYUFTRVFETW9DQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUndoRUF5dkFRc0NRQ0FFSUFKSERRQkJtd0VoRUF6SkFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVCYWlFUUFrQURRQ0FFTFFBQUlBRkJ0cytBZ0FCcUxRQUFSdzJ4QVNBQlFRRkdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCbXdFaEVBekpBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRW5JUkFNcmdFTEFrQWdCQ0FDUncwQVFad0JJUkFNeUFJTEFrQUNRQ0FFTFFBQVFheC9hZzRDQUFHeEFRc2dCRUVCYWlFRVFZWUJJUkFNcndJTElBUkJBV29oQkVHSEFTRVFESzRDQ3dKQUlBUWdBa2NOQUVHZEFTRVFETWNDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRRnFJUkFDUUFOQUlBUXRBQUFnQVVHNHo0Q0FBR290QUFCSERhOEJJQUZCQVVZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR2RBU0VRRE1jQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVNZaEVBeXNBUXNDUUNBRUlBSkhEUUJCbmdFaEVBekdBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFQmFpRVFBa0FEUUNBRUxRQUFJQUZCdXMrQWdBQnFMUUFBUncydUFTQUJRUUZHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQm5nRWhFQXpHQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVESVJBTXF3RUxBa0FnQkNBQ1J3MEFRWjhCSVJBTXhRSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQW1vaEVBSkFBMEFnQkMwQUFDQUJRZTNQZ0lBQWFpMEFBRWNOclFFZ0FVRUNSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUVo4QklSQU14UUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJEQ0VRREtvQkN3SkFJQVFnQWtjTkFFR2dBU0VRRE1RQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUU5xSVJBQ1FBTkFJQVF0QUFBZ0FVRzh6NENBQUdvdEFBQkhEYXdCSUFGQkEwWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUdnQVNFUURNUUNDeUFBUVFBMkFnQWdFRUVCYWlFQlFRMGhFQXlwQVFzQ1FDQUVJQUpIRFFCQm9RRWhFQXpEQWdzQ1FBSkFJQVF0QUFCQnVuOXFEZ3NBckFHc0Fhd0JyQUdzQWF3QnJBR3NBYXdCQWF3QkN5QUVRUUZxSVFSQml3RWhFQXlxQWdzZ0JFRUJhaUVFUVl3QklSQU1xUUlMQWtBZ0JDQUNSdzBBUWFJQklSQU13Z0lMSUFRdEFBQkIwQUJIRGFrQklBUkJBV29oQkF6cEFRc0NRQ0FFSUFKSERRQkJvd0VoRUF6QkFnc0NRQUpBSUFRdEFBQkJ0MzlxRGdjQnFnR3FBYW9CcWdHcUFRQ3FBUXNnQkVFQmFpRUVRWTRCSVJBTXFBSUxJQVJCQVdvaEFVRWlJUkFNcGdFTEFrQWdCQ0FDUncwQVFhUUJJUkFNd0FJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBV29oRUFKQUEwQWdCQzBBQUNBQlFjRFBnSUFBYWkwQUFFY05xQUVnQVVFQlJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRYVFCSVJBTXdBSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkhTRVFES1VCQ3dKQUlBUWdBa2NOQUVHbEFTRVFETDhDQ3dKQUFrQWdCQzBBQUVHdWYyb09Bd0NvQVFHb0FRc2dCRUVCYWlFRVFaQUJJUkFNcGdJTElBUkJBV29oQVVFRUlSQU1wQUVMQWtBZ0JDQUNSdzBBUWFZQklSQU12Z0lMQWtBQ1FBSkFBa0FDUUNBRUxRQUFRYjkvYWc0VkFLb0JxZ0dxQWFvQnFnR3FBYW9CcWdHcUFhb0JBYW9CcWdFQ3FnR3FBUU9xQWFvQkJLb0JDeUFFUVFGcUlRUkJpQUVoRUF5b0Fnc2dCRUVCYWlFRVFZa0JJUkFNcHdJTElBUkJBV29oQkVHS0FTRVFES1lDQ3lBRVFRRnFJUVJCandFaEVBeWxBZ3NnQkVFQmFpRUVRWkVCSVJBTXBBSUxBa0FnQkNBQ1J3MEFRYWNCSVJBTXZRSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQW1vaEVBSkFBMEFnQkMwQUFDQUJRZTNQZ0lBQWFpMEFBRWNOcFFFZ0FVRUNSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUWFjQklSQU12UUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJFU0VRREtJQkN3SkFJQVFnQWtjTkFFR29BU0VRREx3Q0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUUpxSVJBQ1FBTkFJQVF0QUFBZ0FVSEN6NENBQUdvdEFBQkhEYVFCSUFGQkFrWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUdvQVNFUURMd0NDeUFBUVFBMkFnQWdFRUVCYWlFQlFTd2hFQXloQVFzQ1FDQUVJQUpIRFFCQnFRRWhFQXk3QWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUVhaUVRQWtBRFFDQUVMUUFBSUFGQnhjK0FnQUJxTFFBQVJ3MmpBU0FCUVFSR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJxUUVoRUF5N0Fnc2dBRUVBTmdJQUlCQkJBV29oQVVFcklSQU1vQUVMQWtBZ0JDQUNSdzBBUWFvQklSQU11Z0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFtb2hFQUpBQTBBZ0JDMEFBQ0FCUWNyUGdJQUFhaTBBQUVjTm9nRWdBVUVDUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFhb0JJUkFNdWdJTElBQkJBRFlDQUNBUVFRRnFJUUZCRkNFUURKOEJDd0pBSUFRZ0FrY05BRUdyQVNFUURMa0NDd0pBQWtBQ1FBSkFJQVF0QUFCQnZuOXFEZzhBQVFLa0FhUUJwQUdrQWFRQnBBR2tBYVFCcEFHa0FhUUJBNlFCQ3lBRVFRRnFJUVJCa3dFaEVBeWlBZ3NnQkVFQmFpRUVRWlFCSVJBTW9RSUxJQVJCQVdvaEJFR1ZBU0VRREtBQ0N5QUVRUUZxSVFSQmxnRWhFQXlmQWdzQ1FDQUVJQUpIRFFCQnJBRWhFQXk0QWdzZ0JDMEFBRUhGQUVjTm53RWdCRUVCYWlFRURPQUJDd0pBSUFRZ0FrY05BRUd0QVNFUURMY0NDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFKcUlSQUNRQU5BSUFRdEFBQWdBVUhOejRDQUFHb3RBQUJIRFo4QklBRkJBa1lOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHdEFTRVFETGNDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUTRoRUF5Y0FRc0NRQ0FFSUFKSERRQkJyZ0VoRUF5MkFnc2dCQzBBQUVIUUFFY05uUUVnQkVFQmFpRUJRU1VoRUF5YkFRc0NRQ0FFSUFKSERRQkJyd0VoRUF5MUFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVJYWlFUUFrQURRQ0FFTFFBQUlBRkIwTStBZ0FCcUxRQUFSdzJkQVNBQlFRaEdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCcndFaEVBeTFBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRXFJUkFNbWdFTEFrQWdCQ0FDUncwQVFiQUJJUkFNdEFJTEFrQUNRQ0FFTFFBQVFhdC9hZzRMQUowQm5RR2RBWjBCblFHZEFaMEJuUUdkQVFHZEFRc2dCRUVCYWlFRVFab0JJUkFNbXdJTElBUkJBV29oQkVHYkFTRVFESm9DQ3dKQUlBUWdBa2NOQUVHeEFTRVFETE1DQ3dKQUFrQWdCQzBBQUVHL2Yyb09GQUNjQVp3Qm5BR2NBWndCbkFHY0Fad0JuQUdjQVp3Qm5BR2NBWndCbkFHY0Fad0JuQUVCbkFFTElBUkJBV29oQkVHWkFTRVFESm9DQ3lBRVFRRnFJUVJCbkFFaEVBeVpBZ3NDUUNBRUlBSkhEUUJCc2dFaEVBeXlBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFRGFpRVFBa0FEUUNBRUxRQUFJQUZCMmMrQWdBQnFMUUFBUncyYUFTQUJRUU5HRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQnNnRWhFQXl5QWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVoSVJBTWx3RUxBa0FnQkNBQ1J3MEFRYk1CSVJBTXNRSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQm1vaEVBSkFBMEFnQkMwQUFDQUJRZDNQZ0lBQWFpMEFBRWNObVFFZ0FVRUdSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUWJNQklSQU1zUUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJHaUVRREpZQkN3SkFJQVFnQWtjTkFFRzBBU0VRRExBQ0N3SkFBa0FDUUNBRUxRQUFRYnQvYWc0UkFKb0JtZ0dhQVpvQm1nR2FBWm9CbWdHYUFRR2FBWm9CbWdHYUFab0JBcG9CQ3lBRVFRRnFJUVJCblFFaEVBeVlBZ3NnQkVFQmFpRUVRWjRCSVJBTWx3SUxJQVJCQVdvaEJFR2ZBU0VRREpZQ0N3SkFJQVFnQWtjTkFFRzFBU0VRREs4Q0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUVZxSVJBQ1FBTkFJQVF0QUFBZ0FVSGt6NENBQUdvdEFBQkhEWmNCSUFGQkJVWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUcxQVNFUURLOENDeUFBUVFBMkFnQWdFRUVCYWlFQlFTZ2hFQXlVQVFzQ1FDQUVJQUpIRFFCQnRnRWhFQXl1QWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUNhaUVRQWtBRFFDQUVMUUFBSUFGQjZzK0FnQUJxTFFBQVJ3MldBU0FCUVFKR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJ0Z0VoRUF5dUFnc2dBRUVBTmdJQUlCQkJBV29oQVVFSElSQU1rd0VMQWtBZ0JDQUNSdzBBUWJjQklSQU1yUUlMQWtBQ1FDQUVMUUFBUWJ0L2FnNE9BSllCbGdHV0FaWUJsZ0dXQVpZQmxnR1dBWllCbGdHV0FRR1dBUXNnQkVFQmFpRUVRYUVCSVJBTWxBSUxJQVJCQVdvaEJFR2lBU0VRREpNQ0N3SkFJQVFnQWtjTkFFRzRBU0VRREt3Q0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUUpxSVJBQ1FBTkFJQVF0QUFBZ0FVSHR6NENBQUdvdEFBQkhEWlFCSUFGQkFrWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUc0QVNFUURLd0NDeUFBUVFBMkFnQWdFRUVCYWlFQlFSSWhFQXlSQVFzQ1FDQUVJQUpIRFFCQnVRRWhFQXlyQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUJhaUVRQWtBRFFDQUVMUUFBSUFGQjhNK0FnQUJxTFFBQVJ3MlRBU0FCUVFGR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJ1UUVoRUF5ckFnc2dBRUVBTmdJQUlCQkJBV29oQVVFZ0lSQU1rQUVMQWtBZ0JDQUNSdzBBUWJvQklSQU1xZ0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFXb2hFQUpBQTBBZ0JDMEFBQ0FCUWZMUGdJQUFhaTBBQUVjTmtnRWdBVUVCUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFib0JJUkFNcWdJTElBQkJBRFlDQUNBUVFRRnFJUUZCRHlFUURJOEJDd0pBSUFRZ0FrY05BRUc3QVNFUURLa0NDd0pBQWtBZ0JDMEFBRUczZjJvT0J3Q1NBWklCa2dHU0FaSUJBWklCQ3lBRVFRRnFJUVJCcFFFaEVBeVFBZ3NnQkVFQmFpRUVRYVlCSVJBTWp3SUxBa0FnQkNBQ1J3MEFRYndCSVJBTXFBSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQjJvaEVBSkFBMEFnQkMwQUFDQUJRZlRQZ0lBQWFpMEFBRWNOa0FFZ0FVRUhSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUWJ3QklSQU1xQUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJHeUVRREkwQkN3SkFJQVFnQWtjTkFFRzlBU0VRREtjQ0N3SkFBa0FDUUNBRUxRQUFRYjUvYWc0U0FKRUJrUUdSQVpFQmtRR1JBWkVCa1FHUkFRR1JBWkVCa1FHUkFaRUJrUUVDa1FFTElBUkJBV29oQkVHa0FTRVFESThDQ3lBRVFRRnFJUVJCcHdFaEVBeU9BZ3NnQkVFQmFpRUVRYWdCSVJBTWpRSUxBa0FnQkNBQ1J3MEFRYjRCSVJBTXBnSUxJQVF0QUFCQnpnQkhEWTBCSUFSQkFXb2hCQXpQQVFzQ1FDQUVJQUpIRFFCQnZ3RWhFQXlsQWdzQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FFTFFBQVFiOS9hZzRWQUFFQ0E1d0JCQVVHbkFHY0Fad0JCd2dKQ2d1Y0FRd05EZytjQVFzZ0JFRUJhaUVCUWVnQUlSQU1tZ0lMSUFSQkFXb2hBVUhwQUNFUURKa0NDeUFFUVFGcUlRRkI3Z0FoRUF5WUFnc2dCRUVCYWlFQlFmSUFJUkFNbHdJTElBUkJBV29oQVVIekFDRVFESllDQ3lBRVFRRnFJUUZCOWdBaEVBeVZBZ3NnQkVFQmFpRUJRZmNBSVJBTWxBSUxJQVJCQVdvaEFVSDZBQ0VRREpNQ0N5QUVRUUZxSVFSQmd3RWhFQXlTQWdzZ0JFRUJhaUVFUVlRQklSQU1rUUlMSUFSQkFXb2hCRUdGQVNFUURKQUNDeUFFUVFGcUlRUkJrZ0VoRUF5UEFnc2dCRUVCYWlFRVFaZ0JJUkFNamdJTElBUkJBV29oQkVHZ0FTRVFESTBDQ3lBRVFRRnFJUVJCb3dFaEVBeU1BZ3NnQkVFQmFpRUVRYW9CSVJBTWl3SUxBa0FnQkNBQ1JnMEFJQUJCa0lDQWdBQTJBZ2dnQUNBRU5nSUVRYXNCSVJBTWl3SUxRY0FCSVJBTW93SUxJQUFnQlNBQ0VLcUFnSUFBSWdFTml3RWdCU0VCREZ3TEFrQWdCaUFDUmcwQUlBWkJBV29oQlF5TkFRdEJ3Z0VoRUF5aEFnc0RRQUpBSUJBdEFBQkJkbW9PQkl3QkFBQ1BBUUFMSUJCQkFXb2lFQ0FDUncwQUMwSERBU0VRREtBQ0N3SkFJQWNnQWtZTkFDQUFRWkdBZ0lBQU5nSUlJQUFnQnpZQ0JDQUhJUUZCQVNFUURJY0NDMEhFQVNFUURKOENDd0pBSUFjZ0FrY05BRUhGQVNFUURKOENDd0pBQWtBZ0J5MEFBRUYyYWc0RUFjNEJ6Z0VBemdFTElBZEJBV29oQmd5TkFRc2dCMEVCYWlFRkRJa0JDd0pBSUFjZ0FrY05BRUhHQVNFUURKNENDd0pBQWtBZ0J5MEFBRUYyYWc0WEFZOEJqd0VCandHUEFZOEJqd0dQQVk4Qmp3R1BBWThCandHUEFZOEJqd0dQQVk4Qmp3R1BBWThCQUk4QkN5QUhRUUZxSVFjTFFiQUJJUkFNaEFJTEFrQWdDQ0FDUncwQVFjZ0JJUkFNblFJTElBZ3RBQUJCSUVjTmpRRWdBRUVBT3dFeUlBaEJBV29oQVVHekFTRVFESU1DQ3lBQklSY0NRQU5BSUJjaUJ5QUNSZzBCSUFjdEFBQkJVR3BCL3dGeEloQkJDazhOekFFQ1FDQUFMd0V5SWhSQm1UTkxEUUFnQUNBVVFRcHNJaFE3QVRJZ0VFSC8vd056SUJSQi92OERjVWtOQUNBSFFRRnFJUmNnQUNBVUlCQnFJaEE3QVRJZ0VFSC8vd054UWVnSFNRMEJDd3RCQUNFUUlBQkJBRFlDSENBQVFjR0pnSUFBTmdJUUlBQkJEVFlDRENBQUlBZEJBV28yQWhRTW5BSUxRY2NCSVJBTW13SUxJQUFnQ0NBQ0VLNkFnSUFBSWhCRkRjb0JJQkJCRlVjTmpBRWdBRUhJQVRZQ0hDQUFJQWcyQWhRZ0FFSEpsNENBQURZQ0VDQUFRUlUyQWd4QkFDRVFESm9DQ3dKQUlBa2dBa2NOQUVITUFTRVFESm9DQzBFQUlSUkJBU0VYUVFFaEZrRUFJUkFDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQ1MwQUFFRlFhZzRLbGdHVkFRQUJBZ01FQlFZSWx3RUxRUUloRUF3R0MwRURJUkFNQlF0QkJDRVFEQVFMUVFVaEVBd0RDMEVHSVJBTUFndEJCeUVRREFFTFFRZ2hFQXRCQUNFWFFRQWhGa0VBSVJRTWpnRUxRUWtoRUVFQklSUkJBQ0VYUVFBaEZneU5BUXNDUUNBS0lBSkhEUUJCemdFaEVBeVpBZ3NnQ2kwQUFFRXVSdzJPQVNBS1FRRnFJUWtNeWdFTElBc2dBa2NOamdGQjBBRWhFQXlYQWdzQ1FDQUxJQUpHRFFBZ0FFR09nSUNBQURZQ0NDQUFJQXMyQWdSQnR3RWhFQXorQVF0QjBRRWhFQXlXQWdzQ1FDQUVJQUpIRFFCQjBnRWhFQXlXQWdzZ0FpQUVheUFBS0FJQUloQnFJUlFnQkNBUWEwRUVhaUVMQTBBZ0JDMEFBQ0FRUWZ6UGdJQUFhaTBBQUVjTmpnRWdFRUVFUmczcEFTQVFRUUZxSVJBZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFSFNBU0VRREpVQ0N5QUFJQXdnQWhDc2dJQ0FBQ0lCRFkwQklBd2hBUXk0QVFzQ1FDQUVJQUpIRFFCQjFBRWhFQXlVQWdzZ0FpQUVheUFBS0FJQUloQnFJUlFnQkNBUWEwRUJhaUVNQTBBZ0JDMEFBQ0FRUVlIUWdJQUFhaTBBQUVjTmp3RWdFRUVCUmcyT0FTQVFRUUZxSVJBZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFSFVBU0VRREpNQ0N3SkFJQVFnQWtjTkFFSFdBU0VRREpNQ0N5QUNJQVJySUFBb0FnQWlFR29oRkNBRUlCQnJRUUpxSVFzRFFDQUVMUUFBSUJCQmc5Q0FnQUJxTFFBQVJ3Mk9BU0FRUVFKR0RaQUJJQkJCQVdvaEVDQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRZFlCSVJBTWtnSUxBa0FnQkNBQ1J3MEFRZGNCSVJBTWtnSUxBa0FDUUNBRUxRQUFRYnQvYWc0UUFJOEJqd0dQQVk4Qmp3R1BBWThCandHUEFZOEJqd0dQQVk4Qmp3RUJqd0VMSUFSQkFXb2hCRUc3QVNFUURQa0JDeUFFUVFGcUlRUkJ2QUVoRUF6NEFRc0NRQ0FFSUFKSERRQkIyQUVoRUF5UkFnc2dCQzBBQUVISUFFY05qQUVnQkVFQmFpRUVETVFCQ3dKQUlBUWdBa1lOQUNBQVFaQ0FnSUFBTmdJSUlBQWdCRFlDQkVHK0FTRVFEUGNCQzBIWkFTRVFESThDQ3dKQUlBUWdBa2NOQUVIYUFTRVFESThDQ3lBRUxRQUFRY2dBUmczREFTQUFRUUU2QUNnTXVRRUxJQUJCQWpvQUx5QUFJQVFnQWhDbWdJQ0FBQ0lRRFkwQlFjSUJJUkFNOUFFTElBQXRBQ2hCZjJvT0FyY0J1UUc0QVFzRFFBSkFJQVF0QUFCQmRtb09CQUNPQVk0QkFJNEJDeUFFUVFGcUlnUWdBa2NOQUF0QjNRRWhFQXlMQWdzZ0FFRUFPZ0F2SUFBdEFDMUJCSEZGRFlRQ0N5QUFRUUE2QUM4Z0FFRUJPZ0EwSUFFaEFReU1BUXNnRUVFVlJnM2FBU0FBUVFBMkFod2dBQ0FCTmdJVUlBQkJwNDZBZ0FBMkFoQWdBRUVTTmdJTVFRQWhFQXlJQWdzQ1FDQUFJQkFnQWhDMGdJQ0FBQ0lFRFFBZ0VDRUJESUVDQ3dKQUlBUkJGVWNOQUNBQVFRTTJBaHdnQUNBUU5nSVVJQUJCc0ppQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF5SUFnc2dBRUVBTmdJY0lBQWdFRFlDRkNBQVFhZU9nSUFBTmdJUUlBQkJFallDREVFQUlSQU1od0lMSUJCQkZVWU4xZ0VnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRZHFOZ0lBQU5nSVFJQUJCRkRZQ0RFRUFJUkFNaGdJTElBQW9BZ1FoRnlBQVFRQTJBZ1FnRUNBUnAyb2lGaUVCSUFBZ0Z5QVFJQllnRkJzaUVCQzFnSUNBQUNJVVJRMk5BU0FBUVFjMkFod2dBQ0FRTmdJVUlBQWdGRFlDREVFQUlSQU1oUUlMSUFBZ0FDOEJNRUdBQVhJN0FUQWdBU0VCQzBFcUlSQU02Z0VMSUJCQkZVWU4wUUVnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRWU9NZ0lBQU5nSVFJQUJCRXpZQ0RFRUFJUkFNZ2dJTElCQkJGVVlOendFZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUVpxUGdJQUFOZ0lRSUFCQklqWUNERUVBSVJBTWdRSUxJQUFvQWdRaEVDQUFRUUEyQWdRQ1FDQUFJQkFnQVJDM2dJQ0FBQ0lRRFFBZ0FVRUJhaUVCREkwQkN5QUFRUXcyQWh3Z0FDQVFOZ0lNSUFBZ0FVRUJhallDRkVFQUlSQU1nQUlMSUJCQkZVWU56QUVnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRWnFQZ0lBQU5nSVFJQUJCSWpZQ0RFRUFJUkFNL3dFTElBQW9BZ1FoRUNBQVFRQTJBZ1FDUUNBQUlCQWdBUkMzZ0lDQUFDSVFEUUFnQVVFQmFpRUJESXdCQ3lBQVFRMDJBaHdnQUNBUU5nSU1JQUFnQVVFQmFqWUNGRUVBSVJBTS9nRUxJQkJCRlVZTnlRRWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFjYU1nSUFBTmdJUUlBQkJJellDREVFQUlSQU0vUUVMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQzVnSUNBQUNJUURRQWdBVUVCYWlFQkRJc0JDeUFBUVE0MkFod2dBQ0FRTmdJTUlBQWdBVUVCYWpZQ0ZFRUFJUkFNL0FFTElBQkJBRFlDSENBQUlBRTJBaFFnQUVIQWxZQ0FBRFlDRUNBQVFRSTJBZ3hCQUNFUURQc0JDeUFRUVJWR0RjVUJJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSEdqSUNBQURZQ0VDQUFRU00yQWd4QkFDRVFEUG9CQ3lBQVFSQTJBaHdnQUNBQk5nSVVJQUFnRURZQ0RFRUFJUkFNK1FFTElBQW9BZ1FoQkNBQVFRQTJBZ1FDUUNBQUlBUWdBUkM1Z0lDQUFDSUVEUUFnQVVFQmFpRUJEUEVCQ3lBQVFSRTJBaHdnQUNBRU5nSU1JQUFnQVVFQmFqWUNGRUVBSVJBTStBRUxJQkJCRlVZTndRRWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFjYU1nSUFBTmdJUUlBQkJJellDREVFQUlSQU05d0VMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQzVnSUNBQUNJUURRQWdBVUVCYWlFQkRJZ0JDeUFBUVJNMkFod2dBQ0FRTmdJTUlBQWdBVUVCYWpZQ0ZFRUFJUkFNOWdFTElBQW9BZ1FoQkNBQVFRQTJBZ1FDUUNBQUlBUWdBUkM1Z0lDQUFDSUVEUUFnQVVFQmFpRUJETzBCQ3lBQVFSUTJBaHdnQUNBRU5nSU1JQUFnQVVFQmFqWUNGRUVBSVJBTTlRRUxJQkJCRlVZTnZRRWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFacVBnSUFBTmdJUUlBQkJJallDREVFQUlSQU05QUVMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQzNnSUNBQUNJUURRQWdBVUVCYWlFQkRJWUJDeUFBUVJZMkFod2dBQ0FRTmdJTUlBQWdBVUVCYWpZQ0ZFRUFJUkFNOHdFTElBQW9BZ1FoQkNBQVFRQTJBZ1FDUUNBQUlBUWdBUkMzZ0lDQUFDSUVEUUFnQVVFQmFpRUJET2tCQ3lBQVFSYzJBaHdnQUNBRU5nSU1JQUFnQVVFQmFqWUNGRUVBSVJBTThnRUxJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSE5rNENBQURZQ0VDQUFRUXcyQWd4QkFDRVFEUEVCQzBJQklSRUxJQkJCQVdvaEFRSkFJQUFwQXlBaUVrTC8vLy8vLy8vLy93OVdEUUFnQUNBU1FnU0dJQkdFTndNZ0lBRWhBUXlFQVFzZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWEySmdJQUFOZ0lRSUFCQkREWUNERUVBSVJBTTd3RUxJQUJCQURZQ0hDQUFJQkEyQWhRZ0FFSE5rNENBQURZQ0VDQUFRUXcyQWd4QkFDRVFETzRCQ3lBQUtBSUVJUmNnQUVFQU5nSUVJQkFnRWFkcUloWWhBU0FBSUJjZ0VDQVdJQlFiSWhBUXRZQ0FnQUFpRkVVTmN5QUFRUVUyQWh3Z0FDQVFOZ0lVSUFBZ0ZEWUNERUVBSVJBTTdRRUxJQUJCQURZQ0hDQUFJQkEyQWhRZ0FFR3FuSUNBQURZQ0VDQUFRUTgyQWd4QkFDRVFET3dCQ3lBQUlCQWdBaEMwZ0lDQUFDSUJEUUVnRUNFQkMwRU9JUkFNMFFFTEFrQWdBVUVWUncwQUlBQkJBallDSENBQUlCQTJBaFFnQUVHd21JQ0FBRFlDRUNBQVFSVTJBZ3hCQUNFUURPb0JDeUFBUVFBMkFod2dBQ0FRTmdJVUlBQkJwNDZBZ0FBMkFoQWdBRUVTTmdJTVFRQWhFQXpwQVFzZ0FVRUJhaUVRQWtBZ0FDOEJNQ0lCUVlBQmNVVU5BQUpBSUFBZ0VDQUNFTHVBZ0lBQUlnRU5BQ0FRSVFFTWNBc2dBVUVWUncyNkFTQUFRUVUyQWh3Z0FDQVFOZ0lVSUFCQitaZUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBenBBUXNDUUNBQlFhQUVjVUdnQkVjTkFDQUFMUUF0UVFKeERRQWdBRUVBTmdJY0lBQWdFRFlDRkNBQVFaYVRnSUFBTmdJUUlBQkJCRFlDREVFQUlSQU02UUVMSUFBZ0VDQUNFTDJBZ0lBQUdpQVFJUUVDUUFKQUFrQUNRQUpBSUFBZ0VDQUNFTE9BZ0lBQURoWUNBUUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFEQkFzZ0FFRUJPZ0F1Q3lBQUlBQXZBVEJCd0FCeU93RXdJQkFoQVF0QkppRVFETkVCQ3lBQVFTTTJBaHdnQUNBUU5nSVVJQUJCcFphQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF6cEFRc2dBRUVBTmdJY0lBQWdFRFlDRkNBQVFkV0xnSUFBTmdJUUlBQkJFVFlDREVFQUlSQU02QUVMSUFBdEFDMUJBWEZGRFFGQnd3RWhFQXpPQVFzQ1FDQU5JQUpHRFFBRFFBSkFJQTB0QUFCQklFWU5BQ0FOSVFFTXhBRUxJQTFCQVdvaURTQUNSdzBBQzBFbElSQU01d0VMUVNVaEVBem1BUXNnQUNnQ0JDRUVJQUJCQURZQ0JDQUFJQVFnRFJDdmdJQ0FBQ0lFUlEydEFTQUFRU1kyQWh3Z0FDQUVOZ0lNSUFBZ0RVRUJhallDRkVFQUlSQU01UUVMSUJCQkZVWU5xd0VnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRZjJOZ0lBQU5nSVFJQUJCSFRZQ0RFRUFJUkFNNUFFTElBQkJKellDSENBQUlBRTJBaFFnQUNBUU5nSU1RUUFoRUF6akFRc2dFQ0VCUVFFaEZBSkFBa0FDUUFKQUFrQUNRQUpBSUFBdEFDeEJmbW9PQndZRkJRTUJBZ0FGQ3lBQUlBQXZBVEJCQ0hJN0FUQU1Bd3RCQWlFVURBRUxRUVFoRkFzZ0FFRUJPZ0FzSUFBZ0FDOEJNQ0FVY2pzQk1Bc2dFQ0VCQzBFcklSQU15Z0VMSUFCQkFEWUNIQ0FBSUJBMkFoUWdBRUdya29DQUFEWUNFQ0FBUVFzMkFneEJBQ0VRRE9JQkN5QUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQjRZK0FnQUEyQWhBZ0FFRUtOZ0lNUVFBaEVBemhBUXNnQUVFQU9nQXNJQkFoQVF5OUFRc2dFQ0VCUVFFaEZBSkFBa0FDUUFKQUFrQWdBQzBBTEVGN2FnNEVBd0VDQUFVTElBQWdBQzhCTUVFSWNqc0JNQXdEQzBFQ0lSUU1BUXRCQkNFVUN5QUFRUUU2QUN3Z0FDQUFMd0V3SUJSeU93RXdDeUFRSVFFTFFTa2hFQXpGQVFzZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWZDVWdJQUFOZ0lRSUFCQkF6WUNERUVBSVJBTTNRRUxBa0FnRGkwQUFFRU5SdzBBSUFBb0FnUWhBU0FBUVFBMkFnUUNRQ0FBSUFFZ0RoQ3hnSUNBQUNJQkRRQWdEa0VCYWlFQkRIVUxJQUJCTERZQ0hDQUFJQUUyQWd3Z0FDQU9RUUZxTmdJVVFRQWhFQXpkQVFzZ0FDMEFMVUVCY1VVTkFVSEVBU0VRRE1NQkN3SkFJQTRnQWtjTkFFRXRJUkFNM0FFTEFrQUNRQU5BQWtBZ0RpMEFBRUYyYWc0RUFnQUFBd0FMSUE1QkFXb2lEaUFDUncwQUMwRXRJUkFNM1FFTElBQW9BZ1FoQVNBQVFRQTJBZ1FDUUNBQUlBRWdEaEN4Z0lDQUFDSUJEUUFnRGlFQkRIUUxJQUJCTERZQ0hDQUFJQTQyQWhRZ0FDQUJOZ0lNUVFBaEVBemNBUXNnQUNnQ0JDRUJJQUJCQURZQ0JBSkFJQUFnQVNBT0VMR0FnSUFBSWdFTkFDQU9RUUZxSVFFTWN3c2dBRUVzTmdJY0lBQWdBVFlDRENBQUlBNUJBV28yQWhSQkFDRVFETnNCQ3lBQUtBSUVJUVFnQUVFQU5nSUVJQUFnQkNBT0VMR0FnSUFBSWdRTm9BRWdEaUVCRE00QkN5QVFRU3hIRFFFZ0FVRUJhaUVRUVFFaEFRSkFBa0FDUUFKQUFrQWdBQzBBTEVGN2FnNEVBd0VDQkFBTElCQWhBUXdFQzBFQ0lRRU1BUXRCQkNFQkN5QUFRUUU2QUN3Z0FDQUFMd0V3SUFGeU93RXdJQkFoQVF3QkN5QUFJQUF2QVRCQkNISTdBVEFnRUNFQkMwRTVJUkFNdndFTElBQkJBRG9BTENBQklRRUxRVFFoRUF5OUFRc2dBQ0FBTHdFd1FTQnlPd0V3SUFFaEFRd0NDeUFBS0FJRUlRUWdBRUVBTmdJRUFrQWdBQ0FFSUFFUXNZQ0FnQUFpQkEwQUlBRWhBUXpIQVFzZ0FFRTNOZ0ljSUFBZ0FUWUNGQ0FBSUFRMkFneEJBQ0VRRE5RQkN5QUFRUWc2QUN3Z0FTRUJDMEV3SVJBTXVRRUxBa0FnQUMwQUtFRUJSZzBBSUFFaEFRd0VDeUFBTFFBdFFRaHhSUTJUQVNBQklRRU1Bd3NnQUMwQU1FRWdjUTJVQVVIRkFTRVFETGNCQ3dKQUlBOGdBa1lOQUFKQUEwQUNRQ0FQTFFBQVFWQnFJZ0ZCL3dGeFFRcEpEUUFnRHlFQlFUVWhFQXk2QVFzZ0FDa0RJQ0lSUXBtejVzeVpzK2JNR1ZZTkFTQUFJQkZDQ240aUVUY0RJQ0FSSUFHdFF2OEJneUlTUW4rRlZnMEJJQUFnRVNBU2ZEY0RJQ0FQUVFGcUlnOGdBa2NOQUF0Qk9TRVFETkVCQ3lBQUtBSUVJUUlnQUVFQU5nSUVJQUFnQWlBUFFRRnFJZ1FRc1lDQWdBQWlBZzJWQVNBRUlRRU13d0VMUVRraEVBelBBUXNDUUNBQUx3RXdJZ0ZCQ0hGRkRRQWdBQzBBS0VFQlJ3MEFJQUF0QUMxQkNIRkZEWkFCQ3lBQUlBRkI5L3NEY1VHQUJISTdBVEFnRHlFQkMwRTNJUkFNdEFFTElBQWdBQzhCTUVFUWNqc0JNQXlyQVFzZ0VFRVZSZzJMQVNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCOEk2QWdBQTJBaEFnQUVFY05nSU1RUUFoRUF6TEFRc2dBRUhEQURZQ0hDQUFJQUUyQWd3Z0FDQU5RUUZxTmdJVVFRQWhFQXpLQVFzQ1FDQUJMUUFBUVRwSERRQWdBQ2dDQkNFUUlBQkJBRFlDQkFKQUlBQWdFQ0FCRUsrQWdJQUFJaEFOQUNBQlFRRnFJUUVNWXdzZ0FFSERBRFlDSENBQUlCQTJBZ3dnQUNBQlFRRnFOZ0lVUVFBaEVBektBUXNnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRYkdSZ0lBQU5nSVFJQUJCQ2pZQ0RFRUFJUkFNeVFFTElBQkJBRFlDSENBQUlBRTJBaFFnQUVHZ21ZQ0FBRFlDRUNBQVFSNDJBZ3hCQUNFUURNZ0JDeUFBUVFBMkFnQUxJQUJCZ0JJN0FTb2dBQ0FYUVFGcUlnRWdBaENvZ0lDQUFDSVFEUUVnQVNFQkMwSEhBQ0VRREt3QkN5QVFRUlZIRFlNQklBQkIwUUEyQWh3Z0FDQUJOZ0lVSUFCQjQ1ZUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBekVBUXNnQUNnQ0JDRVFJQUJCQURZQ0JBSkFJQUFnRUNBQkVLZUFnSUFBSWhBTkFDQUJJUUVNWGdzZ0FFSFNBRFlDSENBQUlBRTJBaFFnQUNBUU5nSU1RUUFoRUF6REFRc2dBRUVBTmdJY0lBQWdGRFlDRkNBQVFjR29nSUFBTmdJUUlBQkJCellDRENBQVFRQTJBZ0JCQUNFUURNSUJDeUFBS0FJRUlSQWdBRUVBTmdJRUFrQWdBQ0FRSUFFUXA0Q0FnQUFpRUEwQUlBRWhBUXhkQ3lBQVFkTUFOZ0ljSUFBZ0FUWUNGQ0FBSUJBMkFneEJBQ0VRRE1FQkMwRUFJUkFnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRWUNSZ0lBQU5nSVFJQUJCQ1RZQ0RBekFBUXNnRUVFVlJnMTlJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFR1VqWUNBQURZQ0VDQUFRU0UyQWd4QkFDRVFETDhCQzBFQklSWkJBQ0VYUVFBaEZFRUJJUkFMSUFBZ0VEb0FLeUFCUVFGcUlRRUNRQUpBSUFBdEFDMUJFSEVOQUFKQUFrQUNRQ0FBTFFBcURnTUJBQUlFQ3lBV1JRMEREQUlMSUJRTkFRd0NDeUFYUlEwQkN5QUFLQUlFSVJBZ0FFRUFOZ0lFQWtBZ0FDQVFJQUVRcllDQWdBQWlFQTBBSUFFaEFReGNDeUFBUWRnQU5nSWNJQUFnQVRZQ0ZDQUFJQkEyQWd4QkFDRVFETDRCQ3lBQUtBSUVJUVFnQUVFQU5nSUVBa0FnQUNBRUlBRVFyWUNBZ0FBaUJBMEFJQUVoQVF5dEFRc2dBRUhaQURZQ0hDQUFJQUUyQWhRZ0FDQUVOZ0lNUVFBaEVBeTlBUXNnQUNnQ0JDRUVJQUJCQURZQ0JBSkFJQUFnQkNBQkVLMkFnSUFBSWdRTkFDQUJJUUVNcXdFTElBQkIyZ0EyQWh3Z0FDQUJOZ0lVSUFBZ0JEWUNERUVBSVJBTXZBRUxJQUFvQWdRaEJDQUFRUUEyQWdRQ1FDQUFJQVFnQVJDdGdJQ0FBQ0lFRFFBZ0FTRUJES2tCQ3lBQVFkd0FOZ0ljSUFBZ0FUWUNGQ0FBSUFRMkFneEJBQ0VRRExzQkN3SkFJQUV0QUFCQlVHb2lFRUgvQVhGQkNrOE5BQ0FBSUJBNkFDb2dBVUVCYWlFQlFjOEFJUkFNb2dFTElBQW9BZ1FoQkNBQVFRQTJBZ1FDUUNBQUlBUWdBUkN0Z0lDQUFDSUVEUUFnQVNFQkRLY0JDeUFBUWQ0QU5nSWNJQUFnQVRZQ0ZDQUFJQVEyQWd4QkFDRVFETG9CQ3lBQVFRQTJBZ0FnRjBFQmFpRUJBa0FnQUMwQUtVRWpUdzBBSUFFaEFReFpDeUFBUVFBMkFod2dBQ0FCTmdJVUlBQkIwNG1BZ0FBMkFoQWdBRUVJTmdJTVFRQWhFQXk1QVFzZ0FFRUFOZ0lBQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFaQ3pnSUFBTmdJUUlBQkJDRFlDREF5M0FRc2dBRUVBTmdJQUlCZEJBV29oQVFKQUlBQXRBQ2xCSVVjTkFDQUJJUUVNVmdzZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUVp1S2dJQUFOZ0lRSUFCQkNEWUNERUVBSVJBTXRnRUxJQUJCQURZQ0FDQVhRUUZxSVFFQ1FDQUFMUUFwSWhCQlhXcEJDMDhOQUNBQklRRU1WUXNDUUNBUVFRWkxEUUJCQVNBUWRFSEtBSEZGRFFBZ0FTRUJERlVMUVFBaEVDQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQjk0bUFnQUEyQWhBZ0FFRUlOZ0lNRExVQkN5QVFRUlZHRFhFZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWJtTmdJQUFOZ0lRSUFCQkdqWUNERUVBSVJBTXRBRUxJQUFvQWdRaEVDQUFRUUEyQWdRQ1FDQUFJQkFnQVJDbmdJQ0FBQ0lRRFFBZ0FTRUJERlFMSUFCQjVRQTJBaHdnQUNBQk5nSVVJQUFnRURZQ0RFRUFJUkFNc3dFTElBQW9BZ1FoRUNBQVFRQTJBZ1FDUUNBQUlCQWdBUkNuZ0lDQUFDSVFEUUFnQVNFQkRFMExJQUJCMGdBMkFod2dBQ0FCTmdJVUlBQWdFRFlDREVFQUlSQU1zZ0VMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQ25nSUNBQUNJUURRQWdBU0VCREUwTElBQkIwd0EyQWh3Z0FDQUJOZ0lVSUFBZ0VEWUNERUVBSVJBTXNRRUxJQUFvQWdRaEVDQUFRUUEyQWdRQ1FDQUFJQkFnQVJDbmdJQ0FBQ0lRRFFBZ0FTRUJERkVMSUFCQjVRQTJBaHdnQUNBQk5nSVVJQUFnRURZQ0RFRUFJUkFNc0FFTElBQkJBRFlDSENBQUlBRTJBaFFnQUVIR2lvQ0FBRFlDRUNBQVFRYzJBZ3hCQUNFUURLOEJDeUFBS0FJRUlSQWdBRUVBTmdJRUFrQWdBQ0FRSUFFUXA0Q0FnQUFpRUEwQUlBRWhBUXhKQ3lBQVFkSUFOZ0ljSUFBZ0FUWUNGQ0FBSUJBMkFneEJBQ0VRREs0QkN5QUFLQUlFSVJBZ0FFRUFOZ0lFQWtBZ0FDQVFJQUVRcDRDQWdBQWlFQTBBSUFFaEFReEpDeUFBUWRNQU5nSWNJQUFnQVRZQ0ZDQUFJQkEyQWd4QkFDRVFESzBCQ3lBQUtBSUVJUkFnQUVFQU5nSUVBa0FnQUNBUUlBRVFwNENBZ0FBaUVBMEFJQUVoQVF4TkN5QUFRZVVBTmdJY0lBQWdBVFlDRkNBQUlCQTJBZ3hCQUNFUURLd0JDeUFBUVFBMkFod2dBQ0FCTmdJVUlBQkIzSWlBZ0FBMkFoQWdBRUVITmdJTVFRQWhFQXlyQVFzZ0VFRS9SdzBCSUFGQkFXb2hBUXRCQlNFUURKQUJDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWYyU2dJQUFOZ0lRSUFCQkJ6WUNEQXlvQVFzZ0FDZ0NCQ0VRSUFCQkFEWUNCQUpBSUFBZ0VDQUJFS2VBZ0lBQUloQU5BQ0FCSVFFTVFnc2dBRUhTQURZQ0hDQUFJQUUyQWhRZ0FDQVFOZ0lNUVFBaEVBeW5BUXNnQUNnQ0JDRVFJQUJCQURZQ0JBSkFJQUFnRUNBQkVLZUFnSUFBSWhBTkFDQUJJUUVNUWdzZ0FFSFRBRFlDSENBQUlBRTJBaFFnQUNBUU5nSU1RUUFoRUF5bUFRc2dBQ2dDQkNFUUlBQkJBRFlDQkFKQUlBQWdFQ0FCRUtlQWdJQUFJaEFOQUNBQklRRU1SZ3NnQUVIbEFEWUNIQ0FBSUFFMkFoUWdBQ0FRTmdJTVFRQWhFQXlsQVFzZ0FDZ0NCQ0VCSUFCQkFEWUNCQUpBSUFBZ0FTQVVFS2VBZ0lBQUlnRU5BQ0FVSVFFTVB3c2dBRUhTQURZQ0hDQUFJQlEyQWhRZ0FDQUJOZ0lNUVFBaEVBeWtBUXNnQUNnQ0JDRUJJQUJCQURZQ0JBSkFJQUFnQVNBVUVLZUFnSUFBSWdFTkFDQVVJUUVNUHdzZ0FFSFRBRFlDSENBQUlCUTJBaFFnQUNBQk5nSU1RUUFoRUF5akFRc2dBQ2dDQkNFQklBQkJBRFlDQkFKQUlBQWdBU0FVRUtlQWdJQUFJZ0VOQUNBVUlRRU1Rd3NnQUVIbEFEWUNIQ0FBSUJRMkFoUWdBQ0FCTmdJTVFRQWhFQXlpQVFzZ0FFRUFOZ0ljSUFBZ0ZEWUNGQ0FBUWNPUGdJQUFOZ0lRSUFCQkJ6WUNERUVBSVJBTW9RRUxJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSERqNENBQURZQ0VDQUFRUWMyQWd4QkFDRVFES0FCQzBFQUlSQWdBRUVBTmdJY0lBQWdGRFlDRkNBQVFZeWNnSUFBTmdJUUlBQkJCellDREF5ZkFRc2dBRUVBTmdJY0lBQWdGRFlDRkNBQVFZeWNnSUFBTmdJUUlBQkJCellDREVFQUlSQU1uZ0VMSUFCQkFEWUNIQ0FBSUJRMkFoUWdBRUgra1lDQUFEWUNFQ0FBUVFjMkFneEJBQ0VRREowQkN5QUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQmpwdUFnQUEyQWhBZ0FFRUdOZ0lNUVFBaEVBeWNBUXNnRUVFVlJnMVhJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSE1qb0NBQURZQ0VDQUFRU0EyQWd4QkFDRVFESnNCQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRU1FoRUFzZ0FDQVFPZ0FwSUFBb0FnUWhFQ0FBUVFBMkFnUWdBQ0FRSUFFUXE0Q0FnQUFpRUExVUlBRWhBUXcrQ3lBQVFRQTJBZ0FMUVFBaEVDQUFRUUEyQWh3Z0FDQUVOZ0lVSUFCQjhadUFnQUEyQWhBZ0FFRUdOZ0lNREpjQkN5QUJRUlZHRFZBZ0FFRUFOZ0ljSUFBZ0JUWUNGQ0FBUWZDTWdJQUFOZ0lRSUFCQkd6WUNERUVBSVJBTWxnRUxJQUFvQWdRaEJTQUFRUUEyQWdRZ0FDQUZJQkFRcVlDQWdBQWlCUTBCSUJCQkFXb2hCUXRCclFFaEVBeDdDeUFBUWNFQk5nSWNJQUFnQlRZQ0RDQUFJQkJCQVdvMkFoUkJBQ0VRREpNQkN5QUFLQUlFSVFZZ0FFRUFOZ0lFSUFBZ0JpQVFFS21BZ0lBQUlnWU5BU0FRUVFGcUlRWUxRYTRCSVJBTWVBc2dBRUhDQVRZQ0hDQUFJQVkyQWd3Z0FDQVFRUUZxTmdJVVFRQWhFQXlRQVFzZ0FFRUFOZ0ljSUFBZ0J6WUNGQ0FBUVplTGdJQUFOZ0lRSUFCQkRUWUNERUVBSVJBTWp3RUxJQUJCQURZQ0hDQUFJQWcyQWhRZ0FFSGprSUNBQURZQ0VDQUFRUWsyQWd4QkFDRVFESTRCQ3lBQVFRQTJBaHdnQUNBSU5nSVVJQUJCbEkyQWdBQTJBaEFnQUVFaE5nSU1RUUFoRUF5TkFRdEJBU0VXUVFBaEYwRUFJUlJCQVNFUUN5QUFJQkE2QUNzZ0NVRUJhaUVJQWtBQ1FDQUFMUUF0UVJCeERRQUNRQUpBQWtBZ0FDMEFLZzREQVFBQ0JBc2dGa1VOQXd3Q0N5QVVEUUVNQWdzZ0YwVU5BUXNnQUNnQ0JDRVFJQUJCQURZQ0JDQUFJQkFnQ0JDdGdJQ0FBQ0lRUlEwOUlBQkJ5UUUyQWh3Z0FDQUlOZ0lVSUFBZ0VEWUNERUVBSVJBTWpBRUxJQUFvQWdRaEJDQUFRUUEyQWdRZ0FDQUVJQWdRcllDQWdBQWlCRVVOZGlBQVFjb0JOZ0ljSUFBZ0NEWUNGQ0FBSUFRMkFneEJBQ0VRRElzQkN5QUFLQUlFSVFRZ0FFRUFOZ0lFSUFBZ0JDQUpFSzJBZ0lBQUlnUkZEWFFnQUVITEFUWUNIQ0FBSUFrMkFoUWdBQ0FFTmdJTVFRQWhFQXlLQVFzZ0FDZ0NCQ0VFSUFCQkFEWUNCQ0FBSUFRZ0NoQ3RnSUNBQUNJRVJRMXlJQUJCelFFMkFod2dBQ0FLTmdJVUlBQWdCRFlDREVFQUlSQU1pUUVMQWtBZ0N5MEFBRUZRYWlJUVFmOEJjVUVLVHcwQUlBQWdFRG9BS2lBTFFRRnFJUXBCdGdFaEVBeHdDeUFBS0FJRUlRUWdBRUVBTmdJRUlBQWdCQ0FMRUsyQWdJQUFJZ1JGRFhBZ0FFSFBBVFlDSENBQUlBczJBaFFnQUNBRU5nSU1RUUFoRUF5SUFRc2dBRUVBTmdJY0lBQWdCRFlDRkNBQVFaQ3pnSUFBTmdJUUlBQkJDRFlDRENBQVFRQTJBZ0JCQUNFUURJY0JDeUFCUVJWR0RUOGdBRUVBTmdJY0lBQWdERFlDRkNBQVFjeU9nSUFBTmdJUUlBQkJJRFlDREVFQUlSQU1oZ0VMSUFCQmdRUTdBU2dnQUNnQ0JDRVFJQUJDQURjREFDQUFJQkFnREVFQmFpSU1FS3VBZ0lBQUloQkZEVGdnQUVIVEFUWUNIQ0FBSUF3MkFoUWdBQ0FRTmdJTVFRQWhFQXlGQVFzZ0FFRUFOZ0lBQzBFQUlSQWdBRUVBTmdJY0lBQWdCRFlDRkNBQVFkaWJnSUFBTmdJUUlBQkJDRFlDREF5REFRc2dBQ2dDQkNFUUlBQkNBRGNEQUNBQUlCQWdDMEVCYWlJTEVLdUFnSUFBSWhBTkFVSEdBU0VRREdrTElBQkJBam9BS0F4VkN5QUFRZFVCTmdJY0lBQWdDellDRkNBQUlCQTJBZ3hCQUNFUURJQUJDeUFRUVJWR0RUY2dBRUVBTmdJY0lBQWdCRFlDRkNBQVFhU01nSUFBTmdJUUlBQkJFRFlDREVFQUlSQU1md3NnQUMwQU5FRUJSdzAwSUFBZ0JDQUNFTHlBZ0lBQUloQkZEVFFnRUVFVlJ3MDFJQUJCM0FFMkFod2dBQ0FFTmdJVUlBQkIxWmFBZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXgrQzBFQUlSQWdBRUVBTmdJY0lBQkJyNHVBZ0FBMkFoQWdBRUVDTmdJTUlBQWdGRUVCYWpZQ0ZBeDlDMEVBSVJBTVl3dEJBaUVRREdJTFFRMGhFQXhoQzBFUElSQU1ZQXRCSlNFUURGOExRUk1oRUF4ZUMwRVZJUkFNWFF0QkZpRVFERndMUVJjaEVBeGJDMEVZSVJBTVdndEJHU0VRREZrTFFSb2hFQXhZQzBFYklSQU1Wd3RCSENFUURGWUxRUjBoRUF4VkMwRWZJUkFNVkF0QklTRVFERk1MUVNNaEVBeFNDMEhHQUNFUURGRUxRUzRoRUF4UUMwRXZJUkFNVHd0Qk95RVFERTRMUVQwaEVBeE5DMEhJQUNFUURFd0xRY2tBSVJBTVN3dEJ5d0FoRUF4S0MwSE1BQ0VRREVrTFFjNEFJUkFNU0F0QjBRQWhFQXhIQzBIVkFDRVFERVlMUWRnQUlSQU1SUXRCMlFBaEVBeEVDMEhiQUNFUURFTUxRZVFBSVJBTVFndEI1UUFoRUF4QkMwSHhBQ0VRREVBTFFmUUFJUkFNUHd0QmpRRWhFQXcrQzBHWEFTRVFERDBMUWFrQklSQU1QQXRCckFFaEVBdzdDMEhBQVNFUUREb0xRYmtCSVJBTU9RdEJyd0VoRUF3NEMwR3hBU0VRRERjTFFiSUJJUkFNTmd0QnRBRWhFQXcxQzBHMUFTRVFERFFMUWJvQklSQU1Nd3RCdlFFaEVBd3lDMEcvQVNFUURERUxRY0VCSVJBTU1Bc2dBRUVBTmdJY0lBQWdCRFlDRkNBQVFlbUxnSUFBTmdJUUlBQkJIellDREVFQUlSQU1TQXNnQUVIYkFUWUNIQ0FBSUFRMkFoUWdBRUg2bG9DQUFEWUNFQ0FBUVJVMkFneEJBQ0VRREVjTElBQkIrQUEyQWh3Z0FDQU1OZ0lVSUFCQnlwaUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBeEdDeUFBUWRFQU5nSWNJQUFnQlRZQ0ZDQUFRYkNYZ0lBQU5nSVFJQUJCRlRZQ0RFRUFJUkFNUlFzZ0FFSDVBRFlDSENBQUlBRTJBaFFnQUNBUU5nSU1RUUFoRUF4RUN5QUFRZmdBTmdJY0lBQWdBVFlDRkNBQVFjcVlnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1Rd3NnQUVIa0FEWUNIQ0FBSUFFMkFoUWdBRUhqbDRDQUFEWUNFQ0FBUVJVMkFneEJBQ0VRREVJTElBQkIxd0EyQWh3Z0FDQUJOZ0lVSUFCQnlaZUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBeEJDeUFBUVFBMkFod2dBQ0FCTmdJVUlBQkJ1WTJBZ0FBMkFoQWdBRUVhTmdJTVFRQWhFQXhBQ3lBQVFjSUFOZ0ljSUFBZ0FUWUNGQ0FBUWVPWWdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTVB3c2dBRUVBTmdJRUlBQWdEeUFQRUxHQWdJQUFJZ1JGRFFFZ0FFRTZOZ0ljSUFBZ0JEWUNEQ0FBSUE5QkFXbzJBaFJCQUNFUURENExJQUFvQWdRaEJDQUFRUUEyQWdRQ1FDQUFJQVFnQVJDeGdJQ0FBQ0lFUlEwQUlBQkJPellDSENBQUlBUTJBZ3dnQUNBQlFRRnFOZ0lVUVFBaEVBdytDeUFCUVFGcUlRRU1MUXNnRDBFQmFpRUJEQzBMSUFCQkFEWUNIQ0FBSUE4MkFoUWdBRUhra29DQUFEWUNFQ0FBUVFRMkFneEJBQ0VRRERzTElBQkJOallDSENBQUlBUTJBaFFnQUNBQ05nSU1RUUFoRUF3NkN5QUFRUzQyQWh3Z0FDQU9OZ0lVSUFBZ0JEWUNERUVBSVJBTU9Rc2dBRUhRQURZQ0hDQUFJQUUyQWhRZ0FFR1JtSUNBQURZQ0VDQUFRUlUyQWd4QkFDRVFERGdMSUExQkFXb2hBUXdzQ3lBQVFSVTJBaHdnQUNBQk5nSVVJQUJCZ3BtQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF3MkN5QUFRUnMyQWh3Z0FDQUJOZ0lVSUFCQmtaZUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBdzFDeUFBUVE4MkFod2dBQ0FCTmdJVUlBQkJrWmVBZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXcwQ3lBQVFRczJBaHdnQUNBQk5nSVVJQUJCa1plQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF3ekN5QUFRUm8yQWh3Z0FDQUJOZ0lVSUFCQmdwbUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBd3lDeUFBUVFzMkFod2dBQ0FCTmdJVUlBQkJncG1BZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXd4Q3lBQVFRbzJBaHdnQUNBQk5nSVVJQUJCNUphQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF3d0N5QUFRUjQyQWh3Z0FDQUJOZ0lVSUFCQitaZUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBd3ZDeUFBUVFBMkFod2dBQ0FRTmdJVUlBQkIybzJBZ0FBMkFoQWdBRUVVTmdJTVFRQWhFQXd1Q3lBQVFRUTJBaHdnQUNBQk5nSVVJQUJCc0ppQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF3dEN5QUFRUUEyQWdBZ0MwRUJhaUVMQzBHNEFTRVFEQklMSUFCQkFEWUNBQ0FRUVFGcUlRRkI5UUFoRUF3UkN5QUJJUUVDUUNBQUxRQXBRUVZIRFFCQjR3QWhFQXdSQzBIaUFDRVFEQkFMUVFBaEVDQUFRUUEyQWh3Z0FFSGtrWUNBQURZQ0VDQUFRUWMyQWd3Z0FDQVVRUUZxTmdJVURDZ0xJQUJCQURZQ0FDQVhRUUZxSVFGQndBQWhFQXdPQzBFQklRRUxJQUFnQVRvQUxDQUFRUUEyQWdBZ0YwRUJhaUVCQzBFb0lSQU1Dd3NnQVNFQkMwRTRJUkFNQ1FzQ1FDQUJJZzhnQWtZTkFBTkFBa0FnRHkwQUFFR0F2b0NBQUdvdEFBQWlBVUVCUmcwQUlBRkJBa2NOQXlBUFFRRnFJUUVNQkFzZ0QwRUJhaUlQSUFKSERRQUxRVDRoRUF3aUMwRStJUkFNSVFzZ0FFRUFPZ0FzSUE4aEFRd0JDMEVMSVJBTUJndEJPaUVRREFVTElBRkJBV29oQVVFdElSQU1CQXNnQUNBQk9nQXNJQUJCQURZQ0FDQVdRUUZxSVFGQkRDRVFEQU1MSUFCQkFEWUNBQ0FYUVFGcUlRRkJDaUVRREFJTElBQkJBRFlDQUFzZ0FFRUFPZ0FzSUEwaEFVRUpJUkFNQUFzTFFRQWhFQ0FBUVFBMkFod2dBQ0FMTmdJVUlBQkJ6WkNBZ0FBMkFoQWdBRUVKTmdJTURCY0xRUUFoRUNBQVFRQTJBaHdnQUNBS05nSVVJQUJCNllxQWdBQTJBaEFnQUVFSk5nSU1EQllMUVFBaEVDQUFRUUEyQWh3Z0FDQUpOZ0lVSUFCQnQ1Q0FnQUEyQWhBZ0FFRUpOZ0lNREJVTFFRQWhFQ0FBUVFBMkFod2dBQ0FJTmdJVUlBQkJuSkdBZ0FBMkFoQWdBRUVKTmdJTURCUUxRUUFoRUNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCelpDQWdBQTJBaEFnQUVFSk5nSU1EQk1MUVFBaEVDQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQjZZcUFnQUEyQWhBZ0FFRUpOZ0lNREJJTFFRQWhFQ0FBUVFBMkFod2dBQ0FCTmdJVUlBQkJ0NUNBZ0FBMkFoQWdBRUVKTmdJTURCRUxRUUFoRUNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCbkpHQWdBQTJBaEFnQUVFSk5nSU1EQkFMUVFBaEVDQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQmw1V0FnQUEyQWhBZ0FFRVBOZ0lNREE4TFFRQWhFQ0FBUVFBMkFod2dBQ0FCTmdJVUlBQkJsNVdBZ0FBMkFoQWdBRUVQTmdJTURBNExRUUFoRUNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCd0pLQWdBQTJBaEFnQUVFTE5nSU1EQTBMUVFBaEVDQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQmxZbUFnQUEyQWhBZ0FFRUxOZ0lNREF3TFFRQWhFQ0FBUVFBMkFod2dBQ0FCTmdJVUlBQkI0WStBZ0FBMkFoQWdBRUVLTmdJTURBc0xRUUFoRUNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCKzQrQWdBQTJBaEFnQUVFS05nSU1EQW9MUVFBaEVDQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQjhabUFnQUEyQWhBZ0FFRUNOZ0lNREFrTFFRQWhFQ0FBUVFBMkFod2dBQ0FCTmdJVUlBQkJ4SlNBZ0FBMkFoQWdBRUVDTmdJTURBZ0xRUUFoRUNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCOHBXQWdBQTJBaEFnQUVFQ05nSU1EQWNMSUFCQkFqWUNIQ0FBSUFFMkFoUWdBRUdjbW9DQUFEWUNFQ0FBUVJZMkFneEJBQ0VRREFZTFFRRWhFQXdGQzBIVUFDRVFJQUVpQkNBQ1JnMEVJQU5CQ0dvZ0FDQUVJQUpCMk1LQWdBQkJDaERGZ0lDQUFDQURLQUlNSVFRZ0F5Z0NDQTREQVFRQ0FBc1F5b0NBZ0FBQUN5QUFRUUEyQWh3Z0FFRzFtb0NBQURZQ0VDQUFRUmMyQWd3Z0FDQUVRUUZxTmdJVVFRQWhFQXdDQ3lBQVFRQTJBaHdnQUNBRU5nSVVJQUJCeXBxQWdBQTJBaEFnQUVFSk5nSU1RUUFoRUF3QkN3SkFJQUVpQkNBQ1J3MEFRU0loRUF3QkN5QUFRWW1BZ0lBQU5nSUlJQUFnQkRZQ0JFRWhJUkFMSUFOQkVHb2tnSUNBZ0FBZ0VBdXZBUUVDZnlBQktBSUFJUVlDUUFKQUlBSWdBMFlOQUNBRUlBWnFJUVFnQmlBRGFpQUNheUVISUFJZ0JrRi9jeUFGYWlJR2FpRUZBMEFDUUNBQ0xRQUFJQVF0QUFCR0RRQkJBaUVFREFNTEFrQWdCZzBBUVFBaEJDQUZJUUlNQXdzZ0JrRi9haUVHSUFSQkFXb2hCQ0FDUVFGcUlnSWdBMGNOQUFzZ0J5RUdJQU1oQWdzZ0FFRUJOZ0lBSUFFZ0JqWUNBQ0FBSUFJMkFnUVBDeUFCUVFBMkFnQWdBQ0FFTmdJQUlBQWdBallDQkFzS0FDQUFFTWVBZ0lBQUMvSTJBUXQvSTRDQWdJQUFRUkJySWdFa2dJQ0FnQUFDUUVFQUtBS2cwSUNBQUEwQVFRQVF5NENBZ0FCQmdOU0VnQUJySWdKQjJRQkpEUUJCQUNFREFrQkJBQ2dDNE5PQWdBQWlCQTBBUVFCQ2Z6Y0M3Tk9BZ0FCQkFFS0FnSVNBZ0lEQUFEY0M1Tk9BZ0FCQkFDQUJRUWhxUVhCeFFkaXExYW9GY3lJRU5nTGcwNENBQUVFQVFRQTJBdlRUZ0lBQVFRQkJBRFlDeE5PQWdBQUxRUUFnQWpZQ3pOT0FnQUJCQUVHQTFJU0FBRFlDeU5PQWdBQkJBRUdBMUlTQUFEWUNtTkNBZ0FCQkFDQUVOZ0tzMElDQUFFRUFRWDgyQXFqUWdJQUFBMEFnQTBIRTBJQ0FBR29nQTBHNDBJQ0FBR29pQkRZQ0FDQUVJQU5Cc05DQWdBQnFJZ1UyQWdBZ0EwRzgwSUNBQUdvZ0JUWUNBQ0FEUWN6UWdJQUFhaUFEUWNEUWdJQUFhaUlGTmdJQUlBVWdCRFlDQUNBRFFkVFFnSUFBYWlBRFFjalFnSUFBYWlJRU5nSUFJQVFnQlRZQ0FDQURRZERRZ0lBQWFpQUVOZ0lBSUFOQklHb2lBMEdBQWtjTkFBdEJnTlNFZ0FCQmVFR0ExSVNBQUd0QkQzRkJBRUdBMUlTQUFFRUlha0VQY1JzaUEyb2lCRUVFYWlBQ1FVaHFJZ1VnQTJzaUEwRUJjallDQUVFQVFRQW9BdkRUZ0lBQU5nS2swSUNBQUVFQUlBTTJBcFRRZ0lBQVFRQWdCRFlDb05DQWdBQkJnTlNFZ0FBZ0JXcEJPRFlDQkFzQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQUVIc0FVc05BQUpBUVFBb0FvalFnSUFBSWdaQkVDQUFRUk5xUVhCeElBQkJDMGtiSWdKQkEzWWlCSFlpQTBFRGNVVU5BQUpBQWtBZ0EwRUJjU0FFY2tFQmN5SUZRUU4wSWdSQnNOQ0FnQUJxSWdNZ0JFRzQwSUNBQUdvb0FnQWlCQ2dDQ0NJQ1J3MEFRUUFnQmtGK0lBVjNjVFlDaU5DQWdBQU1BUXNnQXlBQ05nSUlJQUlnQXpZQ0RBc2dCRUVJYWlFRElBUWdCVUVEZENJRlFRTnlOZ0lFSUFRZ0JXb2lCQ0FFS0FJRVFRRnlOZ0lFREF3TElBSkJBQ2dDa05DQWdBQWlCMDBOQVFKQUlBTkZEUUFDUUFKQUlBTWdCSFJCQWlBRWRDSURRUUFnQTJ0eWNTSURRUUFnQTJ0eFFYOXFJZ01nQTBFTWRrRVFjU0lEZGlJRVFRVjJRUWh4SWdVZ0EzSWdCQ0FGZGlJRFFRSjJRUVJ4SWdSeUlBTWdCSFlpQTBFQmRrRUNjU0lFY2lBRElBUjJJZ05CQVhaQkFYRWlCSElnQXlBRWRtb2lCRUVEZENJRFFiRFFnSUFBYWlJRklBTkJ1TkNBZ0FCcUtBSUFJZ01vQWdnaUFFY05BRUVBSUFaQmZpQUVkM0VpQmpZQ2lOQ0FnQUFNQVFzZ0JTQUFOZ0lJSUFBZ0JUWUNEQXNnQXlBQ1FRTnlOZ0lFSUFNZ0JFRURkQ0lFYWlBRUlBSnJJZ1UyQWdBZ0F5QUNhaUlBSUFWQkFYSTJBZ1FDUUNBSFJRMEFJQWRCZUhGQnNOQ0FnQUJxSVFKQkFDZ0NuTkNBZ0FBaEJBSkFBa0FnQmtFQklBZEJBM1owSWdoeERRQkJBQ0FHSUFoeU5nS0kwSUNBQUNBQ0lRZ01BUXNnQWlnQ0NDRUlDeUFJSUFRMkFnd2dBaUFFTmdJSUlBUWdBallDRENBRUlBZzJBZ2dMSUFOQkNHb2hBMEVBSUFBMkFwelFnSUFBUVFBZ0JUWUNrTkNBZ0FBTURBdEJBQ2dDak5DQWdBQWlDVVVOQVNBSlFRQWdDV3R4UVg5cUlnTWdBMEVNZGtFUWNTSURkaUlFUVFWMlFRaHhJZ1VnQTNJZ0JDQUZkaUlEUVFKMlFRUnhJZ1J5SUFNZ0JIWWlBMEVCZGtFQ2NTSUVjaUFESUFSMklnTkJBWFpCQVhFaUJISWdBeUFFZG1wQkFuUkJ1TktBZ0FCcUtBSUFJZ0FvQWdSQmVIRWdBbXNoQkNBQUlRVUNRQU5BQWtBZ0JTZ0NFQ0lERFFBZ0JVRVVhaWdDQUNJRFJRMENDeUFES0FJRVFYaHhJQUpySWdVZ0JDQUZJQVJKSWdVYklRUWdBeUFBSUFVYklRQWdBeUVGREFBTEN5QUFLQUlZSVFvQ1FDQUFLQUlNSWdnZ0FFWU5BQ0FBS0FJSUlnTkJBQ2dDbU5DQWdBQkpHaUFJSUFNMkFnZ2dBeUFJTmdJTURBc0xBa0FnQUVFVWFpSUZLQUlBSWdNTkFDQUFLQUlRSWdORkRRTWdBRUVRYWlFRkN3TkFJQVVoQ3lBRElnaEJGR29pQlNnQ0FDSUREUUFnQ0VFUWFpRUZJQWdvQWhBaUF3MEFDeUFMUVFBMkFnQU1DZ3RCZnlFQ0lBQkJ2MzlMRFFBZ0FFRVRhaUlEUVhCeElRSkJBQ2dDak5DQWdBQWlCMFVOQUVFQUlRc0NRQ0FDUVlBQ1NRMEFRUjhoQ3lBQ1FmLy8vd2RMRFFBZ0EwRUlkaUlESUFOQmdQNC9ha0VRZGtFSWNTSURkQ0lFSUFSQmdPQWZha0VRZGtFRWNTSUVkQ0lGSUFWQmdJQVBha0VRZGtFQ2NTSUZkRUVQZGlBRElBUnlJQVZ5YXlJRFFRRjBJQUlnQTBFVmFuWkJBWEZ5UVJ4cUlRc0xRUUFnQW1zaEJBSkFBa0FDUUFKQUlBdEJBblJCdU5LQWdBQnFLQUlBSWdVTkFFRUFJUU5CQUNFSURBRUxRUUFoQXlBQ1FRQkJHU0FMUVFGMmF5QUxRUjlHRzNRaEFFRUFJUWdEUUFKQUlBVW9BZ1JCZUhFZ0Ftc2lCaUFFVHcwQUlBWWhCQ0FGSVFnZ0JnMEFRUUFoQkNBRklRZ2dCU0VEREFNTElBTWdCVUVVYWlnQ0FDSUdJQVlnQlNBQVFSMTJRUVJ4YWtFUWFpZ0NBQ0lGUmhzZ0F5QUdHeUVESUFCQkFYUWhBQ0FGRFFBTEN3SkFJQU1nQ0hJTkFFRUFJUWhCQWlBTGRDSURRUUFnQTJ0eUlBZHhJZ05GRFFNZ0EwRUFJQU5yY1VGL2FpSURJQU5CREhaQkVIRWlBM1lpQlVFRmRrRUljU0lBSUFOeUlBVWdBSFlpQTBFQ2RrRUVjU0lGY2lBRElBVjJJZ05CQVhaQkFuRWlCWElnQXlBRmRpSURRUUYyUVFGeElnVnlJQU1nQlhacVFRSjBRYmpTZ0lBQWFpZ0NBQ0VEQ3lBRFJRMEJDd05BSUFNb0FnUkJlSEVnQW1zaUJpQUVTU0VBQWtBZ0F5Z0NFQ0lGRFFBZ0EwRVVhaWdDQUNFRkN5QUdJQVFnQUJzaEJDQURJQWdnQUJzaENDQUZJUU1nQlEwQUN3c2dDRVVOQUNBRVFRQW9BcERRZ0lBQUlBSnJUdzBBSUFnb0FoZ2hDd0pBSUFnb0Fnd2lBQ0FJUmcwQUlBZ29BZ2dpQTBFQUtBS1kwSUNBQUVrYUlBQWdBellDQ0NBRElBQTJBZ3dNQ1FzQ1FDQUlRUlJxSWdVb0FnQWlBdzBBSUFnb0FoQWlBMFVOQXlBSVFSQnFJUVVMQTBBZ0JTRUdJQU1pQUVFVWFpSUZLQUlBSWdNTkFDQUFRUkJxSVFVZ0FDZ0NFQ0lERFFBTElBWkJBRFlDQUF3SUN3SkFRUUFvQXBEUWdJQUFJZ01nQWtrTkFFRUFLQUtjMElDQUFDRUVBa0FDUUNBRElBSnJJZ1ZCRUVrTkFDQUVJQUpxSWdBZ0JVRUJjallDQkVFQUlBVTJBcERRZ0lBQVFRQWdBRFlDbk5DQWdBQWdCQ0FEYWlBRk5nSUFJQVFnQWtFRGNqWUNCQXdCQ3lBRUlBTkJBM0kyQWdRZ0JDQURhaUlESUFNb0FnUkJBWEkyQWdSQkFFRUFOZ0tjMElDQUFFRUFRUUEyQXBEUWdJQUFDeUFFUVFocUlRTU1DZ3NDUUVFQUtBS1UwSUNBQUNJQUlBSk5EUUJCQUNnQ29OQ0FnQUFpQXlBQ2FpSUVJQUFnQW1zaUJVRUJjallDQkVFQUlBVTJBcFRRZ0lBQVFRQWdCRFlDb05DQWdBQWdBeUFDUVFOeU5nSUVJQU5CQ0dvaEF3d0tDd0pBQWtCQkFDZ0M0Tk9BZ0FCRkRRQkJBQ2dDNk5PQWdBQWhCQXdCQzBFQVFuODNBdXpUZ0lBQVFRQkNnSUNFZ0lDQXdBQTNBdVRUZ0lBQVFRQWdBVUVNYWtGd2NVSFlxdFdxQlhNMkF1RFRnSUFBUVFCQkFEWUM5Tk9BZ0FCQkFFRUFOZ0xFMDRDQUFFR0FnQVFoQkF0QkFDRURBa0FnQkNBQ1FjY0FhaUlIYWlJR1FRQWdCR3NpQzNFaUNDQUNTdzBBUVFCQk1EWUMrTk9BZ0FBTUNnc0NRRUVBS0FMQTA0Q0FBQ0lEUlEwQUFrQkJBQ2dDdU5PQWdBQWlCQ0FJYWlJRklBUk5EUUFnQlNBRFRRMEJDMEVBSVFOQkFFRXdOZ0w0MDRDQUFBd0tDMEVBTFFERTA0Q0FBRUVFY1EwRUFrQUNRQUpBUVFBb0FxRFFnSUFBSWdSRkRRQkJ5Tk9BZ0FBaEF3TkFBa0FnQXlnQ0FDSUZJQVJMRFFBZ0JTQURLQUlFYWlBRVN3MERDeUFES0FJSUlnTU5BQXNMUVFBUXk0Q0FnQUFpQUVGL1JnMEZJQWdoQmdKQVFRQW9BdVRUZ0lBQUlnTkJmMm9pQkNBQWNVVU5BQ0FJSUFCcklBUWdBR3BCQUNBRGEzRnFJUVlMSUFZZ0FrME5CU0FHUWY3Ly8vOEhTdzBGQWtCQkFDZ0N3Tk9BZ0FBaUEwVU5BRUVBS0FLNDA0Q0FBQ0lFSUFacUlnVWdCRTBOQmlBRklBTkxEUVlMSUFZUXk0Q0FnQUFpQXlBQVJ3MEJEQWNMSUFZZ0FHc2dDM0VpQmtIKy8vLy9CMHNOQkNBR0VNdUFnSUFBSWdBZ0F5Z0NBQ0FES0FJRWFrWU5BeUFBSVFNTEFrQWdBMEYvUmcwQUlBSkJ5QUJxSUFaTkRRQUNRQ0FISUFaclFRQW9BdWpUZ0lBQUlnUnFRUUFnQkd0eElnUkIvdi8vL3dkTkRRQWdBeUVBREFjTEFrQWdCQkRMZ0lDQUFFRi9SZzBBSUFRZ0Jtb2hCaUFESVFBTUJ3dEJBQ0FHYXhETGdJQ0FBQm9NQkFzZ0F5RUFJQU5CZjBjTkJRd0RDMEVBSVFnTUJ3dEJBQ0VBREFVTElBQkJmMGNOQWd0QkFFRUFLQUxFMDRDQUFFRUVjallDeE5PQWdBQUxJQWhCL3YvLy93ZExEUUVnQ0JETGdJQ0FBQ0VBUVFBUXk0Q0FnQUFoQXlBQVFYOUdEUUVnQTBGL1JnMEJJQUFnQTA4TkFTQURJQUJySWdZZ0FrRTRhazBOQVF0QkFFRUFLQUs0MDRDQUFDQUdhaUlETmdLNDA0Q0FBQUpBSUFOQkFDZ0N2Tk9BZ0FCTkRRQkJBQ0FETmdLODA0Q0FBQXNDUUFKQUFrQUNRRUVBS0FLZzBJQ0FBQ0lFUlEwQVFjalRnSUFBSVFNRFFDQUFJQU1vQWdBaUJTQURLQUlFSWdocVJnMENJQU1vQWdnaUF3MEFEQU1MQ3dKQUFrQkJBQ2dDbU5DQWdBQWlBMFVOQUNBQUlBTlBEUUVMUVFBZ0FEWUNtTkNBZ0FBTFFRQWhBMEVBSUFZMkFzelRnSUFBUVFBZ0FEWUN5Tk9BZ0FCQkFFRi9OZ0tvMElDQUFFRUFRUUFvQXVEVGdJQUFOZ0tzMElDQUFFRUFRUUEyQXRUVGdJQUFBMEFnQTBIRTBJQ0FBR29nQTBHNDBJQ0FBR29pQkRZQ0FDQUVJQU5Cc05DQWdBQnFJZ1UyQWdBZ0EwRzgwSUNBQUdvZ0JUWUNBQ0FEUWN6UWdJQUFhaUFEUWNEUWdJQUFhaUlGTmdJQUlBVWdCRFlDQUNBRFFkVFFnSUFBYWlBRFFjalFnSUFBYWlJRU5nSUFJQVFnQlRZQ0FDQURRZERRZ0lBQWFpQUVOZ0lBSUFOQklHb2lBMEdBQWtjTkFBc2dBRUY0SUFCclFROXhRUUFnQUVFSWFrRVBjUnNpQTJvaUJDQUdRVWhxSWdVZ0Eyc2lBMEVCY2pZQ0JFRUFRUUFvQXZEVGdJQUFOZ0trMElDQUFFRUFJQU0yQXBUUWdJQUFRUUFnQkRZQ29OQ0FnQUFnQUNBRmFrRTROZ0lFREFJTElBTXRBQXhCQ0hFTkFDQUVJQVZKRFFBZ0JDQUFUdzBBSUFSQmVDQUVhMEVQY1VFQUlBUkJDR3BCRDNFYklnVnFJZ0JCQUNnQ2xOQ0FnQUFnQm1vaUN5QUZheUlGUVFGeU5nSUVJQU1nQ0NBR2FqWUNCRUVBUVFBb0F2RFRnSUFBTmdLazBJQ0FBRUVBSUFVMkFwVFFnSUFBUVFBZ0FEWUNvTkNBZ0FBZ0JDQUxha0U0TmdJRURBRUxBa0FnQUVFQUtBS1kwSUNBQUNJSVR3MEFRUUFnQURZQ21OQ0FnQUFnQUNFSUN5QUFJQVpxSVFWQnlOT0FnQUFoQXdKQUFrQUNRQUpBQWtBQ1FBSkFBMEFnQXlnQ0FDQUZSZzBCSUFNb0FnZ2lBdzBBREFJTEN5QURMUUFNUVFoeFJRMEJDMEhJMDRDQUFDRURBMEFDUUNBREtBSUFJZ1VnQkVzTkFDQUZJQU1vQWdScUlnVWdCRXNOQXdzZ0F5Z0NDQ0VEREFBTEN5QURJQUEyQWdBZ0F5QURLQUlFSUFacU5nSUVJQUJCZUNBQWEwRVBjVUVBSUFCQkNHcEJEM0ViYWlJTElBSkJBM0kyQWdRZ0JVRjRJQVZyUVE5eFFRQWdCVUVJYWtFUGNSdHFJZ1lnQ3lBQ2FpSUNheUVEQWtBZ0JpQUVSdzBBUVFBZ0FqWUNvTkNBZ0FCQkFFRUFLQUtVMElDQUFDQURhaUlETmdLVTBJQ0FBQ0FDSUFOQkFYSTJBZ1FNQXdzQ1FDQUdRUUFvQXB6UWdJQUFSdzBBUVFBZ0FqWUNuTkNBZ0FCQkFFRUFLQUtRMElDQUFDQURhaUlETmdLUTBJQ0FBQ0FDSUFOQkFYSTJBZ1FnQWlBRGFpQUROZ0lBREFNTEFrQWdCaWdDQkNJRVFRTnhRUUZIRFFBZ0JFRjRjU0VIQWtBQ1FDQUVRZjhCU3cwQUlBWW9BZ2dpQlNBRVFRTjJJZ2hCQTNSQnNOQ0FnQUJxSWdCR0dnSkFJQVlvQWd3aUJDQUZSdzBBUVFCQkFDZ0NpTkNBZ0FCQmZpQUlkM0UyQW9qUWdJQUFEQUlMSUFRZ0FFWWFJQVFnQlRZQ0NDQUZJQVEyQWd3TUFRc2dCaWdDR0NFSkFrQUNRQ0FHS0FJTUlnQWdCa1lOQUNBR0tBSUlJZ1FnQ0VrYUlBQWdCRFlDQ0NBRUlBQTJBZ3dNQVFzQ1FDQUdRUlJxSWdRb0FnQWlCUTBBSUFaQkVHb2lCQ2dDQUNJRkRRQkJBQ0VBREFFTEEwQWdCQ0VJSUFVaUFFRVVhaUlFS0FJQUlnVU5BQ0FBUVJCcUlRUWdBQ2dDRUNJRkRRQUxJQWhCQURZQ0FBc2dDVVVOQUFKQUFrQWdCaUFHS0FJY0lnVkJBblJCdU5LQWdBQnFJZ1FvQWdCSERRQWdCQ0FBTmdJQUlBQU5BVUVBUVFBb0FvelFnSUFBUVg0Z0JYZHhOZ0tNMElDQUFBd0NDeUFKUVJCQkZDQUpLQUlRSUFaR0cyb2dBRFlDQUNBQVJRMEJDeUFBSUFrMkFoZ0NRQ0FHS0FJUUlnUkZEUUFnQUNBRU5nSVFJQVFnQURZQ0dBc2dCaWdDRkNJRVJRMEFJQUJCRkdvZ0JEWUNBQ0FFSUFBMkFoZ0xJQWNnQTJvaEF5QUdJQWRxSWdZb0FnUWhCQXNnQmlBRVFYNXhOZ0lFSUFJZ0Eyb2dBellDQUNBQ0lBTkJBWEkyQWdRQ1FDQURRZjhCU3cwQUlBTkJlSEZCc05DQWdBQnFJUVFDUUFKQVFRQW9Bb2pRZ0lBQUlnVkJBU0FEUVFOMmRDSURjUTBBUVFBZ0JTQURjallDaU5DQWdBQWdCQ0VEREFFTElBUW9BZ2doQXdzZ0F5QUNOZ0lNSUFRZ0FqWUNDQ0FDSUFRMkFnd2dBaUFETmdJSURBTUxRUjhoQkFKQUlBTkIvLy8vQjBzTkFDQURRUWgySWdRZ0JFR0EvajlxUVJCMlFRaHhJZ1IwSWdVZ0JVR0E0QjlxUVJCMlFRUnhJZ1YwSWdBZ0FFR0FnQTlxUVJCMlFRSnhJZ0IwUVE5MklBUWdCWElnQUhKcklnUkJBWFFnQXlBRVFSVnFka0VCY1hKQkhHb2hCQXNnQWlBRU5nSWNJQUpDQURjQ0VDQUVRUUowUWJqU2dJQUFhaUVGQWtCQkFDZ0NqTkNBZ0FBaUFFRUJJQVIwSWdoeERRQWdCU0FDTmdJQVFRQWdBQ0FJY2pZQ2pOQ0FnQUFnQWlBRk5nSVlJQUlnQWpZQ0NDQUNJQUkyQWd3TUF3c2dBMEVBUVJrZ0JFRUJkbXNnQkVFZlJodDBJUVFnQlNnQ0FDRUFBMEFnQUNJRktBSUVRWGh4SUFOR0RRSWdCRUVkZGlFQUlBUkJBWFFoQkNBRklBQkJCSEZxUVJCcUlnZ29BZ0FpQUEwQUN5QUlJQUkyQWdBZ0FpQUZOZ0lZSUFJZ0FqWUNEQ0FDSUFJMkFnZ01BZ3NnQUVGNElBQnJRUTl4UVFBZ0FFRUlha0VQY1JzaUEyb2lDeUFHUVVocUlnZ2dBMnNpQTBFQmNqWUNCQ0FBSUFocVFUZzJBZ1FnQkNBRlFUY2dCV3RCRDNGQkFDQUZRVWxxUVE5eEcycEJRV29pQ0NBSUlBUkJFR3BKR3lJSVFTTTJBZ1JCQUVFQUtBTHcwNENBQURZQ3BOQ0FnQUJCQUNBRE5nS1UwSUNBQUVFQUlBczJBcURRZ0lBQUlBaEJFR3BCQUNrQzBOT0FnQUEzQWdBZ0NFRUFLUUxJMDRDQUFEY0NDRUVBSUFoQkNHbzJBdERUZ0lBQVFRQWdCallDek5PQWdBQkJBQ0FBTmdMSTA0Q0FBRUVBUVFBMkF0VFRnSUFBSUFoQkpHb2hBd05BSUFOQkJ6WUNBQ0FEUVFScUlnTWdCVWtOQUFzZ0NDQUVSZzBESUFnZ0NDZ0NCRUYrY1RZQ0JDQUlJQWdnQkdzaUFEWUNBQ0FFSUFCQkFYSTJBZ1FDUUNBQVFmOEJTdzBBSUFCQmVIRkJzTkNBZ0FCcUlRTUNRQUpBUVFBb0FvalFnSUFBSWdWQkFTQUFRUU4yZENJQWNRMEFRUUFnQlNBQWNqWUNpTkNBZ0FBZ0F5RUZEQUVMSUFNb0FnZ2hCUXNnQlNBRU5nSU1JQU1nQkRZQ0NDQUVJQU0yQWd3Z0JDQUZOZ0lJREFRTFFSOGhBd0pBSUFCQi8vLy9CMHNOQUNBQVFRaDJJZ01nQTBHQS9qOXFRUkIyUVFoeElnTjBJZ1VnQlVHQTRCOXFRUkIyUVFSeElnVjBJZ2dnQ0VHQWdBOXFRUkIyUVFKeElnaDBRUTkySUFNZ0JYSWdDSEpySWdOQkFYUWdBQ0FEUVJWcWRrRUJjWEpCSEdvaEF3c2dCQ0FETmdJY0lBUkNBRGNDRUNBRFFRSjBRYmpTZ0lBQWFpRUZBa0JCQUNnQ2pOQ0FnQUFpQ0VFQklBTjBJZ1p4RFFBZ0JTQUVOZ0lBUVFBZ0NDQUdjallDak5DQWdBQWdCQ0FGTmdJWUlBUWdCRFlDQ0NBRUlBUTJBZ3dNQkFzZ0FFRUFRUmtnQTBFQmRtc2dBMEVmUmh0MElRTWdCU2dDQUNFSUEwQWdDQ0lGS0FJRVFYaHhJQUJHRFFNZ0EwRWRkaUVJSUFOQkFYUWhBeUFGSUFoQkJIRnFRUkJxSWdZb0FnQWlDQTBBQ3lBR0lBUTJBZ0FnQkNBRk5nSVlJQVFnQkRZQ0RDQUVJQVEyQWdnTUF3c2dCU2dDQ0NJRElBSTJBZ3dnQlNBQ05nSUlJQUpCQURZQ0dDQUNJQVUyQWd3Z0FpQUROZ0lJQ3lBTFFRaHFJUU1NQlFzZ0JTZ0NDQ0lESUFRMkFnd2dCU0FFTmdJSUlBUkJBRFlDR0NBRUlBVTJBZ3dnQkNBRE5nSUlDMEVBS0FLVTBJQ0FBQ0lESUFKTkRRQkJBQ2dDb05DQWdBQWlCQ0FDYWlJRklBTWdBbXNpQTBFQmNqWUNCRUVBSUFNMkFwVFFnSUFBUVFBZ0JUWUNvTkNBZ0FBZ0JDQUNRUU55TmdJRUlBUkJDR29oQXd3REMwRUFJUU5CQUVFd05nTDQwNENBQUF3Q0N3SkFJQXRGRFFBQ1FBSkFJQWdnQ0NnQ0hDSUZRUUowUWJqU2dJQUFhaUlES0FJQVJ3MEFJQU1nQURZQ0FDQUFEUUZCQUNBSFFYNGdCWGR4SWdjMkFvelFnSUFBREFJTElBdEJFRUVVSUFzb0FoQWdDRVliYWlBQU5nSUFJQUJGRFFFTElBQWdDellDR0FKQUlBZ29BaEFpQTBVTkFDQUFJQU0yQWhBZ0F5QUFOZ0lZQ3lBSVFSUnFLQUlBSWdORkRRQWdBRUVVYWlBRE5nSUFJQU1nQURZQ0dBc0NRQUpBSUFSQkQwc05BQ0FJSUFRZ0Ftb2lBMEVEY2pZQ0JDQUlJQU5xSWdNZ0F5Z0NCRUVCY2pZQ0JBd0JDeUFJSUFKcUlnQWdCRUVCY2pZQ0JDQUlJQUpCQTNJMkFnUWdBQ0FFYWlBRU5nSUFBa0FnQkVIL0FVc05BQ0FFUVhoeFFiRFFnSUFBYWlFREFrQUNRRUVBS0FLSTBJQ0FBQ0lGUVFFZ0JFRURkblFpQkhFTkFFRUFJQVVnQkhJMkFvalFnSUFBSUFNaEJBd0JDeUFES0FJSUlRUUxJQVFnQURZQ0RDQURJQUEyQWdnZ0FDQUROZ0lNSUFBZ0JEWUNDQXdCQzBFZklRTUNRQ0FFUWYvLy93ZExEUUFnQkVFSWRpSURJQU5CZ1A0L2FrRVFka0VJY1NJRGRDSUZJQVZCZ09BZmFrRVFka0VFY1NJRmRDSUNJQUpCZ0lBUGFrRVFka0VDY1NJQ2RFRVBkaUFESUFWeUlBSnlheUlEUVFGMElBUWdBMEVWYW5aQkFYRnlRUnhxSVFNTElBQWdBellDSENBQVFnQTNBaEFnQTBFQ2RFRzQwb0NBQUdvaEJRSkFJQWRCQVNBRGRDSUNjUTBBSUFVZ0FEWUNBRUVBSUFjZ0FuSTJBb3pRZ0lBQUlBQWdCVFlDR0NBQUlBQTJBZ2dnQUNBQU5nSU1EQUVMSUFSQkFFRVpJQU5CQVhacklBTkJIMFliZENFRElBVW9BZ0FoQWdKQUEwQWdBaUlGS0FJRVFYaHhJQVJHRFFFZ0EwRWRkaUVDSUFOQkFYUWhBeUFGSUFKQkJIRnFRUkJxSWdZb0FnQWlBZzBBQ3lBR0lBQTJBZ0FnQUNBRk5nSVlJQUFnQURZQ0RDQUFJQUEyQWdnTUFRc2dCU2dDQ0NJRElBQTJBZ3dnQlNBQU5nSUlJQUJCQURZQ0dDQUFJQVUyQWd3Z0FDQUROZ0lJQ3lBSVFRaHFJUU1NQVFzQ1FDQUtSUTBBQWtBQ1FDQUFJQUFvQWh3aUJVRUNkRUc0MG9DQUFHb2lBeWdDQUVjTkFDQURJQWcyQWdBZ0NBMEJRUUFnQ1VGK0lBVjNjVFlDak5DQWdBQU1BZ3NnQ2tFUVFSUWdDaWdDRUNBQVJodHFJQWcyQWdBZ0NFVU5BUXNnQ0NBS05nSVlBa0FnQUNnQ0VDSURSUTBBSUFnZ0F6WUNFQ0FESUFnMkFoZ0xJQUJCRkdvb0FnQWlBMFVOQUNBSVFSUnFJQU0yQWdBZ0F5QUlOZ0lZQ3dKQUFrQWdCRUVQU3cwQUlBQWdCQ0FDYWlJRFFRTnlOZ0lFSUFBZ0Eyb2lBeUFES0FJRVFRRnlOZ0lFREFFTElBQWdBbW9pQlNBRVFRRnlOZ0lFSUFBZ0FrRURjallDQkNBRklBUnFJQVEyQWdBQ1FDQUhSUTBBSUFkQmVIRkJzTkNBZ0FCcUlRSkJBQ2dDbk5DQWdBQWhBd0pBQWtCQkFTQUhRUU4yZENJSUlBWnhEUUJCQUNBSUlBWnlOZ0tJMElDQUFDQUNJUWdNQVFzZ0FpZ0NDQ0VJQ3lBSUlBTTJBZ3dnQWlBRE5nSUlJQU1nQWpZQ0RDQURJQWcyQWdnTFFRQWdCVFlDbk5DQWdBQkJBQ0FFTmdLUTBJQ0FBQXNnQUVFSWFpRURDeUFCUVJCcUpJQ0FnSUFBSUFNTENnQWdBQkRKZ0lDQUFBdmlEUUVIZndKQUlBQkZEUUFnQUVGNGFpSUJJQUJCZkdvb0FnQWlBa0Y0Y1NJQWFpRURBa0FnQWtFQmNRMEFJQUpCQTNGRkRRRWdBU0FCS0FJQUlnSnJJZ0ZCQUNnQ21OQ0FnQUFpQkVrTkFTQUNJQUJxSVFBQ1FDQUJRUUFvQXB6UWdJQUFSZzBBQWtBZ0FrSC9BVXNOQUNBQktBSUlJZ1FnQWtFRGRpSUZRUU4wUWJEUWdJQUFhaUlHUmhvQ1FDQUJLQUlNSWdJZ0JFY05BRUVBUVFBb0FvalFnSUFBUVg0Z0JYZHhOZ0tJMElDQUFBd0RDeUFDSUFaR0dpQUNJQVEyQWdnZ0JDQUNOZ0lNREFJTElBRW9BaGdoQndKQUFrQWdBU2dDRENJR0lBRkdEUUFnQVNnQ0NDSUNJQVJKR2lBR0lBSTJBZ2dnQWlBR05nSU1EQUVMQWtBZ0FVRVVhaUlDS0FJQUlnUU5BQ0FCUVJCcUlnSW9BZ0FpQkEwQVFRQWhCZ3dCQ3dOQUlBSWhCU0FFSWdaQkZHb2lBaWdDQUNJRURRQWdCa0VRYWlFQ0lBWW9BaEFpQkEwQUN5QUZRUUEyQWdBTElBZEZEUUVDUUFKQUlBRWdBU2dDSENJRVFRSjBRYmpTZ0lBQWFpSUNLQUlBUncwQUlBSWdCallDQUNBR0RRRkJBRUVBS0FLTTBJQ0FBRUYrSUFSM2NUWUNqTkNBZ0FBTUF3c2dCMEVRUVJRZ0J5Z0NFQ0FCUmh0cUlBWTJBZ0FnQmtVTkFnc2dCaUFITmdJWUFrQWdBU2dDRUNJQ1JRMEFJQVlnQWpZQ0VDQUNJQVkyQWhnTElBRW9BaFFpQWtVTkFTQUdRUlJxSUFJMkFnQWdBaUFHTmdJWURBRUxJQU1vQWdRaUFrRURjVUVEUncwQUlBTWdBa0YrY1RZQ0JFRUFJQUEyQXBEUWdJQUFJQUVnQUdvZ0FEWUNBQ0FCSUFCQkFYSTJBZ1FQQ3lBQklBTlBEUUFnQXlnQ0JDSUNRUUZ4UlEwQUFrQUNRQ0FDUVFKeERRQUNRQ0FEUVFBb0FxRFFnSUFBUncwQVFRQWdBVFlDb05DQWdBQkJBRUVBS0FLVTBJQ0FBQ0FBYWlJQU5nS1UwSUNBQUNBQklBQkJBWEkyQWdRZ0FVRUFLQUtjMElDQUFFY05BMEVBUVFBMkFwRFFnSUFBUVFCQkFEWUNuTkNBZ0FBUEN3SkFJQU5CQUNnQ25OQ0FnQUJIRFFCQkFDQUJOZ0tjMElDQUFFRUFRUUFvQXBEUWdJQUFJQUJxSWdBMkFwRFFnSUFBSUFFZ0FFRUJjallDQkNBQklBQnFJQUEyQWdBUEN5QUNRWGh4SUFCcUlRQUNRQUpBSUFKQi93RkxEUUFnQXlnQ0NDSUVJQUpCQTNZaUJVRURkRUd3MElDQUFHb2lCa1lhQWtBZ0F5Z0NEQ0lDSUFSSERRQkJBRUVBS0FLSTBJQ0FBRUYrSUFWM2NUWUNpTkNBZ0FBTUFnc2dBaUFHUmhvZ0FpQUVOZ0lJSUFRZ0FqWUNEQXdCQ3lBREtBSVlJUWNDUUFKQUlBTW9BZ3dpQmlBRFJnMEFJQU1vQWdnaUFrRUFLQUtZMElDQUFFa2FJQVlnQWpZQ0NDQUNJQVkyQWd3TUFRc0NRQ0FEUVJScUlnSW9BZ0FpQkEwQUlBTkJFR29pQWlnQ0FDSUVEUUJCQUNFR0RBRUxBMEFnQWlFRklBUWlCa0VVYWlJQ0tBSUFJZ1FOQUNBR1FSQnFJUUlnQmlnQ0VDSUVEUUFMSUFWQkFEWUNBQXNnQjBVTkFBSkFBa0FnQXlBREtBSWNJZ1JCQW5SQnVOS0FnQUJxSWdJb0FnQkhEUUFnQWlBR05nSUFJQVlOQVVFQVFRQW9Bb3pRZ0lBQVFYNGdCSGR4TmdLTTBJQ0FBQXdDQ3lBSFFSQkJGQ0FIS0FJUUlBTkdHMm9nQmpZQ0FDQUdSUTBCQ3lBR0lBYzJBaGdDUUNBREtBSVFJZ0pGRFFBZ0JpQUNOZ0lRSUFJZ0JqWUNHQXNnQXlnQ0ZDSUNSUTBBSUFaQkZHb2dBallDQUNBQ0lBWTJBaGdMSUFFZ0FHb2dBRFlDQUNBQklBQkJBWEkyQWdRZ0FVRUFLQUtjMElDQUFFY05BVUVBSUFBMkFwRFFnSUFBRHdzZ0F5QUNRWDV4TmdJRUlBRWdBR29nQURZQ0FDQUJJQUJCQVhJMkFnUUxBa0FnQUVIL0FVc05BQ0FBUVhoeFFiRFFnSUFBYWlFQ0FrQUNRRUVBS0FLSTBJQ0FBQ0lFUVFFZ0FFRURkblFpQUhFTkFFRUFJQVFnQUhJMkFvalFnSUFBSUFJaEFBd0JDeUFDS0FJSUlRQUxJQUFnQVRZQ0RDQUNJQUUyQWdnZ0FTQUNOZ0lNSUFFZ0FEWUNDQThMUVI4aEFnSkFJQUJCLy8vL0Iwc05BQ0FBUVFoMklnSWdBa0dBL2o5cVFSQjJRUWh4SWdKMElnUWdCRUdBNEI5cVFSQjJRUVJ4SWdSMElnWWdCa0dBZ0E5cVFSQjJRUUp4SWdaMFFROTJJQUlnQkhJZ0JuSnJJZ0pCQVhRZ0FDQUNRUlZxZGtFQmNYSkJIR29oQWdzZ0FTQUNOZ0ljSUFGQ0FEY0NFQ0FDUVFKMFFialNnSUFBYWlFRUFrQUNRRUVBS0FLTTBJQ0FBQ0lHUVFFZ0FuUWlBM0VOQUNBRUlBRTJBZ0JCQUNBR0lBTnlOZ0tNMElDQUFDQUJJQVEyQWhnZ0FTQUJOZ0lJSUFFZ0FUWUNEQXdCQ3lBQVFRQkJHU0FDUVFGMmF5QUNRUjlHRzNRaEFpQUVLQUlBSVFZQ1FBTkFJQVlpQkNnQ0JFRjRjU0FBUmcwQklBSkJIWFloQmlBQ1FRRjBJUUlnQkNBR1FRUnhha0VRYWlJREtBSUFJZ1lOQUFzZ0F5QUJOZ0lBSUFFZ0JEWUNHQ0FCSUFFMkFnd2dBU0FCTmdJSURBRUxJQVFvQWdnaUFDQUJOZ0lNSUFRZ0FUWUNDQ0FCUVFBMkFoZ2dBU0FFTmdJTUlBRWdBRFlDQ0F0QkFFRUFLQUtvMElDQUFFRi9haUlCUVg4Z0FSczJBcWpRZ0lBQUN3c0VBQUFBQzA0QUFrQWdBQTBBUHdCQkVIUVBDd0pBSUFCQi8vOERjUTBBSUFCQmYwd05BQUpBSUFCQkVIWkFBQ0lBUVg5SERRQkJBRUV3TmdMNDA0Q0FBRUYvRHdzZ0FFRVFkQThMRU1xQWdJQUFBQXZ5QWdJRGZ3RitBa0FnQWtVTkFDQUFJQUU2QUFBZ0FpQUFhaUlEUVg5cUlBRTZBQUFnQWtFRFNRMEFJQUFnQVRvQUFpQUFJQUU2QUFFZ0EwRjlhaUFCT2dBQUlBTkJmbW9nQVRvQUFDQUNRUWRKRFFBZ0FDQUJPZ0FESUFOQmZHb2dBVG9BQUNBQ1FRbEpEUUFnQUVFQUlBQnJRUU54SWdScUlnTWdBVUgvQVhGQmdZS0VDR3dpQVRZQ0FDQURJQUlnQkd0QmZIRWlCR29pQWtGOGFpQUJOZ0lBSUFSQkNVa05BQ0FESUFFMkFnZ2dBeUFCTmdJRUlBSkJlR29nQVRZQ0FDQUNRWFJxSUFFMkFnQWdCRUVaU1EwQUlBTWdBVFlDR0NBRElBRTJBaFFnQXlBQk5nSVFJQU1nQVRZQ0RDQUNRWEJxSUFFMkFnQWdBa0ZzYWlBQk5nSUFJQUpCYUdvZ0FUWUNBQ0FDUVdScUlBRTJBZ0FnQkNBRFFRUnhRUmh5SWdWcklnSkJJRWtOQUNBQnJVS0JnSUNBRUg0aEJpQURJQVZxSVFFRFFDQUJJQVkzQXhnZ0FTQUdOd01RSUFFZ0JqY0RDQ0FCSUFZM0F3QWdBVUVnYWlFQklBSkJZR29pQWtFZlN3MEFDd3NnQUFzTGprZ0JBRUdBQ0F1R1NBRUFBQUFDQUFBQUF3QUFBQUFBQUFBQUFBQUFCQUFBQUFVQUFBQUFBQUFBQUFBQUFBWUFBQUFIQUFBQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFTVzUyWVd4cFpDQmphR0Z5SUdsdUlIVnliQ0J4ZFdWeWVRQlRjR0Z1SUdOaGJHeGlZV05ySUdWeWNtOXlJR2x1SUc5dVgySnZaSGtBUTI5dWRHVnVkQzFNWlc1bmRHZ2diM1psY21ac2IzY0FRMmgxYm1zZ2MybDZaU0J2ZG1WeVpteHZkd0JTWlhOd2IyNXpaU0J2ZG1WeVpteHZkd0JKYm5aaGJHbGtJRzFsZEdodlpDQm1iM0lnU0ZSVVVDOTRMbmdnY21WeGRXVnpkQUJKYm5aaGJHbGtJRzFsZEdodlpDQm1iM0lnVWxSVFVDOTRMbmdnY21WeGRXVnpkQUJGZUhCbFkzUmxaQ0JUVDFWU1EwVWdiV1YwYUc5a0lHWnZjaUJKUTBVdmVDNTRJSEpsY1hWbGMzUUFTVzUyWVd4cFpDQmphR0Z5SUdsdUlIVnliQ0JtY21GbmJXVnVkQ0J6ZEdGeWRBQkZlSEJsWTNSbFpDQmtiM1FBVTNCaGJpQmpZV3hzWW1GamF5Qmxjbkp2Y2lCcGJpQnZibDl6ZEdGMGRYTUFTVzUyWVd4cFpDQnlaWE53YjI1elpTQnpkR0YwZFhNQVNXNTJZV3hwWkNCamFHRnlZV04wWlhJZ2FXNGdZMmgxYm1zZ1pYaDBaVzV6YVc5dWN3QlZjMlZ5SUdOaGJHeGlZV05ySUdWeWNtOXlBR0J2Ymw5eVpYTmxkR0FnWTJGc2JHSmhZMnNnWlhKeWIzSUFZRzl1WDJOb2RXNXJYMmhsWVdSbGNtQWdZMkZzYkdKaFkyc2daWEp5YjNJQVlHOXVYMjFsYzNOaFoyVmZZbVZuYVc1Z0lHTmhiR3hpWVdOcklHVnljbTl5QUdCdmJsOWphSFZ1YTE5bGVIUmxibk5wYjI1ZmRtRnNkV1ZnSUdOaGJHeGlZV05ySUdWeWNtOXlBR0J2Ymw5emRHRjBkWE5mWTI5dGNHeGxkR1ZnSUdOaGJHeGlZV05ySUdWeWNtOXlBR0J2Ymw5MlpYSnphVzl1WDJOdmJYQnNaWFJsWUNCallXeHNZbUZqYXlCbGNuSnZjZ0JnYjI1ZmRYSnNYMk52YlhCc1pYUmxZQ0JqWVd4c1ltRmpheUJsY25KdmNnQmdiMjVmWTJoMWJtdGZZMjl0Y0d4bGRHVmdJR05oYkd4aVlXTnJJR1Z5Y205eUFHQnZibDlvWldGa1pYSmZkbUZzZFdWZlkyOXRjR3hsZEdWZ0lHTmhiR3hpWVdOcklHVnljbTl5QUdCdmJsOXRaWE56WVdkbFgyTnZiWEJzWlhSbFlDQmpZV3hzWW1GamF5Qmxjbkp2Y2dCZ2IyNWZiV1YwYUc5a1gyTnZiWEJzWlhSbFlDQmpZV3hzWW1GamF5Qmxjbkp2Y2dCZ2IyNWZhR1ZoWkdWeVgyWnBaV3hrWDJOdmJYQnNaWFJsWUNCallXeHNZbUZqYXlCbGNuSnZjZ0JnYjI1ZlkyaDFibXRmWlhoMFpXNXphVzl1WDI1aGJXVmdJR05oYkd4aVlXTnJJR1Z5Y205eUFGVnVaWGh3WldOMFpXUWdZMmhoY2lCcGJpQjFjbXdnYzJWeWRtVnlBRWx1ZG1Gc2FXUWdhR1ZoWkdWeUlIWmhiSFZsSUdOb1lYSUFTVzUyWVd4cFpDQm9aV0ZrWlhJZ1ptbGxiR1FnWTJoaGNnQlRjR0Z1SUdOaGJHeGlZV05ySUdWeWNtOXlJR2x1SUc5dVgzWmxjbk5wYjI0QVNXNTJZV3hwWkNCdGFXNXZjaUIyWlhKemFXOXVBRWx1ZG1Gc2FXUWdiV0ZxYjNJZ2RtVnljMmx2YmdCRmVIQmxZM1JsWkNCemNHRmpaU0JoWm5SbGNpQjJaWEp6YVc5dUFFVjRjR1ZqZEdWa0lFTlNURVlnWVdaMFpYSWdkbVZ5YzJsdmJnQkpiblpoYkdsa0lFaFVWRkFnZG1WeWMybHZiZ0JKYm5aaGJHbGtJR2hsWVdSbGNpQjBiMnRsYmdCVGNHRnVJR05oYkd4aVlXTnJJR1Z5Y205eUlHbHVJRzl1WDNWeWJBQkpiblpoYkdsa0lHTm9ZWEpoWTNSbGNuTWdhVzRnZFhKc0FGVnVaWGh3WldOMFpXUWdjM1JoY25RZ1kyaGhjaUJwYmlCMWNtd0FSRzkxWW14bElFQWdhVzRnZFhKc0FFVnRjSFI1SUVOdmJuUmxiblF0VEdWdVozUm9BRWx1ZG1Gc2FXUWdZMmhoY21GamRHVnlJR2x1SUVOdmJuUmxiblF0VEdWdVozUm9BRVIxY0d4cFkyRjBaU0JEYjI1MFpXNTBMVXhsYm1kMGFBQkpiblpoYkdsa0lHTm9ZWElnYVc0Z2RYSnNJSEJoZEdnQVEyOXVkR1Z1ZEMxTVpXNW5kR2dnWTJGdUozUWdZbVVnY0hKbGMyVnVkQ0IzYVhSb0lGUnlZVzV6Wm1WeUxVVnVZMjlrYVc1bkFFbHVkbUZzYVdRZ1kyaGhjbUZqZEdWeUlHbHVJR05vZFc1cklITnBlbVVBVTNCaGJpQmpZV3hzWW1GamF5Qmxjbkp2Y2lCcGJpQnZibDlvWldGa1pYSmZkbUZzZFdVQVUzQmhiaUJqWVd4c1ltRmpheUJsY25KdmNpQnBiaUJ2Ymw5amFIVnVhMTlsZUhSbGJuTnBiMjVmZG1Gc2RXVUFTVzUyWVd4cFpDQmphR0Z5WVdOMFpYSWdhVzRnWTJoMWJtc2daWGgwWlc1emFXOXVjeUIyWVd4MVpRQk5hWE56YVc1bklHVjRjR1ZqZEdWa0lFeEdJR0ZtZEdWeUlHaGxZV1JsY2lCMllXeDFaUUJKYm5aaGJHbGtJR0JVY21GdWMyWmxjaTFGYm1OdlpHbHVaMkFnYUdWaFpHVnlJSFpoYkhWbEFFbHVkbUZzYVdRZ1kyaGhjbUZqZEdWeUlHbHVJR05vZFc1cklHVjRkR1Z1YzJsdmJuTWdjWFZ2ZEdVZ2RtRnNkV1VBU1c1MllXeHBaQ0JqYUdGeVlXTjBaWElnYVc0Z1kyaDFibXNnWlhoMFpXNXphVzl1Y3lCeGRXOTBaV1FnZG1Gc2RXVUFVR0YxYzJWa0lHSjVJRzl1WDJobFlXUmxjbk5mWTI5dGNHeGxkR1VBU1c1MllXeHBaQ0JGVDBZZ2MzUmhkR1VBYjI1ZmNtVnpaWFFnY0dGMWMyVUFiMjVmWTJoMWJtdGZhR1ZoWkdWeUlIQmhkWE5sQUc5dVgyMWxjM05oWjJWZlltVm5hVzRnY0dGMWMyVUFiMjVmWTJoMWJtdGZaWGgwWlc1emFXOXVYM1poYkhWbElIQmhkWE5sQUc5dVgzTjBZWFIxYzE5amIyMXdiR1YwWlNCd1lYVnpaUUJ2Ymw5MlpYSnphVzl1WDJOdmJYQnNaWFJsSUhCaGRYTmxBRzl1WDNWeWJGOWpiMjF3YkdWMFpTQndZWFZ6WlFCdmJsOWphSFZ1YTE5amIyMXdiR1YwWlNCd1lYVnpaUUJ2Ymw5b1pXRmtaWEpmZG1Gc2RXVmZZMjl0Y0d4bGRHVWdjR0YxYzJVQWIyNWZiV1Z6YzJGblpWOWpiMjF3YkdWMFpTQndZWFZ6WlFCdmJsOXRaWFJvYjJSZlkyOXRjR3hsZEdVZ2NHRjFjMlVBYjI1ZmFHVmhaR1Z5WDJacFpXeGtYMk52YlhCc1pYUmxJSEJoZFhObEFHOXVYMk5vZFc1clgyVjRkR1Z1YzJsdmJsOXVZVzFsSUhCaGRYTmxBRlZ1Wlhod1pXTjBaV1FnYzNCaFkyVWdZV1owWlhJZ2MzUmhjblFnYkdsdVpRQlRjR0Z1SUdOaGJHeGlZV05ySUdWeWNtOXlJR2x1SUc5dVgyTm9kVzVyWDJWNGRHVnVjMmx2Ymw5dVlXMWxBRWx1ZG1Gc2FXUWdZMmhoY21GamRHVnlJR2x1SUdOb2RXNXJJR1Y0ZEdWdWMybHZibk1nYm1GdFpRQlFZWFZ6WlNCdmJpQkRUMDVPUlVOVUwxVndaM0poWkdVQVVHRjFjMlVnYjI0Z1VGSkpMMVZ3WjNKaFpHVUFSWGh3WldOMFpXUWdTRlJVVUM4eUlFTnZibTVsWTNScGIyNGdVSEpsWm1GalpRQlRjR0Z1SUdOaGJHeGlZV05ySUdWeWNtOXlJR2x1SUc5dVgyMWxkR2h2WkFCRmVIQmxZM1JsWkNCemNHRmpaU0JoWm5SbGNpQnRaWFJvYjJRQVUzQmhiaUJqWVd4c1ltRmpheUJsY25KdmNpQnBiaUJ2Ymw5b1pXRmtaWEpmWm1sbGJHUUFVR0YxYzJWa0FFbHVkbUZzYVdRZ2QyOXlaQ0JsYm1OdmRXNTBaWEpsWkFCSmJuWmhiR2xrSUcxbGRHaHZaQ0JsYm1OdmRXNTBaWEpsWkFCVmJtVjRjR1ZqZEdWa0lHTm9ZWElnYVc0Z2RYSnNJSE5qYUdWdFlRQlNaWEYxWlhOMElHaGhjeUJwYm5aaGJHbGtJR0JVY21GdWMyWmxjaTFGYm1OdlpHbHVaMkFBVTFkSlZFTklYMUJTVDFoWkFGVlRSVjlRVWs5WVdRQk5TMEZEVkVsV1NWUlpBRlZPVUZKUFEwVlRVMEZDVEVWZlJVNVVTVlJaQUVOUFVGa0FUVTlXUlVSZlVFVlNUVUZPUlU1VVRGa0FWRTlQWDBWQlVreFpBRTVQVkVsR1dRQkdRVWxNUlVSZlJFVlFSVTVFUlU1RFdRQkNRVVJmUjBGVVJWZEJXUUJRVEVGWkFGQlZWQUJEU0VWRFMwOVZWQUJIUVZSRlYwRlpYMVJKVFVWUFZWUUFVa1ZSVlVWVFZGOVVTVTFGVDFWVUFFNUZWRmRQVWt0ZlEwOU9Ua1ZEVkY5VVNVMUZUMVZVQUVOUFRrNUZRMVJKVDA1ZlZFbE5SVTlWVkFCTVQwZEpUbDlVU1UxRlQxVlVBRTVGVkZkUFVrdGZVa1ZCUkY5VVNVMUZUMVZVQUZCUFUxUUFUVWxUUkVsU1JVTlVSVVJmVWtWUlZVVlRWQUJEVEVsRlRsUmZRMHhQVTBWRVgxSkZVVlZGVTFRQVEweEpSVTVVWDBOTVQxTkZSRjlNVDBGRVgwSkJURUZPUTBWRVgxSkZVVlZGVTFRQVFrRkVYMUpGVVZWRlUxUUFTRlJVVUY5U1JWRlZSVk5VWDFORlRsUmZWRTlmU0ZSVVVGTmZVRTlTVkFCU1JWQlBVbFFBU1UxZlFWOVVSVUZRVDFRQVVrVlRSVlJmUTA5T1ZFVk9WQUJPVDE5RFQwNVVSVTVVQUZCQlVsUkpRVXhmUTA5T1ZFVk9WQUJJVUVWZlNVNVdRVXhKUkY5RFQwNVRWRUZPVkFCSVVFVmZRMEpmVWtWVFJWUUFSMFZVQUVoUVJWOVRWRkpKUTFRQVEwOU9Sa3hKUTFRQVZFVk5VRTlTUVZKWlgxSkZSRWxTUlVOVUFGQkZVazFCVGtWT1ZGOVNSVVJKVWtWRFZBQkRUMDVPUlVOVUFFMVZURlJKWDFOVVFWUlZVd0JJVUVWZlNVNVdRVXhKUkY5VFZFRlVWVk1BVkU5UFgwMUJUbGxmVWtWUlZVVlRWRk1BUlVGU1RGbGZTRWxPVkZNQVZVNUJWa0ZKVEVGQ1RFVmZSazlTWDB4RlIwRk1YMUpGUVZOUFRsTUFUMUJVU1U5T1V3QlRWMGxVUTBoSlRrZGZVRkpQVkU5RFQweFRBRlpCVWtsQlRsUmZRVXhUVDE5T1JVZFBWRWxCVkVWVEFFMVZURlJKVUV4RlgwTklUMGxEUlZNQVNVNVVSVkpPUVV4ZlUwVlNWa1ZTWDBWU1VrOVNBRmRGUWw5VFJWSldSVkpmVlU1TFRrOVhUbDlGVWxKUFVnQlNRVWxNUjFWT1gwVlNVazlTQUVsRVJVNVVTVlJaWDFCU1QxWkpSRVZTWDBGVlZFaEZUbFJKUTBGVVNVOU9YMFZTVWs5U0FGTlRURjlEUlZKVVNVWkpRMEZVUlY5RlVsSlBVZ0JKVGxaQlRFbEVYMWhmUms5U1YwRlNSRVZFWDBaUFVnQlRSVlJmVUVGU1FVMUZWRVZTQUVkRlZGOVFRVkpCVFVWVVJWSUFTRkJGWDFWVFJWSUFVMFZGWDA5VVNFVlNBRWhRUlY5RFFsOURTRlZPUzE5SVJVRkVSVklBVFV0RFFVeEZUa1JCVWdCVFJWUlZVQUJYUlVKZlUwVlNWa1ZTWDBsVFgwUlBWMDRBVkVWQlVrUlBWMDRBU0ZCRlgwTk1UMU5GUkY5RFQwNU9SVU5VU1U5T0FFaEZWVkpKVTFSSlExOUZXRkJKVWtGVVNVOU9BRVJKVTBOUFRrNUZRMVJGUkY5UFVFVlNRVlJKVDA0QVRrOU9YMEZWVkVoUFVrbFVRVlJKVmtWZlNVNUdUMUpOUVZSSlQwNEFTRkJGWDBsT1ZrRk1TVVJmVmtWU1UwbFBUZ0JJVUVWZlEwSmZUVVZUVTBGSFJWOUNSVWRKVGdCVFNWUkZYMGxUWDBaU1QxcEZUZ0JJVUVWZlNVNVdRVXhKUkY5SVJVRkVSVkpmVkU5TFJVNEFTVTVXUVV4SlJGOVVUMHRGVGdCR1QxSkNTVVJFUlU0QVJVNUlRVTVEUlY5WlQxVlNYME5CVEUwQVNGQkZYMGxPVmtGTVNVUmZWVkpNQUVKTVQwTkxSVVJmUWxsZlVFRlNSVTVVUVV4ZlEwOU9WRkpQVEFCTlMwTlBUQUJCUTB3QVNGQkZYMGxPVkVWU1RrRk1BRkpGVVZWRlUxUmZTRVZCUkVWU1gwWkpSVXhFVTE5VVQwOWZURUZTUjBWZlZVNVBSa1pKUTBsQlRBQklVRVZmVDBzQVZVNU1TVTVMQUZWT1RFOURTd0JRVWtrQVVrVlVVbGxmVjBsVVNBQklVRVZmU1U1V1FVeEpSRjlEVDA1VVJVNVVYMHhGVGtkVVNBQklVRVZmVlU1RldGQkZRMVJGUkY5RFQwNVVSVTVVWDB4RlRrZFVTQUJHVEZWVFNBQlFVazlRVUVGVVEwZ0FUUzFUUlVGU1EwZ0FWVkpKWDFSUFQxOU1UMDVIQUZCU1QwTkZVMU5KVGtjQVRVbFRRMFZNVEVGT1JVOVZVMTlRUlZKVFNWTlVSVTVVWDFkQlVrNUpUa2NBVFVsVFEwVk1URUZPUlU5VlUxOVhRVkpPU1U1SEFFaFFSVjlKVGxaQlRFbEVYMVJTUVU1VFJrVlNYMFZPUTA5RVNVNUhBRVY0Y0dWamRHVmtJRU5TVEVZQVNGQkZYMGxPVmtGTVNVUmZRMGhWVGt0ZlUwbGFSUUJOVDFaRkFFTlBUbFJKVGxWRkFFaFFSVjlEUWw5VFZFRlVWVk5mUTA5TlVFeEZWRVVBU0ZCRlgwTkNYMGhGUVVSRlVsTmZRMDlOVUV4RlZFVUFTRkJGWDBOQ1gxWkZVbE5KVDA1ZlEwOU5VRXhGVkVVQVNGQkZYME5DWDFWU1RGOURUMDFRVEVWVVJRQklVRVZmUTBKZlEwaFZUa3RmUTA5TlVFeEZWRVVBU0ZCRlgwTkNYMGhGUVVSRlVsOVdRVXhWUlY5RFQwMVFURVZVUlFCSVVFVmZRMEpmUTBoVlRrdGZSVmhVUlU1VFNVOU9YMVpCVEZWRlgwTlBUVkJNUlZSRkFFaFFSVjlEUWw5RFNGVk9TMTlGV0ZSRlRsTkpUMDVmVGtGTlJWOURUMDFRVEVWVVJRQklVRVZmUTBKZlRVVlRVMEZIUlY5RFQwMVFURVZVUlFCSVVFVmZRMEpmVFVWVVNFOUVYME5QVFZCTVJWUkZBRWhRUlY5RFFsOUlSVUZFUlZKZlJrbEZURVJmUTA5TlVFeEZWRVVBUkVWTVJWUkZBRWhRUlY5SlRsWkJURWxFWDBWUFJsOVRWRUZVUlFCSlRsWkJURWxFWDFOVFRGOURSVkpVU1VaSlEwRlVSUUJRUVZWVFJRQk9UMTlTUlZOUVQwNVRSUUJWVGxOVlVGQlBVbFJGUkY5TlJVUkpRVjlVV1ZCRkFFZFBUa1VBVGs5VVgwRkRRMFZRVkVGQ1RFVUFVMFZTVmtsRFJWOVZUa0ZXUVVsTVFVSk1SUUJTUVU1SFJWOU9UMVJmVTBGVVNWTkdTVUZDVEVVQVQxSkpSMGxPWDBsVFgxVk9Va1ZCUTBoQlFreEZBRkpGVTFCUFRsTkZYMGxUWDFOVVFVeEZBRkJWVWtkRkFFMUZVa2RGQUZKRlVWVkZVMVJmU0VWQlJFVlNYMFpKUlV4RVUxOVVUMDlmVEVGU1IwVUFVa1ZSVlVWVFZGOUlSVUZFUlZKZlZFOVBYMHhCVWtkRkFGQkJXVXhQUVVSZlZFOVBYMHhCVWtkRkFFbE9VMVZHUmtsRFNVVk9WRjlUVkU5U1FVZEZBRWhRUlY5UVFWVlRSVVJmVlZCSFVrRkVSUUJJVUVWZlVFRlZVMFZFWDBneVgxVlFSMUpCUkVVQVUwOVZVa05GQUVGT1RrOVZUa05GQUZSU1FVTkZBRWhRUlY5VlRrVllVRVZEVkVWRVgxTlFRVU5GQUVSRlUwTlNTVUpGQUZWT1UxVkNVME5TU1VKRkFGSkZRMDlTUkFCSVVFVmZTVTVXUVV4SlJGOU5SVlJJVDBRQVRrOVVYMFpQVlU1RUFGQlNUMUJHU1U1RUFGVk9Ra2xPUkFCU1JVSkpUa1FBVlU1QlZWUklUMUpKV2tWRUFFMUZWRWhQUkY5T1QxUmZRVXhNVDFkRlJBQklWRlJRWDFaRlVsTkpUMDVmVGs5VVgxTlZVRkJQVWxSRlJBQkJURkpGUVVSWlgxSkZVRTlTVkVWRUFFRkRRMFZRVkVWRUFFNVBWRjlKVFZCTVJVMUZUbFJGUkFCTVQwOVFYMFJGVkVWRFZFVkVBRWhRUlY5RFVsOUZXRkJGUTFSRlJBQklVRVZmVEVaZlJWaFFSVU5VUlVRQVExSkZRVlJGUkFCSlRWOVZVMFZFQUVoUVJWOVFRVlZUUlVRQVZFbE5SVTlWVkY5UFEwTlZVa1ZFQUZCQldVMUZUbFJmVWtWUlZVbFNSVVFBVUZKRlEwOU9SRWxVU1U5T1gxSkZVVlZKVWtWRUFGQlNUMWhaWDBGVlZFaEZUbFJKUTBGVVNVOU9YMUpGVVZWSlVrVkVBRTVGVkZkUFVrdGZRVlZVU0VWT1ZFbERRVlJKVDA1ZlVrVlJWVWxTUlVRQVRFVk9SMVJJWDFKRlVWVkpVa1ZFQUZOVFRGOURSVkpVU1VaSlEwRlVSVjlTUlZGVlNWSkZSQUJWVUVkU1FVUkZYMUpGVVZWSlVrVkVBRkJCUjBWZlJWaFFTVkpGUkFCUVVrVkRUMDVFU1ZSSlQwNWZSa0ZKVEVWRUFFVllVRVZEVkVGVVNVOU9YMFpCU1V4RlJBQlNSVlpCVEVsRVFWUkpUMDVmUmtGSlRFVkVBRk5UVEY5SVFVNUVVMGhCUzBWZlJrRkpURVZFQUV4UFEwdEZSQUJVVWtGT1UwWlBVazFCVkVsUFRsOUJVRkJNU1VWRUFFNVBWRjlOVDBSSlJrbEZSQUJPVDFSZlJWaFVSVTVFUlVRQVFrRk9SRmRKUkZSSVgweEpUVWxVWDBWWVEwVkZSRVZFQUZOSlZFVmZTVk5mVDFaRlVreFBRVVJGUkFCSVJVRkVBRVY0Y0dWamRHVmtJRWhVVkZBdkFBQmVFd0FBSmhNQUFEQVFBQUR3RndBQW5STUFBQlVTQUFBNUZ3QUE4QklBQUFvUUFBQjFFZ0FBclJJQUFJSVRBQUJQRkFBQWZ4QUFBS0FWQUFBakZBQUFpUklBQUlzVUFBQk5GUUFBMUJFQUFNOFVBQUFRR0FBQXlSWUFBTndXQUFEQkVRQUE0QmNBQUxzVUFBQjBGQUFBZkJVQUFPVVVBQUFJRndBQUh4QUFBR1VWQUFDakZBQUFLQlVBQUFJVkFBQ1pGUUFBTEJBQUFJc1pBQUJQRHdBQTFBNEFBR29RQUFET0VBQUFBaGNBQUlrT0FBQnVFd0FBSEJNQUFHWVVBQUJXRndBQXdSTUFBTTBUQUFCc0V3QUFhQmNBQUdZWEFBQmZGd0FBSWhNQUFNNFBBQUJwRGdBQTJBNEFBR01XQUFETEV3QUFxZzRBQUNnWEFBQW1Gd0FBeFJNQUFGMFdBQURvRVFBQVp4TUFBR1VUQUFEeUZnQUFjeE1BQUIwWEFBRDVGZ0FBOHhFQUFNOE9BQURPRlFBQURCSUFBTE1SQUFDbEVRQUFZUkFBQURJWEFBQzdFd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUJBZ0VCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdNQ0FnSUNBZ0FBQWdJQUFnSUFBZ0lDQWdJQ0FnSUNBZ0FFQUFBQUFBQUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnQUFBQUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQUFJQUFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUFBZ0lDQWdJQUFBSUNBQUlDQUFJQ0FnSUNBZ0lDQWdJQUF3QUVBQUFBQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lBQUFBQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnQUNBQUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCc2IzTmxaV1Z3TFdGc2FYWmxBQUFBQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVFFQkFRRUJBUUVCQVFFQkFnRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUFBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUZqYUhWdWEyVmtBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFRQUJBUUVCQVFBQUFRRUFBUUVBQVFFQkFRRUJBUUVCQVFBQUFBQUFBQUFCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUFBQUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFBRUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdWamRHbHZibVZ1ZEMxc1pXNW5kR2h2Ym5KdmVIa3RZMjl1Ym1WamRHbHZiZ0FBQUFBQUFBQUFBQUFBQUFBQUFISmhibk5tWlhJdFpXNWpiMlJwYm1kd1ozSmhaR1VOQ2cwS0RRcFRUUTBLRFFwVVZGQXZRMFV2VkZOUUx3QUFBQUFBQUFBQUFBQUFBQUVDQUFFREFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVBQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQUFBQUFBQUFBQUFBQkFnQUJBd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVFCQVFVQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFBRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBQUFBQUFBQUFBQUFBUUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRRUFBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUFCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQUFBQUFBQUFBQUFBQkFBQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBd1FBQUFRRUJBUUVCQVFFQkFRRUJRUUVCQVFFQkFRRUJBUUVCQUFFQUFZSEJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUFBUUFCQUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQUFBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdBQUFBQUFBQU1EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBQUFBQUFBQUF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBZ0FBQUFBQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdBQUFBQUFBQU1EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFNVBWVTVEUlVWRFMwOVZWRTVGUTFSRlZFVkRVa2xDUlV4VlUwaEZWRVZCUkZORlFWSkRTRkpIUlVOVVNWWkpWRmxNUlU1RVFWSldSVTlVU1VaWlVGUkpUMDVUUTBoVFJVRlpVMVJCVkVOSVIwVlBVa1JKVWtWRFZFOVNWRkpEU0ZCQlVrRk5SVlJGVWxWU1EwVkNVME5TU1VKRlFWSkVUMWRPUVVORlNVNUVUa3REUzFWQ1UwTlNTVUpGU0ZSVVVDOUJSRlJRTHc9PSdcbiIsIi8vIEB0cy1jaGVja1xuXG4ndXNlIHN0cmljdCdcblxuLyogZ2xvYmFsIFdlYkFzc2VtYmx5ICovXG5cbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5jb25zdCBuZXQgPSByZXF1aXJlKCduZXQnKVxuY29uc3QgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKVxuY29uc3QgeyBwaXBlbGluZSB9ID0gcmVxdWlyZSgnc3RyZWFtJylcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuL2NvcmUvdXRpbCcpXG5jb25zdCB0aW1lcnMgPSByZXF1aXJlKCcuL3RpbWVycycpXG5jb25zdCBSZXF1ZXN0ID0gcmVxdWlyZSgnLi9jb3JlL3JlcXVlc3QnKVxuY29uc3QgRGlzcGF0Y2hlckJhc2UgPSByZXF1aXJlKCcuL2Rpc3BhdGNoZXItYmFzZScpXG5jb25zdCB7XG4gIFJlcXVlc3RDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcixcbiAgUmVzcG9uc2VDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcixcbiAgSW52YWxpZEFyZ3VtZW50RXJyb3IsXG4gIFJlcXVlc3RBYm9ydGVkRXJyb3IsXG4gIEhlYWRlcnNUaW1lb3V0RXJyb3IsXG4gIEhlYWRlcnNPdmVyZmxvd0Vycm9yLFxuICBTb2NrZXRFcnJvcixcbiAgSW5mb3JtYXRpb25hbEVycm9yLFxuICBCb2R5VGltZW91dEVycm9yLFxuICBIVFRQUGFyc2VyRXJyb3IsXG4gIFJlc3BvbnNlRXhjZWVkZWRNYXhTaXplRXJyb3IsXG4gIENsaWVudERlc3Ryb3llZEVycm9yXG59ID0gcmVxdWlyZSgnLi9jb3JlL2Vycm9ycycpXG5jb25zdCBidWlsZENvbm5lY3RvciA9IHJlcXVpcmUoJy4vY29yZS9jb25uZWN0JylcbmNvbnN0IHtcbiAga1VybCxcbiAga1Jlc2V0LFxuICBrU2VydmVyTmFtZSxcbiAga0NsaWVudCxcbiAga0J1c3ksXG4gIGtQYXJzZXIsXG4gIGtDb25uZWN0LFxuICBrQmxvY2tpbmcsXG4gIGtSZXN1bWluZyxcbiAga1J1bm5pbmcsXG4gIGtQZW5kaW5nLFxuICBrU2l6ZSxcbiAga1dyaXRpbmcsXG4gIGtRdWV1ZSxcbiAga0Nvbm5lY3RlZCxcbiAga0Nvbm5lY3RpbmcsXG4gIGtOZWVkRHJhaW4sXG4gIGtOb1JlZixcbiAga0tlZXBBbGl2ZURlZmF1bHRUaW1lb3V0LFxuICBrSG9zdEhlYWRlcixcbiAga1BlbmRpbmdJZHgsXG4gIGtSdW5uaW5nSWR4LFxuICBrRXJyb3IsXG4gIGtQaXBlbGluaW5nLFxuICBrU29ja2V0LFxuICBrS2VlcEFsaXZlVGltZW91dFZhbHVlLFxuICBrTWF4SGVhZGVyc1NpemUsXG4gIGtLZWVwQWxpdmVNYXhUaW1lb3V0LFxuICBrS2VlcEFsaXZlVGltZW91dFRocmVzaG9sZCxcbiAga0hlYWRlcnNUaW1lb3V0LFxuICBrQm9keVRpbWVvdXQsXG4gIGtTdHJpY3RDb250ZW50TGVuZ3RoLFxuICBrQ29ubmVjdG9yLFxuICBrTWF4UmVkaXJlY3Rpb25zLFxuICBrTWF4UmVxdWVzdHMsXG4gIGtDb3VudGVyLFxuICBrQ2xvc2UsXG4gIGtEZXN0cm95LFxuICBrRGlzcGF0Y2gsXG4gIGtJbnRlcmNlcHRvcnMsXG4gIGtMb2NhbEFkZHJlc3MsXG4gIGtNYXhSZXNwb25zZVNpemUsXG4gIGtIVFRQQ29ublZlcnNpb24sXG4gIC8vIEhUVFAyXG4gIGtIb3N0LFxuICBrSFRUUDJTZXNzaW9uLFxuICBrSFRUUDJTZXNzaW9uU3RhdGUsXG4gIGtIVFRQMkJ1aWxkUmVxdWVzdCxcbiAga0hUVFAyQ29weUhlYWRlcnMsXG4gIGtIVFRQMUJ1aWxkUmVxdWVzdFxufSA9IHJlcXVpcmUoJy4vY29yZS9zeW1ib2xzJylcblxuLyoqIEB0eXBlIHtpbXBvcnQoJ2h0dHAyJyl9ICovXG5sZXQgaHR0cDJcbnRyeSB7XG4gIGh0dHAyID0gcmVxdWlyZSgnaHR0cDInKVxufSBjYXRjaCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgaHR0cDIgPSB7IGNvbnN0YW50czoge30gfVxufVxuXG5jb25zdCB7XG4gIGNvbnN0YW50czoge1xuICAgIEhUVFAyX0hFQURFUl9BVVRIT1JJVFksXG4gICAgSFRUUDJfSEVBREVSX01FVEhPRCxcbiAgICBIVFRQMl9IRUFERVJfUEFUSCxcbiAgICBIVFRQMl9IRUFERVJfU0NIRU1FLFxuICAgIEhUVFAyX0hFQURFUl9DT05URU5UX0xFTkdUSCxcbiAgICBIVFRQMl9IRUFERVJfRVhQRUNULFxuICAgIEhUVFAyX0hFQURFUl9TVEFUVVNcbiAgfVxufSA9IGh0dHAyXG5cbi8vIEV4cGVyaW1lbnRhbFxubGV0IGgyRXhwZXJpbWVudGFsV2FybmVkID0gZmFsc2VcblxuY29uc3QgRmFzdEJ1ZmZlciA9IEJ1ZmZlcltTeW1ib2wuc3BlY2llc11cblxuY29uc3Qga0Nsb3NlZFJlc29sdmUgPSBTeW1ib2woJ2tDbG9zZWRSZXNvbHZlJylcblxuY29uc3QgY2hhbm5lbHMgPSB7fVxuXG50cnkge1xuICBjb25zdCBkaWFnbm9zdGljc0NoYW5uZWwgPSByZXF1aXJlKCdkaWFnbm9zdGljc19jaGFubmVsJylcbiAgY2hhbm5lbHMuc2VuZEhlYWRlcnMgPSBkaWFnbm9zdGljc0NoYW5uZWwuY2hhbm5lbCgndW5kaWNpOmNsaWVudDpzZW5kSGVhZGVycycpXG4gIGNoYW5uZWxzLmJlZm9yZUNvbm5lY3QgPSBkaWFnbm9zdGljc0NoYW5uZWwuY2hhbm5lbCgndW5kaWNpOmNsaWVudDpiZWZvcmVDb25uZWN0JylcbiAgY2hhbm5lbHMuY29ubmVjdEVycm9yID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTpjbGllbnQ6Y29ubmVjdEVycm9yJylcbiAgY2hhbm5lbHMuY29ubmVjdGVkID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTpjbGllbnQ6Y29ubmVjdGVkJylcbn0gY2F0Y2gge1xuICBjaGFubmVscy5zZW5kSGVhZGVycyA9IHsgaGFzU3Vic2NyaWJlcnM6IGZhbHNlIH1cbiAgY2hhbm5lbHMuYmVmb3JlQ29ubmVjdCA9IHsgaGFzU3Vic2NyaWJlcnM6IGZhbHNlIH1cbiAgY2hhbm5lbHMuY29ubmVjdEVycm9yID0geyBoYXNTdWJzY3JpYmVyczogZmFsc2UgfVxuICBjaGFubmVscy5jb25uZWN0ZWQgPSB7IGhhc1N1YnNjcmliZXJzOiBmYWxzZSB9XG59XG5cbi8qKlxuICogQHR5cGUge2ltcG9ydCgnLi4vdHlwZXMvY2xpZW50JykuZGVmYXVsdH1cbiAqL1xuY2xhc3MgQ2xpZW50IGV4dGVuZHMgRGlzcGF0Y2hlckJhc2Uge1xuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8VVJMfSB1cmxcbiAgICogQHBhcmFtIHtpbXBvcnQoJy4uL3R5cGVzL2NsaWVudCcpLkNsaWVudC5PcHRpb25zfSBvcHRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvciAodXJsLCB7XG4gICAgaW50ZXJjZXB0b3JzLFxuICAgIG1heEhlYWRlclNpemUsXG4gICAgaGVhZGVyc1RpbWVvdXQsXG4gICAgc29ja2V0VGltZW91dCxcbiAgICByZXF1ZXN0VGltZW91dCxcbiAgICBjb25uZWN0VGltZW91dCxcbiAgICBib2R5VGltZW91dCxcbiAgICBpZGxlVGltZW91dCxcbiAgICBrZWVwQWxpdmUsXG4gICAga2VlcEFsaXZlVGltZW91dCxcbiAgICBtYXhLZWVwQWxpdmVUaW1lb3V0LFxuICAgIGtlZXBBbGl2ZU1heFRpbWVvdXQsXG4gICAga2VlcEFsaXZlVGltZW91dFRocmVzaG9sZCxcbiAgICBzb2NrZXRQYXRoLFxuICAgIHBpcGVsaW5pbmcsXG4gICAgdGxzLFxuICAgIHN0cmljdENvbnRlbnRMZW5ndGgsXG4gICAgbWF4Q2FjaGVkU2Vzc2lvbnMsXG4gICAgbWF4UmVkaXJlY3Rpb25zLFxuICAgIGNvbm5lY3QsXG4gICAgbWF4UmVxdWVzdHNQZXJDbGllbnQsXG4gICAgbG9jYWxBZGRyZXNzLFxuICAgIG1heFJlc3BvbnNlU2l6ZSxcbiAgICBhdXRvU2VsZWN0RmFtaWx5LFxuICAgIGF1dG9TZWxlY3RGYW1pbHlBdHRlbXB0VGltZW91dCxcbiAgICAvLyBoMlxuICAgIGFsbG93SDIsXG4gICAgbWF4Q29uY3VycmVudFN0cmVhbXNcbiAgfSA9IHt9KSB7XG4gICAgc3VwZXIoKVxuXG4gICAgaWYgKGtlZXBBbGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3Vuc3VwcG9ydGVkIGtlZXBBbGl2ZSwgdXNlIHBpcGVsaW5pbmc9MCBpbnN0ZWFkJylcbiAgICB9XG5cbiAgICBpZiAoc29ja2V0VGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3Vuc3VwcG9ydGVkIHNvY2tldFRpbWVvdXQsIHVzZSBoZWFkZXJzVGltZW91dCAmIGJvZHlUaW1lb3V0IGluc3RlYWQnKVxuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0VGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3Vuc3VwcG9ydGVkIHJlcXVlc3RUaW1lb3V0LCB1c2UgaGVhZGVyc1RpbWVvdXQgJiBib2R5VGltZW91dCBpbnN0ZWFkJylcbiAgICB9XG5cbiAgICBpZiAoaWRsZVRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCd1bnN1cHBvcnRlZCBpZGxlVGltZW91dCwgdXNlIGtlZXBBbGl2ZVRpbWVvdXQgaW5zdGVhZCcpXG4gICAgfVxuXG4gICAgaWYgKG1heEtlZXBBbGl2ZVRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCd1bnN1cHBvcnRlZCBtYXhLZWVwQWxpdmVUaW1lb3V0LCB1c2Uga2VlcEFsaXZlTWF4VGltZW91dCBpbnN0ZWFkJylcbiAgICB9XG5cbiAgICBpZiAobWF4SGVhZGVyU2l6ZSAhPSBudWxsICYmICFOdW1iZXIuaXNGaW5pdGUobWF4SGVhZGVyU2l6ZSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBtYXhIZWFkZXJTaXplJylcbiAgICB9XG5cbiAgICBpZiAoc29ja2V0UGF0aCAhPSBudWxsICYmIHR5cGVvZiBzb2NrZXRQYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIHNvY2tldFBhdGgnKVxuICAgIH1cblxuICAgIGlmIChjb25uZWN0VGltZW91dCAhPSBudWxsICYmICghTnVtYmVyLmlzRmluaXRlKGNvbm5lY3RUaW1lb3V0KSB8fCBjb25uZWN0VGltZW91dCA8IDApKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgY29ubmVjdFRpbWVvdXQnKVxuICAgIH1cblxuICAgIGlmIChrZWVwQWxpdmVUaW1lb3V0ICE9IG51bGwgJiYgKCFOdW1iZXIuaXNGaW5pdGUoa2VlcEFsaXZlVGltZW91dCkgfHwga2VlcEFsaXZlVGltZW91dCA8PSAwKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGtlZXBBbGl2ZVRpbWVvdXQnKVxuICAgIH1cblxuICAgIGlmIChrZWVwQWxpdmVNYXhUaW1lb3V0ICE9IG51bGwgJiYgKCFOdW1iZXIuaXNGaW5pdGUoa2VlcEFsaXZlTWF4VGltZW91dCkgfHwga2VlcEFsaXZlTWF4VGltZW91dCA8PSAwKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGtlZXBBbGl2ZU1heFRpbWVvdXQnKVxuICAgIH1cblxuICAgIGlmIChrZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkICE9IG51bGwgJiYgIU51bWJlci5pc0Zpbml0ZShrZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGtlZXBBbGl2ZVRpbWVvdXRUaHJlc2hvbGQnKVxuICAgIH1cblxuICAgIGlmIChoZWFkZXJzVGltZW91dCAhPSBudWxsICYmICghTnVtYmVyLmlzSW50ZWdlcihoZWFkZXJzVGltZW91dCkgfHwgaGVhZGVyc1RpbWVvdXQgPCAwKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdoZWFkZXJzVGltZW91dCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBvciB6ZXJvJylcbiAgICB9XG5cbiAgICBpZiAoYm9keVRpbWVvdXQgIT0gbnVsbCAmJiAoIU51bWJlci5pc0ludGVnZXIoYm9keVRpbWVvdXQpIHx8IGJvZHlUaW1lb3V0IDwgMCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignYm9keVRpbWVvdXQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgb3IgemVybycpXG4gICAgfVxuXG4gICAgaWYgKGNvbm5lY3QgIT0gbnVsbCAmJiB0eXBlb2YgY29ubmVjdCAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgY29ubmVjdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignY29ubmVjdCBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0JylcbiAgICB9XG5cbiAgICBpZiAobWF4UmVkaXJlY3Rpb25zICE9IG51bGwgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKG1heFJlZGlyZWN0aW9ucykgfHwgbWF4UmVkaXJlY3Rpb25zIDwgMCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignbWF4UmVkaXJlY3Rpb25zIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKVxuICAgIH1cblxuICAgIGlmIChtYXhSZXF1ZXN0c1BlckNsaWVudCAhPSBudWxsICYmICghTnVtYmVyLmlzSW50ZWdlcihtYXhSZXF1ZXN0c1BlckNsaWVudCkgfHwgbWF4UmVxdWVzdHNQZXJDbGllbnQgPCAwKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdtYXhSZXF1ZXN0c1BlckNsaWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJylcbiAgICB9XG5cbiAgICBpZiAobG9jYWxBZGRyZXNzICE9IG51bGwgJiYgKHR5cGVvZiBsb2NhbEFkZHJlc3MgIT09ICdzdHJpbmcnIHx8IG5ldC5pc0lQKGxvY2FsQWRkcmVzcykgPT09IDApKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2xvY2FsQWRkcmVzcyBtdXN0IGJlIHZhbGlkIHN0cmluZyBJUCBhZGRyZXNzJylcbiAgICB9XG5cbiAgICBpZiAobWF4UmVzcG9uc2VTaXplICE9IG51bGwgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKG1heFJlc3BvbnNlU2l6ZSkgfHwgbWF4UmVzcG9uc2VTaXplIDwgLTEpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ21heFJlc3BvbnNlU2l6ZSBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJylcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBhdXRvU2VsZWN0RmFtaWx5QXR0ZW1wdFRpbWVvdXQgIT0gbnVsbCAmJlxuICAgICAgKCFOdW1iZXIuaXNJbnRlZ2VyKGF1dG9TZWxlY3RGYW1pbHlBdHRlbXB0VGltZW91dCkgfHwgYXV0b1NlbGVjdEZhbWlseUF0dGVtcHRUaW1lb3V0IDwgLTEpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2F1dG9TZWxlY3RGYW1pbHlBdHRlbXB0VGltZW91dCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJylcbiAgICB9XG5cbiAgICAvLyBoMlxuICAgIGlmIChhbGxvd0gyICE9IG51bGwgJiYgdHlwZW9mIGFsbG93SDIgIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdhbGxvd0gyIG11c3QgYmUgYSB2YWxpZCBib29sZWFuIHZhbHVlJylcbiAgICB9XG5cbiAgICBpZiAobWF4Q29uY3VycmVudFN0cmVhbXMgIT0gbnVsbCAmJiAodHlwZW9mIG1heENvbmN1cnJlbnRTdHJlYW1zICE9PSAnbnVtYmVyJyB8fCBtYXhDb25jdXJyZW50U3RyZWFtcyA8IDEpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ21heENvbmN1cnJlbnRTdHJlYW1zIG11c3QgYmUgYSBwb3NzaXRpdmUgaW50ZWdlciwgZ3JlYXRlciB0aGFuIDAnKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29ubmVjdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29ubmVjdCA9IGJ1aWxkQ29ubmVjdG9yKHtcbiAgICAgICAgLi4udGxzLFxuICAgICAgICBtYXhDYWNoZWRTZXNzaW9ucyxcbiAgICAgICAgYWxsb3dIMixcbiAgICAgICAgc29ja2V0UGF0aCxcbiAgICAgICAgdGltZW91dDogY29ubmVjdFRpbWVvdXQsXG4gICAgICAgIC4uLih1dGlsLm5vZGVIYXNBdXRvU2VsZWN0RmFtaWx5ICYmIGF1dG9TZWxlY3RGYW1pbHkgPyB7IGF1dG9TZWxlY3RGYW1pbHksIGF1dG9TZWxlY3RGYW1pbHlBdHRlbXB0VGltZW91dCB9IDogdW5kZWZpbmVkKSxcbiAgICAgICAgLi4uY29ubmVjdFxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0aGlzW2tJbnRlcmNlcHRvcnNdID0gaW50ZXJjZXB0b3JzICYmIGludGVyY2VwdG9ycy5DbGllbnQgJiYgQXJyYXkuaXNBcnJheShpbnRlcmNlcHRvcnMuQ2xpZW50KVxuICAgICAgPyBpbnRlcmNlcHRvcnMuQ2xpZW50XG4gICAgICA6IFtjcmVhdGVSZWRpcmVjdEludGVyY2VwdG9yKHsgbWF4UmVkaXJlY3Rpb25zIH0pXVxuICAgIHRoaXNba1VybF0gPSB1dGlsLnBhcnNlT3JpZ2luKHVybClcbiAgICB0aGlzW2tDb25uZWN0b3JdID0gY29ubmVjdFxuICAgIHRoaXNba1NvY2tldF0gPSBudWxsXG4gICAgdGhpc1trUGlwZWxpbmluZ10gPSBwaXBlbGluaW5nICE9IG51bGwgPyBwaXBlbGluaW5nIDogMVxuICAgIHRoaXNba01heEhlYWRlcnNTaXplXSA9IG1heEhlYWRlclNpemUgfHwgaHR0cC5tYXhIZWFkZXJTaXplXG4gICAgdGhpc1trS2VlcEFsaXZlRGVmYXVsdFRpbWVvdXRdID0ga2VlcEFsaXZlVGltZW91dCA9PSBudWxsID8gNGUzIDoga2VlcEFsaXZlVGltZW91dFxuICAgIHRoaXNba0tlZXBBbGl2ZU1heFRpbWVvdXRdID0ga2VlcEFsaXZlTWF4VGltZW91dCA9PSBudWxsID8gNjAwZTMgOiBrZWVwQWxpdmVNYXhUaW1lb3V0XG4gICAgdGhpc1trS2VlcEFsaXZlVGltZW91dFRocmVzaG9sZF0gPSBrZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkID09IG51bGwgPyAxZTMgOiBrZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkXG4gICAgdGhpc1trS2VlcEFsaXZlVGltZW91dFZhbHVlXSA9IHRoaXNba0tlZXBBbGl2ZURlZmF1bHRUaW1lb3V0XVxuICAgIHRoaXNba1NlcnZlck5hbWVdID0gbnVsbFxuICAgIHRoaXNba0xvY2FsQWRkcmVzc10gPSBsb2NhbEFkZHJlc3MgIT0gbnVsbCA/IGxvY2FsQWRkcmVzcyA6IG51bGxcbiAgICB0aGlzW2tSZXN1bWluZ10gPSAwIC8vIDAsIGlkbGUsIDEsIHNjaGVkdWxlZCwgMiByZXN1bWluZ1xuICAgIHRoaXNba05lZWREcmFpbl0gPSAwIC8vIDAsIGlkbGUsIDEsIHNjaGVkdWxlZCwgMiByZXN1bWluZ1xuICAgIHRoaXNba0hvc3RIZWFkZXJdID0gYGhvc3Q6ICR7dGhpc1trVXJsXS5ob3N0bmFtZX0ke3RoaXNba1VybF0ucG9ydCA/IGA6JHt0aGlzW2tVcmxdLnBvcnR9YCA6ICcnfVxcclxcbmBcbiAgICB0aGlzW2tCb2R5VGltZW91dF0gPSBib2R5VGltZW91dCAhPSBudWxsID8gYm9keVRpbWVvdXQgOiAzMDBlM1xuICAgIHRoaXNba0hlYWRlcnNUaW1lb3V0XSA9IGhlYWRlcnNUaW1lb3V0ICE9IG51bGwgPyBoZWFkZXJzVGltZW91dCA6IDMwMGUzXG4gICAgdGhpc1trU3RyaWN0Q29udGVudExlbmd0aF0gPSBzdHJpY3RDb250ZW50TGVuZ3RoID09IG51bGwgPyB0cnVlIDogc3RyaWN0Q29udGVudExlbmd0aFxuICAgIHRoaXNba01heFJlZGlyZWN0aW9uc10gPSBtYXhSZWRpcmVjdGlvbnNcbiAgICB0aGlzW2tNYXhSZXF1ZXN0c10gPSBtYXhSZXF1ZXN0c1BlckNsaWVudFxuICAgIHRoaXNba0Nsb3NlZFJlc29sdmVdID0gbnVsbFxuICAgIHRoaXNba01heFJlc3BvbnNlU2l6ZV0gPSBtYXhSZXNwb25zZVNpemUgPiAtMSA/IG1heFJlc3BvbnNlU2l6ZSA6IC0xXG4gICAgdGhpc1trSFRUUENvbm5WZXJzaW9uXSA9ICdoMSdcblxuICAgIC8vIEhUVFAvMlxuICAgIHRoaXNba0hUVFAyU2Vzc2lvbl0gPSBudWxsXG4gICAgdGhpc1trSFRUUDJTZXNzaW9uU3RhdGVdID0gIWFsbG93SDJcbiAgICAgID8gbnVsbFxuICAgICAgOiB7XG4gICAgICAgIC8vIHN0cmVhbXM6IG51bGwsIC8vIEZpeGVkIHF1ZXVlIG9mIHN0cmVhbXMgLSBGb3IgZnV0dXJlIHN1cHBvcnQgb2YgYHB1c2hgXG4gICAgICAgICAgb3BlblN0cmVhbXM6IDAsIC8vIEtlZXAgdHJhY2sgb2YgdGhlbSB0byBkZWNpZGUgd2V0aGVyIG9yIG5vdCB1bnJlZiB0aGUgc2Vzc2lvblxuICAgICAgICAgIG1heENvbmN1cnJlbnRTdHJlYW1zOiBtYXhDb25jdXJyZW50U3RyZWFtcyAhPSBudWxsID8gbWF4Q29uY3VycmVudFN0cmVhbXMgOiAxMDAgLy8gTWF4IHBlZXJDb25jdXJyZW50U3RyZWFtcyBmb3IgYSBOb2RlIGgyIHNlcnZlclxuICAgICAgICB9XG4gICAgdGhpc1trSG9zdF0gPSBgJHt0aGlzW2tVcmxdLmhvc3RuYW1lfSR7dGhpc1trVXJsXS5wb3J0ID8gYDoke3RoaXNba1VybF0ucG9ydH1gIDogJyd9YFxuXG4gICAgLy8ga1F1ZXVlIGlzIGJ1aWx0IHVwIG9mIDMgc2VjdGlvbnMgc2VwYXJhdGVkIGJ5XG4gICAgLy8gdGhlIGtSdW5uaW5nSWR4IGFuZCBrUGVuZGluZ0lkeCBpbmRpY2VzLlxuICAgIC8vIHwgICBjb21wbGV0ZSAgIHwgICBydW5uaW5nICAgfCAgIHBlbmRpbmcgICB8XG4gICAgLy8gICAgICAgICAgICAgICAgXiBrUnVubmluZ0lkeCBeIGtQZW5kaW5nSWR4IF4ga1F1ZXVlLmxlbmd0aFxuICAgIC8vIGtSdW5uaW5nSWR4IHBvaW50cyB0byB0aGUgZmlyc3QgcnVubmluZyBlbGVtZW50LlxuICAgIC8vIGtQZW5kaW5nSWR4IHBvaW50cyB0byB0aGUgZmlyc3QgcGVuZGluZyBlbGVtZW50LlxuICAgIC8vIFRoaXMgaW1wbGVtZW50cyBhIGZhc3QgcXVldWUgd2l0aCBhbiBhbW9ydGl6ZWRcbiAgICAvLyB0aW1lIG9mIE8oMSkuXG5cbiAgICB0aGlzW2tRdWV1ZV0gPSBbXVxuICAgIHRoaXNba1J1bm5pbmdJZHhdID0gMFxuICAgIHRoaXNba1BlbmRpbmdJZHhdID0gMFxuICB9XG5cbiAgZ2V0IHBpcGVsaW5pbmcgKCkge1xuICAgIHJldHVybiB0aGlzW2tQaXBlbGluaW5nXVxuICB9XG5cbiAgc2V0IHBpcGVsaW5pbmcgKHZhbHVlKSB7XG4gICAgdGhpc1trUGlwZWxpbmluZ10gPSB2YWx1ZVxuICAgIHJlc3VtZSh0aGlzLCB0cnVlKVxuICB9XG5cbiAgZ2V0IFtrUGVuZGluZ10gKCkge1xuICAgIHJldHVybiB0aGlzW2tRdWV1ZV0ubGVuZ3RoIC0gdGhpc1trUGVuZGluZ0lkeF1cbiAgfVxuXG4gIGdldCBba1J1bm5pbmddICgpIHtcbiAgICByZXR1cm4gdGhpc1trUGVuZGluZ0lkeF0gLSB0aGlzW2tSdW5uaW5nSWR4XVxuICB9XG5cbiAgZ2V0IFtrU2l6ZV0gKCkge1xuICAgIHJldHVybiB0aGlzW2tRdWV1ZV0ubGVuZ3RoIC0gdGhpc1trUnVubmluZ0lkeF1cbiAgfVxuXG4gIGdldCBba0Nvbm5lY3RlZF0gKCkge1xuICAgIHJldHVybiAhIXRoaXNba1NvY2tldF0gJiYgIXRoaXNba0Nvbm5lY3RpbmddICYmICF0aGlzW2tTb2NrZXRdLmRlc3Ryb3llZFxuICB9XG5cbiAgZ2V0IFtrQnVzeV0gKCkge1xuICAgIGNvbnN0IHNvY2tldCA9IHRoaXNba1NvY2tldF1cbiAgICByZXR1cm4gKFxuICAgICAgKHNvY2tldCAmJiAoc29ja2V0W2tSZXNldF0gfHwgc29ja2V0W2tXcml0aW5nXSB8fCBzb2NrZXRba0Jsb2NraW5nXSkpIHx8XG4gICAgICAodGhpc1trU2l6ZV0gPj0gKHRoaXNba1BpcGVsaW5pbmddIHx8IDEpKSB8fFxuICAgICAgdGhpc1trUGVuZGluZ10gPiAwXG4gICAgKVxuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlOiBvbmx5IHVzZWQgZm9yIHRlc3QgKi9cbiAgW2tDb25uZWN0XSAoY2IpIHtcbiAgICBjb25uZWN0KHRoaXMpXG4gICAgdGhpcy5vbmNlKCdjb25uZWN0JywgY2IpXG4gIH1cblxuICBba0Rpc3BhdGNoXSAob3B0cywgaGFuZGxlcikge1xuICAgIGNvbnN0IG9yaWdpbiA9IG9wdHMub3JpZ2luIHx8IHRoaXNba1VybF0ub3JpZ2luXG5cbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpc1trSFRUUENvbm5WZXJzaW9uXSA9PT0gJ2gyJ1xuICAgICAgPyBSZXF1ZXN0W2tIVFRQMkJ1aWxkUmVxdWVzdF0ob3JpZ2luLCBvcHRzLCBoYW5kbGVyKVxuICAgICAgOiBSZXF1ZXN0W2tIVFRQMUJ1aWxkUmVxdWVzdF0ob3JpZ2luLCBvcHRzLCBoYW5kbGVyKVxuXG4gICAgdGhpc1trUXVldWVdLnB1c2gocmVxdWVzdClcbiAgICBpZiAodGhpc1trUmVzdW1pbmddKSB7XG4gICAgICAvLyBEbyBub3RoaW5nLlxuICAgIH0gZWxzZSBpZiAodXRpbC5ib2R5TGVuZ3RoKHJlcXVlc3QuYm9keSkgPT0gbnVsbCAmJiB1dGlsLmlzSXRlcmFibGUocmVxdWVzdC5ib2R5KSkge1xuICAgICAgLy8gV2FpdCBhIHRpY2sgaW4gY2FzZSBzdHJlYW0vaXRlcmF0b3IgaXMgZW5kZWQgaW4gdGhlIHNhbWUgdGljay5cbiAgICAgIHRoaXNba1Jlc3VtaW5nXSA9IDFcbiAgICAgIHByb2Nlc3MubmV4dFRpY2socmVzdW1lLCB0aGlzKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bWUodGhpcywgdHJ1ZSlcbiAgICB9XG5cbiAgICBpZiAodGhpc1trUmVzdW1pbmddICYmIHRoaXNba05lZWREcmFpbl0gIT09IDIgJiYgdGhpc1trQnVzeV0pIHtcbiAgICAgIHRoaXNba05lZWREcmFpbl0gPSAyXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNba05lZWREcmFpbl0gPCAyXG4gIH1cblxuICBhc3luYyBba0Nsb3NlXSAoKSB7XG4gICAgLy8gVE9ETzogZm9yIEgyIHdlIG5lZWQgdG8gZ3JhY2VmdWxseSBmbHVzaCB0aGUgcmVtYWluaW5nIGVucXVldWVkXG4gICAgLy8gcmVxdWVzdCBhbmQgY2xvc2UgZWFjaCBzdHJlYW0uXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBpZiAoIXRoaXNba1NpemVdKSB7XG4gICAgICAgIHJlc29sdmUobnVsbClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXNba0Nsb3NlZFJlc29sdmVdID0gcmVzb2x2ZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBba0Rlc3Ryb3ldIChlcnIpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RzID0gdGhpc1trUXVldWVdLnNwbGljZSh0aGlzW2tQZW5kaW5nSWR4XSlcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVxdWVzdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHJlcXVlc3RzW2ldXG4gICAgICAgIGVycm9yUmVxdWVzdCh0aGlzLCByZXF1ZXN0LCBlcnIpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpc1trQ2xvc2VkUmVzb2x2ZV0pIHtcbiAgICAgICAgICAvLyBUT0RPIChmaXgpOiBTaG91bGQgd2UgZXJyb3IgaGVyZSB3aXRoIENsaWVudERlc3Ryb3llZEVycm9yP1xuICAgICAgICAgIHRoaXNba0Nsb3NlZFJlc29sdmVdKClcbiAgICAgICAgICB0aGlzW2tDbG9zZWRSZXNvbHZlXSA9IG51bGxcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKClcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXNba0hUVFAyU2Vzc2lvbl0gIT0gbnVsbCkge1xuICAgICAgICB1dGlsLmRlc3Ryb3kodGhpc1trSFRUUDJTZXNzaW9uXSwgZXJyKVxuICAgICAgICB0aGlzW2tIVFRQMlNlc3Npb25dID0gbnVsbFxuICAgICAgICB0aGlzW2tIVFRQMlNlc3Npb25TdGF0ZV0gPSBudWxsXG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpc1trU29ja2V0XSkge1xuICAgICAgICBxdWV1ZU1pY3JvdGFzayhjYWxsYmFjaylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHV0aWwuZGVzdHJveSh0aGlzW2tTb2NrZXRdLm9uKCdjbG9zZScsIGNhbGxiYWNrKSwgZXJyKVxuICAgICAgfVxuXG4gICAgICByZXN1bWUodGhpcylcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIG9uSHR0cDJTZXNzaW9uRXJyb3IgKGVycikge1xuICBhc3NlcnQoZXJyLmNvZGUgIT09ICdFUlJfVExTX0NFUlRfQUxUTkFNRV9JTlZBTElEJylcblxuICB0aGlzW2tTb2NrZXRdW2tFcnJvcl0gPSBlcnJcblxuICBvbkVycm9yKHRoaXNba0NsaWVudF0sIGVycilcbn1cblxuZnVuY3Rpb24gb25IdHRwMkZyYW1lRXJyb3IgKHR5cGUsIGNvZGUsIGlkKSB7XG4gIGNvbnN0IGVyciA9IG5ldyBJbmZvcm1hdGlvbmFsRXJyb3IoYEhUVFAvMjogXCJmcmFtZUVycm9yXCIgcmVjZWl2ZWQgLSB0eXBlICR7dHlwZX0sIGNvZGUgJHtjb2RlfWApXG5cbiAgaWYgKGlkID09PSAwKSB7XG4gICAgdGhpc1trU29ja2V0XVtrRXJyb3JdID0gZXJyXG4gICAgb25FcnJvcih0aGlzW2tDbGllbnRdLCBlcnIpXG4gIH1cbn1cblxuZnVuY3Rpb24gb25IdHRwMlNlc3Npb25FbmQgKCkge1xuICB1dGlsLmRlc3Ryb3kodGhpcywgbmV3IFNvY2tldEVycm9yKCdvdGhlciBzaWRlIGNsb3NlZCcpKVxuICB1dGlsLmRlc3Ryb3kodGhpc1trU29ja2V0XSwgbmV3IFNvY2tldEVycm9yKCdvdGhlciBzaWRlIGNsb3NlZCcpKVxufVxuXG5mdW5jdGlvbiBvbkhUVFAyR29Bd2F5IChjb2RlKSB7XG4gIGNvbnN0IGNsaWVudCA9IHRoaXNba0NsaWVudF1cbiAgY29uc3QgZXJyID0gbmV3IEluZm9ybWF0aW9uYWxFcnJvcihgSFRUUC8yOiBcIkdPQVdBWVwiIGZyYW1lIHJlY2VpdmVkIHdpdGggY29kZSAke2NvZGV9YClcbiAgY2xpZW50W2tTb2NrZXRdID0gbnVsbFxuICBjbGllbnRba0hUVFAyU2Vzc2lvbl0gPSBudWxsXG5cbiAgaWYgKGNsaWVudC5kZXN0cm95ZWQpIHtcbiAgICBhc3NlcnQodGhpc1trUGVuZGluZ10gPT09IDApXG5cbiAgICAvLyBGYWlsIGVudGlyZSBxdWV1ZS5cbiAgICBjb25zdCByZXF1ZXN0cyA9IGNsaWVudFtrUXVldWVdLnNwbGljZShjbGllbnRba1J1bm5pbmdJZHhdKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVxdWVzdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSByZXF1ZXN0c1tpXVxuICAgICAgZXJyb3JSZXF1ZXN0KHRoaXMsIHJlcXVlc3QsIGVycilcbiAgICB9XG4gIH0gZWxzZSBpZiAoY2xpZW50W2tSdW5uaW5nXSA+IDApIHtcbiAgICAvLyBGYWlsIGhlYWQgb2YgcGlwZWxpbmUuXG4gICAgY29uc3QgcmVxdWVzdCA9IGNsaWVudFtrUXVldWVdW2NsaWVudFtrUnVubmluZ0lkeF1dXG4gICAgY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XSsrXSA9IG51bGxcblxuICAgIGVycm9yUmVxdWVzdChjbGllbnQsIHJlcXVlc3QsIGVycilcbiAgfVxuXG4gIGNsaWVudFtrUGVuZGluZ0lkeF0gPSBjbGllbnRba1J1bm5pbmdJZHhdXG5cbiAgYXNzZXJ0KGNsaWVudFtrUnVubmluZ10gPT09IDApXG5cbiAgY2xpZW50LmVtaXQoJ2Rpc2Nvbm5lY3QnLFxuICAgIGNsaWVudFtrVXJsXSxcbiAgICBbY2xpZW50XSxcbiAgICBlcnJcbiAgKVxuXG4gIHJlc3VtZShjbGllbnQpXG59XG5cbmNvbnN0IGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vbGxodHRwL2NvbnN0YW50cycpXG5jb25zdCBjcmVhdGVSZWRpcmVjdEludGVyY2VwdG9yID0gcmVxdWlyZSgnLi9pbnRlcmNlcHRvci9yZWRpcmVjdEludGVyY2VwdG9yJylcbmNvbnN0IEVNUFRZX0JVRiA9IEJ1ZmZlci5hbGxvYygwKVxuXG5hc3luYyBmdW5jdGlvbiBsYXp5bGxodHRwICgpIHtcbiAgY29uc3QgbGxodHRwV2FzbURhdGEgPSBwcm9jZXNzLmVudi5KRVNUX1dPUktFUl9JRCA/IHJlcXVpcmUoJy4vbGxodHRwL2xsaHR0cC13YXNtLmpzJykgOiB1bmRlZmluZWRcblxuICBsZXQgbW9kXG4gIHRyeSB7XG4gICAgbW9kID0gYXdhaXQgV2ViQXNzZW1ibHkuY29tcGlsZShCdWZmZXIuZnJvbShyZXF1aXJlKCcuL2xsaHR0cC9sbGh0dHBfc2ltZC13YXNtLmpzJyksICdiYXNlNjQnKSlcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cbiAgICAvLyBXZSBjb3VsZCBjaGVjayBpZiB0aGUgZXJyb3Igd2FzIGNhdXNlZCBieSB0aGUgc2ltZCBvcHRpb24gbm90XG4gICAgLy8gYmVpbmcgZW5hYmxlZCwgYnV0IHRoZSBvY2N1cnJpbmcgb2YgdGhpcyBvdGhlciBlcnJvclxuICAgIC8vICogaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL2lzc3Vlcy8xMTQ5NVxuICAgIC8vIGdvdCBtZSB0byByZW1vdmUgdGhhdCBjaGVjayB0byBhdm9pZCBicmVha2luZyBOb2RlIDEyLlxuICAgIG1vZCA9IGF3YWl0IFdlYkFzc2VtYmx5LmNvbXBpbGUoQnVmZmVyLmZyb20obGxodHRwV2FzbURhdGEgfHwgcmVxdWlyZSgnLi9sbGh0dHAvbGxodHRwLXdhc20uanMnKSwgJ2Jhc2U2NCcpKVxuICB9XG5cbiAgcmV0dXJuIGF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKG1vZCwge1xuICAgIGVudjoge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG5cbiAgICAgIHdhc21fb25fdXJsOiAocCwgYXQsIGxlbikgPT4ge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfSxcbiAgICAgIHdhc21fb25fc3RhdHVzOiAocCwgYXQsIGxlbikgPT4ge1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY3VycmVudFBhcnNlci5wdHIsIHApXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gYXQgLSBjdXJyZW50QnVmZmVyUHRyICsgY3VycmVudEJ1ZmZlclJlZi5ieXRlT2Zmc2V0XG4gICAgICAgIHJldHVybiBjdXJyZW50UGFyc2VyLm9uU3RhdHVzKG5ldyBGYXN0QnVmZmVyKGN1cnJlbnRCdWZmZXJSZWYuYnVmZmVyLCBzdGFydCwgbGVuKSkgfHwgMFxuICAgICAgfSxcbiAgICAgIHdhc21fb25fbWVzc2FnZV9iZWdpbjogKHApID0+IHtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGN1cnJlbnRQYXJzZXIucHRyLCBwKVxuICAgICAgICByZXR1cm4gY3VycmVudFBhcnNlci5vbk1lc3NhZ2VCZWdpbigpIHx8IDBcbiAgICAgIH0sXG4gICAgICB3YXNtX29uX2hlYWRlcl9maWVsZDogKHAsIGF0LCBsZW4pID0+IHtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGN1cnJlbnRQYXJzZXIucHRyLCBwKVxuICAgICAgICBjb25zdCBzdGFydCA9IGF0IC0gY3VycmVudEJ1ZmZlclB0ciArIGN1cnJlbnRCdWZmZXJSZWYuYnl0ZU9mZnNldFxuICAgICAgICByZXR1cm4gY3VycmVudFBhcnNlci5vbkhlYWRlckZpZWxkKG5ldyBGYXN0QnVmZmVyKGN1cnJlbnRCdWZmZXJSZWYuYnVmZmVyLCBzdGFydCwgbGVuKSkgfHwgMFxuICAgICAgfSxcbiAgICAgIHdhc21fb25faGVhZGVyX3ZhbHVlOiAocCwgYXQsIGxlbikgPT4ge1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY3VycmVudFBhcnNlci5wdHIsIHApXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gYXQgLSBjdXJyZW50QnVmZmVyUHRyICsgY3VycmVudEJ1ZmZlclJlZi5ieXRlT2Zmc2V0XG4gICAgICAgIHJldHVybiBjdXJyZW50UGFyc2VyLm9uSGVhZGVyVmFsdWUobmV3IEZhc3RCdWZmZXIoY3VycmVudEJ1ZmZlclJlZi5idWZmZXIsIHN0YXJ0LCBsZW4pKSB8fCAwXG4gICAgICB9LFxuICAgICAgd2FzbV9vbl9oZWFkZXJzX2NvbXBsZXRlOiAocCwgc3RhdHVzQ29kZSwgdXBncmFkZSwgc2hvdWxkS2VlcEFsaXZlKSA9PiB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjdXJyZW50UGFyc2VyLnB0ciwgcClcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQYXJzZXIub25IZWFkZXJzQ29tcGxldGUoc3RhdHVzQ29kZSwgQm9vbGVhbih1cGdyYWRlKSwgQm9vbGVhbihzaG91bGRLZWVwQWxpdmUpKSB8fCAwXG4gICAgICB9LFxuICAgICAgd2FzbV9vbl9ib2R5OiAocCwgYXQsIGxlbikgPT4ge1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY3VycmVudFBhcnNlci5wdHIsIHApXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gYXQgLSBjdXJyZW50QnVmZmVyUHRyICsgY3VycmVudEJ1ZmZlclJlZi5ieXRlT2Zmc2V0XG4gICAgICAgIHJldHVybiBjdXJyZW50UGFyc2VyLm9uQm9keShuZXcgRmFzdEJ1ZmZlcihjdXJyZW50QnVmZmVyUmVmLmJ1ZmZlciwgc3RhcnQsIGxlbikpIHx8IDBcbiAgICAgIH0sXG4gICAgICB3YXNtX29uX21lc3NhZ2VfY29tcGxldGU6IChwKSA9PiB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjdXJyZW50UGFyc2VyLnB0ciwgcClcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQYXJzZXIub25NZXNzYWdlQ29tcGxldGUoKSB8fCAwXG4gICAgICB9XG5cbiAgICAgIC8qIGVzbGludC1lbmFibGUgY2FtZWxjYXNlICovXG4gICAgfVxuICB9KVxufVxuXG5sZXQgbGxodHRwSW5zdGFuY2UgPSBudWxsXG5sZXQgbGxodHRwUHJvbWlzZSA9IGxhenlsbGh0dHAoKVxubGxodHRwUHJvbWlzZS5jYXRjaCgpXG5cbmxldCBjdXJyZW50UGFyc2VyID0gbnVsbFxubGV0IGN1cnJlbnRCdWZmZXJSZWYgPSBudWxsXG5sZXQgY3VycmVudEJ1ZmZlclNpemUgPSAwXG5sZXQgY3VycmVudEJ1ZmZlclB0ciA9IG51bGxcblxuY29uc3QgVElNRU9VVF9IRUFERVJTID0gMVxuY29uc3QgVElNRU9VVF9CT0RZID0gMlxuY29uc3QgVElNRU9VVF9JRExFID0gM1xuXG5jbGFzcyBQYXJzZXIge1xuICBjb25zdHJ1Y3RvciAoY2xpZW50LCBzb2NrZXQsIHsgZXhwb3J0cyB9KSB7XG4gICAgYXNzZXJ0KE51bWJlci5pc0Zpbml0ZShjbGllbnRba01heEhlYWRlcnNTaXplXSkgJiYgY2xpZW50W2tNYXhIZWFkZXJzU2l6ZV0gPiAwKVxuXG4gICAgdGhpcy5sbGh0dHAgPSBleHBvcnRzXG4gICAgdGhpcy5wdHIgPSB0aGlzLmxsaHR0cC5sbGh0dHBfYWxsb2MoY29uc3RhbnRzLlRZUEUuUkVTUE9OU0UpXG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnRcbiAgICB0aGlzLnNvY2tldCA9IHNvY2tldFxuICAgIHRoaXMudGltZW91dCA9IG51bGxcbiAgICB0aGlzLnRpbWVvdXRWYWx1ZSA9IG51bGxcbiAgICB0aGlzLnRpbWVvdXRUeXBlID0gbnVsbFxuICAgIHRoaXMuc3RhdHVzQ29kZSA9IG51bGxcbiAgICB0aGlzLnN0YXR1c1RleHQgPSAnJ1xuICAgIHRoaXMudXBncmFkZSA9IGZhbHNlXG4gICAgdGhpcy5oZWFkZXJzID0gW11cbiAgICB0aGlzLmhlYWRlcnNTaXplID0gMFxuICAgIHRoaXMuaGVhZGVyc01heFNpemUgPSBjbGllbnRba01heEhlYWRlcnNTaXplXVxuICAgIHRoaXMuc2hvdWxkS2VlcEFsaXZlID0gZmFsc2VcbiAgICB0aGlzLnBhdXNlZCA9IGZhbHNlXG4gICAgdGhpcy5yZXN1bWUgPSB0aGlzLnJlc3VtZS5iaW5kKHRoaXMpXG5cbiAgICB0aGlzLmJ5dGVzUmVhZCA9IDBcblxuICAgIHRoaXMua2VlcEFsaXZlID0gJydcbiAgICB0aGlzLmNvbnRlbnRMZW5ndGggPSAnJ1xuICAgIHRoaXMuY29ubmVjdGlvbiA9ICcnXG4gICAgdGhpcy5tYXhSZXNwb25zZVNpemUgPSBjbGllbnRba01heFJlc3BvbnNlU2l6ZV1cbiAgfVxuXG4gIHNldFRpbWVvdXQgKHZhbHVlLCB0eXBlKSB7XG4gICAgdGhpcy50aW1lb3V0VHlwZSA9IHR5cGVcbiAgICBpZiAodmFsdWUgIT09IHRoaXMudGltZW91dFZhbHVlKSB7XG4gICAgICB0aW1lcnMuY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dClcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lcnMuc2V0VGltZW91dChvblBhcnNlclRpbWVvdXQsIHZhbHVlLCB0aGlzKVxuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZTogb25seSBmb3IgamVzdFxuICAgICAgICBpZiAodGhpcy50aW1lb3V0LnVucmVmKSB7XG4gICAgICAgICAgdGhpcy50aW1lb3V0LnVucmVmKClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gbnVsbFxuICAgICAgfVxuICAgICAgdGhpcy50aW1lb3V0VmFsdWUgPSB2YWx1ZVxuICAgIH0gZWxzZSBpZiAodGhpcy50aW1lb3V0KSB7XG4gICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZTogb25seSBmb3IgamVzdFxuICAgICAgaWYgKHRoaXMudGltZW91dC5yZWZyZXNoKSB7XG4gICAgICAgIHRoaXMudGltZW91dC5yZWZyZXNoKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXN1bWUgKCkge1xuICAgIGlmICh0aGlzLnNvY2tldC5kZXN0cm95ZWQgfHwgIXRoaXMucGF1c2VkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhc3NlcnQodGhpcy5wdHIgIT0gbnVsbClcbiAgICBhc3NlcnQoY3VycmVudFBhcnNlciA9PSBudWxsKVxuXG4gICAgdGhpcy5sbGh0dHAubGxodHRwX3Jlc3VtZSh0aGlzLnB0cilcblxuICAgIGFzc2VydCh0aGlzLnRpbWVvdXRUeXBlID09PSBUSU1FT1VUX0JPRFkpXG4gICAgaWYgKHRoaXMudGltZW91dCkge1xuICAgICAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2U6IG9ubHkgZm9yIGplc3RcbiAgICAgIGlmICh0aGlzLnRpbWVvdXQucmVmcmVzaCkge1xuICAgICAgICB0aGlzLnRpbWVvdXQucmVmcmVzaCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5wYXVzZWQgPSBmYWxzZVxuICAgIHRoaXMuZXhlY3V0ZSh0aGlzLnNvY2tldC5yZWFkKCkgfHwgRU1QVFlfQlVGKSAvLyBGbHVzaCBwYXJzZXIuXG4gICAgdGhpcy5yZWFkTW9yZSgpXG4gIH1cblxuICByZWFkTW9yZSAoKSB7XG4gICAgd2hpbGUgKCF0aGlzLnBhdXNlZCAmJiB0aGlzLnB0cikge1xuICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLnNvY2tldC5yZWFkKClcbiAgICAgIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgdGhpcy5leGVjdXRlKGNodW5rKVxuICAgIH1cbiAgfVxuXG4gIGV4ZWN1dGUgKGRhdGEpIHtcbiAgICBhc3NlcnQodGhpcy5wdHIgIT0gbnVsbClcbiAgICBhc3NlcnQoY3VycmVudFBhcnNlciA9PSBudWxsKVxuICAgIGFzc2VydCghdGhpcy5wYXVzZWQpXG5cbiAgICBjb25zdCB7IHNvY2tldCwgbGxodHRwIH0gPSB0aGlzXG5cbiAgICBpZiAoZGF0YS5sZW5ndGggPiBjdXJyZW50QnVmZmVyU2l6ZSkge1xuICAgICAgaWYgKGN1cnJlbnRCdWZmZXJQdHIpIHtcbiAgICAgICAgbGxodHRwLmZyZWUoY3VycmVudEJ1ZmZlclB0cilcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRCdWZmZXJTaXplID0gTWF0aC5jZWlsKGRhdGEubGVuZ3RoIC8gNDA5NikgKiA0MDk2XG4gICAgICBjdXJyZW50QnVmZmVyUHRyID0gbGxodHRwLm1hbGxvYyhjdXJyZW50QnVmZmVyU2l6ZSlcbiAgICB9XG5cbiAgICBuZXcgVWludDhBcnJheShsbGh0dHAubWVtb3J5LmJ1ZmZlciwgY3VycmVudEJ1ZmZlclB0ciwgY3VycmVudEJ1ZmZlclNpemUpLnNldChkYXRhKVxuXG4gICAgLy8gQ2FsbCBgZXhlY3V0ZWAgb24gdGhlIHdhc20gcGFyc2VyLlxuICAgIC8vIFdlIHBhc3MgdGhlIGBsbGh0dHBfcGFyc2VyYCBwb2ludGVyIGFkZHJlc3MsIHRoZSBwb2ludGVyIGFkZHJlc3Mgb2YgYnVmZmVyIHZpZXcgZGF0YSxcbiAgICAvLyBhbmQgZmluYWxseSB0aGUgbGVuZ3RoIG9mIGJ5dGVzIHRvIHBhcnNlLlxuICAgIC8vIFRoZSByZXR1cm4gdmFsdWUgaXMgYW4gZXJyb3IgY29kZSBvciBgY29uc3RhbnRzLkVSUk9SLk9LYC5cbiAgICB0cnkge1xuICAgICAgbGV0IHJldFxuXG4gICAgICB0cnkge1xuICAgICAgICBjdXJyZW50QnVmZmVyUmVmID0gZGF0YVxuICAgICAgICBjdXJyZW50UGFyc2VyID0gdGhpc1xuICAgICAgICByZXQgPSBsbGh0dHAubGxodHRwX2V4ZWN1dGUodGhpcy5wdHIsIGN1cnJlbnRCdWZmZXJQdHIsIGRhdGEubGVuZ3RoKVxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1jYXRjaCAqL1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBkaWZmaWN1bHQgdG8gbWFrZSBhIHRlc3QgY2FzZSBmb3IgKi9cbiAgICAgICAgdGhyb3cgZXJyXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBjdXJyZW50UGFyc2VyID0gbnVsbFxuICAgICAgICBjdXJyZW50QnVmZmVyUmVmID0gbnVsbFxuICAgICAgfVxuXG4gICAgICBjb25zdCBvZmZzZXQgPSBsbGh0dHAubGxodHRwX2dldF9lcnJvcl9wb3ModGhpcy5wdHIpIC0gY3VycmVudEJ1ZmZlclB0clxuXG4gICAgICBpZiAocmV0ID09PSBjb25zdGFudHMuRVJST1IuUEFVU0VEX1VQR1JBREUpIHtcbiAgICAgICAgdGhpcy5vblVwZ3JhZGUoZGF0YS5zbGljZShvZmZzZXQpKVxuICAgICAgfSBlbHNlIGlmIChyZXQgPT09IGNvbnN0YW50cy5FUlJPUi5QQVVTRUQpIHtcbiAgICAgICAgdGhpcy5wYXVzZWQgPSB0cnVlXG4gICAgICAgIHNvY2tldC51bnNoaWZ0KGRhdGEuc2xpY2Uob2Zmc2V0KSlcbiAgICAgIH0gZWxzZSBpZiAocmV0ICE9PSBjb25zdGFudHMuRVJST1IuT0spIHtcbiAgICAgICAgY29uc3QgcHRyID0gbGxodHRwLmxsaHR0cF9nZXRfZXJyb3JfcmVhc29uKHRoaXMucHRyKVxuICAgICAgICBsZXQgbWVzc2FnZSA9ICcnXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBkaWZmaWN1bHQgdG8gbWFrZSBhIHRlc3QgY2FzZSBmb3IgKi9cbiAgICAgICAgaWYgKHB0cikge1xuICAgICAgICAgIGNvbnN0IGxlbiA9IG5ldyBVaW50OEFycmF5KGxsaHR0cC5tZW1vcnkuYnVmZmVyLCBwdHIpLmluZGV4T2YoMClcbiAgICAgICAgICBtZXNzYWdlID1cbiAgICAgICAgICAgICdSZXNwb25zZSBkb2VzIG5vdCBtYXRjaCB0aGUgSFRUUC8xLjEgcHJvdG9jb2wgKCcgK1xuICAgICAgICAgICAgQnVmZmVyLmZyb20obGxodHRwLm1lbW9yeS5idWZmZXIsIHB0ciwgbGVuKS50b1N0cmluZygpICtcbiAgICAgICAgICAgICcpJ1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBIVFRQUGFyc2VyRXJyb3IobWVzc2FnZSwgY29uc3RhbnRzLkVSUk9SW3JldF0sIGRhdGEuc2xpY2Uob2Zmc2V0KSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIGVycilcbiAgICB9XG4gIH1cblxuICBkZXN0cm95ICgpIHtcbiAgICBhc3NlcnQodGhpcy5wdHIgIT0gbnVsbClcbiAgICBhc3NlcnQoY3VycmVudFBhcnNlciA9PSBudWxsKVxuXG4gICAgdGhpcy5sbGh0dHAubGxodHRwX2ZyZWUodGhpcy5wdHIpXG4gICAgdGhpcy5wdHIgPSBudWxsXG5cbiAgICB0aW1lcnMuY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dClcbiAgICB0aGlzLnRpbWVvdXQgPSBudWxsXG4gICAgdGhpcy50aW1lb3V0VmFsdWUgPSBudWxsXG4gICAgdGhpcy50aW1lb3V0VHlwZSA9IG51bGxcblxuICAgIHRoaXMucGF1c2VkID0gZmFsc2VcbiAgfVxuXG4gIG9uU3RhdHVzIChidWYpIHtcbiAgICB0aGlzLnN0YXR1c1RleHQgPSBidWYudG9TdHJpbmcoKVxuICB9XG5cbiAgb25NZXNzYWdlQmVnaW4gKCkge1xuICAgIGNvbnN0IHsgc29ja2V0LCBjbGllbnQgfSA9IHRoaXNcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBkaWZmaWN1bHQgdG8gbWFrZSBhIHRlc3QgY2FzZSBmb3IgKi9cbiAgICBpZiAoc29ja2V0LmRlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdCA9IGNsaWVudFtrUXVldWVdW2NsaWVudFtrUnVubmluZ0lkeF1dXG4gICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gIH1cblxuICBvbkhlYWRlckZpZWxkIChidWYpIHtcbiAgICBjb25zdCBsZW4gPSB0aGlzLmhlYWRlcnMubGVuZ3RoXG5cbiAgICBpZiAoKGxlbiAmIDEpID09PSAwKSB7XG4gICAgICB0aGlzLmhlYWRlcnMucHVzaChidWYpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGVhZGVyc1tsZW4gLSAxXSA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuaGVhZGVyc1tsZW4gLSAxXSwgYnVmXSlcbiAgICB9XG5cbiAgICB0aGlzLnRyYWNrSGVhZGVyKGJ1Zi5sZW5ndGgpXG4gIH1cblxuICBvbkhlYWRlclZhbHVlIChidWYpIHtcbiAgICBsZXQgbGVuID0gdGhpcy5oZWFkZXJzLmxlbmd0aFxuXG4gICAgaWYgKChsZW4gJiAxKSA9PT0gMSkge1xuICAgICAgdGhpcy5oZWFkZXJzLnB1c2goYnVmKVxuICAgICAgbGVuICs9IDFcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWFkZXJzW2xlbiAtIDFdID0gQnVmZmVyLmNvbmNhdChbdGhpcy5oZWFkZXJzW2xlbiAtIDFdLCBidWZdKVxuICAgIH1cblxuICAgIGNvbnN0IGtleSA9IHRoaXMuaGVhZGVyc1tsZW4gLSAyXVxuICAgIGlmIChrZXkubGVuZ3RoID09PSAxMCAmJiBrZXkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09PSAna2VlcC1hbGl2ZScpIHtcbiAgICAgIHRoaXMua2VlcEFsaXZlICs9IGJ1Zi50b1N0cmluZygpXG4gICAgfSBlbHNlIGlmIChrZXkubGVuZ3RoID09PSAxMCAmJiBrZXkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09PSAnY29ubmVjdGlvbicpIHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbiArPSBidWYudG9TdHJpbmcoKVxuICAgIH0gZWxzZSBpZiAoa2V5Lmxlbmd0aCA9PT0gMTQgJiYga2V5LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtbGVuZ3RoJykge1xuICAgICAgdGhpcy5jb250ZW50TGVuZ3RoICs9IGJ1Zi50b1N0cmluZygpXG4gICAgfVxuXG4gICAgdGhpcy50cmFja0hlYWRlcihidWYubGVuZ3RoKVxuICB9XG5cbiAgdHJhY2tIZWFkZXIgKGxlbikge1xuICAgIHRoaXMuaGVhZGVyc1NpemUgKz0gbGVuXG4gICAgaWYgKHRoaXMuaGVhZGVyc1NpemUgPj0gdGhpcy5oZWFkZXJzTWF4U2l6ZSkge1xuICAgICAgdXRpbC5kZXN0cm95KHRoaXMuc29ja2V0LCBuZXcgSGVhZGVyc092ZXJmbG93RXJyb3IoKSlcbiAgICB9XG4gIH1cblxuICBvblVwZ3JhZGUgKGhlYWQpIHtcbiAgICBjb25zdCB7IHVwZ3JhZGUsIGNsaWVudCwgc29ja2V0LCBoZWFkZXJzLCBzdGF0dXNDb2RlIH0gPSB0aGlzXG5cbiAgICBhc3NlcnQodXBncmFkZSlcblxuICAgIGNvbnN0IHJlcXVlc3QgPSBjbGllbnRba1F1ZXVlXVtjbGllbnRba1J1bm5pbmdJZHhdXVxuICAgIGFzc2VydChyZXF1ZXN0KVxuXG4gICAgYXNzZXJ0KCFzb2NrZXQuZGVzdHJveWVkKVxuICAgIGFzc2VydChzb2NrZXQgPT09IGNsaWVudFtrU29ja2V0XSlcbiAgICBhc3NlcnQoIXRoaXMucGF1c2VkKVxuICAgIGFzc2VydChyZXF1ZXN0LnVwZ3JhZGUgfHwgcmVxdWVzdC5tZXRob2QgPT09ICdDT05ORUNUJylcblxuICAgIHRoaXMuc3RhdHVzQ29kZSA9IG51bGxcbiAgICB0aGlzLnN0YXR1c1RleHQgPSAnJ1xuICAgIHRoaXMuc2hvdWxkS2VlcEFsaXZlID0gbnVsbFxuXG4gICAgYXNzZXJ0KHRoaXMuaGVhZGVycy5sZW5ndGggJSAyID09PSAwKVxuICAgIHRoaXMuaGVhZGVycyA9IFtdXG4gICAgdGhpcy5oZWFkZXJzU2l6ZSA9IDBcblxuICAgIHNvY2tldC51bnNoaWZ0KGhlYWQpXG5cbiAgICBzb2NrZXRba1BhcnNlcl0uZGVzdHJveSgpXG4gICAgc29ja2V0W2tQYXJzZXJdID0gbnVsbFxuXG4gICAgc29ja2V0W2tDbGllbnRdID0gbnVsbFxuICAgIHNvY2tldFtrRXJyb3JdID0gbnVsbFxuICAgIHNvY2tldFxuICAgICAgLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uU29ja2V0RXJyb3IpXG4gICAgICAucmVtb3ZlTGlzdGVuZXIoJ3JlYWRhYmxlJywgb25Tb2NrZXRSZWFkYWJsZSlcbiAgICAgIC5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25Tb2NrZXRFbmQpXG4gICAgICAucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25Tb2NrZXRDbG9zZSlcblxuICAgIGNsaWVudFtrU29ja2V0XSA9IG51bGxcbiAgICBjbGllbnRba1F1ZXVlXVtjbGllbnRba1J1bm5pbmdJZHhdKytdID0gbnVsbFxuICAgIGNsaWVudC5lbWl0KCdkaXNjb25uZWN0JywgY2xpZW50W2tVcmxdLCBbY2xpZW50XSwgbmV3IEluZm9ybWF0aW9uYWxFcnJvcigndXBncmFkZScpKVxuXG4gICAgdHJ5IHtcbiAgICAgIHJlcXVlc3Qub25VcGdyYWRlKHN0YXR1c0NvZGUsIGhlYWRlcnMsIHNvY2tldClcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIGVycilcbiAgICB9XG5cbiAgICByZXN1bWUoY2xpZW50KVxuICB9XG5cbiAgb25IZWFkZXJzQ29tcGxldGUgKHN0YXR1c0NvZGUsIHVwZ3JhZGUsIHNob3VsZEtlZXBBbGl2ZSkge1xuICAgIGNvbnN0IHsgY2xpZW50LCBzb2NrZXQsIGhlYWRlcnMsIHN0YXR1c1RleHQgfSA9IHRoaXNcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBkaWZmaWN1bHQgdG8gbWFrZSBhIHRlc3QgY2FzZSBmb3IgKi9cbiAgICBpZiAoc29ja2V0LmRlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdCA9IGNsaWVudFtrUXVldWVdW2NsaWVudFtrUnVubmluZ0lkeF1dXG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogZGlmZmljdWx0IHRvIG1ha2UgYSB0ZXN0IGNhc2UgZm9yICovXG4gICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG5cbiAgICBhc3NlcnQoIXRoaXMudXBncmFkZSlcbiAgICBhc3NlcnQodGhpcy5zdGF0dXNDb2RlIDwgMjAwKVxuXG4gICAgaWYgKHN0YXR1c0NvZGUgPT09IDEwMCkge1xuICAgICAgdXRpbC5kZXN0cm95KHNvY2tldCwgbmV3IFNvY2tldEVycm9yKCdiYWQgcmVzcG9uc2UnLCB1dGlsLmdldFNvY2tldEluZm8oc29ja2V0KSkpXG4gICAgICByZXR1cm4gLTFcbiAgICB9XG5cbiAgICAvKiB0aGlzIGNhbiBvbmx5IGhhcHBlbiBpZiBzZXJ2ZXIgaXMgbWlzYmVoYXZpbmcgKi9cbiAgICBpZiAodXBncmFkZSAmJiAhcmVxdWVzdC51cGdyYWRlKSB7XG4gICAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgU29ja2V0RXJyb3IoJ2JhZCB1cGdyYWRlJywgdXRpbC5nZXRTb2NrZXRJbmZvKHNvY2tldCkpKVxuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuXG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRoaXMudGltZW91dFR5cGUsIFRJTUVPVVRfSEVBREVSUylcblxuICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGVcbiAgICB0aGlzLnNob3VsZEtlZXBBbGl2ZSA9IChcbiAgICAgIHNob3VsZEtlZXBBbGl2ZSB8fFxuICAgICAgLy8gT3ZlcnJpZGUgbGxodHRwIHZhbHVlIHdoaWNoIGRvZXMgbm90IGFsbG93IGtlZXBBbGl2ZSBmb3IgSEVBRC5cbiAgICAgIChyZXF1ZXN0Lm1ldGhvZCA9PT0gJ0hFQUQnICYmICFzb2NrZXRba1Jlc2V0XSAmJiB0aGlzLmNvbm5lY3Rpb24udG9Mb3dlckNhc2UoKSA9PT0gJ2tlZXAtYWxpdmUnKVxuICAgIClcblxuICAgIGlmICh0aGlzLnN0YXR1c0NvZGUgPj0gMjAwKSB7XG4gICAgICBjb25zdCBib2R5VGltZW91dCA9IHJlcXVlc3QuYm9keVRpbWVvdXQgIT0gbnVsbFxuICAgICAgICA/IHJlcXVlc3QuYm9keVRpbWVvdXRcbiAgICAgICAgOiBjbGllbnRba0JvZHlUaW1lb3V0XVxuICAgICAgdGhpcy5zZXRUaW1lb3V0KGJvZHlUaW1lb3V0LCBUSU1FT1VUX0JPRFkpXG4gICAgfSBlbHNlIGlmICh0aGlzLnRpbWVvdXQpIHtcbiAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBvbmx5IGZvciBqZXN0XG4gICAgICBpZiAodGhpcy50aW1lb3V0LnJlZnJlc2gpIHtcbiAgICAgICAgdGhpcy50aW1lb3V0LnJlZnJlc2goKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0Lm1ldGhvZCA9PT0gJ0NPTk5FQ1QnKSB7XG4gICAgICBhc3NlcnQoY2xpZW50W2tSdW5uaW5nXSA9PT0gMSlcbiAgICAgIHRoaXMudXBncmFkZSA9IHRydWVcbiAgICAgIHJldHVybiAyXG4gICAgfVxuXG4gICAgaWYgKHVwZ3JhZGUpIHtcbiAgICAgIGFzc2VydChjbGllbnRba1J1bm5pbmddID09PSAxKVxuICAgICAgdGhpcy51cGdyYWRlID0gdHJ1ZVxuICAgICAgcmV0dXJuIDJcbiAgICB9XG5cbiAgICBhc3NlcnQodGhpcy5oZWFkZXJzLmxlbmd0aCAlIDIgPT09IDApXG4gICAgdGhpcy5oZWFkZXJzID0gW11cbiAgICB0aGlzLmhlYWRlcnNTaXplID0gMFxuXG4gICAgaWYgKHRoaXMuc2hvdWxkS2VlcEFsaXZlICYmIGNsaWVudFtrUGlwZWxpbmluZ10pIHtcbiAgICAgIGNvbnN0IGtlZXBBbGl2ZVRpbWVvdXQgPSB0aGlzLmtlZXBBbGl2ZSA/IHV0aWwucGFyc2VLZWVwQWxpdmVUaW1lb3V0KHRoaXMua2VlcEFsaXZlKSA6IG51bGxcblxuICAgICAgaWYgKGtlZXBBbGl2ZVRpbWVvdXQgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gTWF0aC5taW4oXG4gICAgICAgICAga2VlcEFsaXZlVGltZW91dCAtIGNsaWVudFtrS2VlcEFsaXZlVGltZW91dFRocmVzaG9sZF0sXG4gICAgICAgICAgY2xpZW50W2tLZWVwQWxpdmVNYXhUaW1lb3V0XVxuICAgICAgICApXG4gICAgICAgIGlmICh0aW1lb3V0IDw9IDApIHtcbiAgICAgICAgICBzb2NrZXRba1Jlc2V0XSA9IHRydWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjbGllbnRba0tlZXBBbGl2ZVRpbWVvdXRWYWx1ZV0gPSB0aW1lb3V0XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsaWVudFtrS2VlcEFsaXZlVGltZW91dFZhbHVlXSA9IGNsaWVudFtrS2VlcEFsaXZlRGVmYXVsdFRpbWVvdXRdXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFN0b3AgbW9yZSByZXF1ZXN0cyBmcm9tIGJlaW5nIGRpc3BhdGNoZWQuXG4gICAgICBzb2NrZXRba1Jlc2V0XSA9IHRydWVcbiAgICB9XG5cbiAgICBjb25zdCBwYXVzZSA9IHJlcXVlc3Qub25IZWFkZXJzKHN0YXR1c0NvZGUsIGhlYWRlcnMsIHRoaXMucmVzdW1lLCBzdGF0dXNUZXh0KSA9PT0gZmFsc2VcblxuICAgIGlmIChyZXF1ZXN0LmFib3J0ZWQpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0Lm1ldGhvZCA9PT0gJ0hFQUQnKSB7XG4gICAgICByZXR1cm4gMVxuICAgIH1cblxuICAgIGlmIChzdGF0dXNDb2RlIDwgMjAwKSB7XG4gICAgICByZXR1cm4gMVxuICAgIH1cblxuICAgIGlmIChzb2NrZXRba0Jsb2NraW5nXSkge1xuICAgICAgc29ja2V0W2tCbG9ja2luZ10gPSBmYWxzZVxuICAgICAgcmVzdW1lKGNsaWVudClcbiAgICB9XG5cbiAgICByZXR1cm4gcGF1c2UgPyBjb25zdGFudHMuRVJST1IuUEFVU0VEIDogMFxuICB9XG5cbiAgb25Cb2R5IChidWYpIHtcbiAgICBjb25zdCB7IGNsaWVudCwgc29ja2V0LCBzdGF0dXNDb2RlLCBtYXhSZXNwb25zZVNpemUgfSA9IHRoaXNcblxuICAgIGlmIChzb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XV1cbiAgICBhc3NlcnQocmVxdWVzdClcblxuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0aGlzLnRpbWVvdXRUeXBlLCBUSU1FT1VUX0JPRFkpXG4gICAgaWYgKHRoaXMudGltZW91dCkge1xuICAgICAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2U6IG9ubHkgZm9yIGplc3RcbiAgICAgIGlmICh0aGlzLnRpbWVvdXQucmVmcmVzaCkge1xuICAgICAgICB0aGlzLnRpbWVvdXQucmVmcmVzaCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgYXNzZXJ0KHN0YXR1c0NvZGUgPj0gMjAwKVxuXG4gICAgaWYgKG1heFJlc3BvbnNlU2l6ZSA+IC0xICYmIHRoaXMuYnl0ZXNSZWFkICsgYnVmLmxlbmd0aCA+IG1heFJlc3BvbnNlU2l6ZSkge1xuICAgICAgdXRpbC5kZXN0cm95KHNvY2tldCwgbmV3IFJlc3BvbnNlRXhjZWVkZWRNYXhTaXplRXJyb3IoKSlcbiAgICAgIHJldHVybiAtMVxuICAgIH1cblxuICAgIHRoaXMuYnl0ZXNSZWFkICs9IGJ1Zi5sZW5ndGhcblxuICAgIGlmIChyZXF1ZXN0Lm9uRGF0YShidWYpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGNvbnN0YW50cy5FUlJPUi5QQVVTRURcbiAgICB9XG4gIH1cblxuICBvbk1lc3NhZ2VDb21wbGV0ZSAoKSB7XG4gICAgY29uc3QgeyBjbGllbnQsIHNvY2tldCwgc3RhdHVzQ29kZSwgdXBncmFkZSwgaGVhZGVycywgY29udGVudExlbmd0aCwgYnl0ZXNSZWFkLCBzaG91bGRLZWVwQWxpdmUgfSA9IHRoaXNcblxuICAgIGlmIChzb2NrZXQuZGVzdHJveWVkICYmICghc3RhdHVzQ29kZSB8fCBzaG91bGRLZWVwQWxpdmUpKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG5cbiAgICBpZiAodXBncmFkZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdCA9IGNsaWVudFtrUXVldWVdW2NsaWVudFtrUnVubmluZ0lkeF1dXG4gICAgYXNzZXJ0KHJlcXVlc3QpXG5cbiAgICBhc3NlcnQoc3RhdHVzQ29kZSA+PSAxMDApXG5cbiAgICB0aGlzLnN0YXR1c0NvZGUgPSBudWxsXG4gICAgdGhpcy5zdGF0dXNUZXh0ID0gJydcbiAgICB0aGlzLmJ5dGVzUmVhZCA9IDBcbiAgICB0aGlzLmNvbnRlbnRMZW5ndGggPSAnJ1xuICAgIHRoaXMua2VlcEFsaXZlID0gJydcbiAgICB0aGlzLmNvbm5lY3Rpb24gPSAnJ1xuXG4gICAgYXNzZXJ0KHRoaXMuaGVhZGVycy5sZW5ndGggJSAyID09PSAwKVxuICAgIHRoaXMuaGVhZGVycyA9IFtdXG4gICAgdGhpcy5oZWFkZXJzU2l6ZSA9IDBcblxuICAgIGlmIChzdGF0dXNDb2RlIDwgMjAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogc2hvdWxkIGJlIGhhbmRsZWQgYnkgbGxodHRwPyAqL1xuICAgIGlmIChyZXF1ZXN0Lm1ldGhvZCAhPT0gJ0hFQUQnICYmIGNvbnRlbnRMZW5ndGggJiYgYnl0ZXNSZWFkICE9PSBwYXJzZUludChjb250ZW50TGVuZ3RoLCAxMCkpIHtcbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIG5ldyBSZXNwb25zZUNvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yKCkpXG4gICAgICByZXR1cm4gLTFcbiAgICB9XG5cbiAgICByZXF1ZXN0Lm9uQ29tcGxldGUoaGVhZGVycylcblxuICAgIGNsaWVudFtrUXVldWVdW2NsaWVudFtrUnVubmluZ0lkeF0rK10gPSBudWxsXG5cbiAgICBpZiAoc29ja2V0W2tXcml0aW5nXSkge1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNsaWVudFtrUnVubmluZ10sIDApXG4gICAgICAvLyBSZXNwb25zZSBjb21wbGV0ZWQgYmVmb3JlIHJlcXVlc3QuXG4gICAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgSW5mb3JtYXRpb25hbEVycm9yKCdyZXNldCcpKVxuICAgICAgcmV0dXJuIGNvbnN0YW50cy5FUlJPUi5QQVVTRURcbiAgICB9IGVsc2UgaWYgKCFzaG91bGRLZWVwQWxpdmUpIHtcbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIG5ldyBJbmZvcm1hdGlvbmFsRXJyb3IoJ3Jlc2V0JykpXG4gICAgICByZXR1cm4gY29uc3RhbnRzLkVSUk9SLlBBVVNFRFxuICAgIH0gZWxzZSBpZiAoc29ja2V0W2tSZXNldF0gJiYgY2xpZW50W2tSdW5uaW5nXSA9PT0gMCkge1xuICAgICAgLy8gRGVzdHJveSBzb2NrZXQgb25jZSBhbGwgcmVxdWVzdHMgaGF2ZSBjb21wbGV0ZWQuXG4gICAgICAvLyBUaGUgcmVxdWVzdCBhdCB0aGUgdGFpbCBvZiB0aGUgcGlwZWxpbmUgaXMgdGhlIG9uZVxuICAgICAgLy8gdGhhdCByZXF1ZXN0ZWQgcmVzZXQgYW5kIG5vIGZ1cnRoZXIgcmVxdWVzdHMgc2hvdWxkXG4gICAgICAvLyBoYXZlIGJlZW4gcXVldWVkIHNpbmNlIHRoZW4uXG4gICAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgSW5mb3JtYXRpb25hbEVycm9yKCdyZXNldCcpKVxuICAgICAgcmV0dXJuIGNvbnN0YW50cy5FUlJPUi5QQVVTRURcbiAgICB9IGVsc2UgaWYgKGNsaWVudFtrUGlwZWxpbmluZ10gPT09IDEpIHtcbiAgICAgIC8vIFdlIG11c3Qgd2FpdCBhIGZ1bGwgZXZlbnQgbG9vcCBjeWNsZSB0byByZXVzZSB0aGlzIHNvY2tldCB0byBtYWtlIHN1cmVcbiAgICAgIC8vIHRoYXQgbm9uLXNwZWMgY29tcGxpYW50IHNlcnZlcnMgYXJlIG5vdCBjbG9zaW5nIHRoZSBjb25uZWN0aW9uIGV2ZW4gaWYgdGhleVxuICAgICAgLy8gc2FpZCB0aGV5IHdvbid0LlxuICAgICAgc2V0SW1tZWRpYXRlKHJlc3VtZSwgY2xpZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bWUoY2xpZW50KVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBvblBhcnNlclRpbWVvdXQgKHBhcnNlcikge1xuICBjb25zdCB7IHNvY2tldCwgdGltZW91dFR5cGUsIGNsaWVudCB9ID0gcGFyc2VyXG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKHRpbWVvdXRUeXBlID09PSBUSU1FT1VUX0hFQURFUlMpIHtcbiAgICBpZiAoIXNvY2tldFtrV3JpdGluZ10gfHwgc29ja2V0LndyaXRhYmxlTmVlZERyYWluIHx8IGNsaWVudFtrUnVubmluZ10gPiAxKSB7XG4gICAgICBhc3NlcnQoIXBhcnNlci5wYXVzZWQsICdjYW5ub3QgYmUgcGF1c2VkIHdoaWxlIHdhaXRpbmcgZm9yIGhlYWRlcnMnKVxuICAgICAgdXRpbC5kZXN0cm95KHNvY2tldCwgbmV3IEhlYWRlcnNUaW1lb3V0RXJyb3IoKSlcbiAgICB9XG4gIH0gZWxzZSBpZiAodGltZW91dFR5cGUgPT09IFRJTUVPVVRfQk9EWSkge1xuICAgIGlmICghcGFyc2VyLnBhdXNlZCkge1xuICAgICAgdXRpbC5kZXN0cm95KHNvY2tldCwgbmV3IEJvZHlUaW1lb3V0RXJyb3IoKSlcbiAgICB9XG4gIH0gZWxzZSBpZiAodGltZW91dFR5cGUgPT09IFRJTUVPVVRfSURMRSkge1xuICAgIGFzc2VydChjbGllbnRba1J1bm5pbmddID09PSAwICYmIGNsaWVudFtrS2VlcEFsaXZlVGltZW91dFZhbHVlXSlcbiAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgSW5mb3JtYXRpb25hbEVycm9yKCdzb2NrZXQgaWRsZSB0aW1lb3V0JykpXG4gIH1cbn1cblxuZnVuY3Rpb24gb25Tb2NrZXRSZWFkYWJsZSAoKSB7XG4gIGNvbnN0IHsgW2tQYXJzZXJdOiBwYXJzZXIgfSA9IHRoaXNcbiAgaWYgKHBhcnNlcikge1xuICAgIHBhcnNlci5yZWFkTW9yZSgpXG4gIH1cbn1cblxuZnVuY3Rpb24gb25Tb2NrZXRFcnJvciAoZXJyKSB7XG4gIGNvbnN0IHsgW2tDbGllbnRdOiBjbGllbnQsIFtrUGFyc2VyXTogcGFyc2VyIH0gPSB0aGlzXG5cbiAgYXNzZXJ0KGVyci5jb2RlICE9PSAnRVJSX1RMU19DRVJUX0FMVE5BTUVfSU5WQUxJRCcpXG5cbiAgaWYgKGNsaWVudFtrSFRUUENvbm5WZXJzaW9uXSAhPT0gJ2gyJykge1xuICAgIC8vIE9uIE1hYyBPUywgd2UgZ2V0IGFuIEVDT05OUkVTRVQgZXZlbiBpZiB0aGVyZSBpcyBhIGZ1bGwgYm9keSB0byBiZSBmb3J3YXJkZWRcbiAgICAvLyB0byB0aGUgdXNlci5cbiAgICBpZiAoZXJyLmNvZGUgPT09ICdFQ09OTlJFU0VUJyAmJiBwYXJzZXIuc3RhdHVzQ29kZSAmJiAhcGFyc2VyLnNob3VsZEtlZXBBbGl2ZSkge1xuICAgICAgLy8gV2UgdHJlYXQgYWxsIGluY29taW5nIGRhdGEgc28gZm9yIGFzIGEgdmFsaWQgcmVzcG9uc2UuXG4gICAgICBwYXJzZXIub25NZXNzYWdlQ29tcGxldGUoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICB9XG5cbiAgdGhpc1trRXJyb3JdID0gZXJyXG5cbiAgb25FcnJvcih0aGlzW2tDbGllbnRdLCBlcnIpXG59XG5cbmZ1bmN0aW9uIG9uRXJyb3IgKGNsaWVudCwgZXJyKSB7XG4gIGlmIChcbiAgICBjbGllbnRba1J1bm5pbmddID09PSAwICYmXG4gICAgZXJyLmNvZGUgIT09ICdVTkRfRVJSX0lORk8nICYmXG4gICAgZXJyLmNvZGUgIT09ICdVTkRfRVJSX1NPQ0tFVCdcbiAgKSB7XG4gICAgLy8gRXJyb3IgaXMgbm90IGNhdXNlZCBieSBydW5uaW5nIHJlcXVlc3QgYW5kIG5vdCBhIHJlY292ZXJhYmxlXG4gICAgLy8gc29ja2V0IGVycm9yLlxuXG4gICAgYXNzZXJ0KGNsaWVudFtrUGVuZGluZ0lkeF0gPT09IGNsaWVudFtrUnVubmluZ0lkeF0pXG5cbiAgICBjb25zdCByZXF1ZXN0cyA9IGNsaWVudFtrUXVldWVdLnNwbGljZShjbGllbnRba1J1bm5pbmdJZHhdKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVxdWVzdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSByZXF1ZXN0c1tpXVxuICAgICAgZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgZXJyKVxuICAgIH1cbiAgICBhc3NlcnQoY2xpZW50W2tTaXplXSA9PT0gMClcbiAgfVxufVxuXG5mdW5jdGlvbiBvblNvY2tldEVuZCAoKSB7XG4gIGNvbnN0IHsgW2tQYXJzZXJdOiBwYXJzZXIsIFtrQ2xpZW50XTogY2xpZW50IH0gPSB0aGlzXG5cbiAgaWYgKGNsaWVudFtrSFRUUENvbm5WZXJzaW9uXSAhPT0gJ2gyJykge1xuICAgIGlmIChwYXJzZXIuc3RhdHVzQ29kZSAmJiAhcGFyc2VyLnNob3VsZEtlZXBBbGl2ZSkge1xuICAgICAgLy8gV2UgdHJlYXQgYWxsIGluY29taW5nIGRhdGEgc28gZmFyIGFzIGEgdmFsaWQgcmVzcG9uc2UuXG4gICAgICBwYXJzZXIub25NZXNzYWdlQ29tcGxldGUoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICB9XG5cbiAgdXRpbC5kZXN0cm95KHRoaXMsIG5ldyBTb2NrZXRFcnJvcignb3RoZXIgc2lkZSBjbG9zZWQnLCB1dGlsLmdldFNvY2tldEluZm8odGhpcykpKVxufVxuXG5mdW5jdGlvbiBvblNvY2tldENsb3NlICgpIHtcbiAgY29uc3QgeyBba0NsaWVudF06IGNsaWVudCwgW2tQYXJzZXJdOiBwYXJzZXIgfSA9IHRoaXNcblxuICBpZiAoY2xpZW50W2tIVFRQQ29ublZlcnNpb25dID09PSAnaDEnICYmIHBhcnNlcikge1xuICAgIGlmICghdGhpc1trRXJyb3JdICYmIHBhcnNlci5zdGF0dXNDb2RlICYmICFwYXJzZXIuc2hvdWxkS2VlcEFsaXZlKSB7XG4gICAgICAvLyBXZSB0cmVhdCBhbGwgaW5jb21pbmcgZGF0YSBzbyBmYXIgYXMgYSB2YWxpZCByZXNwb25zZS5cbiAgICAgIHBhcnNlci5vbk1lc3NhZ2VDb21wbGV0ZSgpXG4gICAgfVxuXG4gICAgdGhpc1trUGFyc2VyXS5kZXN0cm95KClcbiAgICB0aGlzW2tQYXJzZXJdID0gbnVsbFxuICB9XG5cbiAgY29uc3QgZXJyID0gdGhpc1trRXJyb3JdIHx8IG5ldyBTb2NrZXRFcnJvcignY2xvc2VkJywgdXRpbC5nZXRTb2NrZXRJbmZvKHRoaXMpKVxuXG4gIGNsaWVudFtrU29ja2V0XSA9IG51bGxcblxuICBpZiAoY2xpZW50LmRlc3Ryb3llZCkge1xuICAgIGFzc2VydChjbGllbnRba1BlbmRpbmddID09PSAwKVxuXG4gICAgLy8gRmFpbCBlbnRpcmUgcXVldWUuXG4gICAgY29uc3QgcmVxdWVzdHMgPSBjbGllbnRba1F1ZXVlXS5zcGxpY2UoY2xpZW50W2tSdW5uaW5nSWR4XSlcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcXVlc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gcmVxdWVzdHNbaV1cbiAgICAgIGVycm9yUmVxdWVzdChjbGllbnQsIHJlcXVlc3QsIGVycilcbiAgICB9XG4gIH0gZWxzZSBpZiAoY2xpZW50W2tSdW5uaW5nXSA+IDAgJiYgZXJyLmNvZGUgIT09ICdVTkRfRVJSX0lORk8nKSB7XG4gICAgLy8gRmFpbCBoZWFkIG9mIHBpcGVsaW5lLlxuICAgIGNvbnN0IHJlcXVlc3QgPSBjbGllbnRba1F1ZXVlXVtjbGllbnRba1J1bm5pbmdJZHhdXVxuICAgIGNsaWVudFtrUXVldWVdW2NsaWVudFtrUnVubmluZ0lkeF0rK10gPSBudWxsXG5cbiAgICBlcnJvclJlcXVlc3QoY2xpZW50LCByZXF1ZXN0LCBlcnIpXG4gIH1cblxuICBjbGllbnRba1BlbmRpbmdJZHhdID0gY2xpZW50W2tSdW5uaW5nSWR4XVxuXG4gIGFzc2VydChjbGllbnRba1J1bm5pbmddID09PSAwKVxuXG4gIGNsaWVudC5lbWl0KCdkaXNjb25uZWN0JywgY2xpZW50W2tVcmxdLCBbY2xpZW50XSwgZXJyKVxuXG4gIHJlc3VtZShjbGllbnQpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbm5lY3QgKGNsaWVudCkge1xuICBhc3NlcnQoIWNsaWVudFtrQ29ubmVjdGluZ10pXG4gIGFzc2VydCghY2xpZW50W2tTb2NrZXRdKVxuXG4gIGxldCB7IGhvc3QsIGhvc3RuYW1lLCBwcm90b2NvbCwgcG9ydCB9ID0gY2xpZW50W2tVcmxdXG5cbiAgLy8gUmVzb2x2ZSBpcHY2XG4gIGlmIChob3N0bmFtZVswXSA9PT0gJ1snKSB7XG4gICAgY29uc3QgaWR4ID0gaG9zdG5hbWUuaW5kZXhPZignXScpXG5cbiAgICBhc3NlcnQoaWR4ICE9PSAtMSlcbiAgICBjb25zdCBpcCA9IGhvc3RuYW1lLnN1YnN0cmluZygxLCBpZHgpXG5cbiAgICBhc3NlcnQobmV0LmlzSVAoaXApKVxuICAgIGhvc3RuYW1lID0gaXBcbiAgfVxuXG4gIGNsaWVudFtrQ29ubmVjdGluZ10gPSB0cnVlXG5cbiAgaWYgKGNoYW5uZWxzLmJlZm9yZUNvbm5lY3QuaGFzU3Vic2NyaWJlcnMpIHtcbiAgICBjaGFubmVscy5iZWZvcmVDb25uZWN0LnB1Ymxpc2goe1xuICAgICAgY29ubmVjdFBhcmFtczoge1xuICAgICAgICBob3N0LFxuICAgICAgICBob3N0bmFtZSxcbiAgICAgICAgcHJvdG9jb2wsXG4gICAgICAgIHBvcnQsXG4gICAgICAgIHNlcnZlcm5hbWU6IGNsaWVudFtrU2VydmVyTmFtZV0sXG4gICAgICAgIGxvY2FsQWRkcmVzczogY2xpZW50W2tMb2NhbEFkZHJlc3NdXG4gICAgICB9LFxuICAgICAgY29ubmVjdG9yOiBjbGllbnRba0Nvbm5lY3Rvcl1cbiAgICB9KVxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzb2NrZXQgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjbGllbnRba0Nvbm5lY3Rvcl0oe1xuICAgICAgICBob3N0LFxuICAgICAgICBob3N0bmFtZSxcbiAgICAgICAgcHJvdG9jb2wsXG4gICAgICAgIHBvcnQsXG4gICAgICAgIHNlcnZlcm5hbWU6IGNsaWVudFtrU2VydmVyTmFtZV0sXG4gICAgICAgIGxvY2FsQWRkcmVzczogY2xpZW50W2tMb2NhbEFkZHJlc3NdXG4gICAgICB9LCAoZXJyLCBzb2NrZXQpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZShzb2NrZXQpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGlmIChjbGllbnQuZGVzdHJveWVkKSB7XG4gICAgICB1dGlsLmRlc3Ryb3koc29ja2V0Lm9uKCdlcnJvcicsICgpID0+IHt9KSwgbmV3IENsaWVudERlc3Ryb3llZEVycm9yKCkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjbGllbnRba0Nvbm5lY3RpbmddID0gZmFsc2VcblxuICAgIGFzc2VydChzb2NrZXQpXG5cbiAgICBjb25zdCBpc0gyID0gc29ja2V0LmFscG5Qcm90b2NvbCA9PT0gJ2gyJ1xuICAgIGlmIChpc0gyKSB7XG4gICAgICBpZiAoIWgyRXhwZXJpbWVudGFsV2FybmVkKSB7XG4gICAgICAgIGgyRXhwZXJpbWVudGFsV2FybmVkID0gdHJ1ZVxuICAgICAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKCdIMiBzdXBwb3J0IGlzIGV4cGVyaW1lbnRhbCwgZXhwZWN0IHRoZW0gdG8gY2hhbmdlIGF0IGFueSB0aW1lLicsIHtcbiAgICAgICAgICBjb2RlOiAnVU5ESUNJLUgyJ1xuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzZXNzaW9uID0gaHR0cDIuY29ubmVjdChjbGllbnRba1VybF0sIHtcbiAgICAgICAgY3JlYXRlQ29ubmVjdGlvbjogKCkgPT4gc29ja2V0LFxuICAgICAgICBwZWVyTWF4Q29uY3VycmVudFN0cmVhbXM6IGNsaWVudFtrSFRUUDJTZXNzaW9uU3RhdGVdLm1heENvbmN1cnJlbnRTdHJlYW1zXG4gICAgICB9KVxuXG4gICAgICBjbGllbnRba0hUVFBDb25uVmVyc2lvbl0gPSAnaDInXG4gICAgICBzZXNzaW9uW2tDbGllbnRdID0gY2xpZW50XG4gICAgICBzZXNzaW9uW2tTb2NrZXRdID0gc29ja2V0XG4gICAgICBzZXNzaW9uLm9uKCdlcnJvcicsIG9uSHR0cDJTZXNzaW9uRXJyb3IpXG4gICAgICBzZXNzaW9uLm9uKCdmcmFtZUVycm9yJywgb25IdHRwMkZyYW1lRXJyb3IpXG4gICAgICBzZXNzaW9uLm9uKCdlbmQnLCBvbkh0dHAyU2Vzc2lvbkVuZClcbiAgICAgIHNlc3Npb24ub24oJ2dvYXdheScsIG9uSFRUUDJHb0F3YXkpXG4gICAgICBzZXNzaW9uLm9uKCdjbG9zZScsIG9uU29ja2V0Q2xvc2UpXG4gICAgICBzZXNzaW9uLnVucmVmKClcblxuICAgICAgY2xpZW50W2tIVFRQMlNlc3Npb25dID0gc2Vzc2lvblxuICAgICAgc29ja2V0W2tIVFRQMlNlc3Npb25dID0gc2Vzc2lvblxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWxsaHR0cEluc3RhbmNlKSB7XG4gICAgICAgIGxsaHR0cEluc3RhbmNlID0gYXdhaXQgbGxodHRwUHJvbWlzZVxuICAgICAgICBsbGh0dHBQcm9taXNlID0gbnVsbFxuICAgICAgfVxuXG4gICAgICBzb2NrZXRba05vUmVmXSA9IGZhbHNlXG4gICAgICBzb2NrZXRba1dyaXRpbmddID0gZmFsc2VcbiAgICAgIHNvY2tldFtrUmVzZXRdID0gZmFsc2VcbiAgICAgIHNvY2tldFtrQmxvY2tpbmddID0gZmFsc2VcbiAgICAgIHNvY2tldFtrUGFyc2VyXSA9IG5ldyBQYXJzZXIoY2xpZW50LCBzb2NrZXQsIGxsaHR0cEluc3RhbmNlKVxuICAgIH1cblxuICAgIHNvY2tldFtrQ291bnRlcl0gPSAwXG4gICAgc29ja2V0W2tNYXhSZXF1ZXN0c10gPSBjbGllbnRba01heFJlcXVlc3RzXVxuICAgIHNvY2tldFtrQ2xpZW50XSA9IGNsaWVudFxuICAgIHNvY2tldFtrRXJyb3JdID0gbnVsbFxuXG4gICAgc29ja2V0XG4gICAgICAub24oJ2Vycm9yJywgb25Tb2NrZXRFcnJvcilcbiAgICAgIC5vbigncmVhZGFibGUnLCBvblNvY2tldFJlYWRhYmxlKVxuICAgICAgLm9uKCdlbmQnLCBvblNvY2tldEVuZClcbiAgICAgIC5vbignY2xvc2UnLCBvblNvY2tldENsb3NlKVxuXG4gICAgY2xpZW50W2tTb2NrZXRdID0gc29ja2V0XG5cbiAgICBpZiAoY2hhbm5lbHMuY29ubmVjdGVkLmhhc1N1YnNjcmliZXJzKSB7XG4gICAgICBjaGFubmVscy5jb25uZWN0ZWQucHVibGlzaCh7XG4gICAgICAgIGNvbm5lY3RQYXJhbXM6IHtcbiAgICAgICAgICBob3N0LFxuICAgICAgICAgIGhvc3RuYW1lLFxuICAgICAgICAgIHByb3RvY29sLFxuICAgICAgICAgIHBvcnQsXG4gICAgICAgICAgc2VydmVybmFtZTogY2xpZW50W2tTZXJ2ZXJOYW1lXSxcbiAgICAgICAgICBsb2NhbEFkZHJlc3M6IGNsaWVudFtrTG9jYWxBZGRyZXNzXVxuICAgICAgICB9LFxuICAgICAgICBjb25uZWN0b3I6IGNsaWVudFtrQ29ubmVjdG9yXSxcbiAgICAgICAgc29ja2V0XG4gICAgICB9KVxuICAgIH1cbiAgICBjbGllbnQuZW1pdCgnY29ubmVjdCcsIGNsaWVudFtrVXJsXSwgW2NsaWVudF0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChjbGllbnQuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjbGllbnRba0Nvbm5lY3RpbmddID0gZmFsc2VcblxuICAgIGlmIChjaGFubmVscy5jb25uZWN0RXJyb3IuaGFzU3Vic2NyaWJlcnMpIHtcbiAgICAgIGNoYW5uZWxzLmNvbm5lY3RFcnJvci5wdWJsaXNoKHtcbiAgICAgICAgY29ubmVjdFBhcmFtczoge1xuICAgICAgICAgIGhvc3QsXG4gICAgICAgICAgaG9zdG5hbWUsXG4gICAgICAgICAgcHJvdG9jb2wsXG4gICAgICAgICAgcG9ydCxcbiAgICAgICAgICBzZXJ2ZXJuYW1lOiBjbGllbnRba1NlcnZlck5hbWVdLFxuICAgICAgICAgIGxvY2FsQWRkcmVzczogY2xpZW50W2tMb2NhbEFkZHJlc3NdXG4gICAgICAgIH0sXG4gICAgICAgIGNvbm5lY3RvcjogY2xpZW50W2tDb25uZWN0b3JdLFxuICAgICAgICBlcnJvcjogZXJyXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChlcnIuY29kZSA9PT0gJ0VSUl9UTFNfQ0VSVF9BTFROQU1FX0lOVkFMSUQnKSB7XG4gICAgICBhc3NlcnQoY2xpZW50W2tSdW5uaW5nXSA9PT0gMClcbiAgICAgIHdoaWxlIChjbGllbnRba1BlbmRpbmddID4gMCAmJiBjbGllbnRba1F1ZXVlXVtjbGllbnRba1BlbmRpbmdJZHhdXS5zZXJ2ZXJuYW1lID09PSBjbGllbnRba1NlcnZlck5hbWVdKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBjbGllbnRba1F1ZXVlXVtjbGllbnRba1BlbmRpbmdJZHhdKytdXG4gICAgICAgIGVycm9yUmVxdWVzdChjbGllbnQsIHJlcXVlc3QsIGVycilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb25FcnJvcihjbGllbnQsIGVycilcbiAgICB9XG5cbiAgICBjbGllbnQuZW1pdCgnY29ubmVjdGlvbkVycm9yJywgY2xpZW50W2tVcmxdLCBbY2xpZW50XSwgZXJyKVxuICB9XG5cbiAgcmVzdW1lKGNsaWVudClcbn1cblxuZnVuY3Rpb24gZW1pdERyYWluIChjbGllbnQpIHtcbiAgY2xpZW50W2tOZWVkRHJhaW5dID0gMFxuICBjbGllbnQuZW1pdCgnZHJhaW4nLCBjbGllbnRba1VybF0sIFtjbGllbnRdKVxufVxuXG5mdW5jdGlvbiByZXN1bWUgKGNsaWVudCwgc3luYykge1xuICBpZiAoY2xpZW50W2tSZXN1bWluZ10gPT09IDIpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNsaWVudFtrUmVzdW1pbmddID0gMlxuXG4gIF9yZXN1bWUoY2xpZW50LCBzeW5jKVxuICBjbGllbnRba1Jlc3VtaW5nXSA9IDBcblxuICBpZiAoY2xpZW50W2tSdW5uaW5nSWR4XSA+IDI1Nikge1xuICAgIGNsaWVudFtrUXVldWVdLnNwbGljZSgwLCBjbGllbnRba1J1bm5pbmdJZHhdKVxuICAgIGNsaWVudFtrUGVuZGluZ0lkeF0gLT0gY2xpZW50W2tSdW5uaW5nSWR4XVxuICAgIGNsaWVudFtrUnVubmluZ0lkeF0gPSAwXG4gIH1cbn1cblxuZnVuY3Rpb24gX3Jlc3VtZSAoY2xpZW50LCBzeW5jKSB7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKGNsaWVudC5kZXN0cm95ZWQpIHtcbiAgICAgIGFzc2VydChjbGllbnRba1BlbmRpbmddID09PSAwKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGNsaWVudFtrQ2xvc2VkUmVzb2x2ZV0gJiYgIWNsaWVudFtrU2l6ZV0pIHtcbiAgICAgIGNsaWVudFtrQ2xvc2VkUmVzb2x2ZV0oKVxuICAgICAgY2xpZW50W2tDbG9zZWRSZXNvbHZlXSA9IG51bGxcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNvY2tldCA9IGNsaWVudFtrU29ja2V0XVxuXG4gICAgaWYgKHNvY2tldCAmJiAhc29ja2V0LmRlc3Ryb3llZCAmJiBzb2NrZXQuYWxwblByb3RvY29sICE9PSAnaDInKSB7XG4gICAgICBpZiAoY2xpZW50W2tTaXplXSA9PT0gMCkge1xuICAgICAgICBpZiAoIXNvY2tldFtrTm9SZWZdICYmIHNvY2tldC51bnJlZikge1xuICAgICAgICAgIHNvY2tldC51bnJlZigpXG4gICAgICAgICAgc29ja2V0W2tOb1JlZl0gPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc29ja2V0W2tOb1JlZl0gJiYgc29ja2V0LnJlZikge1xuICAgICAgICBzb2NrZXQucmVmKClcbiAgICAgICAgc29ja2V0W2tOb1JlZl0gPSBmYWxzZVxuICAgICAgfVxuXG4gICAgICBpZiAoY2xpZW50W2tTaXplXSA9PT0gMCkge1xuICAgICAgICBpZiAoc29ja2V0W2tQYXJzZXJdLnRpbWVvdXRUeXBlICE9PSBUSU1FT1VUX0lETEUpIHtcbiAgICAgICAgICBzb2NrZXRba1BhcnNlcl0uc2V0VGltZW91dChjbGllbnRba0tlZXBBbGl2ZVRpbWVvdXRWYWx1ZV0sIFRJTUVPVVRfSURMRSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjbGllbnRba1J1bm5pbmddID4gMCAmJiBzb2NrZXRba1BhcnNlcl0uc3RhdHVzQ29kZSA8IDIwMCkge1xuICAgICAgICBpZiAoc29ja2V0W2tQYXJzZXJdLnRpbWVvdXRUeXBlICE9PSBUSU1FT1VUX0hFQURFUlMpIHtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XV1cbiAgICAgICAgICBjb25zdCBoZWFkZXJzVGltZW91dCA9IHJlcXVlc3QuaGVhZGVyc1RpbWVvdXQgIT0gbnVsbFxuICAgICAgICAgICAgPyByZXF1ZXN0LmhlYWRlcnNUaW1lb3V0XG4gICAgICAgICAgICA6IGNsaWVudFtrSGVhZGVyc1RpbWVvdXRdXG4gICAgICAgICAgc29ja2V0W2tQYXJzZXJdLnNldFRpbWVvdXQoaGVhZGVyc1RpbWVvdXQsIFRJTUVPVVRfSEVBREVSUylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjbGllbnRba0J1c3ldKSB7XG4gICAgICBjbGllbnRba05lZWREcmFpbl0gPSAyXG4gICAgfSBlbHNlIGlmIChjbGllbnRba05lZWREcmFpbl0gPT09IDIpIHtcbiAgICAgIGlmIChzeW5jKSB7XG4gICAgICAgIGNsaWVudFtrTmVlZERyYWluXSA9IDFcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0RHJhaW4sIGNsaWVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVtaXREcmFpbihjbGllbnQpXG4gICAgICB9XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChjbGllbnRba1BlbmRpbmddID09PSAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoY2xpZW50W2tSdW5uaW5nXSA+PSAoY2xpZW50W2tQaXBlbGluaW5nXSB8fCAxKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdCA9IGNsaWVudFtrUXVldWVdW2NsaWVudFtrUGVuZGluZ0lkeF1dXG5cbiAgICBpZiAoY2xpZW50W2tVcmxdLnByb3RvY29sID09PSAnaHR0cHM6JyAmJiBjbGllbnRba1NlcnZlck5hbWVdICE9PSByZXF1ZXN0LnNlcnZlcm5hbWUpIHtcbiAgICAgIGlmIChjbGllbnRba1J1bm5pbmddID4gMCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY2xpZW50W2tTZXJ2ZXJOYW1lXSA9IHJlcXVlc3Quc2VydmVybmFtZVxuXG4gICAgICBpZiAoc29ja2V0ICYmIHNvY2tldC5zZXJ2ZXJuYW1lICE9PSByZXF1ZXN0LnNlcnZlcm5hbWUpIHtcbiAgICAgICAgdXRpbC5kZXN0cm95KHNvY2tldCwgbmV3IEluZm9ybWF0aW9uYWxFcnJvcignc2VydmVybmFtZSBjaGFuZ2VkJykpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjbGllbnRba0Nvbm5lY3RpbmddKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIXNvY2tldCAmJiAhY2xpZW50W2tIVFRQMlNlc3Npb25dKSB7XG4gICAgICBjb25uZWN0KGNsaWVudClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChzb2NrZXQuZGVzdHJveWVkIHx8IHNvY2tldFtrV3JpdGluZ10gfHwgc29ja2V0W2tSZXNldF0gfHwgc29ja2V0W2tCbG9ja2luZ10pIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChjbGllbnRba1J1bm5pbmddID4gMCAmJiAhcmVxdWVzdC5pZGVtcG90ZW50KSB7XG4gICAgICAvLyBOb24taWRlbXBvdGVudCByZXF1ZXN0IGNhbm5vdCBiZSByZXRyaWVkLlxuICAgICAgLy8gRW5zdXJlIHRoYXQgbm8gb3RoZXIgcmVxdWVzdHMgYXJlIGluZmxpZ2h0IGFuZFxuICAgICAgLy8gY291bGQgY2F1c2UgZmFpbHVyZS5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChjbGllbnRba1J1bm5pbmddID4gMCAmJiAocmVxdWVzdC51cGdyYWRlIHx8IHJlcXVlc3QubWV0aG9kID09PSAnQ09OTkVDVCcpKSB7XG4gICAgICAvLyBEb24ndCBkaXNwYXRjaCBhbiB1cGdyYWRlIHVudGlsIGFsbCBwcmVjZWRpbmcgcmVxdWVzdHMgaGF2ZSBjb21wbGV0ZWQuXG4gICAgICAvLyBBIG1pc2JlaGF2aW5nIHNlcnZlciBtaWdodCB1cGdyYWRlIHRoZSBjb25uZWN0aW9uIGJlZm9yZSBhbGwgcGlwZWxpbmVkXG4gICAgICAvLyByZXF1ZXN0IGhhcyBjb21wbGV0ZWQuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoY2xpZW50W2tSdW5uaW5nXSA+IDAgJiYgdXRpbC5ib2R5TGVuZ3RoKHJlcXVlc3QuYm9keSkgIT09IDAgJiZcbiAgICAgICh1dGlsLmlzU3RyZWFtKHJlcXVlc3QuYm9keSkgfHwgdXRpbC5pc0FzeW5jSXRlcmFibGUocmVxdWVzdC5ib2R5KSkpIHtcbiAgICAgIC8vIFJlcXVlc3Qgd2l0aCBzdHJlYW0gb3IgaXRlcmF0b3IgYm9keSBjYW4gZXJyb3Igd2hpbGUgb3RoZXIgcmVxdWVzdHNcbiAgICAgIC8vIGFyZSBpbmZsaWdodCBhbmQgaW5kaXJlY3RseSBlcnJvciB0aG9zZSBhcyB3ZWxsLlxuICAgICAgLy8gRW5zdXJlIHRoaXMgZG9lc24ndCBoYXBwZW4gYnkgd2FpdGluZyBmb3IgaW5mbGlnaHRcbiAgICAgIC8vIHRvIGNvbXBsZXRlIGJlZm9yZSBkaXNwYXRjaGluZy5cblxuICAgICAgLy8gUmVxdWVzdCB3aXRoIHN0cmVhbSBvciBpdGVyYXRvciBib2R5IGNhbm5vdCBiZSByZXRyaWVkLlxuICAgICAgLy8gRW5zdXJlIHRoYXQgbm8gb3RoZXIgcmVxdWVzdHMgYXJlIGluZmxpZ2h0IGFuZFxuICAgICAgLy8gY291bGQgY2F1c2UgZmFpbHVyZS5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghcmVxdWVzdC5hYm9ydGVkICYmIHdyaXRlKGNsaWVudCwgcmVxdWVzdCkpIHtcbiAgICAgIGNsaWVudFtrUGVuZGluZ0lkeF0rK1xuICAgIH0gZWxzZSB7XG4gICAgICBjbGllbnRba1F1ZXVlXS5zcGxpY2UoY2xpZW50W2tQZW5kaW5nSWR4XSwgMSlcbiAgICB9XG4gIH1cbn1cblxuLy8gaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzcyMzAjc2VjdGlvbi0zLjMuMlxuZnVuY3Rpb24gc2hvdWxkU2VuZENvbnRlbnRMZW5ndGggKG1ldGhvZCkge1xuICByZXR1cm4gbWV0aG9kICE9PSAnR0VUJyAmJiBtZXRob2QgIT09ICdIRUFEJyAmJiBtZXRob2QgIT09ICdPUFRJT05TJyAmJiBtZXRob2QgIT09ICdUUkFDRScgJiYgbWV0aG9kICE9PSAnQ09OTkVDVCdcbn1cblxuZnVuY3Rpb24gd3JpdGUgKGNsaWVudCwgcmVxdWVzdCkge1xuICBpZiAoY2xpZW50W2tIVFRQQ29ublZlcnNpb25dID09PSAnaDInKSB7XG4gICAgd3JpdGVIMihjbGllbnQsIGNsaWVudFtrSFRUUDJTZXNzaW9uXSwgcmVxdWVzdClcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHsgYm9keSwgbWV0aG9kLCBwYXRoLCBob3N0LCB1cGdyYWRlLCBoZWFkZXJzLCBibG9ja2luZywgcmVzZXQgfSA9IHJlcXVlc3RcblxuICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTQuMy4xXG4gIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNC4zLjJcbiAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi00LjMuNVxuXG4gIC8vIFNlbmRpbmcgYSBwYXlsb2FkIGJvZHkgb24gYSByZXF1ZXN0IHRoYXQgZG9lcyBub3RcbiAgLy8gZXhwZWN0IGl0IGNhbiBjYXVzZSB1bmRlZmluZWQgYmVoYXZpb3Igb24gc29tZVxuICAvLyBzZXJ2ZXJzIGFuZCBjb3JydXB0IGNvbm5lY3Rpb24gc3RhdGUuIERvIG5vdFxuICAvLyByZS11c2UgdGhlIGNvbm5lY3Rpb24gZm9yIGZ1cnRoZXIgcmVxdWVzdHMuXG5cbiAgY29uc3QgZXhwZWN0c1BheWxvYWQgPSAoXG4gICAgbWV0aG9kID09PSAnUFVUJyB8fFxuICAgIG1ldGhvZCA9PT0gJ1BPU1QnIHx8XG4gICAgbWV0aG9kID09PSAnUEFUQ0gnXG4gIClcblxuICBpZiAoYm9keSAmJiB0eXBlb2YgYm9keS5yZWFkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gVHJ5IHRvIHJlYWQgRU9GIGluIG9yZGVyIHRvIGdldCBsZW5ndGguXG4gICAgYm9keS5yZWFkKDApXG4gIH1cblxuICBjb25zdCBib2R5TGVuZ3RoID0gdXRpbC5ib2R5TGVuZ3RoKGJvZHkpXG5cbiAgbGV0IGNvbnRlbnRMZW5ndGggPSBib2R5TGVuZ3RoXG5cbiAgaWYgKGNvbnRlbnRMZW5ndGggPT09IG51bGwpIHtcbiAgICBjb250ZW50TGVuZ3RoID0gcmVxdWVzdC5jb250ZW50TGVuZ3RoXG4gIH1cblxuICBpZiAoY29udGVudExlbmd0aCA9PT0gMCAmJiAhZXhwZWN0c1BheWxvYWQpIHtcbiAgICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMy4yXG4gICAgLy8gQSB1c2VyIGFnZW50IFNIT1VMRCBOT1Qgc2VuZCBhIENvbnRlbnQtTGVuZ3RoIGhlYWRlciBmaWVsZCB3aGVuXG4gICAgLy8gdGhlIHJlcXVlc3QgbWVzc2FnZSBkb2VzIG5vdCBjb250YWluIGEgcGF5bG9hZCBib2R5IGFuZCB0aGUgbWV0aG9kXG4gICAgLy8gc2VtYW50aWNzIGRvIG5vdCBhbnRpY2lwYXRlIHN1Y2ggYSBib2R5LlxuXG4gICAgY29udGVudExlbmd0aCA9IG51bGxcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2lzc3Vlcy8yMDQ2XG4gIC8vIEEgdXNlciBhZ2VudCBtYXkgc2VuZCBhIENvbnRlbnQtTGVuZ3RoIGhlYWRlciB3aXRoIDAgdmFsdWUsIHRoaXMgc2hvdWxkIGJlIGFsbG93ZWQuXG4gIGlmIChzaG91bGRTZW5kQ29udGVudExlbmd0aChtZXRob2QpICYmIGNvbnRlbnRMZW5ndGggPiAwICYmIHJlcXVlc3QuY29udGVudExlbmd0aCAhPT0gbnVsbCAmJiByZXF1ZXN0LmNvbnRlbnRMZW5ndGggIT09IGNvbnRlbnRMZW5ndGgpIHtcbiAgICBpZiAoY2xpZW50W2tTdHJpY3RDb250ZW50TGVuZ3RoXSkge1xuICAgICAgZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgbmV3IFJlcXVlc3RDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcigpKVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcHJvY2Vzcy5lbWl0V2FybmluZyhuZXcgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yKCkpXG4gIH1cblxuICBjb25zdCBzb2NrZXQgPSBjbGllbnRba1NvY2tldF1cblxuICB0cnkge1xuICAgIHJlcXVlc3Qub25Db25uZWN0KChlcnIpID0+IHtcbiAgICAgIGlmIChyZXF1ZXN0LmFib3J0ZWQgfHwgcmVxdWVzdC5jb21wbGV0ZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGVycm9yUmVxdWVzdChjbGllbnQsIHJlcXVlc3QsIGVyciB8fCBuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpKVxuXG4gICAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgSW5mb3JtYXRpb25hbEVycm9yKCdhYm9ydGVkJykpXG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgZXJyKVxuICB9XG5cbiAgaWYgKHJlcXVlc3QuYWJvcnRlZCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKG1ldGhvZCA9PT0gJ0hFQUQnKSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21jb2xsaW5hL3VuZGljaS9pc3N1ZXMvMjU4XG4gICAgLy8gQ2xvc2UgYWZ0ZXIgYSBIRUFEIHJlcXVlc3QgdG8gaW50ZXJvcCB3aXRoIG1pc2JlaGF2aW5nIHNlcnZlcnNcbiAgICAvLyB0aGF0IG1heSBzZW5kIGEgYm9keSBpbiB0aGUgcmVzcG9uc2UuXG5cbiAgICBzb2NrZXRba1Jlc2V0XSA9IHRydWVcbiAgfVxuXG4gIGlmICh1cGdyYWRlIHx8IG1ldGhvZCA9PT0gJ0NPTk5FQ1QnKSB7XG4gICAgLy8gT24gQ09OTkVDVCBvciB1cGdyYWRlLCBibG9jayBwaXBlbGluZSBmcm9tIGRpc3BhdGNoaW5nIGZ1cnRoZXJcbiAgICAvLyByZXF1ZXN0cyBvbiB0aGlzIGNvbm5lY3Rpb24uXG5cbiAgICBzb2NrZXRba1Jlc2V0XSA9IHRydWVcbiAgfVxuXG4gIGlmIChyZXNldCAhPSBudWxsKSB7XG4gICAgc29ja2V0W2tSZXNldF0gPSByZXNldFxuICB9XG5cbiAgaWYgKGNsaWVudFtrTWF4UmVxdWVzdHNdICYmIHNvY2tldFtrQ291bnRlcl0rKyA+PSBjbGllbnRba01heFJlcXVlc3RzXSkge1xuICAgIHNvY2tldFtrUmVzZXRdID0gdHJ1ZVxuICB9XG5cbiAgaWYgKGJsb2NraW5nKSB7XG4gICAgc29ja2V0W2tCbG9ja2luZ10gPSB0cnVlXG4gIH1cblxuICBsZXQgaGVhZGVyID0gYCR7bWV0aG9kfSAke3BhdGh9IEhUVFAvMS4xXFxyXFxuYFxuXG4gIGlmICh0eXBlb2YgaG9zdCA9PT0gJ3N0cmluZycpIHtcbiAgICBoZWFkZXIgKz0gYGhvc3Q6ICR7aG9zdH1cXHJcXG5gXG4gIH0gZWxzZSB7XG4gICAgaGVhZGVyICs9IGNsaWVudFtrSG9zdEhlYWRlcl1cbiAgfVxuXG4gIGlmICh1cGdyYWRlKSB7XG4gICAgaGVhZGVyICs9IGBjb25uZWN0aW9uOiB1cGdyYWRlXFxyXFxudXBncmFkZTogJHt1cGdyYWRlfVxcclxcbmBcbiAgfSBlbHNlIGlmIChjbGllbnRba1BpcGVsaW5pbmddICYmICFzb2NrZXRba1Jlc2V0XSkge1xuICAgIGhlYWRlciArPSAnY29ubmVjdGlvbjoga2VlcC1hbGl2ZVxcclxcbidcbiAgfSBlbHNlIHtcbiAgICBoZWFkZXIgKz0gJ2Nvbm5lY3Rpb246IGNsb3NlXFxyXFxuJ1xuICB9XG5cbiAgaWYgKGhlYWRlcnMpIHtcbiAgICBoZWFkZXIgKz0gaGVhZGVyc1xuICB9XG5cbiAgaWYgKGNoYW5uZWxzLnNlbmRIZWFkZXJzLmhhc1N1YnNjcmliZXJzKSB7XG4gICAgY2hhbm5lbHMuc2VuZEhlYWRlcnMucHVibGlzaCh7IHJlcXVlc3QsIGhlYWRlcnM6IGhlYWRlciwgc29ja2V0IH0pXG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZTogYXNzZXJ0aW9uICovXG4gIGlmICghYm9keSB8fCBib2R5TGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGNvbnRlbnRMZW5ndGggPT09IDApIHtcbiAgICAgIHNvY2tldC53cml0ZShgJHtoZWFkZXJ9Y29udGVudC1sZW5ndGg6IDBcXHJcXG5cXHJcXG5gLCAnbGF0aW4xJylcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGNvbnRlbnRMZW5ndGggPT09IG51bGwsICdubyBib2R5IG11c3Qgbm90IGhhdmUgY29udGVudCBsZW5ndGgnKVxuICAgICAgc29ja2V0LndyaXRlKGAke2hlYWRlcn1cXHJcXG5gLCAnbGF0aW4xJylcbiAgICB9XG4gICAgcmVxdWVzdC5vblJlcXVlc3RTZW50KClcbiAgfSBlbHNlIGlmICh1dGlsLmlzQnVmZmVyKGJvZHkpKSB7XG4gICAgYXNzZXJ0KGNvbnRlbnRMZW5ndGggPT09IGJvZHkuYnl0ZUxlbmd0aCwgJ2J1ZmZlciBib2R5IG11c3QgaGF2ZSBjb250ZW50IGxlbmd0aCcpXG5cbiAgICBzb2NrZXQuY29yaygpXG4gICAgc29ja2V0LndyaXRlKGAke2hlYWRlcn1jb250ZW50LWxlbmd0aDogJHtjb250ZW50TGVuZ3RofVxcclxcblxcclxcbmAsICdsYXRpbjEnKVxuICAgIHNvY2tldC53cml0ZShib2R5KVxuICAgIHNvY2tldC51bmNvcmsoKVxuICAgIHJlcXVlc3Qub25Cb2R5U2VudChib2R5KVxuICAgIHJlcXVlc3Qub25SZXF1ZXN0U2VudCgpXG4gICAgaWYgKCFleHBlY3RzUGF5bG9hZCkge1xuICAgICAgc29ja2V0W2tSZXNldF0gPSB0cnVlXG4gICAgfVxuICB9IGVsc2UgaWYgKHV0aWwuaXNCbG9iTGlrZShib2R5KSkge1xuICAgIGlmICh0eXBlb2YgYm9keS5zdHJlYW0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdyaXRlSXRlcmFibGUoeyBib2R5OiBib2R5LnN0cmVhbSgpLCBjbGllbnQsIHJlcXVlc3QsIHNvY2tldCwgY29udGVudExlbmd0aCwgaGVhZGVyLCBleHBlY3RzUGF5bG9hZCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB3cml0ZUJsb2IoeyBib2R5LCBjbGllbnQsIHJlcXVlc3QsIHNvY2tldCwgY29udGVudExlbmd0aCwgaGVhZGVyLCBleHBlY3RzUGF5bG9hZCB9KVxuICAgIH1cbiAgfSBlbHNlIGlmICh1dGlsLmlzU3RyZWFtKGJvZHkpKSB7XG4gICAgd3JpdGVTdHJlYW0oeyBib2R5LCBjbGllbnQsIHJlcXVlc3QsIHNvY2tldCwgY29udGVudExlbmd0aCwgaGVhZGVyLCBleHBlY3RzUGF5bG9hZCB9KVxuICB9IGVsc2UgaWYgKHV0aWwuaXNJdGVyYWJsZShib2R5KSkge1xuICAgIHdyaXRlSXRlcmFibGUoeyBib2R5LCBjbGllbnQsIHJlcXVlc3QsIHNvY2tldCwgY29udGVudExlbmd0aCwgaGVhZGVyLCBleHBlY3RzUGF5bG9hZCB9KVxuICB9IGVsc2Uge1xuICAgIGFzc2VydChmYWxzZSlcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmZ1bmN0aW9uIHdyaXRlSDIgKGNsaWVudCwgc2Vzc2lvbiwgcmVxdWVzdCkge1xuICBjb25zdCB7IGJvZHksIG1ldGhvZCwgcGF0aCwgaG9zdCwgdXBncmFkZSwgZXhwZWN0Q29udGludWUsIHNpZ25hbCwgaGVhZGVyczogcmVxSGVhZGVycyB9ID0gcmVxdWVzdFxuXG4gIGxldCBoZWFkZXJzXG4gIGlmICh0eXBlb2YgcmVxSGVhZGVycyA9PT0gJ3N0cmluZycpIGhlYWRlcnMgPSBSZXF1ZXN0W2tIVFRQMkNvcHlIZWFkZXJzXShyZXFIZWFkZXJzLnRyaW0oKSlcbiAgZWxzZSBoZWFkZXJzID0gcmVxSGVhZGVyc1xuXG4gIGlmICh1cGdyYWRlKSB7XG4gICAgZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgbmV3IEVycm9yKCdVcGdyYWRlIG5vdCBzdXBwb3J0ZWQgZm9yIEgyJykpXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRPRE8oSFRUUC8yKTogU2hvdWxkIHdlIGNhbGwgb25Db25uZWN0IGltbWVkaWF0ZWx5IG9yIG9uIHN0cmVhbSByZWFkeSBldmVudD9cbiAgICByZXF1ZXN0Lm9uQ29ubmVjdCgoZXJyKSA9PiB7XG4gICAgICBpZiAocmVxdWVzdC5hYm9ydGVkIHx8IHJlcXVlc3QuY29tcGxldGVkKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBlcnJvclJlcXVlc3QoY2xpZW50LCByZXF1ZXN0LCBlcnIgfHwgbmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoKSlcbiAgICB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnJvclJlcXVlc3QoY2xpZW50LCByZXF1ZXN0LCBlcnIpXG4gIH1cblxuICBpZiAocmVxdWVzdC5hYm9ydGVkKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKiogQHR5cGUge2ltcG9ydCgnbm9kZTpodHRwMicpLkNsaWVudEh0dHAyU3RyZWFtfSAqL1xuICBsZXQgc3RyZWFtXG4gIGNvbnN0IGgyU3RhdGUgPSBjbGllbnRba0hUVFAyU2Vzc2lvblN0YXRlXVxuXG4gIGhlYWRlcnNbSFRUUDJfSEVBREVSX0FVVEhPUklUWV0gPSBob3N0IHx8IGNsaWVudFtrSG9zdF1cbiAgaGVhZGVyc1tIVFRQMl9IRUFERVJfTUVUSE9EXSA9IG1ldGhvZFxuXG4gIGlmIChtZXRob2QgPT09ICdDT05ORUNUJykge1xuICAgIHNlc3Npb24ucmVmKClcbiAgICAvLyB3ZSBhcmUgYWxyZWFkeSBjb25uZWN0ZWQsIHN0cmVhbXMgYXJlIHBlbmRpbmcsIGZpcnN0IHJlcXVlc3RcbiAgICAvLyB3aWxsIGNyZWF0ZSBhIG5ldyBzdHJlYW0uIFdlIHRyaWdnZXIgYSByZXF1ZXN0IHRvIGNyZWF0ZSB0aGUgc3RyZWFtIGFuZCB3YWl0IHVudGlsXG4gICAgLy8gYHJlYWR5YCBldmVudCBpcyB0cmlnZ2VyZWRcbiAgICAvLyBXZSBkaXNhYmxlZCBlbmRTdHJlYW0gdG8gYWxsb3cgdGhlIHVzZXIgdG8gd3JpdGUgdG8gdGhlIHN0cmVhbVxuICAgIHN0cmVhbSA9IHNlc3Npb24ucmVxdWVzdChoZWFkZXJzLCB7IGVuZFN0cmVhbTogZmFsc2UsIHNpZ25hbCB9KVxuXG4gICAgaWYgKHN0cmVhbS5pZCAmJiAhc3RyZWFtLnBlbmRpbmcpIHtcbiAgICAgIHJlcXVlc3Qub25VcGdyYWRlKG51bGwsIG51bGwsIHN0cmVhbSlcbiAgICAgICsraDJTdGF0ZS5vcGVuU3RyZWFtc1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHJlYW0ub25jZSgncmVhZHknLCAoKSA9PiB7XG4gICAgICAgIHJlcXVlc3Qub25VcGdyYWRlKG51bGwsIG51bGwsIHN0cmVhbSlcbiAgICAgICAgKytoMlN0YXRlLm9wZW5TdHJlYW1zXG4gICAgICB9KVxuICAgIH1cblxuICAgIHN0cmVhbS5vbmNlKCdjbG9zZScsICgpID0+IHtcbiAgICAgIGgyU3RhdGUub3BlblN0cmVhbXMgLT0gMVxuICAgICAgLy8gVE9ETyhIVFRQLzIpOiB1bnJlZiBvbmx5IGlmIGN1cnJlbnQgc3RyZWFtcyBjb3VudCBpcyAwXG4gICAgICBpZiAoaDJTdGF0ZS5vcGVuU3RyZWFtcyA9PT0gMCkgc2Vzc2lvbi51bnJlZigpXG4gICAgfSlcblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzU0MCNzZWN0aW9uLTguM1xuICAvLyA6cGF0aCBhbmQgOnNjaGVtZSBoZWFkZXJzIG11c3QgYmUgb21pdGVkIHdoZW4gc2VuZGluZyBDT05ORUNUXG5cbiAgaGVhZGVyc1tIVFRQMl9IRUFERVJfUEFUSF0gPSBwYXRoXG4gIGhlYWRlcnNbSFRUUDJfSEVBREVSX1NDSEVNRV0gPSAnaHR0cHMnXG5cbiAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi00LjMuMVxuICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTQuMy4yXG4gIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNC4zLjVcblxuICAvLyBTZW5kaW5nIGEgcGF5bG9hZCBib2R5IG9uIGEgcmVxdWVzdCB0aGF0IGRvZXMgbm90XG4gIC8vIGV4cGVjdCBpdCBjYW4gY2F1c2UgdW5kZWZpbmVkIGJlaGF2aW9yIG9uIHNvbWVcbiAgLy8gc2VydmVycyBhbmQgY29ycnVwdCBjb25uZWN0aW9uIHN0YXRlLiBEbyBub3RcbiAgLy8gcmUtdXNlIHRoZSBjb25uZWN0aW9uIGZvciBmdXJ0aGVyIHJlcXVlc3RzLlxuXG4gIGNvbnN0IGV4cGVjdHNQYXlsb2FkID0gKFxuICAgIG1ldGhvZCA9PT0gJ1BVVCcgfHxcbiAgICBtZXRob2QgPT09ICdQT1NUJyB8fFxuICAgIG1ldGhvZCA9PT0gJ1BBVENIJ1xuICApXG5cbiAgaWYgKGJvZHkgJiYgdHlwZW9mIGJvZHkucmVhZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIFRyeSB0byByZWFkIEVPRiBpbiBvcmRlciB0byBnZXQgbGVuZ3RoLlxuICAgIGJvZHkucmVhZCgwKVxuICB9XG5cbiAgbGV0IGNvbnRlbnRMZW5ndGggPSB1dGlsLmJvZHlMZW5ndGgoYm9keSlcblxuICBpZiAoY29udGVudExlbmd0aCA9PSBudWxsKSB7XG4gICAgY29udGVudExlbmd0aCA9IHJlcXVlc3QuY29udGVudExlbmd0aFxuICB9XG5cbiAgaWYgKGNvbnRlbnRMZW5ndGggPT09IDAgfHwgIWV4cGVjdHNQYXlsb2FkKSB7XG4gICAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzAjc2VjdGlvbi0zLjMuMlxuICAgIC8vIEEgdXNlciBhZ2VudCBTSE9VTEQgTk9UIHNlbmQgYSBDb250ZW50LUxlbmd0aCBoZWFkZXIgZmllbGQgd2hlblxuICAgIC8vIHRoZSByZXF1ZXN0IG1lc3NhZ2UgZG9lcyBub3QgY29udGFpbiBhIHBheWxvYWQgYm9keSBhbmQgdGhlIG1ldGhvZFxuICAgIC8vIHNlbWFudGljcyBkbyBub3QgYW50aWNpcGF0ZSBzdWNoIGEgYm9keS5cblxuICAgIGNvbnRlbnRMZW5ndGggPSBudWxsXG4gIH1cblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9pc3N1ZXMvMjA0NlxuICAvLyBBIHVzZXIgYWdlbnQgbWF5IHNlbmQgYSBDb250ZW50LUxlbmd0aCBoZWFkZXIgd2l0aCAwIHZhbHVlLCB0aGlzIHNob3VsZCBiZSBhbGxvd2VkLlxuICBpZiAoc2hvdWxkU2VuZENvbnRlbnRMZW5ndGgobWV0aG9kKSAmJiBjb250ZW50TGVuZ3RoID4gMCAmJiByZXF1ZXN0LmNvbnRlbnRMZW5ndGggIT0gbnVsbCAmJiByZXF1ZXN0LmNvbnRlbnRMZW5ndGggIT09IGNvbnRlbnRMZW5ndGgpIHtcbiAgICBpZiAoY2xpZW50W2tTdHJpY3RDb250ZW50TGVuZ3RoXSkge1xuICAgICAgZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgbmV3IFJlcXVlc3RDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcigpKVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcHJvY2Vzcy5lbWl0V2FybmluZyhuZXcgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yKCkpXG4gIH1cblxuICBpZiAoY29udGVudExlbmd0aCAhPSBudWxsKSB7XG4gICAgYXNzZXJ0KGJvZHksICdubyBib2R5IG11c3Qgbm90IGhhdmUgY29udGVudCBsZW5ndGgnKVxuICAgIGhlYWRlcnNbSFRUUDJfSEVBREVSX0NPTlRFTlRfTEVOR1RIXSA9IGAke2NvbnRlbnRMZW5ndGh9YFxuICB9XG5cbiAgc2Vzc2lvbi5yZWYoKVxuXG4gIGNvbnN0IHNob3VsZEVuZFN0cmVhbSA9IG1ldGhvZCA9PT0gJ0dFVCcgfHwgbWV0aG9kID09PSAnSEVBRCdcbiAgaWYgKGV4cGVjdENvbnRpbnVlKSB7XG4gICAgaGVhZGVyc1tIVFRQMl9IRUFERVJfRVhQRUNUXSA9ICcxMDAtY29udGludWUnXG4gICAgc3RyZWFtID0gc2Vzc2lvbi5yZXF1ZXN0KGhlYWRlcnMsIHsgZW5kU3RyZWFtOiBzaG91bGRFbmRTdHJlYW0sIHNpZ25hbCB9KVxuXG4gICAgc3RyZWFtLm9uY2UoJ2NvbnRpbnVlJywgd3JpdGVCb2R5SDIpXG4gIH0gZWxzZSB7XG4gICAgc3RyZWFtID0gc2Vzc2lvbi5yZXF1ZXN0KGhlYWRlcnMsIHtcbiAgICAgIGVuZFN0cmVhbTogc2hvdWxkRW5kU3RyZWFtLFxuICAgICAgc2lnbmFsXG4gICAgfSlcbiAgICB3cml0ZUJvZHlIMigpXG4gIH1cblxuICAvLyBJbmNyZW1lbnQgY291bnRlciBhcyB3ZSBoYXZlIG5ldyBzZXZlcmFsIHN0cmVhbXMgb3BlblxuICArK2gyU3RhdGUub3BlblN0cmVhbXNcblxuICBzdHJlYW0ub25jZSgncmVzcG9uc2UnLCBoZWFkZXJzID0+IHtcbiAgICBjb25zdCB7IFtIVFRQMl9IRUFERVJfU1RBVFVTXTogc3RhdHVzQ29kZSwgLi4ucmVhbEhlYWRlcnMgfSA9IGhlYWRlcnNcblxuICAgIGlmIChyZXF1ZXN0Lm9uSGVhZGVycyhOdW1iZXIoc3RhdHVzQ29kZSksIHJlYWxIZWFkZXJzLCBzdHJlYW0ucmVzdW1lLmJpbmQoc3RyZWFtKSwgJycpID09PSBmYWxzZSkge1xuICAgICAgc3RyZWFtLnBhdXNlKClcbiAgICB9XG4gIH0pXG5cbiAgc3RyZWFtLm9uY2UoJ2VuZCcsICgpID0+IHtcbiAgICByZXF1ZXN0Lm9uQ29tcGxldGUoW10pXG4gIH0pXG5cbiAgc3RyZWFtLm9uKCdkYXRhJywgKGNodW5rKSA9PiB7XG4gICAgaWYgKHJlcXVlc3Qub25EYXRhKGNodW5rKSA9PT0gZmFsc2UpIHtcbiAgICAgIHN0cmVhbS5wYXVzZSgpXG4gICAgfVxuICB9KVxuXG4gIHN0cmVhbS5vbmNlKCdjbG9zZScsICgpID0+IHtcbiAgICBoMlN0YXRlLm9wZW5TdHJlYW1zIC09IDFcbiAgICAvLyBUT0RPKEhUVFAvMik6IHVucmVmIG9ubHkgaWYgY3VycmVudCBzdHJlYW1zIGNvdW50IGlzIDBcbiAgICBpZiAoaDJTdGF0ZS5vcGVuU3RyZWFtcyA9PT0gMCkge1xuICAgICAgc2Vzc2lvbi51bnJlZigpXG4gICAgfVxuICB9KVxuXG4gIHN0cmVhbS5vbmNlKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoY2xpZW50W2tIVFRQMlNlc3Npb25dICYmICFjbGllbnRba0hUVFAyU2Vzc2lvbl0uZGVzdHJveWVkICYmICF0aGlzLmNsb3NlZCAmJiAhdGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgIGgyU3RhdGUuc3RyZWFtcyAtPSAxXG4gICAgICB1dGlsLmRlc3Ryb3koc3RyZWFtLCBlcnIpXG4gICAgfVxuICB9KVxuXG4gIHN0cmVhbS5vbmNlKCdmcmFtZUVycm9yJywgKHR5cGUsIGNvZGUpID0+IHtcbiAgICBjb25zdCBlcnIgPSBuZXcgSW5mb3JtYXRpb25hbEVycm9yKGBIVFRQLzI6IFwiZnJhbWVFcnJvclwiIHJlY2VpdmVkIC0gdHlwZSAke3R5cGV9LCBjb2RlICR7Y29kZX1gKVxuICAgIGVycm9yUmVxdWVzdChjbGllbnQsIHJlcXVlc3QsIGVycilcblxuICAgIGlmIChjbGllbnRba0hUVFAyU2Vzc2lvbl0gJiYgIWNsaWVudFtrSFRUUDJTZXNzaW9uXS5kZXN0cm95ZWQgJiYgIXRoaXMuY2xvc2VkICYmICF0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgaDJTdGF0ZS5zdHJlYW1zIC09IDFcbiAgICAgIHV0aWwuZGVzdHJveShzdHJlYW0sIGVycilcbiAgICB9XG4gIH0pXG5cbiAgLy8gc3RyZWFtLm9uKCdhYm9ydGVkJywgKCkgPT4ge1xuICAvLyAgIC8vIFRPRE8oSFRUUC8yKTogU3VwcG9ydCBhYm9ydGVkXG4gIC8vIH0pXG5cbiAgLy8gc3RyZWFtLm9uKCd0aW1lb3V0JywgKCkgPT4ge1xuICAvLyAgIC8vIFRPRE8oSFRUUC8yKTogU3VwcG9ydCB0aW1lb3V0XG4gIC8vIH0pXG5cbiAgLy8gc3RyZWFtLm9uKCdwdXNoJywgaGVhZGVycyA9PiB7XG4gIC8vICAgLy8gVE9ETyhIVFRQLzIpOiBTdXBwb3IgcHVzaFxuICAvLyB9KVxuXG4gIC8vIHN0cmVhbS5vbigndHJhaWxlcnMnLCBoZWFkZXJzID0+IHtcbiAgLy8gICAvLyBUT0RPKEhUVFAvMik6IFN1cHBvcnQgdHJhaWxlcnNcbiAgLy8gfSlcblxuICByZXR1cm4gdHJ1ZVxuXG4gIGZ1bmN0aW9uIHdyaXRlQm9keUgyICgpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZTogYXNzZXJ0aW9uICovXG4gICAgaWYgKCFib2R5KSB7XG4gICAgICByZXF1ZXN0Lm9uUmVxdWVzdFNlbnQoKVxuICAgIH0gZWxzZSBpZiAodXRpbC5pc0J1ZmZlcihib2R5KSkge1xuICAgICAgYXNzZXJ0KGNvbnRlbnRMZW5ndGggPT09IGJvZHkuYnl0ZUxlbmd0aCwgJ2J1ZmZlciBib2R5IG11c3QgaGF2ZSBjb250ZW50IGxlbmd0aCcpXG4gICAgICBzdHJlYW0uY29yaygpXG4gICAgICBzdHJlYW0ud3JpdGUoYm9keSlcbiAgICAgIHN0cmVhbS51bmNvcmsoKVxuICAgICAgc3RyZWFtLmVuZCgpXG4gICAgICByZXF1ZXN0Lm9uQm9keVNlbnQoYm9keSlcbiAgICAgIHJlcXVlc3Qub25SZXF1ZXN0U2VudCgpXG4gICAgfSBlbHNlIGlmICh1dGlsLmlzQmxvYkxpa2UoYm9keSkpIHtcbiAgICAgIGlmICh0eXBlb2YgYm9keS5zdHJlYW0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd3JpdGVJdGVyYWJsZSh7XG4gICAgICAgICAgY2xpZW50LFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgY29udGVudExlbmd0aCxcbiAgICAgICAgICBoMnN0cmVhbTogc3RyZWFtLFxuICAgICAgICAgIGV4cGVjdHNQYXlsb2FkLFxuICAgICAgICAgIGJvZHk6IGJvZHkuc3RyZWFtKCksXG4gICAgICAgICAgc29ja2V0OiBjbGllbnRba1NvY2tldF0sXG4gICAgICAgICAgaGVhZGVyOiAnJ1xuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd3JpdGVCbG9iKHtcbiAgICAgICAgICBib2R5LFxuICAgICAgICAgIGNsaWVudCxcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIGNvbnRlbnRMZW5ndGgsXG4gICAgICAgICAgZXhwZWN0c1BheWxvYWQsXG4gICAgICAgICAgaDJzdHJlYW06IHN0cmVhbSxcbiAgICAgICAgICBoZWFkZXI6ICcnLFxuICAgICAgICAgIHNvY2tldDogY2xpZW50W2tTb2NrZXRdXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh1dGlsLmlzU3RyZWFtKGJvZHkpKSB7XG4gICAgICB3cml0ZVN0cmVhbSh7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGNsaWVudCxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgY29udGVudExlbmd0aCxcbiAgICAgICAgZXhwZWN0c1BheWxvYWQsXG4gICAgICAgIHNvY2tldDogY2xpZW50W2tTb2NrZXRdLFxuICAgICAgICBoMnN0cmVhbTogc3RyZWFtLFxuICAgICAgICBoZWFkZXI6ICcnXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAodXRpbC5pc0l0ZXJhYmxlKGJvZHkpKSB7XG4gICAgICB3cml0ZUl0ZXJhYmxlKHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgY2xpZW50LFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICBjb250ZW50TGVuZ3RoLFxuICAgICAgICBleHBlY3RzUGF5bG9hZCxcbiAgICAgICAgaGVhZGVyOiAnJyxcbiAgICAgICAgaDJzdHJlYW06IHN0cmVhbSxcbiAgICAgICAgc29ja2V0OiBjbGllbnRba1NvY2tldF1cbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChmYWxzZSlcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gd3JpdGVTdHJlYW0gKHsgaDJzdHJlYW0sIGJvZHksIGNsaWVudCwgcmVxdWVzdCwgc29ja2V0LCBjb250ZW50TGVuZ3RoLCBoZWFkZXIsIGV4cGVjdHNQYXlsb2FkIH0pIHtcbiAgYXNzZXJ0KGNvbnRlbnRMZW5ndGggIT09IDAgfHwgY2xpZW50W2tSdW5uaW5nXSA9PT0gMCwgJ3N0cmVhbSBib2R5IGNhbm5vdCBiZSBwaXBlbGluZWQnKVxuXG4gIGlmIChjbGllbnRba0hUVFBDb25uVmVyc2lvbl0gPT09ICdoMicpIHtcbiAgICAvLyBGb3IgSFRUUC8yLCBpcyBlbm91Z2ggdG8gcGlwZSB0aGUgc3RyZWFtXG4gICAgY29uc3QgcGlwZSA9IHBpcGVsaW5lKFxuICAgICAgYm9keSxcbiAgICAgIGgyc3RyZWFtLFxuICAgICAgKGVycikgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgdXRpbC5kZXN0cm95KGJvZHksIGVycilcbiAgICAgICAgICB1dGlsLmRlc3Ryb3koaDJzdHJlYW0sIGVycilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXF1ZXN0Lm9uUmVxdWVzdFNlbnQoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgKVxuXG4gICAgcGlwZS5vbignZGF0YScsIG9uUGlwZURhdGEpXG4gICAgcGlwZS5vbmNlKCdlbmQnLCAoKSA9PiB7XG4gICAgICBwaXBlLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25QaXBlRGF0YSlcbiAgICAgIHV0aWwuZGVzdHJveShwaXBlKVxuICAgIH0pXG5cbiAgICBmdW5jdGlvbiBvblBpcGVEYXRhIChjaHVuaykge1xuICAgICAgcmVxdWVzdC5vbkJvZHlTZW50KGNodW5rKVxuICAgIH1cblxuICAgIHJldHVyblxuICB9XG5cbiAgbGV0IGZpbmlzaGVkID0gZmFsc2VcblxuICBjb25zdCB3cml0ZXIgPSBuZXcgQXN5bmNXcml0ZXIoeyBzb2NrZXQsIHJlcXVlc3QsIGNvbnRlbnRMZW5ndGgsIGNsaWVudCwgZXhwZWN0c1BheWxvYWQsIGhlYWRlciB9KVxuXG4gIGNvbnN0IG9uRGF0YSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICAgIGlmIChmaW5pc2hlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmICghd3JpdGVyLndyaXRlKGNodW5rKSAmJiB0aGlzLnBhdXNlKSB7XG4gICAgICAgIHRoaXMucGF1c2UoKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdXRpbC5kZXN0cm95KHRoaXMsIGVycilcbiAgICB9XG4gIH1cbiAgY29uc3Qgb25EcmFpbiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZmluaXNoZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChib2R5LnJlc3VtZSkge1xuICAgICAgYm9keS5yZXN1bWUoKVxuICAgIH1cbiAgfVxuICBjb25zdCBvbkFib3J0ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChmaW5pc2hlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGVyciA9IG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKClcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBvbkZpbmlzaGVkKGVycikpXG4gIH1cbiAgY29uc3Qgb25GaW5pc2hlZCA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoZmluaXNoZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGZpbmlzaGVkID0gdHJ1ZVxuXG4gICAgYXNzZXJ0KHNvY2tldC5kZXN0cm95ZWQgfHwgKHNvY2tldFtrV3JpdGluZ10gJiYgY2xpZW50W2tSdW5uaW5nXSA8PSAxKSlcblxuICAgIHNvY2tldFxuICAgICAgLm9mZignZHJhaW4nLCBvbkRyYWluKVxuICAgICAgLm9mZignZXJyb3InLCBvbkZpbmlzaGVkKVxuXG4gICAgYm9keVxuICAgICAgLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25EYXRhKVxuICAgICAgLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbkZpbmlzaGVkKVxuICAgICAgLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uRmluaXNoZWQpXG4gICAgICAucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25BYm9ydClcblxuICAgIGlmICghZXJyKSB7XG4gICAgICB0cnkge1xuICAgICAgICB3cml0ZXIuZW5kKClcbiAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgIGVyciA9IGVyXG4gICAgICB9XG4gICAgfVxuXG4gICAgd3JpdGVyLmRlc3Ryb3koZXJyKVxuXG4gICAgaWYgKGVyciAmJiAoZXJyLmNvZGUgIT09ICdVTkRfRVJSX0lORk8nIHx8IGVyci5tZXNzYWdlICE9PSAncmVzZXQnKSkge1xuICAgICAgdXRpbC5kZXN0cm95KGJvZHksIGVycilcbiAgICB9IGVsc2Uge1xuICAgICAgdXRpbC5kZXN0cm95KGJvZHkpXG4gICAgfVxuICB9XG5cbiAgYm9keVxuICAgIC5vbignZGF0YScsIG9uRGF0YSlcbiAgICAub24oJ2VuZCcsIG9uRmluaXNoZWQpXG4gICAgLm9uKCdlcnJvcicsIG9uRmluaXNoZWQpXG4gICAgLm9uKCdjbG9zZScsIG9uQWJvcnQpXG5cbiAgaWYgKGJvZHkucmVzdW1lKSB7XG4gICAgYm9keS5yZXN1bWUoKVxuICB9XG5cbiAgc29ja2V0XG4gICAgLm9uKCdkcmFpbicsIG9uRHJhaW4pXG4gICAgLm9uKCdlcnJvcicsIG9uRmluaXNoZWQpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQmxvYiAoeyBoMnN0cmVhbSwgYm9keSwgY2xpZW50LCByZXF1ZXN0LCBzb2NrZXQsIGNvbnRlbnRMZW5ndGgsIGhlYWRlciwgZXhwZWN0c1BheWxvYWQgfSkge1xuICBhc3NlcnQoY29udGVudExlbmd0aCA9PT0gYm9keS5zaXplLCAnYmxvYiBib2R5IG11c3QgaGF2ZSBjb250ZW50IGxlbmd0aCcpXG5cbiAgY29uc3QgaXNIMiA9IGNsaWVudFtrSFRUUENvbm5WZXJzaW9uXSA9PT0gJ2gyJ1xuICB0cnkge1xuICAgIGlmIChjb250ZW50TGVuZ3RoICE9IG51bGwgJiYgY29udGVudExlbmd0aCAhPT0gYm9keS5zaXplKSB7XG4gICAgICB0aHJvdyBuZXcgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yKClcbiAgICB9XG5cbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShhd2FpdCBib2R5LmFycmF5QnVmZmVyKCkpXG5cbiAgICBpZiAoaXNIMikge1xuICAgICAgaDJzdHJlYW0uY29yaygpXG4gICAgICBoMnN0cmVhbS53cml0ZShidWZmZXIpXG4gICAgICBoMnN0cmVhbS51bmNvcmsoKVxuICAgIH0gZWxzZSB7XG4gICAgICBzb2NrZXQuY29yaygpXG4gICAgICBzb2NrZXQud3JpdGUoYCR7aGVhZGVyfWNvbnRlbnQtbGVuZ3RoOiAke2NvbnRlbnRMZW5ndGh9XFxyXFxuXFxyXFxuYCwgJ2xhdGluMScpXG4gICAgICBzb2NrZXQud3JpdGUoYnVmZmVyKVxuICAgICAgc29ja2V0LnVuY29yaygpXG4gICAgfVxuXG4gICAgcmVxdWVzdC5vbkJvZHlTZW50KGJ1ZmZlcilcbiAgICByZXF1ZXN0Lm9uUmVxdWVzdFNlbnQoKVxuXG4gICAgaWYgKCFleHBlY3RzUGF5bG9hZCkge1xuICAgICAgc29ja2V0W2tSZXNldF0gPSB0cnVlXG4gICAgfVxuXG4gICAgcmVzdW1lKGNsaWVudClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdXRpbC5kZXN0cm95KGlzSDIgPyBoMnN0cmVhbSA6IHNvY2tldCwgZXJyKVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlSXRlcmFibGUgKHsgaDJzdHJlYW0sIGJvZHksIGNsaWVudCwgcmVxdWVzdCwgc29ja2V0LCBjb250ZW50TGVuZ3RoLCBoZWFkZXIsIGV4cGVjdHNQYXlsb2FkIH0pIHtcbiAgYXNzZXJ0KGNvbnRlbnRMZW5ndGggIT09IDAgfHwgY2xpZW50W2tSdW5uaW5nXSA9PT0gMCwgJ2l0ZXJhdG9yIGJvZHkgY2Fubm90IGJlIHBpcGVsaW5lZCcpXG5cbiAgbGV0IGNhbGxiYWNrID0gbnVsbFxuICBmdW5jdGlvbiBvbkRyYWluICgpIHtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIGNvbnN0IGNiID0gY2FsbGJhY2tcbiAgICAgIGNhbGxiYWNrID0gbnVsbFxuICAgICAgY2IoKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHdhaXRGb3JEcmFpbiA9ICgpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBhc3NlcnQoY2FsbGJhY2sgPT09IG51bGwpXG5cbiAgICBpZiAoc29ja2V0W2tFcnJvcl0pIHtcbiAgICAgIHJlamVjdChzb2NrZXRba0Vycm9yXSlcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbGJhY2sgPSByZXNvbHZlXG4gICAgfVxuICB9KVxuXG4gIGlmIChjbGllbnRba0hUVFBDb25uVmVyc2lvbl0gPT09ICdoMicpIHtcbiAgICBoMnN0cmVhbVxuICAgICAgLm9uKCdjbG9zZScsIG9uRHJhaW4pXG4gICAgICAub24oJ2RyYWluJywgb25EcmFpbilcblxuICAgIHRyeSB7XG4gICAgICAvLyBJdCdzIHVwIHRvIHRoZSB1c2VyIHRvIHNvbWVob3cgYWJvcnQgdGhlIGFzeW5jIGl0ZXJhYmxlLlxuICAgICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBib2R5KSB7XG4gICAgICAgIGlmIChzb2NrZXRba0Vycm9yXSkge1xuICAgICAgICAgIHRocm93IHNvY2tldFtrRXJyb3JdXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXMgPSBoMnN0cmVhbS53cml0ZShjaHVuaylcbiAgICAgICAgcmVxdWVzdC5vbkJvZHlTZW50KGNodW5rKVxuICAgICAgICBpZiAoIXJlcykge1xuICAgICAgICAgIGF3YWl0IHdhaXRGb3JEcmFpbigpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGgyc3RyZWFtLmRlc3Ryb3koZXJyKVxuICAgIH0gZmluYWxseSB7XG4gICAgICByZXF1ZXN0Lm9uUmVxdWVzdFNlbnQoKVxuICAgICAgaDJzdHJlYW0uZW5kKClcbiAgICAgIGgyc3RyZWFtXG4gICAgICAgIC5vZmYoJ2Nsb3NlJywgb25EcmFpbilcbiAgICAgICAgLm9mZignZHJhaW4nLCBvbkRyYWluKVxuICAgIH1cblxuICAgIHJldHVyblxuICB9XG5cbiAgc29ja2V0XG4gICAgLm9uKCdjbG9zZScsIG9uRHJhaW4pXG4gICAgLm9uKCdkcmFpbicsIG9uRHJhaW4pXG5cbiAgY29uc3Qgd3JpdGVyID0gbmV3IEFzeW5jV3JpdGVyKHsgc29ja2V0LCByZXF1ZXN0LCBjb250ZW50TGVuZ3RoLCBjbGllbnQsIGV4cGVjdHNQYXlsb2FkLCBoZWFkZXIgfSlcbiAgdHJ5IHtcbiAgICAvLyBJdCdzIHVwIHRvIHRoZSB1c2VyIHRvIHNvbWVob3cgYWJvcnQgdGhlIGFzeW5jIGl0ZXJhYmxlLlxuICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgYm9keSkge1xuICAgICAgaWYgKHNvY2tldFtrRXJyb3JdKSB7XG4gICAgICAgIHRocm93IHNvY2tldFtrRXJyb3JdXG4gICAgICB9XG5cbiAgICAgIGlmICghd3JpdGVyLndyaXRlKGNodW5rKSkge1xuICAgICAgICBhd2FpdCB3YWl0Rm9yRHJhaW4oKVxuICAgICAgfVxuICAgIH1cblxuICAgIHdyaXRlci5lbmQoKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICB3cml0ZXIuZGVzdHJveShlcnIpXG4gIH0gZmluYWxseSB7XG4gICAgc29ja2V0XG4gICAgICAub2ZmKCdjbG9zZScsIG9uRHJhaW4pXG4gICAgICAub2ZmKCdkcmFpbicsIG9uRHJhaW4pXG4gIH1cbn1cblxuY2xhc3MgQXN5bmNXcml0ZXIge1xuICBjb25zdHJ1Y3RvciAoeyBzb2NrZXQsIHJlcXVlc3QsIGNvbnRlbnRMZW5ndGgsIGNsaWVudCwgZXhwZWN0c1BheWxvYWQsIGhlYWRlciB9KSB7XG4gICAgdGhpcy5zb2NrZXQgPSBzb2NrZXRcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0XG4gICAgdGhpcy5jb250ZW50TGVuZ3RoID0gY29udGVudExlbmd0aFxuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50XG4gICAgdGhpcy5ieXRlc1dyaXR0ZW4gPSAwXG4gICAgdGhpcy5leHBlY3RzUGF5bG9hZCA9IGV4cGVjdHNQYXlsb2FkXG4gICAgdGhpcy5oZWFkZXIgPSBoZWFkZXJcblxuICAgIHNvY2tldFtrV3JpdGluZ10gPSB0cnVlXG4gIH1cblxuICB3cml0ZSAoY2h1bmspIHtcbiAgICBjb25zdCB7IHNvY2tldCwgcmVxdWVzdCwgY29udGVudExlbmd0aCwgY2xpZW50LCBieXRlc1dyaXR0ZW4sIGV4cGVjdHNQYXlsb2FkLCBoZWFkZXIgfSA9IHRoaXNcblxuICAgIGlmIChzb2NrZXRba0Vycm9yXSkge1xuICAgICAgdGhyb3cgc29ja2V0W2tFcnJvcl1cbiAgICB9XG5cbiAgICBpZiAoc29ja2V0LmRlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgY29uc3QgbGVuID0gQnVmZmVyLmJ5dGVMZW5ndGgoY2h1bmspXG4gICAgaWYgKCFsZW4pIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgLy8gV2Ugc2hvdWxkIGRlZmVyIHdyaXRpbmcgY2h1bmtzLlxuICAgIGlmIChjb250ZW50TGVuZ3RoICE9PSBudWxsICYmIGJ5dGVzV3JpdHRlbiArIGxlbiA+IGNvbnRlbnRMZW5ndGgpIHtcbiAgICAgIGlmIChjbGllbnRba1N0cmljdENvbnRlbnRMZW5ndGhdKSB7XG4gICAgICAgIHRocm93IG5ldyBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IoKVxuICAgICAgfVxuXG4gICAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKG5ldyBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IoKSlcbiAgICB9XG5cbiAgICBzb2NrZXQuY29yaygpXG5cbiAgICBpZiAoYnl0ZXNXcml0dGVuID09PSAwKSB7XG4gICAgICBpZiAoIWV4cGVjdHNQYXlsb2FkKSB7XG4gICAgICAgIHNvY2tldFtrUmVzZXRdID0gdHJ1ZVxuICAgICAgfVxuXG4gICAgICBpZiAoY29udGVudExlbmd0aCA9PT0gbnVsbCkge1xuICAgICAgICBzb2NrZXQud3JpdGUoYCR7aGVhZGVyfXRyYW5zZmVyLWVuY29kaW5nOiBjaHVua2VkXFxyXFxuYCwgJ2xhdGluMScpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzb2NrZXQud3JpdGUoYCR7aGVhZGVyfWNvbnRlbnQtbGVuZ3RoOiAke2NvbnRlbnRMZW5ndGh9XFxyXFxuXFxyXFxuYCwgJ2xhdGluMScpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbnRlbnRMZW5ndGggPT09IG51bGwpIHtcbiAgICAgIHNvY2tldC53cml0ZShgXFxyXFxuJHtsZW4udG9TdHJpbmcoMTYpfVxcclxcbmAsICdsYXRpbjEnKVxuICAgIH1cblxuICAgIHRoaXMuYnl0ZXNXcml0dGVuICs9IGxlblxuXG4gICAgY29uc3QgcmV0ID0gc29ja2V0LndyaXRlKGNodW5rKVxuXG4gICAgc29ja2V0LnVuY29yaygpXG5cbiAgICByZXF1ZXN0Lm9uQm9keVNlbnQoY2h1bmspXG5cbiAgICBpZiAoIXJldCkge1xuICAgICAgaWYgKHNvY2tldFtrUGFyc2VyXS50aW1lb3V0ICYmIHNvY2tldFtrUGFyc2VyXS50aW1lb3V0VHlwZSA9PT0gVElNRU9VVF9IRUFERVJTKSB7XG4gICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBvbmx5IGZvciBqZXN0XG4gICAgICAgIGlmIChzb2NrZXRba1BhcnNlcl0udGltZW91dC5yZWZyZXNoKSB7XG4gICAgICAgICAgc29ja2V0W2tQYXJzZXJdLnRpbWVvdXQucmVmcmVzaCgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmV0XG4gIH1cblxuICBlbmQgKCkge1xuICAgIGNvbnN0IHsgc29ja2V0LCBjb250ZW50TGVuZ3RoLCBjbGllbnQsIGJ5dGVzV3JpdHRlbiwgZXhwZWN0c1BheWxvYWQsIGhlYWRlciwgcmVxdWVzdCB9ID0gdGhpc1xuICAgIHJlcXVlc3Qub25SZXF1ZXN0U2VudCgpXG5cbiAgICBzb2NrZXRba1dyaXRpbmddID0gZmFsc2VcblxuICAgIGlmIChzb2NrZXRba0Vycm9yXSkge1xuICAgICAgdGhyb3cgc29ja2V0W2tFcnJvcl1cbiAgICB9XG5cbiAgICBpZiAoc29ja2V0LmRlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGJ5dGVzV3JpdHRlbiA9PT0gMCkge1xuICAgICAgaWYgKGV4cGVjdHNQYXlsb2FkKSB7XG4gICAgICAgIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMwI3NlY3Rpb24tMy4zLjJcbiAgICAgICAgLy8gQSB1c2VyIGFnZW50IFNIT1VMRCBzZW5kIGEgQ29udGVudC1MZW5ndGggaW4gYSByZXF1ZXN0IG1lc3NhZ2Ugd2hlblxuICAgICAgICAvLyBubyBUcmFuc2Zlci1FbmNvZGluZyBpcyBzZW50IGFuZCB0aGUgcmVxdWVzdCBtZXRob2QgZGVmaW5lcyBhIG1lYW5pbmdcbiAgICAgICAgLy8gZm9yIGFuIGVuY2xvc2VkIHBheWxvYWQgYm9keS5cblxuICAgICAgICBzb2NrZXQud3JpdGUoYCR7aGVhZGVyfWNvbnRlbnQtbGVuZ3RoOiAwXFxyXFxuXFxyXFxuYCwgJ2xhdGluMScpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzb2NrZXQud3JpdGUoYCR7aGVhZGVyfVxcclxcbmAsICdsYXRpbjEnKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29udGVudExlbmd0aCA9PT0gbnVsbCkge1xuICAgICAgc29ja2V0LndyaXRlKCdcXHJcXG4wXFxyXFxuXFxyXFxuJywgJ2xhdGluMScpXG4gICAgfVxuXG4gICAgaWYgKGNvbnRlbnRMZW5ndGggIT09IG51bGwgJiYgYnl0ZXNXcml0dGVuICE9PSBjb250ZW50TGVuZ3RoKSB7XG4gICAgICBpZiAoY2xpZW50W2tTdHJpY3RDb250ZW50TGVuZ3RoXSkge1xuICAgICAgICB0aHJvdyBuZXcgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcobmV3IFJlcXVlc3RDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcigpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzb2NrZXRba1BhcnNlcl0udGltZW91dCAmJiBzb2NrZXRba1BhcnNlcl0udGltZW91dFR5cGUgPT09IFRJTUVPVVRfSEVBREVSUykge1xuICAgICAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2U6IG9ubHkgZm9yIGplc3RcbiAgICAgIGlmIChzb2NrZXRba1BhcnNlcl0udGltZW91dC5yZWZyZXNoKSB7XG4gICAgICAgIHNvY2tldFtrUGFyc2VyXS50aW1lb3V0LnJlZnJlc2goKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJlc3VtZShjbGllbnQpXG4gIH1cblxuICBkZXN0cm95IChlcnIpIHtcbiAgICBjb25zdCB7IHNvY2tldCwgY2xpZW50IH0gPSB0aGlzXG5cbiAgICBzb2NrZXRba1dyaXRpbmddID0gZmFsc2VcblxuICAgIGlmIChlcnIpIHtcbiAgICAgIGFzc2VydChjbGllbnRba1J1bm5pbmddIDw9IDEsICdwaXBlbGluZSBzaG91bGQgb25seSBjb250YWluIHRoaXMgcmVxdWVzdCcpXG4gICAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBlcnIpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGVycm9yUmVxdWVzdCAoY2xpZW50LCByZXF1ZXN0LCBlcnIpIHtcbiAgdHJ5IHtcbiAgICByZXF1ZXN0Lm9uRXJyb3IoZXJyKVxuICAgIGFzc2VydChyZXF1ZXN0LmFib3J0ZWQpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNsaWVudC5lbWl0KCdlcnJvcicsIGVycilcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENsaWVudFxuIiwiLyogZXNsaW50LWRpc2FibGUgKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8vIEV4dHJhY3RlZCBmcm9tIG5vZGUvbGliL2ludGVybmFsL2ZpeGVkX3F1ZXVlLmpzXG5cbi8vIEN1cnJlbnRseSBvcHRpbWFsIHF1ZXVlIHNpemUsIHRlc3RlZCBvbiBWOCA2LjAgLSA2LjYuIE11c3QgYmUgcG93ZXIgb2YgdHdvLlxuY29uc3Qga1NpemUgPSAyMDQ4O1xuY29uc3Qga01hc2sgPSBrU2l6ZSAtIDE7XG5cbi8vIFRoZSBGaXhlZFF1ZXVlIGlzIGltcGxlbWVudGVkIGFzIGEgc2luZ2x5LWxpbmtlZCBsaXN0IG9mIGZpeGVkLXNpemVcbi8vIGNpcmN1bGFyIGJ1ZmZlcnMuIEl0IGxvb2tzIHNvbWV0aGluZyBsaWtlIHRoaXM6XG4vL1xuLy8gIGhlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFpbFxuLy8gICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4vLyAgICB2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZcbi8vICstLS0tLS0tLS0tLSsgPC0tLS0tXFwgICAgICAgKy0tLS0tLS0tLS0tKyA8LS0tLS0tXFwgICAgICAgICArLS0tLS0tLS0tLS0rXG4vLyB8ICBbbnVsbF0gICB8ICAgICAgICBcXC0tLS0tIHwgICBuZXh0ICAgIHwgICAgICAgICBcXC0tLS0tLS0gfCAgIG5leHQgICAgfFxuLy8gKy0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rXG4vLyB8ICAgaXRlbSAgICB8IDwtLSBib3R0b20gICAgfCAgIGl0ZW0gICAgfCA8LS0gYm90dG9tICAgICAgIHwgIFtlbXB0eV0gIHxcbi8vIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgICAgfCAgW2VtcHR5XSAgfFxuLy8gfCAgIGl0ZW0gICAgfCAgICAgICAgICAgICAgIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICAgICB8ICBbZW1wdHldICB8XG4vLyB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfCAgICAgICAgICAgICAgICAgIHwgIFtlbXB0eV0gIHxcbi8vIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8ICAgICAgIGJvdHRvbSAtLT4gfCAgIGl0ZW0gICAgfFxuLy8gfCAgIGl0ZW0gICAgfCAgICAgICAgICAgICAgIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8XG4vLyB8ICAgIC4uLiAgICB8ICAgICAgICAgICAgICAgfCAgICAuLi4gICAgfCAgICAgICAgICAgICAgICAgIHwgICAgLi4uICAgIHxcbi8vIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfFxuLy8gfCAgIGl0ZW0gICAgfCAgICAgICAgICAgICAgIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8XG4vLyB8ICBbZW1wdHldICB8IDwtLSB0b3AgICAgICAgfCAgIGl0ZW0gICAgfCAgICAgICAgICAgICAgICAgIHwgICBpdGVtICAgIHxcbi8vIHwgIFtlbXB0eV0gIHwgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfFxuLy8gfCAgW2VtcHR5XSAgfCAgICAgICAgICAgICAgIHwgIFtlbXB0eV0gIHwgPC0tIHRvcCAgdG9wIC0tPiB8ICBbZW1wdHldICB8XG4vLyArLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLStcbi8vXG4vLyBPciwgaWYgdGhlcmUgaXMgb25seSBvbmUgY2lyY3VsYXIgYnVmZmVyLCBpdCBsb29rcyBzb21ldGhpbmdcbi8vIGxpa2UgZWl0aGVyIG9mIHRoZXNlOlxuLy9cbi8vICBoZWFkICAgdGFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWQgICB0YWlsXG4vLyAgICB8ICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHxcbi8vICAgIHYgICAgIHYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiAgICAgdlxuLy8gKy0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rXG4vLyB8ICBbbnVsbF0gICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFtudWxsXSAgIHxcbi8vICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tK1xuLy8gfCAgW2VtcHR5XSAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8XG4vLyB8ICBbZW1wdHldICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBpdGVtICAgIHxcbi8vIHwgICBpdGVtICAgIHwgPC0tIGJvdHRvbSAgICAgICAgICAgIHRvcCAtLT4gfCAgW2VtcHR5XSAgfFxuLy8gfCAgIGl0ZW0gICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBbZW1wdHldICB8XG4vLyB8ICBbZW1wdHldICB8IDwtLSB0b3AgICAgICAgICAgICBib3R0b20gLS0+IHwgICBpdGVtICAgIHxcbi8vIHwgIFtlbXB0eV0gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfFxuLy8gKy0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rXG4vL1xuLy8gQWRkaW5nIGEgdmFsdWUgbWVhbnMgbW92aW5nIGB0b3BgIGZvcndhcmQgYnkgb25lLCByZW1vdmluZyBtZWFuc1xuLy8gbW92aW5nIGBib3R0b21gIGZvcndhcmQgYnkgb25lLiBBZnRlciByZWFjaGluZyB0aGUgZW5kLCB0aGUgcXVldWVcbi8vIHdyYXBzIGFyb3VuZC5cbi8vXG4vLyBXaGVuIGB0b3AgPT09IGJvdHRvbWAgdGhlIGN1cnJlbnQgcXVldWUgaXMgZW1wdHkgYW5kIHdoZW5cbi8vIGB0b3AgKyAxID09PSBib3R0b21gIGl0J3MgZnVsbC4gVGhpcyB3YXN0ZXMgYSBzaW5nbGUgc3BhY2Ugb2Ygc3RvcmFnZVxuLy8gYnV0IGFsbG93cyBtdWNoIHF1aWNrZXIgY2hlY2tzLlxuXG5jbGFzcyBGaXhlZENpcmN1bGFyQnVmZmVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5ib3R0b20gPSAwO1xuICAgIHRoaXMudG9wID0gMDtcbiAgICB0aGlzLmxpc3QgPSBuZXcgQXJyYXkoa1NpemUpO1xuICAgIHRoaXMubmV4dCA9IG51bGw7XG4gIH1cblxuICBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLnRvcCA9PT0gdGhpcy5ib3R0b207XG4gIH1cblxuICBpc0Z1bGwoKSB7XG4gICAgcmV0dXJuICgodGhpcy50b3AgKyAxKSAmIGtNYXNrKSA9PT0gdGhpcy5ib3R0b207XG4gIH1cblxuICBwdXNoKGRhdGEpIHtcbiAgICB0aGlzLmxpc3RbdGhpcy50b3BdID0gZGF0YTtcbiAgICB0aGlzLnRvcCA9ICh0aGlzLnRvcCArIDEpICYga01hc2s7XG4gIH1cblxuICBzaGlmdCgpIHtcbiAgICBjb25zdCBuZXh0SXRlbSA9IHRoaXMubGlzdFt0aGlzLmJvdHRvbV07XG4gICAgaWYgKG5leHRJdGVtID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB0aGlzLmxpc3RbdGhpcy5ib3R0b21dID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuYm90dG9tID0gKHRoaXMuYm90dG9tICsgMSkgJiBrTWFzaztcbiAgICByZXR1cm4gbmV4dEl0ZW07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBGaXhlZFF1ZXVlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbmV3IEZpeGVkQ2lyY3VsYXJCdWZmZXIoKTtcbiAgfVxuXG4gIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGVhZC5pc0VtcHR5KCk7XG4gIH1cblxuICBwdXNoKGRhdGEpIHtcbiAgICBpZiAodGhpcy5oZWFkLmlzRnVsbCgpKSB7XG4gICAgICAvLyBIZWFkIGlzIGZ1bGw6IENyZWF0ZXMgYSBuZXcgcXVldWUsIHNldHMgdGhlIG9sZCBxdWV1ZSdzIGAubmV4dGAgdG8gaXQsXG4gICAgICAvLyBhbmQgc2V0cyBpdCBhcyB0aGUgbmV3IG1haW4gcXVldWUuXG4gICAgICB0aGlzLmhlYWQgPSB0aGlzLmhlYWQubmV4dCA9IG5ldyBGaXhlZENpcmN1bGFyQnVmZmVyKCk7XG4gICAgfVxuICAgIHRoaXMuaGVhZC5wdXNoKGRhdGEpO1xuICB9XG5cbiAgc2hpZnQoKSB7XG4gICAgY29uc3QgdGFpbCA9IHRoaXMudGFpbDtcbiAgICBjb25zdCBuZXh0ID0gdGFpbC5zaGlmdCgpO1xuICAgIGlmICh0YWlsLmlzRW1wdHkoKSAmJiB0YWlsLm5leHQgIT09IG51bGwpIHtcbiAgICAgIC8vIElmIHRoZXJlIGlzIGFub3RoZXIgcXVldWUsIGl0IGZvcm1zIHRoZSBuZXcgdGFpbC5cbiAgICAgIHRoaXMudGFpbCA9IHRhaWwubmV4dDtcbiAgICB9XG4gICAgcmV0dXJuIG5leHQ7XG4gIH1cbn07XG4iLCJjb25zdCB7IGtGcmVlLCBrQ29ubmVjdGVkLCBrUGVuZGluZywga1F1ZXVlZCwga1J1bm5pbmcsIGtTaXplIH0gPSByZXF1aXJlKCcuL2NvcmUvc3ltYm9scycpXG5jb25zdCBrUG9vbCA9IFN5bWJvbCgncG9vbCcpXG5cbmNsYXNzIFBvb2xTdGF0cyB7XG4gIGNvbnN0cnVjdG9yIChwb29sKSB7XG4gICAgdGhpc1trUG9vbF0gPSBwb29sXG4gIH1cblxuICBnZXQgY29ubmVjdGVkICgpIHtcbiAgICByZXR1cm4gdGhpc1trUG9vbF1ba0Nvbm5lY3RlZF1cbiAgfVxuXG4gIGdldCBmcmVlICgpIHtcbiAgICByZXR1cm4gdGhpc1trUG9vbF1ba0ZyZWVdXG4gIH1cblxuICBnZXQgcGVuZGluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1Bvb2xdW2tQZW5kaW5nXVxuICB9XG5cbiAgZ2V0IHF1ZXVlZCAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1Bvb2xdW2tRdWV1ZWRdXG4gIH1cblxuICBnZXQgcnVubmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1Bvb2xdW2tSdW5uaW5nXVxuICB9XG5cbiAgZ2V0IHNpemUgKCkge1xuICAgIHJldHVybiB0aGlzW2tQb29sXVtrU2l6ZV1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFBvb2xTdGF0c1xuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IERpc3BhdGNoZXJCYXNlID0gcmVxdWlyZSgnLi9kaXNwYXRjaGVyLWJhc2UnKVxuY29uc3QgRml4ZWRRdWV1ZSA9IHJlcXVpcmUoJy4vbm9kZS9maXhlZC1xdWV1ZScpXG5jb25zdCB7IGtDb25uZWN0ZWQsIGtTaXplLCBrUnVubmluZywga1BlbmRpbmcsIGtRdWV1ZWQsIGtCdXN5LCBrRnJlZSwga1VybCwga0Nsb3NlLCBrRGVzdHJveSwga0Rpc3BhdGNoIH0gPSByZXF1aXJlKCcuL2NvcmUvc3ltYm9scycpXG5jb25zdCBQb29sU3RhdHMgPSByZXF1aXJlKCcuL3Bvb2wtc3RhdHMnKVxuXG5jb25zdCBrQ2xpZW50cyA9IFN5bWJvbCgnY2xpZW50cycpXG5jb25zdCBrTmVlZERyYWluID0gU3ltYm9sKCduZWVkRHJhaW4nKVxuY29uc3Qga1F1ZXVlID0gU3ltYm9sKCdxdWV1ZScpXG5jb25zdCBrQ2xvc2VkUmVzb2x2ZSA9IFN5bWJvbCgnY2xvc2VkIHJlc29sdmUnKVxuY29uc3Qga09uRHJhaW4gPSBTeW1ib2woJ29uRHJhaW4nKVxuY29uc3Qga09uQ29ubmVjdCA9IFN5bWJvbCgnb25Db25uZWN0JylcbmNvbnN0IGtPbkRpc2Nvbm5lY3QgPSBTeW1ib2woJ29uRGlzY29ubmVjdCcpXG5jb25zdCBrT25Db25uZWN0aW9uRXJyb3IgPSBTeW1ib2woJ29uQ29ubmVjdGlvbkVycm9yJylcbmNvbnN0IGtHZXREaXNwYXRjaGVyID0gU3ltYm9sKCdnZXQgZGlzcGF0Y2hlcicpXG5jb25zdCBrQWRkQ2xpZW50ID0gU3ltYm9sKCdhZGQgY2xpZW50JylcbmNvbnN0IGtSZW1vdmVDbGllbnQgPSBTeW1ib2woJ3JlbW92ZSBjbGllbnQnKVxuY29uc3Qga1N0YXRzID0gU3ltYm9sKCdzdGF0cycpXG5cbmNsYXNzIFBvb2xCYXNlIGV4dGVuZHMgRGlzcGF0Y2hlckJhc2Uge1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgdGhpc1trUXVldWVdID0gbmV3IEZpeGVkUXVldWUoKVxuICAgIHRoaXNba0NsaWVudHNdID0gW11cbiAgICB0aGlzW2tRdWV1ZWRdID0gMFxuXG4gICAgY29uc3QgcG9vbCA9IHRoaXNcblxuICAgIHRoaXNba09uRHJhaW5dID0gZnVuY3Rpb24gb25EcmFpbiAob3JpZ2luLCB0YXJnZXRzKSB7XG4gICAgICBjb25zdCBxdWV1ZSA9IHBvb2xba1F1ZXVlXVxuXG4gICAgICBsZXQgbmVlZERyYWluID0gZmFsc2VcblxuICAgICAgd2hpbGUgKCFuZWVkRHJhaW4pIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHF1ZXVlLnNoaWZ0KClcbiAgICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBwb29sW2tRdWV1ZWRdLS1cbiAgICAgICAgbmVlZERyYWluID0gIXRoaXMuZGlzcGF0Y2goaXRlbS5vcHRzLCBpdGVtLmhhbmRsZXIpXG4gICAgICB9XG5cbiAgICAgIHRoaXNba05lZWREcmFpbl0gPSBuZWVkRHJhaW5cblxuICAgICAgaWYgKCF0aGlzW2tOZWVkRHJhaW5dICYmIHBvb2xba05lZWREcmFpbl0pIHtcbiAgICAgICAgcG9vbFtrTmVlZERyYWluXSA9IGZhbHNlXG4gICAgICAgIHBvb2wuZW1pdCgnZHJhaW4nLCBvcmlnaW4sIFtwb29sLCAuLi50YXJnZXRzXSlcbiAgICAgIH1cblxuICAgICAgaWYgKHBvb2xba0Nsb3NlZFJlc29sdmVdICYmIHF1ZXVlLmlzRW1wdHkoKSkge1xuICAgICAgICBQcm9taXNlXG4gICAgICAgICAgLmFsbChwb29sW2tDbGllbnRzXS5tYXAoYyA9PiBjLmNsb3NlKCkpKVxuICAgICAgICAgIC50aGVuKHBvb2xba0Nsb3NlZFJlc29sdmVdKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXNba09uQ29ubmVjdF0gPSAob3JpZ2luLCB0YXJnZXRzKSA9PiB7XG4gICAgICBwb29sLmVtaXQoJ2Nvbm5lY3QnLCBvcmlnaW4sIFtwb29sLCAuLi50YXJnZXRzXSlcbiAgICB9XG5cbiAgICB0aGlzW2tPbkRpc2Nvbm5lY3RdID0gKG9yaWdpbiwgdGFyZ2V0cywgZXJyKSA9PiB7XG4gICAgICBwb29sLmVtaXQoJ2Rpc2Nvbm5lY3QnLCBvcmlnaW4sIFtwb29sLCAuLi50YXJnZXRzXSwgZXJyKVxuICAgIH1cblxuICAgIHRoaXNba09uQ29ubmVjdGlvbkVycm9yXSA9IChvcmlnaW4sIHRhcmdldHMsIGVycikgPT4ge1xuICAgICAgcG9vbC5lbWl0KCdjb25uZWN0aW9uRXJyb3InLCBvcmlnaW4sIFtwb29sLCAuLi50YXJnZXRzXSwgZXJyKVxuICAgIH1cblxuICAgIHRoaXNba1N0YXRzXSA9IG5ldyBQb29sU3RhdHModGhpcylcbiAgfVxuXG4gIGdldCBba0J1c3ldICgpIHtcbiAgICByZXR1cm4gdGhpc1trTmVlZERyYWluXVxuICB9XG5cbiAgZ2V0IFtrQ29ubmVjdGVkXSAoKSB7XG4gICAgcmV0dXJuIHRoaXNba0NsaWVudHNdLmZpbHRlcihjbGllbnQgPT4gY2xpZW50W2tDb25uZWN0ZWRdKS5sZW5ndGhcbiAgfVxuXG4gIGdldCBba0ZyZWVdICgpIHtcbiAgICByZXR1cm4gdGhpc1trQ2xpZW50c10uZmlsdGVyKGNsaWVudCA9PiBjbGllbnRba0Nvbm5lY3RlZF0gJiYgIWNsaWVudFtrTmVlZERyYWluXSkubGVuZ3RoXG4gIH1cblxuICBnZXQgW2tQZW5kaW5nXSAoKSB7XG4gICAgbGV0IHJldCA9IHRoaXNba1F1ZXVlZF1cbiAgICBmb3IgKGNvbnN0IHsgW2tQZW5kaW5nXTogcGVuZGluZyB9IG9mIHRoaXNba0NsaWVudHNdKSB7XG4gICAgICByZXQgKz0gcGVuZGluZ1xuICAgIH1cbiAgICByZXR1cm4gcmV0XG4gIH1cblxuICBnZXQgW2tSdW5uaW5nXSAoKSB7XG4gICAgbGV0IHJldCA9IDBcbiAgICBmb3IgKGNvbnN0IHsgW2tSdW5uaW5nXTogcnVubmluZyB9IG9mIHRoaXNba0NsaWVudHNdKSB7XG4gICAgICByZXQgKz0gcnVubmluZ1xuICAgIH1cbiAgICByZXR1cm4gcmV0XG4gIH1cblxuICBnZXQgW2tTaXplXSAoKSB7XG4gICAgbGV0IHJldCA9IHRoaXNba1F1ZXVlZF1cbiAgICBmb3IgKGNvbnN0IHsgW2tTaXplXTogc2l6ZSB9IG9mIHRoaXNba0NsaWVudHNdKSB7XG4gICAgICByZXQgKz0gc2l6ZVxuICAgIH1cbiAgICByZXR1cm4gcmV0XG4gIH1cblxuICBnZXQgc3RhdHMgKCkge1xuICAgIHJldHVybiB0aGlzW2tTdGF0c11cbiAgfVxuXG4gIGFzeW5jIFtrQ2xvc2VdICgpIHtcbiAgICBpZiAodGhpc1trUXVldWVdLmlzRW1wdHkoKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHRoaXNba0NsaWVudHNdLm1hcChjID0+IGMuY2xvc2UoKSkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0aGlzW2tDbG9zZWRSZXNvbHZlXSA9IHJlc29sdmVcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgW2tEZXN0cm95XSAoZXJyKSB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzW2tRdWV1ZV0uc2hpZnQoKVxuICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBpdGVtLmhhbmRsZXIub25FcnJvcihlcnIpXG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHRoaXNba0NsaWVudHNdLm1hcChjID0+IGMuZGVzdHJveShlcnIpKSlcbiAgfVxuXG4gIFtrRGlzcGF0Y2hdIChvcHRzLCBoYW5kbGVyKSB7XG4gICAgY29uc3QgZGlzcGF0Y2hlciA9IHRoaXNba0dldERpc3BhdGNoZXJdKClcblxuICAgIGlmICghZGlzcGF0Y2hlcikge1xuICAgICAgdGhpc1trTmVlZERyYWluXSA9IHRydWVcbiAgICAgIHRoaXNba1F1ZXVlXS5wdXNoKHsgb3B0cywgaGFuZGxlciB9KVxuICAgICAgdGhpc1trUXVldWVkXSsrXG4gICAgfSBlbHNlIGlmICghZGlzcGF0Y2hlci5kaXNwYXRjaChvcHRzLCBoYW5kbGVyKSkge1xuICAgICAgZGlzcGF0Y2hlcltrTmVlZERyYWluXSA9IHRydWVcbiAgICAgIHRoaXNba05lZWREcmFpbl0gPSAhdGhpc1trR2V0RGlzcGF0Y2hlcl0oKVxuICAgIH1cblxuICAgIHJldHVybiAhdGhpc1trTmVlZERyYWluXVxuICB9XG5cbiAgW2tBZGRDbGllbnRdIChjbGllbnQpIHtcbiAgICBjbGllbnRcbiAgICAgIC5vbignZHJhaW4nLCB0aGlzW2tPbkRyYWluXSlcbiAgICAgIC5vbignY29ubmVjdCcsIHRoaXNba09uQ29ubmVjdF0pXG4gICAgICAub24oJ2Rpc2Nvbm5lY3QnLCB0aGlzW2tPbkRpc2Nvbm5lY3RdKVxuICAgICAgLm9uKCdjb25uZWN0aW9uRXJyb3InLCB0aGlzW2tPbkNvbm5lY3Rpb25FcnJvcl0pXG5cbiAgICB0aGlzW2tDbGllbnRzXS5wdXNoKGNsaWVudClcblxuICAgIGlmICh0aGlzW2tOZWVkRHJhaW5dKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXNba05lZWREcmFpbl0pIHtcbiAgICAgICAgICB0aGlzW2tPbkRyYWluXShjbGllbnRba1VybF0sIFt0aGlzLCBjbGllbnRdKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBba1JlbW92ZUNsaWVudF0gKGNsaWVudCkge1xuICAgIGNsaWVudC5jbG9zZSgoKSA9PiB7XG4gICAgICBjb25zdCBpZHggPSB0aGlzW2tDbGllbnRzXS5pbmRleE9mKGNsaWVudClcbiAgICAgIGlmIChpZHggIT09IC0xKSB7XG4gICAgICAgIHRoaXNba0NsaWVudHNdLnNwbGljZShpZHgsIDEpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHRoaXNba05lZWREcmFpbl0gPSB0aGlzW2tDbGllbnRzXS5zb21lKGRpc3BhdGNoZXIgPT4gKFxuICAgICAgIWRpc3BhdGNoZXJba05lZWREcmFpbl0gJiZcbiAgICAgIGRpc3BhdGNoZXIuY2xvc2VkICE9PSB0cnVlICYmXG4gICAgICBkaXNwYXRjaGVyLmRlc3Ryb3llZCAhPT0gdHJ1ZVxuICAgICkpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIFBvb2xCYXNlLFxuICBrQ2xpZW50cyxcbiAga05lZWREcmFpbixcbiAga0FkZENsaWVudCxcbiAga1JlbW92ZUNsaWVudCxcbiAga0dldERpc3BhdGNoZXJcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7XG4gIFBvb2xCYXNlLFxuICBrQ2xpZW50cyxcbiAga05lZWREcmFpbixcbiAga0FkZENsaWVudCxcbiAga0dldERpc3BhdGNoZXJcbn0gPSByZXF1aXJlKCcuL3Bvb2wtYmFzZScpXG5jb25zdCBDbGllbnQgPSByZXF1aXJlKCcuL2NsaWVudCcpXG5jb25zdCB7XG4gIEludmFsaWRBcmd1bWVudEVycm9yXG59ID0gcmVxdWlyZSgnLi9jb3JlL2Vycm9ycycpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBrVXJsLCBrSW50ZXJjZXB0b3JzIH0gPSByZXF1aXJlKCcuL2NvcmUvc3ltYm9scycpXG5jb25zdCBidWlsZENvbm5lY3RvciA9IHJlcXVpcmUoJy4vY29yZS9jb25uZWN0JylcblxuY29uc3Qga09wdGlvbnMgPSBTeW1ib2woJ29wdGlvbnMnKVxuY29uc3Qga0Nvbm5lY3Rpb25zID0gU3ltYm9sKCdjb25uZWN0aW9ucycpXG5jb25zdCBrRmFjdG9yeSA9IFN5bWJvbCgnZmFjdG9yeScpXG5cbmZ1bmN0aW9uIGRlZmF1bHRGYWN0b3J5IChvcmlnaW4sIG9wdHMpIHtcbiAgcmV0dXJuIG5ldyBDbGllbnQob3JpZ2luLCBvcHRzKVxufVxuXG5jbGFzcyBQb29sIGV4dGVuZHMgUG9vbEJhc2Uge1xuICBjb25zdHJ1Y3RvciAob3JpZ2luLCB7XG4gICAgY29ubmVjdGlvbnMsXG4gICAgZmFjdG9yeSA9IGRlZmF1bHRGYWN0b3J5LFxuICAgIGNvbm5lY3QsXG4gICAgY29ubmVjdFRpbWVvdXQsXG4gICAgdGxzLFxuICAgIG1heENhY2hlZFNlc3Npb25zLFxuICAgIHNvY2tldFBhdGgsXG4gICAgYXV0b1NlbGVjdEZhbWlseSxcbiAgICBhdXRvU2VsZWN0RmFtaWx5QXR0ZW1wdFRpbWVvdXQsXG4gICAgYWxsb3dIMixcbiAgICAuLi5vcHRpb25zXG4gIH0gPSB7fSkge1xuICAgIHN1cGVyKClcblxuICAgIGlmIChjb25uZWN0aW9ucyAhPSBudWxsICYmICghTnVtYmVyLmlzRmluaXRlKGNvbm5lY3Rpb25zKSB8fCBjb25uZWN0aW9ucyA8IDApKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgY29ubmVjdGlvbnMnKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZmFjdG9yeSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdmYWN0b3J5IG11c3QgYmUgYSBmdW5jdGlvbi4nKVxuICAgIH1cblxuICAgIGlmIChjb25uZWN0ICE9IG51bGwgJiYgdHlwZW9mIGNvbm5lY3QgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGNvbm5lY3QgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2Nvbm5lY3QgbXVzdCBiZSBhIGZ1bmN0aW9uIG9yIGFuIG9iamVjdCcpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb25uZWN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25uZWN0ID0gYnVpbGRDb25uZWN0b3Ioe1xuICAgICAgICAuLi50bHMsXG4gICAgICAgIG1heENhY2hlZFNlc3Npb25zLFxuICAgICAgICBhbGxvd0gyLFxuICAgICAgICBzb2NrZXRQYXRoLFxuICAgICAgICB0aW1lb3V0OiBjb25uZWN0VGltZW91dCxcbiAgICAgICAgLi4uKHV0aWwubm9kZUhhc0F1dG9TZWxlY3RGYW1pbHkgJiYgYXV0b1NlbGVjdEZhbWlseSA/IHsgYXV0b1NlbGVjdEZhbWlseSwgYXV0b1NlbGVjdEZhbWlseUF0dGVtcHRUaW1lb3V0IH0gOiB1bmRlZmluZWQpLFxuICAgICAgICAuLi5jb25uZWN0XG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXNba0ludGVyY2VwdG9yc10gPSBvcHRpb25zLmludGVyY2VwdG9ycyAmJiBvcHRpb25zLmludGVyY2VwdG9ycy5Qb29sICYmIEFycmF5LmlzQXJyYXkob3B0aW9ucy5pbnRlcmNlcHRvcnMuUG9vbClcbiAgICAgID8gb3B0aW9ucy5pbnRlcmNlcHRvcnMuUG9vbFxuICAgICAgOiBbXVxuICAgIHRoaXNba0Nvbm5lY3Rpb25zXSA9IGNvbm5lY3Rpb25zIHx8IG51bGxcbiAgICB0aGlzW2tVcmxdID0gdXRpbC5wYXJzZU9yaWdpbihvcmlnaW4pXG4gICAgdGhpc1trT3B0aW9uc10gPSB7IC4uLnV0aWwuZGVlcENsb25lKG9wdGlvbnMpLCBjb25uZWN0LCBhbGxvd0gyIH1cbiAgICB0aGlzW2tPcHRpb25zXS5pbnRlcmNlcHRvcnMgPSBvcHRpb25zLmludGVyY2VwdG9yc1xuICAgICAgPyB7IC4uLm9wdGlvbnMuaW50ZXJjZXB0b3JzIH1cbiAgICAgIDogdW5kZWZpbmVkXG4gICAgdGhpc1trRmFjdG9yeV0gPSBmYWN0b3J5XG5cbiAgICB0aGlzLm9uKCdjb25uZWN0aW9uRXJyb3InLCAob3JpZ2luLCB0YXJnZXRzLCBlcnJvcikgPT4ge1xuICAgICAgLy8gSWYgYSBjb25uZWN0aW9uIGVycm9yIG9jY3Vycywgd2UgcmVtb3ZlIHRoZSBjbGllbnQgZnJvbSB0aGUgcG9vbCxcbiAgICAgIC8vIGFuZCBlbWl0IGEgY29ubmVjdGlvbkVycm9yIGV2ZW50LiBUaGV5IHdpbGwgbm90IGJlIHJlLXVzZWQuXG4gICAgICAvLyBGaXhlcyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9pc3N1ZXMvMzg5NVxuICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICAvLyBEbyBub3QgdXNlIGtSZW1vdmVDbGllbnQgaGVyZSwgYXMgaXQgd2lsbCBjbG9zZSB0aGUgY2xpZW50LFxuICAgICAgICAvLyBidXQgdGhlIGNsaWVudCBjYW5ub3QgYmUgY2xvc2VkIGluIHRoaXMgc3RhdGUuXG4gICAgICAgIGNvbnN0IGlkeCA9IHRoaXNba0NsaWVudHNdLmluZGV4T2YodGFyZ2V0KVxuICAgICAgICBpZiAoaWR4ICE9PSAtMSkge1xuICAgICAgICAgIHRoaXNba0NsaWVudHNdLnNwbGljZShpZHgsIDEpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgW2tHZXREaXNwYXRjaGVyXSAoKSB7XG4gICAgbGV0IGRpc3BhdGNoZXIgPSB0aGlzW2tDbGllbnRzXS5maW5kKGRpc3BhdGNoZXIgPT4gIWRpc3BhdGNoZXJba05lZWREcmFpbl0pXG5cbiAgICBpZiAoZGlzcGF0Y2hlcikge1xuICAgICAgcmV0dXJuIGRpc3BhdGNoZXJcbiAgICB9XG5cbiAgICBpZiAoIXRoaXNba0Nvbm5lY3Rpb25zXSB8fCB0aGlzW2tDbGllbnRzXS5sZW5ndGggPCB0aGlzW2tDb25uZWN0aW9uc10pIHtcbiAgICAgIGRpc3BhdGNoZXIgPSB0aGlzW2tGYWN0b3J5XSh0aGlzW2tVcmxdLCB0aGlzW2tPcHRpb25zXSlcbiAgICAgIHRoaXNba0FkZENsaWVudF0oZGlzcGF0Y2hlcilcbiAgICB9XG5cbiAgICByZXR1cm4gZGlzcGF0Y2hlclxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUG9vbFxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHtcbiAgQmFsYW5jZWRQb29sTWlzc2luZ1Vwc3RyZWFtRXJyb3IsXG4gIEludmFsaWRBcmd1bWVudEVycm9yXG59ID0gcmVxdWlyZSgnLi9jb3JlL2Vycm9ycycpXG5jb25zdCB7XG4gIFBvb2xCYXNlLFxuICBrQ2xpZW50cyxcbiAga05lZWREcmFpbixcbiAga0FkZENsaWVudCxcbiAga1JlbW92ZUNsaWVudCxcbiAga0dldERpc3BhdGNoZXJcbn0gPSByZXF1aXJlKCcuL3Bvb2wtYmFzZScpXG5jb25zdCBQb29sID0gcmVxdWlyZSgnLi9wb29sJylcbmNvbnN0IHsga1VybCwga0ludGVyY2VwdG9ycyB9ID0gcmVxdWlyZSgnLi9jb3JlL3N5bWJvbHMnKVxuY29uc3QgeyBwYXJzZU9yaWdpbiB9ID0gcmVxdWlyZSgnLi9jb3JlL3V0aWwnKVxuY29uc3Qga0ZhY3RvcnkgPSBTeW1ib2woJ2ZhY3RvcnknKVxuXG5jb25zdCBrT3B0aW9ucyA9IFN5bWJvbCgnb3B0aW9ucycpXG5jb25zdCBrR3JlYXRlc3RDb21tb25EaXZpc29yID0gU3ltYm9sKCdrR3JlYXRlc3RDb21tb25EaXZpc29yJylcbmNvbnN0IGtDdXJyZW50V2VpZ2h0ID0gU3ltYm9sKCdrQ3VycmVudFdlaWdodCcpXG5jb25zdCBrSW5kZXggPSBTeW1ib2woJ2tJbmRleCcpXG5jb25zdCBrV2VpZ2h0ID0gU3ltYm9sKCdrV2VpZ2h0JylcbmNvbnN0IGtNYXhXZWlnaHRQZXJTZXJ2ZXIgPSBTeW1ib2woJ2tNYXhXZWlnaHRQZXJTZXJ2ZXInKVxuY29uc3Qga0Vycm9yUGVuYWx0eSA9IFN5bWJvbCgna0Vycm9yUGVuYWx0eScpXG5cbmZ1bmN0aW9uIGdldEdyZWF0ZXN0Q29tbW9uRGl2aXNvciAoYSwgYikge1xuICBpZiAoYiA9PT0gMCkgcmV0dXJuIGFcbiAgcmV0dXJuIGdldEdyZWF0ZXN0Q29tbW9uRGl2aXNvcihiLCBhICUgYilcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEZhY3RvcnkgKG9yaWdpbiwgb3B0cykge1xuICByZXR1cm4gbmV3IFBvb2wob3JpZ2luLCBvcHRzKVxufVxuXG5jbGFzcyBCYWxhbmNlZFBvb2wgZXh0ZW5kcyBQb29sQmFzZSB7XG4gIGNvbnN0cnVjdG9yICh1cHN0cmVhbXMgPSBbXSwgeyBmYWN0b3J5ID0gZGVmYXVsdEZhY3RvcnksIC4uLm9wdHMgfSA9IHt9KSB7XG4gICAgc3VwZXIoKVxuXG4gICAgdGhpc1trT3B0aW9uc10gPSBvcHRzXG4gICAgdGhpc1trSW5kZXhdID0gLTFcbiAgICB0aGlzW2tDdXJyZW50V2VpZ2h0XSA9IDBcblxuICAgIHRoaXNba01heFdlaWdodFBlclNlcnZlcl0gPSB0aGlzW2tPcHRpb25zXS5tYXhXZWlnaHRQZXJTZXJ2ZXIgfHwgMTAwXG4gICAgdGhpc1trRXJyb3JQZW5hbHR5XSA9IHRoaXNba09wdGlvbnNdLmVycm9yUGVuYWx0eSB8fCAxNVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHVwc3RyZWFtcykpIHtcbiAgICAgIHVwc3RyZWFtcyA9IFt1cHN0cmVhbXNdXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmYWN0b3J5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ZhY3RvcnkgbXVzdCBiZSBhIGZ1bmN0aW9uLicpXG4gICAgfVxuXG4gICAgdGhpc1trSW50ZXJjZXB0b3JzXSA9IG9wdHMuaW50ZXJjZXB0b3JzICYmIG9wdHMuaW50ZXJjZXB0b3JzLkJhbGFuY2VkUG9vbCAmJiBBcnJheS5pc0FycmF5KG9wdHMuaW50ZXJjZXB0b3JzLkJhbGFuY2VkUG9vbClcbiAgICAgID8gb3B0cy5pbnRlcmNlcHRvcnMuQmFsYW5jZWRQb29sXG4gICAgICA6IFtdXG4gICAgdGhpc1trRmFjdG9yeV0gPSBmYWN0b3J5XG5cbiAgICBmb3IgKGNvbnN0IHVwc3RyZWFtIG9mIHVwc3RyZWFtcykge1xuICAgICAgdGhpcy5hZGRVcHN0cmVhbSh1cHN0cmVhbSlcbiAgICB9XG4gICAgdGhpcy5fdXBkYXRlQmFsYW5jZWRQb29sU3RhdHMoKVxuICB9XG5cbiAgYWRkVXBzdHJlYW0gKHVwc3RyZWFtKSB7XG4gICAgY29uc3QgdXBzdHJlYW1PcmlnaW4gPSBwYXJzZU9yaWdpbih1cHN0cmVhbSkub3JpZ2luXG5cbiAgICBpZiAodGhpc1trQ2xpZW50c10uZmluZCgocG9vbCkgPT4gKFxuICAgICAgcG9vbFtrVXJsXS5vcmlnaW4gPT09IHVwc3RyZWFtT3JpZ2luICYmXG4gICAgICBwb29sLmNsb3NlZCAhPT0gdHJ1ZSAmJlxuICAgICAgcG9vbC5kZXN0cm95ZWQgIT09IHRydWVcbiAgICApKSkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG4gICAgY29uc3QgcG9vbCA9IHRoaXNba0ZhY3RvcnldKHVwc3RyZWFtT3JpZ2luLCBPYmplY3QuYXNzaWduKHt9LCB0aGlzW2tPcHRpb25zXSkpXG5cbiAgICB0aGlzW2tBZGRDbGllbnRdKHBvb2wpXG4gICAgcG9vbC5vbignY29ubmVjdCcsICgpID0+IHtcbiAgICAgIHBvb2xba1dlaWdodF0gPSBNYXRoLm1pbih0aGlzW2tNYXhXZWlnaHRQZXJTZXJ2ZXJdLCBwb29sW2tXZWlnaHRdICsgdGhpc1trRXJyb3JQZW5hbHR5XSlcbiAgICB9KVxuXG4gICAgcG9vbC5vbignY29ubmVjdGlvbkVycm9yJywgKCkgPT4ge1xuICAgICAgcG9vbFtrV2VpZ2h0XSA9IE1hdGgubWF4KDEsIHBvb2xba1dlaWdodF0gLSB0aGlzW2tFcnJvclBlbmFsdHldKVxuICAgICAgdGhpcy5fdXBkYXRlQmFsYW5jZWRQb29sU3RhdHMoKVxuICAgIH0pXG5cbiAgICBwb29sLm9uKCdkaXNjb25uZWN0JywgKC4uLmFyZ3MpID0+IHtcbiAgICAgIGNvbnN0IGVyciA9IGFyZ3NbMl1cbiAgICAgIGlmIChlcnIgJiYgZXJyLmNvZGUgPT09ICdVTkRfRVJSX1NPQ0tFVCcpIHtcbiAgICAgICAgLy8gZGVjcmVhc2UgdGhlIHdlaWdodCBvZiB0aGUgcG9vbC5cbiAgICAgICAgcG9vbFtrV2VpZ2h0XSA9IE1hdGgubWF4KDEsIHBvb2xba1dlaWdodF0gLSB0aGlzW2tFcnJvclBlbmFsdHldKVxuICAgICAgICB0aGlzLl91cGRhdGVCYWxhbmNlZFBvb2xTdGF0cygpXG4gICAgICB9XG4gICAgfSlcblxuICAgIGZvciAoY29uc3QgY2xpZW50IG9mIHRoaXNba0NsaWVudHNdKSB7XG4gICAgICBjbGllbnRba1dlaWdodF0gPSB0aGlzW2tNYXhXZWlnaHRQZXJTZXJ2ZXJdXG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlQmFsYW5jZWRQb29sU3RhdHMoKVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIF91cGRhdGVCYWxhbmNlZFBvb2xTdGF0cyAoKSB7XG4gICAgdGhpc1trR3JlYXRlc3RDb21tb25EaXZpc29yXSA9IHRoaXNba0NsaWVudHNdLm1hcChwID0+IHBba1dlaWdodF0pLnJlZHVjZShnZXRHcmVhdGVzdENvbW1vbkRpdmlzb3IsIDApXG4gIH1cblxuICByZW1vdmVVcHN0cmVhbSAodXBzdHJlYW0pIHtcbiAgICBjb25zdCB1cHN0cmVhbU9yaWdpbiA9IHBhcnNlT3JpZ2luKHVwc3RyZWFtKS5vcmlnaW5cblxuICAgIGNvbnN0IHBvb2wgPSB0aGlzW2tDbGllbnRzXS5maW5kKChwb29sKSA9PiAoXG4gICAgICBwb29sW2tVcmxdLm9yaWdpbiA9PT0gdXBzdHJlYW1PcmlnaW4gJiZcbiAgICAgIHBvb2wuY2xvc2VkICE9PSB0cnVlICYmXG4gICAgICBwb29sLmRlc3Ryb3llZCAhPT0gdHJ1ZVxuICAgICkpXG5cbiAgICBpZiAocG9vbCkge1xuICAgICAgdGhpc1trUmVtb3ZlQ2xpZW50XShwb29sKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBnZXQgdXBzdHJlYW1zICgpIHtcbiAgICByZXR1cm4gdGhpc1trQ2xpZW50c11cbiAgICAgIC5maWx0ZXIoZGlzcGF0Y2hlciA9PiBkaXNwYXRjaGVyLmNsb3NlZCAhPT0gdHJ1ZSAmJiBkaXNwYXRjaGVyLmRlc3Ryb3llZCAhPT0gdHJ1ZSlcbiAgICAgIC5tYXAoKHApID0+IHBba1VybF0ub3JpZ2luKVxuICB9XG5cbiAgW2tHZXREaXNwYXRjaGVyXSAoKSB7XG4gICAgLy8gV2UgdmFsaWRhdGUgdGhhdCBwb29scyBpcyBncmVhdGVyIHRoYW4gMCxcbiAgICAvLyBvdGhlcndpc2Ugd2Ugd291bGQgaGF2ZSB0byB3YWl0IHVudGlsIGFuIHVwc3RyZWFtXG4gICAgLy8gaXMgYWRkZWQsIHdoaWNoIG1pZ2h0IG5ldmVyIGhhcHBlbi5cbiAgICBpZiAodGhpc1trQ2xpZW50c10ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQmFsYW5jZWRQb29sTWlzc2luZ1Vwc3RyZWFtRXJyb3IoKVxuICAgIH1cblxuICAgIGNvbnN0IGRpc3BhdGNoZXIgPSB0aGlzW2tDbGllbnRzXS5maW5kKGRpc3BhdGNoZXIgPT4gKFxuICAgICAgIWRpc3BhdGNoZXJba05lZWREcmFpbl0gJiZcbiAgICAgIGRpc3BhdGNoZXIuY2xvc2VkICE9PSB0cnVlICYmXG4gICAgICBkaXNwYXRjaGVyLmRlc3Ryb3llZCAhPT0gdHJ1ZVxuICAgICkpXG5cbiAgICBpZiAoIWRpc3BhdGNoZXIpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGFsbENsaWVudHNCdXN5ID0gdGhpc1trQ2xpZW50c10ubWFwKHBvb2wgPT4gcG9vbFtrTmVlZERyYWluXSkucmVkdWNlKChhLCBiKSA9PiBhICYmIGIsIHRydWUpXG5cbiAgICBpZiAoYWxsQ2xpZW50c0J1c3kpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxldCBjb3VudGVyID0gMFxuXG4gICAgbGV0IG1heFdlaWdodEluZGV4ID0gdGhpc1trQ2xpZW50c10uZmluZEluZGV4KHBvb2wgPT4gIXBvb2xba05lZWREcmFpbl0pXG5cbiAgICB3aGlsZSAoY291bnRlcisrIDwgdGhpc1trQ2xpZW50c10ubGVuZ3RoKSB7XG4gICAgICB0aGlzW2tJbmRleF0gPSAodGhpc1trSW5kZXhdICsgMSkgJSB0aGlzW2tDbGllbnRzXS5sZW5ndGhcbiAgICAgIGNvbnN0IHBvb2wgPSB0aGlzW2tDbGllbnRzXVt0aGlzW2tJbmRleF1dXG5cbiAgICAgIC8vIGZpbmQgcG9vbCBpbmRleCB3aXRoIHRoZSBsYXJnZXN0IHdlaWdodFxuICAgICAgaWYgKHBvb2xba1dlaWdodF0gPiB0aGlzW2tDbGllbnRzXVttYXhXZWlnaHRJbmRleF1ba1dlaWdodF0gJiYgIXBvb2xba05lZWREcmFpbl0pIHtcbiAgICAgICAgbWF4V2VpZ2h0SW5kZXggPSB0aGlzW2tJbmRleF1cbiAgICAgIH1cblxuICAgICAgLy8gZGVjcmVhc2UgdGhlIGN1cnJlbnQgd2VpZ2h0IGV2ZXJ5IGB0aGlzW2tDbGllbnRzXS5sZW5ndGhgLlxuICAgICAgaWYgKHRoaXNba0luZGV4XSA9PT0gMCkge1xuICAgICAgICAvLyBTZXQgdGhlIGN1cnJlbnQgd2VpZ2h0IHRvIHRoZSBuZXh0IGxvd2VyIHdlaWdodC5cbiAgICAgICAgdGhpc1trQ3VycmVudFdlaWdodF0gPSB0aGlzW2tDdXJyZW50V2VpZ2h0XSAtIHRoaXNba0dyZWF0ZXN0Q29tbW9uRGl2aXNvcl1cblxuICAgICAgICBpZiAodGhpc1trQ3VycmVudFdlaWdodF0gPD0gMCkge1xuICAgICAgICAgIHRoaXNba0N1cnJlbnRXZWlnaHRdID0gdGhpc1trTWF4V2VpZ2h0UGVyU2VydmVyXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocG9vbFtrV2VpZ2h0XSA+PSB0aGlzW2tDdXJyZW50V2VpZ2h0XSAmJiAoIXBvb2xba05lZWREcmFpbl0pKSB7XG4gICAgICAgIHJldHVybiBwb29sXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpc1trQ3VycmVudFdlaWdodF0gPSB0aGlzW2tDbGllbnRzXVttYXhXZWlnaHRJbmRleF1ba1dlaWdodF1cbiAgICB0aGlzW2tJbmRleF0gPSBtYXhXZWlnaHRJbmRleFxuICAgIHJldHVybiB0aGlzW2tDbGllbnRzXVttYXhXZWlnaHRJbmRleF1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEJhbGFuY2VkUG9vbFxuIiwiJ3VzZSBzdHJpY3QnXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBmaWxlOiBvbmx5IGZvciBOb2RlIDEyICovXG5cbmNvbnN0IHsga0Nvbm5lY3RlZCwga1NpemUgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5cbmNsYXNzIENvbXBhdFdlYWtSZWYge1xuICBjb25zdHJ1Y3RvciAodmFsdWUpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWVcbiAgfVxuXG4gIGRlcmVmICgpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZVtrQ29ubmVjdGVkXSA9PT0gMCAmJiB0aGlzLnZhbHVlW2tTaXplXSA9PT0gMFxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogdGhpcy52YWx1ZVxuICB9XG59XG5cbmNsYXNzIENvbXBhdEZpbmFsaXplciB7XG4gIGNvbnN0cnVjdG9yIChmaW5hbGl6ZXIpIHtcbiAgICB0aGlzLmZpbmFsaXplciA9IGZpbmFsaXplclxuICB9XG5cbiAgcmVnaXN0ZXIgKGRpc3BhdGNoZXIsIGtleSkge1xuICAgIGlmIChkaXNwYXRjaGVyLm9uKSB7XG4gICAgICBkaXNwYXRjaGVyLm9uKCdkaXNjb25uZWN0JywgKCkgPT4ge1xuICAgICAgICBpZiAoZGlzcGF0Y2hlcltrQ29ubmVjdGVkXSA9PT0gMCAmJiBkaXNwYXRjaGVyW2tTaXplXSA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuZmluYWxpemVyKGtleSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIEZJWE1FOiByZW1vdmUgd29ya2Fyb3VuZCB3aGVuIHRoZSBOb2RlIGJ1ZyBpcyBmaXhlZFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzQ5MzQ0I2lzc3VlY29tbWVudC0xNzQxNzc2MzA4XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX1Y4X0NPVkVSQUdFKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFdlYWtSZWY6IENvbXBhdFdlYWtSZWYsXG4gICAgICBGaW5hbGl6YXRpb25SZWdpc3RyeTogQ29tcGF0RmluYWxpemVyXG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgV2Vha1JlZjogZ2xvYmFsLldlYWtSZWYgfHwgQ29tcGF0V2Vha1JlZixcbiAgICBGaW5hbGl6YXRpb25SZWdpc3RyeTogZ2xvYmFsLkZpbmFsaXphdGlvblJlZ2lzdHJ5IHx8IENvbXBhdEZpbmFsaXplclxuICB9XG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciB9ID0gcmVxdWlyZSgnLi9jb3JlL2Vycm9ycycpXG5jb25zdCB7IGtDbGllbnRzLCBrUnVubmluZywga0Nsb3NlLCBrRGVzdHJveSwga0Rpc3BhdGNoLCBrSW50ZXJjZXB0b3JzIH0gPSByZXF1aXJlKCcuL2NvcmUvc3ltYm9scycpXG5jb25zdCBEaXNwYXRjaGVyQmFzZSA9IHJlcXVpcmUoJy4vZGlzcGF0Y2hlci1iYXNlJylcbmNvbnN0IFBvb2wgPSByZXF1aXJlKCcuL3Bvb2wnKVxuY29uc3QgQ2xpZW50ID0gcmVxdWlyZSgnLi9jbGllbnQnKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4vY29yZS91dGlsJylcbmNvbnN0IGNyZWF0ZVJlZGlyZWN0SW50ZXJjZXB0b3IgPSByZXF1aXJlKCcuL2ludGVyY2VwdG9yL3JlZGlyZWN0SW50ZXJjZXB0b3InKVxuY29uc3QgeyBXZWFrUmVmLCBGaW5hbGl6YXRpb25SZWdpc3RyeSB9ID0gcmVxdWlyZSgnLi9jb21wYXQvZGlzcGF0Y2hlci13ZWFrcmVmJykoKVxuXG5jb25zdCBrT25Db25uZWN0ID0gU3ltYm9sKCdvbkNvbm5lY3QnKVxuY29uc3Qga09uRGlzY29ubmVjdCA9IFN5bWJvbCgnb25EaXNjb25uZWN0JylcbmNvbnN0IGtPbkNvbm5lY3Rpb25FcnJvciA9IFN5bWJvbCgnb25Db25uZWN0aW9uRXJyb3InKVxuY29uc3Qga01heFJlZGlyZWN0aW9ucyA9IFN5bWJvbCgnbWF4UmVkaXJlY3Rpb25zJylcbmNvbnN0IGtPbkRyYWluID0gU3ltYm9sKCdvbkRyYWluJylcbmNvbnN0IGtGYWN0b3J5ID0gU3ltYm9sKCdmYWN0b3J5JylcbmNvbnN0IGtGaW5hbGl6ZXIgPSBTeW1ib2woJ2ZpbmFsaXplcicpXG5jb25zdCBrT3B0aW9ucyA9IFN5bWJvbCgnb3B0aW9ucycpXG5cbmZ1bmN0aW9uIGRlZmF1bHRGYWN0b3J5IChvcmlnaW4sIG9wdHMpIHtcbiAgcmV0dXJuIG9wdHMgJiYgb3B0cy5jb25uZWN0aW9ucyA9PT0gMVxuICAgID8gbmV3IENsaWVudChvcmlnaW4sIG9wdHMpXG4gICAgOiBuZXcgUG9vbChvcmlnaW4sIG9wdHMpXG59XG5cbmNsYXNzIEFnZW50IGV4dGVuZHMgRGlzcGF0Y2hlckJhc2Uge1xuICBjb25zdHJ1Y3RvciAoeyBmYWN0b3J5ID0gZGVmYXVsdEZhY3RvcnksIG1heFJlZGlyZWN0aW9ucyA9IDAsIGNvbm5lY3QsIC4uLm9wdGlvbnMgfSA9IHt9KSB7XG4gICAgc3VwZXIoKVxuXG4gICAgaWYgKHR5cGVvZiBmYWN0b3J5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ZhY3RvcnkgbXVzdCBiZSBhIGZ1bmN0aW9uLicpXG4gICAgfVxuXG4gICAgaWYgKGNvbm5lY3QgIT0gbnVsbCAmJiB0eXBlb2YgY29ubmVjdCAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgY29ubmVjdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignY29ubmVjdCBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0JylcbiAgICB9XG5cbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobWF4UmVkaXJlY3Rpb25zKSB8fCBtYXhSZWRpcmVjdGlvbnMgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ21heFJlZGlyZWN0aW9ucyBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJylcbiAgICB9XG5cbiAgICBpZiAoY29ubmVjdCAmJiB0eXBlb2YgY29ubmVjdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29ubmVjdCA9IHsgLi4uY29ubmVjdCB9XG4gICAgfVxuXG4gICAgdGhpc1trSW50ZXJjZXB0b3JzXSA9IG9wdGlvbnMuaW50ZXJjZXB0b3JzICYmIG9wdGlvbnMuaW50ZXJjZXB0b3JzLkFnZW50ICYmIEFycmF5LmlzQXJyYXkob3B0aW9ucy5pbnRlcmNlcHRvcnMuQWdlbnQpXG4gICAgICA/IG9wdGlvbnMuaW50ZXJjZXB0b3JzLkFnZW50XG4gICAgICA6IFtjcmVhdGVSZWRpcmVjdEludGVyY2VwdG9yKHsgbWF4UmVkaXJlY3Rpb25zIH0pXVxuXG4gICAgdGhpc1trT3B0aW9uc10gPSB7IC4uLnV0aWwuZGVlcENsb25lKG9wdGlvbnMpLCBjb25uZWN0IH1cbiAgICB0aGlzW2tPcHRpb25zXS5pbnRlcmNlcHRvcnMgPSBvcHRpb25zLmludGVyY2VwdG9yc1xuICAgICAgPyB7IC4uLm9wdGlvbnMuaW50ZXJjZXB0b3JzIH1cbiAgICAgIDogdW5kZWZpbmVkXG4gICAgdGhpc1trTWF4UmVkaXJlY3Rpb25zXSA9IG1heFJlZGlyZWN0aW9uc1xuICAgIHRoaXNba0ZhY3RvcnldID0gZmFjdG9yeVxuICAgIHRoaXNba0NsaWVudHNdID0gbmV3IE1hcCgpXG4gICAgdGhpc1trRmluYWxpemVyXSA9IG5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeSgvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogZ2MgaXMgdW5kZXRlcm1pbmlzdGljICovIGtleSA9PiB7XG4gICAgICBjb25zdCByZWYgPSB0aGlzW2tDbGllbnRzXS5nZXQoa2V5KVxuICAgICAgaWYgKHJlZiAhPT0gdW5kZWZpbmVkICYmIHJlZi5kZXJlZigpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpc1trQ2xpZW50c10uZGVsZXRlKGtleSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgYWdlbnQgPSB0aGlzXG5cbiAgICB0aGlzW2tPbkRyYWluXSA9IChvcmlnaW4sIHRhcmdldHMpID0+IHtcbiAgICAgIGFnZW50LmVtaXQoJ2RyYWluJywgb3JpZ2luLCBbYWdlbnQsIC4uLnRhcmdldHNdKVxuICAgIH1cblxuICAgIHRoaXNba09uQ29ubmVjdF0gPSAob3JpZ2luLCB0YXJnZXRzKSA9PiB7XG4gICAgICBhZ2VudC5lbWl0KCdjb25uZWN0Jywgb3JpZ2luLCBbYWdlbnQsIC4uLnRhcmdldHNdKVxuICAgIH1cblxuICAgIHRoaXNba09uRGlzY29ubmVjdF0gPSAob3JpZ2luLCB0YXJnZXRzLCBlcnIpID0+IHtcbiAgICAgIGFnZW50LmVtaXQoJ2Rpc2Nvbm5lY3QnLCBvcmlnaW4sIFthZ2VudCwgLi4udGFyZ2V0c10sIGVycilcbiAgICB9XG5cbiAgICB0aGlzW2tPbkNvbm5lY3Rpb25FcnJvcl0gPSAob3JpZ2luLCB0YXJnZXRzLCBlcnIpID0+IHtcbiAgICAgIGFnZW50LmVtaXQoJ2Nvbm5lY3Rpb25FcnJvcicsIG9yaWdpbiwgW2FnZW50LCAuLi50YXJnZXRzXSwgZXJyKVxuICAgIH1cbiAgfVxuXG4gIGdldCBba1J1bm5pbmddICgpIHtcbiAgICBsZXQgcmV0ID0gMFxuICAgIGZvciAoY29uc3QgcmVmIG9mIHRoaXNba0NsaWVudHNdLnZhbHVlcygpKSB7XG4gICAgICBjb25zdCBjbGllbnQgPSByZWYuZGVyZWYoKVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGdjIGlzIHVuZGV0ZXJtaW5pc3RpYyAqL1xuICAgICAgaWYgKGNsaWVudCkge1xuICAgICAgICByZXQgKz0gY2xpZW50W2tSdW5uaW5nXVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0XG4gIH1cblxuICBba0Rpc3BhdGNoXSAob3B0cywgaGFuZGxlcikge1xuICAgIGxldCBrZXlcbiAgICBpZiAob3B0cy5vcmlnaW4gJiYgKHR5cGVvZiBvcHRzLm9yaWdpbiA9PT0gJ3N0cmluZycgfHwgb3B0cy5vcmlnaW4gaW5zdGFuY2VvZiBVUkwpKSB7XG4gICAgICBrZXkgPSBTdHJpbmcob3B0cy5vcmlnaW4pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignb3B0cy5vcmlnaW4gbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgVVJMLicpXG4gICAgfVxuXG4gICAgY29uc3QgcmVmID0gdGhpc1trQ2xpZW50c10uZ2V0KGtleSlcblxuICAgIGxldCBkaXNwYXRjaGVyID0gcmVmID8gcmVmLmRlcmVmKCkgOiBudWxsXG4gICAgaWYgKCFkaXNwYXRjaGVyKSB7XG4gICAgICBkaXNwYXRjaGVyID0gdGhpc1trRmFjdG9yeV0ob3B0cy5vcmlnaW4sIHRoaXNba09wdGlvbnNdKVxuICAgICAgICAub24oJ2RyYWluJywgdGhpc1trT25EcmFpbl0pXG4gICAgICAgIC5vbignY29ubmVjdCcsIHRoaXNba09uQ29ubmVjdF0pXG4gICAgICAgIC5vbignZGlzY29ubmVjdCcsIHRoaXNba09uRGlzY29ubmVjdF0pXG4gICAgICAgIC5vbignY29ubmVjdGlvbkVycm9yJywgdGhpc1trT25Db25uZWN0aW9uRXJyb3JdKVxuXG4gICAgICB0aGlzW2tDbGllbnRzXS5zZXQoa2V5LCBuZXcgV2Vha1JlZihkaXNwYXRjaGVyKSlcbiAgICAgIHRoaXNba0ZpbmFsaXplcl0ucmVnaXN0ZXIoZGlzcGF0Y2hlciwga2V5KVxuICAgIH1cblxuICAgIHJldHVybiBkaXNwYXRjaGVyLmRpc3BhdGNoKG9wdHMsIGhhbmRsZXIpXG4gIH1cblxuICBhc3luYyBba0Nsb3NlXSAoKSB7XG4gICAgY29uc3QgY2xvc2VQcm9taXNlcyA9IFtdXG4gICAgZm9yIChjb25zdCByZWYgb2YgdGhpc1trQ2xpZW50c10udmFsdWVzKCkpIHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IHJlZi5kZXJlZigpXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZTogZ2MgaXMgdW5kZXRlcm1pbmlzdGljICovXG4gICAgICBpZiAoY2xpZW50KSB7XG4gICAgICAgIGNsb3NlUHJvbWlzZXMucHVzaChjbGllbnQuY2xvc2UoKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChjbG9zZVByb21pc2VzKVxuICB9XG5cbiAgYXN5bmMgW2tEZXN0cm95XSAoZXJyKSB7XG4gICAgY29uc3QgZGVzdHJveVByb21pc2VzID0gW11cbiAgICBmb3IgKGNvbnN0IHJlZiBvZiB0aGlzW2tDbGllbnRzXS52YWx1ZXMoKSkge1xuICAgICAgY29uc3QgY2xpZW50ID0gcmVmLmRlcmVmKClcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBnYyBpcyB1bmRldGVybWluaXN0aWMgKi9cbiAgICAgIGlmIChjbGllbnQpIHtcbiAgICAgICAgZGVzdHJveVByb21pc2VzLnB1c2goY2xpZW50LmRlc3Ryb3koZXJyKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChkZXN0cm95UHJvbWlzZXMpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBBZ2VudFxuIiwiLy8gUG9ydGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvcHVsbC85MDdcblxuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5jb25zdCB7IFJlYWRhYmxlIH0gPSByZXF1aXJlKCdzdHJlYW0nKVxuY29uc3QgeyBSZXF1ZXN0QWJvcnRlZEVycm9yLCBOb3RTdXBwb3J0ZWRFcnJvciwgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBSZWFkYWJsZVN0cmVhbUZyb20sIHRvVVNWU3RyaW5nIH0gPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuXG5sZXQgQmxvYlxuXG5jb25zdCBrQ29uc3VtZSA9IFN5bWJvbCgna0NvbnN1bWUnKVxuY29uc3Qga1JlYWRpbmcgPSBTeW1ib2woJ2tSZWFkaW5nJylcbmNvbnN0IGtCb2R5ID0gU3ltYm9sKCdrQm9keScpXG5jb25zdCBrQWJvcnQgPSBTeW1ib2woJ2Fib3J0JylcbmNvbnN0IGtDb250ZW50VHlwZSA9IFN5bWJvbCgna0NvbnRlbnRUeXBlJylcblxuY29uc3Qgbm9vcCA9ICgpID0+IHt9XG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgQm9keVJlYWRhYmxlIGV4dGVuZHMgUmVhZGFibGUge1xuICBjb25zdHJ1Y3RvciAoe1xuICAgIHJlc3VtZSxcbiAgICBhYm9ydCxcbiAgICBjb250ZW50VHlwZSA9ICcnLFxuICAgIGhpZ2hXYXRlck1hcmsgPSA2NCAqIDEwMjQgLy8gU2FtZSBhcyBub2RlanMgZnMgc3RyZWFtcy5cbiAgfSkge1xuICAgIHN1cGVyKHtcbiAgICAgIGF1dG9EZXN0cm95OiB0cnVlLFxuICAgICAgcmVhZDogcmVzdW1lLFxuICAgICAgaGlnaFdhdGVyTWFya1xuICAgIH0pXG5cbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRhdGFFbWl0dGVkID0gZmFsc2VcblxuICAgIHRoaXNba0Fib3J0XSA9IGFib3J0XG4gICAgdGhpc1trQ29uc3VtZV0gPSBudWxsXG4gICAgdGhpc1trQm9keV0gPSBudWxsXG4gICAgdGhpc1trQ29udGVudFR5cGVdID0gY29udGVudFR5cGVcblxuICAgIC8vIElzIHN0cmVhbSBiZWluZyBjb25zdW1lZCB0aHJvdWdoIFJlYWRhYmxlIEFQST9cbiAgICAvLyBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBzbyB0aGF0IHdlIGF2b2lkIGNoZWNraW5nXG4gICAgLy8gZm9yICdkYXRhJyBhbmQgJ3JlYWRhYmxlJyBsaXN0ZW5lcnMgaW4gdGhlIGhvdCBwYXRoXG4gICAgLy8gaW5zaWRlIHB1c2goKS5cbiAgICB0aGlzW2tSZWFkaW5nXSA9IGZhbHNlXG4gIH1cblxuICBkZXN0cm95IChlcnIpIHtcbiAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgIC8vIE5vZGUgPCAxNlxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBpZiAoIWVyciAmJiAhdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgICBlcnIgPSBuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpXG4gICAgfVxuXG4gICAgaWYgKGVycikge1xuICAgICAgdGhpc1trQWJvcnRdKClcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuZGVzdHJveShlcnIpXG4gIH1cblxuICBlbWl0IChldiwgLi4uYXJncykge1xuICAgIGlmIChldiA9PT0gJ2RhdGEnKSB7XG4gICAgICAvLyBOb2RlIDwgMTYuN1xuICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kYXRhRW1pdHRlZCA9IHRydWVcbiAgICB9IGVsc2UgaWYgKGV2ID09PSAnZXJyb3InKSB7XG4gICAgICAvLyBOb2RlIDwgMTZcbiAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gc3VwZXIuZW1pdChldiwgLi4uYXJncylcbiAgfVxuXG4gIG9uIChldiwgLi4uYXJncykge1xuICAgIGlmIChldiA9PT0gJ2RhdGEnIHx8IGV2ID09PSAncmVhZGFibGUnKSB7XG4gICAgICB0aGlzW2tSZWFkaW5nXSA9IHRydWVcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLm9uKGV2LCAuLi5hcmdzKVxuICB9XG5cbiAgYWRkTGlzdGVuZXIgKGV2LCAuLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMub24oZXYsIC4uLmFyZ3MpXG4gIH1cblxuICBvZmYgKGV2LCAuLi5hcmdzKSB7XG4gICAgY29uc3QgcmV0ID0gc3VwZXIub2ZmKGV2LCAuLi5hcmdzKVxuICAgIGlmIChldiA9PT0gJ2RhdGEnIHx8IGV2ID09PSAncmVhZGFibGUnKSB7XG4gICAgICB0aGlzW2tSZWFkaW5nXSA9IChcbiAgICAgICAgdGhpcy5saXN0ZW5lckNvdW50KCdkYXRhJykgPiAwIHx8XG4gICAgICAgIHRoaXMubGlzdGVuZXJDb3VudCgncmVhZGFibGUnKSA+IDBcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIHJldFxuICB9XG5cbiAgcmVtb3ZlTGlzdGVuZXIgKGV2LCAuLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMub2ZmKGV2LCAuLi5hcmdzKVxuICB9XG5cbiAgcHVzaCAoY2h1bmspIHtcbiAgICBpZiAodGhpc1trQ29uc3VtZV0gJiYgY2h1bmsgIT09IG51bGwgJiYgdGhpcy5yZWFkYWJsZUxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3VtZVB1c2godGhpc1trQ29uc3VtZV0sIGNodW5rKVxuICAgICAgcmV0dXJuIHRoaXNba1JlYWRpbmddID8gc3VwZXIucHVzaChjaHVuaykgOiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBzdXBlci5wdXNoKGNodW5rKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ib2R5LXRleHRcbiAgYXN5bmMgdGV4dCAoKSB7XG4gICAgcmV0dXJuIGNvbnN1bWUodGhpcywgJ3RleHQnKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ib2R5LWpzb25cbiAgYXN5bmMganNvbiAoKSB7XG4gICAgcmV0dXJuIGNvbnN1bWUodGhpcywgJ2pzb24nKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ib2R5LWJsb2JcbiAgYXN5bmMgYmxvYiAoKSB7XG4gICAgcmV0dXJuIGNvbnN1bWUodGhpcywgJ2Jsb2InKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ib2R5LWFycmF5YnVmZmVyXG4gIGFzeW5jIGFycmF5QnVmZmVyICgpIHtcbiAgICByZXR1cm4gY29uc3VtZSh0aGlzLCAnYXJyYXlCdWZmZXInKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ib2R5LWZvcm1kYXRhXG4gIGFzeW5jIGZvcm1EYXRhICgpIHtcbiAgICAvLyBUT0RPOiBJbXBsZW1lbnQuXG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEVycm9yKClcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkb20tYm9keS1ib2R5dXNlZFxuICBnZXQgYm9keVVzZWQgKCkge1xuICAgIHJldHVybiB1dGlsLmlzRGlzdHVyYmVkKHRoaXMpXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWJvZHktYm9keVxuICBnZXQgYm9keSAoKSB7XG4gICAgaWYgKCF0aGlzW2tCb2R5XSkge1xuICAgICAgdGhpc1trQm9keV0gPSBSZWFkYWJsZVN0cmVhbUZyb20odGhpcylcbiAgICAgIGlmICh0aGlzW2tDb25zdW1lXSkge1xuICAgICAgICAvLyBUT0RPOiBJcyB0aGlzIHRoZSBiZXN0IHdheSB0byBmb3JjZSBhIGxvY2s/XG4gICAgICAgIHRoaXNba0JvZHldLmdldFJlYWRlcigpIC8vIEVuc3VyZSBzdHJlYW0gaXMgbG9ja2VkLlxuICAgICAgICBhc3NlcnQodGhpc1trQm9keV0ubG9ja2VkKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpc1trQm9keV1cbiAgfVxuXG4gIGR1bXAgKG9wdHMpIHtcbiAgICBsZXQgbGltaXQgPSBvcHRzICYmIE51bWJlci5pc0Zpbml0ZShvcHRzLmxpbWl0KSA/IG9wdHMubGltaXQgOiAyNjIxNDRcbiAgICBjb25zdCBzaWduYWwgPSBvcHRzICYmIG9wdHMuc2lnbmFsXG5cbiAgICBpZiAoc2lnbmFsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNpZ25hbCAhPT0gJ29iamVjdCcgfHwgISgnYWJvcnRlZCcgaW4gc2lnbmFsKSkge1xuICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignc2lnbmFsIG11c3QgYmUgYW4gQWJvcnRTaWduYWwnKVxuICAgICAgICB9XG4gICAgICAgIHV0aWwudGhyb3dJZkFib3J0ZWQoc2lnbmFsKVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHNpZ25hbExpc3RlbmVyQ2xlYW51cCA9IHNpZ25hbFxuICAgICAgICA/IHV0aWwuYWRkQWJvcnRMaXN0ZW5lcihzaWduYWwsICgpID0+IHtcbiAgICAgICAgICB0aGlzLmRlc3Ryb3koKVxuICAgICAgICB9KVxuICAgICAgICA6IG5vb3BcblxuICAgICAgdGhpc1xuICAgICAgICAub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNpZ25hbExpc3RlbmVyQ2xlYW51cCgpXG4gICAgICAgICAgaWYgKHNpZ25hbCAmJiBzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgcmVqZWN0KHNpZ25hbC5yZWFzb24gfHwgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQnKSwgeyBuYW1lOiAnQWJvcnRFcnJvcicgfSkpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmUobnVsbClcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5vbignZXJyb3InLCBub29wKVxuICAgICAgICAub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgICAgICBsaW1pdCAtPSBjaHVuay5sZW5ndGhcbiAgICAgICAgICBpZiAobGltaXQgPD0gMCkge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95KClcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5yZXN1bWUoKVxuICAgIH0pXG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9zdHJlYW1zLnNwZWMud2hhdHdnLm9yZy8jcmVhZGFibGVzdHJlYW0tbG9ja2VkXG5mdW5jdGlvbiBpc0xvY2tlZCAoc2VsZikge1xuICAvLyBDb25zdW1lIGlzIGFuIGltcGxpY2l0IGxvY2suXG4gIHJldHVybiAoc2VsZltrQm9keV0gJiYgc2VsZltrQm9keV0ubG9ja2VkID09PSB0cnVlKSB8fCBzZWxmW2tDb25zdW1lXVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jYm9keS11bnVzYWJsZVxuZnVuY3Rpb24gaXNVbnVzYWJsZSAoc2VsZikge1xuICByZXR1cm4gdXRpbC5pc0Rpc3R1cmJlZChzZWxmKSB8fCBpc0xvY2tlZChzZWxmKVxufVxuXG5hc3luYyBmdW5jdGlvbiBjb25zdW1lIChzdHJlYW0sIHR5cGUpIHtcbiAgaWYgKGlzVW51c2FibGUoc3RyZWFtKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3VudXNhYmxlJylcbiAgfVxuXG4gIGFzc2VydCghc3RyZWFtW2tDb25zdW1lXSlcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHN0cmVhbVtrQ29uc3VtZV0gPSB7XG4gICAgICB0eXBlLFxuICAgICAgc3RyZWFtLFxuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdCxcbiAgICAgIGxlbmd0aDogMCxcbiAgICAgIGJvZHk6IFtdXG4gICAgfVxuXG4gICAgc3RyZWFtXG4gICAgICAub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBjb25zdW1lRmluaXNoKHRoaXNba0NvbnN1bWVdLCBlcnIpXG4gICAgICB9KVxuICAgICAgLm9uKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXNba0NvbnN1bWVdLmJvZHkgIT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdW1lRmluaXNoKHRoaXNba0NvbnN1bWVdLCBuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgcHJvY2Vzcy5uZXh0VGljayhjb25zdW1lU3RhcnQsIHN0cmVhbVtrQ29uc3VtZV0pXG4gIH0pXG59XG5cbmZ1bmN0aW9uIGNvbnN1bWVTdGFydCAoY29uc3VtZSkge1xuICBpZiAoY29uc3VtZS5ib2R5ID09PSBudWxsKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB7IF9yZWFkYWJsZVN0YXRlOiBzdGF0ZSB9ID0gY29uc3VtZS5zdHJlYW1cblxuICBmb3IgKGNvbnN0IGNodW5rIG9mIHN0YXRlLmJ1ZmZlcikge1xuICAgIGNvbnN1bWVQdXNoKGNvbnN1bWUsIGNodW5rKVxuICB9XG5cbiAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICBjb25zdW1lRW5kKHRoaXNba0NvbnN1bWVdKVxuICB9IGVsc2Uge1xuICAgIGNvbnN1bWUuc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdW1lRW5kKHRoaXNba0NvbnN1bWVdKVxuICAgIH0pXG4gIH1cblxuICBjb25zdW1lLnN0cmVhbS5yZXN1bWUoKVxuXG4gIHdoaWxlIChjb25zdW1lLnN0cmVhbS5yZWFkKCkgIT0gbnVsbCkge1xuICAgIC8vIExvb3BcbiAgfVxufVxuXG5mdW5jdGlvbiBjb25zdW1lRW5kIChjb25zdW1lKSB7XG4gIGNvbnN0IHsgdHlwZSwgYm9keSwgcmVzb2x2ZSwgc3RyZWFtLCBsZW5ndGggfSA9IGNvbnN1bWVcblxuICB0cnkge1xuICAgIGlmICh0eXBlID09PSAndGV4dCcpIHtcbiAgICAgIHJlc29sdmUodG9VU1ZTdHJpbmcoQnVmZmVyLmNvbmNhdChib2R5KSkpXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnanNvbicpIHtcbiAgICAgIHJlc29sdmUoSlNPTi5wYXJzZShCdWZmZXIuY29uY2F0KGJvZHkpKSlcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhcnJheUJ1ZmZlcicpIHtcbiAgICAgIGNvbnN0IGRzdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcblxuICAgICAgbGV0IHBvcyA9IDBcbiAgICAgIGZvciAoY29uc3QgYnVmIG9mIGJvZHkpIHtcbiAgICAgICAgZHN0LnNldChidWYsIHBvcylcbiAgICAgICAgcG9zICs9IGJ1Zi5ieXRlTGVuZ3RoXG4gICAgICB9XG5cbiAgICAgIHJlc29sdmUoZHN0LmJ1ZmZlcilcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdibG9iJykge1xuICAgICAgaWYgKCFCbG9iKSB7XG4gICAgICAgIEJsb2IgPSByZXF1aXJlKCdidWZmZXInKS5CbG9iXG4gICAgICB9XG4gICAgICByZXNvbHZlKG5ldyBCbG9iKGJvZHksIHsgdHlwZTogc3RyZWFtW2tDb250ZW50VHlwZV0gfSkpXG4gICAgfVxuXG4gICAgY29uc3VtZUZpbmlzaChjb25zdW1lKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBzdHJlYW0uZGVzdHJveShlcnIpXG4gIH1cbn1cblxuZnVuY3Rpb24gY29uc3VtZVB1c2ggKGNvbnN1bWUsIGNodW5rKSB7XG4gIGNvbnN1bWUubGVuZ3RoICs9IGNodW5rLmxlbmd0aFxuICBjb25zdW1lLmJvZHkucHVzaChjaHVuaylcbn1cblxuZnVuY3Rpb24gY29uc3VtZUZpbmlzaCAoY29uc3VtZSwgZXJyKSB7XG4gIGlmIChjb25zdW1lLmJvZHkgPT09IG51bGwpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChlcnIpIHtcbiAgICBjb25zdW1lLnJlamVjdChlcnIpXG4gIH0gZWxzZSB7XG4gICAgY29uc3VtZS5yZXNvbHZlKClcbiAgfVxuXG4gIGNvbnN1bWUudHlwZSA9IG51bGxcbiAgY29uc3VtZS5zdHJlYW0gPSBudWxsXG4gIGNvbnN1bWUucmVzb2x2ZSA9IG51bGxcbiAgY29uc3VtZS5yZWplY3QgPSBudWxsXG4gIGNvbnN1bWUubGVuZ3RoID0gMFxuICBjb25zdW1lLmJvZHkgPSBudWxsXG59XG4iLCJjb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuY29uc3Qge1xuICBSZXNwb25zZVN0YXR1c0NvZGVFcnJvclxufSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcbmNvbnN0IHsgdG9VU1ZTdHJpbmcgfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5cbmFzeW5jIGZ1bmN0aW9uIGdldFJlc29sdmVFcnJvckJvZHlDYWxsYmFjayAoeyBjYWxsYmFjaywgYm9keSwgY29udGVudFR5cGUsIHN0YXR1c0NvZGUsIHN0YXR1c01lc3NhZ2UsIGhlYWRlcnMgfSkge1xuICBhc3NlcnQoYm9keSlcblxuICBsZXQgY2h1bmtzID0gW11cbiAgbGV0IGxpbWl0ID0gMFxuXG4gIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgYm9keSkge1xuICAgIGNodW5rcy5wdXNoKGNodW5rKVxuICAgIGxpbWl0ICs9IGNodW5rLmxlbmd0aFxuICAgIGlmIChsaW1pdCA+IDEyOCAqIDEwMjQpIHtcbiAgICAgIGNodW5rcyA9IG51bGxcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXR1c0NvZGUgPT09IDIwNCB8fCAhY29udGVudFR5cGUgfHwgIWNodW5rcykge1xuICAgIHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2ssIG5ldyBSZXNwb25zZVN0YXR1c0NvZGVFcnJvcihgUmVzcG9uc2Ugc3RhdHVzIGNvZGUgJHtzdGF0dXNDb2RlfSR7c3RhdHVzTWVzc2FnZSA/IGA6ICR7c3RhdHVzTWVzc2FnZX1gIDogJyd9YCwgc3RhdHVzQ29kZSwgaGVhZGVycykpXG4gICAgcmV0dXJuXG4gIH1cblxuICB0cnkge1xuICAgIGlmIChjb250ZW50VHlwZS5zdGFydHNXaXRoKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSBKU09OLnBhcnNlKHRvVVNWU3RyaW5nKEJ1ZmZlci5jb25jYXQoY2h1bmtzKSkpXG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrLCBuZXcgUmVzcG9uc2VTdGF0dXNDb2RlRXJyb3IoYFJlc3BvbnNlIHN0YXR1cyBjb2RlICR7c3RhdHVzQ29kZX0ke3N0YXR1c01lc3NhZ2UgPyBgOiAke3N0YXR1c01lc3NhZ2V9YCA6ICcnfWAsIHN0YXR1c0NvZGUsIGhlYWRlcnMsIHBheWxvYWQpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGNvbnRlbnRUeXBlLnN0YXJ0c1dpdGgoJ3RleHQvJykpIHtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB0b1VTVlN0cmluZyhCdWZmZXIuY29uY2F0KGNodW5rcykpXG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrLCBuZXcgUmVzcG9uc2VTdGF0dXNDb2RlRXJyb3IoYFJlc3BvbnNlIHN0YXR1cyBjb2RlICR7c3RhdHVzQ29kZX0ke3N0YXR1c01lc3NhZ2UgPyBgOiAke3N0YXR1c01lc3NhZ2V9YCA6ICcnfWAsIHN0YXR1c0NvZGUsIGhlYWRlcnMsIHBheWxvYWQpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBQcm9jZXNzIGluIGEgZmFsbGJhY2sgaWYgZXJyb3JcbiAgfVxuXG4gIHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2ssIG5ldyBSZXNwb25zZVN0YXR1c0NvZGVFcnJvcihgUmVzcG9uc2Ugc3RhdHVzIGNvZGUgJHtzdGF0dXNDb2RlfSR7c3RhdHVzTWVzc2FnZSA/IGA6ICR7c3RhdHVzTWVzc2FnZX1gIDogJyd9YCwgc3RhdHVzQ29kZSwgaGVhZGVycykpXG59XG5cbm1vZHVsZS5leHBvcnRzID0geyBnZXRSZXNvbHZlRXJyb3JCb2R5Q2FsbGJhY2sgfVxuIiwiY29uc3QgeyBhZGRBYm9ydExpc3RlbmVyIH0gPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBSZXF1ZXN0QWJvcnRlZEVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5cbmNvbnN0IGtMaXN0ZW5lciA9IFN5bWJvbCgna0xpc3RlbmVyJylcbmNvbnN0IGtTaWduYWwgPSBTeW1ib2woJ2tTaWduYWwnKVxuXG5mdW5jdGlvbiBhYm9ydCAoc2VsZikge1xuICBpZiAoc2VsZi5hYm9ydCkge1xuICAgIHNlbGYuYWJvcnQoKVxuICB9IGVsc2Uge1xuICAgIHNlbGYub25FcnJvcihuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZFNpZ25hbCAoc2VsZiwgc2lnbmFsKSB7XG4gIHNlbGZba1NpZ25hbF0gPSBudWxsXG4gIHNlbGZba0xpc3RlbmVyXSA9IG51bGxcblxuICBpZiAoIXNpZ25hbCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgYWJvcnQoc2VsZilcbiAgICByZXR1cm5cbiAgfVxuXG4gIHNlbGZba1NpZ25hbF0gPSBzaWduYWxcbiAgc2VsZltrTGlzdGVuZXJdID0gKCkgPT4ge1xuICAgIGFib3J0KHNlbGYpXG4gIH1cblxuICBhZGRBYm9ydExpc3RlbmVyKHNlbGZba1NpZ25hbF0sIHNlbGZba0xpc3RlbmVyXSlcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU2lnbmFsIChzZWxmKSB7XG4gIGlmICghc2VsZltrU2lnbmFsXSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKCdyZW1vdmVFdmVudExpc3RlbmVyJyBpbiBzZWxmW2tTaWduYWxdKSB7XG4gICAgc2VsZltrU2lnbmFsXS5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIHNlbGZba0xpc3RlbmVyXSlcbiAgfSBlbHNlIHtcbiAgICBzZWxmW2tTaWduYWxdLnJlbW92ZUxpc3RlbmVyKCdhYm9ydCcsIHNlbGZba0xpc3RlbmVyXSlcbiAgfVxuXG4gIHNlbGZba1NpZ25hbF0gPSBudWxsXG4gIHNlbGZba0xpc3RlbmVyXSA9IG51bGxcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGFkZFNpZ25hbCxcbiAgcmVtb3ZlU2lnbmFsXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgUmVhZGFibGUgPSByZXF1aXJlKCcuL3JlYWRhYmxlJylcbmNvbnN0IHtcbiAgSW52YWxpZEFyZ3VtZW50RXJyb3IsXG4gIFJlcXVlc3RBYm9ydGVkRXJyb3Jcbn0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgZ2V0UmVzb2x2ZUVycm9yQm9keUNhbGxiYWNrIH0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3QgeyBBc3luY1Jlc291cmNlIH0gPSByZXF1aXJlKCdhc3luY19ob29rcycpXG5jb25zdCB7IGFkZFNpZ25hbCwgcmVtb3ZlU2lnbmFsIH0gPSByZXF1aXJlKCcuL2Fib3J0LXNpZ25hbCcpXG5cbmNsYXNzIFJlcXVlc3RIYW5kbGVyIGV4dGVuZHMgQXN5bmNSZXNvdXJjZSB7XG4gIGNvbnN0cnVjdG9yIChvcHRzLCBjYWxsYmFjaykge1xuICAgIGlmICghb3B0cyB8fCB0eXBlb2Ygb3B0cyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvcHRzJylcbiAgICB9XG5cbiAgICBjb25zdCB7IHNpZ25hbCwgbWV0aG9kLCBvcGFxdWUsIGJvZHksIG9uSW5mbywgcmVzcG9uc2VIZWFkZXJzLCB0aHJvd09uRXJyb3IsIGhpZ2hXYXRlck1hcmsgfSA9IG9wdHNcblxuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBjYWxsYmFjaycpXG4gICAgICB9XG5cbiAgICAgIGlmIChoaWdoV2F0ZXJNYXJrICYmICh0eXBlb2YgaGlnaFdhdGVyTWFyayAhPT0gJ251bWJlcicgfHwgaGlnaFdhdGVyTWFyayA8IDApKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBoaWdoV2F0ZXJNYXJrJylcbiAgICAgIH1cblxuICAgICAgaWYgKHNpZ25hbCAmJiB0eXBlb2Ygc2lnbmFsLm9uICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3NpZ25hbCBtdXN0IGJlIGFuIEV2ZW50RW1pdHRlciBvciBFdmVudFRhcmdldCcpXG4gICAgICB9XG5cbiAgICAgIGlmIChtZXRob2QgPT09ICdDT05ORUNUJykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgbWV0aG9kJylcbiAgICAgIH1cblxuICAgICAgaWYgKG9uSW5mbyAmJiB0eXBlb2Ygb25JbmZvICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvbkluZm8gY2FsbGJhY2snKVxuICAgICAgfVxuXG4gICAgICBzdXBlcignVU5ESUNJX1JFUVVFU1QnKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKHV0aWwuaXNTdHJlYW0oYm9keSkpIHtcbiAgICAgICAgdXRpbC5kZXN0cm95KGJvZHkub24oJ2Vycm9yJywgdXRpbC5ub3ApLCBlcnIpXG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG5cbiAgICB0aGlzLnJlc3BvbnNlSGVhZGVycyA9IHJlc3BvbnNlSGVhZGVycyB8fCBudWxsXG4gICAgdGhpcy5vcGFxdWUgPSBvcGFxdWUgfHwgbnVsbFxuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHRoaXMucmVzID0gbnVsbFxuICAgIHRoaXMuYWJvcnQgPSBudWxsXG4gICAgdGhpcy5ib2R5ID0gYm9keVxuICAgIHRoaXMudHJhaWxlcnMgPSB7fVxuICAgIHRoaXMuY29udGV4dCA9IG51bGxcbiAgICB0aGlzLm9uSW5mbyA9IG9uSW5mbyB8fCBudWxsXG4gICAgdGhpcy50aHJvd09uRXJyb3IgPSB0aHJvd09uRXJyb3JcbiAgICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBoaWdoV2F0ZXJNYXJrXG5cbiAgICBpZiAodXRpbC5pc1N0cmVhbShib2R5KSkge1xuICAgICAgYm9keS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMub25FcnJvcihlcnIpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGFkZFNpZ25hbCh0aGlzLCBzaWduYWwpXG4gIH1cblxuICBvbkNvbm5lY3QgKGFib3J0LCBjb250ZXh0KSB7XG4gICAgaWYgKCF0aGlzLmNhbGxiYWNrKSB7XG4gICAgICB0aHJvdyBuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpXG4gICAgfVxuXG4gICAgdGhpcy5hYm9ydCA9IGFib3J0XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dFxuICB9XG5cbiAgb25IZWFkZXJzIChzdGF0dXNDb2RlLCByYXdIZWFkZXJzLCByZXN1bWUsIHN0YXR1c01lc3NhZ2UpIHtcbiAgICBjb25zdCB7IGNhbGxiYWNrLCBvcGFxdWUsIGFib3J0LCBjb250ZXh0LCByZXNwb25zZUhlYWRlcnMsIGhpZ2hXYXRlck1hcmsgfSA9IHRoaXNcblxuICAgIGNvbnN0IGhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMgPT09ICdyYXcnID8gdXRpbC5wYXJzZVJhd0hlYWRlcnMocmF3SGVhZGVycykgOiB1dGlsLnBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKVxuXG4gICAgaWYgKHN0YXR1c0NvZGUgPCAyMDApIHtcbiAgICAgIGlmICh0aGlzLm9uSW5mbykge1xuICAgICAgICB0aGlzLm9uSW5mbyh7IHN0YXR1c0NvZGUsIGhlYWRlcnMgfSlcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZEhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMgPT09ICdyYXcnID8gdXRpbC5wYXJzZUhlYWRlcnMocmF3SGVhZGVycykgOiBoZWFkZXJzXG4gICAgY29uc3QgY29udGVudFR5cGUgPSBwYXJzZWRIZWFkZXJzWydjb250ZW50LXR5cGUnXVxuICAgIGNvbnN0IGJvZHkgPSBuZXcgUmVhZGFibGUoeyByZXN1bWUsIGFib3J0LCBjb250ZW50VHlwZSwgaGlnaFdhdGVyTWFyayB9KVxuXG4gICAgdGhpcy5jYWxsYmFjayA9IG51bGxcbiAgICB0aGlzLnJlcyA9IGJvZHlcbiAgICBpZiAoY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIGlmICh0aGlzLnRocm93T25FcnJvciAmJiBzdGF0dXNDb2RlID49IDQwMCkge1xuICAgICAgICB0aGlzLnJ1bkluQXN5bmNTY29wZShnZXRSZXNvbHZlRXJyb3JCb2R5Q2FsbGJhY2ssIG51bGwsXG4gICAgICAgICAgeyBjYWxsYmFjaywgYm9keSwgY29udGVudFR5cGUsIHN0YXR1c0NvZGUsIHN0YXR1c01lc3NhZ2UsIGhlYWRlcnMgfVxuICAgICAgICApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJ1bkluQXN5bmNTY29wZShjYWxsYmFjaywgbnVsbCwgbnVsbCwge1xuICAgICAgICAgIHN0YXR1c0NvZGUsXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICB0cmFpbGVyczogdGhpcy50cmFpbGVycyxcbiAgICAgICAgICBvcGFxdWUsXG4gICAgICAgICAgYm9keSxcbiAgICAgICAgICBjb250ZXh0XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25EYXRhIChjaHVuaykge1xuICAgIGNvbnN0IHsgcmVzIH0gPSB0aGlzXG4gICAgcmV0dXJuIHJlcy5wdXNoKGNodW5rKVxuICB9XG5cbiAgb25Db21wbGV0ZSAodHJhaWxlcnMpIHtcbiAgICBjb25zdCB7IHJlcyB9ID0gdGhpc1xuXG4gICAgcmVtb3ZlU2lnbmFsKHRoaXMpXG5cbiAgICB1dGlsLnBhcnNlSGVhZGVycyh0cmFpbGVycywgdGhpcy50cmFpbGVycylcblxuICAgIHJlcy5wdXNoKG51bGwpXG4gIH1cblxuICBvbkVycm9yIChlcnIpIHtcbiAgICBjb25zdCB7IHJlcywgY2FsbGJhY2ssIGJvZHksIG9wYXF1ZSB9ID0gdGhpc1xuXG4gICAgcmVtb3ZlU2lnbmFsKHRoaXMpXG5cbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIC8vIFRPRE86IERvZXMgdGhpcyBuZWVkIHF1ZXVlTWljcm90YXNrP1xuICAgICAgdGhpcy5jYWxsYmFjayA9IG51bGxcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5ydW5JbkFzeW5jU2NvcGUoY2FsbGJhY2ssIG51bGwsIGVyciwgeyBvcGFxdWUgfSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHJlcykge1xuICAgICAgdGhpcy5yZXMgPSBudWxsXG4gICAgICAvLyBFbnN1cmUgYWxsIHF1ZXVlZCBoYW5kbGVycyBhcmUgaW52b2tlZCBiZWZvcmUgZGVzdHJveWluZyByZXMuXG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIHV0aWwuZGVzdHJveShyZXMsIGVycilcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGJvZHkpIHtcbiAgICAgIHRoaXMuYm9keSA9IG51bGxcbiAgICAgIHV0aWwuZGVzdHJveShib2R5LCBlcnIpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3QgKG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJlcXVlc3QuY2FsbCh0aGlzLCBvcHRzLCAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgIHJldHVybiBlcnIgPyByZWplY3QoZXJyKSA6IHJlc29sdmUoZGF0YSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIHRyeSB7XG4gICAgdGhpcy5kaXNwYXRjaChvcHRzLCBuZXcgUmVxdWVzdEhhbmRsZXIob3B0cywgY2FsbGJhY2spKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG4gICAgY29uc3Qgb3BhcXVlID0gb3B0cyAmJiBvcHRzLm9wYXF1ZVxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IGNhbGxiYWNrKGVyciwgeyBvcGFxdWUgfSkpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1ZXN0XG5tb2R1bGUuZXhwb3J0cy5SZXF1ZXN0SGFuZGxlciA9IFJlcXVlc3RIYW5kbGVyXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBmaW5pc2hlZCwgUGFzc1Rocm91Z2ggfSA9IHJlcXVpcmUoJ3N0cmVhbScpXG5jb25zdCB7XG4gIEludmFsaWRBcmd1bWVudEVycm9yLFxuICBJbnZhbGlkUmV0dXJuVmFsdWVFcnJvcixcbiAgUmVxdWVzdEFib3J0ZWRFcnJvclxufSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBnZXRSZXNvbHZlRXJyb3JCb2R5Q2FsbGJhY2sgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IEFzeW5jUmVzb3VyY2UgfSA9IHJlcXVpcmUoJ2FzeW5jX2hvb2tzJylcbmNvbnN0IHsgYWRkU2lnbmFsLCByZW1vdmVTaWduYWwgfSA9IHJlcXVpcmUoJy4vYWJvcnQtc2lnbmFsJylcblxuY2xhc3MgU3RyZWFtSGFuZGxlciBleHRlbmRzIEFzeW5jUmVzb3VyY2Uge1xuICBjb25zdHJ1Y3RvciAob3B0cywgZmFjdG9yeSwgY2FsbGJhY2spIHtcbiAgICBpZiAoIW9wdHMgfHwgdHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgb3B0cycpXG4gICAgfVxuXG4gICAgY29uc3QgeyBzaWduYWwsIG1ldGhvZCwgb3BhcXVlLCBib2R5LCBvbkluZm8sIHJlc3BvbnNlSGVhZGVycywgdGhyb3dPbkVycm9yIH0gPSBvcHRzXG5cbiAgICB0cnkge1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgY2FsbGJhY2snKVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGZhY3RvcnkgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGZhY3RvcnknKVxuICAgICAgfVxuXG4gICAgICBpZiAoc2lnbmFsICYmIHR5cGVvZiBzaWduYWwub24gIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignc2lnbmFsIG11c3QgYmUgYW4gRXZlbnRFbWl0dGVyIG9yIEV2ZW50VGFyZ2V0JylcbiAgICAgIH1cblxuICAgICAgaWYgKG1ldGhvZCA9PT0gJ0NPTk5FQ1QnKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBtZXRob2QnKVxuICAgICAgfVxuXG4gICAgICBpZiAob25JbmZvICYmIHR5cGVvZiBvbkluZm8gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9uSW5mbyBjYWxsYmFjaycpXG4gICAgICB9XG5cbiAgICAgIHN1cGVyKCdVTkRJQ0lfU1RSRUFNJylcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmICh1dGlsLmlzU3RyZWFtKGJvZHkpKSB7XG4gICAgICAgIHV0aWwuZGVzdHJveShib2R5Lm9uKCdlcnJvcicsIHV0aWwubm9wKSwgZXJyKVxuICAgICAgfVxuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuXG4gICAgdGhpcy5yZXNwb25zZUhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMgfHwgbnVsbFxuICAgIHRoaXMub3BhcXVlID0gb3BhcXVlIHx8IG51bGxcbiAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrXG4gICAgdGhpcy5yZXMgPSBudWxsXG4gICAgdGhpcy5hYm9ydCA9IG51bGxcbiAgICB0aGlzLmNvbnRleHQgPSBudWxsXG4gICAgdGhpcy50cmFpbGVycyA9IG51bGxcbiAgICB0aGlzLmJvZHkgPSBib2R5XG4gICAgdGhpcy5vbkluZm8gPSBvbkluZm8gfHwgbnVsbFxuICAgIHRoaXMudGhyb3dPbkVycm9yID0gdGhyb3dPbkVycm9yIHx8IGZhbHNlXG5cbiAgICBpZiAodXRpbC5pc1N0cmVhbShib2R5KSkge1xuICAgICAgYm9keS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMub25FcnJvcihlcnIpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGFkZFNpZ25hbCh0aGlzLCBzaWduYWwpXG4gIH1cblxuICBvbkNvbm5lY3QgKGFib3J0LCBjb250ZXh0KSB7XG4gICAgaWYgKCF0aGlzLmNhbGxiYWNrKSB7XG4gICAgICB0aHJvdyBuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpXG4gICAgfVxuXG4gICAgdGhpcy5hYm9ydCA9IGFib3J0XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dFxuICB9XG5cbiAgb25IZWFkZXJzIChzdGF0dXNDb2RlLCByYXdIZWFkZXJzLCByZXN1bWUsIHN0YXR1c01lc3NhZ2UpIHtcbiAgICBjb25zdCB7IGZhY3RvcnksIG9wYXF1ZSwgY29udGV4dCwgY2FsbGJhY2ssIHJlc3BvbnNlSGVhZGVycyB9ID0gdGhpc1xuXG4gICAgY29uc3QgaGVhZGVycyA9IHJlc3BvbnNlSGVhZGVycyA9PT0gJ3JhdycgPyB1dGlsLnBhcnNlUmF3SGVhZGVycyhyYXdIZWFkZXJzKSA6IHV0aWwucGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpXG5cbiAgICBpZiAoc3RhdHVzQ29kZSA8IDIwMCkge1xuICAgICAgaWYgKHRoaXMub25JbmZvKSB7XG4gICAgICAgIHRoaXMub25JbmZvKHsgc3RhdHVzQ29kZSwgaGVhZGVycyB9KVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5mYWN0b3J5ID0gbnVsbFxuXG4gICAgbGV0IHJlc1xuXG4gICAgaWYgKHRoaXMudGhyb3dPbkVycm9yICYmIHN0YXR1c0NvZGUgPj0gNDAwKSB7XG4gICAgICBjb25zdCBwYXJzZWRIZWFkZXJzID0gcmVzcG9uc2VIZWFkZXJzID09PSAncmF3JyA/IHV0aWwucGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpIDogaGVhZGVyc1xuICAgICAgY29uc3QgY29udGVudFR5cGUgPSBwYXJzZWRIZWFkZXJzWydjb250ZW50LXR5cGUnXVxuICAgICAgcmVzID0gbmV3IFBhc3NUaHJvdWdoKClcblxuICAgICAgdGhpcy5jYWxsYmFjayA9IG51bGxcbiAgICAgIHRoaXMucnVuSW5Bc3luY1Njb3BlKGdldFJlc29sdmVFcnJvckJvZHlDYWxsYmFjaywgbnVsbCxcbiAgICAgICAgeyBjYWxsYmFjaywgYm9keTogcmVzLCBjb250ZW50VHlwZSwgc3RhdHVzQ29kZSwgc3RhdHVzTWVzc2FnZSwgaGVhZGVycyB9XG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChmYWN0b3J5ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICByZXMgPSB0aGlzLnJ1bkluQXN5bmNTY29wZShmYWN0b3J5LCBudWxsLCB7XG4gICAgICAgIHN0YXR1c0NvZGUsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIG9wYXF1ZSxcbiAgICAgICAgY29udGV4dFxuICAgICAgfSlcblxuICAgICAgaWYgKFxuICAgICAgICAhcmVzIHx8XG4gICAgICAgIHR5cGVvZiByZXMud3JpdGUgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgdHlwZW9mIHJlcy5lbmQgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgdHlwZW9mIHJlcy5vbiAhPT0gJ2Z1bmN0aW9uJ1xuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmV0dXJuVmFsdWVFcnJvcignZXhwZWN0ZWQgV3JpdGFibGUnKVxuICAgICAgfVxuXG4gICAgICAvLyBUT0RPOiBBdm9pZCBmaW5pc2hlZC4gSXQgcmVnaXN0ZXJzIGFuIHVubmVjZXNzYXJ5IGFtb3VudCBvZiBsaXN0ZW5lcnMuXG4gICAgICBmaW5pc2hlZChyZXMsIHsgcmVhZGFibGU6IGZhbHNlIH0sIChlcnIpID0+IHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcmVzLCBvcGFxdWUsIHRyYWlsZXJzLCBhYm9ydCB9ID0gdGhpc1xuXG4gICAgICAgIHRoaXMucmVzID0gbnVsbFxuICAgICAgICBpZiAoZXJyIHx8ICFyZXMucmVhZGFibGUpIHtcbiAgICAgICAgICB1dGlsLmRlc3Ryb3kocmVzLCBlcnIpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbGxiYWNrID0gbnVsbFxuICAgICAgICB0aGlzLnJ1bkluQXN5bmNTY29wZShjYWxsYmFjaywgbnVsbCwgZXJyIHx8IG51bGwsIHsgb3BhcXVlLCB0cmFpbGVycyB9KVxuXG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICBhYm9ydCgpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmVzLm9uKCdkcmFpbicsIHJlc3VtZSlcblxuICAgIHRoaXMucmVzID0gcmVzXG5cbiAgICBjb25zdCBuZWVkRHJhaW4gPSByZXMud3JpdGFibGVOZWVkRHJhaW4gIT09IHVuZGVmaW5lZFxuICAgICAgPyByZXMud3JpdGFibGVOZWVkRHJhaW5cbiAgICAgIDogcmVzLl93cml0YWJsZVN0YXRlICYmIHJlcy5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW5cblxuICAgIHJldHVybiBuZWVkRHJhaW4gIT09IHRydWVcbiAgfVxuXG4gIG9uRGF0YSAoY2h1bmspIHtcbiAgICBjb25zdCB7IHJlcyB9ID0gdGhpc1xuXG4gICAgcmV0dXJuIHJlcyA/IHJlcy53cml0ZShjaHVuaykgOiB0cnVlXG4gIH1cblxuICBvbkNvbXBsZXRlICh0cmFpbGVycykge1xuICAgIGNvbnN0IHsgcmVzIH0gPSB0aGlzXG5cbiAgICByZW1vdmVTaWduYWwodGhpcylcblxuICAgIGlmICghcmVzKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLnRyYWlsZXJzID0gdXRpbC5wYXJzZUhlYWRlcnModHJhaWxlcnMpXG5cbiAgICByZXMuZW5kKClcbiAgfVxuXG4gIG9uRXJyb3IgKGVycikge1xuICAgIGNvbnN0IHsgcmVzLCBjYWxsYmFjaywgb3BhcXVlLCBib2R5IH0gPSB0aGlzXG5cbiAgICByZW1vdmVTaWduYWwodGhpcylcblxuICAgIHRoaXMuZmFjdG9yeSA9IG51bGxcblxuICAgIGlmIChyZXMpIHtcbiAgICAgIHRoaXMucmVzID0gbnVsbFxuICAgICAgdXRpbC5kZXN0cm95KHJlcywgZXJyKVxuICAgIH0gZWxzZSBpZiAoY2FsbGJhY2spIHtcbiAgICAgIHRoaXMuY2FsbGJhY2sgPSBudWxsXG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIHRoaXMucnVuSW5Bc3luY1Njb3BlKGNhbGxiYWNrLCBudWxsLCBlcnIsIHsgb3BhcXVlIH0pXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChib2R5KSB7XG4gICAgICB0aGlzLmJvZHkgPSBudWxsXG4gICAgICB1dGlsLmRlc3Ryb3koYm9keSwgZXJyKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzdHJlYW0gKG9wdHMsIGZhY3RvcnksIGNhbGxiYWNrKSB7XG4gIGlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHN0cmVhbS5jYWxsKHRoaXMsIG9wdHMsIGZhY3RvcnksIChlcnIsIGRhdGEpID0+IHtcbiAgICAgICAgcmV0dXJuIGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZShkYXRhKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgdHJ5IHtcbiAgICB0aGlzLmRpc3BhdGNoKG9wdHMsIG5ldyBTdHJlYW1IYW5kbGVyKG9wdHMsIGZhY3RvcnksIGNhbGxiYWNrKSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuICAgIGNvbnN0IG9wYXF1ZSA9IG9wdHMgJiYgb3B0cy5vcGFxdWVcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBjYWxsYmFjayhlcnIsIHsgb3BhcXVlIH0pKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyZWFtXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBSZWFkYWJsZSxcbiAgRHVwbGV4LFxuICBQYXNzVGhyb3VnaFxufSA9IHJlcXVpcmUoJ3N0cmVhbScpXG5jb25zdCB7XG4gIEludmFsaWRBcmd1bWVudEVycm9yLFxuICBJbnZhbGlkUmV0dXJuVmFsdWVFcnJvcixcbiAgUmVxdWVzdEFib3J0ZWRFcnJvclxufSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBBc3luY1Jlc291cmNlIH0gPSByZXF1aXJlKCdhc3luY19ob29rcycpXG5jb25zdCB7IGFkZFNpZ25hbCwgcmVtb3ZlU2lnbmFsIH0gPSByZXF1aXJlKCcuL2Fib3J0LXNpZ25hbCcpXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuXG5jb25zdCBrUmVzdW1lID0gU3ltYm9sKCdyZXN1bWUnKVxuXG5jbGFzcyBQaXBlbGluZVJlcXVlc3QgZXh0ZW5kcyBSZWFkYWJsZSB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBzdXBlcih7IGF1dG9EZXN0cm95OiB0cnVlIH0pXG5cbiAgICB0aGlzW2tSZXN1bWVdID0gbnVsbFxuICB9XG5cbiAgX3JlYWQgKCkge1xuICAgIGNvbnN0IHsgW2tSZXN1bWVdOiByZXN1bWUgfSA9IHRoaXNcblxuICAgIGlmIChyZXN1bWUpIHtcbiAgICAgIHRoaXNba1Jlc3VtZV0gPSBudWxsXG4gICAgICByZXN1bWUoKVxuICAgIH1cbiAgfVxuXG4gIF9kZXN0cm95IChlcnIsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fcmVhZCgpXG5cbiAgICBjYWxsYmFjayhlcnIpXG4gIH1cbn1cblxuY2xhc3MgUGlwZWxpbmVSZXNwb25zZSBleHRlbmRzIFJlYWRhYmxlIHtcbiAgY29uc3RydWN0b3IgKHJlc3VtZSkge1xuICAgIHN1cGVyKHsgYXV0b0Rlc3Ryb3k6IHRydWUgfSlcbiAgICB0aGlzW2tSZXN1bWVdID0gcmVzdW1lXG4gIH1cblxuICBfcmVhZCAoKSB7XG4gICAgdGhpc1trUmVzdW1lXSgpXG4gIH1cblxuICBfZGVzdHJveSAoZXJyLCBjYWxsYmFjaykge1xuICAgIGlmICghZXJyICYmICF0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICAgIGVyciA9IG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKClcbiAgICB9XG5cbiAgICBjYWxsYmFjayhlcnIpXG4gIH1cbn1cblxuY2xhc3MgUGlwZWxpbmVIYW5kbGVyIGV4dGVuZHMgQXN5bmNSZXNvdXJjZSB7XG4gIGNvbnN0cnVjdG9yIChvcHRzLCBoYW5kbGVyKSB7XG4gICAgaWYgKCFvcHRzIHx8IHR5cGVvZiBvcHRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9wdHMnKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaGFuZGxlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGhhbmRsZXInKVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2lnbmFsLCBtZXRob2QsIG9wYXF1ZSwgb25JbmZvLCByZXNwb25zZUhlYWRlcnMgfSA9IG9wdHNcblxuICAgIGlmIChzaWduYWwgJiYgdHlwZW9mIHNpZ25hbC5vbiAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignc2lnbmFsIG11c3QgYmUgYW4gRXZlbnRFbWl0dGVyIG9yIEV2ZW50VGFyZ2V0JylcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSAnQ09OTkVDVCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBtZXRob2QnKVxuICAgIH1cblxuICAgIGlmIChvbkluZm8gJiYgdHlwZW9mIG9uSW5mbyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9uSW5mbyBjYWxsYmFjaycpXG4gICAgfVxuXG4gICAgc3VwZXIoJ1VORElDSV9QSVBFTElORScpXG5cbiAgICB0aGlzLm9wYXF1ZSA9IG9wYXF1ZSB8fCBudWxsXG4gICAgdGhpcy5yZXNwb25zZUhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMgfHwgbnVsbFxuICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXJcbiAgICB0aGlzLmFib3J0ID0gbnVsbFxuICAgIHRoaXMuY29udGV4dCA9IG51bGxcbiAgICB0aGlzLm9uSW5mbyA9IG9uSW5mbyB8fCBudWxsXG5cbiAgICB0aGlzLnJlcSA9IG5ldyBQaXBlbGluZVJlcXVlc3QoKS5vbignZXJyb3InLCB1dGlsLm5vcClcblxuICAgIHRoaXMucmV0ID0gbmV3IER1cGxleCh7XG4gICAgICByZWFkYWJsZU9iamVjdE1vZGU6IG9wdHMub2JqZWN0TW9kZSxcbiAgICAgIGF1dG9EZXN0cm95OiB0cnVlLFxuICAgICAgcmVhZDogKCkgPT4ge1xuICAgICAgICBjb25zdCB7IGJvZHkgfSA9IHRoaXNcblxuICAgICAgICBpZiAoYm9keSAmJiBib2R5LnJlc3VtZSkge1xuICAgICAgICAgIGJvZHkucmVzdW1lKClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHdyaXRlOiAoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykgPT4ge1xuICAgICAgICBjb25zdCB7IHJlcSB9ID0gdGhpc1xuXG4gICAgICAgIGlmIChyZXEucHVzaChjaHVuaywgZW5jb2RpbmcpIHx8IHJlcS5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQpIHtcbiAgICAgICAgICBjYWxsYmFjaygpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVxW2tSZXN1bWVdID0gY2FsbGJhY2tcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRlc3Ryb3k6IChlcnIsIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgYm9keSwgcmVxLCByZXMsIHJldCwgYWJvcnQgfSA9IHRoaXNcblxuICAgICAgICBpZiAoIWVyciAmJiAhcmV0Ll9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICAgICAgICBlcnIgPSBuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWJvcnQgJiYgZXJyKSB7XG4gICAgICAgICAgYWJvcnQoKVxuICAgICAgICB9XG5cbiAgICAgICAgdXRpbC5kZXN0cm95KGJvZHksIGVycilcbiAgICAgICAgdXRpbC5kZXN0cm95KHJlcSwgZXJyKVxuICAgICAgICB1dGlsLmRlc3Ryb3kocmVzLCBlcnIpXG5cbiAgICAgICAgcmVtb3ZlU2lnbmFsKHRoaXMpXG5cbiAgICAgICAgY2FsbGJhY2soZXJyKVxuICAgICAgfVxuICAgIH0pLm9uKCdwcmVmaW5pc2gnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHJlcSB9ID0gdGhpc1xuXG4gICAgICAvLyBOb2RlIDwgMTUgZG9lcyBub3QgY2FsbCBfZmluYWwgaW4gc2FtZSB0aWNrLlxuICAgICAgcmVxLnB1c2gobnVsbClcbiAgICB9KVxuXG4gICAgdGhpcy5yZXMgPSBudWxsXG5cbiAgICBhZGRTaWduYWwodGhpcywgc2lnbmFsKVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCwgY29udGV4dCkge1xuICAgIGNvbnN0IHsgcmV0LCByZXMgfSA9IHRoaXNcblxuICAgIGFzc2VydCghcmVzLCAncGlwZWxpbmUgY2Fubm90IGJlIHJldHJpZWQnKVxuXG4gICAgaWYgKHJldC5kZXN0cm95ZWQpIHtcbiAgICAgIHRocm93IG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKClcbiAgICB9XG5cbiAgICB0aGlzLmFib3J0ID0gYWJvcnRcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0XG4gIH1cblxuICBvbkhlYWRlcnMgKHN0YXR1c0NvZGUsIHJhd0hlYWRlcnMsIHJlc3VtZSkge1xuICAgIGNvbnN0IHsgb3BhcXVlLCBoYW5kbGVyLCBjb250ZXh0IH0gPSB0aGlzXG5cbiAgICBpZiAoc3RhdHVzQ29kZSA8IDIwMCkge1xuICAgICAgaWYgKHRoaXMub25JbmZvKSB7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnJlc3BvbnNlSGVhZGVycyA9PT0gJ3JhdycgPyB1dGlsLnBhcnNlUmF3SGVhZGVycyhyYXdIZWFkZXJzKSA6IHV0aWwucGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpXG4gICAgICAgIHRoaXMub25JbmZvKHsgc3RhdHVzQ29kZSwgaGVhZGVycyB9KVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5yZXMgPSBuZXcgUGlwZWxpbmVSZXNwb25zZShyZXN1bWUpXG5cbiAgICBsZXQgYm9keVxuICAgIHRyeSB7XG4gICAgICB0aGlzLmhhbmRsZXIgPSBudWxsXG4gICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5yZXNwb25zZUhlYWRlcnMgPT09ICdyYXcnID8gdXRpbC5wYXJzZVJhd0hlYWRlcnMocmF3SGVhZGVycykgOiB1dGlsLnBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKVxuICAgICAgYm9keSA9IHRoaXMucnVuSW5Bc3luY1Njb3BlKGhhbmRsZXIsIG51bGwsIHtcbiAgICAgICAgc3RhdHVzQ29kZSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgb3BhcXVlLFxuICAgICAgICBib2R5OiB0aGlzLnJlcyxcbiAgICAgICAgY29udGV4dFxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMucmVzLm9uKCdlcnJvcicsIHV0aWwubm9wKVxuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuXG4gICAgaWYgKCFib2R5IHx8IHR5cGVvZiBib2R5Lm9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFJldHVyblZhbHVlRXJyb3IoJ2V4cGVjdGVkIFJlYWRhYmxlJylcbiAgICB9XG5cbiAgICBib2R5XG4gICAgICAub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICAgICAgY29uc3QgeyByZXQsIGJvZHkgfSA9IHRoaXNcblxuICAgICAgICBpZiAoIXJldC5wdXNoKGNodW5rKSAmJiBib2R5LnBhdXNlKSB7XG4gICAgICAgICAgYm9keS5wYXVzZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICBjb25zdCB7IHJldCB9ID0gdGhpc1xuXG4gICAgICAgIHV0aWwuZGVzdHJveShyZXQsIGVycilcbiAgICAgIH0pXG4gICAgICAub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgeyByZXQgfSA9IHRoaXNcblxuICAgICAgICByZXQucHVzaChudWxsKVxuICAgICAgfSlcbiAgICAgIC5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcmV0IH0gPSB0aGlzXG5cbiAgICAgICAgaWYgKCFyZXQuX3JlYWRhYmxlU3RhdGUuZW5kZWQpIHtcbiAgICAgICAgICB1dGlsLmRlc3Ryb3kocmV0LCBuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgdGhpcy5ib2R5ID0gYm9keVxuICB9XG5cbiAgb25EYXRhIChjaHVuaykge1xuICAgIGNvbnN0IHsgcmVzIH0gPSB0aGlzXG4gICAgcmV0dXJuIHJlcy5wdXNoKGNodW5rKVxuICB9XG5cbiAgb25Db21wbGV0ZSAodHJhaWxlcnMpIHtcbiAgICBjb25zdCB7IHJlcyB9ID0gdGhpc1xuICAgIHJlcy5wdXNoKG51bGwpXG4gIH1cblxuICBvbkVycm9yIChlcnIpIHtcbiAgICBjb25zdCB7IHJldCB9ID0gdGhpc1xuICAgIHRoaXMuaGFuZGxlciA9IG51bGxcbiAgICB1dGlsLmRlc3Ryb3kocmV0LCBlcnIpXG4gIH1cbn1cblxuZnVuY3Rpb24gcGlwZWxpbmUgKG9wdHMsIGhhbmRsZXIpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwaXBlbGluZUhhbmRsZXIgPSBuZXcgUGlwZWxpbmVIYW5kbGVyKG9wdHMsIGhhbmRsZXIpXG4gICAgdGhpcy5kaXNwYXRjaCh7IC4uLm9wdHMsIGJvZHk6IHBpcGVsaW5lSGFuZGxlci5yZXEgfSwgcGlwZWxpbmVIYW5kbGVyKVxuICAgIHJldHVybiBwaXBlbGluZUhhbmRsZXIucmV0XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBuZXcgUGFzc1Rocm91Z2goKS5kZXN0cm95KGVycilcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBpcGVsaW5lXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciwgUmVxdWVzdEFib3J0ZWRFcnJvciwgU29ja2V0RXJyb3IgfSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcbmNvbnN0IHsgQXN5bmNSZXNvdXJjZSB9ID0gcmVxdWlyZSgnYXN5bmNfaG9va3MnKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5jb25zdCB7IGFkZFNpZ25hbCwgcmVtb3ZlU2lnbmFsIH0gPSByZXF1aXJlKCcuL2Fib3J0LXNpZ25hbCcpXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuXG5jbGFzcyBVcGdyYWRlSGFuZGxlciBleHRlbmRzIEFzeW5jUmVzb3VyY2Uge1xuICBjb25zdHJ1Y3RvciAob3B0cywgY2FsbGJhY2spIHtcbiAgICBpZiAoIW9wdHMgfHwgdHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgb3B0cycpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGNhbGxiYWNrJylcbiAgICB9XG5cbiAgICBjb25zdCB7IHNpZ25hbCwgb3BhcXVlLCByZXNwb25zZUhlYWRlcnMgfSA9IG9wdHNcblxuICAgIGlmIChzaWduYWwgJiYgdHlwZW9mIHNpZ25hbC5vbiAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignc2lnbmFsIG11c3QgYmUgYW4gRXZlbnRFbWl0dGVyIG9yIEV2ZW50VGFyZ2V0JylcbiAgICB9XG5cbiAgICBzdXBlcignVU5ESUNJX1VQR1JBREUnKVxuXG4gICAgdGhpcy5yZXNwb25zZUhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMgfHwgbnVsbFxuICAgIHRoaXMub3BhcXVlID0gb3BhcXVlIHx8IG51bGxcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2tcbiAgICB0aGlzLmFib3J0ID0gbnVsbFxuICAgIHRoaXMuY29udGV4dCA9IG51bGxcblxuICAgIGFkZFNpZ25hbCh0aGlzLCBzaWduYWwpXG4gIH1cblxuICBvbkNvbm5lY3QgKGFib3J0LCBjb250ZXh0KSB7XG4gICAgaWYgKCF0aGlzLmNhbGxiYWNrKSB7XG4gICAgICB0aHJvdyBuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpXG4gICAgfVxuXG4gICAgdGhpcy5hYm9ydCA9IGFib3J0XG4gICAgdGhpcy5jb250ZXh0ID0gbnVsbFxuICB9XG5cbiAgb25IZWFkZXJzICgpIHtcbiAgICB0aHJvdyBuZXcgU29ja2V0RXJyb3IoJ2JhZCB1cGdyYWRlJywgbnVsbClcbiAgfVxuXG4gIG9uVXBncmFkZSAoc3RhdHVzQ29kZSwgcmF3SGVhZGVycywgc29ja2V0KSB7XG4gICAgY29uc3QgeyBjYWxsYmFjaywgb3BhcXVlLCBjb250ZXh0IH0gPSB0aGlzXG5cbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc3RhdHVzQ29kZSwgMTAxKVxuXG4gICAgcmVtb3ZlU2lnbmFsKHRoaXMpXG5cbiAgICB0aGlzLmNhbGxiYWNrID0gbnVsbFxuICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnJlc3BvbnNlSGVhZGVycyA9PT0gJ3JhdycgPyB1dGlsLnBhcnNlUmF3SGVhZGVycyhyYXdIZWFkZXJzKSA6IHV0aWwucGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpXG4gICAgdGhpcy5ydW5JbkFzeW5jU2NvcGUoY2FsbGJhY2ssIG51bGwsIG51bGwsIHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBzb2NrZXQsXG4gICAgICBvcGFxdWUsXG4gICAgICBjb250ZXh0XG4gICAgfSlcbiAgfVxuXG4gIG9uRXJyb3IgKGVycikge1xuICAgIGNvbnN0IHsgY2FsbGJhY2ssIG9wYXF1ZSB9ID0gdGhpc1xuXG4gICAgcmVtb3ZlU2lnbmFsKHRoaXMpXG5cbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIHRoaXMuY2FsbGJhY2sgPSBudWxsXG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIHRoaXMucnVuSW5Bc3luY1Njb3BlKGNhbGxiYWNrLCBudWxsLCBlcnIsIHsgb3BhcXVlIH0pXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGdyYWRlIChvcHRzLCBjYWxsYmFjaykge1xuICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB1cGdyYWRlLmNhbGwodGhpcywgb3B0cywgKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICByZXR1cm4gZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKGRhdGEpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHVwZ3JhZGVIYW5kbGVyID0gbmV3IFVwZ3JhZGVIYW5kbGVyKG9wdHMsIGNhbGxiYWNrKVxuICAgIHRoaXMuZGlzcGF0Y2goe1xuICAgICAgLi4ub3B0cyxcbiAgICAgIG1ldGhvZDogb3B0cy5tZXRob2QgfHwgJ0dFVCcsXG4gICAgICB1cGdyYWRlOiBvcHRzLnByb3RvY29sIHx8ICdXZWJzb2NrZXQnXG4gICAgfSwgdXBncmFkZUhhbmRsZXIpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgICBjb25zdCBvcGFxdWUgPSBvcHRzICYmIG9wdHMub3BhcXVlXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2FsbGJhY2soZXJyLCB7IG9wYXF1ZSB9KSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHVwZ3JhZGVcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IEFzeW5jUmVzb3VyY2UgfSA9IHJlcXVpcmUoJ2FzeW5jX2hvb2tzJylcbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IsIFJlcXVlc3RBYm9ydGVkRXJyb3IsIFNvY2tldEVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgYWRkU2lnbmFsLCByZW1vdmVTaWduYWwgfSA9IHJlcXVpcmUoJy4vYWJvcnQtc2lnbmFsJylcblxuY2xhc3MgQ29ubmVjdEhhbmRsZXIgZXh0ZW5kcyBBc3luY1Jlc291cmNlIHtcbiAgY29uc3RydWN0b3IgKG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFvcHRzIHx8IHR5cGVvZiBvcHRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9wdHMnKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBjYWxsYmFjaycpXG4gICAgfVxuXG4gICAgY29uc3QgeyBzaWduYWwsIG9wYXF1ZSwgcmVzcG9uc2VIZWFkZXJzIH0gPSBvcHRzXG5cbiAgICBpZiAoc2lnbmFsICYmIHR5cGVvZiBzaWduYWwub24gIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3NpZ25hbCBtdXN0IGJlIGFuIEV2ZW50RW1pdHRlciBvciBFdmVudFRhcmdldCcpXG4gICAgfVxuXG4gICAgc3VwZXIoJ1VORElDSV9DT05ORUNUJylcblxuICAgIHRoaXMub3BhcXVlID0gb3BhcXVlIHx8IG51bGxcbiAgICB0aGlzLnJlc3BvbnNlSGVhZGVycyA9IHJlc3BvbnNlSGVhZGVycyB8fCBudWxsXG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrXG4gICAgdGhpcy5hYm9ydCA9IG51bGxcblxuICAgIGFkZFNpZ25hbCh0aGlzLCBzaWduYWwpXG4gIH1cblxuICBvbkNvbm5lY3QgKGFib3J0LCBjb250ZXh0KSB7XG4gICAgaWYgKCF0aGlzLmNhbGxiYWNrKSB7XG4gICAgICB0aHJvdyBuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpXG4gICAgfVxuXG4gICAgdGhpcy5hYm9ydCA9IGFib3J0XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dFxuICB9XG5cbiAgb25IZWFkZXJzICgpIHtcbiAgICB0aHJvdyBuZXcgU29ja2V0RXJyb3IoJ2JhZCBjb25uZWN0JywgbnVsbClcbiAgfVxuXG4gIG9uVXBncmFkZSAoc3RhdHVzQ29kZSwgcmF3SGVhZGVycywgc29ja2V0KSB7XG4gICAgY29uc3QgeyBjYWxsYmFjaywgb3BhcXVlLCBjb250ZXh0IH0gPSB0aGlzXG5cbiAgICByZW1vdmVTaWduYWwodGhpcylcblxuICAgIHRoaXMuY2FsbGJhY2sgPSBudWxsXG5cbiAgICBsZXQgaGVhZGVycyA9IHJhd0hlYWRlcnNcbiAgICAvLyBJbmRpY2F0ZXMgaXMgYW4gSFRUUDJTZXNzaW9uXG4gICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkge1xuICAgICAgaGVhZGVycyA9IHRoaXMucmVzcG9uc2VIZWFkZXJzID09PSAncmF3JyA/IHV0aWwucGFyc2VSYXdIZWFkZXJzKHJhd0hlYWRlcnMpIDogdXRpbC5wYXJzZUhlYWRlcnMocmF3SGVhZGVycylcbiAgICB9XG5cbiAgICB0aGlzLnJ1bkluQXN5bmNTY29wZShjYWxsYmFjaywgbnVsbCwgbnVsbCwge1xuICAgICAgc3RhdHVzQ29kZSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBzb2NrZXQsXG4gICAgICBvcGFxdWUsXG4gICAgICBjb250ZXh0XG4gICAgfSlcbiAgfVxuXG4gIG9uRXJyb3IgKGVycikge1xuICAgIGNvbnN0IHsgY2FsbGJhY2ssIG9wYXF1ZSB9ID0gdGhpc1xuXG4gICAgcmVtb3ZlU2lnbmFsKHRoaXMpXG5cbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIHRoaXMuY2FsbGJhY2sgPSBudWxsXG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIHRoaXMucnVuSW5Bc3luY1Njb3BlKGNhbGxiYWNrLCBudWxsLCBlcnIsIHsgb3BhcXVlIH0pXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb25uZWN0IChvcHRzLCBjYWxsYmFjaykge1xuICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25uZWN0LmNhbGwodGhpcywgb3B0cywgKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICByZXR1cm4gZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKGRhdGEpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGNvbm5lY3RIYW5kbGVyID0gbmV3IENvbm5lY3RIYW5kbGVyKG9wdHMsIGNhbGxiYWNrKVxuICAgIHRoaXMuZGlzcGF0Y2goeyAuLi5vcHRzLCBtZXRob2Q6ICdDT05ORUNUJyB9LCBjb25uZWN0SGFuZGxlcilcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuICAgIGNvbnN0IG9wYXF1ZSA9IG9wdHMgJiYgb3B0cy5vcGFxdWVcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBjYWxsYmFjayhlcnIsIHsgb3BhcXVlIH0pKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29ubmVjdFxuIiwiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzLnJlcXVlc3QgPSByZXF1aXJlKCcuL2FwaS1yZXF1ZXN0Jylcbm1vZHVsZS5leHBvcnRzLnN0cmVhbSA9IHJlcXVpcmUoJy4vYXBpLXN0cmVhbScpXG5tb2R1bGUuZXhwb3J0cy5waXBlbGluZSA9IHJlcXVpcmUoJy4vYXBpLXBpcGVsaW5lJylcbm1vZHVsZS5leHBvcnRzLnVwZ3JhZGUgPSByZXF1aXJlKCcuL2FwaS11cGdyYWRlJylcbm1vZHVsZS5leHBvcnRzLmNvbm5lY3QgPSByZXF1aXJlKCcuL2FwaS1jb25uZWN0JylcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IFVuZGljaUVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5cbmNsYXNzIE1vY2tOb3RNYXRjaGVkRXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBNb2NrTm90TWF0Y2hlZEVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdNb2NrTm90TWF0Y2hlZEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1RoZSByZXF1ZXN0IGRvZXMgbm90IG1hdGNoIGFueSByZWdpc3RlcmVkIG1vY2sgZGlzcGF0Y2hlcydcbiAgICB0aGlzLmNvZGUgPSAnVU5EX01PQ0tfRVJSX01PQ0tfTk9UX01BVENIRUQnXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIE1vY2tOb3RNYXRjaGVkRXJyb3Jcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAga0FnZW50OiBTeW1ib2woJ2FnZW50JyksXG4gIGtPcHRpb25zOiBTeW1ib2woJ29wdGlvbnMnKSxcbiAga0ZhY3Rvcnk6IFN5bWJvbCgnZmFjdG9yeScpLFxuICBrRGlzcGF0Y2hlczogU3ltYm9sKCdkaXNwYXRjaGVzJyksXG4gIGtEaXNwYXRjaEtleTogU3ltYm9sKCdkaXNwYXRjaCBrZXknKSxcbiAga0RlZmF1bHRIZWFkZXJzOiBTeW1ib2woJ2RlZmF1bHQgaGVhZGVycycpLFxuICBrRGVmYXVsdFRyYWlsZXJzOiBTeW1ib2woJ2RlZmF1bHQgdHJhaWxlcnMnKSxcbiAga0NvbnRlbnRMZW5ndGg6IFN5bWJvbCgnY29udGVudCBsZW5ndGgnKSxcbiAga01vY2tBZ2VudDogU3ltYm9sKCdtb2NrIGFnZW50JyksXG4gIGtNb2NrQWdlbnRTZXQ6IFN5bWJvbCgnbW9jayBhZ2VudCBzZXQnKSxcbiAga01vY2tBZ2VudEdldDogU3ltYm9sKCdtb2NrIGFnZW50IGdldCcpLFxuICBrTW9ja0Rpc3BhdGNoOiBTeW1ib2woJ21vY2sgZGlzcGF0Y2gnKSxcbiAga0Nsb3NlOiBTeW1ib2woJ2Nsb3NlJyksXG4gIGtPcmlnaW5hbENsb3NlOiBTeW1ib2woJ29yaWdpbmFsIGFnZW50IGNsb3NlJyksXG4gIGtPcmlnaW46IFN5bWJvbCgnb3JpZ2luJyksXG4gIGtJc01vY2tBY3RpdmU6IFN5bWJvbCgnaXMgbW9jayBhY3RpdmUnKSxcbiAga05ldENvbm5lY3Q6IFN5bWJvbCgnbmV0IGNvbm5lY3QnKSxcbiAga0dldE5ldENvbm5lY3Q6IFN5bWJvbCgnZ2V0IG5ldCBjb25uZWN0JyksXG4gIGtDb25uZWN0ZWQ6IFN5bWJvbCgnY29ubmVjdGVkJylcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IE1vY2tOb3RNYXRjaGVkRXJyb3IgfSA9IHJlcXVpcmUoJy4vbW9jay1lcnJvcnMnKVxuY29uc3Qge1xuICBrRGlzcGF0Y2hlcyxcbiAga01vY2tBZ2VudCxcbiAga09yaWdpbmFsRGlzcGF0Y2gsXG4gIGtPcmlnaW4sXG4gIGtHZXROZXRDb25uZWN0XG59ID0gcmVxdWlyZSgnLi9tb2NrLXN5bWJvbHMnKVxuY29uc3QgeyBidWlsZFVSTCwgbm9wIH0gPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBTVEFUVVNfQ09ERVMgfSA9IHJlcXVpcmUoJ2h0dHAnKVxuY29uc3Qge1xuICB0eXBlczoge1xuICAgIGlzUHJvbWlzZVxuICB9XG59ID0gcmVxdWlyZSgndXRpbCcpXG5cbmZ1bmN0aW9uIG1hdGNoVmFsdWUgKG1hdGNoLCB2YWx1ZSkge1xuICBpZiAodHlwZW9mIG1hdGNoID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBtYXRjaCA9PT0gdmFsdWVcbiAgfVxuICBpZiAobWF0Y2ggaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICByZXR1cm4gbWF0Y2gudGVzdCh2YWx1ZSlcbiAgfVxuICBpZiAodHlwZW9mIG1hdGNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG1hdGNoKHZhbHVlKSA9PT0gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBsb3dlckNhc2VFbnRyaWVzIChoZWFkZXJzKSB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMoaGVhZGVycykubWFwKChbaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWVdKSA9PiB7XG4gICAgICByZXR1cm4gW2hlYWRlck5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKSwgaGVhZGVyVmFsdWVdXG4gICAgfSlcbiAgKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi8uLi9pbmRleCcpLkhlYWRlcnN8c3RyaW5nW118UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gaGVhZGVyc1xuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICovXG5mdW5jdGlvbiBnZXRIZWFkZXJCeU5hbWUgKGhlYWRlcnMsIGtleSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgaWYgKGhlYWRlcnNbaV0udG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0ga2V5LnRvTG9jYWxlTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgcmV0dXJuIGhlYWRlcnNbaSArIDFdXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9IGVsc2UgaWYgKHR5cGVvZiBoZWFkZXJzLmdldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBoZWFkZXJzLmdldChrZXkpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxvd2VyQ2FzZUVudHJpZXMoaGVhZGVycylba2V5LnRvTG9jYWxlTG93ZXJDYXNlKCldXG4gIH1cbn1cblxuLyoqIEBwYXJhbSB7c3RyaW5nW119IGhlYWRlcnMgKi9cbmZ1bmN0aW9uIGJ1aWxkSGVhZGVyc0Zyb21BcnJheSAoaGVhZGVycykgeyAvLyBmZXRjaCBIZWFkZXJzTGlzdFxuICBjb25zdCBjbG9uZSA9IGhlYWRlcnMuc2xpY2UoKVxuICBjb25zdCBlbnRyaWVzID0gW11cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNsb25lLmxlbmd0aDsgaW5kZXggKz0gMikge1xuICAgIGVudHJpZXMucHVzaChbY2xvbmVbaW5kZXhdLCBjbG9uZVtpbmRleCArIDFdXSlcbiAgfVxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMpXG59XG5cbmZ1bmN0aW9uIG1hdGNoSGVhZGVycyAobW9ja0Rpc3BhdGNoLCBoZWFkZXJzKSB7XG4gIGlmICh0eXBlb2YgbW9ja0Rpc3BhdGNoLmhlYWRlcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkgeyAvLyBmZXRjaCBIZWFkZXJzTGlzdFxuICAgICAgaGVhZGVycyA9IGJ1aWxkSGVhZGVyc0Zyb21BcnJheShoZWFkZXJzKVxuICAgIH1cbiAgICByZXR1cm4gbW9ja0Rpc3BhdGNoLmhlYWRlcnMoaGVhZGVycyA/IGxvd2VyQ2FzZUVudHJpZXMoaGVhZGVycykgOiB7fSlcbiAgfVxuICBpZiAodHlwZW9mIG1vY2tEaXNwYXRjaC5oZWFkZXJzID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgaWYgKHR5cGVvZiBoZWFkZXJzICE9PSAnb2JqZWN0JyB8fCB0eXBlb2YgbW9ja0Rpc3BhdGNoLmhlYWRlcnMgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBmb3IgKGNvbnN0IFttYXRjaEhlYWRlck5hbWUsIG1hdGNoSGVhZGVyVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG1vY2tEaXNwYXRjaC5oZWFkZXJzKSkge1xuICAgIGNvbnN0IGhlYWRlclZhbHVlID0gZ2V0SGVhZGVyQnlOYW1lKGhlYWRlcnMsIG1hdGNoSGVhZGVyTmFtZSlcblxuICAgIGlmICghbWF0Y2hWYWx1ZShtYXRjaEhlYWRlclZhbHVlLCBoZWFkZXJWYWx1ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG5mdW5jdGlvbiBzYWZlVXJsIChwYXRoKSB7XG4gIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcGF0aFxuICB9XG5cbiAgY29uc3QgcGF0aFNlZ21lbnRzID0gcGF0aC5zcGxpdCgnPycpXG5cbiAgaWYgKHBhdGhTZWdtZW50cy5sZW5ndGggIT09IDIpIHtcbiAgICByZXR1cm4gcGF0aFxuICB9XG5cbiAgY29uc3QgcXAgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHBhdGhTZWdtZW50cy5wb3AoKSlcbiAgcXAuc29ydCgpXG4gIHJldHVybiBbLi4ucGF0aFNlZ21lbnRzLCBxcC50b1N0cmluZygpXS5qb2luKCc/Jylcbn1cblxuZnVuY3Rpb24gbWF0Y2hLZXkgKG1vY2tEaXNwYXRjaCwgeyBwYXRoLCBtZXRob2QsIGJvZHksIGhlYWRlcnMgfSkge1xuICBjb25zdCBwYXRoTWF0Y2ggPSBtYXRjaFZhbHVlKG1vY2tEaXNwYXRjaC5wYXRoLCBwYXRoKVxuICBjb25zdCBtZXRob2RNYXRjaCA9IG1hdGNoVmFsdWUobW9ja0Rpc3BhdGNoLm1ldGhvZCwgbWV0aG9kKVxuICBjb25zdCBib2R5TWF0Y2ggPSB0eXBlb2YgbW9ja0Rpc3BhdGNoLmJvZHkgIT09ICd1bmRlZmluZWQnID8gbWF0Y2hWYWx1ZShtb2NrRGlzcGF0Y2guYm9keSwgYm9keSkgOiB0cnVlXG4gIGNvbnN0IGhlYWRlcnNNYXRjaCA9IG1hdGNoSGVhZGVycyhtb2NrRGlzcGF0Y2gsIGhlYWRlcnMpXG4gIHJldHVybiBwYXRoTWF0Y2ggJiYgbWV0aG9kTWF0Y2ggJiYgYm9keU1hdGNoICYmIGhlYWRlcnNNYXRjaFxufVxuXG5mdW5jdGlvbiBnZXRSZXNwb25zZURhdGEgKGRhdGEpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSkge1xuICAgIHJldHVybiBkYXRhXG4gIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE1vY2tEaXNwYXRjaCAobW9ja0Rpc3BhdGNoZXMsIGtleSkge1xuICBjb25zdCBiYXNlUGF0aCA9IGtleS5xdWVyeSA/IGJ1aWxkVVJMKGtleS5wYXRoLCBrZXkucXVlcnkpIDoga2V5LnBhdGhcbiAgY29uc3QgcmVzb2x2ZWRQYXRoID0gdHlwZW9mIGJhc2VQYXRoID09PSAnc3RyaW5nJyA/IHNhZmVVcmwoYmFzZVBhdGgpIDogYmFzZVBhdGhcblxuICAvLyBNYXRjaCBwYXRoXG4gIGxldCBtYXRjaGVkTW9ja0Rpc3BhdGNoZXMgPSBtb2NrRGlzcGF0Y2hlcy5maWx0ZXIoKHsgY29uc3VtZWQgfSkgPT4gIWNvbnN1bWVkKS5maWx0ZXIoKHsgcGF0aCB9KSA9PiBtYXRjaFZhbHVlKHNhZmVVcmwocGF0aCksIHJlc29sdmVkUGF0aCkpXG4gIGlmIChtYXRjaGVkTW9ja0Rpc3BhdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IE1vY2tOb3RNYXRjaGVkRXJyb3IoYE1vY2sgZGlzcGF0Y2ggbm90IG1hdGNoZWQgZm9yIHBhdGggJyR7cmVzb2x2ZWRQYXRofSdgKVxuICB9XG5cbiAgLy8gTWF0Y2ggbWV0aG9kXG4gIG1hdGNoZWRNb2NrRGlzcGF0Y2hlcyA9IG1hdGNoZWRNb2NrRGlzcGF0Y2hlcy5maWx0ZXIoKHsgbWV0aG9kIH0pID0+IG1hdGNoVmFsdWUobWV0aG9kLCBrZXkubWV0aG9kKSlcbiAgaWYgKG1hdGNoZWRNb2NrRGlzcGF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgTW9ja05vdE1hdGNoZWRFcnJvcihgTW9jayBkaXNwYXRjaCBub3QgbWF0Y2hlZCBmb3IgbWV0aG9kICcke2tleS5tZXRob2R9J2ApXG4gIH1cblxuICAvLyBNYXRjaCBib2R5XG4gIG1hdGNoZWRNb2NrRGlzcGF0Y2hlcyA9IG1hdGNoZWRNb2NrRGlzcGF0Y2hlcy5maWx0ZXIoKHsgYm9keSB9KSA9PiB0eXBlb2YgYm9keSAhPT0gJ3VuZGVmaW5lZCcgPyBtYXRjaFZhbHVlKGJvZHksIGtleS5ib2R5KSA6IHRydWUpXG4gIGlmIChtYXRjaGVkTW9ja0Rpc3BhdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IE1vY2tOb3RNYXRjaGVkRXJyb3IoYE1vY2sgZGlzcGF0Y2ggbm90IG1hdGNoZWQgZm9yIGJvZHkgJyR7a2V5LmJvZHl9J2ApXG4gIH1cblxuICAvLyBNYXRjaCBoZWFkZXJzXG4gIG1hdGNoZWRNb2NrRGlzcGF0Y2hlcyA9IG1hdGNoZWRNb2NrRGlzcGF0Y2hlcy5maWx0ZXIoKG1vY2tEaXNwYXRjaCkgPT4gbWF0Y2hIZWFkZXJzKG1vY2tEaXNwYXRjaCwga2V5LmhlYWRlcnMpKVxuICBpZiAobWF0Y2hlZE1vY2tEaXNwYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBNb2NrTm90TWF0Y2hlZEVycm9yKGBNb2NrIGRpc3BhdGNoIG5vdCBtYXRjaGVkIGZvciBoZWFkZXJzICcke3R5cGVvZiBrZXkuaGVhZGVycyA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShrZXkuaGVhZGVycykgOiBrZXkuaGVhZGVyc30nYClcbiAgfVxuXG4gIHJldHVybiBtYXRjaGVkTW9ja0Rpc3BhdGNoZXNbMF1cbn1cblxuZnVuY3Rpb24gYWRkTW9ja0Rpc3BhdGNoIChtb2NrRGlzcGF0Y2hlcywga2V5LCBkYXRhKSB7XG4gIGNvbnN0IGJhc2VEYXRhID0geyB0aW1lc0ludm9rZWQ6IDAsIHRpbWVzOiAxLCBwZXJzaXN0OiBmYWxzZSwgY29uc3VtZWQ6IGZhbHNlIH1cbiAgY29uc3QgcmVwbHlEYXRhID0gdHlwZW9mIGRhdGEgPT09ICdmdW5jdGlvbicgPyB7IGNhbGxiYWNrOiBkYXRhIH0gOiB7IC4uLmRhdGEgfVxuICBjb25zdCBuZXdNb2NrRGlzcGF0Y2ggPSB7IC4uLmJhc2VEYXRhLCAuLi5rZXksIHBlbmRpbmc6IHRydWUsIGRhdGE6IHsgZXJyb3I6IG51bGwsIC4uLnJlcGx5RGF0YSB9IH1cbiAgbW9ja0Rpc3BhdGNoZXMucHVzaChuZXdNb2NrRGlzcGF0Y2gpXG4gIHJldHVybiBuZXdNb2NrRGlzcGF0Y2hcbn1cblxuZnVuY3Rpb24gZGVsZXRlTW9ja0Rpc3BhdGNoIChtb2NrRGlzcGF0Y2hlcywga2V5KSB7XG4gIGNvbnN0IGluZGV4ID0gbW9ja0Rpc3BhdGNoZXMuZmluZEluZGV4KGRpc3BhdGNoID0+IHtcbiAgICBpZiAoIWRpc3BhdGNoLmNvbnN1bWVkKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoS2V5KGRpc3BhdGNoLCBrZXkpXG4gIH0pXG4gIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICBtb2NrRGlzcGF0Y2hlcy5zcGxpY2UoaW5kZXgsIDEpXG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRLZXkgKG9wdHMpIHtcbiAgY29uc3QgeyBwYXRoLCBtZXRob2QsIGJvZHksIGhlYWRlcnMsIHF1ZXJ5IH0gPSBvcHRzXG4gIHJldHVybiB7XG4gICAgcGF0aCxcbiAgICBtZXRob2QsXG4gICAgYm9keSxcbiAgICBoZWFkZXJzLFxuICAgIHF1ZXJ5XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVLZXlWYWx1ZXMgKGRhdGEpIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGRhdGEpLnJlZHVjZSgoa2V5VmFsdWVQYWlycywgW2tleSwgdmFsdWVdKSA9PiBbXG4gICAgLi4ua2V5VmFsdWVQYWlycyxcbiAgICBCdWZmZXIuZnJvbShgJHtrZXl9YCksXG4gICAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5tYXAoeCA9PiBCdWZmZXIuZnJvbShgJHt4fWApKSA6IEJ1ZmZlci5mcm9tKGAke3ZhbHVlfWApXG4gIF0sIFtdKVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9TdGF0dXNcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNDb2RlXG4gKi9cbmZ1bmN0aW9uIGdldFN0YXR1c1RleHQgKHN0YXR1c0NvZGUpIHtcbiAgcmV0dXJuIFNUQVRVU19DT0RFU1tzdGF0dXNDb2RlXSB8fCAndW5rbm93bidcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0UmVzcG9uc2UgKGJvZHkpIHtcbiAgY29uc3QgYnVmZmVycyA9IFtdXG4gIGZvciBhd2FpdCAoY29uc3QgZGF0YSBvZiBib2R5KSB7XG4gICAgYnVmZmVycy5wdXNoKGRhdGEpXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoYnVmZmVycykudG9TdHJpbmcoJ3V0ZjgnKVxufVxuXG4vKipcbiAqIE1vY2sgZGlzcGF0Y2ggZnVuY3Rpb24gdXNlZCB0byBzaW11bGF0ZSB1bmRpY2kgZGlzcGF0Y2hlc1xuICovXG5mdW5jdGlvbiBtb2NrRGlzcGF0Y2ggKG9wdHMsIGhhbmRsZXIpIHtcbiAgLy8gR2V0IG1vY2sgZGlzcGF0Y2ggZnJvbSBidWlsdCBrZXlcbiAgY29uc3Qga2V5ID0gYnVpbGRLZXkob3B0cylcbiAgY29uc3QgbW9ja0Rpc3BhdGNoID0gZ2V0TW9ja0Rpc3BhdGNoKHRoaXNba0Rpc3BhdGNoZXNdLCBrZXkpXG5cbiAgbW9ja0Rpc3BhdGNoLnRpbWVzSW52b2tlZCsrXG5cbiAgLy8gSGVyZSdzIHdoZXJlIHdlIHJlc29sdmUgYSBjYWxsYmFjayBpZiBhIGNhbGxiYWNrIGlzIHByZXNlbnQgZm9yIHRoZSBkaXNwYXRjaCBkYXRhLlxuICBpZiAobW9ja0Rpc3BhdGNoLmRhdGEuY2FsbGJhY2spIHtcbiAgICBtb2NrRGlzcGF0Y2guZGF0YSA9IHsgLi4ubW9ja0Rpc3BhdGNoLmRhdGEsIC4uLm1vY2tEaXNwYXRjaC5kYXRhLmNhbGxiYWNrKG9wdHMpIH1cbiAgfVxuXG4gIC8vIFBhcnNlIG1vY2tEaXNwYXRjaCBkYXRhXG4gIGNvbnN0IHsgZGF0YTogeyBzdGF0dXNDb2RlLCBkYXRhLCBoZWFkZXJzLCB0cmFpbGVycywgZXJyb3IgfSwgZGVsYXksIHBlcnNpc3QgfSA9IG1vY2tEaXNwYXRjaFxuICBjb25zdCB7IHRpbWVzSW52b2tlZCwgdGltZXMgfSA9IG1vY2tEaXNwYXRjaFxuXG4gIC8vIElmIGl0J3MgdXNlZCB1cCBhbmQgbm90IHBlcnNpc3RlbnQsIG1hcmsgYXMgY29uc3VtZWRcbiAgbW9ja0Rpc3BhdGNoLmNvbnN1bWVkID0gIXBlcnNpc3QgJiYgdGltZXNJbnZva2VkID49IHRpbWVzXG4gIG1vY2tEaXNwYXRjaC5wZW5kaW5nID0gdGltZXNJbnZva2VkIDwgdGltZXNcblxuICAvLyBJZiBzcGVjaWZpZWQsIHRyaWdnZXIgZGlzcGF0Y2ggZXJyb3JcbiAgaWYgKGVycm9yICE9PSBudWxsKSB7XG4gICAgZGVsZXRlTW9ja0Rpc3BhdGNoKHRoaXNba0Rpc3BhdGNoZXNdLCBrZXkpXG4gICAgaGFuZGxlci5vbkVycm9yKGVycm9yKVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvLyBIYW5kbGUgdGhlIHJlcXVlc3Qgd2l0aCBhIGRlbGF5IGlmIG5lY2Vzc2FyeVxuICBpZiAodHlwZW9mIGRlbGF5ID09PSAnbnVtYmVyJyAmJiBkZWxheSA+IDApIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGhhbmRsZVJlcGx5KHRoaXNba0Rpc3BhdGNoZXNdKVxuICAgIH0sIGRlbGF5KVxuICB9IGVsc2Uge1xuICAgIGhhbmRsZVJlcGx5KHRoaXNba0Rpc3BhdGNoZXNdKVxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlUmVwbHkgKG1vY2tEaXNwYXRjaGVzLCBfZGF0YSA9IGRhdGEpIHtcbiAgICAvLyBmZXRjaCdzIEhlYWRlcnNMaXN0IGlzIGEgMUQgc3RyaW5nIGFycmF5XG4gICAgY29uc3Qgb3B0c0hlYWRlcnMgPSBBcnJheS5pc0FycmF5KG9wdHMuaGVhZGVycylcbiAgICAgID8gYnVpbGRIZWFkZXJzRnJvbUFycmF5KG9wdHMuaGVhZGVycylcbiAgICAgIDogb3B0cy5oZWFkZXJzXG4gICAgY29uc3QgYm9keSA9IHR5cGVvZiBfZGF0YSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBfZGF0YSh7IC4uLm9wdHMsIGhlYWRlcnM6IG9wdHNIZWFkZXJzIH0pXG4gICAgICA6IF9kYXRhXG5cbiAgICAvLyB1dGlsLnR5cGVzLmlzUHJvbWlzZSBpcyBsaWtlbHkgbmVlZGVkIGZvciBqZXN0LlxuICAgIGlmIChpc1Byb21pc2UoYm9keSkpIHtcbiAgICAgIC8vIElmIGhhbmRsZVJlcGx5IGlzIGFzeW5jaHJvbm91cywgdGhyb3dpbmcgYW4gZXJyb3JcbiAgICAgIC8vIGluIHRoZSBjYWxsYmFjayB3aWxsIHJlamVjdCB0aGUgcHJvbWlzZSwgcmF0aGVyIHRoYW5cbiAgICAgIC8vIHN5bmNocm9ub3VzbHkgdGhyb3cgdGhlIGVycm9yLCB3aGljaCBicmVha3Mgc29tZSB0ZXN0cy5cbiAgICAgIC8vIFJhdGhlciwgd2Ugd2FpdCBmb3IgdGhlIGNhbGxiYWNrIHRvIHJlc29sdmUgaWYgaXQgaXMgYVxuICAgICAgLy8gcHJvbWlzZSwgYW5kIHRoZW4gcmUtcnVuIGhhbmRsZVJlcGx5IHdpdGggdGhlIG5ldyBib2R5LlxuICAgICAgYm9keS50aGVuKChuZXdEYXRhKSA9PiBoYW5kbGVSZXBseShtb2NrRGlzcGF0Y2hlcywgbmV3RGF0YSkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZURhdGEgPSBnZXRSZXNwb25zZURhdGEoYm9keSlcbiAgICBjb25zdCByZXNwb25zZUhlYWRlcnMgPSBnZW5lcmF0ZUtleVZhbHVlcyhoZWFkZXJzKVxuICAgIGNvbnN0IHJlc3BvbnNlVHJhaWxlcnMgPSBnZW5lcmF0ZUtleVZhbHVlcyh0cmFpbGVycylcblxuICAgIGhhbmRsZXIuYWJvcnQgPSBub3BcbiAgICBoYW5kbGVyLm9uSGVhZGVycyhzdGF0dXNDb2RlLCByZXNwb25zZUhlYWRlcnMsIHJlc3VtZSwgZ2V0U3RhdHVzVGV4dChzdGF0dXNDb2RlKSlcbiAgICBoYW5kbGVyLm9uRGF0YShCdWZmZXIuZnJvbShyZXNwb25zZURhdGEpKVxuICAgIGhhbmRsZXIub25Db21wbGV0ZShyZXNwb25zZVRyYWlsZXJzKVxuICAgIGRlbGV0ZU1vY2tEaXNwYXRjaChtb2NrRGlzcGF0Y2hlcywga2V5KVxuICB9XG5cbiAgZnVuY3Rpb24gcmVzdW1lICgpIHt9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gYnVpbGRNb2NrRGlzcGF0Y2ggKCkge1xuICBjb25zdCBhZ2VudCA9IHRoaXNba01vY2tBZ2VudF1cbiAgY29uc3Qgb3JpZ2luID0gdGhpc1trT3JpZ2luXVxuICBjb25zdCBvcmlnaW5hbERpc3BhdGNoID0gdGhpc1trT3JpZ2luYWxEaXNwYXRjaF1cblxuICByZXR1cm4gZnVuY3Rpb24gZGlzcGF0Y2ggKG9wdHMsIGhhbmRsZXIpIHtcbiAgICBpZiAoYWdlbnQuaXNNb2NrQWN0aXZlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBtb2NrRGlzcGF0Y2guY2FsbCh0aGlzLCBvcHRzLCBoYW5kbGVyKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTW9ja05vdE1hdGNoZWRFcnJvcikge1xuICAgICAgICAgIGNvbnN0IG5ldENvbm5lY3QgPSBhZ2VudFtrR2V0TmV0Q29ubmVjdF0oKVxuICAgICAgICAgIGlmIChuZXRDb25uZWN0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1vY2tOb3RNYXRjaGVkRXJyb3IoYCR7ZXJyb3IubWVzc2FnZX06IHN1YnNlcXVlbnQgcmVxdWVzdCB0byBvcmlnaW4gJHtvcmlnaW59IHdhcyBub3QgYWxsb3dlZCAobmV0LmNvbm5lY3QgZGlzYWJsZWQpYClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNoZWNrTmV0Q29ubmVjdChuZXRDb25uZWN0LCBvcmlnaW4pKSB7XG4gICAgICAgICAgICBvcmlnaW5hbERpc3BhdGNoLmNhbGwodGhpcywgb3B0cywgaGFuZGxlcilcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1vY2tOb3RNYXRjaGVkRXJyb3IoYCR7ZXJyb3IubWVzc2FnZX06IHN1YnNlcXVlbnQgcmVxdWVzdCB0byBvcmlnaW4gJHtvcmlnaW59IHdhcyBub3QgYWxsb3dlZCAobmV0LmNvbm5lY3QgaXMgbm90IGVuYWJsZWQgZm9yIHRoaXMgb3JpZ2luKWApXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb3JpZ2luYWxEaXNwYXRjaC5jYWxsKHRoaXMsIG9wdHMsIGhhbmRsZXIpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrTmV0Q29ubmVjdCAobmV0Q29ubmVjdCwgb3JpZ2luKSB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwob3JpZ2luKVxuICBpZiAobmV0Q29ubmVjdCA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiB0cnVlXG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShuZXRDb25uZWN0KSAmJiBuZXRDb25uZWN0LnNvbWUoKG1hdGNoZXIpID0+IG1hdGNoVmFsdWUobWF0Y2hlciwgdXJsLmhvc3QpKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIGJ1aWxkTW9ja09wdGlvbnMgKG9wdHMpIHtcbiAgaWYgKG9wdHMpIHtcbiAgICBjb25zdCB7IGFnZW50LCAuLi5tb2NrT3B0aW9ucyB9ID0gb3B0c1xuICAgIHJldHVybiBtb2NrT3B0aW9uc1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRSZXNwb25zZURhdGEsXG4gIGdldE1vY2tEaXNwYXRjaCxcbiAgYWRkTW9ja0Rpc3BhdGNoLFxuICBkZWxldGVNb2NrRGlzcGF0Y2gsXG4gIGJ1aWxkS2V5LFxuICBnZW5lcmF0ZUtleVZhbHVlcyxcbiAgbWF0Y2hWYWx1ZSxcbiAgZ2V0UmVzcG9uc2UsXG4gIGdldFN0YXR1c1RleHQsXG4gIG1vY2tEaXNwYXRjaCxcbiAgYnVpbGRNb2NrRGlzcGF0Y2gsXG4gIGNoZWNrTmV0Q29ubmVjdCxcbiAgYnVpbGRNb2NrT3B0aW9ucyxcbiAgZ2V0SGVhZGVyQnlOYW1lXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBnZXRSZXNwb25zZURhdGEsIGJ1aWxkS2V5LCBhZGRNb2NrRGlzcGF0Y2ggfSA9IHJlcXVpcmUoJy4vbW9jay11dGlscycpXG5jb25zdCB7XG4gIGtEaXNwYXRjaGVzLFxuICBrRGlzcGF0Y2hLZXksXG4gIGtEZWZhdWx0SGVhZGVycyxcbiAga0RlZmF1bHRUcmFpbGVycyxcbiAga0NvbnRlbnRMZW5ndGgsXG4gIGtNb2NrRGlzcGF0Y2hcbn0gPSByZXF1aXJlKCcuL21vY2stc3ltYm9scycpXG5jb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5jb25zdCB7IGJ1aWxkVVJMIH0gPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHNjb3BlIEFQSSBmb3IgYW4gaW50ZXJjZXB0b3IgcmVwbHlcbiAqL1xuY2xhc3MgTW9ja1Njb3BlIHtcbiAgY29uc3RydWN0b3IgKG1vY2tEaXNwYXRjaCkge1xuICAgIHRoaXNba01vY2tEaXNwYXRjaF0gPSBtb2NrRGlzcGF0Y2hcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxheSBhIHJlcGx5IGJ5IGEgc2V0IGFtb3VudCBpbiBtcy5cbiAgICovXG4gIGRlbGF5ICh3YWl0SW5Ncykge1xuICAgIGlmICh0eXBlb2Ygd2FpdEluTXMgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHdhaXRJbk1zKSB8fCB3YWl0SW5NcyA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3dhaXRJbk1zIG11c3QgYmUgYSB2YWxpZCBpbnRlZ2VyID4gMCcpXG4gICAgfVxuXG4gICAgdGhpc1trTW9ja0Rpc3BhdGNoXS5kZWxheSA9IHdhaXRJbk1zXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3IgYSBkZWZpbmVkIHJlcGx5LCBuZXZlciBtYXJrIGFzIGNvbnN1bWVkLlxuICAgKi9cbiAgcGVyc2lzdCAoKSB7XG4gICAgdGhpc1trTW9ja0Rpc3BhdGNoXS5wZXJzaXN0ID0gdHJ1ZVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQWxsb3cgb25lIHRvIGRlZmluZSBhIHJlcGx5IGZvciBhIHNldCBhbW91bnQgb2YgbWF0Y2hpbmcgcmVxdWVzdHMuXG4gICAqL1xuICB0aW1lcyAocmVwZWF0VGltZXMpIHtcbiAgICBpZiAodHlwZW9mIHJlcGVhdFRpbWVzICE9PSAnbnVtYmVyJyB8fCAhTnVtYmVyLmlzSW50ZWdlcihyZXBlYXRUaW1lcykgfHwgcmVwZWF0VGltZXMgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdyZXBlYXRUaW1lcyBtdXN0IGJlIGEgdmFsaWQgaW50ZWdlciA+IDAnKVxuICAgIH1cblxuICAgIHRoaXNba01vY2tEaXNwYXRjaF0udGltZXMgPSByZXBlYXRUaW1lc1xuICAgIHJldHVybiB0aGlzXG4gIH1cbn1cblxuLyoqXG4gKiBEZWZpbmVzIGFuIGludGVyY2VwdG9yIGZvciBhIE1vY2tcbiAqL1xuY2xhc3MgTW9ja0ludGVyY2VwdG9yIHtcbiAgY29uc3RydWN0b3IgKG9wdHMsIG1vY2tEaXNwYXRjaGVzKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdvcHRzIG11c3QgYmUgYW4gb2JqZWN0JylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvcHRzLnBhdGggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ29wdHMucGF0aCBtdXN0IGJlIGRlZmluZWQnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIG9wdHMubWV0aG9kID09PSAndW5kZWZpbmVkJykge1xuICAgICAgb3B0cy5tZXRob2QgPSAnR0VUJ1xuICAgIH1cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzEyNDVcbiAgICAvLyBBcyBwZXIgUkZDIDM5ODYsIGNsaWVudHMgYXJlIG5vdCBzdXBwb3NlZCB0byBzZW5kIFVSSVxuICAgIC8vIGZyYWdtZW50cyB0byBzZXJ2ZXJzIHdoZW4gdGhleSByZXRyaWV2ZSBhIGRvY3VtZW50LFxuICAgIGlmICh0eXBlb2Ygb3B0cy5wYXRoID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKG9wdHMucXVlcnkpIHtcbiAgICAgICAgb3B0cy5wYXRoID0gYnVpbGRVUkwob3B0cy5wYXRoLCBvcHRzLnF1ZXJ5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTWF0Y2hlcyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9ibG9iL21haW4vbGliL2ZldGNoL2luZGV4LmpzI0wxODExXG4gICAgICAgIGNvbnN0IHBhcnNlZFVSTCA9IG5ldyBVUkwob3B0cy5wYXRoLCAnZGF0YTovLycpXG4gICAgICAgIG9wdHMucGF0aCA9IHBhcnNlZFVSTC5wYXRobmFtZSArIHBhcnNlZFVSTC5zZWFyY2hcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvcHRzLm1ldGhvZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG9wdHMubWV0aG9kID0gb3B0cy5tZXRob2QudG9VcHBlckNhc2UoKVxuICAgIH1cblxuICAgIHRoaXNba0Rpc3BhdGNoS2V5XSA9IGJ1aWxkS2V5KG9wdHMpXG4gICAgdGhpc1trRGlzcGF0Y2hlc10gPSBtb2NrRGlzcGF0Y2hlc1xuICAgIHRoaXNba0RlZmF1bHRIZWFkZXJzXSA9IHt9XG4gICAgdGhpc1trRGVmYXVsdFRyYWlsZXJzXSA9IHt9XG4gICAgdGhpc1trQ29udGVudExlbmd0aF0gPSBmYWxzZVxuICB9XG5cbiAgY3JlYXRlTW9ja1Njb3BlRGlzcGF0Y2hEYXRhIChzdGF0dXNDb2RlLCBkYXRhLCByZXNwb25zZU9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IGdldFJlc3BvbnNlRGF0YShkYXRhKVxuICAgIGNvbnN0IGNvbnRlbnRMZW5ndGggPSB0aGlzW2tDb250ZW50TGVuZ3RoXSA/IHsgJ2NvbnRlbnQtbGVuZ3RoJzogcmVzcG9uc2VEYXRhLmxlbmd0aCB9IDoge31cbiAgICBjb25zdCBoZWFkZXJzID0geyAuLi50aGlzW2tEZWZhdWx0SGVhZGVyc10sIC4uLmNvbnRlbnRMZW5ndGgsIC4uLnJlc3BvbnNlT3B0aW9ucy5oZWFkZXJzIH1cbiAgICBjb25zdCB0cmFpbGVycyA9IHsgLi4udGhpc1trRGVmYXVsdFRyYWlsZXJzXSwgLi4ucmVzcG9uc2VPcHRpb25zLnRyYWlsZXJzIH1cblxuICAgIHJldHVybiB7IHN0YXR1c0NvZGUsIGRhdGEsIGhlYWRlcnMsIHRyYWlsZXJzIH1cbiAgfVxuXG4gIHZhbGlkYXRlUmVwbHlQYXJhbWV0ZXJzIChzdGF0dXNDb2RlLCBkYXRhLCByZXNwb25zZU9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIHN0YXR1c0NvZGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3N0YXR1c0NvZGUgbXVzdCBiZSBkZWZpbmVkJylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdkYXRhIG11c3QgYmUgZGVmaW5lZCcpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVzcG9uc2VPcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdyZXNwb25zZU9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNb2NrIGFuIHVuZGljaSByZXF1ZXN0IHdpdGggYSBkZWZpbmVkIHJlcGx5LlxuICAgKi9cbiAgcmVwbHkgKHJlcGx5RGF0YSkge1xuICAgIC8vIFZhbHVlcyBvZiByZXBseSBhcmVuJ3QgYXZhaWxhYmxlIHJpZ2h0IG5vdyBhcyB0aGV5XG4gICAgLy8gY2FuIG9ubHkgYmUgYXZhaWxhYmxlIHdoZW4gdGhlIHJlcGx5IGNhbGxiYWNrIGlzIGludm9rZWQuXG4gICAgaWYgKHR5cGVvZiByZXBseURhdGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFdlJ2xsIGZpcnN0IHdyYXAgdGhlIHByb3ZpZGVkIGNhbGxiYWNrIGluIGFub3RoZXIgZnVuY3Rpb24sXG4gICAgICAvLyB0aGlzIGZ1bmN0aW9uIHdpbGwgcHJvcGVybHkgcmVzb2x2ZSB0aGUgZGF0YSBmcm9tIHRoZSBjYWxsYmFja1xuICAgICAgLy8gd2hlbiBpbnZva2VkLlxuICAgICAgY29uc3Qgd3JhcHBlZERlZmF1bHRzQ2FsbGJhY2sgPSAob3B0cykgPT4ge1xuICAgICAgICAvLyBPdXIgcmVwbHkgb3B0aW9ucyBjYWxsYmFjayBjb250YWlucyB0aGUgcGFyYW1ldGVyIGZvciBzdGF0dXNDb2RlLCBkYXRhIGFuZCBvcHRpb25zLlxuICAgICAgICBjb25zdCByZXNvbHZlZERhdGEgPSByZXBseURhdGEob3B0cylcblxuICAgICAgICAvLyBDaGVjayBpZiBpdCBpcyBpbiB0aGUgcmlnaHQgZm9ybWF0XG4gICAgICAgIGlmICh0eXBlb2YgcmVzb2x2ZWREYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcigncmVwbHkgb3B0aW9ucyBjYWxsYmFjayBtdXN0IHJldHVybiBhbiBvYmplY3QnKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBzdGF0dXNDb2RlLCBkYXRhID0gJycsIHJlc3BvbnNlT3B0aW9ucyA9IHt9IH0gPSByZXNvbHZlZERhdGFcbiAgICAgICAgdGhpcy52YWxpZGF0ZVJlcGx5UGFyYW1ldGVycyhzdGF0dXNDb2RlLCBkYXRhLCByZXNwb25zZU9wdGlvbnMpXG4gICAgICAgIC8vIFNpbmNlIHRoZSB2YWx1ZXMgY2FuIGJlIG9idGFpbmVkIGltbWVkaWF0ZWx5IHdlIHJldHVybiB0aGVtXG4gICAgICAgIC8vIGZyb20gdGhpcyBoaWdoZXIgb3JkZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHJlc29sdmVkIGxhdGVyLlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnRoaXMuY3JlYXRlTW9ja1Njb3BlRGlzcGF0Y2hEYXRhKHN0YXR1c0NvZGUsIGRhdGEsIHJlc3BvbnNlT3B0aW9ucylcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBZGQgdXN1YWwgZGlzcGF0Y2ggZGF0YSwgYnV0IHRoaXMgdGltZSBzZXQgdGhlIGRhdGEgcGFyYW1ldGVyIHRvIGZ1bmN0aW9uIHRoYXQgd2lsbCBldmVudHVhbGx5IHByb3ZpZGUgZGF0YS5cbiAgICAgIGNvbnN0IG5ld01vY2tEaXNwYXRjaCA9IGFkZE1vY2tEaXNwYXRjaCh0aGlzW2tEaXNwYXRjaGVzXSwgdGhpc1trRGlzcGF0Y2hLZXldLCB3cmFwcGVkRGVmYXVsdHNDYWxsYmFjaylcbiAgICAgIHJldHVybiBuZXcgTW9ja1Njb3BlKG5ld01vY2tEaXNwYXRjaClcbiAgICB9XG5cbiAgICAvLyBXZSBjYW4gaGF2ZSBlaXRoZXIgb25lIG9yIHRocmVlIHBhcmFtZXRlcnMsIGlmIHdlIGdldCBoZXJlLFxuICAgIC8vIHdlIHNob3VsZCBoYXZlIDEtMyBwYXJhbWV0ZXJzLiBTbyB3ZSBzcHJlYWQgdGhlIGFyZ3VtZW50cyBvZlxuICAgIC8vIHRoaXMgZnVuY3Rpb24gdG8gb2J0YWluIHRoZSBwYXJhbWV0ZXJzLCBzaW5jZSByZXBseURhdGEgd2lsbCBhbHdheXNcbiAgICAvLyBqdXN0IGJlIHRoZSBzdGF0dXNDb2RlLlxuICAgIGNvbnN0IFtzdGF0dXNDb2RlLCBkYXRhID0gJycsIHJlc3BvbnNlT3B0aW9ucyA9IHt9XSA9IFsuLi5hcmd1bWVudHNdXG4gICAgdGhpcy52YWxpZGF0ZVJlcGx5UGFyYW1ldGVycyhzdGF0dXNDb2RlLCBkYXRhLCByZXNwb25zZU9wdGlvbnMpXG5cbiAgICAvLyBTZW5kIGluLWFscmVhZHkgcHJvdmlkZWQgZGF0YSBsaWtlIHVzdWFsXG4gICAgY29uc3QgZGlzcGF0Y2hEYXRhID0gdGhpcy5jcmVhdGVNb2NrU2NvcGVEaXNwYXRjaERhdGEoc3RhdHVzQ29kZSwgZGF0YSwgcmVzcG9uc2VPcHRpb25zKVxuICAgIGNvbnN0IG5ld01vY2tEaXNwYXRjaCA9IGFkZE1vY2tEaXNwYXRjaCh0aGlzW2tEaXNwYXRjaGVzXSwgdGhpc1trRGlzcGF0Y2hLZXldLCBkaXNwYXRjaERhdGEpXG4gICAgcmV0dXJuIG5ldyBNb2NrU2NvcGUobmV3TW9ja0Rpc3BhdGNoKVxuICB9XG5cbiAgLyoqXG4gICAqIE1vY2sgYW4gdW5kaWNpIHJlcXVlc3Qgd2l0aCBhIGRlZmluZWQgZXJyb3IuXG4gICAqL1xuICByZXBseVdpdGhFcnJvciAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdlcnJvciBtdXN0IGJlIGRlZmluZWQnKVxuICAgIH1cblxuICAgIGNvbnN0IG5ld01vY2tEaXNwYXRjaCA9IGFkZE1vY2tEaXNwYXRjaCh0aGlzW2tEaXNwYXRjaGVzXSwgdGhpc1trRGlzcGF0Y2hLZXldLCB7IGVycm9yIH0pXG4gICAgcmV0dXJuIG5ldyBNb2NrU2NvcGUobmV3TW9ja0Rpc3BhdGNoKVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBkZWZhdWx0IHJlcGx5IGhlYWRlcnMgb24gdGhlIGludGVyY2VwdG9yIGZvciBzdWJzZXF1ZW50IHJlcGxpZXNcbiAgICovXG4gIGRlZmF1bHRSZXBseUhlYWRlcnMgKGhlYWRlcnMpIHtcbiAgICBpZiAodHlwZW9mIGhlYWRlcnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2hlYWRlcnMgbXVzdCBiZSBkZWZpbmVkJylcbiAgICB9XG5cbiAgICB0aGlzW2tEZWZhdWx0SGVhZGVyc10gPSBoZWFkZXJzXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZGVmYXVsdCByZXBseSB0cmFpbGVycyBvbiB0aGUgaW50ZXJjZXB0b3IgZm9yIHN1YnNlcXVlbnQgcmVwbGllc1xuICAgKi9cbiAgZGVmYXVsdFJlcGx5VHJhaWxlcnMgKHRyYWlsZXJzKSB7XG4gICAgaWYgKHR5cGVvZiB0cmFpbGVycyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcigndHJhaWxlcnMgbXVzdCBiZSBkZWZpbmVkJylcbiAgICB9XG5cbiAgICB0aGlzW2tEZWZhdWx0VHJhaWxlcnNdID0gdHJhaWxlcnNcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCByZXBseSBjb250ZW50IGxlbmd0aCBoZWFkZXIgZm9yIHJlcGxpZXMgb24gdGhlIGludGVyY2VwdG9yXG4gICAqL1xuICByZXBseUNvbnRlbnRMZW5ndGggKCkge1xuICAgIHRoaXNba0NvbnRlbnRMZW5ndGhdID0gdHJ1ZVxuICAgIHJldHVybiB0aGlzXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMuTW9ja0ludGVyY2VwdG9yID0gTW9ja0ludGVyY2VwdG9yXG5tb2R1bGUuZXhwb3J0cy5Nb2NrU2NvcGUgPSBNb2NrU2NvcGVcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IHByb21pc2lmeSB9ID0gcmVxdWlyZSgndXRpbCcpXG5jb25zdCBDbGllbnQgPSByZXF1aXJlKCcuLi9jbGllbnQnKVxuY29uc3QgeyBidWlsZE1vY2tEaXNwYXRjaCB9ID0gcmVxdWlyZSgnLi9tb2NrLXV0aWxzJylcbmNvbnN0IHtcbiAga0Rpc3BhdGNoZXMsXG4gIGtNb2NrQWdlbnQsXG4gIGtDbG9zZSxcbiAga09yaWdpbmFsQ2xvc2UsXG4gIGtPcmlnaW4sXG4gIGtPcmlnaW5hbERpc3BhdGNoLFxuICBrQ29ubmVjdGVkXG59ID0gcmVxdWlyZSgnLi9tb2NrLXN5bWJvbHMnKVxuY29uc3QgeyBNb2NrSW50ZXJjZXB0b3IgfSA9IHJlcXVpcmUoJy4vbW9jay1pbnRlcmNlcHRvcicpXG5jb25zdCBTeW1ib2xzID0gcmVxdWlyZSgnLi4vY29yZS9zeW1ib2xzJylcbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcblxuLyoqXG4gKiBNb2NrQ2xpZW50IHByb3ZpZGVzIGFuIEFQSSB0aGF0IGV4dGVuZHMgdGhlIENsaWVudCB0byBpbmZsdWVuY2UgdGhlIG1vY2tEaXNwYXRjaGVzLlxuICovXG5jbGFzcyBNb2NrQ2xpZW50IGV4dGVuZHMgQ2xpZW50IHtcbiAgY29uc3RydWN0b3IgKG9yaWdpbiwgb3B0cykge1xuICAgIHN1cGVyKG9yaWdpbiwgb3B0cylcblxuICAgIGlmICghb3B0cyB8fCAhb3B0cy5hZ2VudCB8fCB0eXBlb2Ygb3B0cy5hZ2VudC5kaXNwYXRjaCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdBcmd1bWVudCBvcHRzLmFnZW50IG11c3QgaW1wbGVtZW50IEFnZW50JylcbiAgICB9XG5cbiAgICB0aGlzW2tNb2NrQWdlbnRdID0gb3B0cy5hZ2VudFxuICAgIHRoaXNba09yaWdpbl0gPSBvcmlnaW5cbiAgICB0aGlzW2tEaXNwYXRjaGVzXSA9IFtdXG4gICAgdGhpc1trQ29ubmVjdGVkXSA9IDFcbiAgICB0aGlzW2tPcmlnaW5hbERpc3BhdGNoXSA9IHRoaXMuZGlzcGF0Y2hcbiAgICB0aGlzW2tPcmlnaW5hbENsb3NlXSA9IHRoaXMuY2xvc2UuYmluZCh0aGlzKVxuXG4gICAgdGhpcy5kaXNwYXRjaCA9IGJ1aWxkTW9ja0Rpc3BhdGNoLmNhbGwodGhpcylcbiAgICB0aGlzLmNsb3NlID0gdGhpc1trQ2xvc2VdXG4gIH1cblxuICBnZXQgW1N5bWJvbHMua0Nvbm5lY3RlZF0gKCkge1xuICAgIHJldHVybiB0aGlzW2tDb25uZWN0ZWRdXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCB0aGUgYmFzZSBpbnRlcmNlcHRvciBmb3IgbW9ja2luZyByZXBsaWVzIGZyb20gdW5kaWNpLlxuICAgKi9cbiAgaW50ZXJjZXB0IChvcHRzKSB7XG4gICAgcmV0dXJuIG5ldyBNb2NrSW50ZXJjZXB0b3Iob3B0cywgdGhpc1trRGlzcGF0Y2hlc10pXG4gIH1cblxuICBhc3luYyBba0Nsb3NlXSAoKSB7XG4gICAgYXdhaXQgcHJvbWlzaWZ5KHRoaXNba09yaWdpbmFsQ2xvc2VdKSgpXG4gICAgdGhpc1trQ29ubmVjdGVkXSA9IDBcbiAgICB0aGlzW2tNb2NrQWdlbnRdW1N5bWJvbHMua0NsaWVudHNdLmRlbGV0ZSh0aGlzW2tPcmlnaW5dKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTW9ja0NsaWVudFxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgcHJvbWlzaWZ5IH0gPSByZXF1aXJlKCd1dGlsJylcbmNvbnN0IFBvb2wgPSByZXF1aXJlKCcuLi9wb29sJylcbmNvbnN0IHsgYnVpbGRNb2NrRGlzcGF0Y2ggfSA9IHJlcXVpcmUoJy4vbW9jay11dGlscycpXG5jb25zdCB7XG4gIGtEaXNwYXRjaGVzLFxuICBrTW9ja0FnZW50LFxuICBrQ2xvc2UsXG4gIGtPcmlnaW5hbENsb3NlLFxuICBrT3JpZ2luLFxuICBrT3JpZ2luYWxEaXNwYXRjaCxcbiAga0Nvbm5lY3RlZFxufSA9IHJlcXVpcmUoJy4vbW9jay1zeW1ib2xzJylcbmNvbnN0IHsgTW9ja0ludGVyY2VwdG9yIH0gPSByZXF1aXJlKCcuL21vY2staW50ZXJjZXB0b3InKVxuY29uc3QgU3ltYm9scyA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5cbi8qKlxuICogTW9ja1Bvb2wgcHJvdmlkZXMgYW4gQVBJIHRoYXQgZXh0ZW5kcyB0aGUgUG9vbCB0byBpbmZsdWVuY2UgdGhlIG1vY2tEaXNwYXRjaGVzLlxuICovXG5jbGFzcyBNb2NrUG9vbCBleHRlbmRzIFBvb2wge1xuICBjb25zdHJ1Y3RvciAob3JpZ2luLCBvcHRzKSB7XG4gICAgc3VwZXIob3JpZ2luLCBvcHRzKVxuXG4gICAgaWYgKCFvcHRzIHx8ICFvcHRzLmFnZW50IHx8IHR5cGVvZiBvcHRzLmFnZW50LmRpc3BhdGNoICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0FyZ3VtZW50IG9wdHMuYWdlbnQgbXVzdCBpbXBsZW1lbnQgQWdlbnQnKVxuICAgIH1cblxuICAgIHRoaXNba01vY2tBZ2VudF0gPSBvcHRzLmFnZW50XG4gICAgdGhpc1trT3JpZ2luXSA9IG9yaWdpblxuICAgIHRoaXNba0Rpc3BhdGNoZXNdID0gW11cbiAgICB0aGlzW2tDb25uZWN0ZWRdID0gMVxuICAgIHRoaXNba09yaWdpbmFsRGlzcGF0Y2hdID0gdGhpcy5kaXNwYXRjaFxuICAgIHRoaXNba09yaWdpbmFsQ2xvc2VdID0gdGhpcy5jbG9zZS5iaW5kKHRoaXMpXG5cbiAgICB0aGlzLmRpc3BhdGNoID0gYnVpbGRNb2NrRGlzcGF0Y2guY2FsbCh0aGlzKVxuICAgIHRoaXMuY2xvc2UgPSB0aGlzW2tDbG9zZV1cbiAgfVxuXG4gIGdldCBbU3ltYm9scy5rQ29ubmVjdGVkXSAoKSB7XG4gICAgcmV0dXJuIHRoaXNba0Nvbm5lY3RlZF1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwIHRoZSBiYXNlIGludGVyY2VwdG9yIGZvciBtb2NraW5nIHJlcGxpZXMgZnJvbSB1bmRpY2kuXG4gICAqL1xuICBpbnRlcmNlcHQgKG9wdHMpIHtcbiAgICByZXR1cm4gbmV3IE1vY2tJbnRlcmNlcHRvcihvcHRzLCB0aGlzW2tEaXNwYXRjaGVzXSlcbiAgfVxuXG4gIGFzeW5jIFtrQ2xvc2VdICgpIHtcbiAgICBhd2FpdCBwcm9taXNpZnkodGhpc1trT3JpZ2luYWxDbG9zZV0pKClcbiAgICB0aGlzW2tDb25uZWN0ZWRdID0gMFxuICAgIHRoaXNba01vY2tBZ2VudF1bU3ltYm9scy5rQ2xpZW50c10uZGVsZXRlKHRoaXNba09yaWdpbl0pXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBNb2NrUG9vbFxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHNpbmd1bGFycyA9IHtcbiAgcHJvbm91bjogJ2l0JyxcbiAgaXM6ICdpcycsXG4gIHdhczogJ3dhcycsXG4gIHRoaXM6ICd0aGlzJ1xufVxuXG5jb25zdCBwbHVyYWxzID0ge1xuICBwcm9ub3VuOiAndGhleScsXG4gIGlzOiAnYXJlJyxcbiAgd2FzOiAnd2VyZScsXG4gIHRoaXM6ICd0aGVzZSdcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBQbHVyYWxpemVyIHtcbiAgY29uc3RydWN0b3IgKHNpbmd1bGFyLCBwbHVyYWwpIHtcbiAgICB0aGlzLnNpbmd1bGFyID0gc2luZ3VsYXJcbiAgICB0aGlzLnBsdXJhbCA9IHBsdXJhbFxuICB9XG5cbiAgcGx1cmFsaXplIChjb3VudCkge1xuICAgIGNvbnN0IG9uZSA9IGNvdW50ID09PSAxXG4gICAgY29uc3Qga2V5cyA9IG9uZSA/IHNpbmd1bGFycyA6IHBsdXJhbHNcbiAgICBjb25zdCBub3VuID0gb25lID8gdGhpcy5zaW5ndWxhciA6IHRoaXMucGx1cmFsXG4gICAgcmV0dXJuIHsgLi4ua2V5cywgY291bnQsIG5vdW4gfVxuICB9XG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBUcmFuc2Zvcm0gfSA9IHJlcXVpcmUoJ3N0cmVhbScpXG5jb25zdCB7IENvbnNvbGUgfSA9IHJlcXVpcmUoJ2NvbnNvbGUnKVxuXG4vKipcbiAqIEdldHMgdGhlIG91dHB1dCBvZiBgY29uc29sZS50YWJsZSjigKYpYCBhcyBhIHN0cmluZy5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBQZW5kaW5nSW50ZXJjZXB0b3JzRm9ybWF0dGVyIHtcbiAgY29uc3RydWN0b3IgKHsgZGlzYWJsZUNvbG9ycyB9ID0ge30pIHtcbiAgICB0aGlzLnRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oe1xuICAgICAgdHJhbnNmb3JtIChjaHVuaywgX2VuYywgY2IpIHtcbiAgICAgICAgY2IobnVsbCwgY2h1bmspXG4gICAgICB9XG4gICAgfSlcblxuICAgIHRoaXMubG9nZ2VyID0gbmV3IENvbnNvbGUoe1xuICAgICAgc3Rkb3V0OiB0aGlzLnRyYW5zZm9ybSxcbiAgICAgIGluc3BlY3RPcHRpb25zOiB7XG4gICAgICAgIGNvbG9yczogIWRpc2FibGVDb2xvcnMgJiYgIXByb2Nlc3MuZW52LkNJXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZvcm1hdCAocGVuZGluZ0ludGVyY2VwdG9ycykge1xuICAgIGNvbnN0IHdpdGhQcmV0dHlIZWFkZXJzID0gcGVuZGluZ0ludGVyY2VwdG9ycy5tYXAoXG4gICAgICAoeyBtZXRob2QsIHBhdGgsIGRhdGE6IHsgc3RhdHVzQ29kZSB9LCBwZXJzaXN0LCB0aW1lcywgdGltZXNJbnZva2VkLCBvcmlnaW4gfSkgPT4gKHtcbiAgICAgICAgTWV0aG9kOiBtZXRob2QsXG4gICAgICAgIE9yaWdpbjogb3JpZ2luLFxuICAgICAgICBQYXRoOiBwYXRoLFxuICAgICAgICAnU3RhdHVzIGNvZGUnOiBzdGF0dXNDb2RlLFxuICAgICAgICBQZXJzaXN0ZW50OiBwZXJzaXN0ID8gJ+KchScgOiAn4p2MJyxcbiAgICAgICAgSW52b2NhdGlvbnM6IHRpbWVzSW52b2tlZCxcbiAgICAgICAgUmVtYWluaW5nOiBwZXJzaXN0ID8gSW5maW5pdHkgOiB0aW1lcyAtIHRpbWVzSW52b2tlZFxuICAgICAgfSkpXG5cbiAgICB0aGlzLmxvZ2dlci50YWJsZSh3aXRoUHJldHR5SGVhZGVycylcbiAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0ucmVhZCgpLnRvU3RyaW5nKClcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsga0NsaWVudHMgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCBBZ2VudCA9IHJlcXVpcmUoJy4uL2FnZW50JylcbmNvbnN0IHtcbiAga0FnZW50LFxuICBrTW9ja0FnZW50U2V0LFxuICBrTW9ja0FnZW50R2V0LFxuICBrRGlzcGF0Y2hlcyxcbiAga0lzTW9ja0FjdGl2ZSxcbiAga05ldENvbm5lY3QsXG4gIGtHZXROZXRDb25uZWN0LFxuICBrT3B0aW9ucyxcbiAga0ZhY3Rvcnlcbn0gPSByZXF1aXJlKCcuL21vY2stc3ltYm9scycpXG5jb25zdCBNb2NrQ2xpZW50ID0gcmVxdWlyZSgnLi9tb2NrLWNsaWVudCcpXG5jb25zdCBNb2NrUG9vbCA9IHJlcXVpcmUoJy4vbW9jay1wb29sJylcbmNvbnN0IHsgbWF0Y2hWYWx1ZSwgYnVpbGRNb2NrT3B0aW9ucyB9ID0gcmVxdWlyZSgnLi9tb2NrLXV0aWxzJylcbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IsIFVuZGljaUVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5jb25zdCBEaXNwYXRjaGVyID0gcmVxdWlyZSgnLi4vZGlzcGF0Y2hlcicpXG5jb25zdCBQbHVyYWxpemVyID0gcmVxdWlyZSgnLi9wbHVyYWxpemVyJylcbmNvbnN0IFBlbmRpbmdJbnRlcmNlcHRvcnNGb3JtYXR0ZXIgPSByZXF1aXJlKCcuL3BlbmRpbmctaW50ZXJjZXB0b3JzLWZvcm1hdHRlcicpXG5cbmNsYXNzIEZha2VXZWFrUmVmIHtcbiAgY29uc3RydWN0b3IgKHZhbHVlKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gIH1cblxuICBkZXJlZiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVcbiAgfVxufVxuXG5jbGFzcyBNb2NrQWdlbnQgZXh0ZW5kcyBEaXNwYXRjaGVyIHtcbiAgY29uc3RydWN0b3IgKG9wdHMpIHtcbiAgICBzdXBlcihvcHRzKVxuXG4gICAgdGhpc1trTmV0Q29ubmVjdF0gPSB0cnVlXG4gICAgdGhpc1trSXNNb2NrQWN0aXZlXSA9IHRydWVcblxuICAgIC8vIEluc3RhbnRpYXRlIEFnZW50IGFuZCBlbmNhcHN1bGF0ZVxuICAgIGlmICgob3B0cyAmJiBvcHRzLmFnZW50ICYmIHR5cGVvZiBvcHRzLmFnZW50LmRpc3BhdGNoICE9PSAnZnVuY3Rpb24nKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdBcmd1bWVudCBvcHRzLmFnZW50IG11c3QgaW1wbGVtZW50IEFnZW50JylcbiAgICB9XG4gICAgY29uc3QgYWdlbnQgPSBvcHRzICYmIG9wdHMuYWdlbnQgPyBvcHRzLmFnZW50IDogbmV3IEFnZW50KG9wdHMpXG4gICAgdGhpc1trQWdlbnRdID0gYWdlbnRcblxuICAgIHRoaXNba0NsaWVudHNdID0gYWdlbnRba0NsaWVudHNdXG4gICAgdGhpc1trT3B0aW9uc10gPSBidWlsZE1vY2tPcHRpb25zKG9wdHMpXG4gIH1cblxuICBnZXQgKG9yaWdpbikge1xuICAgIGxldCBkaXNwYXRjaGVyID0gdGhpc1trTW9ja0FnZW50R2V0XShvcmlnaW4pXG5cbiAgICBpZiAoIWRpc3BhdGNoZXIpIHtcbiAgICAgIGRpc3BhdGNoZXIgPSB0aGlzW2tGYWN0b3J5XShvcmlnaW4pXG4gICAgICB0aGlzW2tNb2NrQWdlbnRTZXRdKG9yaWdpbiwgZGlzcGF0Y2hlcilcbiAgICB9XG4gICAgcmV0dXJuIGRpc3BhdGNoZXJcbiAgfVxuXG4gIGRpc3BhdGNoIChvcHRzLCBoYW5kbGVyKSB7XG4gICAgLy8gQ2FsbCBNb2NrQWdlbnQuZ2V0IHRvIHBlcmZvcm0gYWRkaXRpb25hbCBzZXR1cCBiZWZvcmUgZGlzcGF0Y2hpbmcgYXMgbm9ybWFsXG4gICAgdGhpcy5nZXQob3B0cy5vcmlnaW4pXG4gICAgcmV0dXJuIHRoaXNba0FnZW50XS5kaXNwYXRjaChvcHRzLCBoYW5kbGVyKVxuICB9XG5cbiAgYXN5bmMgY2xvc2UgKCkge1xuICAgIGF3YWl0IHRoaXNba0FnZW50XS5jbG9zZSgpXG4gICAgdGhpc1trQ2xpZW50c10uY2xlYXIoKVxuICB9XG5cbiAgZGVhY3RpdmF0ZSAoKSB7XG4gICAgdGhpc1trSXNNb2NrQWN0aXZlXSA9IGZhbHNlXG4gIH1cblxuICBhY3RpdmF0ZSAoKSB7XG4gICAgdGhpc1trSXNNb2NrQWN0aXZlXSA9IHRydWVcbiAgfVxuXG4gIGVuYWJsZU5ldENvbm5lY3QgKG1hdGNoZXIpIHtcbiAgICBpZiAodHlwZW9mIG1hdGNoZXIgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBtYXRjaGVyID09PSAnZnVuY3Rpb24nIHx8IG1hdGNoZXIgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXNba05ldENvbm5lY3RdKSkge1xuICAgICAgICB0aGlzW2tOZXRDb25uZWN0XS5wdXNoKG1hdGNoZXIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzW2tOZXRDb25uZWN0XSA9IFttYXRjaGVyXVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1hdGNoZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzW2tOZXRDb25uZWN0XSA9IHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdVbnN1cHBvcnRlZCBtYXRjaGVyLiBNdXN0IGJlIG9uZSBvZiBTdHJpbmd8RnVuY3Rpb258UmVnRXhwLicpXG4gICAgfVxuICB9XG5cbiAgZGlzYWJsZU5ldENvbm5lY3QgKCkge1xuICAgIHRoaXNba05ldENvbm5lY3RdID0gZmFsc2VcbiAgfVxuXG4gIC8vIFRoaXMgaXMgcmVxdWlyZWQgdG8gYnlwYXNzIGlzc3VlcyBjYXVzZWQgYnkgdXNpbmcgZ2xvYmFsIHN5bWJvbHMgLSBzZWU6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2lzc3Vlcy8xNDQ3XG4gIGdldCBpc01vY2tBY3RpdmUgKCkge1xuICAgIHJldHVybiB0aGlzW2tJc01vY2tBY3RpdmVdXG4gIH1cblxuICBba01vY2tBZ2VudFNldF0gKG9yaWdpbiwgZGlzcGF0Y2hlcikge1xuICAgIHRoaXNba0NsaWVudHNdLnNldChvcmlnaW4sIG5ldyBGYWtlV2Vha1JlZihkaXNwYXRjaGVyKSlcbiAgfVxuXG4gIFtrRmFjdG9yeV0gKG9yaWdpbikge1xuICAgIGNvbnN0IG1vY2tPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7IGFnZW50OiB0aGlzIH0sIHRoaXNba09wdGlvbnNdKVxuICAgIHJldHVybiB0aGlzW2tPcHRpb25zXSAmJiB0aGlzW2tPcHRpb25zXS5jb25uZWN0aW9ucyA9PT0gMVxuICAgICAgPyBuZXcgTW9ja0NsaWVudChvcmlnaW4sIG1vY2tPcHRpb25zKVxuICAgICAgOiBuZXcgTW9ja1Bvb2wob3JpZ2luLCBtb2NrT3B0aW9ucylcbiAgfVxuXG4gIFtrTW9ja0FnZW50R2V0XSAob3JpZ2luKSB7XG4gICAgLy8gRmlyc3QgY2hlY2sgaWYgd2UgY2FuIGltbWVkaWF0ZWx5IGZpbmQgaXRcbiAgICBjb25zdCByZWYgPSB0aGlzW2tDbGllbnRzXS5nZXQob3JpZ2luKVxuICAgIGlmIChyZWYpIHtcbiAgICAgIHJldHVybiByZWYuZGVyZWYoKVxuICAgIH1cblxuICAgIC8vIElmIHRoZSBvcmlnaW4gaXMgbm90IGEgc3RyaW5nIGNyZWF0ZSBhIGR1bW15IHBhcmVudCBwb29sIGFuZCByZXR1cm4gdG8gdXNlclxuICAgIGlmICh0eXBlb2Ygb3JpZ2luICE9PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgZGlzcGF0Y2hlciA9IHRoaXNba0ZhY3RvcnldKCdodHRwOi8vbG9jYWxob3N0Ojk5OTknKVxuICAgICAgdGhpc1trTW9ja0FnZW50U2V0XShvcmlnaW4sIGRpc3BhdGNoZXIpXG4gICAgICByZXR1cm4gZGlzcGF0Y2hlclxuICAgIH1cblxuICAgIC8vIElmIHdlIG1hdGNoLCBjcmVhdGUgYSBwb29sIGFuZCBhc3NpZ24gdGhlIHNhbWUgZGlzcGF0Y2hlc1xuICAgIGZvciAoY29uc3QgW2tleU1hdGNoZXIsIG5vbkV4cGxpY2l0UmVmXSBvZiBBcnJheS5mcm9tKHRoaXNba0NsaWVudHNdKSkge1xuICAgICAgY29uc3Qgbm9uRXhwbGljaXREaXNwYXRjaGVyID0gbm9uRXhwbGljaXRSZWYuZGVyZWYoKVxuICAgICAgaWYgKG5vbkV4cGxpY2l0RGlzcGF0Y2hlciAmJiB0eXBlb2Yga2V5TWF0Y2hlciAhPT0gJ3N0cmluZycgJiYgbWF0Y2hWYWx1ZShrZXlNYXRjaGVyLCBvcmlnaW4pKSB7XG4gICAgICAgIGNvbnN0IGRpc3BhdGNoZXIgPSB0aGlzW2tGYWN0b3J5XShvcmlnaW4pXG4gICAgICAgIHRoaXNba01vY2tBZ2VudFNldF0ob3JpZ2luLCBkaXNwYXRjaGVyKVxuICAgICAgICBkaXNwYXRjaGVyW2tEaXNwYXRjaGVzXSA9IG5vbkV4cGxpY2l0RGlzcGF0Y2hlcltrRGlzcGF0Y2hlc11cbiAgICAgICAgcmV0dXJuIGRpc3BhdGNoZXJcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBba0dldE5ldENvbm5lY3RdICgpIHtcbiAgICByZXR1cm4gdGhpc1trTmV0Q29ubmVjdF1cbiAgfVxuXG4gIHBlbmRpbmdJbnRlcmNlcHRvcnMgKCkge1xuICAgIGNvbnN0IG1vY2tBZ2VudENsaWVudHMgPSB0aGlzW2tDbGllbnRzXVxuXG4gICAgcmV0dXJuIEFycmF5LmZyb20obW9ja0FnZW50Q2xpZW50cy5lbnRyaWVzKCkpXG4gICAgICAuZmxhdE1hcCgoW29yaWdpbiwgc2NvcGVdKSA9PiBzY29wZS5kZXJlZigpW2tEaXNwYXRjaGVzXS5tYXAoZGlzcGF0Y2ggPT4gKHsgLi4uZGlzcGF0Y2gsIG9yaWdpbiB9KSkpXG4gICAgICAuZmlsdGVyKCh7IHBlbmRpbmcgfSkgPT4gcGVuZGluZylcbiAgfVxuXG4gIGFzc2VydE5vUGVuZGluZ0ludGVyY2VwdG9ycyAoeyBwZW5kaW5nSW50ZXJjZXB0b3JzRm9ybWF0dGVyID0gbmV3IFBlbmRpbmdJbnRlcmNlcHRvcnNGb3JtYXR0ZXIoKSB9ID0ge30pIHtcbiAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nSW50ZXJjZXB0b3JzKClcblxuICAgIGlmIChwZW5kaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcGx1cmFsaXplciA9IG5ldyBQbHVyYWxpemVyKCdpbnRlcmNlcHRvcicsICdpbnRlcmNlcHRvcnMnKS5wbHVyYWxpemUocGVuZGluZy5sZW5ndGgpXG5cbiAgICB0aHJvdyBuZXcgVW5kaWNpRXJyb3IoYFxuJHtwbHVyYWxpemVyLmNvdW50fSAke3BsdXJhbGl6ZXIubm91bn0gJHtwbHVyYWxpemVyLmlzfSBwZW5kaW5nOlxuXG4ke3BlbmRpbmdJbnRlcmNlcHRvcnNGb3JtYXR0ZXIuZm9ybWF0KHBlbmRpbmcpfVxuYC50cmltKCkpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBNb2NrQWdlbnRcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IGtQcm94eSwga0Nsb3NlLCBrRGVzdHJveSwga0ludGVyY2VwdG9ycyB9ID0gcmVxdWlyZSgnLi9jb3JlL3N5bWJvbHMnKVxuY29uc3QgeyBVUkwgfSA9IHJlcXVpcmUoJ3VybCcpXG5jb25zdCBBZ2VudCA9IHJlcXVpcmUoJy4vYWdlbnQnKVxuY29uc3QgUG9vbCA9IHJlcXVpcmUoJy4vcG9vbCcpXG5jb25zdCBEaXNwYXRjaGVyQmFzZSA9IHJlcXVpcmUoJy4vZGlzcGF0Y2hlci1iYXNlJylcbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IsIFJlcXVlc3RBYm9ydGVkRXJyb3IgfSA9IHJlcXVpcmUoJy4vY29yZS9lcnJvcnMnKVxuY29uc3QgYnVpbGRDb25uZWN0b3IgPSByZXF1aXJlKCcuL2NvcmUvY29ubmVjdCcpXG5cbmNvbnN0IGtBZ2VudCA9IFN5bWJvbCgncHJveHkgYWdlbnQnKVxuY29uc3Qga0NsaWVudCA9IFN5bWJvbCgncHJveHkgY2xpZW50JylcbmNvbnN0IGtQcm94eUhlYWRlcnMgPSBTeW1ib2woJ3Byb3h5IGhlYWRlcnMnKVxuY29uc3Qga1JlcXVlc3RUbHMgPSBTeW1ib2woJ3JlcXVlc3QgdGxzIHNldHRpbmdzJylcbmNvbnN0IGtQcm94eVRscyA9IFN5bWJvbCgncHJveHkgdGxzIHNldHRpbmdzJylcbmNvbnN0IGtDb25uZWN0RW5kcG9pbnQgPSBTeW1ib2woJ2Nvbm5lY3QgZW5kcG9pbnQgZnVuY3Rpb24nKVxuXG5mdW5jdGlvbiBkZWZhdWx0UHJvdG9jb2xQb3J0IChwcm90b2NvbCkge1xuICByZXR1cm4gcHJvdG9jb2wgPT09ICdodHRwczonID8gNDQzIDogODBcbn1cblxuZnVuY3Rpb24gYnVpbGRQcm94eU9wdGlvbnMgKG9wdHMpIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnc3RyaW5nJykge1xuICAgIG9wdHMgPSB7IHVyaTogb3B0cyB9XG4gIH1cblxuICBpZiAoIW9wdHMgfHwgIW9wdHMudXJpKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdQcm94eSBvcHRzLnVyaSBpcyBtYW5kYXRvcnknKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB1cmk6IG9wdHMudXJpLFxuICAgIHByb3RvY29sOiBvcHRzLnByb3RvY29sIHx8ICdodHRwcydcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0RmFjdG9yeSAob3JpZ2luLCBvcHRzKSB7XG4gIHJldHVybiBuZXcgUG9vbChvcmlnaW4sIG9wdHMpXG59XG5cbmNsYXNzIFByb3h5QWdlbnQgZXh0ZW5kcyBEaXNwYXRjaGVyQmFzZSB7XG4gIGNvbnN0cnVjdG9yIChvcHRzKSB7XG4gICAgc3VwZXIob3B0cylcbiAgICB0aGlzW2tQcm94eV0gPSBidWlsZFByb3h5T3B0aW9ucyhvcHRzKVxuICAgIHRoaXNba0FnZW50XSA9IG5ldyBBZ2VudChvcHRzKVxuICAgIHRoaXNba0ludGVyY2VwdG9yc10gPSBvcHRzLmludGVyY2VwdG9ycyAmJiBvcHRzLmludGVyY2VwdG9ycy5Qcm94eUFnZW50ICYmIEFycmF5LmlzQXJyYXkob3B0cy5pbnRlcmNlcHRvcnMuUHJveHlBZ2VudClcbiAgICAgID8gb3B0cy5pbnRlcmNlcHRvcnMuUHJveHlBZ2VudFxuICAgICAgOiBbXVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzID09PSAnc3RyaW5nJykge1xuICAgICAgb3B0cyA9IHsgdXJpOiBvcHRzIH1cbiAgICB9XG5cbiAgICBpZiAoIW9wdHMgfHwgIW9wdHMudXJpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ1Byb3h5IG9wdHMudXJpIGlzIG1hbmRhdG9yeScpXG4gICAgfVxuXG4gICAgY29uc3QgeyBjbGllbnRGYWN0b3J5ID0gZGVmYXVsdEZhY3RvcnkgfSA9IG9wdHNcblxuICAgIGlmICh0eXBlb2YgY2xpZW50RmFjdG9yeSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdQcm94eSBvcHRzLmNsaWVudEZhY3RvcnkgbXVzdCBiZSBhIGZ1bmN0aW9uLicpXG4gICAgfVxuXG4gICAgdGhpc1trUmVxdWVzdFRsc10gPSBvcHRzLnJlcXVlc3RUbHNcbiAgICB0aGlzW2tQcm94eVRsc10gPSBvcHRzLnByb3h5VGxzXG4gICAgdGhpc1trUHJveHlIZWFkZXJzXSA9IG9wdHMuaGVhZGVycyB8fCB7fVxuXG4gICAgY29uc3QgcmVzb2x2ZWRVcmwgPSBuZXcgVVJMKG9wdHMudXJpKVxuICAgIGNvbnN0IHsgb3JpZ2luLCBwb3J0LCBob3N0LCB1c2VybmFtZSwgcGFzc3dvcmQgfSA9IHJlc29sdmVkVXJsXG5cbiAgICBpZiAob3B0cy5hdXRoICYmIG9wdHMudG9rZW4pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignb3B0cy5hdXRoIGNhbm5vdCBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggb3B0cy50b2tlbicpXG4gICAgfSBlbHNlIGlmIChvcHRzLmF1dGgpIHtcbiAgICAgIC8qIEBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBvcHRzLnRva2VuICovXG4gICAgICB0aGlzW2tQcm94eUhlYWRlcnNdWydwcm94eS1hdXRob3JpemF0aW9uJ10gPSBgQmFzaWMgJHtvcHRzLmF1dGh9YFxuICAgIH0gZWxzZSBpZiAob3B0cy50b2tlbikge1xuICAgICAgdGhpc1trUHJveHlIZWFkZXJzXVsncHJveHktYXV0aG9yaXphdGlvbiddID0gb3B0cy50b2tlblxuICAgIH0gZWxzZSBpZiAodXNlcm5hbWUgJiYgcGFzc3dvcmQpIHtcbiAgICAgIHRoaXNba1Byb3h5SGVhZGVyc11bJ3Byb3h5LWF1dGhvcml6YXRpb24nXSA9IGBCYXNpYyAke0J1ZmZlci5mcm9tKGAke2RlY29kZVVSSUNvbXBvbmVudCh1c2VybmFtZSl9OiR7ZGVjb2RlVVJJQ29tcG9uZW50KHBhc3N3b3JkKX1gKS50b1N0cmluZygnYmFzZTY0Jyl9YFxuICAgIH1cblxuICAgIGNvbnN0IGNvbm5lY3QgPSBidWlsZENvbm5lY3Rvcih7IC4uLm9wdHMucHJveHlUbHMgfSlcbiAgICB0aGlzW2tDb25uZWN0RW5kcG9pbnRdID0gYnVpbGRDb25uZWN0b3IoeyAuLi5vcHRzLnJlcXVlc3RUbHMgfSlcbiAgICB0aGlzW2tDbGllbnRdID0gY2xpZW50RmFjdG9yeShyZXNvbHZlZFVybCwgeyBjb25uZWN0IH0pXG4gICAgdGhpc1trQWdlbnRdID0gbmV3IEFnZW50KHtcbiAgICAgIC4uLm9wdHMsXG4gICAgICBjb25uZWN0OiBhc3luYyAob3B0cywgY2FsbGJhY2spID0+IHtcbiAgICAgICAgbGV0IHJlcXVlc3RlZEhvc3QgPSBvcHRzLmhvc3RcbiAgICAgICAgaWYgKCFvcHRzLnBvcnQpIHtcbiAgICAgICAgICByZXF1ZXN0ZWRIb3N0ICs9IGA6JHtkZWZhdWx0UHJvdG9jb2xQb3J0KG9wdHMucHJvdG9jb2wpfWBcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgc29ja2V0LCBzdGF0dXNDb2RlIH0gPSBhd2FpdCB0aGlzW2tDbGllbnRdLmNvbm5lY3Qoe1xuICAgICAgICAgICAgb3JpZ2luLFxuICAgICAgICAgICAgcG9ydCxcbiAgICAgICAgICAgIHBhdGg6IHJlcXVlc3RlZEhvc3QsXG4gICAgICAgICAgICBzaWduYWw6IG9wdHMuc2lnbmFsLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAuLi50aGlzW2tQcm94eUhlYWRlcnNdLFxuICAgICAgICAgICAgICBob3N0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICBpZiAoc3RhdHVzQ29kZSAhPT0gMjAwKSB7XG4gICAgICAgICAgICBzb2NrZXQub24oJ2Vycm9yJywgKCkgPT4ge30pLmRlc3Ryb3koKVxuICAgICAgICAgICAgY2FsbGJhY2sobmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoYFByb3h5IHJlc3BvbnNlICgke3N0YXR1c0NvZGV9KSAhPT0gMjAwIHdoZW4gSFRUUCBUdW5uZWxpbmdgKSlcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG9wdHMucHJvdG9jb2wgIT09ICdodHRwczonKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCBzb2NrZXQpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IHNlcnZlcm5hbWVcbiAgICAgICAgICBpZiAodGhpc1trUmVxdWVzdFRsc10pIHtcbiAgICAgICAgICAgIHNlcnZlcm5hbWUgPSB0aGlzW2tSZXF1ZXN0VGxzXS5zZXJ2ZXJuYW1lXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlcnZlcm5hbWUgPSBvcHRzLnNlcnZlcm5hbWVcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpc1trQ29ubmVjdEVuZHBvaW50XSh7IC4uLm9wdHMsIHNlcnZlcm5hbWUsIGh0dHBTb2NrZXQ6IHNvY2tldCB9LCBjYWxsYmFjaylcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY2FsbGJhY2soZXJyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGRpc3BhdGNoIChvcHRzLCBoYW5kbGVyKSB7XG4gICAgY29uc3QgeyBob3N0IH0gPSBuZXcgVVJMKG9wdHMub3JpZ2luKVxuICAgIGNvbnN0IGhlYWRlcnMgPSBidWlsZEhlYWRlcnMob3B0cy5oZWFkZXJzKVxuICAgIHRocm93SWZQcm94eUF1dGhJc1NlbnQoaGVhZGVycylcbiAgICByZXR1cm4gdGhpc1trQWdlbnRdLmRpc3BhdGNoKFxuICAgICAge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgLi4uaGVhZGVycyxcbiAgICAgICAgICBob3N0XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBoYW5kbGVyXG4gICAgKVxuICB9XG5cbiAgYXN5bmMgW2tDbG9zZV0gKCkge1xuICAgIGF3YWl0IHRoaXNba0FnZW50XS5jbG9zZSgpXG4gICAgYXdhaXQgdGhpc1trQ2xpZW50XS5jbG9zZSgpXG4gIH1cblxuICBhc3luYyBba0Rlc3Ryb3ldICgpIHtcbiAgICBhd2FpdCB0aGlzW2tBZ2VudF0uZGVzdHJveSgpXG4gICAgYXdhaXQgdGhpc1trQ2xpZW50XS5kZXN0cm95KClcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBoZWFkZXJzXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn1cbiAqL1xuZnVuY3Rpb24gYnVpbGRIZWFkZXJzIChoZWFkZXJzKSB7XG4gIC8vIFdoZW4gdXNpbmcgdW5kaWNpLmZldGNoLCB0aGUgaGVhZGVycyBsaXN0IGlzIHN0b3JlZFxuICAvLyBhcyBhbiBhcnJheS5cbiAgaWYgKEFycmF5LmlzQXJyYXkoaGVhZGVycykpIHtcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZz59ICovXG4gICAgY29uc3QgaGVhZGVyc1BhaXIgPSB7fVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICBoZWFkZXJzUGFpcltoZWFkZXJzW2ldXSA9IGhlYWRlcnNbaSArIDFdXG4gICAgfVxuXG4gICAgcmV0dXJuIGhlYWRlcnNQYWlyXG4gIH1cblxuICByZXR1cm4gaGVhZGVyc1xufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gaGVhZGVyc1xuICpcbiAqIFByZXZpb3VzIHZlcnNpb25zIG9mIFByb3h5QWdlbnQgc3VnZ2VzdHMgdGhlIFByb3h5LUF1dGhvcml6YXRpb24gaW4gcmVxdWVzdCBoZWFkZXJzXG4gKiBOZXZlcnRoZWxlc3MsIGl0IHdhcyBjaGFuZ2VkIGFuZCB0byBhdm9pZCBhIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdHkgYnkgZW5kIHVzZXJzXG4gKiB0aGlzIGNoZWNrIHdhcyBjcmVhdGVkLlxuICogSXQgc2hvdWxkIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBmb3IgcGVyZm9ybWFuY2UgcmVhc29uc1xuICovXG5mdW5jdGlvbiB0aHJvd0lmUHJveHlBdXRoSXNTZW50IChoZWFkZXJzKSB7XG4gIGNvbnN0IGV4aXN0UHJveHlBdXRoID0gaGVhZGVycyAmJiBPYmplY3Qua2V5cyhoZWFkZXJzKVxuICAgIC5maW5kKChrZXkpID0+IGtleS50b0xvd2VyQ2FzZSgpID09PSAncHJveHktYXV0aG9yaXphdGlvbicpXG4gIGlmIChleGlzdFByb3h5QXV0aCkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignUHJveHktQXV0aG9yaXphdGlvbiBzaG91bGQgYmUgc2VudCBpbiBQcm94eUFnZW50IGNvbnN0cnVjdG9yJylcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFByb3h5QWdlbnRcbiIsImNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5cbmNvbnN0IHsga1JldHJ5SGFuZGxlckRlZmF1bHRSZXRyeSB9ID0gcmVxdWlyZSgnLi4vY29yZS9zeW1ib2xzJylcbmNvbnN0IHsgUmVxdWVzdFJldHJ5RXJyb3IgfSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcbmNvbnN0IHsgaXNEaXN0dXJiZWQsIHBhcnNlSGVhZGVycywgcGFyc2VSYW5nZUhlYWRlciB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcblxuZnVuY3Rpb24gY2FsY3VsYXRlUmV0cnlBZnRlckhlYWRlciAocmV0cnlBZnRlcikge1xuICBjb25zdCBjdXJyZW50ID0gRGF0ZS5ub3coKVxuICBjb25zdCBkaWZmID0gbmV3IERhdGUocmV0cnlBZnRlcikuZ2V0VGltZSgpIC0gY3VycmVudFxuXG4gIHJldHVybiBkaWZmXG59XG5cbmNsYXNzIFJldHJ5SGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yIChvcHRzLCBoYW5kbGVycykge1xuICAgIGNvbnN0IHsgcmV0cnlPcHRpb25zLCAuLi5kaXNwYXRjaE9wdHMgfSA9IG9wdHNcbiAgICBjb25zdCB7XG4gICAgICAvLyBSZXRyeSBzY29wZWRcbiAgICAgIHJldHJ5OiByZXRyeUZuLFxuICAgICAgbWF4UmV0cmllcyxcbiAgICAgIG1heFRpbWVvdXQsXG4gICAgICBtaW5UaW1lb3V0LFxuICAgICAgdGltZW91dEZhY3RvcixcbiAgICAgIC8vIFJlc3BvbnNlIHNjb3BlZFxuICAgICAgbWV0aG9kcyxcbiAgICAgIGVycm9yQ29kZXMsXG4gICAgICByZXRyeUFmdGVyLFxuICAgICAgc3RhdHVzQ29kZXNcbiAgICB9ID0gcmV0cnlPcHRpb25zID8/IHt9XG5cbiAgICB0aGlzLmRpc3BhdGNoID0gaGFuZGxlcnMuZGlzcGF0Y2hcbiAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVycy5oYW5kbGVyXG4gICAgdGhpcy5vcHRzID0gZGlzcGF0Y2hPcHRzXG4gICAgdGhpcy5hYm9ydCA9IG51bGxcbiAgICB0aGlzLmFib3J0ZWQgPSBmYWxzZVxuICAgIHRoaXMucmV0cnlPcHRzID0ge1xuICAgICAgcmV0cnk6IHJldHJ5Rm4gPz8gUmV0cnlIYW5kbGVyW2tSZXRyeUhhbmRsZXJEZWZhdWx0UmV0cnldLFxuICAgICAgcmV0cnlBZnRlcjogcmV0cnlBZnRlciA/PyB0cnVlLFxuICAgICAgbWF4VGltZW91dDogbWF4VGltZW91dCA/PyAzMCAqIDEwMDAsIC8vIDMwcyxcbiAgICAgIHRpbWVvdXQ6IG1pblRpbWVvdXQgPz8gNTAwLCAvLyAuNXNcbiAgICAgIHRpbWVvdXRGYWN0b3I6IHRpbWVvdXRGYWN0b3IgPz8gMixcbiAgICAgIG1heFJldHJpZXM6IG1heFJldHJpZXMgPz8gNSxcbiAgICAgIC8vIFdoYXQgZXJyb3JzIHdlIHNob3VsZCByZXRyeVxuICAgICAgbWV0aG9kczogbWV0aG9kcyA/PyBbJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnLCAnUFVUJywgJ0RFTEVURScsICdUUkFDRSddLFxuICAgICAgLy8gSW5kaWNhdGVzIHdoaWNoIGVycm9ycyB0byByZXRyeVxuICAgICAgc3RhdHVzQ29kZXM6IHN0YXR1c0NvZGVzID8/IFs1MDAsIDUwMiwgNTAzLCA1MDQsIDQyOV0sXG4gICAgICAvLyBMaXN0IG9mIGVycm9ycyB0byByZXRyeVxuICAgICAgZXJyb3JDb2RlczogZXJyb3JDb2RlcyA/PyBbXG4gICAgICAgICdFQ09OTlJFU0VUJyxcbiAgICAgICAgJ0VDT05OUkVGVVNFRCcsXG4gICAgICAgICdFTk9URk9VTkQnLFxuICAgICAgICAnRU5FVERPV04nLFxuICAgICAgICAnRU5FVFVOUkVBQ0gnLFxuICAgICAgICAnRUhPU1RET1dOJyxcbiAgICAgICAgJ0VIT1NUVU5SRUFDSCcsXG4gICAgICAgICdFUElQRSdcbiAgICAgIF1cbiAgICB9XG5cbiAgICB0aGlzLnJldHJ5Q291bnQgPSAwXG4gICAgdGhpcy5zdGFydCA9IDBcbiAgICB0aGlzLmVuZCA9IG51bGxcbiAgICB0aGlzLmV0YWcgPSBudWxsXG4gICAgdGhpcy5yZXN1bWUgPSBudWxsXG5cbiAgICAvLyBIYW5kbGUgcG9zc2libGUgb25Db25uZWN0IGR1cGxpY2F0aW9uXG4gICAgdGhpcy5oYW5kbGVyLm9uQ29ubmVjdChyZWFzb24gPT4ge1xuICAgICAgdGhpcy5hYm9ydGVkID0gdHJ1ZVxuICAgICAgaWYgKHRoaXMuYWJvcnQpIHtcbiAgICAgICAgdGhpcy5hYm9ydChyZWFzb24pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlYXNvbiA9IHJlYXNvblxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBvblJlcXVlc3RTZW50ICgpIHtcbiAgICBpZiAodGhpcy5oYW5kbGVyLm9uUmVxdWVzdFNlbnQpIHtcbiAgICAgIHRoaXMuaGFuZGxlci5vblJlcXVlc3RTZW50KClcbiAgICB9XG4gIH1cblxuICBvblVwZ3JhZGUgKHN0YXR1c0NvZGUsIGhlYWRlcnMsIHNvY2tldCkge1xuICAgIGlmICh0aGlzLmhhbmRsZXIub25VcGdyYWRlKSB7XG4gICAgICB0aGlzLmhhbmRsZXIub25VcGdyYWRlKHN0YXR1c0NvZGUsIGhlYWRlcnMsIHNvY2tldClcbiAgICB9XG4gIH1cblxuICBvbkNvbm5lY3QgKGFib3J0KSB7XG4gICAgaWYgKHRoaXMuYWJvcnRlZCkge1xuICAgICAgYWJvcnQodGhpcy5yZWFzb24pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWJvcnQgPSBhYm9ydFxuICAgIH1cbiAgfVxuXG4gIG9uQm9keVNlbnQgKGNodW5rKSB7XG4gICAgaWYgKHRoaXMuaGFuZGxlci5vbkJvZHlTZW50KSByZXR1cm4gdGhpcy5oYW5kbGVyLm9uQm9keVNlbnQoY2h1bmspXG4gIH1cblxuICBzdGF0aWMgW2tSZXRyeUhhbmRsZXJEZWZhdWx0UmV0cnldIChlcnIsIHsgc3RhdGUsIG9wdHMgfSwgY2IpIHtcbiAgICBjb25zdCB7IHN0YXR1c0NvZGUsIGNvZGUsIGhlYWRlcnMgfSA9IGVyclxuICAgIGNvbnN0IHsgbWV0aG9kLCByZXRyeU9wdGlvbnMgfSA9IG9wdHNcbiAgICBjb25zdCB7XG4gICAgICBtYXhSZXRyaWVzLFxuICAgICAgdGltZW91dCxcbiAgICAgIG1heFRpbWVvdXQsXG4gICAgICB0aW1lb3V0RmFjdG9yLFxuICAgICAgc3RhdHVzQ29kZXMsXG4gICAgICBlcnJvckNvZGVzLFxuICAgICAgbWV0aG9kc1xuICAgIH0gPSByZXRyeU9wdGlvbnNcbiAgICBsZXQgeyBjb3VudGVyLCBjdXJyZW50VGltZW91dCB9ID0gc3RhdGVcblxuICAgIGN1cnJlbnRUaW1lb3V0ID1cbiAgICAgIGN1cnJlbnRUaW1lb3V0ICE9IG51bGwgJiYgY3VycmVudFRpbWVvdXQgPiAwID8gY3VycmVudFRpbWVvdXQgOiB0aW1lb3V0XG5cbiAgICAvLyBBbnkgY29kZSB0aGF0IGlzIG5vdCBhIFVuZGljaSdzIG9yaWdpbmF0ZWQgYW5kIGFsbG93ZWQgdG8gcmV0cnlcbiAgICBpZiAoXG4gICAgICBjb2RlICYmXG4gICAgICBjb2RlICE9PSAnVU5EX0VSUl9SRVFfUkVUUlknICYmXG4gICAgICBjb2RlICE9PSAnVU5EX0VSUl9TT0NLRVQnICYmXG4gICAgICAhZXJyb3JDb2Rlcy5pbmNsdWRlcyhjb2RlKVxuICAgICkge1xuICAgICAgY2IoZXJyKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gSWYgYSBzZXQgb2YgbWV0aG9kIGFyZSBwcm92aWRlZCBhbmQgdGhlIGN1cnJlbnQgbWV0aG9kIGlzIG5vdCBpbiB0aGUgbGlzdFxuICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGhvZHMpICYmICFtZXRob2RzLmluY2x1ZGVzKG1ldGhvZCkpIHtcbiAgICAgIGNiKGVycilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIElmIGEgc2V0IG9mIHN0YXR1cyBjb2RlIGFyZSBwcm92aWRlZCBhbmQgdGhlIGN1cnJlbnQgc3RhdHVzIGNvZGUgaXMgbm90IGluIHRoZSBsaXN0XG4gICAgaWYgKFxuICAgICAgc3RhdHVzQ29kZSAhPSBudWxsICYmXG4gICAgICBBcnJheS5pc0FycmF5KHN0YXR1c0NvZGVzKSAmJlxuICAgICAgIXN0YXR1c0NvZGVzLmluY2x1ZGVzKHN0YXR1c0NvZGUpXG4gICAgKSB7XG4gICAgICBjYihlcnIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBJZiB3ZSByZWFjaGVkIHRoZSBtYXggbnVtYmVyIG9mIHJldHJpZXNcbiAgICBpZiAoY291bnRlciA+IG1heFJldHJpZXMpIHtcbiAgICAgIGNiKGVycilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxldCByZXRyeUFmdGVySGVhZGVyID0gaGVhZGVycyAhPSBudWxsICYmIGhlYWRlcnNbJ3JldHJ5LWFmdGVyJ11cbiAgICBpZiAocmV0cnlBZnRlckhlYWRlcikge1xuICAgICAgcmV0cnlBZnRlckhlYWRlciA9IE51bWJlcihyZXRyeUFmdGVySGVhZGVyKVxuICAgICAgcmV0cnlBZnRlckhlYWRlciA9IGlzTmFOKHJldHJ5QWZ0ZXJIZWFkZXIpXG4gICAgICAgID8gY2FsY3VsYXRlUmV0cnlBZnRlckhlYWRlcihyZXRyeUFmdGVySGVhZGVyKVxuICAgICAgICA6IHJldHJ5QWZ0ZXJIZWFkZXIgKiAxZTMgLy8gUmV0cnktQWZ0ZXIgaXMgaW4gc2Vjb25kc1xuICAgIH1cblxuICAgIGNvbnN0IHJldHJ5VGltZW91dCA9XG4gICAgICByZXRyeUFmdGVySGVhZGVyID4gMFxuICAgICAgICA/IE1hdGgubWluKHJldHJ5QWZ0ZXJIZWFkZXIsIG1heFRpbWVvdXQpXG4gICAgICAgIDogTWF0aC5taW4oY3VycmVudFRpbWVvdXQgKiB0aW1lb3V0RmFjdG9yICoqIGNvdW50ZXIsIG1heFRpbWVvdXQpXG5cbiAgICBzdGF0ZS5jdXJyZW50VGltZW91dCA9IHJldHJ5VGltZW91dFxuXG4gICAgc2V0VGltZW91dCgoKSA9PiBjYihudWxsKSwgcmV0cnlUaW1lb3V0KVxuICB9XG5cbiAgb25IZWFkZXJzIChzdGF0dXNDb2RlLCByYXdIZWFkZXJzLCByZXN1bWUsIHN0YXR1c01lc3NhZ2UpIHtcbiAgICBjb25zdCBoZWFkZXJzID0gcGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpXG5cbiAgICB0aGlzLnJldHJ5Q291bnQgKz0gMVxuXG4gICAgaWYgKHN0YXR1c0NvZGUgPj0gMzAwKSB7XG4gICAgICB0aGlzLmFib3J0KFxuICAgICAgICBuZXcgUmVxdWVzdFJldHJ5RXJyb3IoJ1JlcXVlc3QgZmFpbGVkJywgc3RhdHVzQ29kZSwge1xuICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgY291bnQ6IHRoaXMucmV0cnlDb3VudFxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gQ2hlY2twb2ludCBmb3IgcmVzdW1lIGZyb20gd2hlcmUgd2UgbGVmdCBpdFxuICAgIGlmICh0aGlzLnJlc3VtZSAhPSBudWxsKSB7XG4gICAgICB0aGlzLnJlc3VtZSA9IG51bGxcblxuICAgICAgaWYgKHN0YXR1c0NvZGUgIT09IDIwNikge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250ZW50UmFuZ2UgPSBwYXJzZVJhbmdlSGVhZGVyKGhlYWRlcnNbJ2NvbnRlbnQtcmFuZ2UnXSlcbiAgICAgIC8vIElmIG5vIGNvbnRlbnQgcmFuZ2VcbiAgICAgIGlmICghY29udGVudFJhbmdlKSB7XG4gICAgICAgIHRoaXMuYWJvcnQoXG4gICAgICAgICAgbmV3IFJlcXVlc3RSZXRyeUVycm9yKCdDb250ZW50LVJhbmdlIG1pc21hdGNoJywgc3RhdHVzQ29kZSwge1xuICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgIGNvdW50OiB0aGlzLnJldHJ5Q291bnRcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICAvLyBMZXQncyBzdGFydCB3aXRoIGEgd2VhayBldGFnIGNoZWNrXG4gICAgICBpZiAodGhpcy5ldGFnICE9IG51bGwgJiYgdGhpcy5ldGFnICE9PSBoZWFkZXJzLmV0YWcpIHtcbiAgICAgICAgdGhpcy5hYm9ydChcbiAgICAgICAgICBuZXcgUmVxdWVzdFJldHJ5RXJyb3IoJ0VUYWcgbWlzbWF0Y2gnLCBzdGF0dXNDb2RlLCB7XG4gICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgY291bnQ6IHRoaXMucmV0cnlDb3VudFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgc3RhcnQsIHNpemUsIGVuZCA9IHNpemUgfSA9IGNvbnRlbnRSYW5nZVxuXG4gICAgICBhc3NlcnQodGhpcy5zdGFydCA9PT0gc3RhcnQsICdjb250ZW50LXJhbmdlIG1pc21hdGNoJylcbiAgICAgIGFzc2VydCh0aGlzLmVuZCA9PSBudWxsIHx8IHRoaXMuZW5kID09PSBlbmQsICdjb250ZW50LXJhbmdlIG1pc21hdGNoJylcblxuICAgICAgdGhpcy5yZXN1bWUgPSByZXN1bWVcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZW5kID09IG51bGwpIHtcbiAgICAgIGlmIChzdGF0dXNDb2RlID09PSAyMDYpIHtcbiAgICAgICAgLy8gRmlyc3QgdGltZSB3ZSByZWNlaXZlIDIwNlxuICAgICAgICBjb25zdCByYW5nZSA9IHBhcnNlUmFuZ2VIZWFkZXIoaGVhZGVyc1snY29udGVudC1yYW5nZSddKVxuXG4gICAgICAgIGlmIChyYW5nZSA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkhlYWRlcnMoXG4gICAgICAgICAgICBzdGF0dXNDb2RlLFxuICAgICAgICAgICAgcmF3SGVhZGVycyxcbiAgICAgICAgICAgIHJlc3VtZSxcbiAgICAgICAgICAgIHN0YXR1c01lc3NhZ2VcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHN0YXJ0LCBzaXplLCBlbmQgPSBzaXplIH0gPSByYW5nZVxuXG4gICAgICAgIGFzc2VydChcbiAgICAgICAgICBzdGFydCAhPSBudWxsICYmIE51bWJlci5pc0Zpbml0ZShzdGFydCkgJiYgdGhpcy5zdGFydCAhPT0gc3RhcnQsXG4gICAgICAgICAgJ2NvbnRlbnQtcmFuZ2UgbWlzbWF0Y2gnXG4gICAgICAgIClcbiAgICAgICAgYXNzZXJ0KE51bWJlci5pc0Zpbml0ZShzdGFydCkpXG4gICAgICAgIGFzc2VydChcbiAgICAgICAgICBlbmQgIT0gbnVsbCAmJiBOdW1iZXIuaXNGaW5pdGUoZW5kKSAmJiB0aGlzLmVuZCAhPT0gZW5kLFxuICAgICAgICAgICdpbnZhbGlkIGNvbnRlbnQtbGVuZ3RoJ1xuICAgICAgICApXG5cbiAgICAgICAgdGhpcy5zdGFydCA9IHN0YXJ0XG4gICAgICAgIHRoaXMuZW5kID0gZW5kXG4gICAgICB9XG5cbiAgICAgIC8vIFdlIG1ha2Ugb3VyIGJlc3QgdG8gY2hlY2twb2ludCB0aGUgYm9keSBmb3IgZnVydGhlciByYW5nZSBoZWFkZXJzXG4gICAgICBpZiAodGhpcy5lbmQgPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gaGVhZGVyc1snY29udGVudC1sZW5ndGgnXVxuICAgICAgICB0aGlzLmVuZCA9IGNvbnRlbnRMZW5ndGggIT0gbnVsbCA/IE51bWJlcihjb250ZW50TGVuZ3RoKSA6IG51bGxcbiAgICAgIH1cblxuICAgICAgYXNzZXJ0KE51bWJlci5pc0Zpbml0ZSh0aGlzLnN0YXJ0KSlcbiAgICAgIGFzc2VydChcbiAgICAgICAgdGhpcy5lbmQgPT0gbnVsbCB8fCBOdW1iZXIuaXNGaW5pdGUodGhpcy5lbmQpLFxuICAgICAgICAnaW52YWxpZCBjb250ZW50LWxlbmd0aCdcbiAgICAgIClcblxuICAgICAgdGhpcy5yZXN1bWUgPSByZXN1bWVcbiAgICAgIHRoaXMuZXRhZyA9IGhlYWRlcnMuZXRhZyAhPSBudWxsID8gaGVhZGVycy5ldGFnIDogbnVsbFxuXG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uSGVhZGVycyhcbiAgICAgICAgc3RhdHVzQ29kZSxcbiAgICAgICAgcmF3SGVhZGVycyxcbiAgICAgICAgcmVzdW1lLFxuICAgICAgICBzdGF0dXNNZXNzYWdlXG4gICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgZXJyID0gbmV3IFJlcXVlc3RSZXRyeUVycm9yKCdSZXF1ZXN0IGZhaWxlZCcsIHN0YXR1c0NvZGUsIHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBjb3VudDogdGhpcy5yZXRyeUNvdW50XG4gICAgfSlcblxuICAgIHRoaXMuYWJvcnQoZXJyKVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBvbkRhdGEgKGNodW5rKSB7XG4gICAgdGhpcy5zdGFydCArPSBjaHVuay5sZW5ndGhcblxuICAgIHJldHVybiB0aGlzLmhhbmRsZXIub25EYXRhKGNodW5rKVxuICB9XG5cbiAgb25Db21wbGV0ZSAocmF3VHJhaWxlcnMpIHtcbiAgICB0aGlzLnJldHJ5Q291bnQgPSAwXG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkNvbXBsZXRlKHJhd1RyYWlsZXJzKVxuICB9XG5cbiAgb25FcnJvciAoZXJyKSB7XG4gICAgaWYgKHRoaXMuYWJvcnRlZCB8fCBpc0Rpc3R1cmJlZCh0aGlzLm9wdHMuYm9keSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZXIub25FcnJvcihlcnIpXG4gICAgfVxuXG4gICAgdGhpcy5yZXRyeU9wdHMucmV0cnkoXG4gICAgICBlcnIsXG4gICAgICB7XG4gICAgICAgIHN0YXRlOiB7IGNvdW50ZXI6IHRoaXMucmV0cnlDb3VudCsrLCBjdXJyZW50VGltZW91dDogdGhpcy5yZXRyeUFmdGVyIH0sXG4gICAgICAgIG9wdHM6IHsgcmV0cnlPcHRpb25zOiB0aGlzLnJldHJ5T3B0cywgLi4udGhpcy5vcHRzIH1cbiAgICAgIH0sXG4gICAgICBvblJldHJ5LmJpbmQodGhpcylcbiAgICApXG5cbiAgICBmdW5jdGlvbiBvblJldHJ5IChlcnIpIHtcbiAgICAgIGlmIChlcnIgIT0gbnVsbCB8fCB0aGlzLmFib3J0ZWQgfHwgaXNEaXN0dXJiZWQodGhpcy5vcHRzLmJvZHkpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXIub25FcnJvcihlcnIpXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnN0YXJ0ICE9PSAwKSB7XG4gICAgICAgIHRoaXMub3B0cyA9IHtcbiAgICAgICAgICAuLi50aGlzLm9wdHMsXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgLi4udGhpcy5vcHRzLmhlYWRlcnMsXG4gICAgICAgICAgICByYW5nZTogYGJ5dGVzPSR7dGhpcy5zdGFydH0tJHt0aGlzLmVuZCA/PyAnJ31gXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2godGhpcy5vcHRzLCB0aGlzKVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlci5vbkVycm9yKGVycilcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSZXRyeUhhbmRsZXJcbiIsIid1c2Ugc3RyaWN0J1xuXG4vLyBXZSBpbmNsdWRlIGEgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSBEaXNwYXRjaGVyIEFQSS4gSW4gY2FzZSBvZiBicmVha2luZyBjaGFuZ2VzLFxuLy8gdGhpcyB2ZXJzaW9uIG51bWJlciBtdXN0IGJlIGluY3JlYXNlZCB0byBhdm9pZCBjb25mbGljdHMuXG5jb25zdCBnbG9iYWxEaXNwYXRjaGVyID0gU3ltYm9sLmZvcigndW5kaWNpLmdsb2JhbERpc3BhdGNoZXIuMScpXG5jb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yIH0gPSByZXF1aXJlKCcuL2NvcmUvZXJyb3JzJylcbmNvbnN0IEFnZW50ID0gcmVxdWlyZSgnLi9hZ2VudCcpXG5cbmlmIChnZXRHbG9iYWxEaXNwYXRjaGVyKCkgPT09IHVuZGVmaW5lZCkge1xuICBzZXRHbG9iYWxEaXNwYXRjaGVyKG5ldyBBZ2VudCgpKVxufVxuXG5mdW5jdGlvbiBzZXRHbG9iYWxEaXNwYXRjaGVyIChhZ2VudCkge1xuICBpZiAoIWFnZW50IHx8IHR5cGVvZiBhZ2VudC5kaXNwYXRjaCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignQXJndW1lbnQgYWdlbnQgbXVzdCBpbXBsZW1lbnQgQWdlbnQnKVxuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnbG9iYWxUaGlzLCBnbG9iYWxEaXNwYXRjaGVyLCB7XG4gICAgdmFsdWU6IGFnZW50LFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2VcbiAgfSlcbn1cblxuZnVuY3Rpb24gZ2V0R2xvYmFsRGlzcGF0Y2hlciAoKSB7XG4gIHJldHVybiBnbG9iYWxUaGlzW2dsb2JhbERpc3BhdGNoZXJdXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXRHbG9iYWxEaXNwYXRjaGVyLFxuICBnZXRHbG9iYWxEaXNwYXRjaGVyXG59XG4iLCIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBEZWNvcmF0b3JIYW5kbGVyIHtcbiAgY29uc3RydWN0b3IgKGhhbmRsZXIpIHtcbiAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyXG4gIH1cblxuICBvbkNvbm5lY3QgKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uQ29ubmVjdCguLi5hcmdzKVxuICB9XG5cbiAgb25FcnJvciAoLi4uYXJncykge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZXIub25FcnJvciguLi5hcmdzKVxuICB9XG5cbiAgb25VcGdyYWRlICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vblVwZ3JhZGUoLi4uYXJncylcbiAgfVxuXG4gIG9uSGVhZGVycyAoLi4uYXJncykge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZXIub25IZWFkZXJzKC4uLmFyZ3MpXG4gIH1cblxuICBvbkRhdGEgKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uRGF0YSguLi5hcmdzKVxuICB9XG5cbiAgb25Db21wbGV0ZSAoLi4uYXJncykge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZXIub25Db21wbGV0ZSguLi5hcmdzKVxuICB9XG5cbiAgb25Cb2R5U2VudCAoLi4uYXJncykge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZXIub25Cb2R5U2VudCguLi5hcmdzKVxuICB9XG59XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vRXRoYW4tQXJyb3dvb2QvdW5kaWNpLWZldGNoXG5cbid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IGtIZWFkZXJzTGlzdCwga0NvbnN0cnVjdCB9ID0gcmVxdWlyZSgnLi4vY29yZS9zeW1ib2xzJylcbmNvbnN0IHsga0d1YXJkIH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgeyBrRW51bWVyYWJsZVByb3BlcnR5IH0gPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3Qge1xuICBtYWtlSXRlcmF0b3IsXG4gIGlzVmFsaWRIZWFkZXJOYW1lLFxuICBpc1ZhbGlkSGVhZGVyVmFsdWVcbn0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4vd2ViaWRsJylcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5cbmNvbnN0IGtIZWFkZXJzTWFwID0gU3ltYm9sKCdoZWFkZXJzIG1hcCcpXG5jb25zdCBrSGVhZGVyc1NvcnRlZE1hcCA9IFN5bWJvbCgnaGVhZGVycyBtYXAgc29ydGVkJylcblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gY29kZVxuICovXG5mdW5jdGlvbiBpc0hUVFBXaGl0ZVNwYWNlQ2hhckNvZGUgKGNvZGUpIHtcbiAgcmV0dXJuIGNvZGUgPT09IDB4MDBhIHx8IGNvZGUgPT09IDB4MDBkIHx8IGNvZGUgPT09IDB4MDA5IHx8IGNvZGUgPT09IDB4MDIwXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1oZWFkZXItdmFsdWUtbm9ybWFsaXplXG4gKiBAcGFyYW0ge3N0cmluZ30gcG90ZW50aWFsVmFsdWVcbiAqL1xuZnVuY3Rpb24gaGVhZGVyVmFsdWVOb3JtYWxpemUgKHBvdGVudGlhbFZhbHVlKSB7XG4gIC8vICBUbyBub3JtYWxpemUgYSBieXRlIHNlcXVlbmNlIHBvdGVudGlhbFZhbHVlLCByZW1vdmVcbiAgLy8gIGFueSBsZWFkaW5nIGFuZCB0cmFpbGluZyBIVFRQIHdoaXRlc3BhY2UgYnl0ZXMgZnJvbVxuICAvLyAgcG90ZW50aWFsVmFsdWUuXG4gIGxldCBpID0gMDsgbGV0IGogPSBwb3RlbnRpYWxWYWx1ZS5sZW5ndGhcblxuICB3aGlsZSAoaiA+IGkgJiYgaXNIVFRQV2hpdGVTcGFjZUNoYXJDb2RlKHBvdGVudGlhbFZhbHVlLmNoYXJDb2RlQXQoaiAtIDEpKSkgLS1qXG4gIHdoaWxlIChqID4gaSAmJiBpc0hUVFBXaGl0ZVNwYWNlQ2hhckNvZGUocG90ZW50aWFsVmFsdWUuY2hhckNvZGVBdChpKSkpICsraVxuXG4gIHJldHVybiBpID09PSAwICYmIGogPT09IHBvdGVudGlhbFZhbHVlLmxlbmd0aCA/IHBvdGVudGlhbFZhbHVlIDogcG90ZW50aWFsVmFsdWUuc3Vic3RyaW5nKGksIGopXG59XG5cbmZ1bmN0aW9uIGZpbGwgKGhlYWRlcnMsIG9iamVjdCkge1xuICAvLyBUbyBmaWxsIGEgSGVhZGVycyBvYmplY3QgaGVhZGVycyB3aXRoIGEgZ2l2ZW4gb2JqZWN0IG9iamVjdCwgcnVuIHRoZXNlIHN0ZXBzOlxuXG4gIC8vIDEuIElmIG9iamVjdCBpcyBhIHNlcXVlbmNlLCB0aGVuIGZvciBlYWNoIGhlYWRlciBpbiBvYmplY3Q6XG4gIC8vIE5vdGU6IHdlYmlkbCBjb252ZXJzaW9uIHRvIGFycmF5IGhhcyBhbHJlYWR5IGJlZW4gZG9uZS5cbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqZWN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBoZWFkZXIgPSBvYmplY3RbaV1cbiAgICAgIC8vIDEuIElmIGhlYWRlciBkb2VzIG5vdCBjb250YWluIGV4YWN0bHkgdHdvIGl0ZW1zLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgICAgaWYgKGhlYWRlci5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICAgIGhlYWRlcjogJ0hlYWRlcnMgY29uc3RydWN0b3InLFxuICAgICAgICAgIG1lc3NhZ2U6IGBleHBlY3RlZCBuYW1lL3ZhbHVlIHBhaXIgdG8gYmUgbGVuZ3RoIDIsIGZvdW5kICR7aGVhZGVyLmxlbmd0aH0uYFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyAyLiBBcHBlbmQgKGhlYWRlcuKAmXMgZmlyc3QgaXRlbSwgaGVhZGVy4oCZcyBzZWNvbmQgaXRlbSkgdG8gaGVhZGVycy5cbiAgICAgIGFwcGVuZEhlYWRlcihoZWFkZXJzLCBoZWFkZXJbMF0sIGhlYWRlclsxXSlcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsKSB7XG4gICAgLy8gTm90ZTogbnVsbCBzaG91bGQgdGhyb3dcblxuICAgIC8vIDIuIE90aGVyd2lzZSwgb2JqZWN0IGlzIGEgcmVjb3JkLCB0aGVuIGZvciBlYWNoIGtleSDihpIgdmFsdWUgaW4gb2JqZWN0LFxuICAgIC8vICAgIGFwcGVuZCAoa2V5LCB2YWx1ZSkgdG8gaGVhZGVyc1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICBhcHBlbmRIZWFkZXIoaGVhZGVycywga2V5c1tpXSwgb2JqZWN0W2tleXNbaV1dKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmNvbnZlcnNpb25GYWlsZWQoe1xuICAgICAgcHJlZml4OiAnSGVhZGVycyBjb25zdHJ1Y3RvcicsXG4gICAgICBhcmd1bWVudDogJ0FyZ3VtZW50IDEnLFxuICAgICAgdHlwZXM6IFsnc2VxdWVuY2U8c2VxdWVuY2U8Qnl0ZVN0cmluZz4+JywgJ3JlY29yZDxCeXRlU3RyaW5nLCBCeXRlU3RyaW5nPiddXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtaGVhZGVycy1hcHBlbmRcbiAqL1xuZnVuY3Rpb24gYXBwZW5kSGVhZGVyIChoZWFkZXJzLCBuYW1lLCB2YWx1ZSkge1xuICAvLyAxLiBOb3JtYWxpemUgdmFsdWUuXG4gIHZhbHVlID0gaGVhZGVyVmFsdWVOb3JtYWxpemUodmFsdWUpXG5cbiAgLy8gMi4gSWYgbmFtZSBpcyBub3QgYSBoZWFkZXIgbmFtZSBvciB2YWx1ZSBpcyBub3QgYVxuICAvLyAgICBoZWFkZXIgdmFsdWUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gIGlmICghaXNWYWxpZEhlYWRlck5hbWUobmFtZSkpIHtcbiAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmludmFsaWRBcmd1bWVudCh7XG4gICAgICBwcmVmaXg6ICdIZWFkZXJzLmFwcGVuZCcsXG4gICAgICB2YWx1ZTogbmFtZSxcbiAgICAgIHR5cGU6ICdoZWFkZXIgbmFtZSdcbiAgICB9KVxuICB9IGVsc2UgaWYgKCFpc1ZhbGlkSGVhZGVyVmFsdWUodmFsdWUpKSB7XG4gICAgdGhyb3cgd2ViaWRsLmVycm9ycy5pbnZhbGlkQXJndW1lbnQoe1xuICAgICAgcHJlZml4OiAnSGVhZGVycy5hcHBlbmQnLFxuICAgICAgdmFsdWUsXG4gICAgICB0eXBlOiAnaGVhZGVyIHZhbHVlJ1xuICAgIH0pXG4gIH1cblxuICAvLyAzLiBJZiBoZWFkZXJz4oCZcyBndWFyZCBpcyBcImltbXV0YWJsZVwiLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAvLyA0LiBPdGhlcndpc2UsIGlmIGhlYWRlcnPigJlzIGd1YXJkIGlzIFwicmVxdWVzdFwiIGFuZCBuYW1lIGlzIGFcbiAgLy8gICAgZm9yYmlkZGVuIGhlYWRlciBuYW1lLCByZXR1cm4uXG4gIC8vIE5vdGU6IHVuZGljaSBkb2VzIG5vdCBpbXBsZW1lbnQgZm9yYmlkZGVuIGhlYWRlciBuYW1lc1xuICBpZiAoaGVhZGVyc1trR3VhcmRdID09PSAnaW1tdXRhYmxlJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ltbXV0YWJsZScpXG4gIH0gZWxzZSBpZiAoaGVhZGVyc1trR3VhcmRdID09PSAncmVxdWVzdC1uby1jb3JzJykge1xuICAgIC8vIDUuIE90aGVyd2lzZSwgaWYgaGVhZGVyc+KAmXMgZ3VhcmQgaXMgXCJyZXF1ZXN0LW5vLWNvcnNcIjpcbiAgICAvLyBUT0RPXG4gIH1cblxuICAvLyA2LiBPdGhlcndpc2UsIGlmIGhlYWRlcnPigJlzIGd1YXJkIGlzIFwicmVzcG9uc2VcIiBhbmQgbmFtZSBpcyBhXG4gIC8vICAgIGZvcmJpZGRlbiByZXNwb25zZS1oZWFkZXIgbmFtZSwgcmV0dXJuLlxuXG4gIC8vIDcuIEFwcGVuZCAobmFtZSwgdmFsdWUpIHRvIGhlYWRlcnPigJlzIGhlYWRlciBsaXN0LlxuICByZXR1cm4gaGVhZGVyc1trSGVhZGVyc0xpc3RdLmFwcGVuZChuYW1lLCB2YWx1ZSlcblxuICAvLyA4LiBJZiBoZWFkZXJz4oCZcyBndWFyZCBpcyBcInJlcXVlc3Qtbm8tY29yc1wiLCB0aGVuIHJlbW92ZVxuICAvLyAgICBwcml2aWxlZ2VkIG5vLUNPUlMgcmVxdWVzdCBoZWFkZXJzIGZyb20gaGVhZGVyc1xufVxuXG5jbGFzcyBIZWFkZXJzTGlzdCB7XG4gIC8qKiBAdHlwZSB7W3N0cmluZywgc3RyaW5nXVtdfG51bGx9ICovXG4gIGNvb2tpZXMgPSBudWxsXG5cbiAgY29uc3RydWN0b3IgKGluaXQpIHtcbiAgICBpZiAoaW5pdCBpbnN0YW5jZW9mIEhlYWRlcnNMaXN0KSB7XG4gICAgICB0aGlzW2tIZWFkZXJzTWFwXSA9IG5ldyBNYXAoaW5pdFtrSGVhZGVyc01hcF0pXG4gICAgICB0aGlzW2tIZWFkZXJzU29ydGVkTWFwXSA9IGluaXRba0hlYWRlcnNTb3J0ZWRNYXBdXG4gICAgICB0aGlzLmNvb2tpZXMgPSBpbml0LmNvb2tpZXMgPT09IG51bGwgPyBudWxsIDogWy4uLmluaXQuY29va2llc11cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1trSGVhZGVyc01hcF0gPSBuZXcgTWFwKGluaXQpXG4gICAgICB0aGlzW2tIZWFkZXJzU29ydGVkTWFwXSA9IG51bGxcbiAgICB9XG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaGVhZGVyLWxpc3QtY29udGFpbnNcbiAgY29udGFpbnMgKG5hbWUpIHtcbiAgICAvLyBBIGhlYWRlciBsaXN0IGxpc3QgY29udGFpbnMgYSBoZWFkZXIgbmFtZSBuYW1lIGlmIGxpc3RcbiAgICAvLyBjb250YWlucyBhIGhlYWRlciB3aG9zZSBuYW1lIGlzIGEgYnl0ZS1jYXNlLWluc2Vuc2l0aXZlXG4gICAgLy8gbWF0Y2ggZm9yIG5hbWUuXG4gICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKVxuXG4gICAgcmV0dXJuIHRoaXNba0hlYWRlcnNNYXBdLmhhcyhuYW1lKVxuICB9XG5cbiAgY2xlYXIgKCkge1xuICAgIHRoaXNba0hlYWRlcnNNYXBdLmNsZWFyKClcbiAgICB0aGlzW2tIZWFkZXJzU29ydGVkTWFwXSA9IG51bGxcbiAgICB0aGlzLmNvb2tpZXMgPSBudWxsXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1oZWFkZXItbGlzdC1hcHBlbmRcbiAgYXBwZW5kIChuYW1lLCB2YWx1ZSkge1xuICAgIHRoaXNba0hlYWRlcnNTb3J0ZWRNYXBdID0gbnVsbFxuXG4gICAgLy8gMS4gSWYgbGlzdCBjb250YWlucyBuYW1lLCB0aGVuIHNldCBuYW1lIHRvIHRoZSBmaXJzdCBzdWNoXG4gICAgLy8gICAgaGVhZGVy4oCZcyBuYW1lLlxuICAgIGNvbnN0IGxvd2VyY2FzZU5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKClcbiAgICBjb25zdCBleGlzdHMgPSB0aGlzW2tIZWFkZXJzTWFwXS5nZXQobG93ZXJjYXNlTmFtZSlcblxuICAgIC8vIDIuIEFwcGVuZCAobmFtZSwgdmFsdWUpIHRvIGxpc3QuXG4gICAgaWYgKGV4aXN0cykge1xuICAgICAgY29uc3QgZGVsaW1pdGVyID0gbG93ZXJjYXNlTmFtZSA9PT0gJ2Nvb2tpZScgPyAnOyAnIDogJywgJ1xuICAgICAgdGhpc1trSGVhZGVyc01hcF0uc2V0KGxvd2VyY2FzZU5hbWUsIHtcbiAgICAgICAgbmFtZTogZXhpc3RzLm5hbWUsXG4gICAgICAgIHZhbHVlOiBgJHtleGlzdHMudmFsdWV9JHtkZWxpbWl0ZXJ9JHt2YWx1ZX1gXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzW2tIZWFkZXJzTWFwXS5zZXQobG93ZXJjYXNlTmFtZSwgeyBuYW1lLCB2YWx1ZSB9KVxuICAgIH1cblxuICAgIGlmIChsb3dlcmNhc2VOYW1lID09PSAnc2V0LWNvb2tpZScpIHtcbiAgICAgIHRoaXMuY29va2llcyA/Pz0gW11cbiAgICAgIHRoaXMuY29va2llcy5wdXNoKHZhbHVlKVxuICAgIH1cbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWhlYWRlci1saXN0LXNldFxuICBzZXQgKG5hbWUsIHZhbHVlKSB7XG4gICAgdGhpc1trSGVhZGVyc1NvcnRlZE1hcF0gPSBudWxsXG4gICAgY29uc3QgbG93ZXJjYXNlTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKVxuXG4gICAgaWYgKGxvd2VyY2FzZU5hbWUgPT09ICdzZXQtY29va2llJykge1xuICAgICAgdGhpcy5jb29raWVzID0gW3ZhbHVlXVxuICAgIH1cblxuICAgIC8vIDEuIElmIGxpc3QgY29udGFpbnMgbmFtZSwgdGhlbiBzZXQgdGhlIHZhbHVlIG9mXG4gICAgLy8gICAgdGhlIGZpcnN0IHN1Y2ggaGVhZGVyIHRvIHZhbHVlIGFuZCByZW1vdmUgdGhlXG4gICAgLy8gICAgb3RoZXJzLlxuICAgIC8vIDIuIE90aGVyd2lzZSwgYXBwZW5kIGhlYWRlciAobmFtZSwgdmFsdWUpIHRvIGxpc3QuXG4gICAgdGhpc1trSGVhZGVyc01hcF0uc2V0KGxvd2VyY2FzZU5hbWUsIHsgbmFtZSwgdmFsdWUgfSlcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWhlYWRlci1saXN0LWRlbGV0ZVxuICBkZWxldGUgKG5hbWUpIHtcbiAgICB0aGlzW2tIZWFkZXJzU29ydGVkTWFwXSA9IG51bGxcblxuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKClcblxuICAgIGlmIChuYW1lID09PSAnc2V0LWNvb2tpZScpIHtcbiAgICAgIHRoaXMuY29va2llcyA9IG51bGxcbiAgICB9XG5cbiAgICB0aGlzW2tIZWFkZXJzTWFwXS5kZWxldGUobmFtZSlcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWhlYWRlci1saXN0LWdldFxuICBnZXQgKG5hbWUpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXNba0hlYWRlcnNNYXBdLmdldChuYW1lLnRvTG93ZXJDYXNlKCkpXG5cbiAgICAvLyAxLiBJZiBsaXN0IGRvZXMgbm90IGNvbnRhaW4gbmFtZSwgdGhlbiByZXR1cm4gbnVsbC5cbiAgICAvLyAyLiBSZXR1cm4gdGhlIHZhbHVlcyBvZiBhbGwgaGVhZGVycyBpbiBsaXN0IHdob3NlIG5hbWVcbiAgICAvLyAgICBpcyBhIGJ5dGUtY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBmb3IgbmFtZSxcbiAgICAvLyAgICBzZXBhcmF0ZWQgZnJvbSBlYWNoIG90aGVyIGJ5IDB4MkMgMHgyMCwgaW4gb3JkZXIuXG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyBudWxsIDogdmFsdWUudmFsdWVcbiAgfVxuXG4gICogW1N5bWJvbC5pdGVyYXRvcl0gKCkge1xuICAgIC8vIHVzZSB0aGUgbG93ZXJjYXNlZCBuYW1lXG4gICAgZm9yIChjb25zdCBbbmFtZSwgeyB2YWx1ZSB9XSBvZiB0aGlzW2tIZWFkZXJzTWFwXSkge1xuICAgICAgeWllbGQgW25hbWUsIHZhbHVlXVxuICAgIH1cbiAgfVxuXG4gIGdldCBlbnRyaWVzICgpIHtcbiAgICBjb25zdCBoZWFkZXJzID0ge31cblxuICAgIGlmICh0aGlzW2tIZWFkZXJzTWFwXS5zaXplKSB7XG4gICAgICBmb3IgKGNvbnN0IHsgbmFtZSwgdmFsdWUgfSBvZiB0aGlzW2tIZWFkZXJzTWFwXS52YWx1ZXMoKSkge1xuICAgICAgICBoZWFkZXJzW25hbWVdID0gdmFsdWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaGVhZGVyc1xuICB9XG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNoZWFkZXJzLWNsYXNzXG5jbGFzcyBIZWFkZXJzIHtcbiAgY29uc3RydWN0b3IgKGluaXQgPSB1bmRlZmluZWQpIHtcbiAgICBpZiAoaW5pdCA9PT0ga0NvbnN0cnVjdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXNba0hlYWRlcnNMaXN0XSA9IG5ldyBIZWFkZXJzTGlzdCgpXG5cbiAgICAvLyBUaGUgbmV3IEhlYWRlcnMoaW5pdCkgY29uc3RydWN0b3Igc3RlcHMgYXJlOlxuXG4gICAgLy8gMS4gU2V0IHRoaXPigJlzIGd1YXJkIHRvIFwibm9uZVwiLlxuICAgIHRoaXNba0d1YXJkXSA9ICdub25lJ1xuXG4gICAgLy8gMi4gSWYgaW5pdCBpcyBnaXZlbiwgdGhlbiBmaWxsIHRoaXMgd2l0aCBpbml0LlxuICAgIGlmIChpbml0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGluaXQgPSB3ZWJpZGwuY29udmVydGVycy5IZWFkZXJzSW5pdChpbml0KVxuICAgICAgZmlsbCh0aGlzLCBpbml0KVxuICAgIH1cbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkb20taGVhZGVycy1hcHBlbmRcbiAgYXBwZW5kIChuYW1lLCB2YWx1ZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEhlYWRlcnMpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDIsIHsgaGVhZGVyOiAnSGVhZGVycy5hcHBlbmQnIH0pXG5cbiAgICBuYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZyhuYW1lKVxuICAgIHZhbHVlID0gd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZyh2YWx1ZSlcblxuICAgIHJldHVybiBhcHBlbmRIZWFkZXIodGhpcywgbmFtZSwgdmFsdWUpXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWhlYWRlcnMtZGVsZXRlXG4gIGRlbGV0ZSAobmFtZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEhlYWRlcnMpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnSGVhZGVycy5kZWxldGUnIH0pXG5cbiAgICBuYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZyhuYW1lKVxuXG4gICAgLy8gMS4gSWYgbmFtZSBpcyBub3QgYSBoZWFkZXIgbmFtZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAoIWlzVmFsaWRIZWFkZXJOYW1lKG5hbWUpKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmludmFsaWRBcmd1bWVudCh7XG4gICAgICAgIHByZWZpeDogJ0hlYWRlcnMuZGVsZXRlJyxcbiAgICAgICAgdmFsdWU6IG5hbWUsXG4gICAgICAgIHR5cGU6ICdoZWFkZXIgbmFtZSdcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gMi4gSWYgdGhpc+KAmXMgZ3VhcmQgaXMgXCJpbW11dGFibGVcIiwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAvLyAzLiBPdGhlcndpc2UsIGlmIHRoaXPigJlzIGd1YXJkIGlzIFwicmVxdWVzdFwiIGFuZCBuYW1lIGlzIGFcbiAgICAvLyAgICBmb3JiaWRkZW4gaGVhZGVyIG5hbWUsIHJldHVybi5cbiAgICAvLyA0LiBPdGhlcndpc2UsIGlmIHRoaXPigJlzIGd1YXJkIGlzIFwicmVxdWVzdC1uby1jb3JzXCIsIG5hbWVcbiAgICAvLyAgICBpcyBub3QgYSBuby1DT1JTLXNhZmVsaXN0ZWQgcmVxdWVzdC1oZWFkZXIgbmFtZSwgYW5kXG4gICAgLy8gICAgbmFtZSBpcyBub3QgYSBwcml2aWxlZ2VkIG5vLUNPUlMgcmVxdWVzdC1oZWFkZXIgbmFtZSxcbiAgICAvLyAgICByZXR1cm4uXG4gICAgLy8gNS4gT3RoZXJ3aXNlLCBpZiB0aGlz4oCZcyBndWFyZCBpcyBcInJlc3BvbnNlXCIgYW5kIG5hbWUgaXNcbiAgICAvLyAgICBhIGZvcmJpZGRlbiByZXNwb25zZS1oZWFkZXIgbmFtZSwgcmV0dXJuLlxuICAgIC8vIE5vdGU6IHVuZGljaSBkb2VzIG5vdCBpbXBsZW1lbnQgZm9yYmlkZGVuIGhlYWRlciBuYW1lc1xuICAgIGlmICh0aGlzW2tHdWFyZF0gPT09ICdpbW11dGFibGUnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbW11dGFibGUnKVxuICAgIH0gZWxzZSBpZiAodGhpc1trR3VhcmRdID09PSAncmVxdWVzdC1uby1jb3JzJykge1xuICAgICAgLy8gVE9ET1xuICAgIH1cblxuICAgIC8vIDYuIElmIHRoaXPigJlzIGhlYWRlciBsaXN0IGRvZXMgbm90IGNvbnRhaW4gbmFtZSwgdGhlblxuICAgIC8vICAgIHJldHVybi5cbiAgICBpZiAoIXRoaXNba0hlYWRlcnNMaXN0XS5jb250YWlucyhuYW1lKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gNy4gRGVsZXRlIG5hbWUgZnJvbSB0aGlz4oCZcyBoZWFkZXIgbGlzdC5cbiAgICAvLyA4LiBJZiB0aGlz4oCZcyBndWFyZCBpcyBcInJlcXVlc3Qtbm8tY29yc1wiLCB0aGVuIHJlbW92ZVxuICAgIC8vICAgIHByaXZpbGVnZWQgbm8tQ09SUyByZXF1ZXN0IGhlYWRlcnMgZnJvbSB0aGlzLlxuICAgIHRoaXNba0hlYWRlcnNMaXN0XS5kZWxldGUobmFtZSlcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkb20taGVhZGVycy1nZXRcbiAgZ2V0IChuYW1lKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgSGVhZGVycylcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdIZWFkZXJzLmdldCcgfSlcblxuICAgIG5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5CeXRlU3RyaW5nKG5hbWUpXG5cbiAgICAvLyAxLiBJZiBuYW1lIGlzIG5vdCBhIGhlYWRlciBuYW1lLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmICghaXNWYWxpZEhlYWRlck5hbWUobmFtZSkpIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuaW52YWxpZEFyZ3VtZW50KHtcbiAgICAgICAgcHJlZml4OiAnSGVhZGVycy5nZXQnLFxuICAgICAgICB2YWx1ZTogbmFtZSxcbiAgICAgICAgdHlwZTogJ2hlYWRlciBuYW1lJ1xuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyAyLiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBnZXR0aW5nIG5hbWUgZnJvbSB0aGlz4oCZcyBoZWFkZXJcbiAgICAvLyAgICBsaXN0LlxuICAgIHJldHVybiB0aGlzW2tIZWFkZXJzTGlzdF0uZ2V0KG5hbWUpXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWhlYWRlcnMtaGFzXG4gIGhhcyAobmFtZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEhlYWRlcnMpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnSGVhZGVycy5oYXMnIH0pXG5cbiAgICBuYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZyhuYW1lKVxuXG4gICAgLy8gMS4gSWYgbmFtZSBpcyBub3QgYSBoZWFkZXIgbmFtZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAoIWlzVmFsaWRIZWFkZXJOYW1lKG5hbWUpKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmludmFsaWRBcmd1bWVudCh7XG4gICAgICAgIHByZWZpeDogJ0hlYWRlcnMuaGFzJyxcbiAgICAgICAgdmFsdWU6IG5hbWUsXG4gICAgICAgIHR5cGU6ICdoZWFkZXIgbmFtZSdcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gMi4gUmV0dXJuIHRydWUgaWYgdGhpc+KAmXMgaGVhZGVyIGxpc3QgY29udGFpbnMgbmFtZTtcbiAgICAvLyAgICBvdGhlcndpc2UgZmFsc2UuXG4gICAgcmV0dXJuIHRoaXNba0hlYWRlcnNMaXN0XS5jb250YWlucyhuYW1lKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1oZWFkZXJzLXNldFxuICBzZXQgKG5hbWUsIHZhbHVlKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgSGVhZGVycylcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMiwgeyBoZWFkZXI6ICdIZWFkZXJzLnNldCcgfSlcblxuICAgIG5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5CeXRlU3RyaW5nKG5hbWUpXG4gICAgdmFsdWUgPSB3ZWJpZGwuY29udmVydGVycy5CeXRlU3RyaW5nKHZhbHVlKVxuXG4gICAgLy8gMS4gTm9ybWFsaXplIHZhbHVlLlxuICAgIHZhbHVlID0gaGVhZGVyVmFsdWVOb3JtYWxpemUodmFsdWUpXG5cbiAgICAvLyAyLiBJZiBuYW1lIGlzIG5vdCBhIGhlYWRlciBuYW1lIG9yIHZhbHVlIGlzIG5vdCBhXG4gICAgLy8gICAgaGVhZGVyIHZhbHVlLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmICghaXNWYWxpZEhlYWRlck5hbWUobmFtZSkpIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuaW52YWxpZEFyZ3VtZW50KHtcbiAgICAgICAgcHJlZml4OiAnSGVhZGVycy5zZXQnLFxuICAgICAgICB2YWx1ZTogbmFtZSxcbiAgICAgICAgdHlwZTogJ2hlYWRlciBuYW1lJ1xuICAgICAgfSlcbiAgICB9IGVsc2UgaWYgKCFpc1ZhbGlkSGVhZGVyVmFsdWUodmFsdWUpKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmludmFsaWRBcmd1bWVudCh7XG4gICAgICAgIHByZWZpeDogJ0hlYWRlcnMuc2V0JyxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHR5cGU6ICdoZWFkZXIgdmFsdWUnXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDMuIElmIHRoaXPigJlzIGd1YXJkIGlzIFwiaW1tdXRhYmxlXCIsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgLy8gNC4gT3RoZXJ3aXNlLCBpZiB0aGlz4oCZcyBndWFyZCBpcyBcInJlcXVlc3RcIiBhbmQgbmFtZSBpcyBhXG4gICAgLy8gICAgZm9yYmlkZGVuIGhlYWRlciBuYW1lLCByZXR1cm4uXG4gICAgLy8gNS4gT3RoZXJ3aXNlLCBpZiB0aGlz4oCZcyBndWFyZCBpcyBcInJlcXVlc3Qtbm8tY29yc1wiIGFuZFxuICAgIC8vICAgIG5hbWUvdmFsdWUgaXMgbm90IGEgbm8tQ09SUy1zYWZlbGlzdGVkIHJlcXVlc3QtaGVhZGVyLFxuICAgIC8vICAgIHJldHVybi5cbiAgICAvLyA2LiBPdGhlcndpc2UsIGlmIHRoaXPigJlzIGd1YXJkIGlzIFwicmVzcG9uc2VcIiBhbmQgbmFtZSBpcyBhXG4gICAgLy8gICAgZm9yYmlkZGVuIHJlc3BvbnNlLWhlYWRlciBuYW1lLCByZXR1cm4uXG4gICAgLy8gTm90ZTogdW5kaWNpIGRvZXMgbm90IGltcGxlbWVudCBmb3JiaWRkZW4gaGVhZGVyIG5hbWVzXG4gICAgaWYgKHRoaXNba0d1YXJkXSA9PT0gJ2ltbXV0YWJsZScpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ltbXV0YWJsZScpXG4gICAgfSBlbHNlIGlmICh0aGlzW2tHdWFyZF0gPT09ICdyZXF1ZXN0LW5vLWNvcnMnKSB7XG4gICAgICAvLyBUT0RPXG4gICAgfVxuXG4gICAgLy8gNy4gU2V0IChuYW1lLCB2YWx1ZSkgaW4gdGhpc+KAmXMgaGVhZGVyIGxpc3QuXG4gICAgLy8gOC4gSWYgdGhpc+KAmXMgZ3VhcmQgaXMgXCJyZXF1ZXN0LW5vLWNvcnNcIiwgdGhlbiByZW1vdmVcbiAgICAvLyAgICBwcml2aWxlZ2VkIG5vLUNPUlMgcmVxdWVzdCBoZWFkZXJzIGZyb20gdGhpc1xuICAgIHRoaXNba0hlYWRlcnNMaXN0XS5zZXQobmFtZSwgdmFsdWUpXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWhlYWRlcnMtZ2V0c2V0Y29va2llXG4gIGdldFNldENvb2tpZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgSGVhZGVycylcblxuICAgIC8vIDEuIElmIHRoaXPigJlzIGhlYWRlciBsaXN0IGRvZXMgbm90IGNvbnRhaW4gYFNldC1Db29raWVgLCB0aGVuIHJldHVybiDCqyDCuy5cbiAgICAvLyAyLiBSZXR1cm4gdGhlIHZhbHVlcyBvZiBhbGwgaGVhZGVycyBpbiB0aGlz4oCZcyBoZWFkZXIgbGlzdCB3aG9zZSBuYW1lIGlzXG4gICAgLy8gICAgYSBieXRlLWNhc2UtaW5zZW5zaXRpdmUgbWF0Y2ggZm9yIGBTZXQtQ29va2llYCwgaW4gb3JkZXIuXG5cbiAgICBjb25zdCBsaXN0ID0gdGhpc1trSGVhZGVyc0xpc3RdLmNvb2tpZXNcblxuICAgIGlmIChsaXN0KSB7XG4gICAgICByZXR1cm4gWy4uLmxpc3RdXG4gICAgfVxuXG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1oZWFkZXItbGlzdC1zb3J0LWFuZC1jb21iaW5lXG4gIGdldCBba0hlYWRlcnNTb3J0ZWRNYXBdICgpIHtcbiAgICBpZiAodGhpc1trSGVhZGVyc0xpc3RdW2tIZWFkZXJzU29ydGVkTWFwXSkge1xuICAgICAgcmV0dXJuIHRoaXNba0hlYWRlcnNMaXN0XVtrSGVhZGVyc1NvcnRlZE1hcF1cbiAgICB9XG5cbiAgICAvLyAxLiBMZXQgaGVhZGVycyBiZSBhbiBlbXB0eSBsaXN0IG9mIGhlYWRlcnMgd2l0aCB0aGUga2V5IGJlaW5nIHRoZSBuYW1lXG4gICAgLy8gICAgYW5kIHZhbHVlIHRoZSB2YWx1ZS5cbiAgICBjb25zdCBoZWFkZXJzID0gW11cblxuICAgIC8vIDIuIExldCBuYW1lcyBiZSB0aGUgcmVzdWx0IG9mIGNvbnZlcnQgaGVhZGVyIG5hbWVzIHRvIGEgc29ydGVkLWxvd2VyY2FzZVxuICAgIC8vICAgIHNldCB3aXRoIGFsbCB0aGUgbmFtZXMgb2YgdGhlIGhlYWRlcnMgaW4gbGlzdC5cbiAgICBjb25zdCBuYW1lcyA9IFsuLi50aGlzW2tIZWFkZXJzTGlzdF1dLnNvcnQoKGEsIGIpID0+IGFbMF0gPCBiWzBdID8gLTEgOiAxKVxuICAgIGNvbnN0IGNvb2tpZXMgPSB0aGlzW2tIZWFkZXJzTGlzdF0uY29va2llc1xuXG4gICAgLy8gMy4gRm9yIGVhY2ggbmFtZSBvZiBuYW1lczpcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBbbmFtZSwgdmFsdWVdID0gbmFtZXNbaV1cbiAgICAgIC8vIDEuIElmIG5hbWUgaXMgYHNldC1jb29raWVgLCB0aGVuOlxuICAgICAgaWYgKG5hbWUgPT09ICdzZXQtY29va2llJykge1xuICAgICAgICAvLyAxLiBMZXQgdmFsdWVzIGJlIGEgbGlzdCBvZiBhbGwgdmFsdWVzIG9mIGhlYWRlcnMgaW4gbGlzdCB3aG9zZSBuYW1lXG4gICAgICAgIC8vICAgIGlzIGEgYnl0ZS1jYXNlLWluc2Vuc2l0aXZlIG1hdGNoIGZvciBuYW1lLCBpbiBvcmRlci5cblxuICAgICAgICAvLyAyLiBGb3IgZWFjaCB2YWx1ZSBvZiB2YWx1ZXM6XG4gICAgICAgIC8vIDEuIEFwcGVuZCAobmFtZSwgdmFsdWUpIHRvIGhlYWRlcnMuXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29va2llcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgIGhlYWRlcnMucHVzaChbbmFtZSwgY29va2llc1tqXV0pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIDIuIE90aGVyd2lzZTpcblxuICAgICAgICAvLyAxLiBMZXQgdmFsdWUgYmUgdGhlIHJlc3VsdCBvZiBnZXR0aW5nIG5hbWUgZnJvbSBsaXN0LlxuXG4gICAgICAgIC8vIDIuIEFzc2VydDogdmFsdWUgaXMgbm9uLW51bGwuXG4gICAgICAgIGFzc2VydCh2YWx1ZSAhPT0gbnVsbClcblxuICAgICAgICAvLyAzLiBBcHBlbmQgKG5hbWUsIHZhbHVlKSB0byBoZWFkZXJzLlxuICAgICAgICBoZWFkZXJzLnB1c2goW25hbWUsIHZhbHVlXSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzW2tIZWFkZXJzTGlzdF1ba0hlYWRlcnNTb3J0ZWRNYXBdID0gaGVhZGVyc1xuXG4gICAgLy8gNC4gUmV0dXJuIGhlYWRlcnMuXG4gICAgcmV0dXJuIGhlYWRlcnNcbiAgfVxuXG4gIGtleXMgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEhlYWRlcnMpXG5cbiAgICBpZiAodGhpc1trR3VhcmRdID09PSAnaW1tdXRhYmxlJykge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzW2tIZWFkZXJzU29ydGVkTWFwXVxuICAgICAgcmV0dXJuIG1ha2VJdGVyYXRvcigoKSA9PiB2YWx1ZSwgJ0hlYWRlcnMnLFxuICAgICAgICAna2V5JylcbiAgICB9XG5cbiAgICByZXR1cm4gbWFrZUl0ZXJhdG9yKFxuICAgICAgKCkgPT4gWy4uLnRoaXNba0hlYWRlcnNTb3J0ZWRNYXBdLnZhbHVlcygpXSxcbiAgICAgICdIZWFkZXJzJyxcbiAgICAgICdrZXknXG4gICAgKVxuICB9XG5cbiAgdmFsdWVzICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBIZWFkZXJzKVxuXG4gICAgaWYgKHRoaXNba0d1YXJkXSA9PT0gJ2ltbXV0YWJsZScpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1trSGVhZGVyc1NvcnRlZE1hcF1cbiAgICAgIHJldHVybiBtYWtlSXRlcmF0b3IoKCkgPT4gdmFsdWUsICdIZWFkZXJzJyxcbiAgICAgICAgJ3ZhbHVlJylcbiAgICB9XG5cbiAgICByZXR1cm4gbWFrZUl0ZXJhdG9yKFxuICAgICAgKCkgPT4gWy4uLnRoaXNba0hlYWRlcnNTb3J0ZWRNYXBdLnZhbHVlcygpXSxcbiAgICAgICdIZWFkZXJzJyxcbiAgICAgICd2YWx1ZSdcbiAgICApXG4gIH1cblxuICBlbnRyaWVzICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBIZWFkZXJzKVxuXG4gICAgaWYgKHRoaXNba0d1YXJkXSA9PT0gJ2ltbXV0YWJsZScpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1trSGVhZGVyc1NvcnRlZE1hcF1cbiAgICAgIHJldHVybiBtYWtlSXRlcmF0b3IoKCkgPT4gdmFsdWUsICdIZWFkZXJzJyxcbiAgICAgICAgJ2tleSt2YWx1ZScpXG4gICAgfVxuXG4gICAgcmV0dXJuIG1ha2VJdGVyYXRvcihcbiAgICAgICgpID0+IFsuLi50aGlzW2tIZWFkZXJzU29ydGVkTWFwXS52YWx1ZXMoKV0sXG4gICAgICAnSGVhZGVycycsXG4gICAgICAna2V5K3ZhbHVlJ1xuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyh2YWx1ZTogc3RyaW5nLCBrZXk6IHN0cmluZywgc2VsZjogSGVhZGVycykgPT4gdm9pZH0gY2FsbGJhY2tGblxuICAgKiBAcGFyYW0ge3Vua25vd259IHRoaXNBcmdcbiAgICovXG4gIGZvckVhY2ggKGNhbGxiYWNrRm4sIHRoaXNBcmcgPSBnbG9iYWxUaGlzKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgSGVhZGVycylcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdIZWFkZXJzLmZvckVhY2gnIH0pXG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrRm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIFwiRmFpbGVkIHRvIGV4ZWN1dGUgJ2ZvckVhY2gnIG9uICdIZWFkZXJzJzogcGFyYW1ldGVyIDEgaXMgbm90IG9mIHR5cGUgJ0Z1bmN0aW9uJy5cIlxuICAgICAgKVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMpIHtcbiAgICAgIGNhbGxiYWNrRm4uYXBwbHkodGhpc0FyZywgW3ZhbHVlLCBrZXksIHRoaXNdKVxuICAgIH1cbiAgfVxuXG4gIFtTeW1ib2wuZm9yKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpXSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgSGVhZGVycylcblxuICAgIHJldHVybiB0aGlzW2tIZWFkZXJzTGlzdF1cbiAgfVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gSGVhZGVycy5wcm90b3R5cGUuZW50cmllc1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhIZWFkZXJzLnByb3RvdHlwZSwge1xuICBhcHBlbmQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGRlbGV0ZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgZ2V0OiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBoYXM6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHNldDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgZ2V0U2V0Q29va2llOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBrZXlzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICB2YWx1ZXM6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGVudHJpZXM6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGZvckVhY2g6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIFtTeW1ib2wuaXRlcmF0b3JdOiB7IGVudW1lcmFibGU6IGZhbHNlIH0sXG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7XG4gICAgdmFsdWU6ICdIZWFkZXJzJyxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSxcbiAgW3V0aWwuaW5zcGVjdC5jdXN0b21dOiB7XG4gICAgZW51bWVyYWJsZTogZmFsc2VcbiAgfVxufSlcblxud2ViaWRsLmNvbnZlcnRlcnMuSGVhZGVyc0luaXQgPSBmdW5jdGlvbiAoVikge1xuICBpZiAod2ViaWRsLnV0aWwuVHlwZShWKSA9PT0gJ09iamVjdCcpIHtcbiAgICBpZiAoVltTeW1ib2wuaXRlcmF0b3JdKSB7XG4gICAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPHNlcXVlbmNlPEJ5dGVTdHJpbmc+PiddKFYpXG4gICAgfVxuXG4gICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzWydyZWNvcmQ8Qnl0ZVN0cmluZywgQnl0ZVN0cmluZz4nXShWKVxuICB9XG5cbiAgdGhyb3cgd2ViaWRsLmVycm9ycy5jb252ZXJzaW9uRmFpbGVkKHtcbiAgICBwcmVmaXg6ICdIZWFkZXJzIGNvbnN0cnVjdG9yJyxcbiAgICBhcmd1bWVudDogJ0FyZ3VtZW50IDEnLFxuICAgIHR5cGVzOiBbJ3NlcXVlbmNlPHNlcXVlbmNlPEJ5dGVTdHJpbmc+PicsICdyZWNvcmQ8Qnl0ZVN0cmluZywgQnl0ZVN0cmluZz4nXVxuICB9KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZmlsbCxcbiAgSGVhZGVycyxcbiAgSGVhZGVyc0xpc3Rcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IEhlYWRlcnMsIEhlYWRlcnNMaXN0LCBmaWxsIH0gPSByZXF1aXJlKCcuL2hlYWRlcnMnKVxuY29uc3QgeyBleHRyYWN0Qm9keSwgY2xvbmVCb2R5LCBtaXhpbkJvZHkgfSA9IHJlcXVpcmUoJy4vYm9keScpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsga0VudW1lcmFibGVQcm9wZXJ0eSB9ID0gdXRpbFxuY29uc3Qge1xuICBpc1ZhbGlkUmVhc29uUGhyYXNlLFxuICBpc0NhbmNlbGxlZCxcbiAgaXNBYm9ydGVkLFxuICBpc0Jsb2JMaWtlLFxuICBzZXJpYWxpemVKYXZhc2NyaXB0VmFsdWVUb0pTT05TdHJpbmcsXG4gIGlzRXJyb3JMaWtlLFxuICBpc29tb3JwaGljRW5jb2RlXG59ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHtcbiAgcmVkaXJlY3RTdGF0dXNTZXQsXG4gIG51bGxCb2R5U3RhdHVzLFxuICBET01FeGNlcHRpb25cbn0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5jb25zdCB7IGtTdGF0ZSwga0hlYWRlcnMsIGtHdWFyZCwga1JlYWxtIH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4vd2ViaWRsJylcbmNvbnN0IHsgRm9ybURhdGEgfSA9IHJlcXVpcmUoJy4vZm9ybWRhdGEnKVxuY29uc3QgeyBnZXRHbG9iYWxPcmlnaW4gfSA9IHJlcXVpcmUoJy4vZ2xvYmFsJylcbmNvbnN0IHsgVVJMU2VyaWFsaXplciB9ID0gcmVxdWlyZSgnLi9kYXRhVVJMJylcbmNvbnN0IHsga0hlYWRlcnNMaXN0LCBrQ29uc3RydWN0IH0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsgdHlwZXMgfSA9IHJlcXVpcmUoJ3V0aWwnKVxuXG5jb25zdCBSZWFkYWJsZVN0cmVhbSA9IGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW0gfHwgcmVxdWlyZSgnc3RyZWFtL3dlYicpLlJlYWRhYmxlU3RyZWFtXG5jb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigndXRmLTgnKVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jcmVzcG9uc2UtY2xhc3NcbmNsYXNzIFJlc3BvbnNlIHtcbiAgLy8gQ3JlYXRlcyBuZXR3b3JrIGVycm9yIFJlc3BvbnNlLlxuICBzdGF0aWMgZXJyb3IgKCkge1xuICAgIC8vIFRPRE9cbiAgICBjb25zdCByZWxldmFudFJlYWxtID0geyBzZXR0aW5nc09iamVjdDoge30gfVxuXG4gICAgLy8gVGhlIHN0YXRpYyBlcnJvcigpIG1ldGhvZCBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYVxuICAgIC8vIFJlc3BvbnNlIG9iamVjdCwgZ2l2ZW4gYSBuZXcgbmV0d29yayBlcnJvciwgXCJpbW11dGFibGVcIiwgYW5kIHRoaXPigJlzXG4gICAgLy8gcmVsZXZhbnQgUmVhbG0uXG4gICAgY29uc3QgcmVzcG9uc2VPYmplY3QgPSBuZXcgUmVzcG9uc2UoKVxuICAgIHJlc3BvbnNlT2JqZWN0W2tTdGF0ZV0gPSBtYWtlTmV0d29ya0Vycm9yKClcbiAgICByZXNwb25zZU9iamVjdFtrUmVhbG1dID0gcmVsZXZhbnRSZWFsbVxuICAgIHJlc3BvbnNlT2JqZWN0W2tIZWFkZXJzXVtrSGVhZGVyc0xpc3RdID0gcmVzcG9uc2VPYmplY3Rba1N0YXRlXS5oZWFkZXJzTGlzdFxuICAgIHJlc3BvbnNlT2JqZWN0W2tIZWFkZXJzXVtrR3VhcmRdID0gJ2ltbXV0YWJsZSdcbiAgICByZXNwb25zZU9iamVjdFtrSGVhZGVyc11ba1JlYWxtXSA9IHJlbGV2YW50UmVhbG1cbiAgICByZXR1cm4gcmVzcG9uc2VPYmplY3RcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkb20tcmVzcG9uc2UtanNvblxuICBzdGF0aWMganNvbiAoZGF0YSwgaW5pdCA9IHt9KSB7XG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ1Jlc3BvbnNlLmpzb24nIH0pXG5cbiAgICBpZiAoaW5pdCAhPT0gbnVsbCkge1xuICAgICAgaW5pdCA9IHdlYmlkbC5jb252ZXJ0ZXJzLlJlc3BvbnNlSW5pdChpbml0KVxuICAgIH1cblxuICAgIC8vIDEuIExldCBieXRlcyB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgc2VyaWFsaXplIGEgSmF2YVNjcmlwdCB2YWx1ZSB0byBKU09OIGJ5dGVzIG9uIGRhdGEuXG4gICAgY29uc3QgYnl0ZXMgPSB0ZXh0RW5jb2Rlci5lbmNvZGUoXG4gICAgICBzZXJpYWxpemVKYXZhc2NyaXB0VmFsdWVUb0pTT05TdHJpbmcoZGF0YSlcbiAgICApXG5cbiAgICAvLyAyLiBMZXQgYm9keSBiZSB0aGUgcmVzdWx0IG9mIGV4dHJhY3RpbmcgYnl0ZXMuXG4gICAgY29uc3QgYm9keSA9IGV4dHJhY3RCb2R5KGJ5dGVzKVxuXG4gICAgLy8gMy4gTGV0IHJlc3BvbnNlT2JqZWN0IGJlIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYSBSZXNwb25zZSBvYmplY3QsIGdpdmVuIGEgbmV3IHJlc3BvbnNlLFxuICAgIC8vICAgIFwicmVzcG9uc2VcIiwgYW5kIHRoaXPigJlzIHJlbGV2YW50IFJlYWxtLlxuICAgIGNvbnN0IHJlbGV2YW50UmVhbG0gPSB7IHNldHRpbmdzT2JqZWN0OiB7fSB9XG4gICAgY29uc3QgcmVzcG9uc2VPYmplY3QgPSBuZXcgUmVzcG9uc2UoKVxuICAgIHJlc3BvbnNlT2JqZWN0W2tSZWFsbV0gPSByZWxldmFudFJlYWxtXG4gICAgcmVzcG9uc2VPYmplY3Rba0hlYWRlcnNdW2tHdWFyZF0gPSAncmVzcG9uc2UnXG4gICAgcmVzcG9uc2VPYmplY3Rba0hlYWRlcnNdW2tSZWFsbV0gPSByZWxldmFudFJlYWxtXG5cbiAgICAvLyA0LiBQZXJmb3JtIGluaXRpYWxpemUgYSByZXNwb25zZSBnaXZlbiByZXNwb25zZU9iamVjdCwgaW5pdCwgYW5kIChib2R5LCBcImFwcGxpY2F0aW9uL2pzb25cIikuXG4gICAgaW5pdGlhbGl6ZVJlc3BvbnNlKHJlc3BvbnNlT2JqZWN0LCBpbml0LCB7IGJvZHk6IGJvZHlbMF0sIHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KVxuXG4gICAgLy8gNS4gUmV0dXJuIHJlc3BvbnNlT2JqZWN0LlxuICAgIHJldHVybiByZXNwb25zZU9iamVjdFxuICB9XG5cbiAgLy8gQ3JlYXRlcyBhIHJlZGlyZWN0IFJlc3BvbnNlIHRoYXQgcmVkaXJlY3RzIHRvIHVybCB3aXRoIHN0YXR1cyBzdGF0dXMuXG4gIHN0YXRpYyByZWRpcmVjdCAodXJsLCBzdGF0dXMgPSAzMDIpIHtcbiAgICBjb25zdCByZWxldmFudFJlYWxtID0geyBzZXR0aW5nc09iamVjdDoge30gfVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ1Jlc3BvbnNlLnJlZGlyZWN0JyB9KVxuXG4gICAgdXJsID0gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKHVybClcbiAgICBzdGF0dXMgPSB3ZWJpZGwuY29udmVydGVyc1sndW5zaWduZWQgc2hvcnQnXShzdGF0dXMpXG5cbiAgICAvLyAxLiBMZXQgcGFyc2VkVVJMIGJlIHRoZSByZXN1bHQgb2YgcGFyc2luZyB1cmwgd2l0aCBjdXJyZW50IHNldHRpbmdzXG4gICAgLy8gb2JqZWN04oCZcyBBUEkgYmFzZSBVUkwuXG4gICAgLy8gMi4gSWYgcGFyc2VkVVJMIGlzIGZhaWx1cmUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgLy8gVE9ETzogYmFzZS1VUkw/XG4gICAgbGV0IHBhcnNlZFVSTFxuICAgIHRyeSB7XG4gICAgICBwYXJzZWRVUkwgPSBuZXcgVVJMKHVybCwgZ2V0R2xvYmFsT3JpZ2luKCkpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBUeXBlRXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSBVUkwgZnJvbSAnICsgdXJsKSwge1xuICAgICAgICBjYXVzZTogZXJyXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDMuIElmIHN0YXR1cyBpcyBub3QgYSByZWRpcmVjdCBzdGF0dXMsIHRoZW4gdGhyb3cgYSBSYW5nZUVycm9yLlxuICAgIGlmICghcmVkaXJlY3RTdGF0dXNTZXQuaGFzKHN0YXR1cykpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHN0YXR1cyBjb2RlICcgKyBzdGF0dXMpXG4gICAgfVxuXG4gICAgLy8gNC4gTGV0IHJlc3BvbnNlT2JqZWN0IGJlIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYSBSZXNwb25zZSBvYmplY3QsXG4gICAgLy8gZ2l2ZW4gYSBuZXcgcmVzcG9uc2UsIFwiaW1tdXRhYmxlXCIsIGFuZCB0aGlz4oCZcyByZWxldmFudCBSZWFsbS5cbiAgICBjb25zdCByZXNwb25zZU9iamVjdCA9IG5ldyBSZXNwb25zZSgpXG4gICAgcmVzcG9uc2VPYmplY3Rba1JlYWxtXSA9IHJlbGV2YW50UmVhbG1cbiAgICByZXNwb25zZU9iamVjdFtrSGVhZGVyc11ba0d1YXJkXSA9ICdpbW11dGFibGUnXG4gICAgcmVzcG9uc2VPYmplY3Rba0hlYWRlcnNdW2tSZWFsbV0gPSByZWxldmFudFJlYWxtXG5cbiAgICAvLyA1LiBTZXQgcmVzcG9uc2VPYmplY3TigJlzIHJlc3BvbnNl4oCZcyBzdGF0dXMgdG8gc3RhdHVzLlxuICAgIHJlc3BvbnNlT2JqZWN0W2tTdGF0ZV0uc3RhdHVzID0gc3RhdHVzXG5cbiAgICAvLyA2LiBMZXQgdmFsdWUgYmUgcGFyc2VkVVJMLCBzZXJpYWxpemVkIGFuZCBpc29tb3JwaGljIGVuY29kZWQuXG4gICAgY29uc3QgdmFsdWUgPSBpc29tb3JwaGljRW5jb2RlKFVSTFNlcmlhbGl6ZXIocGFyc2VkVVJMKSlcblxuICAgIC8vIDcuIEFwcGVuZCBgTG9jYXRpb25gL3ZhbHVlIHRvIHJlc3BvbnNlT2JqZWN04oCZcyByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3QuXG4gICAgcmVzcG9uc2VPYmplY3Rba1N0YXRlXS5oZWFkZXJzTGlzdC5hcHBlbmQoJ2xvY2F0aW9uJywgdmFsdWUpXG5cbiAgICAvLyA4LiBSZXR1cm4gcmVzcG9uc2VPYmplY3QuXG4gICAgcmV0dXJuIHJlc3BvbnNlT2JqZWN0XG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLXJlc3BvbnNlXG4gIGNvbnN0cnVjdG9yIChib2R5ID0gbnVsbCwgaW5pdCA9IHt9KSB7XG4gICAgaWYgKGJvZHkgIT09IG51bGwpIHtcbiAgICAgIGJvZHkgPSB3ZWJpZGwuY29udmVydGVycy5Cb2R5SW5pdChib2R5KVxuICAgIH1cblxuICAgIGluaXQgPSB3ZWJpZGwuY29udmVydGVycy5SZXNwb25zZUluaXQoaW5pdClcblxuICAgIC8vIFRPRE9cbiAgICB0aGlzW2tSZWFsbV0gPSB7IHNldHRpbmdzT2JqZWN0OiB7fSB9XG5cbiAgICAvLyAxLiBTZXQgdGhpc+KAmXMgcmVzcG9uc2UgdG8gYSBuZXcgcmVzcG9uc2UuXG4gICAgdGhpc1trU3RhdGVdID0gbWFrZVJlc3BvbnNlKHt9KVxuXG4gICAgLy8gMi4gU2V0IHRoaXPigJlzIGhlYWRlcnMgdG8gYSBuZXcgSGVhZGVycyBvYmplY3Qgd2l0aCB0aGlz4oCZcyByZWxldmFudFxuICAgIC8vIFJlYWxtLCB3aG9zZSBoZWFkZXIgbGlzdCBpcyB0aGlz4oCZcyByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3QgYW5kIGd1YXJkXG4gICAgLy8gaXMgXCJyZXNwb25zZVwiLlxuICAgIHRoaXNba0hlYWRlcnNdID0gbmV3IEhlYWRlcnMoa0NvbnN0cnVjdClcbiAgICB0aGlzW2tIZWFkZXJzXVtrR3VhcmRdID0gJ3Jlc3BvbnNlJ1xuICAgIHRoaXNba0hlYWRlcnNdW2tIZWFkZXJzTGlzdF0gPSB0aGlzW2tTdGF0ZV0uaGVhZGVyc0xpc3RcbiAgICB0aGlzW2tIZWFkZXJzXVtrUmVhbG1dID0gdGhpc1trUmVhbG1dXG5cbiAgICAvLyAzLiBMZXQgYm9keVdpdGhUeXBlIGJlIG51bGwuXG4gICAgbGV0IGJvZHlXaXRoVHlwZSA9IG51bGxcblxuICAgIC8vIDQuIElmIGJvZHkgaXMgbm9uLW51bGwsIHRoZW4gc2V0IGJvZHlXaXRoVHlwZSB0byB0aGUgcmVzdWx0IG9mIGV4dHJhY3RpbmcgYm9keS5cbiAgICBpZiAoYm9keSAhPSBudWxsKSB7XG4gICAgICBjb25zdCBbZXh0cmFjdGVkQm9keSwgdHlwZV0gPSBleHRyYWN0Qm9keShib2R5KVxuICAgICAgYm9keVdpdGhUeXBlID0geyBib2R5OiBleHRyYWN0ZWRCb2R5LCB0eXBlIH1cbiAgICB9XG5cbiAgICAvLyA1LiBQZXJmb3JtIGluaXRpYWxpemUgYSByZXNwb25zZSBnaXZlbiB0aGlzLCBpbml0LCBhbmQgYm9keVdpdGhUeXBlLlxuICAgIGluaXRpYWxpemVSZXNwb25zZSh0aGlzLCBpbml0LCBib2R5V2l0aFR5cGUpXG4gIH1cblxuICAvLyBSZXR1cm5zIHJlc3BvbnNl4oCZcyB0eXBlLCBlLmcuLCBcImNvcnNcIi5cbiAgZ2V0IHR5cGUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlc3BvbnNlKVxuXG4gICAgLy8gVGhlIHR5cGUgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVzcG9uc2XigJlzIHR5cGUuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS50eXBlXG4gIH1cblxuICAvLyBSZXR1cm5zIHJlc3BvbnNl4oCZcyBVUkwsIGlmIGl0IGhhcyBvbmU7IG90aGVyd2lzZSB0aGUgZW1wdHkgc3RyaW5nLlxuICBnZXQgdXJsICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXNwb25zZSlcblxuICAgIGNvbnN0IHVybExpc3QgPSB0aGlzW2tTdGF0ZV0udXJsTGlzdFxuXG4gICAgLy8gVGhlIHVybCBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoaXPigJlzXG4gICAgLy8gcmVzcG9uc2XigJlzIFVSTCBpcyBudWxsOyBvdGhlcndpc2UgdGhpc+KAmXMgcmVzcG9uc2XigJlzIFVSTCxcbiAgICAvLyBzZXJpYWxpemVkIHdpdGggZXhjbHVkZSBmcmFnbWVudCBzZXQgdG8gdHJ1ZS5cbiAgICBjb25zdCB1cmwgPSB1cmxMaXN0W3VybExpc3QubGVuZ3RoIC0gMV0gPz8gbnVsbFxuXG4gICAgaWYgKHVybCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuXG4gICAgcmV0dXJuIFVSTFNlcmlhbGl6ZXIodXJsLCB0cnVlKVxuICB9XG5cbiAgLy8gUmV0dXJucyB3aGV0aGVyIHJlc3BvbnNlIHdhcyBvYnRhaW5lZCB0aHJvdWdoIGEgcmVkaXJlY3QuXG4gIGdldCByZWRpcmVjdGVkICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXNwb25zZSlcblxuICAgIC8vIFRoZSByZWRpcmVjdGVkIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRydWUgaWYgdGhpc+KAmXMgcmVzcG9uc2XigJlzIFVSTFxuICAgIC8vIGxpc3QgaGFzIG1vcmUgdGhhbiBvbmUgaXRlbTsgb3RoZXJ3aXNlIGZhbHNlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0udXJsTGlzdC5sZW5ndGggPiAxXG4gIH1cblxuICAvLyBSZXR1cm5zIHJlc3BvbnNl4oCZcyBzdGF0dXMuXG4gIGdldCBzdGF0dXMgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlc3BvbnNlKVxuXG4gICAgLy8gVGhlIHN0YXR1cyBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlz4oCZcyByZXNwb25zZeKAmXMgc3RhdHVzLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uc3RhdHVzXG4gIH1cblxuICAvLyBSZXR1cm5zIHdoZXRoZXIgcmVzcG9uc2XigJlzIHN0YXR1cyBpcyBhbiBvayBzdGF0dXMuXG4gIGdldCBvayAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVzcG9uc2UpXG5cbiAgICAvLyBUaGUgb2sgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdHJ1ZSBpZiB0aGlz4oCZcyByZXNwb25zZeKAmXMgc3RhdHVzIGlzIGFuXG4gICAgLy8gb2sgc3RhdHVzOyBvdGhlcndpc2UgZmFsc2UuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5zdGF0dXMgPj0gMjAwICYmIHRoaXNba1N0YXRlXS5zdGF0dXMgPD0gMjk5XG4gIH1cblxuICAvLyBSZXR1cm5zIHJlc3BvbnNl4oCZcyBzdGF0dXMgbWVzc2FnZS5cbiAgZ2V0IHN0YXR1c1RleHQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlc3BvbnNlKVxuXG4gICAgLy8gVGhlIHN0YXR1c1RleHQgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVzcG9uc2XigJlzIHN0YXR1c1xuICAgIC8vIG1lc3NhZ2UuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5zdGF0dXNUZXh0XG4gIH1cblxuICAvLyBSZXR1cm5zIHJlc3BvbnNl4oCZcyBoZWFkZXJzIGFzIEhlYWRlcnMuXG4gIGdldCBoZWFkZXJzICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXNwb25zZSlcblxuICAgIC8vIFRoZSBoZWFkZXJzIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIGhlYWRlcnMuXG4gICAgcmV0dXJuIHRoaXNba0hlYWRlcnNdXG4gIH1cblxuICBnZXQgYm9keSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVzcG9uc2UpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmJvZHkgPyB0aGlzW2tTdGF0ZV0uYm9keS5zdHJlYW0gOiBudWxsXG4gIH1cblxuICBnZXQgYm9keVVzZWQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlc3BvbnNlKVxuXG4gICAgcmV0dXJuICEhdGhpc1trU3RhdGVdLmJvZHkgJiYgdXRpbC5pc0Rpc3R1cmJlZCh0aGlzW2tTdGF0ZV0uYm9keS5zdHJlYW0pXG4gIH1cblxuICAvLyBSZXR1cm5zIGEgY2xvbmUgb2YgcmVzcG9uc2UuXG4gIGNsb25lICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXNwb25zZSlcblxuICAgIC8vIDEuIElmIHRoaXMgaXMgdW51c2FibGUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKHRoaXMuYm9keVVzZWQgfHwgKHRoaXMuYm9keSAmJiB0aGlzLmJvZHkubG9ja2VkKSkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6ICdSZXNwb25zZS5jbG9uZScsXG4gICAgICAgIG1lc3NhZ2U6ICdCb2R5IGhhcyBhbHJlYWR5IGJlZW4gY29uc3VtZWQuJ1xuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyAyLiBMZXQgY2xvbmVkUmVzcG9uc2UgYmUgdGhlIHJlc3VsdCBvZiBjbG9uaW5nIHRoaXPigJlzIHJlc3BvbnNlLlxuICAgIGNvbnN0IGNsb25lZFJlc3BvbnNlID0gY2xvbmVSZXNwb25zZSh0aGlzW2tTdGF0ZV0pXG5cbiAgICAvLyAzLiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhIFJlc3BvbnNlIG9iamVjdCwgZ2l2ZW5cbiAgICAvLyBjbG9uZWRSZXNwb25zZSwgdGhpc+KAmXMgaGVhZGVyc+KAmXMgZ3VhcmQsIGFuZCB0aGlz4oCZcyByZWxldmFudCBSZWFsbS5cbiAgICBjb25zdCBjbG9uZWRSZXNwb25zZU9iamVjdCA9IG5ldyBSZXNwb25zZSgpXG4gICAgY2xvbmVkUmVzcG9uc2VPYmplY3Rba1N0YXRlXSA9IGNsb25lZFJlc3BvbnNlXG4gICAgY2xvbmVkUmVzcG9uc2VPYmplY3Rba1JlYWxtXSA9IHRoaXNba1JlYWxtXVxuICAgIGNsb25lZFJlc3BvbnNlT2JqZWN0W2tIZWFkZXJzXVtrSGVhZGVyc0xpc3RdID0gY2xvbmVkUmVzcG9uc2UuaGVhZGVyc0xpc3RcbiAgICBjbG9uZWRSZXNwb25zZU9iamVjdFtrSGVhZGVyc11ba0d1YXJkXSA9IHRoaXNba0hlYWRlcnNdW2tHdWFyZF1cbiAgICBjbG9uZWRSZXNwb25zZU9iamVjdFtrSGVhZGVyc11ba1JlYWxtXSA9IHRoaXNba0hlYWRlcnNdW2tSZWFsbV1cblxuICAgIHJldHVybiBjbG9uZWRSZXNwb25zZU9iamVjdFxuICB9XG59XG5cbm1peGluQm9keShSZXNwb25zZSlcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVzcG9uc2UucHJvdG90eXBlLCB7XG4gIHR5cGU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHVybDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgc3RhdHVzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvazoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgcmVkaXJlY3RlZDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgc3RhdHVzVGV4dDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgaGVhZGVyczoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgY2xvbmU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGJvZHk6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGJvZHlVc2VkOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBbU3ltYm9sLnRvU3RyaW5nVGFnXToge1xuICAgIHZhbHVlOiAnUmVzcG9uc2UnLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9XG59KVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhSZXNwb25zZSwge1xuICBqc29uOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZWRpcmVjdDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgZXJyb3I6IGtFbnVtZXJhYmxlUHJvcGVydHlcbn0pXG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LXJlc3BvbnNlLWNsb25lXG5mdW5jdGlvbiBjbG9uZVJlc3BvbnNlIChyZXNwb25zZSkge1xuICAvLyBUbyBjbG9uZSBhIHJlc3BvbnNlIHJlc3BvbnNlLCBydW4gdGhlc2Ugc3RlcHM6XG5cbiAgLy8gMS4gSWYgcmVzcG9uc2UgaXMgYSBmaWx0ZXJlZCByZXNwb25zZSwgdGhlbiByZXR1cm4gYSBuZXcgaWRlbnRpY2FsXG4gIC8vIGZpbHRlcmVkIHJlc3BvbnNlIHdob3NlIGludGVybmFsIHJlc3BvbnNlIGlzIGEgY2xvbmUgb2YgcmVzcG9uc2XigJlzXG4gIC8vIGludGVybmFsIHJlc3BvbnNlLlxuICBpZiAocmVzcG9uc2UuaW50ZXJuYWxSZXNwb25zZSkge1xuICAgIHJldHVybiBmaWx0ZXJSZXNwb25zZShcbiAgICAgIGNsb25lUmVzcG9uc2UocmVzcG9uc2UuaW50ZXJuYWxSZXNwb25zZSksXG4gICAgICByZXNwb25zZS50eXBlXG4gICAgKVxuICB9XG5cbiAgLy8gMi4gTGV0IG5ld1Jlc3BvbnNlIGJlIGEgY29weSBvZiByZXNwb25zZSwgZXhjZXB0IGZvciBpdHMgYm9keS5cbiAgY29uc3QgbmV3UmVzcG9uc2UgPSBtYWtlUmVzcG9uc2UoeyAuLi5yZXNwb25zZSwgYm9keTogbnVsbCB9KVxuXG4gIC8vIDMuIElmIHJlc3BvbnNl4oCZcyBib2R5IGlzIG5vbi1udWxsLCB0aGVuIHNldCBuZXdSZXNwb25zZeKAmXMgYm9keSB0byB0aGVcbiAgLy8gcmVzdWx0IG9mIGNsb25pbmcgcmVzcG9uc2XigJlzIGJvZHkuXG4gIGlmIChyZXNwb25zZS5ib2R5ICE9IG51bGwpIHtcbiAgICBuZXdSZXNwb25zZS5ib2R5ID0gY2xvbmVCb2R5KHJlc3BvbnNlLmJvZHkpXG4gIH1cblxuICAvLyA0LiBSZXR1cm4gbmV3UmVzcG9uc2UuXG4gIHJldHVybiBuZXdSZXNwb25zZVxufVxuXG5mdW5jdGlvbiBtYWtlUmVzcG9uc2UgKGluaXQpIHtcbiAgcmV0dXJuIHtcbiAgICBhYm9ydGVkOiBmYWxzZSxcbiAgICByYW5nZVJlcXVlc3RlZDogZmFsc2UsXG4gICAgdGltaW5nQWxsb3dQYXNzZWQ6IGZhbHNlLFxuICAgIHJlcXVlc3RJbmNsdWRlc0NyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICB0eXBlOiAnZGVmYXVsdCcsXG4gICAgc3RhdHVzOiAyMDAsXG4gICAgdGltaW5nSW5mbzogbnVsbCxcbiAgICBjYWNoZVN0YXRlOiAnJyxcbiAgICBzdGF0dXNUZXh0OiAnJyxcbiAgICAuLi5pbml0LFxuICAgIGhlYWRlcnNMaXN0OiBpbml0LmhlYWRlcnNMaXN0XG4gICAgICA/IG5ldyBIZWFkZXJzTGlzdChpbml0LmhlYWRlcnNMaXN0KVxuICAgICAgOiBuZXcgSGVhZGVyc0xpc3QoKSxcbiAgICB1cmxMaXN0OiBpbml0LnVybExpc3QgPyBbLi4uaW5pdC51cmxMaXN0XSA6IFtdXG4gIH1cbn1cblxuZnVuY3Rpb24gbWFrZU5ldHdvcmtFcnJvciAocmVhc29uKSB7XG4gIGNvbnN0IGlzRXJyb3IgPSBpc0Vycm9yTGlrZShyZWFzb24pXG4gIHJldHVybiBtYWtlUmVzcG9uc2Uoe1xuICAgIHR5cGU6ICdlcnJvcicsXG4gICAgc3RhdHVzOiAwLFxuICAgIGVycm9yOiBpc0Vycm9yXG4gICAgICA/IHJlYXNvblxuICAgICAgOiBuZXcgRXJyb3IocmVhc29uID8gU3RyaW5nKHJlYXNvbikgOiByZWFzb24pLFxuICAgIGFib3J0ZWQ6IHJlYXNvbiAmJiByZWFzb24ubmFtZSA9PT0gJ0Fib3J0RXJyb3InXG4gIH0pXG59XG5cbmZ1bmN0aW9uIG1ha2VGaWx0ZXJlZFJlc3BvbnNlIChyZXNwb25zZSwgc3RhdGUpIHtcbiAgc3RhdGUgPSB7XG4gICAgaW50ZXJuYWxSZXNwb25zZTogcmVzcG9uc2UsXG4gICAgLi4uc3RhdGVcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJveHkocmVzcG9uc2UsIHtcbiAgICBnZXQgKHRhcmdldCwgcCkge1xuICAgICAgcmV0dXJuIHAgaW4gc3RhdGUgPyBzdGF0ZVtwXSA6IHRhcmdldFtwXVxuICAgIH0sXG4gICAgc2V0ICh0YXJnZXQsIHAsIHZhbHVlKSB7XG4gICAgICBhc3NlcnQoIShwIGluIHN0YXRlKSlcbiAgICAgIHRhcmdldFtwXSA9IHZhbHVlXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfSlcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtZmlsdGVyZWQtcmVzcG9uc2VcbmZ1bmN0aW9uIGZpbHRlclJlc3BvbnNlIChyZXNwb25zZSwgdHlwZSkge1xuICAvLyBTZXQgcmVzcG9uc2UgdG8gdGhlIGZvbGxvd2luZyBmaWx0ZXJlZCByZXNwb25zZSB3aXRoIHJlc3BvbnNlIGFzIGl0c1xuICAvLyBpbnRlcm5hbCByZXNwb25zZSwgZGVwZW5kaW5nIG9uIHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nOlxuICBpZiAodHlwZSA9PT0gJ2Jhc2ljJykge1xuICAgIC8vIEEgYmFzaWMgZmlsdGVyZWQgcmVzcG9uc2UgaXMgYSBmaWx0ZXJlZCByZXNwb25zZSB3aG9zZSB0eXBlIGlzIFwiYmFzaWNcIlxuICAgIC8vIGFuZCBoZWFkZXIgbGlzdCBleGNsdWRlcyBhbnkgaGVhZGVycyBpbiBpbnRlcm5hbCByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3RcbiAgICAvLyB3aG9zZSBuYW1lIGlzIGEgZm9yYmlkZGVuIHJlc3BvbnNlLWhlYWRlciBuYW1lLlxuXG4gICAgLy8gTm90ZTogdW5kaWNpIGRvZXMgbm90IGltcGxlbWVudCBmb3JiaWRkZW4gcmVzcG9uc2UtaGVhZGVyIG5hbWVzXG4gICAgcmV0dXJuIG1ha2VGaWx0ZXJlZFJlc3BvbnNlKHJlc3BvbnNlLCB7XG4gICAgICB0eXBlOiAnYmFzaWMnLFxuICAgICAgaGVhZGVyc0xpc3Q6IHJlc3BvbnNlLmhlYWRlcnNMaXN0XG4gICAgfSlcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnY29ycycpIHtcbiAgICAvLyBBIENPUlMgZmlsdGVyZWQgcmVzcG9uc2UgaXMgYSBmaWx0ZXJlZCByZXNwb25zZSB3aG9zZSB0eXBlIGlzIFwiY29yc1wiXG4gICAgLy8gYW5kIGhlYWRlciBsaXN0IGV4Y2x1ZGVzIGFueSBoZWFkZXJzIGluIGludGVybmFsIHJlc3BvbnNl4oCZcyBoZWFkZXJcbiAgICAvLyBsaXN0IHdob3NlIG5hbWUgaXMgbm90IGEgQ09SUy1zYWZlbGlzdGVkIHJlc3BvbnNlLWhlYWRlciBuYW1lLCBnaXZlblxuICAgIC8vIGludGVybmFsIHJlc3BvbnNl4oCZcyBDT1JTLWV4cG9zZWQgaGVhZGVyLW5hbWUgbGlzdC5cblxuICAgIC8vIE5vdGU6IHVuZGljaSBkb2VzIG5vdCBpbXBsZW1lbnQgQ09SUy1zYWZlbGlzdGVkIHJlc3BvbnNlLWhlYWRlciBuYW1lc1xuICAgIHJldHVybiBtYWtlRmlsdGVyZWRSZXNwb25zZShyZXNwb25zZSwge1xuICAgICAgdHlwZTogJ2NvcnMnLFxuICAgICAgaGVhZGVyc0xpc3Q6IHJlc3BvbnNlLmhlYWRlcnNMaXN0XG4gICAgfSlcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnb3BhcXVlJykge1xuICAgIC8vIEFuIG9wYXF1ZSBmaWx0ZXJlZCByZXNwb25zZSBpcyBhIGZpbHRlcmVkIHJlc3BvbnNlIHdob3NlIHR5cGUgaXNcbiAgICAvLyBcIm9wYXF1ZVwiLCBVUkwgbGlzdCBpcyB0aGUgZW1wdHkgbGlzdCwgc3RhdHVzIGlzIDAsIHN0YXR1cyBtZXNzYWdlXG4gICAgLy8gaXMgdGhlIGVtcHR5IGJ5dGUgc2VxdWVuY2UsIGhlYWRlciBsaXN0IGlzIGVtcHR5LCBhbmQgYm9keSBpcyBudWxsLlxuXG4gICAgcmV0dXJuIG1ha2VGaWx0ZXJlZFJlc3BvbnNlKHJlc3BvbnNlLCB7XG4gICAgICB0eXBlOiAnb3BhcXVlJyxcbiAgICAgIHVybExpc3Q6IE9iamVjdC5mcmVlemUoW10pLFxuICAgICAgc3RhdHVzOiAwLFxuICAgICAgc3RhdHVzVGV4dDogJycsXG4gICAgICBib2R5OiBudWxsXG4gICAgfSlcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnb3BhcXVlcmVkaXJlY3QnKSB7XG4gICAgLy8gQW4gb3BhcXVlLXJlZGlyZWN0IGZpbHRlcmVkIHJlc3BvbnNlIGlzIGEgZmlsdGVyZWQgcmVzcG9uc2Ugd2hvc2UgdHlwZVxuICAgIC8vIGlzIFwib3BhcXVlcmVkaXJlY3RcIiwgc3RhdHVzIGlzIDAsIHN0YXR1cyBtZXNzYWdlIGlzIHRoZSBlbXB0eSBieXRlXG4gICAgLy8gc2VxdWVuY2UsIGhlYWRlciBsaXN0IGlzIGVtcHR5LCBhbmQgYm9keSBpcyBudWxsLlxuXG4gICAgcmV0dXJuIG1ha2VGaWx0ZXJlZFJlc3BvbnNlKHJlc3BvbnNlLCB7XG4gICAgICB0eXBlOiAnb3BhcXVlcmVkaXJlY3QnLFxuICAgICAgc3RhdHVzOiAwLFxuICAgICAgc3RhdHVzVGV4dDogJycsXG4gICAgICBoZWFkZXJzTGlzdDogW10sXG4gICAgICBib2R5OiBudWxsXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICBhc3NlcnQoZmFsc2UpXG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2FwcHJvcHJpYXRlLW5ldHdvcmstZXJyb3JcbmZ1bmN0aW9uIG1ha2VBcHByb3ByaWF0ZU5ldHdvcmtFcnJvciAoZmV0Y2hQYXJhbXMsIGVyciA9IG51bGwpIHtcbiAgLy8gMS4gQXNzZXJ0OiBmZXRjaFBhcmFtcyBpcyBjYW5jZWxlZC5cbiAgYXNzZXJ0KGlzQ2FuY2VsbGVkKGZldGNoUGFyYW1zKSlcblxuICAvLyAyLiBSZXR1cm4gYW4gYWJvcnRlZCBuZXR3b3JrIGVycm9yIGlmIGZldGNoUGFyYW1zIGlzIGFib3J0ZWQ7XG4gIC8vIG90aGVyd2lzZSByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICByZXR1cm4gaXNBYm9ydGVkKGZldGNoUGFyYW1zKVxuICAgID8gbWFrZU5ldHdvcmtFcnJvcihPYmplY3QuYXNzaWduKG5ldyBET01FeGNlcHRpb24oJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuJywgJ0Fib3J0RXJyb3InKSwgeyBjYXVzZTogZXJyIH0pKVxuICAgIDogbWFrZU5ldHdvcmtFcnJvcihPYmplY3QuYXNzaWduKG5ldyBET01FeGNlcHRpb24oJ1JlcXVlc3Qgd2FzIGNhbmNlbGxlZC4nKSwgeyBjYXVzZTogZXJyIH0pKVxufVxuXG4vLyBodHRwczovL3doYXRwci5vcmcvZmV0Y2gvMTM5Mi5odG1sI2luaXRpYWxpemUtYS1yZXNwb25zZVxuZnVuY3Rpb24gaW5pdGlhbGl6ZVJlc3BvbnNlIChyZXNwb25zZSwgaW5pdCwgYm9keSkge1xuICAvLyAxLiBJZiBpbml0W1wic3RhdHVzXCJdIGlzIG5vdCBpbiB0aGUgcmFuZ2UgMjAwIHRvIDU5OSwgaW5jbHVzaXZlLCB0aGVuXG4gIC8vICAgIHRocm93IGEgUmFuZ2VFcnJvci5cbiAgaWYgKGluaXQuc3RhdHVzICE9PSBudWxsICYmIChpbml0LnN0YXR1cyA8IDIwMCB8fCBpbml0LnN0YXR1cyA+IDU5OSkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignaW5pdFtcInN0YXR1c1wiXSBtdXN0IGJlIGluIHRoZSByYW5nZSBvZiAyMDAgdG8gNTk5LCBpbmNsdXNpdmUuJylcbiAgfVxuXG4gIC8vIDIuIElmIGluaXRbXCJzdGF0dXNUZXh0XCJdIGRvZXMgbm90IG1hdGNoIHRoZSByZWFzb24tcGhyYXNlIHRva2VuIHByb2R1Y3Rpb24sXG4gIC8vICAgIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gIGlmICgnc3RhdHVzVGV4dCcgaW4gaW5pdCAmJiBpbml0LnN0YXR1c1RleHQgIT0gbnVsbCkge1xuICAgIC8vIFNlZSwgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM3MjMwI3NlY3Rpb24tMy4xLjI6XG4gICAgLy8gICByZWFzb24tcGhyYXNlICA9ICooIEhUQUIgLyBTUCAvIFZDSEFSIC8gb2JzLXRleHQgKVxuICAgIGlmICghaXNWYWxpZFJlYXNvblBocmFzZShTdHJpbmcoaW5pdC5zdGF0dXNUZXh0KSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgc3RhdHVzVGV4dCcpXG4gICAgfVxuICB9XG5cbiAgLy8gMy4gU2V0IHJlc3BvbnNl4oCZcyByZXNwb25zZeKAmXMgc3RhdHVzIHRvIGluaXRbXCJzdGF0dXNcIl0uXG4gIGlmICgnc3RhdHVzJyBpbiBpbml0ICYmIGluaXQuc3RhdHVzICE9IG51bGwpIHtcbiAgICByZXNwb25zZVtrU3RhdGVdLnN0YXR1cyA9IGluaXQuc3RhdHVzXG4gIH1cblxuICAvLyA0LiBTZXQgcmVzcG9uc2XigJlzIHJlc3BvbnNl4oCZcyBzdGF0dXMgbWVzc2FnZSB0byBpbml0W1wic3RhdHVzVGV4dFwiXS5cbiAgaWYgKCdzdGF0dXNUZXh0JyBpbiBpbml0ICYmIGluaXQuc3RhdHVzVGV4dCAhPSBudWxsKSB7XG4gICAgcmVzcG9uc2Vba1N0YXRlXS5zdGF0dXNUZXh0ID0gaW5pdC5zdGF0dXNUZXh0XG4gIH1cblxuICAvLyA1LiBJZiBpbml0W1wiaGVhZGVyc1wiXSBleGlzdHMsIHRoZW4gZmlsbCByZXNwb25zZeKAmXMgaGVhZGVycyB3aXRoIGluaXRbXCJoZWFkZXJzXCJdLlxuICBpZiAoJ2hlYWRlcnMnIGluIGluaXQgJiYgaW5pdC5oZWFkZXJzICE9IG51bGwpIHtcbiAgICBmaWxsKHJlc3BvbnNlW2tIZWFkZXJzXSwgaW5pdC5oZWFkZXJzKVxuICB9XG5cbiAgLy8gNi4gSWYgYm9keSB3YXMgZ2l2ZW4sIHRoZW46XG4gIGlmIChib2R5KSB7XG4gICAgLy8gMS4gSWYgcmVzcG9uc2UncyBzdGF0dXMgaXMgYSBudWxsIGJvZHkgc3RhdHVzLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmIChudWxsQm9keVN0YXR1cy5pbmNsdWRlcyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgIGhlYWRlcjogJ1Jlc3BvbnNlIGNvbnN0cnVjdG9yJyxcbiAgICAgICAgbWVzc2FnZTogJ0ludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgJyArIHJlc3BvbnNlLnN0YXR1c1xuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyAyLiBTZXQgcmVzcG9uc2UncyBib2R5IHRvIGJvZHkncyBib2R5LlxuICAgIHJlc3BvbnNlW2tTdGF0ZV0uYm9keSA9IGJvZHkuYm9keVxuXG4gICAgLy8gMy4gSWYgYm9keSdzIHR5cGUgaXMgbm9uLW51bGwgYW5kIHJlc3BvbnNlJ3MgaGVhZGVyIGxpc3QgZG9lcyBub3QgY29udGFpblxuICAgIC8vICAgIGBDb250ZW50LVR5cGVgLCB0aGVuIGFwcGVuZCAoYENvbnRlbnQtVHlwZWAsIGJvZHkncyB0eXBlKSB0byByZXNwb25zZSdzIGhlYWRlciBsaXN0LlxuICAgIGlmIChib2R5LnR5cGUgIT0gbnVsbCAmJiAhcmVzcG9uc2Vba1N0YXRlXS5oZWFkZXJzTGlzdC5jb250YWlucygnQ29udGVudC1UeXBlJykpIHtcbiAgICAgIHJlc3BvbnNlW2tTdGF0ZV0uaGVhZGVyc0xpc3QuYXBwZW5kKCdjb250ZW50LXR5cGUnLCBib2R5LnR5cGUpXG4gICAgfVxuICB9XG59XG5cbndlYmlkbC5jb252ZXJ0ZXJzLlJlYWRhYmxlU3RyZWFtID0gd2ViaWRsLmludGVyZmFjZUNvbnZlcnRlcihcbiAgUmVhZGFibGVTdHJlYW1cbilcblxud2ViaWRsLmNvbnZlcnRlcnMuRm9ybURhdGEgPSB3ZWJpZGwuaW50ZXJmYWNlQ29udmVydGVyKFxuICBGb3JtRGF0YVxuKVxuXG53ZWJpZGwuY29udmVydGVycy5VUkxTZWFyY2hQYXJhbXMgPSB3ZWJpZGwuaW50ZXJmYWNlQ29udmVydGVyKFxuICBVUkxTZWFyY2hQYXJhbXNcbilcblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI3R5cGVkZWZkZWYteG1saHR0cHJlcXVlc3Rib2R5aW5pdFxud2ViaWRsLmNvbnZlcnRlcnMuWE1MSHR0cFJlcXVlc3RCb2R5SW5pdCA9IGZ1bmN0aW9uIChWKSB7XG4gIGlmICh0eXBlb2YgViA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKFYpXG4gIH1cblxuICBpZiAoaXNCbG9iTGlrZShWKSkge1xuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5CbG9iKFYsIHsgc3RyaWN0OiBmYWxzZSB9KVxuICB9XG5cbiAgaWYgKHR5cGVzLmlzQXJyYXlCdWZmZXIoVikgfHwgdHlwZXMuaXNUeXBlZEFycmF5KFYpIHx8IHR5cGVzLmlzRGF0YVZpZXcoVikpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuQnVmZmVyU291cmNlKFYpXG4gIH1cblxuICBpZiAodXRpbC5pc0Zvcm1EYXRhTGlrZShWKSkge1xuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5Gb3JtRGF0YShWLCB7IHN0cmljdDogZmFsc2UgfSlcbiAgfVxuXG4gIGlmIChWIGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zKSB7XG4gICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLlVSTFNlYXJjaFBhcmFtcyhWKVxuICB9XG5cbiAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyhWKVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jYm9keWluaXRcbndlYmlkbC5jb252ZXJ0ZXJzLkJvZHlJbml0ID0gZnVuY3Rpb24gKFYpIHtcbiAgaWYgKFYgaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbSkge1xuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5SZWFkYWJsZVN0cmVhbShWKVxuICB9XG5cbiAgLy8gTm90ZTogdGhlIHNwZWMgZG9lc24ndCBpbmNsdWRlIGFzeW5jIGl0ZXJhYmxlcyxcbiAgLy8gdGhpcyBpcyBhbiB1bmRpY2kgZXh0ZW5zaW9uLlxuICBpZiAoVj8uW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSkge1xuICAgIHJldHVybiBWXG4gIH1cblxuICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuWE1MSHR0cFJlcXVlc3RCb2R5SW5pdChWKVxufVxuXG53ZWJpZGwuY29udmVydGVycy5SZXNwb25zZUluaXQgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIHtcbiAgICBrZXk6ICdzdGF0dXMnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIHNob3J0J10sXG4gICAgZGVmYXVsdFZhbHVlOiAyMDBcbiAgfSxcbiAge1xuICAgIGtleTogJ3N0YXR1c1RleHQnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6ICcnXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdoZWFkZXJzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkhlYWRlcnNJbml0XG4gIH1cbl0pXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtYWtlTmV0d29ya0Vycm9yLFxuICBtYWtlUmVzcG9uc2UsXG4gIG1ha2VBcHByb3ByaWF0ZU5ldHdvcmtFcnJvcixcbiAgZmlsdGVyUmVzcG9uc2UsXG4gIFJlc3BvbnNlLFxuICBjbG9uZVJlc3BvbnNlXG59XG4iLCIvKiBnbG9iYWxzIEFib3J0Q29udHJvbGxlciAqL1xuXG4ndXNlIHN0cmljdCdcblxuY29uc3QgeyBleHRyYWN0Qm9keSwgbWl4aW5Cb2R5LCBjbG9uZUJvZHkgfSA9IHJlcXVpcmUoJy4vYm9keScpXG5jb25zdCB7IEhlYWRlcnMsIGZpbGw6IGZpbGxIZWFkZXJzLCBIZWFkZXJzTGlzdCB9ID0gcmVxdWlyZSgnLi9oZWFkZXJzJylcbmNvbnN0IHsgRmluYWxpemF0aW9uUmVnaXN0cnkgfSA9IHJlcXVpcmUoJy4uL2NvbXBhdC9kaXNwYXRjaGVyLXdlYWtyZWYnKSgpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHtcbiAgaXNWYWxpZEhUVFBUb2tlbixcbiAgc2FtZU9yaWdpbixcbiAgbm9ybWFsaXplTWV0aG9kLFxuICBtYWtlUG9saWN5Q29udGFpbmVyLFxuICBub3JtYWxpemVNZXRob2RSZWNvcmRcbn0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3Qge1xuICBmb3JiaWRkZW5NZXRob2RzU2V0LFxuICBjb3JzU2FmZUxpc3RlZE1ldGhvZHNTZXQsXG4gIHJlZmVycmVyUG9saWN5LFxuICByZXF1ZXN0UmVkaXJlY3QsXG4gIHJlcXVlc3RNb2RlLFxuICByZXF1ZXN0Q3JlZGVudGlhbHMsXG4gIHJlcXVlc3RDYWNoZSxcbiAgcmVxdWVzdER1cGxleFxufSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IHsga0VudW1lcmFibGVQcm9wZXJ0eSB9ID0gdXRpbFxuY29uc3QgeyBrSGVhZGVycywga1NpZ25hbCwga1N0YXRlLCBrR3VhcmQsIGtSZWFsbSB9ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgd2ViaWRsIH0gPSByZXF1aXJlKCcuL3dlYmlkbCcpXG5jb25zdCB7IGdldEdsb2JhbE9yaWdpbiB9ID0gcmVxdWlyZSgnLi9nbG9iYWwnKVxuY29uc3QgeyBVUkxTZXJpYWxpemVyIH0gPSByZXF1aXJlKCcuL2RhdGFVUkwnKVxuY29uc3QgeyBrSGVhZGVyc0xpc3QsIGtDb25zdHJ1Y3QgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuY29uc3QgeyBnZXRNYXhMaXN0ZW5lcnMsIHNldE1heExpc3RlbmVycywgZ2V0RXZlbnRMaXN0ZW5lcnMsIGRlZmF1bHRNYXhMaXN0ZW5lcnMgfSA9IHJlcXVpcmUoJ2V2ZW50cycpXG5cbmxldCBUcmFuc2Zvcm1TdHJlYW0gPSBnbG9iYWxUaGlzLlRyYW5zZm9ybVN0cmVhbVxuXG5jb25zdCBrQWJvcnRDb250cm9sbGVyID0gU3ltYm9sKCdhYm9ydENvbnRyb2xsZXInKVxuXG5jb25zdCByZXF1ZXN0RmluYWxpemVyID0gbmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KCh7IHNpZ25hbCwgYWJvcnQgfSkgPT4ge1xuICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydClcbn0pXG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXF1ZXN0LWNsYXNzXG5jbGFzcyBSZXF1ZXN0IHtcbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1yZXF1ZXN0XG4gIGNvbnN0cnVjdG9yIChpbnB1dCwgaW5pdCA9IHt9KSB7XG4gICAgaWYgKGlucHV0ID09PSBrQ29uc3RydWN0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnUmVxdWVzdCBjb25zdHJ1Y3RvcicgfSlcblxuICAgIGlucHV0ID0gd2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdEluZm8oaW5wdXQpXG4gICAgaW5pdCA9IHdlYmlkbC5jb252ZXJ0ZXJzLlJlcXVlc3RJbml0KGluaXQpXG5cbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS93ZWJhcHBhcGlzLmh0bWwjZW52aXJvbm1lbnQtc2V0dGluZ3Mtb2JqZWN0XG4gICAgdGhpc1trUmVhbG1dID0ge1xuICAgICAgc2V0dGluZ3NPYmplY3Q6IHtcbiAgICAgICAgYmFzZVVybDogZ2V0R2xvYmFsT3JpZ2luKCksXG4gICAgICAgIGdldCBvcmlnaW4gKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmJhc2VVcmw/Lm9yaWdpblxuICAgICAgICB9LFxuICAgICAgICBwb2xpY3lDb250YWluZXI6IG1ha2VQb2xpY3lDb250YWluZXIoKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDEuIExldCByZXF1ZXN0IGJlIG51bGwuXG4gICAgbGV0IHJlcXVlc3QgPSBudWxsXG5cbiAgICAvLyAyLiBMZXQgZmFsbGJhY2tNb2RlIGJlIG51bGwuXG4gICAgbGV0IGZhbGxiYWNrTW9kZSA9IG51bGxcblxuICAgIC8vIDMuIExldCBiYXNlVVJMIGJlIHRoaXPigJlzIHJlbGV2YW50IHNldHRpbmdzIG9iamVjdOKAmXMgQVBJIGJhc2UgVVJMLlxuICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzW2tSZWFsbV0uc2V0dGluZ3NPYmplY3QuYmFzZVVybFxuXG4gICAgLy8gNC4gTGV0IHNpZ25hbCBiZSBudWxsLlxuICAgIGxldCBzaWduYWwgPSBudWxsXG5cbiAgICAvLyA1LiBJZiBpbnB1dCBpcyBhIHN0cmluZywgdGhlbjpcbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gMS4gTGV0IHBhcnNlZFVSTCBiZSB0aGUgcmVzdWx0IG9mIHBhcnNpbmcgaW5wdXQgd2l0aCBiYXNlVVJMLlxuICAgICAgLy8gMi4gSWYgcGFyc2VkVVJMIGlzIGZhaWx1cmUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgICBsZXQgcGFyc2VkVVJMXG4gICAgICB0cnkge1xuICAgICAgICBwYXJzZWRVUkwgPSBuZXcgVVJMKGlucHV0LCBiYXNlVXJsKVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSBVUkwgZnJvbSAnICsgaW5wdXQsIHsgY2F1c2U6IGVyciB9KVxuICAgICAgfVxuXG4gICAgICAvLyAzLiBJZiBwYXJzZWRVUkwgaW5jbHVkZXMgY3JlZGVudGlhbHMsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgICBpZiAocGFyc2VkVVJMLnVzZXJuYW1lIHx8IHBhcnNlZFVSTC5wYXNzd29yZCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICdSZXF1ZXN0IGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBmcm9tIGEgVVJMIHRoYXQgaW5jbHVkZXMgY3JlZGVudGlhbHM6ICcgK1xuICAgICAgICAgICAgaW5wdXRcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyA0LiBTZXQgcmVxdWVzdCB0byBhIG5ldyByZXF1ZXN0IHdob3NlIFVSTCBpcyBwYXJzZWRVUkwuXG4gICAgICByZXF1ZXN0ID0gbWFrZVJlcXVlc3QoeyB1cmxMaXN0OiBbcGFyc2VkVVJMXSB9KVxuXG4gICAgICAvLyA1LiBTZXQgZmFsbGJhY2tNb2RlIHRvIFwiY29yc1wiLlxuICAgICAgZmFsbGJhY2tNb2RlID0gJ2NvcnMnXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDYuIE90aGVyd2lzZTpcblxuICAgICAgLy8gNy4gQXNzZXJ0OiBpbnB1dCBpcyBhIFJlcXVlc3Qgb2JqZWN0LlxuICAgICAgYXNzZXJ0KGlucHV0IGluc3RhbmNlb2YgUmVxdWVzdClcblxuICAgICAgLy8gOC4gU2V0IHJlcXVlc3QgdG8gaW5wdXTigJlzIHJlcXVlc3QuXG4gICAgICByZXF1ZXN0ID0gaW5wdXRba1N0YXRlXVxuXG4gICAgICAvLyA5LiBTZXQgc2lnbmFsIHRvIGlucHV04oCZcyBzaWduYWwuXG4gICAgICBzaWduYWwgPSBpbnB1dFtrU2lnbmFsXVxuICAgIH1cblxuICAgIC8vIDcuIExldCBvcmlnaW4gYmUgdGhpc+KAmXMgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN04oCZcyBvcmlnaW4uXG4gICAgY29uc3Qgb3JpZ2luID0gdGhpc1trUmVhbG1dLnNldHRpbmdzT2JqZWN0Lm9yaWdpblxuXG4gICAgLy8gOC4gTGV0IHdpbmRvdyBiZSBcImNsaWVudFwiLlxuICAgIGxldCB3aW5kb3cgPSAnY2xpZW50J1xuXG4gICAgLy8gOS4gSWYgcmVxdWVzdOKAmXMgd2luZG93IGlzIGFuIGVudmlyb25tZW50IHNldHRpbmdzIG9iamVjdCBhbmQgaXRzIG9yaWdpblxuICAgIC8vIGlzIHNhbWUgb3JpZ2luIHdpdGggb3JpZ2luLCB0aGVuIHNldCB3aW5kb3cgdG8gcmVxdWVzdOKAmXMgd2luZG93LlxuICAgIGlmIChcbiAgICAgIHJlcXVlc3Qud2luZG93Py5jb25zdHJ1Y3Rvcj8ubmFtZSA9PT0gJ0Vudmlyb25tZW50U2V0dGluZ3NPYmplY3QnICYmXG4gICAgICBzYW1lT3JpZ2luKHJlcXVlc3Qud2luZG93LCBvcmlnaW4pXG4gICAgKSB7XG4gICAgICB3aW5kb3cgPSByZXF1ZXN0LndpbmRvd1xuICAgIH1cblxuICAgIC8vIDEwLiBJZiBpbml0W1wid2luZG93XCJdIGV4aXN0cyBhbmQgaXMgbm9uLW51bGwsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKGluaXQud2luZG93ICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCd3aW5kb3cnIG9wdGlvbiAnJHt3aW5kb3d9JyBtdXN0IGJlIG51bGxgKVxuICAgIH1cblxuICAgIC8vIDExLiBJZiBpbml0W1wid2luZG93XCJdIGV4aXN0cywgdGhlbiBzZXQgd2luZG93IHRvIFwibm8td2luZG93XCIuXG4gICAgaWYgKCd3aW5kb3cnIGluIGluaXQpIHtcbiAgICAgIHdpbmRvdyA9ICduby13aW5kb3cnXG4gICAgfVxuXG4gICAgLy8gMTIuIFNldCByZXF1ZXN0IHRvIGEgbmV3IHJlcXVlc3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgcmVxdWVzdCA9IG1ha2VSZXF1ZXN0KHtcbiAgICAgIC8vIFVSTCByZXF1ZXN04oCZcyBVUkwuXG4gICAgICAvLyB1bmRpY2kgaW1wbGVtZW50YXRpb24gbm90ZTogdGhpcyBpcyBzZXQgYXMgdGhlIGZpcnN0IGl0ZW0gaW4gcmVxdWVzdCdzIHVybExpc3QgaW4gbWFrZVJlcXVlc3RcbiAgICAgIC8vIG1ldGhvZCByZXF1ZXN04oCZcyBtZXRob2QuXG4gICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgLy8gaGVhZGVyIGxpc3QgQSBjb3B5IG9mIHJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICAgICAgLy8gdW5kaWNpIGltcGxlbWVudGF0aW9uIG5vdGU6IGhlYWRlcnNMaXN0IGlzIGNsb25lZCBpbiBtYWtlUmVxdWVzdFxuICAgICAgaGVhZGVyc0xpc3Q6IHJlcXVlc3QuaGVhZGVyc0xpc3QsXG4gICAgICAvLyB1bnNhZmUtcmVxdWVzdCBmbGFnIFNldC5cbiAgICAgIHVuc2FmZVJlcXVlc3Q6IHJlcXVlc3QudW5zYWZlUmVxdWVzdCxcbiAgICAgIC8vIGNsaWVudCBUaGlz4oCZcyByZWxldmFudCBzZXR0aW5ncyBvYmplY3QuXG4gICAgICBjbGllbnQ6IHRoaXNba1JlYWxtXS5zZXR0aW5nc09iamVjdCxcbiAgICAgIC8vIHdpbmRvdyB3aW5kb3cuXG4gICAgICB3aW5kb3csXG4gICAgICAvLyBwcmlvcml0eSByZXF1ZXN04oCZcyBwcmlvcml0eS5cbiAgICAgIHByaW9yaXR5OiByZXF1ZXN0LnByaW9yaXR5LFxuICAgICAgLy8gb3JpZ2luIHJlcXVlc3TigJlzIG9yaWdpbi4gVGhlIHByb3BhZ2F0aW9uIG9mIHRoZSBvcmlnaW4gaXMgb25seSBzaWduaWZpY2FudCBmb3IgbmF2aWdhdGlvbiByZXF1ZXN0c1xuICAgICAgLy8gYmVpbmcgaGFuZGxlZCBieSBhIHNlcnZpY2Ugd29ya2VyLiBJbiB0aGlzIHNjZW5hcmlvIGEgcmVxdWVzdCBjYW4gaGF2ZSBhbiBvcmlnaW4gdGhhdCBpcyBkaWZmZXJlbnRcbiAgICAgIC8vIGZyb20gdGhlIGN1cnJlbnQgY2xpZW50LlxuICAgICAgb3JpZ2luOiByZXF1ZXN0Lm9yaWdpbixcbiAgICAgIC8vIHJlZmVycmVyIHJlcXVlc3TigJlzIHJlZmVycmVyLlxuICAgICAgcmVmZXJyZXI6IHJlcXVlc3QucmVmZXJyZXIsXG4gICAgICAvLyByZWZlcnJlciBwb2xpY3kgcmVxdWVzdOKAmXMgcmVmZXJyZXIgcG9saWN5LlxuICAgICAgcmVmZXJyZXJQb2xpY3k6IHJlcXVlc3QucmVmZXJyZXJQb2xpY3ksXG4gICAgICAvLyBtb2RlIHJlcXVlc3TigJlzIG1vZGUuXG4gICAgICBtb2RlOiByZXF1ZXN0Lm1vZGUsXG4gICAgICAvLyBjcmVkZW50aWFscyBtb2RlIHJlcXVlc3TigJlzIGNyZWRlbnRpYWxzIG1vZGUuXG4gICAgICBjcmVkZW50aWFsczogcmVxdWVzdC5jcmVkZW50aWFscyxcbiAgICAgIC8vIGNhY2hlIG1vZGUgcmVxdWVzdOKAmXMgY2FjaGUgbW9kZS5cbiAgICAgIGNhY2hlOiByZXF1ZXN0LmNhY2hlLFxuICAgICAgLy8gcmVkaXJlY3QgbW9kZSByZXF1ZXN04oCZcyByZWRpcmVjdCBtb2RlLlxuICAgICAgcmVkaXJlY3Q6IHJlcXVlc3QucmVkaXJlY3QsXG4gICAgICAvLyBpbnRlZ3JpdHkgbWV0YWRhdGEgcmVxdWVzdOKAmXMgaW50ZWdyaXR5IG1ldGFkYXRhLlxuICAgICAgaW50ZWdyaXR5OiByZXF1ZXN0LmludGVncml0eSxcbiAgICAgIC8vIGtlZXBhbGl2ZSByZXF1ZXN04oCZcyBrZWVwYWxpdmUuXG4gICAgICBrZWVwYWxpdmU6IHJlcXVlc3Qua2VlcGFsaXZlLFxuICAgICAgLy8gcmVsb2FkLW5hdmlnYXRpb24gZmxhZyByZXF1ZXN04oCZcyByZWxvYWQtbmF2aWdhdGlvbiBmbGFnLlxuICAgICAgcmVsb2FkTmF2aWdhdGlvbjogcmVxdWVzdC5yZWxvYWROYXZpZ2F0aW9uLFxuICAgICAgLy8gaGlzdG9yeS1uYXZpZ2F0aW9uIGZsYWcgcmVxdWVzdOKAmXMgaGlzdG9yeS1uYXZpZ2F0aW9uIGZsYWcuXG4gICAgICBoaXN0b3J5TmF2aWdhdGlvbjogcmVxdWVzdC5oaXN0b3J5TmF2aWdhdGlvbixcbiAgICAgIC8vIFVSTCBsaXN0IEEgY2xvbmUgb2YgcmVxdWVzdOKAmXMgVVJMIGxpc3QuXG4gICAgICB1cmxMaXN0OiBbLi4ucmVxdWVzdC51cmxMaXN0XVxuICAgIH0pXG5cbiAgICBjb25zdCBpbml0SGFzS2V5ID0gT2JqZWN0LmtleXMoaW5pdCkubGVuZ3RoICE9PSAwXG5cbiAgICAvLyAxMy4gSWYgaW5pdCBpcyBub3QgZW1wdHksIHRoZW46XG4gICAgaWYgKGluaXRIYXNLZXkpIHtcbiAgICAgIC8vIDEuIElmIHJlcXVlc3TigJlzIG1vZGUgaXMgXCJuYXZpZ2F0ZVwiLCB0aGVuIHNldCBpdCB0byBcInNhbWUtb3JpZ2luXCIuXG4gICAgICBpZiAocmVxdWVzdC5tb2RlID09PSAnbmF2aWdhdGUnKSB7XG4gICAgICAgIHJlcXVlc3QubW9kZSA9ICdzYW1lLW9yaWdpbidcbiAgICAgIH1cblxuICAgICAgLy8gMi4gVW5zZXQgcmVxdWVzdOKAmXMgcmVsb2FkLW5hdmlnYXRpb24gZmxhZy5cbiAgICAgIHJlcXVlc3QucmVsb2FkTmF2aWdhdGlvbiA9IGZhbHNlXG5cbiAgICAgIC8vIDMuIFVuc2V0IHJlcXVlc3TigJlzIGhpc3RvcnktbmF2aWdhdGlvbiBmbGFnLlxuICAgICAgcmVxdWVzdC5oaXN0b3J5TmF2aWdhdGlvbiA9IGZhbHNlXG5cbiAgICAgIC8vIDQuIFNldCByZXF1ZXN04oCZcyBvcmlnaW4gdG8gXCJjbGllbnRcIi5cbiAgICAgIHJlcXVlc3Qub3JpZ2luID0gJ2NsaWVudCdcblxuICAgICAgLy8gNS4gU2V0IHJlcXVlc3TigJlzIHJlZmVycmVyIHRvIFwiY2xpZW50XCJcbiAgICAgIHJlcXVlc3QucmVmZXJyZXIgPSAnY2xpZW50J1xuXG4gICAgICAvLyA2LiBTZXQgcmVxdWVzdOKAmXMgcmVmZXJyZXIgcG9saWN5IHRvIHRoZSBlbXB0eSBzdHJpbmcuXG4gICAgICByZXF1ZXN0LnJlZmVycmVyUG9saWN5ID0gJydcblxuICAgICAgLy8gNy4gU2V0IHJlcXVlc3TigJlzIFVSTCB0byByZXF1ZXN04oCZcyBjdXJyZW50IFVSTC5cbiAgICAgIHJlcXVlc3QudXJsID0gcmVxdWVzdC51cmxMaXN0W3JlcXVlc3QudXJsTGlzdC5sZW5ndGggLSAxXVxuXG4gICAgICAvLyA4LiBTZXQgcmVxdWVzdOKAmXMgVVJMIGxpc3QgdG8gwqsgcmVxdWVzdOKAmXMgVVJMIMK7LlxuICAgICAgcmVxdWVzdC51cmxMaXN0ID0gW3JlcXVlc3QudXJsXVxuICAgIH1cblxuICAgIC8vIDE0LiBJZiBpbml0W1wicmVmZXJyZXJcIl0gZXhpc3RzLCB0aGVuOlxuICAgIGlmIChpbml0LnJlZmVycmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIDEuIExldCByZWZlcnJlciBiZSBpbml0W1wicmVmZXJyZXJcIl0uXG4gICAgICBjb25zdCByZWZlcnJlciA9IGluaXQucmVmZXJyZXJcblxuICAgICAgLy8gMi4gSWYgcmVmZXJyZXIgaXMgdGhlIGVtcHR5IHN0cmluZywgdGhlbiBzZXQgcmVxdWVzdOKAmXMgcmVmZXJyZXIgdG8gXCJuby1yZWZlcnJlclwiLlxuICAgICAgaWYgKHJlZmVycmVyID09PSAnJykge1xuICAgICAgICByZXF1ZXN0LnJlZmVycmVyID0gJ25vLXJlZmVycmVyJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gMS4gTGV0IHBhcnNlZFJlZmVycmVyIGJlIHRoZSByZXN1bHQgb2YgcGFyc2luZyByZWZlcnJlciB3aXRoXG4gICAgICAgIC8vIGJhc2VVUkwuXG4gICAgICAgIC8vIDIuIElmIHBhcnNlZFJlZmVycmVyIGlzIGZhaWx1cmUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgICAgIGxldCBwYXJzZWRSZWZlcnJlclxuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhcnNlZFJlZmVycmVyID0gbmV3IFVSTChyZWZlcnJlciwgYmFzZVVybClcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgUmVmZXJyZXIgXCIke3JlZmVycmVyfVwiIGlzIG5vdCBhIHZhbGlkIFVSTC5gLCB7IGNhdXNlOiBlcnIgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDMuIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWVcbiAgICAgICAgLy8gLSBwYXJzZWRSZWZlcnJlcuKAmXMgc2NoZW1lIGlzIFwiYWJvdXRcIiBhbmQgcGF0aCBpcyB0aGUgc3RyaW5nIFwiY2xpZW50XCJcbiAgICAgICAgLy8gLSBwYXJzZWRSZWZlcnJlcuKAmXMgb3JpZ2luIGlzIG5vdCBzYW1lIG9yaWdpbiB3aXRoIG9yaWdpblxuICAgICAgICAvLyB0aGVuIHNldCByZXF1ZXN04oCZcyByZWZlcnJlciB0byBcImNsaWVudFwiLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgKHBhcnNlZFJlZmVycmVyLnByb3RvY29sID09PSAnYWJvdXQ6JyAmJiBwYXJzZWRSZWZlcnJlci5ob3N0bmFtZSA9PT0gJ2NsaWVudCcpIHx8XG4gICAgICAgICAgKG9yaWdpbiAmJiAhc2FtZU9yaWdpbihwYXJzZWRSZWZlcnJlciwgdGhpc1trUmVhbG1dLnNldHRpbmdzT2JqZWN0LmJhc2VVcmwpKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXF1ZXN0LnJlZmVycmVyID0gJ2NsaWVudCdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyA0LiBPdGhlcndpc2UsIHNldCByZXF1ZXN04oCZcyByZWZlcnJlciB0byBwYXJzZWRSZWZlcnJlci5cbiAgICAgICAgICByZXF1ZXN0LnJlZmVycmVyID0gcGFyc2VkUmVmZXJyZXJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDE1LiBJZiBpbml0W1wicmVmZXJyZXJQb2xpY3lcIl0gZXhpc3RzLCB0aGVuIHNldCByZXF1ZXN04oCZcyByZWZlcnJlciBwb2xpY3lcbiAgICAvLyB0byBpdC5cbiAgICBpZiAoaW5pdC5yZWZlcnJlclBvbGljeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXF1ZXN0LnJlZmVycmVyUG9saWN5ID0gaW5pdC5yZWZlcnJlclBvbGljeVxuICAgIH1cblxuICAgIC8vIDE2LiBMZXQgbW9kZSBiZSBpbml0W1wibW9kZVwiXSBpZiBpdCBleGlzdHMsIGFuZCBmYWxsYmFja01vZGUgb3RoZXJ3aXNlLlxuICAgIGxldCBtb2RlXG4gICAgaWYgKGluaXQubW9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb2RlID0gaW5pdC5tb2RlXG4gICAgfSBlbHNlIHtcbiAgICAgIG1vZGUgPSBmYWxsYmFja01vZGVcbiAgICB9XG5cbiAgICAvLyAxNy4gSWYgbW9kZSBpcyBcIm5hdmlnYXRlXCIsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKG1vZGUgPT09ICduYXZpZ2F0ZScpIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgaGVhZGVyOiAnUmVxdWVzdCBjb25zdHJ1Y3RvcicsXG4gICAgICAgIG1lc3NhZ2U6ICdpbnZhbGlkIHJlcXVlc3QgbW9kZSBuYXZpZ2F0ZS4nXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDE4LiBJZiBtb2RlIGlzIG5vbi1udWxsLCBzZXQgcmVxdWVzdOKAmXMgbW9kZSB0byBtb2RlLlxuICAgIGlmIChtb2RlICE9IG51bGwpIHtcbiAgICAgIHJlcXVlc3QubW9kZSA9IG1vZGVcbiAgICB9XG5cbiAgICAvLyAxOS4gSWYgaW5pdFtcImNyZWRlbnRpYWxzXCJdIGV4aXN0cywgdGhlbiBzZXQgcmVxdWVzdOKAmXMgY3JlZGVudGlhbHMgbW9kZVxuICAgIC8vIHRvIGl0LlxuICAgIGlmIChpbml0LmNyZWRlbnRpYWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlcXVlc3QuY3JlZGVudGlhbHMgPSBpbml0LmNyZWRlbnRpYWxzXG4gICAgfVxuXG4gICAgLy8gMTguIElmIGluaXRbXCJjYWNoZVwiXSBleGlzdHMsIHRoZW4gc2V0IHJlcXVlc3TigJlzIGNhY2hlIG1vZGUgdG8gaXQuXG4gICAgaWYgKGluaXQuY2FjaGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVxdWVzdC5jYWNoZSA9IGluaXQuY2FjaGVcbiAgICB9XG5cbiAgICAvLyAyMS4gSWYgcmVxdWVzdOKAmXMgY2FjaGUgbW9kZSBpcyBcIm9ubHktaWYtY2FjaGVkXCIgYW5kIHJlcXVlc3TigJlzIG1vZGUgaXNcbiAgICAvLyBub3QgXCJzYW1lLW9yaWdpblwiLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmIChyZXF1ZXN0LmNhY2hlID09PSAnb25seS1pZi1jYWNoZWQnICYmIHJlcXVlc3QubW9kZSAhPT0gJ3NhbWUtb3JpZ2luJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgXCInb25seS1pZi1jYWNoZWQnIGNhbiBiZSBzZXQgb25seSB3aXRoICdzYW1lLW9yaWdpbicgbW9kZVwiXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gMjIuIElmIGluaXRbXCJyZWRpcmVjdFwiXSBleGlzdHMsIHRoZW4gc2V0IHJlcXVlc3TigJlzIHJlZGlyZWN0IG1vZGUgdG8gaXQuXG4gICAgaWYgKGluaXQucmVkaXJlY3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVxdWVzdC5yZWRpcmVjdCA9IGluaXQucmVkaXJlY3RcbiAgICB9XG5cbiAgICAvLyAyMy4gSWYgaW5pdFtcImludGVncml0eVwiXSBleGlzdHMsIHRoZW4gc2V0IHJlcXVlc3TigJlzIGludGVncml0eSBtZXRhZGF0YSB0byBpdC5cbiAgICBpZiAoaW5pdC5pbnRlZ3JpdHkgIT0gbnVsbCkge1xuICAgICAgcmVxdWVzdC5pbnRlZ3JpdHkgPSBTdHJpbmcoaW5pdC5pbnRlZ3JpdHkpXG4gICAgfVxuXG4gICAgLy8gMjQuIElmIGluaXRbXCJrZWVwYWxpdmVcIl0gZXhpc3RzLCB0aGVuIHNldCByZXF1ZXN04oCZcyBrZWVwYWxpdmUgdG8gaXQuXG4gICAgaWYgKGluaXQua2VlcGFsaXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlcXVlc3Qua2VlcGFsaXZlID0gQm9vbGVhbihpbml0LmtlZXBhbGl2ZSlcbiAgICB9XG5cbiAgICAvLyAyNS4gSWYgaW5pdFtcIm1ldGhvZFwiXSBleGlzdHMsIHRoZW46XG4gICAgaWYgKGluaXQubWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIDEuIExldCBtZXRob2QgYmUgaW5pdFtcIm1ldGhvZFwiXS5cbiAgICAgIGxldCBtZXRob2QgPSBpbml0Lm1ldGhvZFxuXG4gICAgICAvLyAyLiBJZiBtZXRob2QgaXMgbm90IGEgbWV0aG9kIG9yIG1ldGhvZCBpcyBhIGZvcmJpZGRlbiBtZXRob2QsIHRoZW5cbiAgICAgIC8vIHRocm93IGEgVHlwZUVycm9yLlxuICAgICAgaWYgKCFpc1ZhbGlkSFRUUFRva2VuKG1ldGhvZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJyR7bWV0aG9kfScgaXMgbm90IGEgdmFsaWQgSFRUUCBtZXRob2QuYClcbiAgICAgIH1cblxuICAgICAgaWYgKGZvcmJpZGRlbk1ldGhvZHNTZXQuaGFzKG1ldGhvZC50b1VwcGVyQ2FzZSgpKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAnJHttZXRob2R9JyBIVFRQIG1ldGhvZCBpcyB1bnN1cHBvcnRlZC5gKVxuICAgICAgfVxuXG4gICAgICAvLyAzLiBOb3JtYWxpemUgbWV0aG9kLlxuICAgICAgbWV0aG9kID0gbm9ybWFsaXplTWV0aG9kUmVjb3JkW21ldGhvZF0gPz8gbm9ybWFsaXplTWV0aG9kKG1ldGhvZClcblxuICAgICAgLy8gNC4gU2V0IHJlcXVlc3TigJlzIG1ldGhvZCB0byBtZXRob2QuXG4gICAgICByZXF1ZXN0Lm1ldGhvZCA9IG1ldGhvZFxuICAgIH1cblxuICAgIC8vIDI2LiBJZiBpbml0W1wic2lnbmFsXCJdIGV4aXN0cywgdGhlbiBzZXQgc2lnbmFsIHRvIGl0LlxuICAgIGlmIChpbml0LnNpZ25hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzaWduYWwgPSBpbml0LnNpZ25hbFxuICAgIH1cblxuICAgIC8vIDI3LiBTZXQgdGhpc+KAmXMgcmVxdWVzdCB0byByZXF1ZXN0LlxuICAgIHRoaXNba1N0YXRlXSA9IHJlcXVlc3RcblxuICAgIC8vIDI4LiBTZXQgdGhpc+KAmXMgc2lnbmFsIHRvIGEgbmV3IEFib3J0U2lnbmFsIG9iamVjdCB3aXRoIHRoaXPigJlzIHJlbGV2YW50XG4gICAgLy8gUmVhbG0uXG4gICAgLy8gVE9ETzogY291bGQgdGhpcyBiZSBzaW1wbGlmaWVkIHdpdGggQWJvcnRTaWduYWwuYW55XG4gICAgLy8gKGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLWFib3J0c2lnbmFsLWFueSlcbiAgICBjb25zdCBhYyA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgIHRoaXNba1NpZ25hbF0gPSBhYy5zaWduYWxcbiAgICB0aGlzW2tTaWduYWxdW2tSZWFsbV0gPSB0aGlzW2tSZWFsbV1cblxuICAgIC8vIDI5LiBJZiBzaWduYWwgaXMgbm90IG51bGwsIHRoZW4gbWFrZSB0aGlz4oCZcyBzaWduYWwgZm9sbG93IHNpZ25hbC5cbiAgICBpZiAoc2lnbmFsICE9IG51bGwpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIXNpZ25hbCB8fFxuICAgICAgICB0eXBlb2Ygc2lnbmFsLmFib3J0ZWQgIT09ICdib29sZWFuJyB8fFxuICAgICAgICB0eXBlb2Ygc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIgIT09ICdmdW5jdGlvbidcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIFwiRmFpbGVkIHRvIGNvbnN0cnVjdCAnUmVxdWVzdCc6IG1lbWJlciBzaWduYWwgaXMgbm90IG9mIHR5cGUgQWJvcnRTaWduYWwuXCJcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgYWMuYWJvcnQoc2lnbmFsLnJlYXNvbilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEtlZXAgYSBzdHJvbmcgcmVmIHRvIGFjIHdoaWxlIHJlcXVlc3Qgb2JqZWN0XG4gICAgICAgIC8vIGlzIGFsaXZlLiBUaGlzIGlzIG5lZWRlZCB0byBwcmV2ZW50IEFib3J0Q29udHJvbGxlclxuICAgICAgICAvLyBmcm9tIGJlaW5nIHByZW1hdHVyZWx5IGdhcmJhZ2UgY29sbGVjdGVkLlxuICAgICAgICAvLyBTZWUsIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2lzc3Vlcy8xOTI2LlxuICAgICAgICB0aGlzW2tBYm9ydENvbnRyb2xsZXJdID0gYWNcblxuICAgICAgICBjb25zdCBhY1JlZiA9IG5ldyBXZWFrUmVmKGFjKVxuICAgICAgICBjb25zdCBhYm9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCBhYyA9IGFjUmVmLmRlcmVmKClcbiAgICAgICAgICBpZiAoYWMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYWMuYWJvcnQodGhpcy5yZWFzb24pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhpcmQtcGFydHkgQWJvcnRDb250cm9sbGVycyBtYXkgbm90IHdvcmsgd2l0aCB0aGVzZS5cbiAgICAgICAgLy8gU2VlLCBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9wdWxsLzE5MTAjaXNzdWVjb21tZW50LTE0NjQ0OTU2MTkuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gSWYgdGhlIG1heCBhbW91bnQgb2YgbGlzdGVuZXJzIGlzIGVxdWFsIHRvIHRoZSBkZWZhdWx0LCBpbmNyZWFzZSBpdFxuICAgICAgICAgIC8vIFRoaXMgaXMgb25seSBhdmFpbGFibGUgaW4gbm9kZSA+PSB2MTkuOS4wXG4gICAgICAgICAgaWYgKHR5cGVvZiBnZXRNYXhMaXN0ZW5lcnMgPT09ICdmdW5jdGlvbicgJiYgZ2V0TWF4TGlzdGVuZXJzKHNpZ25hbCkgPT09IGRlZmF1bHRNYXhMaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIHNldE1heExpc3RlbmVycygxMDAsIHNpZ25hbClcbiAgICAgICAgICB9IGVsc2UgaWYgKGdldEV2ZW50TGlzdGVuZXJzKHNpZ25hbCwgJ2Fib3J0JykubGVuZ3RoID49IGRlZmF1bHRNYXhMaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIHNldE1heExpc3RlbmVycygxMDAsIHNpZ25hbClcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge31cblxuICAgICAgICB1dGlsLmFkZEFib3J0TGlzdGVuZXIoc2lnbmFsLCBhYm9ydClcbiAgICAgICAgcmVxdWVzdEZpbmFsaXplci5yZWdpc3RlcihhYywgeyBzaWduYWwsIGFib3J0IH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMzAuIFNldCB0aGlz4oCZcyBoZWFkZXJzIHRvIGEgbmV3IEhlYWRlcnMgb2JqZWN0IHdpdGggdGhpc+KAmXMgcmVsZXZhbnRcbiAgICAvLyBSZWFsbSwgd2hvc2UgaGVhZGVyIGxpc3QgaXMgcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgYW5kIGd1YXJkIGlzXG4gICAgLy8gXCJyZXF1ZXN0XCIuXG4gICAgdGhpc1trSGVhZGVyc10gPSBuZXcgSGVhZGVycyhrQ29uc3RydWN0KVxuICAgIHRoaXNba0hlYWRlcnNdW2tIZWFkZXJzTGlzdF0gPSByZXF1ZXN0LmhlYWRlcnNMaXN0XG4gICAgdGhpc1trSGVhZGVyc11ba0d1YXJkXSA9ICdyZXF1ZXN0J1xuICAgIHRoaXNba0hlYWRlcnNdW2tSZWFsbV0gPSB0aGlzW2tSZWFsbV1cblxuICAgIC8vIDMxLiBJZiB0aGlz4oCZcyByZXF1ZXN04oCZcyBtb2RlIGlzIFwibm8tY29yc1wiLCB0aGVuOlxuICAgIGlmIChtb2RlID09PSAnbm8tY29ycycpIHtcbiAgICAgIC8vIDEuIElmIHRoaXPigJlzIHJlcXVlc3TigJlzIG1ldGhvZCBpcyBub3QgYSBDT1JTLXNhZmVsaXN0ZWQgbWV0aG9kLFxuICAgICAgLy8gdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgIGlmICghY29yc1NhZmVMaXN0ZWRNZXRob2RzU2V0LmhhcyhyZXF1ZXN0Lm1ldGhvZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBgJyR7cmVxdWVzdC5tZXRob2R9IGlzIHVuc3VwcG9ydGVkIGluIG5vLWNvcnMgbW9kZS5gXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gMi4gU2V0IHRoaXPigJlzIGhlYWRlcnPigJlzIGd1YXJkIHRvIFwicmVxdWVzdC1uby1jb3JzXCIuXG4gICAgICB0aGlzW2tIZWFkZXJzXVtrR3VhcmRdID0gJ3JlcXVlc3Qtbm8tY29ycydcbiAgICB9XG5cbiAgICAvLyAzMi4gSWYgaW5pdCBpcyBub3QgZW1wdHksIHRoZW46XG4gICAgaWYgKGluaXRIYXNLZXkpIHtcbiAgICAgIC8qKiBAdHlwZSB7SGVhZGVyc0xpc3R9ICovXG4gICAgICBjb25zdCBoZWFkZXJzTGlzdCA9IHRoaXNba0hlYWRlcnNdW2tIZWFkZXJzTGlzdF1cbiAgICAgIC8vIDEuIExldCBoZWFkZXJzIGJlIGEgY29weSBvZiB0aGlz4oCZcyBoZWFkZXJzIGFuZCBpdHMgYXNzb2NpYXRlZCBoZWFkZXJcbiAgICAgIC8vIGxpc3QuXG4gICAgICAvLyAyLiBJZiBpbml0W1wiaGVhZGVyc1wiXSBleGlzdHMsIHRoZW4gc2V0IGhlYWRlcnMgdG8gaW5pdFtcImhlYWRlcnNcIl0uXG4gICAgICBjb25zdCBoZWFkZXJzID0gaW5pdC5oZWFkZXJzICE9PSB1bmRlZmluZWQgPyBpbml0LmhlYWRlcnMgOiBuZXcgSGVhZGVyc0xpc3QoaGVhZGVyc0xpc3QpXG5cbiAgICAgIC8vIDMuIEVtcHR5IHRoaXPigJlzIGhlYWRlcnPigJlzIGhlYWRlciBsaXN0LlxuICAgICAgaGVhZGVyc0xpc3QuY2xlYXIoKVxuXG4gICAgICAvLyA0LiBJZiBoZWFkZXJzIGlzIGEgSGVhZGVycyBvYmplY3QsIHRoZW4gZm9yIGVhY2ggaGVhZGVyIGluIGl0cyBoZWFkZXJcbiAgICAgIC8vIGxpc3QsIGFwcGVuZCBoZWFkZXLigJlzIG5hbWUvaGVhZGVy4oCZcyB2YWx1ZSB0byB0aGlz4oCZcyBoZWFkZXJzLlxuICAgICAgaWYgKGhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzTGlzdCkge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgaGVhZGVycykge1xuICAgICAgICAgIGhlYWRlcnNMaXN0LmFwcGVuZChrZXksIHZhbClcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3RlOiBDb3B5IHRoZSBgc2V0LWNvb2tpZWAgbWV0YS1kYXRhLlxuICAgICAgICBoZWFkZXJzTGlzdC5jb29raWVzID0gaGVhZGVycy5jb29raWVzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyA1LiBPdGhlcndpc2UsIGZpbGwgdGhpc+KAmXMgaGVhZGVycyB3aXRoIGhlYWRlcnMuXG4gICAgICAgIGZpbGxIZWFkZXJzKHRoaXNba0hlYWRlcnNdLCBoZWFkZXJzKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDMzLiBMZXQgaW5wdXRCb2R5IGJlIGlucHV04oCZcyByZXF1ZXN04oCZcyBib2R5IGlmIGlucHV0IGlzIGEgUmVxdWVzdFxuICAgIC8vIG9iamVjdDsgb3RoZXJ3aXNlIG51bGwuXG4gICAgY29uc3QgaW5wdXRCb2R5ID0gaW5wdXQgaW5zdGFuY2VvZiBSZXF1ZXN0ID8gaW5wdXRba1N0YXRlXS5ib2R5IDogbnVsbFxuXG4gICAgLy8gMzQuIElmIGVpdGhlciBpbml0W1wiYm9keVwiXSBleGlzdHMgYW5kIGlzIG5vbi1udWxsIG9yIGlucHV0Qm9keSBpc1xuICAgIC8vIG5vbi1udWxsLCBhbmQgcmVxdWVzdOKAmXMgbWV0aG9kIGlzIGBHRVRgIG9yIGBIRUFEYCwgdGhlbiB0aHJvdyBhXG4gICAgLy8gVHlwZUVycm9yLlxuICAgIGlmIChcbiAgICAgIChpbml0LmJvZHkgIT0gbnVsbCB8fCBpbnB1dEJvZHkgIT0gbnVsbCkgJiZcbiAgICAgIChyZXF1ZXN0Lm1ldGhvZCA9PT0gJ0dFVCcgfHwgcmVxdWVzdC5tZXRob2QgPT09ICdIRUFEJylcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlcXVlc3Qgd2l0aCBHRVQvSEVBRCBtZXRob2QgY2Fubm90IGhhdmUgYm9keS4nKVxuICAgIH1cblxuICAgIC8vIDM1LiBMZXQgaW5pdEJvZHkgYmUgbnVsbC5cbiAgICBsZXQgaW5pdEJvZHkgPSBudWxsXG5cbiAgICAvLyAzNi4gSWYgaW5pdFtcImJvZHlcIl0gZXhpc3RzIGFuZCBpcyBub24tbnVsbCwgdGhlbjpcbiAgICBpZiAoaW5pdC5ib2R5ICE9IG51bGwpIHtcbiAgICAgIC8vIDEuIExldCBDb250ZW50LVR5cGUgYmUgbnVsbC5cbiAgICAgIC8vIDIuIFNldCBpbml0Qm9keSBhbmQgQ29udGVudC1UeXBlIHRvIHRoZSByZXN1bHQgb2YgZXh0cmFjdGluZ1xuICAgICAgLy8gaW5pdFtcImJvZHlcIl0sIHdpdGgga2VlcGFsaXZlIHNldCB0byByZXF1ZXN04oCZcyBrZWVwYWxpdmUuXG4gICAgICBjb25zdCBbZXh0cmFjdGVkQm9keSwgY29udGVudFR5cGVdID0gZXh0cmFjdEJvZHkoXG4gICAgICAgIGluaXQuYm9keSxcbiAgICAgICAgcmVxdWVzdC5rZWVwYWxpdmVcbiAgICAgIClcbiAgICAgIGluaXRCb2R5ID0gZXh0cmFjdGVkQm9keVxuXG4gICAgICAvLyAzLCBJZiBDb250ZW50LVR5cGUgaXMgbm9uLW51bGwgYW5kIHRoaXPigJlzIGhlYWRlcnPigJlzIGhlYWRlciBsaXN0IGRvZXNcbiAgICAgIC8vIG5vdCBjb250YWluIGBDb250ZW50LVR5cGVgLCB0aGVuIGFwcGVuZCBgQ29udGVudC1UeXBlYC9Db250ZW50LVR5cGUgdG9cbiAgICAgIC8vIHRoaXPigJlzIGhlYWRlcnMuXG4gICAgICBpZiAoY29udGVudFR5cGUgJiYgIXRoaXNba0hlYWRlcnNdW2tIZWFkZXJzTGlzdF0uY29udGFpbnMoJ2NvbnRlbnQtdHlwZScpKSB7XG4gICAgICAgIHRoaXNba0hlYWRlcnNdLmFwcGVuZCgnY29udGVudC10eXBlJywgY29udGVudFR5cGUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMzcuIExldCBpbnB1dE9ySW5pdEJvZHkgYmUgaW5pdEJvZHkgaWYgaXQgaXMgbm9uLW51bGw7IG90aGVyd2lzZVxuICAgIC8vIGlucHV0Qm9keS5cbiAgICBjb25zdCBpbnB1dE9ySW5pdEJvZHkgPSBpbml0Qm9keSA/PyBpbnB1dEJvZHlcblxuICAgIC8vIDM4LiBJZiBpbnB1dE9ySW5pdEJvZHkgaXMgbm9uLW51bGwgYW5kIGlucHV0T3JJbml0Qm9keeKAmXMgc291cmNlIGlzXG4gICAgLy8gbnVsbCwgdGhlbjpcbiAgICBpZiAoaW5wdXRPckluaXRCb2R5ICE9IG51bGwgJiYgaW5wdXRPckluaXRCb2R5LnNvdXJjZSA9PSBudWxsKSB7XG4gICAgICAvLyAxLiBJZiBpbml0Qm9keSBpcyBub24tbnVsbCBhbmQgaW5pdFtcImR1cGxleFwiXSBkb2VzIG5vdCBleGlzdCxcbiAgICAgIC8vICAgIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgICBpZiAoaW5pdEJvZHkgIT0gbnVsbCAmJiBpbml0LmR1cGxleCA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlcXVlc3RJbml0OiBkdXBsZXggb3B0aW9uIGlzIHJlcXVpcmVkIHdoZW4gc2VuZGluZyBhIGJvZHkuJylcbiAgICAgIH1cblxuICAgICAgLy8gMi4gSWYgdGhpc+KAmXMgcmVxdWVzdOKAmXMgbW9kZSBpcyBuZWl0aGVyIFwic2FtZS1vcmlnaW5cIiBub3IgXCJjb3JzXCIsXG4gICAgICAvLyB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgICAgaWYgKHJlcXVlc3QubW9kZSAhPT0gJ3NhbWUtb3JpZ2luJyAmJiByZXF1ZXN0Lm1vZGUgIT09ICdjb3JzJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICdJZiByZXF1ZXN0IGlzIG1hZGUgZnJvbSBSZWFkYWJsZVN0cmVhbSwgbW9kZSBzaG91bGQgYmUgXCJzYW1lLW9yaWdpblwiIG9yIFwiY29yc1wiJ1xuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIFNldCB0aGlz4oCZcyByZXF1ZXN04oCZcyB1c2UtQ09SUy1wcmVmbGlnaHQgZmxhZy5cbiAgICAgIHJlcXVlc3QudXNlQ09SU1ByZWZsaWdodEZsYWcgPSB0cnVlXG4gICAgfVxuXG4gICAgLy8gMzkuIExldCBmaW5hbEJvZHkgYmUgaW5wdXRPckluaXRCb2R5LlxuICAgIGxldCBmaW5hbEJvZHkgPSBpbnB1dE9ySW5pdEJvZHlcblxuICAgIC8vIDQwLiBJZiBpbml0Qm9keSBpcyBudWxsIGFuZCBpbnB1dEJvZHkgaXMgbm9uLW51bGwsIHRoZW46XG4gICAgaWYgKGluaXRCb2R5ID09IG51bGwgJiYgaW5wdXRCb2R5ICE9IG51bGwpIHtcbiAgICAgIC8vIDEuIElmIGlucHV0IGlzIHVudXNhYmxlLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgICAgaWYgKHV0aWwuaXNEaXN0dXJiZWQoaW5wdXRCb2R5LnN0cmVhbSkgfHwgaW5wdXRCb2R5LnN0cmVhbS5sb2NrZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAnQ2Fubm90IGNvbnN0cnVjdCBhIFJlcXVlc3Qgd2l0aCBhIFJlcXVlc3Qgb2JqZWN0IHRoYXQgaGFzIGFscmVhZHkgYmVlbiB1c2VkLidcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyAyLiBTZXQgZmluYWxCb2R5IHRvIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYSBwcm94eSBmb3IgaW5wdXRCb2R5LlxuICAgICAgaWYgKCFUcmFuc2Zvcm1TdHJlYW0pIHtcbiAgICAgICAgVHJhbnNmb3JtU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtL3dlYicpLlRyYW5zZm9ybVN0cmVhbVxuICAgICAgfVxuXG4gICAgICAvLyBodHRwczovL3N0cmVhbXMuc3BlYy53aGF0d2cub3JnLyNyZWFkYWJsZXN0cmVhbS1jcmVhdGUtYS1wcm94eVxuICAgICAgY29uc3QgaWRlbnRpdHlUcmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtU3RyZWFtKClcbiAgICAgIGlucHV0Qm9keS5zdHJlYW0ucGlwZVRocm91Z2goaWRlbnRpdHlUcmFuc2Zvcm0pXG4gICAgICBmaW5hbEJvZHkgPSB7XG4gICAgICAgIHNvdXJjZTogaW5wdXRCb2R5LnNvdXJjZSxcbiAgICAgICAgbGVuZ3RoOiBpbnB1dEJvZHkubGVuZ3RoLFxuICAgICAgICBzdHJlYW06IGlkZW50aXR5VHJhbnNmb3JtLnJlYWRhYmxlXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNDEuIFNldCB0aGlz4oCZcyByZXF1ZXN04oCZcyBib2R5IHRvIGZpbmFsQm9keS5cbiAgICB0aGlzW2tTdGF0ZV0uYm9keSA9IGZpbmFsQm9keVxuICB9XG5cbiAgLy8gUmV0dXJucyByZXF1ZXN04oCZcyBIVFRQIG1ldGhvZCwgd2hpY2ggaXMgXCJHRVRcIiBieSBkZWZhdWx0LlxuICBnZXQgbWV0aG9kICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIG1ldGhvZCBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlz4oCZcyByZXF1ZXN04oCZcyBtZXRob2QuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5tZXRob2RcbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIFVSTCBvZiByZXF1ZXN0IGFzIGEgc3RyaW5nLlxuICBnZXQgdXJsICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIHVybCBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlz4oCZcyByZXF1ZXN04oCZcyBVUkwsIHNlcmlhbGl6ZWQuXG4gICAgcmV0dXJuIFVSTFNlcmlhbGl6ZXIodGhpc1trU3RhdGVdLnVybClcbiAgfVxuXG4gIC8vIFJldHVybnMgYSBIZWFkZXJzIG9iamVjdCBjb25zaXN0aW5nIG9mIHRoZSBoZWFkZXJzIGFzc29jaWF0ZWQgd2l0aCByZXF1ZXN0LlxuICAvLyBOb3RlIHRoYXQgaGVhZGVycyBhZGRlZCBpbiB0aGUgbmV0d29yayBsYXllciBieSB0aGUgdXNlciBhZ2VudCB3aWxsIG5vdFxuICAvLyBiZSBhY2NvdW50ZWQgZm9yIGluIHRoaXMgb2JqZWN0LCBlLmcuLCB0aGUgXCJIb3N0XCIgaGVhZGVyLlxuICBnZXQgaGVhZGVycyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIC8vIFRoZSBoZWFkZXJzIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIGhlYWRlcnMuXG4gICAgcmV0dXJuIHRoaXNba0hlYWRlcnNdXG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSBraW5kIG9mIHJlc291cmNlIHJlcXVlc3RlZCBieSByZXF1ZXN0LCBlLmcuLCBcImRvY3VtZW50XCJcbiAgLy8gb3IgXCJzY3JpcHRcIi5cbiAgZ2V0IGRlc3RpbmF0aW9uICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIGRlc3RpbmF0aW9uIGdldHRlciBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHJlcXVlc3TigJlzIGRlc3RpbmF0aW9uLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uZGVzdGluYXRpb25cbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIHJlZmVycmVyIG9mIHJlcXVlc3QuIEl0cyB2YWx1ZSBjYW4gYmUgYSBzYW1lLW9yaWdpbiBVUkwgaWZcbiAgLy8gZXhwbGljaXRseSBzZXQgaW4gaW5pdCwgdGhlIGVtcHR5IHN0cmluZyB0byBpbmRpY2F0ZSBubyByZWZlcnJlciwgYW5kXG4gIC8vIFwiYWJvdXQ6Y2xpZW50XCIgd2hlbiBkZWZhdWx0aW5nIHRvIHRoZSBnbG9iYWzigJlzIGRlZmF1bHQuIFRoaXMgaXMgdXNlZFxuICAvLyBkdXJpbmcgZmV0Y2hpbmcgdG8gZGV0ZXJtaW5lIHRoZSB2YWx1ZSBvZiB0aGUgYFJlZmVyZXJgIGhlYWRlciBvZiB0aGVcbiAgLy8gcmVxdWVzdCBiZWluZyBtYWRlLlxuICBnZXQgcmVmZXJyZXIgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyAxLiBJZiB0aGlz4oCZcyByZXF1ZXN04oCZcyByZWZlcnJlciBpcyBcIm5vLXJlZmVycmVyXCIsIHRoZW4gcmV0dXJuIHRoZVxuICAgIC8vIGVtcHR5IHN0cmluZy5cbiAgICBpZiAodGhpc1trU3RhdGVdLnJlZmVycmVyID09PSAnbm8tcmVmZXJyZXInKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG5cbiAgICAvLyAyLiBJZiB0aGlz4oCZcyByZXF1ZXN04oCZcyByZWZlcnJlciBpcyBcImNsaWVudFwiLCB0aGVuIHJldHVyblxuICAgIC8vIFwiYWJvdXQ6Y2xpZW50XCIuXG4gICAgaWYgKHRoaXNba1N0YXRlXS5yZWZlcnJlciA9PT0gJ2NsaWVudCcpIHtcbiAgICAgIHJldHVybiAnYWJvdXQ6Y2xpZW50J1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGlz4oCZcyByZXF1ZXN04oCZcyByZWZlcnJlciwgc2VyaWFsaXplZC5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLnJlZmVycmVyLnRvU3RyaW5nKClcbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIHJlZmVycmVyIHBvbGljeSBhc3NvY2lhdGVkIHdpdGggcmVxdWVzdC5cbiAgLy8gVGhpcyBpcyB1c2VkIGR1cmluZyBmZXRjaGluZyB0byBjb21wdXRlIHRoZSB2YWx1ZSBvZiB0aGUgcmVxdWVzdOKAmXNcbiAgLy8gcmVmZXJyZXIuXG4gIGdldCByZWZlcnJlclBvbGljeSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIC8vIFRoZSByZWZlcnJlclBvbGljeSBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlz4oCZcyByZXF1ZXN04oCZcyByZWZlcnJlciBwb2xpY3kuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5yZWZlcnJlclBvbGljeVxuICB9XG5cbiAgLy8gUmV0dXJucyB0aGUgbW9kZSBhc3NvY2lhdGVkIHdpdGggcmVxdWVzdCwgd2hpY2ggaXMgYSBzdHJpbmcgaW5kaWNhdGluZ1xuICAvLyB3aGV0aGVyIHRoZSByZXF1ZXN0IHdpbGwgdXNlIENPUlMsIG9yIHdpbGwgYmUgcmVzdHJpY3RlZCB0byBzYW1lLW9yaWdpblxuICAvLyBVUkxzLlxuICBnZXQgbW9kZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIC8vIFRoZSBtb2RlIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHJlcXVlc3TigJlzIG1vZGUuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5tb2RlXG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSBjcmVkZW50aWFscyBtb2RlIGFzc29jaWF0ZWQgd2l0aCByZXF1ZXN0LFxuICAvLyB3aGljaCBpcyBhIHN0cmluZyBpbmRpY2F0aW5nIHdoZXRoZXIgY3JlZGVudGlhbHMgd2lsbCBiZSBzZW50IHdpdGggdGhlXG4gIC8vIHJlcXVlc3QgYWx3YXlzLCBuZXZlciwgb3Igb25seSB3aGVuIHNlbnQgdG8gYSBzYW1lLW9yaWdpbiBVUkwuXG4gIGdldCBjcmVkZW50aWFscyAoKSB7XG4gICAgLy8gVGhlIGNyZWRlbnRpYWxzIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHJlcXVlc3TigJlzIGNyZWRlbnRpYWxzIG1vZGUuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5jcmVkZW50aWFsc1xuICB9XG5cbiAgLy8gUmV0dXJucyB0aGUgY2FjaGUgbW9kZSBhc3NvY2lhdGVkIHdpdGggcmVxdWVzdCxcbiAgLy8gd2hpY2ggaXMgYSBzdHJpbmcgaW5kaWNhdGluZyBob3cgdGhlIHJlcXVlc3Qgd2lsbFxuICAvLyBpbnRlcmFjdCB3aXRoIHRoZSBicm93c2Vy4oCZcyBjYWNoZSB3aGVuIGZldGNoaW5nLlxuICBnZXQgY2FjaGUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUgY2FjaGUgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVxdWVzdOKAmXMgY2FjaGUgbW9kZS5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmNhY2hlXG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSByZWRpcmVjdCBtb2RlIGFzc29jaWF0ZWQgd2l0aCByZXF1ZXN0LFxuICAvLyB3aGljaCBpcyBhIHN0cmluZyBpbmRpY2F0aW5nIGhvdyByZWRpcmVjdHMgZm9yIHRoZVxuICAvLyByZXF1ZXN0IHdpbGwgYmUgaGFuZGxlZCBkdXJpbmcgZmV0Y2hpbmcuIEEgcmVxdWVzdFxuICAvLyB3aWxsIGZvbGxvdyByZWRpcmVjdHMgYnkgZGVmYXVsdC5cbiAgZ2V0IHJlZGlyZWN0ICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIHJlZGlyZWN0IGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHJlcXVlc3TigJlzIHJlZGlyZWN0IG1vZGUuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5yZWRpcmVjdFxuICB9XG5cbiAgLy8gUmV0dXJucyByZXF1ZXN04oCZcyBzdWJyZXNvdXJjZSBpbnRlZ3JpdHkgbWV0YWRhdGEsIHdoaWNoIGlzIGFcbiAgLy8gY3J5cHRvZ3JhcGhpYyBoYXNoIG9mIHRoZSByZXNvdXJjZSBiZWluZyBmZXRjaGVkLiBJdHMgdmFsdWVcbiAgLy8gY29uc2lzdHMgb2YgbXVsdGlwbGUgaGFzaGVzIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLiBbU1JJXVxuICBnZXQgaW50ZWdyaXR5ICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIGludGVncml0eSBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlz4oCZcyByZXF1ZXN04oCZcyBpbnRlZ3JpdHlcbiAgICAvLyBtZXRhZGF0YS5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmludGVncml0eVxuICB9XG5cbiAgLy8gUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCByZXF1ZXN0IGNhbiBvdXRsaXZlIHRoZVxuICAvLyBnbG9iYWwgaW4gd2hpY2ggaXQgd2FzIGNyZWF0ZWQuXG4gIGdldCBrZWVwYWxpdmUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUga2VlcGFsaXZlIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHJlcXVlc3TigJlzIGtlZXBhbGl2ZS5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmtlZXBhbGl2ZVxuICB9XG5cbiAgLy8gUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCByZXF1ZXN0IGlzIGZvciBhIHJlbG9hZFxuICAvLyBuYXZpZ2F0aW9uLlxuICBnZXQgaXNSZWxvYWROYXZpZ2F0aW9uICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIGlzUmVsb2FkTmF2aWdhdGlvbiBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0cnVlIGlmIHRoaXPigJlzXG4gICAgLy8gcmVxdWVzdOKAmXMgcmVsb2FkLW5hdmlnYXRpb24gZmxhZyBpcyBzZXQ7IG90aGVyd2lzZSBmYWxzZS5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLnJlbG9hZE5hdmlnYXRpb25cbiAgfVxuXG4gIC8vIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgcmVxdWVzdCBpcyBmb3IgYSBoaXN0b3J5XG4gIC8vIG5hdmlnYXRpb24gKGEuay5hLiBiYWNrLWZvd2FyZCBuYXZpZ2F0aW9uKS5cbiAgZ2V0IGlzSGlzdG9yeU5hdmlnYXRpb24gKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUgaXNIaXN0b3J5TmF2aWdhdGlvbiBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0cnVlIGlmIHRoaXPigJlzIHJlcXVlc3TigJlzXG4gICAgLy8gaGlzdG9yeS1uYXZpZ2F0aW9uIGZsYWcgaXMgc2V0OyBvdGhlcndpc2UgZmFsc2UuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5oaXN0b3J5TmF2aWdhdGlvblxuICB9XG5cbiAgLy8gUmV0dXJucyB0aGUgc2lnbmFsIGFzc29jaWF0ZWQgd2l0aCByZXF1ZXN0LCB3aGljaCBpcyBhbiBBYm9ydFNpZ25hbFxuICAvLyBvYmplY3QgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCByZXF1ZXN0IGhhcyBiZWVuIGFib3J0ZWQsIGFuZCBpdHNcbiAgLy8gYWJvcnQgZXZlbnQgaGFuZGxlci5cbiAgZ2V0IHNpZ25hbCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIC8vIFRoZSBzaWduYWwgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgc2lnbmFsLlxuICAgIHJldHVybiB0aGlzW2tTaWduYWxdXG4gIH1cblxuICBnZXQgYm9keSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uYm9keSA/IHRoaXNba1N0YXRlXS5ib2R5LnN0cmVhbSA6IG51bGxcbiAgfVxuXG4gIGdldCBib2R5VXNlZCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIHJldHVybiAhIXRoaXNba1N0YXRlXS5ib2R5ICYmIHV0aWwuaXNEaXN0dXJiZWQodGhpc1trU3RhdGVdLmJvZHkuc3RyZWFtKVxuICB9XG5cbiAgZ2V0IGR1cGxleCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIHJldHVybiAnaGFsZidcbiAgfVxuXG4gIC8vIFJldHVybnMgYSBjbG9uZSBvZiByZXF1ZXN0LlxuICBjbG9uZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIC8vIDEuIElmIHRoaXMgaXMgdW51c2FibGUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKHRoaXMuYm9keVVzZWQgfHwgdGhpcy5ib2R5Py5sb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3VudXNhYmxlJylcbiAgICB9XG5cbiAgICAvLyAyLiBMZXQgY2xvbmVkUmVxdWVzdCBiZSB0aGUgcmVzdWx0IG9mIGNsb25pbmcgdGhpc+KAmXMgcmVxdWVzdC5cbiAgICBjb25zdCBjbG9uZWRSZXF1ZXN0ID0gY2xvbmVSZXF1ZXN0KHRoaXNba1N0YXRlXSlcblxuICAgIC8vIDMuIExldCBjbG9uZWRSZXF1ZXN0T2JqZWN0IGJlIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYSBSZXF1ZXN0IG9iamVjdCxcbiAgICAvLyBnaXZlbiBjbG9uZWRSZXF1ZXN0LCB0aGlz4oCZcyBoZWFkZXJz4oCZcyBndWFyZCwgYW5kIHRoaXPigJlzIHJlbGV2YW50IFJlYWxtLlxuICAgIGNvbnN0IGNsb25lZFJlcXVlc3RPYmplY3QgPSBuZXcgUmVxdWVzdChrQ29uc3RydWN0KVxuICAgIGNsb25lZFJlcXVlc3RPYmplY3Rba1N0YXRlXSA9IGNsb25lZFJlcXVlc3RcbiAgICBjbG9uZWRSZXF1ZXN0T2JqZWN0W2tSZWFsbV0gPSB0aGlzW2tSZWFsbV1cbiAgICBjbG9uZWRSZXF1ZXN0T2JqZWN0W2tIZWFkZXJzXSA9IG5ldyBIZWFkZXJzKGtDb25zdHJ1Y3QpXG4gICAgY2xvbmVkUmVxdWVzdE9iamVjdFtrSGVhZGVyc11ba0hlYWRlcnNMaXN0XSA9IGNsb25lZFJlcXVlc3QuaGVhZGVyc0xpc3RcbiAgICBjbG9uZWRSZXF1ZXN0T2JqZWN0W2tIZWFkZXJzXVtrR3VhcmRdID0gdGhpc1trSGVhZGVyc11ba0d1YXJkXVxuICAgIGNsb25lZFJlcXVlc3RPYmplY3Rba0hlYWRlcnNdW2tSZWFsbV0gPSB0aGlzW2tIZWFkZXJzXVtrUmVhbG1dXG5cbiAgICAvLyA0LiBNYWtlIGNsb25lZFJlcXVlc3RPYmplY3TigJlzIHNpZ25hbCBmb2xsb3cgdGhpc+KAmXMgc2lnbmFsLlxuICAgIGNvbnN0IGFjID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgaWYgKHRoaXMuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIGFjLmFib3J0KHRoaXMuc2lnbmFsLnJlYXNvbilcbiAgICB9IGVsc2Uge1xuICAgICAgdXRpbC5hZGRBYm9ydExpc3RlbmVyKFxuICAgICAgICB0aGlzLnNpZ25hbCxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIGFjLmFib3J0KHRoaXMuc2lnbmFsLnJlYXNvbilcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cbiAgICBjbG9uZWRSZXF1ZXN0T2JqZWN0W2tTaWduYWxdID0gYWMuc2lnbmFsXG5cbiAgICAvLyA0LiBSZXR1cm4gY2xvbmVkUmVxdWVzdE9iamVjdC5cbiAgICByZXR1cm4gY2xvbmVkUmVxdWVzdE9iamVjdFxuICB9XG59XG5cbm1peGluQm9keShSZXF1ZXN0KVxuXG5mdW5jdGlvbiBtYWtlUmVxdWVzdCAoaW5pdCkge1xuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jcmVxdWVzdHNcbiAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICBtZXRob2Q6ICdHRVQnLFxuICAgIGxvY2FsVVJMc09ubHk6IGZhbHNlLFxuICAgIHVuc2FmZVJlcXVlc3Q6IGZhbHNlLFxuICAgIGJvZHk6IG51bGwsXG4gICAgY2xpZW50OiBudWxsLFxuICAgIHJlc2VydmVkQ2xpZW50OiBudWxsLFxuICAgIHJlcGxhY2VzQ2xpZW50SWQ6ICcnLFxuICAgIHdpbmRvdzogJ2NsaWVudCcsXG4gICAga2VlcGFsaXZlOiBmYWxzZSxcbiAgICBzZXJ2aWNlV29ya2VyczogJ2FsbCcsXG4gICAgaW5pdGlhdG9yOiAnJyxcbiAgICBkZXN0aW5hdGlvbjogJycsXG4gICAgcHJpb3JpdHk6IG51bGwsXG4gICAgb3JpZ2luOiAnY2xpZW50JyxcbiAgICBwb2xpY3lDb250YWluZXI6ICdjbGllbnQnLFxuICAgIHJlZmVycmVyOiAnY2xpZW50JyxcbiAgICByZWZlcnJlclBvbGljeTogJycsXG4gICAgbW9kZTogJ25vLWNvcnMnLFxuICAgIHVzZUNPUlNQcmVmbGlnaHRGbGFnOiBmYWxzZSxcbiAgICBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJyxcbiAgICB1c2VDcmVkZW50aWFsczogZmFsc2UsXG4gICAgY2FjaGU6ICdkZWZhdWx0JyxcbiAgICByZWRpcmVjdDogJ2ZvbGxvdycsXG4gICAgaW50ZWdyaXR5OiAnJyxcbiAgICBjcnlwdG9HcmFwaGljc05vbmNlTWV0YWRhdGE6ICcnLFxuICAgIHBhcnNlck1ldGFkYXRhOiAnJyxcbiAgICByZWxvYWROYXZpZ2F0aW9uOiBmYWxzZSxcbiAgICBoaXN0b3J5TmF2aWdhdGlvbjogZmFsc2UsXG4gICAgdXNlckFjdGl2YXRpb246IGZhbHNlLFxuICAgIHRhaW50ZWRPcmlnaW46IGZhbHNlLFxuICAgIHJlZGlyZWN0Q291bnQ6IDAsXG4gICAgcmVzcG9uc2VUYWludGluZzogJ2Jhc2ljJyxcbiAgICBwcmV2ZW50Tm9DYWNoZUNhY2hlQ29udHJvbEhlYWRlck1vZGlmaWNhdGlvbjogZmFsc2UsXG4gICAgZG9uZTogZmFsc2UsXG4gICAgdGltaW5nQWxsb3dGYWlsZWQ6IGZhbHNlLFxuICAgIC4uLmluaXQsXG4gICAgaGVhZGVyc0xpc3Q6IGluaXQuaGVhZGVyc0xpc3RcbiAgICAgID8gbmV3IEhlYWRlcnNMaXN0KGluaXQuaGVhZGVyc0xpc3QpXG4gICAgICA6IG5ldyBIZWFkZXJzTGlzdCgpXG4gIH1cbiAgcmVxdWVzdC51cmwgPSByZXF1ZXN0LnVybExpc3RbMF1cbiAgcmV0dXJuIHJlcXVlc3Rcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtcmVxdWVzdC1jbG9uZVxuZnVuY3Rpb24gY2xvbmVSZXF1ZXN0IChyZXF1ZXN0KSB7XG4gIC8vIFRvIGNsb25lIGEgcmVxdWVzdCByZXF1ZXN0LCBydW4gdGhlc2Ugc3RlcHM6XG5cbiAgLy8gMS4gTGV0IG5ld1JlcXVlc3QgYmUgYSBjb3B5IG9mIHJlcXVlc3QsIGV4Y2VwdCBmb3IgaXRzIGJvZHkuXG4gIGNvbnN0IG5ld1JlcXVlc3QgPSBtYWtlUmVxdWVzdCh7IC4uLnJlcXVlc3QsIGJvZHk6IG51bGwgfSlcblxuICAvLyAyLiBJZiByZXF1ZXN04oCZcyBib2R5IGlzIG5vbi1udWxsLCBzZXQgbmV3UmVxdWVzdOKAmXMgYm9keSB0byB0aGVcbiAgLy8gcmVzdWx0IG9mIGNsb25pbmcgcmVxdWVzdOKAmXMgYm9keS5cbiAgaWYgKHJlcXVlc3QuYm9keSAhPSBudWxsKSB7XG4gICAgbmV3UmVxdWVzdC5ib2R5ID0gY2xvbmVCb2R5KHJlcXVlc3QuYm9keSlcbiAgfVxuXG4gIC8vIDMuIFJldHVybiBuZXdSZXF1ZXN0LlxuICByZXR1cm4gbmV3UmVxdWVzdFxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhSZXF1ZXN0LnByb3RvdHlwZSwge1xuICBtZXRob2Q6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHVybDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgaGVhZGVyczoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgcmVkaXJlY3Q6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGNsb25lOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBzaWduYWw6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGR1cGxleDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgZGVzdGluYXRpb246IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGJvZHk6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGJvZHlVc2VkOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBpc0hpc3RvcnlOYXZpZ2F0aW9uOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBpc1JlbG9hZE5hdmlnYXRpb246IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGtlZXBhbGl2ZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgaW50ZWdyaXR5OiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBjYWNoZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgY3JlZGVudGlhbHM6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGF0dHJpYnV0ZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgcmVmZXJyZXJQb2xpY3k6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHJlZmVycmVyOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBtb2RlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBbU3ltYm9sLnRvU3RyaW5nVGFnXToge1xuICAgIHZhbHVlOiAnUmVxdWVzdCcsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH1cbn0pXG5cbndlYmlkbC5jb252ZXJ0ZXJzLlJlcXVlc3QgPSB3ZWJpZGwuaW50ZXJmYWNlQ29udmVydGVyKFxuICBSZXF1ZXN0XG4pXG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXF1ZXN0aW5mb1xud2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdEluZm8gPSBmdW5jdGlvbiAoVikge1xuICBpZiAodHlwZW9mIFYgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhWKVxuICB9XG5cbiAgaWYgKFYgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7XG4gICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLlJlcXVlc3QoVilcbiAgfVxuXG4gIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcoVilcbn1cblxud2ViaWRsLmNvbnZlcnRlcnMuQWJvcnRTaWduYWwgPSB3ZWJpZGwuaW50ZXJmYWNlQ29udmVydGVyKFxuICBBYm9ydFNpZ25hbFxuKVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jcmVxdWVzdGluaXRcbndlYmlkbC5jb252ZXJ0ZXJzLlJlcXVlc3RJbml0ID0gd2ViaWRsLmRpY3Rpb25hcnlDb252ZXJ0ZXIoW1xuICB7XG4gICAga2V5OiAnbWV0aG9kJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmdcbiAgfSxcbiAge1xuICAgIGtleTogJ2hlYWRlcnMnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuSGVhZGVyc0luaXRcbiAgfSxcbiAge1xuICAgIGtleTogJ2JvZHknLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKFxuICAgICAgd2ViaWRsLmNvbnZlcnRlcnMuQm9keUluaXRcbiAgICApXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdyZWZlcnJlcicsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmdcbiAgfSxcbiAge1xuICAgIGtleTogJ3JlZmVycmVyUG9saWN5JyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyxcbiAgICAvLyBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLXJlZmVycmVyLXBvbGljeS8jcmVmZXJyZXItcG9saWN5XG4gICAgYWxsb3dlZFZhbHVlczogcmVmZXJyZXJQb2xpY3lcbiAgfSxcbiAge1xuICAgIGtleTogJ21vZGUnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nLFxuICAgIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LXJlcXVlc3QtbW9kZVxuICAgIGFsbG93ZWRWYWx1ZXM6IHJlcXVlc3RNb2RlXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdjcmVkZW50aWFscycsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI3JlcXVlc3RjcmVkZW50aWFsc1xuICAgIGFsbG93ZWRWYWx1ZXM6IHJlcXVlc3RDcmVkZW50aWFsc1xuICB9LFxuICB7XG4gICAga2V5OiAnY2FjaGUnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nLFxuICAgIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXF1ZXN0Y2FjaGVcbiAgICBhbGxvd2VkVmFsdWVzOiByZXF1ZXN0Q2FjaGVcbiAgfSxcbiAge1xuICAgIGtleTogJ3JlZGlyZWN0JyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyxcbiAgICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jcmVxdWVzdHJlZGlyZWN0XG4gICAgYWxsb3dlZFZhbHVlczogcmVxdWVzdFJlZGlyZWN0XG4gIH0sXG4gIHtcbiAgICBrZXk6ICdpbnRlZ3JpdHknLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdrZWVwYWxpdmUnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYm9vbGVhblxuICB9LFxuICB7XG4gICAga2V5OiAnc2lnbmFsJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5udWxsYWJsZUNvbnZlcnRlcihcbiAgICAgIChzaWduYWwpID0+IHdlYmlkbC5jb252ZXJ0ZXJzLkFib3J0U2lnbmFsKFxuICAgICAgICBzaWduYWwsXG4gICAgICAgIHsgc3RyaWN0OiBmYWxzZSB9XG4gICAgICApXG4gICAgKVxuICB9LFxuICB7XG4gICAga2V5OiAnd2luZG93JyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmFueVxuICB9LFxuICB7XG4gICAga2V5OiAnZHVwbGV4JyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyxcbiAgICBhbGxvd2VkVmFsdWVzOiByZXF1ZXN0RHVwbGV4XG4gIH1cbl0pXG5cbm1vZHVsZS5leHBvcnRzID0geyBSZXF1ZXN0LCBtYWtlUmVxdWVzdCB9XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vRXRoYW4tQXJyb3dvb2QvdW5kaWNpLWZldGNoXG5cbid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7XG4gIFJlc3BvbnNlLFxuICBtYWtlTmV0d29ya0Vycm9yLFxuICBtYWtlQXBwcm9wcmlhdGVOZXR3b3JrRXJyb3IsXG4gIGZpbHRlclJlc3BvbnNlLFxuICBtYWtlUmVzcG9uc2Vcbn0gPSByZXF1aXJlKCcuL3Jlc3BvbnNlJylcbmNvbnN0IHsgSGVhZGVycyB9ID0gcmVxdWlyZSgnLi9oZWFkZXJzJylcbmNvbnN0IHsgUmVxdWVzdCwgbWFrZVJlcXVlc3QgfSA9IHJlcXVpcmUoJy4vcmVxdWVzdCcpXG5jb25zdCB6bGliID0gcmVxdWlyZSgnemxpYicpXG5jb25zdCB7XG4gIGJ5dGVzTWF0Y2gsXG4gIG1ha2VQb2xpY3lDb250YWluZXIsXG4gIGNsb25lUG9saWN5Q29udGFpbmVyLFxuICByZXF1ZXN0QmFkUG9ydCxcbiAgVEFPQ2hlY2ssXG4gIGFwcGVuZFJlcXVlc3RPcmlnaW5IZWFkZXIsXG4gIHJlc3BvbnNlTG9jYXRpb25VUkwsXG4gIHJlcXVlc3RDdXJyZW50VVJMLFxuICBzZXRSZXF1ZXN0UmVmZXJyZXJQb2xpY3lPblJlZGlyZWN0LFxuICB0cnlVcGdyYWRlUmVxdWVzdFRvQVBvdGVudGlhbGx5VHJ1c3R3b3J0aHlVUkwsXG4gIGNyZWF0ZU9wYXF1ZVRpbWluZ0luZm8sXG4gIGFwcGVuZEZldGNoTWV0YWRhdGEsXG4gIGNvcnNDaGVjayxcbiAgY3Jvc3NPcmlnaW5SZXNvdXJjZVBvbGljeUNoZWNrLFxuICBkZXRlcm1pbmVSZXF1ZXN0c1JlZmVycmVyLFxuICBjb2Fyc2VuZWRTaGFyZWRDdXJyZW50VGltZSxcbiAgY3JlYXRlRGVmZXJyZWRQcm9taXNlLFxuICBpc0Jsb2JMaWtlLFxuICBzYW1lT3JpZ2luLFxuICBpc0NhbmNlbGxlZCxcbiAgaXNBYm9ydGVkLFxuICBpc0Vycm9yTGlrZSxcbiAgZnVsbHlSZWFkQm9keSxcbiAgcmVhZGFibGVTdHJlYW1DbG9zZSxcbiAgaXNvbW9ycGhpY0VuY29kZSxcbiAgdXJsSXNMb2NhbCxcbiAgdXJsSXNIdHRwSHR0cHNTY2hlbWUsXG4gIHVybEhhc0h0dHBzU2NoZW1lXG59ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHsga1N0YXRlLCBrSGVhZGVycywga0d1YXJkLCBrUmVhbG0gfSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuY29uc3QgeyBzYWZlbHlFeHRyYWN0Qm9keSB9ID0gcmVxdWlyZSgnLi9ib2R5JylcbmNvbnN0IHtcbiAgcmVkaXJlY3RTdGF0dXNTZXQsXG4gIG51bGxCb2R5U3RhdHVzLFxuICBzYWZlTWV0aG9kc1NldCxcbiAgcmVxdWVzdEJvZHlIZWFkZXIsXG4gIHN1YnJlc291cmNlU2V0LFxuICBET01FeGNlcHRpb25cbn0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5jb25zdCB7IGtIZWFkZXJzTGlzdCB9ID0gcmVxdWlyZSgnLi4vY29yZS9zeW1ib2xzJylcbmNvbnN0IEVFID0gcmVxdWlyZSgnZXZlbnRzJylcbmNvbnN0IHsgUmVhZGFibGUsIHBpcGVsaW5lIH0gPSByZXF1aXJlKCdzdHJlYW0nKVxuY29uc3QgeyBhZGRBYm9ydExpc3RlbmVyLCBpc0Vycm9yZWQsIGlzUmVhZGFibGUsIG5vZGVNYWpvciwgbm9kZU1pbm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBkYXRhVVJMUHJvY2Vzc29yLCBzZXJpYWxpemVBTWltZVR5cGUgfSA9IHJlcXVpcmUoJy4vZGF0YVVSTCcpXG5jb25zdCB7IFRyYW5zZm9ybVN0cmVhbSB9ID0gcmVxdWlyZSgnc3RyZWFtL3dlYicpXG5jb25zdCB7IGdldEdsb2JhbERpc3BhdGNoZXIgfSA9IHJlcXVpcmUoJy4uL2dsb2JhbCcpXG5jb25zdCB7IHdlYmlkbCB9ID0gcmVxdWlyZSgnLi93ZWJpZGwnKVxuY29uc3QgeyBTVEFUVVNfQ09ERVMgfSA9IHJlcXVpcmUoJ2h0dHAnKVxuY29uc3QgR0VUX09SX0hFQUQgPSBbJ0dFVCcsICdIRUFEJ11cblxuLyoqIEB0eXBlIHtpbXBvcnQoJ2J1ZmZlcicpLnJlc29sdmVPYmplY3RVUkx9ICovXG5sZXQgcmVzb2x2ZU9iamVjdFVSTFxubGV0IFJlYWRhYmxlU3RyZWFtID0gZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbVxuXG5jbGFzcyBGZXRjaCBleHRlbmRzIEVFIHtcbiAgY29uc3RydWN0b3IgKGRpc3BhdGNoZXIpIHtcbiAgICBzdXBlcigpXG5cbiAgICB0aGlzLmRpc3BhdGNoZXIgPSBkaXNwYXRjaGVyXG4gICAgdGhpcy5jb25uZWN0aW9uID0gbnVsbFxuICAgIHRoaXMuZHVtcCA9IGZhbHNlXG4gICAgdGhpcy5zdGF0ZSA9ICdvbmdvaW5nJ1xuICAgIC8vIDIgdGVybWluYXRlZCBsaXN0ZW5lcnMgZ2V0IGFkZGVkIHBlciByZXF1ZXN0LFxuICAgIC8vIGJ1dCBvbmx5IDEgZ2V0cyByZW1vdmVkLiBJZiB0aGVyZSBhcmUgMjAgcmVkaXJlY3RzLFxuICAgIC8vIDIxIGxpc3RlbmVycyB3aWxsIGJlIGFkZGVkLlxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9pc3N1ZXMvMTcxMVxuICAgIC8vIFRPRE8gKGZpeCk6IEZpbmQgYW5kIGZpeCByb290IGNhdXNlIGZvciBsZWFrZWQgbGlzdGVuZXIuXG4gICAgdGhpcy5zZXRNYXhMaXN0ZW5lcnMoMjEpXG4gIH1cblxuICB0ZXJtaW5hdGUgKHJlYXNvbikge1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSAnb25nb2luZycpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSAndGVybWluYXRlZCdcbiAgICB0aGlzLmNvbm5lY3Rpb24/LmRlc3Ryb3kocmVhc29uKVxuICAgIHRoaXMuZW1pdCgndGVybWluYXRlZCcsIHJlYXNvbilcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNmZXRjaC1jb250cm9sbGVyLWFib3J0XG4gIGFib3J0IChlcnJvcikge1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSAnb25nb2luZycpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIDEuIFNldCBjb250cm9sbGVy4oCZcyBzdGF0ZSB0byBcImFib3J0ZWRcIi5cbiAgICB0aGlzLnN0YXRlID0gJ2Fib3J0ZWQnXG5cbiAgICAvLyAyLiBMZXQgZmFsbGJhY2tFcnJvciBiZSBhbiBcIkFib3J0RXJyb3JcIiBET01FeGNlcHRpb24uXG4gICAgLy8gMy4gU2V0IGVycm9yIHRvIGZhbGxiYWNrRXJyb3IgaWYgaXQgaXMgbm90IGdpdmVuLlxuICAgIGlmICghZXJyb3IpIHtcbiAgICAgIGVycm9yID0gbmV3IERPTUV4Y2VwdGlvbignVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZC4nLCAnQWJvcnRFcnJvcicpXG4gICAgfVxuXG4gICAgLy8gNC4gTGV0IHNlcmlhbGl6ZWRFcnJvciBiZSBTdHJ1Y3R1cmVkU2VyaWFsaXplKGVycm9yKS5cbiAgICAvLyAgICBJZiB0aGF0IHRocmV3IGFuIGV4Y2VwdGlvbiwgY2F0Y2ggaXQsIGFuZCBsZXRcbiAgICAvLyAgICBzZXJpYWxpemVkRXJyb3IgYmUgU3RydWN0dXJlZFNlcmlhbGl6ZShmYWxsYmFja0Vycm9yKS5cblxuICAgIC8vIDUuIFNldCBjb250cm9sbGVy4oCZcyBzZXJpYWxpemVkIGFib3J0IHJlYXNvbiB0byBzZXJpYWxpemVkRXJyb3IuXG4gICAgdGhpcy5zZXJpYWxpemVkQWJvcnRSZWFzb24gPSBlcnJvclxuXG4gICAgdGhpcy5jb25uZWN0aW9uPy5kZXN0cm95KGVycm9yKVxuICAgIHRoaXMuZW1pdCgndGVybWluYXRlZCcsIGVycm9yKVxuICB9XG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNmZXRjaC1tZXRob2RcbmZ1bmN0aW9uIGZldGNoIChpbnB1dCwgaW5pdCA9IHt9KSB7XG4gIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdnbG9iYWxUaGlzLmZldGNoJyB9KVxuXG4gIC8vIDEuIExldCBwIGJlIGEgbmV3IHByb21pc2UuXG4gIGNvbnN0IHAgPSBjcmVhdGVEZWZlcnJlZFByb21pc2UoKVxuXG4gIC8vIDIuIExldCByZXF1ZXN0T2JqZWN0IGJlIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhlIGluaXRpYWwgdmFsdWUgb2ZcbiAgLy8gUmVxdWVzdCBhcyBjb25zdHJ1Y3RvciB3aXRoIGlucHV0IGFuZCBpbml0IGFzIGFyZ3VtZW50cy4gSWYgdGhpcyB0aHJvd3NcbiAgLy8gYW4gZXhjZXB0aW9uLCByZWplY3QgcCB3aXRoIGl0IGFuZCByZXR1cm4gcC5cbiAgbGV0IHJlcXVlc3RPYmplY3RcblxuICB0cnkge1xuICAgIHJlcXVlc3RPYmplY3QgPSBuZXcgUmVxdWVzdChpbnB1dCwgaW5pdClcbiAgfSBjYXRjaCAoZSkge1xuICAgIHAucmVqZWN0KGUpXG4gICAgcmV0dXJuIHAucHJvbWlzZVxuICB9XG5cbiAgLy8gMy4gTGV0IHJlcXVlc3QgYmUgcmVxdWVzdE9iamVjdOKAmXMgcmVxdWVzdC5cbiAgY29uc3QgcmVxdWVzdCA9IHJlcXVlc3RPYmplY3Rba1N0YXRlXVxuXG4gIC8vIDQuIElmIHJlcXVlc3RPYmplY3TigJlzIHNpZ25hbOKAmXMgYWJvcnRlZCBmbGFnIGlzIHNldCwgdGhlbjpcbiAgaWYgKHJlcXVlc3RPYmplY3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAvLyAxLiBBYm9ydCB0aGUgZmV0Y2goKSBjYWxsIHdpdGggcCwgcmVxdWVzdCwgbnVsbCwgYW5kXG4gICAgLy8gICAgcmVxdWVzdE9iamVjdOKAmXMgc2lnbmFs4oCZcyBhYm9ydCByZWFzb24uXG4gICAgYWJvcnRGZXRjaChwLCByZXF1ZXN0LCBudWxsLCByZXF1ZXN0T2JqZWN0LnNpZ25hbC5yZWFzb24pXG5cbiAgICAvLyAyLiBSZXR1cm4gcC5cbiAgICByZXR1cm4gcC5wcm9taXNlXG4gIH1cblxuICAvLyA1LiBMZXQgZ2xvYmFsT2JqZWN0IGJlIHJlcXVlc3TigJlzIGNsaWVudOKAmXMgZ2xvYmFsIG9iamVjdC5cbiAgY29uc3QgZ2xvYmFsT2JqZWN0ID0gcmVxdWVzdC5jbGllbnQuZ2xvYmFsT2JqZWN0XG5cbiAgLy8gNi4gSWYgZ2xvYmFsT2JqZWN0IGlzIGEgU2VydmljZVdvcmtlckdsb2JhbFNjb3BlIG9iamVjdCwgdGhlbiBzZXRcbiAgLy8gcmVxdWVzdOKAmXMgc2VydmljZS13b3JrZXJzIG1vZGUgdG8gXCJub25lXCIuXG4gIGlmIChnbG9iYWxPYmplY3Q/LmNvbnN0cnVjdG9yPy5uYW1lID09PSAnU2VydmljZVdvcmtlckdsb2JhbFNjb3BlJykge1xuICAgIHJlcXVlc3Quc2VydmljZVdvcmtlcnMgPSAnbm9uZSdcbiAgfVxuXG4gIC8vIDcuIExldCByZXNwb25zZU9iamVjdCBiZSBudWxsLlxuICBsZXQgcmVzcG9uc2VPYmplY3QgPSBudWxsXG5cbiAgLy8gOC4gTGV0IHJlbGV2YW50UmVhbG0gYmUgdGhpc+KAmXMgcmVsZXZhbnQgUmVhbG0uXG4gIGNvbnN0IHJlbGV2YW50UmVhbG0gPSBudWxsXG5cbiAgLy8gOS4gTGV0IGxvY2FsbHlBYm9ydGVkIGJlIGZhbHNlLlxuICBsZXQgbG9jYWxseUFib3J0ZWQgPSBmYWxzZVxuXG4gIC8vIDEwLiBMZXQgY29udHJvbGxlciBiZSBudWxsLlxuICBsZXQgY29udHJvbGxlciA9IG51bGxcblxuICAvLyAxMS4gQWRkIHRoZSBmb2xsb3dpbmcgYWJvcnQgc3RlcHMgdG8gcmVxdWVzdE9iamVjdOKAmXMgc2lnbmFsOlxuICBhZGRBYm9ydExpc3RlbmVyKFxuICAgIHJlcXVlc3RPYmplY3Quc2lnbmFsLFxuICAgICgpID0+IHtcbiAgICAgIC8vIDEuIFNldCBsb2NhbGx5QWJvcnRlZCB0byB0cnVlLlxuICAgICAgbG9jYWxseUFib3J0ZWQgPSB0cnVlXG5cbiAgICAgIC8vIDIuIEFzc2VydDogY29udHJvbGxlciBpcyBub24tbnVsbC5cbiAgICAgIGFzc2VydChjb250cm9sbGVyICE9IG51bGwpXG5cbiAgICAgIC8vIDMuIEFib3J0IGNvbnRyb2xsZXIgd2l0aCByZXF1ZXN0T2JqZWN04oCZcyBzaWduYWzigJlzIGFib3J0IHJlYXNvbi5cbiAgICAgIGNvbnRyb2xsZXIuYWJvcnQocmVxdWVzdE9iamVjdC5zaWduYWwucmVhc29uKVxuXG4gICAgICAvLyA0LiBBYm9ydCB0aGUgZmV0Y2goKSBjYWxsIHdpdGggcCwgcmVxdWVzdCwgcmVzcG9uc2VPYmplY3QsXG4gICAgICAvLyAgICBhbmQgcmVxdWVzdE9iamVjdOKAmXMgc2lnbmFs4oCZcyBhYm9ydCByZWFzb24uXG4gICAgICBhYm9ydEZldGNoKHAsIHJlcXVlc3QsIHJlc3BvbnNlT2JqZWN0LCByZXF1ZXN0T2JqZWN0LnNpZ25hbC5yZWFzb24pXG4gICAgfVxuICApXG5cbiAgLy8gMTIuIExldCBoYW5kbGVGZXRjaERvbmUgZ2l2ZW4gcmVzcG9uc2UgcmVzcG9uc2UgYmUgdG8gZmluYWxpemUgYW5kXG4gIC8vIHJlcG9ydCB0aW1pbmcgd2l0aCByZXNwb25zZSwgZ2xvYmFsT2JqZWN0LCBhbmQgXCJmZXRjaFwiLlxuICBjb25zdCBoYW5kbGVGZXRjaERvbmUgPSAocmVzcG9uc2UpID0+XG4gICAgZmluYWxpemVBbmRSZXBvcnRUaW1pbmcocmVzcG9uc2UsICdmZXRjaCcpXG5cbiAgLy8gMTMuIFNldCBjb250cm9sbGVyIHRvIHRoZSByZXN1bHQgb2YgY2FsbGluZyBmZXRjaCBnaXZlbiByZXF1ZXN0LFxuICAvLyB3aXRoIHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keSBzZXQgdG8gaGFuZGxlRmV0Y2hEb25lLCBhbmQgcHJvY2Vzc1Jlc3BvbnNlXG4gIC8vIGdpdmVuIHJlc3BvbnNlIGJlaW5nIHRoZXNlIHN1YnN0ZXBzOlxuXG4gIGNvbnN0IHByb2Nlc3NSZXNwb25zZSA9IChyZXNwb25zZSkgPT4ge1xuICAgIC8vIDEuIElmIGxvY2FsbHlBYm9ydGVkIGlzIHRydWUsIHRlcm1pbmF0ZSB0aGVzZSBzdWJzdGVwcy5cbiAgICBpZiAobG9jYWxseUFib3J0ZWQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIH1cblxuICAgIC8vIDIuIElmIHJlc3BvbnNl4oCZcyBhYm9ydGVkIGZsYWcgaXMgc2V0LCB0aGVuOlxuICAgIGlmIChyZXNwb25zZS5hYm9ydGVkKSB7XG4gICAgICAvLyAxLiBMZXQgZGVzZXJpYWxpemVkRXJyb3IgYmUgdGhlIHJlc3VsdCBvZiBkZXNlcmlhbGl6ZSBhIHNlcmlhbGl6ZWRcbiAgICAgIC8vICAgIGFib3J0IHJlYXNvbiBnaXZlbiBjb250cm9sbGVy4oCZcyBzZXJpYWxpemVkIGFib3J0IHJlYXNvbiBhbmRcbiAgICAgIC8vICAgIHJlbGV2YW50UmVhbG0uXG5cbiAgICAgIC8vIDIuIEFib3J0IHRoZSBmZXRjaCgpIGNhbGwgd2l0aCBwLCByZXF1ZXN0LCByZXNwb25zZU9iamVjdCwgYW5kXG4gICAgICAvLyAgICBkZXNlcmlhbGl6ZWRFcnJvci5cblxuICAgICAgYWJvcnRGZXRjaChwLCByZXF1ZXN0LCByZXNwb25zZU9iamVjdCwgY29udHJvbGxlci5zZXJpYWxpemVkQWJvcnRSZWFzb24pXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICB9XG5cbiAgICAvLyAzLiBJZiByZXNwb25zZSBpcyBhIG5ldHdvcmsgZXJyb3IsIHRoZW4gcmVqZWN0IHAgd2l0aCBhIFR5cGVFcnJvclxuICAgIC8vIGFuZCB0ZXJtaW5hdGUgdGhlc2Ugc3Vic3RlcHMuXG4gICAgaWYgKHJlc3BvbnNlLnR5cGUgPT09ICdlcnJvcicpIHtcbiAgICAgIHAucmVqZWN0KFxuICAgICAgICBPYmplY3QuYXNzaWduKG5ldyBUeXBlRXJyb3IoJ2ZldGNoIGZhaWxlZCcpLCB7IGNhdXNlOiByZXNwb25zZS5lcnJvciB9KVxuICAgICAgKVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgfVxuXG4gICAgLy8gNC4gU2V0IHJlc3BvbnNlT2JqZWN0IHRvIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYSBSZXNwb25zZSBvYmplY3QsXG4gICAgLy8gZ2l2ZW4gcmVzcG9uc2UsIFwiaW1tdXRhYmxlXCIsIGFuZCByZWxldmFudFJlYWxtLlxuICAgIHJlc3BvbnNlT2JqZWN0ID0gbmV3IFJlc3BvbnNlKClcbiAgICByZXNwb25zZU9iamVjdFtrU3RhdGVdID0gcmVzcG9uc2VcbiAgICByZXNwb25zZU9iamVjdFtrUmVhbG1dID0gcmVsZXZhbnRSZWFsbVxuICAgIHJlc3BvbnNlT2JqZWN0W2tIZWFkZXJzXVtrSGVhZGVyc0xpc3RdID0gcmVzcG9uc2UuaGVhZGVyc0xpc3RcbiAgICByZXNwb25zZU9iamVjdFtrSGVhZGVyc11ba0d1YXJkXSA9ICdpbW11dGFibGUnXG4gICAgcmVzcG9uc2VPYmplY3Rba0hlYWRlcnNdW2tSZWFsbV0gPSByZWxldmFudFJlYWxtXG5cbiAgICAvLyA1LiBSZXNvbHZlIHAgd2l0aCByZXNwb25zZU9iamVjdC5cbiAgICBwLnJlc29sdmUocmVzcG9uc2VPYmplY3QpXG4gIH1cblxuICBjb250cm9sbGVyID0gZmV0Y2hpbmcoe1xuICAgIHJlcXVlc3QsXG4gICAgcHJvY2Vzc1Jlc3BvbnNlRW5kT2ZCb2R5OiBoYW5kbGVGZXRjaERvbmUsXG4gICAgcHJvY2Vzc1Jlc3BvbnNlLFxuICAgIGRpc3BhdGNoZXI6IGluaXQuZGlzcGF0Y2hlciA/PyBnZXRHbG9iYWxEaXNwYXRjaGVyKCkgLy8gdW5kaWNpXG4gIH0pXG5cbiAgLy8gMTQuIFJldHVybiBwLlxuICByZXR1cm4gcC5wcm9taXNlXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNmaW5hbGl6ZS1hbmQtcmVwb3J0LXRpbWluZ1xuZnVuY3Rpb24gZmluYWxpemVBbmRSZXBvcnRUaW1pbmcgKHJlc3BvbnNlLCBpbml0aWF0b3JUeXBlID0gJ290aGVyJykge1xuICAvLyAxLiBJZiByZXNwb25zZSBpcyBhbiBhYm9ydGVkIG5ldHdvcmsgZXJyb3IsIHRoZW4gcmV0dXJuLlxuICBpZiAocmVzcG9uc2UudHlwZSA9PT0gJ2Vycm9yJyAmJiByZXNwb25zZS5hYm9ydGVkKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyAyLiBJZiByZXNwb25zZeKAmXMgVVJMIGxpc3QgaXMgbnVsbCBvciBlbXB0eSwgdGhlbiByZXR1cm4uXG4gIGlmICghcmVzcG9uc2UudXJsTGlzdD8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyAzLiBMZXQgb3JpZ2luYWxVUkwgYmUgcmVzcG9uc2XigJlzIFVSTCBsaXN0WzBdLlxuICBjb25zdCBvcmlnaW5hbFVSTCA9IHJlc3BvbnNlLnVybExpc3RbMF1cblxuICAvLyA0LiBMZXQgdGltaW5nSW5mbyBiZSByZXNwb25zZeKAmXMgdGltaW5nIGluZm8uXG4gIGxldCB0aW1pbmdJbmZvID0gcmVzcG9uc2UudGltaW5nSW5mb1xuXG4gIC8vIDUuIExldCBjYWNoZVN0YXRlIGJlIHJlc3BvbnNl4oCZcyBjYWNoZSBzdGF0ZS5cbiAgbGV0IGNhY2hlU3RhdGUgPSByZXNwb25zZS5jYWNoZVN0YXRlXG5cbiAgLy8gNi4gSWYgb3JpZ2luYWxVUkzigJlzIHNjaGVtZSBpcyBub3QgYW4gSFRUUChTKSBzY2hlbWUsIHRoZW4gcmV0dXJuLlxuICBpZiAoIXVybElzSHR0cEh0dHBzU2NoZW1lKG9yaWdpbmFsVVJMKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gNy4gSWYgdGltaW5nSW5mbyBpcyBudWxsLCB0aGVuIHJldHVybi5cbiAgaWYgKHRpbWluZ0luZm8gPT09IG51bGwpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIDguIElmIHJlc3BvbnNl4oCZcyB0aW1pbmcgYWxsb3cgcGFzc2VkIGZsYWcgaXMgbm90IHNldCwgdGhlbjpcbiAgaWYgKCFyZXNwb25zZS50aW1pbmdBbGxvd1Bhc3NlZCkge1xuICAgIC8vICAxLiBTZXQgdGltaW5nSW5mbyB0byBhIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYW4gb3BhcXVlIHRpbWluZyBpbmZvIGZvciB0aW1pbmdJbmZvLlxuICAgIHRpbWluZ0luZm8gPSBjcmVhdGVPcGFxdWVUaW1pbmdJbmZvKHtcbiAgICAgIHN0YXJ0VGltZTogdGltaW5nSW5mby5zdGFydFRpbWVcbiAgICB9KVxuXG4gICAgLy8gIDIuIFNldCBjYWNoZVN0YXRlIHRvIHRoZSBlbXB0eSBzdHJpbmcuXG4gICAgY2FjaGVTdGF0ZSA9ICcnXG4gIH1cblxuICAvLyA5LiBTZXQgdGltaW5nSW5mb+KAmXMgZW5kIHRpbWUgdG8gdGhlIGNvYXJzZW5lZCBzaGFyZWQgY3VycmVudCB0aW1lXG4gIC8vIGdpdmVuIGdsb2JhbOKAmXMgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN04oCZcyBjcm9zcy1vcmlnaW4gaXNvbGF0ZWRcbiAgLy8gY2FwYWJpbGl0eS5cbiAgLy8gVE9ETzogZ2l2ZW4gZ2xvYmFs4oCZcyByZWxldmFudCBzZXR0aW5ncyBvYmplY3TigJlzIGNyb3NzLW9yaWdpbiBpc29sYXRlZFxuICAvLyBjYXBhYmlsaXR5P1xuICB0aW1pbmdJbmZvLmVuZFRpbWUgPSBjb2Fyc2VuZWRTaGFyZWRDdXJyZW50VGltZSgpXG5cbiAgLy8gMTAuIFNldCByZXNwb25zZeKAmXMgdGltaW5nIGluZm8gdG8gdGltaW5nSW5mby5cbiAgcmVzcG9uc2UudGltaW5nSW5mbyA9IHRpbWluZ0luZm9cblxuICAvLyAxMS4gTWFyayByZXNvdXJjZSB0aW1pbmcgZm9yIHRpbWluZ0luZm8sIG9yaWdpbmFsVVJMLCBpbml0aWF0b3JUeXBlLFxuICAvLyBnbG9iYWwsIGFuZCBjYWNoZVN0YXRlLlxuICBtYXJrUmVzb3VyY2VUaW1pbmcoXG4gICAgdGltaW5nSW5mbyxcbiAgICBvcmlnaW5hbFVSTCxcbiAgICBpbml0aWF0b3JUeXBlLFxuICAgIGdsb2JhbFRoaXMsXG4gICAgY2FjaGVTdGF0ZVxuICApXG59XG5cbi8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9yZXNvdXJjZS10aW1pbmcvI2Rmbi1tYXJrLXJlc291cmNlLXRpbWluZ1xuZnVuY3Rpb24gbWFya1Jlc291cmNlVGltaW5nICh0aW1pbmdJbmZvLCBvcmlnaW5hbFVSTCwgaW5pdGlhdG9yVHlwZSwgZ2xvYmFsVGhpcywgY2FjaGVTdGF0ZSkge1xuICBpZiAobm9kZU1ham9yID4gMTggfHwgKG5vZGVNYWpvciA9PT0gMTggJiYgbm9kZU1pbm9yID49IDIpKSB7XG4gICAgcGVyZm9ybWFuY2UubWFya1Jlc291cmNlVGltaW5nKHRpbWluZ0luZm8sIG9yaWdpbmFsVVJMLmhyZWYsIGluaXRpYXRvclR5cGUsIGdsb2JhbFRoaXMsIGNhY2hlU3RhdGUpXG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2Fib3J0LWZldGNoXG5mdW5jdGlvbiBhYm9ydEZldGNoIChwLCByZXF1ZXN0LCByZXNwb25zZU9iamVjdCwgZXJyb3IpIHtcbiAgLy8gTm90ZTogQWJvcnRTaWduYWwucmVhc29uIHdhcyBhZGRlZCBpbiBub2RlIHYxNy4yLjBcbiAgLy8gd2hpY2ggd291bGQgZ2l2ZSB1cyBhbiB1bmRlZmluZWQgZXJyb3IgdG8gcmVqZWN0IHdpdGguXG4gIC8vIFJlbW92ZSB0aGlzIG9uY2Ugbm9kZSB2MTYgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC5cbiAgaWYgKCFlcnJvcikge1xuICAgIGVycm9yID0gbmV3IERPTUV4Y2VwdGlvbignVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZC4nLCAnQWJvcnRFcnJvcicpXG4gIH1cblxuICAvLyAxLiBSZWplY3QgcHJvbWlzZSB3aXRoIGVycm9yLlxuICBwLnJlamVjdChlcnJvcilcblxuICAvLyAyLiBJZiByZXF1ZXN04oCZcyBib2R5IGlzIG5vdCBudWxsIGFuZCBpcyByZWFkYWJsZSwgdGhlbiBjYW5jZWwgcmVxdWVzdOKAmXNcbiAgLy8gYm9keSB3aXRoIGVycm9yLlxuICBpZiAocmVxdWVzdC5ib2R5ICE9IG51bGwgJiYgaXNSZWFkYWJsZShyZXF1ZXN0LmJvZHk/LnN0cmVhbSkpIHtcbiAgICByZXF1ZXN0LmJvZHkuc3RyZWFtLmNhbmNlbChlcnJvcikuY2F0Y2goKGVycikgPT4ge1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRVJSX0lOVkFMSURfU1RBVEUnKSB7XG4gICAgICAgIC8vIE5vZGUgYnVnP1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIHRocm93IGVyclxuICAgIH0pXG4gIH1cblxuICAvLyAzLiBJZiByZXNwb25zZU9iamVjdCBpcyBudWxsLCB0aGVuIHJldHVybi5cbiAgaWYgKHJlc3BvbnNlT2JqZWN0ID09IG51bGwpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIDQuIExldCByZXNwb25zZSBiZSByZXNwb25zZU9iamVjdOKAmXMgcmVzcG9uc2UuXG4gIGNvbnN0IHJlc3BvbnNlID0gcmVzcG9uc2VPYmplY3Rba1N0YXRlXVxuXG4gIC8vIDUuIElmIHJlc3BvbnNl4oCZcyBib2R5IGlzIG5vdCBudWxsIGFuZCBpcyByZWFkYWJsZSwgdGhlbiBlcnJvciByZXNwb25zZeKAmXNcbiAgLy8gYm9keSB3aXRoIGVycm9yLlxuICBpZiAocmVzcG9uc2UuYm9keSAhPSBudWxsICYmIGlzUmVhZGFibGUocmVzcG9uc2UuYm9keT8uc3RyZWFtKSkge1xuICAgIHJlc3BvbnNlLmJvZHkuc3RyZWFtLmNhbmNlbChlcnJvcikuY2F0Y2goKGVycikgPT4ge1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRVJSX0lOVkFMSURfU1RBVEUnKSB7XG4gICAgICAgIC8vIE5vZGUgYnVnP1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIHRocm93IGVyclxuICAgIH0pXG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2ZldGNoaW5nXG5mdW5jdGlvbiBmZXRjaGluZyAoe1xuICByZXF1ZXN0LFxuICBwcm9jZXNzUmVxdWVzdEJvZHlDaHVua0xlbmd0aCxcbiAgcHJvY2Vzc1JlcXVlc3RFbmRPZkJvZHksXG4gIHByb2Nlc3NSZXNwb25zZSxcbiAgcHJvY2Vzc1Jlc3BvbnNlRW5kT2ZCb2R5LFxuICBwcm9jZXNzUmVzcG9uc2VDb25zdW1lQm9keSxcbiAgdXNlUGFyYWxsZWxRdWV1ZSA9IGZhbHNlLFxuICBkaXNwYXRjaGVyIC8vIHVuZGljaVxufSkge1xuICAvLyAxLiBMZXQgdGFza0Rlc3RpbmF0aW9uIGJlIG51bGwuXG4gIGxldCB0YXNrRGVzdGluYXRpb24gPSBudWxsXG5cbiAgLy8gMi4gTGV0IGNyb3NzT3JpZ2luSXNvbGF0ZWRDYXBhYmlsaXR5IGJlIGZhbHNlLlxuICBsZXQgY3Jvc3NPcmlnaW5Jc29sYXRlZENhcGFiaWxpdHkgPSBmYWxzZVxuXG4gIC8vIDMuIElmIHJlcXVlc3TigJlzIGNsaWVudCBpcyBub24tbnVsbCwgdGhlbjpcbiAgaWYgKHJlcXVlc3QuY2xpZW50ICE9IG51bGwpIHtcbiAgICAvLyAxLiBTZXQgdGFza0Rlc3RpbmF0aW9uIHRvIHJlcXVlc3TigJlzIGNsaWVudOKAmXMgZ2xvYmFsIG9iamVjdC5cbiAgICB0YXNrRGVzdGluYXRpb24gPSByZXF1ZXN0LmNsaWVudC5nbG9iYWxPYmplY3RcblxuICAgIC8vIDIuIFNldCBjcm9zc09yaWdpbklzb2xhdGVkQ2FwYWJpbGl0eSB0byByZXF1ZXN04oCZcyBjbGllbnTigJlzIGNyb3NzLW9yaWdpblxuICAgIC8vIGlzb2xhdGVkIGNhcGFiaWxpdHkuXG4gICAgY3Jvc3NPcmlnaW5Jc29sYXRlZENhcGFiaWxpdHkgPVxuICAgICAgcmVxdWVzdC5jbGllbnQuY3Jvc3NPcmlnaW5Jc29sYXRlZENhcGFiaWxpdHlcbiAgfVxuXG4gIC8vIDQuIElmIHVzZVBhcmFsbGVsUXVldWUgaXMgdHJ1ZSwgdGhlbiBzZXQgdGFza0Rlc3RpbmF0aW9uIHRvIHRoZSByZXN1bHQgb2ZcbiAgLy8gc3RhcnRpbmcgYSBuZXcgcGFyYWxsZWwgcXVldWUuXG4gIC8vIFRPRE9cblxuICAvLyA1LiBMZXQgdGltaW5nSW5mbyBiZSBhIG5ldyBmZXRjaCB0aW1pbmcgaW5mbyB3aG9zZSBzdGFydCB0aW1lIGFuZFxuICAvLyBwb3N0LXJlZGlyZWN0IHN0YXJ0IHRpbWUgYXJlIHRoZSBjb2Fyc2VuZWQgc2hhcmVkIGN1cnJlbnQgdGltZSBnaXZlblxuICAvLyBjcm9zc09yaWdpbklzb2xhdGVkQ2FwYWJpbGl0eS5cbiAgY29uc3QgY3VycmVuVGltZSA9IGNvYXJzZW5lZFNoYXJlZEN1cnJlbnRUaW1lKGNyb3NzT3JpZ2luSXNvbGF0ZWRDYXBhYmlsaXR5KVxuICBjb25zdCB0aW1pbmdJbmZvID0gY3JlYXRlT3BhcXVlVGltaW5nSW5mbyh7XG4gICAgc3RhcnRUaW1lOiBjdXJyZW5UaW1lXG4gIH0pXG5cbiAgLy8gNi4gTGV0IGZldGNoUGFyYW1zIGJlIGEgbmV3IGZldGNoIHBhcmFtcyB3aG9zZVxuICAvLyByZXF1ZXN0IGlzIHJlcXVlc3QsXG4gIC8vIHRpbWluZyBpbmZvIGlzIHRpbWluZ0luZm8sXG4gIC8vIHByb2Nlc3MgcmVxdWVzdCBib2R5IGNodW5rIGxlbmd0aCBpcyBwcm9jZXNzUmVxdWVzdEJvZHlDaHVua0xlbmd0aCxcbiAgLy8gcHJvY2VzcyByZXF1ZXN0IGVuZC1vZi1ib2R5IGlzIHByb2Nlc3NSZXF1ZXN0RW5kT2ZCb2R5LFxuICAvLyBwcm9jZXNzIHJlc3BvbnNlIGlzIHByb2Nlc3NSZXNwb25zZSxcbiAgLy8gcHJvY2VzcyByZXNwb25zZSBjb25zdW1lIGJvZHkgaXMgcHJvY2Vzc1Jlc3BvbnNlQ29uc3VtZUJvZHksXG4gIC8vIHByb2Nlc3MgcmVzcG9uc2UgZW5kLW9mLWJvZHkgaXMgcHJvY2Vzc1Jlc3BvbnNlRW5kT2ZCb2R5LFxuICAvLyB0YXNrIGRlc3RpbmF0aW9uIGlzIHRhc2tEZXN0aW5hdGlvbixcbiAgLy8gYW5kIGNyb3NzLW9yaWdpbiBpc29sYXRlZCBjYXBhYmlsaXR5IGlzIGNyb3NzT3JpZ2luSXNvbGF0ZWRDYXBhYmlsaXR5LlxuICBjb25zdCBmZXRjaFBhcmFtcyA9IHtcbiAgICBjb250cm9sbGVyOiBuZXcgRmV0Y2goZGlzcGF0Y2hlciksXG4gICAgcmVxdWVzdCxcbiAgICB0aW1pbmdJbmZvLFxuICAgIHByb2Nlc3NSZXF1ZXN0Qm9keUNodW5rTGVuZ3RoLFxuICAgIHByb2Nlc3NSZXF1ZXN0RW5kT2ZCb2R5LFxuICAgIHByb2Nlc3NSZXNwb25zZSxcbiAgICBwcm9jZXNzUmVzcG9uc2VDb25zdW1lQm9keSxcbiAgICBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHksXG4gICAgdGFza0Rlc3RpbmF0aW9uLFxuICAgIGNyb3NzT3JpZ2luSXNvbGF0ZWRDYXBhYmlsaXR5XG4gIH1cblxuICAvLyA3LiBJZiByZXF1ZXN04oCZcyBib2R5IGlzIGEgYnl0ZSBzZXF1ZW5jZSwgdGhlbiBzZXQgcmVxdWVzdOKAmXMgYm9keSB0b1xuICAvLyAgICByZXF1ZXN04oCZcyBib2R5IGFzIGEgYm9keS5cbiAgLy8gTk9URTogU2luY2UgZmV0Y2hpbmcgaXMgb25seSBjYWxsZWQgZnJvbSBmZXRjaCwgYm9keSBzaG91bGQgYWxyZWFkeSBiZVxuICAvLyBleHRyYWN0ZWQuXG4gIGFzc2VydCghcmVxdWVzdC5ib2R5IHx8IHJlcXVlc3QuYm9keS5zdHJlYW0pXG5cbiAgLy8gOC4gSWYgcmVxdWVzdOKAmXMgd2luZG93IGlzIFwiY2xpZW50XCIsIHRoZW4gc2V0IHJlcXVlc3TigJlzIHdpbmRvdyB0byByZXF1ZXN04oCZc1xuICAvLyBjbGllbnQsIGlmIHJlcXVlc3TigJlzIGNsaWVudOKAmXMgZ2xvYmFsIG9iamVjdCBpcyBhIFdpbmRvdyBvYmplY3Q7IG90aGVyd2lzZVxuICAvLyBcIm5vLXdpbmRvd1wiLlxuICBpZiAocmVxdWVzdC53aW5kb3cgPT09ICdjbGllbnQnKSB7XG4gICAgLy8gVE9ETzogV2hhdCBpZiByZXF1ZXN0LmNsaWVudCBpcyBudWxsP1xuICAgIHJlcXVlc3Qud2luZG93ID1cbiAgICAgIHJlcXVlc3QuY2xpZW50Py5nbG9iYWxPYmplY3Q/LmNvbnN0cnVjdG9yPy5uYW1lID09PSAnV2luZG93J1xuICAgICAgICA/IHJlcXVlc3QuY2xpZW50XG4gICAgICAgIDogJ25vLXdpbmRvdydcbiAgfVxuXG4gIC8vIDkuIElmIHJlcXVlc3TigJlzIG9yaWdpbiBpcyBcImNsaWVudFwiLCB0aGVuIHNldCByZXF1ZXN04oCZcyBvcmlnaW4gdG8gcmVxdWVzdOKAmXNcbiAgLy8gY2xpZW504oCZcyBvcmlnaW4uXG4gIGlmIChyZXF1ZXN0Lm9yaWdpbiA9PT0gJ2NsaWVudCcpIHtcbiAgICAvLyBUT0RPOiBXaGF0IGlmIHJlcXVlc3QuY2xpZW50IGlzIG51bGw/XG4gICAgcmVxdWVzdC5vcmlnaW4gPSByZXF1ZXN0LmNsaWVudD8ub3JpZ2luXG4gIH1cblxuICAvLyAxMC4gSWYgYWxsIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgdHJ1ZTpcbiAgLy8gVE9ET1xuXG4gIC8vIDExLiBJZiByZXF1ZXN04oCZcyBwb2xpY3kgY29udGFpbmVyIGlzIFwiY2xpZW50XCIsIHRoZW46XG4gIGlmIChyZXF1ZXN0LnBvbGljeUNvbnRhaW5lciA9PT0gJ2NsaWVudCcpIHtcbiAgICAvLyAxLiBJZiByZXF1ZXN04oCZcyBjbGllbnQgaXMgbm9uLW51bGwsIHRoZW4gc2V0IHJlcXVlc3TigJlzIHBvbGljeVxuICAgIC8vIGNvbnRhaW5lciB0byBhIGNsb25lIG9mIHJlcXVlc3TigJlzIGNsaWVudOKAmXMgcG9saWN5IGNvbnRhaW5lci4gW0hUTUxdXG4gICAgaWYgKHJlcXVlc3QuY2xpZW50ICE9IG51bGwpIHtcbiAgICAgIHJlcXVlc3QucG9saWN5Q29udGFpbmVyID0gY2xvbmVQb2xpY3lDb250YWluZXIoXG4gICAgICAgIHJlcXVlc3QuY2xpZW50LnBvbGljeUNvbnRhaW5lclxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyAyLiBPdGhlcndpc2UsIHNldCByZXF1ZXN04oCZcyBwb2xpY3kgY29udGFpbmVyIHRvIGEgbmV3IHBvbGljeVxuICAgICAgLy8gY29udGFpbmVyLlxuICAgICAgcmVxdWVzdC5wb2xpY3lDb250YWluZXIgPSBtYWtlUG9saWN5Q29udGFpbmVyKClcbiAgICB9XG4gIH1cblxuICAvLyAxMi4gSWYgcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgZG9lcyBub3QgY29udGFpbiBgQWNjZXB0YCwgdGhlbjpcbiAgaWYgKCFyZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCdhY2NlcHQnKSkge1xuICAgIC8vIDEuIExldCB2YWx1ZSBiZSBgKi8qYC5cbiAgICBjb25zdCB2YWx1ZSA9ICcqLyonXG5cbiAgICAvLyAyLiBBIHVzZXIgYWdlbnQgc2hvdWxkIHNldCB2YWx1ZSB0byB0aGUgZmlyc3QgbWF0Y2hpbmcgc3RhdGVtZW50LCBpZlxuICAgIC8vIGFueSwgc3dpdGNoaW5nIG9uIHJlcXVlc3TigJlzIGRlc3RpbmF0aW9uOlxuICAgIC8vIFwiZG9jdW1lbnRcIlxuICAgIC8vIFwiZnJhbWVcIlxuICAgIC8vIFwiaWZyYW1lXCJcbiAgICAvLyBgdGV4dC9odG1sLGFwcGxpY2F0aW9uL3hodG1sK3htbCxhcHBsaWNhdGlvbi94bWw7cT0wLjksKi8qO3E9MC44YFxuICAgIC8vIFwiaW1hZ2VcIlxuICAgIC8vIGBpbWFnZS9wbmcsaW1hZ2Uvc3ZnK3htbCxpbWFnZS8qO3E9MC44LCovKjtxPTAuNWBcbiAgICAvLyBcInN0eWxlXCJcbiAgICAvLyBgdGV4dC9jc3MsKi8qO3E9MC4xYFxuICAgIC8vIFRPRE9cblxuICAgIC8vIDMuIEFwcGVuZCBgQWNjZXB0YC92YWx1ZSB0byByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgICByZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgnYWNjZXB0JywgdmFsdWUpXG4gIH1cblxuICAvLyAxMy4gSWYgcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgZG9lcyBub3QgY29udGFpbiBgQWNjZXB0LUxhbmd1YWdlYCwgdGhlblxuICAvLyB1c2VyIGFnZW50cyBzaG91bGQgYXBwZW5kIGBBY2NlcHQtTGFuZ3VhZ2VgL2FuIGFwcHJvcHJpYXRlIHZhbHVlIHRvXG4gIC8vIHJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICBpZiAoIXJlcXVlc3QuaGVhZGVyc0xpc3QuY29udGFpbnMoJ2FjY2VwdC1sYW5ndWFnZScpKSB7XG4gICAgcmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ2FjY2VwdC1sYW5ndWFnZScsICcqJylcbiAgfVxuXG4gIC8vIDE0LiBJZiByZXF1ZXN04oCZcyBwcmlvcml0eSBpcyBudWxsLCB0aGVuIHVzZSByZXF1ZXN04oCZcyBpbml0aWF0b3IgYW5kXG4gIC8vIGRlc3RpbmF0aW9uIGFwcHJvcHJpYXRlbHkgaW4gc2V0dGluZyByZXF1ZXN04oCZcyBwcmlvcml0eSB0byBhXG4gIC8vIHVzZXItYWdlbnQtZGVmaW5lZCBvYmplY3QuXG4gIGlmIChyZXF1ZXN0LnByaW9yaXR5ID09PSBudWxsKSB7XG4gICAgLy8gVE9ET1xuICB9XG5cbiAgLy8gMTUuIElmIHJlcXVlc3QgaXMgYSBzdWJyZXNvdXJjZSByZXF1ZXN0LCB0aGVuOlxuICBpZiAoc3VicmVzb3VyY2VTZXQuaGFzKHJlcXVlc3QuZGVzdGluYXRpb24pKSB7XG4gICAgLy8gVE9ET1xuICB9XG5cbiAgLy8gMTYuIFJ1biBtYWluIGZldGNoIGdpdmVuIGZldGNoUGFyYW1zLlxuICBtYWluRmV0Y2goZmV0Y2hQYXJhbXMpXG4gICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLnRlcm1pbmF0ZShlcnIpXG4gICAgfSlcblxuICAvLyAxNy4gUmV0dXJuIGZldGNoUGFyYW0ncyBjb250cm9sbGVyXG4gIHJldHVybiBmZXRjaFBhcmFtcy5jb250cm9sbGVyXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LW1haW4tZmV0Y2hcbmFzeW5jIGZ1bmN0aW9uIG1haW5GZXRjaCAoZmV0Y2hQYXJhbXMsIHJlY3Vyc2l2ZSA9IGZhbHNlKSB7XG4gIC8vIDEuIExldCByZXF1ZXN0IGJlIGZldGNoUGFyYW1z4oCZcyByZXF1ZXN0LlxuICBjb25zdCByZXF1ZXN0ID0gZmV0Y2hQYXJhbXMucmVxdWVzdFxuXG4gIC8vIDIuIExldCByZXNwb25zZSBiZSBudWxsLlxuICBsZXQgcmVzcG9uc2UgPSBudWxsXG5cbiAgLy8gMy4gSWYgcmVxdWVzdOKAmXMgbG9jYWwtVVJMcy1vbmx5IGZsYWcgaXMgc2V0IGFuZCByZXF1ZXN04oCZcyBjdXJyZW50IFVSTCBpc1xuICAvLyBub3QgbG9jYWwsIHRoZW4gc2V0IHJlc3BvbnNlIHRvIGEgbmV0d29yayBlcnJvci5cbiAgaWYgKHJlcXVlc3QubG9jYWxVUkxzT25seSAmJiAhdXJsSXNMb2NhbChyZXF1ZXN0Q3VycmVudFVSTChyZXF1ZXN0KSkpIHtcbiAgICByZXNwb25zZSA9IG1ha2VOZXR3b3JrRXJyb3IoJ2xvY2FsIFVSTHMgb25seScpXG4gIH1cblxuICAvLyA0LiBSdW4gcmVwb3J0IENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IHZpb2xhdGlvbnMgZm9yIHJlcXVlc3QuXG4gIC8vIFRPRE9cblxuICAvLyA1LiBVcGdyYWRlIHJlcXVlc3QgdG8gYSBwb3RlbnRpYWxseSB0cnVzdHdvcnRoeSBVUkwsIGlmIGFwcHJvcHJpYXRlLlxuICB0cnlVcGdyYWRlUmVxdWVzdFRvQVBvdGVudGlhbGx5VHJ1c3R3b3J0aHlVUkwocmVxdWVzdClcblxuICAvLyA2LiBJZiBzaG91bGQgcmVxdWVzdCBiZSBibG9ja2VkIGR1ZSB0byBhIGJhZCBwb3J0LCBzaG91bGQgZmV0Y2hpbmcgcmVxdWVzdFxuICAvLyBiZSBibG9ja2VkIGFzIG1peGVkIGNvbnRlbnQsIG9yIHNob3VsZCByZXF1ZXN0IGJlIGJsb2NrZWQgYnkgQ29udGVudFxuICAvLyBTZWN1cml0eSBQb2xpY3kgcmV0dXJucyBibG9ja2VkLCB0aGVuIHNldCByZXNwb25zZSB0byBhIG5ldHdvcmsgZXJyb3IuXG4gIGlmIChyZXF1ZXN0QmFkUG9ydChyZXF1ZXN0KSA9PT0gJ2Jsb2NrZWQnKSB7XG4gICAgcmVzcG9uc2UgPSBtYWtlTmV0d29ya0Vycm9yKCdiYWQgcG9ydCcpXG4gIH1cbiAgLy8gVE9ETzogc2hvdWxkIGZldGNoaW5nIHJlcXVlc3QgYmUgYmxvY2tlZCBhcyBtaXhlZCBjb250ZW50P1xuICAvLyBUT0RPOiBzaG91bGQgcmVxdWVzdCBiZSBibG9ja2VkIGJ5IENvbnRlbnQgU2VjdXJpdHkgUG9saWN5P1xuXG4gIC8vIDcuIElmIHJlcXVlc3TigJlzIHJlZmVycmVyIHBvbGljeSBpcyB0aGUgZW1wdHkgc3RyaW5nLCB0aGVuIHNldCByZXF1ZXN04oCZc1xuICAvLyByZWZlcnJlciBwb2xpY3kgdG8gcmVxdWVzdOKAmXMgcG9saWN5IGNvbnRhaW5lcuKAmXMgcmVmZXJyZXIgcG9saWN5LlxuICBpZiAocmVxdWVzdC5yZWZlcnJlclBvbGljeSA9PT0gJycpIHtcbiAgICByZXF1ZXN0LnJlZmVycmVyUG9saWN5ID0gcmVxdWVzdC5wb2xpY3lDb250YWluZXIucmVmZXJyZXJQb2xpY3lcbiAgfVxuXG4gIC8vIDguIElmIHJlcXVlc3TigJlzIHJlZmVycmVyIGlzIG5vdCBcIm5vLXJlZmVycmVyXCIsIHRoZW4gc2V0IHJlcXVlc3TigJlzXG4gIC8vIHJlZmVycmVyIHRvIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgZGV0ZXJtaW5lIHJlcXVlc3TigJlzIHJlZmVycmVyLlxuICBpZiAocmVxdWVzdC5yZWZlcnJlciAhPT0gJ25vLXJlZmVycmVyJykge1xuICAgIHJlcXVlc3QucmVmZXJyZXIgPSBkZXRlcm1pbmVSZXF1ZXN0c1JlZmVycmVyKHJlcXVlc3QpXG4gIH1cblxuICAvLyA5LiBTZXQgcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIHNjaGVtZSB0byBcImh0dHBzXCIgaWYgYWxsIG9mIHRoZSBmb2xsb3dpbmdcbiAgLy8gY29uZGl0aW9ucyBhcmUgdHJ1ZTpcbiAgLy8gLSByZXF1ZXN04oCZcyBjdXJyZW50IFVSTOKAmXMgc2NoZW1lIGlzIFwiaHR0cFwiXG4gIC8vIC0gcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIGhvc3QgaXMgYSBkb21haW5cbiAgLy8gLSBNYXRjaGluZyByZXF1ZXN04oCZcyBjdXJyZW50IFVSTOKAmXMgaG9zdCBwZXIgS25vd24gSFNUUyBIb3N0IERvbWFpbiBOYW1lXG4gIC8vICAgTWF0Y2hpbmcgcmVzdWx0cyBpbiBlaXRoZXIgYSBzdXBlcmRvbWFpbiBtYXRjaCB3aXRoIGFuIGFzc2VydGVkXG4gIC8vICAgaW5jbHVkZVN1YkRvbWFpbnMgZGlyZWN0aXZlIG9yIGEgY29uZ3J1ZW50IG1hdGNoICh3aXRoIG9yIHdpdGhvdXQgYW5cbiAgLy8gICBhc3NlcnRlZCBpbmNsdWRlU3ViRG9tYWlucyBkaXJlY3RpdmUpLiBbSFNUU11cbiAgLy8gVE9ET1xuXG4gIC8vIDEwLiBJZiByZWN1cnNpdmUgaXMgZmFsc2UsIHRoZW4gcnVuIHRoZSByZW1haW5pbmcgc3RlcHMgaW4gcGFyYWxsZWwuXG4gIC8vIFRPRE9cblxuICAvLyAxMS4gSWYgcmVzcG9uc2UgaXMgbnVsbCwgdGhlbiBzZXQgcmVzcG9uc2UgdG8gdGhlIHJlc3VsdCBvZiBydW5uaW5nXG4gIC8vIHRoZSBzdGVwcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaXJzdCBtYXRjaGluZyBzdGF0ZW1lbnQ6XG4gIGlmIChyZXNwb25zZSA9PT0gbnVsbCkge1xuICAgIHJlc3BvbnNlID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRVUkwgPSByZXF1ZXN0Q3VycmVudFVSTChyZXF1ZXN0KVxuXG4gICAgICBpZiAoXG4gICAgICAgIC8vIC0gcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIG9yaWdpbiBpcyBzYW1lIG9yaWdpbiB3aXRoIHJlcXVlc3TigJlzIG9yaWdpbixcbiAgICAgICAgLy8gICBhbmQgcmVxdWVzdOKAmXMgcmVzcG9uc2UgdGFpbnRpbmcgaXMgXCJiYXNpY1wiXG4gICAgICAgIChzYW1lT3JpZ2luKGN1cnJlbnRVUkwsIHJlcXVlc3QudXJsKSAmJiByZXF1ZXN0LnJlc3BvbnNlVGFpbnRpbmcgPT09ICdiYXNpYycpIHx8XG4gICAgICAgIC8vIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBzY2hlbWUgaXMgXCJkYXRhXCJcbiAgICAgICAgKGN1cnJlbnRVUkwucHJvdG9jb2wgPT09ICdkYXRhOicpIHx8XG4gICAgICAgIC8vIC0gcmVxdWVzdOKAmXMgbW9kZSBpcyBcIm5hdmlnYXRlXCIgb3IgXCJ3ZWJzb2NrZXRcIlxuICAgICAgICAocmVxdWVzdC5tb2RlID09PSAnbmF2aWdhdGUnIHx8IHJlcXVlc3QubW9kZSA9PT0gJ3dlYnNvY2tldCcpXG4gICAgICApIHtcbiAgICAgICAgLy8gMS4gU2V0IHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nIHRvIFwiYmFzaWNcIi5cbiAgICAgICAgcmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID0gJ2Jhc2ljJ1xuXG4gICAgICAgIC8vIDIuIFJldHVybiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgc2NoZW1lIGZldGNoIGdpdmVuIGZldGNoUGFyYW1zLlxuICAgICAgICByZXR1cm4gYXdhaXQgc2NoZW1lRmV0Y2goZmV0Y2hQYXJhbXMpXG4gICAgICB9XG5cbiAgICAgIC8vIHJlcXVlc3TigJlzIG1vZGUgaXMgXCJzYW1lLW9yaWdpblwiXG4gICAgICBpZiAocmVxdWVzdC5tb2RlID09PSAnc2FtZS1vcmlnaW4nKSB7XG4gICAgICAgIC8vIDEuIFJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG4gICAgICAgIHJldHVybiBtYWtlTmV0d29ya0Vycm9yKCdyZXF1ZXN0IG1vZGUgY2Fubm90IGJlIFwic2FtZS1vcmlnaW5cIicpXG4gICAgICB9XG5cbiAgICAgIC8vIHJlcXVlc3TigJlzIG1vZGUgaXMgXCJuby1jb3JzXCJcbiAgICAgIGlmIChyZXF1ZXN0Lm1vZGUgPT09ICduby1jb3JzJykge1xuICAgICAgICAvLyAxLiBJZiByZXF1ZXN04oCZcyByZWRpcmVjdCBtb2RlIGlzIG5vdCBcImZvbGxvd1wiLCB0aGVuIHJldHVybiBhIG5ldHdvcmtcbiAgICAgICAgLy8gZXJyb3IuXG4gICAgICAgIGlmIChyZXF1ZXN0LnJlZGlyZWN0ICE9PSAnZm9sbG93Jykge1xuICAgICAgICAgIHJldHVybiBtYWtlTmV0d29ya0Vycm9yKFxuICAgICAgICAgICAgJ3JlZGlyZWN0IG1vZGUgY2Fubm90IGJlIFwiZm9sbG93XCIgZm9yIFwibm8tY29yc1wiIHJlcXVlc3QnXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4gU2V0IHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nIHRvIFwib3BhcXVlXCIuXG4gICAgICAgIHJlcXVlc3QucmVzcG9uc2VUYWludGluZyA9ICdvcGFxdWUnXG5cbiAgICAgICAgLy8gMy4gUmV0dXJuIHRoZSByZXN1bHQgb2YgcnVubmluZyBzY2hlbWUgZmV0Y2ggZ2l2ZW4gZmV0Y2hQYXJhbXMuXG4gICAgICAgIHJldHVybiBhd2FpdCBzY2hlbWVGZXRjaChmZXRjaFBhcmFtcylcbiAgICAgIH1cblxuICAgICAgLy8gcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIHNjaGVtZSBpcyBub3QgYW4gSFRUUChTKSBzY2hlbWVcbiAgICAgIGlmICghdXJsSXNIdHRwSHR0cHNTY2hlbWUocmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdCkpKSB7XG4gICAgICAgIC8vIFJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG4gICAgICAgIHJldHVybiBtYWtlTmV0d29ya0Vycm9yKCdVUkwgc2NoZW1lIG11c3QgYmUgYSBIVFRQKFMpIHNjaGVtZScpXG4gICAgICB9XG5cbiAgICAgIC8vIC0gcmVxdWVzdOKAmXMgdXNlLUNPUlMtcHJlZmxpZ2h0IGZsYWcgaXMgc2V0XG4gICAgICAvLyAtIHJlcXVlc3TigJlzIHVuc2FmZS1yZXF1ZXN0IGZsYWcgaXMgc2V0IGFuZCBlaXRoZXIgcmVxdWVzdOKAmXMgbWV0aG9kIGlzXG4gICAgICAvLyAgIG5vdCBhIENPUlMtc2FmZWxpc3RlZCBtZXRob2Qgb3IgQ09SUy11bnNhZmUgcmVxdWVzdC1oZWFkZXIgbmFtZXMgd2l0aFxuICAgICAgLy8gICByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdCBpcyBub3QgZW1wdHlcbiAgICAgIC8vICAgIDEuIFNldCByZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZyB0byBcImNvcnNcIi5cbiAgICAgIC8vICAgIDIuIExldCBjb3JzV2l0aFByZWZsaWdodFJlc3BvbnNlIGJlIHRoZSByZXN1bHQgb2YgcnVubmluZyBIVFRQIGZldGNoXG4gICAgICAvLyAgICBnaXZlbiBmZXRjaFBhcmFtcyBhbmQgdHJ1ZS5cbiAgICAgIC8vICAgIDMuIElmIGNvcnNXaXRoUHJlZmxpZ2h0UmVzcG9uc2UgaXMgYSBuZXR3b3JrIGVycm9yLCB0aGVuIGNsZWFyIGNhY2hlXG4gICAgICAvLyAgICBlbnRyaWVzIHVzaW5nIHJlcXVlc3QuXG4gICAgICAvLyAgICA0LiBSZXR1cm4gY29yc1dpdGhQcmVmbGlnaHRSZXNwb25zZS5cbiAgICAgIC8vIFRPRE9cblxuICAgICAgLy8gT3RoZXJ3aXNlXG4gICAgICAvLyAgICAxLiBTZXQgcmVxdWVzdOKAmXMgcmVzcG9uc2UgdGFpbnRpbmcgdG8gXCJjb3JzXCIuXG4gICAgICByZXF1ZXN0LnJlc3BvbnNlVGFpbnRpbmcgPSAnY29ycydcblxuICAgICAgLy8gICAgMi4gUmV0dXJuIHRoZSByZXN1bHQgb2YgcnVubmluZyBIVFRQIGZldGNoIGdpdmVuIGZldGNoUGFyYW1zLlxuICAgICAgcmV0dXJuIGF3YWl0IGh0dHBGZXRjaChmZXRjaFBhcmFtcylcbiAgICB9KSgpXG4gIH1cblxuICAvLyAxMi4gSWYgcmVjdXJzaXZlIGlzIHRydWUsIHRoZW4gcmV0dXJuIHJlc3BvbnNlLlxuICBpZiAocmVjdXJzaXZlKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlXG4gIH1cblxuICAvLyAxMy4gSWYgcmVzcG9uc2UgaXMgbm90IGEgbmV0d29yayBlcnJvciBhbmQgcmVzcG9uc2UgaXMgbm90IGEgZmlsdGVyZWRcbiAgLy8gcmVzcG9uc2UsIHRoZW46XG4gIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDAgJiYgIXJlc3BvbnNlLmludGVybmFsUmVzcG9uc2UpIHtcbiAgICAvLyBJZiByZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZyBpcyBcImNvcnNcIiwgdGhlbjpcbiAgICBpZiAocmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnY29ycycpIHtcbiAgICAgIC8vIDEuIExldCBoZWFkZXJOYW1lcyBiZSB0aGUgcmVzdWx0IG9mIGV4dHJhY3RpbmcgaGVhZGVyIGxpc3QgdmFsdWVzXG4gICAgICAvLyBnaXZlbiBgQWNjZXNzLUNvbnRyb2wtRXhwb3NlLUhlYWRlcnNgIGFuZCByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3QuXG4gICAgICAvLyBUT0RPXG4gICAgICAvLyAyLiBJZiByZXF1ZXN04oCZcyBjcmVkZW50aWFscyBtb2RlIGlzIG5vdCBcImluY2x1ZGVcIiBhbmQgaGVhZGVyTmFtZXNcbiAgICAgIC8vIGNvbnRhaW5zIGAqYCwgdGhlbiBzZXQgcmVzcG9uc2XigJlzIENPUlMtZXhwb3NlZCBoZWFkZXItbmFtZSBsaXN0IHRvXG4gICAgICAvLyBhbGwgdW5pcXVlIGhlYWRlciBuYW1lcyBpbiByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3QuXG4gICAgICAvLyBUT0RPXG4gICAgICAvLyAzLiBPdGhlcndpc2UsIGlmIGhlYWRlck5hbWVzIGlzIG5vdCBudWxsIG9yIGZhaWx1cmUsIHRoZW4gc2V0XG4gICAgICAvLyByZXNwb25zZeKAmXMgQ09SUy1leHBvc2VkIGhlYWRlci1uYW1lIGxpc3QgdG8gaGVhZGVyTmFtZXMuXG4gICAgICAvLyBUT0RPXG4gICAgfVxuXG4gICAgLy8gU2V0IHJlc3BvbnNlIHRvIHRoZSBmb2xsb3dpbmcgZmlsdGVyZWQgcmVzcG9uc2Ugd2l0aCByZXNwb25zZSBhcyBpdHNcbiAgICAvLyBpbnRlcm5hbCByZXNwb25zZSwgZGVwZW5kaW5nIG9uIHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nOlxuICAgIGlmIChyZXF1ZXN0LnJlc3BvbnNlVGFpbnRpbmcgPT09ICdiYXNpYycpIHtcbiAgICAgIHJlc3BvbnNlID0gZmlsdGVyUmVzcG9uc2UocmVzcG9uc2UsICdiYXNpYycpXG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0LnJlc3BvbnNlVGFpbnRpbmcgPT09ICdjb3JzJykge1xuICAgICAgcmVzcG9uc2UgPSBmaWx0ZXJSZXNwb25zZShyZXNwb25zZSwgJ2NvcnMnKVxuICAgIH0gZWxzZSBpZiAocmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnb3BhcXVlJykge1xuICAgICAgcmVzcG9uc2UgPSBmaWx0ZXJSZXNwb25zZShyZXNwb25zZSwgJ29wYXF1ZScpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChmYWxzZSlcbiAgICB9XG4gIH1cblxuICAvLyAxNC4gTGV0IGludGVybmFsUmVzcG9uc2UgYmUgcmVzcG9uc2UsIGlmIHJlc3BvbnNlIGlzIGEgbmV0d29yayBlcnJvcixcbiAgLy8gYW5kIHJlc3BvbnNl4oCZcyBpbnRlcm5hbCByZXNwb25zZSBvdGhlcndpc2UuXG4gIGxldCBpbnRlcm5hbFJlc3BvbnNlID1cbiAgICByZXNwb25zZS5zdGF0dXMgPT09IDAgPyByZXNwb25zZSA6IHJlc3BvbnNlLmludGVybmFsUmVzcG9uc2VcblxuICAvLyAxNS4gSWYgaW50ZXJuYWxSZXNwb25zZeKAmXMgVVJMIGxpc3QgaXMgZW1wdHksIHRoZW4gc2V0IGl0IHRvIGEgY2xvbmUgb2ZcbiAgLy8gcmVxdWVzdOKAmXMgVVJMIGxpc3QuXG4gIGlmIChpbnRlcm5hbFJlc3BvbnNlLnVybExpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgaW50ZXJuYWxSZXNwb25zZS51cmxMaXN0LnB1c2goLi4ucmVxdWVzdC51cmxMaXN0KVxuICB9XG5cbiAgLy8gMTYuIElmIHJlcXVlc3TigJlzIHRpbWluZyBhbGxvdyBmYWlsZWQgZmxhZyBpcyB1bnNldCwgdGhlbiBzZXRcbiAgLy8gaW50ZXJuYWxSZXNwb25zZeKAmXMgdGltaW5nIGFsbG93IHBhc3NlZCBmbGFnLlxuICBpZiAoIXJlcXVlc3QudGltaW5nQWxsb3dGYWlsZWQpIHtcbiAgICByZXNwb25zZS50aW1pbmdBbGxvd1Bhc3NlZCA9IHRydWVcbiAgfVxuXG4gIC8vIDE3LiBJZiByZXNwb25zZSBpcyBub3QgYSBuZXR3b3JrIGVycm9yIGFuZCBhbnkgb2YgdGhlIGZvbGxvd2luZyByZXR1cm5zXG4gIC8vIGJsb2NrZWRcbiAgLy8gLSBzaG91bGQgaW50ZXJuYWxSZXNwb25zZSB0byByZXF1ZXN0IGJlIGJsb2NrZWQgYXMgbWl4ZWQgY29udGVudFxuICAvLyAtIHNob3VsZCBpbnRlcm5hbFJlc3BvbnNlIHRvIHJlcXVlc3QgYmUgYmxvY2tlZCBieSBDb250ZW50IFNlY3VyaXR5IFBvbGljeVxuICAvLyAtIHNob3VsZCBpbnRlcm5hbFJlc3BvbnNlIHRvIHJlcXVlc3QgYmUgYmxvY2tlZCBkdWUgdG8gaXRzIE1JTUUgdHlwZVxuICAvLyAtIHNob3VsZCBpbnRlcm5hbFJlc3BvbnNlIHRvIHJlcXVlc3QgYmUgYmxvY2tlZCBkdWUgdG8gbm9zbmlmZlxuICAvLyBUT0RPXG5cbiAgLy8gMTguIElmIHJlc3BvbnNl4oCZcyB0eXBlIGlzIFwib3BhcXVlXCIsIGludGVybmFsUmVzcG9uc2XigJlzIHN0YXR1cyBpcyAyMDYsXG4gIC8vIGludGVybmFsUmVzcG9uc2XigJlzIHJhbmdlLXJlcXVlc3RlZCBmbGFnIGlzIHNldCwgYW5kIHJlcXVlc3TigJlzIGhlYWRlclxuICAvLyBsaXN0IGRvZXMgbm90IGNvbnRhaW4gYFJhbmdlYCwgdGhlbiBzZXQgcmVzcG9uc2UgYW5kIGludGVybmFsUmVzcG9uc2VcbiAgLy8gdG8gYSBuZXR3b3JrIGVycm9yLlxuICBpZiAoXG4gICAgcmVzcG9uc2UudHlwZSA9PT0gJ29wYXF1ZScgJiZcbiAgICBpbnRlcm5hbFJlc3BvbnNlLnN0YXR1cyA9PT0gMjA2ICYmXG4gICAgaW50ZXJuYWxSZXNwb25zZS5yYW5nZVJlcXVlc3RlZCAmJlxuICAgICFyZXF1ZXN0LmhlYWRlcnMuY29udGFpbnMoJ3JhbmdlJylcbiAgKSB7XG4gICAgcmVzcG9uc2UgPSBpbnRlcm5hbFJlc3BvbnNlID0gbWFrZU5ldHdvcmtFcnJvcigpXG4gIH1cblxuICAvLyAxOS4gSWYgcmVzcG9uc2UgaXMgbm90IGEgbmV0d29yayBlcnJvciBhbmQgZWl0aGVyIHJlcXVlc3TigJlzIG1ldGhvZCBpc1xuICAvLyBgSEVBRGAgb3IgYENPTk5FQ1RgLCBvciBpbnRlcm5hbFJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgYSBudWxsIGJvZHkgc3RhdHVzLFxuICAvLyBzZXQgaW50ZXJuYWxSZXNwb25zZeKAmXMgYm9keSB0byBudWxsIGFuZCBkaXNyZWdhcmQgYW55IGVucXVldWluZyB0b3dhcmRcbiAgLy8gaXQgKGlmIGFueSkuXG4gIGlmIChcbiAgICByZXNwb25zZS5zdGF0dXMgIT09IDAgJiZcbiAgICAocmVxdWVzdC5tZXRob2QgPT09ICdIRUFEJyB8fFxuICAgICAgcmVxdWVzdC5tZXRob2QgPT09ICdDT05ORUNUJyB8fFxuICAgICAgbnVsbEJvZHlTdGF0dXMuaW5jbHVkZXMoaW50ZXJuYWxSZXNwb25zZS5zdGF0dXMpKVxuICApIHtcbiAgICBpbnRlcm5hbFJlc3BvbnNlLmJvZHkgPSBudWxsXG4gICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5kdW1wID0gdHJ1ZVxuICB9XG5cbiAgLy8gMjAuIElmIHJlcXVlc3TigJlzIGludGVncml0eSBtZXRhZGF0YSBpcyBub3QgdGhlIGVtcHR5IHN0cmluZywgdGhlbjpcbiAgaWYgKHJlcXVlc3QuaW50ZWdyaXR5KSB7XG4gICAgLy8gMS4gTGV0IHByb2Nlc3NCb2R5RXJyb3IgYmUgdGhpcyBzdGVwOiBydW4gZmV0Y2ggZmluYWxlIGdpdmVuIGZldGNoUGFyYW1zXG4gICAgLy8gYW5kIGEgbmV0d29yayBlcnJvci5cbiAgICBjb25zdCBwcm9jZXNzQm9keUVycm9yID0gKHJlYXNvbikgPT5cbiAgICAgIGZldGNoRmluYWxlKGZldGNoUGFyYW1zLCBtYWtlTmV0d29ya0Vycm9yKHJlYXNvbikpXG5cbiAgICAvLyAyLiBJZiByZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZyBpcyBcIm9wYXF1ZVwiLCBvciByZXNwb25zZeKAmXMgYm9keSBpcyBudWxsLFxuICAgIC8vIHRoZW4gcnVuIHByb2Nlc3NCb2R5RXJyb3IgYW5kIGFib3J0IHRoZXNlIHN0ZXBzLlxuICAgIGlmIChyZXF1ZXN0LnJlc3BvbnNlVGFpbnRpbmcgPT09ICdvcGFxdWUnIHx8IHJlc3BvbnNlLmJvZHkgPT0gbnVsbCkge1xuICAgICAgcHJvY2Vzc0JvZHlFcnJvcihyZXNwb25zZS5lcnJvcilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIDMuIExldCBwcm9jZXNzQm9keSBnaXZlbiBieXRlcyBiZSB0aGVzZSBzdGVwczpcbiAgICBjb25zdCBwcm9jZXNzQm9keSA9IChieXRlcykgPT4ge1xuICAgICAgLy8gMS4gSWYgYnl0ZXMgZG8gbm90IG1hdGNoIHJlcXVlc3TigJlzIGludGVncml0eSBtZXRhZGF0YSxcbiAgICAgIC8vIHRoZW4gcnVuIHByb2Nlc3NCb2R5RXJyb3IgYW5kIGFib3J0IHRoZXNlIHN0ZXBzLiBbU1JJXVxuICAgICAgaWYgKCFieXRlc01hdGNoKGJ5dGVzLCByZXF1ZXN0LmludGVncml0eSkpIHtcbiAgICAgICAgcHJvY2Vzc0JvZHlFcnJvcignaW50ZWdyaXR5IG1pc21hdGNoJylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIFNldCByZXNwb25zZeKAmXMgYm9keSB0byBieXRlcyBhcyBhIGJvZHkuXG4gICAgICByZXNwb25zZS5ib2R5ID0gc2FmZWx5RXh0cmFjdEJvZHkoYnl0ZXMpWzBdXG5cbiAgICAgIC8vIDMuIFJ1biBmZXRjaCBmaW5hbGUgZ2l2ZW4gZmV0Y2hQYXJhbXMgYW5kIHJlc3BvbnNlLlxuICAgICAgZmV0Y2hGaW5hbGUoZmV0Y2hQYXJhbXMsIHJlc3BvbnNlKVxuICAgIH1cblxuICAgIC8vIDQuIEZ1bGx5IHJlYWQgcmVzcG9uc2XigJlzIGJvZHkgZ2l2ZW4gcHJvY2Vzc0JvZHkgYW5kIHByb2Nlc3NCb2R5RXJyb3IuXG4gICAgYXdhaXQgZnVsbHlSZWFkQm9keShyZXNwb25zZS5ib2R5LCBwcm9jZXNzQm9keSwgcHJvY2Vzc0JvZHlFcnJvcilcbiAgfSBlbHNlIHtcbiAgICAvLyAyMS4gT3RoZXJ3aXNlLCBydW4gZmV0Y2ggZmluYWxlIGdpdmVuIGZldGNoUGFyYW1zIGFuZCByZXNwb25zZS5cbiAgICBmZXRjaEZpbmFsZShmZXRjaFBhcmFtcywgcmVzcG9uc2UpXG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtc2NoZW1lLWZldGNoXG4vLyBnaXZlbiBhIGZldGNoIHBhcmFtcyBmZXRjaFBhcmFtc1xuZnVuY3Rpb24gc2NoZW1lRmV0Y2ggKGZldGNoUGFyYW1zKSB7XG4gIC8vIE5vdGU6IHNpbmNlIHRoZSBjb25uZWN0aW9uIGlzIGRlc3Ryb3llZCBvbiByZWRpcmVjdCwgd2hpY2ggc2V0cyBmZXRjaFBhcmFtcyB0byBhXG4gIC8vIGNhbmNlbGxlZCBzdGF0ZSwgd2UgZG8gbm90IHdhbnQgdGhpcyBjb25kaXRpb24gdG8gdHJpZ2dlciAqdW5sZXNzKiB0aGVyZSBoYXZlIGJlZW5cbiAgLy8gbm8gcmVkaXJlY3RzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzE3NzZcbiAgLy8gMS4gSWYgZmV0Y2hQYXJhbXMgaXMgY2FuY2VsZWQsIHRoZW4gcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBuZXR3b3JrIGVycm9yIGZvciBmZXRjaFBhcmFtcy5cbiAgaWYgKGlzQ2FuY2VsbGVkKGZldGNoUGFyYW1zKSAmJiBmZXRjaFBhcmFtcy5yZXF1ZXN0LnJlZGlyZWN0Q291bnQgPT09IDApIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VBcHByb3ByaWF0ZU5ldHdvcmtFcnJvcihmZXRjaFBhcmFtcykpXG4gIH1cblxuICAvLyAyLiBMZXQgcmVxdWVzdCBiZSBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdC5cbiAgY29uc3QgeyByZXF1ZXN0IH0gPSBmZXRjaFBhcmFtc1xuXG4gIGNvbnN0IHsgcHJvdG9jb2w6IHNjaGVtZSB9ID0gcmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdClcblxuICAvLyAzLiBTd2l0Y2ggb24gcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIHNjaGVtZSBhbmQgcnVuIHRoZSBhc3NvY2lhdGVkIHN0ZXBzOlxuICBzd2l0Y2ggKHNjaGVtZSkge1xuICAgIGNhc2UgJ2Fib3V0Oic6IHtcbiAgICAgIC8vIElmIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBwYXRoIGlzIHRoZSBzdHJpbmcgXCJibGFua1wiLCB0aGVuIHJldHVybiBhIG5ldyByZXNwb25zZVxuICAgICAgLy8gd2hvc2Ugc3RhdHVzIG1lc3NhZ2UgaXMgYE9LYCwgaGVhZGVyIGxpc3QgaXMgwqsgKGBDb250ZW50LVR5cGVgLCBgdGV4dC9odG1sO2NoYXJzZXQ9dXRmLThgKSDCuyxcbiAgICAgIC8vIGFuZCBib2R5IGlzIHRoZSBlbXB0eSBieXRlIHNlcXVlbmNlIGFzIGEgYm9keS5cblxuICAgICAgLy8gT3RoZXJ3aXNlLCByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlTmV0d29ya0Vycm9yKCdhYm91dCBzY2hlbWUgaXMgbm90IHN1cHBvcnRlZCcpKVxuICAgIH1cbiAgICBjYXNlICdibG9iOic6IHtcbiAgICAgIGlmICghcmVzb2x2ZU9iamVjdFVSTCkge1xuICAgICAgICByZXNvbHZlT2JqZWN0VVJMID0gcmVxdWlyZSgnYnVmZmVyJykucmVzb2x2ZU9iamVjdFVSTFxuICAgICAgfVxuXG4gICAgICAvLyAxLiBMZXQgYmxvYlVSTEVudHJ5IGJlIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBibG9iIFVSTCBlbnRyeS5cbiAgICAgIGNvbnN0IGJsb2JVUkxFbnRyeSA9IHJlcXVlc3RDdXJyZW50VVJMKHJlcXVlc3QpXG5cbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWItcGxhdGZvcm0tdGVzdHMvd3B0L2Jsb2IvN2IwZWJhY2NjNjJiNTY2YTE5NjUzOTZlNWJlN2JiMmJjMDZmODQxZi9GaWxlQVBJL3VybC9yZXNvdXJjZXMvZmV0Y2gtdGVzdHMuanMjTDUyLUw1NlxuICAgICAgLy8gQnVmZmVyLnJlc29sdmVPYmplY3RVUkwgZG9lcyBub3QgaWdub3JlIFVSTCBxdWVyaWVzLlxuICAgICAgaWYgKGJsb2JVUkxFbnRyeS5zZWFyY2gubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFrZU5ldHdvcmtFcnJvcignTmV0d29ya0Vycm9yIHdoZW4gYXR0ZW1wdGluZyB0byBmZXRjaCByZXNvdXJjZS4nKSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmxvYlVSTEVudHJ5T2JqZWN0ID0gcmVzb2x2ZU9iamVjdFVSTChibG9iVVJMRW50cnkudG9TdHJpbmcoKSlcblxuICAgICAgLy8gMi4gSWYgcmVxdWVzdOKAmXMgbWV0aG9kIGlzIG5vdCBgR0VUYCwgYmxvYlVSTEVudHJ5IGlzIG51bGwsIG9yIGJsb2JVUkxFbnRyeeKAmXNcbiAgICAgIC8vICAgIG9iamVjdCBpcyBub3QgYSBCbG9iIG9iamVjdCwgdGhlbiByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICAgICAgaWYgKHJlcXVlc3QubWV0aG9kICE9PSAnR0VUJyB8fCAhaXNCbG9iTGlrZShibG9iVVJMRW50cnlPYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFrZU5ldHdvcmtFcnJvcignaW52YWxpZCBtZXRob2QnKSlcbiAgICAgIH1cblxuICAgICAgLy8gMy4gTGV0IGJvZHlXaXRoVHlwZSBiZSB0aGUgcmVzdWx0IG9mIHNhZmVseSBleHRyYWN0aW5nIGJsb2JVUkxFbnRyeeKAmXMgb2JqZWN0LlxuICAgICAgY29uc3QgYm9keVdpdGhUeXBlID0gc2FmZWx5RXh0cmFjdEJvZHkoYmxvYlVSTEVudHJ5T2JqZWN0KVxuXG4gICAgICAvLyA0LiBMZXQgYm9keSBiZSBib2R5V2l0aFR5cGXigJlzIGJvZHkuXG4gICAgICBjb25zdCBib2R5ID0gYm9keVdpdGhUeXBlWzBdXG5cbiAgICAgIC8vIDUuIExldCBsZW5ndGggYmUgYm9keeKAmXMgbGVuZ3RoLCBzZXJpYWxpemVkIGFuZCBpc29tb3JwaGljIGVuY29kZWQuXG4gICAgICBjb25zdCBsZW5ndGggPSBpc29tb3JwaGljRW5jb2RlKGAke2JvZHkubGVuZ3RofWApXG5cbiAgICAgIC8vIDYuIExldCB0eXBlIGJlIGJvZHlXaXRoVHlwZeKAmXMgdHlwZSBpZiBpdCBpcyBub24tbnVsbDsgb3RoZXJ3aXNlIHRoZSBlbXB0eSBieXRlIHNlcXVlbmNlLlxuICAgICAgY29uc3QgdHlwZSA9IGJvZHlXaXRoVHlwZVsxXSA/PyAnJ1xuXG4gICAgICAvLyA3LiBSZXR1cm4gYSBuZXcgcmVzcG9uc2Ugd2hvc2Ugc3RhdHVzIG1lc3NhZ2UgaXMgYE9LYCwgaGVhZGVyIGxpc3QgaXNcbiAgICAgIC8vICAgIMKrIChgQ29udGVudC1MZW5ndGhgLCBsZW5ndGgpLCAoYENvbnRlbnQtVHlwZWAsIHR5cGUpIMK7LCBhbmQgYm9keSBpcyBib2R5LlxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBtYWtlUmVzcG9uc2Uoe1xuICAgICAgICBzdGF0dXNUZXh0OiAnT0snLFxuICAgICAgICBoZWFkZXJzTGlzdDogW1xuICAgICAgICAgIFsnY29udGVudC1sZW5ndGgnLCB7IG5hbWU6ICdDb250ZW50LUxlbmd0aCcsIHZhbHVlOiBsZW5ndGggfV0sXG4gICAgICAgICAgWydjb250ZW50LXR5cGUnLCB7IG5hbWU6ICdDb250ZW50LVR5cGUnLCB2YWx1ZTogdHlwZSB9XVxuICAgICAgICBdXG4gICAgICB9KVxuXG4gICAgICByZXNwb25zZS5ib2R5ID0gYm9keVxuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKVxuICAgIH1cbiAgICBjYXNlICdkYXRhOic6IHtcbiAgICAgIC8vIDEuIExldCBkYXRhVVJMU3RydWN0IGJlIHRoZSByZXN1bHQgb2YgcnVubmluZyB0aGVcbiAgICAgIC8vICAgIGRhdGE6IFVSTCBwcm9jZXNzb3Igb24gcmVxdWVzdOKAmXMgY3VycmVudCBVUkwuXG4gICAgICBjb25zdCBjdXJyZW50VVJMID0gcmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdClcbiAgICAgIGNvbnN0IGRhdGFVUkxTdHJ1Y3QgPSBkYXRhVVJMUHJvY2Vzc29yKGN1cnJlbnRVUkwpXG5cbiAgICAgIC8vIDIuIElmIGRhdGFVUkxTdHJ1Y3QgaXMgZmFpbHVyZSwgdGhlbiByZXR1cm4gYVxuICAgICAgLy8gICAgbmV0d29yayBlcnJvci5cbiAgICAgIGlmIChkYXRhVVJMU3RydWN0ID09PSAnZmFpbHVyZScpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlTmV0d29ya0Vycm9yKCdmYWlsZWQgdG8gZmV0Y2ggdGhlIGRhdGEgVVJMJykpXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIExldCBtaW1lVHlwZSBiZSBkYXRhVVJMU3RydWN04oCZcyBNSU1FIHR5cGUsIHNlcmlhbGl6ZWQuXG4gICAgICBjb25zdCBtaW1lVHlwZSA9IHNlcmlhbGl6ZUFNaW1lVHlwZShkYXRhVVJMU3RydWN0Lm1pbWVUeXBlKVxuXG4gICAgICAvLyA0LiBSZXR1cm4gYSByZXNwb25zZSB3aG9zZSBzdGF0dXMgbWVzc2FnZSBpcyBgT0tgLFxuICAgICAgLy8gICAgaGVhZGVyIGxpc3QgaXMgwqsgKGBDb250ZW50LVR5cGVgLCBtaW1lVHlwZSkgwrssXG4gICAgICAvLyAgICBhbmQgYm9keSBpcyBkYXRhVVJMU3RydWN04oCZcyBib2R5IGFzIGEgYm9keS5cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFrZVJlc3BvbnNlKHtcbiAgICAgICAgc3RhdHVzVGV4dDogJ09LJyxcbiAgICAgICAgaGVhZGVyc0xpc3Q6IFtcbiAgICAgICAgICBbJ2NvbnRlbnQtdHlwZScsIHsgbmFtZTogJ0NvbnRlbnQtVHlwZScsIHZhbHVlOiBtaW1lVHlwZSB9XVxuICAgICAgICBdLFxuICAgICAgICBib2R5OiBzYWZlbHlFeHRyYWN0Qm9keShkYXRhVVJMU3RydWN0LmJvZHkpWzBdXG4gICAgICB9KSlcbiAgICB9XG4gICAgY2FzZSAnZmlsZTonOiB7XG4gICAgICAvLyBGb3Igbm93LCB1bmZvcnR1bmF0ZSBhcyBpdCBpcywgZmlsZSBVUkxzIGFyZSBsZWZ0IGFzIGFuIGV4ZXJjaXNlIGZvciB0aGUgcmVhZGVyLlxuICAgICAgLy8gV2hlbiBpbiBkb3VidCwgcmV0dXJuIGEgbmV0d29yayBlcnJvci5cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFrZU5ldHdvcmtFcnJvcignbm90IGltcGxlbWVudGVkLi4uIHlldC4uLicpKVxuICAgIH1cbiAgICBjYXNlICdodHRwOic6XG4gICAgY2FzZSAnaHR0cHM6Jzoge1xuICAgICAgLy8gUmV0dXJuIHRoZSByZXN1bHQgb2YgcnVubmluZyBIVFRQIGZldGNoIGdpdmVuIGZldGNoUGFyYW1zLlxuXG4gICAgICByZXR1cm4gaHR0cEZldGNoKGZldGNoUGFyYW1zKVxuICAgICAgICAuY2F0Y2goKGVycikgPT4gbWFrZU5ldHdvcmtFcnJvcihlcnIpKVxuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VOZXR3b3JrRXJyb3IoJ3Vua25vd24gc2NoZW1lJykpXG4gICAgfVxuICB9XG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNmaW5hbGl6ZS1yZXNwb25zZVxuZnVuY3Rpb24gZmluYWxpemVSZXNwb25zZSAoZmV0Y2hQYXJhbXMsIHJlc3BvbnNlKSB7XG4gIC8vIDEuIFNldCBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdOKAmXMgZG9uZSBmbGFnLlxuICBmZXRjaFBhcmFtcy5yZXF1ZXN0LmRvbmUgPSB0cnVlXG5cbiAgLy8gMiwgSWYgZmV0Y2hQYXJhbXPigJlzIHByb2Nlc3MgcmVzcG9uc2UgZG9uZSBpcyBub3QgbnVsbCwgdGhlbiBxdWV1ZSBhIGZldGNoXG4gIC8vIHRhc2sgdG8gcnVuIGZldGNoUGFyYW1z4oCZcyBwcm9jZXNzIHJlc3BvbnNlIGRvbmUgZ2l2ZW4gcmVzcG9uc2UsIHdpdGhcbiAgLy8gZmV0Y2hQYXJhbXPigJlzIHRhc2sgZGVzdGluYXRpb24uXG4gIGlmIChmZXRjaFBhcmFtcy5wcm9jZXNzUmVzcG9uc2VEb25lICE9IG51bGwpIHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBmZXRjaFBhcmFtcy5wcm9jZXNzUmVzcG9uc2VEb25lKHJlc3BvbnNlKSlcbiAgfVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZmV0Y2gtZmluYWxlXG5mdW5jdGlvbiBmZXRjaEZpbmFsZSAoZmV0Y2hQYXJhbXMsIHJlc3BvbnNlKSB7XG4gIC8vIDEuIElmIHJlc3BvbnNlIGlzIGEgbmV0d29yayBlcnJvciwgdGhlbjpcbiAgaWYgKHJlc3BvbnNlLnR5cGUgPT09ICdlcnJvcicpIHtcbiAgICAvLyAxLiBTZXQgcmVzcG9uc2XigJlzIFVSTCBsaXN0IHRvIMKrIGZldGNoUGFyYW1z4oCZcyByZXF1ZXN04oCZcyBVUkwgbGlzdFswXSDCuy5cbiAgICByZXNwb25zZS51cmxMaXN0ID0gW2ZldGNoUGFyYW1zLnJlcXVlc3QudXJsTGlzdFswXV1cblxuICAgIC8vIDIuIFNldCByZXNwb25zZeKAmXMgdGltaW5nIGluZm8gdG8gdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhbiBvcGFxdWUgdGltaW5nXG4gICAgLy8gaW5mbyBmb3IgZmV0Y2hQYXJhbXPigJlzIHRpbWluZyBpbmZvLlxuICAgIHJlc3BvbnNlLnRpbWluZ0luZm8gPSBjcmVhdGVPcGFxdWVUaW1pbmdJbmZvKHtcbiAgICAgIHN0YXJ0VGltZTogZmV0Y2hQYXJhbXMudGltaW5nSW5mby5zdGFydFRpbWVcbiAgICB9KVxuICB9XG5cbiAgLy8gMi4gTGV0IHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keSBiZSB0aGUgZm9sbG93aW5nIHN0ZXBzOlxuICBjb25zdCBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHkgPSAoKSA9PiB7XG4gICAgLy8gMS4gU2V0IGZldGNoUGFyYW1z4oCZcyByZXF1ZXN04oCZcyBkb25lIGZsYWcuXG4gICAgZmV0Y2hQYXJhbXMucmVxdWVzdC5kb25lID0gdHJ1ZVxuXG4gICAgLy8gSWYgZmV0Y2hQYXJhbXPigJlzIHByb2Nlc3MgcmVzcG9uc2UgZW5kLW9mLWJvZHkgaXMgbm90IG51bGwsXG4gICAgLy8gdGhlbiBxdWV1ZSBhIGZldGNoIHRhc2sgdG8gcnVuIGZldGNoUGFyYW1z4oCZcyBwcm9jZXNzIHJlc3BvbnNlXG4gICAgLy8gZW5kLW9mLWJvZHkgZ2l2ZW4gcmVzcG9uc2Ugd2l0aCBmZXRjaFBhcmFtc+KAmXMgdGFzayBkZXN0aW5hdGlvbi5cbiAgICBpZiAoZmV0Y2hQYXJhbXMucHJvY2Vzc1Jlc3BvbnNlRW5kT2ZCb2R5ICE9IG51bGwpIHtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IGZldGNoUGFyYW1zLnByb2Nlc3NSZXNwb25zZUVuZE9mQm9keShyZXNwb25zZSkpXG4gICAgfVxuICB9XG5cbiAgLy8gMy4gSWYgZmV0Y2hQYXJhbXPigJlzIHByb2Nlc3MgcmVzcG9uc2UgaXMgbm9uLW51bGwsIHRoZW4gcXVldWUgYSBmZXRjaCB0YXNrXG4gIC8vIHRvIHJ1biBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXNwb25zZSBnaXZlbiByZXNwb25zZSwgd2l0aCBmZXRjaFBhcmFtc+KAmXNcbiAgLy8gdGFzayBkZXN0aW5hdGlvbi5cbiAgaWYgKGZldGNoUGFyYW1zLnByb2Nlc3NSZXNwb25zZSAhPSBudWxsKSB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gZmV0Y2hQYXJhbXMucHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKSlcbiAgfVxuXG4gIC8vIDQuIElmIHJlc3BvbnNl4oCZcyBib2R5IGlzIG51bGwsIHRoZW4gcnVuIHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keS5cbiAgaWYgKHJlc3BvbnNlLmJvZHkgPT0gbnVsbCkge1xuICAgIHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keSgpXG4gIH0gZWxzZSB7XG4gIC8vIDUuIE90aGVyd2lzZTpcblxuICAgIC8vIDEuIExldCB0cmFuc2Zvcm1TdHJlYW0gYmUgYSBuZXcgYSBUcmFuc2Zvcm1TdHJlYW0uXG5cbiAgICAvLyAyLiBMZXQgaWRlbnRpdHlUcmFuc2Zvcm1BbGdvcml0aG0gYmUgYW4gYWxnb3JpdGhtIHdoaWNoLCBnaXZlbiBjaHVuayxcbiAgICAvLyBlbnF1ZXVlcyBjaHVuayBpbiB0cmFuc2Zvcm1TdHJlYW0uXG4gICAgY29uc3QgaWRlbnRpdHlUcmFuc2Zvcm1BbGdvcml0aG0gPSAoY2h1bmssIGNvbnRyb2xsZXIpID0+IHtcbiAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShjaHVuaylcbiAgICB9XG5cbiAgICAvLyAzLiBTZXQgdXAgdHJhbnNmb3JtU3RyZWFtIHdpdGggdHJhbnNmb3JtQWxnb3JpdGhtIHNldCB0byBpZGVudGl0eVRyYW5zZm9ybUFsZ29yaXRobVxuICAgIC8vIGFuZCBmbHVzaEFsZ29yaXRobSBzZXQgdG8gcHJvY2Vzc1Jlc3BvbnNlRW5kT2ZCb2R5LlxuICAgIGNvbnN0IHRyYW5zZm9ybVN0cmVhbSA9IG5ldyBUcmFuc2Zvcm1TdHJlYW0oe1xuICAgICAgc3RhcnQgKCkge30sXG4gICAgICB0cmFuc2Zvcm06IGlkZW50aXR5VHJhbnNmb3JtQWxnb3JpdGhtLFxuICAgICAgZmx1c2g6IHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keVxuICAgIH0sIHtcbiAgICAgIHNpemUgKCkge1xuICAgICAgICByZXR1cm4gMVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIHNpemUgKCkge1xuICAgICAgICByZXR1cm4gMVxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyA0LiBTZXQgcmVzcG9uc2XigJlzIGJvZHkgdG8gdGhlIHJlc3VsdCBvZiBwaXBpbmcgcmVzcG9uc2XigJlzIGJvZHkgdGhyb3VnaCB0cmFuc2Zvcm1TdHJlYW0uXG4gICAgcmVzcG9uc2UuYm9keSA9IHsgc3RyZWFtOiByZXNwb25zZS5ib2R5LnN0cmVhbS5waXBlVGhyb3VnaCh0cmFuc2Zvcm1TdHJlYW0pIH1cbiAgfVxuXG4gIC8vIDYuIElmIGZldGNoUGFyYW1z4oCZcyBwcm9jZXNzIHJlc3BvbnNlIGNvbnN1bWUgYm9keSBpcyBub24tbnVsbCwgdGhlbjpcbiAgaWYgKGZldGNoUGFyYW1zLnByb2Nlc3NSZXNwb25zZUNvbnN1bWVCb2R5ICE9IG51bGwpIHtcbiAgICAvLyAxLiBMZXQgcHJvY2Vzc0JvZHkgZ2l2ZW4gbnVsbE9yQnl0ZXMgYmUgdGhpcyBzdGVwOiBydW4gZmV0Y2hQYXJhbXPigJlzXG4gICAgLy8gcHJvY2VzcyByZXNwb25zZSBjb25zdW1lIGJvZHkgZ2l2ZW4gcmVzcG9uc2UgYW5kIG51bGxPckJ5dGVzLlxuICAgIGNvbnN0IHByb2Nlc3NCb2R5ID0gKG51bGxPckJ5dGVzKSA9PiBmZXRjaFBhcmFtcy5wcm9jZXNzUmVzcG9uc2VDb25zdW1lQm9keShyZXNwb25zZSwgbnVsbE9yQnl0ZXMpXG5cbiAgICAvLyAyLiBMZXQgcHJvY2Vzc0JvZHlFcnJvciBiZSB0aGlzIHN0ZXA6IHJ1biBmZXRjaFBhcmFtc+KAmXMgcHJvY2Vzc1xuICAgIC8vIHJlc3BvbnNlIGNvbnN1bWUgYm9keSBnaXZlbiByZXNwb25zZSBhbmQgZmFpbHVyZS5cbiAgICBjb25zdCBwcm9jZXNzQm9keUVycm9yID0gKGZhaWx1cmUpID0+IGZldGNoUGFyYW1zLnByb2Nlc3NSZXNwb25zZUNvbnN1bWVCb2R5KHJlc3BvbnNlLCBmYWlsdXJlKVxuXG4gICAgLy8gMy4gSWYgcmVzcG9uc2XigJlzIGJvZHkgaXMgbnVsbCwgdGhlbiBxdWV1ZSBhIGZldGNoIHRhc2sgdG8gcnVuIHByb2Nlc3NCb2R5XG4gICAgLy8gZ2l2ZW4gbnVsbCwgd2l0aCBmZXRjaFBhcmFtc+KAmXMgdGFzayBkZXN0aW5hdGlvbi5cbiAgICBpZiAocmVzcG9uc2UuYm9keSA9PSBudWxsKSB7XG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBwcm9jZXNzQm9keShudWxsKSlcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gNC4gT3RoZXJ3aXNlLCBmdWxseSByZWFkIHJlc3BvbnNl4oCZcyBib2R5IGdpdmVuIHByb2Nlc3NCb2R5LCBwcm9jZXNzQm9keUVycm9yLFxuICAgICAgLy8gYW5kIGZldGNoUGFyYW1z4oCZcyB0YXNrIGRlc3RpbmF0aW9uLlxuICAgICAgcmV0dXJuIGZ1bGx5UmVhZEJvZHkocmVzcG9uc2UuYm9keSwgcHJvY2Vzc0JvZHksIHByb2Nlc3NCb2R5RXJyb3IpXG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICB9XG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNodHRwLWZldGNoXG5hc3luYyBmdW5jdGlvbiBodHRwRmV0Y2ggKGZldGNoUGFyYW1zKSB7XG4gIC8vIDEuIExldCByZXF1ZXN0IGJlIGZldGNoUGFyYW1z4oCZcyByZXF1ZXN0LlxuICBjb25zdCByZXF1ZXN0ID0gZmV0Y2hQYXJhbXMucmVxdWVzdFxuXG4gIC8vIDIuIExldCByZXNwb25zZSBiZSBudWxsLlxuICBsZXQgcmVzcG9uc2UgPSBudWxsXG5cbiAgLy8gMy4gTGV0IGFjdHVhbFJlc3BvbnNlIGJlIG51bGwuXG4gIGxldCBhY3R1YWxSZXNwb25zZSA9IG51bGxcblxuICAvLyA0LiBMZXQgdGltaW5nSW5mbyBiZSBmZXRjaFBhcmFtc+KAmXMgdGltaW5nIGluZm8uXG4gIGNvbnN0IHRpbWluZ0luZm8gPSBmZXRjaFBhcmFtcy50aW1pbmdJbmZvXG5cbiAgLy8gNS4gSWYgcmVxdWVzdOKAmXMgc2VydmljZS13b3JrZXJzIG1vZGUgaXMgXCJhbGxcIiwgdGhlbjpcbiAgaWYgKHJlcXVlc3Quc2VydmljZVdvcmtlcnMgPT09ICdhbGwnKSB7XG4gICAgLy8gVE9ET1xuICB9XG5cbiAgLy8gNi4gSWYgcmVzcG9uc2UgaXMgbnVsbCwgdGhlbjpcbiAgaWYgKHJlc3BvbnNlID09PSBudWxsKSB7XG4gICAgLy8gMS4gSWYgbWFrZUNPUlNQcmVmbGlnaHQgaXMgdHJ1ZSBhbmQgb25lIG9mIHRoZXNlIGNvbmRpdGlvbnMgaXMgdHJ1ZTpcbiAgICAvLyBUT0RPXG5cbiAgICAvLyAyLiBJZiByZXF1ZXN04oCZcyByZWRpcmVjdCBtb2RlIGlzIFwiZm9sbG93XCIsIHRoZW4gc2V0IHJlcXVlc3TigJlzXG4gICAgLy8gc2VydmljZS13b3JrZXJzIG1vZGUgdG8gXCJub25lXCIuXG4gICAgaWYgKHJlcXVlc3QucmVkaXJlY3QgPT09ICdmb2xsb3cnKSB7XG4gICAgICByZXF1ZXN0LnNlcnZpY2VXb3JrZXJzID0gJ25vbmUnXG4gICAgfVxuXG4gICAgLy8gMy4gU2V0IHJlc3BvbnNlIGFuZCBhY3R1YWxSZXNwb25zZSB0byB0aGUgcmVzdWx0IG9mIHJ1bm5pbmdcbiAgICAvLyBIVFRQLW5ldHdvcmstb3ItY2FjaGUgZmV0Y2ggZ2l2ZW4gZmV0Y2hQYXJhbXMuXG4gICAgYWN0dWFsUmVzcG9uc2UgPSByZXNwb25zZSA9IGF3YWl0IGh0dHBOZXR3b3JrT3JDYWNoZUZldGNoKGZldGNoUGFyYW1zKVxuXG4gICAgLy8gNC4gSWYgcmVxdWVzdOKAmXMgcmVzcG9uc2UgdGFpbnRpbmcgaXMgXCJjb3JzXCIgYW5kIGEgQ09SUyBjaGVja1xuICAgIC8vIGZvciByZXF1ZXN0IGFuZCByZXNwb25zZSByZXR1cm5zIGZhaWx1cmUsIHRoZW4gcmV0dXJuIGEgbmV0d29yayBlcnJvci5cbiAgICBpZiAoXG4gICAgICByZXF1ZXN0LnJlc3BvbnNlVGFpbnRpbmcgPT09ICdjb3JzJyAmJlxuICAgICAgY29yc0NoZWNrKHJlcXVlc3QsIHJlc3BvbnNlKSA9PT0gJ2ZhaWx1cmUnXG4gICAgKSB7XG4gICAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcignY29ycyBmYWlsdXJlJylcbiAgICB9XG5cbiAgICAvLyA1LiBJZiB0aGUgVEFPIGNoZWNrIGZvciByZXF1ZXN0IGFuZCByZXNwb25zZSByZXR1cm5zIGZhaWx1cmUsIHRoZW4gc2V0XG4gICAgLy8gcmVxdWVzdOKAmXMgdGltaW5nIGFsbG93IGZhaWxlZCBmbGFnLlxuICAgIGlmIChUQU9DaGVjayhyZXF1ZXN0LCByZXNwb25zZSkgPT09ICdmYWlsdXJlJykge1xuICAgICAgcmVxdWVzdC50aW1pbmdBbGxvd0ZhaWxlZCA9IHRydWVcbiAgICB9XG4gIH1cblxuICAvLyA3LiBJZiBlaXRoZXIgcmVxdWVzdOKAmXMgcmVzcG9uc2UgdGFpbnRpbmcgb3IgcmVzcG9uc2XigJlzIHR5cGVcbiAgLy8gaXMgXCJvcGFxdWVcIiwgYW5kIHRoZSBjcm9zcy1vcmlnaW4gcmVzb3VyY2UgcG9saWN5IGNoZWNrIHdpdGhcbiAgLy8gcmVxdWVzdOKAmXMgb3JpZ2luLCByZXF1ZXN04oCZcyBjbGllbnQsIHJlcXVlc3TigJlzIGRlc3RpbmF0aW9uLFxuICAvLyBhbmQgYWN0dWFsUmVzcG9uc2UgcmV0dXJucyBibG9ja2VkLCB0aGVuIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG4gIGlmIChcbiAgICAocmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnb3BhcXVlJyB8fCByZXNwb25zZS50eXBlID09PSAnb3BhcXVlJykgJiZcbiAgICBjcm9zc09yaWdpblJlc291cmNlUG9saWN5Q2hlY2soXG4gICAgICByZXF1ZXN0Lm9yaWdpbixcbiAgICAgIHJlcXVlc3QuY2xpZW50LFxuICAgICAgcmVxdWVzdC5kZXN0aW5hdGlvbixcbiAgICAgIGFjdHVhbFJlc3BvbnNlXG4gICAgKSA9PT0gJ2Jsb2NrZWQnXG4gICkge1xuICAgIHJldHVybiBtYWtlTmV0d29ya0Vycm9yKCdibG9ja2VkJylcbiAgfVxuXG4gIC8vIDguIElmIGFjdHVhbFJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgYSByZWRpcmVjdCBzdGF0dXMsIHRoZW46XG4gIGlmIChyZWRpcmVjdFN0YXR1c1NldC5oYXMoYWN0dWFsUmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgIC8vIDEuIElmIGFjdHVhbFJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgbm90IDMwMywgcmVxdWVzdOKAmXMgYm9keSBpcyBub3QgbnVsbCxcbiAgICAvLyBhbmQgdGhlIGNvbm5lY3Rpb24gdXNlcyBIVFRQLzIsIHRoZW4gdXNlciBhZ2VudHMgbWF5LCBhbmQgYXJlIGV2ZW5cbiAgICAvLyBlbmNvdXJhZ2VkIHRvLCB0cmFuc21pdCBhbiBSU1RfU1RSRUFNIGZyYW1lLlxuICAgIC8vIFNlZSwgaHR0cHM6Ly9naXRodWIuY29tL3doYXR3Zy9mZXRjaC9pc3N1ZXMvMTI4OFxuICAgIGlmIChyZXF1ZXN0LnJlZGlyZWN0ICE9PSAnbWFudWFsJykge1xuICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb25uZWN0aW9uLmRlc3Ryb3koKVxuICAgIH1cblxuICAgIC8vIDIuIFN3aXRjaCBvbiByZXF1ZXN04oCZcyByZWRpcmVjdCBtb2RlOlxuICAgIGlmIChyZXF1ZXN0LnJlZGlyZWN0ID09PSAnZXJyb3InKSB7XG4gICAgICAvLyBTZXQgcmVzcG9uc2UgdG8gYSBuZXR3b3JrIGVycm9yLlxuICAgICAgcmVzcG9uc2UgPSBtYWtlTmV0d29ya0Vycm9yKCd1bmV4cGVjdGVkIHJlZGlyZWN0JylcbiAgICB9IGVsc2UgaWYgKHJlcXVlc3QucmVkaXJlY3QgPT09ICdtYW51YWwnKSB7XG4gICAgICAvLyBTZXQgcmVzcG9uc2UgdG8gYW4gb3BhcXVlLXJlZGlyZWN0IGZpbHRlcmVkIHJlc3BvbnNlIHdob3NlIGludGVybmFsXG4gICAgICAvLyByZXNwb25zZSBpcyBhY3R1YWxSZXNwb25zZS5cbiAgICAgIC8vIE5PVEUoc3BlYyk6IE9uIHRoZSB3ZWIgdGhpcyB3b3VsZCByZXR1cm4gYW4gYG9wYXF1ZXJlZGlyZWN0YCByZXNwb25zZSxcbiAgICAgIC8vIGJ1dCB0aGF0IGRvZXNuJ3QgbWFrZSBzZW5zZSBzZXJ2ZXIgc2lkZS5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9pc3N1ZXMvMTE5My5cbiAgICAgIHJlc3BvbnNlID0gYWN0dWFsUmVzcG9uc2VcbiAgICB9IGVsc2UgaWYgKHJlcXVlc3QucmVkaXJlY3QgPT09ICdmb2xsb3cnKSB7XG4gICAgICAvLyBTZXQgcmVzcG9uc2UgdG8gdGhlIHJlc3VsdCBvZiBydW5uaW5nIEhUVFAtcmVkaXJlY3QgZmV0Y2ggZ2l2ZW5cbiAgICAgIC8vIGZldGNoUGFyYW1zIGFuZCByZXNwb25zZS5cbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgaHR0cFJlZGlyZWN0RmV0Y2goZmV0Y2hQYXJhbXMsIHJlc3BvbnNlKVxuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgLy8gOS4gU2V0IHJlc3BvbnNl4oCZcyB0aW1pbmcgaW5mbyB0byB0aW1pbmdJbmZvLlxuICByZXNwb25zZS50aW1pbmdJbmZvID0gdGltaW5nSW5mb1xuXG4gIC8vIDEwLiBSZXR1cm4gcmVzcG9uc2UuXG4gIHJldHVybiByZXNwb25zZVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaHR0cC1yZWRpcmVjdC1mZXRjaFxuZnVuY3Rpb24gaHR0cFJlZGlyZWN0RmV0Y2ggKGZldGNoUGFyYW1zLCByZXNwb25zZSkge1xuICAvLyAxLiBMZXQgcmVxdWVzdCBiZSBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdC5cbiAgY29uc3QgcmVxdWVzdCA9IGZldGNoUGFyYW1zLnJlcXVlc3RcblxuICAvLyAyLiBMZXQgYWN0dWFsUmVzcG9uc2UgYmUgcmVzcG9uc2UsIGlmIHJlc3BvbnNlIGlzIG5vdCBhIGZpbHRlcmVkIHJlc3BvbnNlLFxuICAvLyBhbmQgcmVzcG9uc2XigJlzIGludGVybmFsIHJlc3BvbnNlIG90aGVyd2lzZS5cbiAgY29uc3QgYWN0dWFsUmVzcG9uc2UgPSByZXNwb25zZS5pbnRlcm5hbFJlc3BvbnNlXG4gICAgPyByZXNwb25zZS5pbnRlcm5hbFJlc3BvbnNlXG4gICAgOiByZXNwb25zZVxuXG4gIC8vIDMuIExldCBsb2NhdGlvblVSTCBiZSBhY3R1YWxSZXNwb25zZeKAmXMgbG9jYXRpb24gVVJMIGdpdmVuIHJlcXVlc3TigJlzIGN1cnJlbnRcbiAgLy8gVVJM4oCZcyBmcmFnbWVudC5cbiAgbGV0IGxvY2F0aW9uVVJMXG5cbiAgdHJ5IHtcbiAgICBsb2NhdGlvblVSTCA9IHJlc3BvbnNlTG9jYXRpb25VUkwoXG4gICAgICBhY3R1YWxSZXNwb25zZSxcbiAgICAgIHJlcXVlc3RDdXJyZW50VVJMKHJlcXVlc3QpLmhhc2hcbiAgICApXG5cbiAgICAvLyA0LiBJZiBsb2NhdGlvblVSTCBpcyBudWxsLCB0aGVuIHJldHVybiByZXNwb25zZS5cbiAgICBpZiAobG9jYXRpb25VUkwgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlXG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyA1LiBJZiBsb2NhdGlvblVSTCBpcyBmYWlsdXJlLCB0aGVuIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlTmV0d29ya0Vycm9yKGVycikpXG4gIH1cblxuICAvLyA2LiBJZiBsb2NhdGlvblVSTOKAmXMgc2NoZW1lIGlzIG5vdCBhbiBIVFRQKFMpIHNjaGVtZSwgdGhlbiByZXR1cm4gYSBuZXR3b3JrXG4gIC8vIGVycm9yLlxuICBpZiAoIXVybElzSHR0cEh0dHBzU2NoZW1lKGxvY2F0aW9uVVJMKSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFrZU5ldHdvcmtFcnJvcignVVJMIHNjaGVtZSBtdXN0IGJlIGEgSFRUUChTKSBzY2hlbWUnKSlcbiAgfVxuXG4gIC8vIDcuIElmIHJlcXVlc3TigJlzIHJlZGlyZWN0IGNvdW50IGlzIDIwLCB0aGVuIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG4gIGlmIChyZXF1ZXN0LnJlZGlyZWN0Q291bnQgPT09IDIwKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlTmV0d29ya0Vycm9yKCdyZWRpcmVjdCBjb3VudCBleGNlZWRlZCcpKVxuICB9XG5cbiAgLy8gOC4gSW5jcmVhc2UgcmVxdWVzdOKAmXMgcmVkaXJlY3QgY291bnQgYnkgMS5cbiAgcmVxdWVzdC5yZWRpcmVjdENvdW50ICs9IDFcblxuICAvLyA5LiBJZiByZXF1ZXN04oCZcyBtb2RlIGlzIFwiY29yc1wiLCBsb2NhdGlvblVSTCBpbmNsdWRlcyBjcmVkZW50aWFscywgYW5kXG4gIC8vIHJlcXVlc3TigJlzIG9yaWdpbiBpcyBub3Qgc2FtZSBvcmlnaW4gd2l0aCBsb2NhdGlvblVSTOKAmXMgb3JpZ2luLCB0aGVuIHJldHVyblxuICAvLyAgYSBuZXR3b3JrIGVycm9yLlxuICBpZiAoXG4gICAgcmVxdWVzdC5tb2RlID09PSAnY29ycycgJiZcbiAgICAobG9jYXRpb25VUkwudXNlcm5hbWUgfHwgbG9jYXRpb25VUkwucGFzc3dvcmQpICYmXG4gICAgIXNhbWVPcmlnaW4ocmVxdWVzdCwgbG9jYXRpb25VUkwpXG4gICkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFrZU5ldHdvcmtFcnJvcignY3Jvc3Mgb3JpZ2luIG5vdCBhbGxvd2VkIGZvciByZXF1ZXN0IG1vZGUgXCJjb3JzXCInKSlcbiAgfVxuXG4gIC8vIDEwLiBJZiByZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZyBpcyBcImNvcnNcIiBhbmQgbG9jYXRpb25VUkwgaW5jbHVkZXNcbiAgLy8gY3JlZGVudGlhbHMsIHRoZW4gcmV0dXJuIGEgbmV0d29yayBlcnJvci5cbiAgaWYgKFxuICAgIHJlcXVlc3QucmVzcG9uc2VUYWludGluZyA9PT0gJ2NvcnMnICYmXG4gICAgKGxvY2F0aW9uVVJMLnVzZXJuYW1lIHx8IGxvY2F0aW9uVVJMLnBhc3N3b3JkKVxuICApIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VOZXR3b3JrRXJyb3IoXG4gICAgICAnVVJMIGNhbm5vdCBjb250YWluIGNyZWRlbnRpYWxzIGZvciByZXF1ZXN0IG1vZGUgXCJjb3JzXCInXG4gICAgKSlcbiAgfVxuXG4gIC8vIDExLiBJZiBhY3R1YWxSZXNwb25zZeKAmXMgc3RhdHVzIGlzIG5vdCAzMDMsIHJlcXVlc3TigJlzIGJvZHkgaXMgbm9uLW51bGwsXG4gIC8vIGFuZCByZXF1ZXN04oCZcyBib2R54oCZcyBzb3VyY2UgaXMgbnVsbCwgdGhlbiByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICBpZiAoXG4gICAgYWN0dWFsUmVzcG9uc2Uuc3RhdHVzICE9PSAzMDMgJiZcbiAgICByZXF1ZXN0LmJvZHkgIT0gbnVsbCAmJlxuICAgIHJlcXVlc3QuYm9keS5zb3VyY2UgPT0gbnVsbFxuICApIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VOZXR3b3JrRXJyb3IoKSlcbiAgfVxuXG4gIC8vIDEyLiBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlXG4gIC8vIC0gYWN0dWFsUmVzcG9uc2XigJlzIHN0YXR1cyBpcyAzMDEgb3IgMzAyIGFuZCByZXF1ZXN04oCZcyBtZXRob2QgaXMgYFBPU1RgXG4gIC8vIC0gYWN0dWFsUmVzcG9uc2XigJlzIHN0YXR1cyBpcyAzMDMgYW5kIHJlcXVlc3TigJlzIG1ldGhvZCBpcyBub3QgYEdFVGAgb3IgYEhFQURgXG4gIGlmIChcbiAgICAoWzMwMSwgMzAyXS5pbmNsdWRlcyhhY3R1YWxSZXNwb25zZS5zdGF0dXMpICYmIHJlcXVlc3QubWV0aG9kID09PSAnUE9TVCcpIHx8XG4gICAgKGFjdHVhbFJlc3BvbnNlLnN0YXR1cyA9PT0gMzAzICYmXG4gICAgICAhR0VUX09SX0hFQUQuaW5jbHVkZXMocmVxdWVzdC5tZXRob2QpKVxuICApIHtcbiAgICAvLyB0aGVuOlxuICAgIC8vIDEuIFNldCByZXF1ZXN04oCZcyBtZXRob2QgdG8gYEdFVGAgYW5kIHJlcXVlc3TigJlzIGJvZHkgdG8gbnVsbC5cbiAgICByZXF1ZXN0Lm1ldGhvZCA9ICdHRVQnXG4gICAgcmVxdWVzdC5ib2R5ID0gbnVsbFxuXG4gICAgLy8gMi4gRm9yIGVhY2ggaGVhZGVyTmFtZSBvZiByZXF1ZXN0LWJvZHktaGVhZGVyIG5hbWUsIGRlbGV0ZSBoZWFkZXJOYW1lIGZyb21cbiAgICAvLyByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgICBmb3IgKGNvbnN0IGhlYWRlck5hbWUgb2YgcmVxdWVzdEJvZHlIZWFkZXIpIHtcbiAgICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QuZGVsZXRlKGhlYWRlck5hbWUpXG4gICAgfVxuICB9XG5cbiAgLy8gMTMuIElmIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBvcmlnaW4gaXMgbm90IHNhbWUgb3JpZ2luIHdpdGggbG9jYXRpb25VUkzigJlzXG4gIC8vICAgICBvcmlnaW4sIHRoZW4gZm9yIGVhY2ggaGVhZGVyTmFtZSBvZiBDT1JTIG5vbi13aWxkY2FyZCByZXF1ZXN0LWhlYWRlciBuYW1lLFxuICAvLyAgICAgZGVsZXRlIGhlYWRlck5hbWUgZnJvbSByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgaWYgKCFzYW1lT3JpZ2luKHJlcXVlc3RDdXJyZW50VVJMKHJlcXVlc3QpLCBsb2NhdGlvblVSTCkpIHtcbiAgICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29ycy1ub24td2lsZGNhcmQtcmVxdWVzdC1oZWFkZXItbmFtZVxuICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QuZGVsZXRlKCdhdXRob3JpemF0aW9uJylcblxuICAgIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNhdXRoZW50aWNhdGlvbi1lbnRyaWVzXG4gICAgcmVxdWVzdC5oZWFkZXJzTGlzdC5kZWxldGUoJ3Byb3h5LWF1dGhvcml6YXRpb24nLCB0cnVlKVxuXG4gICAgLy8gXCJDb29raWVcIiBhbmQgXCJIb3N0XCIgYXJlIGZvcmJpZGRlbiByZXF1ZXN0LWhlYWRlcnMsIHdoaWNoIHVuZGljaSBkb2Vzbid0IGltcGxlbWVudC5cbiAgICByZXF1ZXN0LmhlYWRlcnNMaXN0LmRlbGV0ZSgnY29va2llJylcbiAgICByZXF1ZXN0LmhlYWRlcnNMaXN0LmRlbGV0ZSgnaG9zdCcpXG4gIH1cblxuICAvLyAxNC4gSWYgcmVxdWVzdOKAmXMgYm9keSBpcyBub24tbnVsbCwgdGhlbiBzZXQgcmVxdWVzdOKAmXMgYm9keSB0byB0aGUgZmlyc3QgcmV0dXJuXG4gIC8vIHZhbHVlIG9mIHNhZmVseSBleHRyYWN0aW5nIHJlcXVlc3TigJlzIGJvZHnigJlzIHNvdXJjZS5cbiAgaWYgKHJlcXVlc3QuYm9keSAhPSBudWxsKSB7XG4gICAgYXNzZXJ0KHJlcXVlc3QuYm9keS5zb3VyY2UgIT0gbnVsbClcbiAgICByZXF1ZXN0LmJvZHkgPSBzYWZlbHlFeHRyYWN0Qm9keShyZXF1ZXN0LmJvZHkuc291cmNlKVswXVxuICB9XG5cbiAgLy8gMTUuIExldCB0aW1pbmdJbmZvIGJlIGZldGNoUGFyYW1z4oCZcyB0aW1pbmcgaW5mby5cbiAgY29uc3QgdGltaW5nSW5mbyA9IGZldGNoUGFyYW1zLnRpbWluZ0luZm9cblxuICAvLyAxNi4gU2V0IHRpbWluZ0luZm/igJlzIHJlZGlyZWN0IGVuZCB0aW1lIGFuZCBwb3N0LXJlZGlyZWN0IHN0YXJ0IHRpbWUgdG8gdGhlXG4gIC8vIGNvYXJzZW5lZCBzaGFyZWQgY3VycmVudCB0aW1lIGdpdmVuIGZldGNoUGFyYW1z4oCZcyBjcm9zcy1vcmlnaW4gaXNvbGF0ZWRcbiAgLy8gY2FwYWJpbGl0eS5cbiAgdGltaW5nSW5mby5yZWRpcmVjdEVuZFRpbWUgPSB0aW1pbmdJbmZvLnBvc3RSZWRpcmVjdFN0YXJ0VGltZSA9XG4gICAgY29hcnNlbmVkU2hhcmVkQ3VycmVudFRpbWUoZmV0Y2hQYXJhbXMuY3Jvc3NPcmlnaW5Jc29sYXRlZENhcGFiaWxpdHkpXG5cbiAgLy8gMTcuIElmIHRpbWluZ0luZm/igJlzIHJlZGlyZWN0IHN0YXJ0IHRpbWUgaXMgMCwgdGhlbiBzZXQgdGltaW5nSW5mb+KAmXNcbiAgLy8gIHJlZGlyZWN0IHN0YXJ0IHRpbWUgdG8gdGltaW5nSW5mb+KAmXMgc3RhcnQgdGltZS5cbiAgaWYgKHRpbWluZ0luZm8ucmVkaXJlY3RTdGFydFRpbWUgPT09IDApIHtcbiAgICB0aW1pbmdJbmZvLnJlZGlyZWN0U3RhcnRUaW1lID0gdGltaW5nSW5mby5zdGFydFRpbWVcbiAgfVxuXG4gIC8vIDE4LiBBcHBlbmQgbG9jYXRpb25VUkwgdG8gcmVxdWVzdOKAmXMgVVJMIGxpc3QuXG4gIHJlcXVlc3QudXJsTGlzdC5wdXNoKGxvY2F0aW9uVVJMKVxuXG4gIC8vIDE5LiBJbnZva2Ugc2V0IHJlcXVlc3TigJlzIHJlZmVycmVyIHBvbGljeSBvbiByZWRpcmVjdCBvbiByZXF1ZXN0IGFuZFxuICAvLyBhY3R1YWxSZXNwb25zZS5cbiAgc2V0UmVxdWVzdFJlZmVycmVyUG9saWN5T25SZWRpcmVjdChyZXF1ZXN0LCBhY3R1YWxSZXNwb25zZSlcblxuICAvLyAyMC4gUmV0dXJuIHRoZSByZXN1bHQgb2YgcnVubmluZyBtYWluIGZldGNoIGdpdmVuIGZldGNoUGFyYW1zIGFuZCB0cnVlLlxuICByZXR1cm4gbWFpbkZldGNoKGZldGNoUGFyYW1zLCB0cnVlKVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaHR0cC1uZXR3b3JrLW9yLWNhY2hlLWZldGNoXG5hc3luYyBmdW5jdGlvbiBodHRwTmV0d29ya09yQ2FjaGVGZXRjaCAoXG4gIGZldGNoUGFyYW1zLFxuICBpc0F1dGhlbnRpY2F0aW9uRmV0Y2ggPSBmYWxzZSxcbiAgaXNOZXdDb25uZWN0aW9uRmV0Y2ggPSBmYWxzZVxuKSB7XG4gIC8vIDEuIExldCByZXF1ZXN0IGJlIGZldGNoUGFyYW1z4oCZcyByZXF1ZXN0LlxuICBjb25zdCByZXF1ZXN0ID0gZmV0Y2hQYXJhbXMucmVxdWVzdFxuXG4gIC8vIDIuIExldCBodHRwRmV0Y2hQYXJhbXMgYmUgbnVsbC5cbiAgbGV0IGh0dHBGZXRjaFBhcmFtcyA9IG51bGxcblxuICAvLyAzLiBMZXQgaHR0cFJlcXVlc3QgYmUgbnVsbC5cbiAgbGV0IGh0dHBSZXF1ZXN0ID0gbnVsbFxuXG4gIC8vIDQuIExldCByZXNwb25zZSBiZSBudWxsLlxuICBsZXQgcmVzcG9uc2UgPSBudWxsXG5cbiAgLy8gNS4gTGV0IHN0b3JlZFJlc3BvbnNlIGJlIG51bGwuXG4gIC8vIFRPRE86IGNhY2hlXG5cbiAgLy8gNi4gTGV0IGh0dHBDYWNoZSBiZSBudWxsLlxuICBjb25zdCBodHRwQ2FjaGUgPSBudWxsXG5cbiAgLy8gNy4gTGV0IHRoZSByZXZhbGlkYXRpbmdGbGFnIGJlIHVuc2V0LlxuICBjb25zdCByZXZhbGlkYXRpbmdGbGFnID0gZmFsc2VcblxuICAvLyA4LiBSdW4gdGhlc2Ugc3RlcHMsIGJ1dCBhYm9ydCB3aGVuIHRoZSBvbmdvaW5nIGZldGNoIGlzIHRlcm1pbmF0ZWQ6XG5cbiAgLy8gICAgMS4gSWYgcmVxdWVzdOKAmXMgd2luZG93IGlzIFwibm8td2luZG93XCIgYW5kIHJlcXVlc3TigJlzIHJlZGlyZWN0IG1vZGUgaXNcbiAgLy8gICAgXCJlcnJvclwiLCB0aGVuIHNldCBodHRwRmV0Y2hQYXJhbXMgdG8gZmV0Y2hQYXJhbXMgYW5kIGh0dHBSZXF1ZXN0IHRvXG4gIC8vICAgIHJlcXVlc3QuXG4gIGlmIChyZXF1ZXN0LndpbmRvdyA9PT0gJ25vLXdpbmRvdycgJiYgcmVxdWVzdC5yZWRpcmVjdCA9PT0gJ2Vycm9yJykge1xuICAgIGh0dHBGZXRjaFBhcmFtcyA9IGZldGNoUGFyYW1zXG4gICAgaHR0cFJlcXVlc3QgPSByZXF1ZXN0XG4gIH0gZWxzZSB7XG4gICAgLy8gT3RoZXJ3aXNlOlxuXG4gICAgLy8gMS4gU2V0IGh0dHBSZXF1ZXN0IHRvIGEgY2xvbmUgb2YgcmVxdWVzdC5cbiAgICBodHRwUmVxdWVzdCA9IG1ha2VSZXF1ZXN0KHJlcXVlc3QpXG5cbiAgICAvLyAyLiBTZXQgaHR0cEZldGNoUGFyYW1zIHRvIGEgY29weSBvZiBmZXRjaFBhcmFtcy5cbiAgICBodHRwRmV0Y2hQYXJhbXMgPSB7IC4uLmZldGNoUGFyYW1zIH1cblxuICAgIC8vIDMuIFNldCBodHRwRmV0Y2hQYXJhbXPigJlzIHJlcXVlc3QgdG8gaHR0cFJlcXVlc3QuXG4gICAgaHR0cEZldGNoUGFyYW1zLnJlcXVlc3QgPSBodHRwUmVxdWVzdFxuICB9XG5cbiAgLy8gICAgMy4gTGV0IGluY2x1ZGVDcmVkZW50aWFscyBiZSB0cnVlIGlmIG9uZSBvZlxuICBjb25zdCBpbmNsdWRlQ3JlZGVudGlhbHMgPVxuICAgIHJlcXVlc3QuY3JlZGVudGlhbHMgPT09ICdpbmNsdWRlJyB8fFxuICAgIChyZXF1ZXN0LmNyZWRlbnRpYWxzID09PSAnc2FtZS1vcmlnaW4nICYmXG4gICAgICByZXF1ZXN0LnJlc3BvbnNlVGFpbnRpbmcgPT09ICdiYXNpYycpXG5cbiAgLy8gICAgNC4gTGV0IGNvbnRlbnRMZW5ndGggYmUgaHR0cFJlcXVlc3TigJlzIGJvZHnigJlzIGxlbmd0aCwgaWYgaHR0cFJlcXVlc3TigJlzXG4gIC8vICAgIGJvZHkgaXMgbm9uLW51bGw7IG90aGVyd2lzZSBudWxsLlxuICBjb25zdCBjb250ZW50TGVuZ3RoID0gaHR0cFJlcXVlc3QuYm9keSA/IGh0dHBSZXF1ZXN0LmJvZHkubGVuZ3RoIDogbnVsbFxuXG4gIC8vICAgIDUuIExldCBjb250ZW50TGVuZ3RoSGVhZGVyVmFsdWUgYmUgbnVsbC5cbiAgbGV0IGNvbnRlbnRMZW5ndGhIZWFkZXJWYWx1ZSA9IG51bGxcblxuICAvLyAgICA2LiBJZiBodHRwUmVxdWVzdOKAmXMgYm9keSBpcyBudWxsIGFuZCBodHRwUmVxdWVzdOKAmXMgbWV0aG9kIGlzIGBQT1NUYCBvclxuICAvLyAgICBgUFVUYCwgdGhlbiBzZXQgY29udGVudExlbmd0aEhlYWRlclZhbHVlIHRvIGAwYC5cbiAgaWYgKFxuICAgIGh0dHBSZXF1ZXN0LmJvZHkgPT0gbnVsbCAmJlxuICAgIFsnUE9TVCcsICdQVVQnXS5pbmNsdWRlcyhodHRwUmVxdWVzdC5tZXRob2QpXG4gICkge1xuICAgIGNvbnRlbnRMZW5ndGhIZWFkZXJWYWx1ZSA9ICcwJ1xuICB9XG5cbiAgLy8gICAgNy4gSWYgY29udGVudExlbmd0aCBpcyBub24tbnVsbCwgdGhlbiBzZXQgY29udGVudExlbmd0aEhlYWRlclZhbHVlIHRvXG4gIC8vICAgIGNvbnRlbnRMZW5ndGgsIHNlcmlhbGl6ZWQgYW5kIGlzb21vcnBoaWMgZW5jb2RlZC5cbiAgaWYgKGNvbnRlbnRMZW5ndGggIT0gbnVsbCkge1xuICAgIGNvbnRlbnRMZW5ndGhIZWFkZXJWYWx1ZSA9IGlzb21vcnBoaWNFbmNvZGUoYCR7Y29udGVudExlbmd0aH1gKVxuICB9XG5cbiAgLy8gICAgOC4gSWYgY29udGVudExlbmd0aEhlYWRlclZhbHVlIGlzIG5vbi1udWxsLCB0aGVuIGFwcGVuZFxuICAvLyAgICBgQ29udGVudC1MZW5ndGhgL2NvbnRlbnRMZW5ndGhIZWFkZXJWYWx1ZSB0byBodHRwUmVxdWVzdOKAmXMgaGVhZGVyXG4gIC8vICAgIGxpc3QuXG4gIGlmIChjb250ZW50TGVuZ3RoSGVhZGVyVmFsdWUgIT0gbnVsbCkge1xuICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgnY29udGVudC1sZW5ndGgnLCBjb250ZW50TGVuZ3RoSGVhZGVyVmFsdWUpXG4gIH1cblxuICAvLyAgICA5LiBJZiBjb250ZW50TGVuZ3RoSGVhZGVyVmFsdWUgaXMgbm9uLW51bGwsIHRoZW4gYXBwZW5kIChgQ29udGVudC1MZW5ndGhgLFxuICAvLyAgICBjb250ZW50TGVuZ3RoSGVhZGVyVmFsdWUpIHRvIGh0dHBSZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cblxuICAvLyAgICAxMC4gSWYgY29udGVudExlbmd0aCBpcyBub24tbnVsbCBhbmQgaHR0cFJlcXVlc3TigJlzIGtlZXBhbGl2ZSBpcyB0cnVlLFxuICAvLyAgICB0aGVuOlxuICBpZiAoY29udGVudExlbmd0aCAhPSBudWxsICYmIGh0dHBSZXF1ZXN0LmtlZXBhbGl2ZSkge1xuICAgIC8vIE5PVEU6IGtlZXBhbGl2ZSBpcyBhIG5vb3Agb3V0c2lkZSBvZiBicm93c2VyIGNvbnRleHQuXG4gIH1cblxuICAvLyAgICAxMS4gSWYgaHR0cFJlcXVlc3TigJlzIHJlZmVycmVyIGlzIGEgVVJMLCB0aGVuIGFwcGVuZFxuICAvLyAgICBgUmVmZXJlcmAvaHR0cFJlcXVlc3TigJlzIHJlZmVycmVyLCBzZXJpYWxpemVkIGFuZCBpc29tb3JwaGljIGVuY29kZWQsXG4gIC8vICAgICB0byBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gIGlmIChodHRwUmVxdWVzdC5yZWZlcnJlciBpbnN0YW5jZW9mIFVSTCkge1xuICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgncmVmZXJlcicsIGlzb21vcnBoaWNFbmNvZGUoaHR0cFJlcXVlc3QucmVmZXJyZXIuaHJlZikpXG4gIH1cblxuICAvLyAgICAxMi4gQXBwZW5kIGEgcmVxdWVzdCBgT3JpZ2luYCBoZWFkZXIgZm9yIGh0dHBSZXF1ZXN0LlxuICBhcHBlbmRSZXF1ZXN0T3JpZ2luSGVhZGVyKGh0dHBSZXF1ZXN0KVxuXG4gIC8vICAgIDEzLiBBcHBlbmQgdGhlIEZldGNoIG1ldGFkYXRhIGhlYWRlcnMgZm9yIGh0dHBSZXF1ZXN0LiBbRkVUQ0gtTUVUQURBVEFdXG4gIGFwcGVuZEZldGNoTWV0YWRhdGEoaHR0cFJlcXVlc3QpXG5cbiAgLy8gICAgMTQuIElmIGh0dHBSZXF1ZXN04oCZcyBoZWFkZXIgbGlzdCBkb2VzIG5vdCBjb250YWluIGBVc2VyLUFnZW50YCwgdGhlblxuICAvLyAgICB1c2VyIGFnZW50cyBzaG91bGQgYXBwZW5kIGBVc2VyLUFnZW50YC9kZWZhdWx0IGBVc2VyLUFnZW50YCB2YWx1ZSB0b1xuICAvLyAgICBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gIGlmICghaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuY29udGFpbnMoJ3VzZXItYWdlbnQnKSkge1xuICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgndXNlci1hZ2VudCcsIHR5cGVvZiBlc2J1aWxkRGV0ZWN0aW9uID09PSAndW5kZWZpbmVkJyA/ICd1bmRpY2knIDogJ25vZGUnKVxuICB9XG5cbiAgLy8gICAgMTUuIElmIGh0dHBSZXF1ZXN04oCZcyBjYWNoZSBtb2RlIGlzIFwiZGVmYXVsdFwiIGFuZCBodHRwUmVxdWVzdOKAmXMgaGVhZGVyXG4gIC8vICAgIGxpc3QgY29udGFpbnMgYElmLU1vZGlmaWVkLVNpbmNlYCwgYElmLU5vbmUtTWF0Y2hgLFxuICAvLyAgICBgSWYtVW5tb2RpZmllZC1TaW5jZWAsIGBJZi1NYXRjaGAsIG9yIGBJZi1SYW5nZWAsIHRoZW4gc2V0XG4gIC8vICAgIGh0dHBSZXF1ZXN04oCZcyBjYWNoZSBtb2RlIHRvIFwibm8tc3RvcmVcIi5cbiAgaWYgKFxuICAgIGh0dHBSZXF1ZXN0LmNhY2hlID09PSAnZGVmYXVsdCcgJiZcbiAgICAoaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuY29udGFpbnMoJ2lmLW1vZGlmaWVkLXNpbmNlJykgfHxcbiAgICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCdpZi1ub25lLW1hdGNoJykgfHxcbiAgICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCdpZi11bm1vZGlmaWVkLXNpbmNlJykgfHxcbiAgICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCdpZi1tYXRjaCcpIHx8XG4gICAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygnaWYtcmFuZ2UnKSlcbiAgKSB7XG4gICAgaHR0cFJlcXVlc3QuY2FjaGUgPSAnbm8tc3RvcmUnXG4gIH1cblxuICAvLyAgICAxNi4gSWYgaHR0cFJlcXVlc3TigJlzIGNhY2hlIG1vZGUgaXMgXCJuby1jYWNoZVwiLCBodHRwUmVxdWVzdOKAmXMgcHJldmVudFxuICAvLyAgICBuby1jYWNoZSBjYWNoZS1jb250cm9sIGhlYWRlciBtb2RpZmljYXRpb24gZmxhZyBpcyB1bnNldCwgYW5kXG4gIC8vICAgIGh0dHBSZXF1ZXN04oCZcyBoZWFkZXIgbGlzdCBkb2VzIG5vdCBjb250YWluIGBDYWNoZS1Db250cm9sYCwgdGhlbiBhcHBlbmRcbiAgLy8gICAgYENhY2hlLUNvbnRyb2xgL2BtYXgtYWdlPTBgIHRvIGh0dHBSZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgaWYgKFxuICAgIGh0dHBSZXF1ZXN0LmNhY2hlID09PSAnbm8tY2FjaGUnICYmXG4gICAgIWh0dHBSZXF1ZXN0LnByZXZlbnROb0NhY2hlQ2FjaGVDb250cm9sSGVhZGVyTW9kaWZpY2F0aW9uICYmXG4gICAgIWh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCdjYWNoZS1jb250cm9sJylcbiAgKSB7XG4gICAgaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdjYWNoZS1jb250cm9sJywgJ21heC1hZ2U9MCcpXG4gIH1cblxuICAvLyAgICAxNy4gSWYgaHR0cFJlcXVlc3TigJlzIGNhY2hlIG1vZGUgaXMgXCJuby1zdG9yZVwiIG9yIFwicmVsb2FkXCIsIHRoZW46XG4gIGlmIChodHRwUmVxdWVzdC5jYWNoZSA9PT0gJ25vLXN0b3JlJyB8fCBodHRwUmVxdWVzdC5jYWNoZSA9PT0gJ3JlbG9hZCcpIHtcbiAgICAvLyAxLiBJZiBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgZG9lcyBub3QgY29udGFpbiBgUHJhZ21hYCwgdGhlbiBhcHBlbmRcbiAgICAvLyBgUHJhZ21hYC9gbm8tY2FjaGVgIHRvIGh0dHBSZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgICBpZiAoIWh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCdwcmFnbWEnKSkge1xuICAgICAgaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdwcmFnbWEnLCAnbm8tY2FjaGUnKVxuICAgIH1cblxuICAgIC8vIDIuIElmIGh0dHBSZXF1ZXN04oCZcyBoZWFkZXIgbGlzdCBkb2VzIG5vdCBjb250YWluIGBDYWNoZS1Db250cm9sYCxcbiAgICAvLyB0aGVuIGFwcGVuZCBgQ2FjaGUtQ29udHJvbGAvYG5vLWNhY2hlYCB0byBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gICAgaWYgKCFodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygnY2FjaGUtY29udHJvbCcpKSB7XG4gICAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ2NhY2hlLWNvbnRyb2wnLCAnbm8tY2FjaGUnKVxuICAgIH1cbiAgfVxuXG4gIC8vICAgIDE4LiBJZiBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgY29udGFpbnMgYFJhbmdlYCwgdGhlbiBhcHBlbmRcbiAgLy8gICAgYEFjY2VwdC1FbmNvZGluZ2AvYGlkZW50aXR5YCB0byBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gIGlmIChodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygncmFuZ2UnKSkge1xuICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgnYWNjZXB0LWVuY29kaW5nJywgJ2lkZW50aXR5JylcbiAgfVxuXG4gIC8vICAgIDE5LiBNb2RpZnkgaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0IHBlciBIVFRQLiBEbyBub3QgYXBwZW5kIGEgZ2l2ZW5cbiAgLy8gICAgaGVhZGVyIGlmIGh0dHBSZXF1ZXN04oCZcyBoZWFkZXIgbGlzdCBjb250YWlucyB0aGF0IGhlYWRlcuKAmXMgbmFtZS5cbiAgLy8gICAgVE9ETzogaHR0cHM6Ly9naXRodWIuY29tL3doYXR3Zy9mZXRjaC9pc3N1ZXMvMTI4NSNpc3N1ZWNvbW1lbnQtODk2NTYwMTI5XG4gIGlmICghaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuY29udGFpbnMoJ2FjY2VwdC1lbmNvZGluZycpKSB7XG4gICAgaWYgKHVybEhhc0h0dHBzU2NoZW1lKHJlcXVlc3RDdXJyZW50VVJMKGh0dHBSZXF1ZXN0KSkpIHtcbiAgICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgnYWNjZXB0LWVuY29kaW5nJywgJ2JyLCBnemlwLCBkZWZsYXRlJylcbiAgICB9IGVsc2Uge1xuICAgICAgaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdhY2NlcHQtZW5jb2RpbmcnLCAnZ3ppcCwgZGVmbGF0ZScpXG4gICAgfVxuICB9XG5cbiAgaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuZGVsZXRlKCdob3N0JylcblxuICAvLyAgICAyMC4gSWYgaW5jbHVkZUNyZWRlbnRpYWxzIGlzIHRydWUsIHRoZW46XG4gIGlmIChpbmNsdWRlQ3JlZGVudGlhbHMpIHtcbiAgICAvLyAxLiBJZiB0aGUgdXNlciBhZ2VudCBpcyBub3QgY29uZmlndXJlZCB0byBibG9jayBjb29raWVzIGZvciBodHRwUmVxdWVzdFxuICAgIC8vIChzZWUgc2VjdGlvbiA3IG9mIFtDT09LSUVTXSksIHRoZW46XG4gICAgLy8gVE9ETzogY3JlZGVudGlhbHNcbiAgICAvLyAyLiBJZiBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgZG9lcyBub3QgY29udGFpbiBgQXV0aG9yaXphdGlvbmAsIHRoZW46XG4gICAgLy8gVE9ETzogY3JlZGVudGlhbHNcbiAgfVxuXG4gIC8vICAgIDIxLiBJZiB0aGVyZeKAmXMgYSBwcm94eS1hdXRoZW50aWNhdGlvbiBlbnRyeSwgdXNlIGl0IGFzIGFwcHJvcHJpYXRlLlxuICAvLyAgICBUT0RPOiBwcm94eS1hdXRoZW50aWNhdGlvblxuXG4gIC8vICAgIDIyLiBTZXQgaHR0cENhY2hlIHRvIHRoZSByZXN1bHQgb2YgZGV0ZXJtaW5pbmcgdGhlIEhUVFAgY2FjaGVcbiAgLy8gICAgcGFydGl0aW9uLCBnaXZlbiBodHRwUmVxdWVzdC5cbiAgLy8gICAgVE9ETzogY2FjaGVcblxuICAvLyAgICAyMy4gSWYgaHR0cENhY2hlIGlzIG51bGwsIHRoZW4gc2V0IGh0dHBSZXF1ZXN04oCZcyBjYWNoZSBtb2RlIHRvXG4gIC8vICAgIFwibm8tc3RvcmVcIi5cbiAgaWYgKGh0dHBDYWNoZSA9PSBudWxsKSB7XG4gICAgaHR0cFJlcXVlc3QuY2FjaGUgPSAnbm8tc3RvcmUnXG4gIH1cblxuICAvLyAgICAyNC4gSWYgaHR0cFJlcXVlc3TigJlzIGNhY2hlIG1vZGUgaXMgbmVpdGhlciBcIm5vLXN0b3JlXCIgbm9yIFwicmVsb2FkXCIsXG4gIC8vICAgIHRoZW46XG4gIGlmIChodHRwUmVxdWVzdC5tb2RlICE9PSAnbm8tc3RvcmUnICYmIGh0dHBSZXF1ZXN0Lm1vZGUgIT09ICdyZWxvYWQnKSB7XG4gICAgLy8gVE9ETzogY2FjaGVcbiAgfVxuXG4gIC8vIDkuIElmIGFib3J0ZWQsIHRoZW4gcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBuZXR3b3JrIGVycm9yIGZvciBmZXRjaFBhcmFtcy5cbiAgLy8gVE9ET1xuXG4gIC8vIDEwLiBJZiByZXNwb25zZSBpcyBudWxsLCB0aGVuOlxuICBpZiAocmVzcG9uc2UgPT0gbnVsbCkge1xuICAgIC8vIDEuIElmIGh0dHBSZXF1ZXN04oCZcyBjYWNoZSBtb2RlIGlzIFwib25seS1pZi1jYWNoZWRcIiwgdGhlbiByZXR1cm4gYVxuICAgIC8vIG5ldHdvcmsgZXJyb3IuXG4gICAgaWYgKGh0dHBSZXF1ZXN0Lm1vZGUgPT09ICdvbmx5LWlmLWNhY2hlZCcpIHtcbiAgICAgIHJldHVybiBtYWtlTmV0d29ya0Vycm9yKCdvbmx5IGlmIGNhY2hlZCcpXG4gICAgfVxuXG4gICAgLy8gMi4gTGV0IGZvcndhcmRSZXNwb25zZSBiZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgSFRUUC1uZXR3b3JrIGZldGNoXG4gICAgLy8gZ2l2ZW4gaHR0cEZldGNoUGFyYW1zLCBpbmNsdWRlQ3JlZGVudGlhbHMsIGFuZCBpc05ld0Nvbm5lY3Rpb25GZXRjaC5cbiAgICBjb25zdCBmb3J3YXJkUmVzcG9uc2UgPSBhd2FpdCBodHRwTmV0d29ya0ZldGNoKFxuICAgICAgaHR0cEZldGNoUGFyYW1zLFxuICAgICAgaW5jbHVkZUNyZWRlbnRpYWxzLFxuICAgICAgaXNOZXdDb25uZWN0aW9uRmV0Y2hcbiAgICApXG5cbiAgICAvLyAzLiBJZiBodHRwUmVxdWVzdOKAmXMgbWV0aG9kIGlzIHVuc2FmZSBhbmQgZm9yd2FyZFJlc3BvbnNl4oCZcyBzdGF0dXMgaXNcbiAgICAvLyBpbiB0aGUgcmFuZ2UgMjAwIHRvIDM5OSwgaW5jbHVzaXZlLCBpbnZhbGlkYXRlIGFwcHJvcHJpYXRlIHN0b3JlZFxuICAgIC8vIHJlc3BvbnNlcyBpbiBodHRwQ2FjaGUsIGFzIHBlciB0aGUgXCJJbnZhbGlkYXRpb25cIiBjaGFwdGVyIG9mIEhUVFBcbiAgICAvLyBDYWNoaW5nLCBhbmQgc2V0IHN0b3JlZFJlc3BvbnNlIHRvIG51bGwuIFtIVFRQLUNBQ0hJTkddXG4gICAgaWYgKFxuICAgICAgIXNhZmVNZXRob2RzU2V0LmhhcyhodHRwUmVxdWVzdC5tZXRob2QpICYmXG4gICAgICBmb3J3YXJkUmVzcG9uc2Uuc3RhdHVzID49IDIwMCAmJlxuICAgICAgZm9yd2FyZFJlc3BvbnNlLnN0YXR1cyA8PSAzOTlcbiAgICApIHtcbiAgICAgIC8vIFRPRE86IGNhY2hlXG4gICAgfVxuXG4gICAgLy8gNC4gSWYgdGhlIHJldmFsaWRhdGluZ0ZsYWcgaXMgc2V0IGFuZCBmb3J3YXJkUmVzcG9uc2XigJlzIHN0YXR1cyBpcyAzMDQsXG4gICAgLy8gdGhlbjpcbiAgICBpZiAocmV2YWxpZGF0aW5nRmxhZyAmJiBmb3J3YXJkUmVzcG9uc2Uuc3RhdHVzID09PSAzMDQpIHtcbiAgICAgIC8vIFRPRE86IGNhY2hlXG4gICAgfVxuXG4gICAgLy8gNS4gSWYgcmVzcG9uc2UgaXMgbnVsbCwgdGhlbjpcbiAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkge1xuICAgICAgLy8gMS4gU2V0IHJlc3BvbnNlIHRvIGZvcndhcmRSZXNwb25zZS5cbiAgICAgIHJlc3BvbnNlID0gZm9yd2FyZFJlc3BvbnNlXG5cbiAgICAgIC8vIDIuIFN0b3JlIGh0dHBSZXF1ZXN0IGFuZCBmb3J3YXJkUmVzcG9uc2UgaW4gaHR0cENhY2hlLCBhcyBwZXIgdGhlXG4gICAgICAvLyBcIlN0b3JpbmcgUmVzcG9uc2VzIGluIENhY2hlc1wiIGNoYXB0ZXIgb2YgSFRUUCBDYWNoaW5nLiBbSFRUUC1DQUNISU5HXVxuICAgICAgLy8gVE9ETzogY2FjaGVcbiAgICB9XG4gIH1cblxuICAvLyAxMS4gU2V0IHJlc3BvbnNl4oCZcyBVUkwgbGlzdCB0byBhIGNsb25lIG9mIGh0dHBSZXF1ZXN04oCZcyBVUkwgbGlzdC5cbiAgcmVzcG9uc2UudXJsTGlzdCA9IFsuLi5odHRwUmVxdWVzdC51cmxMaXN0XVxuXG4gIC8vIDEyLiBJZiBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgY29udGFpbnMgYFJhbmdlYCwgdGhlbiBzZXQgcmVzcG9uc2XigJlzXG4gIC8vIHJhbmdlLXJlcXVlc3RlZCBmbGFnLlxuICBpZiAoaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuY29udGFpbnMoJ3JhbmdlJykpIHtcbiAgICByZXNwb25zZS5yYW5nZVJlcXVlc3RlZCA9IHRydWVcbiAgfVxuXG4gIC8vIDEzLiBTZXQgcmVzcG9uc2XigJlzIHJlcXVlc3QtaW5jbHVkZXMtY3JlZGVudGlhbHMgdG8gaW5jbHVkZUNyZWRlbnRpYWxzLlxuICByZXNwb25zZS5yZXF1ZXN0SW5jbHVkZXNDcmVkZW50aWFscyA9IGluY2x1ZGVDcmVkZW50aWFsc1xuXG4gIC8vIDE0LiBJZiByZXNwb25zZeKAmXMgc3RhdHVzIGlzIDQwMSwgaHR0cFJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nIGlzIG5vdFxuICAvLyBcImNvcnNcIiwgaW5jbHVkZUNyZWRlbnRpYWxzIGlzIHRydWUsIGFuZCByZXF1ZXN04oCZcyB3aW5kb3cgaXMgYW4gZW52aXJvbm1lbnRcbiAgLy8gc2V0dGluZ3Mgb2JqZWN0LCB0aGVuOlxuICAvLyBUT0RPXG5cbiAgLy8gMTUuIElmIHJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgNDA3LCB0aGVuOlxuICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDcpIHtcbiAgICAvLyAxLiBJZiByZXF1ZXN04oCZcyB3aW5kb3cgaXMgXCJuby13aW5kb3dcIiwgdGhlbiByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICAgIGlmIChyZXF1ZXN0LndpbmRvdyA9PT0gJ25vLXdpbmRvdycpIHtcbiAgICAgIHJldHVybiBtYWtlTmV0d29ya0Vycm9yKClcbiAgICB9XG5cbiAgICAvLyAyLiA/Pz9cblxuICAgIC8vIDMuIElmIGZldGNoUGFyYW1zIGlzIGNhbmNlbGVkLCB0aGVuIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgbmV0d29yayBlcnJvciBmb3IgZmV0Y2hQYXJhbXMuXG4gICAgaWYgKGlzQ2FuY2VsbGVkKGZldGNoUGFyYW1zKSkge1xuICAgICAgcmV0dXJuIG1ha2VBcHByb3ByaWF0ZU5ldHdvcmtFcnJvcihmZXRjaFBhcmFtcylcbiAgICB9XG5cbiAgICAvLyA0LiBQcm9tcHQgdGhlIGVuZCB1c2VyIGFzIGFwcHJvcHJpYXRlIGluIHJlcXVlc3TigJlzIHdpbmRvdyBhbmQgc3RvcmVcbiAgICAvLyB0aGUgcmVzdWx0IGFzIGEgcHJveHktYXV0aGVudGljYXRpb24gZW50cnkuIFtIVFRQLUFVVEhdXG4gICAgLy8gVE9ETzogSW52b2tlIHNvbWUga2luZCBvZiBjYWxsYmFjaz9cblxuICAgIC8vIDUuIFNldCByZXNwb25zZSB0byB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgSFRUUC1uZXR3b3JrLW9yLWNhY2hlIGZldGNoIGdpdmVuXG4gICAgLy8gZmV0Y2hQYXJhbXMuXG4gICAgLy8gVE9ET1xuICAgIHJldHVybiBtYWtlTmV0d29ya0Vycm9yKCdwcm94eSBhdXRoZW50aWNhdGlvbiByZXF1aXJlZCcpXG4gIH1cblxuICAvLyAxNi4gSWYgYWxsIG9mIHRoZSBmb2xsb3dpbmcgYXJlIHRydWVcbiAgaWYgKFxuICAgIC8vIHJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgNDIxXG4gICAgcmVzcG9uc2Uuc3RhdHVzID09PSA0MjEgJiZcbiAgICAvLyBpc05ld0Nvbm5lY3Rpb25GZXRjaCBpcyBmYWxzZVxuICAgICFpc05ld0Nvbm5lY3Rpb25GZXRjaCAmJlxuICAgIC8vIHJlcXVlc3TigJlzIGJvZHkgaXMgbnVsbCwgb3IgcmVxdWVzdOKAmXMgYm9keSBpcyBub24tbnVsbCBhbmQgcmVxdWVzdOKAmXMgYm9keeKAmXMgc291cmNlIGlzIG5vbi1udWxsXG4gICAgKHJlcXVlc3QuYm9keSA9PSBudWxsIHx8IHJlcXVlc3QuYm9keS5zb3VyY2UgIT0gbnVsbClcbiAgKSB7XG4gICAgLy8gdGhlbjpcblxuICAgIC8vIDEuIElmIGZldGNoUGFyYW1zIGlzIGNhbmNlbGVkLCB0aGVuIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgbmV0d29yayBlcnJvciBmb3IgZmV0Y2hQYXJhbXMuXG4gICAgaWYgKGlzQ2FuY2VsbGVkKGZldGNoUGFyYW1zKSkge1xuICAgICAgcmV0dXJuIG1ha2VBcHByb3ByaWF0ZU5ldHdvcmtFcnJvcihmZXRjaFBhcmFtcylcbiAgICB9XG5cbiAgICAvLyAyLiBTZXQgcmVzcG9uc2UgdG8gdGhlIHJlc3VsdCBvZiBydW5uaW5nIEhUVFAtbmV0d29yay1vci1jYWNoZVxuICAgIC8vIGZldGNoIGdpdmVuIGZldGNoUGFyYW1zLCBpc0F1dGhlbnRpY2F0aW9uRmV0Y2gsIGFuZCB0cnVlLlxuXG4gICAgLy8gVE9ETyAoc3BlYyk6IFRoZSBzcGVjIGRvZXNuJ3Qgc3BlY2lmeSB0aGlzIGJ1dCB3ZSBuZWVkIHRvIGNhbmNlbFxuICAgIC8vIHRoZSBhY3RpdmUgcmVzcG9uc2UgYmVmb3JlIHdlIGNhbiBzdGFydCBhIG5ldyBvbmUuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3doYXR3Zy9mZXRjaC9pc3N1ZXMvMTI5M1xuICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29ubmVjdGlvbi5kZXN0cm95KClcblxuICAgIHJlc3BvbnNlID0gYXdhaXQgaHR0cE5ldHdvcmtPckNhY2hlRmV0Y2goXG4gICAgICBmZXRjaFBhcmFtcyxcbiAgICAgIGlzQXV0aGVudGljYXRpb25GZXRjaCxcbiAgICAgIHRydWVcbiAgICApXG4gIH1cblxuICAvLyAxNy4gSWYgaXNBdXRoZW50aWNhdGlvbkZldGNoIGlzIHRydWUsIHRoZW4gY3JlYXRlIGFuIGF1dGhlbnRpY2F0aW9uIGVudHJ5XG4gIGlmIChpc0F1dGhlbnRpY2F0aW9uRmV0Y2gpIHtcbiAgICAvLyBUT0RPXG4gIH1cblxuICAvLyAxOC4gUmV0dXJuIHJlc3BvbnNlLlxuICByZXR1cm4gcmVzcG9uc2Vcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtbmV0d29yay1mZXRjaFxuYXN5bmMgZnVuY3Rpb24gaHR0cE5ldHdvcmtGZXRjaCAoXG4gIGZldGNoUGFyYW1zLFxuICBpbmNsdWRlQ3JlZGVudGlhbHMgPSBmYWxzZSxcbiAgZm9yY2VOZXdDb25uZWN0aW9uID0gZmFsc2Vcbikge1xuICBhc3NlcnQoIWZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29ubmVjdGlvbiB8fCBmZXRjaFBhcmFtcy5jb250cm9sbGVyLmNvbm5lY3Rpb24uZGVzdHJveWVkKVxuXG4gIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29ubmVjdGlvbiA9IHtcbiAgICBhYm9ydDogbnVsbCxcbiAgICBkZXN0cm95ZWQ6IGZhbHNlLFxuICAgIGRlc3Ryb3kgKGVycikge1xuICAgICAgaWYgKCF0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWVcbiAgICAgICAgdGhpcy5hYm9ydD8uKGVyciA/PyBuZXcgRE9NRXhjZXB0aW9uKCdUaGUgb3BlcmF0aW9uIHdhcyBhYm9ydGVkLicsICdBYm9ydEVycm9yJykpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gMS4gTGV0IHJlcXVlc3QgYmUgZmV0Y2hQYXJhbXPigJlzIHJlcXVlc3QuXG4gIGNvbnN0IHJlcXVlc3QgPSBmZXRjaFBhcmFtcy5yZXF1ZXN0XG5cbiAgLy8gMi4gTGV0IHJlc3BvbnNlIGJlIG51bGwuXG4gIGxldCByZXNwb25zZSA9IG51bGxcblxuICAvLyAzLiBMZXQgdGltaW5nSW5mbyBiZSBmZXRjaFBhcmFtc+KAmXMgdGltaW5nIGluZm8uXG4gIGNvbnN0IHRpbWluZ0luZm8gPSBmZXRjaFBhcmFtcy50aW1pbmdJbmZvXG5cbiAgLy8gNC4gTGV0IGh0dHBDYWNoZSBiZSB0aGUgcmVzdWx0IG9mIGRldGVybWluaW5nIHRoZSBIVFRQIGNhY2hlIHBhcnRpdGlvbixcbiAgLy8gZ2l2ZW4gcmVxdWVzdC5cbiAgLy8gVE9ETzogY2FjaGVcbiAgY29uc3QgaHR0cENhY2hlID0gbnVsbFxuXG4gIC8vIDUuIElmIGh0dHBDYWNoZSBpcyBudWxsLCB0aGVuIHNldCByZXF1ZXN04oCZcyBjYWNoZSBtb2RlIHRvIFwibm8tc3RvcmVcIi5cbiAgaWYgKGh0dHBDYWNoZSA9PSBudWxsKSB7XG4gICAgcmVxdWVzdC5jYWNoZSA9ICduby1zdG9yZSdcbiAgfVxuXG4gIC8vIDYuIExldCBuZXR3b3JrUGFydGl0aW9uS2V5IGJlIHRoZSByZXN1bHQgb2YgZGV0ZXJtaW5pbmcgdGhlIG5ldHdvcmtcbiAgLy8gcGFydGl0aW9uIGtleSBnaXZlbiByZXF1ZXN0LlxuICAvLyBUT0RPXG5cbiAgLy8gNy4gTGV0IG5ld0Nvbm5lY3Rpb24gYmUgXCJ5ZXNcIiBpZiBmb3JjZU5ld0Nvbm5lY3Rpb24gaXMgdHJ1ZTsgb3RoZXJ3aXNlXG4gIC8vIFwibm9cIi5cbiAgY29uc3QgbmV3Q29ubmVjdGlvbiA9IGZvcmNlTmV3Q29ubmVjdGlvbiA/ICd5ZXMnIDogJ25vJyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG5cbiAgLy8gOC4gU3dpdGNoIG9uIHJlcXVlc3TigJlzIG1vZGU6XG4gIGlmIChyZXF1ZXN0Lm1vZGUgPT09ICd3ZWJzb2NrZXQnKSB7XG4gICAgLy8gTGV0IGNvbm5lY3Rpb24gYmUgdGhlIHJlc3VsdCBvZiBvYnRhaW5pbmcgYSBXZWJTb2NrZXQgY29ubmVjdGlvbixcbiAgICAvLyBnaXZlbiByZXF1ZXN04oCZcyBjdXJyZW50IFVSTC5cbiAgICAvLyBUT0RPXG4gIH0gZWxzZSB7XG4gICAgLy8gTGV0IGNvbm5lY3Rpb24gYmUgdGhlIHJlc3VsdCBvZiBvYnRhaW5pbmcgYSBjb25uZWN0aW9uLCBnaXZlblxuICAgIC8vIG5ldHdvcmtQYXJ0aXRpb25LZXksIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBvcmlnaW4sXG4gICAgLy8gaW5jbHVkZUNyZWRlbnRpYWxzLCBhbmQgZm9yY2VOZXdDb25uZWN0aW9uLlxuICAgIC8vIFRPRE9cbiAgfVxuXG4gIC8vIDkuIFJ1biB0aGVzZSBzdGVwcywgYnV0IGFib3J0IHdoZW4gdGhlIG9uZ29pbmcgZmV0Y2ggaXMgdGVybWluYXRlZDpcblxuICAvLyAgICAxLiBJZiBjb25uZWN0aW9uIGlzIGZhaWx1cmUsIHRoZW4gcmV0dXJuIGEgbmV0d29yayBlcnJvci5cblxuICAvLyAgICAyLiBTZXQgdGltaW5nSW5mb+KAmXMgZmluYWwgY29ubmVjdGlvbiB0aW1pbmcgaW5mbyB0byB0aGUgcmVzdWx0IG9mXG4gIC8vICAgIGNhbGxpbmcgY2xhbXAgYW5kIGNvYXJzZW4gY29ubmVjdGlvbiB0aW1pbmcgaW5mbyB3aXRoIGNvbm5lY3Rpb27igJlzXG4gIC8vICAgIHRpbWluZyBpbmZvLCB0aW1pbmdJbmZv4oCZcyBwb3N0LXJlZGlyZWN0IHN0YXJ0IHRpbWUsIGFuZCBmZXRjaFBhcmFtc+KAmXNcbiAgLy8gICAgY3Jvc3Mtb3JpZ2luIGlzb2xhdGVkIGNhcGFiaWxpdHkuXG5cbiAgLy8gICAgMy4gSWYgY29ubmVjdGlvbiBpcyBub3QgYW4gSFRUUC8yIGNvbm5lY3Rpb24sIHJlcXVlc3TigJlzIGJvZHkgaXMgbm9uLW51bGwsXG4gIC8vICAgIGFuZCByZXF1ZXN04oCZcyBib2R54oCZcyBzb3VyY2UgaXMgbnVsbCwgdGhlbiBhcHBlbmQgKGBUcmFuc2Zlci1FbmNvZGluZ2AsXG4gIC8vICAgIGBjaHVua2VkYCkgdG8gcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG5cbiAgLy8gICAgNC4gU2V0IHRpbWluZ0luZm/igJlzIGZpbmFsIG5ldHdvcmstcmVxdWVzdCBzdGFydCB0aW1lIHRvIHRoZSBjb2Fyc2VuZWRcbiAgLy8gICAgc2hhcmVkIGN1cnJlbnQgdGltZSBnaXZlbiBmZXRjaFBhcmFtc+KAmXMgY3Jvc3Mtb3JpZ2luIGlzb2xhdGVkXG4gIC8vICAgIGNhcGFiaWxpdHkuXG5cbiAgLy8gICAgNS4gU2V0IHJlc3BvbnNlIHRvIHRoZSByZXN1bHQgb2YgbWFraW5nIGFuIEhUVFAgcmVxdWVzdCBvdmVyIGNvbm5lY3Rpb25cbiAgLy8gICAgdXNpbmcgcmVxdWVzdCB3aXRoIHRoZSBmb2xsb3dpbmcgY2F2ZWF0czpcblxuICAvLyAgICAgICAgLSBGb2xsb3cgdGhlIHJlbGV2YW50IHJlcXVpcmVtZW50cyBmcm9tIEhUVFAuIFtIVFRQXSBbSFRUUC1TRU1BTlRJQ1NdXG4gIC8vICAgICAgICBbSFRUUC1DT05EXSBbSFRUUC1DQUNISU5HXSBbSFRUUC1BVVRIXVxuXG4gIC8vICAgICAgICAtIElmIHJlcXVlc3TigJlzIGJvZHkgaXMgbm9uLW51bGwsIGFuZCByZXF1ZXN04oCZcyBib2R54oCZcyBzb3VyY2UgaXMgbnVsbCxcbiAgLy8gICAgICAgIHRoZW4gdGhlIHVzZXIgYWdlbnQgbWF5IGhhdmUgYSBidWZmZXIgb2YgdXAgdG8gNjQga2liaWJ5dGVzIGFuZCBzdG9yZVxuICAvLyAgICAgICAgYSBwYXJ0IG9mIHJlcXVlc3TigJlzIGJvZHkgaW4gdGhhdCBidWZmZXIuIElmIHRoZSB1c2VyIGFnZW50IHJlYWRzIGZyb21cbiAgLy8gICAgICAgIHJlcXVlc3TigJlzIGJvZHkgYmV5b25kIHRoYXQgYnVmZmVy4oCZcyBzaXplIGFuZCB0aGUgdXNlciBhZ2VudCBuZWVkcyB0b1xuICAvLyAgICAgICAgcmVzZW5kIHJlcXVlc3QsIHRoZW4gaW5zdGVhZCByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuXG4gIC8vICAgICAgICAtIFNldCB0aW1pbmdJbmZv4oCZcyBmaW5hbCBuZXR3b3JrLXJlc3BvbnNlIHN0YXJ0IHRpbWUgdG8gdGhlIGNvYXJzZW5lZFxuICAvLyAgICAgICAgc2hhcmVkIGN1cnJlbnQgdGltZSBnaXZlbiBmZXRjaFBhcmFtc+KAmXMgY3Jvc3Mtb3JpZ2luIGlzb2xhdGVkIGNhcGFiaWxpdHksXG4gIC8vICAgICAgICBpbW1lZGlhdGVseSBhZnRlciB0aGUgdXNlciBhZ2VudOKAmXMgSFRUUCBwYXJzZXIgcmVjZWl2ZXMgdGhlIGZpcnN0IGJ5dGVcbiAgLy8gICAgICAgIG9mIHRoZSByZXNwb25zZSAoZS5nLiwgZnJhbWUgaGVhZGVyIGJ5dGVzIGZvciBIVFRQLzIgb3IgcmVzcG9uc2Ugc3RhdHVzXG4gIC8vICAgICAgICBsaW5lIGZvciBIVFRQLzEueCkuXG5cbiAgLy8gICAgICAgIC0gV2FpdCB1bnRpbCBhbGwgdGhlIGhlYWRlcnMgYXJlIHRyYW5zbWl0dGVkLlxuXG4gIC8vICAgICAgICAtIEFueSByZXNwb25zZXMgd2hvc2Ugc3RhdHVzIGlzIGluIHRoZSByYW5nZSAxMDAgdG8gMTk5LCBpbmNsdXNpdmUsXG4gIC8vICAgICAgICBhbmQgaXMgbm90IDEwMSwgYXJlIHRvIGJlIGlnbm9yZWQsIGV4Y2VwdCBmb3IgdGhlIHB1cnBvc2VzIG9mIHNldHRpbmdcbiAgLy8gICAgICAgIHRpbWluZ0luZm/igJlzIGZpbmFsIG5ldHdvcmstcmVzcG9uc2Ugc3RhcnQgdGltZSBhYm92ZS5cblxuICAvLyAgICAtIElmIHJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGNvbnRhaW5zIGBUcmFuc2Zlci1FbmNvZGluZ2AvYGNodW5rZWRgIGFuZFxuICAvLyAgICByZXNwb25zZSBpcyB0cmFuc2ZlcnJlZCB2aWEgSFRUUC8xLjAgb3Igb2xkZXIsIHRoZW4gcmV0dXJuIGEgbmV0d29ya1xuICAvLyAgICBlcnJvci5cblxuICAvLyAgICAtIElmIHRoZSBIVFRQIHJlcXVlc3QgcmVzdWx0cyBpbiBhIFRMUyBjbGllbnQgY2VydGlmaWNhdGUgZGlhbG9nLCB0aGVuOlxuXG4gIC8vICAgICAgICAxLiBJZiByZXF1ZXN04oCZcyB3aW5kb3cgaXMgYW4gZW52aXJvbm1lbnQgc2V0dGluZ3Mgb2JqZWN0LCBtYWtlIHRoZVxuICAvLyAgICAgICAgZGlhbG9nIGF2YWlsYWJsZSBpbiByZXF1ZXN04oCZcyB3aW5kb3cuXG5cbiAgLy8gICAgICAgIDIuIE90aGVyd2lzZSwgcmV0dXJuIGEgbmV0d29yayBlcnJvci5cblxuICAvLyBUbyB0cmFuc21pdCByZXF1ZXN04oCZcyBib2R5IGJvZHksIHJ1biB0aGVzZSBzdGVwczpcbiAgbGV0IHJlcXVlc3RCb2R5ID0gbnVsbFxuICAvLyAxLiBJZiBib2R5IGlzIG51bGwgYW5kIGZldGNoUGFyYW1z4oCZcyBwcm9jZXNzIHJlcXVlc3QgZW5kLW9mLWJvZHkgaXNcbiAgLy8gbm9uLW51bGwsIHRoZW4gcXVldWUgYSBmZXRjaCB0YXNrIGdpdmVuIGZldGNoUGFyYW1z4oCZcyBwcm9jZXNzIHJlcXVlc3RcbiAgLy8gZW5kLW9mLWJvZHkgYW5kIGZldGNoUGFyYW1z4oCZcyB0YXNrIGRlc3RpbmF0aW9uLlxuICBpZiAocmVxdWVzdC5ib2R5ID09IG51bGwgJiYgZmV0Y2hQYXJhbXMucHJvY2Vzc1JlcXVlc3RFbmRPZkJvZHkpIHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBmZXRjaFBhcmFtcy5wcm9jZXNzUmVxdWVzdEVuZE9mQm9keSgpKVxuICB9IGVsc2UgaWYgKHJlcXVlc3QuYm9keSAhPSBudWxsKSB7XG4gICAgLy8gMi4gT3RoZXJ3aXNlLCBpZiBib2R5IGlzIG5vbi1udWxsOlxuXG4gICAgLy8gICAgMS4gTGV0IHByb2Nlc3NCb2R5Q2h1bmsgZ2l2ZW4gYnl0ZXMgYmUgdGhlc2Ugc3RlcHM6XG4gICAgY29uc3QgcHJvY2Vzc0JvZHlDaHVuayA9IGFzeW5jIGZ1bmN0aW9uICogKGJ5dGVzKSB7XG4gICAgICAvLyAxLiBJZiB0aGUgb25nb2luZyBmZXRjaCBpcyB0ZXJtaW5hdGVkLCB0aGVuIGFib3J0IHRoZXNlIHN0ZXBzLlxuICAgICAgaWYgKGlzQ2FuY2VsbGVkKGZldGNoUGFyYW1zKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gMi4gUnVuIHRoaXMgc3RlcCBpbiBwYXJhbGxlbDogdHJhbnNtaXQgYnl0ZXMuXG4gICAgICB5aWVsZCBieXRlc1xuXG4gICAgICAvLyAzLiBJZiBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXF1ZXN0IGJvZHkgaXMgbm9uLW51bGwsIHRoZW4gcnVuXG4gICAgICAvLyBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXF1ZXN0IGJvZHkgZ2l2ZW4gYnl0ZXPigJlzIGxlbmd0aC5cbiAgICAgIGZldGNoUGFyYW1zLnByb2Nlc3NSZXF1ZXN0Qm9keUNodW5rTGVuZ3RoPy4oYnl0ZXMuYnl0ZUxlbmd0aClcbiAgICB9XG5cbiAgICAvLyAyLiBMZXQgcHJvY2Vzc0VuZE9mQm9keSBiZSB0aGVzZSBzdGVwczpcbiAgICBjb25zdCBwcm9jZXNzRW5kT2ZCb2R5ID0gKCkgPT4ge1xuICAgICAgLy8gMS4gSWYgZmV0Y2hQYXJhbXMgaXMgY2FuY2VsZWQsIHRoZW4gYWJvcnQgdGhlc2Ugc3RlcHMuXG4gICAgICBpZiAoaXNDYW5jZWxsZWQoZmV0Y2hQYXJhbXMpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyAyLiBJZiBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXF1ZXN0IGVuZC1vZi1ib2R5IGlzIG5vbi1udWxsLFxuICAgICAgLy8gdGhlbiBydW4gZmV0Y2hQYXJhbXPigJlzIHByb2Nlc3MgcmVxdWVzdCBlbmQtb2YtYm9keS5cbiAgICAgIGlmIChmZXRjaFBhcmFtcy5wcm9jZXNzUmVxdWVzdEVuZE9mQm9keSkge1xuICAgICAgICBmZXRjaFBhcmFtcy5wcm9jZXNzUmVxdWVzdEVuZE9mQm9keSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMy4gTGV0IHByb2Nlc3NCb2R5RXJyb3IgZ2l2ZW4gZSBiZSB0aGVzZSBzdGVwczpcbiAgICBjb25zdCBwcm9jZXNzQm9keUVycm9yID0gKGUpID0+IHtcbiAgICAgIC8vIDEuIElmIGZldGNoUGFyYW1zIGlzIGNhbmNlbGVkLCB0aGVuIGFib3J0IHRoZXNlIHN0ZXBzLlxuICAgICAgaWYgKGlzQ2FuY2VsbGVkKGZldGNoUGFyYW1zKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gMi4gSWYgZSBpcyBhbiBcIkFib3J0RXJyb3JcIiBET01FeGNlcHRpb24sIHRoZW4gYWJvcnQgZmV0Y2hQYXJhbXPigJlzIGNvbnRyb2xsZXIuXG4gICAgICBpZiAoZS5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5hYm9ydCgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLnRlcm1pbmF0ZShlKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDQuIEluY3JlbWVudGFsbHkgcmVhZCByZXF1ZXN04oCZcyBib2R5IGdpdmVuIHByb2Nlc3NCb2R5Q2h1bmssIHByb2Nlc3NFbmRPZkJvZHksXG4gICAgLy8gcHJvY2Vzc0JvZHlFcnJvciwgYW5kIGZldGNoUGFyYW1z4oCZcyB0YXNrIGRlc3RpbmF0aW9uLlxuICAgIHJlcXVlc3RCb2R5ID0gKGFzeW5jIGZ1bmN0aW9uICogKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBieXRlcyBvZiByZXF1ZXN0LmJvZHkuc3RyZWFtKSB7XG4gICAgICAgICAgeWllbGQgKiBwcm9jZXNzQm9keUNodW5rKGJ5dGVzKVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3NFbmRPZkJvZHkoKVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHByb2Nlc3NCb2R5RXJyb3IoZXJyKVxuICAgICAgfVxuICAgIH0pKClcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gc29ja2V0IGlzIG9ubHkgcHJvdmlkZWQgZm9yIHdlYnNvY2tldHNcbiAgICBjb25zdCB7IGJvZHksIHN0YXR1cywgc3RhdHVzVGV4dCwgaGVhZGVyc0xpc3QsIHNvY2tldCB9ID0gYXdhaXQgZGlzcGF0Y2goeyBib2R5OiByZXF1ZXN0Qm9keSB9KVxuXG4gICAgaWYgKHNvY2tldCkge1xuICAgICAgcmVzcG9uc2UgPSBtYWtlUmVzcG9uc2UoeyBzdGF0dXMsIHN0YXR1c1RleHQsIGhlYWRlcnNMaXN0LCBzb2NrZXQgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaXRlcmF0b3IgPSBib2R5W1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpXG4gICAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLm5leHQgPSAoKSA9PiBpdGVyYXRvci5uZXh0KClcblxuICAgICAgcmVzcG9uc2UgPSBtYWtlUmVzcG9uc2UoeyBzdGF0dXMsIHN0YXR1c1RleHQsIGhlYWRlcnNMaXN0IH0pXG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyAxMC4gSWYgYWJvcnRlZCwgdGhlbjpcbiAgICBpZiAoZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgLy8gMS4gSWYgY29ubmVjdGlvbiB1c2VzIEhUVFAvMiwgdGhlbiB0cmFuc21pdCBhbiBSU1RfU1RSRUFNIGZyYW1lLlxuICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb25uZWN0aW9uLmRlc3Ryb3koKVxuXG4gICAgICAvLyAyLiBSZXR1cm4gdGhlIGFwcHJvcHJpYXRlIG5ldHdvcmsgZXJyb3IgZm9yIGZldGNoUGFyYW1zLlxuICAgICAgcmV0dXJuIG1ha2VBcHByb3ByaWF0ZU5ldHdvcmtFcnJvcihmZXRjaFBhcmFtcywgZXJyKVxuICAgIH1cblxuICAgIHJldHVybiBtYWtlTmV0d29ya0Vycm9yKGVycilcbiAgfVxuXG4gIC8vIDExLiBMZXQgcHVsbEFsZ29yaXRobSBiZSBhbiBhY3Rpb24gdGhhdCByZXN1bWVzIHRoZSBvbmdvaW5nIGZldGNoXG4gIC8vIGlmIGl0IGlzIHN1c3BlbmRlZC5cbiAgY29uc3QgcHVsbEFsZ29yaXRobSA9ICgpID0+IHtcbiAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLnJlc3VtZSgpXG4gIH1cblxuICAvLyAxMi4gTGV0IGNhbmNlbEFsZ29yaXRobSBiZSBhbiBhbGdvcml0aG0gdGhhdCBhYm9ydHMgZmV0Y2hQYXJhbXPigJlzXG4gIC8vIGNvbnRyb2xsZXIgd2l0aCByZWFzb24sIGdpdmVuIHJlYXNvbi5cbiAgY29uc3QgY2FuY2VsQWxnb3JpdGhtID0gKHJlYXNvbikgPT4ge1xuICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuYWJvcnQocmVhc29uKVxuICB9XG5cbiAgLy8gMTMuIExldCBoaWdoV2F0ZXJNYXJrIGJlIGEgbm9uLW5lZ2F0aXZlLCBub24tTmFOIG51bWJlciwgY2hvc2VuIGJ5XG4gIC8vIHRoZSB1c2VyIGFnZW50LlxuICAvLyBUT0RPXG5cbiAgLy8gMTQuIExldCBzaXplQWxnb3JpdGhtIGJlIGFuIGFsZ29yaXRobSB0aGF0IGFjY2VwdHMgYSBjaHVuayBvYmplY3RcbiAgLy8gYW5kIHJldHVybnMgYSBub24tbmVnYXRpdmUsIG5vbi1OYU4sIG5vbi1pbmZpbml0ZSBudW1iZXIsIGNob3NlbiBieSB0aGUgdXNlciBhZ2VudC5cbiAgLy8gVE9ET1xuXG4gIC8vIDE1LiBMZXQgc3RyZWFtIGJlIGEgbmV3IFJlYWRhYmxlU3RyZWFtLlxuICAvLyAxNi4gU2V0IHVwIHN0cmVhbSB3aXRoIHB1bGxBbGdvcml0aG0gc2V0IHRvIHB1bGxBbGdvcml0aG0sXG4gIC8vIGNhbmNlbEFsZ29yaXRobSBzZXQgdG8gY2FuY2VsQWxnb3JpdGhtLCBoaWdoV2F0ZXJNYXJrIHNldCB0b1xuICAvLyBoaWdoV2F0ZXJNYXJrLCBhbmQgc2l6ZUFsZ29yaXRobSBzZXQgdG8gc2l6ZUFsZ29yaXRobS5cbiAgaWYgKCFSZWFkYWJsZVN0cmVhbSkge1xuICAgIFJlYWRhYmxlU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtL3dlYicpLlJlYWRhYmxlU3RyZWFtXG4gIH1cblxuICBjb25zdCBzdHJlYW0gPSBuZXcgUmVhZGFibGVTdHJlYW0oXG4gICAge1xuICAgICAgYXN5bmMgc3RhcnQgKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb250cm9sbGVyID0gY29udHJvbGxlclxuICAgICAgfSxcbiAgICAgIGFzeW5jIHB1bGwgKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgYXdhaXQgcHVsbEFsZ29yaXRobShjb250cm9sbGVyKVxuICAgICAgfSxcbiAgICAgIGFzeW5jIGNhbmNlbCAocmVhc29uKSB7XG4gICAgICAgIGF3YWl0IGNhbmNlbEFsZ29yaXRobShyZWFzb24pXG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICBoaWdoV2F0ZXJNYXJrOiAwLFxuICAgICAgc2l6ZSAoKSB7XG4gICAgICAgIHJldHVybiAxXG4gICAgICB9XG4gICAgfVxuICApXG5cbiAgLy8gMTcuIFJ1biB0aGVzZSBzdGVwcywgYnV0IGFib3J0IHdoZW4gdGhlIG9uZ29pbmcgZmV0Y2ggaXMgdGVybWluYXRlZDpcblxuICAvLyAgICAxLiBTZXQgcmVzcG9uc2XigJlzIGJvZHkgdG8gYSBuZXcgYm9keSB3aG9zZSBzdHJlYW0gaXMgc3RyZWFtLlxuICByZXNwb25zZS5ib2R5ID0geyBzdHJlYW0gfVxuXG4gIC8vICAgIDIuIElmIHJlc3BvbnNlIGlzIG5vdCBhIG5ldHdvcmsgZXJyb3IgYW5kIHJlcXVlc3TigJlzIGNhY2hlIG1vZGUgaXNcbiAgLy8gICAgbm90IFwibm8tc3RvcmVcIiwgdGhlbiB1cGRhdGUgcmVzcG9uc2UgaW4gaHR0cENhY2hlIGZvciByZXF1ZXN0LlxuICAvLyAgICBUT0RPXG5cbiAgLy8gICAgMy4gSWYgaW5jbHVkZUNyZWRlbnRpYWxzIGlzIHRydWUgYW5kIHRoZSB1c2VyIGFnZW50IGlzIG5vdCBjb25maWd1cmVkXG4gIC8vICAgIHRvIGJsb2NrIGNvb2tpZXMgZm9yIHJlcXVlc3QgKHNlZSBzZWN0aW9uIDcgb2YgW0NPT0tJRVNdKSwgdGhlbiBydW4gdGhlXG4gIC8vICAgIFwic2V0LWNvb2tpZS1zdHJpbmdcIiBwYXJzaW5nIGFsZ29yaXRobSAoc2VlIHNlY3Rpb24gNS4yIG9mIFtDT09LSUVTXSkgb25cbiAgLy8gICAgdGhlIHZhbHVlIG9mIGVhY2ggaGVhZGVyIHdob3NlIG5hbWUgaXMgYSBieXRlLWNhc2UtaW5zZW5zaXRpdmUgbWF0Y2ggZm9yXG4gIC8vICAgIGBTZXQtQ29va2llYCBpbiByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3QsIGlmIGFueSwgYW5kIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJMLlxuICAvLyAgICBUT0RPXG5cbiAgLy8gMTguIElmIGFib3J0ZWQsIHRoZW46XG4gIC8vIFRPRE9cblxuICAvLyAxOS4gUnVuIHRoZXNlIHN0ZXBzIGluIHBhcmFsbGVsOlxuXG4gIC8vICAgIDEuIFJ1biB0aGVzZSBzdGVwcywgYnV0IGFib3J0IHdoZW4gZmV0Y2hQYXJhbXMgaXMgY2FuY2VsZWQ6XG4gIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIub24oJ3Rlcm1pbmF0ZWQnLCBvbkFib3J0ZWQpXG4gIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIucmVzdW1lID0gYXN5bmMgKCkgPT4ge1xuICAgIC8vIDEuIFdoaWxlIHRydWVcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgLy8gMS0zLiBTZWUgb25EYXRhLi4uXG5cbiAgICAgIC8vIDQuIFNldCBieXRlcyB0byB0aGUgcmVzdWx0IG9mIGhhbmRsaW5nIGNvbnRlbnQgY29kaW5ncyBnaXZlblxuICAgICAgLy8gY29kaW5ncyBhbmQgYnl0ZXMuXG4gICAgICBsZXQgYnl0ZXNcbiAgICAgIGxldCBpc0ZhaWx1cmVcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IGZldGNoUGFyYW1zLmNvbnRyb2xsZXIubmV4dCgpXG5cbiAgICAgICAgaWYgKGlzQWJvcnRlZChmZXRjaFBhcmFtcykpIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG5cbiAgICAgICAgYnl0ZXMgPSBkb25lID8gdW5kZWZpbmVkIDogdmFsdWVcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoZmV0Y2hQYXJhbXMuY29udHJvbGxlci5lbmRlZCAmJiAhdGltaW5nSW5mby5lbmNvZGVkQm9keVNpemUpIHtcbiAgICAgICAgICAvLyB6bGliIGRvZXNuJ3QgbGlrZSBlbXB0eSBzdHJlYW1zLlxuICAgICAgICAgIGJ5dGVzID0gdW5kZWZpbmVkXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnl0ZXMgPSBlcnJcblxuICAgICAgICAgIC8vIGVyciBtYXkgYmUgcHJvcGFnYXRlZCBmcm9tIHRoZSByZXN1bHQgb2YgY2FsbGluZyByZWFkYWJsZXN0cmVhbS5jYW5jZWwsXG4gICAgICAgICAgLy8gd2hpY2ggbWlnaHQgbm90IGJlIGFuIGVycm9yLiBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9pc3N1ZXMvMjAwOVxuICAgICAgICAgIGlzRmFpbHVyZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYnl0ZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyAyLiBPdGhlcndpc2UsIGlmIHRoZSBieXRlcyB0cmFuc21pc3Npb24gZm9yIHJlc3BvbnNl4oCZcyBtZXNzYWdlXG4gICAgICAgIC8vIGJvZHkgaXMgZG9uZSBub3JtYWxseSBhbmQgc3RyZWFtIGlzIHJlYWRhYmxlLCB0aGVuIGNsb3NlXG4gICAgICAgIC8vIHN0cmVhbSwgZmluYWxpemUgcmVzcG9uc2UgZm9yIGZldGNoUGFyYW1zIGFuZCByZXNwb25zZSwgYW5kXG4gICAgICAgIC8vIGFib3J0IHRoZXNlIGluLXBhcmFsbGVsIHN0ZXBzLlxuICAgICAgICByZWFkYWJsZVN0cmVhbUNsb3NlKGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29udHJvbGxlcilcblxuICAgICAgICBmaW5hbGl6ZVJlc3BvbnNlKGZldGNoUGFyYW1zLCByZXNwb25zZSlcblxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gNS4gSW5jcmVhc2UgdGltaW5nSW5mb+KAmXMgZGVjb2RlZCBib2R5IHNpemUgYnkgYnl0ZXPigJlzIGxlbmd0aC5cbiAgICAgIHRpbWluZ0luZm8uZGVjb2RlZEJvZHlTaXplICs9IGJ5dGVzPy5ieXRlTGVuZ3RoID8/IDBcblxuICAgICAgLy8gNi4gSWYgYnl0ZXMgaXMgZmFpbHVyZSwgdGhlbiB0ZXJtaW5hdGUgZmV0Y2hQYXJhbXPigJlzIGNvbnRyb2xsZXIuXG4gICAgICBpZiAoaXNGYWlsdXJlKSB7XG4gICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIudGVybWluYXRlKGJ5dGVzKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gNy4gRW5xdWV1ZSBhIFVpbnQ4QXJyYXkgd3JhcHBpbmcgYW4gQXJyYXlCdWZmZXIgY29udGFpbmluZyBieXRlc1xuICAgICAgLy8gaW50byBzdHJlYW0uXG4gICAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLmNvbnRyb2xsZXIuZW5xdWV1ZShuZXcgVWludDhBcnJheShieXRlcykpXG5cbiAgICAgIC8vIDguIElmIHN0cmVhbSBpcyBlcnJvcmVkLCB0aGVuIHRlcm1pbmF0ZSB0aGUgb25nb2luZyBmZXRjaC5cbiAgICAgIGlmIChpc0Vycm9yZWQoc3RyZWFtKSkge1xuICAgICAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLnRlcm1pbmF0ZSgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyA5LiBJZiBzdHJlYW0gZG9lc27igJl0IG5lZWQgbW9yZSBkYXRhIGFzayB0aGUgdXNlciBhZ2VudCB0byBzdXNwZW5kXG4gICAgICAvLyB0aGUgb25nb2luZyBmZXRjaC5cbiAgICAgIGlmICghZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb250cm9sbGVyLmRlc2lyZWRTaXplKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vICAgIDIuIElmIGFib3J0ZWQsIHRoZW46XG4gIGZ1bmN0aW9uIG9uQWJvcnRlZCAocmVhc29uKSB7XG4gICAgLy8gMi4gSWYgZmV0Y2hQYXJhbXMgaXMgYWJvcnRlZCwgdGhlbjpcbiAgICBpZiAoaXNBYm9ydGVkKGZldGNoUGFyYW1zKSkge1xuICAgICAgLy8gMS4gU2V0IHJlc3BvbnNl4oCZcyBhYm9ydGVkIGZsYWcuXG4gICAgICByZXNwb25zZS5hYm9ydGVkID0gdHJ1ZVxuXG4gICAgICAvLyAyLiBJZiBzdHJlYW0gaXMgcmVhZGFibGUsIHRoZW4gZXJyb3Igc3RyZWFtIHdpdGggdGhlIHJlc3VsdCBvZlxuICAgICAgLy8gICAgZGVzZXJpYWxpemUgYSBzZXJpYWxpemVkIGFib3J0IHJlYXNvbiBnaXZlbiBmZXRjaFBhcmFtc+KAmXNcbiAgICAgIC8vICAgIGNvbnRyb2xsZXLigJlzIHNlcmlhbGl6ZWQgYWJvcnQgcmVhc29uIGFuZCBhblxuICAgICAgLy8gICAgaW1wbGVtZW50YXRpb24tZGVmaW5lZCByZWFsbS5cbiAgICAgIGlmIChpc1JlYWRhYmxlKHN0cmVhbSkpIHtcbiAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb250cm9sbGVyLmVycm9yKFxuICAgICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuc2VyaWFsaXplZEFib3J0UmVhc29uXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gMy4gT3RoZXJ3aXNlLCBpZiBzdHJlYW0gaXMgcmVhZGFibGUsIGVycm9yIHN0cmVhbSB3aXRoIGEgVHlwZUVycm9yLlxuICAgICAgaWYgKGlzUmVhZGFibGUoc3RyZWFtKSkge1xuICAgICAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLmNvbnRyb2xsZXIuZXJyb3IobmV3IFR5cGVFcnJvcigndGVybWluYXRlZCcsIHtcbiAgICAgICAgICBjYXVzZTogaXNFcnJvckxpa2UocmVhc29uKSA/IHJlYXNvbiA6IHVuZGVmaW5lZFxuICAgICAgICB9KSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA0LiBJZiBjb25uZWN0aW9uIHVzZXMgSFRUUC8yLCB0aGVuIHRyYW5zbWl0IGFuIFJTVF9TVFJFQU0gZnJhbWUuXG4gICAgLy8gNS4gT3RoZXJ3aXNlLCB0aGUgdXNlciBhZ2VudCBzaG91bGQgY2xvc2UgY29ubmVjdGlvbiB1bmxlc3MgaXQgd291bGQgYmUgYmFkIGZvciBwZXJmb3JtYW5jZSB0byBkbyBzby5cbiAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLmNvbm5lY3Rpb24uZGVzdHJveSgpXG4gIH1cblxuICAvLyAyMC4gUmV0dXJuIHJlc3BvbnNlLlxuICByZXR1cm4gcmVzcG9uc2VcblxuICBhc3luYyBmdW5jdGlvbiBkaXNwYXRjaCAoeyBib2R5IH0pIHtcbiAgICBjb25zdCB1cmwgPSByZXF1ZXN0Q3VycmVudFVSTChyZXF1ZXN0KVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KCcuLi8uLicpLkFnZW50fSAqL1xuICAgIGNvbnN0IGFnZW50ID0gZmV0Y2hQYXJhbXMuY29udHJvbGxlci5kaXNwYXRjaGVyXG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gYWdlbnQuZGlzcGF0Y2goXG4gICAgICB7XG4gICAgICAgIHBhdGg6IHVybC5wYXRobmFtZSArIHVybC5zZWFyY2gsXG4gICAgICAgIG9yaWdpbjogdXJsLm9yaWdpbixcbiAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgYm9keTogZmV0Y2hQYXJhbXMuY29udHJvbGxlci5kaXNwYXRjaGVyLmlzTW9ja0FjdGl2ZSA/IHJlcXVlc3QuYm9keSAmJiAocmVxdWVzdC5ib2R5LnNvdXJjZSB8fCByZXF1ZXN0LmJvZHkuc3RyZWFtKSA6IGJvZHksXG4gICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVyc0xpc3QuZW50cmllcyxcbiAgICAgICAgbWF4UmVkaXJlY3Rpb25zOiAwLFxuICAgICAgICB1cGdyYWRlOiByZXF1ZXN0Lm1vZGUgPT09ICd3ZWJzb2NrZXQnID8gJ3dlYnNvY2tldCcgOiB1bmRlZmluZWRcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJvZHk6IG51bGwsXG4gICAgICAgIGFib3J0OiBudWxsLFxuXG4gICAgICAgIG9uQ29ubmVjdCAoYWJvcnQpIHtcbiAgICAgICAgICAvLyBUT0RPIChmaXgpOiBEbyB3ZSBuZWVkIGNvbm5lY3Rpb24gaGVyZT9cbiAgICAgICAgICBjb25zdCB7IGNvbm5lY3Rpb24gfSA9IGZldGNoUGFyYW1zLmNvbnRyb2xsZXJcblxuICAgICAgICAgIGlmIChjb25uZWN0aW9uLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgYWJvcnQobmV3IERPTUV4Y2VwdGlvbignVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZC4nLCAnQWJvcnRFcnJvcicpKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLm9uKCd0ZXJtaW5hdGVkJywgYWJvcnQpXG4gICAgICAgICAgICB0aGlzLmFib3J0ID0gY29ubmVjdGlvbi5hYm9ydCA9IGFib3J0XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIG9uSGVhZGVycyAoc3RhdHVzLCBoZWFkZXJzTGlzdCwgcmVzdW1lLCBzdGF0dXNUZXh0KSB7XG4gICAgICAgICAgaWYgKHN0YXR1cyA8IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IGNvZGluZ3MgPSBbXVxuICAgICAgICAgIGxldCBsb2NhdGlvbiA9ICcnXG5cbiAgICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKVxuXG4gICAgICAgICAgLy8gRm9yIEgyLCB0aGUgaGVhZGVycyBhcmUgYSBwbGFpbiBKUyBvYmplY3RcbiAgICAgICAgICAvLyBXZSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZW0gYW5kIGl0ZXJhdGUgYWNjb3JkaW5nbHlcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzTGlzdCkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgaGVhZGVyc0xpc3QubGVuZ3RoOyBuICs9IDIpIHtcbiAgICAgICAgICAgICAgY29uc3Qga2V5ID0gaGVhZGVyc0xpc3RbbiArIDBdLnRvU3RyaW5nKCdsYXRpbjEnKVxuICAgICAgICAgICAgICBjb25zdCB2YWwgPSBoZWFkZXJzTGlzdFtuICsgMV0udG9TdHJpbmcoJ2xhdGluMScpXG4gICAgICAgICAgICAgIGlmIChrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtZW5jb2RpbmcnKSB7XG4gICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzcyMzEjc2VjdGlvbi0zLjEuMi4xXG4gICAgICAgICAgICAgICAgLy8gXCJBbGwgY29udGVudC1jb2RpbmcgdmFsdWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLi4uXCJcbiAgICAgICAgICAgICAgICBjb2RpbmdzID0gdmFsLnRvTG93ZXJDYXNlKCkuc3BsaXQoJywnKS5tYXAoKHgpID0+IHgudHJpbSgpKVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS50b0xvd2VyQ2FzZSgpID09PSAnbG9jYXRpb24nKSB7XG4gICAgICAgICAgICAgICAgbG9jYXRpb24gPSB2YWxcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGhlYWRlcnNba0hlYWRlcnNMaXN0XS5hcHBlbmQoa2V5LCB2YWwpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhoZWFkZXJzTGlzdClcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsID0gaGVhZGVyc0xpc3Rba2V5XVxuICAgICAgICAgICAgICBpZiAoa2V5LnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LWVuY29kaW5nJykge1xuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM3MjMxI3NlY3Rpb24tMy4xLjIuMVxuICAgICAgICAgICAgICAgIC8vIFwiQWxsIGNvbnRlbnQtY29kaW5nIHZhbHVlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZS4uLlwiXG4gICAgICAgICAgICAgICAgY29kaW5ncyA9IHZhbC50b0xvd2VyQ2FzZSgpLnNwbGl0KCcsJykubWFwKCh4KSA9PiB4LnRyaW0oKSkucmV2ZXJzZSgpXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LnRvTG93ZXJDYXNlKCkgPT09ICdsb2NhdGlvbicpIHtcbiAgICAgICAgICAgICAgICBsb2NhdGlvbiA9IHZhbFxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaGVhZGVyc1trSGVhZGVyc0xpc3RdLmFwcGVuZChrZXksIHZhbClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmJvZHkgPSBuZXcgUmVhZGFibGUoeyByZWFkOiByZXN1bWUgfSlcblxuICAgICAgICAgIGNvbnN0IGRlY29kZXJzID0gW11cblxuICAgICAgICAgIGNvbnN0IHdpbGxGb2xsb3cgPSByZXF1ZXN0LnJlZGlyZWN0ID09PSAnZm9sbG93JyAmJlxuICAgICAgICAgICAgbG9jYXRpb24gJiZcbiAgICAgICAgICAgIHJlZGlyZWN0U3RhdHVzU2V0LmhhcyhzdGF0dXMpXG5cbiAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0hlYWRlcnMvQ29udGVudC1FbmNvZGluZ1xuICAgICAgICAgIGlmIChyZXF1ZXN0Lm1ldGhvZCAhPT0gJ0hFQUQnICYmIHJlcXVlc3QubWV0aG9kICE9PSAnQ09OTkVDVCcgJiYgIW51bGxCb2R5U3RhdHVzLmluY2x1ZGVzKHN0YXR1cykgJiYgIXdpbGxGb2xsb3cpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29kaW5nIG9mIGNvZGluZ3MpIHtcbiAgICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzkxMTIuaHRtbCNzZWN0aW9uLTcuMlxuICAgICAgICAgICAgICBpZiAoY29kaW5nID09PSAneC1nemlwJyB8fCBjb2RpbmcgPT09ICdnemlwJykge1xuICAgICAgICAgICAgICAgIGRlY29kZXJzLnB1c2goemxpYi5jcmVhdGVHdW56aXAoe1xuICAgICAgICAgICAgICAgICAgLy8gQmUgbGVzcyBzdHJpY3Qgd2hlbiBkZWNvZGluZyBjb21wcmVzc2VkIHJlc3BvbnNlcywgc2luY2Ugc29tZXRpbWVzXG4gICAgICAgICAgICAgICAgICAvLyBzZXJ2ZXJzIHNlbmQgc2xpZ2h0bHkgaW52YWxpZCByZXNwb25zZXMgdGhhdCBhcmUgc3RpbGwgYWNjZXB0ZWRcbiAgICAgICAgICAgICAgICAgIC8vIGJ5IGNvbW1vbiBicm93c2Vycy5cbiAgICAgICAgICAgICAgICAgIC8vIEFsd2F5cyB1c2luZyBaX1NZTkNfRkxVU0ggaXMgd2hhdCBjVVJMIGRvZXMuXG4gICAgICAgICAgICAgICAgICBmbHVzaDogemxpYi5jb25zdGFudHMuWl9TWU5DX0ZMVVNILFxuICAgICAgICAgICAgICAgICAgZmluaXNoRmx1c2g6IHpsaWIuY29uc3RhbnRzLlpfU1lOQ19GTFVTSFxuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGluZyA9PT0gJ2RlZmxhdGUnKSB7XG4gICAgICAgICAgICAgICAgZGVjb2RlcnMucHVzaCh6bGliLmNyZWF0ZUluZmxhdGUoKSlcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RpbmcgPT09ICdicicpIHtcbiAgICAgICAgICAgICAgICBkZWNvZGVycy5wdXNoKHpsaWIuY3JlYXRlQnJvdGxpRGVjb21wcmVzcygpKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlY29kZXJzLmxlbmd0aCA9IDBcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICBzdGF0dXNUZXh0LFxuICAgICAgICAgICAgaGVhZGVyc0xpc3Q6IGhlYWRlcnNba0hlYWRlcnNMaXN0XSxcbiAgICAgICAgICAgIGJvZHk6IGRlY29kZXJzLmxlbmd0aFxuICAgICAgICAgICAgICA/IHBpcGVsaW5lKHRoaXMuYm9keSwgLi4uZGVjb2RlcnMsICgpID0+IHsgfSlcbiAgICAgICAgICAgICAgOiB0aGlzLmJvZHkub24oJ2Vycm9yJywgKCkgPT4ge30pXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0sXG5cbiAgICAgICAgb25EYXRhIChjaHVuaykge1xuICAgICAgICAgIGlmIChmZXRjaFBhcmFtcy5jb250cm9sbGVyLmR1bXApIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIDEuIElmIG9uZSBvciBtb3JlIGJ5dGVzIGhhdmUgYmVlbiB0cmFuc21pdHRlZCBmcm9tIHJlc3BvbnNl4oCZc1xuICAgICAgICAgIC8vIG1lc3NhZ2UgYm9keSwgdGhlbjpcblxuICAgICAgICAgIC8vICAxLiBMZXQgYnl0ZXMgYmUgdGhlIHRyYW5zbWl0dGVkIGJ5dGVzLlxuICAgICAgICAgIGNvbnN0IGJ5dGVzID0gY2h1bmtcblxuICAgICAgICAgIC8vICAyLiBMZXQgY29kaW5ncyBiZSB0aGUgcmVzdWx0IG9mIGV4dHJhY3RpbmcgaGVhZGVyIGxpc3QgdmFsdWVzXG4gICAgICAgICAgLy8gIGdpdmVuIGBDb250ZW50LUVuY29kaW5nYCBhbmQgcmVzcG9uc2XigJlzIGhlYWRlciBsaXN0LlxuICAgICAgICAgIC8vICBTZWUgcHVsbEFsZ29yaXRobS5cblxuICAgICAgICAgIC8vICAzLiBJbmNyZWFzZSB0aW1pbmdJbmZv4oCZcyBlbmNvZGVkIGJvZHkgc2l6ZSBieSBieXRlc+KAmXMgbGVuZ3RoLlxuICAgICAgICAgIHRpbWluZ0luZm8uZW5jb2RlZEJvZHlTaXplICs9IGJ5dGVzLmJ5dGVMZW5ndGhcblxuICAgICAgICAgIC8vICA0LiBTZWUgcHVsbEFsZ29yaXRobS4uLlxuXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYm9keS5wdXNoKGJ5dGVzKVxuICAgICAgICB9LFxuXG4gICAgICAgIG9uQ29tcGxldGUgKCkge1xuICAgICAgICAgIGlmICh0aGlzLmFib3J0KSB7XG4gICAgICAgICAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLm9mZigndGVybWluYXRlZCcsIHRoaXMuYWJvcnQpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5lbmRlZCA9IHRydWVcblxuICAgICAgICAgIHRoaXMuYm9keS5wdXNoKG51bGwpXG4gICAgICAgIH0sXG5cbiAgICAgICAgb25FcnJvciAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAodGhpcy5hYm9ydCkge1xuICAgICAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5vZmYoJ3Rlcm1pbmF0ZWQnLCB0aGlzLmFib3J0KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuYm9keT8uZGVzdHJveShlcnJvcilcblxuICAgICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIudGVybWluYXRlKGVycm9yKVxuXG4gICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICB9LFxuXG4gICAgICAgIG9uVXBncmFkZSAoc3RhdHVzLCBoZWFkZXJzTGlzdCwgc29ja2V0KSB7XG4gICAgICAgICAgaWYgKHN0YXR1cyAhPT0gMTAxKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKVxuXG4gICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBoZWFkZXJzTGlzdC5sZW5ndGg7IG4gKz0gMikge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gaGVhZGVyc0xpc3RbbiArIDBdLnRvU3RyaW5nKCdsYXRpbjEnKVxuICAgICAgICAgICAgY29uc3QgdmFsID0gaGVhZGVyc0xpc3RbbiArIDFdLnRvU3RyaW5nKCdsYXRpbjEnKVxuXG4gICAgICAgICAgICBoZWFkZXJzW2tIZWFkZXJzTGlzdF0uYXBwZW5kKGtleSwgdmFsKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgc3RhdHVzVGV4dDogU1RBVFVTX0NPREVTW3N0YXR1c10sXG4gICAgICAgICAgICBoZWFkZXJzTGlzdDogaGVhZGVyc1trSGVhZGVyc0xpc3RdLFxuICAgICAgICAgICAgc29ja2V0XG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBmZXRjaCxcbiAgRmV0Y2gsXG4gIGZldGNoaW5nLFxuICBmaW5hbGl6ZUFuZFJlcG9ydFRpbWluZ1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBrU3RhdGU6IFN5bWJvbCgnRmlsZVJlYWRlciBzdGF0ZScpLFxuICBrUmVzdWx0OiBTeW1ib2woJ0ZpbGVSZWFkZXIgcmVzdWx0JyksXG4gIGtFcnJvcjogU3ltYm9sKCdGaWxlUmVhZGVyIGVycm9yJyksXG4gIGtMYXN0UHJvZ3Jlc3NFdmVudEZpcmVkOiBTeW1ib2woJ0ZpbGVSZWFkZXIgbGFzdCBwcm9ncmVzcyBldmVudCBmaXJlZCB0aW1lc3RhbXAnKSxcbiAga0V2ZW50czogU3ltYm9sKCdGaWxlUmVhZGVyIGV2ZW50cycpLFxuICBrQWJvcnRlZDogU3ltYm9sKCdGaWxlUmVhZGVyIGFib3J0ZWQnKVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgd2ViaWRsIH0gPSByZXF1aXJlKCcuLi9mZXRjaC93ZWJpZGwnKVxuXG5jb25zdCBrU3RhdGUgPSBTeW1ib2woJ1Byb2dyZXNzRXZlbnQgc3RhdGUnKVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly94aHIuc3BlYy53aGF0d2cub3JnLyNwcm9ncmVzc2V2ZW50XG4gKi9cbmNsYXNzIFByb2dyZXNzRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gIGNvbnN0cnVjdG9yICh0eXBlLCBldmVudEluaXREaWN0ID0ge30pIHtcbiAgICB0eXBlID0gd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKHR5cGUpXG4gICAgZXZlbnRJbml0RGljdCA9IHdlYmlkbC5jb252ZXJ0ZXJzLlByb2dyZXNzRXZlbnRJbml0KGV2ZW50SW5pdERpY3QgPz8ge30pXG5cbiAgICBzdXBlcih0eXBlLCBldmVudEluaXREaWN0KVxuXG4gICAgdGhpc1trU3RhdGVdID0ge1xuICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogZXZlbnRJbml0RGljdC5sZW5ndGhDb21wdXRhYmxlLFxuICAgICAgbG9hZGVkOiBldmVudEluaXREaWN0LmxvYWRlZCxcbiAgICAgIHRvdGFsOiBldmVudEluaXREaWN0LnRvdGFsXG4gICAgfVxuICB9XG5cbiAgZ2V0IGxlbmd0aENvbXB1dGFibGUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFByb2dyZXNzRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmxlbmd0aENvbXB1dGFibGVcbiAgfVxuXG4gIGdldCBsb2FkZWQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFByb2dyZXNzRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmxvYWRlZFxuICB9XG5cbiAgZ2V0IHRvdGFsICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBQcm9ncmVzc0V2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS50b3RhbFxuICB9XG59XG5cbndlYmlkbC5jb252ZXJ0ZXJzLlByb2dyZXNzRXZlbnRJbml0ID0gd2ViaWRsLmRpY3Rpb25hcnlDb252ZXJ0ZXIoW1xuICB7XG4gICAga2V5OiAnbGVuZ3RoQ29tcHV0YWJsZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ib29sZWFuLFxuICAgIGRlZmF1bHRWYWx1ZTogZmFsc2VcbiAgfSxcbiAge1xuICAgIGtleTogJ2xvYWRlZCcsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVyc1sndW5zaWduZWQgbG9uZyBsb25nJ10sXG4gICAgZGVmYXVsdFZhbHVlOiAwXG4gIH0sXG4gIHtcbiAgICBrZXk6ICd0b3RhbCcsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVyc1sndW5zaWduZWQgbG9uZyBsb25nJ10sXG4gICAgZGVmYXVsdFZhbHVlOiAwXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdidWJibGVzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4sXG4gICAgZGVmYXVsdFZhbHVlOiBmYWxzZVxuICB9LFxuICB7XG4gICAga2V5OiAnY2FuY2VsYWJsZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ib29sZWFuLFxuICAgIGRlZmF1bHRWYWx1ZTogZmFsc2VcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbXBvc2VkJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4sXG4gICAgZGVmYXVsdFZhbHVlOiBmYWxzZVxuICB9XG5dKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgUHJvZ3Jlc3NFdmVudFxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogQHNlZSBodHRwczovL2VuY29kaW5nLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1lbmNvZGluZy1nZXRcbiAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gbGFiZWxcbiAqL1xuZnVuY3Rpb24gZ2V0RW5jb2RpbmcgKGxhYmVsKSB7XG4gIGlmICghbGFiZWwpIHtcbiAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gIH1cblxuICAvLyAxLiBSZW1vdmUgYW55IGxlYWRpbmcgYW5kIHRyYWlsaW5nIEFTQ0lJIHdoaXRlc3BhY2UgZnJvbSBsYWJlbC5cbiAgLy8gMi4gSWYgbGFiZWwgaXMgYW4gQVNDSUkgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBmb3IgYW55IG9mIHRoZVxuICAvLyAgICBsYWJlbHMgbGlzdGVkIGluIHRoZSB0YWJsZSBiZWxvdywgdGhlbiByZXR1cm4gdGhlXG4gIC8vICAgIGNvcnJlc3BvbmRpbmcgZW5jb2Rpbmc7IG90aGVyd2lzZSByZXR1cm4gZmFpbHVyZS5cbiAgc3dpdGNoIChsYWJlbC50cmltKCkudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ3VuaWNvZGUtMS0xLXV0Zi04JzpcbiAgICBjYXNlICd1bmljb2RlMTF1dGY4JzpcbiAgICBjYXNlICd1bmljb2RlMjB1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAndXRmOCc6XG4gICAgY2FzZSAneC11bmljb2RlMjB1dGY4JzpcbiAgICAgIHJldHVybiAnVVRGLTgnXG4gICAgY2FzZSAnODY2JzpcbiAgICBjYXNlICdjcDg2Nic6XG4gICAgY2FzZSAnY3NpYm04NjYnOlxuICAgIGNhc2UgJ2libTg2Nic6XG4gICAgICByZXR1cm4gJ0lCTTg2NidcbiAgICBjYXNlICdjc2lzb2xhdGluMic6XG4gICAgY2FzZSAnaXNvLTg4NTktMic6XG4gICAgY2FzZSAnaXNvLWlyLTEwMSc6XG4gICAgY2FzZSAnaXNvODg1OS0yJzpcbiAgICBjYXNlICdpc284ODU5Mic6XG4gICAgY2FzZSAnaXNvXzg4NTktMic6XG4gICAgY2FzZSAnaXNvXzg4NTktMjoxOTg3JzpcbiAgICBjYXNlICdsMic6XG4gICAgY2FzZSAnbGF0aW4yJzpcbiAgICAgIHJldHVybiAnSVNPLTg4NTktMidcbiAgICBjYXNlICdjc2lzb2xhdGluMyc6XG4gICAgY2FzZSAnaXNvLTg4NTktMyc6XG4gICAgY2FzZSAnaXNvLWlyLTEwOSc6XG4gICAgY2FzZSAnaXNvODg1OS0zJzpcbiAgICBjYXNlICdpc284ODU5Myc6XG4gICAgY2FzZSAnaXNvXzg4NTktMyc6XG4gICAgY2FzZSAnaXNvXzg4NTktMzoxOTg4JzpcbiAgICBjYXNlICdsMyc6XG4gICAgY2FzZSAnbGF0aW4zJzpcbiAgICAgIHJldHVybiAnSVNPLTg4NTktMydcbiAgICBjYXNlICdjc2lzb2xhdGluNCc6XG4gICAgY2FzZSAnaXNvLTg4NTktNCc6XG4gICAgY2FzZSAnaXNvLWlyLTExMCc6XG4gICAgY2FzZSAnaXNvODg1OS00JzpcbiAgICBjYXNlICdpc284ODU5NCc6XG4gICAgY2FzZSAnaXNvXzg4NTktNCc6XG4gICAgY2FzZSAnaXNvXzg4NTktNDoxOTg4JzpcbiAgICBjYXNlICdsNCc6XG4gICAgY2FzZSAnbGF0aW40JzpcbiAgICAgIHJldHVybiAnSVNPLTg4NTktNCdcbiAgICBjYXNlICdjc2lzb2xhdGluY3lyaWxsaWMnOlxuICAgIGNhc2UgJ2N5cmlsbGljJzpcbiAgICBjYXNlICdpc28tODg1OS01JzpcbiAgICBjYXNlICdpc28taXItMTQ0JzpcbiAgICBjYXNlICdpc284ODU5LTUnOlxuICAgIGNhc2UgJ2lzbzg4NTk1JzpcbiAgICBjYXNlICdpc29fODg1OS01JzpcbiAgICBjYXNlICdpc29fODg1OS01OjE5ODgnOlxuICAgICAgcmV0dXJuICdJU08tODg1OS01J1xuICAgIGNhc2UgJ2FyYWJpYyc6XG4gICAgY2FzZSAnYXNtby03MDgnOlxuICAgIGNhc2UgJ2NzaXNvODg1OTZlJzpcbiAgICBjYXNlICdjc2lzbzg4NTk2aSc6XG4gICAgY2FzZSAnY3Npc29sYXRpbmFyYWJpYyc6XG4gICAgY2FzZSAnZWNtYS0xMTQnOlxuICAgIGNhc2UgJ2lzby04ODU5LTYnOlxuICAgIGNhc2UgJ2lzby04ODU5LTYtZSc6XG4gICAgY2FzZSAnaXNvLTg4NTktNi1pJzpcbiAgICBjYXNlICdpc28taXItMTI3JzpcbiAgICBjYXNlICdpc284ODU5LTYnOlxuICAgIGNhc2UgJ2lzbzg4NTk2JzpcbiAgICBjYXNlICdpc29fODg1OS02JzpcbiAgICBjYXNlICdpc29fODg1OS02OjE5ODcnOlxuICAgICAgcmV0dXJuICdJU08tODg1OS02J1xuICAgIGNhc2UgJ2NzaXNvbGF0aW5ncmVlayc6XG4gICAgY2FzZSAnZWNtYS0xMTgnOlxuICAgIGNhc2UgJ2Vsb3RfOTI4JzpcbiAgICBjYXNlICdncmVlayc6XG4gICAgY2FzZSAnZ3JlZWs4JzpcbiAgICBjYXNlICdpc28tODg1OS03JzpcbiAgICBjYXNlICdpc28taXItMTI2JzpcbiAgICBjYXNlICdpc284ODU5LTcnOlxuICAgIGNhc2UgJ2lzbzg4NTk3JzpcbiAgICBjYXNlICdpc29fODg1OS03JzpcbiAgICBjYXNlICdpc29fODg1OS03OjE5ODcnOlxuICAgIGNhc2UgJ3N1bl9ldV9ncmVlayc6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTcnXG4gICAgY2FzZSAnY3Npc284ODU5OGUnOlxuICAgIGNhc2UgJ2NzaXNvbGF0aW5oZWJyZXcnOlxuICAgIGNhc2UgJ2hlYnJldyc6XG4gICAgY2FzZSAnaXNvLTg4NTktOCc6XG4gICAgY2FzZSAnaXNvLTg4NTktOC1lJzpcbiAgICBjYXNlICdpc28taXItMTM4JzpcbiAgICBjYXNlICdpc284ODU5LTgnOlxuICAgIGNhc2UgJ2lzbzg4NTk4JzpcbiAgICBjYXNlICdpc29fODg1OS04JzpcbiAgICBjYXNlICdpc29fODg1OS04OjE5ODgnOlxuICAgIGNhc2UgJ3Zpc3VhbCc6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTgnXG4gICAgY2FzZSAnY3Npc284ODU5OGknOlxuICAgIGNhc2UgJ2lzby04ODU5LTgtaSc6XG4gICAgY2FzZSAnbG9naWNhbCc6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTgtSSdcbiAgICBjYXNlICdjc2lzb2xhdGluNic6XG4gICAgY2FzZSAnaXNvLTg4NTktMTAnOlxuICAgIGNhc2UgJ2lzby1pci0xNTcnOlxuICAgIGNhc2UgJ2lzbzg4NTktMTAnOlxuICAgIGNhc2UgJ2lzbzg4NTkxMCc6XG4gICAgY2FzZSAnbDYnOlxuICAgIGNhc2UgJ2xhdGluNic6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTEwJ1xuICAgIGNhc2UgJ2lzby04ODU5LTEzJzpcbiAgICBjYXNlICdpc284ODU5LTEzJzpcbiAgICBjYXNlICdpc284ODU5MTMnOlxuICAgICAgcmV0dXJuICdJU08tODg1OS0xMydcbiAgICBjYXNlICdpc28tODg1OS0xNCc6XG4gICAgY2FzZSAnaXNvODg1OS0xNCc6XG4gICAgY2FzZSAnaXNvODg1OTE0JzpcbiAgICAgIHJldHVybiAnSVNPLTg4NTktMTQnXG4gICAgY2FzZSAnY3Npc29sYXRpbjknOlxuICAgIGNhc2UgJ2lzby04ODU5LTE1JzpcbiAgICBjYXNlICdpc284ODU5LTE1JzpcbiAgICBjYXNlICdpc284ODU5MTUnOlxuICAgIGNhc2UgJ2lzb184ODU5LTE1JzpcbiAgICBjYXNlICdsOSc6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTE1J1xuICAgIGNhc2UgJ2lzby04ODU5LTE2JzpcbiAgICAgIHJldHVybiAnSVNPLTg4NTktMTYnXG4gICAgY2FzZSAnY3Nrb2k4cic6XG4gICAgY2FzZSAna29pJzpcbiAgICBjYXNlICdrb2k4JzpcbiAgICBjYXNlICdrb2k4LXInOlxuICAgIGNhc2UgJ2tvaThfcic6XG4gICAgICByZXR1cm4gJ0tPSTgtUidcbiAgICBjYXNlICdrb2k4LXJ1JzpcbiAgICBjYXNlICdrb2k4LXUnOlxuICAgICAgcmV0dXJuICdLT0k4LVUnXG4gICAgY2FzZSAnY3NtYWNpbnRvc2gnOlxuICAgIGNhc2UgJ21hYyc6XG4gICAgY2FzZSAnbWFjaW50b3NoJzpcbiAgICBjYXNlICd4LW1hYy1yb21hbic6XG4gICAgICByZXR1cm4gJ21hY2ludG9zaCdcbiAgICBjYXNlICdpc28tODg1OS0xMSc6XG4gICAgY2FzZSAnaXNvODg1OS0xMSc6XG4gICAgY2FzZSAnaXNvODg1OTExJzpcbiAgICBjYXNlICd0aXMtNjIwJzpcbiAgICBjYXNlICd3aW5kb3dzLTg3NCc6XG4gICAgICByZXR1cm4gJ3dpbmRvd3MtODc0J1xuICAgIGNhc2UgJ2NwMTI1MCc6XG4gICAgY2FzZSAnd2luZG93cy0xMjUwJzpcbiAgICBjYXNlICd4LWNwMTI1MCc6XG4gICAgICByZXR1cm4gJ3dpbmRvd3MtMTI1MCdcbiAgICBjYXNlICdjcDEyNTEnOlxuICAgIGNhc2UgJ3dpbmRvd3MtMTI1MSc6XG4gICAgY2FzZSAneC1jcDEyNTEnOlxuICAgICAgcmV0dXJuICd3aW5kb3dzLTEyNTEnXG4gICAgY2FzZSAnYW5zaV94My40LTE5NjgnOlxuICAgIGNhc2UgJ2FzY2lpJzpcbiAgICBjYXNlICdjcDEyNTInOlxuICAgIGNhc2UgJ2NwODE5JzpcbiAgICBjYXNlICdjc2lzb2xhdGluMSc6XG4gICAgY2FzZSAnaWJtODE5JzpcbiAgICBjYXNlICdpc28tODg1OS0xJzpcbiAgICBjYXNlICdpc28taXItMTAwJzpcbiAgICBjYXNlICdpc284ODU5LTEnOlxuICAgIGNhc2UgJ2lzbzg4NTkxJzpcbiAgICBjYXNlICdpc29fODg1OS0xJzpcbiAgICBjYXNlICdpc29fODg1OS0xOjE5ODcnOlxuICAgIGNhc2UgJ2wxJzpcbiAgICBjYXNlICdsYXRpbjEnOlxuICAgIGNhc2UgJ3VzLWFzY2lpJzpcbiAgICBjYXNlICd3aW5kb3dzLTEyNTInOlxuICAgIGNhc2UgJ3gtY3AxMjUyJzpcbiAgICAgIHJldHVybiAnd2luZG93cy0xMjUyJ1xuICAgIGNhc2UgJ2NwMTI1Myc6XG4gICAgY2FzZSAnd2luZG93cy0xMjUzJzpcbiAgICBjYXNlICd4LWNwMTI1Myc6XG4gICAgICByZXR1cm4gJ3dpbmRvd3MtMTI1MydcbiAgICBjYXNlICdjcDEyNTQnOlxuICAgIGNhc2UgJ2NzaXNvbGF0aW41JzpcbiAgICBjYXNlICdpc28tODg1OS05JzpcbiAgICBjYXNlICdpc28taXItMTQ4JzpcbiAgICBjYXNlICdpc284ODU5LTknOlxuICAgIGNhc2UgJ2lzbzg4NTk5JzpcbiAgICBjYXNlICdpc29fODg1OS05JzpcbiAgICBjYXNlICdpc29fODg1OS05OjE5ODknOlxuICAgIGNhc2UgJ2w1JzpcbiAgICBjYXNlICdsYXRpbjUnOlxuICAgIGNhc2UgJ3dpbmRvd3MtMTI1NCc6XG4gICAgY2FzZSAneC1jcDEyNTQnOlxuICAgICAgcmV0dXJuICd3aW5kb3dzLTEyNTQnXG4gICAgY2FzZSAnY3AxMjU1JzpcbiAgICBjYXNlICd3aW5kb3dzLTEyNTUnOlxuICAgIGNhc2UgJ3gtY3AxMjU1JzpcbiAgICAgIHJldHVybiAnd2luZG93cy0xMjU1J1xuICAgIGNhc2UgJ2NwMTI1Nic6XG4gICAgY2FzZSAnd2luZG93cy0xMjU2JzpcbiAgICBjYXNlICd4LWNwMTI1Nic6XG4gICAgICByZXR1cm4gJ3dpbmRvd3MtMTI1NidcbiAgICBjYXNlICdjcDEyNTcnOlxuICAgIGNhc2UgJ3dpbmRvd3MtMTI1Nyc6XG4gICAgY2FzZSAneC1jcDEyNTcnOlxuICAgICAgcmV0dXJuICd3aW5kb3dzLTEyNTcnXG4gICAgY2FzZSAnY3AxMjU4JzpcbiAgICBjYXNlICd3aW5kb3dzLTEyNTgnOlxuICAgIGNhc2UgJ3gtY3AxMjU4JzpcbiAgICAgIHJldHVybiAnd2luZG93cy0xMjU4J1xuICAgIGNhc2UgJ3gtbWFjLWN5cmlsbGljJzpcbiAgICBjYXNlICd4LW1hYy11a3JhaW5pYW4nOlxuICAgICAgcmV0dXJuICd4LW1hYy1jeXJpbGxpYydcbiAgICBjYXNlICdjaGluZXNlJzpcbiAgICBjYXNlICdjc2diMjMxMic6XG4gICAgY2FzZSAnY3Npc281OGdiMjMxMjgwJzpcbiAgICBjYXNlICdnYjIzMTInOlxuICAgIGNhc2UgJ2diXzIzMTInOlxuICAgIGNhc2UgJ2diXzIzMTItODAnOlxuICAgIGNhc2UgJ2diayc6XG4gICAgY2FzZSAnaXNvLWlyLTU4JzpcbiAgICBjYXNlICd4LWdiayc6XG4gICAgICByZXR1cm4gJ0dCSydcbiAgICBjYXNlICdnYjE4MDMwJzpcbiAgICAgIHJldHVybiAnZ2IxODAzMCdcbiAgICBjYXNlICdiaWc1JzpcbiAgICBjYXNlICdiaWc1LWhrc2NzJzpcbiAgICBjYXNlICdjbi1iaWc1JzpcbiAgICBjYXNlICdjc2JpZzUnOlxuICAgIGNhc2UgJ3gteC1iaWc1JzpcbiAgICAgIHJldHVybiAnQmlnNSdcbiAgICBjYXNlICdjc2V1Y3BrZGZtdGphcGFuZXNlJzpcbiAgICBjYXNlICdldWMtanAnOlxuICAgIGNhc2UgJ3gtZXVjLWpwJzpcbiAgICAgIHJldHVybiAnRVVDLUpQJ1xuICAgIGNhc2UgJ2NzaXNvMjAyMmpwJzpcbiAgICBjYXNlICdpc28tMjAyMi1qcCc6XG4gICAgICByZXR1cm4gJ0lTTy0yMDIyLUpQJ1xuICAgIGNhc2UgJ2Nzc2hpZnRqaXMnOlxuICAgIGNhc2UgJ21zOTMyJzpcbiAgICBjYXNlICdtc19rYW5qaSc6XG4gICAgY2FzZSAnc2hpZnQtamlzJzpcbiAgICBjYXNlICdzaGlmdF9qaXMnOlxuICAgIGNhc2UgJ3NqaXMnOlxuICAgIGNhc2UgJ3dpbmRvd3MtMzFqJzpcbiAgICBjYXNlICd4LXNqaXMnOlxuICAgICAgcmV0dXJuICdTaGlmdF9KSVMnXG4gICAgY2FzZSAnY3NldWNrcic6XG4gICAgY2FzZSAnY3Nrc2M1NjAxMTk4Nyc6XG4gICAgY2FzZSAnZXVjLWtyJzpcbiAgICBjYXNlICdpc28taXItMTQ5JzpcbiAgICBjYXNlICdrb3JlYW4nOlxuICAgIGNhc2UgJ2tzX2NfNTYwMS0xOTg3JzpcbiAgICBjYXNlICdrc19jXzU2MDEtMTk4OSc6XG4gICAgY2FzZSAna3NjNTYwMSc6XG4gICAgY2FzZSAna3NjXzU2MDEnOlxuICAgIGNhc2UgJ3dpbmRvd3MtOTQ5JzpcbiAgICAgIHJldHVybiAnRVVDLUtSJ1xuICAgIGNhc2UgJ2NzaXNvMjAyMmtyJzpcbiAgICBjYXNlICdoei1nYi0yMzEyJzpcbiAgICBjYXNlICdpc28tMjAyMi1jbic6XG4gICAgY2FzZSAnaXNvLTIwMjItY24tZXh0JzpcbiAgICBjYXNlICdpc28tMjAyMi1rcic6XG4gICAgY2FzZSAncmVwbGFjZW1lbnQnOlxuICAgICAgcmV0dXJuICdyZXBsYWNlbWVudCdcbiAgICBjYXNlICd1bmljb2RlZmZmZSc6XG4gICAgY2FzZSAndXRmLTE2YmUnOlxuICAgICAgcmV0dXJuICdVVEYtMTZCRSdcbiAgICBjYXNlICdjc3VuaWNvZGUnOlxuICAgIGNhc2UgJ2lzby0xMDY0Ni11Y3MtMic6XG4gICAgY2FzZSAndWNzLTInOlxuICAgIGNhc2UgJ3VuaWNvZGUnOlxuICAgIGNhc2UgJ3VuaWNvZGVmZWZmJzpcbiAgICBjYXNlICd1dGYtMTYnOlxuICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIHJldHVybiAnVVRGLTE2TEUnXG4gICAgY2FzZSAneC11c2VyLWRlZmluZWQnOlxuICAgICAgcmV0dXJuICd4LXVzZXItZGVmaW5lZCdcbiAgICBkZWZhdWx0OiByZXR1cm4gJ2ZhaWx1cmUnXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldEVuY29kaW5nXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBrU3RhdGUsXG4gIGtFcnJvcixcbiAga1Jlc3VsdCxcbiAga0Fib3J0ZWQsXG4gIGtMYXN0UHJvZ3Jlc3NFdmVudEZpcmVkXG59ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgUHJvZ3Jlc3NFdmVudCB9ID0gcmVxdWlyZSgnLi9wcm9ncmVzc2V2ZW50JylcbmNvbnN0IHsgZ2V0RW5jb2RpbmcgfSA9IHJlcXVpcmUoJy4vZW5jb2RpbmcnKVxuY29uc3QgeyBET01FeGNlcHRpb24gfSA9IHJlcXVpcmUoJy4uL2ZldGNoL2NvbnN0YW50cycpXG5jb25zdCB7IHNlcmlhbGl6ZUFNaW1lVHlwZSwgcGFyc2VNSU1FVHlwZSB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvZGF0YVVSTCcpXG5jb25zdCB7IHR5cGVzIH0gPSByZXF1aXJlKCd1dGlsJylcbmNvbnN0IHsgU3RyaW5nRGVjb2RlciB9ID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXInKVxuY29uc3QgeyBidG9hIH0gPSByZXF1aXJlKCdidWZmZXInKVxuXG4vKiogQHR5cGUge1Byb3BlcnR5RGVzY3JpcHRvcn0gKi9cbmNvbnN0IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMgPSB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiBmYWxzZSxcbiAgY29uZmlndXJhYmxlOiBmYWxzZVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI3JlYWRPcGVyYXRpb25cbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2ZpbGVyZWFkZXInKS5GaWxlUmVhZGVyfSBmclxuICogQHBhcmFtIHtpbXBvcnQoJ2J1ZmZlcicpLkJsb2J9IGJsb2JcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge3N0cmluZz99IGVuY29kaW5nTmFtZVxuICovXG5mdW5jdGlvbiByZWFkT3BlcmF0aW9uIChmciwgYmxvYiwgdHlwZSwgZW5jb2RpbmdOYW1lKSB7XG4gIC8vIDEuIElmIGZy4oCZcyBzdGF0ZSBpcyBcImxvYWRpbmdcIiwgdGhyb3cgYW4gSW52YWxpZFN0YXRlRXJyb3JcbiAgLy8gICAgRE9NRXhjZXB0aW9uLlxuICBpZiAoZnJba1N0YXRlXSA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignSW52YWxpZCBzdGF0ZScsICdJbnZhbGlkU3RhdGVFcnJvcicpXG4gIH1cblxuICAvLyAyLiBTZXQgZnLigJlzIHN0YXRlIHRvIFwibG9hZGluZ1wiLlxuICBmcltrU3RhdGVdID0gJ2xvYWRpbmcnXG5cbiAgLy8gMy4gU2V0IGZy4oCZcyByZXN1bHQgdG8gbnVsbC5cbiAgZnJba1Jlc3VsdF0gPSBudWxsXG5cbiAgLy8gNC4gU2V0IGZy4oCZcyBlcnJvciB0byBudWxsLlxuICBmcltrRXJyb3JdID0gbnVsbFxuXG4gIC8vIDUuIExldCBzdHJlYW0gYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGdldCBzdHJlYW0gb24gYmxvYi5cbiAgLyoqIEB0eXBlIHtpbXBvcnQoJ3N0cmVhbS93ZWInKS5SZWFkYWJsZVN0cmVhbX0gKi9cbiAgY29uc3Qgc3RyZWFtID0gYmxvYi5zdHJlYW0oKVxuXG4gIC8vIDYuIExldCByZWFkZXIgYmUgdGhlIHJlc3VsdCBvZiBnZXR0aW5nIGEgcmVhZGVyIGZyb20gc3RyZWFtLlxuICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKClcblxuICAvLyA3LiBMZXQgYnl0ZXMgYmUgYW4gZW1wdHkgYnl0ZSBzZXF1ZW5jZS5cbiAgLyoqIEB0eXBlIHtVaW50OEFycmF5W119ICovXG4gIGNvbnN0IGJ5dGVzID0gW11cblxuICAvLyA4LiBMZXQgY2h1bmtQcm9taXNlIGJlIHRoZSByZXN1bHQgb2YgcmVhZGluZyBhIGNodW5rIGZyb21cbiAgLy8gICAgc3RyZWFtIHdpdGggcmVhZGVyLlxuICBsZXQgY2h1bmtQcm9taXNlID0gcmVhZGVyLnJlYWQoKVxuXG4gIC8vIDkuIExldCBpc0ZpcnN0Q2h1bmsgYmUgdHJ1ZS5cbiAgbGV0IGlzRmlyc3RDaHVuayA9IHRydWVcblxuICAvLyAxMC4gSW4gcGFyYWxsZWwsIHdoaWxlIHRydWU6XG4gIC8vIE5vdGU6IFwiSW4gcGFyYWxsZWxcIiBqdXN0IG1lYW5zIG5vbi1ibG9ja2luZ1xuICAvLyBOb3RlIDI6IHJlYWRPcGVyYXRpb24gaXRzZWxmIGNhbm5vdCBiZSBhc3luYyBhcyBkb3VibGVcbiAgLy8gcmVhZGluZyB0aGUgYm9keSB3b3VsZCB0aGVuIHJlamVjdCB0aGUgcHJvbWlzZSwgaW5zdGVhZFxuICAvLyBvZiB0aHJvd2luZyBhbiBlcnJvci5cbiAgOyhhc3luYyAoKSA9PiB7XG4gICAgd2hpbGUgKCFmcltrQWJvcnRlZF0pIHtcbiAgICAgIC8vIDEuIFdhaXQgZm9yIGNodW5rUHJvbWlzZSB0byBiZSBmdWxmaWxsZWQgb3IgcmVqZWN0ZWQuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCBjaHVua1Byb21pc2VcblxuICAgICAgICAvLyAyLiBJZiBjaHVua1Byb21pc2UgaXMgZnVsZmlsbGVkLCBhbmQgaXNGaXJzdENodW5rIGlzXG4gICAgICAgIC8vICAgIHRydWUsIHF1ZXVlIGEgdGFzayB0byBmaXJlIGEgcHJvZ3Jlc3MgZXZlbnQgY2FsbGVkXG4gICAgICAgIC8vICAgIGxvYWRzdGFydCBhdCBmci5cbiAgICAgICAgaWYgKGlzRmlyc3RDaHVuayAmJiAhZnJba0Fib3J0ZWRdKSB7XG4gICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgZmlyZUFQcm9ncmVzc0V2ZW50KCdsb2Fkc3RhcnQnLCBmcilcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMy4gU2V0IGlzRmlyc3RDaHVuayB0byBmYWxzZS5cbiAgICAgICAgaXNGaXJzdENodW5rID0gZmFsc2VcblxuICAgICAgICAvLyA0LiBJZiBjaHVua1Byb21pc2UgaXMgZnVsZmlsbGVkIHdpdGggYW4gb2JqZWN0IHdob3NlXG4gICAgICAgIC8vICAgIGRvbmUgcHJvcGVydHkgaXMgZmFsc2UgYW5kIHdob3NlIHZhbHVlIHByb3BlcnR5IGlzXG4gICAgICAgIC8vICAgIGEgVWludDhBcnJheSBvYmplY3QsIHJ1biB0aGVzZSBzdGVwczpcbiAgICAgICAgaWYgKCFkb25lICYmIHR5cGVzLmlzVWludDhBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAvLyAxLiBMZXQgYnMgYmUgdGhlIGJ5dGUgc2VxdWVuY2UgcmVwcmVzZW50ZWQgYnkgdGhlXG4gICAgICAgICAgLy8gICAgVWludDhBcnJheSBvYmplY3QuXG5cbiAgICAgICAgICAvLyAyLiBBcHBlbmQgYnMgdG8gYnl0ZXMuXG4gICAgICAgICAgYnl0ZXMucHVzaCh2YWx1ZSlcblxuICAgICAgICAgIC8vIDMuIElmIHJvdWdobHkgNTBtcyBoYXZlIHBhc3NlZCBzaW5jZSB0aGVzZSBzdGVwc1xuICAgICAgICAgIC8vICAgIHdlcmUgbGFzdCBpbnZva2VkLCBxdWV1ZSBhIHRhc2sgdG8gZmlyZSBhXG4gICAgICAgICAgLy8gICAgcHJvZ3Jlc3MgZXZlbnQgY2FsbGVkIHByb2dyZXNzIGF0IGZyLlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgZnJba0xhc3RQcm9ncmVzc0V2ZW50RmlyZWRdID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgRGF0ZS5ub3coKSAtIGZyW2tMYXN0UHJvZ3Jlc3NFdmVudEZpcmVkXSA+PSA1MFxuICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgIWZyW2tBYm9ydGVkXVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZnJba0xhc3RQcm9ncmVzc0V2ZW50RmlyZWRdID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgICBmaXJlQVByb2dyZXNzRXZlbnQoJ3Byb2dyZXNzJywgZnIpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIDQuIFNldCBjaHVua1Byb21pc2UgdG8gdGhlIHJlc3VsdCBvZiByZWFkaW5nIGFcbiAgICAgICAgICAvLyAgICBjaHVuayBmcm9tIHN0cmVhbSB3aXRoIHJlYWRlci5cbiAgICAgICAgICBjaHVua1Byb21pc2UgPSByZWFkZXIucmVhZCgpXG4gICAgICAgIH0gZWxzZSBpZiAoZG9uZSkge1xuICAgICAgICAgIC8vIDUuIE90aGVyd2lzZSwgaWYgY2h1bmtQcm9taXNlIGlzIGZ1bGZpbGxlZCB3aXRoIGFuXG4gICAgICAgICAgLy8gICAgb2JqZWN0IHdob3NlIGRvbmUgcHJvcGVydHkgaXMgdHJ1ZSwgcXVldWUgYSB0YXNrXG4gICAgICAgICAgLy8gICAgdG8gcnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgYW5kIGFib3J0IHRoaXMgYWxnb3JpdGhtOlxuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgIC8vIDEuIFNldCBmcuKAmXMgc3RhdGUgdG8gXCJkb25lXCIuXG4gICAgICAgICAgICBmcltrU3RhdGVdID0gJ2RvbmUnXG5cbiAgICAgICAgICAgIC8vIDIuIExldCByZXN1bHQgYmUgdGhlIHJlc3VsdCBvZiBwYWNrYWdlIGRhdGEgZ2l2ZW5cbiAgICAgICAgICAgIC8vICAgIGJ5dGVzLCB0eXBlLCBibG9i4oCZcyB0eXBlLCBhbmQgZW5jb2RpbmdOYW1lLlxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcGFja2FnZURhdGEoYnl0ZXMsIHR5cGUsIGJsb2IudHlwZSwgZW5jb2RpbmdOYW1lKVxuXG4gICAgICAgICAgICAgIC8vIDQuIEVsc2U6XG5cbiAgICAgICAgICAgICAgaWYgKGZyW2tBYm9ydGVkXSkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gMS4gU2V0IGZy4oCZcyByZXN1bHQgdG8gcmVzdWx0LlxuICAgICAgICAgICAgICBmcltrUmVzdWx0XSA9IHJlc3VsdFxuXG4gICAgICAgICAgICAgIC8vIDIuIEZpcmUgYSBwcm9ncmVzcyBldmVudCBjYWxsZWQgbG9hZCBhdCB0aGUgZnIuXG4gICAgICAgICAgICAgIGZpcmVBUHJvZ3Jlc3NFdmVudCgnbG9hZCcsIGZyKVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgLy8gMy4gSWYgcGFja2FnZSBkYXRhIHRocmV3IGFuIGV4Y2VwdGlvbiBlcnJvcjpcblxuICAgICAgICAgICAgICAvLyAxLiBTZXQgZnLigJlzIGVycm9yIHRvIGVycm9yLlxuICAgICAgICAgICAgICBmcltrRXJyb3JdID0gZXJyb3JcblxuICAgICAgICAgICAgICAvLyAyLiBGaXJlIGEgcHJvZ3Jlc3MgZXZlbnQgY2FsbGVkIGVycm9yIGF0IGZyLlxuICAgICAgICAgICAgICBmaXJlQVByb2dyZXNzRXZlbnQoJ2Vycm9yJywgZnIpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIDUuIElmIGZy4oCZcyBzdGF0ZSBpcyBub3QgXCJsb2FkaW5nXCIsIGZpcmUgYSBwcm9ncmVzc1xuICAgICAgICAgICAgLy8gICAgZXZlbnQgY2FsbGVkIGxvYWRlbmQgYXQgdGhlIGZyLlxuICAgICAgICAgICAgaWYgKGZyW2tTdGF0ZV0gIT09ICdsb2FkaW5nJykge1xuICAgICAgICAgICAgICBmaXJlQVByb2dyZXNzRXZlbnQoJ2xvYWRlbmQnLCBmcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGZyW2tBYm9ydGVkXSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNi4gT3RoZXJ3aXNlLCBpZiBjaHVua1Byb21pc2UgaXMgcmVqZWN0ZWQgd2l0aCBhblxuICAgICAgICAvLyAgICBlcnJvciBlcnJvciwgcXVldWUgYSB0YXNrIHRvIHJ1biB0aGUgZm9sbG93aW5nXG4gICAgICAgIC8vICAgIHN0ZXBzIGFuZCBhYm9ydCB0aGlzIGFsZ29yaXRobTpcbiAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgIC8vIDEuIFNldCBmcuKAmXMgc3RhdGUgdG8gXCJkb25lXCIuXG4gICAgICAgICAgZnJba1N0YXRlXSA9ICdkb25lJ1xuXG4gICAgICAgICAgLy8gMi4gU2V0IGZy4oCZcyBlcnJvciB0byBlcnJvci5cbiAgICAgICAgICBmcltrRXJyb3JdID0gZXJyb3JcblxuICAgICAgICAgIC8vIDMuIEZpcmUgYSBwcm9ncmVzcyBldmVudCBjYWxsZWQgZXJyb3IgYXQgZnIuXG4gICAgICAgICAgZmlyZUFQcm9ncmVzc0V2ZW50KCdlcnJvcicsIGZyKVxuXG4gICAgICAgICAgLy8gNC4gSWYgZnLigJlzIHN0YXRlIGlzIG5vdCBcImxvYWRpbmdcIiwgZmlyZSBhIHByb2dyZXNzXG4gICAgICAgICAgLy8gICAgZXZlbnQgY2FsbGVkIGxvYWRlbmQgYXQgZnIuXG4gICAgICAgICAgaWYgKGZyW2tTdGF0ZV0gIT09ICdsb2FkaW5nJykge1xuICAgICAgICAgICAgZmlyZUFQcm9ncmVzc0V2ZW50KCdsb2FkZW5kJywgZnIpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9KSgpXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jZmlyZS1hLXByb2dyZXNzLWV2ZW50XG4gKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1ldmVudC1maXJlXG4gKiBAcGFyYW0ge3N0cmluZ30gZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2ZpbGVyZWFkZXInKS5GaWxlUmVhZGVyfSByZWFkZXJcbiAqL1xuZnVuY3Rpb24gZmlyZUFQcm9ncmVzc0V2ZW50IChlLCByZWFkZXIpIHtcbiAgLy8gVGhlIHByb2dyZXNzIGV2ZW50IGUgZG9lcyBub3QgYnViYmxlLiBlLmJ1YmJsZXMgbXVzdCBiZSBmYWxzZVxuICAvLyBUaGUgcHJvZ3Jlc3MgZXZlbnQgZSBpcyBOT1QgY2FuY2VsYWJsZS4gZS5jYW5jZWxhYmxlIG11c3QgYmUgZmFsc2VcbiAgY29uc3QgZXZlbnQgPSBuZXcgUHJvZ3Jlc3NFdmVudChlLCB7XG4gICAgYnViYmxlczogZmFsc2UsXG4gICAgY2FuY2VsYWJsZTogZmFsc2VcbiAgfSlcblxuICByZWFkZXIuZGlzcGF0Y2hFdmVudChldmVudClcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9GaWxlQVBJLyNibG9iLXBhY2thZ2UtZGF0YVxuICogQHBhcmFtIHtVaW50OEFycmF5W119IGJ5dGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtzdHJpbmc/fSBtaW1lVHlwZVxuICogQHBhcmFtIHtzdHJpbmc/fSBlbmNvZGluZ05hbWVcbiAqL1xuZnVuY3Rpb24gcGFja2FnZURhdGEgKGJ5dGVzLCB0eXBlLCBtaW1lVHlwZSwgZW5jb2RpbmdOYW1lKSB7XG4gIC8vIDEuIEEgQmxvYiBoYXMgYW4gYXNzb2NpYXRlZCBwYWNrYWdlIGRhdGEgYWxnb3JpdGhtLCBnaXZlblxuICAvLyAgICBieXRlcywgYSB0eXBlLCBhIG9wdGlvbmFsIG1pbWVUeXBlLCBhbmQgYSBvcHRpb25hbFxuICAvLyAgICBlbmNvZGluZ05hbWUsIHdoaWNoIHN3aXRjaGVzIG9uIHR5cGUgYW5kIHJ1bnMgdGhlXG4gIC8vICAgIGFzc29jaWF0ZWQgc3RlcHM6XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnRGF0YVVSTCc6IHtcbiAgICAgIC8vIDEuIFJldHVybiBieXRlcyBhcyBhIERhdGFVUkwgW1JGQzIzOTddIHN1YmplY3QgdG9cbiAgICAgIC8vICAgIHRoZSBjb25zaWRlcmF0aW9ucyBiZWxvdzpcbiAgICAgIC8vICAqIFVzZSBtaW1lVHlwZSBhcyBwYXJ0IG9mIHRoZSBEYXRhIFVSTCBpZiBpdCBpc1xuICAgICAgLy8gICAgYXZhaWxhYmxlIGluIGtlZXBpbmcgd2l0aCB0aGUgRGF0YSBVUkxcbiAgICAgIC8vICAgIHNwZWNpZmljYXRpb24gW1JGQzIzOTddLlxuICAgICAgLy8gICogSWYgbWltZVR5cGUgaXMgbm90IGF2YWlsYWJsZSByZXR1cm4gYSBEYXRhIFVSTFxuICAgICAgLy8gICAgd2l0aG91dCBhIG1lZGlhLXR5cGUuIFtSRkMyMzk3XS5cblxuICAgICAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMyMzk3I3NlY3Rpb24tM1xuICAgICAgLy8gZGF0YXVybCAgICA6PSBcImRhdGE6XCIgWyBtZWRpYXR5cGUgXSBbIFwiO2Jhc2U2NFwiIF0gXCIsXCIgZGF0YVxuICAgICAgLy8gbWVkaWF0eXBlICA6PSBbIHR5cGUgXCIvXCIgc3VidHlwZSBdICooIFwiO1wiIHBhcmFtZXRlciApXG4gICAgICAvLyBkYXRhICAgICAgIDo9ICp1cmxjaGFyXG4gICAgICAvLyBwYXJhbWV0ZXIgIDo9IGF0dHJpYnV0ZSBcIj1cIiB2YWx1ZVxuICAgICAgbGV0IGRhdGFVUkwgPSAnZGF0YTonXG5cbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlTUlNRVR5cGUobWltZVR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpXG5cbiAgICAgIGlmIChwYXJzZWQgIT09ICdmYWlsdXJlJykge1xuICAgICAgICBkYXRhVVJMICs9IHNlcmlhbGl6ZUFNaW1lVHlwZShwYXJzZWQpXG4gICAgICB9XG5cbiAgICAgIGRhdGFVUkwgKz0gJztiYXNlNjQsJ1xuXG4gICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoJ2xhdGluMScpXG5cbiAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgYnl0ZXMpIHtcbiAgICAgICAgZGF0YVVSTCArPSBidG9hKGRlY29kZXIud3JpdGUoY2h1bmspKVxuICAgICAgfVxuXG4gICAgICBkYXRhVVJMICs9IGJ0b2EoZGVjb2Rlci5lbmQoKSlcblxuICAgICAgcmV0dXJuIGRhdGFVUkxcbiAgICB9XG4gICAgY2FzZSAnVGV4dCc6IHtcbiAgICAgIC8vIDEuIExldCBlbmNvZGluZyBiZSBmYWlsdXJlXG4gICAgICBsZXQgZW5jb2RpbmcgPSAnZmFpbHVyZSdcblxuICAgICAgLy8gMi4gSWYgdGhlIGVuY29kaW5nTmFtZSBpcyBwcmVzZW50LCBzZXQgZW5jb2RpbmcgdG8gdGhlXG4gICAgICAvLyAgICByZXN1bHQgb2YgZ2V0dGluZyBhbiBlbmNvZGluZyBmcm9tIGVuY29kaW5nTmFtZS5cbiAgICAgIGlmIChlbmNvZGluZ05hbWUpIHtcbiAgICAgICAgZW5jb2RpbmcgPSBnZXRFbmNvZGluZyhlbmNvZGluZ05hbWUpXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIElmIGVuY29kaW5nIGlzIGZhaWx1cmUsIGFuZCBtaW1lVHlwZSBpcyBwcmVzZW50OlxuICAgICAgaWYgKGVuY29kaW5nID09PSAnZmFpbHVyZScgJiYgbWltZVR5cGUpIHtcbiAgICAgICAgLy8gMS4gTGV0IHR5cGUgYmUgdGhlIHJlc3VsdCBvZiBwYXJzZSBhIE1JTUUgdHlwZVxuICAgICAgICAvLyAgICBnaXZlbiBtaW1lVHlwZS5cbiAgICAgICAgY29uc3QgdHlwZSA9IHBhcnNlTUlNRVR5cGUobWltZVR5cGUpXG5cbiAgICAgICAgLy8gMi4gSWYgdHlwZSBpcyBub3QgZmFpbHVyZSwgc2V0IGVuY29kaW5nIHRvIHRoZSByZXN1bHRcbiAgICAgICAgLy8gICAgb2YgZ2V0dGluZyBhbiBlbmNvZGluZyBmcm9tIHR5cGXigJlzIHBhcmFtZXRlcnNbXCJjaGFyc2V0XCJdLlxuICAgICAgICBpZiAodHlwZSAhPT0gJ2ZhaWx1cmUnKSB7XG4gICAgICAgICAgZW5jb2RpbmcgPSBnZXRFbmNvZGluZyh0eXBlLnBhcmFtZXRlcnMuZ2V0KCdjaGFyc2V0JykpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gNC4gSWYgZW5jb2RpbmcgaXMgZmFpbHVyZSwgdGhlbiBzZXQgZW5jb2RpbmcgdG8gVVRGLTguXG4gICAgICBpZiAoZW5jb2RpbmcgPT09ICdmYWlsdXJlJykge1xuICAgICAgICBlbmNvZGluZyA9ICdVVEYtOCdcbiAgICAgIH1cblxuICAgICAgLy8gNS4gRGVjb2RlIGJ5dGVzIHVzaW5nIGZhbGxiYWNrIGVuY29kaW5nIGVuY29kaW5nLCBhbmRcbiAgICAgIC8vICAgIHJldHVybiB0aGUgcmVzdWx0LlxuICAgICAgcmV0dXJuIGRlY29kZShieXRlcywgZW5jb2RpbmcpXG4gICAgfVxuICAgIGNhc2UgJ0FycmF5QnVmZmVyJzoge1xuICAgICAgLy8gUmV0dXJuIGEgbmV3IEFycmF5QnVmZmVyIHdob3NlIGNvbnRlbnRzIGFyZSBieXRlcy5cbiAgICAgIGNvbnN0IHNlcXVlbmNlID0gY29tYmluZUJ5dGVTZXF1ZW5jZXMoYnl0ZXMpXG5cbiAgICAgIHJldHVybiBzZXF1ZW5jZS5idWZmZXJcbiAgICB9XG4gICAgY2FzZSAnQmluYXJ5U3RyaW5nJzoge1xuICAgICAgLy8gUmV0dXJuIGJ5dGVzIGFzIGEgYmluYXJ5IHN0cmluZywgaW4gd2hpY2ggZXZlcnkgYnl0ZVxuICAgICAgLy8gIGlzIHJlcHJlc2VudGVkIGJ5IGEgY29kZSB1bml0IG9mIGVxdWFsIHZhbHVlIFswLi4yNTVdLlxuICAgICAgbGV0IGJpbmFyeVN0cmluZyA9ICcnXG5cbiAgICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcignbGF0aW4xJylcblxuICAgICAgZm9yIChjb25zdCBjaHVuayBvZiBieXRlcykge1xuICAgICAgICBiaW5hcnlTdHJpbmcgKz0gZGVjb2Rlci53cml0ZShjaHVuaylcbiAgICAgIH1cblxuICAgICAgYmluYXJ5U3RyaW5nICs9IGRlY29kZXIuZW5kKClcblxuICAgICAgcmV0dXJuIGJpbmFyeVN0cmluZ1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI2RlY29kZVxuICogQHBhcmFtIHtVaW50OEFycmF5W119IGlvUXVldWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGluZ1xuICovXG5mdW5jdGlvbiBkZWNvZGUgKGlvUXVldWUsIGVuY29kaW5nKSB7XG4gIGNvbnN0IGJ5dGVzID0gY29tYmluZUJ5dGVTZXF1ZW5jZXMoaW9RdWV1ZSlcblxuICAvLyAxLiBMZXQgQk9NRW5jb2RpbmcgYmUgdGhlIHJlc3VsdCBvZiBCT00gc25pZmZpbmcgaW9RdWV1ZS5cbiAgY29uc3QgQk9NRW5jb2RpbmcgPSBCT01TbmlmZmluZyhieXRlcylcblxuICBsZXQgc2xpY2UgPSAwXG5cbiAgLy8gMi4gSWYgQk9NRW5jb2RpbmcgaXMgbm9uLW51bGw6XG4gIGlmIChCT01FbmNvZGluZyAhPT0gbnVsbCkge1xuICAgIC8vIDEuIFNldCBlbmNvZGluZyB0byBCT01FbmNvZGluZy5cbiAgICBlbmNvZGluZyA9IEJPTUVuY29kaW5nXG5cbiAgICAvLyAyLiBSZWFkIHRocmVlIGJ5dGVzIGZyb20gaW9RdWV1ZSwgaWYgQk9NRW5jb2RpbmcgaXNcbiAgICAvLyAgICBVVEYtODsgb3RoZXJ3aXNlIHJlYWQgdHdvIGJ5dGVzLlxuICAgIC8vICAgIChEbyBub3RoaW5nIHdpdGggdGhvc2UgYnl0ZXMuKVxuICAgIHNsaWNlID0gQk9NRW5jb2RpbmcgPT09ICdVVEYtOCcgPyAzIDogMlxuICB9XG5cbiAgLy8gMy4gUHJvY2VzcyBhIHF1ZXVlIHdpdGggYW4gaW5zdGFuY2Ugb2YgZW5jb2RpbmfigJlzXG4gIC8vICAgIGRlY29kZXIsIGlvUXVldWUsIG91dHB1dCwgYW5kIFwicmVwbGFjZW1lbnRcIi5cblxuICAvLyA0LiBSZXR1cm4gb3V0cHV0LlxuXG4gIGNvbnN0IHNsaWNlZCA9IGJ5dGVzLnNsaWNlKHNsaWNlKVxuICByZXR1cm4gbmV3IFRleHREZWNvZGVyKGVuY29kaW5nKS5kZWNvZGUoc2xpY2VkKVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI2JvbS1zbmlmZlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBpb1F1ZXVlXG4gKi9cbmZ1bmN0aW9uIEJPTVNuaWZmaW5nIChpb1F1ZXVlKSB7XG4gIC8vIDEuIExldCBCT00gYmUgdGhlIHJlc3VsdCBvZiBwZWVraW5nIDMgYnl0ZXMgZnJvbSBpb1F1ZXVlLFxuICAvLyAgICBjb252ZXJ0ZWQgdG8gYSBieXRlIHNlcXVlbmNlLlxuICBjb25zdCBbYSwgYiwgY10gPSBpb1F1ZXVlXG5cbiAgLy8gMi4gRm9yIGVhY2ggb2YgdGhlIHJvd3MgaW4gdGhlIHRhYmxlIGJlbG93LCBzdGFydGluZyB3aXRoXG4gIC8vICAgIHRoZSBmaXJzdCBvbmUgYW5kIGdvaW5nIGRvd24sIGlmIEJPTSBzdGFydHMgd2l0aCB0aGVcbiAgLy8gICAgYnl0ZXMgZ2l2ZW4gaW4gdGhlIGZpcnN0IGNvbHVtbiwgdGhlbiByZXR1cm4gdGhlXG4gIC8vICAgIGVuY29kaW5nIGdpdmVuIGluIHRoZSBjZWxsIGluIHRoZSBzZWNvbmQgY29sdW1uIG9mIHRoYXRcbiAgLy8gICAgcm93LiBPdGhlcndpc2UsIHJldHVybiBudWxsLlxuICBpZiAoYSA9PT0gMHhFRiAmJiBiID09PSAweEJCICYmIGMgPT09IDB4QkYpIHtcbiAgICByZXR1cm4gJ1VURi04J1xuICB9IGVsc2UgaWYgKGEgPT09IDB4RkUgJiYgYiA9PT0gMHhGRikge1xuICAgIHJldHVybiAnVVRGLTE2QkUnXG4gIH0gZWxzZSBpZiAoYSA9PT0gMHhGRiAmJiBiID09PSAweEZFKSB7XG4gICAgcmV0dXJuICdVVEYtMTZMRSdcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5W119IHNlcXVlbmNlc1xuICovXG5mdW5jdGlvbiBjb21iaW5lQnl0ZVNlcXVlbmNlcyAoc2VxdWVuY2VzKSB7XG4gIGNvbnN0IHNpemUgPSBzZXF1ZW5jZXMucmVkdWNlKChhLCBiKSA9PiB7XG4gICAgcmV0dXJuIGEgKyBiLmJ5dGVMZW5ndGhcbiAgfSwgMClcblxuICBsZXQgb2Zmc2V0ID0gMFxuXG4gIHJldHVybiBzZXF1ZW5jZXMucmVkdWNlKChhLCBiKSA9PiB7XG4gICAgYS5zZXQoYiwgb2Zmc2V0KVxuICAgIG9mZnNldCArPSBiLmJ5dGVMZW5ndGhcbiAgICByZXR1cm4gYVxuICB9LCBuZXcgVWludDhBcnJheShzaXplKSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIHJlYWRPcGVyYXRpb24sXG4gIGZpcmVBUHJvZ3Jlc3NFdmVudFxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHtcbiAgc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgcmVhZE9wZXJhdGlvbixcbiAgZmlyZUFQcm9ncmVzc0V2ZW50XG59ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHtcbiAga1N0YXRlLFxuICBrRXJyb3IsXG4gIGtSZXN1bHQsXG4gIGtFdmVudHMsXG4gIGtBYm9ydGVkXG59ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgd2ViaWRsIH0gPSByZXF1aXJlKCcuLi9mZXRjaC93ZWJpZGwnKVxuY29uc3QgeyBrRW51bWVyYWJsZVByb3BlcnR5IH0gPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuXG5jbGFzcyBGaWxlUmVhZGVyIGV4dGVuZHMgRXZlbnRUYXJnZXQge1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgdGhpc1trU3RhdGVdID0gJ2VtcHR5J1xuICAgIHRoaXNba1Jlc3VsdF0gPSBudWxsXG4gICAgdGhpc1trRXJyb3JdID0gbnVsbFxuICAgIHRoaXNba0V2ZW50c10gPSB7XG4gICAgICBsb2FkZW5kOiBudWxsLFxuICAgICAgZXJyb3I6IG51bGwsXG4gICAgICBhYm9ydDogbnVsbCxcbiAgICAgIGxvYWQ6IG51bGwsXG4gICAgICBwcm9ncmVzczogbnVsbCxcbiAgICAgIGxvYWRzdGFydDogbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9GaWxlQVBJLyNkZm4tcmVhZEFzQXJyYXlCdWZmZXJcbiAgICogQHBhcmFtIHtpbXBvcnQoJ2J1ZmZlcicpLkJsb2J9IGJsb2JcbiAgICovXG4gIHJlYWRBc0FycmF5QnVmZmVyIChibG9iKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdGaWxlUmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyJyB9KVxuXG4gICAgYmxvYiA9IHdlYmlkbC5jb252ZXJ0ZXJzLkJsb2IoYmxvYiwgeyBzdHJpY3Q6IGZhbHNlIH0pXG5cbiAgICAvLyBUaGUgcmVhZEFzQXJyYXlCdWZmZXIoYmxvYikgbWV0aG9kLCB3aGVuIGludm9rZWQsXG4gICAgLy8gbXVzdCBpbml0aWF0ZSBhIHJlYWQgb3BlcmF0aW9uIGZvciBibG9iIHdpdGggQXJyYXlCdWZmZXIuXG4gICAgcmVhZE9wZXJhdGlvbih0aGlzLCBibG9iLCAnQXJyYXlCdWZmZXInKVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI3JlYWRBc0JpbmFyeVN0cmluZ1xuICAgKiBAcGFyYW0ge2ltcG9ydCgnYnVmZmVyJykuQmxvYn0gYmxvYlxuICAgKi9cbiAgcmVhZEFzQmluYXJ5U3RyaW5nIChibG9iKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdGaWxlUmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZycgfSlcblxuICAgIGJsb2IgPSB3ZWJpZGwuY29udmVydGVycy5CbG9iKGJsb2IsIHsgc3RyaWN0OiBmYWxzZSB9KVxuXG4gICAgLy8gVGhlIHJlYWRBc0JpbmFyeVN0cmluZyhibG9iKSBtZXRob2QsIHdoZW4gaW52b2tlZCxcbiAgICAvLyBtdXN0IGluaXRpYXRlIGEgcmVhZCBvcGVyYXRpb24gZm9yIGJsb2Igd2l0aCBCaW5hcnlTdHJpbmcuXG4gICAgcmVhZE9wZXJhdGlvbih0aGlzLCBibG9iLCAnQmluYXJ5U3RyaW5nJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9GaWxlQVBJLyNyZWFkQXNEYXRhVGV4dFxuICAgKiBAcGFyYW0ge2ltcG9ydCgnYnVmZmVyJykuQmxvYn0gYmxvYlxuICAgKiBAcGFyYW0ge3N0cmluZz99IGVuY29kaW5nXG4gICAqL1xuICByZWFkQXNUZXh0IChibG9iLCBlbmNvZGluZyA9IHVuZGVmaW5lZCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnRmlsZVJlYWRlci5yZWFkQXNUZXh0JyB9KVxuXG4gICAgYmxvYiA9IHdlYmlkbC5jb252ZXJ0ZXJzLkJsb2IoYmxvYiwgeyBzdHJpY3Q6IGZhbHNlIH0pXG5cbiAgICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW5jb2RpbmcgPSB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcoZW5jb2RpbmcpXG4gICAgfVxuXG4gICAgLy8gVGhlIHJlYWRBc1RleHQoYmxvYiwgZW5jb2RpbmcpIG1ldGhvZCwgd2hlbiBpbnZva2VkLFxuICAgIC8vIG11c3QgaW5pdGlhdGUgYSByZWFkIG9wZXJhdGlvbiBmb3IgYmxvYiB3aXRoIFRleHQgYW5kIGVuY29kaW5nLlxuICAgIHJlYWRPcGVyYXRpb24odGhpcywgYmxvYiwgJ1RleHQnLCBlbmNvZGluZylcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9GaWxlQVBJLyNkZm4tcmVhZEFzRGF0YVVSTFxuICAgKiBAcGFyYW0ge2ltcG9ydCgnYnVmZmVyJykuQmxvYn0gYmxvYlxuICAgKi9cbiAgcmVhZEFzRGF0YVVSTCAoYmxvYikge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnRmlsZVJlYWRlci5yZWFkQXNEYXRhVVJMJyB9KVxuXG4gICAgYmxvYiA9IHdlYmlkbC5jb252ZXJ0ZXJzLkJsb2IoYmxvYiwgeyBzdHJpY3Q6IGZhbHNlIH0pXG5cbiAgICAvLyBUaGUgcmVhZEFzRGF0YVVSTChibG9iKSBtZXRob2QsIHdoZW4gaW52b2tlZCwgbXVzdFxuICAgIC8vIGluaXRpYXRlIGEgcmVhZCBvcGVyYXRpb24gZm9yIGJsb2Igd2l0aCBEYXRhVVJMLlxuICAgIHJlYWRPcGVyYXRpb24odGhpcywgYmxvYiwgJ0RhdGFVUkwnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI2Rmbi1hYm9ydFxuICAgKi9cbiAgYWJvcnQgKCkge1xuICAgIC8vIDEuIElmIHRoaXMncyBzdGF0ZSBpcyBcImVtcHR5XCIgb3IgaWYgdGhpcydzIHN0YXRlIGlzXG4gICAgLy8gICAgXCJkb25lXCIgc2V0IHRoaXMncyByZXN1bHQgdG8gbnVsbCBhbmQgdGVybWluYXRlXG4gICAgLy8gICAgdGhpcyBhbGdvcml0aG0uXG4gICAgaWYgKHRoaXNba1N0YXRlXSA9PT0gJ2VtcHR5JyB8fCB0aGlzW2tTdGF0ZV0gPT09ICdkb25lJykge1xuICAgICAgdGhpc1trUmVzdWx0XSA9IG51bGxcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIDIuIElmIHRoaXMncyBzdGF0ZSBpcyBcImxvYWRpbmdcIiBzZXQgdGhpcydzIHN0YXRlIHRvXG4gICAgLy8gICAgXCJkb25lXCIgYW5kIHNldCB0aGlzJ3MgcmVzdWx0IHRvIG51bGwuXG4gICAgaWYgKHRoaXNba1N0YXRlXSA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgICB0aGlzW2tTdGF0ZV0gPSAnZG9uZSdcbiAgICAgIHRoaXNba1Jlc3VsdF0gPSBudWxsXG4gICAgfVxuXG4gICAgLy8gMy4gSWYgdGhlcmUgYXJlIGFueSB0YXNrcyBmcm9tIHRoaXMgb24gdGhlIGZpbGUgcmVhZGluZ1xuICAgIC8vICAgIHRhc2sgc291cmNlIGluIGFuIGFmZmlsaWF0ZWQgdGFzayBxdWV1ZSwgdGhlbiByZW1vdmVcbiAgICAvLyAgICB0aG9zZSB0YXNrcyBmcm9tIHRoYXQgdGFzayBxdWV1ZS5cbiAgICB0aGlzW2tBYm9ydGVkXSA9IHRydWVcblxuICAgIC8vIDQuIFRlcm1pbmF0ZSB0aGUgYWxnb3JpdGhtIGZvciB0aGUgcmVhZCBtZXRob2QgYmVpbmcgcHJvY2Vzc2VkLlxuICAgIC8vIFRPRE9cblxuICAgIC8vIDUuIEZpcmUgYSBwcm9ncmVzcyBldmVudCBjYWxsZWQgYWJvcnQgYXQgdGhpcy5cbiAgICBmaXJlQVByb2dyZXNzRXZlbnQoJ2Fib3J0JywgdGhpcylcblxuICAgIC8vIDYuIElmIHRoaXMncyBzdGF0ZSBpcyBub3QgXCJsb2FkaW5nXCIsIGZpcmUgYSBwcm9ncmVzc1xuICAgIC8vICAgIGV2ZW50IGNhbGxlZCBsb2FkZW5kIGF0IHRoaXMuXG4gICAgaWYgKHRoaXNba1N0YXRlXSAhPT0gJ2xvYWRpbmcnKSB7XG4gICAgICBmaXJlQVByb2dyZXNzRXZlbnQoJ2xvYWRlbmQnLCB0aGlzKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9GaWxlQVBJLyNkb20tZmlsZXJlYWRlci1yZWFkeXN0YXRlXG4gICAqL1xuICBnZXQgcmVhZHlTdGF0ZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIHN3aXRjaCAodGhpc1trU3RhdGVdKSB7XG4gICAgICBjYXNlICdlbXB0eSc6IHJldHVybiB0aGlzLkVNUFRZXG4gICAgICBjYXNlICdsb2FkaW5nJzogcmV0dXJuIHRoaXMuTE9BRElOR1xuICAgICAgY2FzZSAnZG9uZSc6IHJldHVybiB0aGlzLkRPTkVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jZG9tLWZpbGVyZWFkZXItcmVzdWx0XG4gICAqL1xuICBnZXQgcmVzdWx0ICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgLy8gVGhlIHJlc3VsdCBhdHRyaWJ1dGXigJlzIGdldHRlciwgd2hlbiBpbnZva2VkLCBtdXN0IHJldHVyblxuICAgIC8vIHRoaXMncyByZXN1bHQuXG4gICAgcmV0dXJuIHRoaXNba1Jlc3VsdF1cbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9GaWxlQVBJLyNkb20tZmlsZXJlYWRlci1lcnJvclxuICAgKi9cbiAgZ2V0IGVycm9yICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgLy8gVGhlIGVycm9yIGF0dHJpYnV0ZeKAmXMgZ2V0dGVyLCB3aGVuIGludm9rZWQsIG11c3QgcmV0dXJuXG4gICAgLy8gdGhpcydzIGVycm9yLlxuICAgIHJldHVybiB0aGlzW2tFcnJvcl1cbiAgfVxuXG4gIGdldCBvbmxvYWRlbmQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICByZXR1cm4gdGhpc1trRXZlbnRzXS5sb2FkZW5kXG4gIH1cblxuICBzZXQgb25sb2FkZW5kIChmbikge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICBpZiAodGhpc1trRXZlbnRzXS5sb2FkZW5kKSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlbmQnLCB0aGlzW2tFdmVudHNdLmxvYWRlbmQpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1trRXZlbnRzXS5sb2FkZW5kID0gZm5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVuZCcsIGZuKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzW2tFdmVudHNdLmxvYWRlbmQgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgZ2V0IG9uZXJyb3IgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICByZXR1cm4gdGhpc1trRXZlbnRzXS5lcnJvclxuICB9XG5cbiAgc2V0IG9uZXJyb3IgKGZuKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIGlmICh0aGlzW2tFdmVudHNdLmVycm9yKSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgdGhpc1trRXZlbnRzXS5lcnJvcilcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2tFdmVudHNdLmVycm9yID0gZm5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1trRXZlbnRzXS5lcnJvciA9IG51bGxcbiAgICB9XG4gIH1cblxuICBnZXQgb25sb2Fkc3RhcnQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICByZXR1cm4gdGhpc1trRXZlbnRzXS5sb2Fkc3RhcnRcbiAgfVxuXG4gIHNldCBvbmxvYWRzdGFydCAoZm4pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgaWYgKHRoaXNba0V2ZW50c10ubG9hZHN0YXJ0KSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRzdGFydCcsIHRoaXNba0V2ZW50c10ubG9hZHN0YXJ0KVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXNba0V2ZW50c10ubG9hZHN0YXJ0ID0gZm5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbG9hZHN0YXJ0JywgZm4pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNba0V2ZW50c10ubG9hZHN0YXJ0ID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGdldCBvbnByb2dyZXNzICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgcmV0dXJuIHRoaXNba0V2ZW50c10ucHJvZ3Jlc3NcbiAgfVxuXG4gIHNldCBvbnByb2dyZXNzIChmbikge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICBpZiAodGhpc1trRXZlbnRzXS5wcm9ncmVzcykge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIHRoaXNba0V2ZW50c10ucHJvZ3Jlc3MpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1trRXZlbnRzXS5wcm9ncmVzcyA9IGZuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgZm4pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNba0V2ZW50c10ucHJvZ3Jlc3MgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgZ2V0IG9ubG9hZCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIHJldHVybiB0aGlzW2tFdmVudHNdLmxvYWRcbiAgfVxuXG4gIHNldCBvbmxvYWQgKGZuKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIGlmICh0aGlzW2tFdmVudHNdLmxvYWQpIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZCcsIHRoaXNba0V2ZW50c10ubG9hZClcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2tFdmVudHNdLmxvYWQgPSBmblxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZm4pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNba0V2ZW50c10ubG9hZCA9IG51bGxcbiAgICB9XG4gIH1cblxuICBnZXQgb25hYm9ydCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIHJldHVybiB0aGlzW2tFdmVudHNdLmFib3J0XG4gIH1cblxuICBzZXQgb25hYm9ydCAoZm4pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgaWYgKHRoaXNba0V2ZW50c10uYWJvcnQpIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCB0aGlzW2tFdmVudHNdLmFib3J0KVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXNba0V2ZW50c10uYWJvcnQgPSBmblxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGZuKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzW2tFdmVudHNdLmFib3J0ID0gbnVsbFxuICAgIH1cbiAgfVxufVxuXG4vLyBodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jZG9tLWZpbGVyZWFkZXItZW1wdHlcbkZpbGVSZWFkZXIuRU1QVFkgPSBGaWxlUmVhZGVyLnByb3RvdHlwZS5FTVBUWSA9IDBcbi8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9GaWxlQVBJLyNkb20tZmlsZXJlYWRlci1sb2FkaW5nXG5GaWxlUmVhZGVyLkxPQURJTkcgPSBGaWxlUmVhZGVyLnByb3RvdHlwZS5MT0FESU5HID0gMVxuLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI2RvbS1maWxlcmVhZGVyLWRvbmVcbkZpbGVSZWFkZXIuRE9ORSA9IEZpbGVSZWFkZXIucHJvdG90eXBlLkRPTkUgPSAyXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEZpbGVSZWFkZXIucHJvdG90eXBlLCB7XG4gIEVNUFRZOiBzdGF0aWNQcm9wZXJ0eURlc2NyaXB0b3JzLFxuICBMT0FESU5HOiBzdGF0aWNQcm9wZXJ0eURlc2NyaXB0b3JzLFxuICBET05FOiBzdGF0aWNQcm9wZXJ0eURlc2NyaXB0b3JzLFxuICByZWFkQXNBcnJheUJ1ZmZlcjoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgcmVhZEFzQmluYXJ5U3RyaW5nOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZWFkQXNUZXh0OiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZWFkQXNEYXRhVVJMOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBhYm9ydDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgcmVhZHlTdGF0ZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgcmVzdWx0OiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBlcnJvcjoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgb25sb2Fkc3RhcnQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIG9ucHJvZ3Jlc3M6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIG9ubG9hZDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgb25hYm9ydDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgb25lcnJvcjoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgb25sb2FkZW5kOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBbU3ltYm9sLnRvU3RyaW5nVGFnXToge1xuICAgIHZhbHVlOiAnRmlsZVJlYWRlcicsXG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9XG59KVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhGaWxlUmVhZGVyLCB7XG4gIEVNUFRZOiBzdGF0aWNQcm9wZXJ0eURlc2NyaXB0b3JzLFxuICBMT0FESU5HOiBzdGF0aWNQcm9wZXJ0eURlc2NyaXB0b3JzLFxuICBET05FOiBzdGF0aWNQcm9wZXJ0eURlc2NyaXB0b3JzXG59KVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgRmlsZVJlYWRlclxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBrQ29uc3RydWN0OiByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKS5rQ29uc3RydWN0XG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsgVVJMU2VyaWFsaXplciB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvZGF0YVVSTCcpXG5jb25zdCB7IGlzVmFsaWRIZWFkZXJOYW1lIH0gPSByZXF1aXJlKCcuLi9mZXRjaC91dGlsJylcblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC11cmwtZXF1YWxzXG4gKiBAcGFyYW0ge1VSTH0gQVxuICogQHBhcmFtIHtVUkx9IEJcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8IHVuZGVmaW5lZH0gZXhjbHVkZUZyYWdtZW50XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gdXJsRXF1YWxzIChBLCBCLCBleGNsdWRlRnJhZ21lbnQgPSBmYWxzZSkge1xuICBjb25zdCBzZXJpYWxpemVkQSA9IFVSTFNlcmlhbGl6ZXIoQSwgZXhjbHVkZUZyYWdtZW50KVxuXG4gIGNvbnN0IHNlcmlhbGl6ZWRCID0gVVJMU2VyaWFsaXplcihCLCBleGNsdWRlRnJhZ21lbnQpXG5cbiAgcmV0dXJuIHNlcmlhbGl6ZWRBID09PSBzZXJpYWxpemVkQlxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Nocm9taXVtL2Nocm9taXVtL2Jsb2IvNjk0ZDIwZDEzNGNiNTUzZDhkODllNTUwMGI5MTQ4MDEyYjFiYTI5OS9jb250ZW50L2Jyb3dzZXIvY2FjaGVfc3RvcmFnZS9jYWNoZV9zdG9yYWdlX2NhY2hlLmNjI0wyNjAtTDI2MlxuICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICovXG5mdW5jdGlvbiBmaWVsZFZhbHVlcyAoaGVhZGVyKSB7XG4gIGFzc2VydChoZWFkZXIgIT09IG51bGwpXG5cbiAgY29uc3QgdmFsdWVzID0gW11cblxuICBmb3IgKGxldCB2YWx1ZSBvZiBoZWFkZXIuc3BsaXQoJywnKSkge1xuICAgIHZhbHVlID0gdmFsdWUudHJpbSgpXG5cbiAgICBpZiAoIXZhbHVlLmxlbmd0aCkge1xuICAgICAgY29udGludWVcbiAgICB9IGVsc2UgaWYgKCFpc1ZhbGlkSGVhZGVyTmFtZSh2YWx1ZSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgdmFsdWVzLnB1c2godmFsdWUpXG4gIH1cblxuICByZXR1cm4gdmFsdWVzXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB1cmxFcXVhbHMsXG4gIGZpZWxkVmFsdWVzXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBrQ29uc3RydWN0IH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgeyB1cmxFcXVhbHMsIGZpZWxkVmFsdWVzOiBnZXRGaWVsZFZhbHVlcyB9ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHsga0VudW1lcmFibGVQcm9wZXJ0eSwgaXNEaXN0dXJiZWQgfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5jb25zdCB7IGtIZWFkZXJzTGlzdCB9ID0gcmVxdWlyZSgnLi4vY29yZS9zeW1ib2xzJylcbmNvbnN0IHsgd2ViaWRsIH0gPSByZXF1aXJlKCcuLi9mZXRjaC93ZWJpZGwnKVxuY29uc3QgeyBSZXNwb25zZSwgY2xvbmVSZXNwb25zZSB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvcmVzcG9uc2UnKVxuY29uc3QgeyBSZXF1ZXN0IH0gPSByZXF1aXJlKCcuLi9mZXRjaC9yZXF1ZXN0JylcbmNvbnN0IHsga1N0YXRlLCBrSGVhZGVycywga0d1YXJkLCBrUmVhbG0gfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3N5bWJvbHMnKVxuY29uc3QgeyBmZXRjaGluZyB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvaW5kZXgnKVxuY29uc3QgeyB1cmxJc0h0dHBIdHRwc1NjaGVtZSwgY3JlYXRlRGVmZXJyZWRQcm9taXNlLCByZWFkQWxsQnl0ZXMgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3V0aWwnKVxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsgZ2V0R2xvYmFsRGlzcGF0Y2hlciB9ID0gcmVxdWlyZSgnLi4vZ2xvYmFsJylcblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9TZXJ2aWNlV29ya2VyLyNkZm4tY2FjaGUtYmF0Y2gtb3BlcmF0aW9uXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDYWNoZUJhdGNoT3BlcmF0aW9uXG4gKiBAcHJvcGVydHkgeydkZWxldGUnIHwgJ3B1dCd9IHR5cGVcbiAqIEBwcm9wZXJ0eSB7YW55fSByZXF1ZXN0XG4gKiBAcHJvcGVydHkge2FueX0gcmVzcG9uc2VcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KCcuLi8uLi90eXBlcy9jYWNoZScpLkNhY2hlUXVlcnlPcHRpb25zfSBvcHRpb25zXG4gKi9cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9TZXJ2aWNlV29ya2VyLyNkZm4tcmVxdWVzdC1yZXNwb25zZS1saXN0XG4gKiBAdHlwZWRlZiB7W2FueSwgYW55XVtdfSByZXF1ZXN0UmVzcG9uc2VMaXN0XG4gKi9cblxuY2xhc3MgQ2FjaGUge1xuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vU2VydmljZVdvcmtlci8jZGZuLXJlbGV2YW50LXJlcXVlc3QtcmVzcG9uc2UtbGlzdFxuICAgKiBAdHlwZSB7cmVxdWVzdFJlc3BvbnNlTGlzdH1cbiAgICovXG4gICNyZWxldmFudFJlcXVlc3RSZXNwb25zZUxpc3RcblxuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgaWYgKGFyZ3VtZW50c1swXSAhPT0ga0NvbnN0cnVjdCkge1xuICAgICAgd2ViaWRsLmlsbGVnYWxDb25zdHJ1Y3RvcigpXG4gICAgfVxuXG4gICAgdGhpcy4jcmVsZXZhbnRSZXF1ZXN0UmVzcG9uc2VMaXN0ID0gYXJndW1lbnRzWzFdXG4gIH1cblxuICBhc3luYyBtYXRjaCAocmVxdWVzdCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGUpXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0NhY2hlLm1hdGNoJyB9KVxuXG4gICAgcmVxdWVzdCA9IHdlYmlkbC5jb252ZXJ0ZXJzLlJlcXVlc3RJbmZvKHJlcXVlc3QpXG4gICAgb3B0aW9ucyA9IHdlYmlkbC5jb252ZXJ0ZXJzLkNhY2hlUXVlcnlPcHRpb25zKG9wdGlvbnMpXG5cbiAgICBjb25zdCBwID0gYXdhaXQgdGhpcy5tYXRjaEFsbChyZXF1ZXN0LCBvcHRpb25zKVxuXG4gICAgaWYgKHAubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICByZXR1cm4gcFswXVxuICB9XG5cbiAgYXN5bmMgbWF0Y2hBbGwgKHJlcXVlc3QgPSB1bmRlZmluZWQsIG9wdGlvbnMgPSB7fSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIENhY2hlKVxuXG4gICAgaWYgKHJlcXVlc3QgIT09IHVuZGVmaW5lZCkgcmVxdWVzdCA9IHdlYmlkbC5jb252ZXJ0ZXJzLlJlcXVlc3RJbmZvKHJlcXVlc3QpXG4gICAgb3B0aW9ucyA9IHdlYmlkbC5jb252ZXJ0ZXJzLkNhY2hlUXVlcnlPcHRpb25zKG9wdGlvbnMpXG5cbiAgICAvLyAxLlxuICAgIGxldCByID0gbnVsbFxuXG4gICAgLy8gMi5cbiAgICBpZiAocmVxdWVzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICAgICAgLy8gMi4xLjFcbiAgICAgICAgciA9IHJlcXVlc3Rba1N0YXRlXVxuXG4gICAgICAgIC8vIDIuMS4yXG4gICAgICAgIGlmIChyLm1ldGhvZCAhPT0gJ0dFVCcgJiYgIW9wdGlvbnMuaWdub3JlTWV0aG9kKSB7XG4gICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlcXVlc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIDIuMi4xXG4gICAgICAgIHIgPSBuZXcgUmVxdWVzdChyZXF1ZXN0KVtrU3RhdGVdXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNS5cbiAgICAvLyA1LjFcbiAgICBjb25zdCByZXNwb25zZXMgPSBbXVxuXG4gICAgLy8gNS4yXG4gICAgaWYgKHJlcXVlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gNS4yLjFcbiAgICAgIGZvciAoY29uc3QgcmVxdWVzdFJlc3BvbnNlIG9mIHRoaXMuI3JlbGV2YW50UmVxdWVzdFJlc3BvbnNlTGlzdCkge1xuICAgICAgICByZXNwb25zZXMucHVzaChyZXF1ZXN0UmVzcG9uc2VbMV0pXG4gICAgICB9XG4gICAgfSBlbHNlIHsgLy8gNS4zXG4gICAgICAvLyA1LjMuMVxuICAgICAgY29uc3QgcmVxdWVzdFJlc3BvbnNlcyA9IHRoaXMuI3F1ZXJ5Q2FjaGUociwgb3B0aW9ucylcblxuICAgICAgLy8gNS4zLjJcbiAgICAgIGZvciAoY29uc3QgcmVxdWVzdFJlc3BvbnNlIG9mIHJlcXVlc3RSZXNwb25zZXMpIHtcbiAgICAgICAgcmVzcG9uc2VzLnB1c2gocmVxdWVzdFJlc3BvbnNlWzFdKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDUuNFxuICAgIC8vIFdlIGRvbid0IGltcGxlbWVudCBDT1JzIHNvIHdlIGRvbid0IG5lZWQgdG8gbG9vcCBvdmVyIHRoZSByZXNwb25zZXMsIHlheSFcblxuICAgIC8vIDUuNS4xXG4gICAgY29uc3QgcmVzcG9uc2VMaXN0ID0gW11cblxuICAgIC8vIDUuNS4yXG4gICAgZm9yIChjb25zdCByZXNwb25zZSBvZiByZXNwb25zZXMpIHtcbiAgICAgIC8vIDUuNS4yLjFcbiAgICAgIGNvbnN0IHJlc3BvbnNlT2JqZWN0ID0gbmV3IFJlc3BvbnNlKHJlc3BvbnNlLmJvZHk/LnNvdXJjZSA/PyBudWxsKVxuICAgICAgY29uc3QgYm9keSA9IHJlc3BvbnNlT2JqZWN0W2tTdGF0ZV0uYm9keVxuICAgICAgcmVzcG9uc2VPYmplY3Rba1N0YXRlXSA9IHJlc3BvbnNlXG4gICAgICByZXNwb25zZU9iamVjdFtrU3RhdGVdLmJvZHkgPSBib2R5XG4gICAgICByZXNwb25zZU9iamVjdFtrSGVhZGVyc11ba0hlYWRlcnNMaXN0XSA9IHJlc3BvbnNlLmhlYWRlcnNMaXN0XG4gICAgICByZXNwb25zZU9iamVjdFtrSGVhZGVyc11ba0d1YXJkXSA9ICdpbW11dGFibGUnXG5cbiAgICAgIHJlc3BvbnNlTGlzdC5wdXNoKHJlc3BvbnNlT2JqZWN0KVxuICAgIH1cblxuICAgIC8vIDYuXG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUocmVzcG9uc2VMaXN0KVxuICB9XG5cbiAgYXN5bmMgYWRkIChyZXF1ZXN0KSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGUpXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0NhY2hlLmFkZCcgfSlcblxuICAgIHJlcXVlc3QgPSB3ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mbyhyZXF1ZXN0KVxuXG4gICAgLy8gMS5cbiAgICBjb25zdCByZXF1ZXN0cyA9IFtyZXF1ZXN0XVxuXG4gICAgLy8gMi5cbiAgICBjb25zdCByZXNwb25zZUFycmF5UHJvbWlzZSA9IHRoaXMuYWRkQWxsKHJlcXVlc3RzKVxuXG4gICAgLy8gMy5cbiAgICByZXR1cm4gYXdhaXQgcmVzcG9uc2VBcnJheVByb21pc2VcbiAgfVxuXG4gIGFzeW5jIGFkZEFsbCAocmVxdWVzdHMpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBDYWNoZSlcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnQ2FjaGUuYWRkQWxsJyB9KVxuXG4gICAgcmVxdWVzdHMgPSB3ZWJpZGwuY29udmVydGVyc1snc2VxdWVuY2U8UmVxdWVzdEluZm8+J10ocmVxdWVzdHMpXG5cbiAgICAvLyAxLlxuICAgIGNvbnN0IHJlc3BvbnNlUHJvbWlzZXMgPSBbXVxuXG4gICAgLy8gMi5cbiAgICBjb25zdCByZXF1ZXN0TGlzdCA9IFtdXG5cbiAgICAvLyAzLlxuICAgIGZvciAoY29uc3QgcmVxdWVzdCBvZiByZXF1ZXN0cykge1xuICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0ID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAzLjFcbiAgICAgIGNvbnN0IHIgPSByZXF1ZXN0W2tTdGF0ZV1cblxuICAgICAgLy8gMy4yXG4gICAgICBpZiAoIXVybElzSHR0cEh0dHBzU2NoZW1lKHIudXJsKSB8fCByLm1ldGhvZCAhPT0gJ0dFVCcpIHtcbiAgICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICAgIGhlYWRlcjogJ0NhY2hlLmFkZEFsbCcsXG4gICAgICAgICAgbWVzc2FnZTogJ0V4cGVjdGVkIGh0dHAvcyBzY2hlbWUgd2hlbiBtZXRob2QgaXMgbm90IEdFVC4nXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNC5cbiAgICAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIGZldGNoaW5nPltdfSAqL1xuICAgIGNvbnN0IGZldGNoQ29udHJvbGxlcnMgPSBbXVxuXG4gICAgLy8gNS5cbiAgICBmb3IgKGNvbnN0IHJlcXVlc3Qgb2YgcmVxdWVzdHMpIHtcbiAgICAgIC8vIDUuMVxuICAgICAgY29uc3QgciA9IG5ldyBSZXF1ZXN0KHJlcXVlc3QpW2tTdGF0ZV1cblxuICAgICAgLy8gNS4yXG4gICAgICBpZiAoIXVybElzSHR0cEh0dHBzU2NoZW1lKHIudXJsKSkge1xuICAgICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgaGVhZGVyOiAnQ2FjaGUuYWRkQWxsJyxcbiAgICAgICAgICBtZXNzYWdlOiAnRXhwZWN0ZWQgaHR0cC9zIHNjaGVtZS4nXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIDUuNFxuICAgICAgci5pbml0aWF0b3IgPSAnZmV0Y2gnXG4gICAgICByLmRlc3RpbmF0aW9uID0gJ3N1YnJlc291cmNlJ1xuXG4gICAgICAvLyA1LjVcbiAgICAgIHJlcXVlc3RMaXN0LnB1c2gocilcblxuICAgICAgLy8gNS42XG4gICAgICBjb25zdCByZXNwb25zZVByb21pc2UgPSBjcmVhdGVEZWZlcnJlZFByb21pc2UoKVxuXG4gICAgICAvLyA1LjdcbiAgICAgIGZldGNoQ29udHJvbGxlcnMucHVzaChmZXRjaGluZyh7XG4gICAgICAgIHJlcXVlc3Q6IHIsXG4gICAgICAgIGRpc3BhdGNoZXI6IGdldEdsb2JhbERpc3BhdGNoZXIoKSxcbiAgICAgICAgcHJvY2Vzc1Jlc3BvbnNlIChyZXNwb25zZSkge1xuICAgICAgICAgIC8vIDEuXG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnR5cGUgPT09ICdlcnJvcicgfHwgcmVzcG9uc2Uuc3RhdHVzID09PSAyMDYgfHwgcmVzcG9uc2Uuc3RhdHVzIDwgMjAwIHx8IHJlc3BvbnNlLnN0YXR1cyA+IDI5OSkge1xuICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlamVjdCh3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgICAgIGhlYWRlcjogJ0NhY2hlLmFkZEFsbCcsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdSZWNlaXZlZCBhbiBpbnZhbGlkIHN0YXR1cyBjb2RlIG9yIHRoZSByZXF1ZXN0IGZhaWxlZC4nXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLmhlYWRlcnNMaXN0LmNvbnRhaW5zKCd2YXJ5JykpIHsgLy8gMi5cbiAgICAgICAgICAgIC8vIDIuMVxuICAgICAgICAgICAgY29uc3QgZmllbGRWYWx1ZXMgPSBnZXRGaWVsZFZhbHVlcyhyZXNwb25zZS5oZWFkZXJzTGlzdC5nZXQoJ3ZhcnknKSlcblxuICAgICAgICAgICAgLy8gMi4yXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkVmFsdWUgb2YgZmllbGRWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgLy8gMi4yLjFcbiAgICAgICAgICAgICAgaWYgKGZpZWxkVmFsdWUgPT09ICcqJykge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZWplY3Qod2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICAgICAgICAgICAgaGVhZGVyOiAnQ2FjaGUuYWRkQWxsJyxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpbnZhbGlkIHZhcnkgZmllbGQgdmFsdWUnXG4gICAgICAgICAgICAgICAgfSkpXG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2xsZXIgb2YgZmV0Y2hDb250cm9sbGVycykge1xuICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keSAocmVzcG9uc2UpIHtcbiAgICAgICAgICAvLyAxLlxuICAgICAgICAgIGlmIChyZXNwb25zZS5hYm9ydGVkKSB7XG4gICAgICAgICAgICByZXNwb25zZVByb21pc2UucmVqZWN0KG5ldyBET01FeGNlcHRpb24oJ2Fib3J0ZWQnLCAnQWJvcnRFcnJvcicpKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gMi5cbiAgICAgICAgICByZXNwb25zZVByb21pc2UucmVzb2x2ZShyZXNwb25zZSlcbiAgICAgICAgfVxuICAgICAgfSkpXG5cbiAgICAgIC8vIDUuOFxuICAgICAgcmVzcG9uc2VQcm9taXNlcy5wdXNoKHJlc3BvbnNlUHJvbWlzZS5wcm9taXNlKVxuICAgIH1cblxuICAgIC8vIDYuXG4gICAgY29uc3QgcCA9IFByb21pc2UuYWxsKHJlc3BvbnNlUHJvbWlzZXMpXG5cbiAgICAvLyA3LlxuICAgIGNvbnN0IHJlc3BvbnNlcyA9IGF3YWl0IHBcblxuICAgIC8vIDcuMVxuICAgIGNvbnN0IG9wZXJhdGlvbnMgPSBbXVxuXG4gICAgLy8gNy4yXG4gICAgbGV0IGluZGV4ID0gMFxuXG4gICAgLy8gNy4zXG4gICAgZm9yIChjb25zdCByZXNwb25zZSBvZiByZXNwb25zZXMpIHtcbiAgICAgIC8vIDcuMy4xXG4gICAgICAvKiogQHR5cGUge0NhY2hlQmF0Y2hPcGVyYXRpb259ICovXG4gICAgICBjb25zdCBvcGVyYXRpb24gPSB7XG4gICAgICAgIHR5cGU6ICdwdXQnLCAvLyA3LjMuMlxuICAgICAgICByZXF1ZXN0OiByZXF1ZXN0TGlzdFtpbmRleF0sIC8vIDcuMy4zXG4gICAgICAgIHJlc3BvbnNlIC8vIDcuMy40XG4gICAgICB9XG5cbiAgICAgIG9wZXJhdGlvbnMucHVzaChvcGVyYXRpb24pIC8vIDcuMy41XG5cbiAgICAgIGluZGV4KysgLy8gNy4zLjZcbiAgICB9XG5cbiAgICAvLyA3LjVcbiAgICBjb25zdCBjYWNoZUpvYlByb21pc2UgPSBjcmVhdGVEZWZlcnJlZFByb21pc2UoKVxuXG4gICAgLy8gNy42LjFcbiAgICBsZXQgZXJyb3JEYXRhID0gbnVsbFxuXG4gICAgLy8gNy42LjJcbiAgICB0cnkge1xuICAgICAgdGhpcy4jYmF0Y2hDYWNoZU9wZXJhdGlvbnMob3BlcmF0aW9ucylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckRhdGEgPSBlXG4gICAgfVxuXG4gICAgLy8gNy42LjNcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAvLyA3LjYuMy4xXG4gICAgICBpZiAoZXJyb3JEYXRhID09PSBudWxsKSB7XG4gICAgICAgIGNhY2hlSm9iUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIDcuNi4zLjJcbiAgICAgICAgY2FjaGVKb2JQcm9taXNlLnJlamVjdChlcnJvckRhdGEpXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIDcuN1xuICAgIHJldHVybiBjYWNoZUpvYlByb21pc2UucHJvbWlzZVxuICB9XG5cbiAgYXN5bmMgcHV0IChyZXF1ZXN0LCByZXNwb25zZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIENhY2hlKVxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMiwgeyBoZWFkZXI6ICdDYWNoZS5wdXQnIH0pXG5cbiAgICByZXF1ZXN0ID0gd2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdEluZm8ocmVxdWVzdClcbiAgICByZXNwb25zZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLlJlc3BvbnNlKHJlc3BvbnNlKVxuXG4gICAgLy8gMS5cbiAgICBsZXQgaW5uZXJSZXF1ZXN0ID0gbnVsbFxuXG4gICAgLy8gMi5cbiAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICAgIGlubmVyUmVxdWVzdCA9IHJlcXVlc3Rba1N0YXRlXVxuICAgIH0gZWxzZSB7IC8vIDMuXG4gICAgICBpbm5lclJlcXVlc3QgPSBuZXcgUmVxdWVzdChyZXF1ZXN0KVtrU3RhdGVdXG4gICAgfVxuXG4gICAgLy8gNC5cbiAgICBpZiAoIXVybElzSHR0cEh0dHBzU2NoZW1lKGlubmVyUmVxdWVzdC51cmwpIHx8IGlubmVyUmVxdWVzdC5tZXRob2QgIT09ICdHRVQnKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgIGhlYWRlcjogJ0NhY2hlLnB1dCcsXG4gICAgICAgIG1lc3NhZ2U6ICdFeHBlY3RlZCBhbiBodHRwL3Mgc2NoZW1lIHdoZW4gbWV0aG9kIGlzIG5vdCBHRVQnXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDUuXG4gICAgY29uc3QgaW5uZXJSZXNwb25zZSA9IHJlc3BvbnNlW2tTdGF0ZV1cblxuICAgIC8vIDYuXG4gICAgaWYgKGlubmVyUmVzcG9uc2Uuc3RhdHVzID09PSAyMDYpIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgaGVhZGVyOiAnQ2FjaGUucHV0JyxcbiAgICAgICAgbWVzc2FnZTogJ0dvdCAyMDYgc3RhdHVzJ1xuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyA3LlxuICAgIGlmIChpbm5lclJlc3BvbnNlLmhlYWRlcnNMaXN0LmNvbnRhaW5zKCd2YXJ5JykpIHtcbiAgICAgIC8vIDcuMS5cbiAgICAgIGNvbnN0IGZpZWxkVmFsdWVzID0gZ2V0RmllbGRWYWx1ZXMoaW5uZXJSZXNwb25zZS5oZWFkZXJzTGlzdC5nZXQoJ3ZhcnknKSlcblxuICAgICAgLy8gNy4yLlxuICAgICAgZm9yIChjb25zdCBmaWVsZFZhbHVlIG9mIGZpZWxkVmFsdWVzKSB7XG4gICAgICAgIC8vIDcuMi4xXG4gICAgICAgIGlmIChmaWVsZFZhbHVlID09PSAnKicpIHtcbiAgICAgICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgICBoZWFkZXI6ICdDYWNoZS5wdXQnLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0dvdCAqIHZhcnkgZmllbGQgdmFsdWUnXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDguXG4gICAgaWYgKGlubmVyUmVzcG9uc2UuYm9keSAmJiAoaXNEaXN0dXJiZWQoaW5uZXJSZXNwb25zZS5ib2R5LnN0cmVhbSkgfHwgaW5uZXJSZXNwb25zZS5ib2R5LnN0cmVhbS5sb2NrZWQpKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgIGhlYWRlcjogJ0NhY2hlLnB1dCcsXG4gICAgICAgIG1lc3NhZ2U6ICdSZXNwb25zZSBib2R5IGlzIGxvY2tlZCBvciBkaXN0dXJiZWQnXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDkuXG4gICAgY29uc3QgY2xvbmVkUmVzcG9uc2UgPSBjbG9uZVJlc3BvbnNlKGlubmVyUmVzcG9uc2UpXG5cbiAgICAvLyAxMC5cbiAgICBjb25zdCBib2R5UmVhZFByb21pc2UgPSBjcmVhdGVEZWZlcnJlZFByb21pc2UoKVxuXG4gICAgLy8gMTEuXG4gICAgaWYgKGlubmVyUmVzcG9uc2UuYm9keSAhPSBudWxsKSB7XG4gICAgICAvLyAxMS4xXG4gICAgICBjb25zdCBzdHJlYW0gPSBpbm5lclJlc3BvbnNlLmJvZHkuc3RyZWFtXG5cbiAgICAgIC8vIDExLjJcbiAgICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKVxuXG4gICAgICAvLyAxMS4zXG4gICAgICByZWFkQWxsQnl0ZXMocmVhZGVyKS50aGVuKGJvZHlSZWFkUHJvbWlzZS5yZXNvbHZlLCBib2R5UmVhZFByb21pc2UucmVqZWN0KVxuICAgIH0gZWxzZSB7XG4gICAgICBib2R5UmVhZFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgfVxuXG4gICAgLy8gMTIuXG4gICAgLyoqIEB0eXBlIHtDYWNoZUJhdGNoT3BlcmF0aW9uW119ICovXG4gICAgY29uc3Qgb3BlcmF0aW9ucyA9IFtdXG5cbiAgICAvLyAxMy5cbiAgICAvKiogQHR5cGUge0NhY2hlQmF0Y2hPcGVyYXRpb259ICovXG4gICAgY29uc3Qgb3BlcmF0aW9uID0ge1xuICAgICAgdHlwZTogJ3B1dCcsIC8vIDE0LlxuICAgICAgcmVxdWVzdDogaW5uZXJSZXF1ZXN0LCAvLyAxNS5cbiAgICAgIHJlc3BvbnNlOiBjbG9uZWRSZXNwb25zZSAvLyAxNi5cbiAgICB9XG5cbiAgICAvLyAxNy5cbiAgICBvcGVyYXRpb25zLnB1c2gob3BlcmF0aW9uKVxuXG4gICAgLy8gMTkuXG4gICAgY29uc3QgYnl0ZXMgPSBhd2FpdCBib2R5UmVhZFByb21pc2UucHJvbWlzZVxuXG4gICAgaWYgKGNsb25lZFJlc3BvbnNlLmJvZHkgIT0gbnVsbCkge1xuICAgICAgY2xvbmVkUmVzcG9uc2UuYm9keS5zb3VyY2UgPSBieXRlc1xuICAgIH1cblxuICAgIC8vIDE5LjFcbiAgICBjb25zdCBjYWNoZUpvYlByb21pc2UgPSBjcmVhdGVEZWZlcnJlZFByb21pc2UoKVxuXG4gICAgLy8gMTkuMi4xXG4gICAgbGV0IGVycm9yRGF0YSA9IG51bGxcblxuICAgIC8vIDE5LjIuMlxuICAgIHRyeSB7XG4gICAgICB0aGlzLiNiYXRjaENhY2hlT3BlcmF0aW9ucyhvcGVyYXRpb25zKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yRGF0YSA9IGVcbiAgICB9XG5cbiAgICAvLyAxOS4yLjNcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAvLyAxOS4yLjMuMVxuICAgICAgaWYgKGVycm9yRGF0YSA9PT0gbnVsbCkge1xuICAgICAgICBjYWNoZUpvYlByb21pc2UucmVzb2x2ZSgpXG4gICAgICB9IGVsc2UgeyAvLyAxOS4yLjMuMlxuICAgICAgICBjYWNoZUpvYlByb21pc2UucmVqZWN0KGVycm9yRGF0YSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIGNhY2hlSm9iUHJvbWlzZS5wcm9taXNlXG4gIH1cblxuICBhc3luYyBkZWxldGUgKHJlcXVlc3QsIG9wdGlvbnMgPSB7fSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIENhY2hlKVxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdDYWNoZS5kZWxldGUnIH0pXG5cbiAgICByZXF1ZXN0ID0gd2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdEluZm8ocmVxdWVzdClcbiAgICBvcHRpb25zID0gd2ViaWRsLmNvbnZlcnRlcnMuQ2FjaGVRdWVyeU9wdGlvbnMob3B0aW9ucylcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtSZXF1ZXN0fVxuICAgICAqL1xuICAgIGxldCByID0gbnVsbFxuXG4gICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7XG4gICAgICByID0gcmVxdWVzdFtrU3RhdGVdXG5cbiAgICAgIGlmIChyLm1ldGhvZCAhPT0gJ0dFVCcgJiYgIW9wdGlvbnMuaWdub3JlTWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQodHlwZW9mIHJlcXVlc3QgPT09ICdzdHJpbmcnKVxuXG4gICAgICByID0gbmV3IFJlcXVlc3QocmVxdWVzdClba1N0YXRlXVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7Q2FjaGVCYXRjaE9wZXJhdGlvbltdfSAqL1xuICAgIGNvbnN0IG9wZXJhdGlvbnMgPSBbXVxuXG4gICAgLyoqIEB0eXBlIHtDYWNoZUJhdGNoT3BlcmF0aW9ufSAqL1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IHtcbiAgICAgIHR5cGU6ICdkZWxldGUnLFxuICAgICAgcmVxdWVzdDogcixcbiAgICAgIG9wdGlvbnNcbiAgICB9XG5cbiAgICBvcGVyYXRpb25zLnB1c2gob3BlcmF0aW9uKVxuXG4gICAgY29uc3QgY2FjaGVKb2JQcm9taXNlID0gY3JlYXRlRGVmZXJyZWRQcm9taXNlKClcblxuICAgIGxldCBlcnJvckRhdGEgPSBudWxsXG4gICAgbGV0IHJlcXVlc3RSZXNwb25zZXNcblxuICAgIHRyeSB7XG4gICAgICByZXF1ZXN0UmVzcG9uc2VzID0gdGhpcy4jYmF0Y2hDYWNoZU9wZXJhdGlvbnMob3BlcmF0aW9ucylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckRhdGEgPSBlXG4gICAgfVxuXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgaWYgKGVycm9yRGF0YSA9PT0gbnVsbCkge1xuICAgICAgICBjYWNoZUpvYlByb21pc2UucmVzb2x2ZSghIXJlcXVlc3RSZXNwb25zZXM/Lmxlbmd0aClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhY2hlSm9iUHJvbWlzZS5yZWplY3QoZXJyb3JEYXRhKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4gY2FjaGVKb2JQcm9taXNlLnByb21pc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9TZXJ2aWNlV29ya2VyLyNkb20tY2FjaGUta2V5c1xuICAgKiBAcGFyYW0ge2FueX0gcmVxdWVzdFxuICAgKiBAcGFyYW0ge2ltcG9ydCgnLi4vLi4vdHlwZXMvY2FjaGUnKS5DYWNoZVF1ZXJ5T3B0aW9uc30gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7cmVhZG9ubHkgUmVxdWVzdFtdfVxuICAgKi9cbiAgYXN5bmMga2V5cyAocmVxdWVzdCA9IHVuZGVmaW5lZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGUpXG5cbiAgICBpZiAocmVxdWVzdCAhPT0gdW5kZWZpbmVkKSByZXF1ZXN0ID0gd2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdEluZm8ocmVxdWVzdClcbiAgICBvcHRpb25zID0gd2ViaWRsLmNvbnZlcnRlcnMuQ2FjaGVRdWVyeU9wdGlvbnMob3B0aW9ucylcblxuICAgIC8vIDEuXG4gICAgbGV0IHIgPSBudWxsXG5cbiAgICAvLyAyLlxuICAgIGlmIChyZXF1ZXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIDIuMVxuICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7XG4gICAgICAgIC8vIDIuMS4xXG4gICAgICAgIHIgPSByZXF1ZXN0W2tTdGF0ZV1cblxuICAgICAgICAvLyAyLjEuMlxuICAgICAgICBpZiAoci5tZXRob2QgIT09ICdHRVQnICYmICFvcHRpb25zLmlnbm9yZU1ldGhvZCkge1xuICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXF1ZXN0ID09PSAnc3RyaW5nJykgeyAvLyAyLjJcbiAgICAgICAgciA9IG5ldyBSZXF1ZXN0KHJlcXVlc3QpW2tTdGF0ZV1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA0LlxuICAgIGNvbnN0IHByb21pc2UgPSBjcmVhdGVEZWZlcnJlZFByb21pc2UoKVxuXG4gICAgLy8gNS5cbiAgICAvLyA1LjFcbiAgICBjb25zdCByZXF1ZXN0cyA9IFtdXG5cbiAgICAvLyA1LjJcbiAgICBpZiAocmVxdWVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyA1LjIuMVxuICAgICAgZm9yIChjb25zdCByZXF1ZXN0UmVzcG9uc2Ugb2YgdGhpcy4jcmVsZXZhbnRSZXF1ZXN0UmVzcG9uc2VMaXN0KSB7XG4gICAgICAgIC8vIDUuMi4xLjFcbiAgICAgICAgcmVxdWVzdHMucHVzaChyZXF1ZXN0UmVzcG9uc2VbMF0pXG4gICAgICB9XG4gICAgfSBlbHNlIHsgLy8gNS4zXG4gICAgICAvLyA1LjMuMVxuICAgICAgY29uc3QgcmVxdWVzdFJlc3BvbnNlcyA9IHRoaXMuI3F1ZXJ5Q2FjaGUociwgb3B0aW9ucylcblxuICAgICAgLy8gNS4zLjJcbiAgICAgIGZvciAoY29uc3QgcmVxdWVzdFJlc3BvbnNlIG9mIHJlcXVlc3RSZXNwb25zZXMpIHtcbiAgICAgICAgLy8gNS4zLjIuMVxuICAgICAgICByZXF1ZXN0cy5wdXNoKHJlcXVlc3RSZXNwb25zZVswXSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA1LjRcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAvLyA1LjQuMVxuICAgICAgY29uc3QgcmVxdWVzdExpc3QgPSBbXVxuXG4gICAgICAvLyA1LjQuMlxuICAgICAgZm9yIChjb25zdCByZXF1ZXN0IG9mIHJlcXVlc3RzKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RPYmplY3QgPSBuZXcgUmVxdWVzdCgnaHR0cHM6Ly9hJylcbiAgICAgICAgcmVxdWVzdE9iamVjdFtrU3RhdGVdID0gcmVxdWVzdFxuICAgICAgICByZXF1ZXN0T2JqZWN0W2tIZWFkZXJzXVtrSGVhZGVyc0xpc3RdID0gcmVxdWVzdC5oZWFkZXJzTGlzdFxuICAgICAgICByZXF1ZXN0T2JqZWN0W2tIZWFkZXJzXVtrR3VhcmRdID0gJ2ltbXV0YWJsZSdcbiAgICAgICAgcmVxdWVzdE9iamVjdFtrUmVhbG1dID0gcmVxdWVzdC5jbGllbnRcblxuICAgICAgICAvLyA1LjQuMi4xXG4gICAgICAgIHJlcXVlc3RMaXN0LnB1c2gocmVxdWVzdE9iamVjdClcbiAgICAgIH1cblxuICAgICAgLy8gNS40LjNcbiAgICAgIHByb21pc2UucmVzb2x2ZShPYmplY3QuZnJlZXplKHJlcXVlc3RMaXN0KSlcbiAgICB9KVxuXG4gICAgcmV0dXJuIHByb21pc2UucHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL1NlcnZpY2VXb3JrZXIvI2JhdGNoLWNhY2hlLW9wZXJhdGlvbnMtYWxnb3JpdGhtXG4gICAqIEBwYXJhbSB7Q2FjaGVCYXRjaE9wZXJhdGlvbltdfSBvcGVyYXRpb25zXG4gICAqIEByZXR1cm5zIHtyZXF1ZXN0UmVzcG9uc2VMaXN0fVxuICAgKi9cbiAgI2JhdGNoQ2FjaGVPcGVyYXRpb25zIChvcGVyYXRpb25zKSB7XG4gICAgLy8gMS5cbiAgICBjb25zdCBjYWNoZSA9IHRoaXMuI3JlbGV2YW50UmVxdWVzdFJlc3BvbnNlTGlzdFxuXG4gICAgLy8gMi5cbiAgICBjb25zdCBiYWNrdXBDYWNoZSA9IFsuLi5jYWNoZV1cblxuICAgIC8vIDMuXG4gICAgY29uc3QgYWRkZWRJdGVtcyA9IFtdXG5cbiAgICAvLyA0LjFcbiAgICBjb25zdCByZXN1bHRMaXN0ID0gW11cblxuICAgIHRyeSB7XG4gICAgICAvLyA0LjJcbiAgICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIG9wZXJhdGlvbnMpIHtcbiAgICAgICAgLy8gNC4yLjFcbiAgICAgICAgaWYgKG9wZXJhdGlvbi50eXBlICE9PSAnZGVsZXRlJyAmJiBvcGVyYXRpb24udHlwZSAhPT0gJ3B1dCcpIHtcbiAgICAgICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgICBoZWFkZXI6ICdDYWNoZS4jYmF0Y2hDYWNoZU9wZXJhdGlvbnMnLFxuICAgICAgICAgICAgbWVzc2FnZTogJ29wZXJhdGlvbiB0eXBlIGRvZXMgbm90IG1hdGNoIFwiZGVsZXRlXCIgb3IgXCJwdXRcIidcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNC4yLjJcbiAgICAgICAgaWYgKG9wZXJhdGlvbi50eXBlID09PSAnZGVsZXRlJyAmJiBvcGVyYXRpb24ucmVzcG9uc2UgIT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICAgIGhlYWRlcjogJ0NhY2hlLiNiYXRjaENhY2hlT3BlcmF0aW9ucycsXG4gICAgICAgICAgICBtZXNzYWdlOiAnZGVsZXRlIG9wZXJhdGlvbiBzaG91bGQgbm90IGhhdmUgYW4gYXNzb2NpYXRlZCByZXNwb25zZSdcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNC4yLjNcbiAgICAgICAgaWYgKHRoaXMuI3F1ZXJ5Q2FjaGUob3BlcmF0aW9uLnJlcXVlc3QsIG9wZXJhdGlvbi5vcHRpb25zLCBhZGRlZEl0ZW1zKS5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCc/Pz8nLCAnSW52YWxpZFN0YXRlRXJyb3InKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNC4yLjRcbiAgICAgICAgbGV0IHJlcXVlc3RSZXNwb25zZXNcblxuICAgICAgICAvLyA0LjIuNVxuICAgICAgICBpZiAob3BlcmF0aW9uLnR5cGUgPT09ICdkZWxldGUnKSB7XG4gICAgICAgICAgLy8gNC4yLjUuMVxuICAgICAgICAgIHJlcXVlc3RSZXNwb25zZXMgPSB0aGlzLiNxdWVyeUNhY2hlKG9wZXJhdGlvbi5yZXF1ZXN0LCBvcGVyYXRpb24ub3B0aW9ucylcblxuICAgICAgICAgIC8vIFRPRE86IHRoZSBzcGVjIGlzIHdyb25nLCB0aGlzIGlzIG5lZWRlZCB0byBwYXNzIFdQVHNcbiAgICAgICAgICBpZiAocmVxdWVzdFJlc3BvbnNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIDQuMi41LjJcbiAgICAgICAgICBmb3IgKGNvbnN0IHJlcXVlc3RSZXNwb25zZSBvZiByZXF1ZXN0UmVzcG9uc2VzKSB7XG4gICAgICAgICAgICBjb25zdCBpZHggPSBjYWNoZS5pbmRleE9mKHJlcXVlc3RSZXNwb25zZSlcbiAgICAgICAgICAgIGFzc2VydChpZHggIT09IC0xKVxuXG4gICAgICAgICAgICAvLyA0LjIuNS4yLjFcbiAgICAgICAgICAgIGNhY2hlLnNwbGljZShpZHgsIDEpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbi50eXBlID09PSAncHV0JykgeyAvLyA0LjIuNlxuICAgICAgICAgIC8vIDQuMi42LjFcbiAgICAgICAgICBpZiAob3BlcmF0aW9uLnJlc3BvbnNlID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICAgICAgaGVhZGVyOiAnQ2FjaGUuI2JhdGNoQ2FjaGVPcGVyYXRpb25zJyxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ3B1dCBvcGVyYXRpb24gc2hvdWxkIGhhdmUgYW4gYXNzb2NpYXRlZCByZXNwb25zZSdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gNC4yLjYuMlxuICAgICAgICAgIGNvbnN0IHIgPSBvcGVyYXRpb24ucmVxdWVzdFxuXG4gICAgICAgICAgLy8gNC4yLjYuM1xuICAgICAgICAgIGlmICghdXJsSXNIdHRwSHR0cHNTY2hlbWUoci51cmwpKSB7XG4gICAgICAgICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgICAgIGhlYWRlcjogJ0NhY2hlLiNiYXRjaENhY2hlT3BlcmF0aW9ucycsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdleHBlY3RlZCBodHRwIG9yIGh0dHBzIHNjaGVtZSdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gNC4yLjYuNFxuICAgICAgICAgIGlmIChyLm1ldGhvZCAhPT0gJ0dFVCcpIHtcbiAgICAgICAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICAgICAgaGVhZGVyOiAnQ2FjaGUuI2JhdGNoQ2FjaGVPcGVyYXRpb25zJyxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ25vdCBnZXQgbWV0aG9kJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyA0LjIuNi41XG4gICAgICAgICAgaWYgKG9wZXJhdGlvbi5vcHRpb25zICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICAgICAgaGVhZGVyOiAnQ2FjaGUuI2JhdGNoQ2FjaGVPcGVyYXRpb25zJyxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ29wdGlvbnMgbXVzdCBub3QgYmUgZGVmaW5lZCdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gNC4yLjYuNlxuICAgICAgICAgIHJlcXVlc3RSZXNwb25zZXMgPSB0aGlzLiNxdWVyeUNhY2hlKG9wZXJhdGlvbi5yZXF1ZXN0KVxuXG4gICAgICAgICAgLy8gNC4yLjYuN1xuICAgICAgICAgIGZvciAoY29uc3QgcmVxdWVzdFJlc3BvbnNlIG9mIHJlcXVlc3RSZXNwb25zZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IGNhY2hlLmluZGV4T2YocmVxdWVzdFJlc3BvbnNlKVxuICAgICAgICAgICAgYXNzZXJ0KGlkeCAhPT0gLTEpXG5cbiAgICAgICAgICAgIC8vIDQuMi42LjcuMVxuICAgICAgICAgICAgY2FjaGUuc3BsaWNlKGlkeCwgMSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyA0LjIuNi44XG4gICAgICAgICAgY2FjaGUucHVzaChbb3BlcmF0aW9uLnJlcXVlc3QsIG9wZXJhdGlvbi5yZXNwb25zZV0pXG5cbiAgICAgICAgICAvLyA0LjIuNi4xMFxuICAgICAgICAgIGFkZGVkSXRlbXMucHVzaChbb3BlcmF0aW9uLnJlcXVlc3QsIG9wZXJhdGlvbi5yZXNwb25zZV0pXG4gICAgICAgIH1cblxuICAgICAgICAvLyA0LjIuN1xuICAgICAgICByZXN1bHRMaXN0LnB1c2goW29wZXJhdGlvbi5yZXF1ZXN0LCBvcGVyYXRpb24ucmVzcG9uc2VdKVxuICAgICAgfVxuXG4gICAgICAvLyA0LjNcbiAgICAgIHJldHVybiByZXN1bHRMaXN0XG4gICAgfSBjYXRjaCAoZSkgeyAvLyA1LlxuICAgICAgLy8gNS4xXG4gICAgICB0aGlzLiNyZWxldmFudFJlcXVlc3RSZXNwb25zZUxpc3QubGVuZ3RoID0gMFxuXG4gICAgICAvLyA1LjJcbiAgICAgIHRoaXMuI3JlbGV2YW50UmVxdWVzdFJlc3BvbnNlTGlzdCA9IGJhY2t1cENhY2hlXG5cbiAgICAgIC8vIDUuM1xuICAgICAgdGhyb3cgZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9TZXJ2aWNlV29ya2VyLyNxdWVyeS1jYWNoZVxuICAgKiBAcGFyYW0ge2FueX0gcmVxdWVzdFF1ZXJ5XG4gICAqIEBwYXJhbSB7aW1wb3J0KCcuLi8uLi90eXBlcy9jYWNoZScpLkNhY2hlUXVlcnlPcHRpb25zfSBvcHRpb25zXG4gICAqIEBwYXJhbSB7cmVxdWVzdFJlc3BvbnNlTGlzdH0gdGFyZ2V0U3RvcmFnZVxuICAgKiBAcmV0dXJucyB7cmVxdWVzdFJlc3BvbnNlTGlzdH1cbiAgICovXG4gICNxdWVyeUNhY2hlIChyZXF1ZXN0UXVlcnksIG9wdGlvbnMsIHRhcmdldFN0b3JhZ2UpIHtcbiAgICAvKiogQHR5cGUge3JlcXVlc3RSZXNwb25zZUxpc3R9ICovXG4gICAgY29uc3QgcmVzdWx0TGlzdCA9IFtdXG5cbiAgICBjb25zdCBzdG9yYWdlID0gdGFyZ2V0U3RvcmFnZSA/PyB0aGlzLiNyZWxldmFudFJlcXVlc3RSZXNwb25zZUxpc3RcblxuICAgIGZvciAoY29uc3QgcmVxdWVzdFJlc3BvbnNlIG9mIHN0b3JhZ2UpIHtcbiAgICAgIGNvbnN0IFtjYWNoZWRSZXF1ZXN0LCBjYWNoZWRSZXNwb25zZV0gPSByZXF1ZXN0UmVzcG9uc2VcbiAgICAgIGlmICh0aGlzLiNyZXF1ZXN0TWF0Y2hlc0NhY2hlZEl0ZW0ocmVxdWVzdFF1ZXJ5LCBjYWNoZWRSZXF1ZXN0LCBjYWNoZWRSZXNwb25zZSwgb3B0aW9ucykpIHtcbiAgICAgICAgcmVzdWx0TGlzdC5wdXNoKHJlcXVlc3RSZXNwb25zZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0TGlzdFxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL1NlcnZpY2VXb3JrZXIvI3JlcXVlc3QtbWF0Y2hlcy1jYWNoZWQtaXRlbS1hbGdvcml0aG1cbiAgICogQHBhcmFtIHthbnl9IHJlcXVlc3RRdWVyeVxuICAgKiBAcGFyYW0ge2FueX0gcmVxdWVzdFxuICAgKiBAcGFyYW0ge2FueSB8IG51bGx9IHJlc3BvbnNlXG4gICAqIEBwYXJhbSB7aW1wb3J0KCcuLi8uLi90eXBlcy9jYWNoZScpLkNhY2hlUXVlcnlPcHRpb25zIHwgdW5kZWZpbmVkfSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgI3JlcXVlc3RNYXRjaGVzQ2FjaGVkSXRlbSAocmVxdWVzdFF1ZXJ5LCByZXF1ZXN0LCByZXNwb25zZSA9IG51bGwsIG9wdGlvbnMpIHtcbiAgICAvLyBpZiAob3B0aW9ucz8uaWdub3JlTWV0aG9kID09PSBmYWxzZSAmJiByZXF1ZXN0Lm1ldGhvZCA9PT0gJ0dFVCcpIHtcbiAgICAvLyAgIHJldHVybiBmYWxzZVxuICAgIC8vIH1cblxuICAgIGNvbnN0IHF1ZXJ5VVJMID0gbmV3IFVSTChyZXF1ZXN0UXVlcnkudXJsKVxuXG4gICAgY29uc3QgY2FjaGVkVVJMID0gbmV3IFVSTChyZXF1ZXN0LnVybClcblxuICAgIGlmIChvcHRpb25zPy5pZ25vcmVTZWFyY2gpIHtcbiAgICAgIGNhY2hlZFVSTC5zZWFyY2ggPSAnJ1xuXG4gICAgICBxdWVyeVVSTC5zZWFyY2ggPSAnJ1xuICAgIH1cblxuICAgIGlmICghdXJsRXF1YWxzKHF1ZXJ5VVJMLCBjYWNoZWRVUkwsIHRydWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICByZXNwb25zZSA9PSBudWxsIHx8XG4gICAgICBvcHRpb25zPy5pZ25vcmVWYXJ5IHx8XG4gICAgICAhcmVzcG9uc2UuaGVhZGVyc0xpc3QuY29udGFpbnMoJ3ZhcnknKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBjb25zdCBmaWVsZFZhbHVlcyA9IGdldEZpZWxkVmFsdWVzKHJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgndmFyeScpKVxuXG4gICAgZm9yIChjb25zdCBmaWVsZFZhbHVlIG9mIGZpZWxkVmFsdWVzKSB7XG4gICAgICBpZiAoZmllbGRWYWx1ZSA9PT0gJyonKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXF1ZXN0VmFsdWUgPSByZXF1ZXN0LmhlYWRlcnNMaXN0LmdldChmaWVsZFZhbHVlKVxuICAgICAgY29uc3QgcXVlcnlWYWx1ZSA9IHJlcXVlc3RRdWVyeS5oZWFkZXJzTGlzdC5nZXQoZmllbGRWYWx1ZSlcblxuICAgICAgLy8gSWYgb25lIGhhcyB0aGUgaGVhZGVyIGFuZCB0aGUgb3RoZXIgZG9lc24ndCwgb3Igb25lIGhhc1xuICAgICAgLy8gYSBkaWZmZXJlbnQgdmFsdWUgdGhhbiB0aGUgb3RoZXIsIHJldHVybiBmYWxzZVxuICAgICAgaWYgKHJlcXVlc3RWYWx1ZSAhPT0gcXVlcnlWYWx1ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKENhY2hlLnByb3RvdHlwZSwge1xuICBbU3ltYm9sLnRvU3RyaW5nVGFnXToge1xuICAgIHZhbHVlOiAnQ2FjaGUnLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9LFxuICBtYXRjaDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgbWF0Y2hBbGw6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGFkZDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgYWRkQWxsOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBwdXQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGRlbGV0ZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAga2V5czoga0VudW1lcmFibGVQcm9wZXJ0eVxufSlcblxuY29uc3QgY2FjaGVRdWVyeU9wdGlvbkNvbnZlcnRlcnMgPSBbXG4gIHtcbiAgICBrZXk6ICdpZ25vcmVTZWFyY2gnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYm9vbGVhbixcbiAgICBkZWZhdWx0VmFsdWU6IGZhbHNlXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdpZ25vcmVNZXRob2QnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYm9vbGVhbixcbiAgICBkZWZhdWx0VmFsdWU6IGZhbHNlXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdpZ25vcmVWYXJ5JyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4sXG4gICAgZGVmYXVsdFZhbHVlOiBmYWxzZVxuICB9XG5dXG5cbndlYmlkbC5jb252ZXJ0ZXJzLkNhY2hlUXVlcnlPcHRpb25zID0gd2ViaWRsLmRpY3Rpb25hcnlDb252ZXJ0ZXIoY2FjaGVRdWVyeU9wdGlvbkNvbnZlcnRlcnMpXG5cbndlYmlkbC5jb252ZXJ0ZXJzLk11bHRpQ2FjaGVRdWVyeU9wdGlvbnMgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIC4uLmNhY2hlUXVlcnlPcHRpb25Db252ZXJ0ZXJzLFxuICB7XG4gICAga2V5OiAnY2FjaGVOYW1lJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZ1xuICB9XG5dKVxuXG53ZWJpZGwuY29udmVydGVycy5SZXNwb25zZSA9IHdlYmlkbC5pbnRlcmZhY2VDb252ZXJ0ZXIoUmVzcG9uc2UpXG5cbndlYmlkbC5jb252ZXJ0ZXJzWydzZXF1ZW5jZTxSZXF1ZXN0SW5mbz4nXSA9IHdlYmlkbC5zZXF1ZW5jZUNvbnZlcnRlcihcbiAgd2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdEluZm9cbilcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIENhY2hlXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBrQ29uc3RydWN0IH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgeyBDYWNoZSB9ID0gcmVxdWlyZSgnLi9jYWNoZScpXG5jb25zdCB7IHdlYmlkbCB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvd2ViaWRsJylcbmNvbnN0IHsga0VudW1lcmFibGVQcm9wZXJ0eSB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcblxuY2xhc3MgQ2FjaGVTdG9yYWdlIHtcbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL1NlcnZpY2VXb3JrZXIvI2Rmbi1yZWxldmFudC1uYW1lLXRvLWNhY2hlLW1hcFxuICAgKiBAdHlwZSB7TWFwPHN0cmluZywgaW1wb3J0KCcuL2NhY2hlJykucmVxdWVzdFJlc3BvbnNlTGlzdH1cbiAgICovXG4gICNjYWNoZXMgPSBuZXcgTWFwKClcblxuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgaWYgKGFyZ3VtZW50c1swXSAhPT0ga0NvbnN0cnVjdCkge1xuICAgICAgd2ViaWRsLmlsbGVnYWxDb25zdHJ1Y3RvcigpXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbWF0Y2ggKHJlcXVlc3QsIG9wdGlvbnMgPSB7fSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIENhY2hlU3RvcmFnZSlcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnQ2FjaGVTdG9yYWdlLm1hdGNoJyB9KVxuXG4gICAgcmVxdWVzdCA9IHdlYmlkbC5jb252ZXJ0ZXJzLlJlcXVlc3RJbmZvKHJlcXVlc3QpXG4gICAgb3B0aW9ucyA9IHdlYmlkbC5jb252ZXJ0ZXJzLk11bHRpQ2FjaGVRdWVyeU9wdGlvbnMob3B0aW9ucylcblxuICAgIC8vIDEuXG4gICAgaWYgKG9wdGlvbnMuY2FjaGVOYW1lICE9IG51bGwpIHtcbiAgICAgIC8vIDEuMS4xLjFcbiAgICAgIGlmICh0aGlzLiNjYWNoZXMuaGFzKG9wdGlvbnMuY2FjaGVOYW1lKSkge1xuICAgICAgICAvLyAxLjEuMS4xLjFcbiAgICAgICAgY29uc3QgY2FjaGVMaXN0ID0gdGhpcy4jY2FjaGVzLmdldChvcHRpb25zLmNhY2hlTmFtZSlcbiAgICAgICAgY29uc3QgY2FjaGUgPSBuZXcgQ2FjaGUoa0NvbnN0cnVjdCwgY2FjaGVMaXN0KVxuXG4gICAgICAgIHJldHVybiBhd2FpdCBjYWNoZS5tYXRjaChyZXF1ZXN0LCBvcHRpb25zKVxuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIDIuXG4gICAgICAvLyAyLjJcbiAgICAgIGZvciAoY29uc3QgY2FjaGVMaXN0IG9mIHRoaXMuI2NhY2hlcy52YWx1ZXMoKSkge1xuICAgICAgICBjb25zdCBjYWNoZSA9IG5ldyBDYWNoZShrQ29uc3RydWN0LCBjYWNoZUxpc3QpXG5cbiAgICAgICAgLy8gMi4yLjEuMlxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNhY2hlLm1hdGNoKHJlcXVlc3QsIG9wdGlvbnMpXG5cbiAgICAgICAgaWYgKHJlc3BvbnNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9TZXJ2aWNlV29ya2VyLyNjYWNoZS1zdG9yYWdlLWhhc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FjaGVOYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgYXN5bmMgaGFzIChjYWNoZU5hbWUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBDYWNoZVN0b3JhZ2UpXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0NhY2hlU3RvcmFnZS5oYXMnIH0pXG5cbiAgICBjYWNoZU5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcoY2FjaGVOYW1lKVxuXG4gICAgLy8gMi4xLjFcbiAgICAvLyAyLjJcbiAgICByZXR1cm4gdGhpcy4jY2FjaGVzLmhhcyhjYWNoZU5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vU2VydmljZVdvcmtlci8jZG9tLWNhY2hlc3RvcmFnZS1vcGVuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjYWNoZU5hbWVcbiAgICogQHJldHVybnMge1Byb21pc2U8Q2FjaGU+fVxuICAgKi9cbiAgYXN5bmMgb3BlbiAoY2FjaGVOYW1lKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGVTdG9yYWdlKVxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdDYWNoZVN0b3JhZ2Uub3BlbicgfSlcblxuICAgIGNhY2hlTmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyhjYWNoZU5hbWUpXG5cbiAgICAvLyAyLjFcbiAgICBpZiAodGhpcy4jY2FjaGVzLmhhcyhjYWNoZU5hbWUpKSB7XG4gICAgICAvLyBhd2FpdCBjYWNoZXMub3BlbigndjEnKSAhPT0gYXdhaXQgY2FjaGVzLm9wZW4oJ3YxJylcblxuICAgICAgLy8gMi4xLjFcbiAgICAgIGNvbnN0IGNhY2hlID0gdGhpcy4jY2FjaGVzLmdldChjYWNoZU5hbWUpXG5cbiAgICAgIC8vIDIuMS4xLjFcbiAgICAgIHJldHVybiBuZXcgQ2FjaGUoa0NvbnN0cnVjdCwgY2FjaGUpXG4gICAgfVxuXG4gICAgLy8gMi4yXG4gICAgY29uc3QgY2FjaGUgPSBbXVxuXG4gICAgLy8gMi4zXG4gICAgdGhpcy4jY2FjaGVzLnNldChjYWNoZU5hbWUsIGNhY2hlKVxuXG4gICAgLy8gMi40XG4gICAgcmV0dXJuIG5ldyBDYWNoZShrQ29uc3RydWN0LCBjYWNoZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9TZXJ2aWNlV29ya2VyLyNjYWNoZS1zdG9yYWdlLWRlbGV0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FjaGVOYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlIChjYWNoZU5hbWUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBDYWNoZVN0b3JhZ2UpXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0NhY2hlU3RvcmFnZS5kZWxldGUnIH0pXG5cbiAgICBjYWNoZU5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcoY2FjaGVOYW1lKVxuXG4gICAgcmV0dXJuIHRoaXMuI2NhY2hlcy5kZWxldGUoY2FjaGVOYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL1NlcnZpY2VXb3JrZXIvI2NhY2hlLXN0b3JhZ2Uta2V5c1xuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBhc3luYyBrZXlzICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBDYWNoZVN0b3JhZ2UpXG5cbiAgICAvLyAyLjFcbiAgICBjb25zdCBrZXlzID0gdGhpcy4jY2FjaGVzLmtleXMoKVxuXG4gICAgLy8gMi4yXG4gICAgcmV0dXJuIFsuLi5rZXlzXVxuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKENhY2hlU3RvcmFnZS5wcm90b3R5cGUsIHtcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHtcbiAgICB2YWx1ZTogJ0NhY2hlU3RvcmFnZScsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0sXG4gIG1hdGNoOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBoYXM6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIG9wZW46IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGRlbGV0ZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAga2V5czoga0VudW1lcmFibGVQcm9wZXJ0eVxufSlcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIENhY2hlU3RvcmFnZVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbi8vIGh0dHBzOi8vd2ljZy5naXRodWIuaW8vY29va2llLXN0b3JlLyNjb29raWUtbWF4aW11bS1hdHRyaWJ1dGUtdmFsdWUtc2l6ZVxuY29uc3QgbWF4QXR0cmlidXRlVmFsdWVTaXplID0gMTAyNFxuXG4vLyBodHRwczovL3dpY2cuZ2l0aHViLmlvL2Nvb2tpZS1zdG9yZS8jY29va2llLW1heGltdW0tbmFtZS12YWx1ZS1wYWlyLXNpemVcbmNvbnN0IG1heE5hbWVWYWx1ZVBhaXJTaXplID0gNDA5NlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWF4QXR0cmlidXRlVmFsdWVTaXplLFxuICBtYXhOYW1lVmFsdWVQYWlyU2l6ZVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNDVExFeGNsdWRpbmdIdGFiICh2YWx1ZSkge1xuICBpZiAodmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBmb3IgKGNvbnN0IGNoYXIgb2YgdmFsdWUpIHtcbiAgICBjb25zdCBjb2RlID0gY2hhci5jaGFyQ29kZUF0KDApXG5cbiAgICBpZiAoXG4gICAgICAoY29kZSA+PSAweDAwIHx8IGNvZGUgPD0gMHgwOCkgfHxcbiAgICAgIChjb2RlID49IDB4MEEgfHwgY29kZSA8PSAweDFGKSB8fFxuICAgICAgY29kZSA9PT0gMHg3RlxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG59XG5cbi8qKlxuIENIQVIgICAgICAgICAgID0gPGFueSBVUy1BU0NJSSBjaGFyYWN0ZXIgKG9jdGV0cyAwIC0gMTI3KT5cbiB0b2tlbiAgICAgICAgICA9IDEqPGFueSBDSEFSIGV4Y2VwdCBDVExzIG9yIHNlcGFyYXRvcnM+XG4gc2VwYXJhdG9ycyAgICAgPSBcIihcIiB8IFwiKVwiIHwgXCI8XCIgfCBcIj5cIiB8IFwiQFwiXG4gICAgICAgICAgICAgICAgfCBcIixcIiB8IFwiO1wiIHwgXCI6XCIgfCBcIlxcXCIgfCA8XCI+XG4gICAgICAgICAgICAgICAgfCBcIi9cIiB8IFwiW1wiIHwgXCJdXCIgfCBcIj9cIiB8IFwiPVwiXG4gICAgICAgICAgICAgICAgfCBcIntcIiB8IFwifVwiIHwgU1AgfCBIVFxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVDb29raWVOYW1lIChuYW1lKSB7XG4gIGZvciAoY29uc3QgY2hhciBvZiBuYW1lKSB7XG4gICAgY29uc3QgY29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKVxuXG4gICAgaWYgKFxuICAgICAgKGNvZGUgPD0gMHgyMCB8fCBjb2RlID4gMHg3RikgfHxcbiAgICAgIGNoYXIgPT09ICcoJyB8fFxuICAgICAgY2hhciA9PT0gJyknIHx8XG4gICAgICBjaGFyID09PSAnPicgfHxcbiAgICAgIGNoYXIgPT09ICc8JyB8fFxuICAgICAgY2hhciA9PT0gJ0AnIHx8XG4gICAgICBjaGFyID09PSAnLCcgfHxcbiAgICAgIGNoYXIgPT09ICc7JyB8fFxuICAgICAgY2hhciA9PT0gJzonIHx8XG4gICAgICBjaGFyID09PSAnXFxcXCcgfHxcbiAgICAgIGNoYXIgPT09ICdcIicgfHxcbiAgICAgIGNoYXIgPT09ICcvJyB8fFxuICAgICAgY2hhciA9PT0gJ1snIHx8XG4gICAgICBjaGFyID09PSAnXScgfHxcbiAgICAgIGNoYXIgPT09ICc/JyB8fFxuICAgICAgY2hhciA9PT0gJz0nIHx8XG4gICAgICBjaGFyID09PSAneycgfHxcbiAgICAgIGNoYXIgPT09ICd9J1xuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvb2tpZSBuYW1lJylcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gY29va2llLXZhbHVlICAgICAgPSAqY29va2llLW9jdGV0IC8gKCBEUVVPVEUgKmNvb2tpZS1vY3RldCBEUVVPVEUgKVxuIGNvb2tpZS1vY3RldCAgICAgID0gJXgyMSAvICV4MjMtMkIgLyAleDJELTNBIC8gJXgzQy01QiAvICV4NUQtN0VcbiAgICAgICAgICAgICAgICAgICAgICAgOyBVUy1BU0NJSSBjaGFyYWN0ZXJzIGV4Y2x1ZGluZyBDVExzLFxuICAgICAgICAgICAgICAgICAgICAgICA7IHdoaXRlc3BhY2UgRFFVT1RFLCBjb21tYSwgc2VtaWNvbG9uLFxuICAgICAgICAgICAgICAgICAgICAgICA7IGFuZCBiYWNrc2xhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUNvb2tpZVZhbHVlICh2YWx1ZSkge1xuICBmb3IgKGNvbnN0IGNoYXIgb2YgdmFsdWUpIHtcbiAgICBjb25zdCBjb2RlID0gY2hhci5jaGFyQ29kZUF0KDApXG5cbiAgICBpZiAoXG4gICAgICBjb2RlIDwgMHgyMSB8fCAvLyBleGNsdWRlIENUTHMgKDAtMzEpXG4gICAgICBjb2RlID09PSAweDIyIHx8XG4gICAgICBjb2RlID09PSAweDJDIHx8XG4gICAgICBjb2RlID09PSAweDNCIHx8XG4gICAgICBjb2RlID09PSAweDVDIHx8XG4gICAgICBjb2RlID4gMHg3RSAvLyBub24tYXNjaWlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBoZWFkZXIgdmFsdWUnKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIHBhdGgtdmFsdWUgICAgICAgID0gPGFueSBDSEFSIGV4Y2VwdCBDVExzIG9yIFwiO1wiPlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVDb29raWVQYXRoIChwYXRoKSB7XG4gIGZvciAoY29uc3QgY2hhciBvZiBwYXRoKSB7XG4gICAgY29uc3QgY29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKVxuXG4gICAgaWYgKGNvZGUgPCAweDIxIHx8IGNoYXIgPT09ICc7Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvb2tpZSBwYXRoJylcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBJIGhhdmUgbm8gaWRlYSB3aHkgdGhlc2UgdmFsdWVzIGFyZW4ndCBhbGxvd2VkIHRvIGJlIGhvbmVzdCxcbiAqIGJ1dCBEZW5vIHRlc3RzIHRoZXNlLiAtIEtoYWZyYVxuICogQHBhcmFtIHtzdHJpbmd9IGRvbWFpblxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUNvb2tpZURvbWFpbiAoZG9tYWluKSB7XG4gIGlmIChcbiAgICBkb21haW4uc3RhcnRzV2l0aCgnLScpIHx8XG4gICAgZG9tYWluLmVuZHNXaXRoKCcuJykgfHxcbiAgICBkb21haW4uZW5kc1dpdGgoJy0nKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29va2llIGRvbWFpbicpXG4gIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM3MjMxI3NlY3Rpb24tNy4xLjEuMVxuICogQHBhcmFtIHtudW1iZXJ8RGF0ZX0gZGF0ZVxuICBJTUYtZml4ZGF0ZSAgPSBkYXktbmFtZSBcIixcIiBTUCBkYXRlMSBTUCB0aW1lLW9mLWRheSBTUCBHTVRcbiAgOyBmaXhlZCBsZW5ndGgvem9uZS9jYXBpdGFsaXphdGlvbiBzdWJzZXQgb2YgdGhlIGZvcm1hdFxuICA7IHNlZSBTZWN0aW9uIDMuMyBvZiBbUkZDNTMyMl1cblxuICBkYXktbmFtZSAgICAgPSAleDRELjZGLjZFIDsgXCJNb25cIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDU0Ljc1LjY1IDsgXCJUdWVcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDU3LjY1LjY0IDsgXCJXZWRcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDU0LjY4Ljc1IDsgXCJUaHVcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDQ2LjcyLjY5IDsgXCJGcmlcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDUzLjYxLjc0IDsgXCJTYXRcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDUzLjc1LjZFIDsgXCJTdW5cIiwgY2FzZS1zZW5zaXRpdmVcbiAgZGF0ZTEgICAgICAgID0gZGF5IFNQIG1vbnRoIFNQIHllYXJcbiAgICAgICAgICAgICAgICAgIDsgZS5nLiwgMDIgSnVuIDE5ODJcblxuICBkYXkgICAgICAgICAgPSAyRElHSVRcbiAgbW9udGggICAgICAgID0gJXg0QS42MS42RSA7IFwiSmFuXCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg0Ni42NS42MiA7IFwiRmViXCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg0RC42MS43MiA7IFwiTWFyXCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg0MS43MC43MiA7IFwiQXByXCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg0RC42MS43OSA7IFwiTWF5XCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg0QS43NS42RSA7IFwiSnVuXCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg0QS43NS42QyA7IFwiSnVsXCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg0MS43NS42NyA7IFwiQXVnXCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg1My42NS43MCA7IFwiU2VwXCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg0Ri42My43NCA7IFwiT2N0XCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg0RS42Ri43NiA7IFwiTm92XCIsIGNhc2Utc2Vuc2l0aXZlXG4gICAgICAgICAgICAgIC8gJXg0NC42NS42MyA7IFwiRGVjXCIsIGNhc2Utc2Vuc2l0aXZlXG4gIHllYXIgICAgICAgICA9IDRESUdJVFxuXG4gIEdNVCAgICAgICAgICA9ICV4NDcuNEQuNTQgOyBcIkdNVFwiLCBjYXNlLXNlbnNpdGl2ZVxuXG4gIHRpbWUtb2YtZGF5ICA9IGhvdXIgXCI6XCIgbWludXRlIFwiOlwiIHNlY29uZFxuICAgICAgICAgICAgICA7IDAwOjAwOjAwIC0gMjM6NTk6NjAgKGxlYXAgc2Vjb25kKVxuXG4gIGhvdXIgICAgICAgICA9IDJESUdJVFxuICBtaW51dGUgICAgICAgPSAyRElHSVRcbiAgc2Vjb25kICAgICAgID0gMkRJR0lUXG4gKi9cbmZ1bmN0aW9uIHRvSU1GRGF0ZSAoZGF0ZSkge1xuICBpZiAodHlwZW9mIGRhdGUgPT09ICdudW1iZXInKSB7XG4gICAgZGF0ZSA9IG5ldyBEYXRlKGRhdGUpXG4gIH1cblxuICBjb25zdCBkYXlzID0gW1xuICAgICdTdW4nLCAnTW9uJywgJ1R1ZScsICdXZWQnLFxuICAgICdUaHUnLCAnRnJpJywgJ1NhdCdcbiAgXVxuXG4gIGNvbnN0IG1vbnRocyA9IFtcbiAgICAnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLFxuICAgICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYydcbiAgXVxuXG4gIGNvbnN0IGRheU5hbWUgPSBkYXlzW2RhdGUuZ2V0VVRDRGF5KCldXG4gIGNvbnN0IGRheSA9IGRhdGUuZ2V0VVRDRGF0ZSgpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKVxuICBjb25zdCBtb250aCA9IG1vbnRoc1tkYXRlLmdldFVUQ01vbnRoKCldXG4gIGNvbnN0IHllYXIgPSBkYXRlLmdldFVUQ0Z1bGxZZWFyKClcbiAgY29uc3QgaG91ciA9IGRhdGUuZ2V0VVRDSG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJylcbiAgY29uc3QgbWludXRlID0gZGF0ZS5nZXRVVENNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpXG4gIGNvbnN0IHNlY29uZCA9IGRhdGUuZ2V0VVRDU2Vjb25kcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKVxuXG4gIHJldHVybiBgJHtkYXlOYW1lfSwgJHtkYXl9ICR7bW9udGh9ICR7eWVhcn0gJHtob3VyfToke21pbnV0ZX06JHtzZWNvbmR9IEdNVGBcbn1cblxuLyoqXG4gbWF4LWFnZS1hdiAgICAgICAgPSBcIk1heC1BZ2U9XCIgbm9uLXplcm8tZGlnaXQgKkRJR0lUXG4gICAgICAgICAgICAgICAgICAgICAgIDsgSW4gcHJhY3RpY2UsIGJvdGggZXhwaXJlcy1hdiBhbmQgbWF4LWFnZS1hdlxuICAgICAgICAgICAgICAgICAgICAgICA7IGFyZSBsaW1pdGVkIHRvIGRhdGVzIHJlcHJlc2VudGFibGUgYnkgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgIDsgdXNlciBhZ2VudC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXhBZ2VcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVDb29raWVNYXhBZ2UgKG1heEFnZSkge1xuICBpZiAobWF4QWdlIDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb29raWUgbWF4LWFnZScpXG4gIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM2MjY1I3NlY3Rpb24tNC4xLjFcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2luZGV4JykuQ29va2llfSBjb29raWVcbiAqL1xuZnVuY3Rpb24gc3RyaW5naWZ5IChjb29raWUpIHtcbiAgaWYgKGNvb2tpZS5uYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICB2YWxpZGF0ZUNvb2tpZU5hbWUoY29va2llLm5hbWUpXG4gIHZhbGlkYXRlQ29va2llVmFsdWUoY29va2llLnZhbHVlKVxuXG4gIGNvbnN0IG91dCA9IFtgJHtjb29raWUubmFtZX09JHtjb29raWUudmFsdWV9YF1cblxuICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1jb29raWUtcHJlZml4ZXMtMDAjc2VjdGlvbi0zLjFcbiAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9kcmFmdC1pZXRmLWh0dHBiaXMtY29va2llLXByZWZpeGVzLTAwI3NlY3Rpb24tMy4yXG4gIGlmIChjb29raWUubmFtZS5zdGFydHNXaXRoKCdfX1NlY3VyZS0nKSkge1xuICAgIGNvb2tpZS5zZWN1cmUgPSB0cnVlXG4gIH1cblxuICBpZiAoY29va2llLm5hbWUuc3RhcnRzV2l0aCgnX19Ib3N0LScpKSB7XG4gICAgY29va2llLnNlY3VyZSA9IHRydWVcbiAgICBjb29raWUuZG9tYWluID0gbnVsbFxuICAgIGNvb2tpZS5wYXRoID0gJy8nXG4gIH1cblxuICBpZiAoY29va2llLnNlY3VyZSkge1xuICAgIG91dC5wdXNoKCdTZWN1cmUnKVxuICB9XG5cbiAgaWYgKGNvb2tpZS5odHRwT25seSkge1xuICAgIG91dC5wdXNoKCdIdHRwT25seScpXG4gIH1cblxuICBpZiAodHlwZW9mIGNvb2tpZS5tYXhBZ2UgPT09ICdudW1iZXInKSB7XG4gICAgdmFsaWRhdGVDb29raWVNYXhBZ2UoY29va2llLm1heEFnZSlcbiAgICBvdXQucHVzaChgTWF4LUFnZT0ke2Nvb2tpZS5tYXhBZ2V9YClcbiAgfVxuXG4gIGlmIChjb29raWUuZG9tYWluKSB7XG4gICAgdmFsaWRhdGVDb29raWVEb21haW4oY29va2llLmRvbWFpbilcbiAgICBvdXQucHVzaChgRG9tYWluPSR7Y29va2llLmRvbWFpbn1gKVxuICB9XG5cbiAgaWYgKGNvb2tpZS5wYXRoKSB7XG4gICAgdmFsaWRhdGVDb29raWVQYXRoKGNvb2tpZS5wYXRoKVxuICAgIG91dC5wdXNoKGBQYXRoPSR7Y29va2llLnBhdGh9YClcbiAgfVxuXG4gIGlmIChjb29raWUuZXhwaXJlcyAmJiBjb29raWUuZXhwaXJlcy50b1N0cmluZygpICE9PSAnSW52YWxpZCBEYXRlJykge1xuICAgIG91dC5wdXNoKGBFeHBpcmVzPSR7dG9JTUZEYXRlKGNvb2tpZS5leHBpcmVzKX1gKVxuICB9XG5cbiAgaWYgKGNvb2tpZS5zYW1lU2l0ZSkge1xuICAgIG91dC5wdXNoKGBTYW1lU2l0ZT0ke2Nvb2tpZS5zYW1lU2l0ZX1gKVxuICB9XG5cbiAgZm9yIChjb25zdCBwYXJ0IG9mIGNvb2tpZS51bnBhcnNlZCkge1xuICAgIGlmICghcGFydC5pbmNsdWRlcygnPScpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdW5wYXJzZWQnKVxuICAgIH1cblxuICAgIGNvbnN0IFtrZXksIC4uLnZhbHVlXSA9IHBhcnQuc3BsaXQoJz0nKVxuXG4gICAgb3V0LnB1c2goYCR7a2V5LnRyaW0oKX09JHt2YWx1ZS5qb2luKCc9Jyl9YClcbiAgfVxuXG4gIHJldHVybiBvdXQuam9pbignOyAnKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNDVExFeGNsdWRpbmdIdGFiLFxuICB2YWxpZGF0ZUNvb2tpZU5hbWUsXG4gIHZhbGlkYXRlQ29va2llUGF0aCxcbiAgdmFsaWRhdGVDb29raWVWYWx1ZSxcbiAgdG9JTUZEYXRlLFxuICBzdHJpbmdpZnlcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IG1heE5hbWVWYWx1ZVBhaXJTaXplLCBtYXhBdHRyaWJ1dGVWYWx1ZVNpemUgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IHsgaXNDVExFeGNsdWRpbmdIdGFiIH0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3QgeyBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzRmFzdCB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvZGF0YVVSTCcpXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgdGhlIGZpZWxkLXZhbHVlIGF0dHJpYnV0ZXMgb2YgYSBzZXQtY29va2llIGhlYWRlciBzdHJpbmcuXG4gKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtaWV0Zi1odHRwYmlzLXJmYzYyNjViaXMjc2VjdGlvbi01LjRcbiAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAqIEByZXR1cm5zIGlmIHRoZSBoZWFkZXIgaXMgaW52YWxpZCwgbnVsbCB3aWxsIGJlIHJldHVybmVkXG4gKi9cbmZ1bmN0aW9uIHBhcnNlU2V0Q29va2llIChoZWFkZXIpIHtcbiAgLy8gMS4gSWYgdGhlIHNldC1jb29raWUtc3RyaW5nIGNvbnRhaW5zIGEgJXgwMC0wOCAvICV4MEEtMUYgLyAleDdGXG4gIC8vICAgIGNoYXJhY3RlciAoQ1RMIGNoYXJhY3RlcnMgZXhjbHVkaW5nIEhUQUIpOiBBYm9ydCB0aGVzZSBzdGVwcyBhbmRcbiAgLy8gICAgaWdub3JlIHRoZSBzZXQtY29va2llLXN0cmluZyBlbnRpcmVseS5cbiAgaWYgKGlzQ1RMRXhjbHVkaW5nSHRhYihoZWFkZXIpKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGxldCBuYW1lVmFsdWVQYWlyID0gJydcbiAgbGV0IHVucGFyc2VkQXR0cmlidXRlcyA9ICcnXG4gIGxldCBuYW1lID0gJydcbiAgbGV0IHZhbHVlID0gJydcblxuICAvLyAyLiBJZiB0aGUgc2V0LWNvb2tpZS1zdHJpbmcgY29udGFpbnMgYSAleDNCIChcIjtcIikgY2hhcmFjdGVyOlxuICBpZiAoaGVhZGVyLmluY2x1ZGVzKCc7JykpIHtcbiAgICAvLyAxLiBUaGUgbmFtZS12YWx1ZS1wYWlyIHN0cmluZyBjb25zaXN0cyBvZiB0aGUgY2hhcmFjdGVycyB1cCB0byxcbiAgICAvLyAgICBidXQgbm90IGluY2x1ZGluZywgdGhlIGZpcnN0ICV4M0IgKFwiO1wiKSwgYW5kIHRoZSB1bnBhcnNlZC1cbiAgICAvLyAgICBhdHRyaWJ1dGVzIGNvbnNpc3Qgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgc2V0LWNvb2tpZS1zdHJpbmdcbiAgICAvLyAgICAoaW5jbHVkaW5nIHRoZSAleDNCIChcIjtcIikgaW4gcXVlc3Rpb24pLlxuICAgIGNvbnN0IHBvc2l0aW9uID0geyBwb3NpdGlvbjogMCB9XG5cbiAgICBuYW1lVmFsdWVQYWlyID0gY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50c0Zhc3QoJzsnLCBoZWFkZXIsIHBvc2l0aW9uKVxuICAgIHVucGFyc2VkQXR0cmlidXRlcyA9IGhlYWRlci5zbGljZShwb3NpdGlvbi5wb3NpdGlvbilcbiAgfSBlbHNlIHtcbiAgICAvLyBPdGhlcndpc2U6XG5cbiAgICAvLyAxLiBUaGUgbmFtZS12YWx1ZS1wYWlyIHN0cmluZyBjb25zaXN0cyBvZiBhbGwgdGhlIGNoYXJhY3RlcnNcbiAgICAvLyAgICBjb250YWluZWQgaW4gdGhlIHNldC1jb29raWUtc3RyaW5nLCBhbmQgdGhlIHVucGFyc2VkLVxuICAgIC8vICAgIGF0dHJpYnV0ZXMgaXMgdGhlIGVtcHR5IHN0cmluZy5cbiAgICBuYW1lVmFsdWVQYWlyID0gaGVhZGVyXG4gIH1cblxuICAvLyAzLiBJZiB0aGUgbmFtZS12YWx1ZS1wYWlyIHN0cmluZyBsYWNrcyBhICV4M0QgKFwiPVwiKSBjaGFyYWN0ZXIsIHRoZW5cbiAgLy8gICAgdGhlIG5hbWUgc3RyaW5nIGlzIGVtcHR5LCBhbmQgdGhlIHZhbHVlIHN0cmluZyBpcyB0aGUgdmFsdWUgb2ZcbiAgLy8gICAgbmFtZS12YWx1ZS1wYWlyLlxuICBpZiAoIW5hbWVWYWx1ZVBhaXIuaW5jbHVkZXMoJz0nKSkge1xuICAgIHZhbHVlID0gbmFtZVZhbHVlUGFpclxuICB9IGVsc2Uge1xuICAgIC8vICAgIE90aGVyd2lzZSwgdGhlIG5hbWUgc3RyaW5nIGNvbnNpc3RzIG9mIHRoZSBjaGFyYWN0ZXJzIHVwIHRvLCBidXRcbiAgICAvLyAgICBub3QgaW5jbHVkaW5nLCB0aGUgZmlyc3QgJXgzRCAoXCI9XCIpIGNoYXJhY3RlciwgYW5kIHRoZSAocG9zc2libHlcbiAgICAvLyAgICBlbXB0eSkgdmFsdWUgc3RyaW5nIGNvbnNpc3RzIG9mIHRoZSBjaGFyYWN0ZXJzIGFmdGVyIHRoZSBmaXJzdFxuICAgIC8vICAgICV4M0QgKFwiPVwiKSBjaGFyYWN0ZXIuXG4gICAgY29uc3QgcG9zaXRpb24gPSB7IHBvc2l0aW9uOiAwIH1cbiAgICBuYW1lID0gY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50c0Zhc3QoXG4gICAgICAnPScsXG4gICAgICBuYW1lVmFsdWVQYWlyLFxuICAgICAgcG9zaXRpb25cbiAgICApXG4gICAgdmFsdWUgPSBuYW1lVmFsdWVQYWlyLnNsaWNlKHBvc2l0aW9uLnBvc2l0aW9uICsgMSlcbiAgfVxuXG4gIC8vIDQuIFJlbW92ZSBhbnkgbGVhZGluZyBvciB0cmFpbGluZyBXU1AgY2hhcmFjdGVycyBmcm9tIHRoZSBuYW1lXG4gIC8vICAgIHN0cmluZyBhbmQgdGhlIHZhbHVlIHN0cmluZy5cbiAgbmFtZSA9IG5hbWUudHJpbSgpXG4gIHZhbHVlID0gdmFsdWUudHJpbSgpXG5cbiAgLy8gNS4gSWYgdGhlIHN1bSBvZiB0aGUgbGVuZ3RocyBvZiB0aGUgbmFtZSBzdHJpbmcgYW5kIHRoZSB2YWx1ZSBzdHJpbmdcbiAgLy8gICAgaXMgbW9yZSB0aGFuIDQwOTYgb2N0ZXRzLCBhYm9ydCB0aGVzZSBzdGVwcyBhbmQgaWdub3JlIHRoZSBzZXQtXG4gIC8vICAgIGNvb2tpZS1zdHJpbmcgZW50aXJlbHkuXG4gIGlmIChuYW1lLmxlbmd0aCArIHZhbHVlLmxlbmd0aCA+IG1heE5hbWVWYWx1ZVBhaXJTaXplKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8vIDYuIFRoZSBjb29raWUtbmFtZSBpcyB0aGUgbmFtZSBzdHJpbmcsIGFuZCB0aGUgY29va2llLXZhbHVlIGlzIHRoZVxuICAvLyAgICB2YWx1ZSBzdHJpbmcuXG4gIHJldHVybiB7XG4gICAgbmFtZSwgdmFsdWUsIC4uLnBhcnNlVW5wYXJzZWRBdHRyaWJ1dGVzKHVucGFyc2VkQXR0cmlidXRlcylcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgcmVtYWluaW5nIGF0dHJpYnV0ZXMgb2YgYSBzZXQtY29va2llIGhlYWRlclxuICogQHNlZSBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1yZmM2MjY1YmlzI3NlY3Rpb24tNS40XG4gKiBAcGFyYW0ge3N0cmluZ30gdW5wYXJzZWRBdHRyaWJ1dGVzXG4gKiBAcGFyYW0ge1tPYmplY3QuPHN0cmluZywgdW5rbm93bj5dPXt9fSBjb29raWVBdHRyaWJ1dGVMaXN0XG4gKi9cbmZ1bmN0aW9uIHBhcnNlVW5wYXJzZWRBdHRyaWJ1dGVzICh1bnBhcnNlZEF0dHJpYnV0ZXMsIGNvb2tpZUF0dHJpYnV0ZUxpc3QgPSB7fSkge1xuICAvLyAxLiBJZiB0aGUgdW5wYXJzZWQtYXR0cmlidXRlcyBzdHJpbmcgaXMgZW1wdHksIHNraXAgdGhlIHJlc3Qgb2ZcbiAgLy8gICAgdGhlc2Ugc3RlcHMuXG4gIGlmICh1bnBhcnNlZEF0dHJpYnV0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGNvb2tpZUF0dHJpYnV0ZUxpc3RcbiAgfVxuXG4gIC8vIDIuIERpc2NhcmQgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgdW5wYXJzZWQtYXR0cmlidXRlcyAod2hpY2hcbiAgLy8gICAgd2lsbCBiZSBhICV4M0IgKFwiO1wiKSBjaGFyYWN0ZXIpLlxuICBhc3NlcnQodW5wYXJzZWRBdHRyaWJ1dGVzWzBdID09PSAnOycpXG4gIHVucGFyc2VkQXR0cmlidXRlcyA9IHVucGFyc2VkQXR0cmlidXRlcy5zbGljZSgxKVxuXG4gIGxldCBjb29raWVBdiA9ICcnXG5cbiAgLy8gMy4gSWYgdGhlIHJlbWFpbmluZyB1bnBhcnNlZC1hdHRyaWJ1dGVzIGNvbnRhaW5zIGEgJXgzQiAoXCI7XCIpXG4gIC8vICAgIGNoYXJhY3RlcjpcbiAgaWYgKHVucGFyc2VkQXR0cmlidXRlcy5pbmNsdWRlcygnOycpKSB7XG4gICAgLy8gMS4gQ29uc3VtZSB0aGUgY2hhcmFjdGVycyBvZiB0aGUgdW5wYXJzZWQtYXR0cmlidXRlcyB1cCB0bywgYnV0XG4gICAgLy8gICAgbm90IGluY2x1ZGluZywgdGhlIGZpcnN0ICV4M0IgKFwiO1wiKSBjaGFyYWN0ZXIuXG4gICAgY29va2llQXYgPSBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzRmFzdChcbiAgICAgICc7JyxcbiAgICAgIHVucGFyc2VkQXR0cmlidXRlcyxcbiAgICAgIHsgcG9zaXRpb246IDAgfVxuICAgIClcbiAgICB1bnBhcnNlZEF0dHJpYnV0ZXMgPSB1bnBhcnNlZEF0dHJpYnV0ZXMuc2xpY2UoY29va2llQXYubGVuZ3RoKVxuICB9IGVsc2Uge1xuICAgIC8vIE90aGVyd2lzZTpcblxuICAgIC8vIDEuIENvbnN1bWUgdGhlIHJlbWFpbmRlciBvZiB0aGUgdW5wYXJzZWQtYXR0cmlidXRlcy5cbiAgICBjb29raWVBdiA9IHVucGFyc2VkQXR0cmlidXRlc1xuICAgIHVucGFyc2VkQXR0cmlidXRlcyA9ICcnXG4gIH1cblxuICAvLyBMZXQgdGhlIGNvb2tpZS1hdiBzdHJpbmcgYmUgdGhlIGNoYXJhY3RlcnMgY29uc3VtZWQgaW4gdGhpcyBzdGVwLlxuXG4gIGxldCBhdHRyaWJ1dGVOYW1lID0gJydcbiAgbGV0IGF0dHJpYnV0ZVZhbHVlID0gJydcblxuICAvLyA0LiBJZiB0aGUgY29va2llLWF2IHN0cmluZyBjb250YWlucyBhICV4M0QgKFwiPVwiKSBjaGFyYWN0ZXI6XG4gIGlmIChjb29raWVBdi5pbmNsdWRlcygnPScpKSB7XG4gICAgLy8gMS4gVGhlIChwb3NzaWJseSBlbXB0eSkgYXR0cmlidXRlLW5hbWUgc3RyaW5nIGNvbnNpc3RzIG9mIHRoZVxuICAgIC8vICAgIGNoYXJhY3RlcnMgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCB0aGUgZmlyc3QgJXgzRCAoXCI9XCIpXG4gICAgLy8gICAgY2hhcmFjdGVyLCBhbmQgdGhlIChwb3NzaWJseSBlbXB0eSkgYXR0cmlidXRlLXZhbHVlIHN0cmluZ1xuICAgIC8vICAgIGNvbnNpc3RzIG9mIHRoZSBjaGFyYWN0ZXJzIGFmdGVyIHRoZSBmaXJzdCAleDNEIChcIj1cIilcbiAgICAvLyAgICBjaGFyYWN0ZXIuXG4gICAgY29uc3QgcG9zaXRpb24gPSB7IHBvc2l0aW9uOiAwIH1cblxuICAgIGF0dHJpYnV0ZU5hbWUgPSBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzRmFzdChcbiAgICAgICc9JyxcbiAgICAgIGNvb2tpZUF2LFxuICAgICAgcG9zaXRpb25cbiAgICApXG4gICAgYXR0cmlidXRlVmFsdWUgPSBjb29raWVBdi5zbGljZShwb3NpdGlvbi5wb3NpdGlvbiArIDEpXG4gIH0gZWxzZSB7XG4gICAgLy8gT3RoZXJ3aXNlOlxuXG4gICAgLy8gMS4gVGhlIGF0dHJpYnV0ZS1uYW1lIHN0cmluZyBjb25zaXN0cyBvZiB0aGUgZW50aXJlIGNvb2tpZS1hdlxuICAgIC8vICAgIHN0cmluZywgYW5kIHRoZSBhdHRyaWJ1dGUtdmFsdWUgc3RyaW5nIGlzIGVtcHR5LlxuICAgIGF0dHJpYnV0ZU5hbWUgPSBjb29raWVBdlxuICB9XG5cbiAgLy8gNS4gUmVtb3ZlIGFueSBsZWFkaW5nIG9yIHRyYWlsaW5nIFdTUCBjaGFyYWN0ZXJzIGZyb20gdGhlIGF0dHJpYnV0ZS1cbiAgLy8gICAgbmFtZSBzdHJpbmcgYW5kIHRoZSBhdHRyaWJ1dGUtdmFsdWUgc3RyaW5nLlxuICBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZS50cmltKClcbiAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVWYWx1ZS50cmltKClcblxuICAvLyA2LiBJZiB0aGUgYXR0cmlidXRlLXZhbHVlIGlzIGxvbmdlciB0aGFuIDEwMjQgb2N0ZXRzLCBpZ25vcmUgdGhlXG4gIC8vICAgIGNvb2tpZS1hdiBzdHJpbmcgYW5kIHJldHVybiB0byBTdGVwIDEgb2YgdGhpcyBhbGdvcml0aG0uXG4gIGlmIChhdHRyaWJ1dGVWYWx1ZS5sZW5ndGggPiBtYXhBdHRyaWJ1dGVWYWx1ZVNpemUpIHtcbiAgICByZXR1cm4gcGFyc2VVbnBhcnNlZEF0dHJpYnV0ZXModW5wYXJzZWRBdHRyaWJ1dGVzLCBjb29raWVBdHRyaWJ1dGVMaXN0KVxuICB9XG5cbiAgLy8gNy4gUHJvY2VzcyB0aGUgYXR0cmlidXRlLW5hbWUgYW5kIGF0dHJpYnV0ZS12YWx1ZSBhY2NvcmRpbmcgdG8gdGhlXG4gIC8vICAgIHJlcXVpcmVtZW50cyBpbiB0aGUgZm9sbG93aW5nIHN1YnNlY3Rpb25zLiAgKE5vdGljZSB0aGF0XG4gIC8vICAgIGF0dHJpYnV0ZXMgd2l0aCB1bnJlY29nbml6ZWQgYXR0cmlidXRlLW5hbWVzIGFyZSBpZ25vcmVkLilcbiAgY29uc3QgYXR0cmlidXRlTmFtZUxvd2VyY2FzZSA9IGF0dHJpYnV0ZU5hbWUudG9Mb3dlckNhc2UoKVxuXG4gIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtaWV0Zi1odHRwYmlzLXJmYzYyNjViaXMjc2VjdGlvbi01LjQuMVxuICAvLyBJZiB0aGUgYXR0cmlidXRlLW5hbWUgY2FzZS1pbnNlbnNpdGl2ZWx5IG1hdGNoZXMgdGhlIHN0cmluZ1xuICAvLyBcIkV4cGlyZXNcIiwgdGhlIHVzZXIgYWdlbnQgTVVTVCBwcm9jZXNzIHRoZSBjb29raWUtYXYgYXMgZm9sbG93cy5cbiAgaWYgKGF0dHJpYnV0ZU5hbWVMb3dlcmNhc2UgPT09ICdleHBpcmVzJykge1xuICAgIC8vIDEuIExldCB0aGUgZXhwaXJ5LXRpbWUgYmUgdGhlIHJlc3VsdCBvZiBwYXJzaW5nIHRoZSBhdHRyaWJ1dGUtdmFsdWVcbiAgICAvLyAgICBhcyBjb29raWUtZGF0ZSAoc2VlIFNlY3Rpb24gNS4xLjEpLlxuICAgIGNvbnN0IGV4cGlyeVRpbWUgPSBuZXcgRGF0ZShhdHRyaWJ1dGVWYWx1ZSlcblxuICAgIC8vIDIuIElmIHRoZSBhdHRyaWJ1dGUtdmFsdWUgZmFpbGVkIHRvIHBhcnNlIGFzIGEgY29va2llIGRhdGUsIGlnbm9yZVxuICAgIC8vICAgIHRoZSBjb29raWUtYXYuXG5cbiAgICBjb29raWVBdHRyaWJ1dGVMaXN0LmV4cGlyZXMgPSBleHBpcnlUaW1lXG4gIH0gZWxzZSBpZiAoYXR0cmlidXRlTmFtZUxvd2VyY2FzZSA9PT0gJ21heC1hZ2UnKSB7XG4gICAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9kcmFmdC1pZXRmLWh0dHBiaXMtcmZjNjI2NWJpcyNzZWN0aW9uLTUuNC4yXG4gICAgLy8gSWYgdGhlIGF0dHJpYnV0ZS1uYW1lIGNhc2UtaW5zZW5zaXRpdmVseSBtYXRjaGVzIHRoZSBzdHJpbmcgXCJNYXgtXG4gICAgLy8gQWdlXCIsIHRoZSB1c2VyIGFnZW50IE1VU1QgcHJvY2VzcyB0aGUgY29va2llLWF2IGFzIGZvbGxvd3MuXG5cbiAgICAvLyAxLiBJZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBhdHRyaWJ1dGUtdmFsdWUgaXMgbm90IGEgRElHSVQgb3IgYVxuICAgIC8vICAgIFwiLVwiIGNoYXJhY3RlciwgaWdub3JlIHRoZSBjb29raWUtYXYuXG4gICAgY29uc3QgY2hhckNvZGUgPSBhdHRyaWJ1dGVWYWx1ZS5jaGFyQ29kZUF0KDApXG5cbiAgICBpZiAoKGNoYXJDb2RlIDwgNDggfHwgY2hhckNvZGUgPiA1NykgJiYgYXR0cmlidXRlVmFsdWVbMF0gIT09ICctJykge1xuICAgICAgcmV0dXJuIHBhcnNlVW5wYXJzZWRBdHRyaWJ1dGVzKHVucGFyc2VkQXR0cmlidXRlcywgY29va2llQXR0cmlidXRlTGlzdClcbiAgICB9XG5cbiAgICAvLyAyLiBJZiB0aGUgcmVtYWluZGVyIG9mIGF0dHJpYnV0ZS12YWx1ZSBjb250YWlucyBhIG5vbi1ESUdJVFxuICAgIC8vICAgIGNoYXJhY3RlciwgaWdub3JlIHRoZSBjb29raWUtYXYuXG4gICAgaWYgKCEvXlxcZCskLy50ZXN0KGF0dHJpYnV0ZVZhbHVlKSkge1xuICAgICAgcmV0dXJuIHBhcnNlVW5wYXJzZWRBdHRyaWJ1dGVzKHVucGFyc2VkQXR0cmlidXRlcywgY29va2llQXR0cmlidXRlTGlzdClcbiAgICB9XG5cbiAgICAvLyAzLiBMZXQgZGVsdGEtc2Vjb25kcyBiZSB0aGUgYXR0cmlidXRlLXZhbHVlIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyLlxuICAgIGNvbnN0IGRlbHRhU2Vjb25kcyA9IE51bWJlcihhdHRyaWJ1dGVWYWx1ZSlcblxuICAgIC8vIDQuIExldCBjb29raWUtYWdlLWxpbWl0IGJlIHRoZSBtYXhpbXVtIGFnZSBvZiB0aGUgY29va2llICh3aGljaFxuICAgIC8vICAgIFNIT1VMRCBiZSA0MDAgZGF5cyBvciBsZXNzLCBzZWUgU2VjdGlvbiA0LjEuMi4yKS5cblxuICAgIC8vIDUuIFNldCBkZWx0YS1zZWNvbmRzIHRvIHRoZSBzbWFsbGVyIG9mIGl0cyBwcmVzZW50IHZhbHVlIGFuZCBjb29raWUtXG4gICAgLy8gICAgYWdlLWxpbWl0LlxuICAgIC8vIGRlbHRhU2Vjb25kcyA9IE1hdGgubWluKGRlbHRhU2Vjb25kcyAqIDEwMDAsIG1heEV4cGlyZXNNcylcblxuICAgIC8vIDYuIElmIGRlbHRhLXNlY29uZHMgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8gKDApLCBsZXQgZXhwaXJ5LVxuICAgIC8vICAgIHRpbWUgYmUgdGhlIGVhcmxpZXN0IHJlcHJlc2VudGFibGUgZGF0ZSBhbmQgdGltZS4gIE90aGVyd2lzZSwgbGV0XG4gICAgLy8gICAgdGhlIGV4cGlyeS10aW1lIGJlIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUgcGx1cyBkZWx0YS1zZWNvbmRzXG4gICAgLy8gICAgc2Vjb25kcy5cbiAgICAvLyBjb25zdCBleHBpcnlUaW1lID0gZGVsdGFTZWNvbmRzIDw9IDAgPyBEYXRlLm5vdygpIDogRGF0ZS5ub3coKSArIGRlbHRhU2Vjb25kc1xuXG4gICAgLy8gNy4gQXBwZW5kIGFuIGF0dHJpYnV0ZSB0byB0aGUgY29va2llLWF0dHJpYnV0ZS1saXN0IHdpdGggYW5cbiAgICAvLyAgICBhdHRyaWJ1dGUtbmFtZSBvZiBNYXgtQWdlIGFuZCBhbiBhdHRyaWJ1dGUtdmFsdWUgb2YgZXhwaXJ5LXRpbWUuXG4gICAgY29va2llQXR0cmlidXRlTGlzdC5tYXhBZ2UgPSBkZWx0YVNlY29uZHNcbiAgfSBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lTG93ZXJjYXNlID09PSAnZG9tYWluJykge1xuICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtaWV0Zi1odHRwYmlzLXJmYzYyNjViaXMjc2VjdGlvbi01LjQuM1xuICAgIC8vIElmIHRoZSBhdHRyaWJ1dGUtbmFtZSBjYXNlLWluc2Vuc2l0aXZlbHkgbWF0Y2hlcyB0aGUgc3RyaW5nIFwiRG9tYWluXCIsXG4gICAgLy8gdGhlIHVzZXIgYWdlbnQgTVVTVCBwcm9jZXNzIHRoZSBjb29raWUtYXYgYXMgZm9sbG93cy5cblxuICAgIC8vIDEuIExldCBjb29raWUtZG9tYWluIGJlIHRoZSBhdHRyaWJ1dGUtdmFsdWUuXG4gICAgbGV0IGNvb2tpZURvbWFpbiA9IGF0dHJpYnV0ZVZhbHVlXG5cbiAgICAvLyAyLiBJZiBjb29raWUtZG9tYWluIHN0YXJ0cyB3aXRoICV4MkUgKFwiLlwiKSwgbGV0IGNvb2tpZS1kb21haW4gYmVcbiAgICAvLyAgICBjb29raWUtZG9tYWluIHdpdGhvdXQgaXRzIGxlYWRpbmcgJXgyRSAoXCIuXCIpLlxuICAgIGlmIChjb29raWVEb21haW5bMF0gPT09ICcuJykge1xuICAgICAgY29va2llRG9tYWluID0gY29va2llRG9tYWluLnNsaWNlKDEpXG4gICAgfVxuXG4gICAgLy8gMy4gQ29udmVydCB0aGUgY29va2llLWRvbWFpbiB0byBsb3dlciBjYXNlLlxuICAgIGNvb2tpZURvbWFpbiA9IGNvb2tpZURvbWFpbi50b0xvd2VyQ2FzZSgpXG5cbiAgICAvLyA0LiBBcHBlbmQgYW4gYXR0cmlidXRlIHRvIHRoZSBjb29raWUtYXR0cmlidXRlLWxpc3Qgd2l0aCBhblxuICAgIC8vICAgIGF0dHJpYnV0ZS1uYW1lIG9mIERvbWFpbiBhbmQgYW4gYXR0cmlidXRlLXZhbHVlIG9mIGNvb2tpZS1kb21haW4uXG4gICAgY29va2llQXR0cmlidXRlTGlzdC5kb21haW4gPSBjb29raWVEb21haW5cbiAgfSBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lTG93ZXJjYXNlID09PSAncGF0aCcpIHtcbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1yZmM2MjY1YmlzI3NlY3Rpb24tNS40LjRcbiAgICAvLyBJZiB0aGUgYXR0cmlidXRlLW5hbWUgY2FzZS1pbnNlbnNpdGl2ZWx5IG1hdGNoZXMgdGhlIHN0cmluZyBcIlBhdGhcIixcbiAgICAvLyB0aGUgdXNlciBhZ2VudCBNVVNUIHByb2Nlc3MgdGhlIGNvb2tpZS1hdiBhcyBmb2xsb3dzLlxuXG4gICAgLy8gMS4gSWYgdGhlIGF0dHJpYnV0ZS12YWx1ZSBpcyBlbXB0eSBvciBpZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZVxuICAgIC8vICAgIGF0dHJpYnV0ZS12YWx1ZSBpcyBub3QgJXgyRiAoXCIvXCIpOlxuICAgIGxldCBjb29raWVQYXRoID0gJydcbiAgICBpZiAoYXR0cmlidXRlVmFsdWUubGVuZ3RoID09PSAwIHx8IGF0dHJpYnV0ZVZhbHVlWzBdICE9PSAnLycpIHtcbiAgICAgIC8vIDEuIExldCBjb29raWUtcGF0aCBiZSB0aGUgZGVmYXVsdC1wYXRoLlxuICAgICAgY29va2llUGF0aCA9ICcvJ1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPdGhlcndpc2U6XG5cbiAgICAgIC8vIDEuIExldCBjb29raWUtcGF0aCBiZSB0aGUgYXR0cmlidXRlLXZhbHVlLlxuICAgICAgY29va2llUGF0aCA9IGF0dHJpYnV0ZVZhbHVlXG4gICAgfVxuXG4gICAgLy8gMi4gQXBwZW5kIGFuIGF0dHJpYnV0ZSB0byB0aGUgY29va2llLWF0dHJpYnV0ZS1saXN0IHdpdGggYW5cbiAgICAvLyAgICBhdHRyaWJ1dGUtbmFtZSBvZiBQYXRoIGFuZCBhbiBhdHRyaWJ1dGUtdmFsdWUgb2YgY29va2llLXBhdGguXG4gICAgY29va2llQXR0cmlidXRlTGlzdC5wYXRoID0gY29va2llUGF0aFxuICB9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWVMb3dlcmNhc2UgPT09ICdzZWN1cmUnKSB7XG4gICAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9kcmFmdC1pZXRmLWh0dHBiaXMtcmZjNjI2NWJpcyNzZWN0aW9uLTUuNC41XG4gICAgLy8gSWYgdGhlIGF0dHJpYnV0ZS1uYW1lIGNhc2UtaW5zZW5zaXRpdmVseSBtYXRjaGVzIHRoZSBzdHJpbmcgXCJTZWN1cmVcIixcbiAgICAvLyB0aGUgdXNlciBhZ2VudCBNVVNUIGFwcGVuZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIGNvb2tpZS1hdHRyaWJ1dGUtbGlzdFxuICAgIC8vIHdpdGggYW4gYXR0cmlidXRlLW5hbWUgb2YgU2VjdXJlIGFuZCBhbiBlbXB0eSBhdHRyaWJ1dGUtdmFsdWUuXG5cbiAgICBjb29raWVBdHRyaWJ1dGVMaXN0LnNlY3VyZSA9IHRydWVcbiAgfSBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lTG93ZXJjYXNlID09PSAnaHR0cG9ubHknKSB7XG4gICAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9kcmFmdC1pZXRmLWh0dHBiaXMtcmZjNjI2NWJpcyNzZWN0aW9uLTUuNC42XG4gICAgLy8gSWYgdGhlIGF0dHJpYnV0ZS1uYW1lIGNhc2UtaW5zZW5zaXRpdmVseSBtYXRjaGVzIHRoZSBzdHJpbmdcbiAgICAvLyBcIkh0dHBPbmx5XCIsIHRoZSB1c2VyIGFnZW50IE1VU1QgYXBwZW5kIGFuIGF0dHJpYnV0ZSB0byB0aGUgY29va2llLVxuICAgIC8vIGF0dHJpYnV0ZS1saXN0IHdpdGggYW4gYXR0cmlidXRlLW5hbWUgb2YgSHR0cE9ubHkgYW5kIGFuIGVtcHR5XG4gICAgLy8gYXR0cmlidXRlLXZhbHVlLlxuXG4gICAgY29va2llQXR0cmlidXRlTGlzdC5odHRwT25seSA9IHRydWVcbiAgfSBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lTG93ZXJjYXNlID09PSAnc2FtZXNpdGUnKSB7XG4gICAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9kcmFmdC1pZXRmLWh0dHBiaXMtcmZjNjI2NWJpcyNzZWN0aW9uLTUuNC43XG4gICAgLy8gSWYgdGhlIGF0dHJpYnV0ZS1uYW1lIGNhc2UtaW5zZW5zaXRpdmVseSBtYXRjaGVzIHRoZSBzdHJpbmdcbiAgICAvLyBcIlNhbWVTaXRlXCIsIHRoZSB1c2VyIGFnZW50IE1VU1QgcHJvY2VzcyB0aGUgY29va2llLWF2IGFzIGZvbGxvd3M6XG5cbiAgICAvLyAxLiBMZXQgZW5mb3JjZW1lbnQgYmUgXCJEZWZhdWx0XCIuXG4gICAgbGV0IGVuZm9yY2VtZW50ID0gJ0RlZmF1bHQnXG5cbiAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZUxvd2VyY2FzZSA9IGF0dHJpYnV0ZVZhbHVlLnRvTG93ZXJDYXNlKClcbiAgICAvLyAyLiBJZiBjb29raWUtYXYncyBhdHRyaWJ1dGUtdmFsdWUgaXMgYSBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoIGZvclxuICAgIC8vICAgIFwiTm9uZVwiLCBzZXQgZW5mb3JjZW1lbnQgdG8gXCJOb25lXCIuXG4gICAgaWYgKGF0dHJpYnV0ZVZhbHVlTG93ZXJjYXNlLmluY2x1ZGVzKCdub25lJykpIHtcbiAgICAgIGVuZm9yY2VtZW50ID0gJ05vbmUnXG4gICAgfVxuXG4gICAgLy8gMy4gSWYgY29va2llLWF2J3MgYXR0cmlidXRlLXZhbHVlIGlzIGEgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBmb3JcbiAgICAvLyAgICBcIlN0cmljdFwiLCBzZXQgZW5mb3JjZW1lbnQgdG8gXCJTdHJpY3RcIi5cbiAgICBpZiAoYXR0cmlidXRlVmFsdWVMb3dlcmNhc2UuaW5jbHVkZXMoJ3N0cmljdCcpKSB7XG4gICAgICBlbmZvcmNlbWVudCA9ICdTdHJpY3QnXG4gICAgfVxuXG4gICAgLy8gNC4gSWYgY29va2llLWF2J3MgYXR0cmlidXRlLXZhbHVlIGlzIGEgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBmb3JcbiAgICAvLyAgICBcIkxheFwiLCBzZXQgZW5mb3JjZW1lbnQgdG8gXCJMYXhcIi5cbiAgICBpZiAoYXR0cmlidXRlVmFsdWVMb3dlcmNhc2UuaW5jbHVkZXMoJ2xheCcpKSB7XG4gICAgICBlbmZvcmNlbWVudCA9ICdMYXgnXG4gICAgfVxuXG4gICAgLy8gNS4gQXBwZW5kIGFuIGF0dHJpYnV0ZSB0byB0aGUgY29va2llLWF0dHJpYnV0ZS1saXN0IHdpdGggYW5cbiAgICAvLyAgICBhdHRyaWJ1dGUtbmFtZSBvZiBcIlNhbWVTaXRlXCIgYW5kIGFuIGF0dHJpYnV0ZS12YWx1ZSBvZlxuICAgIC8vICAgIGVuZm9yY2VtZW50LlxuICAgIGNvb2tpZUF0dHJpYnV0ZUxpc3Quc2FtZVNpdGUgPSBlbmZvcmNlbWVudFxuICB9IGVsc2Uge1xuICAgIGNvb2tpZUF0dHJpYnV0ZUxpc3QudW5wYXJzZWQgPz89IFtdXG5cbiAgICBjb29raWVBdHRyaWJ1dGVMaXN0LnVucGFyc2VkLnB1c2goYCR7YXR0cmlidXRlTmFtZX09JHthdHRyaWJ1dGVWYWx1ZX1gKVxuICB9XG5cbiAgLy8gOC4gUmV0dXJuIHRvIFN0ZXAgMSBvZiB0aGlzIGFsZ29yaXRobS5cbiAgcmV0dXJuIHBhcnNlVW5wYXJzZWRBdHRyaWJ1dGVzKHVucGFyc2VkQXR0cmlidXRlcywgY29va2llQXR0cmlidXRlTGlzdClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHBhcnNlU2V0Q29va2llLFxuICBwYXJzZVVucGFyc2VkQXR0cmlidXRlc1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgcGFyc2VTZXRDb29raWUgfSA9IHJlcXVpcmUoJy4vcGFyc2UnKVxuY29uc3QgeyBzdHJpbmdpZnkgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IHdlYmlkbCB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvd2ViaWRsJylcbmNvbnN0IHsgSGVhZGVycyB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvaGVhZGVycycpXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ29va2llXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZhbHVlXG4gKiBAcHJvcGVydHkge0RhdGV8bnVtYmVyfHVuZGVmaW5lZH0gZXhwaXJlc1xuICogQHByb3BlcnR5IHtudW1iZXJ8dW5kZWZpbmVkfSBtYXhBZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfHVuZGVmaW5lZH0gZG9tYWluXG4gKiBAcHJvcGVydHkge3N0cmluZ3x1bmRlZmluZWR9IHBhdGhcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbnx1bmRlZmluZWR9IHNlY3VyZVxuICogQHByb3BlcnR5IHtib29sZWFufHVuZGVmaW5lZH0gaHR0cE9ubHlcbiAqIEBwcm9wZXJ0eSB7J1N0cmljdCd8J0xheCd8J05vbmUnfSBzYW1lU2l0ZVxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gdW5wYXJzZWRcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7SGVhZGVyc30gaGVhZGVyc1xuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHN0cmluZz59XG4gKi9cbmZ1bmN0aW9uIGdldENvb2tpZXMgKGhlYWRlcnMpIHtcbiAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ2dldENvb2tpZXMnIH0pXG5cbiAgd2ViaWRsLmJyYW5kQ2hlY2soaGVhZGVycywgSGVhZGVycywgeyBzdHJpY3Q6IGZhbHNlIH0pXG5cbiAgY29uc3QgY29va2llID0gaGVhZGVycy5nZXQoJ2Nvb2tpZScpXG4gIGNvbnN0IG91dCA9IHt9XG5cbiAgaWYgKCFjb29raWUpIHtcbiAgICByZXR1cm4gb3V0XG4gIH1cblxuICBmb3IgKGNvbnN0IHBpZWNlIG9mIGNvb2tpZS5zcGxpdCgnOycpKSB7XG4gICAgY29uc3QgW25hbWUsIC4uLnZhbHVlXSA9IHBpZWNlLnNwbGl0KCc9JylcblxuICAgIG91dFtuYW1lLnRyaW0oKV0gPSB2YWx1ZS5qb2luKCc9JylcbiAgfVxuXG4gIHJldHVybiBvdXRcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0hlYWRlcnN9IGhlYWRlcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge3sgcGF0aD86IHN0cmluZywgZG9tYWluPzogc3RyaW5nIH18dW5kZWZpbmVkfSBhdHRyaWJ1dGVzXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZGVsZXRlQ29va2llIChoZWFkZXJzLCBuYW1lLCBhdHRyaWJ1dGVzKSB7XG4gIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMiwgeyBoZWFkZXI6ICdkZWxldGVDb29raWUnIH0pXG5cbiAgd2ViaWRsLmJyYW5kQ2hlY2soaGVhZGVycywgSGVhZGVycywgeyBzdHJpY3Q6IGZhbHNlIH0pXG5cbiAgbmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyhuYW1lKVxuICBhdHRyaWJ1dGVzID0gd2ViaWRsLmNvbnZlcnRlcnMuRGVsZXRlQ29va2llQXR0cmlidXRlcyhhdHRyaWJ1dGVzKVxuXG4gIC8vIE1hdGNoZXMgYmVoYXZpb3Igb2ZcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Rlbm9sYW5kL2Rlbm9fc3RkL2Jsb2IvNjM4MjdiMTYzMzBiODI0ODlhMDQ2MTQwMjdjMzNiNzkwNGUwOGJlNS9odHRwL2Nvb2tpZS50cyNMMjc4XG4gIHNldENvb2tpZShoZWFkZXJzLCB7XG4gICAgbmFtZSxcbiAgICB2YWx1ZTogJycsXG4gICAgZXhwaXJlczogbmV3IERhdGUoMCksXG4gICAgLi4uYXR0cmlidXRlc1xuICB9KVxufVxuXG4vKipcbiAqIEBwYXJhbSB7SGVhZGVyc30gaGVhZGVyc1xuICogQHJldHVybnMge0Nvb2tpZVtdfVxuICovXG5mdW5jdGlvbiBnZXRTZXRDb29raWVzIChoZWFkZXJzKSB7XG4gIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdnZXRTZXRDb29raWVzJyB9KVxuXG4gIHdlYmlkbC5icmFuZENoZWNrKGhlYWRlcnMsIEhlYWRlcnMsIHsgc3RyaWN0OiBmYWxzZSB9KVxuXG4gIGNvbnN0IGNvb2tpZXMgPSBoZWFkZXJzLmdldFNldENvb2tpZSgpXG5cbiAgaWYgKCFjb29raWVzKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICByZXR1cm4gY29va2llcy5tYXAoKHBhaXIpID0+IHBhcnNlU2V0Q29va2llKHBhaXIpKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7SGVhZGVyc30gaGVhZGVyc1xuICogQHBhcmFtIHtDb29raWV9IGNvb2tpZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHNldENvb2tpZSAoaGVhZGVycywgY29va2llKSB7XG4gIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMiwgeyBoZWFkZXI6ICdzZXRDb29raWUnIH0pXG5cbiAgd2ViaWRsLmJyYW5kQ2hlY2soaGVhZGVycywgSGVhZGVycywgeyBzdHJpY3Q6IGZhbHNlIH0pXG5cbiAgY29va2llID0gd2ViaWRsLmNvbnZlcnRlcnMuQ29va2llKGNvb2tpZSlcblxuICBjb25zdCBzdHIgPSBzdHJpbmdpZnkoY29va2llKVxuXG4gIGlmIChzdHIpIHtcbiAgICBoZWFkZXJzLmFwcGVuZCgnU2V0LUNvb2tpZScsIHN0cmluZ2lmeShjb29raWUpKVxuICB9XG59XG5cbndlYmlkbC5jb252ZXJ0ZXJzLkRlbGV0ZUNvb2tpZUF0dHJpYnV0ZXMgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIHtcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5udWxsYWJsZUNvbnZlcnRlcih3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcpLFxuICAgIGtleTogJ3BhdGgnLFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbFxuICB9LFxuICB7XG4gICAgY29udmVydGVyOiB3ZWJpZGwubnVsbGFibGVDb252ZXJ0ZXIod2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKSxcbiAgICBrZXk6ICdkb21haW4nLFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbFxuICB9XG5dKVxuXG53ZWJpZGwuY29udmVydGVycy5Db29raWUgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIHtcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyxcbiAgICBrZXk6ICduYW1lJ1xuICB9LFxuICB7XG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAga2V5OiAndmFsdWUnXG4gIH0sXG4gIHtcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5udWxsYWJsZUNvbnZlcnRlcigodmFsdWUpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVyc1sndW5zaWduZWQgbG9uZyBsb25nJ10odmFsdWUpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSlcbiAgICB9KSxcbiAgICBrZXk6ICdleHBpcmVzJyxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGxcbiAgfSxcbiAge1xuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKHdlYmlkbC5jb252ZXJ0ZXJzWydsb25nIGxvbmcnXSksXG4gICAga2V5OiAnbWF4QWdlJyxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGxcbiAgfSxcbiAge1xuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyksXG4gICAga2V5OiAnZG9tYWluJyxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGxcbiAgfSxcbiAge1xuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyksXG4gICAga2V5OiAncGF0aCcsXG4gICAgZGVmYXVsdFZhbHVlOiBudWxsXG4gIH0sXG4gIHtcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5udWxsYWJsZUNvbnZlcnRlcih3ZWJpZGwuY29udmVydGVycy5ib29sZWFuKSxcbiAgICBrZXk6ICdzZWN1cmUnLFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbFxuICB9LFxuICB7XG4gICAgY29udmVydGVyOiB3ZWJpZGwubnVsbGFibGVDb252ZXJ0ZXIod2ViaWRsLmNvbnZlcnRlcnMuYm9vbGVhbiksXG4gICAga2V5OiAnaHR0cE9ubHknLFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbFxuICB9LFxuICB7XG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcsXG4gICAga2V5OiAnc2FtZVNpdGUnLFxuICAgIGFsbG93ZWRWYWx1ZXM6IFsnU3RyaWN0JywgJ0xheCcsICdOb25lJ11cbiAgfSxcbiAge1xuICAgIGNvbnZlcnRlcjogd2ViaWRsLnNlcXVlbmNlQ29udmVydGVyKHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyksXG4gICAga2V5OiAndW5wYXJzZWQnLFxuICAgIGRlZmF1bHRWYWx1ZTogW11cbiAgfVxuXSlcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvb2tpZXMsXG4gIGRlbGV0ZUNvb2tpZSxcbiAgZ2V0U2V0Q29va2llcyxcbiAgc2V0Q29va2llXG59XG4iLCIndXNlIHN0cmljdCdcblxuLy8gVGhpcyBpcyBhIEdsb2JhbGx5IFVuaXF1ZSBJZGVudGlmaWVyIHVuaXF1ZSB1c2VkXG4vLyB0byB2YWxpZGF0ZSB0aGF0IHRoZSBlbmRwb2ludCBhY2NlcHRzIHdlYnNvY2tldFxuLy8gY29ubmVjdGlvbnMuXG4vLyBTZWUgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzY0NTUuaHRtbCNzZWN0aW9uLTEuM1xuY29uc3QgdWlkID0gJzI1OEVBRkE1LUU5MTQtNDdEQS05NUNBLUM1QUIwREM4NUIxMSdcblxuLyoqIEB0eXBlIHtQcm9wZXJ0eURlc2NyaXB0b3J9ICovXG5jb25zdCBzdGF0aWNQcm9wZXJ0eURlc2NyaXB0b3JzID0ge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogZmFsc2UsXG4gIGNvbmZpZ3VyYWJsZTogZmFsc2Vcbn1cblxuY29uc3Qgc3RhdGVzID0ge1xuICBDT05ORUNUSU5HOiAwLFxuICBPUEVOOiAxLFxuICBDTE9TSU5HOiAyLFxuICBDTE9TRUQ6IDNcbn1cblxuY29uc3Qgb3Bjb2RlcyA9IHtcbiAgQ09OVElOVUFUSU9OOiAweDAsXG4gIFRFWFQ6IDB4MSxcbiAgQklOQVJZOiAweDIsXG4gIENMT1NFOiAweDgsXG4gIFBJTkc6IDB4OSxcbiAgUE9ORzogMHhBXG59XG5cbmNvbnN0IG1heFVuc2lnbmVkMTZCaXQgPSAyICoqIDE2IC0gMSAvLyA2NTUzNVxuXG5jb25zdCBwYXJzZXJTdGF0ZXMgPSB7XG4gIElORk86IDAsXG4gIFBBWUxPQURMRU5HVEhfMTY6IDIsXG4gIFBBWUxPQURMRU5HVEhfNjQ6IDMsXG4gIFJFQURfREFUQTogNFxufVxuXG5jb25zdCBlbXB0eUJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgwKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgdWlkLFxuICBzdGF0aWNQcm9wZXJ0eURlc2NyaXB0b3JzLFxuICBzdGF0ZXMsXG4gIG9wY29kZXMsXG4gIG1heFVuc2lnbmVkMTZCaXQsXG4gIHBhcnNlclN0YXRlcyxcbiAgZW1wdHlCdWZmZXJcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAga1dlYlNvY2tldFVSTDogU3ltYm9sKCd1cmwnKSxcbiAga1JlYWR5U3RhdGU6IFN5bWJvbCgncmVhZHkgc3RhdGUnKSxcbiAga0NvbnRyb2xsZXI6IFN5bWJvbCgnY29udHJvbGxlcicpLFxuICBrUmVzcG9uc2U6IFN5bWJvbCgncmVzcG9uc2UnKSxcbiAga0JpbmFyeVR5cGU6IFN5bWJvbCgnYmluYXJ5IHR5cGUnKSxcbiAga1NlbnRDbG9zZTogU3ltYm9sKCdzZW50IGNsb3NlJyksXG4gIGtSZWNlaXZlZENsb3NlOiBTeW1ib2woJ3JlY2VpdmVkIGNsb3NlJyksXG4gIGtCeXRlUGFyc2VyOiBTeW1ib2woJ2J5dGUgcGFyc2VyJylcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IHdlYmlkbCB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvd2ViaWRsJylcbmNvbnN0IHsga0VudW1lcmFibGVQcm9wZXJ0eSB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgTWVzc2FnZVBvcnQgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJylcblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2NvbW1zLmh0bWwjbWVzc2FnZWV2ZW50XG4gKi9cbmNsYXNzIE1lc3NhZ2VFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgI2V2ZW50SW5pdFxuXG4gIGNvbnN0cnVjdG9yICh0eXBlLCBldmVudEluaXREaWN0ID0ge30pIHtcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnTWVzc2FnZUV2ZW50IGNvbnN0cnVjdG9yJyB9KVxuXG4gICAgdHlwZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyh0eXBlKVxuICAgIGV2ZW50SW5pdERpY3QgPSB3ZWJpZGwuY29udmVydGVycy5NZXNzYWdlRXZlbnRJbml0KGV2ZW50SW5pdERpY3QpXG5cbiAgICBzdXBlcih0eXBlLCBldmVudEluaXREaWN0KVxuXG4gICAgdGhpcy4jZXZlbnRJbml0ID0gZXZlbnRJbml0RGljdFxuICB9XG5cbiAgZ2V0IGRhdGEgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIE1lc3NhZ2VFdmVudClcblxuICAgIHJldHVybiB0aGlzLiNldmVudEluaXQuZGF0YVxuICB9XG5cbiAgZ2V0IG9yaWdpbiAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgTWVzc2FnZUV2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5vcmlnaW5cbiAgfVxuXG4gIGdldCBsYXN0RXZlbnRJZCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgTWVzc2FnZUV2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5sYXN0RXZlbnRJZFxuICB9XG5cbiAgZ2V0IHNvdXJjZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgTWVzc2FnZUV2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5zb3VyY2VcbiAgfVxuXG4gIGdldCBwb3J0cyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgTWVzc2FnZUV2ZW50KVxuXG4gICAgaWYgKCFPYmplY3QuaXNGcm96ZW4odGhpcy4jZXZlbnRJbml0LnBvcnRzKSkge1xuICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzLiNldmVudEluaXQucG9ydHMpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5wb3J0c1xuICB9XG5cbiAgaW5pdE1lc3NhZ2VFdmVudCAoXG4gICAgdHlwZSxcbiAgICBidWJibGVzID0gZmFsc2UsXG4gICAgY2FuY2VsYWJsZSA9IGZhbHNlLFxuICAgIGRhdGEgPSBudWxsLFxuICAgIG9yaWdpbiA9ICcnLFxuICAgIGxhc3RFdmVudElkID0gJycsXG4gICAgc291cmNlID0gbnVsbCxcbiAgICBwb3J0cyA9IFtdXG4gICkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIE1lc3NhZ2VFdmVudClcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdNZXNzYWdlRXZlbnQuaW5pdE1lc3NhZ2VFdmVudCcgfSlcblxuICAgIHJldHVybiBuZXcgTWVzc2FnZUV2ZW50KHR5cGUsIHtcbiAgICAgIGJ1YmJsZXMsIGNhbmNlbGFibGUsIGRhdGEsIG9yaWdpbiwgbGFzdEV2ZW50SWQsIHNvdXJjZSwgcG9ydHNcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3dlYnNvY2tldHMuc3BlYy53aGF0d2cub3JnLyN0aGUtY2xvc2VldmVudC1pbnRlcmZhY2VcbiAqL1xuY2xhc3MgQ2xvc2VFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgI2V2ZW50SW5pdFxuXG4gIGNvbnN0cnVjdG9yICh0eXBlLCBldmVudEluaXREaWN0ID0ge30pIHtcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnQ2xvc2VFdmVudCBjb25zdHJ1Y3RvcicgfSlcblxuICAgIHR5cGUgPSB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcodHlwZSlcbiAgICBldmVudEluaXREaWN0ID0gd2ViaWRsLmNvbnZlcnRlcnMuQ2xvc2VFdmVudEluaXQoZXZlbnRJbml0RGljdClcblxuICAgIHN1cGVyKHR5cGUsIGV2ZW50SW5pdERpY3QpXG5cbiAgICB0aGlzLiNldmVudEluaXQgPSBldmVudEluaXREaWN0XG4gIH1cblxuICBnZXQgd2FzQ2xlYW4gKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIENsb3NlRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRJbml0Lndhc0NsZWFuXG4gIH1cblxuICBnZXQgY29kZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2xvc2VFdmVudClcblxuICAgIHJldHVybiB0aGlzLiNldmVudEluaXQuY29kZVxuICB9XG5cbiAgZ2V0IHJlYXNvbiAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2xvc2VFdmVudClcblxuICAgIHJldHVybiB0aGlzLiNldmVudEluaXQucmVhc29uXG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvd2ViYXBwYXBpcy5odG1sI3RoZS1lcnJvcmV2ZW50LWludGVyZmFjZVxuY2xhc3MgRXJyb3JFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgI2V2ZW50SW5pdFxuXG4gIGNvbnN0cnVjdG9yICh0eXBlLCBldmVudEluaXREaWN0KSB7XG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0Vycm9yRXZlbnQgY29uc3RydWN0b3InIH0pXG5cbiAgICBzdXBlcih0eXBlLCBldmVudEluaXREaWN0KVxuXG4gICAgdHlwZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyh0eXBlKVxuICAgIGV2ZW50SW5pdERpY3QgPSB3ZWJpZGwuY29udmVydGVycy5FcnJvckV2ZW50SW5pdChldmVudEluaXREaWN0ID8/IHt9KVxuXG4gICAgdGhpcy4jZXZlbnRJbml0ID0gZXZlbnRJbml0RGljdFxuICB9XG5cbiAgZ2V0IG1lc3NhZ2UgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEVycm9yRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRJbml0Lm1lc3NhZ2VcbiAgfVxuXG4gIGdldCBmaWxlbmFtZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRXJyb3JFdmVudClcblxuICAgIHJldHVybiB0aGlzLiNldmVudEluaXQuZmlsZW5hbWVcbiAgfVxuXG4gIGdldCBsaW5lbm8gKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEVycm9yRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRJbml0LmxpbmVub1xuICB9XG5cbiAgZ2V0IGNvbG5vICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBFcnJvckV2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5jb2xub1xuICB9XG5cbiAgZ2V0IGVycm9yICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBFcnJvckV2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5lcnJvclxuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE1lc3NhZ2VFdmVudC5wcm90b3R5cGUsIHtcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHtcbiAgICB2YWx1ZTogJ01lc3NhZ2VFdmVudCcsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0sXG4gIGRhdGE6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIG9yaWdpbjoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgbGFzdEV2ZW50SWQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHNvdXJjZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgcG9ydHM6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGluaXRNZXNzYWdlRXZlbnQ6IGtFbnVtZXJhYmxlUHJvcGVydHlcbn0pXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKENsb3NlRXZlbnQucHJvdG90eXBlLCB7XG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7XG4gICAgdmFsdWU6ICdDbG9zZUV2ZW50JyxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSxcbiAgcmVhc29uOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBjb2RlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICB3YXNDbGVhbjoga0VudW1lcmFibGVQcm9wZXJ0eVxufSlcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRXJyb3JFdmVudC5wcm90b3R5cGUsIHtcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHtcbiAgICB2YWx1ZTogJ0Vycm9yRXZlbnQnLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9LFxuICBtZXNzYWdlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBmaWxlbmFtZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgbGluZW5vOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBjb2xubzoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgZXJyb3I6IGtFbnVtZXJhYmxlUHJvcGVydHlcbn0pXG5cbndlYmlkbC5jb252ZXJ0ZXJzLk1lc3NhZ2VQb3J0ID0gd2ViaWRsLmludGVyZmFjZUNvbnZlcnRlcihNZXNzYWdlUG9ydClcblxud2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPE1lc3NhZ2VQb3J0PiddID0gd2ViaWRsLnNlcXVlbmNlQ29udmVydGVyKFxuICB3ZWJpZGwuY29udmVydGVycy5NZXNzYWdlUG9ydFxuKVxuXG5jb25zdCBldmVudEluaXQgPSBbXG4gIHtcbiAgICBrZXk6ICdidWJibGVzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4sXG4gICAgZGVmYXVsdFZhbHVlOiBmYWxzZVxuICB9LFxuICB7XG4gICAga2V5OiAnY2FuY2VsYWJsZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ib29sZWFuLFxuICAgIGRlZmF1bHRWYWx1ZTogZmFsc2VcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbXBvc2VkJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4sXG4gICAgZGVmYXVsdFZhbHVlOiBmYWxzZVxuICB9XG5dXG5cbndlYmlkbC5jb252ZXJ0ZXJzLk1lc3NhZ2VFdmVudEluaXQgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIC4uLmV2ZW50SW5pdCxcbiAge1xuICAgIGtleTogJ2RhdGEnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYW55LFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbFxuICB9LFxuICB7XG4gICAga2V5OiAnb3JpZ2luJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6ICcnXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdsYXN0RXZlbnRJZCcsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiAnJ1xuICB9LFxuICB7XG4gICAga2V5OiAnc291cmNlJyxcbiAgICAvLyBOb2RlIGRvZXNuJ3QgaW1wbGVtZW50IFdpbmRvd1Byb3h5IG9yIFNlcnZpY2VXb3JrZXIsIHNvIHRoZSBvbmx5XG4gICAgLy8gdmFsaWQgdmFsdWUgZm9yIHNvdXJjZSBpcyBhIE1lc3NhZ2VQb3J0LlxuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKHdlYmlkbC5jb252ZXJ0ZXJzLk1lc3NhZ2VQb3J0KSxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGxcbiAgfSxcbiAge1xuICAgIGtleTogJ3BvcnRzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzWydzZXF1ZW5jZTxNZXNzYWdlUG9ydD4nXSxcbiAgICBnZXQgZGVmYXVsdFZhbHVlICgpIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgfVxuXSlcblxud2ViaWRsLmNvbnZlcnRlcnMuQ2xvc2VFdmVudEluaXQgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIC4uLmV2ZW50SW5pdCxcbiAge1xuICAgIGtleTogJ3dhc0NsZWFuJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4sXG4gICAgZGVmYXVsdFZhbHVlOiBmYWxzZVxuICB9LFxuICB7XG4gICAga2V5OiAnY29kZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVyc1sndW5zaWduZWQgc2hvcnQnXSxcbiAgICBkZWZhdWx0VmFsdWU6IDBcbiAgfSxcbiAge1xuICAgIGtleTogJ3JlYXNvbicsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiAnJ1xuICB9XG5dKVxuXG53ZWJpZGwuY29udmVydGVycy5FcnJvckV2ZW50SW5pdCA9IHdlYmlkbC5kaWN0aW9uYXJ5Q29udmVydGVyKFtcbiAgLi4uZXZlbnRJbml0LFxuICB7XG4gICAga2V5OiAnbWVzc2FnZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiAnJ1xuICB9LFxuICB7XG4gICAga2V5OiAnZmlsZW5hbWUnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZTogJydcbiAgfSxcbiAge1xuICAgIGtleTogJ2xpbmVubycsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVyc1sndW5zaWduZWQgbG9uZyddLFxuICAgIGRlZmF1bHRWYWx1ZTogMFxuICB9LFxuICB7XG4gICAga2V5OiAnY29sbm8nLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIGxvbmcnXSxcbiAgICBkZWZhdWx0VmFsdWU6IDBcbiAgfSxcbiAge1xuICAgIGtleTogJ2Vycm9yJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmFueVxuICB9XG5dKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgTWVzc2FnZUV2ZW50LFxuICBDbG9zZUV2ZW50LFxuICBFcnJvckV2ZW50XG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBrUmVhZHlTdGF0ZSwga0NvbnRyb2xsZXIsIGtSZXNwb25zZSwga0JpbmFyeVR5cGUsIGtXZWJTb2NrZXRVUkwgfSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IHN0YXRlcywgb3Bjb2RlcyB9ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3QgeyBNZXNzYWdlRXZlbnQsIEVycm9yRXZlbnQgfSA9IHJlcXVpcmUoJy4vZXZlbnRzJylcblxuLyogZ2xvYmFscyBCbG9iICovXG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vd2Vic29ja2V0JykuV2ViU29ja2V0fSB3c1xuICovXG5mdW5jdGlvbiBpc0VzdGFibGlzaGVkICh3cykge1xuICAvLyBJZiB0aGUgc2VydmVyJ3MgcmVzcG9uc2UgaXMgdmFsaWRhdGVkIGFzIHByb3ZpZGVkIGZvciBhYm92ZSwgaXQgaXNcbiAgLy8gc2FpZCB0aGF0IF9UaGUgV2ViU29ja2V0IENvbm5lY3Rpb24gaXMgRXN0YWJsaXNoZWRfIGFuZCB0aGF0IHRoZVxuICAvLyBXZWJTb2NrZXQgQ29ubmVjdGlvbiBpcyBpbiB0aGUgT1BFTiBzdGF0ZS5cbiAgcmV0dXJuIHdzW2tSZWFkeVN0YXRlXSA9PT0gc3RhdGVzLk9QRU5cbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi93ZWJzb2NrZXQnKS5XZWJTb2NrZXR9IHdzXG4gKi9cbmZ1bmN0aW9uIGlzQ2xvc2luZyAod3MpIHtcbiAgLy8gVXBvbiBlaXRoZXIgc2VuZGluZyBvciByZWNlaXZpbmcgYSBDbG9zZSBjb250cm9sIGZyYW1lLCBpdCBpcyBzYWlkXG4gIC8vIHRoYXQgX1RoZSBXZWJTb2NrZXQgQ2xvc2luZyBIYW5kc2hha2UgaXMgU3RhcnRlZF8gYW5kIHRoYXQgdGhlXG4gIC8vIFdlYlNvY2tldCBjb25uZWN0aW9uIGlzIGluIHRoZSBDTE9TSU5HIHN0YXRlLlxuICByZXR1cm4gd3Nba1JlYWR5U3RhdGVdID09PSBzdGF0ZXMuQ0xPU0lOR1xufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL3dlYnNvY2tldCcpLldlYlNvY2tldH0gd3NcbiAqL1xuZnVuY3Rpb24gaXNDbG9zZWQgKHdzKSB7XG4gIHJldHVybiB3c1trUmVhZHlTdGF0ZV0gPT09IHN0YXRlcy5DTE9TRURcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1ldmVudC1maXJlXG4gKiBAcGFyYW0ge3N0cmluZ30gZVxuICogQHBhcmFtIHtFdmVudFRhcmdldH0gdGFyZ2V0XG4gKiBAcGFyYW0ge0V2ZW50SW5pdCB8IHVuZGVmaW5lZH0gZXZlbnRJbml0RGljdFxuICovXG5mdW5jdGlvbiBmaXJlRXZlbnQgKGUsIHRhcmdldCwgZXZlbnRDb25zdHJ1Y3RvciA9IEV2ZW50LCBldmVudEluaXREaWN0KSB7XG4gIC8vIDEuIElmIGV2ZW50Q29uc3RydWN0b3IgaXMgbm90IGdpdmVuLCB0aGVuIGxldCBldmVudENvbnN0cnVjdG9yIGJlIEV2ZW50LlxuXG4gIC8vIDIuIExldCBldmVudCBiZSB0aGUgcmVzdWx0IG9mIGNyZWF0aW5nIGFuIGV2ZW50IGdpdmVuIGV2ZW50Q29uc3RydWN0b3IsXG4gIC8vICAgIGluIHRoZSByZWxldmFudCByZWFsbSBvZiB0YXJnZXQuXG4gIC8vIDMuIEluaXRpYWxpemUgZXZlbnTigJlzIHR5cGUgYXR0cmlidXRlIHRvIGUuXG4gIGNvbnN0IGV2ZW50ID0gbmV3IGV2ZW50Q29uc3RydWN0b3IoZSwgZXZlbnRJbml0RGljdCkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuZXctY2FwXG5cbiAgLy8gNC4gSW5pdGlhbGl6ZSBhbnkgb3RoZXIgSURMIGF0dHJpYnV0ZXMgb2YgZXZlbnQgYXMgZGVzY3JpYmVkIGluIHRoZVxuICAvLyAgICBpbnZvY2F0aW9uIG9mIHRoaXMgYWxnb3JpdGhtLlxuXG4gIC8vIDUuIFJldHVybiB0aGUgcmVzdWx0IG9mIGRpc3BhdGNoaW5nIGV2ZW50IGF0IHRhcmdldCwgd2l0aCBsZWdhY3kgdGFyZ2V0XG4gIC8vICAgIG92ZXJyaWRlIGZsYWcgc2V0IGlmIHNldC5cbiAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXZlbnQpXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3dlYnNvY2tldHMuc3BlYy53aGF0d2cub3JnLyNmZWVkYmFjay1mcm9tLXRoZS1wcm90b2NvbFxuICogQHBhcmFtIHtpbXBvcnQoJy4vd2Vic29ja2V0JykuV2ViU29ja2V0fSB3c1xuICogQHBhcmFtIHtudW1iZXJ9IHR5cGUgT3Bjb2RlXG4gKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSBhcHBsaWNhdGlvbiBkYXRhXG4gKi9cbmZ1bmN0aW9uIHdlYnNvY2tldE1lc3NhZ2VSZWNlaXZlZCAod3MsIHR5cGUsIGRhdGEpIHtcbiAgLy8gMS4gSWYgcmVhZHkgc3RhdGUgaXMgbm90IE9QRU4gKDEpLCB0aGVuIHJldHVybi5cbiAgaWYgKHdzW2tSZWFkeVN0YXRlXSAhPT0gc3RhdGVzLk9QRU4pIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIDIuIExldCBkYXRhRm9yRXZlbnQgYmUgZGV0ZXJtaW5lZCBieSBzd2l0Y2hpbmcgb24gdHlwZSBhbmQgYmluYXJ5IHR5cGU6XG4gIGxldCBkYXRhRm9yRXZlbnRcblxuICBpZiAodHlwZSA9PT0gb3Bjb2Rlcy5URVhUKSB7XG4gICAgLy8gLT4gdHlwZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZGF0YSBpcyBUZXh0XG4gICAgLy8gICAgICBhIG5ldyBET01TdHJpbmcgY29udGFpbmluZyBkYXRhXG4gICAgdHJ5IHtcbiAgICAgIGRhdGFGb3JFdmVudCA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTgnLCB7IGZhdGFsOiB0cnVlIH0pLmRlY29kZShkYXRhKVxuICAgIH0gY2F0Y2gge1xuICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24od3MsICdSZWNlaXZlZCBpbnZhbGlkIFVURi04IGluIHRleHQgZnJhbWUuJylcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlID09PSBvcGNvZGVzLkJJTkFSWSkge1xuICAgIGlmICh3c1trQmluYXJ5VHlwZV0gPT09ICdibG9iJykge1xuICAgICAgLy8gLT4gdHlwZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZGF0YSBpcyBCaW5hcnkgYW5kIGJpbmFyeSB0eXBlIGlzIFwiYmxvYlwiXG4gICAgICAvLyAgICAgIGEgbmV3IEJsb2Igb2JqZWN0LCBjcmVhdGVkIGluIHRoZSByZWxldmFudCBSZWFsbSBvZiB0aGUgV2ViU29ja2V0XG4gICAgICAvLyAgICAgIG9iamVjdCwgdGhhdCByZXByZXNlbnRzIGRhdGEgYXMgaXRzIHJhdyBkYXRhXG4gICAgICBkYXRhRm9yRXZlbnQgPSBuZXcgQmxvYihbZGF0YV0pXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIC0+IHR5cGUgaW5kaWNhdGVzIHRoYXQgdGhlIGRhdGEgaXMgQmluYXJ5IGFuZCBiaW5hcnkgdHlwZSBpcyBcImFycmF5YnVmZmVyXCJcbiAgICAgIC8vICAgICAgYSBuZXcgQXJyYXlCdWZmZXIgb2JqZWN0LCBjcmVhdGVkIGluIHRoZSByZWxldmFudCBSZWFsbSBvZiB0aGVcbiAgICAgIC8vICAgICAgV2ViU29ja2V0IG9iamVjdCwgd2hvc2UgY29udGVudHMgYXJlIGRhdGFcbiAgICAgIGRhdGFGb3JFdmVudCA9IG5ldyBVaW50OEFycmF5KGRhdGEpLmJ1ZmZlclxuICAgIH1cbiAgfVxuXG4gIC8vIDMuIEZpcmUgYW4gZXZlbnQgbmFtZWQgbWVzc2FnZSBhdCB0aGUgV2ViU29ja2V0IG9iamVjdCwgdXNpbmcgTWVzc2FnZUV2ZW50LFxuICAvLyAgICB3aXRoIHRoZSBvcmlnaW4gYXR0cmlidXRlIGluaXRpYWxpemVkIHRvIHRoZSBzZXJpYWxpemF0aW9uIG9mIHRoZSBXZWJTb2NrZXRcbiAgLy8gICAgb2JqZWN04oCZcyB1cmwncyBvcmlnaW4sIGFuZCB0aGUgZGF0YSBhdHRyaWJ1dGUgaW5pdGlhbGl6ZWQgdG8gZGF0YUZvckV2ZW50LlxuICBmaXJlRXZlbnQoJ21lc3NhZ2UnLCB3cywgTWVzc2FnZUV2ZW50LCB7XG4gICAgb3JpZ2luOiB3c1trV2ViU29ja2V0VVJMXS5vcmlnaW4sXG4gICAgZGF0YTogZGF0YUZvckV2ZW50XG4gIH0pXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzY0NTVcbiAqIEBzZWUgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMyNjE2XG4gKiBAc2VlIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTM5ODQwN1xuICogQHBhcmFtIHtzdHJpbmd9IHByb3RvY29sXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRTdWJwcm90b2NvbCAocHJvdG9jb2wpIHtcbiAgLy8gSWYgcHJlc2VudCwgdGhpcyB2YWx1ZSBpbmRpY2F0ZXMgb25lXG4gIC8vIG9yIG1vcmUgY29tbWEtc2VwYXJhdGVkIHN1YnByb3RvY29sIHRoZSBjbGllbnQgd2lzaGVzIHRvIHNwZWFrLFxuICAvLyBvcmRlcmVkIGJ5IHByZWZlcmVuY2UuICBUaGUgZWxlbWVudHMgdGhhdCBjb21wcmlzZSB0aGlzIHZhbHVlXG4gIC8vIE1VU1QgYmUgbm9uLWVtcHR5IHN0cmluZ3Mgd2l0aCBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBVKzAwMjEgdG9cbiAgLy8gVSswMDdFIG5vdCBpbmNsdWRpbmcgc2VwYXJhdG9yIGNoYXJhY3RlcnMgYXMgZGVmaW5lZCBpblxuICAvLyBbUkZDMjYxNl0gYW5kIE1VU1QgYWxsIGJlIHVuaXF1ZSBzdHJpbmdzLlxuICBpZiAocHJvdG9jb2wubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBmb3IgKGNvbnN0IGNoYXIgb2YgcHJvdG9jb2wpIHtcbiAgICBjb25zdCBjb2RlID0gY2hhci5jaGFyQ29kZUF0KDApXG5cbiAgICBpZiAoXG4gICAgICBjb2RlIDwgMHgyMSB8fFxuICAgICAgY29kZSA+IDB4N0UgfHxcbiAgICAgIGNoYXIgPT09ICcoJyB8fFxuICAgICAgY2hhciA9PT0gJyknIHx8XG4gICAgICBjaGFyID09PSAnPCcgfHxcbiAgICAgIGNoYXIgPT09ICc+JyB8fFxuICAgICAgY2hhciA9PT0gJ0AnIHx8XG4gICAgICBjaGFyID09PSAnLCcgfHxcbiAgICAgIGNoYXIgPT09ICc7JyB8fFxuICAgICAgY2hhciA9PT0gJzonIHx8XG4gICAgICBjaGFyID09PSAnXFxcXCcgfHxcbiAgICAgIGNoYXIgPT09ICdcIicgfHxcbiAgICAgIGNoYXIgPT09ICcvJyB8fFxuICAgICAgY2hhciA9PT0gJ1snIHx8XG4gICAgICBjaGFyID09PSAnXScgfHxcbiAgICAgIGNoYXIgPT09ICc/JyB8fFxuICAgICAgY2hhciA9PT0gJz0nIHx8XG4gICAgICBjaGFyID09PSAneycgfHxcbiAgICAgIGNoYXIgPT09ICd9JyB8fFxuICAgICAgY29kZSA9PT0gMzIgfHwgLy8gU1BcbiAgICAgIGNvZGUgPT09IDkgLy8gSFRcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzY0NTUjc2VjdGlvbi03LTRcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRTdGF0dXNDb2RlIChjb2RlKSB7XG4gIGlmIChjb2RlID49IDEwMDAgJiYgY29kZSA8IDEwMTUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgY29kZSAhPT0gMTAwNCAmJiAvLyByZXNlcnZlZFxuICAgICAgY29kZSAhPT0gMTAwNSAmJiAvLyBcIk1VU1QgTk9UIGJlIHNldCBhcyBhIHN0YXR1cyBjb2RlXCJcbiAgICAgIGNvZGUgIT09IDEwMDYgLy8gXCJNVVNUIE5PVCBiZSBzZXQgYXMgYSBzdGF0dXMgY29kZVwiXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGNvZGUgPj0gMzAwMCAmJiBjb2RlIDw9IDQ5OTlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi93ZWJzb2NrZXQnKS5XZWJTb2NrZXR9IHdzXG4gKiBAcGFyYW0ge3N0cmluZ3x1bmRlZmluZWR9IHJlYXNvblxuICovXG5mdW5jdGlvbiBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbiAod3MsIHJlYXNvbikge1xuICBjb25zdCB7IFtrQ29udHJvbGxlcl06IGNvbnRyb2xsZXIsIFtrUmVzcG9uc2VdOiByZXNwb25zZSB9ID0gd3NcblxuICBjb250cm9sbGVyLmFib3J0KClcblxuICBpZiAocmVzcG9uc2U/LnNvY2tldCAmJiAhcmVzcG9uc2Uuc29ja2V0LmRlc3Ryb3llZCkge1xuICAgIHJlc3BvbnNlLnNvY2tldC5kZXN0cm95KClcbiAgfVxuXG4gIGlmIChyZWFzb24pIHtcbiAgICBmaXJlRXZlbnQoJ2Vycm9yJywgd3MsIEVycm9yRXZlbnQsIHtcbiAgICAgIGVycm9yOiBuZXcgRXJyb3IocmVhc29uKVxuICAgIH0pXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzRXN0YWJsaXNoZWQsXG4gIGlzQ2xvc2luZyxcbiAgaXNDbG9zZWQsXG4gIGZpcmVFdmVudCxcbiAgaXNWYWxpZFN1YnByb3RvY29sLFxuICBpc1ZhbGlkU3RhdHVzQ29kZSxcbiAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24sXG4gIHdlYnNvY2tldE1lc3NhZ2VSZWNlaXZlZFxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGRpYWdub3N0aWNzQ2hhbm5lbCA9IHJlcXVpcmUoJ2RpYWdub3N0aWNzX2NoYW5uZWwnKVxuY29uc3QgeyB1aWQsIHN0YXRlcyB9ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3Qge1xuICBrUmVhZHlTdGF0ZSxcbiAga1NlbnRDbG9zZSxcbiAga0J5dGVQYXJzZXIsXG4gIGtSZWNlaXZlZENsb3NlXG59ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgZmlyZUV2ZW50LCBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbiB9ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHsgQ2xvc2VFdmVudCB9ID0gcmVxdWlyZSgnLi9ldmVudHMnKVxuY29uc3QgeyBtYWtlUmVxdWVzdCB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvcmVxdWVzdCcpXG5jb25zdCB7IGZldGNoaW5nIH0gPSByZXF1aXJlKCcuLi9mZXRjaC9pbmRleCcpXG5jb25zdCB7IEhlYWRlcnMgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL2hlYWRlcnMnKVxuY29uc3QgeyBnZXRHbG9iYWxEaXNwYXRjaGVyIH0gPSByZXF1aXJlKCcuLi9nbG9iYWwnKVxuY29uc3QgeyBrSGVhZGVyc0xpc3QgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5cbmNvbnN0IGNoYW5uZWxzID0ge31cbmNoYW5uZWxzLm9wZW4gPSBkaWFnbm9zdGljc0NoYW5uZWwuY2hhbm5lbCgndW5kaWNpOndlYnNvY2tldDpvcGVuJylcbmNoYW5uZWxzLmNsb3NlID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTp3ZWJzb2NrZXQ6Y2xvc2UnKVxuY2hhbm5lbHMuc29ja2V0RXJyb3IgPSBkaWFnbm9zdGljc0NoYW5uZWwuY2hhbm5lbCgndW5kaWNpOndlYnNvY2tldDpzb2NrZXRfZXJyb3InKVxuXG4vKiogQHR5cGUge2ltcG9ydCgnY3J5cHRvJyl9ICovXG5sZXQgY3J5cHRvXG50cnkge1xuICBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKVxufSBjYXRjaCB7XG5cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vd2Vic29ja2V0cy5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtd2Vic29ja2V0LWVzdGFibGlzaFxuICogQHBhcmFtIHtVUkx9IHVybFxuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IHByb3RvY29sc1xuICogQHBhcmFtIHtpbXBvcnQoJy4vd2Vic29ja2V0JykuV2ViU29ja2V0fSB3c1xuICogQHBhcmFtIHsocmVzcG9uc2U6IGFueSkgPT4gdm9pZH0gb25Fc3RhYmxpc2hcbiAqIEBwYXJhbSB7UGFydGlhbDxpbXBvcnQoJy4uLy4uL3R5cGVzL3dlYnNvY2tldCcpLldlYlNvY2tldEluaXQ+fSBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIGVzdGFibGlzaFdlYlNvY2tldENvbm5lY3Rpb24gKHVybCwgcHJvdG9jb2xzLCB3cywgb25Fc3RhYmxpc2gsIG9wdGlvbnMpIHtcbiAgLy8gMS4gTGV0IHJlcXVlc3RVUkwgYmUgYSBjb3B5IG9mIHVybCwgd2l0aCBpdHMgc2NoZW1lIHNldCB0byBcImh0dHBcIiwgaWYgdXJs4oCZc1xuICAvLyAgICBzY2hlbWUgaXMgXCJ3c1wiLCBhbmQgdG8gXCJodHRwc1wiIG90aGVyd2lzZS5cbiAgY29uc3QgcmVxdWVzdFVSTCA9IHVybFxuXG4gIHJlcXVlc3RVUkwucHJvdG9jb2wgPSB1cmwucHJvdG9jb2wgPT09ICd3czonID8gJ2h0dHA6JyA6ICdodHRwczonXG5cbiAgLy8gMi4gTGV0IHJlcXVlc3QgYmUgYSBuZXcgcmVxdWVzdCwgd2hvc2UgVVJMIGlzIHJlcXVlc3RVUkwsIGNsaWVudCBpcyBjbGllbnQsXG4gIC8vICAgIHNlcnZpY2Utd29ya2VycyBtb2RlIGlzIFwibm9uZVwiLCByZWZlcnJlciBpcyBcIm5vLXJlZmVycmVyXCIsIG1vZGUgaXNcbiAgLy8gICAgXCJ3ZWJzb2NrZXRcIiwgY3JlZGVudGlhbHMgbW9kZSBpcyBcImluY2x1ZGVcIiwgY2FjaGUgbW9kZSBpcyBcIm5vLXN0b3JlXCIgLFxuICAvLyAgICBhbmQgcmVkaXJlY3QgbW9kZSBpcyBcImVycm9yXCIuXG4gIGNvbnN0IHJlcXVlc3QgPSBtYWtlUmVxdWVzdCh7XG4gICAgdXJsTGlzdDogW3JlcXVlc3RVUkxdLFxuICAgIHNlcnZpY2VXb3JrZXJzOiAnbm9uZScsXG4gICAgcmVmZXJyZXI6ICduby1yZWZlcnJlcicsXG4gICAgbW9kZTogJ3dlYnNvY2tldCcsXG4gICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJyxcbiAgICBjYWNoZTogJ25vLXN0b3JlJyxcbiAgICByZWRpcmVjdDogJ2Vycm9yJ1xuICB9KVxuXG4gIC8vIE5vdGU6IHVuZGljaSBleHRlbnNpb24sIGFsbG93IHNldHRpbmcgY3VzdG9tIGhlYWRlcnMuXG4gIGlmIChvcHRpb25zLmhlYWRlcnMpIHtcbiAgICBjb25zdCBoZWFkZXJzTGlzdCA9IG5ldyBIZWFkZXJzKG9wdGlvbnMuaGVhZGVycylba0hlYWRlcnNMaXN0XVxuXG4gICAgcmVxdWVzdC5oZWFkZXJzTGlzdCA9IGhlYWRlcnNMaXN0XG4gIH1cblxuICAvLyAzLiBBcHBlbmQgKGBVcGdyYWRlYCwgYHdlYnNvY2tldGApIHRvIHJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICAvLyA0LiBBcHBlbmQgKGBDb25uZWN0aW9uYCwgYFVwZ3JhZGVgKSB0byByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgLy8gTm90ZTogYm90aCBvZiB0aGVzZSBhcmUgaGFuZGxlZCBieSB1bmRpY2kgY3VycmVudGx5LlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9ibG9iLzY4YzI2OWM0MTQ0YzQ0NmYzZjEyMjA5NTEzMzhkYWVmNGE2YjVlYzQvbGliL2NsaWVudC5qcyNMMTM5N1xuXG4gIC8vIDUuIExldCBrZXlWYWx1ZSBiZSBhIG5vbmNlIGNvbnNpc3Rpbmcgb2YgYSByYW5kb21seSBzZWxlY3RlZFxuICAvLyAgICAxNi1ieXRlIHZhbHVlIHRoYXQgaGFzIGJlZW4gZm9yZ2l2aW5nLWJhc2U2NC1lbmNvZGVkIGFuZFxuICAvLyAgICBpc29tb3JwaGljIGVuY29kZWQuXG4gIGNvbnN0IGtleVZhbHVlID0gY3J5cHRvLnJhbmRvbUJ5dGVzKDE2KS50b1N0cmluZygnYmFzZTY0JylcblxuICAvLyA2LiBBcHBlbmQgKGBTZWMtV2ViU29ja2V0LUtleWAsIGtleVZhbHVlKSB0byByZXF1ZXN04oCZc1xuICAvLyAgICBoZWFkZXIgbGlzdC5cbiAgcmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ3NlYy13ZWJzb2NrZXQta2V5Jywga2V5VmFsdWUpXG5cbiAgLy8gNy4gQXBwZW5kIChgU2VjLVdlYlNvY2tldC1WZXJzaW9uYCwgYDEzYCkgdG8gcmVxdWVzdOKAmXNcbiAgLy8gICAgaGVhZGVyIGxpc3QuXG4gIHJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdzZWMtd2Vic29ja2V0LXZlcnNpb24nLCAnMTMnKVxuXG4gIC8vIDguIEZvciBlYWNoIHByb3RvY29sIGluIHByb3RvY29scywgY29tYmluZVxuICAvLyAgICAoYFNlYy1XZWJTb2NrZXQtUHJvdG9jb2xgLCBwcm90b2NvbCkgaW4gcmVxdWVzdOKAmXMgaGVhZGVyXG4gIC8vICAgIGxpc3QuXG4gIGZvciAoY29uc3QgcHJvdG9jb2wgb2YgcHJvdG9jb2xzKSB7XG4gICAgcmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ3NlYy13ZWJzb2NrZXQtcHJvdG9jb2wnLCBwcm90b2NvbClcbiAgfVxuXG4gIC8vIDkuIExldCBwZXJtZXNzYWdlRGVmbGF0ZSBiZSBhIHVzZXItYWdlbnQgZGVmaW5lZFxuICAvLyAgICBcInBlcm1lc3NhZ2UtZGVmbGF0ZVwiIGV4dGVuc2lvbiBoZWFkZXIgdmFsdWUuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL2dlY2tvLWRldi9ibG9iL2NlNzgyMzRmNWU2NTNhNWQzOTE2ODEzZmY5OTBmMDUzNTEwMjI3YmMvbmV0d2Vyay9wcm90b2NvbC93ZWJzb2NrZXQvV2ViU29ja2V0Q2hhbm5lbC5jcHAjTDI2NzNcbiAgLy8gVE9ETzogZW5hYmxlIG9uY2UgcGVybWVzc2FnZS1kZWZsYXRlIGlzIHN1cHBvcnRlZFxuICBjb25zdCBwZXJtZXNzYWdlRGVmbGF0ZSA9ICcnIC8vICdwZXJtZXNzYWdlLWRlZmxhdGU7IDE1J1xuXG4gIC8vIDEwLiBBcHBlbmQgKGBTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnNgLCBwZXJtZXNzYWdlRGVmbGF0ZSkgdG9cbiAgLy8gICAgIHJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICAvLyByZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgnc2VjLXdlYnNvY2tldC1leHRlbnNpb25zJywgcGVybWVzc2FnZURlZmxhdGUpXG5cbiAgLy8gMTEuIEZldGNoIHJlcXVlc3Qgd2l0aCB1c2VQYXJhbGxlbFF1ZXVlIHNldCB0byB0cnVlLCBhbmRcbiAgLy8gICAgIHByb2Nlc3NSZXNwb25zZSBnaXZlbiByZXNwb25zZSBiZWluZyB0aGVzZSBzdGVwczpcbiAgY29uc3QgY29udHJvbGxlciA9IGZldGNoaW5nKHtcbiAgICByZXF1ZXN0LFxuICAgIHVzZVBhcmFsbGVsUXVldWU6IHRydWUsXG4gICAgZGlzcGF0Y2hlcjogb3B0aW9ucy5kaXNwYXRjaGVyID8/IGdldEdsb2JhbERpc3BhdGNoZXIoKSxcbiAgICBwcm9jZXNzUmVzcG9uc2UgKHJlc3BvbnNlKSB7XG4gICAgICAvLyAxLiBJZiByZXNwb25zZSBpcyBhIG5ldHdvcmsgZXJyb3Igb3IgaXRzIHN0YXR1cyBpcyBub3QgMTAxLFxuICAgICAgLy8gICAgZmFpbCB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gICAgICBpZiAocmVzcG9uc2UudHlwZSA9PT0gJ2Vycm9yJyB8fCByZXNwb25zZS5zdGF0dXMgIT09IDEwMSkge1xuICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih3cywgJ1JlY2VpdmVkIG5ldHdvcmsgZXJyb3Igb3Igbm9uLTEwMSBzdGF0dXMgY29kZS4nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gMi4gSWYgcHJvdG9jb2xzIGlzIG5vdCB0aGUgZW1wdHkgbGlzdCBhbmQgZXh0cmFjdGluZyBoZWFkZXJcbiAgICAgIC8vICAgIGxpc3QgdmFsdWVzIGdpdmVuIGBTZWMtV2ViU29ja2V0LVByb3RvY29sYCBhbmQgcmVzcG9uc2XigJlzXG4gICAgICAvLyAgICBoZWFkZXIgbGlzdCByZXN1bHRzIGluIG51bGwsIGZhaWx1cmUsIG9yIHRoZSBlbXB0eSBieXRlXG4gICAgICAvLyAgICBzZXF1ZW5jZSwgdGhlbiBmYWlsIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbi5cbiAgICAgIGlmIChwcm90b2NvbHMubGVuZ3RoICE9PSAwICYmICFyZXNwb25zZS5oZWFkZXJzTGlzdC5nZXQoJ1NlYy1XZWJTb2NrZXQtUHJvdG9jb2wnKSkge1xuICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih3cywgJ1NlcnZlciBkaWQgbm90IHJlc3BvbmQgd2l0aCBzZW50IHByb3RvY29scy4nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gMy4gRm9sbG93IHRoZSByZXF1aXJlbWVudHMgc3RhdGVkIHN0ZXAgMiB0byBzdGVwIDYsIGluY2x1c2l2ZSxcbiAgICAgIC8vICAgIG9mIHRoZSBsYXN0IHNldCBvZiBzdGVwcyBpbiBzZWN0aW9uIDQuMSBvZiBUaGUgV2ViU29ja2V0XG4gICAgICAvLyAgICBQcm90b2NvbCB0byB2YWxpZGF0ZSByZXNwb25zZS4gVGhpcyBlaXRoZXIgcmVzdWx0cyBpbiBmYWlsXG4gICAgICAvLyAgICB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gb3IgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIGlzXG4gICAgICAvLyAgICBlc3RhYmxpc2hlZC5cblxuICAgICAgLy8gMi4gSWYgdGhlIHJlc3BvbnNlIGxhY2tzIGFuIHxVcGdyYWRlfCBoZWFkZXIgZmllbGQgb3IgdGhlIHxVcGdyYWRlfFxuICAgICAgLy8gICAgaGVhZGVyIGZpZWxkIGNvbnRhaW5zIGEgdmFsdWUgdGhhdCBpcyBub3QgYW4gQVNDSUkgY2FzZS1cbiAgICAgIC8vICAgIGluc2Vuc2l0aXZlIG1hdGNoIGZvciB0aGUgdmFsdWUgXCJ3ZWJzb2NrZXRcIiwgdGhlIGNsaWVudCBNVVNUXG4gICAgICAvLyAgICBfRmFpbCB0aGUgV2ViU29ja2V0IENvbm5lY3Rpb25fLlxuICAgICAgaWYgKHJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgnVXBncmFkZScpPy50b0xvd2VyQ2FzZSgpICE9PSAnd2Vic29ja2V0Jykge1xuICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih3cywgJ1NlcnZlciBkaWQgbm90IHNldCBVcGdyYWRlIGhlYWRlciB0byBcIndlYnNvY2tldFwiLicpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyAzLiBJZiB0aGUgcmVzcG9uc2UgbGFja3MgYSB8Q29ubmVjdGlvbnwgaGVhZGVyIGZpZWxkIG9yIHRoZVxuICAgICAgLy8gICAgfENvbm5lY3Rpb258IGhlYWRlciBmaWVsZCBkb2Vzbid0IGNvbnRhaW4gYSB0b2tlbiB0aGF0IGlzIGFuXG4gICAgICAvLyAgICBBU0NJSSBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoIGZvciB0aGUgdmFsdWUgXCJVcGdyYWRlXCIsIHRoZSBjbGllbnRcbiAgICAgIC8vICAgIE1VU1QgX0ZhaWwgdGhlIFdlYlNvY2tldCBDb25uZWN0aW9uXy5cbiAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzTGlzdC5nZXQoJ0Nvbm5lY3Rpb24nKT8udG9Mb3dlckNhc2UoKSAhPT0gJ3VwZ3JhZGUnKSB7XG4gICAgICAgIGZhaWxXZWJzb2NrZXRDb25uZWN0aW9uKHdzLCAnU2VydmVyIGRpZCBub3Qgc2V0IENvbm5lY3Rpb24gaGVhZGVyIHRvIFwidXBncmFkZVwiLicpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyA0LiBJZiB0aGUgcmVzcG9uc2UgbGFja3MgYSB8U2VjLVdlYlNvY2tldC1BY2NlcHR8IGhlYWRlciBmaWVsZCBvclxuICAgICAgLy8gICAgdGhlIHxTZWMtV2ViU29ja2V0LUFjY2VwdHwgY29udGFpbnMgYSB2YWx1ZSBvdGhlciB0aGFuIHRoZVxuICAgICAgLy8gICAgYmFzZTY0LWVuY29kZWQgU0hBLTEgb2YgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHxTZWMtV2ViU29ja2V0LVxuICAgICAgLy8gICAgS2V5fCAoYXMgYSBzdHJpbmcsIG5vdCBiYXNlNjQtZGVjb2RlZCkgd2l0aCB0aGUgc3RyaW5nIFwiMjU4RUFGQTUtXG4gICAgICAvLyAgICBFOTE0LTQ3REEtOTVDQS1DNUFCMERDODVCMTFcIiBidXQgaWdub3JpbmcgYW55IGxlYWRpbmcgYW5kXG4gICAgICAvLyAgICB0cmFpbGluZyB3aGl0ZXNwYWNlLCB0aGUgY2xpZW50IE1VU1QgX0ZhaWwgdGhlIFdlYlNvY2tldFxuICAgICAgLy8gICAgQ29ubmVjdGlvbl8uXG4gICAgICBjb25zdCBzZWNXU0FjY2VwdCA9IHJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgnU2VjLVdlYlNvY2tldC1BY2NlcHQnKVxuICAgICAgY29uc3QgZGlnZXN0ID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTEnKS51cGRhdGUoa2V5VmFsdWUgKyB1aWQpLmRpZ2VzdCgnYmFzZTY0JylcbiAgICAgIGlmIChzZWNXU0FjY2VwdCAhPT0gZGlnZXN0KSB7XG4gICAgICAgIGZhaWxXZWJzb2NrZXRDb25uZWN0aW9uKHdzLCAnSW5jb3JyZWN0IGhhc2ggcmVjZWl2ZWQgaW4gU2VjLVdlYlNvY2tldC1BY2NlcHQgaGVhZGVyLicpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyA1LiBJZiB0aGUgcmVzcG9uc2UgaW5jbHVkZXMgYSB8U2VjLVdlYlNvY2tldC1FeHRlbnNpb25zfCBoZWFkZXJcbiAgICAgIC8vICAgIGZpZWxkIGFuZCB0aGlzIGhlYWRlciBmaWVsZCBpbmRpY2F0ZXMgdGhlIHVzZSBvZiBhbiBleHRlbnNpb25cbiAgICAgIC8vICAgIHRoYXQgd2FzIG5vdCBwcmVzZW50IGluIHRoZSBjbGllbnQncyBoYW5kc2hha2UgKHRoZSBzZXJ2ZXIgaGFzXG4gICAgICAvLyAgICBpbmRpY2F0ZWQgYW4gZXh0ZW5zaW9uIG5vdCByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudCksIHRoZSBjbGllbnRcbiAgICAgIC8vICAgIE1VU1QgX0ZhaWwgdGhlIFdlYlNvY2tldCBDb25uZWN0aW9uXy4gIChUaGUgcGFyc2luZyBvZiB0aGlzXG4gICAgICAvLyAgICBoZWFkZXIgZmllbGQgdG8gZGV0ZXJtaW5lIHdoaWNoIGV4dGVuc2lvbnMgYXJlIHJlcXVlc3RlZCBpc1xuICAgICAgLy8gICAgZGlzY3Vzc2VkIGluIFNlY3Rpb24gOS4xLilcbiAgICAgIGNvbnN0IHNlY0V4dGVuc2lvbiA9IHJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgnU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zJylcblxuICAgICAgaWYgKHNlY0V4dGVuc2lvbiAhPT0gbnVsbCAmJiBzZWNFeHRlbnNpb24gIT09IHBlcm1lc3NhZ2VEZWZsYXRlKSB7XG4gICAgICAgIGZhaWxXZWJzb2NrZXRDb25uZWN0aW9uKHdzLCAnUmVjZWl2ZWQgZGlmZmVyZW50IHBlcm1lc3NhZ2UtZGVmbGF0ZSB0aGFuIHRoZSBvbmUgc2V0LicpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyA2LiBJZiB0aGUgcmVzcG9uc2UgaW5jbHVkZXMgYSB8U2VjLVdlYlNvY2tldC1Qcm90b2NvbHwgaGVhZGVyIGZpZWxkXG4gICAgICAvLyAgICBhbmQgdGhpcyBoZWFkZXIgZmllbGQgaW5kaWNhdGVzIHRoZSB1c2Ugb2YgYSBzdWJwcm90b2NvbCB0aGF0IHdhc1xuICAgICAgLy8gICAgbm90IHByZXNlbnQgaW4gdGhlIGNsaWVudCdzIGhhbmRzaGFrZSAodGhlIHNlcnZlciBoYXMgaW5kaWNhdGVkIGFcbiAgICAgIC8vICAgIHN1YnByb3RvY29sIG5vdCByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudCksIHRoZSBjbGllbnQgTVVTVCBfRmFpbFxuICAgICAgLy8gICAgdGhlIFdlYlNvY2tldCBDb25uZWN0aW9uXy5cbiAgICAgIGNvbnN0IHNlY1Byb3RvY29sID0gcmVzcG9uc2UuaGVhZGVyc0xpc3QuZ2V0KCdTZWMtV2ViU29ja2V0LVByb3RvY29sJylcblxuICAgICAgaWYgKHNlY1Byb3RvY29sICE9PSBudWxsICYmIHNlY1Byb3RvY29sICE9PSByZXF1ZXN0LmhlYWRlcnNMaXN0LmdldCgnU2VjLVdlYlNvY2tldC1Qcm90b2NvbCcpKSB7XG4gICAgICAgIGZhaWxXZWJzb2NrZXRDb25uZWN0aW9uKHdzLCAnUHJvdG9jb2wgd2FzIG5vdCBzZXQgaW4gdGhlIG9wZW5pbmcgaGFuZHNoYWtlLicpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICByZXNwb25zZS5zb2NrZXQub24oJ2RhdGEnLCBvblNvY2tldERhdGEpXG4gICAgICByZXNwb25zZS5zb2NrZXQub24oJ2Nsb3NlJywgb25Tb2NrZXRDbG9zZSlcbiAgICAgIHJlc3BvbnNlLnNvY2tldC5vbignZXJyb3InLCBvblNvY2tldEVycm9yKVxuXG4gICAgICBpZiAoY2hhbm5lbHMub3Blbi5oYXNTdWJzY3JpYmVycykge1xuICAgICAgICBjaGFubmVscy5vcGVuLnB1Ymxpc2goe1xuICAgICAgICAgIGFkZHJlc3M6IHJlc3BvbnNlLnNvY2tldC5hZGRyZXNzKCksXG4gICAgICAgICAgcHJvdG9jb2w6IHNlY1Byb3RvY29sLFxuICAgICAgICAgIGV4dGVuc2lvbnM6IHNlY0V4dGVuc2lvblxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBvbkVzdGFibGlzaChyZXNwb25zZSlcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIGNvbnRyb2xsZXJcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlcn0gY2h1bmtcbiAqL1xuZnVuY3Rpb24gb25Tb2NrZXREYXRhIChjaHVuaykge1xuICBpZiAoIXRoaXMud3Nba0J5dGVQYXJzZXJdLndyaXRlKGNodW5rKSkge1xuICAgIHRoaXMucGF1c2UoKVxuICB9XG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3dlYnNvY2tldHMuc3BlYy53aGF0d2cub3JnLyNmZWVkYmFjay1mcm9tLXRoZS1wcm90b2NvbFxuICogQHNlZSBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzY0NTUjc2VjdGlvbi03LjEuNFxuICovXG5mdW5jdGlvbiBvblNvY2tldENsb3NlICgpIHtcbiAgY29uc3QgeyB3cyB9ID0gdGhpc1xuXG4gIC8vIElmIHRoZSBUQ1AgY29ubmVjdGlvbiB3YXMgY2xvc2VkIGFmdGVyIHRoZVxuICAvLyBXZWJTb2NrZXQgY2xvc2luZyBoYW5kc2hha2Ugd2FzIGNvbXBsZXRlZCwgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uXG4gIC8vIGlzIHNhaWQgdG8gaGF2ZSBiZWVuIGNsb3NlZCBfY2xlYW5seV8uXG4gIGNvbnN0IHdhc0NsZWFuID0gd3Nba1NlbnRDbG9zZV0gJiYgd3Nba1JlY2VpdmVkQ2xvc2VdXG5cbiAgbGV0IGNvZGUgPSAxMDA1XG4gIGxldCByZWFzb24gPSAnJ1xuXG4gIGNvbnN0IHJlc3VsdCA9IHdzW2tCeXRlUGFyc2VyXS5jbG9zaW5nSW5mb1xuXG4gIGlmIChyZXN1bHQpIHtcbiAgICBjb2RlID0gcmVzdWx0LmNvZGUgPz8gMTAwNVxuICAgIHJlYXNvbiA9IHJlc3VsdC5yZWFzb25cbiAgfSBlbHNlIGlmICghd3Nba1NlbnRDbG9zZV0pIHtcbiAgICAvLyBJZiBfVGhlIFdlYlNvY2tldFxuICAgIC8vIENvbm5lY3Rpb24gaXMgQ2xvc2VkXyBhbmQgbm8gQ2xvc2UgY29udHJvbCBmcmFtZSB3YXMgcmVjZWl2ZWQgYnkgdGhlXG4gICAgLy8gZW5kcG9pbnQgKHN1Y2ggYXMgY291bGQgb2NjdXIgaWYgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGNvbm5lY3Rpb25cbiAgICAvLyBpcyBsb3N0KSwgX1RoZSBXZWJTb2NrZXQgQ29ubmVjdGlvbiBDbG9zZSBDb2RlXyBpcyBjb25zaWRlcmVkIHRvIGJlXG4gICAgLy8gMTAwNi5cbiAgICBjb2RlID0gMTAwNlxuICB9XG5cbiAgLy8gMS4gQ2hhbmdlIHRoZSByZWFkeSBzdGF0ZSB0byBDTE9TRUQgKDMpLlxuICB3c1trUmVhZHlTdGF0ZV0gPSBzdGF0ZXMuQ0xPU0VEXG5cbiAgLy8gMi4gSWYgdGhlIHVzZXIgYWdlbnQgd2FzIHJlcXVpcmVkIHRvIGZhaWwgdGhlIFdlYlNvY2tldFxuICAvLyAgICBjb25uZWN0aW9uLCBvciBpZiB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gd2FzIGNsb3NlZFxuICAvLyAgICBhZnRlciBiZWluZyBmbGFnZ2VkIGFzIGZ1bGwsIGZpcmUgYW4gZXZlbnQgbmFtZWQgZXJyb3JcbiAgLy8gICAgYXQgdGhlIFdlYlNvY2tldCBvYmplY3QuXG4gIC8vIFRPRE9cblxuICAvLyAzLiBGaXJlIGFuIGV2ZW50IG5hbWVkIGNsb3NlIGF0IHRoZSBXZWJTb2NrZXQgb2JqZWN0LFxuICAvLyAgICB1c2luZyBDbG9zZUV2ZW50LCB3aXRoIHRoZSB3YXNDbGVhbiBhdHRyaWJ1dGVcbiAgLy8gICAgaW5pdGlhbGl6ZWQgdG8gdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBjbG9zZWQgY2xlYW5seVxuICAvLyAgICBhbmQgZmFsc2Ugb3RoZXJ3aXNlLCB0aGUgY29kZSBhdHRyaWJ1dGUgaW5pdGlhbGl6ZWQgdG9cbiAgLy8gICAgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIGNsb3NlIGNvZGUsIGFuZCB0aGUgcmVhc29uXG4gIC8vICAgIGF0dHJpYnV0ZSBpbml0aWFsaXplZCB0byB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIFVURi04XG4gIC8vICAgIGRlY29kZSB3aXRob3V0IEJPTSB0byB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gY2xvc2VcbiAgLy8gICAgcmVhc29uLlxuICBmaXJlRXZlbnQoJ2Nsb3NlJywgd3MsIENsb3NlRXZlbnQsIHtcbiAgICB3YXNDbGVhbiwgY29kZSwgcmVhc29uXG4gIH0pXG5cbiAgaWYgKGNoYW5uZWxzLmNsb3NlLmhhc1N1YnNjcmliZXJzKSB7XG4gICAgY2hhbm5lbHMuY2xvc2UucHVibGlzaCh7XG4gICAgICB3ZWJzb2NrZXQ6IHdzLFxuICAgICAgY29kZSxcbiAgICAgIHJlYXNvblxuICAgIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gb25Tb2NrZXRFcnJvciAoZXJyb3IpIHtcbiAgY29uc3QgeyB3cyB9ID0gdGhpc1xuXG4gIHdzW2tSZWFkeVN0YXRlXSA9IHN0YXRlcy5DTE9TSU5HXG5cbiAgaWYgKGNoYW5uZWxzLnNvY2tldEVycm9yLmhhc1N1YnNjcmliZXJzKSB7XG4gICAgY2hhbm5lbHMuc29ja2V0RXJyb3IucHVibGlzaChlcnJvcilcbiAgfVxuXG4gIHRoaXMuZGVzdHJveSgpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBlc3RhYmxpc2hXZWJTb2NrZXRDb25uZWN0aW9uXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBtYXhVbnNpZ25lZDE2Qml0IH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5cbi8qKiBAdHlwZSB7aW1wb3J0KCdjcnlwdG8nKX0gKi9cbmxldCBjcnlwdG9cbnRyeSB7XG4gIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpXG59IGNhdGNoIHtcblxufVxuXG5jbGFzcyBXZWJzb2NrZXRGcmFtZVNlbmQge1xuICAvKipcbiAgICogQHBhcmFtIHtCdWZmZXJ8dW5kZWZpbmVkfSBkYXRhXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoZGF0YSkge1xuICAgIHRoaXMuZnJhbWVEYXRhID0gZGF0YVxuICAgIHRoaXMubWFza0tleSA9IGNyeXB0by5yYW5kb21CeXRlcyg0KVxuICB9XG5cbiAgY3JlYXRlRnJhbWUgKG9wY29kZSkge1xuICAgIGNvbnN0IGJvZHlMZW5ndGggPSB0aGlzLmZyYW1lRGF0YT8uYnl0ZUxlbmd0aCA/PyAwXG5cbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICBsZXQgcGF5bG9hZExlbmd0aCA9IGJvZHlMZW5ndGggLy8gMC0xMjVcbiAgICBsZXQgb2Zmc2V0ID0gNlxuXG4gICAgaWYgKGJvZHlMZW5ndGggPiBtYXhVbnNpZ25lZDE2Qml0KSB7XG4gICAgICBvZmZzZXQgKz0gOCAvLyBwYXlsb2FkIGxlbmd0aCBpcyBuZXh0IDggYnl0ZXNcbiAgICAgIHBheWxvYWRMZW5ndGggPSAxMjdcbiAgICB9IGVsc2UgaWYgKGJvZHlMZW5ndGggPiAxMjUpIHtcbiAgICAgIG9mZnNldCArPSAyIC8vIHBheWxvYWQgbGVuZ3RoIGlzIG5leHQgMiBieXRlc1xuICAgICAgcGF5bG9hZExlbmd0aCA9IDEyNlxuICAgIH1cblxuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShib2R5TGVuZ3RoICsgb2Zmc2V0KVxuXG4gICAgLy8gQ2xlYXIgZmlyc3QgMiBieXRlcywgZXZlcnl0aGluZyBlbHNlIGlzIG92ZXJ3cml0dGVuXG4gICAgYnVmZmVyWzBdID0gYnVmZmVyWzFdID0gMFxuICAgIGJ1ZmZlclswXSB8PSAweDgwIC8vIEZJTlxuICAgIGJ1ZmZlclswXSA9IChidWZmZXJbMF0gJiAweEYwKSArIG9wY29kZSAvLyBvcGNvZGVcblxuICAgIC8qISB3cy4gTUlUIExpY2Vuc2UuIEVpbmFyIE90dG8gU3Rhbmd2aWsgPGVpbmFyb3NAZ21haWwuY29tPiAqL1xuICAgIGJ1ZmZlcltvZmZzZXQgLSA0XSA9IHRoaXMubWFza0tleVswXVxuICAgIGJ1ZmZlcltvZmZzZXQgLSAzXSA9IHRoaXMubWFza0tleVsxXVxuICAgIGJ1ZmZlcltvZmZzZXQgLSAyXSA9IHRoaXMubWFza0tleVsyXVxuICAgIGJ1ZmZlcltvZmZzZXQgLSAxXSA9IHRoaXMubWFza0tleVszXVxuXG4gICAgYnVmZmVyWzFdID0gcGF5bG9hZExlbmd0aFxuXG4gICAgaWYgKHBheWxvYWRMZW5ndGggPT09IDEyNikge1xuICAgICAgYnVmZmVyLndyaXRlVUludDE2QkUoYm9keUxlbmd0aCwgMilcbiAgICB9IGVsc2UgaWYgKHBheWxvYWRMZW5ndGggPT09IDEyNykge1xuICAgICAgLy8gQ2xlYXIgZXh0ZW5kZWQgcGF5bG9hZCBsZW5ndGhcbiAgICAgIGJ1ZmZlclsyXSA9IGJ1ZmZlclszXSA9IDBcbiAgICAgIGJ1ZmZlci53cml0ZVVJbnRCRShib2R5TGVuZ3RoLCA0LCA2KVxuICAgIH1cblxuICAgIGJ1ZmZlclsxXSB8PSAweDgwIC8vIE1BU0tcblxuICAgIC8vIG1hc2sgYm9keVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm9keUxlbmd0aDsgaSsrKSB7XG4gICAgICBidWZmZXJbb2Zmc2V0ICsgaV0gPSB0aGlzLmZyYW1lRGF0YVtpXSBeIHRoaXMubWFza0tleVtpICUgNF1cbiAgICB9XG5cbiAgICByZXR1cm4gYnVmZmVyXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIFdlYnNvY2tldEZyYW1lU2VuZFxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgV3JpdGFibGUgfSA9IHJlcXVpcmUoJ3N0cmVhbScpXG5jb25zdCBkaWFnbm9zdGljc0NoYW5uZWwgPSByZXF1aXJlKCdkaWFnbm9zdGljc19jaGFubmVsJylcbmNvbnN0IHsgcGFyc2VyU3RhdGVzLCBvcGNvZGVzLCBzdGF0ZXMsIGVtcHR5QnVmZmVyIH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5jb25zdCB7IGtSZWFkeVN0YXRlLCBrU2VudENsb3NlLCBrUmVzcG9uc2UsIGtSZWNlaXZlZENsb3NlIH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgeyBpc1ZhbGlkU3RhdHVzQ29kZSwgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24sIHdlYnNvY2tldE1lc3NhZ2VSZWNlaXZlZCB9ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHsgV2Vic29ja2V0RnJhbWVTZW5kIH0gPSByZXF1aXJlKCcuL2ZyYW1lJylcblxuLy8gVGhpcyBjb2RlIHdhcyBpbmZsdWVuY2VkIGJ5IHdzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbi8vIENvcHlyaWdodCAoYykgMjAxMSBFaW5hciBPdHRvIFN0YW5ndmlrIDxlaW5hcm9zQGdtYWlsLmNvbT5cbi8vIENvcHlyaWdodCAoYykgMjAxMyBBcm5vdXQgS2F6ZW1pZXIgYW5kIGNvbnRyaWJ1dG9yc1xuLy8gQ29weXJpZ2h0IChjKSAyMDE2IEx1aWdpIFBpbmNhIGFuZCBjb250cmlidXRvcnNcblxuY29uc3QgY2hhbm5lbHMgPSB7fVxuY2hhbm5lbHMucGluZyA9IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6d2Vic29ja2V0OnBpbmcnKVxuY2hhbm5lbHMucG9uZyA9IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6d2Vic29ja2V0OnBvbmcnKVxuXG5jbGFzcyBCeXRlUGFyc2VyIGV4dGVuZHMgV3JpdGFibGUge1xuICAjYnVmZmVycyA9IFtdXG4gICNieXRlT2Zmc2V0ID0gMFxuXG4gICNzdGF0ZSA9IHBhcnNlclN0YXRlcy5JTkZPXG5cbiAgI2luZm8gPSB7fVxuICAjZnJhZ21lbnRzID0gW11cblxuICBjb25zdHJ1Y3RvciAod3MpIHtcbiAgICBzdXBlcigpXG5cbiAgICB0aGlzLndzID0gd3NcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gY2h1bmtcbiAgICogQHBhcmFtIHsoKSA9PiB2b2lkfSBjYWxsYmFja1xuICAgKi9cbiAgX3dyaXRlIChjaHVuaywgXywgY2FsbGJhY2spIHtcbiAgICB0aGlzLiNidWZmZXJzLnB1c2goY2h1bmspXG4gICAgdGhpcy4jYnl0ZU9mZnNldCArPSBjaHVuay5sZW5ndGhcblxuICAgIHRoaXMucnVuKGNhbGxiYWNrKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgd2hlbmV2ZXIgYSBuZXcgY2h1bmsgaXMgcmVjZWl2ZWQuXG4gICAqIENhbGxiYWNrIGlzIGNhbGxlZCB3aGVuZXZlciB0aGVyZSBhcmUgbm8gbW9yZSBjaHVua3MgYnVmZmVyaW5nLFxuICAgKiBvciBub3QgZW5vdWdoIGJ5dGVzIGFyZSBidWZmZXJlZCB0byBwYXJzZS5cbiAgICovXG4gIHJ1biAoY2FsbGJhY2spIHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKHRoaXMuI3N0YXRlID09PSBwYXJzZXJTdGF0ZXMuSU5GTykge1xuICAgICAgICAvLyBJZiB0aGVyZSBhcmVuJ3QgZW5vdWdoIGJ5dGVzIHRvIHBhcnNlIHRoZSBwYXlsb2FkIGxlbmd0aCwgZXRjLlxuICAgICAgICBpZiAodGhpcy4jYnl0ZU9mZnNldCA8IDIpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5jb25zdW1lKDIpXG5cbiAgICAgICAgdGhpcy4jaW5mby5maW4gPSAoYnVmZmVyWzBdICYgMHg4MCkgIT09IDBcbiAgICAgICAgdGhpcy4jaW5mby5vcGNvZGUgPSBidWZmZXJbMF0gJiAweDBGXG5cbiAgICAgICAgLy8gSWYgd2UgcmVjZWl2ZSBhIGZyYWdtZW50ZWQgbWVzc2FnZSwgd2UgdXNlIHRoZSB0eXBlIG9mIHRoZSBmaXJzdFxuICAgICAgICAvLyBmcmFtZSB0byBwYXJzZSB0aGUgZnVsbCBtZXNzYWdlIGFzIGJpbmFyeS90ZXh0LCB3aGVuIGl0J3MgdGVybWluYXRlZFxuICAgICAgICB0aGlzLiNpbmZvLm9yaWdpbmFsT3Bjb2RlID8/PSB0aGlzLiNpbmZvLm9wY29kZVxuXG4gICAgICAgIHRoaXMuI2luZm8uZnJhZ21lbnRlZCA9ICF0aGlzLiNpbmZvLmZpbiAmJiB0aGlzLiNpbmZvLm9wY29kZSAhPT0gb3Bjb2Rlcy5DT05USU5VQVRJT05cblxuICAgICAgICBpZiAodGhpcy4jaW5mby5mcmFnbWVudGVkICYmIHRoaXMuI2luZm8ub3Bjb2RlICE9PSBvcGNvZGVzLkJJTkFSWSAmJiB0aGlzLiNpbmZvLm9wY29kZSAhPT0gb3Bjb2Rlcy5URVhUKSB7XG4gICAgICAgICAgLy8gT25seSB0ZXh0IGFuZCBiaW5hcnkgZnJhbWVzIGNhbiBiZSBmcmFnbWVudGVkXG4gICAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24odGhpcy53cywgJ0ludmFsaWQgZnJhbWUgdHlwZSB3YXMgZnJhZ21lbnRlZC4nKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGF5bG9hZExlbmd0aCA9IGJ1ZmZlclsxXSAmIDB4N0ZcblxuICAgICAgICBpZiAocGF5bG9hZExlbmd0aCA8PSAxMjUpIHtcbiAgICAgICAgICB0aGlzLiNpbmZvLnBheWxvYWRMZW5ndGggPSBwYXlsb2FkTGVuZ3RoXG4gICAgICAgICAgdGhpcy4jc3RhdGUgPSBwYXJzZXJTdGF0ZXMuUkVBRF9EQVRBXG4gICAgICAgIH0gZWxzZSBpZiAocGF5bG9hZExlbmd0aCA9PT0gMTI2KSB7XG4gICAgICAgICAgdGhpcy4jc3RhdGUgPSBwYXJzZXJTdGF0ZXMuUEFZTE9BRExFTkdUSF8xNlxuICAgICAgICB9IGVsc2UgaWYgKHBheWxvYWRMZW5ndGggPT09IDEyNykge1xuICAgICAgICAgIHRoaXMuI3N0YXRlID0gcGFyc2VyU3RhdGVzLlBBWUxPQURMRU5HVEhfNjRcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLiNpbmZvLmZyYWdtZW50ZWQgJiYgcGF5bG9hZExlbmd0aCA+IDEyNSkge1xuICAgICAgICAgIC8vIEEgZnJhZ21lbnRlZCBmcmFtZSBjYW4ndCBiZSBmcmFnbWVudGVkIGl0c2VsZlxuICAgICAgICAgIGZhaWxXZWJzb2NrZXRDb25uZWN0aW9uKHRoaXMud3MsICdGcmFnbWVudGVkIGZyYW1lIGV4Y2VlZGVkIDEyNSBieXRlcy4nKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICh0aGlzLiNpbmZvLm9wY29kZSA9PT0gb3Bjb2Rlcy5QSU5HIHx8XG4gICAgICAgICAgICB0aGlzLiNpbmZvLm9wY29kZSA9PT0gb3Bjb2Rlcy5QT05HIHx8XG4gICAgICAgICAgICB0aGlzLiNpbmZvLm9wY29kZSA9PT0gb3Bjb2Rlcy5DTE9TRSkgJiZcbiAgICAgICAgICBwYXlsb2FkTGVuZ3RoID4gMTI1XG4gICAgICAgICkge1xuICAgICAgICAgIC8vIENvbnRyb2wgZnJhbWVzIGNhbiBoYXZlIGEgcGF5bG9hZCBsZW5ndGggb2YgMTI1IGJ5dGVzIE1BWFxuICAgICAgICAgIGZhaWxXZWJzb2NrZXRDb25uZWN0aW9uKHRoaXMud3MsICdQYXlsb2FkIGxlbmd0aCBmb3IgY29udHJvbCBmcmFtZSBleGNlZWRlZCAxMjUgYnl0ZXMuJylcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLiNpbmZvLm9wY29kZSA9PT0gb3Bjb2Rlcy5DTE9TRSkge1xuICAgICAgICAgIGlmIChwYXlsb2FkTGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih0aGlzLndzLCAnUmVjZWl2ZWQgY2xvc2UgZnJhbWUgd2l0aCBhIDEtYnl0ZSBib2R5LicpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBib2R5ID0gdGhpcy5jb25zdW1lKHBheWxvYWRMZW5ndGgpXG5cbiAgICAgICAgICB0aGlzLiNpbmZvLmNsb3NlSW5mbyA9IHRoaXMucGFyc2VDbG9zZUJvZHkoZmFsc2UsIGJvZHkpXG5cbiAgICAgICAgICBpZiAoIXRoaXMud3Nba1NlbnRDbG9zZV0pIHtcbiAgICAgICAgICAgIC8vIElmIGFuIGVuZHBvaW50IHJlY2VpdmVzIGEgQ2xvc2UgZnJhbWUgYW5kIGRpZCBub3QgcHJldmlvdXNseSBzZW5kIGFcbiAgICAgICAgICAgIC8vIENsb3NlIGZyYW1lLCB0aGUgZW5kcG9pbnQgTVVTVCBzZW5kIGEgQ2xvc2UgZnJhbWUgaW4gcmVzcG9uc2UuICAoV2hlblxuICAgICAgICAgICAgLy8gc2VuZGluZyBhIENsb3NlIGZyYW1lIGluIHJlc3BvbnNlLCB0aGUgZW5kcG9pbnQgdHlwaWNhbGx5IGVjaG9zIHRoZVxuICAgICAgICAgICAgLy8gc3RhdHVzIGNvZGUgaXQgcmVjZWl2ZWQuKVxuICAgICAgICAgICAgY29uc3QgYm9keSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgyKVxuICAgICAgICAgICAgYm9keS53cml0ZVVJbnQxNkJFKHRoaXMuI2luZm8uY2xvc2VJbmZvLmNvZGUsIDApXG4gICAgICAgICAgICBjb25zdCBjbG9zZUZyYW1lID0gbmV3IFdlYnNvY2tldEZyYW1lU2VuZChib2R5KVxuXG4gICAgICAgICAgICB0aGlzLndzW2tSZXNwb25zZV0uc29ja2V0LndyaXRlKFxuICAgICAgICAgICAgICBjbG9zZUZyYW1lLmNyZWF0ZUZyYW1lKG9wY29kZXMuQ0xPU0UpLFxuICAgICAgICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFlcnIpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMud3Nba1NlbnRDbG9zZV0gPSB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVXBvbiBlaXRoZXIgc2VuZGluZyBvciByZWNlaXZpbmcgYSBDbG9zZSBjb250cm9sIGZyYW1lLCBpdCBpcyBzYWlkXG4gICAgICAgICAgLy8gdGhhdCBfVGhlIFdlYlNvY2tldCBDbG9zaW5nIEhhbmRzaGFrZSBpcyBTdGFydGVkXyBhbmQgdGhhdCB0aGVcbiAgICAgICAgICAvLyBXZWJTb2NrZXQgY29ubmVjdGlvbiBpcyBpbiB0aGUgQ0xPU0lORyBzdGF0ZS5cbiAgICAgICAgICB0aGlzLndzW2tSZWFkeVN0YXRlXSA9IHN0YXRlcy5DTE9TSU5HXG4gICAgICAgICAgdGhpcy53c1trUmVjZWl2ZWRDbG9zZV0gPSB0cnVlXG5cbiAgICAgICAgICB0aGlzLmVuZCgpXG5cbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLiNpbmZvLm9wY29kZSA9PT0gb3Bjb2Rlcy5QSU5HKSB7XG4gICAgICAgICAgLy8gVXBvbiByZWNlaXB0IG9mIGEgUGluZyBmcmFtZSwgYW4gZW5kcG9pbnQgTVVTVCBzZW5kIGEgUG9uZyBmcmFtZSBpblxuICAgICAgICAgIC8vIHJlc3BvbnNlLCB1bmxlc3MgaXQgYWxyZWFkeSByZWNlaXZlZCBhIENsb3NlIGZyYW1lLlxuICAgICAgICAgIC8vIEEgUG9uZyBmcmFtZSBzZW50IGluIHJlc3BvbnNlIHRvIGEgUGluZyBmcmFtZSBtdXN0IGhhdmUgaWRlbnRpY2FsXG4gICAgICAgICAgLy8gXCJBcHBsaWNhdGlvbiBkYXRhXCJcblxuICAgICAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLmNvbnN1bWUocGF5bG9hZExlbmd0aClcblxuICAgICAgICAgIGlmICghdGhpcy53c1trUmVjZWl2ZWRDbG9zZV0pIHtcbiAgICAgICAgICAgIGNvbnN0IGZyYW1lID0gbmV3IFdlYnNvY2tldEZyYW1lU2VuZChib2R5KVxuXG4gICAgICAgICAgICB0aGlzLndzW2tSZXNwb25zZV0uc29ja2V0LndyaXRlKGZyYW1lLmNyZWF0ZUZyYW1lKG9wY29kZXMuUE9ORykpXG5cbiAgICAgICAgICAgIGlmIChjaGFubmVscy5waW5nLmhhc1N1YnNjcmliZXJzKSB7XG4gICAgICAgICAgICAgIGNoYW5uZWxzLnBpbmcucHVibGlzaCh7XG4gICAgICAgICAgICAgICAgcGF5bG9hZDogYm9keVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuI3N0YXRlID0gcGFyc2VyU3RhdGVzLklORk9cblxuICAgICAgICAgIGlmICh0aGlzLiNieXRlT2Zmc2V0ID4gMCkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FsbGJhY2soKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuI2luZm8ub3Bjb2RlID09PSBvcGNvZGVzLlBPTkcpIHtcbiAgICAgICAgICAvLyBBIFBvbmcgZnJhbWUgTUFZIGJlIHNlbnQgdW5zb2xpY2l0ZWQuICBUaGlzIHNlcnZlcyBhcyBhXG4gICAgICAgICAgLy8gdW5pZGlyZWN0aW9uYWwgaGVhcnRiZWF0LiAgQSByZXNwb25zZSB0byBhbiB1bnNvbGljaXRlZCBQb25nIGZyYW1lIGlzXG4gICAgICAgICAgLy8gbm90IGV4cGVjdGVkLlxuXG4gICAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuY29uc3VtZShwYXlsb2FkTGVuZ3RoKVxuXG4gICAgICAgICAgaWYgKGNoYW5uZWxzLnBvbmcuaGFzU3Vic2NyaWJlcnMpIHtcbiAgICAgICAgICAgIGNoYW5uZWxzLnBvbmcucHVibGlzaCh7XG4gICAgICAgICAgICAgIHBheWxvYWQ6IGJvZHlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMuI2J5dGVPZmZzZXQgPiAwKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy4jc3RhdGUgPT09IHBhcnNlclN0YXRlcy5QQVlMT0FETEVOR1RIXzE2KSB7XG4gICAgICAgIGlmICh0aGlzLiNieXRlT2Zmc2V0IDwgMikge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmNvbnN1bWUoMilcblxuICAgICAgICB0aGlzLiNpbmZvLnBheWxvYWRMZW5ndGggPSBidWZmZXIucmVhZFVJbnQxNkJFKDApXG4gICAgICAgIHRoaXMuI3N0YXRlID0gcGFyc2VyU3RhdGVzLlJFQURfREFUQVxuICAgICAgfSBlbHNlIGlmICh0aGlzLiNzdGF0ZSA9PT0gcGFyc2VyU3RhdGVzLlBBWUxPQURMRU5HVEhfNjQpIHtcbiAgICAgICAgaWYgKHRoaXMuI2J5dGVPZmZzZXQgPCA4KSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuY29uc3VtZSg4KVxuICAgICAgICBjb25zdCB1cHBlciA9IGJ1ZmZlci5yZWFkVUludDMyQkUoMClcblxuICAgICAgICAvLyAyXjMxIGlzIHRoZSBtYXhpbmltdW0gYnl0ZXMgYW4gYXJyYXlidWZmZXIgY2FuIGNvbnRhaW5cbiAgICAgICAgLy8gb24gMzItYml0IHN5c3RlbXMuIEFsdGhvdWdoLCBvbiA2NC1iaXQgc3lzdGVtcywgdGhpcyBpc1xuICAgICAgICAvLyAyXjUzLTEgYnl0ZXMuXG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0Vycm9ycy9JbnZhbGlkX2FycmF5X2xlbmd0aFxuICAgICAgICAvLyBodHRwczovL3NvdXJjZS5jaHJvbWl1bS5vcmcvY2hyb21pdW0vY2hyb21pdW0vc3JjLysvbWFpbjp2OC9zcmMvY29tbW9uL2dsb2JhbHMuaDtkcmM9MTk0NjIxMmFjMDEwMDY2OGYxNGViOWUyODQzYmRkODQ2ZTUxMGExZTticHY9MTticHQ9MTtsPTEyNzVcbiAgICAgICAgLy8gaHR0cHM6Ly9zb3VyY2UuY2hyb21pdW0ub3JnL2Nocm9taXVtL2Nocm9taXVtL3NyYy8rL21haW46djgvc3JjL29iamVjdHMvanMtYXJyYXktYnVmZmVyLmg7bD0zNDtkcmM9MTk0NjIxMmFjMDEwMDY2OGYxNGViOWUyODQzYmRkODQ2ZTUxMGExZVxuICAgICAgICBpZiAodXBwZXIgPiAyICoqIDMxIC0gMSkge1xuICAgICAgICAgIGZhaWxXZWJzb2NrZXRDb25uZWN0aW9uKHRoaXMud3MsICdSZWNlaXZlZCBwYXlsb2FkIGxlbmd0aCA+IDJeMzEgYnl0ZXMuJylcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvd2VyID0gYnVmZmVyLnJlYWRVSW50MzJCRSg0KVxuXG4gICAgICAgIHRoaXMuI2luZm8ucGF5bG9hZExlbmd0aCA9ICh1cHBlciA8PCA4KSArIGxvd2VyXG4gICAgICAgIHRoaXMuI3N0YXRlID0gcGFyc2VyU3RhdGVzLlJFQURfREFUQVxuICAgICAgfSBlbHNlIGlmICh0aGlzLiNzdGF0ZSA9PT0gcGFyc2VyU3RhdGVzLlJFQURfREFUQSkge1xuICAgICAgICBpZiAodGhpcy4jYnl0ZU9mZnNldCA8IHRoaXMuI2luZm8ucGF5bG9hZExlbmd0aCkge1xuICAgICAgICAgIC8vIElmIHRoZXJlIGlzIHN0aWxsIG1vcmUgZGF0YSBpbiB0aGlzIGNodW5rIHRoYXQgbmVlZHMgdG8gYmUgcmVhZFxuICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy4jYnl0ZU9mZnNldCA+PSB0aGlzLiNpbmZvLnBheWxvYWRMZW5ndGgpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgc2VydmVyIHNlbnQgbXVsdGlwbGUgZnJhbWVzIGluIGEgc2luZ2xlIGNodW5rXG5cbiAgICAgICAgICBjb25zdCBib2R5ID0gdGhpcy5jb25zdW1lKHRoaXMuI2luZm8ucGF5bG9hZExlbmd0aClcblxuICAgICAgICAgIHRoaXMuI2ZyYWdtZW50cy5wdXNoKGJvZHkpXG5cbiAgICAgICAgICAvLyBJZiB0aGUgZnJhbWUgaXMgdW5mcmFnbWVudGVkLCBvciBhIGZyYWdtZW50ZWQgZnJhbWUgd2FzIHRlcm1pbmF0ZWQsXG4gICAgICAgICAgLy8gYSBtZXNzYWdlIHdhcyByZWNlaXZlZFxuICAgICAgICAgIGlmICghdGhpcy4jaW5mby5mcmFnbWVudGVkIHx8ICh0aGlzLiNpbmZvLmZpbiAmJiB0aGlzLiNpbmZvLm9wY29kZSA9PT0gb3Bjb2Rlcy5DT05USU5VQVRJT04pKSB7XG4gICAgICAgICAgICBjb25zdCBmdWxsTWVzc2FnZSA9IEJ1ZmZlci5jb25jYXQodGhpcy4jZnJhZ21lbnRzKVxuXG4gICAgICAgICAgICB3ZWJzb2NrZXRNZXNzYWdlUmVjZWl2ZWQodGhpcy53cywgdGhpcy4jaW5mby5vcmlnaW5hbE9wY29kZSwgZnVsbE1lc3NhZ2UpXG5cbiAgICAgICAgICAgIHRoaXMuI2luZm8gPSB7fVxuICAgICAgICAgICAgdGhpcy4jZnJhZ21lbnRzLmxlbmd0aCA9IDBcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLiNzdGF0ZSA9IHBhcnNlclN0YXRlcy5JTkZPXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuI2J5dGVPZmZzZXQgPiAwKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjaygpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgbiBieXRlcyBmcm9tIHRoZSBidWZmZXJlZCBCdWZmZXJzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuXG4gICAqIEByZXR1cm5zIHtCdWZmZXJ8bnVsbH1cbiAgICovXG4gIGNvbnN1bWUgKG4pIHtcbiAgICBpZiAobiA+IHRoaXMuI2J5dGVPZmZzZXQpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfSBlbHNlIGlmIChuID09PSAwKSB7XG4gICAgICByZXR1cm4gZW1wdHlCdWZmZXJcbiAgICB9XG5cbiAgICBpZiAodGhpcy4jYnVmZmVyc1swXS5sZW5ndGggPT09IG4pIHtcbiAgICAgIHRoaXMuI2J5dGVPZmZzZXQgLT0gdGhpcy4jYnVmZmVyc1swXS5sZW5ndGhcbiAgICAgIHJldHVybiB0aGlzLiNidWZmZXJzLnNoaWZ0KClcbiAgICB9XG5cbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobilcbiAgICBsZXQgb2Zmc2V0ID0gMFxuXG4gICAgd2hpbGUgKG9mZnNldCAhPT0gbikge1xuICAgICAgY29uc3QgbmV4dCA9IHRoaXMuI2J1ZmZlcnNbMF1cbiAgICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSBuZXh0XG5cbiAgICAgIGlmIChsZW5ndGggKyBvZmZzZXQgPT09IG4pIHtcbiAgICAgICAgYnVmZmVyLnNldCh0aGlzLiNidWZmZXJzLnNoaWZ0KCksIG9mZnNldClcbiAgICAgICAgYnJlYWtcbiAgICAgIH0gZWxzZSBpZiAobGVuZ3RoICsgb2Zmc2V0ID4gbikge1xuICAgICAgICBidWZmZXIuc2V0KG5leHQuc3ViYXJyYXkoMCwgbiAtIG9mZnNldCksIG9mZnNldClcbiAgICAgICAgdGhpcy4jYnVmZmVyc1swXSA9IG5leHQuc3ViYXJyYXkobiAtIG9mZnNldClcbiAgICAgICAgYnJlYWtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1ZmZlci5zZXQodGhpcy4jYnVmZmVycy5zaGlmdCgpLCBvZmZzZXQpXG4gICAgICAgIG9mZnNldCArPSBuZXh0Lmxlbmd0aFxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuI2J5dGVPZmZzZXQgLT0gblxuXG4gICAgcmV0dXJuIGJ1ZmZlclxuICB9XG5cbiAgcGFyc2VDbG9zZUJvZHkgKG9ubHlDb2RlLCBkYXRhKSB7XG4gICAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM2NDU1I3NlY3Rpb24tNy4xLjVcbiAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgbGV0IGNvZGVcblxuICAgIGlmIChkYXRhLmxlbmd0aCA+PSAyKSB7XG4gICAgICAvLyBfVGhlIFdlYlNvY2tldCBDb25uZWN0aW9uIENsb3NlIENvZGVfIGlzXG4gICAgICAvLyBkZWZpbmVkIGFzIHRoZSBzdGF0dXMgY29kZSAoU2VjdGlvbiA3LjQpIGNvbnRhaW5lZCBpbiB0aGUgZmlyc3QgQ2xvc2VcbiAgICAgIC8vIGNvbnRyb2wgZnJhbWUgcmVjZWl2ZWQgYnkgdGhlIGFwcGxpY2F0aW9uXG4gICAgICBjb2RlID0gZGF0YS5yZWFkVUludDE2QkUoMClcbiAgICB9XG5cbiAgICBpZiAob25seUNvZGUpIHtcbiAgICAgIGlmICghaXNWYWxpZFN0YXR1c0NvZGUoY29kZSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgY29kZSB9XG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM2NDU1I3NlY3Rpb24tNy4xLjZcbiAgICAvKiogQHR5cGUge0J1ZmZlcn0gKi9cbiAgICBsZXQgcmVhc29uID0gZGF0YS5zdWJhcnJheSgyKVxuXG4gICAgLy8gUmVtb3ZlIEJPTVxuICAgIGlmIChyZWFzb25bMF0gPT09IDB4RUYgJiYgcmVhc29uWzFdID09PSAweEJCICYmIHJlYXNvblsyXSA9PT0gMHhCRikge1xuICAgICAgcmVhc29uID0gcmVhc29uLnN1YmFycmF5KDMpXG4gICAgfVxuXG4gICAgaWYgKGNvZGUgIT09IHVuZGVmaW5lZCAmJiAhaXNWYWxpZFN0YXR1c0NvZGUoY29kZSkpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFRPRE86IG9wdGltaXplIHRoaXNcbiAgICAgIHJlYXNvbiA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTgnLCB7IGZhdGFsOiB0cnVlIH0pLmRlY29kZShyZWFzb24pXG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGUsIHJlYXNvbiB9XG4gIH1cblxuICBnZXQgY2xvc2luZ0luZm8gKCkge1xuICAgIHJldHVybiB0aGlzLiNpbmZvLmNsb3NlSW5mb1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBCeXRlUGFyc2VyXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3dlYmlkbCcpXG5jb25zdCB7IERPTUV4Y2VwdGlvbiB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvY29uc3RhbnRzJylcbmNvbnN0IHsgVVJMU2VyaWFsaXplciB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvZGF0YVVSTCcpXG5jb25zdCB7IGdldEdsb2JhbE9yaWdpbiB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvZ2xvYmFsJylcbmNvbnN0IHsgc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycywgc3RhdGVzLCBvcGNvZGVzLCBlbXB0eUJ1ZmZlciB9ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3Qge1xuICBrV2ViU29ja2V0VVJMLFxuICBrUmVhZHlTdGF0ZSxcbiAga0NvbnRyb2xsZXIsXG4gIGtCaW5hcnlUeXBlLFxuICBrUmVzcG9uc2UsXG4gIGtTZW50Q2xvc2UsXG4gIGtCeXRlUGFyc2VyXG59ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgaXNFc3RhYmxpc2hlZCwgaXNDbG9zaW5nLCBpc1ZhbGlkU3VicHJvdG9jb2wsIGZhaWxXZWJzb2NrZXRDb25uZWN0aW9uLCBmaXJlRXZlbnQgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IGVzdGFibGlzaFdlYlNvY2tldENvbm5lY3Rpb24gfSA9IHJlcXVpcmUoJy4vY29ubmVjdGlvbicpXG5jb25zdCB7IFdlYnNvY2tldEZyYW1lU2VuZCB9ID0gcmVxdWlyZSgnLi9mcmFtZScpXG5jb25zdCB7IEJ5dGVQYXJzZXIgfSA9IHJlcXVpcmUoJy4vcmVjZWl2ZXInKVxuY29uc3QgeyBrRW51bWVyYWJsZVByb3BlcnR5LCBpc0Jsb2JMaWtlIH0gPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBnZXRHbG9iYWxEaXNwYXRjaGVyIH0gPSByZXF1aXJlKCcuLi9nbG9iYWwnKVxuY29uc3QgeyB0eXBlcyB9ID0gcmVxdWlyZSgndXRpbCcpXG5cbmxldCBleHBlcmltZW50YWxXYXJuZWQgPSBmYWxzZVxuXG4vLyBodHRwczovL3dlYnNvY2tldHMuc3BlYy53aGF0d2cub3JnLyNpbnRlcmZhY2UtZGVmaW5pdGlvblxuY2xhc3MgV2ViU29ja2V0IGV4dGVuZHMgRXZlbnRUYXJnZXQge1xuICAjZXZlbnRzID0ge1xuICAgIG9wZW46IG51bGwsXG4gICAgZXJyb3I6IG51bGwsXG4gICAgY2xvc2U6IG51bGwsXG4gICAgbWVzc2FnZTogbnVsbFxuICB9XG5cbiAgI2J1ZmZlcmVkQW1vdW50ID0gMFxuICAjcHJvdG9jb2wgPSAnJ1xuICAjZXh0ZW5zaW9ucyA9ICcnXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IHByb3RvY29sc1xuICAgKi9cbiAgY29uc3RydWN0b3IgKHVybCwgcHJvdG9jb2xzID0gW10pIHtcbiAgICBzdXBlcigpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnV2ViU29ja2V0IGNvbnN0cnVjdG9yJyB9KVxuXG4gICAgaWYgKCFleHBlcmltZW50YWxXYXJuZWQpIHtcbiAgICAgIGV4cGVyaW1lbnRhbFdhcm5lZCA9IHRydWVcbiAgICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcoJ1dlYlNvY2tldHMgYXJlIGV4cGVyaW1lbnRhbCwgZXhwZWN0IHRoZW0gdG8gY2hhbmdlIGF0IGFueSB0aW1lLicsIHtcbiAgICAgICAgY29kZTogJ1VORElDSS1XUydcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHdlYmlkbC5jb252ZXJ0ZXJzWydET01TdHJpbmcgb3Igc2VxdWVuY2U8RE9NU3RyaW5nPiBvciBXZWJTb2NrZXRJbml0J10ocHJvdG9jb2xzKVxuXG4gICAgdXJsID0gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKHVybClcbiAgICBwcm90b2NvbHMgPSBvcHRpb25zLnByb3RvY29sc1xuXG4gICAgLy8gMS4gTGV0IGJhc2VVUkwgYmUgdGhpcydzIHJlbGV2YW50IHNldHRpbmdzIG9iamVjdCdzIEFQSSBiYXNlIFVSTC5cbiAgICBjb25zdCBiYXNlVVJMID0gZ2V0R2xvYmFsT3JpZ2luKClcblxuICAgIC8vIDEuIExldCB1cmxSZWNvcmQgYmUgdGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgVVJMIHBhcnNlciB0byB1cmwgd2l0aCBiYXNlVVJMLlxuICAgIGxldCB1cmxSZWNvcmRcblxuICAgIHRyeSB7XG4gICAgICB1cmxSZWNvcmQgPSBuZXcgVVJMKHVybCwgYmFzZVVSTClcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyAzLiBJZiB1cmxSZWNvcmQgaXMgZmFpbHVyZSwgdGhlbiB0aHJvdyBhIFwiU3ludGF4RXJyb3JcIiBET01FeGNlcHRpb24uXG4gICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKGUsICdTeW50YXhFcnJvcicpXG4gICAgfVxuXG4gICAgLy8gNC4gSWYgdXJsUmVjb3Jk4oCZcyBzY2hlbWUgaXMgXCJodHRwXCIsIHRoZW4gc2V0IHVybFJlY29yZOKAmXMgc2NoZW1lIHRvIFwid3NcIi5cbiAgICBpZiAodXJsUmVjb3JkLnByb3RvY29sID09PSAnaHR0cDonKSB7XG4gICAgICB1cmxSZWNvcmQucHJvdG9jb2wgPSAnd3M6J1xuICAgIH0gZWxzZSBpZiAodXJsUmVjb3JkLnByb3RvY29sID09PSAnaHR0cHM6Jykge1xuICAgICAgLy8gNS4gT3RoZXJ3aXNlLCBpZiB1cmxSZWNvcmTigJlzIHNjaGVtZSBpcyBcImh0dHBzXCIsIHNldCB1cmxSZWNvcmTigJlzIHNjaGVtZSB0byBcIndzc1wiLlxuICAgICAgdXJsUmVjb3JkLnByb3RvY29sID0gJ3dzczonXG4gICAgfVxuXG4gICAgLy8gNi4gSWYgdXJsUmVjb3Jk4oCZcyBzY2hlbWUgaXMgbm90IFwid3NcIiBvciBcIndzc1wiLCB0aGVuIHRocm93IGEgXCJTeW50YXhFcnJvclwiIERPTUV4Y2VwdGlvbi5cbiAgICBpZiAodXJsUmVjb3JkLnByb3RvY29sICE9PSAnd3M6JyAmJiB1cmxSZWNvcmQucHJvdG9jb2wgIT09ICd3c3M6Jykge1xuICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihcbiAgICAgICAgYEV4cGVjdGVkIGEgd3M6IG9yIHdzczogcHJvdG9jb2wsIGdvdCAke3VybFJlY29yZC5wcm90b2NvbH1gLFxuICAgICAgICAnU3ludGF4RXJyb3InXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gNy4gSWYgdXJsUmVjb3Jk4oCZcyBmcmFnbWVudCBpcyBub24tbnVsbCwgdGhlbiB0aHJvdyBhIFwiU3ludGF4RXJyb3JcIlxuICAgIC8vICAgIERPTUV4Y2VwdGlvbi5cbiAgICBpZiAodXJsUmVjb3JkLmhhc2ggfHwgdXJsUmVjb3JkLmhyZWYuZW5kc1dpdGgoJyMnKSkge1xuICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignR290IGZyYWdtZW50JywgJ1N5bnRheEVycm9yJylcbiAgICB9XG5cbiAgICAvLyA4LiBJZiBwcm90b2NvbHMgaXMgYSBzdHJpbmcsIHNldCBwcm90b2NvbHMgdG8gYSBzZXF1ZW5jZSBjb25zaXN0aW5nXG4gICAgLy8gICAgb2YganVzdCB0aGF0IHN0cmluZy5cbiAgICBpZiAodHlwZW9mIHByb3RvY29scyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHByb3RvY29scyA9IFtwcm90b2NvbHNdXG4gICAgfVxuXG4gICAgLy8gOS4gSWYgYW55IG9mIHRoZSB2YWx1ZXMgaW4gcHJvdG9jb2xzIG9jY3VyIG1vcmUgdGhhbiBvbmNlIG9yIG90aGVyd2lzZVxuICAgIC8vICAgIGZhaWwgdG8gbWF0Y2ggdGhlIHJlcXVpcmVtZW50cyBmb3IgZWxlbWVudHMgdGhhdCBjb21wcmlzZSB0aGUgdmFsdWVcbiAgICAvLyAgICBvZiBgU2VjLVdlYlNvY2tldC1Qcm90b2NvbGAgZmllbGRzIGFzIGRlZmluZWQgYnkgVGhlIFdlYlNvY2tldFxuICAgIC8vICAgIHByb3RvY29sLCB0aGVuIHRocm93IGEgXCJTeW50YXhFcnJvclwiIERPTUV4Y2VwdGlvbi5cbiAgICBpZiAocHJvdG9jb2xzLmxlbmd0aCAhPT0gbmV3IFNldChwcm90b2NvbHMubWFwKHAgPT4gcC50b0xvd2VyQ2FzZSgpKSkuc2l6ZSkge1xuICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignSW52YWxpZCBTZWMtV2ViU29ja2V0LVByb3RvY29sIHZhbHVlJywgJ1N5bnRheEVycm9yJylcbiAgICB9XG5cbiAgICBpZiAocHJvdG9jb2xzLmxlbmd0aCA+IDAgJiYgIXByb3RvY29scy5ldmVyeShwID0+IGlzVmFsaWRTdWJwcm90b2NvbChwKSkpIHtcbiAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ludmFsaWQgU2VjLVdlYlNvY2tldC1Qcm90b2NvbCB2YWx1ZScsICdTeW50YXhFcnJvcicpXG4gICAgfVxuXG4gICAgLy8gMTAuIFNldCB0aGlzJ3MgdXJsIHRvIHVybFJlY29yZC5cbiAgICB0aGlzW2tXZWJTb2NrZXRVUkxdID0gbmV3IFVSTCh1cmxSZWNvcmQuaHJlZilcblxuICAgIC8vIDExLiBMZXQgY2xpZW50IGJlIHRoaXMncyByZWxldmFudCBzZXR0aW5ncyBvYmplY3QuXG5cbiAgICAvLyAxMi4gUnVuIHRoaXMgc3RlcCBpbiBwYXJhbGxlbDpcblxuICAgIC8vICAgIDEuIEVzdGFibGlzaCBhIFdlYlNvY2tldCBjb25uZWN0aW9uIGdpdmVuIHVybFJlY29yZCwgcHJvdG9jb2xzLFxuICAgIC8vICAgICAgIGFuZCBjbGllbnQuXG4gICAgdGhpc1trQ29udHJvbGxlcl0gPSBlc3RhYmxpc2hXZWJTb2NrZXRDb25uZWN0aW9uKFxuICAgICAgdXJsUmVjb3JkLFxuICAgICAgcHJvdG9jb2xzLFxuICAgICAgdGhpcyxcbiAgICAgIChyZXNwb25zZSkgPT4gdGhpcy4jb25Db25uZWN0aW9uRXN0YWJsaXNoZWQocmVzcG9uc2UpLFxuICAgICAgb3B0aW9uc1xuICAgIClcblxuICAgIC8vIEVhY2ggV2ViU29ja2V0IG9iamVjdCBoYXMgYW4gYXNzb2NpYXRlZCByZWFkeSBzdGF0ZSwgd2hpY2ggaXMgYVxuICAgIC8vIG51bWJlciByZXByZXNlbnRpbmcgdGhlIHN0YXRlIG9mIHRoZSBjb25uZWN0aW9uLiBJbml0aWFsbHkgaXQgbXVzdFxuICAgIC8vIGJlIENPTk5FQ1RJTkcgKDApLlxuICAgIHRoaXNba1JlYWR5U3RhdGVdID0gV2ViU29ja2V0LkNPTk5FQ1RJTkdcblxuICAgIC8vIFRoZSBleHRlbnNpb25zIGF0dHJpYnV0ZSBtdXN0IGluaXRpYWxseSByZXR1cm4gdGhlIGVtcHR5IHN0cmluZy5cblxuICAgIC8vIFRoZSBwcm90b2NvbCBhdHRyaWJ1dGUgbXVzdCBpbml0aWFsbHkgcmV0dXJuIHRoZSBlbXB0eSBzdHJpbmcuXG5cbiAgICAvLyBFYWNoIFdlYlNvY2tldCBvYmplY3QgaGFzIGFuIGFzc29jaWF0ZWQgYmluYXJ5IHR5cGUsIHdoaWNoIGlzIGFcbiAgICAvLyBCaW5hcnlUeXBlLiBJbml0aWFsbHkgaXQgbXVzdCBiZSBcImJsb2JcIi5cbiAgICB0aGlzW2tCaW5hcnlUeXBlXSA9ICdibG9iJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93ZWJzb2NrZXRzLnNwZWMud2hhdHdnLm9yZy8jZG9tLXdlYnNvY2tldC1jbG9zZVxuICAgKiBAcGFyYW0ge251bWJlcnx1bmRlZmluZWR9IGNvZGVcbiAgICogQHBhcmFtIHtzdHJpbmd8dW5kZWZpbmVkfSByZWFzb25cbiAgICovXG4gIGNsb3NlIChjb2RlID0gdW5kZWZpbmVkLCByZWFzb24gPSB1bmRlZmluZWQpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICBpZiAoY29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb2RlID0gd2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIHNob3J0J10oY29kZSwgeyBjbGFtcDogdHJ1ZSB9KVxuICAgIH1cblxuICAgIGlmIChyZWFzb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVhc29uID0gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKHJlYXNvbilcbiAgICB9XG5cbiAgICAvLyAxLiBJZiBjb2RlIGlzIHByZXNlbnQsIGJ1dCBpcyBuZWl0aGVyIGFuIGludGVnZXIgZXF1YWwgdG8gMTAwMCBub3IgYW5cbiAgICAvLyAgICBpbnRlZ2VyIGluIHRoZSByYW5nZSAzMDAwIHRvIDQ5OTksIGluY2x1c2l2ZSwgdGhyb3cgYW5cbiAgICAvLyAgICBcIkludmFsaWRBY2Nlc3NFcnJvclwiIERPTUV4Y2VwdGlvbi5cbiAgICBpZiAoY29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoY29kZSAhPT0gMTAwMCAmJiAoY29kZSA8IDMwMDAgfHwgY29kZSA+IDQ5OTkpKSB7XG4gICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ2ludmFsaWQgY29kZScsICdJbnZhbGlkQWNjZXNzRXJyb3InKVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCByZWFzb25CeXRlTGVuZ3RoID0gMFxuXG4gICAgLy8gMi4gSWYgcmVhc29uIGlzIHByZXNlbnQsIHRoZW4gcnVuIHRoZXNlIHN1YnN0ZXBzOlxuICAgIGlmIChyZWFzb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gMS4gTGV0IHJlYXNvbkJ5dGVzIGJlIHRoZSByZXN1bHQgb2YgZW5jb2RpbmcgcmVhc29uLlxuICAgICAgLy8gMi4gSWYgcmVhc29uQnl0ZXMgaXMgbG9uZ2VyIHRoYW4gMTIzIGJ5dGVzLCB0aGVuIHRocm93IGFcbiAgICAgIC8vICAgIFwiU3ludGF4RXJyb3JcIiBET01FeGNlcHRpb24uXG4gICAgICByZWFzb25CeXRlTGVuZ3RoID0gQnVmZmVyLmJ5dGVMZW5ndGgocmVhc29uKVxuXG4gICAgICBpZiAocmVhc29uQnl0ZUxlbmd0aCA+IDEyMykge1xuICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKFxuICAgICAgICAgIGBSZWFzb24gbXVzdCBiZSBsZXNzIHRoYW4gMTIzIGJ5dGVzOyByZWNlaXZlZCAke3JlYXNvbkJ5dGVMZW5ndGh9YCxcbiAgICAgICAgICAnU3ludGF4RXJyb3InXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAzLiBSdW4gdGhlIGZpcnN0IG1hdGNoaW5nIHN0ZXBzIGZyb20gdGhlIGZvbGxvd2luZyBsaXN0OlxuICAgIGlmICh0aGlzW2tSZWFkeVN0YXRlXSA9PT0gV2ViU29ja2V0LkNMT1NJTkcgfHwgdGhpc1trUmVhZHlTdGF0ZV0gPT09IFdlYlNvY2tldC5DTE9TRUQpIHtcbiAgICAgIC8vIElmIHRoaXMncyByZWFkeSBzdGF0ZSBpcyBDTE9TSU5HICgyKSBvciBDTE9TRUQgKDMpXG4gICAgICAvLyBEbyBub3RoaW5nLlxuICAgIH0gZWxzZSBpZiAoIWlzRXN0YWJsaXNoZWQodGhpcykpIHtcbiAgICAgIC8vIElmIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBpcyBub3QgeWV0IGVzdGFibGlzaGVkXG4gICAgICAvLyBGYWlsIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBhbmQgc2V0IHRoaXMncyByZWFkeSBzdGF0ZVxuICAgICAgLy8gdG8gQ0xPU0lORyAoMikuXG4gICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih0aGlzLCAnQ29ubmVjdGlvbiB3YXMgY2xvc2VkIGJlZm9yZSBpdCB3YXMgZXN0YWJsaXNoZWQuJylcbiAgICAgIHRoaXNba1JlYWR5U3RhdGVdID0gV2ViU29ja2V0LkNMT1NJTkdcbiAgICB9IGVsc2UgaWYgKCFpc0Nsb3NpbmcodGhpcykpIHtcbiAgICAgIC8vIElmIHRoZSBXZWJTb2NrZXQgY2xvc2luZyBoYW5kc2hha2UgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkXG4gICAgICAvLyBTdGFydCB0aGUgV2ViU29ja2V0IGNsb3NpbmcgaGFuZHNoYWtlIGFuZCBzZXQgdGhpcydzIHJlYWR5XG4gICAgICAvLyBzdGF0ZSB0byBDTE9TSU5HICgyKS5cbiAgICAgIC8vIC0gSWYgbmVpdGhlciBjb2RlIG5vciByZWFzb24gaXMgcHJlc2VudCwgdGhlIFdlYlNvY2tldCBDbG9zZVxuICAgICAgLy8gICBtZXNzYWdlIG11c3Qgbm90IGhhdmUgYSBib2R5LlxuICAgICAgLy8gLSBJZiBjb2RlIGlzIHByZXNlbnQsIHRoZW4gdGhlIHN0YXR1cyBjb2RlIHRvIHVzZSBpbiB0aGVcbiAgICAgIC8vICAgV2ViU29ja2V0IENsb3NlIG1lc3NhZ2UgbXVzdCBiZSB0aGUgaW50ZWdlciBnaXZlbiBieSBjb2RlLlxuICAgICAgLy8gLSBJZiByZWFzb24gaXMgYWxzbyBwcmVzZW50LCB0aGVuIHJlYXNvbkJ5dGVzIG11c3QgYmVcbiAgICAgIC8vICAgcHJvdmlkZWQgaW4gdGhlIENsb3NlIG1lc3NhZ2UgYWZ0ZXIgdGhlIHN0YXR1cyBjb2RlLlxuXG4gICAgICBjb25zdCBmcmFtZSA9IG5ldyBXZWJzb2NrZXRGcmFtZVNlbmQoKVxuXG4gICAgICAvLyBJZiBuZWl0aGVyIGNvZGUgbm9yIHJlYXNvbiBpcyBwcmVzZW50LCB0aGUgV2ViU29ja2V0IENsb3NlXG4gICAgICAvLyBtZXNzYWdlIG11c3Qgbm90IGhhdmUgYSBib2R5LlxuXG4gICAgICAvLyBJZiBjb2RlIGlzIHByZXNlbnQsIHRoZW4gdGhlIHN0YXR1cyBjb2RlIHRvIHVzZSBpbiB0aGVcbiAgICAgIC8vIFdlYlNvY2tldCBDbG9zZSBtZXNzYWdlIG11c3QgYmUgdGhlIGludGVnZXIgZ2l2ZW4gYnkgY29kZS5cbiAgICAgIGlmIChjb2RlICE9PSB1bmRlZmluZWQgJiYgcmVhc29uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZnJhbWUuZnJhbWVEYXRhID0gQnVmZmVyLmFsbG9jVW5zYWZlKDIpXG4gICAgICAgIGZyYW1lLmZyYW1lRGF0YS53cml0ZVVJbnQxNkJFKGNvZGUsIDApXG4gICAgICB9IGVsc2UgaWYgKGNvZGUgIT09IHVuZGVmaW5lZCAmJiByZWFzb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBJZiByZWFzb24gaXMgYWxzbyBwcmVzZW50LCB0aGVuIHJlYXNvbkJ5dGVzIG11c3QgYmVcbiAgICAgICAgLy8gcHJvdmlkZWQgaW4gdGhlIENsb3NlIG1lc3NhZ2UgYWZ0ZXIgdGhlIHN0YXR1cyBjb2RlLlxuICAgICAgICBmcmFtZS5mcmFtZURhdGEgPSBCdWZmZXIuYWxsb2NVbnNhZmUoMiArIHJlYXNvbkJ5dGVMZW5ndGgpXG4gICAgICAgIGZyYW1lLmZyYW1lRGF0YS53cml0ZVVJbnQxNkJFKGNvZGUsIDApXG4gICAgICAgIC8vIHRoZSBib2R5IE1BWSBjb250YWluIFVURi04LWVuY29kZWQgZGF0YSB3aXRoIHZhbHVlIC9yZWFzb24vXG4gICAgICAgIGZyYW1lLmZyYW1lRGF0YS53cml0ZShyZWFzb24sIDIsICd1dGYtOCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcmFtZS5mcmFtZURhdGEgPSBlbXB0eUJ1ZmZlclxuICAgICAgfVxuXG4gICAgICAvKiogQHR5cGUge2ltcG9ydCgnc3RyZWFtJykuRHVwbGV4fSAqL1xuICAgICAgY29uc3Qgc29ja2V0ID0gdGhpc1trUmVzcG9uc2VdLnNvY2tldFxuXG4gICAgICBzb2NrZXQud3JpdGUoZnJhbWUuY3JlYXRlRnJhbWUob3Bjb2Rlcy5DTE9TRSksIChlcnIpID0+IHtcbiAgICAgICAgaWYgKCFlcnIpIHtcbiAgICAgICAgICB0aGlzW2tTZW50Q2xvc2VdID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICAvLyBVcG9uIGVpdGhlciBzZW5kaW5nIG9yIHJlY2VpdmluZyBhIENsb3NlIGNvbnRyb2wgZnJhbWUsIGl0IGlzIHNhaWRcbiAgICAgIC8vIHRoYXQgX1RoZSBXZWJTb2NrZXQgQ2xvc2luZyBIYW5kc2hha2UgaXMgU3RhcnRlZF8gYW5kIHRoYXQgdGhlXG4gICAgICAvLyBXZWJTb2NrZXQgY29ubmVjdGlvbiBpcyBpbiB0aGUgQ0xPU0lORyBzdGF0ZS5cbiAgICAgIHRoaXNba1JlYWR5U3RhdGVdID0gc3RhdGVzLkNMT1NJTkdcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3RoZXJ3aXNlXG4gICAgICAvLyBTZXQgdGhpcydzIHJlYWR5IHN0YXRlIHRvIENMT1NJTkcgKDIpLlxuICAgICAgdGhpc1trUmVhZHlTdGF0ZV0gPSBXZWJTb2NrZXQuQ0xPU0lOR1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vd2Vic29ja2V0cy5zcGVjLndoYXR3Zy5vcmcvI2RvbS13ZWJzb2NrZXQtc2VuZFxuICAgKiBAcGFyYW0ge05vZGVKUy5UeXBlZEFycmF5fEFycmF5QnVmZmVyfEJsb2J8c3RyaW5nfSBkYXRhXG4gICAqL1xuICBzZW5kIChkYXRhKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ1dlYlNvY2tldC5zZW5kJyB9KVxuXG4gICAgZGF0YSA9IHdlYmlkbC5jb252ZXJ0ZXJzLldlYlNvY2tldFNlbmREYXRhKGRhdGEpXG5cbiAgICAvLyAxLiBJZiB0aGlzJ3MgcmVhZHkgc3RhdGUgaXMgQ09OTkVDVElORywgdGhlbiB0aHJvdyBhblxuICAgIC8vICAgIFwiSW52YWxpZFN0YXRlRXJyb3JcIiBET01FeGNlcHRpb24uXG4gICAgaWYgKHRoaXNba1JlYWR5U3RhdGVdID09PSBXZWJTb2NrZXQuQ09OTkVDVElORykge1xuICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignU2VudCBiZWZvcmUgY29ubmVjdGVkLicsICdJbnZhbGlkU3RhdGVFcnJvcicpXG4gICAgfVxuXG4gICAgLy8gMi4gUnVuIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2Ygc3RlcHMgZnJvbSB0aGUgZm9sbG93aW5nIGxpc3Q6XG4gICAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM2NDU1I3NlY3Rpb24tNi4xXG4gICAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM2NDU1I3NlY3Rpb24tNS4yXG5cbiAgICBpZiAoIWlzRXN0YWJsaXNoZWQodGhpcykgfHwgaXNDbG9zaW5nKHRoaXMpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvKiogQHR5cGUge2ltcG9ydCgnc3RyZWFtJykuRHVwbGV4fSAqL1xuICAgIGNvbnN0IHNvY2tldCA9IHRoaXNba1Jlc3BvbnNlXS5zb2NrZXRcblxuICAgIC8vIElmIGRhdGEgaXMgYSBzdHJpbmdcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBJZiB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgYW5kIHRoZSBXZWJTb2NrZXRcbiAgICAgIC8vIGNsb3NpbmcgaGFuZHNoYWtlIGhhcyBub3QgeWV0IHN0YXJ0ZWQsIHRoZW4gdGhlIHVzZXIgYWdlbnRcbiAgICAgIC8vIG11c3Qgc2VuZCBhIFdlYlNvY2tldCBNZXNzYWdlIGNvbXByaXNlZCBvZiB0aGUgZGF0YSBhcmd1bWVudFxuICAgICAgLy8gdXNpbmcgYSB0ZXh0IGZyYW1lIG9wY29kZTsgaWYgdGhlIGRhdGEgY2Fubm90IGJlIHNlbnQsIGUuZy5cbiAgICAgIC8vIGJlY2F1c2UgaXQgd291bGQgbmVlZCB0byBiZSBidWZmZXJlZCBidXQgdGhlIGJ1ZmZlciBpcyBmdWxsLFxuICAgICAgLy8gdGhlIHVzZXIgYWdlbnQgbXVzdCBmbGFnIHRoZSBXZWJTb2NrZXQgYXMgZnVsbCBhbmQgdGhlbiBjbG9zZVxuICAgICAgLy8gdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uLiBBbnkgaW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aXRoIGFcbiAgICAgIC8vIHN0cmluZyBhcmd1bWVudCB0aGF0IGRvZXMgbm90IHRocm93IGFuIGV4Y2VwdGlvbiBtdXN0IGluY3JlYXNlXG4gICAgICAvLyB0aGUgYnVmZmVyZWRBbW91bnQgYXR0cmlidXRlIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvXG4gICAgICAvLyBleHByZXNzIHRoZSBhcmd1bWVudCBhcyBVVEYtOC5cblxuICAgICAgY29uc3QgdmFsdWUgPSBCdWZmZXIuZnJvbShkYXRhKVxuICAgICAgY29uc3QgZnJhbWUgPSBuZXcgV2Vic29ja2V0RnJhbWVTZW5kKHZhbHVlKVxuICAgICAgY29uc3QgYnVmZmVyID0gZnJhbWUuY3JlYXRlRnJhbWUob3Bjb2Rlcy5URVhUKVxuXG4gICAgICB0aGlzLiNidWZmZXJlZEFtb3VudCArPSB2YWx1ZS5ieXRlTGVuZ3RoXG4gICAgICBzb2NrZXQud3JpdGUoYnVmZmVyLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuI2J1ZmZlcmVkQW1vdW50IC09IHZhbHVlLmJ5dGVMZW5ndGhcbiAgICAgIH0pXG4gICAgfSBlbHNlIGlmICh0eXBlcy5pc0FycmF5QnVmZmVyKGRhdGEpKSB7XG4gICAgICAvLyBJZiB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQsIGFuZCB0aGUgV2ViU29ja2V0XG4gICAgICAvLyBjbG9zaW5nIGhhbmRzaGFrZSBoYXMgbm90IHlldCBzdGFydGVkLCB0aGVuIHRoZSB1c2VyIGFnZW50IG11c3RcbiAgICAgIC8vIHNlbmQgYSBXZWJTb2NrZXQgTWVzc2FnZSBjb21wcmlzZWQgb2YgZGF0YSB1c2luZyBhIGJpbmFyeSBmcmFtZVxuICAgICAgLy8gb3Bjb2RlOyBpZiB0aGUgZGF0YSBjYW5ub3QgYmUgc2VudCwgZS5nLiBiZWNhdXNlIGl0IHdvdWxkIG5lZWRcbiAgICAgIC8vIHRvIGJlIGJ1ZmZlcmVkIGJ1dCB0aGUgYnVmZmVyIGlzIGZ1bGwsIHRoZSB1c2VyIGFnZW50IG11c3QgZmxhZ1xuICAgICAgLy8gdGhlIFdlYlNvY2tldCBhcyBmdWxsIGFuZCB0aGVuIGNsb3NlIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbi5cbiAgICAgIC8vIFRoZSBkYXRhIHRvIGJlIHNlbnQgaXMgdGhlIGRhdGEgc3RvcmVkIGluIHRoZSBidWZmZXIgZGVzY3JpYmVkXG4gICAgICAvLyBieSB0aGUgQXJyYXlCdWZmZXIgb2JqZWN0LiBBbnkgaW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aXRoIGFuXG4gICAgICAvLyBBcnJheUJ1ZmZlciBhcmd1bWVudCB0aGF0IGRvZXMgbm90IHRocm93IGFuIGV4Y2VwdGlvbiBtdXN0XG4gICAgICAvLyBpbmNyZWFzZSB0aGUgYnVmZmVyZWRBbW91bnQgYXR0cmlidXRlIGJ5IHRoZSBsZW5ndGggb2YgdGhlXG4gICAgICAvLyBBcnJheUJ1ZmZlciBpbiBieXRlcy5cblxuICAgICAgY29uc3QgdmFsdWUgPSBCdWZmZXIuZnJvbShkYXRhKVxuICAgICAgY29uc3QgZnJhbWUgPSBuZXcgV2Vic29ja2V0RnJhbWVTZW5kKHZhbHVlKVxuICAgICAgY29uc3QgYnVmZmVyID0gZnJhbWUuY3JlYXRlRnJhbWUob3Bjb2Rlcy5CSU5BUlkpXG5cbiAgICAgIHRoaXMuI2J1ZmZlcmVkQW1vdW50ICs9IHZhbHVlLmJ5dGVMZW5ndGhcbiAgICAgIHNvY2tldC53cml0ZShidWZmZXIsICgpID0+IHtcbiAgICAgICAgdGhpcy4jYnVmZmVyZWRBbW91bnQgLT0gdmFsdWUuYnl0ZUxlbmd0aFxuICAgICAgfSlcbiAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhkYXRhKSkge1xuICAgICAgLy8gSWYgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLCBhbmQgdGhlIFdlYlNvY2tldFxuICAgICAgLy8gY2xvc2luZyBoYW5kc2hha2UgaGFzIG5vdCB5ZXQgc3RhcnRlZCwgdGhlbiB0aGUgdXNlciBhZ2VudCBtdXN0XG4gICAgICAvLyBzZW5kIGEgV2ViU29ja2V0IE1lc3NhZ2UgY29tcHJpc2VkIG9mIGRhdGEgdXNpbmcgYSBiaW5hcnkgZnJhbWVcbiAgICAgIC8vIG9wY29kZTsgaWYgdGhlIGRhdGEgY2Fubm90IGJlIHNlbnQsIGUuZy4gYmVjYXVzZSBpdCB3b3VsZCBuZWVkIHRvXG4gICAgICAvLyBiZSBidWZmZXJlZCBidXQgdGhlIGJ1ZmZlciBpcyBmdWxsLCB0aGUgdXNlciBhZ2VudCBtdXN0IGZsYWcgdGhlXG4gICAgICAvLyBXZWJTb2NrZXQgYXMgZnVsbCBhbmQgdGhlbiBjbG9zZSB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24uIFRoZVxuICAgICAgLy8gZGF0YSB0byBiZSBzZW50IGlzIHRoZSBkYXRhIHN0b3JlZCBpbiB0aGUgc2VjdGlvbiBvZiB0aGUgYnVmZmVyXG4gICAgICAvLyBkZXNjcmliZWQgYnkgdGhlIEFycmF5QnVmZmVyIG9iamVjdCB0aGF0IGRhdGEgcmVmZXJlbmNlcy4gQW55XG4gICAgICAvLyBpbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpdGggdGhpcyBraW5kIG9mIGFyZ3VtZW50IHRoYXQgZG9lc1xuICAgICAgLy8gbm90IHRocm93IGFuIGV4Y2VwdGlvbiBtdXN0IGluY3JlYXNlIHRoZSBidWZmZXJlZEFtb3VudCBhdHRyaWJ1dGVcbiAgICAgIC8vIGJ5IHRoZSBsZW5ndGggb2YgZGF0YeKAmXMgYnVmZmVyIGluIGJ5dGVzLlxuXG4gICAgICBjb25zdCBhYiA9IEJ1ZmZlci5mcm9tKGRhdGEsIGRhdGEuYnl0ZU9mZnNldCwgZGF0YS5ieXRlTGVuZ3RoKVxuXG4gICAgICBjb25zdCBmcmFtZSA9IG5ldyBXZWJzb2NrZXRGcmFtZVNlbmQoYWIpXG4gICAgICBjb25zdCBidWZmZXIgPSBmcmFtZS5jcmVhdGVGcmFtZShvcGNvZGVzLkJJTkFSWSlcblxuICAgICAgdGhpcy4jYnVmZmVyZWRBbW91bnQgKz0gYWIuYnl0ZUxlbmd0aFxuICAgICAgc29ja2V0LndyaXRlKGJ1ZmZlciwgKCkgPT4ge1xuICAgICAgICB0aGlzLiNidWZmZXJlZEFtb3VudCAtPSBhYi5ieXRlTGVuZ3RoXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAoaXNCbG9iTGlrZShkYXRhKSkge1xuICAgICAgLy8gSWYgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLCBhbmQgdGhlIFdlYlNvY2tldFxuICAgICAgLy8gY2xvc2luZyBoYW5kc2hha2UgaGFzIG5vdCB5ZXQgc3RhcnRlZCwgdGhlbiB0aGUgdXNlciBhZ2VudCBtdXN0XG4gICAgICAvLyBzZW5kIGEgV2ViU29ja2V0IE1lc3NhZ2UgY29tcHJpc2VkIG9mIGRhdGEgdXNpbmcgYSBiaW5hcnkgZnJhbWVcbiAgICAgIC8vIG9wY29kZTsgaWYgdGhlIGRhdGEgY2Fubm90IGJlIHNlbnQsIGUuZy4gYmVjYXVzZSBpdCB3b3VsZCBuZWVkIHRvXG4gICAgICAvLyBiZSBidWZmZXJlZCBidXQgdGhlIGJ1ZmZlciBpcyBmdWxsLCB0aGUgdXNlciBhZ2VudCBtdXN0IGZsYWcgdGhlXG4gICAgICAvLyBXZWJTb2NrZXQgYXMgZnVsbCBhbmQgdGhlbiBjbG9zZSB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24uIFRoZSBkYXRhXG4gICAgICAvLyB0byBiZSBzZW50IGlzIHRoZSByYXcgZGF0YSByZXByZXNlbnRlZCBieSB0aGUgQmxvYiBvYmplY3QuIEFueVxuICAgICAgLy8gaW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aXRoIGEgQmxvYiBhcmd1bWVudCB0aGF0IGRvZXMgbm90IHRocm93XG4gICAgICAvLyBhbiBleGNlcHRpb24gbXVzdCBpbmNyZWFzZSB0aGUgYnVmZmVyZWRBbW91bnQgYXR0cmlidXRlIGJ5IHRoZSBzaXplXG4gICAgICAvLyBvZiB0aGUgQmxvYiBvYmplY3TigJlzIHJhdyBkYXRhLCBpbiBieXRlcy5cblxuICAgICAgY29uc3QgZnJhbWUgPSBuZXcgV2Vic29ja2V0RnJhbWVTZW5kKClcblxuICAgICAgZGF0YS5hcnJheUJ1ZmZlcigpLnRoZW4oKGFiKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gQnVmZmVyLmZyb20oYWIpXG4gICAgICAgIGZyYW1lLmZyYW1lRGF0YSA9IHZhbHVlXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IGZyYW1lLmNyZWF0ZUZyYW1lKG9wY29kZXMuQklOQVJZKVxuXG4gICAgICAgIHRoaXMuI2J1ZmZlcmVkQW1vdW50ICs9IHZhbHVlLmJ5dGVMZW5ndGhcbiAgICAgICAgc29ja2V0LndyaXRlKGJ1ZmZlciwgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuI2J1ZmZlcmVkQW1vdW50IC09IHZhbHVlLmJ5dGVMZW5ndGhcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZ2V0IHJlYWR5U3RhdGUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIC8vIFRoZSByZWFkeVN0YXRlIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXMncyByZWFkeSBzdGF0ZS5cbiAgICByZXR1cm4gdGhpc1trUmVhZHlTdGF0ZV1cbiAgfVxuXG4gIGdldCBidWZmZXJlZEFtb3VudCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgcmV0dXJuIHRoaXMuI2J1ZmZlcmVkQW1vdW50XG4gIH1cblxuICBnZXQgdXJsICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICAvLyBUaGUgdXJsIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXMncyB1cmwsIHNlcmlhbGl6ZWQuXG4gICAgcmV0dXJuIFVSTFNlcmlhbGl6ZXIodGhpc1trV2ViU29ja2V0VVJMXSlcbiAgfVxuXG4gIGdldCBleHRlbnNpb25zICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXh0ZW5zaW9uc1xuICB9XG5cbiAgZ2V0IHByb3RvY29sICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICByZXR1cm4gdGhpcy4jcHJvdG9jb2xcbiAgfVxuXG4gIGdldCBvbm9wZW4gKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIHJldHVybiB0aGlzLiNldmVudHMub3BlblxuICB9XG5cbiAgc2V0IG9ub3BlbiAoZm4pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICBpZiAodGhpcy4jZXZlbnRzLm9wZW4pIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignb3BlbicsIHRoaXMuI2V2ZW50cy5vcGVuKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuI2V2ZW50cy5vcGVuID0gZm5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsIGZuKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNldmVudHMub3BlbiA9IG51bGxcbiAgICB9XG4gIH1cblxuICBnZXQgb25lcnJvciAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50cy5lcnJvclxuICB9XG5cbiAgc2V0IG9uZXJyb3IgKGZuKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgaWYgKHRoaXMuI2V2ZW50cy5lcnJvcikge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIHRoaXMuI2V2ZW50cy5lcnJvcilcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLiNldmVudHMuZXJyb3IgPSBmblxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGZuKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNldmVudHMuZXJyb3IgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgZ2V0IG9uY2xvc2UgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIHJldHVybiB0aGlzLiNldmVudHMuY2xvc2VcbiAgfVxuXG4gIHNldCBvbmNsb3NlIChmbikge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIGlmICh0aGlzLiNldmVudHMuY2xvc2UpIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCB0aGlzLiNldmVudHMuY2xvc2UpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy4jZXZlbnRzLmNsb3NlID0gZm5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jZXZlbnRzLmNsb3NlID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGdldCBvbm1lc3NhZ2UgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIHJldHVybiB0aGlzLiNldmVudHMubWVzc2FnZVxuICB9XG5cbiAgc2V0IG9ubWVzc2FnZSAoZm4pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICBpZiAodGhpcy4jZXZlbnRzLm1lc3NhZ2UpIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuI2V2ZW50cy5tZXNzYWdlKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuI2V2ZW50cy5tZXNzYWdlID0gZm5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZuKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNldmVudHMubWVzc2FnZSA9IG51bGxcbiAgICB9XG4gIH1cblxuICBnZXQgYmluYXJ5VHlwZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgcmV0dXJuIHRoaXNba0JpbmFyeVR5cGVdXG4gIH1cblxuICBzZXQgYmluYXJ5VHlwZSAodHlwZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIGlmICh0eXBlICE9PSAnYmxvYicgJiYgdHlwZSAhPT0gJ2FycmF5YnVmZmVyJykge1xuICAgICAgdGhpc1trQmluYXJ5VHlwZV0gPSAnYmxvYidcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1trQmluYXJ5VHlwZV0gPSB0eXBlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93ZWJzb2NrZXRzLnNwZWMud2hhdHdnLm9yZy8jZmVlZGJhY2stZnJvbS10aGUtcHJvdG9jb2xcbiAgICovXG4gICNvbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCAocmVzcG9uc2UpIHtcbiAgICAvLyBwcm9jZXNzUmVzcG9uc2UgaXMgY2FsbGVkIHdoZW4gdGhlIFwicmVzcG9uc2XigJlzIGhlYWRlciBsaXN0IGhhcyBiZWVuIHJlY2VpdmVkIGFuZCBpbml0aWFsaXplZC5cIlxuICAgIC8vIG9uY2UgdGhpcyBoYXBwZW5zLCB0aGUgY29ubmVjdGlvbiBpcyBvcGVuXG4gICAgdGhpc1trUmVzcG9uc2VdID0gcmVzcG9uc2VcblxuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBCeXRlUGFyc2VyKHRoaXMpXG4gICAgcGFyc2VyLm9uKCdkcmFpbicsIGZ1bmN0aW9uIG9uUGFyc2VyRHJhaW4gKCkge1xuICAgICAgdGhpcy53c1trUmVzcG9uc2VdLnNvY2tldC5yZXN1bWUoKVxuICAgIH0pXG5cbiAgICByZXNwb25zZS5zb2NrZXQud3MgPSB0aGlzXG4gICAgdGhpc1trQnl0ZVBhcnNlcl0gPSBwYXJzZXJcblxuICAgIC8vIDEuIENoYW5nZSB0aGUgcmVhZHkgc3RhdGUgdG8gT1BFTiAoMSkuXG4gICAgdGhpc1trUmVhZHlTdGF0ZV0gPSBzdGF0ZXMuT1BFTlxuXG4gICAgLy8gMi4gQ2hhbmdlIHRoZSBleHRlbnNpb25zIGF0dHJpYnV0ZeKAmXMgdmFsdWUgdG8gdGhlIGV4dGVuc2lvbnMgaW4gdXNlLCBpZlxuICAgIC8vICAgIGl0IGlzIG5vdCB0aGUgbnVsbCB2YWx1ZS5cbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzY0NTUjc2VjdGlvbi05LjFcbiAgICBjb25zdCBleHRlbnNpb25zID0gcmVzcG9uc2UuaGVhZGVyc0xpc3QuZ2V0KCdzZWMtd2Vic29ja2V0LWV4dGVuc2lvbnMnKVxuXG4gICAgaWYgKGV4dGVuc2lvbnMgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuI2V4dGVuc2lvbnMgPSBleHRlbnNpb25zXG4gICAgfVxuXG4gICAgLy8gMy4gQ2hhbmdlIHRoZSBwcm90b2NvbCBhdHRyaWJ1dGXigJlzIHZhbHVlIHRvIHRoZSBzdWJwcm90b2NvbCBpbiB1c2UsIGlmXG4gICAgLy8gICAgaXQgaXMgbm90IHRoZSBudWxsIHZhbHVlLlxuICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjQ1NSNzZWN0aW9uLTEuOVxuICAgIGNvbnN0IHByb3RvY29sID0gcmVzcG9uc2UuaGVhZGVyc0xpc3QuZ2V0KCdzZWMtd2Vic29ja2V0LXByb3RvY29sJylcblxuICAgIGlmIChwcm90b2NvbCAhPT0gbnVsbCkge1xuICAgICAgdGhpcy4jcHJvdG9jb2wgPSBwcm90b2NvbFxuICAgIH1cblxuICAgIC8vIDQuIEZpcmUgYW4gZXZlbnQgbmFtZWQgb3BlbiBhdCB0aGUgV2ViU29ja2V0IG9iamVjdC5cbiAgICBmaXJlRXZlbnQoJ29wZW4nLCB0aGlzKVxuICB9XG59XG5cbi8vIGh0dHBzOi8vd2Vic29ja2V0cy5zcGVjLndoYXR3Zy5vcmcvI2RvbS13ZWJzb2NrZXQtY29ubmVjdGluZ1xuV2ViU29ja2V0LkNPTk5FQ1RJTkcgPSBXZWJTb2NrZXQucHJvdG90eXBlLkNPTk5FQ1RJTkcgPSBzdGF0ZXMuQ09OTkVDVElOR1xuLy8gaHR0cHM6Ly93ZWJzb2NrZXRzLnNwZWMud2hhdHdnLm9yZy8jZG9tLXdlYnNvY2tldC1vcGVuXG5XZWJTb2NrZXQuT1BFTiA9IFdlYlNvY2tldC5wcm90b3R5cGUuT1BFTiA9IHN0YXRlcy5PUEVOXG4vLyBodHRwczovL3dlYnNvY2tldHMuc3BlYy53aGF0d2cub3JnLyNkb20td2Vic29ja2V0LWNsb3NpbmdcbldlYlNvY2tldC5DTE9TSU5HID0gV2ViU29ja2V0LnByb3RvdHlwZS5DTE9TSU5HID0gc3RhdGVzLkNMT1NJTkdcbi8vIGh0dHBzOi8vd2Vic29ja2V0cy5zcGVjLndoYXR3Zy5vcmcvI2RvbS13ZWJzb2NrZXQtY2xvc2VkXG5XZWJTb2NrZXQuQ0xPU0VEID0gV2ViU29ja2V0LnByb3RvdHlwZS5DTE9TRUQgPSBzdGF0ZXMuQ0xPU0VEXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFdlYlNvY2tldC5wcm90b3R5cGUsIHtcbiAgQ09OTkVDVElORzogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgT1BFTjogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgQ0xPU0lORzogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgQ0xPU0VEOiBzdGF0aWNQcm9wZXJ0eURlc2NyaXB0b3JzLFxuICB1cmw6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHJlYWR5U3RhdGU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGJ1ZmZlcmVkQW1vdW50OiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbm9wZW46IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIG9uZXJyb3I6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIG9uY2xvc2U6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGNsb3NlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbm1lc3NhZ2U6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGJpbmFyeVR5cGU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHNlbmQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGV4dGVuc2lvbnM6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHByb3RvY29sOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBbU3ltYm9sLnRvU3RyaW5nVGFnXToge1xuICAgIHZhbHVlOiAnV2ViU29ja2V0JyxcbiAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH1cbn0pXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFdlYlNvY2tldCwge1xuICBDT05ORUNUSU5HOiBzdGF0aWNQcm9wZXJ0eURlc2NyaXB0b3JzLFxuICBPUEVOOiBzdGF0aWNQcm9wZXJ0eURlc2NyaXB0b3JzLFxuICBDTE9TSU5HOiBzdGF0aWNQcm9wZXJ0eURlc2NyaXB0b3JzLFxuICBDTE9TRUQ6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnNcbn0pXG5cbndlYmlkbC5jb252ZXJ0ZXJzWydzZXF1ZW5jZTxET01TdHJpbmc+J10gPSB3ZWJpZGwuc2VxdWVuY2VDb252ZXJ0ZXIoXG4gIHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZ1xuKVxuXG53ZWJpZGwuY29udmVydGVyc1snRE9NU3RyaW5nIG9yIHNlcXVlbmNlPERPTVN0cmluZz4nXSA9IGZ1bmN0aW9uIChWKSB7XG4gIGlmICh3ZWJpZGwudXRpbC5UeXBlKFYpID09PSAnT2JqZWN0JyAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gVikge1xuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVyc1snc2VxdWVuY2U8RE9NU3RyaW5nPiddKFYpXG4gIH1cblxuICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKFYpXG59XG5cbi8vIFRoaXMgaW1wbGVtZW50cyB0aGUgcHJvcHNhbCBtYWRlIGluIGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvd2Vic29ja2V0cy9pc3N1ZXMvNDJcbndlYmlkbC5jb252ZXJ0ZXJzLldlYlNvY2tldEluaXQgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIHtcbiAgICBrZXk6ICdwcm90b2NvbHMnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnNbJ0RPTVN0cmluZyBvciBzZXF1ZW5jZTxET01TdHJpbmc+J10sXG4gICAgZ2V0IGRlZmF1bHRWYWx1ZSAoKSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gIH0sXG4gIHtcbiAgICBrZXk6ICdkaXNwYXRjaGVyJyxcbiAgICBjb252ZXJ0ZXI6IChWKSA9PiBWLFxuICAgIGdldCBkZWZhdWx0VmFsdWUgKCkge1xuICAgICAgcmV0dXJuIGdldEdsb2JhbERpc3BhdGNoZXIoKVxuICAgIH1cbiAgfSxcbiAge1xuICAgIGtleTogJ2hlYWRlcnMnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKHdlYmlkbC5jb252ZXJ0ZXJzLkhlYWRlcnNJbml0KVxuICB9XG5dKVxuXG53ZWJpZGwuY29udmVydGVyc1snRE9NU3RyaW5nIG9yIHNlcXVlbmNlPERPTVN0cmluZz4gb3IgV2ViU29ja2V0SW5pdCddID0gZnVuY3Rpb24gKFYpIHtcbiAgaWYgKHdlYmlkbC51dGlsLlR5cGUoVikgPT09ICdPYmplY3QnICYmICEoU3ltYm9sLml0ZXJhdG9yIGluIFYpKSB7XG4gICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLldlYlNvY2tldEluaXQoVilcbiAgfVxuXG4gIHJldHVybiB7IHByb3RvY29sczogd2ViaWRsLmNvbnZlcnRlcnNbJ0RPTVN0cmluZyBvciBzZXF1ZW5jZTxET01TdHJpbmc+J10oVikgfVxufVxuXG53ZWJpZGwuY29udmVydGVycy5XZWJTb2NrZXRTZW5kRGF0YSA9IGZ1bmN0aW9uIChWKSB7XG4gIGlmICh3ZWJpZGwudXRpbC5UeXBlKFYpID09PSAnT2JqZWN0Jykge1xuICAgIGlmIChpc0Jsb2JMaWtlKFYpKSB7XG4gICAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuQmxvYihWLCB7IHN0cmljdDogZmFsc2UgfSlcbiAgICB9XG5cbiAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KFYpIHx8IHR5cGVzLmlzQW55QXJyYXlCdWZmZXIoVikpIHtcbiAgICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5CdWZmZXJTb3VyY2UoVilcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKFYpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBXZWJTb2NrZXRcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBDbGllbnQgPSByZXF1aXJlKCcuL2xpYi9jbGllbnQnKVxuY29uc3QgRGlzcGF0Y2hlciA9IHJlcXVpcmUoJy4vbGliL2Rpc3BhdGNoZXInKVxuY29uc3QgZXJyb3JzID0gcmVxdWlyZSgnLi9saWIvY29yZS9lcnJvcnMnKVxuY29uc3QgUG9vbCA9IHJlcXVpcmUoJy4vbGliL3Bvb2wnKVxuY29uc3QgQmFsYW5jZWRQb29sID0gcmVxdWlyZSgnLi9saWIvYmFsYW5jZWQtcG9vbCcpXG5jb25zdCBBZ2VudCA9IHJlcXVpcmUoJy4vbGliL2FnZW50JylcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuL2xpYi9jb3JlL3V0aWwnKVxuY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciB9ID0gZXJyb3JzXG5jb25zdCBhcGkgPSByZXF1aXJlKCcuL2xpYi9hcGknKVxuY29uc3QgYnVpbGRDb25uZWN0b3IgPSByZXF1aXJlKCcuL2xpYi9jb3JlL2Nvbm5lY3QnKVxuY29uc3QgTW9ja0NsaWVudCA9IHJlcXVpcmUoJy4vbGliL21vY2svbW9jay1jbGllbnQnKVxuY29uc3QgTW9ja0FnZW50ID0gcmVxdWlyZSgnLi9saWIvbW9jay9tb2NrLWFnZW50JylcbmNvbnN0IE1vY2tQb29sID0gcmVxdWlyZSgnLi9saWIvbW9jay9tb2NrLXBvb2wnKVxuY29uc3QgbW9ja0Vycm9ycyA9IHJlcXVpcmUoJy4vbGliL21vY2svbW9jay1lcnJvcnMnKVxuY29uc3QgUHJveHlBZ2VudCA9IHJlcXVpcmUoJy4vbGliL3Byb3h5LWFnZW50JylcbmNvbnN0IFJldHJ5SGFuZGxlciA9IHJlcXVpcmUoJy4vbGliL2hhbmRsZXIvUmV0cnlIYW5kbGVyJylcbmNvbnN0IHsgZ2V0R2xvYmFsRGlzcGF0Y2hlciwgc2V0R2xvYmFsRGlzcGF0Y2hlciB9ID0gcmVxdWlyZSgnLi9saWIvZ2xvYmFsJylcbmNvbnN0IERlY29yYXRvckhhbmRsZXIgPSByZXF1aXJlKCcuL2xpYi9oYW5kbGVyL0RlY29yYXRvckhhbmRsZXInKVxuY29uc3QgUmVkaXJlY3RIYW5kbGVyID0gcmVxdWlyZSgnLi9saWIvaGFuZGxlci9SZWRpcmVjdEhhbmRsZXInKVxuY29uc3QgY3JlYXRlUmVkaXJlY3RJbnRlcmNlcHRvciA9IHJlcXVpcmUoJy4vbGliL2ludGVyY2VwdG9yL3JlZGlyZWN0SW50ZXJjZXB0b3InKVxuXG5sZXQgaGFzQ3J5cHRvXG50cnkge1xuICByZXF1aXJlKCdjcnlwdG8nKVxuICBoYXNDcnlwdG8gPSB0cnVlXG59IGNhdGNoIHtcbiAgaGFzQ3J5cHRvID0gZmFsc2Vcbn1cblxuT2JqZWN0LmFzc2lnbihEaXNwYXRjaGVyLnByb3RvdHlwZSwgYXBpKVxuXG5tb2R1bGUuZXhwb3J0cy5EaXNwYXRjaGVyID0gRGlzcGF0Y2hlclxubW9kdWxlLmV4cG9ydHMuQ2xpZW50ID0gQ2xpZW50XG5tb2R1bGUuZXhwb3J0cy5Qb29sID0gUG9vbFxubW9kdWxlLmV4cG9ydHMuQmFsYW5jZWRQb29sID0gQmFsYW5jZWRQb29sXG5tb2R1bGUuZXhwb3J0cy5BZ2VudCA9IEFnZW50XG5tb2R1bGUuZXhwb3J0cy5Qcm94eUFnZW50ID0gUHJveHlBZ2VudFxubW9kdWxlLmV4cG9ydHMuUmV0cnlIYW5kbGVyID0gUmV0cnlIYW5kbGVyXG5cbm1vZHVsZS5leHBvcnRzLkRlY29yYXRvckhhbmRsZXIgPSBEZWNvcmF0b3JIYW5kbGVyXG5tb2R1bGUuZXhwb3J0cy5SZWRpcmVjdEhhbmRsZXIgPSBSZWRpcmVjdEhhbmRsZXJcbm1vZHVsZS5leHBvcnRzLmNyZWF0ZVJlZGlyZWN0SW50ZXJjZXB0b3IgPSBjcmVhdGVSZWRpcmVjdEludGVyY2VwdG9yXG5cbm1vZHVsZS5leHBvcnRzLmJ1aWxkQ29ubmVjdG9yID0gYnVpbGRDb25uZWN0b3Jcbm1vZHVsZS5leHBvcnRzLmVycm9ycyA9IGVycm9yc1xuXG5mdW5jdGlvbiBtYWtlRGlzcGF0Y2hlciAoZm4pIHtcbiAgcmV0dXJuICh1cmwsIG9wdHMsIGhhbmRsZXIpID0+IHtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGhhbmRsZXIgPSBvcHRzXG4gICAgICBvcHRzID0gbnVsbFxuICAgIH1cblxuICAgIGlmICghdXJsIHx8ICh0eXBlb2YgdXJsICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgdXJsICE9PSAnb2JqZWN0JyAmJiAhKHVybCBpbnN0YW5jZW9mIFVSTCkpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgdXJsJylcbiAgICB9XG5cbiAgICBpZiAob3B0cyAhPSBudWxsICYmIHR5cGVvZiBvcHRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9wdHMnKVxuICAgIH1cblxuICAgIGlmIChvcHRzICYmIG9wdHMucGF0aCAhPSBudWxsKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdHMucGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9wdHMucGF0aCcpXG4gICAgICB9XG5cbiAgICAgIGxldCBwYXRoID0gb3B0cy5wYXRoXG4gICAgICBpZiAoIW9wdHMucGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgcGF0aCA9IGAvJHtwYXRofWBcbiAgICAgIH1cblxuICAgICAgdXJsID0gbmV3IFVSTCh1dGlsLnBhcnNlT3JpZ2luKHVybCkub3JpZ2luICsgcGF0aClcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFvcHRzKSB7XG4gICAgICAgIG9wdHMgPSB0eXBlb2YgdXJsID09PSAnb2JqZWN0JyA/IHVybCA6IHt9XG4gICAgICB9XG5cbiAgICAgIHVybCA9IHV0aWwucGFyc2VVUkwodXJsKVxuICAgIH1cblxuICAgIGNvbnN0IHsgYWdlbnQsIGRpc3BhdGNoZXIgPSBnZXRHbG9iYWxEaXNwYXRjaGVyKCkgfSA9IG9wdHNcblxuICAgIGlmIChhZ2VudCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCd1bnN1cHBvcnRlZCBvcHRzLmFnZW50LiBEaWQgeW91IG1lYW4gb3B0cy5jbGllbnQ/JylcbiAgICB9XG5cbiAgICByZXR1cm4gZm4uY2FsbChkaXNwYXRjaGVyLCB7XG4gICAgICAuLi5vcHRzLFxuICAgICAgb3JpZ2luOiB1cmwub3JpZ2luLFxuICAgICAgcGF0aDogdXJsLnNlYXJjaCA/IGAke3VybC5wYXRobmFtZX0ke3VybC5zZWFyY2h9YCA6IHVybC5wYXRobmFtZSxcbiAgICAgIG1ldGhvZDogb3B0cy5tZXRob2QgfHwgKG9wdHMuYm9keSA/ICdQVVQnIDogJ0dFVCcpXG4gICAgfSwgaGFuZGxlcilcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cy5zZXRHbG9iYWxEaXNwYXRjaGVyID0gc2V0R2xvYmFsRGlzcGF0Y2hlclxubW9kdWxlLmV4cG9ydHMuZ2V0R2xvYmFsRGlzcGF0Y2hlciA9IGdldEdsb2JhbERpc3BhdGNoZXJcblxuaWYgKHV0aWwubm9kZU1ham9yID4gMTYgfHwgKHV0aWwubm9kZU1ham9yID09PSAxNiAmJiB1dGlsLm5vZGVNaW5vciA+PSA4KSkge1xuICBsZXQgZmV0Y2hJbXBsID0gbnVsbFxuICBtb2R1bGUuZXhwb3J0cy5mZXRjaCA9IGFzeW5jIGZ1bmN0aW9uIGZldGNoIChyZXNvdXJjZSkge1xuICAgIGlmICghZmV0Y2hJbXBsKSB7XG4gICAgICBmZXRjaEltcGwgPSByZXF1aXJlKCcuL2xpYi9mZXRjaCcpLmZldGNoXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmZXRjaEltcGwoLi4uYXJndW1lbnRzKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKHR5cGVvZiBlcnIgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVyciwgdGhpcylcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuICB9XG4gIG1vZHVsZS5leHBvcnRzLkhlYWRlcnMgPSByZXF1aXJlKCcuL2xpYi9mZXRjaC9oZWFkZXJzJykuSGVhZGVyc1xuICBtb2R1bGUuZXhwb3J0cy5SZXNwb25zZSA9IHJlcXVpcmUoJy4vbGliL2ZldGNoL3Jlc3BvbnNlJykuUmVzcG9uc2VcbiAgbW9kdWxlLmV4cG9ydHMuUmVxdWVzdCA9IHJlcXVpcmUoJy4vbGliL2ZldGNoL3JlcXVlc3QnKS5SZXF1ZXN0XG4gIG1vZHVsZS5leHBvcnRzLkZvcm1EYXRhID0gcmVxdWlyZSgnLi9saWIvZmV0Y2gvZm9ybWRhdGEnKS5Gb3JtRGF0YVxuICBtb2R1bGUuZXhwb3J0cy5GaWxlID0gcmVxdWlyZSgnLi9saWIvZmV0Y2gvZmlsZScpLkZpbGVcbiAgbW9kdWxlLmV4cG9ydHMuRmlsZVJlYWRlciA9IHJlcXVpcmUoJy4vbGliL2ZpbGVhcGkvZmlsZXJlYWRlcicpLkZpbGVSZWFkZXJcblxuICBjb25zdCB7IHNldEdsb2JhbE9yaWdpbiwgZ2V0R2xvYmFsT3JpZ2luIH0gPSByZXF1aXJlKCcuL2xpYi9mZXRjaC9nbG9iYWwnKVxuXG4gIG1vZHVsZS5leHBvcnRzLnNldEdsb2JhbE9yaWdpbiA9IHNldEdsb2JhbE9yaWdpblxuICBtb2R1bGUuZXhwb3J0cy5nZXRHbG9iYWxPcmlnaW4gPSBnZXRHbG9iYWxPcmlnaW5cblxuICBjb25zdCB7IENhY2hlU3RvcmFnZSB9ID0gcmVxdWlyZSgnLi9saWIvY2FjaGUvY2FjaGVzdG9yYWdlJylcbiAgY29uc3QgeyBrQ29uc3RydWN0IH0gPSByZXF1aXJlKCcuL2xpYi9jYWNoZS9zeW1ib2xzJylcblxuICAvLyBDYWNoZSAmIENhY2hlU3RvcmFnZSBhcmUgdGlnaHRseSBjb3VwbGVkIHdpdGggZmV0Y2guIEV2ZW4gaWYgaXQgbWF5IHJ1blxuICAvLyBpbiBhbiBvbGRlciB2ZXJzaW9uIG9mIE5vZGUsIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgdXNlIHdpdGhvdXQgZmV0Y2guXG4gIG1vZHVsZS5leHBvcnRzLmNhY2hlcyA9IG5ldyBDYWNoZVN0b3JhZ2Uoa0NvbnN0cnVjdClcbn1cblxuaWYgKHV0aWwubm9kZU1ham9yID49IDE2KSB7XG4gIGNvbnN0IHsgZGVsZXRlQ29va2llLCBnZXRDb29raWVzLCBnZXRTZXRDb29raWVzLCBzZXRDb29raWUgfSA9IHJlcXVpcmUoJy4vbGliL2Nvb2tpZXMnKVxuXG4gIG1vZHVsZS5leHBvcnRzLmRlbGV0ZUNvb2tpZSA9IGRlbGV0ZUNvb2tpZVxuICBtb2R1bGUuZXhwb3J0cy5nZXRDb29raWVzID0gZ2V0Q29va2llc1xuICBtb2R1bGUuZXhwb3J0cy5nZXRTZXRDb29raWVzID0gZ2V0U2V0Q29va2llc1xuICBtb2R1bGUuZXhwb3J0cy5zZXRDb29raWUgPSBzZXRDb29raWVcblxuICBjb25zdCB7IHBhcnNlTUlNRVR5cGUsIHNlcmlhbGl6ZUFNaW1lVHlwZSB9ID0gcmVxdWlyZSgnLi9saWIvZmV0Y2gvZGF0YVVSTCcpXG5cbiAgbW9kdWxlLmV4cG9ydHMucGFyc2VNSU1FVHlwZSA9IHBhcnNlTUlNRVR5cGVcbiAgbW9kdWxlLmV4cG9ydHMuc2VyaWFsaXplQU1pbWVUeXBlID0gc2VyaWFsaXplQU1pbWVUeXBlXG59XG5cbmlmICh1dGlsLm5vZGVNYWpvciA+PSAxOCAmJiBoYXNDcnlwdG8pIHtcbiAgY29uc3QgeyBXZWJTb2NrZXQgfSA9IHJlcXVpcmUoJy4vbGliL3dlYnNvY2tldC93ZWJzb2NrZXQnKVxuXG4gIG1vZHVsZS5leHBvcnRzLldlYlNvY2tldCA9IFdlYlNvY2tldFxufVxuXG5tb2R1bGUuZXhwb3J0cy5yZXF1ZXN0ID0gbWFrZURpc3BhdGNoZXIoYXBpLnJlcXVlc3QpXG5tb2R1bGUuZXhwb3J0cy5zdHJlYW0gPSBtYWtlRGlzcGF0Y2hlcihhcGkuc3RyZWFtKVxubW9kdWxlLmV4cG9ydHMucGlwZWxpbmUgPSBtYWtlRGlzcGF0Y2hlcihhcGkucGlwZWxpbmUpXG5tb2R1bGUuZXhwb3J0cy5jb25uZWN0ID0gbWFrZURpc3BhdGNoZXIoYXBpLmNvbm5lY3QpXG5tb2R1bGUuZXhwb3J0cy51cGdyYWRlID0gbWFrZURpc3BhdGNoZXIoYXBpLnVwZ3JhZGUpXG5cbm1vZHVsZS5leHBvcnRzLk1vY2tDbGllbnQgPSBNb2NrQ2xpZW50XG5tb2R1bGUuZXhwb3J0cy5Nb2NrUG9vbCA9IE1vY2tQb29sXG5tb2R1bGUuZXhwb3J0cy5Nb2NrQWdlbnQgPSBNb2NrQWdlbnRcbm1vZHVsZS5leHBvcnRzLm1vY2tFcnJvcnMgPSBtb2NrRXJyb3JzXG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgb3duS2V5cyA9IGZ1bmN0aW9uKG8pIHtcbiAgICAgICAgb3duS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgICB2YXIgYXIgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gbykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBrKSkgYXJbYXIubGVuZ3RoXSA9IGs7XG4gICAgICAgICAgICByZXR1cm4gYXI7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBvd25LZXlzKG8pO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChtb2QpIHtcbiAgICAgICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgPSBvd25LZXlzKG1vZCksIGkgPSAwOyBpIDwgay5sZW5ndGg7IGkrKykgaWYgKGtbaV0gIT09IFwiZGVmYXVsdFwiKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGtbaV0pO1xuICAgICAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG59KSgpO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldEF1dGhTdHJpbmcgPSBnZXRBdXRoU3RyaW5nO1xuZXhwb3J0cy5nZXRQcm94eUFnZW50ID0gZ2V0UHJveHlBZ2VudDtcbmV4cG9ydHMuZ2V0UHJveHlBZ2VudERpc3BhdGNoZXIgPSBnZXRQcm94eUFnZW50RGlzcGF0Y2hlcjtcbmV4cG9ydHMuZ2V0UHJveHlGZXRjaCA9IGdldFByb3h5RmV0Y2g7XG5leHBvcnRzLmdldEFwaUJhc2VVcmwgPSBnZXRBcGlCYXNlVXJsO1xuY29uc3QgaHR0cENsaWVudCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiQGFjdGlvbnMvaHR0cC1jbGllbnRcIikpO1xuY29uc3QgdW5kaWNpXzEgPSByZXF1aXJlKFwidW5kaWNpXCIpO1xuZnVuY3Rpb24gZ2V0QXV0aFN0cmluZyh0b2tlbiwgb3B0aW9ucykge1xuICAgIGlmICghdG9rZW4gJiYgIW9wdGlvbnMuYXV0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmFtZXRlciB0b2tlbiBvciBvcHRzLmF1dGggaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodG9rZW4gJiYgb3B0aW9ucy5hdXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyYW1ldGVycyB0b2tlbiBhbmQgb3B0cy5hdXRoIG1heSBub3QgYm90aCBiZSBzcGVjaWZpZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiBvcHRpb25zLmF1dGggPT09ICdzdHJpbmcnID8gb3B0aW9ucy5hdXRoIDogYHRva2VuICR7dG9rZW59YDtcbn1cbmZ1bmN0aW9uIGdldFByb3h5QWdlbnQoZGVzdGluYXRpb25VcmwpIHtcbiAgICBjb25zdCBoYyA9IG5ldyBodHRwQ2xpZW50Lkh0dHBDbGllbnQoKTtcbiAgICByZXR1cm4gaGMuZ2V0QWdlbnQoZGVzdGluYXRpb25VcmwpO1xufVxuZnVuY3Rpb24gZ2V0UHJveHlBZ2VudERpc3BhdGNoZXIoZGVzdGluYXRpb25VcmwpIHtcbiAgICBjb25zdCBoYyA9IG5ldyBodHRwQ2xpZW50Lkh0dHBDbGllbnQoKTtcbiAgICByZXR1cm4gaGMuZ2V0QWdlbnREaXNwYXRjaGVyKGRlc3RpbmF0aW9uVXJsKTtcbn1cbmZ1bmN0aW9uIGdldFByb3h5RmV0Y2goZGVzdGluYXRpb25VcmwpIHtcbiAgICBjb25zdCBodHRwRGlzcGF0Y2hlciA9IGdldFByb3h5QWdlbnREaXNwYXRjaGVyKGRlc3RpbmF0aW9uVXJsKTtcbiAgICBjb25zdCBwcm94eUZldGNoID0gKHVybCwgb3B0cykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICByZXR1cm4gKDAsIHVuZGljaV8xLmZldGNoKSh1cmwsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0cyksIHsgZGlzcGF0Y2hlcjogaHR0cERpc3BhdGNoZXIgfSkpO1xuICAgIH0pO1xuICAgIHJldHVybiBwcm94eUZldGNoO1xufVxuZnVuY3Rpb24gZ2V0QXBpQmFzZVVybCgpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnZbJ0dJVEhVQl9BUElfVVJMJ10gfHwgJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20nO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIiwiZnVuY3Rpb24gZ2V0VXNlckFnZW50KCkge1xuICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSBcIm9iamVjdFwiICYmIFwidXNlckFnZW50XCIgaW4gbmF2aWdhdG9yKSB7XG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09IFwib2JqZWN0XCIgJiYgcHJvY2Vzcy52ZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGBOb2RlLmpzLyR7cHJvY2Vzcy52ZXJzaW9uLnN1YnN0cigxKX0gKCR7cHJvY2Vzcy5wbGF0Zm9ybX07ICR7cHJvY2Vzcy5hcmNofSlgO1xuICAgIH1cbiAgICByZXR1cm4gXCI8ZW52aXJvbm1lbnQgdW5kZXRlY3RhYmxlPlwiO1xufVxuXG5leHBvcnQgeyBnZXRVc2VyQWdlbnQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIiwibW9kdWxlLmV4cG9ydHMgPSByZWdpc3RlcjtcblxuZnVuY3Rpb24gcmVnaXN0ZXIoc3RhdGUsIG5hbWUsIG1ldGhvZCwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIG1ldGhvZCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwibWV0aG9kIGZvciBiZWZvcmUgaG9vayBtdXN0IGJlIGEgZnVuY3Rpb25cIik7XG4gIH1cblxuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShuYW1lKSkge1xuICAgIHJldHVybiBuYW1lLnJldmVyc2UoKS5yZWR1Y2UoZnVuY3Rpb24gKGNhbGxiYWNrLCBuYW1lKSB7XG4gICAgICByZXR1cm4gcmVnaXN0ZXIuYmluZChudWxsLCBzdGF0ZSwgbmFtZSwgY2FsbGJhY2ssIG9wdGlvbnMpO1xuICAgIH0sIG1ldGhvZCkoKTtcbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXN0YXRlLnJlZ2lzdHJ5W25hbWVdKSB7XG4gICAgICByZXR1cm4gbWV0aG9kKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiBzdGF0ZS5yZWdpc3RyeVtuYW1lXS5yZWR1Y2UoZnVuY3Rpb24gKG1ldGhvZCwgcmVnaXN0ZXJlZCkge1xuICAgICAgcmV0dXJuIHJlZ2lzdGVyZWQuaG9vay5iaW5kKG51bGwsIG1ldGhvZCwgb3B0aW9ucyk7XG4gICAgfSwgbWV0aG9kKSgpO1xuICB9KTtcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gYWRkSG9vaztcblxuZnVuY3Rpb24gYWRkSG9vayhzdGF0ZSwga2luZCwgbmFtZSwgaG9vaykge1xuICB2YXIgb3JpZyA9IGhvb2s7XG4gIGlmICghc3RhdGUucmVnaXN0cnlbbmFtZV0pIHtcbiAgICBzdGF0ZS5yZWdpc3RyeVtuYW1lXSA9IFtdO1xuICB9XG5cbiAgaWYgKGtpbmQgPT09IFwiYmVmb3JlXCIpIHtcbiAgICBob29rID0gZnVuY3Rpb24gKG1ldGhvZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgIC50aGVuKG9yaWcuYmluZChudWxsLCBvcHRpb25zKSlcbiAgICAgICAgLnRoZW4obWV0aG9kLmJpbmQobnVsbCwgb3B0aW9ucykpO1xuICAgIH07XG4gIH1cblxuICBpZiAoa2luZCA9PT0gXCJhZnRlclwiKSB7XG4gICAgaG9vayA9IGZ1bmN0aW9uIChtZXRob2QsIG9wdGlvbnMpIHtcbiAgICAgIHZhciByZXN1bHQ7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgLnRoZW4obWV0aG9kLmJpbmQobnVsbCwgb3B0aW9ucykpXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHRfKSB7XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0XztcbiAgICAgICAgICByZXR1cm4gb3JpZyhyZXN1bHQsIG9wdGlvbnMpO1xuICAgICAgICB9KVxuICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChraW5kID09PSBcImVycm9yXCIpIHtcbiAgICBob29rID0gZnVuY3Rpb24gKG1ldGhvZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgIC50aGVuKG1ldGhvZC5iaW5kKG51bGwsIG9wdGlvbnMpKVxuICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIG9yaWcoZXJyb3IsIG9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgc3RhdGUucmVnaXN0cnlbbmFtZV0ucHVzaCh7XG4gICAgaG9vazogaG9vayxcbiAgICBvcmlnOiBvcmlnLFxuICB9KTtcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gcmVtb3ZlSG9vaztcblxuZnVuY3Rpb24gcmVtb3ZlSG9vayhzdGF0ZSwgbmFtZSwgbWV0aG9kKSB7XG4gIGlmICghc3RhdGUucmVnaXN0cnlbbmFtZV0pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgaW5kZXggPSBzdGF0ZS5yZWdpc3RyeVtuYW1lXVxuICAgIC5tYXAoZnVuY3Rpb24gKHJlZ2lzdGVyZWQpIHtcbiAgICAgIHJldHVybiByZWdpc3RlcmVkLm9yaWc7XG4gICAgfSlcbiAgICAuaW5kZXhPZihtZXRob2QpO1xuXG4gIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdGF0ZS5yZWdpc3RyeVtuYW1lXS5zcGxpY2UoaW5kZXgsIDEpO1xufVxuIiwidmFyIHJlZ2lzdGVyID0gcmVxdWlyZShcIi4vbGliL3JlZ2lzdGVyXCIpO1xudmFyIGFkZEhvb2sgPSByZXF1aXJlKFwiLi9saWIvYWRkXCIpO1xudmFyIHJlbW92ZUhvb2sgPSByZXF1aXJlKFwiLi9saWIvcmVtb3ZlXCIpO1xuXG4vLyBiaW5kIHdpdGggYXJyYXkgb2YgYXJndW1lbnRzOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjE3OTI5MTNcbnZhciBiaW5kID0gRnVuY3Rpb24uYmluZDtcbnZhciBiaW5kYWJsZSA9IGJpbmQuYmluZChiaW5kKTtcblxuZnVuY3Rpb24gYmluZEFwaShob29rLCBzdGF0ZSwgbmFtZSkge1xuICB2YXIgcmVtb3ZlSG9va1JlZiA9IGJpbmRhYmxlKHJlbW92ZUhvb2ssIG51bGwpLmFwcGx5KFxuICAgIG51bGwsXG4gICAgbmFtZSA/IFtzdGF0ZSwgbmFtZV0gOiBbc3RhdGVdXG4gICk7XG4gIGhvb2suYXBpID0geyByZW1vdmU6IHJlbW92ZUhvb2tSZWYgfTtcbiAgaG9vay5yZW1vdmUgPSByZW1vdmVIb29rUmVmO1xuICBbXCJiZWZvcmVcIiwgXCJlcnJvclwiLCBcImFmdGVyXCIsIFwid3JhcFwiXS5mb3JFYWNoKGZ1bmN0aW9uIChraW5kKSB7XG4gICAgdmFyIGFyZ3MgPSBuYW1lID8gW3N0YXRlLCBraW5kLCBuYW1lXSA6IFtzdGF0ZSwga2luZF07XG4gICAgaG9va1traW5kXSA9IGhvb2suYXBpW2tpbmRdID0gYmluZGFibGUoYWRkSG9vaywgbnVsbCkuYXBwbHkobnVsbCwgYXJncyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBIb29rU2luZ3VsYXIoKSB7XG4gIHZhciBzaW5ndWxhckhvb2tOYW1lID0gXCJoXCI7XG4gIHZhciBzaW5ndWxhckhvb2tTdGF0ZSA9IHtcbiAgICByZWdpc3RyeToge30sXG4gIH07XG4gIHZhciBzaW5ndWxhckhvb2sgPSByZWdpc3Rlci5iaW5kKG51bGwsIHNpbmd1bGFySG9va1N0YXRlLCBzaW5ndWxhckhvb2tOYW1lKTtcbiAgYmluZEFwaShzaW5ndWxhckhvb2ssIHNpbmd1bGFySG9va1N0YXRlLCBzaW5ndWxhckhvb2tOYW1lKTtcbiAgcmV0dXJuIHNpbmd1bGFySG9vaztcbn1cblxuZnVuY3Rpb24gSG9va0NvbGxlY3Rpb24oKSB7XG4gIHZhciBzdGF0ZSA9IHtcbiAgICByZWdpc3RyeToge30sXG4gIH07XG5cbiAgdmFyIGhvb2sgPSByZWdpc3Rlci5iaW5kKG51bGwsIHN0YXRlKTtcbiAgYmluZEFwaShob29rLCBzdGF0ZSk7XG5cbiAgcmV0dXJuIGhvb2s7XG59XG5cbnZhciBjb2xsZWN0aW9uSG9va0RlcHJlY2F0aW9uTWVzc2FnZURpc3BsYXllZCA9IGZhbHNlO1xuZnVuY3Rpb24gSG9vaygpIHtcbiAgaWYgKCFjb2xsZWN0aW9uSG9va0RlcHJlY2F0aW9uTWVzc2FnZURpc3BsYXllZCkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICdbYmVmb3JlLWFmdGVyLWhvb2tdOiBcIkhvb2soKVwiIHJlcHVycG9zaW5nIHdhcm5pbmcsIHVzZSBcIkhvb2suQ29sbGVjdGlvbigpXCIuIFJlYWQgbW9yZTogaHR0cHM6Ly9naXQuaW8vdXBncmFkZS1iZWZvcmUtYWZ0ZXItaG9vay10by0xLjQnXG4gICAgKTtcbiAgICBjb2xsZWN0aW9uSG9va0RlcHJlY2F0aW9uTWVzc2FnZURpc3BsYXllZCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIEhvb2tDb2xsZWN0aW9uKCk7XG59XG5cbkhvb2suU2luZ3VsYXIgPSBIb29rU2luZ3VsYXIuYmluZCgpO1xuSG9vay5Db2xsZWN0aW9uID0gSG9va0NvbGxlY3Rpb24uYmluZCgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEhvb2s7XG4vLyBleHBvc2UgY29uc3RydWN0b3JzIGFzIGEgbmFtZWQgcHJvcGVydHkgZm9yIFR5cGVTY3JpcHRcbm1vZHVsZS5leHBvcnRzLkhvb2sgPSBIb29rO1xubW9kdWxlLmV4cG9ydHMuU2luZ3VsYXIgPSBIb29rLlNpbmd1bGFyO1xubW9kdWxlLmV4cG9ydHMuQ29sbGVjdGlvbiA9IEhvb2suQ29sbGVjdGlvbjtcbiIsImNvbnN0IFZFUlNJT04gPSBcIjkuMC42XCI7XG5leHBvcnQge1xuICBWRVJTSU9OXG59O1xuIiwiaW1wb3J0IHsgZ2V0VXNlckFnZW50IH0gZnJvbSBcInVuaXZlcnNhbC11c2VyLWFnZW50XCI7XG5pbXBvcnQgeyBWRVJTSU9OIH0gZnJvbSBcIi4vdmVyc2lvblwiO1xuY29uc3QgdXNlckFnZW50ID0gYG9jdG9raXQtZW5kcG9pbnQuanMvJHtWRVJTSU9OfSAke2dldFVzZXJBZ2VudCgpfWA7XG5jb25zdCBERUZBVUxUUyA9IHtcbiAgbWV0aG9kOiBcIkdFVFwiLFxuICBiYXNlVXJsOiBcImh0dHBzOi8vYXBpLmdpdGh1Yi5jb21cIixcbiAgaGVhZGVyczoge1xuICAgIGFjY2VwdDogXCJhcHBsaWNhdGlvbi92bmQuZ2l0aHViLnYzK2pzb25cIixcbiAgICBcInVzZXItYWdlbnRcIjogdXNlckFnZW50XG4gIH0sXG4gIG1lZGlhVHlwZToge1xuICAgIGZvcm1hdDogXCJcIlxuICB9XG59O1xuZXhwb3J0IHtcbiAgREVGQVVMVFNcbn07XG4iLCJmdW5jdGlvbiBsb3dlcmNhc2VLZXlzKG9iamVjdCkge1xuICBpZiAoIW9iamVjdCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0KS5yZWR1Y2UoKG5ld09iaiwga2V5KSA9PiB7XG4gICAgbmV3T2JqW2tleS50b0xvd2VyQ2FzZSgpXSA9IG9iamVjdFtrZXldO1xuICAgIHJldHVybiBuZXdPYmo7XG4gIH0sIHt9KTtcbn1cbmV4cG9ydCB7XG4gIGxvd2VyY2FzZUtleXNcbn07XG4iLCJmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSAhPT0gXCJbb2JqZWN0IE9iamVjdF1cIilcbiAgICByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgaWYgKHByb3RvID09PSBudWxsKVxuICAgIHJldHVybiB0cnVlO1xuICBjb25zdCBDdG9yID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCBcImNvbnN0cnVjdG9yXCIpICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuICByZXR1cm4gdHlwZW9mIEN0b3IgPT09IFwiZnVuY3Rpb25cIiAmJiBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJiBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbChDdG9yKSA9PT0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwodmFsdWUpO1xufVxuZXhwb3J0IHtcbiAgaXNQbGFpbk9iamVjdFxufTtcbiIsImltcG9ydCB7IGlzUGxhaW5PYmplY3QgfSBmcm9tIFwiLi9pcy1wbGFpbi1vYmplY3RcIjtcbmZ1bmN0aW9uIG1lcmdlRGVlcChkZWZhdWx0cywgb3B0aW9ucykge1xuICBjb25zdCByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0cyk7XG4gIE9iamVjdC5rZXlzKG9wdGlvbnMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGlmIChpc1BsYWluT2JqZWN0KG9wdGlvbnNba2V5XSkpIHtcbiAgICAgIGlmICghKGtleSBpbiBkZWZhdWx0cykpXG4gICAgICAgIE9iamVjdC5hc3NpZ24ocmVzdWx0LCB7IFtrZXldOiBvcHRpb25zW2tleV0gfSk7XG4gICAgICBlbHNlXG4gICAgICAgIHJlc3VsdFtrZXldID0gbWVyZ2VEZWVwKGRlZmF1bHRzW2tleV0sIG9wdGlvbnNba2V5XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ocmVzdWx0LCB7IFtrZXldOiBvcHRpb25zW2tleV0gfSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCB7XG4gIG1lcmdlRGVlcFxufTtcbiIsImZ1bmN0aW9uIHJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXMob2JqKSB7XG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIGlmIChvYmpba2V5XSA9PT0gdm9pZCAwKSB7XG4gICAgICBkZWxldGUgb2JqW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG5leHBvcnQge1xuICByZW1vdmVVbmRlZmluZWRQcm9wZXJ0aWVzXG59O1xuIiwiaW1wb3J0IHsgbG93ZXJjYXNlS2V5cyB9IGZyb20gXCIuL3V0aWwvbG93ZXJjYXNlLWtleXNcIjtcbmltcG9ydCB7IG1lcmdlRGVlcCB9IGZyb20gXCIuL3V0aWwvbWVyZ2UtZGVlcFwiO1xuaW1wb3J0IHsgcmVtb3ZlVW5kZWZpbmVkUHJvcGVydGllcyB9IGZyb20gXCIuL3V0aWwvcmVtb3ZlLXVuZGVmaW5lZC1wcm9wZXJ0aWVzXCI7XG5mdW5jdGlvbiBtZXJnZShkZWZhdWx0cywgcm91dGUsIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiByb3V0ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGxldCBbbWV0aG9kLCB1cmxdID0gcm91dGUuc3BsaXQoXCIgXCIpO1xuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHVybCA/IHsgbWV0aG9kLCB1cmwgfSA6IHsgdXJsOiBtZXRob2QgfSwgb3B0aW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHJvdXRlKTtcbiAgfVxuICBvcHRpb25zLmhlYWRlcnMgPSBsb3dlcmNhc2VLZXlzKG9wdGlvbnMuaGVhZGVycyk7XG4gIHJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXMob3B0aW9ucyk7XG4gIHJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXMob3B0aW9ucy5oZWFkZXJzKTtcbiAgY29uc3QgbWVyZ2VkT3B0aW9ucyA9IG1lcmdlRGVlcChkZWZhdWx0cyB8fCB7fSwgb3B0aW9ucyk7XG4gIGlmIChvcHRpb25zLnVybCA9PT0gXCIvZ3JhcGhxbFwiKSB7XG4gICAgaWYgKGRlZmF1bHRzICYmIGRlZmF1bHRzLm1lZGlhVHlwZS5wcmV2aWV3cz8ubGVuZ3RoKSB7XG4gICAgICBtZXJnZWRPcHRpb25zLm1lZGlhVHlwZS5wcmV2aWV3cyA9IGRlZmF1bHRzLm1lZGlhVHlwZS5wcmV2aWV3cy5maWx0ZXIoXG4gICAgICAgIChwcmV2aWV3KSA9PiAhbWVyZ2VkT3B0aW9ucy5tZWRpYVR5cGUucHJldmlld3MuaW5jbHVkZXMocHJldmlldylcbiAgICAgICkuY29uY2F0KG1lcmdlZE9wdGlvbnMubWVkaWFUeXBlLnByZXZpZXdzKTtcbiAgICB9XG4gICAgbWVyZ2VkT3B0aW9ucy5tZWRpYVR5cGUucHJldmlld3MgPSAobWVyZ2VkT3B0aW9ucy5tZWRpYVR5cGUucHJldmlld3MgfHwgW10pLm1hcCgocHJldmlldykgPT4gcHJldmlldy5yZXBsYWNlKC8tcHJldmlldy8sIFwiXCIpKTtcbiAgfVxuICByZXR1cm4gbWVyZ2VkT3B0aW9ucztcbn1cbmV4cG9ydCB7XG4gIG1lcmdlXG59O1xuIiwiZnVuY3Rpb24gYWRkUXVlcnlQYXJhbWV0ZXJzKHVybCwgcGFyYW1ldGVycykge1xuICBjb25zdCBzZXBhcmF0b3IgPSAvXFw/Ly50ZXN0KHVybCkgPyBcIiZcIiA6IFwiP1wiO1xuICBjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKHBhcmFtZXRlcnMpO1xuICBpZiAobmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICByZXR1cm4gdXJsICsgc2VwYXJhdG9yICsgbmFtZXMubWFwKChuYW1lKSA9PiB7XG4gICAgaWYgKG5hbWUgPT09IFwicVwiKSB7XG4gICAgICByZXR1cm4gXCJxPVwiICsgcGFyYW1ldGVycy5xLnNwbGl0KFwiK1wiKS5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKFwiK1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIGAke25hbWV9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtZXRlcnNbbmFtZV0pfWA7XG4gIH0pLmpvaW4oXCImXCIpO1xufVxuZXhwb3J0IHtcbiAgYWRkUXVlcnlQYXJhbWV0ZXJzXG59O1xuIiwiY29uc3QgdXJsVmFyaWFibGVSZWdleCA9IC9cXHtbXnt9fV0rXFx9L2c7XG5mdW5jdGlvbiByZW1vdmVOb25DaGFycyh2YXJpYWJsZU5hbWUpIHtcbiAgcmV0dXJuIHZhcmlhYmxlTmFtZS5yZXBsYWNlKC8oPzpeXFxXKyl8KD86KD88IVxcVylcXFcrJCkvZywgXCJcIikuc3BsaXQoLywvKTtcbn1cbmZ1bmN0aW9uIGV4dHJhY3RVcmxWYXJpYWJsZU5hbWVzKHVybCkge1xuICBjb25zdCBtYXRjaGVzID0gdXJsLm1hdGNoKHVybFZhcmlhYmxlUmVnZXgpO1xuICBpZiAoIW1hdGNoZXMpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcmV0dXJuIG1hdGNoZXMubWFwKHJlbW92ZU5vbkNoYXJzKS5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpLCBbXSk7XG59XG5leHBvcnQge1xuICBleHRyYWN0VXJsVmFyaWFibGVOYW1lc1xufTtcbiIsImZ1bmN0aW9uIG9taXQob2JqZWN0LCBrZXlzVG9PbWl0KSB7XG4gIGNvbnN0IHJlc3VsdCA9IHsgX19wcm90b19fOiBudWxsIH07XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG9iamVjdCkpIHtcbiAgICBpZiAoa2V5c1RvT21pdC5pbmRleE9mKGtleSkgPT09IC0xKSB7XG4gICAgICByZXN1bHRba2V5XSA9IG9iamVjdFtrZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IHtcbiAgb21pdFxufTtcbiIsImZ1bmN0aW9uIGVuY29kZVJlc2VydmVkKHN0cikge1xuICByZXR1cm4gc3RyLnNwbGl0KC8oJVswLTlBLUZhLWZdezJ9KS9nKS5tYXAoZnVuY3Rpb24ocGFydCkge1xuICAgIGlmICghLyVbMC05QS1GYS1mXS8udGVzdChwYXJ0KSkge1xuICAgICAgcGFydCA9IGVuY29kZVVSSShwYXJ0KS5yZXBsYWNlKC8lNUIvZywgXCJbXCIpLnJlcGxhY2UoLyU1RC9nLCBcIl1cIik7XG4gICAgfVxuICAgIHJldHVybiBwYXJ0O1xuICB9KS5qb2luKFwiXCIpO1xufVxuZnVuY3Rpb24gZW5jb2RlVW5yZXNlcnZlZChzdHIpIHtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHIpLnJlcGxhY2UoL1shJygpKl0vZywgZnVuY3Rpb24oYykge1xuICAgIHJldHVybiBcIiVcIiArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBlbmNvZGVWYWx1ZShvcGVyYXRvciwgdmFsdWUsIGtleSkge1xuICB2YWx1ZSA9IG9wZXJhdG9yID09PSBcIitcIiB8fCBvcGVyYXRvciA9PT0gXCIjXCIgPyBlbmNvZGVSZXNlcnZlZCh2YWx1ZSkgOiBlbmNvZGVVbnJlc2VydmVkKHZhbHVlKTtcbiAgaWYgKGtleSkge1xuICAgIHJldHVybiBlbmNvZGVVbnJlc2VydmVkKGtleSkgKyBcIj1cIiArIHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuZnVuY3Rpb24gaXNEZWZpbmVkKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdm9pZCAwICYmIHZhbHVlICE9PSBudWxsO1xufVxuZnVuY3Rpb24gaXNLZXlPcGVyYXRvcihvcGVyYXRvcikge1xuICByZXR1cm4gb3BlcmF0b3IgPT09IFwiO1wiIHx8IG9wZXJhdG9yID09PSBcIiZcIiB8fCBvcGVyYXRvciA9PT0gXCI/XCI7XG59XG5mdW5jdGlvbiBnZXRWYWx1ZXMoY29udGV4dCwgb3BlcmF0b3IsIGtleSwgbW9kaWZpZXIpIHtcbiAgdmFyIHZhbHVlID0gY29udGV4dFtrZXldLCByZXN1bHQgPSBbXTtcbiAgaWYgKGlzRGVmaW5lZCh2YWx1ZSkgJiYgdmFsdWUgIT09IFwiXCIpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICBpZiAobW9kaWZpZXIgJiYgbW9kaWZpZXIgIT09IFwiKlwiKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIHBhcnNlSW50KG1vZGlmaWVyLCAxMCkpO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgIGVuY29kZVZhbHVlKG9wZXJhdG9yLCB2YWx1ZSwgaXNLZXlPcGVyYXRvcihvcGVyYXRvcikgPyBrZXkgOiBcIlwiKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG1vZGlmaWVyID09PSBcIipcIikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZS5maWx0ZXIoaXNEZWZpbmVkKS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlMikge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgICAgICAgIGVuY29kZVZhbHVlKG9wZXJhdG9yLCB2YWx1ZTIsIGlzS2V5T3BlcmF0b3Iob3BlcmF0b3IpID8ga2V5IDogXCJcIilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgT2JqZWN0LmtleXModmFsdWUpLmZvckVhY2goZnVuY3Rpb24oaykge1xuICAgICAgICAgICAgaWYgKGlzRGVmaW5lZCh2YWx1ZVtrXSkpIHtcbiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZW5jb2RlVmFsdWUob3BlcmF0b3IsIHZhbHVlW2tdLCBrKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRtcCA9IFtdO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZS5maWx0ZXIoaXNEZWZpbmVkKS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlMikge1xuICAgICAgICAgICAgdG1wLnB1c2goZW5jb2RlVmFsdWUob3BlcmF0b3IsIHZhbHVlMikpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5mb3JFYWNoKGZ1bmN0aW9uKGspIHtcbiAgICAgICAgICAgIGlmIChpc0RlZmluZWQodmFsdWVba10pKSB7XG4gICAgICAgICAgICAgIHRtcC5wdXNoKGVuY29kZVVucmVzZXJ2ZWQoaykpO1xuICAgICAgICAgICAgICB0bXAucHVzaChlbmNvZGVWYWx1ZShvcGVyYXRvciwgdmFsdWVba10udG9TdHJpbmcoKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0tleU9wZXJhdG9yKG9wZXJhdG9yKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGVuY29kZVVucmVzZXJ2ZWQoa2V5KSArIFwiPVwiICsgdG1wLmpvaW4oXCIsXCIpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0bXAubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godG1wLmpvaW4oXCIsXCIpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAob3BlcmF0b3IgPT09IFwiO1wiKSB7XG4gICAgICBpZiAoaXNEZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICByZXN1bHQucHVzaChlbmNvZGVVbnJlc2VydmVkKGtleSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IFwiXCIgJiYgKG9wZXJhdG9yID09PSBcIiZcIiB8fCBvcGVyYXRvciA9PT0gXCI/XCIpKSB7XG4gICAgICByZXN1bHQucHVzaChlbmNvZGVVbnJlc2VydmVkKGtleSkgKyBcIj1cIik7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgcmVzdWx0LnB1c2goXCJcIik7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBwYXJzZVVybCh0ZW1wbGF0ZSkge1xuICByZXR1cm4ge1xuICAgIGV4cGFuZDogZXhwYW5kLmJpbmQobnVsbCwgdGVtcGxhdGUpXG4gIH07XG59XG5mdW5jdGlvbiBleHBhbmQodGVtcGxhdGUsIGNvbnRleHQpIHtcbiAgdmFyIG9wZXJhdG9ycyA9IFtcIitcIiwgXCIjXCIsIFwiLlwiLCBcIi9cIiwgXCI7XCIsIFwiP1wiLCBcIiZcIl07XG4gIHRlbXBsYXRlID0gdGVtcGxhdGUucmVwbGFjZShcbiAgICAvXFx7KFteXFx7XFx9XSspXFx9fChbXlxce1xcfV0rKS9nLFxuICAgIGZ1bmN0aW9uKF8sIGV4cHJlc3Npb24sIGxpdGVyYWwpIHtcbiAgICAgIGlmIChleHByZXNzaW9uKSB7XG4gICAgICAgIGxldCBvcGVyYXRvciA9IFwiXCI7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuICAgICAgICBpZiAob3BlcmF0b3JzLmluZGV4T2YoZXhwcmVzc2lvbi5jaGFyQXQoMCkpICE9PSAtMSkge1xuICAgICAgICAgIG9wZXJhdG9yID0gZXhwcmVzc2lvbi5jaGFyQXQoMCk7XG4gICAgICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uc3Vic3RyKDEpO1xuICAgICAgICB9XG4gICAgICAgIGV4cHJlc3Npb24uc3BsaXQoLywvZykuZm9yRWFjaChmdW5jdGlvbih2YXJpYWJsZSkge1xuICAgICAgICAgIHZhciB0bXAgPSAvKFteOlxcKl0qKSg/OjooXFxkKyl8KFxcKikpPy8uZXhlYyh2YXJpYWJsZSk7XG4gICAgICAgICAgdmFsdWVzLnB1c2goZ2V0VmFsdWVzKGNvbnRleHQsIG9wZXJhdG9yLCB0bXBbMV0sIHRtcFsyXSB8fCB0bXBbM10pKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChvcGVyYXRvciAmJiBvcGVyYXRvciAhPT0gXCIrXCIpIHtcbiAgICAgICAgICB2YXIgc2VwYXJhdG9yID0gXCIsXCI7XG4gICAgICAgICAgaWYgKG9wZXJhdG9yID09PSBcIj9cIikge1xuICAgICAgICAgICAgc2VwYXJhdG9yID0gXCImXCI7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRvciAhPT0gXCIjXCIpIHtcbiAgICAgICAgICAgIHNlcGFyYXRvciA9IG9wZXJhdG9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gKHZhbHVlcy5sZW5ndGggIT09IDAgPyBvcGVyYXRvciA6IFwiXCIpICsgdmFsdWVzLmpvaW4oc2VwYXJhdG9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWVzLmpvaW4oXCIsXCIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZW5jb2RlUmVzZXJ2ZWQobGl0ZXJhbCk7XG4gICAgICB9XG4gICAgfVxuICApO1xuICBpZiAodGVtcGxhdGUgPT09IFwiL1wiKSB7XG4gICAgcmV0dXJuIHRlbXBsYXRlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKC9cXC8kLywgXCJcIik7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIHBhcnNlVXJsXG59O1xuIiwiaW1wb3J0IHsgYWRkUXVlcnlQYXJhbWV0ZXJzIH0gZnJvbSBcIi4vdXRpbC9hZGQtcXVlcnktcGFyYW1ldGVyc1wiO1xuaW1wb3J0IHsgZXh0cmFjdFVybFZhcmlhYmxlTmFtZXMgfSBmcm9tIFwiLi91dGlsL2V4dHJhY3QtdXJsLXZhcmlhYmxlLW5hbWVzXCI7XG5pbXBvcnQgeyBvbWl0IH0gZnJvbSBcIi4vdXRpbC9vbWl0XCI7XG5pbXBvcnQgeyBwYXJzZVVybCB9IGZyb20gXCIuL3V0aWwvdXJsLXRlbXBsYXRlXCI7XG5mdW5jdGlvbiBwYXJzZShvcHRpb25zKSB7XG4gIGxldCBtZXRob2QgPSBvcHRpb25zLm1ldGhvZC50b1VwcGVyQ2FzZSgpO1xuICBsZXQgdXJsID0gKG9wdGlvbnMudXJsIHx8IFwiL1wiKS5yZXBsYWNlKC86KFthLXpdXFx3KykvZywgXCJ7JDF9XCIpO1xuICBsZXQgaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuaGVhZGVycyk7XG4gIGxldCBib2R5O1xuICBsZXQgcGFyYW1ldGVycyA9IG9taXQob3B0aW9ucywgW1xuICAgIFwibWV0aG9kXCIsXG4gICAgXCJiYXNlVXJsXCIsXG4gICAgXCJ1cmxcIixcbiAgICBcImhlYWRlcnNcIixcbiAgICBcInJlcXVlc3RcIixcbiAgICBcIm1lZGlhVHlwZVwiXG4gIF0pO1xuICBjb25zdCB1cmxWYXJpYWJsZU5hbWVzID0gZXh0cmFjdFVybFZhcmlhYmxlTmFtZXModXJsKTtcbiAgdXJsID0gcGFyc2VVcmwodXJsKS5leHBhbmQocGFyYW1ldGVycyk7XG4gIGlmICghL15odHRwLy50ZXN0KHVybCkpIHtcbiAgICB1cmwgPSBvcHRpb25zLmJhc2VVcmwgKyB1cmw7XG4gIH1cbiAgY29uc3Qgb21pdHRlZFBhcmFtZXRlcnMgPSBPYmplY3Qua2V5cyhvcHRpb25zKS5maWx0ZXIoKG9wdGlvbikgPT4gdXJsVmFyaWFibGVOYW1lcy5pbmNsdWRlcyhvcHRpb24pKS5jb25jYXQoXCJiYXNlVXJsXCIpO1xuICBjb25zdCByZW1haW5pbmdQYXJhbWV0ZXJzID0gb21pdChwYXJhbWV0ZXJzLCBvbWl0dGVkUGFyYW1ldGVycyk7XG4gIGNvbnN0IGlzQmluYXJ5UmVxdWVzdCA9IC9hcHBsaWNhdGlvblxcL29jdGV0LXN0cmVhbS9pLnRlc3QoaGVhZGVycy5hY2NlcHQpO1xuICBpZiAoIWlzQmluYXJ5UmVxdWVzdCkge1xuICAgIGlmIChvcHRpb25zLm1lZGlhVHlwZS5mb3JtYXQpIHtcbiAgICAgIGhlYWRlcnMuYWNjZXB0ID0gaGVhZGVycy5hY2NlcHQuc3BsaXQoLywvKS5tYXAoXG4gICAgICAgIChmb3JtYXQpID0+IGZvcm1hdC5yZXBsYWNlKFxuICAgICAgICAgIC9hcHBsaWNhdGlvblxcL3ZuZChcXC5cXHcrKShcXC52Myk/KFxcLlxcdyspPyhcXCtqc29uKT8kLyxcbiAgICAgICAgICBgYXBwbGljYXRpb24vdm5kJDEkMi4ke29wdGlvbnMubWVkaWFUeXBlLmZvcm1hdH1gXG4gICAgICAgIClcbiAgICAgICkuam9pbihcIixcIik7XG4gICAgfVxuICAgIGlmICh1cmwuZW5kc1dpdGgoXCIvZ3JhcGhxbFwiKSkge1xuICAgICAgaWYgKG9wdGlvbnMubWVkaWFUeXBlLnByZXZpZXdzPy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcHJldmlld3NGcm9tQWNjZXB0SGVhZGVyID0gaGVhZGVycy5hY2NlcHQubWF0Y2goLyg/PCFbXFx3LV0pW1xcdy1dKyg/PS1wcmV2aWV3KS9nKSB8fCBbXTtcbiAgICAgICAgaGVhZGVycy5hY2NlcHQgPSBwcmV2aWV3c0Zyb21BY2NlcHRIZWFkZXIuY29uY2F0KG9wdGlvbnMubWVkaWFUeXBlLnByZXZpZXdzKS5tYXAoKHByZXZpZXcpID0+IHtcbiAgICAgICAgICBjb25zdCBmb3JtYXQgPSBvcHRpb25zLm1lZGlhVHlwZS5mb3JtYXQgPyBgLiR7b3B0aW9ucy5tZWRpYVR5cGUuZm9ybWF0fWAgOiBcIitqc29uXCI7XG4gICAgICAgICAgcmV0dXJuIGBhcHBsaWNhdGlvbi92bmQuZ2l0aHViLiR7cHJldmlld30tcHJldmlldyR7Zm9ybWF0fWA7XG4gICAgICAgIH0pLmpvaW4oXCIsXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoW1wiR0VUXCIsIFwiSEVBRFwiXS5pbmNsdWRlcyhtZXRob2QpKSB7XG4gICAgdXJsID0gYWRkUXVlcnlQYXJhbWV0ZXJzKHVybCwgcmVtYWluaW5nUGFyYW1ldGVycyk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKFwiZGF0YVwiIGluIHJlbWFpbmluZ1BhcmFtZXRlcnMpIHtcbiAgICAgIGJvZHkgPSByZW1haW5pbmdQYXJhbWV0ZXJzLmRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhyZW1haW5pbmdQYXJhbWV0ZXJzKS5sZW5ndGgpIHtcbiAgICAgICAgYm9keSA9IHJlbWFpbmluZ1BhcmFtZXRlcnM7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICghaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXSAmJiB0eXBlb2YgYm9keSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIjtcbiAgfVxuICBpZiAoW1wiUEFUQ0hcIiwgXCJQVVRcIl0uaW5jbHVkZXMobWV0aG9kKSAmJiB0eXBlb2YgYm9keSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGJvZHkgPSBcIlwiO1xuICB9XG4gIHJldHVybiBPYmplY3QuYXNzaWduKFxuICAgIHsgbWV0aG9kLCB1cmwsIGhlYWRlcnMgfSxcbiAgICB0eXBlb2YgYm9keSAhPT0gXCJ1bmRlZmluZWRcIiA/IHsgYm9keSB9IDogbnVsbCxcbiAgICBvcHRpb25zLnJlcXVlc3QgPyB7IHJlcXVlc3Q6IG9wdGlvbnMucmVxdWVzdCB9IDogbnVsbFxuICApO1xufVxuZXhwb3J0IHtcbiAgcGFyc2Vcbn07XG4iLCJpbXBvcnQgeyBERUZBVUxUUyB9IGZyb20gXCIuL2RlZmF1bHRzXCI7XG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gXCIuL21lcmdlXCI7XG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gXCIuL3BhcnNlXCI7XG5mdW5jdGlvbiBlbmRwb2ludFdpdGhEZWZhdWx0cyhkZWZhdWx0cywgcm91dGUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHBhcnNlKG1lcmdlKGRlZmF1bHRzLCByb3V0ZSwgb3B0aW9ucykpO1xufVxuZXhwb3J0IHtcbiAgZW5kcG9pbnRXaXRoRGVmYXVsdHNcbn07XG4iLCJpbXBvcnQgeyBlbmRwb2ludFdpdGhEZWZhdWx0cyB9IGZyb20gXCIuL2VuZHBvaW50LXdpdGgtZGVmYXVsdHNcIjtcbmltcG9ydCB7IG1lcmdlIH0gZnJvbSBcIi4vbWVyZ2VcIjtcbmltcG9ydCB7IHBhcnNlIH0gZnJvbSBcIi4vcGFyc2VcIjtcbmZ1bmN0aW9uIHdpdGhEZWZhdWx0cyhvbGREZWZhdWx0cywgbmV3RGVmYXVsdHMpIHtcbiAgY29uc3QgREVGQVVMVFMgPSBtZXJnZShvbGREZWZhdWx0cywgbmV3RGVmYXVsdHMpO1xuICBjb25zdCBlbmRwb2ludCA9IGVuZHBvaW50V2l0aERlZmF1bHRzLmJpbmQobnVsbCwgREVGQVVMVFMpO1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihlbmRwb2ludCwge1xuICAgIERFRkFVTFRTLFxuICAgIGRlZmF1bHRzOiB3aXRoRGVmYXVsdHMuYmluZChudWxsLCBERUZBVUxUUyksXG4gICAgbWVyZ2U6IG1lcmdlLmJpbmQobnVsbCwgREVGQVVMVFMpLFxuICAgIHBhcnNlXG4gIH0pO1xufVxuZXhwb3J0IHtcbiAgd2l0aERlZmF1bHRzXG59O1xuIiwiaW1wb3J0IHsgd2l0aERlZmF1bHRzIH0gZnJvbSBcIi4vd2l0aC1kZWZhdWx0c1wiO1xuaW1wb3J0IHsgREVGQVVMVFMgfSBmcm9tIFwiLi9kZWZhdWx0c1wiO1xuY29uc3QgZW5kcG9pbnQgPSB3aXRoRGVmYXVsdHMobnVsbCwgREVGQVVMVFMpO1xuZXhwb3J0IHtcbiAgZW5kcG9pbnRcbn07XG4iLCJjb25zdCBWRVJTSU9OID0gXCI4LjQuMVwiO1xuZXhwb3J0IHtcbiAgVkVSU0lPTlxufTtcbiIsImZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbClcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICE9PSBcIltvYmplY3QgT2JqZWN0XVwiKVxuICAgIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICBpZiAocHJvdG8gPT09IG51bGwpXG4gICAgcmV0dXJuIHRydWU7XG4gIGNvbnN0IEN0b3IgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocHJvdG8sIFwiY29uc3RydWN0b3JcIikgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gIHJldHVybiB0eXBlb2YgQ3RvciA9PT0gXCJmdW5jdGlvblwiICYmIEN0b3IgaW5zdGFuY2VvZiBDdG9yICYmIEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsKEN0b3IpID09PSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCh2YWx1ZSk7XG59XG5leHBvcnQge1xuICBpc1BsYWluT2JqZWN0XG59O1xuIiwiY2xhc3MgRGVwcmVjYXRpb24gZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKTsgLy8gTWFpbnRhaW5zIHByb3BlciBzdGFjayB0cmFjZSAob25seSBhdmFpbGFibGUgb24gVjgpXG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXG4gICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgICB9XG5cbiAgICB0aGlzLm5hbWUgPSAnRGVwcmVjYXRpb24nO1xuICB9XG5cbn1cblxuZXhwb3J0IHsgRGVwcmVjYXRpb24gfTtcbiIsIi8vIFJldHVybnMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHdyYXBwZWQgY2FsbGJhY2tcbi8vIFRoZSB3cmFwcGVyIGZ1bmN0aW9uIHNob3VsZCBkbyBzb21lIHN0dWZmLCBhbmQgcmV0dXJuIGFcbi8vIHByZXN1bWFibHkgZGlmZmVyZW50IGNhbGxiYWNrIGZ1bmN0aW9uLlxuLy8gVGhpcyBtYWtlcyBzdXJlIHRoYXQgb3duIHByb3BlcnRpZXMgYXJlIHJldGFpbmVkLCBzbyB0aGF0XG4vLyBkZWNvcmF0aW9ucyBhbmQgc3VjaCBhcmUgbm90IGxvc3QgYWxvbmcgdGhlIHdheS5cbm1vZHVsZS5leHBvcnRzID0gd3JhcHB5XG5mdW5jdGlvbiB3cmFwcHkgKGZuLCBjYikge1xuICBpZiAoZm4gJiYgY2IpIHJldHVybiB3cmFwcHkoZm4pKGNiKVxuXG4gIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbmVlZCB3cmFwcGVyIGZ1bmN0aW9uJylcblxuICBPYmplY3Qua2V5cyhmbikuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgIHdyYXBwZXJba10gPSBmbltrXVxuICB9KVxuXG4gIHJldHVybiB3cmFwcGVyXG5cbiAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXVxuICAgIH1cbiAgICB2YXIgcmV0ID0gZm4uYXBwbHkodGhpcywgYXJncylcbiAgICB2YXIgY2IgPSBhcmdzW2FyZ3MubGVuZ3RoLTFdXG4gICAgaWYgKHR5cGVvZiByZXQgPT09ICdmdW5jdGlvbicgJiYgcmV0ICE9PSBjYikge1xuICAgICAgT2JqZWN0LmtleXMoY2IpLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICAgICAgcmV0W2tdID0gY2Jba11cbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiByZXRcbiAgfVxufVxuIiwidmFyIHdyYXBweSA9IHJlcXVpcmUoJ3dyYXBweScpXG5tb2R1bGUuZXhwb3J0cyA9IHdyYXBweShvbmNlKVxubW9kdWxlLmV4cG9ydHMuc3RyaWN0ID0gd3JhcHB5KG9uY2VTdHJpY3QpXG5cbm9uY2UucHJvdG8gPSBvbmNlKGZ1bmN0aW9uICgpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZ1bmN0aW9uLnByb3RvdHlwZSwgJ29uY2UnLCB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBvbmNlKHRoaXMpXG4gICAgfSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSlcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRnVuY3Rpb24ucHJvdG90eXBlLCAnb25jZVN0cmljdCcsIHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG9uY2VTdHJpY3QodGhpcylcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KVxufSlcblxuZnVuY3Rpb24gb25jZSAoZm4pIHtcbiAgdmFyIGYgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGYuY2FsbGVkKSByZXR1cm4gZi52YWx1ZVxuICAgIGYuY2FsbGVkID0gdHJ1ZVxuICAgIHJldHVybiBmLnZhbHVlID0gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICB9XG4gIGYuY2FsbGVkID0gZmFsc2VcbiAgcmV0dXJuIGZcbn1cblxuZnVuY3Rpb24gb25jZVN0cmljdCAoZm4pIHtcbiAgdmFyIGYgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGYuY2FsbGVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGYub25jZUVycm9yKVxuICAgIGYuY2FsbGVkID0gdHJ1ZVxuICAgIHJldHVybiBmLnZhbHVlID0gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICB9XG4gIHZhciBuYW1lID0gZm4ubmFtZSB8fCAnRnVuY3Rpb24gd3JhcHBlZCB3aXRoIGBvbmNlYCdcbiAgZi5vbmNlRXJyb3IgPSBuYW1lICsgXCIgc2hvdWxkbid0IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZVwiXG4gIGYuY2FsbGVkID0gZmFsc2VcbiAgcmV0dXJuIGZcbn1cbiIsImltcG9ydCB7IERlcHJlY2F0aW9uIH0gZnJvbSBcImRlcHJlY2F0aW9uXCI7XG5pbXBvcnQgb25jZSBmcm9tIFwib25jZVwiO1xuY29uc3QgbG9nT25jZUNvZGUgPSBvbmNlKChkZXByZWNhdGlvbikgPT4gY29uc29sZS53YXJuKGRlcHJlY2F0aW9uKSk7XG5jb25zdCBsb2dPbmNlSGVhZGVycyA9IG9uY2UoKGRlcHJlY2F0aW9uKSA9PiBjb25zb2xlLndhcm4oZGVwcmVjYXRpb24pKTtcbmNsYXNzIFJlcXVlc3RFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSwgc3RhdHVzQ29kZSwgb3B0aW9ucykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgfVxuICAgIHRoaXMubmFtZSA9IFwiSHR0cEVycm9yXCI7XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXNDb2RlO1xuICAgIGxldCBoZWFkZXJzO1xuICAgIGlmIChcImhlYWRlcnNcIiBpbiBvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLmhlYWRlcnMgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnM7XG4gICAgfVxuICAgIGlmIChcInJlc3BvbnNlXCIgaW4gb3B0aW9ucykge1xuICAgICAgdGhpcy5yZXNwb25zZSA9IG9wdGlvbnMucmVzcG9uc2U7XG4gICAgICBoZWFkZXJzID0gb3B0aW9ucy5yZXNwb25zZS5oZWFkZXJzO1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0Q29weSA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMucmVxdWVzdCk7XG4gICAgaWYgKG9wdGlvbnMucmVxdWVzdC5oZWFkZXJzLmF1dGhvcml6YXRpb24pIHtcbiAgICAgIHJlcXVlc3RDb3B5LmhlYWRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLnJlcXVlc3QuaGVhZGVycywge1xuICAgICAgICBhdXRob3JpemF0aW9uOiBvcHRpb25zLnJlcXVlc3QuaGVhZGVycy5hdXRob3JpemF0aW9uLnJlcGxhY2UoXG4gICAgICAgICAgLyg/PCEgKSAuKiQvLFxuICAgICAgICAgIFwiIFtSRURBQ1RFRF1cIlxuICAgICAgICApXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmVxdWVzdENvcHkudXJsID0gcmVxdWVzdENvcHkudXJsLnJlcGxhY2UoL1xcYmNsaWVudF9zZWNyZXQ9XFx3Ky9nLCBcImNsaWVudF9zZWNyZXQ9W1JFREFDVEVEXVwiKS5yZXBsYWNlKC9cXGJhY2Nlc3NfdG9rZW49XFx3Ky9nLCBcImFjY2Vzc190b2tlbj1bUkVEQUNURURdXCIpO1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3RDb3B5O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNvZGVcIiwge1xuICAgICAgZ2V0KCkge1xuICAgICAgICBsb2dPbmNlQ29kZShcbiAgICAgICAgICBuZXcgRGVwcmVjYXRpb24oXG4gICAgICAgICAgICBcIltAb2N0b2tpdC9yZXF1ZXN0LWVycm9yXSBgZXJyb3IuY29kZWAgaXMgZGVwcmVjYXRlZCwgdXNlIGBlcnJvci5zdGF0dXNgLlwiXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gc3RhdHVzQ29kZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJoZWFkZXJzXCIsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgbG9nT25jZUhlYWRlcnMoXG4gICAgICAgICAgbmV3IERlcHJlY2F0aW9uKFxuICAgICAgICAgICAgXCJbQG9jdG9raXQvcmVxdWVzdC1lcnJvcl0gYGVycm9yLmhlYWRlcnNgIGlzIGRlcHJlY2F0ZWQsIHVzZSBgZXJyb3IucmVzcG9uc2UuaGVhZGVyc2AuXCJcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBoZWFkZXJzIHx8IHt9O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5leHBvcnQge1xuICBSZXF1ZXN0RXJyb3Jcbn07XG4iLCJmdW5jdGlvbiBnZXRCdWZmZXJSZXNwb25zZShyZXNwb25zZSkge1xuICByZXR1cm4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTtcbn1cbmV4cG9ydCB7XG4gIGdldEJ1ZmZlclJlc3BvbnNlIGFzIGRlZmF1bHRcbn07XG4iLCJpbXBvcnQgeyBpc1BsYWluT2JqZWN0IH0gZnJvbSBcIi4vaXMtcGxhaW4tb2JqZWN0LmpzXCI7XG5pbXBvcnQgeyBSZXF1ZXN0RXJyb3IgfSBmcm9tIFwiQG9jdG9raXQvcmVxdWVzdC1lcnJvclwiO1xuaW1wb3J0IGdldEJ1ZmZlciBmcm9tIFwiLi9nZXQtYnVmZmVyLXJlc3BvbnNlLmpzXCI7XG5mdW5jdGlvbiBmZXRjaFdyYXBwZXIocmVxdWVzdE9wdGlvbnMpIHtcbiAgY29uc3QgbG9nID0gcmVxdWVzdE9wdGlvbnMucmVxdWVzdCAmJiByZXF1ZXN0T3B0aW9ucy5yZXF1ZXN0LmxvZyA/IHJlcXVlc3RPcHRpb25zLnJlcXVlc3QubG9nIDogY29uc29sZTtcbiAgY29uc3QgcGFyc2VTdWNjZXNzUmVzcG9uc2VCb2R5ID0gcmVxdWVzdE9wdGlvbnMucmVxdWVzdD8ucGFyc2VTdWNjZXNzUmVzcG9uc2VCb2R5ICE9PSBmYWxzZTtcbiAgaWYgKGlzUGxhaW5PYmplY3QocmVxdWVzdE9wdGlvbnMuYm9keSkgfHwgQXJyYXkuaXNBcnJheShyZXF1ZXN0T3B0aW9ucy5ib2R5KSkge1xuICAgIHJlcXVlc3RPcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShyZXF1ZXN0T3B0aW9ucy5ib2R5KTtcbiAgfVxuICBsZXQgaGVhZGVycyA9IHt9O1xuICBsZXQgc3RhdHVzO1xuICBsZXQgdXJsO1xuICBsZXQgeyBmZXRjaCB9ID0gZ2xvYmFsVGhpcztcbiAgaWYgKHJlcXVlc3RPcHRpb25zLnJlcXVlc3Q/LmZldGNoKSB7XG4gICAgZmV0Y2ggPSByZXF1ZXN0T3B0aW9ucy5yZXF1ZXN0LmZldGNoO1xuICB9XG4gIGlmICghZmV0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcImZldGNoIGlzIG5vdCBzZXQuIFBsZWFzZSBwYXNzIGEgZmV0Y2ggaW1wbGVtZW50YXRpb24gYXMgbmV3IE9jdG9raXQoeyByZXF1ZXN0OiB7IGZldGNoIH19KS4gTGVhcm4gbW9yZSBhdCBodHRwczovL2dpdGh1Yi5jb20vb2N0b2tpdC9vY3Rva2l0LmpzLyNmZXRjaC1taXNzaW5nXCJcbiAgICApO1xuICB9XG4gIHJldHVybiBmZXRjaChyZXF1ZXN0T3B0aW9ucy51cmwsIHtcbiAgICBtZXRob2Q6IHJlcXVlc3RPcHRpb25zLm1ldGhvZCxcbiAgICBib2R5OiByZXF1ZXN0T3B0aW9ucy5ib2R5LFxuICAgIHJlZGlyZWN0OiByZXF1ZXN0T3B0aW9ucy5yZXF1ZXN0Py5yZWRpcmVjdCxcbiAgICBoZWFkZXJzOiByZXF1ZXN0T3B0aW9ucy5oZWFkZXJzLFxuICAgIHNpZ25hbDogcmVxdWVzdE9wdGlvbnMucmVxdWVzdD8uc2lnbmFsLFxuICAgIC8vIGR1cGxleCBtdXN0IGJlIHNldCBpZiByZXF1ZXN0LmJvZHkgaXMgUmVhZGFibGVTdHJlYW0gb3IgQXN5bmMgSXRlcmFibGVzLlxuICAgIC8vIFNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLXJlcXVlc3Rpbml0LWR1cGxleC5cbiAgICAuLi5yZXF1ZXN0T3B0aW9ucy5ib2R5ICYmIHsgZHVwbGV4OiBcImhhbGZcIiB9XG4gIH0pLnRoZW4oYXN5bmMgKHJlc3BvbnNlKSA9PiB7XG4gICAgdXJsID0gcmVzcG9uc2UudXJsO1xuICAgIHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICBmb3IgKGNvbnN0IGtleUFuZFZhbHVlIG9mIHJlc3BvbnNlLmhlYWRlcnMpIHtcbiAgICAgIGhlYWRlcnNba2V5QW5kVmFsdWVbMF1dID0ga2V5QW5kVmFsdWVbMV07XG4gICAgfVxuICAgIGlmIChcImRlcHJlY2F0aW9uXCIgaW4gaGVhZGVycykge1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IGhlYWRlcnMubGluayAmJiBoZWFkZXJzLmxpbmsubWF0Y2goLzwoW148Pl0rKT47IHJlbD1cImRlcHJlY2F0aW9uXCIvKTtcbiAgICAgIGNvbnN0IGRlcHJlY2F0aW9uTGluayA9IG1hdGNoZXMgJiYgbWF0Y2hlcy5wb3AoKTtcbiAgICAgIGxvZy53YXJuKFxuICAgICAgICBgW0BvY3Rva2l0L3JlcXVlc3RdIFwiJHtyZXF1ZXN0T3B0aW9ucy5tZXRob2R9ICR7cmVxdWVzdE9wdGlvbnMudXJsfVwiIGlzIGRlcHJlY2F0ZWQuIEl0IGlzIHNjaGVkdWxlZCB0byBiZSByZW1vdmVkIG9uICR7aGVhZGVycy5zdW5zZXR9JHtkZXByZWNhdGlvbkxpbmsgPyBgLiBTZWUgJHtkZXByZWNhdGlvbkxpbmt9YCA6IFwiXCJ9YFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA9PT0gMjA0IHx8IHN0YXR1cyA9PT0gMjA1KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5tZXRob2QgPT09IFwiSEVBRFwiKSB7XG4gICAgICBpZiAoc3RhdHVzIDwgNDAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBSZXF1ZXN0RXJyb3IocmVzcG9uc2Uuc3RhdHVzVGV4dCwgc3RhdHVzLCB7XG4gICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgIGRhdGE6IHZvaWQgMFxuICAgICAgICB9LFxuICAgICAgICByZXF1ZXN0OiByZXF1ZXN0T3B0aW9uc1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChzdGF0dXMgPT09IDMwNCkge1xuICAgICAgdGhyb3cgbmV3IFJlcXVlc3RFcnJvcihcIk5vdCBtb2RpZmllZFwiLCBzdGF0dXMsIHtcbiAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgZGF0YTogYXdhaXQgZ2V0UmVzcG9uc2VEYXRhKHJlc3BvbnNlKVxuICAgICAgICB9LFxuICAgICAgICByZXF1ZXN0OiByZXF1ZXN0T3B0aW9uc1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChzdGF0dXMgPj0gNDAwKSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgZ2V0UmVzcG9uc2VEYXRhKHJlc3BvbnNlKTtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IFJlcXVlc3RFcnJvcih0b0Vycm9yTWVzc2FnZShkYXRhKSwgc3RhdHVzLCB7XG4gICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgIGRhdGFcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWVzdDogcmVxdWVzdE9wdGlvbnNcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZVN1Y2Nlc3NSZXNwb25zZUJvZHkgPyBhd2FpdCBnZXRSZXNwb25zZURhdGEocmVzcG9uc2UpIDogcmVzcG9uc2UuYm9keTtcbiAgfSkudGhlbigoZGF0YSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXMsXG4gICAgICB1cmwsXG4gICAgICBoZWFkZXJzLFxuICAgICAgZGF0YVxuICAgIH07XG4gIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFJlcXVlc3RFcnJvcilcbiAgICAgIHRocm93IGVycm9yO1xuICAgIGVsc2UgaWYgKGVycm9yLm5hbWUgPT09IFwiQWJvcnRFcnJvclwiKVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgbGV0IG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlO1xuICAgIGlmIChlcnJvci5uYW1lID09PSBcIlR5cGVFcnJvclwiICYmIFwiY2F1c2VcIiBpbiBlcnJvcikge1xuICAgICAgaWYgKGVycm9yLmNhdXNlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgbWVzc2FnZSA9IGVycm9yLmNhdXNlLm1lc3NhZ2U7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlcnJvci5jYXVzZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBtZXNzYWdlID0gZXJyb3IuY2F1c2U7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBSZXF1ZXN0RXJyb3IobWVzc2FnZSwgNTAwLCB7XG4gICAgICByZXF1ZXN0OiByZXF1ZXN0T3B0aW9uc1xuICAgIH0pO1xuICB9KTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGdldFJlc3BvbnNlRGF0YShyZXNwb25zZSkge1xuICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpO1xuICBpZiAoL2FwcGxpY2F0aW9uXFwvanNvbi8udGVzdChjb250ZW50VHlwZSkpIHtcbiAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+IHJlc3BvbnNlLnRleHQoKSkuY2F0Y2goKCkgPT4gXCJcIik7XG4gIH1cbiAgaWYgKCFjb250ZW50VHlwZSB8fCAvXnRleHRcXC98Y2hhcnNldD11dGYtOCQvLnRlc3QoY29udGVudFR5cGUpKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbiAgfVxuICByZXR1cm4gZ2V0QnVmZmVyKHJlc3BvbnNlKTtcbn1cbmZ1bmN0aW9uIHRvRXJyb3JNZXNzYWdlKGRhdGEpIHtcbiAgaWYgKHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiKVxuICAgIHJldHVybiBkYXRhO1xuICBsZXQgc3VmZml4O1xuICBpZiAoXCJkb2N1bWVudGF0aW9uX3VybFwiIGluIGRhdGEpIHtcbiAgICBzdWZmaXggPSBgIC0gJHtkYXRhLmRvY3VtZW50YXRpb25fdXJsfWA7XG4gIH0gZWxzZSB7XG4gICAgc3VmZml4ID0gXCJcIjtcbiAgfVxuICBpZiAoXCJtZXNzYWdlXCIgaW4gZGF0YSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEuZXJyb3JzKSkge1xuICAgICAgcmV0dXJuIGAke2RhdGEubWVzc2FnZX06ICR7ZGF0YS5lcnJvcnMubWFwKEpTT04uc3RyaW5naWZ5KS5qb2luKFwiLCBcIil9JHtzdWZmaXh9YDtcbiAgICB9XG4gICAgcmV0dXJuIGAke2RhdGEubWVzc2FnZX0ke3N1ZmZpeH1gO1xuICB9XG4gIHJldHVybiBgVW5rbm93biBlcnJvcjogJHtKU09OLnN0cmluZ2lmeShkYXRhKX1gO1xufVxuZXhwb3J0IHtcbiAgZmV0Y2hXcmFwcGVyIGFzIGRlZmF1bHRcbn07XG4iLCJpbXBvcnQgZmV0Y2hXcmFwcGVyIGZyb20gXCIuL2ZldGNoLXdyYXBwZXIuanNcIjtcbmZ1bmN0aW9uIHdpdGhEZWZhdWx0cyhvbGRFbmRwb2ludCwgbmV3RGVmYXVsdHMpIHtcbiAgY29uc3QgZW5kcG9pbnQgPSBvbGRFbmRwb2ludC5kZWZhdWx0cyhuZXdEZWZhdWx0cyk7XG4gIGNvbnN0IG5ld0FwaSA9IGZ1bmN0aW9uKHJvdXRlLCBwYXJhbWV0ZXJzKSB7XG4gICAgY29uc3QgZW5kcG9pbnRPcHRpb25zID0gZW5kcG9pbnQubWVyZ2Uocm91dGUsIHBhcmFtZXRlcnMpO1xuICAgIGlmICghZW5kcG9pbnRPcHRpb25zLnJlcXVlc3QgfHwgIWVuZHBvaW50T3B0aW9ucy5yZXF1ZXN0Lmhvb2spIHtcbiAgICAgIHJldHVybiBmZXRjaFdyYXBwZXIoZW5kcG9pbnQucGFyc2UoZW5kcG9pbnRPcHRpb25zKSk7XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3QgPSAocm91dGUyLCBwYXJhbWV0ZXJzMikgPT4ge1xuICAgICAgcmV0dXJuIGZldGNoV3JhcHBlcihcbiAgICAgICAgZW5kcG9pbnQucGFyc2UoZW5kcG9pbnQubWVyZ2Uocm91dGUyLCBwYXJhbWV0ZXJzMikpXG4gICAgICApO1xuICAgIH07XG4gICAgT2JqZWN0LmFzc2lnbihyZXF1ZXN0LCB7XG4gICAgICBlbmRwb2ludCxcbiAgICAgIGRlZmF1bHRzOiB3aXRoRGVmYXVsdHMuYmluZChudWxsLCBlbmRwb2ludClcbiAgICB9KTtcbiAgICByZXR1cm4gZW5kcG9pbnRPcHRpb25zLnJlcXVlc3QuaG9vayhyZXF1ZXN0LCBlbmRwb2ludE9wdGlvbnMpO1xuICB9O1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXdBcGksIHtcbiAgICBlbmRwb2ludCxcbiAgICBkZWZhdWx0czogd2l0aERlZmF1bHRzLmJpbmQobnVsbCwgZW5kcG9pbnQpXG4gIH0pO1xufVxuZXhwb3J0IHtcbiAgd2l0aERlZmF1bHRzIGFzIGRlZmF1bHRcbn07XG4iLCJpbXBvcnQgeyBlbmRwb2ludCB9IGZyb20gXCJAb2N0b2tpdC9lbmRwb2ludFwiO1xuaW1wb3J0IHsgZ2V0VXNlckFnZW50IH0gZnJvbSBcInVuaXZlcnNhbC11c2VyLWFnZW50XCI7XG5pbXBvcnQgeyBWRVJTSU9OIH0gZnJvbSBcIi4vdmVyc2lvbi5qc1wiO1xuaW1wb3J0IHdpdGhEZWZhdWx0cyBmcm9tIFwiLi93aXRoLWRlZmF1bHRzLmpzXCI7XG5jb25zdCByZXF1ZXN0ID0gd2l0aERlZmF1bHRzKGVuZHBvaW50LCB7XG4gIGhlYWRlcnM6IHtcbiAgICBcInVzZXItYWdlbnRcIjogYG9jdG9raXQtcmVxdWVzdC5qcy8ke1ZFUlNJT059ICR7Z2V0VXNlckFnZW50KCl9YFxuICB9XG59KTtcbmV4cG9ydCB7XG4gIHJlcXVlc3Rcbn07XG4iLCIvLyBwa2cvZGlzdC1zcmMvaW5kZXguanNcbmltcG9ydCB7IHJlcXVlc3QgfSBmcm9tIFwiQG9jdG9raXQvcmVxdWVzdFwiO1xuaW1wb3J0IHsgZ2V0VXNlckFnZW50IH0gZnJvbSBcInVuaXZlcnNhbC11c2VyLWFnZW50XCI7XG5cbi8vIHBrZy9kaXN0LXNyYy92ZXJzaW9uLmpzXG52YXIgVkVSU0lPTiA9IFwiNy4xLjFcIjtcblxuLy8gcGtnL2Rpc3Qtc3JjL3dpdGgtZGVmYXVsdHMuanNcbmltcG9ydCB7IHJlcXVlc3QgYXMgUmVxdWVzdDIgfSBmcm9tIFwiQG9jdG9raXQvcmVxdWVzdFwiO1xuXG4vLyBwa2cvZGlzdC1zcmMvZ3JhcGhxbC5qc1xuaW1wb3J0IHsgcmVxdWVzdCBhcyBSZXF1ZXN0IH0gZnJvbSBcIkBvY3Rva2l0L3JlcXVlc3RcIjtcblxuLy8gcGtnL2Rpc3Qtc3JjL2Vycm9yLmpzXG5mdW5jdGlvbiBfYnVpbGRNZXNzYWdlRm9yUmVzcG9uc2VFcnJvcnMoZGF0YSkge1xuICByZXR1cm4gYFJlcXVlc3QgZmFpbGVkIGR1ZSB0byBmb2xsb3dpbmcgcmVzcG9uc2UgZXJyb3JzOlxuYCArIGRhdGEuZXJyb3JzLm1hcCgoZSkgPT4gYCAtICR7ZS5tZXNzYWdlfWApLmpvaW4oXCJcXG5cIik7XG59XG52YXIgR3JhcGhxbFJlc3BvbnNlRXJyb3IgPSBjbGFzcyBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocmVxdWVzdDIsIGhlYWRlcnMsIHJlc3BvbnNlKSB7XG4gICAgc3VwZXIoX2J1aWxkTWVzc2FnZUZvclJlc3BvbnNlRXJyb3JzKHJlc3BvbnNlKSk7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDI7XG4gICAgdGhpcy5oZWFkZXJzID0gaGVhZGVycztcbiAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgdGhpcy5uYW1lID0gXCJHcmFwaHFsUmVzcG9uc2VFcnJvclwiO1xuICAgIHRoaXMuZXJyb3JzID0gcmVzcG9uc2UuZXJyb3JzO1xuICAgIHRoaXMuZGF0YSA9IHJlc3BvbnNlLmRhdGE7XG4gICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIHBrZy9kaXN0LXNyYy9ncmFwaHFsLmpzXG52YXIgTk9OX1ZBUklBQkxFX09QVElPTlMgPSBbXG4gIFwibWV0aG9kXCIsXG4gIFwiYmFzZVVybFwiLFxuICBcInVybFwiLFxuICBcImhlYWRlcnNcIixcbiAgXCJyZXF1ZXN0XCIsXG4gIFwicXVlcnlcIixcbiAgXCJtZWRpYVR5cGVcIlxuXTtcbnZhciBGT1JCSURERU5fVkFSSUFCTEVfT1BUSU9OUyA9IFtcInF1ZXJ5XCIsIFwibWV0aG9kXCIsIFwidXJsXCJdO1xudmFyIEdIRVNfVjNfU1VGRklYX1JFR0VYID0gL1xcL2FwaVxcL3YzXFwvPyQvO1xuZnVuY3Rpb24gZ3JhcGhxbChyZXF1ZXN0MiwgcXVlcnksIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIHF1ZXJ5ID09PSBcInN0cmluZ1wiICYmIFwicXVlcnlcIiBpbiBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihgW0BvY3Rva2l0L2dyYXBocWxdIFwicXVlcnlcIiBjYW5ub3QgYmUgdXNlZCBhcyB2YXJpYWJsZSBuYW1lYClcbiAgICAgICk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIG9wdGlvbnMpIHtcbiAgICAgIGlmICghRk9SQklEREVOX1ZBUklBQkxFX09QVElPTlMuaW5jbHVkZXMoa2V5KSkgY29udGludWU7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBgW0BvY3Rva2l0L2dyYXBocWxdIFwiJHtrZXl9XCIgY2Fubm90IGJlIHVzZWQgYXMgdmFyaWFibGUgbmFtZWBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgcGFyc2VkT3B0aW9ucyA9IHR5cGVvZiBxdWVyeSA9PT0gXCJzdHJpbmdcIiA/IE9iamVjdC5hc3NpZ24oeyBxdWVyeSB9LCBvcHRpb25zKSA6IHF1ZXJ5O1xuICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IE9iamVjdC5rZXlzKFxuICAgIHBhcnNlZE9wdGlvbnNcbiAgKS5yZWR1Y2UoKHJlc3VsdCwga2V5KSA9PiB7XG4gICAgaWYgKE5PTl9WQVJJQUJMRV9PUFRJT05TLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gcGFyc2VkT3B0aW9uc1trZXldO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgaWYgKCFyZXN1bHQudmFyaWFibGVzKSB7XG4gICAgICByZXN1bHQudmFyaWFibGVzID0ge307XG4gICAgfVxuICAgIHJlc3VsdC52YXJpYWJsZXNba2V5XSA9IHBhcnNlZE9wdGlvbnNba2V5XTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LCB7fSk7XG4gIGNvbnN0IGJhc2VVcmwgPSBwYXJzZWRPcHRpb25zLmJhc2VVcmwgfHwgcmVxdWVzdDIuZW5kcG9pbnQuREVGQVVMVFMuYmFzZVVybDtcbiAgaWYgKEdIRVNfVjNfU1VGRklYX1JFR0VYLnRlc3QoYmFzZVVybCkpIHtcbiAgICByZXF1ZXN0T3B0aW9ucy51cmwgPSBiYXNlVXJsLnJlcGxhY2UoR0hFU19WM19TVUZGSVhfUkVHRVgsIFwiL2FwaS9ncmFwaHFsXCIpO1xuICB9XG4gIHJldHVybiByZXF1ZXN0MihyZXF1ZXN0T3B0aW9ucykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICBpZiAocmVzcG9uc2UuZGF0YS5lcnJvcnMpIHtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlc3BvbnNlLmhlYWRlcnMpKSB7XG4gICAgICAgIGhlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnNba2V5XTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBHcmFwaHFsUmVzcG9uc2VFcnJvcihcbiAgICAgICAgcmVxdWVzdE9wdGlvbnMsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIHJlc3BvbnNlLmRhdGFcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZS5kYXRhLmRhdGE7XG4gIH0pO1xufVxuXG4vLyBwa2cvZGlzdC1zcmMvd2l0aC1kZWZhdWx0cy5qc1xuZnVuY3Rpb24gd2l0aERlZmF1bHRzKHJlcXVlc3QyLCBuZXdEZWZhdWx0cykge1xuICBjb25zdCBuZXdSZXF1ZXN0ID0gcmVxdWVzdDIuZGVmYXVsdHMobmV3RGVmYXVsdHMpO1xuICBjb25zdCBuZXdBcGkgPSAocXVlcnksIG9wdGlvbnMpID0+IHtcbiAgICByZXR1cm4gZ3JhcGhxbChuZXdSZXF1ZXN0LCBxdWVyeSwgb3B0aW9ucyk7XG4gIH07XG4gIHJldHVybiBPYmplY3QuYXNzaWduKG5ld0FwaSwge1xuICAgIGRlZmF1bHRzOiB3aXRoRGVmYXVsdHMuYmluZChudWxsLCBuZXdSZXF1ZXN0KSxcbiAgICBlbmRwb2ludDogbmV3UmVxdWVzdC5lbmRwb2ludFxuICB9KTtcbn1cblxuLy8gcGtnL2Rpc3Qtc3JjL2luZGV4LmpzXG52YXIgZ3JhcGhxbDIgPSB3aXRoRGVmYXVsdHMocmVxdWVzdCwge1xuICBoZWFkZXJzOiB7XG4gICAgXCJ1c2VyLWFnZW50XCI6IGBvY3Rva2l0LWdyYXBocWwuanMvJHtWRVJTSU9OfSAke2dldFVzZXJBZ2VudCgpfWBcbiAgfSxcbiAgbWV0aG9kOiBcIlBPU1RcIixcbiAgdXJsOiBcIi9ncmFwaHFsXCJcbn0pO1xuZnVuY3Rpb24gd2l0aEN1c3RvbVJlcXVlc3QoY3VzdG9tUmVxdWVzdCkge1xuICByZXR1cm4gd2l0aERlZmF1bHRzKGN1c3RvbVJlcXVlc3QsIHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIHVybDogXCIvZ3JhcGhxbFwiXG4gIH0pO1xufVxuZXhwb3J0IHtcbiAgR3JhcGhxbFJlc3BvbnNlRXJyb3IsXG4gIGdyYXBocWwyIGFzIGdyYXBocWwsXG4gIHdpdGhDdXN0b21SZXF1ZXN0XG59O1xuIiwiY29uc3QgUkVHRVhfSVNfSU5TVEFMTEFUSU9OX0xFR0FDWSA9IC9edjFcXC4vO1xuY29uc3QgUkVHRVhfSVNfSU5TVEFMTEFUSU9OID0gL15naHNfLztcbmNvbnN0IFJFR0VYX0lTX1VTRVJfVE9fU0VSVkVSID0gL15naHVfLztcbmFzeW5jIGZ1bmN0aW9uIGF1dGgodG9rZW4pIHtcbiAgY29uc3QgaXNBcHAgPSB0b2tlbi5zcGxpdCgvXFwuLykubGVuZ3RoID09PSAzO1xuICBjb25zdCBpc0luc3RhbGxhdGlvbiA9IFJFR0VYX0lTX0lOU1RBTExBVElPTl9MRUdBQ1kudGVzdCh0b2tlbikgfHwgUkVHRVhfSVNfSU5TVEFMTEFUSU9OLnRlc3QodG9rZW4pO1xuICBjb25zdCBpc1VzZXJUb1NlcnZlciA9IFJFR0VYX0lTX1VTRVJfVE9fU0VSVkVSLnRlc3QodG9rZW4pO1xuICBjb25zdCB0b2tlblR5cGUgPSBpc0FwcCA/IFwiYXBwXCIgOiBpc0luc3RhbGxhdGlvbiA/IFwiaW5zdGFsbGF0aW9uXCIgOiBpc1VzZXJUb1NlcnZlciA/IFwidXNlci10by1zZXJ2ZXJcIiA6IFwib2F1dGhcIjtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcInRva2VuXCIsXG4gICAgdG9rZW4sXG4gICAgdG9rZW5UeXBlXG4gIH07XG59XG5leHBvcnQge1xuICBhdXRoXG59O1xuIiwiZnVuY3Rpb24gd2l0aEF1dGhvcml6YXRpb25QcmVmaXgodG9rZW4pIHtcbiAgaWYgKHRva2VuLnNwbGl0KC9cXC4vKS5sZW5ndGggPT09IDMpIHtcbiAgICByZXR1cm4gYGJlYXJlciAke3Rva2VufWA7XG4gIH1cbiAgcmV0dXJuIGB0b2tlbiAke3Rva2VufWA7XG59XG5leHBvcnQge1xuICB3aXRoQXV0aG9yaXphdGlvblByZWZpeFxufTtcbiIsImltcG9ydCB7IHdpdGhBdXRob3JpemF0aW9uUHJlZml4IH0gZnJvbSBcIi4vd2l0aC1hdXRob3JpemF0aW9uLXByZWZpeFwiO1xuYXN5bmMgZnVuY3Rpb24gaG9vayh0b2tlbiwgcmVxdWVzdCwgcm91dGUsIHBhcmFtZXRlcnMpIHtcbiAgY29uc3QgZW5kcG9pbnQgPSByZXF1ZXN0LmVuZHBvaW50Lm1lcmdlKFxuICAgIHJvdXRlLFxuICAgIHBhcmFtZXRlcnNcbiAgKTtcbiAgZW5kcG9pbnQuaGVhZGVycy5hdXRob3JpemF0aW9uID0gd2l0aEF1dGhvcml6YXRpb25QcmVmaXgodG9rZW4pO1xuICByZXR1cm4gcmVxdWVzdChlbmRwb2ludCk7XG59XG5leHBvcnQge1xuICBob29rXG59O1xuIiwiaW1wb3J0IHsgYXV0aCB9IGZyb20gXCIuL2F1dGhcIjtcbmltcG9ydCB7IGhvb2sgfSBmcm9tIFwiLi9ob29rXCI7XG5jb25zdCBjcmVhdGVUb2tlbkF1dGggPSBmdW5jdGlvbiBjcmVhdGVUb2tlbkF1dGgyKHRva2VuKSB7XG4gIGlmICghdG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJbQG9jdG9raXQvYXV0aC10b2tlbl0gTm8gdG9rZW4gcGFzc2VkIHRvIGNyZWF0ZVRva2VuQXV0aFwiKTtcbiAgfVxuICBpZiAodHlwZW9mIHRva2VuICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJbQG9jdG9raXQvYXV0aC10b2tlbl0gVG9rZW4gcGFzc2VkIHRvIGNyZWF0ZVRva2VuQXV0aCBpcyBub3QgYSBzdHJpbmdcIlxuICAgICk7XG4gIH1cbiAgdG9rZW4gPSB0b2tlbi5yZXBsYWNlKC9eKHRva2VufGJlYXJlcikgKy9pLCBcIlwiKTtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYXV0aC5iaW5kKG51bGwsIHRva2VuKSwge1xuICAgIGhvb2s6IGhvb2suYmluZChudWxsLCB0b2tlbilcbiAgfSk7XG59O1xuZXhwb3J0IHtcbiAgY3JlYXRlVG9rZW5BdXRoXG59O1xuIiwiLy8gcGtnL2Rpc3Qtc3JjL2luZGV4LmpzXG5pbXBvcnQgeyBnZXRVc2VyQWdlbnQgfSBmcm9tIFwidW5pdmVyc2FsLXVzZXItYWdlbnRcIjtcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tIFwiYmVmb3JlLWFmdGVyLWhvb2tcIjtcbmltcG9ydCB7IHJlcXVlc3QgfSBmcm9tIFwiQG9jdG9raXQvcmVxdWVzdFwiO1xuaW1wb3J0IHsgZ3JhcGhxbCwgd2l0aEN1c3RvbVJlcXVlc3QgfSBmcm9tIFwiQG9jdG9raXQvZ3JhcGhxbFwiO1xuaW1wb3J0IHsgY3JlYXRlVG9rZW5BdXRoIH0gZnJvbSBcIkBvY3Rva2l0L2F1dGgtdG9rZW5cIjtcblxuLy8gcGtnL2Rpc3Qtc3JjL3ZlcnNpb24uanNcbnZhciBWRVJTSU9OID0gXCI1LjIuMlwiO1xuXG4vLyBwa2cvZGlzdC1zcmMvaW5kZXguanNcbnZhciBub29wID0gKCkgPT4ge1xufTtcbnZhciBjb25zb2xlV2FybiA9IGNvbnNvbGUud2Fybi5iaW5kKGNvbnNvbGUpO1xudmFyIGNvbnNvbGVFcnJvciA9IGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTtcbmZ1bmN0aW9uIGNyZWF0ZUxvZ2dlcihsb2dnZXIgPSB7fSkge1xuICBpZiAodHlwZW9mIGxvZ2dlci5kZWJ1ZyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgbG9nZ2VyLmRlYnVnID0gbm9vcDtcbiAgfVxuICBpZiAodHlwZW9mIGxvZ2dlci5pbmZvICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBsb2dnZXIuaW5mbyA9IG5vb3A7XG4gIH1cbiAgaWYgKHR5cGVvZiBsb2dnZXIud2FybiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgbG9nZ2VyLndhcm4gPSBjb25zb2xlV2FybjtcbiAgfVxuICBpZiAodHlwZW9mIGxvZ2dlci5lcnJvciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgbG9nZ2VyLmVycm9yID0gY29uc29sZUVycm9yO1xuICB9XG4gIHJldHVybiBsb2dnZXI7XG59XG52YXIgdXNlckFnZW50VHJhaWwgPSBgb2N0b2tpdC1jb3JlLmpzLyR7VkVSU0lPTn0gJHtnZXRVc2VyQWdlbnQoKX1gO1xudmFyIE9jdG9raXQgPSBjbGFzcyB7XG4gIHN0YXRpYyB7XG4gICAgdGhpcy5WRVJTSU9OID0gVkVSU0lPTjtcbiAgfVxuICBzdGF0aWMgZGVmYXVsdHMoZGVmYXVsdHMpIHtcbiAgICBjb25zdCBPY3Rva2l0V2l0aERlZmF1bHRzID0gY2xhc3MgZXh0ZW5kcyB0aGlzIHtcbiAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGFyZ3NbMF0gfHwge307XG4gICAgICAgIGlmICh0eXBlb2YgZGVmYXVsdHMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHN1cGVyKGRlZmF1bHRzKG9wdGlvbnMpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIoXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgZGVmYXVsdHMsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgb3B0aW9ucy51c2VyQWdlbnQgJiYgZGVmYXVsdHMudXNlckFnZW50ID8ge1xuICAgICAgICAgICAgICB1c2VyQWdlbnQ6IGAke29wdGlvbnMudXNlckFnZW50fSAke2RlZmF1bHRzLnVzZXJBZ2VudH1gXG4gICAgICAgICAgICB9IDogbnVsbFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBPY3Rva2l0V2l0aERlZmF1bHRzO1xuICB9XG4gIHN0YXRpYyB7XG4gICAgdGhpcy5wbHVnaW5zID0gW107XG4gIH1cbiAgLyoqXG4gICAqIEF0dGFjaCBhIHBsdWdpbiAob3IgbWFueSkgdG8geW91ciBPY3Rva2l0IGluc3RhbmNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBBUEkgPSBPY3Rva2l0LnBsdWdpbihwbHVnaW4xLCBwbHVnaW4yLCBwbHVnaW4zLCAuLi4pXG4gICAqL1xuICBzdGF0aWMgcGx1Z2luKC4uLm5ld1BsdWdpbnMpIHtcbiAgICBjb25zdCBjdXJyZW50UGx1Z2lucyA9IHRoaXMucGx1Z2lucztcbiAgICBjb25zdCBOZXdPY3Rva2l0ID0gY2xhc3MgZXh0ZW5kcyB0aGlzIHtcbiAgICAgIHN0YXRpYyB7XG4gICAgICAgIHRoaXMucGx1Z2lucyA9IGN1cnJlbnRQbHVnaW5zLmNvbmNhdChcbiAgICAgICAgICBuZXdQbHVnaW5zLmZpbHRlcigocGx1Z2luKSA9PiAhY3VycmVudFBsdWdpbnMuaW5jbHVkZXMocGx1Z2luKSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBOZXdPY3Rva2l0O1xuICB9XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGhvb2sgPSBuZXcgQ29sbGVjdGlvbigpO1xuICAgIGNvbnN0IHJlcXVlc3REZWZhdWx0cyA9IHtcbiAgICAgIGJhc2VVcmw6IHJlcXVlc3QuZW5kcG9pbnQuREVGQVVMVFMuYmFzZVVybCxcbiAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgcmVxdWVzdDogT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5yZXF1ZXN0LCB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgaW50ZXJuYWwgdXNhZ2Ugb25seSwgbm8gbmVlZCB0byB0eXBlXG4gICAgICAgIGhvb2s6IGhvb2suYmluZChudWxsLCBcInJlcXVlc3RcIilcbiAgICAgIH0pLFxuICAgICAgbWVkaWFUeXBlOiB7XG4gICAgICAgIHByZXZpZXdzOiBbXSxcbiAgICAgICAgZm9ybWF0OiBcIlwiXG4gICAgICB9XG4gICAgfTtcbiAgICByZXF1ZXN0RGVmYXVsdHMuaGVhZGVyc1tcInVzZXItYWdlbnRcIl0gPSBvcHRpb25zLnVzZXJBZ2VudCA/IGAke29wdGlvbnMudXNlckFnZW50fSAke3VzZXJBZ2VudFRyYWlsfWAgOiB1c2VyQWdlbnRUcmFpbDtcbiAgICBpZiAob3B0aW9ucy5iYXNlVXJsKSB7XG4gICAgICByZXF1ZXN0RGVmYXVsdHMuYmFzZVVybCA9IG9wdGlvbnMuYmFzZVVybDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMucHJldmlld3MpIHtcbiAgICAgIHJlcXVlc3REZWZhdWx0cy5tZWRpYVR5cGUucHJldmlld3MgPSBvcHRpb25zLnByZXZpZXdzO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy50aW1lWm9uZSkge1xuICAgICAgcmVxdWVzdERlZmF1bHRzLmhlYWRlcnNbXCJ0aW1lLXpvbmVcIl0gPSBvcHRpb25zLnRpbWVab25lO1xuICAgIH1cbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0LmRlZmF1bHRzKHJlcXVlc3REZWZhdWx0cyk7XG4gICAgdGhpcy5ncmFwaHFsID0gd2l0aEN1c3RvbVJlcXVlc3QodGhpcy5yZXF1ZXN0KS5kZWZhdWx0cyhyZXF1ZXN0RGVmYXVsdHMpO1xuICAgIHRoaXMubG9nID0gY3JlYXRlTG9nZ2VyKG9wdGlvbnMubG9nKTtcbiAgICB0aGlzLmhvb2sgPSBob29rO1xuICAgIGlmICghb3B0aW9ucy5hdXRoU3RyYXRlZ3kpIHtcbiAgICAgIGlmICghb3B0aW9ucy5hdXRoKSB7XG4gICAgICAgIHRoaXMuYXV0aCA9IGFzeW5jICgpID0+ICh7XG4gICAgICAgICAgdHlwZTogXCJ1bmF1dGhlbnRpY2F0ZWRcIlxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGF1dGggPSBjcmVhdGVUb2tlbkF1dGgob3B0aW9ucy5hdXRoKTtcbiAgICAgICAgaG9vay53cmFwKFwicmVxdWVzdFwiLCBhdXRoLmhvb2spO1xuICAgICAgICB0aGlzLmF1dGggPSBhdXRoO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7IGF1dGhTdHJhdGVneSwgLi4ub3RoZXJPcHRpb25zIH0gPSBvcHRpb25zO1xuICAgICAgY29uc3QgYXV0aCA9IGF1dGhTdHJhdGVneShcbiAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXF1ZXN0OiB0aGlzLnJlcXVlc3QsXG4gICAgICAgICAgICBsb2c6IHRoaXMubG9nLFxuICAgICAgICAgICAgLy8gd2UgcGFzcyB0aGUgY3VycmVudCBvY3Rva2l0IGluc3RhbmNlIGFzIHdlbGwgYXMgaXRzIGNvbnN0cnVjdG9yIG9wdGlvbnNcbiAgICAgICAgICAgIC8vIHRvIGFsbG93IGZvciBhdXRoZW50aWNhdGlvbiBzdHJhdGVnaWVzIHRoYXQgcmV0dXJuIGEgbmV3IG9jdG9raXQgaW5zdGFuY2VcbiAgICAgICAgICAgIC8vIHRoYXQgc2hhcmVzIHRoZSBzYW1lIGludGVybmFsIHN0YXRlIGFzIHRoZSBjdXJyZW50IG9uZS4gVGhlIG9yaWdpbmFsXG4gICAgICAgICAgICAvLyByZXF1aXJlbWVudCBmb3IgdGhpcyB3YXMgdGhlIFwiZXZlbnQtb2N0b2tpdFwiIGF1dGhlbnRpY2F0aW9uIHN0cmF0ZWd5XG4gICAgICAgICAgICAvLyBvZiBodHRwczovL2dpdGh1Yi5jb20vcHJvYm90L29jdG9raXQtYXV0aC1wcm9ib3QuXG4gICAgICAgICAgICBvY3Rva2l0OiB0aGlzLFxuICAgICAgICAgICAgb2N0b2tpdE9wdGlvbnM6IG90aGVyT3B0aW9uc1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb3B0aW9ucy5hdXRoXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBob29rLndyYXAoXCJyZXF1ZXN0XCIsIGF1dGguaG9vayk7XG4gICAgICB0aGlzLmF1dGggPSBhdXRoO1xuICAgIH1cbiAgICBjb25zdCBjbGFzc0NvbnN0cnVjdG9yID0gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsYXNzQ29uc3RydWN0b3IucGx1Z2lucy5sZW5ndGg7ICsraSkge1xuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBjbGFzc0NvbnN0cnVjdG9yLnBsdWdpbnNbaV0odGhpcywgb3B0aW9ucykpO1xuICAgIH1cbiAgfVxufTtcbmV4cG9ydCB7XG4gIE9jdG9raXRcbn07XG4iLCJjb25zdCBWRVJTSU9OID0gXCIxMC40LjFcIjtcbmV4cG9ydCB7XG4gIFZFUlNJT05cbn07XG4iLCJjb25zdCBFbmRwb2ludHMgPSB7XG4gIGFjdGlvbnM6IHtcbiAgICBhZGRDdXN0b21MYWJlbHNUb1NlbGZIb3N0ZWRSdW5uZXJGb3JPcmc6IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzXCJcbiAgICBdLFxuICAgIGFkZEN1c3RvbUxhYmVsc1RvU2VsZkhvc3RlZFJ1bm5lckZvclJlcG86IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9L2xhYmVsc1wiXG4gICAgXSxcbiAgICBhZGRTZWxlY3RlZFJlcG9Ub09yZ1NlY3JldDogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiXG4gICAgXSxcbiAgICBhZGRTZWxlY3RlZFJlcG9Ub09yZ1ZhcmlhYmxlOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3ZhcmlhYmxlcy97bmFtZX0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiXG4gICAgXSxcbiAgICBhcHByb3ZlV29ya2Zsb3dSdW46IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2FwcHJvdmVcIlxuICAgIF0sXG4gICAgY2FuY2VsV29ya2Zsb3dSdW46IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2NhbmNlbFwiXG4gICAgXSxcbiAgICBjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS92YXJpYWJsZXNcIlxuICAgIF0sXG4gICAgY3JlYXRlT3JVcGRhdGVFbnZpcm9ubWVudFNlY3JldDogW1xuICAgICAgXCJQVVQgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgY3JlYXRlT3JVcGRhdGVPcmdTZWNyZXQ6IFtcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXSxcbiAgICBjcmVhdGVPclVwZGF0ZVJlcG9TZWNyZXQ6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXG4gICAgXSxcbiAgICBjcmVhdGVPcmdWYXJpYWJsZTogW1wiUE9TVCAvb3Jncy97b3JnfS9hY3Rpb25zL3ZhcmlhYmxlc1wiXSxcbiAgICBjcmVhdGVSZWdpc3RyYXRpb25Ub2tlbkZvck9yZzogW1xuICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy9yZWdpc3RyYXRpb24tdG9rZW5cIlxuICAgIF0sXG4gICAgY3JlYXRlUmVnaXN0cmF0aW9uVG9rZW5Gb3JSZXBvOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy9yZWdpc3RyYXRpb24tdG9rZW5cIlxuICAgIF0sXG4gICAgY3JlYXRlUmVtb3ZlVG9rZW5Gb3JPcmc6IFtcIlBPU1QgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXJzL3JlbW92ZS10b2tlblwiXSxcbiAgICBjcmVhdGVSZW1vdmVUb2tlbkZvclJlcG86IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3JlbW92ZS10b2tlblwiXG4gICAgXSxcbiAgICBjcmVhdGVSZXBvVmFyaWFibGU6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvdmFyaWFibGVzXCJdLFxuICAgIGNyZWF0ZVdvcmtmbG93RGlzcGF0Y2g6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfS9kaXNwYXRjaGVzXCJcbiAgICBdLFxuICAgIGRlbGV0ZUFjdGlvbnNDYWNoZUJ5SWQ6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2NhY2hlcy97Y2FjaGVfaWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZUFjdGlvbnNDYWNoZUJ5S2V5OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9jYWNoZXN7P2tleSxyZWZ9XCJcbiAgICBdLFxuICAgIGRlbGV0ZUFydGlmYWN0OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9hcnRpZmFjdHMve2FydGlmYWN0X2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVFbnZpcm9ubWVudFNlY3JldDogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgZGVsZXRlRW52aXJvbm1lbnRWYXJpYWJsZTogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS92YXJpYWJsZXMve25hbWV9XCJcbiAgICBdLFxuICAgIGRlbGV0ZU9yZ1NlY3JldDogW1wiREVMRVRFIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgIGRlbGV0ZU9yZ1ZhcmlhYmxlOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vYWN0aW9ucy92YXJpYWJsZXMve25hbWV9XCJdLFxuICAgIGRlbGV0ZVJlcG9TZWNyZXQ6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXG4gICAgXSxcbiAgICBkZWxldGVSZXBvVmFyaWFibGU6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3ZhcmlhYmxlcy97bmFtZX1cIlxuICAgIF0sXG4gICAgZGVsZXRlU2VsZkhvc3RlZFJ1bm5lckZyb21Pcmc6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVTZWxmSG9zdGVkUnVubmVyRnJvbVJlcG86IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlV29ya2Zsb3dSdW46IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9XCJdLFxuICAgIGRlbGV0ZVdvcmtmbG93UnVuTG9nczogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9sb2dzXCJcbiAgICBdLFxuICAgIGRpc2FibGVTZWxlY3RlZFJlcG9zaXRvcnlHaXRodWJBY3Rpb25zT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIlxuICAgIF0sXG4gICAgZGlzYWJsZVdvcmtmbG93OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfS9kaXNhYmxlXCJcbiAgICBdLFxuICAgIGRvd25sb2FkQXJ0aWZhY3Q6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2FydGlmYWN0cy97YXJ0aWZhY3RfaWR9L3thcmNoaXZlX2Zvcm1hdH1cIlxuICAgIF0sXG4gICAgZG93bmxvYWRKb2JMb2dzRm9yV29ya2Zsb3dSdW46IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2pvYnMve2pvYl9pZH0vbG9nc1wiXG4gICAgXSxcbiAgICBkb3dubG9hZFdvcmtmbG93UnVuQXR0ZW1wdExvZ3M6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vYXR0ZW1wdHMve2F0dGVtcHRfbnVtYmVyfS9sb2dzXCJcbiAgICBdLFxuICAgIGRvd25sb2FkV29ya2Zsb3dSdW5Mb2dzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2xvZ3NcIlxuICAgIF0sXG4gICAgZW5hYmxlU2VsZWN0ZWRSZXBvc2l0b3J5R2l0aHViQWN0aW9uc09yZ2FuaXphdGlvbjogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9ucy9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCJcbiAgICBdLFxuICAgIGVuYWJsZVdvcmtmbG93OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfS9lbmFibGVcIlxuICAgIF0sXG4gICAgZm9yY2VDYW5jZWxXb3JrZmxvd1J1bjogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vZm9yY2UtY2FuY2VsXCJcbiAgICBdLFxuICAgIGdlbmVyYXRlUnVubmVySml0Y29uZmlnRm9yT3JnOiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXJzL2dlbmVyYXRlLWppdGNvbmZpZ1wiXG4gICAgXSxcbiAgICBnZW5lcmF0ZVJ1bm5lckppdGNvbmZpZ0ZvclJlcG86IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL2dlbmVyYXRlLWppdGNvbmZpZ1wiXG4gICAgXSxcbiAgICBnZXRBY3Rpb25zQ2FjaGVMaXN0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvY2FjaGVzXCJdLFxuICAgIGdldEFjdGlvbnNDYWNoZVVzYWdlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvY2FjaGUvdXNhZ2VcIl0sXG4gICAgZ2V0QWN0aW9uc0NhY2hlVXNhZ2VCeVJlcG9Gb3JPcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvY2FjaGUvdXNhZ2UtYnktcmVwb3NpdG9yeVwiXG4gICAgXSxcbiAgICBnZXRBY3Rpb25zQ2FjaGVVc2FnZUZvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvY2FjaGUvdXNhZ2VcIl0sXG4gICAgZ2V0QWxsb3dlZEFjdGlvbnNPcmdhbml6YXRpb246IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnMvc2VsZWN0ZWQtYWN0aW9uc1wiXG4gICAgXSxcbiAgICBnZXRBbGxvd2VkQWN0aW9uc1JlcG9zaXRvcnk6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zL3NlbGVjdGVkLWFjdGlvbnNcIlxuICAgIF0sXG4gICAgZ2V0QXJ0aWZhY3Q6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9hcnRpZmFjdHMve2FydGlmYWN0X2lkfVwiXSxcbiAgICBnZXRDdXN0b21PaWRjU3ViQ2xhaW1Gb3JSZXBvOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9vaWRjL2N1c3RvbWl6YXRpb24vc3ViXCJcbiAgICBdLFxuICAgIGdldEVudmlyb25tZW50UHVibGljS2V5OiBbXG4gICAgICBcIkdFVCAvcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L3NlY3JldHMvcHVibGljLWtleVwiXG4gICAgXSxcbiAgICBnZXRFbnZpcm9ubWVudFNlY3JldDogW1xuICAgICAgXCJHRVQgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgZ2V0RW52aXJvbm1lbnRWYXJpYWJsZTogW1xuICAgICAgXCJHRVQgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS92YXJpYWJsZXMve25hbWV9XCJcbiAgICBdLFxuICAgIGdldEdpdGh1YkFjdGlvbnNEZWZhdWx0V29ya2Zsb3dQZXJtaXNzaW9uc09yZ2FuaXphdGlvbjogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9ucy93b3JrZmxvd1wiXG4gICAgXSxcbiAgICBnZXRHaXRodWJBY3Rpb25zRGVmYXVsdFdvcmtmbG93UGVybWlzc2lvbnNSZXBvc2l0b3J5OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9wZXJtaXNzaW9ucy93b3JrZmxvd1wiXG4gICAgXSxcbiAgICBnZXRHaXRodWJBY3Rpb25zUGVybWlzc2lvbnNPcmdhbml6YXRpb246IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnNcIlxuICAgIF0sXG4gICAgZ2V0R2l0aHViQWN0aW9uc1Blcm1pc3Npb25zUmVwb3NpdG9yeTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcGVybWlzc2lvbnNcIlxuICAgIF0sXG4gICAgZ2V0Sm9iRm9yV29ya2Zsb3dSdW46IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9qb2JzL3tqb2JfaWR9XCJdLFxuICAgIGdldE9yZ1B1YmxpY0tleTogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy9wdWJsaWMta2V5XCJdLFxuICAgIGdldE9yZ1NlY3JldDogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgIGdldE9yZ1ZhcmlhYmxlOiBbXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy92YXJpYWJsZXMve25hbWV9XCJdLFxuICAgIGdldFBlbmRpbmdEZXBsb3ltZW50c0ZvclJ1bjogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9wZW5kaW5nX2RlcGxveW1lbnRzXCJcbiAgICBdLFxuICAgIGdldFJlcG9QZXJtaXNzaW9uczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcGVybWlzc2lvbnNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJhY3Rpb25zXCIsIFwiZ2V0R2l0aHViQWN0aW9uc1Blcm1pc3Npb25zUmVwb3NpdG9yeVwiXSB9XG4gICAgXSxcbiAgICBnZXRSZXBvUHVibGljS2V5OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy9wdWJsaWMta2V5XCJdLFxuICAgIGdldFJlcG9TZWNyZXQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIl0sXG4gICAgZ2V0UmVwb1ZhcmlhYmxlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvdmFyaWFibGVzL3tuYW1lfVwiXSxcbiAgICBnZXRSZXZpZXdzRm9yUnVuOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2FwcHJvdmFsc1wiXG4gICAgXSxcbiAgICBnZXRTZWxmSG9zdGVkUnVubmVyRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9XCJdLFxuICAgIGdldFNlbGZIb3N0ZWRSdW5uZXJGb3JSZXBvOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9XCJcbiAgICBdLFxuICAgIGdldFdvcmtmbG93OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzL3t3b3JrZmxvd19pZH1cIl0sXG4gICAgZ2V0V29ya2Zsb3dBY2Nlc3NUb1JlcG9zaXRvcnk6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zL2FjY2Vzc1wiXG4gICAgXSxcbiAgICBnZXRXb3JrZmxvd1J1bjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH1cIl0sXG4gICAgZ2V0V29ya2Zsb3dSdW5BdHRlbXB0OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2F0dGVtcHRzL3thdHRlbXB0X251bWJlcn1cIlxuICAgIF0sXG4gICAgZ2V0V29ya2Zsb3dSdW5Vc2FnZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS90aW1pbmdcIlxuICAgIF0sXG4gICAgZ2V0V29ya2Zsb3dVc2FnZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzL3t3b3JrZmxvd19pZH0vdGltaW5nXCJcbiAgICBdLFxuICAgIGxpc3RBcnRpZmFjdHNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvYXJ0aWZhY3RzXCJdLFxuICAgIGxpc3RFbnZpcm9ubWVudFNlY3JldHM6IFtcbiAgICAgIFwiR0VUIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vc2VjcmV0c1wiXG4gICAgXSxcbiAgICBsaXN0RW52aXJvbm1lbnRWYXJpYWJsZXM6IFtcbiAgICAgIFwiR0VUIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vdmFyaWFibGVzXCJcbiAgICBdLFxuICAgIGxpc3RKb2JzRm9yV29ya2Zsb3dSdW46IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vam9ic1wiXG4gICAgXSxcbiAgICBsaXN0Sm9ic0ZvcldvcmtmbG93UnVuQXR0ZW1wdDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9hdHRlbXB0cy97YXR0ZW1wdF9udW1iZXJ9L2pvYnNcIlxuICAgIF0sXG4gICAgbGlzdExhYmVsc0ZvclNlbGZIb3N0ZWRSdW5uZXJGb3JPcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHNcIlxuICAgIF0sXG4gICAgbGlzdExhYmVsc0ZvclNlbGZIb3N0ZWRSdW5uZXJGb3JSZXBvOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9L2xhYmVsc1wiXG4gICAgXSxcbiAgICBsaXN0T3JnU2VjcmV0czogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0c1wiXSxcbiAgICBsaXN0T3JnVmFyaWFibGVzOiBbXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy92YXJpYWJsZXNcIl0sXG4gICAgbGlzdFJlcG9Pcmdhbml6YXRpb25TZWNyZXRzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9vcmdhbml6YXRpb24tc2VjcmV0c1wiXG4gICAgXSxcbiAgICBsaXN0UmVwb09yZ2FuaXphdGlvblZhcmlhYmxlczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvb3JnYW5pemF0aW9uLXZhcmlhYmxlc1wiXG4gICAgXSxcbiAgICBsaXN0UmVwb1NlY3JldHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzXCJdLFxuICAgIGxpc3RSZXBvVmFyaWFibGVzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvdmFyaWFibGVzXCJdLFxuICAgIGxpc3RSZXBvV29ya2Zsb3dzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzXCJdLFxuICAgIGxpc3RSdW5uZXJBcHBsaWNhdGlvbnNGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMvZG93bmxvYWRzXCJdLFxuICAgIGxpc3RSdW5uZXJBcHBsaWNhdGlvbnNGb3JSZXBvOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL2Rvd25sb2Fkc1wiXG4gICAgXSxcbiAgICBsaXN0U2VsZWN0ZWRSZXBvc0Zvck9yZ1NlY3JldDogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzXCJcbiAgICBdLFxuICAgIGxpc3RTZWxlY3RlZFJlcG9zRm9yT3JnVmFyaWFibGU6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvdmFyaWFibGVzL3tuYW1lfS9yZXBvc2l0b3JpZXNcIlxuICAgIF0sXG4gICAgbGlzdFNlbGVjdGVkUmVwb3NpdG9yaWVzRW5hYmxlZEdpdGh1YkFjdGlvbnNPcmdhbml6YXRpb246IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnMvcmVwb3NpdG9yaWVzXCJcbiAgICBdLFxuICAgIGxpc3RTZWxmSG9zdGVkUnVubmVyc0Zvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVyc1wiXSxcbiAgICBsaXN0U2VsZkhvc3RlZFJ1bm5lcnNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVyc1wiXSxcbiAgICBsaXN0V29ya2Zsb3dSdW5BcnRpZmFjdHM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vYXJ0aWZhY3RzXCJcbiAgICBdLFxuICAgIGxpc3RXb3JrZmxvd1J1bnM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3dvcmtmbG93cy97d29ya2Zsb3dfaWR9L3J1bnNcIlxuICAgIF0sXG4gICAgbGlzdFdvcmtmbG93UnVuc0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zXCJdLFxuICAgIHJlUnVuSm9iRm9yV29ya2Zsb3dSdW46IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9qb2JzL3tqb2JfaWR9L3JlcnVuXCJcbiAgICBdLFxuICAgIHJlUnVuV29ya2Zsb3c6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9yZXJ1blwiXSxcbiAgICByZVJ1bldvcmtmbG93RmFpbGVkSm9iczogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vcmVydW4tZmFpbGVkLWpvYnNcIlxuICAgIF0sXG4gICAgcmVtb3ZlQWxsQ3VzdG9tTGFiZWxzRnJvbVNlbGZIb3N0ZWRSdW5uZXJGb3JPcmc6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHNcIlxuICAgIF0sXG4gICAgcmVtb3ZlQWxsQ3VzdG9tTGFiZWxzRnJvbVNlbGZIb3N0ZWRSdW5uZXJGb3JSZXBvOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9L2xhYmVsc1wiXG4gICAgXSxcbiAgICByZW1vdmVDdXN0b21MYWJlbEZyb21TZWxmSG9zdGVkUnVubmVyRm9yT3JnOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzL3tuYW1lfVwiXG4gICAgXSxcbiAgICByZW1vdmVDdXN0b21MYWJlbEZyb21TZWxmSG9zdGVkUnVubmVyRm9yUmVwbzogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHMve25hbWV9XCJcbiAgICBdLFxuICAgIHJlbW92ZVNlbGVjdGVkUmVwb0Zyb21PcmdTZWNyZXQ6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIlxuICAgIF0sXG4gICAgcmVtb3ZlU2VsZWN0ZWRSZXBvRnJvbU9yZ1ZhcmlhYmxlOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9hY3Rpb25zL3ZhcmlhYmxlcy97bmFtZX0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiXG4gICAgXSxcbiAgICByZXZpZXdDdXN0b21HYXRlc0ZvclJ1bjogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vZGVwbG95bWVudF9wcm90ZWN0aW9uX3J1bGVcIlxuICAgIF0sXG4gICAgcmV2aWV3UGVuZGluZ0RlcGxveW1lbnRzRm9yUnVuOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9wZW5kaW5nX2RlcGxveW1lbnRzXCJcbiAgICBdLFxuICAgIHNldEFsbG93ZWRBY3Rpb25zT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zL3NlbGVjdGVkLWFjdGlvbnNcIlxuICAgIF0sXG4gICAgc2V0QWxsb3dlZEFjdGlvbnNSZXBvc2l0b3J5OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9wZXJtaXNzaW9ucy9zZWxlY3RlZC1hY3Rpb25zXCJcbiAgICBdLFxuICAgIHNldEN1c3RvbUxhYmVsc0ZvclNlbGZIb3N0ZWRSdW5uZXJGb3JPcmc6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHNcIlxuICAgIF0sXG4gICAgc2V0Q3VzdG9tTGFiZWxzRm9yU2VsZkhvc3RlZFJ1bm5lckZvclJlcG86IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzXCJcbiAgICBdLFxuICAgIHNldEN1c3RvbU9pZGNTdWJDbGFpbUZvclJlcG86IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL29pZGMvY3VzdG9taXphdGlvbi9zdWJcIlxuICAgIF0sXG4gICAgc2V0R2l0aHViQWN0aW9uc0RlZmF1bHRXb3JrZmxvd1Blcm1pc3Npb25zT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zL3dvcmtmbG93XCJcbiAgICBdLFxuICAgIHNldEdpdGh1YkFjdGlvbnNEZWZhdWx0V29ya2Zsb3dQZXJtaXNzaW9uc1JlcG9zaXRvcnk6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zL3dvcmtmbG93XCJcbiAgICBdLFxuICAgIHNldEdpdGh1YkFjdGlvbnNQZXJtaXNzaW9uc09yZ2FuaXphdGlvbjogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9uc1wiXG4gICAgXSxcbiAgICBzZXRHaXRodWJBY3Rpb25zUGVybWlzc2lvbnNSZXBvc2l0b3J5OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9wZXJtaXNzaW9uc1wiXG4gICAgXSxcbiAgICBzZXRTZWxlY3RlZFJlcG9zRm9yT3JnU2VjcmV0OiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXNcIlxuICAgIF0sXG4gICAgc2V0U2VsZWN0ZWRSZXBvc0Zvck9yZ1ZhcmlhYmxlOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3ZhcmlhYmxlcy97bmFtZX0vcmVwb3NpdG9yaWVzXCJcbiAgICBdLFxuICAgIHNldFNlbGVjdGVkUmVwb3NpdG9yaWVzRW5hYmxlZEdpdGh1YkFjdGlvbnNPcmdhbml6YXRpb246IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnMvcmVwb3NpdG9yaWVzXCJcbiAgICBdLFxuICAgIHNldFdvcmtmbG93QWNjZXNzVG9SZXBvc2l0b3J5OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9wZXJtaXNzaW9ucy9hY2Nlc3NcIlxuICAgIF0sXG4gICAgdXBkYXRlRW52aXJvbm1lbnRWYXJpYWJsZTogW1xuICAgICAgXCJQQVRDSCAvcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L3ZhcmlhYmxlcy97bmFtZX1cIlxuICAgIF0sXG4gICAgdXBkYXRlT3JnVmFyaWFibGU6IFtcIlBBVENIIC9vcmdzL3tvcmd9L2FjdGlvbnMvdmFyaWFibGVzL3tuYW1lfVwiXSxcbiAgICB1cGRhdGVSZXBvVmFyaWFibGU6IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvdmFyaWFibGVzL3tuYW1lfVwiXG4gICAgXVxuICB9LFxuICBhY3Rpdml0eToge1xuICAgIGNoZWNrUmVwb0lzU3RhcnJlZEJ5QXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9zdGFycmVkL3tvd25lcn0ve3JlcG99XCJdLFxuICAgIGRlbGV0ZVJlcG9TdWJzY3JpcHRpb246IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vc3Vic2NyaXB0aW9uXCJdLFxuICAgIGRlbGV0ZVRocmVhZFN1YnNjcmlwdGlvbjogW1xuICAgICAgXCJERUxFVEUgL25vdGlmaWNhdGlvbnMvdGhyZWFkcy97dGhyZWFkX2lkfS9zdWJzY3JpcHRpb25cIlxuICAgIF0sXG4gICAgZ2V0RmVlZHM6IFtcIkdFVCAvZmVlZHNcIl0sXG4gICAgZ2V0UmVwb1N1YnNjcmlwdGlvbjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdWJzY3JpcHRpb25cIl0sXG4gICAgZ2V0VGhyZWFkOiBbXCJHRVQgL25vdGlmaWNhdGlvbnMvdGhyZWFkcy97dGhyZWFkX2lkfVwiXSxcbiAgICBnZXRUaHJlYWRTdWJzY3JpcHRpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL25vdGlmaWNhdGlvbnMvdGhyZWFkcy97dGhyZWFkX2lkfS9zdWJzY3JpcHRpb25cIlxuICAgIF0sXG4gICAgbGlzdEV2ZW50c0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZXZlbnRzXCJdLFxuICAgIGxpc3ROb3RpZmljYXRpb25zRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvbm90aWZpY2F0aW9uc1wiXSxcbiAgICBsaXN0T3JnRXZlbnRzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L2V2ZW50cy9vcmdzL3tvcmd9XCJcbiAgICBdLFxuICAgIGxpc3RQdWJsaWNFdmVudHM6IFtcIkdFVCAvZXZlbnRzXCJdLFxuICAgIGxpc3RQdWJsaWNFdmVudHNGb3JSZXBvTmV0d29yazogW1wiR0VUIC9uZXR3b3Jrcy97b3duZXJ9L3tyZXBvfS9ldmVudHNcIl0sXG4gICAgbGlzdFB1YmxpY0V2ZW50c0ZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9ldmVudHMvcHVibGljXCJdLFxuICAgIGxpc3RQdWJsaWNPcmdFdmVudHM6IFtcIkdFVCAvb3Jncy97b3JnfS9ldmVudHNcIl0sXG4gICAgbGlzdFJlY2VpdmVkRXZlbnRzRm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L3JlY2VpdmVkX2V2ZW50c1wiXSxcbiAgICBsaXN0UmVjZWl2ZWRQdWJsaWNFdmVudHNGb3JVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9yZWNlaXZlZF9ldmVudHMvcHVibGljXCJcbiAgICBdLFxuICAgIGxpc3RSZXBvRXZlbnRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2V2ZW50c1wiXSxcbiAgICBsaXN0UmVwb05vdGlmaWNhdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L25vdGlmaWNhdGlvbnNcIlxuICAgIF0sXG4gICAgbGlzdFJlcG9zU3RhcnJlZEJ5QXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9zdGFycmVkXCJdLFxuICAgIGxpc3RSZXBvc1N0YXJyZWRCeVVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9zdGFycmVkXCJdLFxuICAgIGxpc3RSZXBvc1dhdGNoZWRCeVVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9zdWJzY3JpcHRpb25zXCJdLFxuICAgIGxpc3RTdGFyZ2F6ZXJzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdGFyZ2F6ZXJzXCJdLFxuICAgIGxpc3RXYXRjaGVkUmVwb3NGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3N1YnNjcmlwdGlvbnNcIl0sXG4gICAgbGlzdFdhdGNoZXJzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdWJzY3JpYmVyc1wiXSxcbiAgICBtYXJrTm90aWZpY2F0aW9uc0FzUmVhZDogW1wiUFVUIC9ub3RpZmljYXRpb25zXCJdLFxuICAgIG1hcmtSZXBvTm90aWZpY2F0aW9uc0FzUmVhZDogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ub3RpZmljYXRpb25zXCJdLFxuICAgIG1hcmtUaHJlYWRBc0RvbmU6IFtcIkRFTEVURSAvbm90aWZpY2F0aW9ucy90aHJlYWRzL3t0aHJlYWRfaWR9XCJdLFxuICAgIG1hcmtUaHJlYWRBc1JlYWQ6IFtcIlBBVENIIC9ub3RpZmljYXRpb25zL3RocmVhZHMve3RocmVhZF9pZH1cIl0sXG4gICAgc2V0UmVwb1N1YnNjcmlwdGlvbjogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdWJzY3JpcHRpb25cIl0sXG4gICAgc2V0VGhyZWFkU3Vic2NyaXB0aW9uOiBbXG4gICAgICBcIlBVVCAvbm90aWZpY2F0aW9ucy90aHJlYWRzL3t0aHJlYWRfaWR9L3N1YnNjcmlwdGlvblwiXG4gICAgXSxcbiAgICBzdGFyUmVwb0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQVVQgL3VzZXIvc3RhcnJlZC97b3duZXJ9L3tyZXBvfVwiXSxcbiAgICB1bnN0YXJSZXBvRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkRFTEVURSAvdXNlci9zdGFycmVkL3tvd25lcn0ve3JlcG99XCJdXG4gIH0sXG4gIGFwcHM6IHtcbiAgICBhZGRSZXBvVG9JbnN0YWxsYXRpb246IFtcbiAgICAgIFwiUFVUIC91c2VyL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcImFwcHNcIiwgXCJhZGRSZXBvVG9JbnN0YWxsYXRpb25Gb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBhZGRSZXBvVG9JbnN0YWxsYXRpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJQVVQgL3VzZXIvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCJcbiAgICBdLFxuICAgIGNoZWNrVG9rZW46IFtcIlBPU1QgL2FwcGxpY2F0aW9ucy97Y2xpZW50X2lkfS90b2tlblwiXSxcbiAgICBjcmVhdGVGcm9tTWFuaWZlc3Q6IFtcIlBPU1QgL2FwcC1tYW5pZmVzdHMve2NvZGV9L2NvbnZlcnNpb25zXCJdLFxuICAgIGNyZWF0ZUluc3RhbGxhdGlvbkFjY2Vzc1Rva2VuOiBbXG4gICAgICBcIlBPU1QgL2FwcC9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9L2FjY2Vzc190b2tlbnNcIlxuICAgIF0sXG4gICAgZGVsZXRlQXV0aG9yaXphdGlvbjogW1wiREVMRVRFIC9hcHBsaWNhdGlvbnMve2NsaWVudF9pZH0vZ3JhbnRcIl0sXG4gICAgZGVsZXRlSW5zdGFsbGF0aW9uOiBbXCJERUxFVEUgL2FwcC9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9XCJdLFxuICAgIGRlbGV0ZVRva2VuOiBbXCJERUxFVEUgL2FwcGxpY2F0aW9ucy97Y2xpZW50X2lkfS90b2tlblwiXSxcbiAgICBnZXRBdXRoZW50aWNhdGVkOiBbXCJHRVQgL2FwcFwiXSxcbiAgICBnZXRCeVNsdWc6IFtcIkdFVCAvYXBwcy97YXBwX3NsdWd9XCJdLFxuICAgIGdldEluc3RhbGxhdGlvbjogW1wiR0VUIC9hcHAvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfVwiXSxcbiAgICBnZXRPcmdJbnN0YWxsYXRpb246IFtcIkdFVCAvb3Jncy97b3JnfS9pbnN0YWxsYXRpb25cIl0sXG4gICAgZ2V0UmVwb0luc3RhbGxhdGlvbjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbnN0YWxsYXRpb25cIl0sXG4gICAgZ2V0U3Vic2NyaXB0aW9uUGxhbkZvckFjY291bnQ6IFtcbiAgICAgIFwiR0VUIC9tYXJrZXRwbGFjZV9saXN0aW5nL2FjY291bnRzL3thY2NvdW50X2lkfVwiXG4gICAgXSxcbiAgICBnZXRTdWJzY3JpcHRpb25QbGFuRm9yQWNjb3VudFN0dWJiZWQ6IFtcbiAgICAgIFwiR0VUIC9tYXJrZXRwbGFjZV9saXN0aW5nL3N0dWJiZWQvYWNjb3VudHMve2FjY291bnRfaWR9XCJcbiAgICBdLFxuICAgIGdldFVzZXJJbnN0YWxsYXRpb246IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9pbnN0YWxsYXRpb25cIl0sXG4gICAgZ2V0V2ViaG9va0NvbmZpZ0ZvckFwcDogW1wiR0VUIC9hcHAvaG9vay9jb25maWdcIl0sXG4gICAgZ2V0V2ViaG9va0RlbGl2ZXJ5OiBbXCJHRVQgL2FwcC9ob29rL2RlbGl2ZXJpZXMve2RlbGl2ZXJ5X2lkfVwiXSxcbiAgICBsaXN0QWNjb3VudHNGb3JQbGFuOiBbXCJHRVQgL21hcmtldHBsYWNlX2xpc3RpbmcvcGxhbnMve3BsYW5faWR9L2FjY291bnRzXCJdLFxuICAgIGxpc3RBY2NvdW50c0ZvclBsYW5TdHViYmVkOiBbXG4gICAgICBcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9zdHViYmVkL3BsYW5zL3twbGFuX2lkfS9hY2NvdW50c1wiXG4gICAgXSxcbiAgICBsaXN0SW5zdGFsbGF0aW9uUmVwb3NGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfS9yZXBvc2l0b3JpZXNcIlxuICAgIF0sXG4gICAgbGlzdEluc3RhbGxhdGlvblJlcXVlc3RzRm9yQXV0aGVudGljYXRlZEFwcDogW1xuICAgICAgXCJHRVQgL2FwcC9pbnN0YWxsYXRpb24tcmVxdWVzdHNcIlxuICAgIF0sXG4gICAgbGlzdEluc3RhbGxhdGlvbnM6IFtcIkdFVCAvYXBwL2luc3RhbGxhdGlvbnNcIl0sXG4gICAgbGlzdEluc3RhbGxhdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2luc3RhbGxhdGlvbnNcIl0sXG4gICAgbGlzdFBsYW5zOiBbXCJHRVQgL21hcmtldHBsYWNlX2xpc3RpbmcvcGxhbnNcIl0sXG4gICAgbGlzdFBsYW5zU3R1YmJlZDogW1wiR0VUIC9tYXJrZXRwbGFjZV9saXN0aW5nL3N0dWJiZWQvcGxhbnNcIl0sXG4gICAgbGlzdFJlcG9zQWNjZXNzaWJsZVRvSW5zdGFsbGF0aW9uOiBbXCJHRVQgL2luc3RhbGxhdGlvbi9yZXBvc2l0b3JpZXNcIl0sXG4gICAgbGlzdFN1YnNjcmlwdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL21hcmtldHBsYWNlX3B1cmNoYXNlc1wiXSxcbiAgICBsaXN0U3Vic2NyaXB0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyU3R1YmJlZDogW1xuICAgICAgXCJHRVQgL3VzZXIvbWFya2V0cGxhY2VfcHVyY2hhc2VzL3N0dWJiZWRcIlxuICAgIF0sXG4gICAgbGlzdFdlYmhvb2tEZWxpdmVyaWVzOiBbXCJHRVQgL2FwcC9ob29rL2RlbGl2ZXJpZXNcIl0sXG4gICAgcmVkZWxpdmVyV2ViaG9va0RlbGl2ZXJ5OiBbXG4gICAgICBcIlBPU1QgL2FwcC9ob29rL2RlbGl2ZXJpZXMve2RlbGl2ZXJ5X2lkfS9hdHRlbXB0c1wiXG4gICAgXSxcbiAgICByZW1vdmVSZXBvRnJvbUluc3RhbGxhdGlvbjogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1wiYXBwc1wiLCBcInJlbW92ZVJlcG9Gcm9tSW5zdGFsbGF0aW9uRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgcmVtb3ZlUmVwb0Zyb21JbnN0YWxsYXRpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCJcbiAgICBdLFxuICAgIHJlc2V0VG9rZW46IFtcIlBBVENIIC9hcHBsaWNhdGlvbnMve2NsaWVudF9pZH0vdG9rZW5cIl0sXG4gICAgcmV2b2tlSW5zdGFsbGF0aW9uQWNjZXNzVG9rZW46IFtcIkRFTEVURSAvaW5zdGFsbGF0aW9uL3Rva2VuXCJdLFxuICAgIHNjb3BlVG9rZW46IFtcIlBPU1QgL2FwcGxpY2F0aW9ucy97Y2xpZW50X2lkfS90b2tlbi9zY29wZWRcIl0sXG4gICAgc3VzcGVuZEluc3RhbGxhdGlvbjogW1wiUFVUIC9hcHAvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfS9zdXNwZW5kZWRcIl0sXG4gICAgdW5zdXNwZW5kSW5zdGFsbGF0aW9uOiBbXG4gICAgICBcIkRFTEVURSAvYXBwL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH0vc3VzcGVuZGVkXCJcbiAgICBdLFxuICAgIHVwZGF0ZVdlYmhvb2tDb25maWdGb3JBcHA6IFtcIlBBVENIIC9hcHAvaG9vay9jb25maWdcIl1cbiAgfSxcbiAgYmlsbGluZzoge1xuICAgIGdldEdpdGh1YkFjdGlvbnNCaWxsaW5nT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vc2V0dGluZ3MvYmlsbGluZy9hY3Rpb25zXCJdLFxuICAgIGdldEdpdGh1YkFjdGlvbnNCaWxsaW5nVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc2V0dGluZ3MvYmlsbGluZy9hY3Rpb25zXCJcbiAgICBdLFxuICAgIGdldEdpdGh1YlBhY2thZ2VzQmlsbGluZ09yZzogW1wiR0VUIC9vcmdzL3tvcmd9L3NldHRpbmdzL2JpbGxpbmcvcGFja2FnZXNcIl0sXG4gICAgZ2V0R2l0aHViUGFja2FnZXNCaWxsaW5nVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc2V0dGluZ3MvYmlsbGluZy9wYWNrYWdlc1wiXG4gICAgXSxcbiAgICBnZXRTaGFyZWRTdG9yYWdlQmlsbGluZ09yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vc2V0dGluZ3MvYmlsbGluZy9zaGFyZWQtc3RvcmFnZVwiXG4gICAgXSxcbiAgICBnZXRTaGFyZWRTdG9yYWdlQmlsbGluZ1VzZXI6IFtcbiAgICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3NldHRpbmdzL2JpbGxpbmcvc2hhcmVkLXN0b3JhZ2VcIlxuICAgIF1cbiAgfSxcbiAgY2hlY2tzOiB7XG4gICAgY3JlYXRlOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1ydW5zXCJdLFxuICAgIGNyZWF0ZVN1aXRlOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1zdWl0ZXNcIl0sXG4gICAgZ2V0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NoZWNrLXJ1bnMve2NoZWNrX3J1bl9pZH1cIl0sXG4gICAgZ2V0U3VpdGU6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stc3VpdGVzL3tjaGVja19zdWl0ZV9pZH1cIl0sXG4gICAgbGlzdEFubm90YXRpb25zOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stcnVucy97Y2hlY2tfcnVuX2lkfS9hbm5vdGF0aW9uc1wiXG4gICAgXSxcbiAgICBsaXN0Rm9yUmVmOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve3JlZn0vY2hlY2stcnVuc1wiXSxcbiAgICBsaXN0Rm9yU3VpdGU6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1zdWl0ZXMve2NoZWNrX3N1aXRlX2lkfS9jaGVjay1ydW5zXCJcbiAgICBdLFxuICAgIGxpc3RTdWl0ZXNGb3JSZWY6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97cmVmfS9jaGVjay1zdWl0ZXNcIl0sXG4gICAgcmVyZXF1ZXN0UnVuOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NoZWNrLXJ1bnMve2NoZWNrX3J1bl9pZH0vcmVyZXF1ZXN0XCJcbiAgICBdLFxuICAgIHJlcmVxdWVzdFN1aXRlOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NoZWNrLXN1aXRlcy97Y2hlY2tfc3VpdGVfaWR9L3JlcmVxdWVzdFwiXG4gICAgXSxcbiAgICBzZXRTdWl0ZXNQcmVmZXJlbmNlczogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stc3VpdGVzL3ByZWZlcmVuY2VzXCJcbiAgICBdLFxuICAgIHVwZGF0ZTogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2NoZWNrLXJ1bnMve2NoZWNrX3J1bl9pZH1cIl1cbiAgfSxcbiAgY29kZVNjYW5uaW5nOiB7XG4gICAgZGVsZXRlQW5hbHlzaXM6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2FuYWx5c2VzL3thbmFseXNpc19pZH17P2NvbmZpcm1fZGVsZXRlfVwiXG4gICAgXSxcbiAgICBnZXRBbGVydDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYWxlcnRzL3thbGVydF9udW1iZXJ9XCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZFBhcmFtZXRlcnM6IHsgYWxlcnRfaWQ6IFwiYWxlcnRfbnVtYmVyXCIgfSB9XG4gICAgXSxcbiAgICBnZXRBbmFseXNpczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYW5hbHlzZXMve2FuYWx5c2lzX2lkfVwiXG4gICAgXSxcbiAgICBnZXRDb2RlcWxEYXRhYmFzZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvY29kZXFsL2RhdGFiYXNlcy97bGFuZ3VhZ2V9XCJcbiAgICBdLFxuICAgIGdldERlZmF1bHRTZXR1cDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2RlZmF1bHQtc2V0dXBcIl0sXG4gICAgZ2V0U2FyaWY6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9zYXJpZnMve3NhcmlmX2lkfVwiXSxcbiAgICBsaXN0QWxlcnRJbnN0YW5jZXM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2FsZXJ0cy97YWxlcnRfbnVtYmVyfS9pbnN0YW5jZXNcIlxuICAgIF0sXG4gICAgbGlzdEFsZXJ0c0Zvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L2NvZGUtc2Nhbm5pbmcvYWxlcnRzXCJdLFxuICAgIGxpc3RBbGVydHNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYWxlcnRzXCJdLFxuICAgIGxpc3RBbGVydHNJbnN0YW5jZXM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2FsZXJ0cy97YWxlcnRfbnVtYmVyfS9pbnN0YW5jZXNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJjb2RlU2Nhbm5pbmdcIiwgXCJsaXN0QWxlcnRJbnN0YW5jZXNcIl0gfVxuICAgIF0sXG4gICAgbGlzdENvZGVxbERhdGFiYXNlczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvY29kZXFsL2RhdGFiYXNlc1wiXG4gICAgXSxcbiAgICBsaXN0UmVjZW50QW5hbHlzZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbmFseXNlc1wiXSxcbiAgICB1cGRhdGVBbGVydDogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn1cIlxuICAgIF0sXG4gICAgdXBkYXRlRGVmYXVsdFNldHVwOiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2RlZmF1bHQtc2V0dXBcIlxuICAgIF0sXG4gICAgdXBsb2FkU2FyaWY6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvc2FyaWZzXCJdXG4gIH0sXG4gIGNvZGVzT2ZDb25kdWN0OiB7XG4gICAgZ2V0QWxsQ29kZXNPZkNvbmR1Y3Q6IFtcIkdFVCAvY29kZXNfb2ZfY29uZHVjdFwiXSxcbiAgICBnZXRDb25kdWN0Q29kZTogW1wiR0VUIC9jb2Rlc19vZl9jb25kdWN0L3trZXl9XCJdXG4gIH0sXG4gIGNvZGVzcGFjZXM6IHtcbiAgICBhZGRSZXBvc2l0b3J5Rm9yU2VjcmV0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiUFVUIC91c2VyL2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIlxuICAgIF0sXG4gICAgYWRkU2VsZWN0ZWRSZXBvVG9PcmdTZWNyZXQ6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIlxuICAgIF0sXG4gICAgY2hlY2tQZXJtaXNzaW9uc0ZvckRldmNvbnRhaW5lcjogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvcGVybWlzc2lvbnNfY2hlY2tcIlxuICAgIF0sXG4gICAgY29kZXNwYWNlTWFjaGluZXNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9L21hY2hpbmVzXCJcbiAgICBdLFxuICAgIGNyZWF0ZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQT1NUIC91c2VyL2NvZGVzcGFjZXNcIl0sXG4gICAgY3JlYXRlT3JVcGRhdGVPcmdTZWNyZXQ6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJcbiAgICBdLFxuICAgIGNyZWF0ZU9yVXBkYXRlUmVwb1NlY3JldDogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJcbiAgICBdLFxuICAgIGNyZWF0ZU9yVXBkYXRlU2VjcmV0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiUFVUIC91c2VyL2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJcbiAgICBdLFxuICAgIGNyZWF0ZVdpdGhQckZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vY29kZXNwYWNlc1wiXG4gICAgXSxcbiAgICBjcmVhdGVXaXRoUmVwb0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXNcIlxuICAgIF0sXG4gICAgZGVsZXRlRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkRFTEVURSAvdXNlci9jb2Rlc3BhY2VzL3tjb2Rlc3BhY2VfbmFtZX1cIl0sXG4gICAgZGVsZXRlRnJvbU9yZ2FuaXphdGlvbjogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vbWVtYmVycy97dXNlcm5hbWV9L2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfVwiXG4gICAgXSxcbiAgICBkZWxldGVPcmdTZWNyZXQ6IFtcIkRFTEVURSAvb3Jncy97b3JnfS9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXSxcbiAgICBkZWxldGVSZXBvU2VjcmV0OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgZGVsZXRlU2VjcmV0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiREVMRVRFIC91c2VyL2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJcbiAgICBdLFxuICAgIGV4cG9ydEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIlBPU1QgL3VzZXIvY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9L2V4cG9ydHNcIlxuICAgIF0sXG4gICAgZ2V0Q29kZXNwYWNlc0ZvclVzZXJJbk9yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vbWVtYmVycy97dXNlcm5hbWV9L2NvZGVzcGFjZXNcIlxuICAgIF0sXG4gICAgZ2V0RXhwb3J0RGV0YWlsc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlci9jb2Rlc3BhY2VzL3tjb2Rlc3BhY2VfbmFtZX0vZXhwb3J0cy97ZXhwb3J0X2lkfVwiXG4gICAgXSxcbiAgICBnZXRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfVwiXSxcbiAgICBnZXRPcmdQdWJsaWNLZXk6IFtcIkdFVCAvb3Jncy97b3JnfS9jb2Rlc3BhY2VzL3NlY3JldHMvcHVibGljLWtleVwiXSxcbiAgICBnZXRPcmdTZWNyZXQ6IFtcIkdFVCAvb3Jncy97b3JnfS9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXSxcbiAgICBnZXRQdWJsaWNLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzL3B1YmxpYy1rZXlcIlxuICAgIF0sXG4gICAgZ2V0UmVwb1B1YmxpY0tleTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvc2VjcmV0cy9wdWJsaWMta2V5XCJcbiAgICBdLFxuICAgIGdldFJlcG9TZWNyZXQ6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXG4gICAgXSxcbiAgICBnZXRTZWNyZXRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgbGlzdERldmNvbnRhaW5lcnNJblJlcG9zaXRvcnlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvZGV2Y29udGFpbmVyc1wiXG4gICAgXSxcbiAgICBsaXN0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9jb2Rlc3BhY2VzXCJdLFxuICAgIGxpc3RJbk9yZ2FuaXphdGlvbjogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vY29kZXNwYWNlc1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWRQYXJhbWV0ZXJzOiB7IG9yZ19pZDogXCJvcmdcIiB9IH1cbiAgICBdLFxuICAgIGxpc3RJblJlcG9zaXRvcnlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXNcIlxuICAgIF0sXG4gICAgbGlzdE9yZ1NlY3JldHM6IFtcIkdFVCAvb3Jncy97b3JnfS9jb2Rlc3BhY2VzL3NlY3JldHNcIl0sXG4gICAgbGlzdFJlcG9TZWNyZXRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvc2VjcmV0c1wiXSxcbiAgICBsaXN0UmVwb3NpdG9yaWVzRm9yU2VjcmV0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2VyL2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICBsaXN0U2VjcmV0c0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzXCJdLFxuICAgIGxpc3RTZWxlY3RlZFJlcG9zRm9yT3JnU2VjcmV0OiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXNcIlxuICAgIF0sXG4gICAgcHJlRmxpZ2h0V2l0aFJlcG9Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvbmV3XCJcbiAgICBdLFxuICAgIHB1Ymxpc2hGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJQT1NUIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfS9wdWJsaXNoXCJcbiAgICBdLFxuICAgIHJlbW92ZVJlcG9zaXRvcnlGb3JTZWNyZXRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiXG4gICAgXSxcbiAgICByZW1vdmVTZWxlY3RlZFJlcG9Gcm9tT3JnU2VjcmV0OiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCJcbiAgICBdLFxuICAgIHJlcG9NYWNoaW5lc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlcy9tYWNoaW5lc1wiXG4gICAgXSxcbiAgICBzZXRSZXBvc2l0b3JpZXNGb3JTZWNyZXRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJQVVQgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzXCJcbiAgICBdLFxuICAgIHNldFNlbGVjdGVkUmVwb3NGb3JPcmdTZWNyZXQ6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICBzdGFydEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQT1NUIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfS9zdGFydFwiXSxcbiAgICBzdG9wRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBPU1QgL3VzZXIvY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9L3N0b3BcIl0sXG4gICAgc3RvcEluT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30vbWVtYmVycy97dXNlcm5hbWV9L2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfS9zdG9wXCJcbiAgICBdLFxuICAgIHVwZGF0ZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQQVRDSCAvdXNlci9jb2Rlc3BhY2VzL3tjb2Rlc3BhY2VfbmFtZX1cIl1cbiAgfSxcbiAgY29waWxvdDoge1xuICAgIGFkZENvcGlsb3RTZWF0c0ZvclRlYW1zOiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30vY29waWxvdC9iaWxsaW5nL3NlbGVjdGVkX3RlYW1zXCJcbiAgICBdLFxuICAgIGFkZENvcGlsb3RTZWF0c0ZvclVzZXJzOiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30vY29waWxvdC9iaWxsaW5nL3NlbGVjdGVkX3VzZXJzXCJcbiAgICBdLFxuICAgIGNhbmNlbENvcGlsb3RTZWF0QXNzaWdubWVudEZvclRlYW1zOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9jb3BpbG90L2JpbGxpbmcvc2VsZWN0ZWRfdGVhbXNcIlxuICAgIF0sXG4gICAgY2FuY2VsQ29waWxvdFNlYXRBc3NpZ25tZW50Rm9yVXNlcnM6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L2NvcGlsb3QvYmlsbGluZy9zZWxlY3RlZF91c2Vyc1wiXG4gICAgXSxcbiAgICBnZXRDb3BpbG90T3JnYW5pemF0aW9uRGV0YWlsczogW1wiR0VUIC9vcmdzL3tvcmd9L2NvcGlsb3QvYmlsbGluZ1wiXSxcbiAgICBnZXRDb3BpbG90U2VhdERldGFpbHNGb3JVc2VyOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9tZW1iZXJzL3t1c2VybmFtZX0vY29waWxvdFwiXG4gICAgXSxcbiAgICBsaXN0Q29waWxvdFNlYXRzOiBbXCJHRVQgL29yZ3Mve29yZ30vY29waWxvdC9iaWxsaW5nL3NlYXRzXCJdXG4gIH0sXG4gIGRlcGVuZGFib3Q6IHtcbiAgICBhZGRTZWxlY3RlZFJlcG9Ub09yZ1NlY3JldDogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiXG4gICAgXSxcbiAgICBjcmVhdGVPclVwZGF0ZU9yZ1NlY3JldDogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgY3JlYXRlT3JVcGRhdGVSZXBvU2VjcmV0OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgZGVsZXRlT3JnU2VjcmV0OiBbXCJERUxFVEUgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIl0sXG4gICAgZGVsZXRlUmVwb1NlY3JldDogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJcbiAgICBdLFxuICAgIGdldEFsZXJ0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGFib3QvYWxlcnRzL3thbGVydF9udW1iZXJ9XCJdLFxuICAgIGdldE9yZ1B1YmxpY0tleTogW1wiR0VUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy9wdWJsaWMta2V5XCJdLFxuICAgIGdldE9yZ1NlY3JldDogW1wiR0VUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgIGdldFJlcG9QdWJsaWNLZXk6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBlbmRhYm90L3NlY3JldHMvcHVibGljLWtleVwiXG4gICAgXSxcbiAgICBnZXRSZXBvU2VjcmV0OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgbGlzdEFsZXJ0c0ZvckVudGVycHJpc2U6IFtcbiAgICAgIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vZGVwZW5kYWJvdC9hbGVydHNcIlxuICAgIF0sXG4gICAgbGlzdEFsZXJ0c0Zvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3QvYWxlcnRzXCJdLFxuICAgIGxpc3RBbGVydHNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGFib3QvYWxlcnRzXCJdLFxuICAgIGxpc3RPcmdTZWNyZXRzOiBbXCJHRVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzXCJdLFxuICAgIGxpc3RSZXBvU2VjcmV0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBlbmRhYm90L3NlY3JldHNcIl0sXG4gICAgbGlzdFNlbGVjdGVkUmVwb3NGb3JPcmdTZWNyZXQ6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICByZW1vdmVTZWxlY3RlZFJlcG9Gcm9tT3JnU2VjcmV0OiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9kZXBlbmRhYm90L3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCJcbiAgICBdLFxuICAgIHNldFNlbGVjdGVkUmVwb3NGb3JPcmdTZWNyZXQ6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICB1cGRhdGVBbGVydDogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kYWJvdC9hbGVydHMve2FsZXJ0X251bWJlcn1cIlxuICAgIF1cbiAgfSxcbiAgZGVwZW5kZW5jeUdyYXBoOiB7XG4gICAgY3JlYXRlUmVwb3NpdG9yeVNuYXBzaG90OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGVuY3ktZ3JhcGgvc25hcHNob3RzXCJcbiAgICBdLFxuICAgIGRpZmZSYW5nZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGVuY3ktZ3JhcGgvY29tcGFyZS97YmFzZWhlYWR9XCJcbiAgICBdLFxuICAgIGV4cG9ydFNib206IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kZW5jeS1ncmFwaC9zYm9tXCJdXG4gIH0sXG4gIGVtb2ppczogeyBnZXQ6IFtcIkdFVCAvZW1vamlzXCJdIH0sXG4gIGdpc3RzOiB7XG4gICAgY2hlY2tJc1N0YXJyZWQ6IFtcIkdFVCAvZ2lzdHMve2dpc3RfaWR9L3N0YXJcIl0sXG4gICAgY3JlYXRlOiBbXCJQT1NUIC9naXN0c1wiXSxcbiAgICBjcmVhdGVDb21tZW50OiBbXCJQT1NUIC9naXN0cy97Z2lzdF9pZH0vY29tbWVudHNcIl0sXG4gICAgZGVsZXRlOiBbXCJERUxFVEUgL2dpc3RzL3tnaXN0X2lkfVwiXSxcbiAgICBkZWxldGVDb21tZW50OiBbXCJERUxFVEUgL2dpc3RzL3tnaXN0X2lkfS9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgZm9yazogW1wiUE9TVCAvZ2lzdHMve2dpc3RfaWR9L2ZvcmtzXCJdLFxuICAgIGdldDogW1wiR0VUIC9naXN0cy97Z2lzdF9pZH1cIl0sXG4gICAgZ2V0Q29tbWVudDogW1wiR0VUIC9naXN0cy97Z2lzdF9pZH0vY29tbWVudHMve2NvbW1lbnRfaWR9XCJdLFxuICAgIGdldFJldmlzaW9uOiBbXCJHRVQgL2dpc3RzL3tnaXN0X2lkfS97c2hhfVwiXSxcbiAgICBsaXN0OiBbXCJHRVQgL2dpc3RzXCJdLFxuICAgIGxpc3RDb21tZW50czogW1wiR0VUIC9naXN0cy97Z2lzdF9pZH0vY29tbWVudHNcIl0sXG4gICAgbGlzdENvbW1pdHM6IFtcIkdFVCAvZ2lzdHMve2dpc3RfaWR9L2NvbW1pdHNcIl0sXG4gICAgbGlzdEZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9naXN0c1wiXSxcbiAgICBsaXN0Rm9ya3M6IFtcIkdFVCAvZ2lzdHMve2dpc3RfaWR9L2ZvcmtzXCJdLFxuICAgIGxpc3RQdWJsaWM6IFtcIkdFVCAvZ2lzdHMvcHVibGljXCJdLFxuICAgIGxpc3RTdGFycmVkOiBbXCJHRVQgL2dpc3RzL3N0YXJyZWRcIl0sXG4gICAgc3RhcjogW1wiUFVUIC9naXN0cy97Z2lzdF9pZH0vc3RhclwiXSxcbiAgICB1bnN0YXI6IFtcIkRFTEVURSAvZ2lzdHMve2dpc3RfaWR9L3N0YXJcIl0sXG4gICAgdXBkYXRlOiBbXCJQQVRDSCAvZ2lzdHMve2dpc3RfaWR9XCJdLFxuICAgIHVwZGF0ZUNvbW1lbnQ6IFtcIlBBVENIIC9naXN0cy97Z2lzdF9pZH0vY29tbWVudHMve2NvbW1lbnRfaWR9XCJdXG4gIH0sXG4gIGdpdDoge1xuICAgIGNyZWF0ZUJsb2I6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9ibG9ic1wiXSxcbiAgICBjcmVhdGVDb21taXQ6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9jb21taXRzXCJdLFxuICAgIGNyZWF0ZVJlZjogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L3JlZnNcIl0sXG4gICAgY3JlYXRlVGFnOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvdGFnc1wiXSxcbiAgICBjcmVhdGVUcmVlOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvdHJlZXNcIl0sXG4gICAgZGVsZXRlUmVmOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9yZWZzL3tyZWZ9XCJdLFxuICAgIGdldEJsb2I6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L2Jsb2JzL3tmaWxlX3NoYX1cIl0sXG4gICAgZ2V0Q29tbWl0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9jb21taXRzL3tjb21taXRfc2hhfVwiXSxcbiAgICBnZXRSZWY6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L3JlZi97cmVmfVwiXSxcbiAgICBnZXRUYWc6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L3RhZ3Mve3RhZ19zaGF9XCJdLFxuICAgIGdldFRyZWU6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L3RyZWVzL3t0cmVlX3NoYX1cIl0sXG4gICAgbGlzdE1hdGNoaW5nUmVmczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvbWF0Y2hpbmctcmVmcy97cmVmfVwiXSxcbiAgICB1cGRhdGVSZWY6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvcmVmcy97cmVmfVwiXVxuICB9LFxuICBnaXRpZ25vcmU6IHtcbiAgICBnZXRBbGxUZW1wbGF0ZXM6IFtcIkdFVCAvZ2l0aWdub3JlL3RlbXBsYXRlc1wiXSxcbiAgICBnZXRUZW1wbGF0ZTogW1wiR0VUIC9naXRpZ25vcmUvdGVtcGxhdGVzL3tuYW1lfVwiXVxuICB9LFxuICBpbnRlcmFjdGlvbnM6IHtcbiAgICBnZXRSZXN0cmljdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICBnZXRSZXN0cmljdGlvbnNGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9pbnRlcmFjdGlvbi1saW1pdHNcIl0sXG4gICAgZ2V0UmVzdHJpY3Rpb25zRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbnRlcmFjdGlvbi1saW1pdHNcIl0sXG4gICAgZ2V0UmVzdHJpY3Rpb25zRm9yWW91clB1YmxpY1JlcG9zOiBbXG4gICAgICBcIkdFVCAvdXNlci9pbnRlcmFjdGlvbi1saW1pdHNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJpbnRlcmFjdGlvbnNcIiwgXCJnZXRSZXN0cmljdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICByZW1vdmVSZXN0cmljdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiREVMRVRFIC91c2VyL2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICByZW1vdmVSZXN0cmljdGlvbnNGb3JPcmc6IFtcIkRFTEVURSAvb3Jncy97b3JnfS9pbnRlcmFjdGlvbi1saW1pdHNcIl0sXG4gICAgcmVtb3ZlUmVzdHJpY3Rpb25zRm9yUmVwbzogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ludGVyYWN0aW9uLWxpbWl0c1wiXG4gICAgXSxcbiAgICByZW1vdmVSZXN0cmljdGlvbnNGb3JZb3VyUHVibGljUmVwb3M6IFtcbiAgICAgIFwiREVMRVRFIC91c2VyL2ludGVyYWN0aW9uLWxpbWl0c1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcImludGVyYWN0aW9uc1wiLCBcInJlbW92ZVJlc3RyaWN0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIHNldFJlc3RyaWN0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQVVQgL3VzZXIvaW50ZXJhY3Rpb24tbGltaXRzXCJdLFxuICAgIHNldFJlc3RyaWN0aW9uc0Zvck9yZzogW1wiUFVUIC9vcmdzL3tvcmd9L2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICBzZXRSZXN0cmljdGlvbnNGb3JSZXBvOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICBzZXRSZXN0cmljdGlvbnNGb3JZb3VyUHVibGljUmVwb3M6IFtcbiAgICAgIFwiUFVUIC91c2VyL2ludGVyYWN0aW9uLWxpbWl0c1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcImludGVyYWN0aW9uc1wiLCBcInNldFJlc3RyaWN0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdXG4gIH0sXG4gIGlzc3Vlczoge1xuICAgIGFkZEFzc2lnbmVlczogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vYXNzaWduZWVzXCJcbiAgICBdLFxuICAgIGFkZExhYmVsczogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2xhYmVsc1wiXSxcbiAgICBjaGVja1VzZXJDYW5CZUFzc2lnbmVkOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Fzc2lnbmVlcy97YXNzaWduZWV9XCJdLFxuICAgIGNoZWNrVXNlckNhbkJlQXNzaWduZWRUb0lzc3VlOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2Fzc2lnbmVlcy97YXNzaWduZWV9XCJcbiAgICBdLFxuICAgIGNyZWF0ZTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzXCJdLFxuICAgIGNyZWF0ZUNvbW1lbnQ6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2NvbW1lbnRzXCJcbiAgICBdLFxuICAgIGNyZWF0ZUxhYmVsOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHNcIl0sXG4gICAgY3JlYXRlTWlsZXN0b25lOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9taWxlc3RvbmVzXCJdLFxuICAgIGRlbGV0ZUNvbW1lbnQ6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvY29tbWVudHMve2NvbW1lbnRfaWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZUxhYmVsOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX1cIl0sXG4gICAgZGVsZXRlTWlsZXN0b25lOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vbWlsZXN0b25lcy97bWlsZXN0b25lX251bWJlcn1cIlxuICAgIF0sXG4gICAgZ2V0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfVwiXSxcbiAgICBnZXRDb21tZW50OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgZ2V0RXZlbnQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL2V2ZW50cy97ZXZlbnRfaWR9XCJdLFxuICAgIGdldExhYmVsOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX1cIl0sXG4gICAgZ2V0TWlsZXN0b25lOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L21pbGVzdG9uZXMve21pbGVzdG9uZV9udW1iZXJ9XCJdLFxuICAgIGxpc3Q6IFtcIkdFVCAvaXNzdWVzXCJdLFxuICAgIGxpc3RBc3NpZ25lZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYXNzaWduZWVzXCJdLFxuICAgIGxpc3RDb21tZW50czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vY29tbWVudHNcIl0sXG4gICAgbGlzdENvbW1lbnRzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvY29tbWVudHNcIl0sXG4gICAgbGlzdEV2ZW50czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vZXZlbnRzXCJdLFxuICAgIGxpc3RFdmVudHNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9ldmVudHNcIl0sXG4gICAgbGlzdEV2ZW50c0ZvclRpbWVsaW5lOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L3RpbWVsaW5lXCJcbiAgICBdLFxuICAgIGxpc3RGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2lzc3Vlc1wiXSxcbiAgICBsaXN0Rm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vaXNzdWVzXCJdLFxuICAgIGxpc3RGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlc1wiXSxcbiAgICBsaXN0TGFiZWxzRm9yTWlsZXN0b25lOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbWlsZXN0b25lcy97bWlsZXN0b25lX251bWJlcn0vbGFiZWxzXCJcbiAgICBdLFxuICAgIGxpc3RMYWJlbHNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVsc1wiXSxcbiAgICBsaXN0TGFiZWxzT25Jc3N1ZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sYWJlbHNcIlxuICAgIF0sXG4gICAgbGlzdE1pbGVzdG9uZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbWlsZXN0b25lc1wiXSxcbiAgICBsb2NrOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sb2NrXCJdLFxuICAgIHJlbW92ZUFsbExhYmVsczogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sYWJlbHNcIlxuICAgIF0sXG4gICAgcmVtb3ZlQXNzaWduZWVzOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2Fzc2lnbmVlc1wiXG4gICAgXSxcbiAgICByZW1vdmVMYWJlbDogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sYWJlbHMve25hbWV9XCJcbiAgICBdLFxuICAgIHNldExhYmVsczogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vbGFiZWxzXCJdLFxuICAgIHVubG9jazogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vbG9ja1wiXSxcbiAgICB1cGRhdGU6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn1cIl0sXG4gICAgdXBkYXRlQ29tbWVudDogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgdXBkYXRlTGFiZWw6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9XCJdLFxuICAgIHVwZGF0ZU1pbGVzdG9uZTogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbWlsZXN0b25lcy97bWlsZXN0b25lX251bWJlcn1cIlxuICAgIF1cbiAgfSxcbiAgbGljZW5zZXM6IHtcbiAgICBnZXQ6IFtcIkdFVCAvbGljZW5zZXMve2xpY2Vuc2V9XCJdLFxuICAgIGdldEFsbENvbW1vbmx5VXNlZDogW1wiR0VUIC9saWNlbnNlc1wiXSxcbiAgICBnZXRGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xpY2Vuc2VcIl1cbiAgfSxcbiAgbWFya2Rvd246IHtcbiAgICByZW5kZXI6IFtcIlBPU1QgL21hcmtkb3duXCJdLFxuICAgIHJlbmRlclJhdzogW1xuICAgICAgXCJQT1NUIC9tYXJrZG93bi9yYXdcIixcbiAgICAgIHsgaGVhZGVyczogeyBcImNvbnRlbnQtdHlwZVwiOiBcInRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLThcIiB9IH1cbiAgICBdXG4gIH0sXG4gIG1ldGE6IHtcbiAgICBnZXQ6IFtcIkdFVCAvbWV0YVwiXSxcbiAgICBnZXRBbGxWZXJzaW9uczogW1wiR0VUIC92ZXJzaW9uc1wiXSxcbiAgICBnZXRPY3RvY2F0OiBbXCJHRVQgL29jdG9jYXRcIl0sXG4gICAgZ2V0WmVuOiBbXCJHRVQgL3plblwiXSxcbiAgICByb290OiBbXCJHRVQgL1wiXVxuICB9LFxuICBtaWdyYXRpb25zOiB7XG4gICAgY2FuY2VsSW1wb3J0OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaW1wb3J0XCIsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgZGVwcmVjYXRlZDogXCJvY3Rva2l0LnJlc3QubWlncmF0aW9ucy5jYW5jZWxJbXBvcnQoKSBpcyBkZXByZWNhdGVkLCBzZWUgaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vcmVzdC9taWdyYXRpb25zL3NvdXJjZS1pbXBvcnRzI2NhbmNlbC1hbi1pbXBvcnRcIlxuICAgICAgfVxuICAgIF0sXG4gICAgZGVsZXRlQXJjaGl2ZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9taWdyYXRpb25zL3ttaWdyYXRpb25faWR9L2FyY2hpdmVcIlxuICAgIF0sXG4gICAgZGVsZXRlQXJjaGl2ZUZvck9yZzogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9hcmNoaXZlXCJcbiAgICBdLFxuICAgIGRvd25sb2FkQXJjaGl2ZUZvck9yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9hcmNoaXZlXCJcbiAgICBdLFxuICAgIGdldEFyY2hpdmVGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9hcmNoaXZlXCJcbiAgICBdLFxuICAgIGdldENvbW1pdEF1dGhvcnM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbXBvcnQvYXV0aG9yc1wiLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGRlcHJlY2F0ZWQ6IFwib2N0b2tpdC5yZXN0Lm1pZ3JhdGlvbnMuZ2V0Q29tbWl0QXV0aG9ycygpIGlzIGRlcHJlY2F0ZWQsIHNlZSBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9yZXN0L21pZ3JhdGlvbnMvc291cmNlLWltcG9ydHMjZ2V0LWNvbW1pdC1hdXRob3JzXCJcbiAgICAgIH1cbiAgICBdLFxuICAgIGdldEltcG9ydFN0YXR1czogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ltcG9ydFwiLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGRlcHJlY2F0ZWQ6IFwib2N0b2tpdC5yZXN0Lm1pZ3JhdGlvbnMuZ2V0SW1wb3J0U3RhdHVzKCkgaXMgZGVwcmVjYXRlZCwgc2VlIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL3Jlc3QvbWlncmF0aW9ucy9zb3VyY2UtaW1wb3J0cyNnZXQtYW4taW1wb3J0LXN0YXR1c1wiXG4gICAgICB9XG4gICAgXSxcbiAgICBnZXRMYXJnZUZpbGVzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaW1wb3J0L2xhcmdlX2ZpbGVzXCIsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgZGVwcmVjYXRlZDogXCJvY3Rva2l0LnJlc3QubWlncmF0aW9ucy5nZXRMYXJnZUZpbGVzKCkgaXMgZGVwcmVjYXRlZCwgc2VlIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL3Jlc3QvbWlncmF0aW9ucy9zb3VyY2UtaW1wb3J0cyNnZXQtbGFyZ2UtZmlsZXNcIlxuICAgICAgfVxuICAgIF0sXG4gICAgZ2V0U3RhdHVzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9taWdyYXRpb25zL3ttaWdyYXRpb25faWR9XCJdLFxuICAgIGdldFN0YXR1c0Zvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH1cIl0sXG4gICAgbGlzdEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvbWlncmF0aW9uc1wiXSxcbiAgICBsaXN0Rm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vbWlncmF0aW9uc1wiXSxcbiAgICBsaXN0UmVwb3NGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvc2l0b3JpZXNcIlxuICAgIF0sXG4gICAgbGlzdFJlcG9zRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvc2l0b3JpZXNcIl0sXG4gICAgbGlzdFJlcG9zRm9yVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvc2l0b3JpZXNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJtaWdyYXRpb25zXCIsIFwibGlzdFJlcG9zRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgbWFwQ29tbWl0QXV0aG9yOiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbXBvcnQvYXV0aG9ycy97YXV0aG9yX2lkfVwiLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGRlcHJlY2F0ZWQ6IFwib2N0b2tpdC5yZXN0Lm1pZ3JhdGlvbnMubWFwQ29tbWl0QXV0aG9yKCkgaXMgZGVwcmVjYXRlZCwgc2VlIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL3Jlc3QvbWlncmF0aW9ucy9zb3VyY2UtaW1wb3J0cyNtYXAtYS1jb21taXQtYXV0aG9yXCJcbiAgICAgIH1cbiAgICBdLFxuICAgIHNldExmc1ByZWZlcmVuY2U6IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2ltcG9ydC9sZnNcIixcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBkZXByZWNhdGVkOiBcIm9jdG9raXQucmVzdC5taWdyYXRpb25zLnNldExmc1ByZWZlcmVuY2UoKSBpcyBkZXByZWNhdGVkLCBzZWUgaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vcmVzdC9taWdyYXRpb25zL3NvdXJjZS1pbXBvcnRzI3VwZGF0ZS1naXQtbGZzLXByZWZlcmVuY2VcIlxuICAgICAgfVxuICAgIF0sXG4gICAgc3RhcnRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9taWdyYXRpb25zXCJdLFxuICAgIHN0YXJ0Rm9yT3JnOiBbXCJQT1NUIC9vcmdzL3tvcmd9L21pZ3JhdGlvbnNcIl0sXG4gICAgc3RhcnRJbXBvcnQ6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbXBvcnRcIixcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBkZXByZWNhdGVkOiBcIm9jdG9raXQucmVzdC5taWdyYXRpb25zLnN0YXJ0SW1wb3J0KCkgaXMgZGVwcmVjYXRlZCwgc2VlIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL3Jlc3QvbWlncmF0aW9ucy9zb3VyY2UtaW1wb3J0cyNzdGFydC1hbi1pbXBvcnRcIlxuICAgICAgfVxuICAgIF0sXG4gICAgdW5sb2NrUmVwb0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9taWdyYXRpb25zL3ttaWdyYXRpb25faWR9L3JlcG9zL3tyZXBvX25hbWV9L2xvY2tcIlxuICAgIF0sXG4gICAgdW5sb2NrUmVwb0Zvck9yZzogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvcy97cmVwb19uYW1lfS9sb2NrXCJcbiAgICBdLFxuICAgIHVwZGF0ZUltcG9ydDogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vaW1wb3J0XCIsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgZGVwcmVjYXRlZDogXCJvY3Rva2l0LnJlc3QubWlncmF0aW9ucy51cGRhdGVJbXBvcnQoKSBpcyBkZXByZWNhdGVkLCBzZWUgaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vcmVzdC9taWdyYXRpb25zL3NvdXJjZS1pbXBvcnRzI3VwZGF0ZS1hbi1pbXBvcnRcIlxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAgb2lkYzoge1xuICAgIGdldE9pZGNDdXN0b21TdWJUZW1wbGF0ZUZvck9yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9vaWRjL2N1c3RvbWl6YXRpb24vc3ViXCJcbiAgICBdLFxuICAgIHVwZGF0ZU9pZGNDdXN0b21TdWJUZW1wbGF0ZUZvck9yZzogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vYWN0aW9ucy9vaWRjL2N1c3RvbWl6YXRpb24vc3ViXCJcbiAgICBdXG4gIH0sXG4gIG9yZ3M6IHtcbiAgICBhZGRTZWN1cml0eU1hbmFnZXJUZWFtOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9zZWN1cml0eS1tYW5hZ2Vycy90ZWFtcy97dGVhbV9zbHVnfVwiXG4gICAgXSxcbiAgICBhc3NpZ25UZWFtVG9PcmdSb2xlOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9vcmdhbml6YXRpb24tcm9sZXMvdGVhbXMve3RlYW1fc2x1Z30ve3JvbGVfaWR9XCJcbiAgICBdLFxuICAgIGFzc2lnblVzZXJUb09yZ1JvbGU6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L29yZ2FuaXphdGlvbi1yb2xlcy91c2Vycy97dXNlcm5hbWV9L3tyb2xlX2lkfVwiXG4gICAgXSxcbiAgICBibG9ja1VzZXI6IFtcIlBVVCAvb3Jncy97b3JnfS9ibG9ja3Mve3VzZXJuYW1lfVwiXSxcbiAgICBjYW5jZWxJbnZpdGF0aW9uOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vaW52aXRhdGlvbnMve2ludml0YXRpb25faWR9XCJdLFxuICAgIGNoZWNrQmxvY2tlZFVzZXI6IFtcIkdFVCAvb3Jncy97b3JnfS9ibG9ja3Mve3VzZXJuYW1lfVwiXSxcbiAgICBjaGVja01lbWJlcnNoaXBGb3JVc2VyOiBbXCJHRVQgL29yZ3Mve29yZ30vbWVtYmVycy97dXNlcm5hbWV9XCJdLFxuICAgIGNoZWNrUHVibGljTWVtYmVyc2hpcEZvclVzZXI6IFtcIkdFVCAvb3Jncy97b3JnfS9wdWJsaWNfbWVtYmVycy97dXNlcm5hbWV9XCJdLFxuICAgIGNvbnZlcnRNZW1iZXJUb091dHNpZGVDb2xsYWJvcmF0b3I6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L291dHNpZGVfY29sbGFib3JhdG9ycy97dXNlcm5hbWV9XCJcbiAgICBdLFxuICAgIGNyZWF0ZUN1c3RvbU9yZ2FuaXphdGlvblJvbGU6IFtcIlBPU1QgL29yZ3Mve29yZ30vb3JnYW5pemF0aW9uLXJvbGVzXCJdLFxuICAgIGNyZWF0ZUludml0YXRpb246IFtcIlBPU1QgL29yZ3Mve29yZ30vaW52aXRhdGlvbnNcIl0sXG4gICAgY3JlYXRlT3JVcGRhdGVDdXN0b21Qcm9wZXJ0aWVzOiBbXCJQQVRDSCAvb3Jncy97b3JnfS9wcm9wZXJ0aWVzL3NjaGVtYVwiXSxcbiAgICBjcmVhdGVPclVwZGF0ZUN1c3RvbVByb3BlcnRpZXNWYWx1ZXNGb3JSZXBvczogW1xuICAgICAgXCJQQVRDSCAvb3Jncy97b3JnfS9wcm9wZXJ0aWVzL3ZhbHVlc1wiXG4gICAgXSxcbiAgICBjcmVhdGVPclVwZGF0ZUN1c3RvbVByb3BlcnR5OiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9wcm9wZXJ0aWVzL3NjaGVtYS97Y3VzdG9tX3Byb3BlcnR5X25hbWV9XCJcbiAgICBdLFxuICAgIGNyZWF0ZVdlYmhvb2s6IFtcIlBPU1QgL29yZ3Mve29yZ30vaG9va3NcIl0sXG4gICAgZGVsZXRlOiBbXCJERUxFVEUgL29yZ3Mve29yZ31cIl0sXG4gICAgZGVsZXRlQ3VzdG9tT3JnYW5pemF0aW9uUm9sZTogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vb3JnYW5pemF0aW9uLXJvbGVzL3tyb2xlX2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVXZWJob29rOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9XCJdLFxuICAgIGVuYWJsZU9yRGlzYWJsZVNlY3VyaXR5UHJvZHVjdE9uQWxsT3JnUmVwb3M6IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS97c2VjdXJpdHlfcHJvZHVjdH0ve2VuYWJsZW1lbnR9XCJcbiAgICBdLFxuICAgIGdldDogW1wiR0VUIC9vcmdzL3tvcmd9XCJdLFxuICAgIGdldEFsbEN1c3RvbVByb3BlcnRpZXM6IFtcIkdFVCAvb3Jncy97b3JnfS9wcm9wZXJ0aWVzL3NjaGVtYVwiXSxcbiAgICBnZXRDdXN0b21Qcm9wZXJ0eTogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vcHJvcGVydGllcy9zY2hlbWEve2N1c3RvbV9wcm9wZXJ0eV9uYW1lfVwiXG4gICAgXSxcbiAgICBnZXRNZW1iZXJzaGlwRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9tZW1iZXJzaGlwcy9vcmdzL3tvcmd9XCJdLFxuICAgIGdldE1lbWJlcnNoaXBGb3JVc2VyOiBbXCJHRVQgL29yZ3Mve29yZ30vbWVtYmVyc2hpcHMve3VzZXJuYW1lfVwiXSxcbiAgICBnZXRPcmdSb2xlOiBbXCJHRVQgL29yZ3Mve29yZ30vb3JnYW5pemF0aW9uLXJvbGVzL3tyb2xlX2lkfVwiXSxcbiAgICBnZXRXZWJob29rOiBbXCJHRVQgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9XCJdLFxuICAgIGdldFdlYmhvb2tDb25maWdGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH0vY29uZmlnXCJdLFxuICAgIGdldFdlYmhvb2tEZWxpdmVyeTogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9L2RlbGl2ZXJpZXMve2RlbGl2ZXJ5X2lkfVwiXG4gICAgXSxcbiAgICBsaXN0OiBbXCJHRVQgL29yZ2FuaXphdGlvbnNcIl0sXG4gICAgbGlzdEFwcEluc3RhbGxhdGlvbnM6IFtcIkdFVCAvb3Jncy97b3JnfS9pbnN0YWxsYXRpb25zXCJdLFxuICAgIGxpc3RCbG9ja2VkVXNlcnM6IFtcIkdFVCAvb3Jncy97b3JnfS9ibG9ja3NcIl0sXG4gICAgbGlzdEN1c3RvbVByb3BlcnRpZXNWYWx1ZXNGb3JSZXBvczogW1wiR0VUIC9vcmdzL3tvcmd9L3Byb3BlcnRpZXMvdmFsdWVzXCJdLFxuICAgIGxpc3RGYWlsZWRJbnZpdGF0aW9uczogW1wiR0VUIC9vcmdzL3tvcmd9L2ZhaWxlZF9pbnZpdGF0aW9uc1wiXSxcbiAgICBsaXN0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9vcmdzXCJdLFxuICAgIGxpc3RGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vb3Jnc1wiXSxcbiAgICBsaXN0SW52aXRhdGlvblRlYW1zOiBbXCJHRVQgL29yZ3Mve29yZ30vaW52aXRhdGlvbnMve2ludml0YXRpb25faWR9L3RlYW1zXCJdLFxuICAgIGxpc3RNZW1iZXJzOiBbXCJHRVQgL29yZ3Mve29yZ30vbWVtYmVyc1wiXSxcbiAgICBsaXN0TWVtYmVyc2hpcHNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL21lbWJlcnNoaXBzL29yZ3NcIl0sXG4gICAgbGlzdE9yZ1JvbGVUZWFtczogW1wiR0VUIC9vcmdzL3tvcmd9L29yZ2FuaXphdGlvbi1yb2xlcy97cm9sZV9pZH0vdGVhbXNcIl0sXG4gICAgbGlzdE9yZ1JvbGVVc2VyczogW1wiR0VUIC9vcmdzL3tvcmd9L29yZ2FuaXphdGlvbi1yb2xlcy97cm9sZV9pZH0vdXNlcnNcIl0sXG4gICAgbGlzdE9yZ1JvbGVzOiBbXCJHRVQgL29yZ3Mve29yZ30vb3JnYW5pemF0aW9uLXJvbGVzXCJdLFxuICAgIGxpc3RPcmdhbml6YXRpb25GaW5lR3JhaW5lZFBlcm1pc3Npb25zOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9vcmdhbml6YXRpb24tZmluZS1ncmFpbmVkLXBlcm1pc3Npb25zXCJcbiAgICBdLFxuICAgIGxpc3RPdXRzaWRlQ29sbGFib3JhdG9yczogW1wiR0VUIC9vcmdzL3tvcmd9L291dHNpZGVfY29sbGFib3JhdG9yc1wiXSxcbiAgICBsaXN0UGF0R3JhbnRSZXBvc2l0b3JpZXM6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3BlcnNvbmFsLWFjY2Vzcy10b2tlbnMve3BhdF9pZH0vcmVwb3NpdG9yaWVzXCJcbiAgICBdLFxuICAgIGxpc3RQYXRHcmFudFJlcXVlc3RSZXBvc2l0b3JpZXM6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3BlcnNvbmFsLWFjY2Vzcy10b2tlbi1yZXF1ZXN0cy97cGF0X3JlcXVlc3RfaWR9L3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICBsaXN0UGF0R3JhbnRSZXF1ZXN0czogW1wiR0VUIC9vcmdzL3tvcmd9L3BlcnNvbmFsLWFjY2Vzcy10b2tlbi1yZXF1ZXN0c1wiXSxcbiAgICBsaXN0UGF0R3JhbnRzOiBbXCJHRVQgL29yZ3Mve29yZ30vcGVyc29uYWwtYWNjZXNzLXRva2Vuc1wiXSxcbiAgICBsaXN0UGVuZGluZ0ludml0YXRpb25zOiBbXCJHRVQgL29yZ3Mve29yZ30vaW52aXRhdGlvbnNcIl0sXG4gICAgbGlzdFB1YmxpY01lbWJlcnM6IFtcIkdFVCAvb3Jncy97b3JnfS9wdWJsaWNfbWVtYmVyc1wiXSxcbiAgICBsaXN0U2VjdXJpdHlNYW5hZ2VyVGVhbXM6IFtcIkdFVCAvb3Jncy97b3JnfS9zZWN1cml0eS1tYW5hZ2Vyc1wiXSxcbiAgICBsaXN0V2ViaG9va0RlbGl2ZXJpZXM6IFtcIkdFVCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH0vZGVsaXZlcmllc1wiXSxcbiAgICBsaXN0V2ViaG9va3M6IFtcIkdFVCAvb3Jncy97b3JnfS9ob29rc1wiXSxcbiAgICBwYXRjaEN1c3RvbU9yZ2FuaXphdGlvblJvbGU6IFtcbiAgICAgIFwiUEFUQ0ggL29yZ3Mve29yZ30vb3JnYW5pemF0aW9uLXJvbGVzL3tyb2xlX2lkfVwiXG4gICAgXSxcbiAgICBwaW5nV2ViaG9vazogW1wiUE9TVCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH0vcGluZ3NcIl0sXG4gICAgcmVkZWxpdmVyV2ViaG9va0RlbGl2ZXJ5OiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9L2RlbGl2ZXJpZXMve2RlbGl2ZXJ5X2lkfS9hdHRlbXB0c1wiXG4gICAgXSxcbiAgICByZW1vdmVDdXN0b21Qcm9wZXJ0eTogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vcHJvcGVydGllcy9zY2hlbWEve2N1c3RvbV9wcm9wZXJ0eV9uYW1lfVwiXG4gICAgXSxcbiAgICByZW1vdmVNZW1iZXI6IFtcIkRFTEVURSAvb3Jncy97b3JnfS9tZW1iZXJzL3t1c2VybmFtZX1cIl0sXG4gICAgcmVtb3ZlTWVtYmVyc2hpcEZvclVzZXI6IFtcIkRFTEVURSAvb3Jncy97b3JnfS9tZW1iZXJzaGlwcy97dXNlcm5hbWV9XCJdLFxuICAgIHJlbW92ZU91dHNpZGVDb2xsYWJvcmF0b3I6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L291dHNpZGVfY29sbGFib3JhdG9ycy97dXNlcm5hbWV9XCJcbiAgICBdLFxuICAgIHJlbW92ZVB1YmxpY01lbWJlcnNoaXBGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vcHVibGljX21lbWJlcnMve3VzZXJuYW1lfVwiXG4gICAgXSxcbiAgICByZW1vdmVTZWN1cml0eU1hbmFnZXJUZWFtOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9zZWN1cml0eS1tYW5hZ2Vycy90ZWFtcy97dGVhbV9zbHVnfVwiXG4gICAgXSxcbiAgICByZXZpZXdQYXRHcmFudFJlcXVlc3Q6IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS9wZXJzb25hbC1hY2Nlc3MtdG9rZW4tcmVxdWVzdHMve3BhdF9yZXF1ZXN0X2lkfVwiXG4gICAgXSxcbiAgICByZXZpZXdQYXRHcmFudFJlcXVlc3RzSW5CdWxrOiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30vcGVyc29uYWwtYWNjZXNzLXRva2VuLXJlcXVlc3RzXCJcbiAgICBdLFxuICAgIHJldm9rZUFsbE9yZ1JvbGVzVGVhbTogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vb3JnYW5pemF0aW9uLXJvbGVzL3RlYW1zL3t0ZWFtX3NsdWd9XCJcbiAgICBdLFxuICAgIHJldm9rZUFsbE9yZ1JvbGVzVXNlcjogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vb3JnYW5pemF0aW9uLXJvbGVzL3VzZXJzL3t1c2VybmFtZX1cIlxuICAgIF0sXG4gICAgcmV2b2tlT3JnUm9sZVRlYW06IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L29yZ2FuaXphdGlvbi1yb2xlcy90ZWFtcy97dGVhbV9zbHVnfS97cm9sZV9pZH1cIlxuICAgIF0sXG4gICAgcmV2b2tlT3JnUm9sZVVzZXI6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L29yZ2FuaXphdGlvbi1yb2xlcy91c2Vycy97dXNlcm5hbWV9L3tyb2xlX2lkfVwiXG4gICAgXSxcbiAgICBzZXRNZW1iZXJzaGlwRm9yVXNlcjogW1wiUFVUIC9vcmdzL3tvcmd9L21lbWJlcnNoaXBzL3t1c2VybmFtZX1cIl0sXG4gICAgc2V0UHVibGljTWVtYmVyc2hpcEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9wdWJsaWNfbWVtYmVycy97dXNlcm5hbWV9XCJcbiAgICBdLFxuICAgIHVuYmxvY2tVc2VyOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vYmxvY2tzL3t1c2VybmFtZX1cIl0sXG4gICAgdXBkYXRlOiBbXCJQQVRDSCAvb3Jncy97b3JnfVwiXSxcbiAgICB1cGRhdGVNZW1iZXJzaGlwRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiUEFUQ0ggL3VzZXIvbWVtYmVyc2hpcHMvb3Jncy97b3JnfVwiXG4gICAgXSxcbiAgICB1cGRhdGVQYXRBY2Nlc3M6IFtcIlBPU1QgL29yZ3Mve29yZ30vcGVyc29uYWwtYWNjZXNzLXRva2Vucy97cGF0X2lkfVwiXSxcbiAgICB1cGRhdGVQYXRBY2Nlc3NlczogW1wiUE9TVCAvb3Jncy97b3JnfS9wZXJzb25hbC1hY2Nlc3MtdG9rZW5zXCJdLFxuICAgIHVwZGF0ZVdlYmhvb2s6IFtcIlBBVENIIC9vcmdzL3tvcmd9L2hvb2tzL3tob29rX2lkfVwiXSxcbiAgICB1cGRhdGVXZWJob29rQ29uZmlnRm9yT3JnOiBbXCJQQVRDSCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH0vY29uZmlnXCJdXG4gIH0sXG4gIHBhY2thZ2VzOiB7XG4gICAgZGVsZXRlUGFja2FnZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfVwiXG4gICAgXSxcbiAgICBkZWxldGVQYWNrYWdlRm9yT3JnOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfVwiXG4gICAgXSxcbiAgICBkZWxldGVQYWNrYWdlRm9yVXNlcjogW1xuICAgICAgXCJERUxFVEUgL3VzZXJzL3t1c2VybmFtZX0vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX1cIlxuICAgIF0sXG4gICAgZGVsZXRlUGFja2FnZVZlcnNpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnMve3BhY2thZ2VfdmVyc2lvbl9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlUGFja2FnZVZlcnNpb25Gb3JPcmc6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zL3twYWNrYWdlX3ZlcnNpb25faWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZVBhY2thZ2VWZXJzaW9uRm9yVXNlcjogW1xuICAgICAgXCJERUxFVEUgL3VzZXJzL3t1c2VybmFtZX0vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnMve3BhY2thZ2VfdmVyc2lvbl9pZH1cIlxuICAgIF0sXG4gICAgZ2V0QWxsUGFja2FnZVZlcnNpb25zRm9yQVBhY2thZ2VPd25lZEJ5QW5Pcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1wicGFja2FnZXNcIiwgXCJnZXRBbGxQYWNrYWdlVmVyc2lvbnNGb3JQYWNrYWdlT3duZWRCeU9yZ1wiXSB9XG4gICAgXSxcbiAgICBnZXRBbGxQYWNrYWdlVmVyc2lvbnNGb3JBUGFja2FnZU93bmVkQnlUaGVBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnNcIixcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICByZW5hbWVkOiBbXG4gICAgICAgICAgXCJwYWNrYWdlc1wiLFxuICAgICAgICAgIFwiZ2V0QWxsUGFja2FnZVZlcnNpb25zRm9yUGFja2FnZU93bmVkQnlBdXRoZW50aWNhdGVkVXNlclwiXG4gICAgICAgIF1cbiAgICAgIH1cbiAgICBdLFxuICAgIGdldEFsbFBhY2thZ2VWZXJzaW9uc0ZvclBhY2thZ2VPd25lZEJ5QXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2VyL3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zXCJcbiAgICBdLFxuICAgIGdldEFsbFBhY2thZ2VWZXJzaW9uc0ZvclBhY2thZ2VPd25lZEJ5T3JnOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9uc1wiXG4gICAgXSxcbiAgICBnZXRBbGxQYWNrYWdlVmVyc2lvbnNGb3JQYWNrYWdlT3duZWRCeVVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zXCJcbiAgICBdLFxuICAgIGdldFBhY2thZ2VGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX1cIlxuICAgIF0sXG4gICAgZ2V0UGFja2FnZUZvck9yZ2FuaXphdGlvbjogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX1cIlxuICAgIF0sXG4gICAgZ2V0UGFja2FnZUZvclVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9XCJcbiAgICBdLFxuICAgIGdldFBhY2thZ2VWZXJzaW9uRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2VyL3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zL3twYWNrYWdlX3ZlcnNpb25faWR9XCJcbiAgICBdLFxuICAgIGdldFBhY2thZ2VWZXJzaW9uRm9yT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9ucy97cGFja2FnZV92ZXJzaW9uX2lkfVwiXG4gICAgXSxcbiAgICBnZXRQYWNrYWdlVmVyc2lvbkZvclVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zL3twYWNrYWdlX3ZlcnNpb25faWR9XCJcbiAgICBdLFxuICAgIGxpc3REb2NrZXJNaWdyYXRpb25Db25mbGljdGluZ1BhY2thZ2VzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2VyL2RvY2tlci9jb25mbGljdHNcIlxuICAgIF0sXG4gICAgbGlzdERvY2tlck1pZ3JhdGlvbkNvbmZsaWN0aW5nUGFja2FnZXNGb3JPcmdhbml6YXRpb246IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2RvY2tlci9jb25mbGljdHNcIlxuICAgIF0sXG4gICAgbGlzdERvY2tlck1pZ3JhdGlvbkNvbmZsaWN0aW5nUGFja2FnZXNGb3JVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9kb2NrZXIvY29uZmxpY3RzXCJcbiAgICBdLFxuICAgIGxpc3RQYWNrYWdlc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvcGFja2FnZXNcIl0sXG4gICAgbGlzdFBhY2thZ2VzRm9yT3JnYW5pemF0aW9uOiBbXCJHRVQgL29yZ3Mve29yZ30vcGFja2FnZXNcIl0sXG4gICAgbGlzdFBhY2thZ2VzRm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L3BhY2thZ2VzXCJdLFxuICAgIHJlc3RvcmVQYWNrYWdlRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiUE9TVCAvdXNlci9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS9yZXN0b3Jlez90b2tlbn1cIlxuICAgIF0sXG4gICAgcmVzdG9yZVBhY2thZ2VGb3JPcmc6IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS9yZXN0b3Jlez90b2tlbn1cIlxuICAgIF0sXG4gICAgcmVzdG9yZVBhY2thZ2VGb3JVc2VyOiBbXG4gICAgICBcIlBPU1QgL3VzZXJzL3t1c2VybmFtZX0vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vcmVzdG9yZXs/dG9rZW59XCJcbiAgICBdLFxuICAgIHJlc3RvcmVQYWNrYWdlVmVyc2lvbkZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIlBPU1QgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnMve3BhY2thZ2VfdmVyc2lvbl9pZH0vcmVzdG9yZVwiXG4gICAgXSxcbiAgICByZXN0b3JlUGFja2FnZVZlcnNpb25Gb3JPcmc6IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9ucy97cGFja2FnZV92ZXJzaW9uX2lkfS9yZXN0b3JlXCJcbiAgICBdLFxuICAgIHJlc3RvcmVQYWNrYWdlVmVyc2lvbkZvclVzZXI6IFtcbiAgICAgIFwiUE9TVCAvdXNlcnMve3VzZXJuYW1lfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9ucy97cGFja2FnZV92ZXJzaW9uX2lkfS9yZXN0b3JlXCJcbiAgICBdXG4gIH0sXG4gIHByb2plY3RzOiB7XG4gICAgYWRkQ29sbGFib3JhdG9yOiBbXCJQVVQgL3Byb2plY3RzL3twcm9qZWN0X2lkfS9jb2xsYWJvcmF0b3JzL3t1c2VybmFtZX1cIl0sXG4gICAgY3JlYXRlQ2FyZDogW1wiUE9TVCAvcHJvamVjdHMvY29sdW1ucy97Y29sdW1uX2lkfS9jYXJkc1wiXSxcbiAgICBjcmVhdGVDb2x1bW46IFtcIlBPU1QgL3Byb2plY3RzL3twcm9qZWN0X2lkfS9jb2x1bW5zXCJdLFxuICAgIGNyZWF0ZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQT1NUIC91c2VyL3Byb2plY3RzXCJdLFxuICAgIGNyZWF0ZUZvck9yZzogW1wiUE9TVCAvb3Jncy97b3JnfS9wcm9qZWN0c1wiXSxcbiAgICBjcmVhdGVGb3JSZXBvOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wcm9qZWN0c1wiXSxcbiAgICBkZWxldGU6IFtcIkRFTEVURSAvcHJvamVjdHMve3Byb2plY3RfaWR9XCJdLFxuICAgIGRlbGV0ZUNhcmQ6IFtcIkRFTEVURSAvcHJvamVjdHMvY29sdW1ucy9jYXJkcy97Y2FyZF9pZH1cIl0sXG4gICAgZGVsZXRlQ29sdW1uOiBbXCJERUxFVEUgL3Byb2plY3RzL2NvbHVtbnMve2NvbHVtbl9pZH1cIl0sXG4gICAgZ2V0OiBbXCJHRVQgL3Byb2plY3RzL3twcm9qZWN0X2lkfVwiXSxcbiAgICBnZXRDYXJkOiBbXCJHRVQgL3Byb2plY3RzL2NvbHVtbnMvY2FyZHMve2NhcmRfaWR9XCJdLFxuICAgIGdldENvbHVtbjogW1wiR0VUIC9wcm9qZWN0cy9jb2x1bW5zL3tjb2x1bW5faWR9XCJdLFxuICAgIGdldFBlcm1pc3Npb25Gb3JVc2VyOiBbXG4gICAgICBcIkdFVCAvcHJvamVjdHMve3Byb2plY3RfaWR9L2NvbGxhYm9yYXRvcnMve3VzZXJuYW1lfS9wZXJtaXNzaW9uXCJcbiAgICBdLFxuICAgIGxpc3RDYXJkczogW1wiR0VUIC9wcm9qZWN0cy9jb2x1bW5zL3tjb2x1bW5faWR9L2NhcmRzXCJdLFxuICAgIGxpc3RDb2xsYWJvcmF0b3JzOiBbXCJHRVQgL3Byb2plY3RzL3twcm9qZWN0X2lkfS9jb2xsYWJvcmF0b3JzXCJdLFxuICAgIGxpc3RDb2x1bW5zOiBbXCJHRVQgL3Byb2plY3RzL3twcm9qZWN0X2lkfS9jb2x1bW5zXCJdLFxuICAgIGxpc3RGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9wcm9qZWN0c1wiXSxcbiAgICBsaXN0Rm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wcm9qZWN0c1wiXSxcbiAgICBsaXN0Rm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L3Byb2plY3RzXCJdLFxuICAgIG1vdmVDYXJkOiBbXCJQT1NUIC9wcm9qZWN0cy9jb2x1bW5zL2NhcmRzL3tjYXJkX2lkfS9tb3Zlc1wiXSxcbiAgICBtb3ZlQ29sdW1uOiBbXCJQT1NUIC9wcm9qZWN0cy9jb2x1bW5zL3tjb2x1bW5faWR9L21vdmVzXCJdLFxuICAgIHJlbW92ZUNvbGxhYm9yYXRvcjogW1xuICAgICAgXCJERUxFVEUgL3Byb2plY3RzL3twcm9qZWN0X2lkfS9jb2xsYWJvcmF0b3JzL3t1c2VybmFtZX1cIlxuICAgIF0sXG4gICAgdXBkYXRlOiBbXCJQQVRDSCAvcHJvamVjdHMve3Byb2plY3RfaWR9XCJdLFxuICAgIHVwZGF0ZUNhcmQ6IFtcIlBBVENIIC9wcm9qZWN0cy9jb2x1bW5zL2NhcmRzL3tjYXJkX2lkfVwiXSxcbiAgICB1cGRhdGVDb2x1bW46IFtcIlBBVENIIC9wcm9qZWN0cy9jb2x1bW5zL3tjb2x1bW5faWR9XCJdXG4gIH0sXG4gIHB1bGxzOiB7XG4gICAgY2hlY2tJZk1lcmdlZDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L21lcmdlXCJdLFxuICAgIGNyZWF0ZTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHNcIl0sXG4gICAgY3JlYXRlUmVwbHlGb3JSZXZpZXdDb21tZW50OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfaWR9L3JlcGxpZXNcIlxuICAgIF0sXG4gICAgY3JlYXRlUmV2aWV3OiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3Jldmlld3NcIl0sXG4gICAgY3JlYXRlUmV2aWV3Q29tbWVudDogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvbW1lbnRzXCJcbiAgICBdLFxuICAgIGRlbGV0ZVBlbmRpbmdSZXZpZXc6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3Jldmlld3Mve3Jldmlld19pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlUmV2aWV3Q29tbWVudDogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL2NvbW1lbnRzL3tjb21tZW50X2lkfVwiXG4gICAgXSxcbiAgICBkaXNtaXNzUmV2aWV3OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzL3tyZXZpZXdfaWR9L2Rpc21pc3NhbHNcIlxuICAgIF0sXG4gICAgZ2V0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn1cIl0sXG4gICAgZ2V0UmV2aWV3OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzL3tyZXZpZXdfaWR9XCJcbiAgICBdLFxuICAgIGdldFJldmlld0NvbW1lbnQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHMve2NvbW1lbnRfaWR9XCJdLFxuICAgIGxpc3Q6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHNcIl0sXG4gICAgbGlzdENvbW1lbnRzRm9yUmV2aWV3OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzL3tyZXZpZXdfaWR9L2NvbW1lbnRzXCJcbiAgICBdLFxuICAgIGxpc3RDb21taXRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vY29tbWl0c1wiXSxcbiAgICBsaXN0RmlsZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9maWxlc1wiXSxcbiAgICBsaXN0UmVxdWVzdGVkUmV2aWV3ZXJzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXF1ZXN0ZWRfcmV2aWV3ZXJzXCJcbiAgICBdLFxuICAgIGxpc3RSZXZpZXdDb21tZW50czogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vY29tbWVudHNcIlxuICAgIF0sXG4gICAgbGlzdFJldmlld0NvbW1lbnRzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy9jb21tZW50c1wiXSxcbiAgICBsaXN0UmV2aWV3czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3Jldmlld3NcIl0sXG4gICAgbWVyZ2U6IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9tZXJnZVwiXSxcbiAgICByZW1vdmVSZXF1ZXN0ZWRSZXZpZXdlcnM6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3JlcXVlc3RlZF9yZXZpZXdlcnNcIlxuICAgIF0sXG4gICAgcmVxdWVzdFJldmlld2VyczogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3JlcXVlc3RlZF9yZXZpZXdlcnNcIlxuICAgIF0sXG4gICAgc3VibWl0UmV2aWV3OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmV2aWV3cy97cmV2aWV3X2lkfS9ldmVudHNcIlxuICAgIF0sXG4gICAgdXBkYXRlOiBbXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfVwiXSxcbiAgICB1cGRhdGVCcmFuY2g6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3VwZGF0ZS1icmFuY2hcIlxuICAgIF0sXG4gICAgdXBkYXRlUmV2aWV3OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzL3tyZXZpZXdfaWR9XCJcbiAgICBdLFxuICAgIHVwZGF0ZVJldmlld0NvbW1lbnQ6IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL2NvbW1lbnRzL3tjb21tZW50X2lkfVwiXG4gICAgXVxuICB9LFxuICByYXRlTGltaXQ6IHsgZ2V0OiBbXCJHRVQgL3JhdGVfbGltaXRcIl0gfSxcbiAgcmVhY3Rpb25zOiB7XG4gICAgY3JlYXRlRm9yQ29tbWl0Q29tbWVudDogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCJcbiAgICBdLFxuICAgIGNyZWF0ZUZvcklzc3VlOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9yZWFjdGlvbnNcIlxuICAgIF0sXG4gICAgY3JlYXRlRm9ySXNzdWVDb21tZW50OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCJcbiAgICBdLFxuICAgIGNyZWF0ZUZvclB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCJcbiAgICBdLFxuICAgIGNyZWF0ZUZvclJlbGVhc2U6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMve3JlbGVhc2VfaWR9L3JlYWN0aW9uc1wiXG4gICAgXSxcbiAgICBjcmVhdGVGb3JUZWFtRGlzY3Vzc2lvbkNvbW1lbnRJbk9yZzogW1xuICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfbnVtYmVyfS9yZWFjdGlvbnNcIlxuICAgIF0sXG4gICAgY3JlYXRlRm9yVGVhbURpc2N1c3Npb25Jbk9yZzogW1xuICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vcmVhY3Rpb25zXCJcbiAgICBdLFxuICAgIGRlbGV0ZUZvckNvbW1pdENvbW1lbnQ6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zL3tyZWFjdGlvbl9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlRm9ySXNzdWU6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vcmVhY3Rpb25zL3tyZWFjdGlvbl9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlRm9ySXNzdWVDb21tZW50OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL2NvbW1lbnRzL3tjb21tZW50X2lkfS9yZWFjdGlvbnMve3JlYWN0aW9uX2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVGb3JQdWxsUmVxdWVzdENvbW1lbnQ6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zL3tyZWFjdGlvbl9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlRm9yUmVsZWFzZTogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfS9yZWFjdGlvbnMve3JlYWN0aW9uX2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVGb3JUZWFtRGlzY3Vzc2lvbjogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9yZWFjdGlvbnMve3JlYWN0aW9uX2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVGb3JUZWFtRGlzY3Vzc2lvbkNvbW1lbnQ6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfbnVtYmVyfS9yZWFjdGlvbnMve3JlYWN0aW9uX2lkfVwiXG4gICAgXSxcbiAgICBsaXN0Rm9yQ29tbWl0Q29tbWVudDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1lbnRzL3tjb21tZW50X2lkfS9yZWFjdGlvbnNcIlxuICAgIF0sXG4gICAgbGlzdEZvcklzc3VlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9yZWFjdGlvbnNcIl0sXG4gICAgbGlzdEZvcklzc3VlQ29tbWVudDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCJcbiAgICBdLFxuICAgIGxpc3RGb3JQdWxsUmVxdWVzdFJldmlld0NvbW1lbnQ6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCJcbiAgICBdLFxuICAgIGxpc3RGb3JSZWxlYXNlOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMve3JlbGVhc2VfaWR9L3JlYWN0aW9uc1wiXG4gICAgXSxcbiAgICBsaXN0Rm9yVGVhbURpc2N1c3Npb25Db21tZW50SW5Pcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfbnVtYmVyfS9yZWFjdGlvbnNcIlxuICAgIF0sXG4gICAgbGlzdEZvclRlYW1EaXNjdXNzaW9uSW5Pcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vcmVhY3Rpb25zXCJcbiAgICBdXG4gIH0sXG4gIHJlcG9zOiB7XG4gICAgYWNjZXB0SW52aXRhdGlvbjogW1xuICAgICAgXCJQQVRDSCAvdXNlci9yZXBvc2l0b3J5X2ludml0YXRpb25zL3tpbnZpdGF0aW9uX2lkfVwiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInJlcG9zXCIsIFwiYWNjZXB0SW52aXRhdGlvbkZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGFjY2VwdEludml0YXRpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJQQVRDSCAvdXNlci9yZXBvc2l0b3J5X2ludml0YXRpb25zL3tpbnZpdGF0aW9uX2lkfVwiXG4gICAgXSxcbiAgICBhZGRBcHBBY2Nlc3NSZXN0cmljdGlvbnM6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnMvYXBwc1wiLFxuICAgICAge30sXG4gICAgICB7IG1hcFRvRGF0YTogXCJhcHBzXCIgfVxuICAgIF0sXG4gICAgYWRkQ29sbGFib3JhdG9yOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbGxhYm9yYXRvcnMve3VzZXJuYW1lfVwiXSxcbiAgICBhZGRTdGF0dXNDaGVja0NvbnRleHRzOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc3RhdHVzX2NoZWNrcy9jb250ZXh0c1wiLFxuICAgICAge30sXG4gICAgICB7IG1hcFRvRGF0YTogXCJjb250ZXh0c1wiIH1cbiAgICBdLFxuICAgIGFkZFRlYW1BY2Nlc3NSZXN0cmljdGlvbnM6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnMvdGVhbXNcIixcbiAgICAgIHt9LFxuICAgICAgeyBtYXBUb0RhdGE6IFwidGVhbXNcIiB9XG4gICAgXSxcbiAgICBhZGRVc2VyQWNjZXNzUmVzdHJpY3Rpb25zOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL3VzZXJzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcInVzZXJzXCIgfVxuICAgIF0sXG4gICAgY2FuY2VsUGFnZXNEZXBsb3ltZW50OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzL2RlcGxveW1lbnRzL3twYWdlc19kZXBsb3ltZW50X2lkfS9jYW5jZWxcIlxuICAgIF0sXG4gICAgY2hlY2tBdXRvbWF0ZWRTZWN1cml0eUZpeGVzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYXV0b21hdGVkLXNlY3VyaXR5LWZpeGVzXCJcbiAgICBdLFxuICAgIGNoZWNrQ29sbGFib3JhdG9yOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbGxhYm9yYXRvcnMve3VzZXJuYW1lfVwiXSxcbiAgICBjaGVja1Z1bG5lcmFiaWxpdHlBbGVydHM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS92dWxuZXJhYmlsaXR5LWFsZXJ0c1wiXG4gICAgXSxcbiAgICBjb2Rlb3duZXJzRXJyb3JzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVvd25lcnMvZXJyb3JzXCJdLFxuICAgIGNvbXBhcmVDb21taXRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbXBhcmUve2Jhc2V9Li4ue2hlYWR9XCJdLFxuICAgIGNvbXBhcmVDb21taXRzV2l0aEJhc2VoZWFkOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tcGFyZS97YmFzZWhlYWR9XCJcbiAgICBdLFxuICAgIGNyZWF0ZUF1dG9saW5rOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hdXRvbGlua3NcIl0sXG4gICAgY3JlYXRlQ29tbWl0Q29tbWVudDogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tjb21taXRfc2hhfS9jb21tZW50c1wiXG4gICAgXSxcbiAgICBjcmVhdGVDb21taXRTaWduYXR1cmVQcm90ZWN0aW9uOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc2lnbmF0dXJlc1wiXG4gICAgXSxcbiAgICBjcmVhdGVDb21taXRTdGF0dXM6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N0YXR1c2VzL3tzaGF9XCJdLFxuICAgIGNyZWF0ZURlcGxveUtleTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30va2V5c1wiXSxcbiAgICBjcmVhdGVEZXBsb3ltZW50OiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBsb3ltZW50c1wiXSxcbiAgICBjcmVhdGVEZXBsb3ltZW50QnJhbmNoUG9saWN5OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vZGVwbG95bWVudC1icmFuY2gtcG9saWNpZXNcIlxuICAgIF0sXG4gICAgY3JlYXRlRGVwbG95bWVudFByb3RlY3Rpb25SdWxlOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vZGVwbG95bWVudF9wcm90ZWN0aW9uX3J1bGVzXCJcbiAgICBdLFxuICAgIGNyZWF0ZURlcGxveW1lbnRTdGF0dXM6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwbG95bWVudHMve2RlcGxveW1lbnRfaWR9L3N0YXR1c2VzXCJcbiAgICBdLFxuICAgIGNyZWF0ZURpc3BhdGNoRXZlbnQ6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Rpc3BhdGNoZXNcIl0sXG4gICAgY3JlYXRlRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBPU1QgL3VzZXIvcmVwb3NcIl0sXG4gICAgY3JlYXRlRm9yazogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vZm9ya3NcIl0sXG4gICAgY3JlYXRlSW5Pcmc6IFtcIlBPU1QgL29yZ3Mve29yZ30vcmVwb3NcIl0sXG4gICAgY3JlYXRlT3JVcGRhdGVDdXN0b21Qcm9wZXJ0aWVzVmFsdWVzOiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wcm9wZXJ0aWVzL3ZhbHVlc1wiXG4gICAgXSxcbiAgICBjcmVhdGVPclVwZGF0ZUVudmlyb25tZW50OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfVwiXG4gICAgXSxcbiAgICBjcmVhdGVPclVwZGF0ZUZpbGVDb250ZW50czogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb250ZW50cy97cGF0aH1cIl0sXG4gICAgY3JlYXRlT3JnUnVsZXNldDogW1wiUE9TVCAvb3Jncy97b3JnfS9ydWxlc2V0c1wiXSxcbiAgICBjcmVhdGVQYWdlc0RlcGxveW1lbnQ6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzL2RlcGxveW1lbnRzXCJdLFxuICAgIGNyZWF0ZVBhZ2VzU2l0ZTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXNcIl0sXG4gICAgY3JlYXRlUmVsZWFzZTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXNcIl0sXG4gICAgY3JlYXRlUmVwb1J1bGVzZXQ6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzXCJdLFxuICAgIGNyZWF0ZVRhZ1Byb3RlY3Rpb246IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RhZ3MvcHJvdGVjdGlvblwiXSxcbiAgICBjcmVhdGVVc2luZ1RlbXBsYXRlOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3t0ZW1wbGF0ZV9vd25lcn0ve3RlbXBsYXRlX3JlcG99L2dlbmVyYXRlXCJcbiAgICBdLFxuICAgIGNyZWF0ZVdlYmhvb2s6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzXCJdLFxuICAgIGRlY2xpbmVJbnZpdGF0aW9uOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9yZXBvc2l0b3J5X2ludml0YXRpb25zL3tpbnZpdGF0aW9uX2lkfVwiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInJlcG9zXCIsIFwiZGVjbGluZUludml0YXRpb25Gb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBkZWNsaW5lSW52aXRhdGlvbkZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9yZXBvc2l0b3J5X2ludml0YXRpb25zL3tpbnZpdGF0aW9uX2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGU6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb31cIl0sXG4gICAgZGVsZXRlQWNjZXNzUmVzdHJpY3Rpb25zOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnNcIlxuICAgIF0sXG4gICAgZGVsZXRlQWRtaW5CcmFuY2hQcm90ZWN0aW9uOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9lbmZvcmNlX2FkbWluc1wiXG4gICAgXSxcbiAgICBkZWxldGVBbkVudmlyb25tZW50OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfVwiXG4gICAgXSxcbiAgICBkZWxldGVBdXRvbGluazogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hdXRvbGlua3Mve2F1dG9saW5rX2lkfVwiXSxcbiAgICBkZWxldGVCcmFuY2hQcm90ZWN0aW9uOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvblwiXG4gICAgXSxcbiAgICBkZWxldGVDb21taXRDb21tZW50OiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1lbnRzL3tjb21tZW50X2lkfVwiXSxcbiAgICBkZWxldGVDb21taXRTaWduYXR1cmVQcm90ZWN0aW9uOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9zaWduYXR1cmVzXCJcbiAgICBdLFxuICAgIGRlbGV0ZURlcGxveUtleTogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9rZXlzL3trZXlfaWR9XCJdLFxuICAgIGRlbGV0ZURlcGxveW1lbnQ6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBsb3ltZW50cy97ZGVwbG95bWVudF9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlRGVwbG95bWVudEJyYW5jaFBvbGljeTogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vZGVwbG95bWVudC1icmFuY2gtcG9saWNpZXMve2JyYW5jaF9wb2xpY3lfaWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZUZpbGU6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vY29udGVudHMve3BhdGh9XCJdLFxuICAgIGRlbGV0ZUludml0YXRpb246IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlT3JnUnVsZXNldDogW1wiREVMRVRFIC9vcmdzL3tvcmd9L3J1bGVzZXRzL3tydWxlc2V0X2lkfVwiXSxcbiAgICBkZWxldGVQYWdlc1NpdGU6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXNcIl0sXG4gICAgZGVsZXRlUHVsbFJlcXVlc3RSZXZpZXdQcm90ZWN0aW9uOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9wdWxsX3JlcXVlc3RfcmV2aWV3c1wiXG4gICAgXSxcbiAgICBkZWxldGVSZWxlYXNlOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfVwiXSxcbiAgICBkZWxldGVSZWxlYXNlQXNzZXQ6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy9hc3NldHMve2Fzc2V0X2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVSZXBvUnVsZXNldDogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cy97cnVsZXNldF9pZH1cIl0sXG4gICAgZGVsZXRlVGFnUHJvdGVjdGlvbjogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RhZ3MvcHJvdGVjdGlvbi97dGFnX3Byb3RlY3Rpb25faWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZVdlYmhvb2s6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3Mve2hvb2tfaWR9XCJdLFxuICAgIGRpc2FibGVBdXRvbWF0ZWRTZWN1cml0eUZpeGVzOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYXV0b21hdGVkLXNlY3VyaXR5LWZpeGVzXCJcbiAgICBdLFxuICAgIGRpc2FibGVEZXBsb3ltZW50UHJvdGVjdGlvblJ1bGU6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L2RlcGxveW1lbnRfcHJvdGVjdGlvbl9ydWxlcy97cHJvdGVjdGlvbl9ydWxlX2lkfVwiXG4gICAgXSxcbiAgICBkaXNhYmxlUHJpdmF0ZVZ1bG5lcmFiaWxpdHlSZXBvcnRpbmc6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wcml2YXRlLXZ1bG5lcmFiaWxpdHktcmVwb3J0aW5nXCJcbiAgICBdLFxuICAgIGRpc2FibGVWdWxuZXJhYmlsaXR5QWxlcnRzOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vdnVsbmVyYWJpbGl0eS1hbGVydHNcIlxuICAgIF0sXG4gICAgZG93bmxvYWRBcmNoaXZlOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vemlwYmFsbC97cmVmfVwiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInJlcG9zXCIsIFwiZG93bmxvYWRaaXBiYWxsQXJjaGl2ZVwiXSB9XG4gICAgXSxcbiAgICBkb3dubG9hZFRhcmJhbGxBcmNoaXZlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RhcmJhbGwve3JlZn1cIl0sXG4gICAgZG93bmxvYWRaaXBiYWxsQXJjaGl2ZTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS96aXBiYWxsL3tyZWZ9XCJdLFxuICAgIGVuYWJsZUF1dG9tYXRlZFNlY3VyaXR5Rml4ZXM6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hdXRvbWF0ZWQtc2VjdXJpdHktZml4ZXNcIlxuICAgIF0sXG4gICAgZW5hYmxlUHJpdmF0ZVZ1bG5lcmFiaWxpdHlSZXBvcnRpbmc6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wcml2YXRlLXZ1bG5lcmFiaWxpdHktcmVwb3J0aW5nXCJcbiAgICBdLFxuICAgIGVuYWJsZVZ1bG5lcmFiaWxpdHlBbGVydHM6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS92dWxuZXJhYmlsaXR5LWFsZXJ0c1wiXG4gICAgXSxcbiAgICBnZW5lcmF0ZVJlbGVhc2VOb3RlczogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy9nZW5lcmF0ZS1ub3Rlc1wiXG4gICAgXSxcbiAgICBnZXQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb31cIl0sXG4gICAgZ2V0QWNjZXNzUmVzdHJpY3Rpb25zOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnNcIlxuICAgIF0sXG4gICAgZ2V0QWRtaW5CcmFuY2hQcm90ZWN0aW9uOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9lbmZvcmNlX2FkbWluc1wiXG4gICAgXSxcbiAgICBnZXRBbGxEZXBsb3ltZW50UHJvdGVjdGlvblJ1bGVzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9kZXBsb3ltZW50X3Byb3RlY3Rpb25fcnVsZXNcIlxuICAgIF0sXG4gICAgZ2V0QWxsRW52aXJvbm1lbnRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50c1wiXSxcbiAgICBnZXRBbGxTdGF0dXNDaGVja0NvbnRleHRzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzL2NvbnRleHRzXCJcbiAgICBdLFxuICAgIGdldEFsbFRvcGljczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90b3BpY3NcIl0sXG4gICAgZ2V0QXBwc1dpdGhBY2Nlc3NUb1Byb3RlY3RlZEJyYW5jaDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL2FwcHNcIlxuICAgIF0sXG4gICAgZ2V0QXV0b2xpbms6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYXV0b2xpbmtzL3thdXRvbGlua19pZH1cIl0sXG4gICAgZ2V0QnJhbmNoOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9XCJdLFxuICAgIGdldEJyYW5jaFByb3RlY3Rpb246IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uXCJcbiAgICBdLFxuICAgIGdldEJyYW5jaFJ1bGVzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzL2JyYW5jaGVzL3ticmFuY2h9XCJdLFxuICAgIGdldENsb25lczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90cmFmZmljL2Nsb25lc1wiXSxcbiAgICBnZXRDb2RlRnJlcXVlbmN5U3RhdHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3RhdHMvY29kZV9mcmVxdWVuY3lcIl0sXG4gICAgZ2V0Q29sbGFib3JhdG9yUGVybWlzc2lvbkxldmVsOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29sbGFib3JhdG9ycy97dXNlcm5hbWV9L3Blcm1pc3Npb25cIlxuICAgIF0sXG4gICAgZ2V0Q29tYmluZWRTdGF0dXNGb3JSZWY6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97cmVmfS9zdGF0dXNcIl0sXG4gICAgZ2V0Q29tbWl0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve3JlZn1cIl0sXG4gICAgZ2V0Q29tbWl0QWN0aXZpdHlTdGF0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdGF0cy9jb21taXRfYWN0aXZpdHlcIl0sXG4gICAgZ2V0Q29tbWl0Q29tbWVudDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgZ2V0Q29tbWl0U2lnbmF0dXJlUHJvdGVjdGlvbjogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc2lnbmF0dXJlc1wiXG4gICAgXSxcbiAgICBnZXRDb21tdW5pdHlQcm9maWxlTWV0cmljczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tdW5pdHkvcHJvZmlsZVwiXSxcbiAgICBnZXRDb250ZW50OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbnRlbnRzL3twYXRofVwiXSxcbiAgICBnZXRDb250cmlidXRvcnNTdGF0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdGF0cy9jb250cmlidXRvcnNcIl0sXG4gICAgZ2V0Q3VzdG9tRGVwbG95bWVudFByb3RlY3Rpb25SdWxlOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9kZXBsb3ltZW50X3Byb3RlY3Rpb25fcnVsZXMve3Byb3RlY3Rpb25fcnVsZV9pZH1cIlxuICAgIF0sXG4gICAgZ2V0Q3VzdG9tUHJvcGVydGllc1ZhbHVlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wcm9wZXJ0aWVzL3ZhbHVlc1wiXSxcbiAgICBnZXREZXBsb3lLZXk6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30va2V5cy97a2V5X2lkfVwiXSxcbiAgICBnZXREZXBsb3ltZW50OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGxveW1lbnRzL3tkZXBsb3ltZW50X2lkfVwiXSxcbiAgICBnZXREZXBsb3ltZW50QnJhbmNoUG9saWN5OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9kZXBsb3ltZW50LWJyYW5jaC1wb2xpY2llcy97YnJhbmNoX3BvbGljeV9pZH1cIlxuICAgIF0sXG4gICAgZ2V0RGVwbG95bWVudFN0YXR1czogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGxveW1lbnRzL3tkZXBsb3ltZW50X2lkfS9zdGF0dXNlcy97c3RhdHVzX2lkfVwiXG4gICAgXSxcbiAgICBnZXRFbnZpcm9ubWVudDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX1cIlxuICAgIF0sXG4gICAgZ2V0TGF0ZXN0UGFnZXNCdWlsZDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wYWdlcy9idWlsZHMvbGF0ZXN0XCJdLFxuICAgIGdldExhdGVzdFJlbGVhc2U6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvbGF0ZXN0XCJdLFxuICAgIGdldE9yZ1J1bGVTdWl0ZTogW1wiR0VUIC9vcmdzL3tvcmd9L3J1bGVzZXRzL3J1bGUtc3VpdGVzL3tydWxlX3N1aXRlX2lkfVwiXSxcbiAgICBnZXRPcmdSdWxlU3VpdGVzOiBbXCJHRVQgL29yZ3Mve29yZ30vcnVsZXNldHMvcnVsZS1zdWl0ZXNcIl0sXG4gICAgZ2V0T3JnUnVsZXNldDogW1wiR0VUIC9vcmdzL3tvcmd9L3J1bGVzZXRzL3tydWxlc2V0X2lkfVwiXSxcbiAgICBnZXRPcmdSdWxlc2V0czogW1wiR0VUIC9vcmdzL3tvcmd9L3J1bGVzZXRzXCJdLFxuICAgIGdldFBhZ2VzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzXCJdLFxuICAgIGdldFBhZ2VzQnVpbGQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvYnVpbGRzL3tidWlsZF9pZH1cIl0sXG4gICAgZ2V0UGFnZXNEZXBsb3ltZW50OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvZGVwbG95bWVudHMve3BhZ2VzX2RlcGxveW1lbnRfaWR9XCJcbiAgICBdLFxuICAgIGdldFBhZ2VzSGVhbHRoQ2hlY2s6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvaGVhbHRoXCJdLFxuICAgIGdldFBhcnRpY2lwYXRpb25TdGF0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdGF0cy9wYXJ0aWNpcGF0aW9uXCJdLFxuICAgIGdldFB1bGxSZXF1ZXN0UmV2aWV3UHJvdGVjdGlvbjogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfcHVsbF9yZXF1ZXN0X3Jldmlld3NcIlxuICAgIF0sXG4gICAgZ2V0UHVuY2hDYXJkU3RhdHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3RhdHMvcHVuY2hfY2FyZFwiXSxcbiAgICBnZXRSZWFkbWU6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVhZG1lXCJdLFxuICAgIGdldFJlYWRtZUluRGlyZWN0b3J5OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlYWRtZS97ZGlyfVwiXSxcbiAgICBnZXRSZWxlYXNlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfVwiXSxcbiAgICBnZXRSZWxlYXNlQXNzZXQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvYXNzZXRzL3thc3NldF9pZH1cIl0sXG4gICAgZ2V0UmVsZWFzZUJ5VGFnOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3RhZ3Mve3RhZ31cIl0sXG4gICAgZ2V0UmVwb1J1bGVTdWl0ZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzL3J1bGUtc3VpdGVzL3tydWxlX3N1aXRlX2lkfVwiXG4gICAgXSxcbiAgICBnZXRSZXBvUnVsZVN1aXRlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cy9ydWxlLXN1aXRlc1wiXSxcbiAgICBnZXRSZXBvUnVsZXNldDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cy97cnVsZXNldF9pZH1cIl0sXG4gICAgZ2V0UmVwb1J1bGVzZXRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzXCJdLFxuICAgIGdldFN0YXR1c0NoZWNrc1Byb3RlY3Rpb246IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3N0YXR1c19jaGVja3NcIlxuICAgIF0sXG4gICAgZ2V0VGVhbXNXaXRoQWNjZXNzVG9Qcm90ZWN0ZWRCcmFuY2g6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy90ZWFtc1wiXG4gICAgXSxcbiAgICBnZXRUb3BQYXRoczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90cmFmZmljL3BvcHVsYXIvcGF0aHNcIl0sXG4gICAgZ2V0VG9wUmVmZXJyZXJzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RyYWZmaWMvcG9wdWxhci9yZWZlcnJlcnNcIl0sXG4gICAgZ2V0VXNlcnNXaXRoQWNjZXNzVG9Qcm90ZWN0ZWRCcmFuY2g6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy91c2Vyc1wiXG4gICAgXSxcbiAgICBnZXRWaWV3czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90cmFmZmljL3ZpZXdzXCJdLFxuICAgIGdldFdlYmhvb2s6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3Mve2hvb2tfaWR9XCJdLFxuICAgIGdldFdlYmhvb2tDb25maWdGb3JSZXBvOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3Mve2hvb2tfaWR9L2NvbmZpZ1wiXG4gICAgXSxcbiAgICBnZXRXZWJob29rRGVsaXZlcnk6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH0vZGVsaXZlcmllcy97ZGVsaXZlcnlfaWR9XCJcbiAgICBdLFxuICAgIGxpc3RBY3Rpdml0aWVzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGl2aXR5XCJdLFxuICAgIGxpc3RBdXRvbGlua3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYXV0b2xpbmtzXCJdLFxuICAgIGxpc3RCcmFuY2hlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlc1wiXSxcbiAgICBsaXN0QnJhbmNoZXNGb3JIZWFkQ29tbWl0OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97Y29tbWl0X3NoYX0vYnJhbmNoZXMtd2hlcmUtaGVhZFwiXG4gICAgXSxcbiAgICBsaXN0Q29sbGFib3JhdG9yczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2xsYWJvcmF0b3JzXCJdLFxuICAgIGxpc3RDb21tZW50c0ZvckNvbW1pdDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve2NvbW1pdF9zaGF9L2NvbW1lbnRzXCJcbiAgICBdLFxuICAgIGxpc3RDb21taXRDb21tZW50c0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWVudHNcIl0sXG4gICAgbGlzdENvbW1pdFN0YXR1c2VzRm9yUmVmOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97cmVmfS9zdGF0dXNlc1wiXG4gICAgXSxcbiAgICBsaXN0Q29tbWl0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzXCJdLFxuICAgIGxpc3RDb250cmlidXRvcnM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29udHJpYnV0b3JzXCJdLFxuICAgIGxpc3RDdXN0b21EZXBsb3ltZW50UnVsZUludGVncmF0aW9uczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vZGVwbG95bWVudF9wcm90ZWN0aW9uX3J1bGVzL2FwcHNcIlxuICAgIF0sXG4gICAgbGlzdERlcGxveUtleXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30va2V5c1wiXSxcbiAgICBsaXN0RGVwbG95bWVudEJyYW5jaFBvbGljaWVzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9kZXBsb3ltZW50LWJyYW5jaC1wb2xpY2llc1wiXG4gICAgXSxcbiAgICBsaXN0RGVwbG95bWVudFN0YXR1c2VzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwbG95bWVudHMve2RlcGxveW1lbnRfaWR9L3N0YXR1c2VzXCJcbiAgICBdLFxuICAgIGxpc3REZXBsb3ltZW50czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBsb3ltZW50c1wiXSxcbiAgICBsaXN0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9yZXBvc1wiXSxcbiAgICBsaXN0Rm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vcmVwb3NcIl0sXG4gICAgbGlzdEZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9yZXBvc1wiXSxcbiAgICBsaXN0Rm9ya3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZm9ya3NcIl0sXG4gICAgbGlzdEludml0YXRpb25zOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ludml0YXRpb25zXCJdLFxuICAgIGxpc3RJbnZpdGF0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvcmVwb3NpdG9yeV9pbnZpdGF0aW9uc1wiXSxcbiAgICBsaXN0TGFuZ3VhZ2VzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhbmd1YWdlc1wiXSxcbiAgICBsaXN0UGFnZXNCdWlsZHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvYnVpbGRzXCJdLFxuICAgIGxpc3RQdWJsaWM6IFtcIkdFVCAvcmVwb3NpdG9yaWVzXCJdLFxuICAgIGxpc3RQdWxsUmVxdWVzdHNBc3NvY2lhdGVkV2l0aENvbW1pdDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve2NvbW1pdF9zaGF9L3B1bGxzXCJcbiAgICBdLFxuICAgIGxpc3RSZWxlYXNlQXNzZXRzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMve3JlbGVhc2VfaWR9L2Fzc2V0c1wiXG4gICAgXSxcbiAgICBsaXN0UmVsZWFzZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXNcIl0sXG4gICAgbGlzdFRhZ1Byb3RlY3Rpb246IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdGFncy9wcm90ZWN0aW9uXCJdLFxuICAgIGxpc3RUYWdzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RhZ3NcIl0sXG4gICAgbGlzdFRlYW1zOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RlYW1zXCJdLFxuICAgIGxpc3RXZWJob29rRGVsaXZlcmllczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfS9kZWxpdmVyaWVzXCJcbiAgICBdLFxuICAgIGxpc3RXZWJob29rczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rc1wiXSxcbiAgICBtZXJnZTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbWVyZ2VzXCJdLFxuICAgIG1lcmdlVXBzdHJlYW06IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L21lcmdlLXVwc3RyZWFtXCJdLFxuICAgIHBpbmdXZWJob29rOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH0vcGluZ3NcIl0sXG4gICAgcmVkZWxpdmVyV2ViaG9va0RlbGl2ZXJ5OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfS9kZWxpdmVyaWVzL3tkZWxpdmVyeV9pZH0vYXR0ZW1wdHNcIlxuICAgIF0sXG4gICAgcmVtb3ZlQXBwQWNjZXNzUmVzdHJpY3Rpb25zOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnMvYXBwc1wiLFxuICAgICAge30sXG4gICAgICB7IG1hcFRvRGF0YTogXCJhcHBzXCIgfVxuICAgIF0sXG4gICAgcmVtb3ZlQ29sbGFib3JhdG9yOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vY29sbGFib3JhdG9ycy97dXNlcm5hbWV9XCJcbiAgICBdLFxuICAgIHJlbW92ZVN0YXR1c0NoZWNrQ29udGV4dHM6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3N0YXR1c19jaGVja3MvY29udGV4dHNcIixcbiAgICAgIHt9LFxuICAgICAgeyBtYXBUb0RhdGE6IFwiY29udGV4dHNcIiB9XG4gICAgXSxcbiAgICByZW1vdmVTdGF0dXNDaGVja1Byb3RlY3Rpb246IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3N0YXR1c19jaGVja3NcIlxuICAgIF0sXG4gICAgcmVtb3ZlVGVhbUFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL3RlYW1zXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcInRlYW1zXCIgfVxuICAgIF0sXG4gICAgcmVtb3ZlVXNlckFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL3VzZXJzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcInVzZXJzXCIgfVxuICAgIF0sXG4gICAgcmVuYW1lQnJhbmNoOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9yZW5hbWVcIl0sXG4gICAgcmVwbGFjZUFsbFRvcGljczogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90b3BpY3NcIl0sXG4gICAgcmVxdWVzdFBhZ2VzQnVpbGQ6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzL2J1aWxkc1wiXSxcbiAgICBzZXRBZG1pbkJyYW5jaFByb3RlY3Rpb246IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9lbmZvcmNlX2FkbWluc1wiXG4gICAgXSxcbiAgICBzZXRBcHBBY2Nlc3NSZXN0cmljdGlvbnM6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy9hcHBzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcImFwcHNcIiB9XG4gICAgXSxcbiAgICBzZXRTdGF0dXNDaGVja0NvbnRleHRzOiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzL2NvbnRleHRzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcImNvbnRleHRzXCIgfVxuICAgIF0sXG4gICAgc2V0VGVhbUFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL3RlYW1zXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcInRlYW1zXCIgfVxuICAgIF0sXG4gICAgc2V0VXNlckFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL3VzZXJzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcInVzZXJzXCIgfVxuICAgIF0sXG4gICAgdGVzdFB1c2hXZWJob29rOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH0vdGVzdHNcIl0sXG4gICAgdHJhbnNmZXI6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RyYW5zZmVyXCJdLFxuICAgIHVwZGF0ZTogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99XCJdLFxuICAgIHVwZGF0ZUJyYW5jaFByb3RlY3Rpb246IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uXCJcbiAgICBdLFxuICAgIHVwZGF0ZUNvbW1pdENvbW1lbnQ6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgdXBkYXRlRGVwbG95bWVudEJyYW5jaFBvbGljeTogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vZGVwbG95bWVudC1icmFuY2gtcG9saWNpZXMve2JyYW5jaF9wb2xpY3lfaWR9XCJcbiAgICBdLFxuICAgIHVwZGF0ZUluZm9ybWF0aW9uQWJvdXRQYWdlc1NpdGU6IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXNcIl0sXG4gICAgdXBkYXRlSW52aXRhdGlvbjogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vaW52aXRhdGlvbnMve2ludml0YXRpb25faWR9XCJcbiAgICBdLFxuICAgIHVwZGF0ZU9yZ1J1bGVzZXQ6IFtcIlBVVCAvb3Jncy97b3JnfS9ydWxlc2V0cy97cnVsZXNldF9pZH1cIl0sXG4gICAgdXBkYXRlUHVsbFJlcXVlc3RSZXZpZXdQcm90ZWN0aW9uOiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3B1bGxfcmVxdWVzdF9yZXZpZXdzXCJcbiAgICBdLFxuICAgIHVwZGF0ZVJlbGVhc2U6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy97cmVsZWFzZV9pZH1cIl0sXG4gICAgdXBkYXRlUmVsZWFzZUFzc2V0OiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy9hc3NldHMve2Fzc2V0X2lkfVwiXG4gICAgXSxcbiAgICB1cGRhdGVSZXBvUnVsZXNldDogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cy97cnVsZXNldF9pZH1cIl0sXG4gICAgdXBkYXRlU3RhdHVzQ2hlY2tQb3RlY3Rpb246IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc3RhdHVzX2NoZWNrc1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInJlcG9zXCIsIFwidXBkYXRlU3RhdHVzQ2hlY2tQcm90ZWN0aW9uXCJdIH1cbiAgICBdLFxuICAgIHVwZGF0ZVN0YXR1c0NoZWNrUHJvdGVjdGlvbjogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzXCJcbiAgICBdLFxuICAgIHVwZGF0ZVdlYmhvb2s6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH1cIl0sXG4gICAgdXBkYXRlV2ViaG9va0NvbmZpZ0ZvclJlcG86IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfS9jb25maWdcIlxuICAgIF0sXG4gICAgdXBsb2FkUmVsZWFzZUFzc2V0OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfS9hc3NldHN7P25hbWUsbGFiZWx9XCIsXG4gICAgICB7IGJhc2VVcmw6IFwiaHR0cHM6Ly91cGxvYWRzLmdpdGh1Yi5jb21cIiB9XG4gICAgXVxuICB9LFxuICBzZWFyY2g6IHtcbiAgICBjb2RlOiBbXCJHRVQgL3NlYXJjaC9jb2RlXCJdLFxuICAgIGNvbW1pdHM6IFtcIkdFVCAvc2VhcmNoL2NvbW1pdHNcIl0sXG4gICAgaXNzdWVzQW5kUHVsbFJlcXVlc3RzOiBbXCJHRVQgL3NlYXJjaC9pc3N1ZXNcIl0sXG4gICAgbGFiZWxzOiBbXCJHRVQgL3NlYXJjaC9sYWJlbHNcIl0sXG4gICAgcmVwb3M6IFtcIkdFVCAvc2VhcmNoL3JlcG9zaXRvcmllc1wiXSxcbiAgICB0b3BpY3M6IFtcIkdFVCAvc2VhcmNoL3RvcGljc1wiXSxcbiAgICB1c2VyczogW1wiR0VUIC9zZWFyY2gvdXNlcnNcIl1cbiAgfSxcbiAgc2VjcmV0U2Nhbm5pbmc6IHtcbiAgICBnZXRBbGVydDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3JldC1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn1cIlxuICAgIF0sXG4gICAgbGlzdEFsZXJ0c0ZvckVudGVycHJpc2U6IFtcbiAgICAgIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0c1wiXG4gICAgXSxcbiAgICBsaXN0QWxlcnRzRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0c1wiXSxcbiAgICBsaXN0QWxlcnRzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zZWNyZXQtc2Nhbm5pbmcvYWxlcnRzXCJdLFxuICAgIGxpc3RMb2NhdGlvbnNGb3JBbGVydDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3JldC1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn0vbG9jYXRpb25zXCJcbiAgICBdLFxuICAgIHVwZGF0ZUFsZXJ0OiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zZWNyZXQtc2Nhbm5pbmcvYWxlcnRzL3thbGVydF9udW1iZXJ9XCJcbiAgICBdXG4gIH0sXG4gIHNlY3VyaXR5QWR2aXNvcmllczoge1xuICAgIGNyZWF0ZUZvcms6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vc2VjdXJpdHktYWR2aXNvcmllcy97Z2hzYV9pZH0vZm9ya3NcIlxuICAgIF0sXG4gICAgY3JlYXRlUHJpdmF0ZVZ1bG5lcmFiaWxpdHlSZXBvcnQ6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vc2VjdXJpdHktYWR2aXNvcmllcy9yZXBvcnRzXCJcbiAgICBdLFxuICAgIGNyZWF0ZVJlcG9zaXRvcnlBZHZpc29yeTogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zZWN1cml0eS1hZHZpc29yaWVzXCJcbiAgICBdLFxuICAgIGNyZWF0ZVJlcG9zaXRvcnlBZHZpc29yeUN2ZVJlcXVlc3Q6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vc2VjdXJpdHktYWR2aXNvcmllcy97Z2hzYV9pZH0vY3ZlXCJcbiAgICBdLFxuICAgIGdldEdsb2JhbEFkdmlzb3J5OiBbXCJHRVQgL2Fkdmlzb3JpZXMve2doc2FfaWR9XCJdLFxuICAgIGdldFJlcG9zaXRvcnlBZHZpc29yeTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3VyaXR5LWFkdmlzb3JpZXMve2doc2FfaWR9XCJcbiAgICBdLFxuICAgIGxpc3RHbG9iYWxBZHZpc29yaWVzOiBbXCJHRVQgL2Fkdmlzb3JpZXNcIl0sXG4gICAgbGlzdE9yZ1JlcG9zaXRvcnlBZHZpc29yaWVzOiBbXCJHRVQgL29yZ3Mve29yZ30vc2VjdXJpdHktYWR2aXNvcmllc1wiXSxcbiAgICBsaXN0UmVwb3NpdG9yeUFkdmlzb3JpZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc2VjdXJpdHktYWR2aXNvcmllc1wiXSxcbiAgICB1cGRhdGVSZXBvc2l0b3J5QWR2aXNvcnk6IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3VyaXR5LWFkdmlzb3JpZXMve2doc2FfaWR9XCJcbiAgICBdXG4gIH0sXG4gIHRlYW1zOiB7XG4gICAgYWRkT3JVcGRhdGVNZW1iZXJzaGlwRm9yVXNlckluT3JnOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9tZW1iZXJzaGlwcy97dXNlcm5hbWV9XCJcbiAgICBdLFxuICAgIGFkZE9yVXBkYXRlUHJvamVjdFBlcm1pc3Npb25zSW5Pcmc6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3Byb2plY3RzL3twcm9qZWN0X2lkfVwiXG4gICAgXSxcbiAgICBhZGRPclVwZGF0ZVJlcG9QZXJtaXNzaW9uc0luT3JnOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9yZXBvcy97b3duZXJ9L3tyZXBvfVwiXG4gICAgXSxcbiAgICBjaGVja1Blcm1pc3Npb25zRm9yUHJvamVjdEluT3JnOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9wcm9qZWN0cy97cHJvamVjdF9pZH1cIlxuICAgIF0sXG4gICAgY2hlY2tQZXJtaXNzaW9uc0ZvclJlcG9Jbk9yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcmVwb3Mve293bmVyfS97cmVwb31cIlxuICAgIF0sXG4gICAgY3JlYXRlOiBbXCJQT1NUIC9vcmdzL3tvcmd9L3RlYW1zXCJdLFxuICAgIGNyZWF0ZURpc2N1c3Npb25Db21tZW50SW5Pcmc6IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzXCJcbiAgICBdLFxuICAgIGNyZWF0ZURpc2N1c3Npb25Jbk9yZzogW1wiUE9TVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9uc1wiXSxcbiAgICBkZWxldGVEaXNjdXNzaW9uQ29tbWVudEluT3JnOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X251bWJlcn1cIlxuICAgIF0sXG4gICAgZGVsZXRlRGlzY3Vzc2lvbkluT3JnOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9XCJcbiAgICBdLFxuICAgIGRlbGV0ZUluT3JnOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z31cIl0sXG4gICAgZ2V0QnlOYW1lOiBbXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z31cIl0sXG4gICAgZ2V0RGlzY3Vzc2lvbkNvbW1lbnRJbk9yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9jb21tZW50cy97Y29tbWVudF9udW1iZXJ9XCJcbiAgICBdLFxuICAgIGdldERpc2N1c3Npb25Jbk9yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfVwiXG4gICAgXSxcbiAgICBnZXRNZW1iZXJzaGlwRm9yVXNlckluT3JnOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9tZW1iZXJzaGlwcy97dXNlcm5hbWV9XCJcbiAgICBdLFxuICAgIGxpc3Q6IFtcIkdFVCAvb3Jncy97b3JnfS90ZWFtc1wiXSxcbiAgICBsaXN0Q2hpbGRJbk9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3RlYW1zXCJdLFxuICAgIGxpc3REaXNjdXNzaW9uQ29tbWVudHNJbk9yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9jb21tZW50c1wiXG4gICAgXSxcbiAgICBsaXN0RGlzY3Vzc2lvbnNJbk9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zXCJdLFxuICAgIGxpc3RGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3RlYW1zXCJdLFxuICAgIGxpc3RNZW1iZXJzSW5Pcmc6IFtcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9tZW1iZXJzXCJdLFxuICAgIGxpc3RQZW5kaW5nSW52aXRhdGlvbnNJbk9yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vaW52aXRhdGlvbnNcIlxuICAgIF0sXG4gICAgbGlzdFByb2plY3RzSW5Pcmc6IFtcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9wcm9qZWN0c1wiXSxcbiAgICBsaXN0UmVwb3NJbk9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3JlcG9zXCJdLFxuICAgIHJlbW92ZU1lbWJlcnNoaXBGb3JVc2VySW5Pcmc6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L21lbWJlcnNoaXBzL3t1c2VybmFtZX1cIlxuICAgIF0sXG4gICAgcmVtb3ZlUHJvamVjdEluT3JnOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9wcm9qZWN0cy97cHJvamVjdF9pZH1cIlxuICAgIF0sXG4gICAgcmVtb3ZlUmVwb0luT3JnOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9yZXBvcy97b3duZXJ9L3tyZXBvfVwiXG4gICAgXSxcbiAgICB1cGRhdGVEaXNjdXNzaW9uQ29tbWVudEluT3JnOiBbXG4gICAgICBcIlBBVENIIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfbnVtYmVyfVwiXG4gICAgXSxcbiAgICB1cGRhdGVEaXNjdXNzaW9uSW5Pcmc6IFtcbiAgICAgIFwiUEFUQ0ggL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfVwiXG4gICAgXSxcbiAgICB1cGRhdGVJbk9yZzogW1wiUEFUQ0ggL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z31cIl1cbiAgfSxcbiAgdXNlcnM6IHtcbiAgICBhZGRFbWFpbEZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiUE9TVCAvdXNlci9lbWFpbHNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImFkZEVtYWlsRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgYWRkRW1haWxGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9lbWFpbHNcIl0sXG4gICAgYWRkU29jaWFsQWNjb3VudEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQT1NUIC91c2VyL3NvY2lhbF9hY2NvdW50c1wiXSxcbiAgICBibG9jazogW1wiUFVUIC91c2VyL2Jsb2Nrcy97dXNlcm5hbWV9XCJdLFxuICAgIGNoZWNrQmxvY2tlZDogW1wiR0VUIC91c2VyL2Jsb2Nrcy97dXNlcm5hbWV9XCJdLFxuICAgIGNoZWNrRm9sbG93aW5nRm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L2ZvbGxvd2luZy97dGFyZ2V0X3VzZXJ9XCJdLFxuICAgIGNoZWNrUGVyc29uSXNGb2xsb3dlZEJ5QXV0aGVudGljYXRlZDogW1wiR0VUIC91c2VyL2ZvbGxvd2luZy97dXNlcm5hbWV9XCJdLFxuICAgIGNyZWF0ZUdwZ0tleUZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiUE9TVCAvdXNlci9ncGdfa2V5c1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwiY3JlYXRlR3BnS2V5Rm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgY3JlYXRlR3BnS2V5Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBPU1QgL3VzZXIvZ3BnX2tleXNcIl0sXG4gICAgY3JlYXRlUHVibGljU3NoS2V5Rm9yQXV0aGVudGljYXRlZDogW1xuICAgICAgXCJQT1NUIC91c2VyL2tleXNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImNyZWF0ZVB1YmxpY1NzaEtleUZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGNyZWF0ZVB1YmxpY1NzaEtleUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQT1NUIC91c2VyL2tleXNcIl0sXG4gICAgY3JlYXRlU3NoU2lnbmluZ0tleUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQT1NUIC91c2VyL3NzaF9zaWduaW5nX2tleXNcIl0sXG4gICAgZGVsZXRlRW1haWxGb3JBdXRoZW50aWNhdGVkOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9lbWFpbHNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImRlbGV0ZUVtYWlsRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgZGVsZXRlRW1haWxGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiREVMRVRFIC91c2VyL2VtYWlsc1wiXSxcbiAgICBkZWxldGVHcGdLZXlGb3JBdXRoZW50aWNhdGVkOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9ncGdfa2V5cy97Z3BnX2tleV9pZH1cIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImRlbGV0ZUdwZ0tleUZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGRlbGV0ZUdwZ0tleUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJERUxFVEUgL3VzZXIvZ3BnX2tleXMve2dwZ19rZXlfaWR9XCJdLFxuICAgIGRlbGV0ZVB1YmxpY1NzaEtleUZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiREVMRVRFIC91c2VyL2tleXMve2tleV9pZH1cIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImRlbGV0ZVB1YmxpY1NzaEtleUZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGRlbGV0ZVB1YmxpY1NzaEtleUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJERUxFVEUgL3VzZXIva2V5cy97a2V5X2lkfVwiXSxcbiAgICBkZWxldGVTb2NpYWxBY2NvdW50Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkRFTEVURSAvdXNlci9zb2NpYWxfYWNjb3VudHNcIl0sXG4gICAgZGVsZXRlU3NoU2lnbmluZ0tleUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9zc2hfc2lnbmluZ19rZXlzL3tzc2hfc2lnbmluZ19rZXlfaWR9XCJcbiAgICBdLFxuICAgIGZvbGxvdzogW1wiUFVUIC91c2VyL2ZvbGxvd2luZy97dXNlcm5hbWV9XCJdLFxuICAgIGdldEF1dGhlbnRpY2F0ZWQ6IFtcIkdFVCAvdXNlclwiXSxcbiAgICBnZXRCeVVzZXJuYW1lOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX1cIl0sXG4gICAgZ2V0Q29udGV4dEZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9ob3ZlcmNhcmRcIl0sXG4gICAgZ2V0R3BnS2V5Rm9yQXV0aGVudGljYXRlZDogW1xuICAgICAgXCJHRVQgL3VzZXIvZ3BnX2tleXMve2dwZ19rZXlfaWR9XCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJnZXRHcGdLZXlGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBnZXRHcGdLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2dwZ19rZXlzL3tncGdfa2V5X2lkfVwiXSxcbiAgICBnZXRQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkOiBbXG4gICAgICBcIkdFVCAvdXNlci9rZXlzL3trZXlfaWR9XCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJnZXRQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBnZXRQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2tleXMve2tleV9pZH1cIl0sXG4gICAgZ2V0U3NoU2lnbmluZ0tleUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlci9zc2hfc2lnbmluZ19rZXlzL3tzc2hfc2lnbmluZ19rZXlfaWR9XCJcbiAgICBdLFxuICAgIGxpc3Q6IFtcIkdFVCAvdXNlcnNcIl0sXG4gICAgbGlzdEJsb2NrZWRCeUF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiR0VUIC91c2VyL2Jsb2Nrc1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwibGlzdEJsb2NrZWRCeUF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGxpc3RCbG9ja2VkQnlBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2Jsb2Nrc1wiXSxcbiAgICBsaXN0RW1haWxzRm9yQXV0aGVudGljYXRlZDogW1xuICAgICAgXCJHRVQgL3VzZXIvZW1haWxzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJsaXN0RW1haWxzRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgbGlzdEVtYWlsc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvZW1haWxzXCJdLFxuICAgIGxpc3RGb2xsb3dlZEJ5QXV0aGVudGljYXRlZDogW1xuICAgICAgXCJHRVQgL3VzZXIvZm9sbG93aW5nXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJsaXN0Rm9sbG93ZWRCeUF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGxpc3RGb2xsb3dlZEJ5QXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9mb2xsb3dpbmdcIl0sXG4gICAgbGlzdEZvbGxvd2Vyc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvZm9sbG93ZXJzXCJdLFxuICAgIGxpc3RGb2xsb3dlcnNGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZm9sbG93ZXJzXCJdLFxuICAgIGxpc3RGb2xsb3dpbmdGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZm9sbG93aW5nXCJdLFxuICAgIGxpc3RHcGdLZXlzRm9yQXV0aGVudGljYXRlZDogW1xuICAgICAgXCJHRVQgL3VzZXIvZ3BnX2tleXNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImxpc3RHcGdLZXlzRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgbGlzdEdwZ0tleXNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2dwZ19rZXlzXCJdLFxuICAgIGxpc3RHcGdLZXlzRm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L2dwZ19rZXlzXCJdLFxuICAgIGxpc3RQdWJsaWNFbWFpbHNGb3JBdXRoZW50aWNhdGVkOiBbXG4gICAgICBcIkdFVCAvdXNlci9wdWJsaWNfZW1haWxzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJsaXN0UHVibGljRW1haWxzRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgbGlzdFB1YmxpY0VtYWlsc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvcHVibGljX2VtYWlsc1wiXSxcbiAgICBsaXN0UHVibGljS2V5c0ZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9rZXlzXCJdLFxuICAgIGxpc3RQdWJsaWNTc2hLZXlzRm9yQXV0aGVudGljYXRlZDogW1xuICAgICAgXCJHRVQgL3VzZXIva2V5c1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwibGlzdFB1YmxpY1NzaEtleXNGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBsaXN0UHVibGljU3NoS2V5c0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIva2V5c1wiXSxcbiAgICBsaXN0U29jaWFsQWNjb3VudHNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3NvY2lhbF9hY2NvdW50c1wiXSxcbiAgICBsaXN0U29jaWFsQWNjb3VudHNGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc29jaWFsX2FjY291bnRzXCJdLFxuICAgIGxpc3RTc2hTaWduaW5nS2V5c0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvc3NoX3NpZ25pbmdfa2V5c1wiXSxcbiAgICBsaXN0U3NoU2lnbmluZ0tleXNGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc3NoX3NpZ25pbmdfa2V5c1wiXSxcbiAgICBzZXRQcmltYXJ5RW1haWxWaXNpYmlsaXR5Rm9yQXV0aGVudGljYXRlZDogW1xuICAgICAgXCJQQVRDSCAvdXNlci9lbWFpbC92aXNpYmlsaXR5XCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJzZXRQcmltYXJ5RW1haWxWaXNpYmlsaXR5Rm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgc2V0UHJpbWFyeUVtYWlsVmlzaWJpbGl0eUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIlBBVENIIC91c2VyL2VtYWlsL3Zpc2liaWxpdHlcIlxuICAgIF0sXG4gICAgdW5ibG9jazogW1wiREVMRVRFIC91c2VyL2Jsb2Nrcy97dXNlcm5hbWV9XCJdLFxuICAgIHVuZm9sbG93OiBbXCJERUxFVEUgL3VzZXIvZm9sbG93aW5nL3t1c2VybmFtZX1cIl0sXG4gICAgdXBkYXRlQXV0aGVudGljYXRlZDogW1wiUEFUQ0ggL3VzZXJcIl1cbiAgfVxufTtcbnZhciBlbmRwb2ludHNfZGVmYXVsdCA9IEVuZHBvaW50cztcbmV4cG9ydCB7XG4gIGVuZHBvaW50c19kZWZhdWx0IGFzIGRlZmF1bHRcbn07XG4iLCJpbXBvcnQgRU5EUE9JTlRTIGZyb20gXCIuL2dlbmVyYXRlZC9lbmRwb2ludHMuanNcIjtcbmNvbnN0IGVuZHBvaW50TWV0aG9kc01hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5mb3IgKGNvbnN0IFtzY29wZSwgZW5kcG9pbnRzXSBvZiBPYmplY3QuZW50cmllcyhFTkRQT0lOVFMpKSB7XG4gIGZvciAoY29uc3QgW21ldGhvZE5hbWUsIGVuZHBvaW50XSBvZiBPYmplY3QuZW50cmllcyhlbmRwb2ludHMpKSB7XG4gICAgY29uc3QgW3JvdXRlLCBkZWZhdWx0cywgZGVjb3JhdGlvbnNdID0gZW5kcG9pbnQ7XG4gICAgY29uc3QgW21ldGhvZCwgdXJsXSA9IHJvdXRlLnNwbGl0KC8gLyk7XG4gICAgY29uc3QgZW5kcG9pbnREZWZhdWx0cyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7XG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgdXJsXG4gICAgICB9LFxuICAgICAgZGVmYXVsdHNcbiAgICApO1xuICAgIGlmICghZW5kcG9pbnRNZXRob2RzTWFwLmhhcyhzY29wZSkpIHtcbiAgICAgIGVuZHBvaW50TWV0aG9kc01hcC5zZXQoc2NvcGUsIC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCkpO1xuICAgIH1cbiAgICBlbmRwb2ludE1ldGhvZHNNYXAuZ2V0KHNjb3BlKS5zZXQobWV0aG9kTmFtZSwge1xuICAgICAgc2NvcGUsXG4gICAgICBtZXRob2ROYW1lLFxuICAgICAgZW5kcG9pbnREZWZhdWx0cyxcbiAgICAgIGRlY29yYXRpb25zXG4gICAgfSk7XG4gIH1cbn1cbmNvbnN0IGhhbmRsZXIgPSB7XG4gIGhhcyh7IHNjb3BlIH0sIG1ldGhvZE5hbWUpIHtcbiAgICByZXR1cm4gZW5kcG9pbnRNZXRob2RzTWFwLmdldChzY29wZSkuaGFzKG1ldGhvZE5hbWUpO1xuICB9LFxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBtZXRob2ROYW1lKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiB0aGlzLmdldCh0YXJnZXQsIG1ldGhvZE5hbWUpLFxuICAgICAgLy8gZW5zdXJlcyBtZXRob2QgaXMgaW4gdGhlIGNhY2hlXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICB9O1xuICB9LFxuICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIG1ldGhvZE5hbWUsIGRlc2NyaXB0b3IpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LmNhY2hlLCBtZXRob2ROYW1lLCBkZXNjcmlwdG9yKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBtZXRob2ROYW1lKSB7XG4gICAgZGVsZXRlIHRhcmdldC5jYWNoZVttZXRob2ROYW1lXTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgb3duS2V5cyh7IHNjb3BlIH0pIHtcbiAgICByZXR1cm4gWy4uLmVuZHBvaW50TWV0aG9kc01hcC5nZXQoc2NvcGUpLmtleXMoKV07XG4gIH0sXG4gIHNldCh0YXJnZXQsIG1ldGhvZE5hbWUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRhcmdldC5jYWNoZVttZXRob2ROYW1lXSA9IHZhbHVlO1xuICB9LFxuICBnZXQoeyBvY3Rva2l0LCBzY29wZSwgY2FjaGUgfSwgbWV0aG9kTmFtZSkge1xuICAgIGlmIChjYWNoZVttZXRob2ROYW1lXSkge1xuICAgICAgcmV0dXJuIGNhY2hlW21ldGhvZE5hbWVdO1xuICAgIH1cbiAgICBjb25zdCBtZXRob2QgPSBlbmRwb2ludE1ldGhvZHNNYXAuZ2V0KHNjb3BlKS5nZXQobWV0aG9kTmFtZSk7XG4gICAgaWYgKCFtZXRob2QpIHtcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuICAgIGNvbnN0IHsgZW5kcG9pbnREZWZhdWx0cywgZGVjb3JhdGlvbnMgfSA9IG1ldGhvZDtcbiAgICBpZiAoZGVjb3JhdGlvbnMpIHtcbiAgICAgIGNhY2hlW21ldGhvZE5hbWVdID0gZGVjb3JhdGUoXG4gICAgICAgIG9jdG9raXQsXG4gICAgICAgIHNjb3BlLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBlbmRwb2ludERlZmF1bHRzLFxuICAgICAgICBkZWNvcmF0aW9uc1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FjaGVbbWV0aG9kTmFtZV0gPSBvY3Rva2l0LnJlcXVlc3QuZGVmYXVsdHMoZW5kcG9pbnREZWZhdWx0cyk7XG4gICAgfVxuICAgIHJldHVybiBjYWNoZVttZXRob2ROYW1lXTtcbiAgfVxufTtcbmZ1bmN0aW9uIGVuZHBvaW50c1RvTWV0aG9kcyhvY3Rva2l0KSB7XG4gIGNvbnN0IG5ld01ldGhvZHMgPSB7fTtcbiAgZm9yIChjb25zdCBzY29wZSBvZiBlbmRwb2ludE1ldGhvZHNNYXAua2V5cygpKSB7XG4gICAgbmV3TWV0aG9kc1tzY29wZV0gPSBuZXcgUHJveHkoeyBvY3Rva2l0LCBzY29wZSwgY2FjaGU6IHt9IH0sIGhhbmRsZXIpO1xuICB9XG4gIHJldHVybiBuZXdNZXRob2RzO1xufVxuZnVuY3Rpb24gZGVjb3JhdGUob2N0b2tpdCwgc2NvcGUsIG1ldGhvZE5hbWUsIGRlZmF1bHRzLCBkZWNvcmF0aW9ucykge1xuICBjb25zdCByZXF1ZXN0V2l0aERlZmF1bHRzID0gb2N0b2tpdC5yZXF1ZXN0LmRlZmF1bHRzKGRlZmF1bHRzKTtcbiAgZnVuY3Rpb24gd2l0aERlY29yYXRpb25zKC4uLmFyZ3MpIHtcbiAgICBsZXQgb3B0aW9ucyA9IHJlcXVlc3RXaXRoRGVmYXVsdHMuZW5kcG9pbnQubWVyZ2UoLi4uYXJncyk7XG4gICAgaWYgKGRlY29yYXRpb25zLm1hcFRvRGF0YSkge1xuICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMsIHtcbiAgICAgICAgZGF0YTogb3B0aW9uc1tkZWNvcmF0aW9ucy5tYXBUb0RhdGFdLFxuICAgICAgICBbZGVjb3JhdGlvbnMubWFwVG9EYXRhXTogdm9pZCAwXG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXF1ZXN0V2l0aERlZmF1bHRzKG9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoZGVjb3JhdGlvbnMucmVuYW1lZCkge1xuICAgICAgY29uc3QgW25ld1Njb3BlLCBuZXdNZXRob2ROYW1lXSA9IGRlY29yYXRpb25zLnJlbmFtZWQ7XG4gICAgICBvY3Rva2l0LmxvZy53YXJuKFxuICAgICAgICBgb2N0b2tpdC4ke3Njb3BlfS4ke21ldGhvZE5hbWV9KCkgaGFzIGJlZW4gcmVuYW1lZCB0byBvY3Rva2l0LiR7bmV3U2NvcGV9LiR7bmV3TWV0aG9kTmFtZX0oKWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChkZWNvcmF0aW9ucy5kZXByZWNhdGVkKSB7XG4gICAgICBvY3Rva2l0LmxvZy53YXJuKGRlY29yYXRpb25zLmRlcHJlY2F0ZWQpO1xuICAgIH1cbiAgICBpZiAoZGVjb3JhdGlvbnMucmVuYW1lZFBhcmFtZXRlcnMpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMyID0gcmVxdWVzdFdpdGhEZWZhdWx0cy5lbmRwb2ludC5tZXJnZSguLi5hcmdzKTtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIGFsaWFzXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgICAgZGVjb3JhdGlvbnMucmVuYW1lZFBhcmFtZXRlcnNcbiAgICAgICkpIHtcbiAgICAgICAgaWYgKG5hbWUgaW4gb3B0aW9uczIpIHtcbiAgICAgICAgICBvY3Rva2l0LmxvZy53YXJuKFxuICAgICAgICAgICAgYFwiJHtuYW1lfVwiIHBhcmFtZXRlciBpcyBkZXByZWNhdGVkIGZvciBcIm9jdG9raXQuJHtzY29wZX0uJHttZXRob2ROYW1lfSgpXCIuIFVzZSBcIiR7YWxpYXN9XCIgaW5zdGVhZGBcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghKGFsaWFzIGluIG9wdGlvbnMyKSkge1xuICAgICAgICAgICAgb3B0aW9uczJbYWxpYXNdID0gb3B0aW9uczJbbmFtZV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlbGV0ZSBvcHRpb25zMltuYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcXVlc3RXaXRoRGVmYXVsdHMob3B0aW9uczIpO1xuICAgIH1cbiAgICByZXR1cm4gcmVxdWVzdFdpdGhEZWZhdWx0cyguLi5hcmdzKTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmFzc2lnbih3aXRoRGVjb3JhdGlvbnMsIHJlcXVlc3RXaXRoRGVmYXVsdHMpO1xufVxuZXhwb3J0IHtcbiAgZW5kcG9pbnRzVG9NZXRob2RzXG59O1xuIiwiaW1wb3J0IHsgVkVSU0lPTiB9IGZyb20gXCIuL3ZlcnNpb24uanNcIjtcbmltcG9ydCB7IGVuZHBvaW50c1RvTWV0aG9kcyB9IGZyb20gXCIuL2VuZHBvaW50cy10by1tZXRob2RzLmpzXCI7XG5mdW5jdGlvbiByZXN0RW5kcG9pbnRNZXRob2RzKG9jdG9raXQpIHtcbiAgY29uc3QgYXBpID0gZW5kcG9pbnRzVG9NZXRob2RzKG9jdG9raXQpO1xuICByZXR1cm4ge1xuICAgIHJlc3Q6IGFwaVxuICB9O1xufVxucmVzdEVuZHBvaW50TWV0aG9kcy5WRVJTSU9OID0gVkVSU0lPTjtcbmZ1bmN0aW9uIGxlZ2FjeVJlc3RFbmRwb2ludE1ldGhvZHMob2N0b2tpdCkge1xuICBjb25zdCBhcGkgPSBlbmRwb2ludHNUb01ldGhvZHMob2N0b2tpdCk7XG4gIHJldHVybiB7XG4gICAgLi4uYXBpLFxuICAgIHJlc3Q6IGFwaVxuICB9O1xufVxubGVnYWN5UmVzdEVuZHBvaW50TWV0aG9kcy5WRVJTSU9OID0gVkVSU0lPTjtcbmV4cG9ydCB7XG4gIGxlZ2FjeVJlc3RFbmRwb2ludE1ldGhvZHMsXG4gIHJlc3RFbmRwb2ludE1ldGhvZHNcbn07XG4iLCIvLyBwa2cvZGlzdC1zcmMvdmVyc2lvbi5qc1xudmFyIFZFUlNJT04gPSBcIjkuMi4yXCI7XG5cbi8vIHBrZy9kaXN0LXNyYy9ub3JtYWxpemUtcGFnaW5hdGVkLWxpc3QtcmVzcG9uc2UuanNcbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhZ2luYXRlZExpc3RSZXNwb25zZShyZXNwb25zZSkge1xuICBpZiAoIXJlc3BvbnNlLmRhdGEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVzcG9uc2UsXG4gICAgICBkYXRhOiBbXVxuICAgIH07XG4gIH1cbiAgY29uc3QgcmVzcG9uc2VOZWVkc05vcm1hbGl6YXRpb24gPSBcInRvdGFsX2NvdW50XCIgaW4gcmVzcG9uc2UuZGF0YSAmJiAhKFwidXJsXCIgaW4gcmVzcG9uc2UuZGF0YSk7XG4gIGlmICghcmVzcG9uc2VOZWVkc05vcm1hbGl6YXRpb24pXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICBjb25zdCBpbmNvbXBsZXRlUmVzdWx0cyA9IHJlc3BvbnNlLmRhdGEuaW5jb21wbGV0ZV9yZXN1bHRzO1xuICBjb25zdCByZXBvc2l0b3J5U2VsZWN0aW9uID0gcmVzcG9uc2UuZGF0YS5yZXBvc2l0b3J5X3NlbGVjdGlvbjtcbiAgY29uc3QgdG90YWxDb3VudCA9IHJlc3BvbnNlLmRhdGEudG90YWxfY291bnQ7XG4gIGRlbGV0ZSByZXNwb25zZS5kYXRhLmluY29tcGxldGVfcmVzdWx0cztcbiAgZGVsZXRlIHJlc3BvbnNlLmRhdGEucmVwb3NpdG9yeV9zZWxlY3Rpb247XG4gIGRlbGV0ZSByZXNwb25zZS5kYXRhLnRvdGFsX2NvdW50O1xuICBjb25zdCBuYW1lc3BhY2VLZXkgPSBPYmplY3Qua2V5cyhyZXNwb25zZS5kYXRhKVswXTtcbiAgY29uc3QgZGF0YSA9IHJlc3BvbnNlLmRhdGFbbmFtZXNwYWNlS2V5XTtcbiAgcmVzcG9uc2UuZGF0YSA9IGRhdGE7XG4gIGlmICh0eXBlb2YgaW5jb21wbGV0ZVJlc3VsdHMgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXNwb25zZS5kYXRhLmluY29tcGxldGVfcmVzdWx0cyA9IGluY29tcGxldGVSZXN1bHRzO1xuICB9XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeVNlbGVjdGlvbiAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJlc3BvbnNlLmRhdGEucmVwb3NpdG9yeV9zZWxlY3Rpb24gPSByZXBvc2l0b3J5U2VsZWN0aW9uO1xuICB9XG4gIHJlc3BvbnNlLmRhdGEudG90YWxfY291bnQgPSB0b3RhbENvdW50O1xuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbi8vIHBrZy9kaXN0LXNyYy9pdGVyYXRvci5qc1xuZnVuY3Rpb24gaXRlcmF0b3Iob2N0b2tpdCwgcm91dGUsIHBhcmFtZXRlcnMpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHR5cGVvZiByb3V0ZSA9PT0gXCJmdW5jdGlvblwiID8gcm91dGUuZW5kcG9pbnQocGFyYW1ldGVycykgOiBvY3Rva2l0LnJlcXVlc3QuZW5kcG9pbnQocm91dGUsIHBhcmFtZXRlcnMpO1xuICBjb25zdCByZXF1ZXN0TWV0aG9kID0gdHlwZW9mIHJvdXRlID09PSBcImZ1bmN0aW9uXCIgPyByb3V0ZSA6IG9jdG9raXQucmVxdWVzdDtcbiAgY29uc3QgbWV0aG9kID0gb3B0aW9ucy5tZXRob2Q7XG4gIGNvbnN0IGhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnM7XG4gIGxldCB1cmwgPSBvcHRpb25zLnVybDtcbiAgcmV0dXJuIHtcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiAoe1xuICAgICAgYXN5bmMgbmV4dCgpIHtcbiAgICAgICAgaWYgKCF1cmwpXG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdE1ldGhvZCh7IG1ldGhvZCwgdXJsLCBoZWFkZXJzIH0pO1xuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRSZXNwb25zZSA9IG5vcm1hbGl6ZVBhZ2luYXRlZExpc3RSZXNwb25zZShyZXNwb25zZSk7XG4gICAgICAgICAgdXJsID0gKChub3JtYWxpemVkUmVzcG9uc2UuaGVhZGVycy5saW5rIHx8IFwiXCIpLm1hdGNoKFxuICAgICAgICAgICAgLzwoW148Pl0rKT47XFxzKnJlbD1cIm5leHRcIi9cbiAgICAgICAgICApIHx8IFtdKVsxXTtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbm9ybWFsaXplZFJlc3BvbnNlIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyAhPT0gNDA5KVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgdXJsID0gXCJcIjtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICAgICAgICBkYXRhOiBbXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9O1xufVxuXG4vLyBwa2cvZGlzdC1zcmMvcGFnaW5hdGUuanNcbmZ1bmN0aW9uIHBhZ2luYXRlKG9jdG9raXQsIHJvdXRlLCBwYXJhbWV0ZXJzLCBtYXBGbikge1xuICBpZiAodHlwZW9mIHBhcmFtZXRlcnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIG1hcEZuID0gcGFyYW1ldGVycztcbiAgICBwYXJhbWV0ZXJzID0gdm9pZCAwO1xuICB9XG4gIHJldHVybiBnYXRoZXIoXG4gICAgb2N0b2tpdCxcbiAgICBbXSxcbiAgICBpdGVyYXRvcihvY3Rva2l0LCByb3V0ZSwgcGFyYW1ldGVycylbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCksXG4gICAgbWFwRm5cbiAgKTtcbn1cbmZ1bmN0aW9uIGdhdGhlcihvY3Rva2l0LCByZXN1bHRzLCBpdGVyYXRvcjIsIG1hcEZuKSB7XG4gIHJldHVybiBpdGVyYXRvcjIubmV4dCgpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuICAgIGxldCBlYXJseUV4aXQgPSBmYWxzZTtcbiAgICBmdW5jdGlvbiBkb25lKCkge1xuICAgICAgZWFybHlFeGl0ID0gdHJ1ZTtcbiAgICB9XG4gICAgcmVzdWx0cyA9IHJlc3VsdHMuY29uY2F0KFxuICAgICAgbWFwRm4gPyBtYXBGbihyZXN1bHQudmFsdWUsIGRvbmUpIDogcmVzdWx0LnZhbHVlLmRhdGFcbiAgICApO1xuICAgIGlmIChlYXJseUV4aXQpIHtcbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cbiAgICByZXR1cm4gZ2F0aGVyKG9jdG9raXQsIHJlc3VsdHMsIGl0ZXJhdG9yMiwgbWFwRm4pO1xuICB9KTtcbn1cblxuLy8gcGtnL2Rpc3Qtc3JjL2NvbXBvc2UtcGFnaW5hdGUuanNcbnZhciBjb21wb3NlUGFnaW5hdGVSZXN0ID0gT2JqZWN0LmFzc2lnbihwYWdpbmF0ZSwge1xuICBpdGVyYXRvclxufSk7XG5cbi8vIHBrZy9kaXN0LXNyYy9nZW5lcmF0ZWQvcGFnaW5hdGluZy1lbmRwb2ludHMuanNcbnZhciBwYWdpbmF0aW5nRW5kcG9pbnRzID0gW1xuICBcIkdFVCAvYWR2aXNvcmllc1wiLFxuICBcIkdFVCAvYXBwL2hvb2svZGVsaXZlcmllc1wiLFxuICBcIkdFVCAvYXBwL2luc3RhbGxhdGlvbi1yZXF1ZXN0c1wiLFxuICBcIkdFVCAvYXBwL2luc3RhbGxhdGlvbnNcIixcbiAgXCJHRVQgL2Fzc2lnbm1lbnRzL3thc3NpZ25tZW50X2lkfS9hY2NlcHRlZF9hc3NpZ25tZW50c1wiLFxuICBcIkdFVCAvY2xhc3Nyb29tc1wiLFxuICBcIkdFVCAvY2xhc3Nyb29tcy97Y2xhc3Nyb29tX2lkfS9hc3NpZ25tZW50c1wiLFxuICBcIkdFVCAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L2RlcGVuZGFib3QvYWxlcnRzXCIsXG4gIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0c1wiLFxuICBcIkdFVCAvZXZlbnRzXCIsXG4gIFwiR0VUIC9naXN0c1wiLFxuICBcIkdFVCAvZ2lzdHMvcHVibGljXCIsXG4gIFwiR0VUIC9naXN0cy9zdGFycmVkXCIsXG4gIFwiR0VUIC9naXN0cy97Z2lzdF9pZH0vY29tbWVudHNcIixcbiAgXCJHRVQgL2dpc3RzL3tnaXN0X2lkfS9jb21taXRzXCIsXG4gIFwiR0VUIC9naXN0cy97Z2lzdF9pZH0vZm9ya3NcIixcbiAgXCJHRVQgL2luc3RhbGxhdGlvbi9yZXBvc2l0b3JpZXNcIixcbiAgXCJHRVQgL2lzc3Vlc1wiLFxuICBcIkdFVCAvbGljZW5zZXNcIixcbiAgXCJHRVQgL21hcmtldHBsYWNlX2xpc3RpbmcvcGxhbnNcIixcbiAgXCJHRVQgL21hcmtldHBsYWNlX2xpc3RpbmcvcGxhbnMve3BsYW5faWR9L2FjY291bnRzXCIsXG4gIFwiR0VUIC9tYXJrZXRwbGFjZV9saXN0aW5nL3N0dWJiZWQvcGxhbnNcIixcbiAgXCJHRVQgL21hcmtldHBsYWNlX2xpc3Rpbmcvc3R1YmJlZC9wbGFucy97cGxhbl9pZH0vYWNjb3VudHNcIixcbiAgXCJHRVQgL25ldHdvcmtzL3tvd25lcn0ve3JlcG99L2V2ZW50c1wiLFxuICBcIkdFVCAvbm90aWZpY2F0aW9uc1wiLFxuICBcIkdFVCAvb3JnYW5pemF0aW9uc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL2NhY2hlL3VzYWdlLWJ5LXJlcG9zaXRvcnlcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9ucy9yZXBvc2l0b3JpZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXJzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0c1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy92YXJpYWJsZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy92YXJpYWJsZXMve25hbWV9L3JlcG9zaXRvcmllc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9ibG9ja3NcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vY29kZS1zY2FubmluZy9hbGVydHNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vY29kZXNwYWNlc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9jb2Rlc3BhY2VzL3NlY3JldHNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2NvcGlsb3QvYmlsbGluZy9zZWF0c1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9kZXBlbmRhYm90L2FsZXJ0c1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9kZXBlbmRhYm90L3NlY3JldHNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2V2ZW50c1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9mYWlsZWRfaW52aXRhdGlvbnNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vaG9va3NcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9L2RlbGl2ZXJpZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vaW5zdGFsbGF0aW9uc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9pbnZpdGF0aW9uc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH0vdGVhbXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vaXNzdWVzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L21lbWJlcnNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vbWVtYmVycy97dXNlcm5hbWV9L2NvZGVzcGFjZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vbWlncmF0aW9uc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9taWdyYXRpb25zL3ttaWdyYXRpb25faWR9L3JlcG9zaXRvcmllc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9vcmdhbml6YXRpb24tcm9sZXMve3JvbGVfaWR9L3RlYW1zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L29yZ2FuaXphdGlvbi1yb2xlcy97cm9sZV9pZH0vdXNlcnNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vb3V0c2lkZV9jb2xsYWJvcmF0b3JzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3BhY2thZ2VzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3BlcnNvbmFsLWFjY2Vzcy10b2tlbi1yZXF1ZXN0c1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9wZXJzb25hbC1hY2Nlc3MtdG9rZW4tcmVxdWVzdHMve3BhdF9yZXF1ZXN0X2lkfS9yZXBvc2l0b3JpZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcGVyc29uYWwtYWNjZXNzLXRva2Vuc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9wZXJzb25hbC1hY2Nlc3MtdG9rZW5zL3twYXRfaWR9L3JlcG9zaXRvcmllc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9wcm9qZWN0c1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9wcm9wZXJ0aWVzL3ZhbHVlc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9wdWJsaWNfbWVtYmVyc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9yZXBvc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9ydWxlc2V0c1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9ydWxlc2V0cy9ydWxlLXN1aXRlc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9zZWNyZXQtc2Nhbm5pbmcvYWxlcnRzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3NlY3VyaXR5LWFkdmlzb3JpZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9jb21tZW50c1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X251bWJlcn0vcmVhY3Rpb25zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vcmVhY3Rpb25zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2ludml0YXRpb25zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L21lbWJlcnNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcHJvamVjdHNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcmVwb3NcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vdGVhbXNcIixcbiAgXCJHRVQgL3Byb2plY3RzL2NvbHVtbnMve2NvbHVtbl9pZH0vY2FyZHNcIixcbiAgXCJHRVQgL3Byb2plY3RzL3twcm9qZWN0X2lkfS9jb2xsYWJvcmF0b3JzXCIsXG4gIFwiR0VUIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sdW1uc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9hcnRpZmFjdHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvY2FjaGVzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL29yZ2FuaXphdGlvbi1zZWNyZXRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL29yZ2FuaXphdGlvbi12YXJpYWJsZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVyc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vYXJ0aWZhY3RzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vYXR0ZW1wdHMve2F0dGVtcHRfbnVtYmVyfS9qb2JzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vam9ic1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3ZhcmlhYmxlc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3NcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzL3t3b3JrZmxvd19pZH0vcnVuc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aXZpdHlcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Fzc2lnbmVlc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NoZWNrLXJ1bnMve2NoZWNrX3J1bl9pZH0vYW5ub3RhdGlvbnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NoZWNrLXN1aXRlcy97Y2hlY2tfc3VpdGVfaWR9L2NoZWNrLXJ1bnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYWxlcnRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2FsZXJ0cy97YWxlcnRfbnVtYmVyfS9pbnN0YW5jZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYW5hbHlzZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvZGV2Y29udGFpbmVyc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlcy9zZWNyZXRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2xsYWJvcmF0b3JzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97Y29tbWl0X3NoYX0vY29tbWVudHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve2NvbW1pdF9zaGF9L3B1bGxzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tyZWZ9L2NoZWNrLXJ1bnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve3JlZn0vY2hlY2stc3VpdGVzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tyZWZ9L3N0YXR1c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97cmVmfS9zdGF0dXNlc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29udHJpYnV0b3JzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBlbmRhYm90L2FsZXJ0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kYWJvdC9zZWNyZXRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBsb3ltZW50c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwbG95bWVudHMve2RlcGxveW1lbnRfaWR9L3N0YXR1c2VzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vZGVwbG95bWVudC1icmFuY2gtcG9saWNpZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vZGVwbG95bWVudF9wcm90ZWN0aW9uX3J1bGVzL2FwcHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2V2ZW50c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZm9ya3NcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH0vZGVsaXZlcmllc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaW52aXRhdGlvbnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL2NvbW1lbnRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL2V2ZW50c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2NvbW1lbnRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vZXZlbnRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vbGFiZWxzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vcmVhY3Rpb25zXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vdGltZWxpbmVcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2tleXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVsc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbWlsZXN0b25lc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbWlsZXN0b25lcy97bWlsZXN0b25lX251bWJlcn0vbGFiZWxzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ub3RpZmljYXRpb25zXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wYWdlcy9idWlsZHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3Byb2plY3RzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxsc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL2NvbW1lbnRzL3tjb21tZW50X2lkfS9yZWFjdGlvbnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vY29tbWVudHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vY29tbWl0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9maWxlc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3Jldmlld3Mve3Jldmlld19pZH0vY29tbWVudHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy97cmVsZWFzZV9pZH0vYXNzZXRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy97cmVsZWFzZV9pZH0vcmVhY3Rpb25zXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlcy9icmFuY2hlcy97YnJhbmNofVwiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzL3J1bGUtc3VpdGVzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zZWNyZXQtc2Nhbm5pbmcvYWxlcnRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zZWNyZXQtc2Nhbm5pbmcvYWxlcnRzL3thbGVydF9udW1iZXJ9L2xvY2F0aW9uc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc2VjdXJpdHktYWR2aXNvcmllc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3RhcmdhemVyc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3Vic2NyaWJlcnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RhZ3NcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RlYW1zXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90b3BpY3NcIixcbiAgXCJHRVQgL3JlcG9zaXRvcmllc1wiLFxuICBcIkdFVCAvcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L3NlY3JldHNcIixcbiAgXCJHRVQgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS92YXJpYWJsZXNcIixcbiAgXCJHRVQgL3NlYXJjaC9jb2RlXCIsXG4gIFwiR0VUIC9zZWFyY2gvY29tbWl0c1wiLFxuICBcIkdFVCAvc2VhcmNoL2lzc3Vlc1wiLFxuICBcIkdFVCAvc2VhcmNoL2xhYmVsc1wiLFxuICBcIkdFVCAvc2VhcmNoL3JlcG9zaXRvcmllc1wiLFxuICBcIkdFVCAvc2VhcmNoL3RvcGljc1wiLFxuICBcIkdFVCAvc2VhcmNoL3VzZXJzXCIsXG4gIFwiR0VUIC90ZWFtcy97dGVhbV9pZH0vZGlzY3Vzc2lvbnNcIixcbiAgXCJHRVQgL3RlYW1zL3t0ZWFtX2lkfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzXCIsXG4gIFwiR0VUIC90ZWFtcy97dGVhbV9pZH0vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9jb21tZW50cy97Y29tbWVudF9udW1iZXJ9L3JlYWN0aW9uc1wiLFxuICBcIkdFVCAvdGVhbXMve3RlYW1faWR9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vcmVhY3Rpb25zXCIsXG4gIFwiR0VUIC90ZWFtcy97dGVhbV9pZH0vaW52aXRhdGlvbnNcIixcbiAgXCJHRVQgL3RlYW1zL3t0ZWFtX2lkfS9tZW1iZXJzXCIsXG4gIFwiR0VUIC90ZWFtcy97dGVhbV9pZH0vcHJvamVjdHNcIixcbiAgXCJHRVQgL3RlYW1zL3t0ZWFtX2lkfS9yZXBvc1wiLFxuICBcIkdFVCAvdGVhbXMve3RlYW1faWR9L3RlYW1zXCIsXG4gIFwiR0VUIC91c2VyL2Jsb2Nrc1wiLFxuICBcIkdFVCAvdXNlci9jb2Rlc3BhY2VzXCIsXG4gIFwiR0VUIC91c2VyL2NvZGVzcGFjZXMvc2VjcmV0c1wiLFxuICBcIkdFVCAvdXNlci9lbWFpbHNcIixcbiAgXCJHRVQgL3VzZXIvZm9sbG93ZXJzXCIsXG4gIFwiR0VUIC91c2VyL2ZvbGxvd2luZ1wiLFxuICBcIkdFVCAvdXNlci9ncGdfa2V5c1wiLFxuICBcIkdFVCAvdXNlci9pbnN0YWxsYXRpb25zXCIsXG4gIFwiR0VUIC91c2VyL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH0vcmVwb3NpdG9yaWVzXCIsXG4gIFwiR0VUIC91c2VyL2lzc3Vlc1wiLFxuICBcIkdFVCAvdXNlci9rZXlzXCIsXG4gIFwiR0VUIC91c2VyL21hcmtldHBsYWNlX3B1cmNoYXNlc1wiLFxuICBcIkdFVCAvdXNlci9tYXJrZXRwbGFjZV9wdXJjaGFzZXMvc3R1YmJlZFwiLFxuICBcIkdFVCAvdXNlci9tZW1iZXJzaGlwcy9vcmdzXCIsXG4gIFwiR0VUIC91c2VyL21pZ3JhdGlvbnNcIixcbiAgXCJHRVQgL3VzZXIvbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvc2l0b3JpZXNcIixcbiAgXCJHRVQgL3VzZXIvb3Jnc1wiLFxuICBcIkdFVCAvdXNlci9wYWNrYWdlc1wiLFxuICBcIkdFVCAvdXNlci9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9uc1wiLFxuICBcIkdFVCAvdXNlci9wdWJsaWNfZW1haWxzXCIsXG4gIFwiR0VUIC91c2VyL3JlcG9zXCIsXG4gIFwiR0VUIC91c2VyL3JlcG9zaXRvcnlfaW52aXRhdGlvbnNcIixcbiAgXCJHRVQgL3VzZXIvc29jaWFsX2FjY291bnRzXCIsXG4gIFwiR0VUIC91c2VyL3NzaF9zaWduaW5nX2tleXNcIixcbiAgXCJHRVQgL3VzZXIvc3RhcnJlZFwiLFxuICBcIkdFVCAvdXNlci9zdWJzY3JpcHRpb25zXCIsXG4gIFwiR0VUIC91c2VyL3RlYW1zXCIsXG4gIFwiR0VUIC91c2Vyc1wiLFxuICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9ldmVudHNcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZXZlbnRzL29yZ3Mve29yZ31cIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZXZlbnRzL3B1YmxpY1wiLFxuICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9mb2xsb3dlcnNcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZm9sbG93aW5nXCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L2dpc3RzXCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L2dwZ19rZXlzXCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L2tleXNcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vb3Jnc1wiLFxuICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9wYWNrYWdlc1wiLFxuICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9wcm9qZWN0c1wiLFxuICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9yZWNlaXZlZF9ldmVudHNcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcmVjZWl2ZWRfZXZlbnRzL3B1YmxpY1wiLFxuICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9yZXBvc1wiLFxuICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9zb2NpYWxfYWNjb3VudHNcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc3NoX3NpZ25pbmdfa2V5c1wiLFxuICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9zdGFycmVkXCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3N1YnNjcmlwdGlvbnNcIlxuXTtcblxuLy8gcGtnL2Rpc3Qtc3JjL3BhZ2luYXRpbmctZW5kcG9pbnRzLmpzXG5mdW5jdGlvbiBpc1BhZ2luYXRpbmdFbmRwb2ludChhcmcpIHtcbiAgaWYgKHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gcGFnaW5hdGluZ0VuZHBvaW50cy5pbmNsdWRlcyhhcmcpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vLyBwa2cvZGlzdC1zcmMvaW5kZXguanNcbmZ1bmN0aW9uIHBhZ2luYXRlUmVzdChvY3Rva2l0KSB7XG4gIHJldHVybiB7XG4gICAgcGFnaW5hdGU6IE9iamVjdC5hc3NpZ24ocGFnaW5hdGUuYmluZChudWxsLCBvY3Rva2l0KSwge1xuICAgICAgaXRlcmF0b3I6IGl0ZXJhdG9yLmJpbmQobnVsbCwgb2N0b2tpdClcbiAgICB9KVxuICB9O1xufVxucGFnaW5hdGVSZXN0LlZFUlNJT04gPSBWRVJTSU9OO1xuZXhwb3J0IHtcbiAgY29tcG9zZVBhZ2luYXRlUmVzdCxcbiAgaXNQYWdpbmF0aW5nRW5kcG9pbnQsXG4gIHBhZ2luYXRlUmVzdCxcbiAgcGFnaW5hdGluZ0VuZHBvaW50c1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBvd25LZXlzID0gZnVuY3Rpb24obykge1xuICAgICAgICBvd25LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgIHZhciBhciA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgayBpbiBvKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIGspKSBhclthci5sZW5ndGhdID0gaztcbiAgICAgICAgICAgIHJldHVybiBhcjtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG93bktleXMobyk7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1vZCkge1xuICAgICAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayA9IG93bktleXMobW9kKSwgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSBpZiAoa1tpXSAhPT0gXCJkZWZhdWx0XCIpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwga1tpXSk7XG4gICAgICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbn0pKCk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkdpdEh1YiA9IGV4cG9ydHMuZGVmYXVsdHMgPSBleHBvcnRzLmNvbnRleHQgPSB2b2lkIDA7XG5leHBvcnRzLmdldE9jdG9raXRPcHRpb25zID0gZ2V0T2N0b2tpdE9wdGlvbnM7XG5jb25zdCBDb250ZXh0ID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL2NvbnRleHRcIikpO1xuY29uc3QgVXRpbHMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vaW50ZXJuYWwvdXRpbHNcIikpO1xuLy8gb2N0b2tpdCArIHBsdWdpbnNcbmNvbnN0IGNvcmVfMSA9IHJlcXVpcmUoXCJAb2N0b2tpdC9jb3JlXCIpO1xuY29uc3QgcGx1Z2luX3Jlc3RfZW5kcG9pbnRfbWV0aG9kc18xID0gcmVxdWlyZShcIkBvY3Rva2l0L3BsdWdpbi1yZXN0LWVuZHBvaW50LW1ldGhvZHNcIik7XG5jb25zdCBwbHVnaW5fcGFnaW5hdGVfcmVzdF8xID0gcmVxdWlyZShcIkBvY3Rva2l0L3BsdWdpbi1wYWdpbmF0ZS1yZXN0XCIpO1xuZXhwb3J0cy5jb250ZXh0ID0gbmV3IENvbnRleHQuQ29udGV4dCgpO1xuY29uc3QgYmFzZVVybCA9IFV0aWxzLmdldEFwaUJhc2VVcmwoKTtcbmV4cG9ydHMuZGVmYXVsdHMgPSB7XG4gICAgYmFzZVVybCxcbiAgICByZXF1ZXN0OiB7XG4gICAgICAgIGFnZW50OiBVdGlscy5nZXRQcm94eUFnZW50KGJhc2VVcmwpLFxuICAgICAgICBmZXRjaDogVXRpbHMuZ2V0UHJveHlGZXRjaChiYXNlVXJsKVxuICAgIH1cbn07XG5leHBvcnRzLkdpdEh1YiA9IGNvcmVfMS5PY3Rva2l0LnBsdWdpbihwbHVnaW5fcmVzdF9lbmRwb2ludF9tZXRob2RzXzEucmVzdEVuZHBvaW50TWV0aG9kcywgcGx1Z2luX3BhZ2luYXRlX3Jlc3RfMS5wYWdpbmF0ZVJlc3QpLmRlZmF1bHRzKGV4cG9ydHMuZGVmYXVsdHMpO1xuLyoqXG4gKiBDb252aWVuY2UgZnVuY3Rpb24gdG8gY29ycmVjdGx5IGZvcm1hdCBPY3Rva2l0IE9wdGlvbnMgdG8gcGFzcyBpbnRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcGFyYW0gICAgIHRva2VuICAgIHRoZSByZXBvIFBBVCBvciBHSVRIVUJfVE9LRU5cbiAqIEBwYXJhbSAgICAgb3B0aW9ucyAgb3RoZXIgb3B0aW9ucyB0byBzZXRcbiAqL1xuZnVuY3Rpb24gZ2V0T2N0b2tpdE9wdGlvbnModG9rZW4sIG9wdGlvbnMpIHtcbiAgICBjb25zdCBvcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyB8fCB7fSk7IC8vIFNoYWxsb3cgY2xvbmUgLSBkb24ndCBtdXRhdGUgdGhlIG9iamVjdCBwcm92aWRlZCBieSB0aGUgY2FsbGVyXG4gICAgLy8gQXV0aFxuICAgIGNvbnN0IGF1dGggPSBVdGlscy5nZXRBdXRoU3RyaW5nKHRva2VuLCBvcHRzKTtcbiAgICBpZiAoYXV0aCkge1xuICAgICAgICBvcHRzLmF1dGggPSBhdXRoO1xuICAgIH1cbiAgICByZXR1cm4gb3B0cztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBvd25LZXlzID0gZnVuY3Rpb24obykge1xuICAgICAgICBvd25LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgIHZhciBhciA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgayBpbiBvKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIGspKSBhclthci5sZW5ndGhdID0gaztcbiAgICAgICAgICAgIHJldHVybiBhcjtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG93bktleXMobyk7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1vZCkge1xuICAgICAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayA9IG93bktleXMobW9kKSwgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSBpZiAoa1tpXSAhPT0gXCJkZWZhdWx0XCIpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwga1tpXSk7XG4gICAgICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbn0pKCk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNvbnRleHQgPSB2b2lkIDA7XG5leHBvcnRzLmdldE9jdG9raXQgPSBnZXRPY3Rva2l0O1xuY29uc3QgQ29udGV4dCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9jb250ZXh0XCIpKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbmV4cG9ydHMuY29udGV4dCA9IG5ldyBDb250ZXh0LkNvbnRleHQoKTtcbi8qKlxuICogUmV0dXJucyBhIGh5ZHJhdGVkIG9jdG9raXQgcmVhZHkgdG8gdXNlIGZvciBHaXRIdWIgQWN0aW9uc1xuICpcbiAqIEBwYXJhbSAgICAgdG9rZW4gICAgdGhlIHJlcG8gUEFUIG9yIEdJVEhVQl9UT0tFTlxuICogQHBhcmFtICAgICBvcHRpb25zICBvdGhlciBvcHRpb25zIHRvIHNldFxuICovXG5mdW5jdGlvbiBnZXRPY3Rva2l0KHRva2VuLCBvcHRpb25zLCAuLi5hZGRpdGlvbmFsUGx1Z2lucykge1xuICAgIGNvbnN0IEdpdEh1YldpdGhQbHVnaW5zID0gdXRpbHNfMS5HaXRIdWIucGx1Z2luKC4uLmFkZGl0aW9uYWxQbHVnaW5zKTtcbiAgICByZXR1cm4gbmV3IEdpdEh1YldpdGhQbHVnaW5zKCgwLCB1dGlsc18xLmdldE9jdG9raXRPcHRpb25zKSh0b2tlbiwgb3B0aW9ucykpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2l0aHViLmpzLm1hcCIsImltcG9ydCB7dHlwZSBFeGVjU3luY09wdGlvbnMsIGV4ZWNTeW5jfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5mdW5jdGlvbiBlc2NhcGVDb21tYW5kKGNvbW1hbmQ6IHN0cmluZykge1xuICByZXR1cm4gY29tbWFuZC5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJyk7XG59XG5cbmV4cG9ydCBjb25zdCBuaXhFeGVjU3luYyA9IChjb21tYW5kOiBzdHJpbmcsIG9wdGlvbnM/OiBFeGVjU3luY09wdGlvbnMpID0+XG4gIGV4ZWNTeW5jKGBuaXggZGV2ZWxvcCAtYyBiYXNoIC1jIFwiJHtlc2NhcGVDb21tYW5kKGNvbW1hbmQpfVwiYCwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgZW5jb2Rpbmc6ICd1dGYtOCcsXG4gIH0pO1xuIiwiaW1wb3J0IHtyZWFkRmlsZVN5bmN9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGNvcmUgZnJvbSAnQGFjdGlvbnMvY29yZSc7XG5pbXBvcnQgZ2l0aHViIGZyb20gJ0BhY3Rpb25zL2dpdGh1Yic7XG5pbXBvcnQgdHlwZSB7Y29tcG9uZW50c30gZnJvbSAnQG9jdG9raXQvb3BlbmFwaS13ZWJob29rcy10eXBlcyc7XG5pbXBvcnQge25peEV4ZWNTeW5jfSBmcm9tICcuL3V0aWxzJztcblxudHlwZSBQdWxsUmVxdWVzdEV2ZW50ID0gY29tcG9uZW50c1snc2NoZW1hcyddWyd3ZWJob29rLXB1bGwtcmVxdWVzdC1vcGVuZWQnXTtcbnR5cGUgUHVzaEV2ZW50ID0gY29tcG9uZW50c1snc2NoZW1hcyddWyd3ZWJob29rLXB1c2gnXTtcbnR5cGUgV29ya2Zsb3dEaXNwYXRjaEV2ZW50ID0gY29tcG9uZW50c1snc2NoZW1hcyddWyd3ZWJob29rLXdvcmtmbG93LWRpc3BhdGNoJ107XG5cbnR5cGUgRXZlbnQgPSBQdWxsUmVxdWVzdEV2ZW50IHwgUHVzaEV2ZW50IHwgV29ya2Zsb3dEaXNwYXRjaEV2ZW50O1xuXG5sZXQgX2V2ZW50OiBFdmVudCB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gZ2V0RXZlbnQoKTogRXZlbnQge1xuICBpZiAoX2V2ZW50KSByZXR1cm4gX2V2ZW50O1xuICBjb25zdCBldmVudFBhdGggPSBwcm9jZXNzLmVudi5HSVRIVUJfRVZFTlRfUEFUSDtcbiAgaWYgKCFldmVudFBhdGgpIHRocm93IG5ldyBFcnJvcignR0lUSFVCX0VWRU5UX1BBVEggaXMgbm90IHNldCcpO1xuICBjb25zdCByYXdFdmVudCA9IHJlYWRGaWxlU3luYyhldmVudFBhdGgsICd1dGY4Jyk7XG4gIGNvcmUuZGVidWcocmF3RXZlbnQpO1xuICBfZXZlbnQgPSBKU09OLnBhcnNlKHJhd0V2ZW50KSBhcyBFdmVudDtcbiAgcmV0dXJuIF9ldmVudDtcbn1cblxuY29uc3QgYm90QWNjb3VudHMgPSBbJ3NoaXBmb3gtZGVwbG95LWJvdCddO1xuXG5pbnRlcmZhY2UgRXZlbnREZXRhaWxzIHtcbiAgYWN0b3I6IHN0cmluZztcbiAgaXNCb3RBY3RvcjogYm9vbGVhbjtcbiAgZXZlbnQ6IEV2ZW50O1xuICBldmVudE5hbWU6IHN0cmluZztcbiAgaXNPbk1haW46IGJvb2xlYW47XG59XG5cbmxldCBfZXZlbnREZXRhaWxzOiBFdmVudERldGFpbHMgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGdldEV2ZW50RGV0YWlscygpOiBFdmVudERldGFpbHMge1xuICBpZiAoX2V2ZW50RGV0YWlscykgcmV0dXJuIF9ldmVudERldGFpbHM7XG4gIGNvbnN0IGV2ZW50TmFtZSA9IGdpdGh1Yi5jb250ZXh0LmV2ZW50TmFtZTtcbiAgY29yZS5kZWJ1ZyhgRXZlbnQgbmFtZTogJHtldmVudE5hbWV9YCk7XG4gIGNvbnN0IGFjdG9yID0gZ2l0aHViLmNvbnRleHQuYWN0b3I7XG4gIGNvcmUuZGVidWcoYEFjdG9yOiAke2FjdG9yfWApO1xuICBjb25zdCBpc0JvdEFjdG9yID0gYm90QWNjb3VudHMuaW5jbHVkZXMoYWN0b3IpO1xuICBjb3JlLmRlYnVnKGBJcyBib3QgYWN0b3I6ICR7aXNCb3RBY3Rvcn1gKTtcbiAgY29uc3QgZXZlbnQgPSBnZXRFdmVudCgpO1xuICBjb25zdCBpc09uTWFpbiA9ICdyZWYnIGluIGV2ZW50ICYmIGV2ZW50LnJlZiA9PT0gJ3JlZnMvaGVhZHMvbWFpbic7XG4gIGNvcmUuZGVidWcoYElzIG9uIG1haW46ICR7aXNPbk1haW59YCk7XG4gIF9ldmVudERldGFpbHMgPSB7XG4gICAgYWN0b3IsXG4gICAgaXNCb3RBY3RvcixcbiAgICBldmVudCxcbiAgICBldmVudE5hbWUsXG4gICAgaXNPbk1haW4sXG4gIH07XG4gIHJldHVybiBfZXZlbnREZXRhaWxzO1xufVxuXG5mdW5jdGlvbiBnZXRUdXJib0Jhc2UoKTogc3RyaW5nIHtcbiAgY29uc3Qge2V2ZW50fSA9IGdldEV2ZW50RGV0YWlscygpO1xuICBpZiAoJ3B1bGxfcmVxdWVzdCcgaW4gZXZlbnQpIHJldHVybiBldmVudC5wdWxsX3JlcXVlc3QuYmFzZS5zaGE7XG4gIGlmICgnYmVmb3JlJyBpbiBldmVudCkgcmV0dXJuIGV2ZW50LmJlZm9yZTtcbiAgcmV0dXJuICdvcmlnaW4vbWFpbic7XG59XG5cbmZ1bmN0aW9uIGdldE5vZGVWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGNvbnN0IG91dHB1dCA9IG5peEV4ZWNTeW5jKCdub2RlIC0tdmVyc2lvbicpO1xuICByZXR1cm4gb3V0cHV0LnRyaW0oKS5zbGljZSgxKTtcbn1cblxuZnVuY3Rpb24gZ2V0UG5wbVZlcnNpb24oKTogc3RyaW5nIHtcbiAgY29uc3Qgb3V0cHV0ID0gbml4RXhlY1N5bmMoJ3BucG0gLS12ZXJzaW9uJyk7XG4gIHJldHVybiBvdXRwdXQudHJpbSgpO1xufVxuXG5pbnRlcmZhY2UgQ29udGV4dCB7XG4gIHR1cmJvQmFzZTogc3RyaW5nO1xuICB2ZXJzaW9uczoge1xuICAgIG5vZGU6IHN0cmluZztcbiAgICBwbnBtOiBzdHJpbmc7XG4gIH07XG59XG5cbmxldCBfY29udGV4dDogQ29udGV4dCB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnRleHQoKTogQ29udGV4dCB7XG4gIGlmICghX2NvbnRleHQpXG4gICAgX2NvbnRleHQgPSB7XG4gICAgICB0dXJib0Jhc2U6IGdldFR1cmJvQmFzZSgpLFxuICAgICAgdmVyc2lvbnM6IHtcbiAgICAgICAgbm9kZTogZ2V0Tm9kZVZlcnNpb24oKSxcbiAgICAgICAgcG5wbTogZ2V0UG5wbVZlcnNpb24oKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgY29yZS5kZWJ1ZyhgQ29udGV4dDogJHtKU09OLnN0cmluZ2lmeShfY29udGV4dCl9YCk7XG4gIHJldHVybiBfY29udGV4dDtcbn1cbiIsImltcG9ydCBjb3JlIGZyb20gJ0BhY3Rpb25zL2NvcmUnO1xuaW1wb3J0IHtnZXRDb250ZXh0fSBmcm9tICcuL2NvbnRleHQnO1xuaW1wb3J0IHtuaXhFeGVjU3luY30gZnJvbSAnLi91dGlscyc7XG5cbmZ1bmN0aW9uIGdldFR1cmJvVGFza3MoKTogc3RyaW5nW10ge1xuICBjb25zdCB0YXNrczogc3RyaW5nW10gPSBbJ2NoZWNrJywgJ3R5cGUnLCAnYnVpbGQnLCAndGVzdCddO1xuICByZXR1cm4gdGFza3M7XG59XG5cbmZ1bmN0aW9uIHJ1blR1cmJvKCkge1xuICBjb25zdCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpO1xuICBjb25zdCB0YXNrcyA9IGdldFR1cmJvVGFza3MoKTtcbiAgY29yZS5pbmZvKGBSdW5uaW5nIHRhc2tzOiAke3Rhc2tzLmpvaW4oJywgJyl9YCk7XG4gIGNvbnN0IGNvbW1hbmQgPSBgcG5wbSB0dXJibyAke3Rhc2tzLmpvaW4oJyAnKX0gLS1hZmZlY3RlZCAtLWNvbmN1cnJlbmN5IDEwMCVgO1xuICBjb3JlLmluZm8oYFJ1bm5pbmcgdHVyYm8gY29tbWFuZDogJHtjb21tYW5kfWApO1xuICBuaXhFeGVjU3luYyhjb21tYW5kLCB7XG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICBlbnY6IHtcbiAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgTk9ERV9WRVJTSU9OOiBjb250ZXh0LnZlcnNpb25zLm5vZGUsXG4gICAgICBQTlBNX1ZFUlNJT046IGNvbnRleHQudmVyc2lvbnMucG5wbSxcbiAgICAgIFRVUkJPX1NDTV9CQVNFOiBjb250ZXh0LnR1cmJvQmFzZSxcbiAgICB9LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcnVuKCkge1xuICBydW5UdXJibygpO1xufVxuXG50cnkge1xuICBydW4oKTtcbn0gY2F0Y2ggKGVycm9yKSB7XG4gIGNvbnN0IGRpc3BsYXllZEVycm9yID1cbiAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycgPyBlcnJvciA6IEpTT04uc3RyaW5naWZ5KGVycm9yKTtcbiAgY29yZS5zZXRGYWlsZWQoZGlzcGxheWVkRXJyb3IpO1xufVxuIl0sIm5hbWVzIjpbInV0aWxzIiwidGhpcyIsIm8iLCJyZXF1aXJlJCQxIiwiY29tbWFuZCIsInJlcXVpcmUkJDAiLCJyZXF1aXJlJCQyIiwicmVxdWlyZSQkMyIsIl9hIiwiZXZlbnRzIiwicmVxdWlyZSQkNCIsInV0aWwiLCJyZXF1aXJlJCQ2IiwidHVubmVsIiwiYWdlbnQiLCJzZWxmIiwib3B0aW9ucyIsInNvY2tldCIsInN5bWJvbHMiLCJoZWFkZXJzIiwiYm9keSIsImVycm9ycyIsImNvbnN0YW50cyIsIkJsb2IiLCJyZXF1aXJlJCQ1IiwicmVxdWlyZSQkOCIsInJlcXVpcmUkJDkiLCJyZXF1aXJlJCQxMCIsInJlcXVpcmUkJDExIiwiaWR4Iiwic3RyZWFtIiwiaGFuZGxlciIsIml0ZXJhdG9yIiwiY2xpZW50IiwicmVxdWVzdCIsImVyciIsIndlYnNvY2tldCIsImRpc3BhdGNoZXIiLCJkaXNwYXRjaGVyQmFzZSIsInRpbWVycyIsIm5vb3AiLCJnbG9iYWwiLCJjb25uZWN0Iiwic2Vzc2lvbiIsImV4cG9ydHMiLCJNRVRIT0RTIiwiSEVBREVSX1NUQVRFIiwiQnVmZmVyIiwibGxodHRwV2FzbSIsImxsaHR0cF9zaW1kV2FzbSIsImRhdGFVUkwiLCJjb250ZXh0Iiwia2V5cyIsIndlYmlkbF8xIiwicGVyZm9ybWFuY2UiLCJyZXF1aXJlJCQ3IiwicmVzcG9uc2UiLCJlbmNvZGluZyIsImZpbGUiLCJlbnRyeSIsImZvcm1kYXRhIiwiY2h1bmsiLCJ2YWx1ZSIsInJlZGlyZWN0SGFuZGxlciIsInJlZGlyZWN0SW50ZXJjZXB0b3IiLCJyZXF1aXJlJCQxMiIsImZpeGVkUXVldWUiLCJwb29sIiwicG9vbFN0YXRzIiwicG9vbEJhc2UiLCJvcmlnaW4iLCJiYWxhbmNlZFBvb2wiLCJVUkwiLCJwcm90b2NvbCIsIm9wdHMiLCJwcm94eUFnZW50IiwicmV0cnkiLCJjb25zdW1lIiwicmVhZGFibGUiLCJhcGlSZXF1ZXN0TW9kdWxlIiwiYWJvcnRTaWduYWwiLCJjYWxsYmFjayIsInJlcyIsIm9wYXF1ZSIsImFwaVN0cmVhbSIsImFwaVBpcGVsaW5lIiwiYXBpVXBncmFkZSIsImFwaUNvbm5lY3QiLCJhcGkiLCJtb2NrRXJyb3JzIiwibW9ja1N5bWJvbHMiLCJtb2NrRGlzcGF0Y2giLCJnZXRSZXNwb25zZURhdGEiLCJtb2NrVXRpbHMiLCJyZXBseVBhcmFtZXRlcnMiLCJuZXdNb2NrRGlzcGF0Y2giLCJtb2NrSW50ZXJjZXB0b3IiLCJtb2NrQ2xpZW50IiwibW9ja1Bvb2wiLCJwbHVyYWxpemVyIiwicGVuZGluZ0ludGVyY2VwdG9yc0Zvcm1hdHRlciIsIm1vY2tBZ2VudCIsImNvb2tpZXMiLCJkaXNwYXRjaGVyV2Vha3JlZiIsIkZpbmFsaXphdGlvblJlZ2lzdHJ5Iiwid2luZG93IiwicmVxdWlyZSQkMTMiLCJyZXF1aXJlJCQxNCIsInJlcXVpcmUkJDE1IiwicmVxdWlyZSQkMTYiLCJjb25uZWN0aW9uIiwiZmV0Y2hfMSIsInByb2dyZXNzZXZlbnQiLCJ0eXBlIiwiZmlsZXJlYWRlciIsImNhY2hlIiwiY2FjaGVzdG9yYWdlIiwicGFyc2UiLCJidWZmZXIiLCJmcmFtZSIsInBlcm1lc3NhZ2VEZWZsYXRlIiwicmVjZWl2ZXIiLCJub2RlIiwicmVxdWlyZSQkMTciLCJyZXF1aXJlJCQxOCIsInJlcXVpcmUkJDE5IiwicmVxdWlyZSQkMjAiLCJ1bmRpY2kiLCJyZXF1aXJlJCQyMSIsInJlcXVpcmUkJDIyIiwicmVxdWlyZSQkMjMiLCJyZXF1aXJlJCQyNCIsInJlcXVpcmUkJDI1IiwicmVxdWlyZSQkMjYiLCJyZXF1aXJlJCQyNyIsInJlcXVpcmUkJDI4IiwicmVxdWlyZSQkMjkiLCJyZXF1aXJlJCQzMCIsInJlcXVpcmUkJDMxIiwicmVxdWlyZSQkMzIiLCJyZXF1aXJlJCQzMyIsInJlcXVpcmUkJDM0IiwicmVxdWlyZSQkMzUiLCJyZXF1aXJlJCQzNiIsInJlcXVpcmUkJDM3IiwicmVxdWlyZSQkMzgiLCJyZXF1aXJlJCQzOSIsIkh0dHBDb2RlcyIsIkhlYWRlcnMiLCJNZWRpYVR5cGVzIiwidXNlckFnZW50IiwibG93ZXJjYXNlS2V5cyIsImF1dGgiLCJpb1V0aWwiLCJpbyIsImV4ZWNfMSIsImV4ZWMiLCJFeGl0Q29kZSIsIlJlYWRhYmxlU3RyZWFtIiwiZ2V0TGltaXQiLCJiYXNlbmFtZSIsIm1haW5Nb2R1bGUiLCJET01FeGNlcHRpb24iLCJzdHJ1Y3R1cmVkQ2xvbmUiLCJraW5kIiwiYXRvYiIsIm9uQ29ubmVjdFRpbWVvdXQiLCJXZWFrUmVmIiwic3RhdHVzQ29kZSIsImRhdGEiLCJyZXNwb25zZU9wdGlvbnMiLCJUcmFuc2Zvcm1TdHJlYW0iLCJhYyIsImdsb2JhbFRoaXMiLCJuYW1lIiwibWV0aG9kIiwiaG9vayIsImJlZm9yZUFmdGVySG9va01vZHVsZSIsIlZFUlNJT04iLCJpc1BsYWluT2JqZWN0Iiwid2l0aERlZmF1bHRzIiwiREVGQVVMVFMiLCJlbmRwb2ludCIsImNiIiwib25jZU1vZHVsZSIsIm9uY2UiLCJnZXRCdWZmZXIiLCJDb2xsZWN0aW9uIiwiRU5EUE9JTlRTIiwiZ2l0aHViIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQSxTQUFPLGVBQWVBLFNBQVMsY0FBYyxFQUFFLE9BQU8sTUFBTTtBQUM1REEsVUFBQSxpQkFBeUI7QUFDekJBLFVBQUEsc0JBQThCO0FBSzlCLFdBQVMsZUFBZSxPQUFPO0FBQzNCLFFBQUksVUFBVSxRQUFRLFVBQVUsUUFBVztBQUN2QyxhQUFPO0FBQUEsSUFDZixXQUNhLE9BQU8sVUFBVSxZQUFZLGlCQUFpQixRQUFRO0FBQzNELGFBQU87QUFBQSxJQUNmO0FBQ0ksV0FBTyxLQUFLLFVBQVUsS0FBSztBQUFBLEVBQy9CO0FBT0EsV0FBUyxvQkFBb0Isc0JBQXNCO0FBQy9DLFFBQUksQ0FBQyxPQUFPLEtBQUssb0JBQW9CLEVBQUUsUUFBUTtBQUMzQyxhQUFPLENBQUE7QUFBQSxJQUNmO0FBQ0ksV0FBTztBQUFBLE1BQ0gsT0FBTyxxQkFBcUI7QUFBQSxNQUM1QixNQUFNLHFCQUFxQjtBQUFBLE1BQzNCLE1BQU0scUJBQXFCO0FBQUEsTUFDM0IsU0FBUyxxQkFBcUI7QUFBQSxNQUM5QixLQUFLLHFCQUFxQjtBQUFBLE1BQzFCLFdBQVcscUJBQXFCO0FBQUE7RUFFeEM7Ozs7Ozs7QUNwQ0EsTUFBSSxrQkFBbUJDLFdBQVFBLFFBQUssb0JBQXFCLE9BQU8sVUFBVSxTQUFTLEdBQUcsR0FBRyxHQUFHLElBQUk7QUFDNUYsUUFBSSxPQUFPLE9BQVcsTUFBSztBQUMzQixRQUFJLE9BQU8sT0FBTyx5QkFBeUIsR0FBRyxDQUFDO0FBQy9DLFFBQUksQ0FBQyxTQUFTLFNBQVMsT0FBTyxDQUFDLEVBQUUsYUFBYSxLQUFLLFlBQVksS0FBSyxlQUFlO0FB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QUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGOzs7Ozs7OztBQ2xaQSxRQUFNLDZCQUE2QixDQUFBO0FBR25DLFFBQU0sdUJBQXVCO0FBQUEsSUFDM0I7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElB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QUFDLFNBQVVDLFVBQVM7QUFDaEIsTUFBQUEsU0FBUUEsU0FBUSxRQUFRLElBQUksQ0FBQyxJQUFJO0FBQ2pDLE1BQUFBLFNBQVFBLFNBQVEsS0FBSyxJQUFJLENBQUMsSUFBSTtBQUM5QixNQUFBQSxTQUFRQSxTQUFRLE1BQU0sSUFBSSxDQUFDLElBQUk7QUFDL0IsTUFBQUEsU0FBUUEsU0FBUSxNQUFNLElBQUksQ0FBQyxJQUFJO0FBQy9CLE1BQUFBLFNBQVFBLFNBQVEsS0FBSyxJQUFJLENBQUMsSUFBSTtBQUU5QixNQUFBQSxTQUFRQSxTQUFRLFNBQVMsSUFBSSxDQUFDLElBQUk7QUFDbEMsTUFBQUEsU0FBUUEsU0FBUSxTQUFTLElBQUksQ0FBQyxJQUFJO0FBQ2xDLE1BQUFBLFNBQVFBLFNBQVEsT0FBTyxJQUFJLENBQUMsSUFBSTtBQUVoQyxNQUFBQSxTQUFRQSxTQUFRLE1BQU0sSUFBSSxDQUFDLElBQUk7QUFDL0IsTUFBQUEsU0FBUUEsU0FBUSxNQUFNLElBQUksQ0FBQyxJQUFJO0FBQy9CLE1BQUFBLFNBQVFBLFNBQVEsT0FBTyxJQUFJLEVBQUUsSUFBSTtBQUNqQyxNQUFBQSxTQUFRQSxTQUFRLE1BQU0sSUFBSSxFQUFFLElBQUk7QUFDaEMsTUFBQUEsU0FBUUEsU0FBUSxVQUFVLElBQUksRUFBRSxJQUFJO0FBQ3BDLE1BQUFBLFNBQVFBLFNBQVEsV0FBVyxJQUFJLEVBQUUsSUFBSTtBQUNyQyxNQUFBQSxTQUFRQSxTQUFRLFFBQVEsSUFBSSxFQUFFLElBQUk7QUFDbEMsTUFBQUEsU0FBUUEsU0FBUSxRQUFRLElBQUksRUFBRSxJQUFJO0FBQ2xDLE1BQUFBLFNBQVFBLFNBQVEsTUFBTSxJQUFJLEVBQUUsSUFBSTtBQUNoQyxNQUFBQSxTQUFRQSxTQUFRLFFBQVEsSUFBSSxFQUFFLElBQUk7QUFDbEMsTUFBQUEsU0FBUUEsU0FBUSxRQUFRLElBQUksRUFBRSxJQUFJO0FBQ2xDLE1BQUFBLFNBQVFBLFNBQVEsS0FBSyxJQUFJLEVBQUUsSUFBSTtBQUUvQixNQUFBQSxTQUFRQSxTQUFRLFFB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QTtBQUFBLElBQXVDLENBQUMsS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBO0FBRWhFLFFBQU07QUFBQTtBQUFBLElBQXVDLENBQUMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUE7QUFDckUsUUFBTSxvQkFBb0IsSUFBSSxJQUFJLGNBQWM7QUFLaEQsUUFBTTtBQUFBO0FBQUEsSUFBaUM7QUFBQSxNQUNyQztBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQU07QUFBQSxNQUFNO0FBQUEsTUFBTTtBQUFBLE1BQU07QUFBQSxNQUFNO0FBQUEsTUFBTTtBQUFBLE1BQU07QUFBQSxNQUFNO0FBQUEsTUFBTTtBQUFBLE1BQU07QUFBQSxNQUFNO0FBQUEsTUFBTTtBQUFBLE1BQU07QUFBQSxNQUFNO0FBQUEsTUFBTTtBQUFBLE1BQU07QUFBQSxNQUMvRztBQUFBLE1BQU07QUFBQSxNQUFNO0FBQUEsTUFBTztBQUFBLE1BQU87QUFBQSxNQUFPO0FBQUEsTUFBTztBQUFBLE1BQU87QUFBQSxNQUFPO0FBQUEsTUFBTztBQUFBLE1BQU87QUFBQSxNQUFPO0FBQUEsTUFBTztBQUFBLE1BQU87QUFBQSxNQUFPO0FBQUEsTUFBTztBQUFBLE1BQ3ZHO0FBQUEsTUFBTztBQUFBLE1BQU87QUFBQSxNQUFPO0FBQUEsTUFBTztBQUFBLE1BQU87QUFBQSxNQUFPO0FBQUEsTUFBTztBQUFBLE1BQU87QUFBQSxNQUFPO0FBQUEsTUFBTztBQUFBLE1BQU87QUFBQSxNQUFPO0FBQUEsTUFBTztBQUFBLE1BQU87QUFBQSxNQUNsRztBQUFBLE1BQU87QUFBQSxNQUFPO0FBQUEsTUFBTztBQUFBLE1BQU87QUFBQSxNQUFPO0FBQUEsTUFBTztBQUFBLE1BQU87QUFBQSxNQUFPO0FBQUEsTUFBTztBQUFBLE1BQU87QUFBQSxNQUFPO0FBQUEsTUFBTztBQUFBLE1BQVE7QUFBQSxNQUFRO0FBQUEsTUFDcEc7QUFBQSxNQUFRO0FBQUEsTUFBUTtBQUFBLE1BQVE7QUFBQSxNQUFRO0FBQUEsTUFBUTtBQUFBLE1BQVE7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QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1Q7QUFBUyxlQUFPO0FBQUEs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RUFDQTtBQUVBLFdBQWlCO0FBQUEsSUFDZjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGOzs7Ozs7OztBQ2xPQSxRQUFNLDZCQUE2QixDQUFBO0FBR25DLFFBQU0sdUJBQXVCO0FBQUEsSUFDM0I7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEs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TztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEs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QUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUM3QztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQzdDO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFDN0M7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUM3QztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQzdDO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsRUFDL0M7QUFFQSxXQUFTLFVBQVc7QUFDbEIsU0FBSyxTQUFTO0FBQUEsRUFDaEI7QUFDQSxVQUFRLFVBQVUsUUFB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TCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1QsS0FBSztBQUNILGVBQU87QUFBQSxNQUNUO0FBQVMsZUFBTztBQUFBLElBQ3BCO0FBQUEsRUFDQTtBQUVBLGFBQWlCO0FBQUEsSUFDZjtB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O0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNB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U0FBUyxXQUFXO0FBQ2xCLFFBQU0rQyxXQUFVLFdBQUE7QUFDaEIsUUFBTSxRQUFRLGNBQUE7QUFDZCxPQUFLLEtBQUssa0JBQWtCLE1BQU0sS0FBSyxJQUFJLENBQUMsRUFBRTtBQUM5QyxRQUFNL0MsV0FBVSxjQUFjLE1BQU0sS0FBSyxHQUFHLENBQUM7QUFDN0MsT0FBSyxLQUFLLDBCQUEwQkEsUUFBTyxFQUFFO0FBQzdDLGNBQVlBLFVBQVM7QUFBQSxJQUNuQixPQUFPO0FBQUEsSUFDUCxLQUFLO0FBQUEsTUFDSCxHQUFHLFFBQVE7QUFBQSxNQUNYLGNBQWMrQyxTQUFRLFNBQVM7QUFBQSxNQUMvQixjQUFjQSxTQUFRLFNBQVM7QUFBQSxNQUMvQixnQkFBZ0JBLFNBQVE7QUFBQSxJQUFBO0FBQUEsRUFDMUIsQ0FDRDtBQUNIO0FBRUEsU0FBUyxNQUFNO0FBQ2IsV0FBQTtBQUNGO0FBRUEsSUFBSTtBQUNGLE1BQUE7QUFDRixTQUFTLE9BQU87QUFDZCxRQUFNLGlCQUNKLGlCQUFpQixTQUFTLE9BQU8sVUFBVSxXQUFXLFFBQVEsS0FBSyxVQUFVLEtBQUs7QUFDcEYsT0FBSyxVQUFVLGNBQWM7QUFDL0I7IiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsNjIsNjMsNjQsNjUsNjYsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsNzUsNzYsNzcsNzgsNzksODAsODEsODIsODMsODQsODUsODYsODcsODgsODksOTAsOTEsOTIsOTMsOTQsOTUsOTYsOTcsOTgsOTksMTAwLDEwMSwxMDIsMTAzLDEwNCwxMDUsMTA2LDEwNywxMDgsMTA5LDExMCwxMTEsMTEyLDExMywxMTQsMTE1LDExNiwxMTcsMTE4LDExOSwxMjAsMTIxLDEyMiwxMjMsMTI0LDEyNSwxMjYsMTI3LDEyOCwxMjksMTMwLDEzMSwxMzIsMTMzLDEzNCwxMzUsMTM2LDEzNywxMzgsMTM5LDE0MCwxNDEsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwxNTMsMTU0LDE1NSwxNTYsMTU3LDE1OCwxNTksMTYwLDE2MSwxNjIsMTYzLDE2NCwxNjUsMTY2LDE2NywxNjgsMTY5LDE3MCwxNzEsMTcyLDE3MywxNzQsMTc1LDE3NiwxNzcsMTc4LDE3OSwxODAsMTgxLDE4MiwxODMsMTg0LDE4NSwxODYsMTg3LDE4OCwxODksMTkwLDE5MSwxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LDIwNiwyMDcsMjA4LDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLDIyMSwyMjIsMjIzLDIyNCwyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwyMzcsMjM4LDIzOSwyNDAsMjQxLDI0MiwyNDMsMjQ0LDI0NSwyNDYsMjQ3LDI0OCwyNDldfQ== diff --git a/libs/common/shipql-parser/CHANGELOG.md b/libs/common/shipql-parser/CHANGELOG.md new file mode 100644 index 00000000..1904a21c --- /dev/null +++ b/libs/common/shipql-parser/CHANGELOG.md @@ -0,0 +1,9 @@ +# @shipfox/shipql-parser + +## 0.0.1 + +### Patch Changes + +- 03a6127: Use shorthand `-` for negating expressions in ShipQL +- 9dcef22: Add ShipQL parser package +- c0e6cef: Include source strings in AST nodes diff --git a/libs/common/shipql-parser/package.json b/libs/common/shipql-parser/package.json index 78d0406e..2d6133bb 100644 --- a/libs/common/shipql-parser/package.json +++ b/libs/common/shipql-parser/package.json @@ -2,7 +2,7 @@ "name": "@shipfox/shipql-parser", "license": "MIT", "private": false, - "version": "0.0.0", + "version": "0.0.1", "packageManager": "pnpm@9.15.9", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/libs/react/ui/CHANGELOG.md b/libs/react/ui/CHANGELOG.md index 56ee16d7..700df9d6 100644 --- a/libs/react/ui/CHANGELOG.md +++ b/libs/react/ui/CHANGELOG.md @@ -1,5 +1,11 @@ # @shipfox/react-ui +## 0.26.0 + +### Minor Changes + +- 4e562b8: Add Slider component + ## 0.25.0 ### Minor Changes diff --git a/libs/react/ui/package.json b/libs/react/ui/package.json index 13df73bd..713ab785 100644 --- a/libs/react/ui/package.json +++ b/libs/react/ui/package.json @@ -1,7 +1,7 @@ { "name": "@shipfox/react-ui", "license": "MIT", - "version": "0.25.0", + "version": "0.26.0", "private": false, "packageManager": "pnpm@9.15.9", "main": "dist/index.js", diff --git a/tools/swc/CHANGELOG.md b/tools/swc/CHANGELOG.md index afac8a02..8e2a7bb3 100644 --- a/tools/swc/CHANGELOG.md +++ b/tools/swc/CHANGELOG.md @@ -1,5 +1,11 @@ # @shipfox/swc +## 1.2.3 + +### Patch Changes + +- f3b2a31: Ensure parser.js is exported + ## 1.2.2 ### Patch Changes diff --git a/tools/swc/package.json b/tools/swc/package.json index 18c2b6ab..a2c2e8eb 100644 --- a/tools/swc/package.json +++ b/tools/swc/package.json @@ -1,6 +1,6 @@ { "name": "@shipfox/swc", - "version": "1.2.2", + "version": "1.2.3", "license": "MIT", "private": false, "packageManager": "pnpm@9.15.9",